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

    Xpresso Python Node . "Code" field

    Cinema 4D SDK
    3
    8
    1.4k
    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.
    • esanE
      esan
      last edited by esan

      R20

      I need to add an "Object" port to an object node, but I guess since I have R20 with that particular python bug preventing it, I need to find a workaround. All I need to do is get the currently instanced objects name, fed back into the display name (and appending with another string in here). Ive seen that "UserData" workaround to get a makeshift Object port but that feels heavy handed for my case. Thought a python node with simple script can replace my Object node and Name port like so
      0bbef353-e55e-43bb-a3e9-991674a387d0-image.png

      And this works, but cant seem to figure out how to "set" this Python Code in this Node via my Python Script. Have made this snippet of code a function and was trying everything from OperatorSetData, and even the InsertObjects through In/Exclude method I was just shown for my Link List question. But nothing ive done yet seems to populate the field. Final Stretch! Thanks for all the help thus far, this script has already been an amazing learning experience.

      def main():
      
          global Output2
          global Input3
      
          Output2 = c4d.BaseList2D.GetName(Input3)
      
      CairynC 1 Reply Last reply Reply Quote 0
      • CairynC
        Cairyn @esan
        last edited by

        @esan Your Python node and code do not match up. You have renamed the ports to Link and String but in your code the globals that are supposed to connect to the ports are named Output2 and Input3. This must be consistent.

        You can write the call to GetName easier as well by invoking it on the object (the input port).

        import c4d
        
        def main():
            global TheLink, ObjName # ports
            ObjName = TheLink.GetName()
        
        1 Reply Last reply Reply Quote 0
        • esanE
          esan
          last edited by esan

          @Cairyn

          Sorry, i have a lot of permutations of this and the code snippet isn't from that exact node pictured, just grabbed examples at random since the point of the question was asking how to populate the Python Node Code field with my Python Script. Once that works then yes ill make all the proper ports/names to accommodate, that part i have figured out and got working, just inserting code into the field is what im missing. Thanks

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

            Hi you can define the python code as you will do for any BaseList2D parameter with SetParameter since GvNode is a child of BaseList2D.

            So you can drag and drop parameter as explained in the Python Console Manual

            Cheers,
            Maxime.

            MAXON SDK Specialist

            Development Blog, MAXON Registered Developer

            esanE 2 Replies Last reply Reply Quote 1
            • esanE
              esan @m_adam
              last edited by

              @m_adam

              ahh, palm securely in face. Ya I had the GV_PYTHON_CODE but since I had spent so much time wrapping my head around this OperatorSetData in the node world prior I overcomplicated it from the start. Hadnt come across that console manual either, thanks a lot!

              1 Reply Last reply Reply Quote 0
              • esanE
                esan @m_adam
                last edited by esan

                @m_adam

                So final question. When i execute node[2][c4d.GV_PYTHON_CODE] = 'test string', all is well. When i try to exectute this as a function, i get errors. This setup gives me error " setitem expected str, not None"

                i wanted to do a multi-line string incapsulation but the triple quotes seem to be reserved for title/headers in this environment. How would i go about conveying that this function is a Str if making it a bucket of strings doesnt do it?

                def pythonNodeCode():
                
                    'import c4d'
                    
                    'def main():'
                
                    '    global Output2'
                    '    global Input3'
                 
                    '    Output2 = c4d.BaseList2D.GetName(Input3)'
                
                def main():
                
                    #skip a lot of other code
                
                    node[2][c4d.GV_PYTHON_CODE] = pythonNodeCode()
                
                
                
                
                

                (i tried node[2][c4d.GV_PYTHON_CODE] = str(pythonNodeCode()) too just to make sure the obvious wasnt sitting in my face)

                edit: I achieved the intent with this, but still interested in the non-atrocious way to write it lol

                 node[2][c4d.GV_PYTHON_CODE] = 'import c4d \n\ndef main():\n\n    global Output2\n    global Input3\n\n    Output2 = c4d.BaseList2D.GetName(Input3)'
                
                CairynC 1 Reply Last reply Reply Quote 0
                • CairynC
                  Cairyn @esan
                  last edited by

                  @esan Your first version does not assign the string(s) to anything - a return is missing. What pythonNodeCode() is actually doing is to define a number of strings that are then discarded, and to return None as this is the default.

                  You can write it line by line if you add the \n manually to each line, and force Python to concatenate the strings by using line continuation \

                  def pythonNodeCode():
                      return \
                          'import c4d\n'\
                          'def main():\n'\
                          '    global Output2\n'\
                          '    global Input3\n'\
                          '    Output2 = c4d.BaseList2D.GetName(Input3)\n'\
                  

                  I don't quite see why triple quotation should not work, maybe same issue?

                  def pythonNodeCode():
                      return '''
                  
                  import c4d
                  
                  def main():
                      global Output2
                      global Input3
                  
                      Output2 = c4d.BaseList2D.GetName(Input3)
                  '''
                  
                  1 Reply Last reply Reply Quote 1
                  • esanE
                    esan
                    last edited by

                    @Cairyn

                    Ah youre right, the Return was the cause of the errors, not the triple quotes. Got it all working now! (after taking a few tries to get the "indents" with the strings right)

                    Thanks a ton!

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