Solved 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

MAXON SDK Specialist

MAXON Registered Developer

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

MAXON SDK Specialist

MAXON Registered Developer

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.