def mirrorShapeKey(shape): # Get Symmetry Map mesh = shape.Parent3DObject symmetry_map = uti.getSymmetryMap(mesh) if not symmetry_map: gear.log("There is no symmetry map available on this mesh", gear.sev_warning) return cls = shape.Parent shape_tuple = shape.Elements.Array symmetry_array = symmetry_map.Elements.Array shape_array = [0] * len(shape_tuple[0])*3 # Process for iPntIndex in cls.Elements: iSymIndex = int(symmetry_array[0][iPntIndex]) shape_array[iSymIndex*3+0] = - shape_tuple[0][iPntIndex] shape_array[iSymIndex*3+1] = shape_tuple[1][iPntIndex] shape_array[iSymIndex*3+2] = shape_tuple[2][iPntIndex] duplicate_shape = xsi.StoreShapeKey(cls, shape.Name+"_Mirror", c.siShapeObjectReferenceMode, 1, None, None, c.siShapeContentSecondaryShape, True) duplicate_shape.Elements.Array = shape_array xsi.ApplyShapeKey(duplicate_shape, None, None, 100, None, None, None, 2) xsi.FreezeObj(duplicate_shape) return duplicate_shape
def gear_SymmetrizePoints_Execute(): if not xsi.Selection.Count: gear.log("No selection", gear.sev_error) return pntSubComp = xsi.Selection(0) if pntSubComp.Type not in ["pntSubComponent"]: gear.log("Invalid Selection, need a pntSubComponent", gear.sev_error) return obj = pntSubComp.SubComponent.Parent3DObject # Get Symmetry Map ------------------- sym_map = uti.getSymmetryMap(obj) if not sym_map: gear.log("There is no symmetry map on selected object", gear.sev_error) return cls = obj.ActivePrimitive.Geometry.AddCluster( c.siVertexCluster, "gear_SymmetrizePointsOp_cls", pntSubComp.SubComponent.ElementArray) # Apply Operator ---------------------- op = XSIFactory.CreateObject("gear_SymmetrizePointsOp") op.AddIOPort(obj.ActivePrimitive) op.AddInputPort(sym_map) op.AddInputPort(cls) op.Connect() xsi.InspectObj(op) return op
def gear_SymWeightMapPoints_Execute(): if xsi.Selection.Count < 2: gear.log("Select some points and a weight map", gear.sev_error) return pntSubComp = xsi.Selection(0) wmap = xsi.Selection(1) # Check if input doesn't match if pntSubComp.Type not in ["pntSubComponent"] or wmap.Type not in ["wtmap"]: gear.log("Invalid selection", gear.sev_error) return # Get Symmetry Map symMap = uti.getSymmetryMap(wmap.Parent3DObject) if not symMap: return # Get Arrays points = pntSubComp.SubComponent.ElementArray weights = [w for w in wmap.Elements.Array[0]] sym_array = symMap.Elements.Array # Process for i in points: weights[int(sym_array[0][i])] = weights[i] wmap.Elements.Array = weights
def gear_SymmetrizePoints_Execute(): if not xsi.Selection.Count: gear.log("No selection", gear.sev_error) return pntSubComp = xsi.Selection(0) if pntSubComp.Type not in ["pntSubComponent"]: gear.log("Invalid Selection, need a pntSubComponent", gear.sev_error) return obj = pntSubComp.SubComponent.Parent3DObject # Get Symmetry Map ------------------- sym_map = uti.getSymmetryMap(obj) if not sym_map: gear.log("There is no symmetry map on selected object", gear.sev_error) return cls = obj.ActivePrimitive.Geometry.AddCluster(c.siVertexCluster, "gear_SymmetrizePointsOp_cls", pntSubComp.SubComponent.ElementArray) # Apply Operator ---------------------- op = XSIFactory.CreateObject("gear_SymmetrizePointsOp") op.AddIOPort(obj.ActivePrimitive) op.AddInputPort(sym_map) op.AddInputPort(cls) op.Connect() xsi.InspectObj(op) return op
def symmetrizeShapePoints(shape, points): # Get Symmetry Map mesh = shape.Parent3DObject symmetry_map = uti.getSymmetryMap(mesh) if not symmetry_map: return shape_tuple = shape.Elements.Array shape_array = [shape_tuple[j][i] for i in range(len(shape_tuple[0])) for j in range(len(shape_tuple)) ] symmetry_array = symmetry_map.Elements.Array # Process for i in points: j = int(symmetry_array[0][i]) shape_array[j*3+0] = - shape_tuple[0][i] shape_array[j*3+1] = shape_tuple[1][i] shape_array[j*3+2] = shape_tuple[2][i] shape.Elements.Array = shape_array
def getSymSubComponent(indexes, subcomponentType, mesh): symmetryMap = uti.getSymmetryMap(mesh) if not symmetryMap: return False symmetryArray = symmetryMap.Elements.Array[0] symIndexes = [] geometry = dynDispatch(mesh.ActivePrimitive.Geometry) # Point Cluster --------------------------- if subcomponentType == "pntSubComponent": for pointIndex in indexes: symIndexes.append(symmetryArray[pointIndex]) # Polygon Cluster ------------------------- elif subcomponentType == "polySubComponent": for polyIndex in indexes: # Get Symmetrical Polygon Points symPoints = [] for vertex in geometry.Polygons(polyIndex).Vertices: symPoints.append(symmetryArray[vertex.Index]) # Get symmetrical Polygons (Get too much polygons, we filter them right after) aSymPolygons = [] for pointIndex in symPoints: for polygon in geometry.Vertices(pointIndex).NeighborPolygons( 1): if polygon.Index not in aSymPolygons: aSymPolygons.append(polygon.Index) # Find the good one (the one which all points belongs to the symmetrical array) for polyIndex in aSymPolygons: polygon = geometry.Polygons(polyIndex) b = True for vertex in polygon.Vertices: if vertex.Index not in symPoints: b = False break if b: symIndexes.append(polyIndex) # Edge Cluster ---------------------------- elif subcomponentType == "edgeSubComponent": for edgeIndex in indexes: # Get Edge Points symPoints = [] for vertex in geometry.Edges(edgeIndex).Vertices: symPoints.append(symmetryArray[vertex.Index]) # Get symmetrical Edges (Get too much edges, we filter them right after) aSymEdges = [] for pointIndex in symPoints: for edge in geometry.Vertices(pointIndex).NeighborEdges(1): if edge.Index not in aSymEdges: aSymEdges.append(edge.Index) # Find the good one (the one which all points belongs to the symmetrical array) for edgeIndex in aSymEdges: edge = geometry.Edges(edgeIndex) b = True for vertex in edge.Vertices: if vertex.Index not in symPoints: b = False break if b: symIndexes.append(edgeIndex) return symIndexes
def getSymSubComponent(indexes, subcomponentType, mesh): symmetryMap = uti.getSymmetryMap(mesh) if not symmetryMap: return False symmetryArray = symmetryMap.Elements.Array[0] symIndexes = [] geometry = dynDispatch(mesh.ActivePrimitive.Geometry) # Point Cluster --------------------------- if subcomponentType == "pntSubComponent": for pointIndex in indexes: symIndexes.append(symmetryArray[pointIndex]) # Polygon Cluster ------------------------- elif subcomponentType == "polySubComponent": for polyIndex in indexes: # Get Symmetrical Polygon Points symPoints = [] for vertex in geometry.Polygons(polyIndex).Vertices: symPoints.append(symmetryArray[vertex.Index]) # Get symmetrical Polygons (Get too much polygons, we filter them right after) aSymPolygons = [] for pointIndex in symPoints: for polygon in geometry.Vertices(pointIndex).NeighborPolygons(1): if polygon.Index not in aSymPolygons: aSymPolygons.append(polygon.Index) # Find the good one (the one which all points belongs to the symmetrical array) for polyIndex in aSymPolygons: polygon = geometry.Polygons(polyIndex) b = True for vertex in polygon.Vertices: if vertex.Index not in symPoints: b = False break if b: symIndexes.append(polyIndex) # Edge Cluster ---------------------------- elif subcomponentType == "edgeSubComponent": for edgeIndex in indexes: # Get Edge Points symPoints = [] for vertex in geometry.Edges(edgeIndex).Vertices: symPoints.append(symmetryArray[vertex.Index]) # Get symmetrical Edges (Get too much edges, we filter them right after) aSymEdges = [] for pointIndex in symPoints: for edge in geometry.Vertices(pointIndex).NeighborEdges(1): if edge.Index not in aSymEdges: aSymEdges.append(edge.Index) # Find the good one (the one which all points belongs to the symmetrical array) for edgeIndex in aSymEdges: edge = geometry.Edges(edgeIndex) b = True for vertex in edge.Vertices: if vertex.Index not in symPoints: b = False break if b: symIndexes.append(edgeIndex) return symIndexes