Thanks for the reply - sorry to resurrect this post, but I am still struggling to put your advice to use. since I am mostly writing this plugin to learn, I'll go ahead and just paste the code in here ( please be gentle)
class CloneStalker (plugins.ObjectData):
def init (self):
self.SetOptimizeCache(True)
def Init(self, node):
# Parameter initialization
self.InitAttr(node, float, [c4d.CL_STALKER_MAX_NULLS])
node[c4d.CL_STALKER_MAX_NULLS] = 100.0
pd = c4d.PriorityData()
if pd is None:
raise MemoryError("Failed to create a priority data.")
pd.SetPriorityValue(c4d.PRIORITYVALUE_MODE, 4)
pd.SetPriorityValue(c4d.PRIORITYVALUE_PRIORITY, 100)
node[c4d.EXPRESSION_PRIORITY] = pd
return True
def CheckDirty(self, op, doc):
frame = doc.GetTime().GetFrame(doc.GetFps())
if frame != lastFrame:
lastFrame = frame
op.SetDirty(c4d.DIRTYFLAGS_DATA)
def AddToExecution(self, op, list) :
list.Add(op, c4d.EXECUTIONPRIORITY_GENERATOR, 400)
return True
def GetVirtualObjects(self, op, hh):
cloner = op[c4d.CL_STALKER_TARGET]
doc = c4d.documents.GetActiveDocument()
def GetStalkers(bname,tgt):
allChild = tgt.GetChildren()
stalkerChilds = []
if allChild != None:
for i in allChild:
childname = i[c4d.ID_BASELIST_NAME]
bnamelenght = len(bname)
subname = childname[0:bnamelenght]
if subname == bname:
stalkerChilds.append(i)
return stalkerChilds
if cloner != None:
modata=mo.GeGetMoData(cloner)
if modata != None:
cache = cloner.GetDeformCache()
if cache is None:
cache = cloner.GetCache()
clones = cache.GetChildren()
name = str(cloner[c4d.ID_BASELIST_NAME]) + ".Cloner Stalker"
child_basename = op[c4d.ID_BASELIST_NAME].replace(".Cloner Stalker", ".Stalker.")
if cloner.GetNext() != op:
op.InsertAfter(cloner)
null= c4d.BaseObject(c4d.Onull)
null[c4d.NULLOBJECT_DISPLAY]=0
null[c4d.ID_BASELIST_NAME] = name
parent=op
md = mo.GeGetMoData(cloner)
marr = md.GetArray(c4d.MODATA_MATRIX)
count = md.GetCount()
Selection = []
maxNulls = op[c4d.CL_STALKER_MAX_NULLS]
lastChild = None
child = GetStalkers(child_basename,op)
if mo.GeGetMoDataSelection(cloner) == None:
for i in range(count):
Selection.append(i)
selected=Selection
if mo.GeGetMoDataSelection(cloner)!= None:
Selection = mo.GeGetMoDataSelection(cloner).GetAll(count)
selected=[i for i,x in enumerate(Selection) if x==1]
if op[c4d.ID_BASELIST_NAME]!=name:
child_basename = op[c4d.ID_BASELIST_NAME].replace(".Cloner Stalker", ".Stalker.")
if len(child)>0:
for i in child:
old_name =i[c4d.ID_BASELIST_NAME]
index_name = old_name[len(child_basename):len(old_name)]
n_name = cloner[c4d.ID_BASELIST_NAME] + ".Stalker." + index_name
i[c4d.ID_BASELIST_NAME] = n_name
print (n_name)
op[c4d.ID_BASELIST_NAME] = name
child_basename = op[c4d.ID_BASELIST_NAME].replace(".Cloner Stalker", ".Stalker.")
child = GetStalkers(child_basename,op)
parent=op
op.SetMg(cloner.GetMg())
if len(child)<len(selected) and len(child) < maxNulls:
currChilds=[]
for i in child:
child_name = i[c4d.ID_BASELIST_NAME]
nameLenght = len(child_name)
index = int(child_name[len(child_basename):nameLenght])
currChilds.append(index)
new = [item for item in selected if item not in currChilds]
for i in new:
obj= c4d.BaseObject(c4d.Onull)
obj[c4d.ID_BASELIST_NAME] = child_basename + str(i)
obj[c4d.NULLOBJECT_DISPLAY]=3
obj[c4d.NULLOBJECT_RADIUS]=50
extCompTag = c4d.BaseTag(465000402)
matrix = clones[i].GetMg()
obj.SetMg(matrix)
obj.InsertTag(extCompTag)
if len(child)>0:
lastChild = child[(len(child)-1)]
doc.InsertObject(obj,parent,lastChild)
child = GetStalkers(child_basename,op)
if len(child)==maxNulls:
break
if len(child)>len(selected) or len(child)>maxNulls:
for i in child:
child_name = i[c4d.ID_BASELIST_NAME]
nameLenght = len(child_name)
index = child_name[len(child_basename):nameLenght]
if not int(index) in selected:
i.Remove()
child = GetStalkers(child_basename,op)
while len(child)>maxNulls:
lastChild = child[(len(child)-1)]
lastChild.Remove()
child = GetStalkers(child_basename,op)
def Execute(self, op, doc, bt, priority, flags) :
def GetStalkers(bname,tgt):
allChild = tgt.GetChildren()
stalkerChilds = []
if allChild != None:
for i in allChild:
childname = i[c4d.ID_BASELIST_NAME]
bnamelenght = len(bname)
subname = childname[0:bnamelenght]
if subname == bname:
stalkerChilds.append(i)
return stalkerChilds
cloner = op[c4d.CL_STALKER_TARGET]
doc = c4d.documents.GetActiveDocument()
name = str(cloner[c4d.ID_BASELIST_NAME]) + ".Cloner Stalker"
child_basename = op[c4d.ID_BASELIST_NAME].replace(".Cloner Stalker", ".Stalker.")
parent=op
child = GetStalkers(child_basename,op)
Selection = []
if cloner != None:
modata=mo.GeGetMoData(cloner)
if modata != None:
cache = cloner.GetDeformCache()
if cache is None:
cache = cloner.GetCache()
clones = cache.GetChildren()
md = mo.GeGetMoData(cloner)
marr = md.GetArray(c4d.MODATA_MATRIX)
count = md.GetCount()
if mo.GeGetMoDataSelection(cloner) == None:
for i in range(count):
Selection.append(i)
selected=Selection
if mo.GeGetMoDataSelection(cloner)!= None:
Selection = mo.GeGetMoDataSelection(cloner).GetAll(count)
selected=[i for i,x in enumerate(Selection) if x==1]
for x in selected:
matrix = clones[x].GetMg()
ch_name = child_basename + str(x)
obj=c4d.documents.BaseDocument.SearchObject(doc,ch_name)
obj.SetMg(matrix)
print (clones[x].IsDirty(1))
return c4d.EXECUTIONRESULT_OK
Please feel free to advise what i am doing wrong here, and what shuold i be doing instead.
many thanks for your patience.
cheers
Eddie