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
    • Recent
    • Tags
    • Users
    • Login

    InsertRenderData and a while statement

    Scheduled Pinned Locked Moved PYTHON Development
    10 Posts 0 Posters 835 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

      On 02/02/2016 at 07:00, xxxxxxxx wrote:

      I'm trying to pull render data from a template file and insert it into the active document. I can do it one line at a time using 
      rD = templateFile.GetFirstRenderData()
      rD1 = rD.GetNext()

      "templateFile" is a file that the user loads and the script then loads the document to pull the render data.

      Then I InsertRenderData(rD) into the active document. It all works if I do line by line but a "while" statement would be best for this as I don't know how many id's of Render Settings I'm pulling from the template.

      When I put it into a "while" loop it crashes. It seems to pull the first ID but then it gets stuck in the active document and stops pulling from the loaded file, it will just pull the settings from the active document. I know I'm missing something but I just can't find it on google. Any help would be great! Maybe there is a better way!

      Thanks!
      Anthony

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

        On 03/02/2016 at 13:15, xxxxxxxx wrote:

        Hi Anthony,

        welcome to the Plugin Café forums 🙂

        A while loop should be no problem here. Can you post your entire while loop, so can have a look.

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

          On 08/02/2016 at 07:20, xxxxxxxx wrote:

          Thanks for the kind welcome!
          Sorry for the slow response. I'm on a locked down machine in production. I'll recreate what I have the best I can, very abbreviated:
          <CODE>
          import c4d, os
          from c4d import gui, documents
          import c4d.documents as cdoc #the c stands for current, easier for me to see

          #I select the file through the load dialog
          selectedFile = c4d.storage(LoadDialog....

          #Then I load that file (not sure if that's needed??)
          loadTemplate = c4d.documents.LoadDocument(selectedFile, loadflags=c4d.SCENEFILTER_0,)

          tRD = loadTemplate.GetFirstRenderData()

          #so this is where I would put the loop if it didn't crash, something like this:
          while tRD:
              activeDoc.InsertRenderData(tRD)
              tRD = tRD.GetNext()

          c4d.EventAdd()
          </CODE>

          That's pretty much the jist of it. It will pick up the first setting but then loop in the current document and to infinity. Maybe my structure is incorrect for this type of thing. Still learning :).
          Thanks!
          Anthony

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

            On 08/02/2016 at 07:59, xxxxxxxx wrote:

            Try to call tRD.Remove() before activeDoc.InsertRenderData()

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

              On 08/02/2016 at 08:02, xxxxxxxx wrote:

              Or use a clone. What Niklas means, any GeListNode derived entity is only allowed to reside in one list/tree.

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

                On 08/02/2016 at 09:48, xxxxxxxx wrote:

                Niklas: Calling tRD.Remove() before activeDoc.InsertRenderData(tRD) still puts it into a infinite loop. I might be doing it wrong?

                Andreas: I saw the clone stuff in the documentation but I'm not sure how to really use it. I'll look more into that. I would like this to be compatible as far back as R15 if possible and I think the clone is a new feature in r17? I might be wrong but thanks for pointing me that way.

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

                  On 08/02/2016 at 10:50, xxxxxxxx wrote:

                  Ah yes, you should either be cloning it or getting the next object before calling Remove(), otherwise it won't work of course (tRD.GetNext() will return None after you called Remove())

                  Are you sure the infinite loop is the while loop in your code? It could be somewhere else, eg. resulting
                  from an invalid insertion of a node in the tree (as it happened without calling Remove()). I'll try to replicate
                  your example when I have time tomorrow.

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

                    On 08/02/2016 at 10:56, xxxxxxxx wrote:

                    Yeah, clone seems the best way. As for the infinite loop, my code is basically what I wrote here. It does the one thing and that's all. When I swap out the loop for doing it by hand:
                    tRD1 = tRD.GetNext(tRD)

                    activeDoc.InsertRenderData(tRD1)

                    for each one I have, it works without crashes or errors. Tedious but works for now, in production.

                    Thanks for all the help! Really appreciate it. I'll investigate the clone, maybe tonight if I get some time. 
                    Anthony

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

                      On 08/02/2016 at 23:17, xxxxxxxx wrote:

                      So this works for me without problems:

                      import os
                      import c4d
                        
                      def main() :
                          fname = c4d.storage.LoadDialog()
                          if not fname:
                              return
                          temp = c4d.documents.LoadDocument(fname, loadflags = c4d.SCENEFILTER_0)
                          if not temp:
                              c4d.gui.MessageDialog("scene file could not be loaded.")
                              return
                          doc.StartUndo()
                          trd = temp.GetFirstRenderData()
                          while trd:
                              next_trd = trd.GetNext()
                              trd.Remove()
                              doc.InsertRenderData(trd)
                              doc.AddUndo(c4d.UNDOTYPE_NEW, trd)
                              trd = next_trd
                          doc.EndUndo()
                          c4d.EventAdd()
                        
                      if __name__ == '__main__':
                          main()
                      
                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        On 09/02/2016 at 07:23, xxxxxxxx wrote:

                        Amazing, works perfectly! Thanks so much!!!

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