def new_rig(object): doc.AddUndo(c4d.UNDOTYPE_CHANGE, object) #create a Python tag and attach it to the first joint pythontag = c4d.BaseTag(c4d.Tpython) object.InsertTag(pythontag) doc.AddUndo(c4d.UNDOTYPE_NEW, pythontag) #set the Python code inside the tag pythontag[c4d.TPYTHON_CODE] = pythontagcode #add a 'link' field to the python tag's user data - #this link will determine which previous bend to attach to userdata_link = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BASELISTLINK) userdata_link[c4d.DESC_NAME] = "Previous Bend" pythontag.AddUserData(userdata_link) #add an offset field to the user data userdata_offset = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) userdata_offset[c4d.DESC_NAME] = "Offset" pythontag.AddUserData(userdata_offset) #add an offset field to the user data userdata_rotation = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) userdata_rotation[c4d.DESC_NAME] = "Rotation" userdata_rotation[c4d.DESC_UNIT] = c4d.DESC_UNIT_DEGREE userdata_rotation[c4d.DESC_STEP] = math.pi / 180.0 pythontag.AddUserData(userdata_rotation) return pythontag
def main(): doc = documents.GetActiveDocument() fileSaver = c4d.BaseObject(c4d.Onull) fileSaver.InsertBefore(doc.GetFirstObject()) fileSaver.SetName("FileSaver") isOutputFbxFile = c4d.GetCustomDataTypeDefault( c4d.DTYPE_BOOL) # Create default container isOutputFbxFile[c4d.DESC_NAME] = "isOutputFbxFile" isOutputFbxFileElement = fileSaver.AddUserData(isOutputFbxFile) fileSaver[isOutputFbxFileElement] = True isSaveOriginFile = c4d.GetCustomDataTypeDefault( c4d.DTYPE_BOOL) # Create default container isSaveOriginFile[c4d.DESC_NAME] = "isSaveOriginFile" isSaveOriginFileElement = fileSaver.AddUserData(isSaveOriginFile) fileSaver[isSaveOriginFileElement] = True saveOutPath = c4d.GetCustomDataTypeDefault( c4d.DTYPE_FILENAME) # Create default container saveOutPath[c4d.DESC_NAME] = "SaveOutPath" fileSaver.AddUserData(saveOutPath) c4d.EventAdd()
def store_incorrect_orientations(self, joint): current_m = joint.GetMl() v1 = c4d.GetCustomDataTypeDefault(c4d.DTYPE_VECTOR) v1[c4d.DESC_NAME] = "V1 at Import" descId = joint.AddUserData(v1) joint[descId] = current_m.v1 v2 = c4d.GetCustomDataTypeDefault(c4d.DTYPE_VECTOR) v2[c4d.DESC_NAME] = "V2 at Import" descId = joint.AddUserData(v2) joint[descId] = current_m.v2 v3 = c4d.GetCustomDataTypeDefault(c4d.DTYPE_VECTOR) v3[c4d.DESC_NAME] = "V3 at Import" descId = joint.AddUserData(v3) joint[descId] = current_m.v3
def String(self): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_STRING) bc.SetInt32(c4d.DESC_ANIMATE, c4d.DESC_ANIMATE_ON) bc.SetBool(c4d.DESC_REMOVEABLE, False) return bc
def build_finger_controllers(self): for dir in Directions: obj = doc.SearchObject('Root_Controls') for finger in IndexName: #userdata bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) bc[c4d.DESC_NAME] = dir + finger + 'Finger' bc[c4d.DESC_UNIT] = c4d.DESC_UNIT_DEGREE bc[c4d.DESC_MIN] = 0 bc[c4d.DESC_MAX] = math.radians(360) bc[c4d.DESC_STEP] = math.radians(1) bc[c4d.DESC_CUSTOMGUI] = c4d.CUSTOMGUI_REALSLIDER element1 = obj.AddUserData(bc) obj[element1] = 0 # Assign Tick bc = c4d.GetCustomDatatypeDefault( c4d.DTYPE_BOOL) # Create default container bc[c4d.DESC_NAME] = dir + finger + 'Controlled' # Rename the entry element2 = obj.AddUserData(bc) # Add userdata container obj[element2] = 0
def Separator(self): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_SEPARATOR) bc.SetInt32(c4d.DESC_CUSTOMGUI, c4d.DTYPE_SEPARATOR) bc.SetBool(c4d.DESC_SEPARATORLINE, True) return bc
def Group(self): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP) bc.SetString(c4d.DESC_NAME, "Levels") bc.SetInt32(c4d.DESC_COLUMNS, 1) bc.SetInt32(c4d.DESC_DEFAULT, 1) return bc
def createUserDataFloatSlider(obj, name, smin=0, smax=1, step=.01): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) bc[c4d.DESC_CUSTOMGUI] = c4d.CUSTOMGUI_REALSLIDER bc[c4d.DESC_NAME] = name bc[c4d.DESC_UNIT] = c4d.DESC_UNIT_PERCENT bc[c4d.DESC_STEP] = step bc[c4d.DESC_MINSLIDER] = smin bc[c4d.DESC_MAXSLIDER] = smax element = obj.AddUserData(bc)
def new_rig(obj, cachetype): #create a Python tag and attach it to the selected tag's object pythontag = c4d.BaseTag(c4d.Tpython) #set the Python code inside the tag pythontag[ c4d.TPYTHON_CODE] = copyright + pythontagcode + pythontagcode_dict[ cachetype] #add userdata to the Python tag userdata = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) userdata[c4d.DESC_NAME] = "Frame" pythontag.AddUserData(userdata) pythontag[c4d.ID_USERDATA, 1] = 0.0 #add an animation track to the userdata we just created track = c4d.CTrack( pythontag, c4d.DescID(c4d.DescLevel(c4d.ID_USERDATA, c4d.DTYPE_SUBCONTAINER, 0), c4d.DescLevel(1, c4d.DTYPE_REAL, 0))) pythontag.InsertTrackSorted(track) #get the curve of our new track (we'll attach keyframes to this curve) curve = track.GetCurve() #make some keyframes, setting their time, value and curve key1 = c4d.CKey() key1.SetTime(curve, doc.GetMinTime()) key1.SetValue(curve, doc.GetMinTime().Get() * doc.GetFps()) key1.SetTimeRight(curve, c4d.BaseTime(0.5)) key2 = c4d.CKey() key2.SetTime(curve, doc.GetMaxTime()) key2.SetValue(curve, doc.GetMaxTime().Get() * doc.GetFps()) key2.SetTimeLeft(curve, c4d.BaseTime(-0.5)) #add the keyframes to the curve curve.InsertKey(key1) curve.InsertKey(key2) #set the Python tag's priority priority = c4d.PriorityData() priority.SetPriorityValue(c4d.PRIORITYVALUE_MODE, c4d.CYCLE_GENERATORS) priority.SetPriorityValue(c4d.PRIORITYVALUE_PRIORITY, -1) pythontag[c4d.EXPRESSION_PRIORITY] = priority #add the Python tag to the selected object, and add an undo doc.StartUndo() obj.InsertTag(pythontag) doc.AddUndo(c4d.UNDOTYPE_NEW, pythontag) doc.EndUndo() c4d.EventAdd(c4d.EVENT_FORCEREDRAW) print "Cache retimer successfully added to " + obj.GetName() + "!"
def new_rig(object): doc.AddUndo(c4d.UNDOTYPE_CHANGE, object) #create a Python tag and attach it to the object pythontag = c4d.BaseTag(c4d.Tpython) object.InsertTag(pythontag) doc.AddUndo(c4d.UNDOTYPE_NEW, pythontag) #set the Python code inside the tag pythontag[c4d.TPYTHON_CODE] = pythontagcode #add a description string and the width field to the tag's user data userdata = c4d.GetCustomDataTypeDefault(c4d.DTYPE_STATICTEXT) userdata[c4d.DESC_NAME] = "About" pythontag.AddUserData(userdata) pythontag[c4d.ID_USERDATA, 1] = "Consistent Falloff Edge Width Tag - www.curiousanimal.tv" userdata = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) userdata[c4d.DESC_NAME] = "Falloff Width" pythontag.AddUserData(userdata) pythontag[c4d.ID_USERDATA, 2] = 20.0
def AddUserData(obj, name, val): # Create default container bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BOOL) # Rename the entry bc[c4d.DESC_NAME] = name # set the default value element = obj.AddUserData(bc) obj[element] = val c4d.EventAdd()
def RealSlider(self): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) bc.SetInt32(c4d.DESC_CUSTOMGUI, c4d.CUSTOMGUI_REALSLIDER) bc.SetFloat(c4d.DESC_MIN, 0.0) bc.SetFloat(c4d.DESC_MAX, 10000.0) bc.SetFloat(c4d.DESC_MINSLIDER, 0.0) bc.SetFloat(c4d.DESC_MAXSLIDER, 10000.0) bc.SetFloat(c4d.DESC_STEP, 0.01) bc.SetInt32(c4d.DESC_UNIT, c4d.DESC_UNIT_FLOAT) bc.SetInt32(c4d.DESC_ANIMATE, c4d.DESC_ANIMATE_ON) bc.SetBool(c4d.DESC_REMOVEABLE, False) return bc
def AddUserData(obj, name, id, Dtye, step, min, max): bc = c4d.GetCustomDataTypeDefault(Dtye) # Create default container bc[c4d.DESC_NAME] = name # Rename the entry bc[c4d.DESC_MIN] = min # Set min value bc[c4d.DESC_MAX] = max # Set max value bc[c4d.DESC_STEP] = step # Set step value bc[c4d.DESC_CUSTOMGUI] = 1000489 # Set float slider bc[c4d.DESC_MINSLIDER] = min # Set min value slider bc[c4d.DESC_MAXSLIDER] = max # Set man value slider parentGroup = c4d.DescID(c4d.DescLevel(c4d.ID_USERDATA), c4d.DescLevel(1, c4d.DTYPE_GROUP, 0)) # 1 is my secondary Group ID bc.SetData(c4d.DESC_PARENTGROUP, parentGroup) obj.SetUserDataContainer([c4d.ID_USERDATA, id], bc) # Add userdata container
def create_custom_controller(self, morph_link, morph_name): morph_ctrl = self.find_ctrl_null() parent = self.add_path_group(morph_ctrl, morph_link) label_name = str(morph_link["Label"]) min_morph = morph_link["Minimum"] max_morph = morph_link["Maximum"] real_data = c4d.GetCustomDataTypeDefault(c4d.DTYPE_REAL) real_data[c4d.DESC_NAME] = label_name real_data[c4d.DESC_CUSTOMGUI] = c4d.CUSTOMGUI_REALSLIDER real_data[c4d.DESC_UNIT] = c4d.DESC_UNIT_PERCENT real_data[c4d.DESC_MIN] = min_morph real_data[c4d.DESC_MAX] = max_morph real_data[c4d.DESC_MINSLIDER] = min_morph real_data[c4d.DESC_MAXSLIDER] = max_morph real_data[c4d.DESC_STEP] = 0.01 real_data[c4d.DESC_PARENTGROUP] = parent slider_id = morph_ctrl.AddUserData(real_data) c4d.EventAdd() self.morph_ctrl_user_data[morph_name] = slider_id self.connect_morph_to_controller(slider_id, morph_name)
def main(): obj = c4d.BaseObject(1025800) obj.SetName("Quantize") doc.InsertObject(obj) doc.SetSelection(obj) field = c4d.FieldList() solid = mo.FieldLayer(c4d.FLsolid) field.InsertLayer(solid) obj[c4d.FIELDS] = field rootGroup = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP) rootGroup[c4d.DESC_NAME] = "Parameters" rootGroup[c4d.DESC_SHORT_NAME] = "Parameters" rootGroup[c4d.DESC_TITLEBAR] = True rootGroup[c4d.DESC_GUIOPEN] = True rootGroup[c4d.DESC_COLUMNS] = 2 rootGroup[c4d.DESC_PARENTGROUP] = c4d.DescID() root = obj.AddUserData(rootGroup) nameVec = ["Position step", "Scale step", "Angle step"] unitVec = [c4d.DESC_UNIT_METER, c4d.DESC_UNIT_REAL, c4d.DESC_UNIT_DEGREE] stepVec = [c4d.Vector(1), c4d.Vector(0.1), c4d.Vector(pi / 180)] minVec = [c4d.Vector(0.1), c4d.Vector(0.1), c4d.Vector(pi / 180)] defVec = [c4d.Vector(20), c4d.Vector(0.5), c4d.Vector(pi / 2)] nameBool = "On" defBool = True for i in xrange(3): dataAddVector(obj, nameVec[i], root, unitVec[i], stepVec[i], minVec[i], defVec[i]) dataAddBool(obj, nameBool, root, defBool) dataAddBool(obj, "Unify parameters", root, False) obj[c4d.OEPYTHON_MODE] = 1 obj[c4d. OEPYTHON_STRING] = "import c4d\nfrom c4d.modules import mograph as mo\nfrom c4d import utils\n\ndef quantize(num, step):\n return step*(num//step)\n\ndef vectorQuantize(vec, stepParams):\n vecX = quantize(vec.x, stepParams.x)\n vecY = quantize(vec.y, stepParams.y)\n vecZ = quantize(vec.z, stepParams.z)\n return c4d.Vector(vecX, vecY, vecZ)\n\ndef main():\n\n unify = op[c4d.ID_USERDATA,8]\n posStep = op[c4d.ID_USERDATA,2]\n sclStep = op[c4d.ID_USERDATA,4]\n angStep = op[c4d.ID_USERDATA,6]\n posOn = op[c4d.ID_USERDATA,3]\n sclOn = op[c4d.ID_USERDATA,5]\n angOn = op[c4d.ID_USERDATA,7]\n\n md = mo.GeGetMoData(op)\n if md is None: return 1.0\n\n cnt = md.GetCount()\n marr = md.GetArray(c4d.MODATA_MATRIX)\n\n if unify == True:\n posStep = c4d.Vector(posStep.x)\n sclStep = c4d.Vector(sclStep.x)\n angStep = c4d.Vector(angStep.x)\n\n for i in xrange(cnt):\n m = marr[i]\n\n if posOn == True:\n pos = m.off\n m.off = vectorQuantize(pos, posStep)\n\n if sclOn == True:\n scl = c4d.Vector( m.v1.GetLength(),\n m.v2.GetLength(),\n m.v3.GetLength())\n scl = vectorQuantize(scl, sclStep)\n m.v1 = m.v1.GetNormalized()*scl.x\n m.v2 = m.v2.GetNormalized()*scl.y\n m.v3 = m.v3.GetNormalized()*scl.z\n\n if angOn == True:\n ang = utils.MatrixToHPB(m)\n ang = vectorQuantize(ang, angStep)\n pos = m.off\n scl = c4d.Vector( m.v1.GetLength(),\n m.v2.GetLength(),\n m.v3.GetLength())\n\n m = utils.HPBToMatrix(ang)\n\n m.off = pos\n m.v1 = m.v1.GetNormalized() * scl.x\n m.v2 = m.v2.GetNormalized() * scl.y\n m.v3 = m.v3.GetNormalized() * scl.z\n\n marr[i] = m\n\n md.SetArray(c4d.MODATA_MATRIX, marr, True)" ""
def createUserDataLink(obj, name, val=None): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BASELISTLINK) bc[c4d.DESC_NAME] = name element = obj.AddUserData(bc) if val: obj[element] = val
def createUserDataFloat(obj, name, val=None): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_LONG) bc[c4d.DESC_NAME] = name element = obj.AddUserData(bc) if val: obj[element] = val
nodemaster = xtag.GetNodeMaster() # change Cloner -> Object -> Mode to "Grid Array" cloner[c4d.ID_MG_MOTIONGENERATOR_MODE] = 3 # change Cloner -> Object -> Count(3) to (width, height, 1) cloner[c4d.MG_GRID_RESOLUTION] = c4d.Vector(3, 3, 1) # change Cloner -> Object -> Size(3) to (width * cubeX, height * cubeY, nonimportant value) cloner[c4d.MG_GRID_SIZE] = c4d.Vector(width * cube[c4d.PRIM_CUBE_LEN].x, height * cube[c4d.PRIM_CUBE_LEN].y, 1) ## completely unnecessary code because C4D is messed up ## Need this code to access the "Object" Port on the actual Mograph Selection Tag in Xpresso ## this is because there is a bug in C4D and you cannot Add the Object port bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BASELISTLINK) bc[c4d.DESC_NAME] = "obj" ## Make mograph selection tag ms_tag = c4d.BaseTag(1021338) # mograph selection tag ## Note, clone grid array y axis in inverted tile 0 is bottom-left ## Name the mograph selection tag by the color it represents : ie (255,255,255) ms_tag.SetName("Mograph Selection Tag") linkDataType = ms_tag.AddUserData(bc) ms_tag[linkDataType] = ms_tag # ms_tag.__setitem__((c4d.ID_USERDATA,1), ms_tag) ## Add tag to cloner cloner.InsertTag(ms_tag) # Add the MoSelection tag to XPresso ### XPRESSO xnode_mograph_selection_tag = nodemaster.CreateNode(nodemaster.GetRoot(),
def AddUserDataGroup(obj, name): gc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP) gc[c4d.DESC_NAME] = name gc[c4d.DESC_PARENTGROUP] = c4d.DescID(0) obj.SetUserDataContainer([c4d.ID_USERDATA, 1], gc)
def Button(self): bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BUTTON) bc.SetInt32(c4d.DESC_CUSTOMGUI, c4d.CUSTOMGUI_BUTTON) return bc