Hi !
Question :
I try to insert a plain effector into a cloner InExcludeData , It worked , but sometimes i have to click twice but no error ( seems sometimes it clear the InExcludeData ) .
How can I fix it ?
@Windows11 22H1 C4D R2023.0.0
Many Thanks
Code
from typing import Optional
import c4d
from math import radians
doc: c4d.documents.BaseDocument # The active document
op: Optional[c4d.BaseObject] # The active object, None if unselected
def InsertNodeIntoInExclude(data : c4d.InExcludeData, node : c4d.BaseObject, index, isActive=True):
"""Inserts a node at a certain index into an InExcludeData."""
dataCount = data.GetObjectCount()
doc = node.GetDocument()
if index > dataCount:
raise IndexError(f"The index {index} is out of bounds.")
result, i = c4d.InExcludeData(), 0
while data.ObjectFromIndex(doc, i):
if i == index:
result.InsertObject(node, int(isActive))
item = data.ObjectFromIndex(doc, i)
flags = data.GetFlags(i)
result.InsertObject(item, flags)
i += 1
return result
# 量化旋转
def mogragh_quantize_rotation(doc :c4d.documents.BaseDocument, cloner : c4d.BaseObject) -> c4d.BaseObject :
"""Inserts a quantize rotation effector into selected cloner."""
doc.StartUndo()
# Pass if selection is not a Cloner
if cloner is None or cloner.GetType() != 1018544:
raise RuntimeError("Select a cloner.")
effector = c4d.BaseObject(1021337) # Plain
doc.InsertObject(effector,pred=cloner)
doc.AddUndo(c4d.UNDOTYPE_NEWOBJ,effector)
# Set plain to cloner InExclude
inExData = cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST]
if inExData:
if inExData.GetObjectCount() == 0:
try:
emptyData = c4d.InExcludeData()
emptyData.InsertObject(effector,1)
cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] = emptyData
except:
raise RuntimeError("Insert failed , try again .")
else:
try:
modifiedInExData = InsertNodeIntoInExclude(inExData, effector, 0)
doc.AddUndo(c4d.UNDOTYPE_CHANGE, cloner)
cloner[c4d.ID_MG_MOTIONGENERATOR_EFFECTORLIST] = modifiedInExData
except:
raise RuntimeError("Insert failed , try again .")
else:
raise RuntimeError("Failed to get Includedata .")
# FieldObject
field_object = c4d.modules.mograph.FieldObject(440000281) # ramdom field object
doc.InsertObject(field_object,parent=effector)
doc.AddUndo(c4d.UNDOTYPE_NEWOBJ,field_object)
# Set Field List
fieldList = effector[c4d.FIELDS]
layer = c4d.modules.mograph.FieldLayer(c4d.FLfield)
layer.SetLinkedObject(field_object)
fieldList.InsertLayer(layer)
# Quantize Layer
quantizeLayer = c4d.modules.mograph.FieldLayer(c4d.FLquantize)
if quantizeLayer is None:
raise MemoryError("Failed to create a Field Layer.")
fieldList.InsertLayer(quantizeLayer)
doc.AddUndo(c4d.UNDOTYPE_BITS, quantizeLayer)
quantizeLayer.SetBit(c4d.BIT_ACTIVE)
# Set
effector.SetName(cloner.GetName() + ' ' + 'Plain')
effector[c4d.ID_MG_BASEEFFECTOR_POSITION_ACTIVE] = False # Turn off Pos
effector[c4d.ID_MG_BASEEFFECTOR_SCALE_ACTIVE] = False # Turn off Scale
effector[c4d.ID_MG_BASEEFFECTOR_ROTATE_ACTIVE] = True # Turn On Pot
effector[c4d.ID_MG_BASEEFFECTOR_ROTATION,c4d.VECTOR_X] = radians(360) # Set Rot at H(x) to 360 degrees
field_object[c4d.ID_BASEOBJECT_VISIBILITY_EDITOR] = 1 # Set editor unvisible
field_object.SetName(effector.GetName() + ' : ' + 'Quantize Rot') # Set Field Name to Effetor name + Function
doc.AddUndo(c4d.UNDOTYPE_CHANGE, effector)
effector[c4d.FIELDS] = fieldList
doc.EndUndo()
c4d.EventAdd() # Refresh Viewport
return effector
if __name__ == '__main__':
doc = c4d.documents.GetActiveDocument()
cloner = doc.GetActiveObject()
mogragh_quantize_rotation(doc,cloner)