def doIt(self, args): dagPath = mt.selected_dagPath() meshFn = om.MFnMesh(dagPath) mel.eval("SelectVertexMask") cmds.select(cl=True) tccNode = mt.get_TCC_DGnode(dagPath) T = om.MIntArray(meshFn.numVertices(), 0) if tccNode is not None: Tb = cmds.getAttr(tccNode.name() + ".T") (nFV, F) = mt.getTopology(meshFn) for k in range(len(F)): T[F[k]] += Tb[k] polesArray = [] connectedEdges = om.MIntArray() vertexIter = om.MItMeshVertex(dagPath) while not vertexIter.isDone(): vertexIter.getConnectedEdges(connectedEdges) valence = len(connectedEdges) + T[vertexIter.index()] if (not vertexIter.onBoundary()) and (valence != 4): polesArray.append(vertexIter.index()) vertexIter.next() for k in polesArray: cmds.select(dagPath.fullPathName() + ".vtx[" + str(k) + "]", tgl=True)
def doIt(self, args): dagPath = mt.selected_dagPath(); meshFn = om.MFnMesh(dagPath); mel.eval("SelectVertexMask"); cmds.select(cl=True); tccNode = mt.get_TCC_DGnode(dagPath); T = om.MIntArray(meshFn.numVertices(), 0); if tccNode is not None: Tb = cmds.getAttr(tccNode.name()+".T"); (nFV, F) = mt.getTopology(meshFn); for k in range(len(F)): T[F[k]] += Tb[k]; polesArray = []; connectedEdges = om.MIntArray() vertexIter=om.MItMeshVertex(dagPath) while not vertexIter.isDone(): vertexIter.getConnectedEdges(connectedEdges); valence = len(connectedEdges) + T[vertexIter.index()]; if (not vertexIter.onBoundary()) and (valence!=4): polesArray.append(vertexIter.index()); vertexIter.next() for k in polesArray: cmds.select(dagPath.fullPathName()+".vtx["+str(k)+"]", tgl=True);
def get_CV_line(dagPath, v, eK1, eK2): meshFn = om.MFnMesh(dagPath); e = mt.vertex_edges(dagPath, v); if e[0]==eK1 or e[0]==eK2: e = [e[1], e[3]]; else: e = [e[0], e[2]]; tccNode = mt.get_TCC_DGnode(dagPath); T = cmds.getAttr(tccNode.name()+".T"); he = []; hv = []; for eK in e: f = mt.edge_faces(dagPath, eK); he0 = mt.halfedge(dagPath, f[0], eK1); if he0[1]==-1: he0 = mt.halfedge(dagPath, f[0], eK2); eN = mt.edge(mt.next(he0)); dir = 0; if eN == e[0] or eN == e[1]: dir = 1; else: dir = -1; he0 = mt.next(he0, dir); T0 = mt.get_halfedge_data(dagPath, T, he0) if dir ==1 else mt.get_halfedge_data(dagPath, T, mt.prev(he0)); he1 = mt.next(he0, dir) if T0 else mt.next(mt.twin(mt.next(he0, dir)),dir); T1 = mt.get_halfedge_data(dagPath, T, he1) if dir ==1 else mt.get_halfedge_data(dagPath, T, mt.prev(he1)); he2 = mt.next(he1, dir) if T1 else mt.next(mt.twin(mt.next(he1, dir)),dir); he.append(he0); he.append(he1); he.append(he2); hv.append(mt.tip(he0, dir)); hv.append(mt.tip(he1, dir)); hv.append(mt.tip(he2, dir)); he = [ he[2], he[1], he[0], he[3], he[4], he[5] ]; hv = [ hv[2], hv[1], hv[0], v, hv[3], hv[4], hv[5] ]; return (he, hv);
def get_CV_line(dagPath, v, eK1, eK2): meshFn = om.MFnMesh(dagPath) e = mt.vertex_edges(dagPath, v) if e[0] == eK1 or e[0] == eK2: e = [e[1], e[3]] else: e = [e[0], e[2]] tccNode = mt.get_TCC_DGnode(dagPath) T = cmds.getAttr(tccNode.name() + ".T") he = [] hv = [] for eK in e: f = mt.edge_faces(dagPath, eK) he0 = mt.halfedge(dagPath, f[0], eK1) if he0[1] == -1: he0 = mt.halfedge(dagPath, f[0], eK2) eN = mt.edge(mt.next(he0)) dir = 0 if eN == e[0] or eN == e[1]: dir = 1 else: dir = -1 he0 = mt.next(he0, dir) T0 = mt.get_halfedge_data(dagPath, T, he0) if dir == 1 else mt.get_halfedge_data(dagPath, T, mt.prev(he0)) he1 = mt.next(he0, dir) if T0 else mt.next(mt.twin(mt.next(he0, dir)), dir) T1 = mt.get_halfedge_data(dagPath, T, he1) if dir == 1 else mt.get_halfedge_data(dagPath, T, mt.prev(he1)) he2 = mt.next(he1, dir) if T1 else mt.next(mt.twin(mt.next(he1, dir)), dir) he.append(he0) he.append(he1) he.append(he2) hv.append(mt.tip(he0, dir)) hv.append(mt.tip(he1, dir)) hv.append(mt.tip(he2, dir)) he = [he[2], he[1], he[0], he[3], he[4], he[5]] hv = [hv[2], hv[1], hv[0], v, hv[3], hv[4], hv[5]] return (he, hv)
def doIt(self, args): dagPath = mt.selected_dagPath() meshFn = om.MFnMesh(dagPath) mel.eval("SelectVertexMask") cmds.select(cl=True) tccNode = mt.get_TCC_DGnode(dagPath) T = om.MIntArray(meshFn.numVertices(), 0) if tccNode is not None: Tb = cmds.getAttr(tccNode.name() + ".T") (nFV, F) = mt.getTopology(meshFn) for k in range(len(F)): T[F[k]] += Tb[k] vertexIter = om.MItMeshVertex(dagPath) while not vertexIter.isDone(): idx = vertexIter.index() if T[idx] > 0: cmds.select(dagPath.fullPathName() + ".vtx[" + str(idx) + "]", tgl=True) vertexIter.next()
def knot_modifier(modType): (dagPath, component) = mt.selected_dagPath_component() meshFn = om.MFnMesh(dagPath) tccNode = mt.get_TCC_DGnode(dagPath) itv = cmds.getAttr(tccNode.name() + ".itv") T = cmds.getAttr(tccNode.name() + ".T") ve = build_knot_removal_data(dagPath) R = [] for (v, e) in ve.items(): (he, v) = get_CV_line(dagPath, v, e[0], e[1]) i = [] for k in range(6): i.append(mt.get_halfedge_data(dagPath, itv, he[k])) p = [] for k in range(1, 6): pk = om.MPoint() meshFn.getPoint(v[k], pk) p.append(Vec3(pk.x, pk.y, pk.z)) if modType == KnotModifier.Insert: (p2, p3, p4) = compute_knot_insertion(p, i) elif modType == KnotModifier.Remove: (p2, p3, p4) = compute_knot_removal(p, i) else: raise Exception("Unknown Modifier") R.append((v[2], p2)) R.append((v[3], p3)) R.append((v[4], p4)) return R
def knot_modifier(modType): (dagPath, component) = mt.selected_dagPath_component(); meshFn = om.MFnMesh(dagPath); tccNode = mt.get_TCC_DGnode(dagPath); itv = cmds.getAttr(tccNode.name()+".itv"); T = cmds.getAttr(tccNode.name()+".T"); ve = build_knot_removal_data(dagPath); R = []; for (v,e) in ve.items(): (he, v) = get_CV_line(dagPath, v, e[0], e[1]); i = []; for k in range(6): i.append(mt.get_halfedge_data(dagPath, itv, he[k])); p = []; for k in range(1,6): pk = om.MPoint(); meshFn.getPoint(v[k], pk); p.append(Vec3(pk.x, pk.y, pk.z)); if modType == KnotModifier.Insert: (p2, p3, p4) = compute_knot_insertion(p, i); elif modType == KnotModifier.Remove: (p2, p3, p4) = compute_knot_removal(p, i); else: raise Exception("Unknown Modifier"); R.append( (v[2], p2) ) R.append( (v[3], p3) ) R.append( (v[4], p4) ) return R;
def doIt(self, args): v = mt.selected_vertices(); dagPath = mt.selected_dagPath(); TCC = mt.get_TCC_DGnode(dagPath); corner = cmds.getAttr(TCC.name()+".corner"); # check if all elements in selection have same value val = corner[v[0]]; allEqual = True; for cv in v: if corner[cv] != val: allEqual = False; break; if allEqual: val = (val+1) % 3; else: val = 0; for cv in v: corner[cv] = val; cornerType = ["off", "on", "auto"]; print "All vertices set to corner="+cornerType[val]; cmds.setAttr(TCC.name()+".corner", corner, type="Int32Array");