'GENERATOR_FLAG' not updating with frame advance

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 23/07/2012 at 10:08, xxxxxxxx wrote:

Hi all,

I'm missing something to allow Python to register a scene change when I tell it to advance a frame with a call command (c4d.CallCommand(12414)).  I am trying to find out when an object is 'Enabled' on a frame and then render that frame and saving the image with that object name.  All is doing well, but when the frame advances, Python doesn't seem to register the changes in 'Enabled' states, which are animated on and off, frame to frame.  I also wanted to capture which camera is active on a particular frame as well and run into the same problem of Python not picking up the updated frame state.  All attempts to update Cinema per frame have failed so far.  What do I do?

Also, while I'm asking questions, is there a better way to check to pause and see if the render is still rendering (I'm using c4d.CheckIsRunning), or is this the best way?

-Disclaimer: I'm new to programming, so the following code is rough, slow and could probably be broken up into functions, but that will come later when I am more comfortable with the language.

import c4d, math, string
from c4d import gui, utils
  
#Reverses order of render list, renames list items to be legal, and then renders with new names.
  
def main() :
  
    c4d.CallCommand(12112) #Select All
    c4d.CallCommand(100004748); #Unfold All
    c4d.CallCommand(100004766) #Select all
    Selected = doc.GetActiveObjects(1)
    myDoc = c4d.documents.GetActiveDocument()
  
    c4d.CallCommand(12501) #Goto Start Frame
    startFrame = 0
    hasRendered = 0
    curFrame = doc.GetTime().GetFrame(doc.GetFps())
    bc = c4d.BaseContainer() 
    shiftMod = 0  
    theFrame = 0 
    while theFrame < 99:
        curFrame = doc.GetTime().GetFrame(doc.GetFps())
        print "*****************************************"
        print "     THE CURRENT FRAME IS : " + str(curFrame)  
        print "*****************************************"     
        for ListOb in Selected:
            curFrame = doc.GetTime().GetFrame(doc.GetFps())
            theType = ListOb.GetTypeName()
            xName = ListOb.GetName() #return the name of an object
            print "The object type is: " + theType
            if ListOb[c4d.ID_BASEOBJECT_GENERATOR_FLAG] == 0:
                print xName + " is turned OFF"
            if ListOb[c4d.ID_BASEOBJECT_GENERATOR_FLAG] == 1:
                print xName + " is turned ON"    
            if theType != "XRef" or ListOb[c4d.ID_BASEOBJECT_GENERATOR_FLAG] != 1:
                print "This is not an xref OR it is not turned on."                      
            if theType == "XRef" and ListOb[c4d.ID_BASEOBJECT_GENERATOR_FLAG] == 1:            
                xName = ListOb.GetName() #return the name of an object 
                xName = xName[5:] + "_"
                if xName[-4:] == ".c4d":
                    xName = xName[:-4]
                xName = string.replace(xName, "/", "_")
                xName = string.replace(xName, "(", "--")
                xName = string.replace(xName, ")", "--")
                xName = string.replace(xName, ".", "_")
                xName = string.replace(xName, ",", "_")
                print "--------------------------------------------------------"
                print xName + "will render on this frame => " + str(curFrame)
                print "--------------------------------------------------------"
                path = "Users/david.cox/Desktop/testFolder/Accessory_catalog_Scene/"
                rd = doc.GetActiveRenderData()
                #path = rd[c4d.RDATA_PATH]
                rd[c4d.RDATA_FRAMEFROM] = (c4d.BaseTime(startFrame + 1,30))
                rd[c4d.RDATA_FRAMESEQUENCE] = (c4d.RDATA_FRAMESEQUENCE_CURRENTFRAME)
                rd[c4d.RDATA_PATH] = path + xName
                if hasRendered == 0:
                    c4d.CallCommand (12099) #calls the renderer
                hasRendered = 1
                isRend = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)
                while isRend == 1:
                    isRend = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)
                    hasRendered = 0
        
                    if c4d.gui.GetInputState(c4d.BFM_INPUT_KEYBOARD,c4d.BFM_INPUT_CHANNEL,bc) :        
                        if bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QSHIFT:
                            shiftMod=1
                            print "Breaking out of loop"
                            break
                    if shiftMod==1:
                        break
                #if hasRendered == 0:
                if shiftMod==1:
                    break
        c4d.CallCommand(12414) #Advance a frame
        theFrame += 1
        
    c4d.CallCommand(12501) #Goto Start Frame
    c4d.EventAdd()
            
if __name__=='__main__':
    main()

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 24/07/2012 at 16:00, xxxxxxxx wrote:

Although the code is more convoluted, I finally got it to work with GetGeData() to tell me if the object is in the "Enabled" state at the current frame.  This is more messy than it should be because of the run around that I (had to?) took to find out the state of a key on a particular frame.

I'm still looking for a better way to run this without Cinema being in a "beachball" state (the cursor display when a Mac program is not responding) till the render completes because of my 'while' loop: c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING) to constantly check if the current frame is completed.  Is there a way for Python to pause cranking away till a 'end of frame' mark is reached and then continue?

Anyways, here is my amateur code so far that is working for me:

import c4d, math, string
from c4d import gui, utils
  
#Looks for enabled xref's on a frame, renames list items to be legal, and then renders with xref names.
  
def main() :
  
    c4d.CallCommand(12112) #Select All
    c4d.CallCommand(100004748); #Unfold All
    c4d.CallCommand(100004766) #Select all
    Selected = doc.GetActiveObjects(1)
    myDoc = c4d.documents.GetActiveDocument()
  
    #c4d.CallCommand(12501) #Goto Start Frame
    #startFrame = 0
    startFrame = int(c4d.gui.InputDialog("Enter the Start Frame"))
    doc.SetTime(c4d.BaseTime(startFrame,30))
    bc = c4d.BaseContainer() 
    shiftMod = 0
    fps = myDoc.GetFps()  
    theFrame = startFrame 
    while theFrame < 360:
        curFrame = doc.GetTime().GetFrame(doc.GetFps())
        print "*****************************************"
        print "     THE CURRENT FRAME IS : " + str(curFrame)  
        print "*****************************************"   
        for ListOb in Selected:
            trList = ListOb.GetCTracks()
            theType = ListOb.GetTypeName()
            for i, v in enumerate(trList) :                
                if trList[i].GetName() == "Enabled" and theType == "XRef":
                    crv = trList[i].GetCurve()
                    print ListOb.GetName()
                    keyCount = crv.GetKeyCount()
                    print "The key count is: " + str(keyCount)
                    oo = 0
                    ww = 0
                    while oo < keyCount and ww == 0:
                        key = crv.GetKey(oo)
                        keyVal = key.GetGeData()
                        if keyVal == 1:
                            keyTime = key.GetTime()
                            theEnabledFrame = keyTime.GetFrame(fps)
                            print "The key is at frame: " + str(theEnabledFrame)
                            if theEnabledFrame == curFrame:
                                ww += 1                                      
                                xName = ListOb.GetName() #return the name of an object 
                                if xName[-4:] == ".c4d":
                                    xName = xName[:-4]
                                xName = string.replace(xName, "/", "_")
                                xName = string.replace(xName, "(", "--")
                                xName = string.replace(xName, ")", "--")
                                xName = string.replace(xName, ".", "_")
                                xName = string.replace(xName, ",", "_")
                                xName = string.replace(xName, "+", "-and-")
                                xName = xName[5:] + "_"
                                print "--------------------------------------------------------"
                                print xName + " will render on this frame => " + str(curFrame)
                                print "--------------------------------------------------------"
                                path = "Users/david.cox/Desktop/testFolder/Accessory_catalog_Scene/"
                                rd = doc.GetActiveRenderData()
                                #path = rd[c4d.RDATA_PATH]
                                rd[c4d.RDATA_FRAMEFROM] = (c4d.BaseTime(startFrame,30))
                                rd[c4d.RDATA_FRAMESEQUENCE] = (c4d.RDATA_FRAMESEQUENCE_CURRENTFRAME)
                                rd[c4d.RDATA_PATH] = path + xName
                                c4d.CallCommand (12099) # ********** CALLS THE RENDERER ************
                                isRend = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)
                                while isRend == 1:
                                    isRend = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)                       
                                    if c4d.gui.GetInputState(c4d.BFM_INPUT_KEYBOARD,c4d.BFM_INPUT_CHANNEL,bc) :        
                                        if bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QSHIFT:
                                            shiftMod=1
                                            print "Breaking out of loop"
                                            break
                                    if shiftMod==1:
                                        break                                
                                if shiftMod==1:
                                    break
                            if shiftMod==1:
                                break
                        if shiftMod==1:
                            break
                        oo += 1
        c4d.CallCommand(12414) #Advance a frame
        theFrame += 1
        
    c4d.CallCommand(12501) #Goto Start Frame
    c4d.EventAdd()
            
if __name__=='__main__':
    main()