Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Python Team Render Switch (Delay Issue)

    PYTHON Development
    0
    5
    1.6k
    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
      Helper
      last edited by

      On 22/07/2018 at 18:13, xxxxxxxx wrote:

      Hey Everyone,

      I have a straightforward setup that I'm trying to get working. Basically, I'd like to be able to change an object parameter at render time but specifically when I Team Render. Right now it's functioning but some of the render buckets are wrong.

      Some pictures of what's rendering and what's in the VP. 
      http://ben-caires.imgbb.com/

      import c4d

      def main() :
        global Render
          
          if c4d.CheckIsRunning ( c4d.CHECKISRUNNING_EXTERNALRENDERING ) :
              print("render in progress...")
          
          Render = c4d.CheckIsRunning ( c4d.CHECKISRUNNING_EXTERNALRENDERING )

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

        On 23/07/2018 at 05:50, xxxxxxxx wrote:

        Hi Bencaires, first of all, welcome in PluginCafe.

        May I ask you your context (script manager, tag, object)? It looks like you are from the script manager, but I'm not sure.
        Regarding your question, the issue comes from the fact Team Render is another instance of C4D, so it's why some buckets are wrong because they are calculated on the other instance of C4D which didn't get modified by your script.

        To use a script from the script manager is definitely not the way to go to modify a document which is currently rendering.
        And I'm afraid there is no proper way to do it in python. The correct way would have been to implement a SceneHook, which is not available in python, only in C++.
        But if it's just a matter of parameters changes (please read Threading Informations), you can create a python tag which will do the parameter switch for you.

        Moreover, your way to detect is not sufficient and there is no proper way to detect if the scene is currently rendered in Team Render.
        The thread ID is only reliable in c4d, but what you could do is check if the scene is currently open in Team Render Client, which should do the trick.

        So the following script in a python tag attached to a cube is working nicely.

        import c4d
          
        def main() :
            obj = op.GetObject()
            if c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING) and c4d.GeGetVersionType() != c4d.VERSIONTYPE_NET_CLIENT or c4d.GeGetVersionType() == c4d.VERSIONTYPE_NET_CLIENT:
                obj[c4d.PRIM_CUBE_LEN] = c4d.Vector(400)
            else:
                obj[c4d.PRIM_CUBE_LEN] = c4d.Vector(100)
        

        If you have any question, please let me know.
        Maxime.

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

          On 23/07/2018 at 10:54, xxxxxxxx wrote:

          Thanks, Maxime! That worked perfectly. I ended up plugging in the main part of the code into my python xpresso node and it works now with team rendering.

           
          import c4d
            
            
          def main() :
              global Render
              
              if c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING) and c4d.GeGetVersionType() != c4d.VERSIONTYPE_NET_CLIENT or c4d.GeGetVersionType() == c4d.VERSIONTYPE_NET_CLIENT:
                  print("render in progress...")
                  
              
              Render = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING) and c4d.GeGetVersionType() != c4d.VERSIONTYPE_NET_CLIENT or c4d.GeGetVersionType() == c4d.VERSIONTYPE_NET_CLIENT
              
              c4d.EventAdd() 
              
          if __name__=='__main__':
              main()
              c4d.EventAdd()    
              
            
          
          
          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 23/07/2018 at 16:04, xxxxxxxx wrote:

            Hey Maxime, one last thing. It turns out that the parameters that the code changes remains in that state until the team renderer is finished.... Is there a way to fix this because sometimes the renders are 6 minutes long and the reason for this switch is to speed up the VP. Thanks!

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

              On 24/07/2018 at 01:29, xxxxxxxx wrote:

              Hi Bencaires,

              First of all please read Threading Informations, Xpresso python node is the same thing than a Python tag. So that means you also can't add Event from an Xpresso (and in your case, it's not needed)

              Moreover, I'm pretty sure you do the switch based on the value of your global variable, which is global for all documents/scene. Moreover CheckIsRunning, only checks if the external render is currently running, without telling you this document is currently rendering.
              When you render a document, this document is actually cloned into the memory in order to be sure no modification is done while rendering (it's why you can still work and modify the scene in the VP, without affecting the rendered picture).
              So why not simply attach a python tag to the object you want to change the parameter, make the check if it's currently rendering, and then change the parameter only in this document.
              So maybe it's better to use the following code, which will check only if the current document is currently rendering

              obj = op.GetObject()
              t = c4d.threading.GeGetCurrentThread()
              if c4d.threading.IdentifyThread(t) == c4d.THREADTYPE_RENDEREXTERNAL or c4d.GeGetVersionType() == c4d.VERSIONTYPE_NET_CLIENT:
              	obj[c4d.PRIM_CUBE_LEN] = c4d.Vector(400) # Change your parameter directly here
              else:
              	obj[c4d.PRIM_CUBE_LEN] = c4d.Vector(100)
              

              If you have any question please let me know !
              Cheers,
              Maxime

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