'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()
    

Log in to reply