Creating an Xpresso node



  • 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



  • 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



  • 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!



  • 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


Log in to reply