Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
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.c4d
I 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()
Hi @Hugo-BATTISTELLA,
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 name Cloner within the scope of effectorsCreation. Which is why your code will raise a NameError on this line. But even if the variable Cloner from your function cloner_creation would be visible within effectorsCreation, it would still raise an AttributeError, because your Cloner is of type BaseObject which has no attribute (i.e., method) of the name InsertObject.
Cloner.InsertObject(EffectorList)
Cloner
effectorsCreation
NameError
cloner_creation
AttributeError
BaseObject
InsertObject
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 allocated InExcludeData. 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).
c4d.InExcludeData
InExcludeData
Cheers, Ferdinand
The 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