def ClusterCenterTarget(inPntSubComponent=None, inTarget=None, inName="PntCls"): if not inPntSubComponent: sel = XSI.Selection(0) if not sel or not sel.Type == "pntSubComponent": XSI.LogMessage( "[ClusterCenterTarget] Invalid Selection : Need some points selected ---> Aborted!" ) return else: inPntSubComponent = sel.SubComponent if not inTarget: pick = PickElement(constants.siObjectFilter, "Pick Target Object") if not pick: XSI.LogMessage( "[ClusterCenterTarget] Invalid Target : Need one target object ---> Aborted!" ) return else: inTarget = pick obj = inPntSubComponent.Parent3DObject geo = obj.ActivePrimitive.Geometry elem = inPntSubComponent.ElementArray cls = geo.AddCluster(constants.siVertexCluster, inName, elem) XSI.ApplyOp("ClusterCenter", str(cls) + ";" + str(inTarget), 0, 0, None, 2)
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 applyColorizePointTree(model,obj,id): oIceTree = XSI.ApplyOp("ICETree", obj, "siNode", "", "", 0) oColorize = XSI.AddICECompoundNode("bbpp Colorize Point", oIceTree) XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oColorize) + ".Execute") oGet1 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet1) + ".reference", model.FullName) XSI.ConnectICENodes(str(oColorize) + ".TransformationModel", str(oGet1) + ".outname") XSI.SetValue(str(oColorize) + ".PointID", id, "")
def MergeRigCloud(model, clouds, name): cloud = model.AddPrimitive("PointCloud", name) tree = XSI.ApplyOp("ICETree", cloud, "siNode", "", "", 2) idx = 1 for c in clouds: merge = XSI.AddICECompoundNode("MergeRigPointCloud", str(tree)) XSI.AddPortToICENode(str(tree) + ".port" + str(idx), "siNodePortDataInsertionLocationAfter") XSI.ConnectICENodes(str(tree) + ".port" + str(idx), str(merge) + ".execute") get = XSI.AddICENode("GetDataNode", str(tree)) XSI.SetValue(str(get) + ".reference", ReplaceModelNameByThisModel(c), "") XSI.ConnectICENodes(str(merge) + ".Cloud", str(get) + ".outname") idx += 1
def bbppTransformation_CreateCorrespondanceIceTree(obj,group,map): oModel = PPG.Inspected(0).Parent3DObject oIceTree = XSI.ApplyOp("ICETree", obj, "siNode", "", "", 0) oCorrespondance = XSI.AddICECompoundNode("bbpp Correspondance Map", oIceTree) XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oCorrespondance) + ".Execute") oGet1 = XSI.AddICENode("GetDataNode", oIceTree) oGet2 = XSI.AddICENode("GetDataNode", oIceTree) #sGroupName = replaceModelNameByThisModel(oModel,group.FullName) XSI.SetValue(str(oGet1) + ".reference", group.FullName) XSI.ConnectICENodes(str(oCorrespondance) + ".PointsGroup", str(oGet1) + ".outname") sMapName = replaceObjectNameBySelf(obj,map.FullName) XSI.SetValue(str(oGet2) + ".reference", sMapName + ".Colors") XSI.ConnectICENodes(str(oCorrespondance) + ".ColorMap", str(oGet2) + ".outname")
def BuildCurveOnObjectsPosition(inObjects, inDegree=0, inClose=0, inConstraint=1, inOffset=XSIMath.CreateVector3()): if len(inObjects) < 2: XSI.LogMessage( "BuildCurveOnPoints aborted :: Not enough input objects!!", constants.siError) return if len(inObjects) < 4: inDegree = 0 pPos = GetPositions(inObjects) aPos = [] for p in pPos: aPos.append(p.X + inOffset.X) aPos.append(p.Y + inOffset.Y) aPos.append(p.Z + inOffset.Z) aPos.append(1) if inDegree == 0: outCrv = XSI.ActiveSceneRoot.AddNurbsCurve(aPos, None, inClose, 1) else: outCrv = XSI.ActiveSceneRoot.AddNurbsCurve(aPos, None, inClose, 3) if inConstraint == 1: crvGeom = outCrv.ActivePrimitive.Geometry for p in crvGeom.Points: oCluster = crvGeom.AddCluster(constants.siVertexCluster, "Pnt" + str(p.Index + 1), p.Index) XSI.ApplyOp("ClusterCenter", str(oCluster) + ";" + str(inObjects[p.Index]), 0, 0, None, 2) return outCrv
def GetSubdividedMesh(mesh): op = XSI.ApplyOp("MeshSubdivide", mesh) subd = op(0).Parent3DObject subd.Name = mesh.name + "_Subdivided" return subd
def bbppTransformation_BuildOutputMesh_OnClicked( ): oPPG = PPG.Inspected(0) oModel = oPPG.Parent3DObject oStartCloud = oModel.FindChild("StartCloud") oEndCloud = oModel.FindChild("EndCloud") oStartGrp = oModel.Groups("Start"); oEndGrp = oModel.Groups("End"); # does geometry exists? oStartGeomStatic = bbppTransformation_StartGeometryStaticExist(oPPG) oEndGeomStatic = bbppTransformation_EndGeometryStaticExist(oPPG) if not oStartGeomStatic or not oEndGeomStatic: XSI.LogMessage("bbppTransformation Geometry Does not exist ---> Can't build Output Mesh!", constants.siError) return if oPPG.AnimatedTransformation.Value: oStartGeomAnimated = bbppTransformation_StartGeometryAnimatedExist(oPPG) oEndGeomAnimated = bbppTransformation_EndGeometryAnimatedExist(oPPG) if not oStartGeomAnimated or not oEndGeomAnimated: XSI.LogMessage("bbppTransformation Geometry Does not exist ---> Can't build Output Mesh!", constants.siError) return # create start geometry point cloud if not oStartCloud: # create emission node oStartCloud = XSI.GetPrim("PointCloud", "StartCloud", oModel) oIceTree = XSI.ApplyOp("ICETree", oStartCloud, "siNode", "", "", 0) oEmit = XSI.AddICECompoundNode("bbpp Emit From Points", oIceTree) XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oEmit) + ".add") oGet1 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet1) + ".reference", oStartGeomStatic.FullName) XSI.ConnectICENodes(str(oEmit) + ".Emiter", str(oGet1) + ".outname") XSI.SetValue(str(oEmit) + ".Color_red", 0.9) XSI.SetValue(str(oEmit) + ".Color_green", 0.4) XSI.SetValue(str(oEmit) + ".Color_blue", 0.1) # create blend node oBlend = XSI.AddICECompoundNode("bbpp Blend Cloud", oIceTree) XSI.AddPortToICENode(str(oIceTree) + ".port1", "siNodePortDataInsertionLocationAfter") XSI.ConnectICENodes(str(oIceTree) + ".port2", str(oBlend) + ".Execute") oGet2 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet2) + ".reference", str(oStartGrp)) XSI.ConnectICENodes(str(oBlend) + ".Start_Cloud", str(oGet2) + ".outname") oGet3 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet3) + ".reference", str(oEndGrp)) XSI.ConnectICENodes(str(oBlend) + ".End_Cloud", str(oGet3) + ".outname") oGet4 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet4) + ".reference", oEndGeomStatic.FullName) XSI.ConnectICENodes(str(oBlend) + ".Target_Geometry", str(oGet4) + ".value") # connect timer oTimer = XSI.AddICECompoundNode("bbpp Transformation Timer", oIceTree) XSI.ConnectICENodes(str(oBlend) + ".Blend", str(oTimer) + ".Blend") oGet5 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet5) + ".reference", oPPG.StartFrame.FullName) oGet6 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet6) + ".reference", oPPG.EndFrame.FullName) XSI.ConnectICENodes(str(oTimer) + ".Start_Frame", str(oGet5) + ".value") XSI.ConnectICENodes(str(oTimer) + ".End_Frame", str(oGet6) + ".value") # create end geometry point cloud if not oEndCloud: # create emission node oEndCloud = XSI.GetPrim("PointCloud", "EndCloud", oModel) oIceTree = XSI.ApplyOp("ICETree", oEndCloud, "siNode", "", "", 0) oEmit = XSI.AddICECompoundNode("bbpp Emit From Points", oIceTree) XSI.ConnectICENodes(str(oIceTree) + ".port1", str(oEmit) + ".add") oGet1 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet1) + ".reference", oEndGeomStatic.FullName) XSI.ConnectICENodes(str(oEmit) + ".Emiter", str(oGet1) + ".outname") XSI.SetValue(str(oEmit) + ".Color_red", 0.1) XSI.SetValue(str(oEmit) + ".Color_green", 0.9) XSI.SetValue(str(oEmit) + ".Color_blue", 0.4) # create blend node oBlend = XSI.AddICECompoundNode("bbpp Blend Cloud", oIceTree) XSI.AddPortToICENode(str(oIceTree) + ".port1", "siNodePortDataInsertionLocationAfter") XSI.ConnectICENodes(str(oIceTree) + ".port2", str(oBlend) + ".Execute") oGet2 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet2) + ".reference", str(oEndGrp)) XSI.ConnectICENodes(str(oBlend) + ".Start_Cloud", str(oGet2) + ".outname") oGet3 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet3) + ".reference", str(oStartGrp)) XSI.ConnectICENodes(str(oBlend) + ".End_Cloud", str(oGet3) + ".outname") oGet4 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet4) + ".reference", oStartGeomStatic.FullName) XSI.ConnectICENodes(str(oBlend) + ".Target_Geometry", str(oGet4) + ".value") # connect timer oTimer = XSI.AddICECompoundNode("bbpp Transformation Timer", oIceTree) XSI.ConnectICENodes(str(oBlend) + ".Blend", str(oTimer) + ".Blend") oGet5 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet5) + ".reference", oPPG.StartFrame.FullName) oGet6 = XSI.AddICENode("GetDataNode", oIceTree) XSI.SetValue(str(oGet6) + ".reference", oPPG.EndFrame.FullName) XSI.ConnectICENodes(str(oTimer) + ".Start_Frame", str(oGet5) + ".value") XSI.ConnectICENodes(str(oTimer) + ".End_Frame", str(oGet6) + ".value") XSI.SetValue(str(oTimer) + ".Revert", True) # create Blob Mesh # delete it if already exists bbppTransformation_BlobGeometryExist(oPPG) XSI.SelectObj(str(oStartCloud) + "," + str(oEndCloud)) XSI.Create_Polygonizer_Polymesh() oBlob = XSI.Selection(0) oBlob.Name = "OutputMesh" oModel.AddChild(oBlob) oBlobOp = oBlob.ActivePrimitive.ConstructionHistory.Find("Polygonizer") # create expression for in-between #-------------------------------------- # detail sStartFrame = oPPG.StartFrame.FullName sEndFrame = oPPG.EndFrame.FullName sTimelapse = sEndFrame+" - "+sStartFrame oExpr = "(1 - sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)) *2 + 2" oBlobOp.Parameters("Detail").AddExpression(oExpr) # blur isofield oExpr = "sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)/2" oBlobOp.Parameters("BlurIsofieldStrength").AddExpression(oExpr) # smooth mesh oExpr = "sin(cond(FC>"+sStartFrame+",cond(Fc<"+sEndFrame+",(Fc - "+sStartFrame+")/("+sTimelapse+"),1),0)*180)*4+2" oBlobOp.Parameters("SmoothMeshStrength").AddExpression(oExpr) # isolevel oBlobOp.Parameters("Isolevel").Value = 1
def CreateICETree(cloud, name="ICETree", constructionhistory=0): tree = XSI.ApplyOp("ICETree", cloud, "siNode", "", "", constructionhistory) ICETree = XSI.Dictionary.GetObject(tree) ICETree.Name = name return ICETree