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

    Creating an Xpresso node

    Scheduled Pinned Locked Moved SDK Help
    4 Posts 0 Posters 428 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

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 28/10/2010 at 21:24, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   12 
      Platform:   Windows  ;   
      Language(s) :       PYTHON  ;

      ---------
      I want to dynamically create an XPresso node which references the current active material (or some other object).

      Using the python code below successfully creates a node, but it seems to reference the object the Xpresso tag belongs to by default (Cube).   The code tries to use SetLink to change the object reference to a material, however in the Xpresso editor it still references the original Cube object.

      Any idea how to create a node which references a specific object?

      Aside: I saw the note about using GetParameter rather than GetDataInstance, but Python doesn't seem to support that method.

      _
      _def main() :
        # Get Node master for selected Xpresso tag
        nm = doc.GetActiveTag().GetNodeMaster()

      # This creates a Xpresso reference node
        # to the Cube object containing the active tag
        node = nm.CreateNode(nm.GetRoot(), c4d.ID_OPERATOR_OBJECT)

      # prints out 'Cube' as the node link
        print node.GetOperatorContainer()[c4d.GV_OBJECT_OBJECT_ID].GetName()

      # Attempt to reference the active material instead
        con = node.GetOperatorContainer()
        con.SetLink(c4d.GV_OBJECT_OBJECT_ID, doc.GetActiveMaterial())
        node.SetOperatorContainer(con)

      # prints out 'Mat' as the node link
        print node.GetOperatorContainer()[c4d.GV_OBJECT_OBJECT_ID].GetName()

      # Add the new node to root XGroup
        nm.InsertLast(nm.GetRoot(), node)

      # Node is now added to XPresso but is still a reference to Cube

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 29/10/2010 at 01:18, xxxxxxxx wrote:

        Hi Trelane, please try:

        mat = doc.GetActiveMaterial()
        if mat==None: return
        node[c4d.GV_OBJECT_OBJECT_ID]=mat
        

        Cheers, Seb

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

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 29/10/2010 at 07:55, xxxxxxxx wrote:

          Sebastian, thank you for the quick response, that worked!

          Another question if I may.  The Layer shader is behaving strangely.  I'm trying to get at the shaders within a layer, but iterating over the layer container causes c4d to crash!   Here is some sample code that crashes:

          Before running, create material with Layer shader in reflection channel and add some layers

          def main() :
            # Get the Layer shader object inside material
            mat = doc.GetActiveMaterial()
            if mat==None: return
            layerShader = mat[c4d.MATERIAL_REFLECTION_SHADER]
            if layerShader==None: return

          # Prints 'Layer' so everything is fine up to here
            print layerShader.GetName()

          # layerShader is not iterable so display container
            con = layerShader.GetDataInstance()
            for k,v in con:
                print k,v

          # crash!

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

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 29/10/2010 at 09:35, xxxxxxxx wrote:

            Can you please post a file so I can reproduce the crash? Here everything works as expected.
            Cheers, Sebastian

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