def cleanupHierarchicalSubdivisionConversion(object): """ This definition cleans Maya hierarchical polygonal conversion. :param object: Object to cleanup. ( String ) """ cmds.select(object) cmds.polySelectConstraint(m=3, t=8, sz=3) cmds.polySelectConstraint(dis=True) nsidesFaces = cmds.ls(sl=True, l=True, fl=True) cmds.select(nsidesFaces) cmds.polySelectConstraint(m=3, t=1, order=True, orb=(3, 3)) cmds.polySelectConstraint(dis=True) nsideVertices = cmds.ls(sl=True, l=True, fl=True) offendingEdges = [] for vertice in nsideVertices: faces = cmds.ls(cmds.polyListComponentConversion(vertice, fv=True, tf=True), fl=True, l=True) faces = [face for face in faces if not face in nsidesFaces] if len(faces) == 2: faceEdgesA = cmds.ls(cmds.polyListComponentConversion(faces[0], ff=True, te=True), fl=True, l=True) faceEdgesB = cmds.ls(cmds.polyListComponentConversion(faces[1], ff=True, te=True), fl=True, l=True) sharedEdge = list(set(faceEdgesA).intersection(faceEdgesB)) offendingEdges.append(sharedEdge[0]) cmds.polySelectSp(offendingEdges, loop=True) cmds.polyDelEdge(cmds.ls(sl=True), cv=True, ch=True) cmds.select(object)
def orderedVertsEdgeLoop(cls): """ #select 2 adjasent vertices ( corner and direction vertex) #list vertexes on edge loop( for curves ) """ myVert = cmds.ls( os=1, fl=1 ) if len(myVert)==2: firstVert = myVert[0] secondVert = myVert[1] cmds.select (firstVert,secondVert, r =1) mel.eval('ConvertSelectionToContainedEdges') firstEdge = cmds.ls( sl=1 )[0] cmds.polySelectSp( firstEdge, loop =1 ) edges = cmds.ls( sl=1, fl=1 ) edgeDict = cls.getEdgeVertDict(edges) #{edge: [vert1, vert2], ...} ordered = [firstVert, secondVert] for i in range( len(edges)-2 ): del edgeDict[firstEdge] #print edgeDict for x, y in edgeDict.iteritems(): if secondVert in y: xVerts = y xVerts.remove(secondVert) firstEdge = x secondVert = xVerts[0] ordered.append( secondVert ) return ordered else: print 'select 2 adjasent vertex!!'
def orderedVertsEdgeLoop(self, myList): """ select two adjasent edges( second edge is the curve direction) return list of verts on edgeLoop """ cmds.select(myList[0], r =1) cmds.ConvertSelectionToVertices() firstVert = cmds.ls(sl=1, fl=1) cmds.select(myList[1], r =1) cmds.ConvertSelectionToVertices() secondVert = cmds.ls(sl=1, fl=1) repeatVert = [i for i in firstVert if i in secondVert] secondVert.remove(repeatVert[0]) nextVert = secondVert[0] firstVert.remove(repeatVert[0]) cmds.polySelectSp(myList[1], loop =1) sel = cmds.ls( sl=1, fl=1 ) edgeLen = len(sel)-2 orderedVerts = [] for i in range(edgeLen): selEdges = [x for x in sel if x not in myList] nextVert_edge = self.findConnectVert(selEdges, nextVert) orderedVerts.append(nextVert) nextVert = nextVert_edge[0] myList.append(nextVert_edge[1]) orderedVerts.append(firstVert[0]) orderedVerts.insert(0,repeatVert[0]) orderedVerts.insert(0,firstVert[0]) return orderedVerts
def makeHair(selList, density, layers, twist=0.0): if len(selList) > 1: firstLoop = selList else: sel = selList[0] cmds.select('%s.e[3]' % sel) cmds.polySelectSp(loop=True) firstLoop = cmds.ls(sl=True, fl=True) cmds.hide(sel) firstLoop = cmds.ls(cmds.polyListComponentConversion(firstLoop, fe=True, fv=True, tv=True), fl=True) # DO A LITTLE ERROR CHECKING TO SEE IF WE GOT WHAT WE NEED neighbor = getNeighboringEdgeloops(firstLoop) if len(neighbor) != len(firstLoop): mel.eval( 'warning "Selected edgeloop is not a border loop. Please select a border loop and try again."' ) return None # CREATE THE HULL CURVES if twist < 0: numIntermediates = round((twist * -1) / .1) - 1 else: numIntermediates = round(twist / .1) - 1 if numIntermediates < 0: numIntermediates = 0 hullCurves = makeHullCurves(firstLoop, numIntermediates) twist /= numIntermediates + 1.0 objName = firstLoop[0].split('.')[0] # CREATE ALL THE HAIR CURVES allHairCurves = [] for i in range(layers): for curve in hullCurves: s = (i + 1) / (layers * 1.0) cmds.setAttr(curve + '.scale', s, s, s, type='double3') allHairCurves += makeHairCurves(hullCurves, density, twist) # DO SOME SPRING CLEANING cmds.delete(hullCurves) for i in range(len(allHairCurves)): curveNum = str(i + 1) allHairCurves[i] = cmds.rename(allHairCurves[i], '%s_%sCRV' % (objName, curveNum)) if len(allHairCurves) > 0: hairGrp = cmds.rename(cmds.group(allHairCurves), objName + '_hairCurves') else: mel.eval( 'warning "No hair curves made. Perhaps Density value is too high."' )
def curveFromCylinderEdge(cylinderEdge=None): """ # Example from ooutdmaya.common import curve reload(curve) # Pass in the edge name to work from crv = curve.curveFromCylinderEdge('polySurface25.e[214]') # Work based on selection cmds.select('polySurface25.e[214]') crv = curve.curveFromCylinderEdge() """ if cylinderEdge: cmds.select(cylinderEdge) cmds.polySelectSp(loop=1) edges = cmds.ls(sl=1) mel.eval('ConvertSelectionToVertices;') # sl = cmds.ls(sl=1) sl = cmds.filterExpand(sm=31, expand=1) locList = [] posList = [] for each in sl: # each = 'polySurface25.vtx[478]' cmds.select(each) mel.eval('PolySelectConvert 2;') cmds.select(edges, d=1) cmds.polySelectSp(loop=1) mel.eval('ConvertSelectionToVertices;') edgeVtx = cmds.filterExpand(sm=31, expand=1) posDict = {'x': [], 'y': [], 'z': []} for vtx in edgeVtx: pos = cmds.xform(vtx, q=1, ws=1, t=1) posDict['x'].append(pos[0]) posDict['y'].append(pos[1]) posDict['z'].append(pos[2]) posX = reduce(lambda x, y: x + y, posDict['x']) / len(posDict['x']) posY = reduce(lambda x, y: x + y, posDict['y']) / len(posDict['y']) posZ = reduce(lambda x, y: x + y, posDict['z']) / len(posDict['z']) posList.append([posX, posY, posZ]) ''' loc = cmds.spaceLocator()[0] locList.append(loc) cmds.xform(loc, ws=1, t=[posX, posY, posZ]) ''' return cmds.curve(d=1, p=posList, k=[i for i in xrange(0, len(posList))])
def polytoCurve(self): blist = cmds.ls(sl=1) for i in blist: vnum = cmds.polyEvaluate(i, v=1) for v in range(vnum): enum = cmds.ls(cmds.polyListComponentConversion(i + '.vtx[' + str(v) + ']', fv=1, ff=1, fuv=1, fvf=1, te=1), fl=1) if len(enum) == 4: break arclen = [] for e in enum: elist = cmds.polySelectSp(e, q=1, loop=1) earclen = 0.0 for el in elist: earclen += cmds.arclen(el) arclen.append(earclen) cmds.polySelectSp(enum[arclen.index(max(arclen))], loop=1) cname = cmds.rename(cmds.polyToCurve( ch=0, form=2, degree=3), i + '_Cur') if cmds.xform(cname + '.cv[0]', q=1, ws=1, t=1)[1] < cmds.xform(cname + '.cv[' + str(cmds.getAttr(cname + ".controlPoints", size=1)) + ']', q=1, ws=1, t=1)[1]: cmds.reverseCurve(cname, ch=0, rpo=1)
def createCenterCurve(*args): selList = cmds.ls(sl=True, fl=True) if len(selList) > 1: firstLoop = selList else: sel = selList[0] cmds.select('%s.e[3]' % sel) cmds.polySelectSp(loop=True) firstLoop = cmds.ls(sl=True, fl=True) firstLoop = cmds.ls(cmds.polyListComponentConversion(firstLoop, fe=True, fv=True, tv=True), fl=True) # DO A LITTLE ERROR CHECKING TO SEE IF WE GOT WHAT WE NEED neighbor = getNeighboringEdgeloops(firstLoop) if len(neighbor) != len(firstLoop): mel.eval( 'warning "Selected edgeloop is not a border loop. Please select a border loop and try again."' ) return None # CREATE THE HULL CURVEs hullCurves = makeHullCurves(firstLoop) objName = firstLoop[0].split('.')[0] # CREATE ALL THE HAIR CURVES for curve in hullCurves: s = 0 cmds.setAttr(curve + '.scale', s, s, s, type='double3') hairCurve = makeHairCurve(hullCurves, .5) # DO SOME SPRING CLEANING cmds.delete(hullCurves) hairCurve = cmds.rename(hairCurve, '%s_CenterCRV' % objName) cmds.select(hairCurve, r=True) return hairCurve
def cleanupHierarchicalSubdivisionConversion(object): """ Cleans Maya hierarchical polygonal conversion. :param object: Object to cleanup. :type object: str """ cmds.select(object) cmds.polySelectConstraint(m=3, t=8, sz=3) cmds.polySelectConstraint(dis=True) nsidesFaces = cmds.ls(sl=True, l=True, fl=True) cmds.select(nsidesFaces) cmds.polySelectConstraint(m=3, t=1, order=True, orb=(3, 3)) cmds.polySelectConstraint(dis=True) nsideVertices = cmds.ls(sl=True, l=True, fl=True) offendingEdges = [] for vertice in nsideVertices: faces = cmds.ls(cmds.polyListComponentConversion(vertice, fv=True, tf=True), fl=True, l=True) faces = [face for face in faces if not face in nsidesFaces] if len(faces) == 2: faceEdgesA = cmds.ls(cmds.polyListComponentConversion(faces[0], ff=True, te=True), fl=True, l=True) faceEdgesB = cmds.ls(cmds.polyListComponentConversion(faces[1], ff=True, te=True), fl=True, l=True) sharedEdge = list(set(faceEdgesA).intersection(faceEdgesB)) offendingEdges.append(sharedEdge[0]) cmds.polySelectSp(offendingEdges, loop=True) cmds.polyDelEdge(cmds.ls(sl=True), cv=True, ch=True) cmds.select(object)
def edgeLoopSorting(*args): sel = cmds.ls(sl=True, fl=True) edgeLoop = [] for s in sel: loop = [] cmds.select(s, r=True) entireEdgeLoop = cmds.ls(s, cmds.polySelectSp(q=True, loop=True), fl=True) tmpFlatList = sum(edgeLoop, []) for e in entireEdgeLoop: if e in sel and e not in loop and e not in tmpFlatList: loop.append(e) else: pass if len(loop) > 0: edgeLoop.append(loop) return edgeLoop
def selLoopFn(self): cmds.polySelectSp(loop=1)
def ToolUi(self): ToolUi = 'WeightTool_JellyBean' if cmds.window(ToolUi, q=1, ex=1): cmds.deleteUI(ToolUi) cmds.window(ToolUi, t='WeightTool', rtf=1, mb=1, mxb=0, wh=(230, 500)) cmds.menu(l='SkinT', to=1) cmds.menuItem(d=1, dl="S/L") cmds.menuItem(l='Save', c=lambda *args: self.vtxSave_api()) cmds.menuItem(l='Load', c=lambda *args: self.vtxLoad_api()) cmds.menuItem(d=1) cmds.menuItem(l='WeightCheck', c=lambda *args: WeightCheckTool_JellyBean().ToolUi()) cmds.menuItem(l='reset SkinPose', c=lambda *args: self.resetSkinPose()) cmds.menu(l='RigT', to=1) cmds.menuItem(l='Create', c=lambda *args: self.createSelect()) cmds.menuItem(l='Get', c=lambda *args: self.getSelect()) cmds.columnLayout('FiristcL_JellyBean', cat=('both', 2), rs=2, cw=220, adj=1) cmds.text('spJobchangeVtx_JellyBean', p='FiristcL_JellyBean', vis=0) cmds.scriptJob(e=['SelectTypeChanged', 'WeightTool_JellyBean().refreshBoxChange(None)'], p='spJobchangeVtx_JellyBean') cmds.rowLayout(nc=6, adj=2) cmds.iconTextCheckBox('refresh_JellyBean', i='refresh.png', w=20, h=20, onc=lambda *args: self.spJobStart(), ofc=lambda *args: self.refreshBoxChange(9)) cmds.popupMenu() cmds.menuItem('OFFmeunItem_JellyBean', l='OFF', cb=0) cmds.textField('searchText_JellyBean', h=22, tcc=lambda *args: self.refreshJointList(1, cmds.textField('searchText_JellyBean', q=1, tx=1))) cmds.popupMenu() cmds.radioMenuItemCollection() cmds.menuItem('HImeunItem_JellyBean', l='Hierarchy', rb=1, c=lambda *args: self.refreshJointList(1)) cmds.menuItem('AImeunItem_JellyBean', l='Alphabetically', rb=0, c=lambda *args: self.refreshJointList(1)) cmds.menuItem('FImeunItem_JellyBean', l='Filter Zero', cb=0, c=lambda *args: self.refreshJointList(1)) # cmds.iconTextButton(i='expandInfluenceList.png', w=20, h=20, # c=lambda *args: cmds.treeView('JointTV_JellyBean', e=1, h=cmds.treeView('JointTV_JellyBean', q=1, h=1) + 20)) # cmds.iconTextButton(i='retractInfluenceList.png', w=20, h=20, # c=lambda *args: cmds.treeView('JointTV_JellyBean', e=1, h=cmds.treeView('JointTV_JellyBean', q=1, h=1) - 20)) # invertSelection.png cmds.iconTextButton(i='invertSelection.png', w=20, h=20, c=self.reSelect) cmds.setParent('..') cmds.setParent('..') cmds.formLayout('JointTVLayout_JellyBean') cmds.treeView('JointTV_JellyBean', nb=1, h=100, scc=self._weightView, pc=(1, self.lock_unLock)) cmds.text('saveData_JellyBean', l='', vis=0) cmds.popupMenu() #cmds.menuItem(l='Lock All') #cmds.menuItem(l='Unlock All') cmds.menuItem(l='Select Vtx', c=lambda *args: self.slVtx()) cmds.formLayout('JointTVLayout_JellyBean', e=1, af=[('JointTV_JellyBean', 'top', 0), ('JointTV_JellyBean', 'bottom', 0), ('JointTV_JellyBean', 'left', 3), ('JointTV_JellyBean', 'right', 3)]) cmds.setParent('..') cmds.columnLayout(cat=('both', 2), rs=2, cw=225) cmds.rowLayout(nc=4, cw4=(50, 50, 50, 65)) cmds.floatField('weighrfloat_JellyBean', w=52, h=26, pre=4, min=0, max=1, ec=lambda *args: self.editVtxWeight(cmds.floatField('weighrfloat_JellyBean', q=1, v=1))) cmds.button(w=50, h=26, l='Copy', c=lambda *args: self.copyVtxWeight()) cmds.button(w=50, h=26, l='Paste', c=lambda *args: self.pasteVtxWeight()) cmds.popupMenu() cmds.menuItem(l='PasteAll', c=lambda *args: mel.eval("polyConvertToShell;artAttrSkinWeightPaste;")) cmds.button(w=65, h=26, l='Hammer', c=lambda *args: (mel.eval('weightHammerVerts'), self.refreshJointList(0))) cmds.setParent('..') cmds.rowLayout(nc=5, cw5=(43, 43, 43, 43, 43)) cmds.button(w=43, h=26, l='Loop', c=lambda *args: cmds.polySelectSp(loop=1)) cmds.button(w=43, h=26, l='Ring', c=lambda *args: mel.eval("PolySelectConvert 2;PolySelectTraverse 2;polySelectEdges edgeRing;PolySelectConvert 3;")) cmds.button(w=43, h=26, l='Shell', c=lambda *args: mel.eval("polyConvertToShell")) cmds.button(w=43, h=26, l='Shrink', c=lambda *args: cmds.polySelectConstraint(pp=2)) cmds.button(w=43, h=26, l='Grow', c=lambda *args: cmds.polySelectConstraint(pp=1)) cmds.setParent('..') cmds.rowLayout(nc=7, cw=[(1, 30), (2, 30), (3, 30), (4, 30), (5, 30), (6, 30), (7, 30)]) cmds.button(w=30, h=26, l='0', c=lambda *args: self.editVtxWeight(0)) cmds.button(w=30, h=26, l='.1', c=lambda *args: self.editVtxWeight(.1)) cmds.button(w=30, h=26, l='.25', c=lambda *args: self.editVtxWeight(.25)) cmds.button(w=30, h=26, l='.5', c=lambda *args: self.editVtxWeight(.5)) cmds.button(w=30, h=26, l='.75', c=lambda *args: self.editVtxWeight(.75)) cmds.button(w=30, h=26, l='.9', c=lambda *args: self.editVtxWeight(.9)) cmds.button(w=30, h=26, l='1', c=lambda *args: self.editVtxWeight(1)) cmds.setParent('..') cmds.rowLayout(nc=4, cw4=(80, 60, 38, 38)) cmds.text(l='A/S Weight', w=80) cmds.floatField('ASFloat_JellyBean', v=0.05, h=26, w=50, pre=3, min=0, max=1) cmds.button(w=38, h=26, l='+', c=lambda *args: self.editVtxWeight('+')) cmds.button(w=38, h=26, l='-', c=lambda *args: self.editVtxWeight('-')) cmds.setParent('..') cmds.rowLayout(nc=4, cw4=(80, 60, 38, 38)) cmds.text(l='M/D Weight', w=80) cmds.floatField('MDFloat_JellyBean', v=0.95, h=26, w=50, pre=3, min=0, max=1) cmds.button(w=38, h=26, l='*', c=lambda *args: self.editVtxWeight('*')) cmds.button(w=38, h=26, l='/', c=lambda *args: self.editVtxWeight('/')) cmds.setParent('..') cmds.showWindow(ToolUi)
def gridFill(): #### Setting ordered selection as true in the preferences #### cmds.selectPref(trackSelectionOrder=True) userOffset = cmds.intField(offsetBox, q=1, v=1) userDivision = cmds.intField(divisions, q=1, v=1) relax = cmds.optionMenu(relaxChoice, q=1, v=1) #### Getting the original selection #### originalSelection = (cmds.ls(selection=True, flatten=True)) # Storing the number of vertices in order to be able to relax the new created ones cmds.select(clear=True) mel.eval("invertSelection;") cmds.polyListComponentConversion(fromEdge=True, toVertex=True) verticesForExclusion = cmds.polyListComponentConversion(fromEdge=True, toVertex=True) cmds.select(verticesForExclusion) cmds.select(originalSelection) ##### Selection changes #### i = 0 selectionGrowList = [] mel.eval("invertSelection;") invertedOriginal = (cmds.ls(selection=True, flatten=True)) cmds.select(clear=True) # Get the first edge of the border selected cmds.select(originalSelection[userOffset + 1]) if len(originalSelection) % 4 == 0: mel.eval('select `ls -sl`;PolySelectTraverse 1;select `ls -sl`;') cmds.select(invertedOriginal, deselect=True) originalOddSelection = (cmds.ls(selection=True, flatten=True)) cmds.select(clear=True) cmds.select(originalOddSelection[0], originalOddSelection[1]) # Grow selection until the whole border is selected while i < (len(originalSelection) / 2 - 1): mel.eval('select `ls -sl`;PolySelectTraverse 1;select `ls -sl`;') selectionGrowList.append(cmds.ls(selection=True, flatten=True)) i += 1 # Finding the two middle edges of the list midHalf = (i / 2) midSubstract = (i / 2) - 2 # Reset i value i = 0 #### Selecting the two opposite edges suites #### # Selecting the first two opposite edges cmds.select(clear=True) cmds.select(selectionGrowList[midHalf]) cmds.select(selectionGrowList[midSubstract], deselect=True) cmds.select(invertedOriginal, deselect=True) # Growing the selection by the number of user divisions while i < userDivision - 4: mel.eval('select `ls -sl`;PolySelectTraverse 1;select `ls -sl`;') i += 1 cmds.select(invertedOriginal, deselect=True) # reset i i = 0 #### Getting the number of division on the bridge #### firstBridge = cmds.ls(selection=True, flatten=True) # The number of divisions needed is equal to the remaining edges on the original edge loop divided by 2 and minus 3 divisionsNeeded = (len(originalSelection) - len(firstBridge) - 4) / 2 - 1 # Bridging the first loop and dividing it cmds.polyBridgeEdge(divisions=divisionsNeeded) # now need to find a way to select the remaining edge loops in order to bridge them # The shrink selection around loop should work # Should find indications in the cmds.polySelectConstraint( pp=1 ) documentation # Get the first edge of the last two bridges cmds.select(clear=True) cmds.select(originalSelection) cmds.select(firstBridge, deselect=True) otherBridge = cmds.ls(selection=True, flatten=True) # Minus border edges mel.eval('select `ls -sl`;PolySelectTraverse 6; select `ls -sl`;') actualBridge = cmds.ls(selection=True, flatten=True) #Getting border edges to remove for the last two bridges cmds.select(clear=True) cmds.select(otherBridge) cmds.select(actualBridge, deselect=True) minusBridge = cmds.ls(selection=True, flatten=True) ##### Selecting the remaining bridges #### cmds.select(clear=True) cmds.select(otherBridge[0]) # Selecting the whole loop cmds.polySelectSp(loop=True) secondBridge = cmds.ls(selection=True, flatten=True) # Deselect the minusBridge cmds.select(minusBridge, deselect=True) cmds.polyBridgeEdge(divisions=0) #LastBridge cmds.select(clear=True) cmds.select(otherBridge) #Selecting a single edge from this selection, otherwise the polySelectSp(loop=True) does not work cmds.select(secondBridge, deselect=True) lastBridge = cmds.ls(selection=True, flatten=True) cmds.select(clear=True) cmds.select(lastBridge[0]) # Selecting the whole loop cmds.polySelectSp(loop=True) # Deselect the minusBridge cmds.select(minusBridge, deselect=True) cmds.polyBridgeEdge(divisions=0) #### Relax the new vertices #### cmds.select(clear=True) if relax == "Yes": mel.eval("setSelectMode components Components;") mel.eval( "selectType -smp 0 -sme 0 -smf 0 -smu 0 -pv 1 -pe 0 -pf 0 -puv 0;") cmds.select(verticesForExclusion) mel.eval("invertSelection;") verticesForRelax = [] verticesForRelax = cmds.ls(selection=True, flatten=True) cmds.polyAverageVertex(verticesForRelax, iterations=100) mel.eval( "selectType -smp 0 -sme 0 -smf 0 -smu 0 -pv 0 -pe 1 -pf 0 -puv 0;") cmds.select(clear=True)
def createConveyerBeltSet( meshName, firstEdgeIndex, secondEdgeIndex ): firstEdges = cmds.polySelectSp( meshName+'.e[%d]' % firstEdgeIndex, loop=1 ) secondEdges = cmds.polySelectSp( meshName+'.e[%d]' % secondEdgeIndex, loop=1 ) cmds.select( firstEdges ) firstCurve = cmds.polyToCurve( form=2, degree=3, n=meshName+'_loopCurve_First' )[0] cmds.select( secondEdges ) secondCurve = cmds.polyToCurve( form=2, degree=3, n=meshName+'_loopCurve_Second' )[0] firstCurveShape = sgModelDag.getShape( firstCurve ) secondCurveShape = sgModelDag.getShape( secondCurve ) firstSpans = cmds.getAttr( firstCurveShape +'.spans' ) secondSpans = cmds.getAttr( secondCurveShape+'.spans' ) firstTangent = sgModelCurve.getTangentAtParam( firstCurveShape, 0.0 ) firstParamPoint = sgModelCurve.getPointAtParam( firstCurveShape, 0.0 ) secondParam = sgModelCurve.getParamAtPoint( secondCurveShape, firstParamPoint ) secondTangent = sgModelCurve.getTangentAtParam( secondCurveShape, secondParam ) if firstTangent * secondTangent < 0: cmds.reverseCurve( secondCurve, ch = 1, rpo = 1 ) firstPointers = sgRigCurve.createRoofPointers( firstCurve, firstSpans ) secondPointers = sgRigCurve.createRoofPointers( secondCurve, secondSpans ) fPos = cmds.xform( firstPointers[0], q=1, ws=1, t=1 ) minDistPointer = secondPointers[0] minDist = 1000000000.0 for secondPointer in secondPointers: sPos = cmds.xform( secondPointer, q=1, ws=1, t=1 ) dist = (fPos[0]-sPos[0])**2+(fPos[1]-sPos[1])**2+(fPos[2]-sPos[2])**2 if dist < minDist: minDistPointer = secondPointer minDist = dist offset = int( minDistPointer.split( '_' )[-1] ) crvs = [] for i in range( len( firstPointers ) ): firstPointer = firstPointers[i] secondPointer = '_'.join( secondPointers[i].split( '_' )[:-1] ) + '_%d' %( (i + offset)%firstSpans ) crv = sgRigCurve.createCurveOnTargetPoints( [firstPointer, secondPointer] ) crv = cmds.rename( crv, meshName+'_line_%d' % i ) crvs.append( crv ) cmds.select( crvs ) loftSurf = cmds.loft( n=meshName+'_loft' )[0] resultObject = cmds.nurbsToPoly( loftSurf ,mnd=1 ,ch=1,f=3,pt=0,pc=200,chr=0.9,ft=0.01,mel=0.001, d=0.1, ut=1, un=3, vt=1, vn=3, uch=0, ucr=0, cht=0.2, es=0,ntr=0,mrt=0, uss=1, n=meshName+'_conveyorBelt' ) crvGrp = cmds.group( crvs, n=meshName+'_lines' ) conveyorRig = cmds.group( firstCurve, secondCurve, crvGrp, loftSurf, resultObject, meshName, n=meshName+'_conveyorRig' ) import sgRigAttribute sgRigAttribute.addAttr( conveyorRig, ln='offset', k=1 ) cmds.connectAttr( conveyorRig+'.offset', firstCurve+'.roofValue' ) cmds.connectAttr( conveyorRig+'.offset', secondCurve+'.roofValue' ) cmds.setAttr( conveyorRig+'.v', 0 )
def createConveyerBeltSet(meshName, firstEdgeIndex, secondEdgeIndex): firstEdges = cmds.polySelectSp(meshName + '.e[%d]' % firstEdgeIndex, loop=1) secondEdges = cmds.polySelectSp(meshName + '.e[%d]' % secondEdgeIndex, loop=1) cmds.select(firstEdges) firstCurve = cmds.polyToCurve(form=2, degree=3, n=meshName + '_loopCurve_First')[0] cmds.select(secondEdges) secondCurve = cmds.polyToCurve(form=2, degree=3, n=meshName + '_loopCurve_Second')[0] firstCurveShape = sgModelDag.getShape(firstCurve) secondCurveShape = sgModelDag.getShape(secondCurve) firstSpans = cmds.getAttr(firstCurveShape + '.spans') secondSpans = cmds.getAttr(secondCurveShape + '.spans') firstTangent = sgModelCurve.getTangentAtParam(firstCurveShape, 0.0) firstParamPoint = sgModelCurve.getPointAtParam(firstCurveShape, 0.0) secondParam = sgModelCurve.getParamAtPoint(secondCurveShape, firstParamPoint) secondTangent = sgModelCurve.getTangentAtParam(secondCurveShape, secondParam) if firstTangent * secondTangent < 0: cmds.reverseCurve(secondCurve, ch=1, rpo=1) firstPointers = sgRigCurve.createRoofPointers(firstCurve, firstSpans) secondPointers = sgRigCurve.createRoofPointers(secondCurve, secondSpans) fPos = cmds.xform(firstPointers[0], q=1, ws=1, t=1) minDistPointer = secondPointers[0] minDist = 1000000000.0 for secondPointer in secondPointers: sPos = cmds.xform(secondPointer, q=1, ws=1, t=1) dist = (fPos[0] - sPos[0])**2 + (fPos[1] - sPos[1])**2 + (fPos[2] - sPos[2])**2 if dist < minDist: minDistPointer = secondPointer minDist = dist offset = int(minDistPointer.split('_')[-1]) crvs = [] for i in range(len(firstPointers)): firstPointer = firstPointers[i] secondPointer = '_'.join(secondPointers[i].split('_')[:-1]) + '_%d' % ( (i + offset) % firstSpans) crv = sgRigCurve.createCurveOnTargetPoints( [firstPointer, secondPointer]) crv = cmds.rename(crv, meshName + '_line_%d' % i) crvs.append(crv) cmds.select(crvs) loftSurf = cmds.loft(n=meshName + '_loft')[0] resultObject = cmds.nurbsToPoly(loftSurf, mnd=1, ch=1, f=3, pt=0, pc=200, chr=0.9, ft=0.01, mel=0.001, d=0.1, ut=1, un=3, vt=1, vn=3, uch=0, ucr=0, cht=0.2, es=0, ntr=0, mrt=0, uss=1, n=meshName + '_conveyorBelt') crvGrp = cmds.group(crvs, n=meshName + '_lines') conveyorRig = cmds.group(firstCurve, secondCurve, crvGrp, loftSurf, resultObject, meshName, n=meshName + '_conveyorRig') import sgRigAttribute sgRigAttribute.addAttr(conveyorRig, ln='offset', k=1) cmds.connectAttr(conveyorRig + '.offset', firstCurve + '.roofValue') cmds.connectAttr(conveyorRig + '.offset', secondCurve + '.roofValue') cmds.setAttr(conveyorRig + '.v', 0)