rendersettings copy, activate, search, delete



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

    On 12/10/2012 at 02:21, xxxxxxxx wrote:

    Hi Folks,

    a while ago I tried to update my preview render script.
    to avoid the possible but unwanted effect of changed values if render is aborted. i would like to make the changes in a dublicated version of the original rendersettings.
    as I am (unfortunately) quite a newbe. and completely on my own to learn python and the c4d sdk i didnt even manage to copy a set of renderdata ;.(

    there are 3 things that I would like to do.

    - copy a active renderdata and rename it
    - search for renderdata by name and activate it
    - delete a activated renderdata

    I would be super glad if someone could help me out.

    thanks a lot
    Jops



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

    On 16/10/2012 at 03:08, xxxxxxxx wrote:

    ok maybe to many questions at once :)

    so lets start with copying existing renderdata

    this code doesnt work (unfortunately)

      
    import c4d   
    from c4d import gui   
    #Welcome to the world of Python   
      
      
    def main() :   
        rd = doc.GetActiveRenderData()   
        doc.InsertRenderDataLast(rd)   
        c4d.EventAdd   
      
    if __name__=='__main__':   
        main()   
    

    hints are highly welcome

    thanks
    Jops



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

    On 16/10/2012 at 03:52, xxxxxxxx wrote:

    Hi,

    To copy a render data you have to call:

    clone = rd.GetClone()
    

    You can then insert the cloned render data. You cannot insert twice the same render data in a document.

    To search the render datas you get the first render data with doc.GetFirstRenderData() and loop through them like objects in the document using GetNext(), GetDown() etc. Simply call rd.GetName() to get the name of a render data.

    And to select a render data you have to set its active bit:

    rd.SetBit(c4d.BIT_ACTIVERENDERDATA)
    


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

    On 16/10/2012 at 04:00, xxxxxxxx wrote:

    great Yannick, thanks a lot!!!!!!



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

    On 16/10/2012 at 05:07, xxxxxxxx wrote:

    ok so here some definitions:

    but I still strugle with deleting renderdata :(

      
    def RDCopyToTemp() :   
        rd = doc.GetActiveRenderData()   
        RDclone = rd.GetClone()   
        #print RDclone   
        RDclone.SetName("temp")   
        doc.InsertRenderDataLast(RDclone)   
        c4d.EventAdd   
      
    def GetNextObject(op) :   
        if op==None: return None   
        if op.GetDown() : return op.GetDown()   
        while not op.GetNext() and op.GetUp() :   
            op = op.GetUp()   
        return op.GetNext()   
      
    def RDFindAndActivate(name) : # needs GetNextObject   
        myRD = doc.GetFirstRenderData()   
        if myRD==None: return   
        while myRD:   
            if myRD.GetName() == name:   
                myRD.SetBit(c4d.BIT_ACTIVERENDERDATA)   
                c4d.EventAdd   
            myRD = GetNextObject(myRD)   
    


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

    On 16/10/2012 at 05:54, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    but I still strugle with deleting renderdata :(

    To delete a render data you can call rd.Remove(). This method is defined in GeListNode (one of the parents class of RenderData).



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

    On 16/10/2012 at 06:12, xxxxxxxx wrote:

    thanks a lot... again :)

    I know that starters can be nerve wrecking... sorry :(

    all the best
    Jops



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

    On 12/11/2012 at 06:09, xxxxxxxx wrote:

    I#m sitting once again on this project... and unfortunately again got stuck :(

    I managed to copy the renderdata (see above) and I managed to activate it.
    there are two ways it needs to be activated:

    - the name should be orange to indicate that i can change the values in this settings
    - and the square left of the name should be white to indicate that these are the rendersettings that get used.

    the square can just be active with one rendersettings set at a time
    but several names can be activated(orange) simutaniously.

    my problem:

    i managed to copy the renderdata and to activate the name and the square.
    unfortunately the name of the "old renderdata" is also still active(orange) so the old settings get changed (first in list) instead of the new once.

    I tryed:

    old_rd.DelBit(c4d.BIT_ACTIVERENDERDATA)
    old_rd.DelBit(c4d.BIT_ACTIVE)
    c4d.EventAdd()

    but it didn#t work :(

    thanks for help
    Jops



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

    On 12/11/2012 at 07:35, xxxxxxxx wrote:

    Hi,

    afaik using BaseDocument.SetActiveRenderData() automatically deactivates amy other renderdata.

    Best,
    Niklas



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

    On 15/11/2012 at 06:36, xxxxxxxx wrote:

    Hi Niklas,

    well yes and no the activation dot, square or what ever you call it, that indicated the renderdata that get used is exclusiv. so there can only be one renderdata checked at a time.

    but you can select mor then one renderdata to change values (indicated by the orange rendersettingsname in the list.

    here is a bit of code that shows the problem:
    old code (ugly)... I will change the naming... of the definitions and variables :)

      
    import c4d   
    from c4d import gui   
    #Welcome to the world of Python   
      
      
      
    def RDCopy(name) :   
        rd = doc.GetActiveRenderData()   
        RDclone = rd.GetClone()   
        #print RDclone   
        RDclone.SetName(name)   
        doc.InsertRenderDataLast(RDclone)   
        c4d.EventAdd   
      
    def GetNextObject(op) :   
        if op==None: return None   
        if op.GetDown() : return op.GetDown()   
        while not op.GetNext() and op.GetUp() :   
            op = op.GetUp()   
        return op.GetNext()   
      
    def RDFindAndActivate(name) : # needs GetNextObject   
        myRD = doc.GetFirstRenderData()   
        if myRD==None: return   
        while myRD:   
            if myRD.GetName() == name:   
                doc.SetActiveRenderData(myRD)   
                c4d.EventAdd   
            myRD = GetNextObject(myRD)   
      
    def main() :   
           
        RDCopy("test")   
        RDFindAndActivate("test")   
      
      
    if __name__=='__main__':   
        main()   
    

    best regards
    Jops



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

    On 15/11/2012 at 08:42, xxxxxxxx wrote:

    I see where's the problem. Even if we set the new active render data, the old active render data is still selected (its name is in orange color).

    Here's how I changed your RDFindAndActivate() function:

    def RDFindAndActivate(name) :
        myRD = doc.GetFirstRenderData()
        if myRD==None: return
        while myRD:
            if myRD.GetName()==name:
                doc.SetActiveRenderData(myRD)
                c4d.EventAdd()
            else:
                myRD.SetAllBits(2) # Reverse engineered with GetAllBits(), 2 is BIT_ACTIVE but we deactivate it so use the literal value
            myRD = GetNextObject(myRD)
    

    Also just a note, c4d.EventAdd() wasn't called because you just forgot the parenthesis to actually call the method.



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

    On 17/11/2012 at 03:19, xxxxxxxx wrote:

    Hi Yannick,

    thanks that works great.

    one (hopefully) last questiion

    if I use the RDFindAndDelete funktion with renderdata that has a child renderdata

      
        def GetNextRObject(obj) :   
            if obj==None: return None   
            if obj.GetDown() : return obj.GetDown()   
            while not obj.GetNext() and obj.GetUp() :   
                obj = obj.GetUp()   
            return obj.GetNext()   
      
        def RDFindAndDelete(name) :   
            myRD = doc.GetFirstRenderData()   
            if myRD==None: return   
            while myRD:   
                if myRD.GetName()==name:   
                   myRD.Remove()   
                   c4d.EventAdd()   
                myRD = GetNextRObject(myRD)   
    

    I gett a error message: Reference error: the object 'c4d.documents.RenderData' is not alive.

    but the script still works as intended (at least I think so :)

    best regards
    Jops



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

    On 19/11/2012 at 01:57, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    if I use the RDFindAndDelete funktion with renderdata that has a child renderdata

    I gett a error message: Reference error: the object 'c4d.documents.RenderData' is not alive.

    but the script still works as intended (at least I think so :)

    This is because you deleted a render data that has a child render data. If you remove a parent render data, the children still references it but it's not alive anymore.
    Before deleting a render data you have to make sure it has no children, removing or moving them.


Log in to reply