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)
示例#2
0
文件: Util.py 项目: darkuress/arFace
 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!!'            
示例#3
0
文件: Func.py 项目: darkuress/arFace
 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        
示例#4
0
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."'
        )
示例#5
0
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))])
示例#6
0
 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)
示例#7
0
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
示例#8
0
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)
示例#9
0
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
示例#10
0
 def selLoopFn(self):
     cmds.polySelectSp(loop=1)
示例#11
0
    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)
示例#12
0
 def selLoopFn(self):
     cmds.polySelectSp(loop=1)
示例#13
0
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)
示例#14
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 )
示例#15
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)