def Correct(obj, mode): cmdLog = XSI.Preferences.GetPreferenceValue("scripting.cmdlog") XSI.Preferences.SetPreferenceValue("scripting.cmdlog", False) cmdName = "Cloth_Corrective"+mode clsName = "Corrective"+mode+"Cls" # get datas if not obj or not obj.Type == "polymsh": XSI.LogMessage(cmdName + " ---> invalid Input", constants.siError) return current = int(Utils.GetCurrentFrame()) # get Cluster cls = Utils.CreateAlwaysCompleteCluster(obj, constants.siVertexCluster, clsName) # freeze all weight painter op for performance reasons props = cls.Properties for p in props: if (mode == "Smooth" or mode == "Push") and p.Type == "wtmap": XSI.FreezeObj(p) elif mode == "Shape" and p.Type == "clskey": XSI.FreezeObj(p) # check if a weight map already exists for this frame exist = False wmap = None if not mode == "Shape": if cls.Properties("Frame"+str(current)): exist = True toolkit = Dispatch("XSI.UIToolkit") buttonPressed = toolkit.MsgBox("A corrective weight map already exists for this frame...", constants.siMsgOkOnly, cmdName ) if buttonPressed == constants.siMsgCancel: XSI.LogMessage("Store Corrective Map cancelled by you !", constants.siInfo) return else: wmap = cls.AddProperty("Weight Map Property", False, "Frame"+str(current)) if mode == "Push": CorrectPush(obj, wmap, current, exist) elif mode == "Smooth": CorrectSmooth(obj, wmap, current, exist) elif mode == "Shape": CorrectShape(obj, cls, current) XSI.Preferences.SetPreferenceValue("scripting.cmdlog", cmdLog)
def ReplaceCurveGeometry(dst, src): if src and src.Type == "crvlist" and dst and dst.Type == "crvlist": datas = src.ActivePrimitive.Geometry.Get2() XSI.FreezeObj(dst) dst.ActivePrimitive.Geometry.Set(datas[0], datas[1], datas[2], datas[3], datas[4], datas[5], datas[6], datas[7])
def Cloth_ApplySyflexOp(obj): syflex_op = obj.ActivePrimitive.ConstructionHistory.Find('syCloth') if syflex_op: XSI.DeleteObj(syflex_op) cloth_cluster = obj.ActivePrimitive.Geometry.Clusters('ClothCls') if not cloth_cluster: cloth_cluster = Utils.CreateCompleteButNotAlwaysCluster( obj, constants.siVertexCluster, 'ClothCls') mass_map = Utils.GetWeightMap(obj, 'MassMap', 1, 0, 1, cloth_cluster) stiffness_map = Utils.GetWeightMap(obj, 'StiffMap', 1, 0, 1, cloth_cluster) restore_map = Utils.GetWeightMap(obj, 'RestoreMap', 0, 0, 1, cloth_cluster) XSI.FreezeObj(mass_map.FullName + "," + stiffness_map.FullName) syflex_op = XSI.ApplyOp( 'syCloth', ';'.join(obj.FullName, mass_map.FullName, stiffness_map.FullName), 3, 0, None, 2)(0) stf = XSI.ApplyOperator('syProperties', syflex_op) start_frame = Utils.GetStartFrame() syflex_op.Parameters('FirstFrame').Value = start_frame XSI.SaveKey(syflex_op.Parameters('Update'), 1, 1) stf.Parameters('Density').Value = 0.5 stf.Parameters('StretchStiffness').Value = 1 stf.Parameters('ShearStiffness').Value = 0.2 stf.Parameters('BendStiffness').Value = 0.1 stf.Parameters('StretchDamping').Value = 0.1 stf.Parameters('ShearDamping').Value = 0.02 stf.Parameters('BendDamping').Value = 0.01 return syflex_op
def GetWeightMap(inObject, name="WeightMap", value=0, inMin=0, inMax=1, cls=None): cluster = None # if cls provided check only it if cls: cluster = cls for w in cls.LocalProperties.Filter("wtmap"): if w.Name == name: return w else: XSI.LogMessage(inObject) if inObject.ActivePrimitive.Geometry.Clusters: # check all cluster for weightmap already exists for cls in inObject.ActivePrimitive.Geometry.Clusters.Filter( "pnt"): if cls.Name == "WeightMapCls": cluster = cls for w in cls.LocalProperties.Filter("wtmap"): if w.Name == name: return w # create cluster if not exist if not cluster: cluster = inObject.ActivePrimitive.Geometry.AddCluster( constants.siVertexCluster, "WeightMapCls") # create and set weight map wm = cluster.AddProperty("Weight Map Property", False, name) # clamp between -1 and 1 (maximum possible values) if inMin < -1: inMin = -1 elif inMin > 0: inMin = 0 if inMax > 1: inMax = 1 elif inMax < 0: inMax = 0 wm.Parameters("wmin").Value = inMin wm.Parameters("wmax").Value = inMax elems_tuple = wm.Elements.Array elems = [ value for _ in range(len(elems_tuple[0])) for _ in range(len(elems_tuple)) ] wm.Elements.Array = elems XSI.FreezeObj(wm) return wm
def SetWeightMap(weightmap, value=1.0, inMin=0.0, inMax=1.0): # create and set weight map weightmap.Parameters("wmin").Value = inMin weightmap.Parameters("wmax").Value = inMax elems_tuple = weightmap.Elements.Array elems = [ value for _ in range(len(elems_tuple[0])) for _ in range(len(elems_tuple)) ] weightmap.Elements.Array = elems XSI.FreezeObj(weightmap) return weightmap
def CreateGuide(self): if self.CheckElementExist(): XSI.LogMessage( '[CreateSkeletonElement] {}_Crv already exist !'.format( self.fullname), constants.siWarning) return False if self.mirror: self.crv = Utils.BuildCurveOnSymmetrizedPositions(self.position) else: self.crv = Utils.BuildCurveOnPositions(self.position) self.cluster = Utils.CreateAlwaysCompleteCluster( self.crv, constants.siVertexCluster, 'ElementData') Utils.GetWeightMap(self.crv, 'WidthMap', 0.01, 0, 1.0, self.cluster) Utils.GetWeightMap(self.crv, 'DepthMap', 0.01, 0, 1.0, self.cluster) Utils.GetWeightMap(self.crv, 'CollideMap', 1.0, 0.0, 1.0, self.cluster) Utils.GetWeightMap(self.crv, 'StickMap', 1.0, 0.0, 1.0, self.cluster) self.cluster.AddProperty('SimpleDeformShape', 0, 'Offset') # freeze curve XSI.FreezeObj(self.crv) # create self-symmetrize node if self.mirror: tree = ICETree.CreateICETree(self.crv, 'SelfSymmetrize', 2) node = XSI.AddICECompoundNode('IRSelfSymmetrizeSkeletonDatas', str(tree)) XSI.AddPortToICENode('{}.port1'.format(tree), 'siNodePortDataInsertionLocationAfter') XSI.ConnectICENodes('{}.port2'.format(tree), '{}.Execute'.format(node)) self.root.AddChild(self.crv) Utils.SetWireColor(self.crv, COLOR_SKELETON_R, COLOR_SKELETON_G, COLOR_SKELETON_B) self.crv.Name = self.fullname + self.suffix # add rig element property self.prop = self.crv.AddProperty('RigElement') self.prop.Parameters('ElementType').Value = self.mode self.prop.Parameters('ElementName').Value = self.name self.prop.Parameters('Divisions').Value = self.divisions self.prop.Parameters('Side').Value = self.side Utils.GroupSetup(self.model, [self.crv], 'Guide_Curves') return True
def GetMeshCopy(obj, transform=False): model = obj.model mesh = model.AddGeometry("Cube", "MeshSurface", obj.Name + "_Copy") XSI.FreezeObj(mesh) datas = obj.ActivePrimitive.Geometry.Get2() tra = obj.Kinematics.Global.Transform # get the datas vertices = datas[0] polys = datas[1] mesh.ActivePrimitive.Geometry.Set(vertices, polys) if transform: mesh.Kinematics.Global.Transform = tra return mesh