Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    rendersettings copy, activate, search, delete

    Scheduled Pinned Locked Moved PYTHON Development
    13 Posts 0 Posters 981 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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)
        
        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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!!!!!!

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            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)   
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              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).

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                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

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  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

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      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

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        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.

                        1 Reply Last reply Reply Quote 0
                        • H Offline
                          Helper
                          last edited by

                          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

                          1 Reply Last reply Reply Quote 0
                          • H Offline
                            Helper
                            last edited by

                            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.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post