CallCommand() help

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

On 27/06/2011 at 13:37, xxxxxxxx wrote:

So this is likely some noob mistake, some fundamental that I am missing.  I can get CallCommand to work great from the console but I can't for the life of me make it work in a script.  I'm not sure what I'm doing wrong.  The relevant part of the code is towards the bottom.  Thanks for your time!

  
import c4d
from c4d import SplineObject
from c4d import documents
from c4d import BaseTag
from c4d import BaseSelect
  
doc = c4d.documents.GetActiveDocument()
  
def add_spline(number_points, spline_length) :
    '''Returns a linear spline of a specified length that starts at the origin and extends through the y-axis'''
    segment_length = spline_length / (number_points - 1)
    spline = c4d.SplineObject(int(number_points), c4d.SPLINETYPE_LINEAR)
    
    index = 0
    while index <= (int(number_points) - 1) :
        if index == 0:
            spline.SetPoint(index, c4d.Vector())
            index += 1
        else:
            point_pos = c4d.Vector(0, 0, int((segment_length * index)))
            spline.SetPoint(index, point_pos)
            index += 1
    return spline
  
def main() :
    # function creates a linear spline
    spline = add_spline(10, 500)
    
    # create tags
    constraint_tag = c4d.BaseTag(1018074)                                       # 1018074 //Constraint
    dynamics_tag = c4d.BaseTag(1018068)                                         # 1018068 //Spline Dynamics
    
    # add dynamics tag to spline
    spline.InsertTag(dynamics_tag)
    
    # create null
    null = c4d.BaseObject(c4d.Onull)
    
    # insert null into anchor field for constraint tag
    constraint_tag[c4d.HAIR_CONSTRAINTS_TAG_ANCHOR_LINK] = null
    
    # add constraint tag to spline
    spline.InsertTag(constraint_tag)
    
    # select point 0 on spline (at position 0, 0, 0)
    all_points = spline.GetPointS()
    all_points.Select(0)
    
    # set the spline to be the active object
    doc.SetActiveObject(spline, 1)
    
    # get all tags attached to spline
    tags = spline.GetTags()
    
    # push the button HAIR_CONSTRAINTS_TAG_SET_ANCHOR
    c4d.CallButton(tags[0], 5000)                                               # 5000 //HAIR_CONSTRAINTS_TAG_SET_ANCHOR
    
    # Add the spline and null to the scene
    doc.InsertObject(spline)
    doc.InsertObject(null)
    
    c4d.EventAdd()
  
if __name__ == '__main__':
    main()

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

On 27/06/2011 at 16:23, xxxxxxxx wrote:

Not a noob mistake at all. It's a tricky one that can happen a lot. Especially in scripts.
Sometimes the object's need to be in the scene(not in memory) and C4D updated before you can go any further.

try it this way:

import c4d  
from c4d import SplineObject  
from c4d import documents  
from c4d import BaseTag  
from c4d import BaseSelect  
  
doc = c4d.documents.GetActiveDocument()  
  
def add_spline(number_points, spline_length) :  
  '''Returns a linear spline of a specified length that starts at the origin and extends through the y-axis'''  
  segment_length = spline_length / (number_points - 1)  
  spline = c4d.SplineObject(int(number_points), c4d.SPLINETYPE_LINEAR)  
    
  index = 0  
  while index <= (int(number_points) - 1) :  
      if index == 0:  
          spline.SetPoint(index, c4d.Vector())  
          index += 1  
      else:  
          point_pos = c4d.Vector(0, 0, int((segment_length * index)))  
          spline.SetPoint(index, point_pos)  
          index += 1  
  return spline  
  
def main() :  
  # function creates a linear spline  
  spline = add_spline(10, 500)  
    
  # create tags  
  constraint_tag = c4d.BaseTag(1018074)   # 1018074 //Constraint  
  dynamics_tag = c4d.BaseTag(1018068)     # 1018068 //Spline Dynamics  
    
  # add dynamics tag to spline  
  spline.InsertTag(dynamics_tag)  
    
  # create null  
  null = c4d.BaseObject(c4d.Onull)  
    
  # insert null into anchor field for constraint tag  
  constraint_tag[c4d.HAIR_CONSTRAINTS_TAG_ANCHOR_LINK] = null  
    
  # add constraint tag to spline  
  spline.InsertTag(constraint_tag)  
    
  # select point 0 on spline (at position 0, 0, 0)  
  all_points = spline.GetPointS()  
  all_points.Select(0)  
  
  # Add the spline and null to the scene  
  doc.InsertObject(spline)  
  doc.InsertObject(null)  
    
  # set the spline to be the active object  
  doc.SetActiveObject(spline, 1)  
    
  # get all tags attached to spline  
  tags = spline.GetTags()  
  
  #Before we attempt to execute any buttons. Let's first update C4D about all these changes we've made first  
  c4d.DrawViews(c4d.DRAWFLAGS_ONLY_ACTIVE_VIEW|c4d.DRAWFLAGS_NO_THREAD|c4d.DRAWFLAGS_NO_REDUCTION|c4d.DRAWFLAGS_STATICBREAK) #Update cinema 4d  
    
  # push the button HAIR_CONSTRAINTS_TAG_SET_ANCHOR  
  c4d.CallButton(tags[0], 5000)   # 5000 //HAIR_CONSTRAINTS_TAG_SET_ANCHOR  
    
  c4d.EventAdd()  
  
if __name__ == '__main__':  
  main()

-ScottA

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

On 27/06/2011 at 20:01, xxxxxxxx wrote:

Beautiful, Scott! Thank you so much.  This was definitely one of those sticky problems that's been with me for the last 4 days.  Cool technique to learn too.  Should come in handy in the future.