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 plugin and Linux CLR arguments

    Cinema 4D SDK
    python s24 r23
    2
    5
    765
    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.
    • V
      vtq
      last edited by

      Hello,
      I am currently trying to export the render settings from a .c4d file with python on Linux. If I'm not mistaken the only way to achieve this on Linux is to write a .pyp plugin that reads commandline arguments as explained here and use a special flag to activate a settings exporting script.
      However I couldn't get any output in the console with that type of plugin, even with the example from the docs. Is it possible to use such a plugin on the Linux CLR version of c4d ?

      I tried the plugins with both S24 and R23 versions in a docker container based on Ubuntu 18.04. Rendering (with Arnold or Redshift) works fine.

      Any help would be greatly appreciated.
      Best regards,

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

        Hi,

        while with c4dpy you can execute a python script, the command-line render doesn't.
        if you try to create a plugin, PluginMessage will be called before your document is loaded, so you will only have access to the default document.

        The workaround is to load yourself the document in the PluginMessage:
        The problem I see is that if your project has plugins, you are not guarantee that they will be already loaded.

        import c4d
        import sys
        from datetime import datetime
        from contextlib import redirect_stdout
        import os.path
        
        def PluginMessage(id, data):
            if id==c4d.C4DPL_COMMANDLINEARGS:
                # react to command line arguments
                # redirect the print to a file
                with open('d:\\log.txt', 'w') as f:
                    with redirect_stdout(f):
                        # now we can use print to directly print to the file
                        print(datetime.now(), sys.argv) #print arguments
                        fileName = sys.argv[0]
                        if os.path.isfile(fileName):
                            flags = c4d.SCENEFILTER_OBJECTS
                            # open the document
                            doc = c4d.documents.LoadDocument(fileName, flags)
                            if doc is None:
                                print (datetime.now(), "file {} not loaded".format(fileName))
                                return True
        
                            print (datetime.now(), "file {} loaded".format(fileName))
                            # retrieve the active render settings
                            rd = doc.GetActiveRenderData()
                            
                            if rd is None:
                                print (datetime.now(), "can't retrieve the render settings")
                                return True
                            # access render settings
                            print (datetime.now(), "Resolution of the current file ", rd[c4d.RDATA_XRES], rd[c4d.RDATA_YRES])
        
                            # close the document
                            c4d.documents.KillDocument(doc)
                        else:
                            print (datetime.now(), "file {} not loaded".format(fileName))   
                            
                        print (datetime.now(), "finished")
                return True
            return False
        
        
        

        If you still want to render the document, you can get inspired by our c++ example

        What's the issue you are facing? there's maybe another way of doing it.

        Cheers,
        Manuel

        MAXON SDK Specialist

        MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • V
          vtq
          last edited by

          Thanks for the answer and the example.

          The goal is to get the render settings and a few other parameters from a file without rendering it. I have to do it on linux so the ways to achieve it are limited.

          With your plugin code I had the same results I had with the example from the documentation, nothing happened and I had the message Warning! Unknown arguments: right before C4D END.

          I install these plugins by putting the .pyp file in /opt/maxon/cinema4dr23.110/bin/plugins but they don't seem to load. On the other hand rendering plugins seem to load and work just fine. I also had to export the envvar g_modulePath=/opt/maxon/cinema4dr23.110/bin for the rendering plugins to load.
          Am I missing any step when adding a python plugin ?

          Best regards,

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

            Hi,

            I also have that bad argument, but the plugin is working fine using g_additionalModulePath=/media/val/empty/cmd_plugin/

            the above code but with a correct path for my linux virtual machine.

             with open('/media/val/empty/log.txt', 'w') as f:
            
            ./Commandline /media/val/empty/test.c4d g_additionalModulePath=/media/val/empty/cmd_plugin/
            

            1- The render works and the log.txt is created. Just to be sure, did you execute bin/setup_c4d_env?
            2 - If you just use the commandline to render a file, it works?

            In any case the command line render isn't created to gather information about files. Wine/c4dpy could be a better solution for that case, but you could have some issue with some rendering modules.

            Cheers,
            Manuel

            MAXON SDK Specialist

            MAXON Registered Developer

            1 Reply Last reply Reply Quote 0
            • V
              vtq
              last edited by

              Hello,
              Adding the path to the plugin in g_additionalModulePath fixed the issue.

              Thank you very much for your help.

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