LINK EFFECTORS TO CLONERS
-
Hello,
I'm very new on python and I would like to know how to link the "pyhton effector" I create in this exemple to the cloner. I tried to use the InsertObject function but it seems that it's not working. TEST_CLONERS_1.c4dI run on R21
Can you help ?
import c4d from c4d import gui from c4d.modules import mograph as mo def cloner_creation(): Cloner = c4d.BaseList2D(1018544) Cloner[c4d.ID_MG_MOTIONGENERATOR_MODE] = 3 Spheres = c4d.BaseList2D(5160) doc.InsertObject(Cloner) doc.InsertObject(Spheres) Spheres.InsertUnder(Cloner) def effectorsCreation(): Effector = c4d.BaseList2D(1025800) EffectorList = c4d.InExcludeData() # Initialize an InExclude data Cloner.InsertObject(EffectorList) # Add effector to effectors list doc.InsertObject(Effector) # Main function def main(): cloner_creation() effectorsCreation() c4d.EventAdd() # Execute main() if __name__=='__main__': main()
-
Hi,
Not quite directly a revision of your code but this should help you get started.
import c4d from c4d import gui # Main function def main(): cloner = doc.SearchObject("Cloner") # Assuming there is already a Cloner Mograph Object plain_effector = doc.SearchObject("Plain")# Assuming there is already a Plain Effector Object effector_list = c4d.InExcludeData() effector_list.InsertObject(plain_effector, 1) cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] = effector_list c4d.EventAdd() # Execute main() if __name__=='__main__': main()
-
thank you for reaching out to us and thank you @bentraje for providing help.
The major problem with your code is that you have the line
Cloner.InsertObject(EffectorList)
in there. But there is no variable of the nameCloner
within the scope ofeffectorsCreation
. Which is why your code will raise aNameError
on this line. But even if the variableCloner
from your functioncloner_creation
would be visible withineffectorsCreation
, it would still raise anAttributeError
, because yourCloner
is of typeBaseObject
which has no attribute (i.e., method) of the nameInsertObject
.I would also recommend not to insatiate an
c4d.InExcludeData
from scratch, because you will lose any existing links by doing so and then writing back that newly allocatedInExcludeData
. In this case here it does not really matter, since you also instantiate the MoGraph cloner, i.e., its effectors list will still be empty. Below you can find a commented section of your code and a proposal how I would write something like that (which is effectively also what @bentraje did).Cheers,
FerdinandThe code:
import c4d # This is a lightly commented version of your code, pointing out the major # problem with your version. """ def effectorsCreation(): Effector = c4d.BaseList2D(1025800) # This does not do anything; it just creates an InexCludeData instance. EffectorList = c4d.InExcludeData() # Initialize an InExclude data # That does not work, Cloner is not visible in this scope, it would also # be an BaseObject, which does not have a InsertObject method. Cloner.InsertObject(EffectorList) # Add effector to effectors list doc.InsertObject(Effector) """ def CreateClonerSetup(): """ """ # Instantiate a MoGraph cloner and Python effector. One can also use # BaseList2D.__init__(), this version here is just more verbose. cloner = c4d.BaseObject(1018544) effector = c4d.BaseObject(1025800) # Get a copy of the InExcludeData Effectors parameter of the cloner. inExcludeData = cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] # Add the effector in an activated state (1) inExcludeData.InsertObject(effector, 1) # Important, we have to write the modified InExcludeData back, since we # only retrieved a copy of it. cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] = inExcludeData # Add both nodes to the currently active document. doc.InsertObject(effector) doc.InsertObject(cloner) # Update Cinema 4D. c4d.EventAdd() if __name__=='__main__': CreateClonerSetup()
-
Thank you @bentraje and @ferdinand !
You make the deal of the EffectorList function much clearer ! It works well now