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

    The second "call command" cannot be executed

    Cinema 4D SDK
    python s24
    3
    6
    749
    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.
    • M
      mari
      last edited by

      Hello, I am always indebted to you.
      When rendering is finished, I want to perform rendering again.
      However, I am in trouble because the second command is not executed.
      I want you to tell me. Please.

      import c4d
      from c4d import gui
      import datetime
      import time
      import threading
      
      PLUGIN_ID = 1058983
      renderQ = 2
      rdCheck = 0
      
      class MainDialog(c4d.gui.GeDialog):
      
          def CreateLayout(self):
              self.SetTitle('Main Dialog')
              self.AddButton(1000, 0, name="RenderStart")
              self.AddButton(1001, 0, name="stop")
              return True
      
          def Command(self, Id, bc):
              global renderQ
              global rdCheck
      
              thread_rendercheck = threading.Thread(target=RenderCheck)
      
              if Id == 1000:
                  RenderSetting()
                  print('start Render')
                  c4d.CallCommand(12099)
                  thread_rendercheck.start()
      
              elif Id == 1001:
                  renderQ = 0
                  rdCheck = 0
                  print('stop')
      
      
      def RenderSetting():
          now = datetime.datetime.now()
          doc = c4d.documents.GetActiveDocument()
          renderData = doc.GetActiveRenderData()
          filename = 'path/test_'+str(now.microsecond)+'.png'
          renderData[c4d.RDATA_PATH] = filename
      
          renderData = doc.GetActiveRenderData().GetData()
          print(renderData[c4d.RDATA_PATH])
      
      def RenderCheck():
          global renderQ
          global rdCheck
          rdCheck = 1
      
          while renderQ > 0:
              rdCheck = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)
              
              print("...now rendering")
      
              time.sleep(1)
      
              if rdCheck == 0:
                  print('end')
                  renderQ -= 1
                  print('render more… '+str(renderQ))
      
                  if renderQ > 0:
                      RenderSetting()
                      c4d.CallCommand(12099)
                      print('start Render')
      
          return True
      
      class MainDialogCommand(c4d.plugins.CommandData):
          dialog = None
      
          def Execute(self, doc):
              if self.dialog is None:
                  self.dialog = MainDialog()
      
              # Opens the dialog
              return self.dialog.Open(dlgtype=c4d.DLG_TYPE_ASYNC, pluginid=PLUGIN_ID, defaultw=400, defaulth=32)
      
          def RestoreLayout(self, sec_ref):
              if self.dialog is None:
                  self.dialog = MainDialog()
      
              # Restores the layout
              return self.dialog.Restore(pluginid=PLUGIN_ID, secret=sec_ref)
      
      
      # main
      if __name__ == "__main__":
          # Registers the plugin
          c4d.plugins.RegisterCommandPlugin(id=PLUGIN_ID,
                                            str="Py-RenderShread_test_kt Dialog",
                                            info=0,
                                            help="RenderTest GUI",
                                            dat=MainDialogCommand(),
                                            icon=None)
      
      1 Reply Last reply Reply Quote 0
      • ManuelM
        Manuel
        last edited by Manuel

        Hi,

        What you are trying to do is not clear. You want to queue several renders?
        If you want to be notified about the render progress you should use RenderDocument where you can define callback that will be called during the render.

        CallCommand must be used inside the mainThread otherwise it will not work. See GeIsMainThread for more information and this page for more information about threading inside cinema 4D

        Cheers,
        Manuel

        MAXON SDK Specialist

        MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • M
          mari
          last edited by

          Thank you for your comment!
          Yes. I want to queue several renders.

          I also want to operate the screen while rendering.

          CallCommand must be used inside the mainThread otherwise it will not work.
          Is that so. thank you.

          I have another question.
          Is there an SDK to perform the rendering?

          I want to perform rendering while looking at the rendering result like [Render to Picture Viewer].

          1 Reply Last reply Reply Quote 0
          • ManuelM
            Manuel
            last edited by

            Hi,

            That depend if you want to see the render while it is rendering or just the result. Using the example provided with RenderDocument you can call ShowBitmap once the render is finished.

            But that is what the render queue is offering. (Except it will display the result in a small size preview) You can also use the render queue to push renders and still have a look at them.

            If you want to display the result of the render while it's running, you will need to create your own GeDialog with a UserArea that will display the BMP. The BMP should be a global variable.

            Cheers,
            Manuel

            MAXON SDK Specialist

            MAXON Registered Developer

            1 Reply Last reply Reply Quote 0
            • M
              mari
              last edited by

              thank you for your reply.

              If possible, I wanted to see the rendering results during rendering.

              >If you want to display the result of the render while it's running, you will need to create your own GeDialog with a UserArea that will display the BMP. The BMP should be a global variable.

              I wanna try!thank you!

              ferdinandF 1 Reply Last reply Reply Quote 0
              • ferdinandF
                ferdinand @mari
                last edited by

                Hello @mari,

                without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic.

                Thank you for your understanding,
                Ferdinand

                MAXON SDK Specialist
                developers.maxon.net

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