Example #1
0
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)
Example #2
0
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])
Example #3
0
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
Example #4
0
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
Example #5
0
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
Example #6
0
    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
Example #7
0
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