Solved Python Generator - How to assign a field object to a deformer

Hi all.

I am new to python and I'm looking for help with assigning a field object to a deformer's falloff within a Python Generator.

So for example I set up the objects like this:

myParentNull = c4d.BaseObject(c4d.Onull)
myFieldObj = c4d.BaseObject(c4d.Flinear)
myModObj = c4d.BaseObject(1021280) #1021280 = Squash And Stretch Deform Object
myFieldObj.InsertUnder(myParentNull)

... I then hoped that this would achieve what I was after, but it looks like this isn't the way to assign the field object (it doesn't work)

myModObj[c4d.FIELDS] = myFieldObj

Can anyone help?

Many thanks,
Jamie
www.moGRR.co.uk

The FIELDS parameter stores a FieldList object. You have to add your field to that field list.

fieldList = op[c4d.FIELDS]

layer = c4d.modules.mograph.FieldLayer(c4d.FLfield)
layer.SetLinkedObject(field)
fieldList.InsertLayer(layer)

op[c4d.FIELDS] = fieldList
c4d.EventAdd()

See FieldList Manual, c4d.FieldList, c4d.modules.mograph.FieldLayer

Thanks for the reply Plugin Student.

Having a FieldList makes sense. I was kind of looking for something along those lines.

I've tried incorporating your code into my python generator and I'm getting this error with the .InsertLayer line:
AttributeError: 'NoneType' object has no attribute 'InsertLayer'

Maybe I'm misunderstanding how the fieldlist and layers work? Here is the Python Generator code I am getting that error with:

import c4d
#Welcome to the world of Python


def main():
    myParentNull = c4d.BaseObject(c4d.Onull)

    myDefObj = c4d.BaseObject(1021280) #1021280 = Squash And Stretch Deform Object
    myDefObj.InsertUnder(myParentNull)

    myFieldNull = c4d.BaseObject(c4d.Onull)
    myFieldNull.InsertUnder(myParentNull)

    myFieldObj = c4d.BaseObject(c4d.Flinear)
    myFieldObj.InsertUnder(myFieldNull)

    myFieldList = myDefObj[c4d.FIELDS]
    
    myFieldLayer = c4d.modules.mograph.FieldLayer(c4d.FLfield)
    myFieldLayer.SetLinkedObject(myFieldObj)
    myFieldList.InsertLayer(myFieldLayer)

    c4d.EventAdd()
    return(myParentNull)

Well,

myFieldList = myDefObj[c4d.FIELDS]

seems to return None.

I guess you can create a field list and use that list:

myFieldList = c4d.FieldList()

Also, do not call c4d.EventAdd() in a Python Generator.

Thanks again Plugin Student.

I wasn't too sure if I should have an EventAdd in a Python Generator or not, so thanks for clearing that up.

So this is the code I now have, but it still isn't successfully adding the FieldList to the Deformer object:

import c4d
#Welcome to the world of Python


def main():
    myParentNull = c4d.BaseObject(c4d.Onull)

    myDefObj = c4d.BaseObject(1021280) #1021280 = Squash And Stretch Deform Object
    myDefObj.InsertUnder(myParentNull)

    myFieldNull = c4d.BaseObject(c4d.Onull)
    myFieldNull.InsertUnder(myParentNull)

    myFieldObj = c4d.BaseObject(c4d.Flinear)
    myFieldObj.InsertUnder(myFieldNull)

    myFieldLayer = c4d.modules.mograph.FieldLayer(c4d.FLfield)
    myFieldLayer.SetLinkedObject(myFieldObj)

    myFieldList = c4d.FieldList()
    myFieldList.InsertLayer(myFieldLayer)

    return(myParentNull)

Oops - I forgot to have the following line:

myDefObj[c4d.FIELDS] = myFieldList

It all works perfectly now. Thanks again for your help @PluginStudent