GeGetModata inside Python Generator returns none
-
i use a clone with a null object to generate me some point lists for further processing. unfortunally i'm not able to get the modata from this cloner.
see setup for details:
cloneNone.c4d -
hello,
this is because the modata are store in a tag that is not created yet.
a "workaround" is to create it in a "temporary document" and
ExecutePasses()
on it.So the cloner will create the hidden tag and you will be able to retrieve the
MoData
import c4d #Welcome to the world of Python def CreateClonerAndFun(base, rad): """ Creates the cloner, clone the base. Creates the effector return the parent and the cloner. """ parent = c4d.BaseObject(c4d.Onull) base = base.GetClone() base.InsertUnderLast(parent) cloner = c4d.BaseObject(1018544) cloner.InsertUnder(parent) p = c4d.BaseObject(c4d.Onull) p[c4d.NULLOBJECT_DISPLAY] = 2 p[c4d.NULLOBJECT_RADIUS] = rad p.InsertUnder(cloner) pushEffector = c4d.BaseObject(440000219) pushEffector[c4d.MGPUSHAPARTEFFECTOR_MODE] = 0 pushEffector[c4d.MGPUSHAPARTEFFECTOR_RADIUS] = rad pushEffector.InsertUnderLast(parent) ie = c4d.InExcludeData() ie.InsertObject(pushEffector,15) cloner[c4d.ID_MG_MOTIONGENERATOR_MODE] = 0 cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] = ie cloner[c4d.MG_OBJECT_LINK] = base cloner[c4d.MG_POLY_MODE_] = 0 return parent, cloner def main(): # Checks if we got a child child = op.GetDown() if child is None: raise ValueError("no child on this generator") # using a function to avoid double code parent, cloner = CreateClonerAndFun(child, 10) # Creates a new Document newDoc = c4d.documents.BaseDocument() # Inserts the object in the new document newDoc.InsertObject(parent) # ExecutePasses on the document if not newDoc.ExecutePasses(None,True,True,True, c4d.BUILDFLAGS_NONE): raise ValueError("erro while updating the document") # Retrieves the modata from the object md = c4d.modules.mograph.GeGetMoData(cloner) print md # Re-create the cloner but this time to return the parent. return CreateClonerAndFun(child, 10)[0]
Cheers
Manuel -
to be honest - i don't know where my fault was. Unhappily i didn't commit the not working version. In my plugin i
already used a virtual doc for some other calculations. thank you!vd.ExecutePasses(c4d.threading.GeGetCurrentThread(), True, True, True, c4d.BUILDFLAGS_NONE) md = c4d.modules.mograph.GeGetMoData(matrix) for m in md.GetArray(c4d.MODATA_MATRIX): rdPoints.append(m.off)
works like a sharm.