def extrudeTool(self): X = self.getSelection( ) # adds selection to a variable so we can deselect it later while still using it for the Dragger command. if self.getType(0) == 'face': cmds.polyExtrudeFacet(X, constructionHistory=1, keepFacesTogether=1) self.setAttributes(attrs=[( 'Thickness', '.thickness'), ('Offset', '.offset'), ( 'Division', '.divisions'), ('Z Translate', '.localTranslateZ' ), ('Faces Together', '.keepFacesTogether')]) elif self.getType(0) == 'edge': cmds.polyExtrudeEdge(X, constructionHistory=1, keepFacesTogether=1) self.setAttributes(attrs=[( 'Thickness', '.thickness'), ('Offset', '.offset'), ( 'Division', '.divisions'), ('Z Translate', '.localTranslateZ')]) else: pass #cmds.select( deselect = 1 ) # removes selection from the face initially extruded, to allow for rotation and translation of new extruded face self.Dragger(X, 'Extrude')
def extrude_edge_uv(self): self.ex_edges = [] sel = cmds.ls(sl=True) self.s_edges = common.conv_comp(sel, mode='edge') s_vtx = common.conv_comp(sel, mode='vtx') #self.saw_uvs(mode='pre')#事前に押し出し対象のUVを縫い合わせておく self.marge_uvs(mode='pre') if not self.s_edges: return ev_dict, vec_dict, ev_uv_dict = self.make_edge_vtx_dict(self.s_edges) #print 'ev_dict :', ev_dict #print 'vec_dict :', vec_dict #押し出しを実行する cmds.polyExtrudeEdge(self.s_edges, keepFacesTogether=True, smoothingAngle=self.soft_angle.value(), translate=[0, 0, 0]) self.ex_edges = cmds.ls(sl=True) n_edges = common.conv_comp(self.ex_edges, mode='edge') n_faces = common.conv_comp(self.ex_edges, mode='face') self.n_uvs = common.conv_comp(n_faces, mode='uv') #print 'pre_move_uvs :', self.n_uvs #根本の位置合わせする new_vec_dict = {} for nuv in self.n_uvs[:]: vtx = common.conv_comp(nuv, mode='vtx')[0] edge = common.conv_comp(nuv, mode='edge')[0] if edge + ' ' + vtx in ev_dict.keys(): uv_pos = ev_dict[edge + ' ' + vtx] #print 'get_uv_pos', nuv, uv_pos cmds.polyEditUV(nuv, u=uv_pos[0], v=uv_pos[1], r=False) self.n_uvs.remove(nuv) key_uv = ev_uv_dict[edge + ' ' + vtx] new_vec_dict[nuv] = vec_dict[key_uv] #print 'post push uvs :', self.n_uvs #押し出し先を根本につけて押し出しベクトル辞書をつくる self.uv_vec_dict = {} self.base_pos_dict = {} for nuv in self.n_uvs: edges = common.conv_comp(nuv, mode='edge') face = common.conv_comp(nuv, mode='face') f_uvs = common.conv_comp(face, mode='uv') for edge in edges: if edge in n_edges: continue #print 'get new edge :', edge e_uvs = common.conv_comp(edge, mode='uv') l_uvs = list(set(f_uvs) & set(e_uvs)) #print 'new edge uvs :', l_uvs for uv in l_uvs: if not uv in new_vec_dict.keys(): continue uv_pos = cmds.polyEditUV(uv, query=True) cmds.polyEditUV(nuv, u=uv_pos[0], v=uv_pos[1], r=False) self.uv_vec_dict[nuv] = new_vec_dict[uv] self.base_pos_dict[nuv] = uv_pos self.saw_edges.append(edge) #縫い合わせ用リストに入れておく self.push_out() cmds.setToolTo('moveSuperContext')
def editGeometry(self, size = 12, divisions = 50, *args): selection = args if not len(args): selection = cmds.ls(sl = True) for sel in selection: if sel in self.curves: cmds.polyPlane(self.curves[sel]['shape'], e = True, h = size, w = size) cmds.polyExtrudeEdge(self.curves[sel]['extrudeNde'], e=True,divisions = divisions) plane = self.curves[sel]['geometry'] self.createUv(mesh = plane) cmds.select(selection, r = True)
def extrudeTool(self): X = self.getSelection() # adds selection to a variable so we can deselect it later while still using it for the Dragger command. if self.getType(0) == 'face': cmds.polyExtrudeFacet( X, constructionHistory = 1, keepFacesTogether = 1) self.setAttributes( attrs = [('Thickness', '.thickness'), ('Offset', '.offset'), ('Division', '.divisions'), ('Z Translate', '.localTranslateZ'), ('Faces Together', '.keepFacesTogether')] ) elif self.getType(0) == 'edge': cmds.polyExtrudeEdge( X, constructionHistory = 1, keepFacesTogether = 1) self.setAttributes( attrs = [('Thickness', '.thickness'), ('Offset', '.offset'), ('Division', '.divisions'), ('Z Translate', '.localTranslateZ')] ) else: pass #cmds.select( deselect = 1 ) # removes selection from the face initially extruded, to allow for rotation and translation of new extruded face self.Dragger( X , 'Extrude')
def createBaseMesh(): ob = cmd.ls(sl=True)[0] if (cmd.nodeType(ob) == 'transform') and (cmd.attributeQuery( 'name', node=ob, exists=True)): #initialize merge = True name = cmd.getAttr('%s.name' % ob) frames = cmd.getAttr('%s.count' % ob) ctlObj = cmd.getAttr('%s.myCtl' % ob) thresh = 0.015 extrudeAmt = 0.2 edgeAmt = 0.05 newGp = cmd.group(em=True, w=True, n='%s_GEO_GP' % name) cmd.addAttr(newGp, ln='name', dt='string') cmd.setAttr("%s.name" % newGp, name, type='string') #create the new objects for i in range(1, frames + 1): cmd.setAttr('%s.frame' % ctlObj, i) newName = '%s_%02d_GEO' % (name, i) newOb = cmd.duplicate(ob, n=newName)[0] cmd.setAttr('%s.v' % newOb, 0) #insert a handler here to detect double faces or bad geo if merge: cmd.polyMergeVertex(newOb, ch=1, d=thresh) selectBorderEdges(newOb) cmd.polyExtrudeEdge(ch=1, d=2, lty=edgeAmt) cmd.polyExtrudeFacet(newOb, ch=1, kft=True, ltz=extrudeAmt, d=2) cmd.select(newOb) mel.eval( 'polyCleanupArgList 4 { "0","1","1","0","1","0","0","0","0","1e-005","0","1e-005","0","1e-005","0","-1","0","0"}' ) cmd.polySoftEdge(newOb, ch=1, a=180) cmd.parent(newOb, newGp) cmd.setKeyframe('%s.v' % newOb, t=[i - 1, i + 1], v=0) cmd.setKeyframe('%s.v' % newOb, t=i, v=1) for xyz in ['x', 'y', 'z']: cmd.setAttr('%s.t%s' % (newOb, xyz), 0) cmd.delete(newOb, ch=True) shit = cmd.ls('*%s*' % newName, io=True, type='mesh') if shit: cmd.delete(shit) #check for non-manifold and fix if (cmds.polyInfo(newOb, nme=True, nmv=True, nue=True, nuv=True)): print('%s had nonmanifold Geo, attempting fix...' % newOb) mel.eval( 'polyCleanupArgList 4 { "0","1","0","0","0","0","0","0","0","1e-005","0","1e-005","0","1e-005","0","1","0","0" }' ) else: cmd.error('You must select only one mesh object')
def GenerateCurve(selectedIn): curveName = selectedIn[1:] cv0 = cmds.getAttr(curveName + '.cv[0]') cmds.polyPlane(n='CurvePlane', sx=1, sy=1, w=1, h=1) cmds.move(cv0[0][0] - .5, cv0[0][1], cv0[0][2], 'CurvePlane', absolute=True) cmds.polyExtrudeEdge('CurvePlane.e[2]', kft=True, d=100, inc=curveName) # Edges are extruded then scaled together cmds.delete('CurvePlane.f[0]') WriteCurveJSON('C:/Users/jacks/Documents/Ada_Assets/' + curveName + '.json') cmds.delete()
def face(self, angle): self.poly=cmds.ls(selection=1)[0] edge= cmds.polyListComponentConversion (self.poly, fromFace=1, toEdge=1) flattenE= cmds.ls(selection=1, flatten=1) r=random.choice(flattenE) if (self.poly==[ ]): pass else: angleVariableChange=cmds.polyExtrudeEdge(r,keepFacesTogether=False, localTranslate=(angle[0],angle[1],angle[2]), localScale=(angle[0],angle[1],angle[2]), rotate=(angle[0],angle[1],angle[2]) ) return(edge)
def createGeometry(self, size = 12, divisions = 50): for curv, val in self.curves.iteritems(): plane, shape = cmds.polyPlane (h = size, w = size, sh = 1, sw = 1) print 'pplane is ',plane polyPlane = cmds.listConnections(shape, d = True, type='polyPlane') #orient plane vectorX = om.MVector(val['vectorX'][0], val['vectorX'][1], val['vectorX'][2]) vectorX.normalize() vectorY = om.MVector(0,1,0) vectorZ = vectorX ^ vectorY cmds.xform(plane, ws=True, m =(vectorX.x,vectorX.y,vectorX.z,0, vectorY.x, vectorY.y, vectorY.z, 0, vectorZ.x, vectorZ.y, vectorZ.z,0, val['position'][0], val['position'][1], val['position'][2], 1)) #extrude extrudeNde = cmds.polyExtrudeEdge('%s.e[2]' %plane, inputCurve = curv, divisions = divisions)[0] print extrudeNde val['geometry'] = plane val ['shape'] = shape val['extrudeNde'] = extrudeNde val['polyPlane'] = polyPlane self.curves[curv] = val self.createUv(mesh = plane) cmds.select(self.curves.keys(), r=True)
# หนามด้านล่าง craft_lang = mc.polySphere(r=r, sx=64, sy=32, n='craft_lang')[0] mc.hyperShade(a=phiu_nam) mc.scale(1.5, 1.5, 1.5, [ craft_lang + '.vtx[%d]' % (i + j - (i / 128) % 2) for i in range(1, 960, 128) for j in range(0, 64, 2) ]) mc.delete(craft_lang + '.f[960:1919]', craft_lang + '.f[1984:2047]') # ส่วนด้านบน craft_bon = mc.polySphere(r=10, sx=24, sy=4, n='craft_bon')[0] mc.delete(craft_bon + '.f[24:47]', craft_bon + '.f[72:95]') nf1 = mc.polyEvaluate(craft_bon, f=1) # จำนวนหน้าส่วนที่จะลบตอนหลัง mc.select(craft_bon + '.e[24:47]') # เนื้อไม้ mc.polyExtrudeEdge(sx=0.9, sz=0.9) mc.polyExtrudeEdge(ty=-r * 0.1) mc.polyExtrudeEdge(sx=5. / 9, sz=5. / 9) nf2 = mc.polyEvaluate(craft_bon, f=1) # เทียนแดง mc.polyExtrudeEdge(ty=r) mc.polyExtrudeEdge(sx=0.8, sz=0.8) mc.polyExtrudeEdge(ty=-r * 0.1) nf3 = mc.polyEvaluate(craft_bon, f=1) # ไส้เทียน mc.polyExtrudeEdge(sx=0.15, sz=0.15) sl = mc.ls(sl=1) kliao = mc.duplicate(craft_bon, n='kliao')[0] mc.select(sl) for i in range(15): mc.polyExtrudeEdge(ty=r * 0.05,
def completeAntenna(num_jnt,num_ctr,hairSystem,sliding,length,twist): lenComplist = len(completeList) for i in range(lenComplist): del completeList[0] num_crv = len(MakeAtna_returnV) method = '' createJntLst = [] #------------------ Get Hair System Type hairSys_on = 0 if hairSystem == 'New': hairSys_on = 1 elif hairSystem == '': hairSys_on = 0 else: hairSys_on = -1 for i in cmds.ls(type='hairSystem'): if hairSystem == i or hairSystem == cmds.listRelatives(i,p=1)[0]: hairSys_on = 2 if hairSys_on == -1: cmds.warning("'%s'는 존제하지 않는 Object입니다." % hairSystem) else: for i in MakeAtna_returnV: #------choose method if len(i) == 6: cmds.delete(i[5])#----delete expression method = 'avp' else: method = 'cv' getPosShp = 0.0 if method == 'avp': print MakeAtna_returnV[0][0][1], len(MakeAtna_returnV[0][1]) getPosShp = cmds.getAttr(MakeAtna_returnV[0][0][1]+'.posShp')/len(MakeAtna_returnV[0][1]) print getPosShp for i in MakeAtna_returnV: aim = i[4][0] up = i[4][1] mainName = i[1][0].partition('_')[0] #--------Set controler joint initial setting for j in i[1]: cmds.setAttr(j+'.tx',l=0) cmds.setAttr(j+'.ty',l=0) cmds.setAttr(j+'.tz',l=0) cmds.setAttr(j+'.rx',l=0) cmds.setAttr(j+'.ry',l=0) cmds.setAttr(j+'.rz',l=0) cmds.setAttr(j+'.dla',0) if method == 'avp': cmds.deleteAttr(j,at='ip') cmds.parent(j,w=1) for j in i[2]: cmds.delete(j) #----------------- Delete null group #----------Set constrainted orient to current orientation for j in range(len(i[1])-1): tempLoc = cmds.spaceLocator()[0] tempOri = cmds.orientConstraint(i[1][j],tempLoc) cmds.delete(tempOri) tempAim = cmds.aimConstraint(i[1][j+1],i[1][j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=tempLoc) cmds.delete(tempAim,tempLoc) cmds.parent(i[1][j+1],i[1][j]) ##-------- BindCurve And JointCurve Set attachJointCurve ='' bindCurve ='' posShp = 0.0 conJoint = i[1] if method == 'avp': dupleObj = cmds.duplicate(i[0][1],n=mainName+'_bindCurve')[0] cmds.deleteAttr(dupleObj+'.posShp') posShp = cmds.getAttr(i[0][1]+'.posShp') attachJointCurve = cmds.rebuildCurve( dupleObj, n=mainName+'_jntAtCurve', ch=1, rpo=0, rt=0 ,end=0, kr=0, kcp=1, kep=0, kt=0, s=0, d=3, tol=0.01 )[0] cmds.delete(i[0][0],i[0][1],i[0][2]) bindCurve = dupleObj else: dupleObj = cmds.duplicate(i[0][0],n=mainName+'_bindCurve')[0] spans = cmds.getAttr(cmds.listRelatives(dupleObj,s=1)[0]+'.spans') attachJointCurve = cmds.rebuildCurve( dupleObj, n=mainName+'_jntAtCurve', ch=1, rpo=0, rt=0 ,end=1, kr=0, kcp=0, kep=0, kt=0,s=spans*3, tol=0.01 )[0] cmds.delete(i[0][1],i[0][0]) bindCurve = dupleObj #--------------- Create Normal Base for Normal Constraint normalBase = cmds.polyPlane(w=1,h=1,sx=1,sy=1,n=mainName+'_normalBase')[0] for j in range(1,len(i[1])-1): cmds.polyExtrudeEdge(normalBase+'.e['+str(j*3)+']',lty=1) cmds.DeleteHistory(normalBase) def inr(a): return (a+1)%3 def inrb(a): return (a+2)%3 axisElse = [0,0,0] #--------- Get Third Axis for j in range(3): if aim[j] == 1 and up[inr(j)] == 1: axisElse[inrb(j)] = 1; if aim[j] == 1 and up[inr(j)] == 0: axisElse[inr(j)] = -1; if aim[j] == -1 and up[inr(j)] == 0: axisElse[inr(j)] = 1; if aim[j] == -1 and up[inr(j)] == 1: axisElse[inrb(j)] = -1; print j,inr(j),inrb(j) print 'aim :',aim print 'up :',up print 'axisElse:',axisElse for j in range(len(i[1])): tmLoc = cmds.spaceLocator() cmds.parent(tmLoc,conJoint[j]) cmds.move(axisElse[0],axisElse[1],axisElse[2],tmLoc,ls=1) locPos = cmds.xform(tmLoc,q=1,ws=1,piv=1) cmds.move(locPos[0],locPos[1],locPos[2],normalBase+'.vtx['+str(j*2+1)+']',ws=1) cmds.move(-axisElse[0],-axisElse[1],-axisElse[2],tmLoc,ls=1) locPos = cmds.xform(tmLoc,q=1,ws=1,piv=1) cmds.move(locPos[0],locPos[1],locPos[2],normalBase+'.vtx['+str(j*2)+']',ws=1) cmds.delete(tmLoc) bindObj = [] bindObj.append(conJoint[0]) bindObj.append(normalBase) cmds.skinCluster(bindObj) bindObj = [] bindObj.append(conJoint[0]) bindObj.append(bindCurve) cmds.skinCluster(bindObj) cmds.setAttr(bindCurve+'.v', 0) cmds.select(attachJointCurve) startHair = '' currentHair = '' restHair = '' if hairSys_on != 0: if hairSys_on == 1: beforeHair = cmds.ls(type='hairSystem') createHair('') afterHair = cmds.ls(type='hairSystem') for k in beforeHair: afterHair.remove(k) hairSystem = afterHair[0] hairSys_on = 2 elif hairSys_on == 2: createHair(hairSystem) cmds.select(attachJointCurve); import maya.mel as mel ;mel.eval('setSelectedHairCurves "start" "rest"') cmds.select(attachJointCurve); mel.eval('convertHairSelection "currentCurves"'); currentHair = cmds.ls(sl=1)[0] mel.eval('convertHairSelection "restCurves"'); restHair = cmds.ls(sl=1)[0] mel.eval('convertHairSelection "startCurves"'); startHair = cmds.ls(sl=1)[0]; attachJointCurve = currentHair mel.eval('displayHairCurves "all" 1'); blendShape1 = cmds.blendShape(startHair,restHair,tc=0)[0] cmds.setAttr(blendShape1+'.'+startHair,1) #---------------- Create Current Joint jntPntL = []; jntPntChildL = []; subLocL = []; jntL = []; jntGL = [] infoL = []; pntInfoL = []; pntRotL = [] if hairSys_on == 0: for j in range(num_jnt): cmds.select(d=1) jnt = cmds.joint(rad = 2, n=mainName+'_cuJoint'+str(j)) cmds.setAttr(jnt+'.dla',1) cmds.addAttr(jnt,ln='infoPos',sn='ip',at='double',min=0,max=num_jnt-1,dv=j) cmds.setAttr(jnt+'.ip',e=1,k=1) jntG = cmds.group(jnt,n=jnt+'_p') info = cmds.createNode('pointOnCurveInfo', n=mainName+'_info'+str(j)) subLoc = cmds.spaceLocator(n=mainName+'_subLoc'+str(j))[0] cmds.scale(.1,.1,.1,subLoc) subLocL.append(subLoc); jntL.append(jnt); jntGL.append(jntG); infoL.append(info) cmds.connectAttr(attachJointCurve+'.worldSpace[0]', info+'.inputCurve') cmds.pointConstraint(subLoc,jntG) normalCon = cmds.normalConstraint(normalBase,jntG,aim=up,u=aim,wut='vector')[0] cmds.connectAttr(info+'.tangent',normalCon+'.wu') cmds.connectAttr(info+'.position',subLoc+'.translate') prRt = 0; sRt = 0; editP = 0 if posShp >= 0: sRt = posShp/num_jnt + 1 editP = (j/float(num_jnt-1))**sRt else: sRt = 1-posShp/num_jnt editP = 1-abs(j/float(num_jnt-1)-1)**sRt import maya.mel as mel prRt = mel.eval( 'linstep(0,1,%s)' % editP ) * (num_jnt-1) cmds.setAttr(info+'.parameter', prRt/(num_jnt-1)) else: for j in range(num_jnt): cmds.select(d=1) jnt = cmds.joint(rad = 2, n=mainName+'_cuJoint'+str(j)) cmds.setAttr(jnt+'.dla',1) cmds.addAttr(jnt,ln='infoPos',sn='ip',at='double',min=0,max=num_jnt-1,dv=j) cmds.setAttr(jnt+'.ip',e=1,k=1) jntG = cmds.group(jnt,n=jnt+'_p') info = cmds.createNode('pointOnCurveInfo', n=mainName+'_info'+str(j)) pntInfo = cmds.createNode('pointOnCurveInfo', n=mainName+'_pntInfo'+str(j)) cmds.setAttr(info+'.top', 1) subLoc = cmds.spaceLocator(n=mainName+'_subLoc'+str(j))[0]; cmds.scale(.1,.1,.1,subLoc) jntPntChild = cmds.spaceLocator(n=mainName+'_pntChild'+str(j))[0] jntPnt = cmds.group(n=mainName+'_jntPnt'+str(j)); pntRot= cmds.createNode('plusMinusAverage', n=mainName+'_pntRot'+str(j)) cmds.connectAttr(jntPntChild+'.rotate', pntRot+'.input3D[0]') subLocL.append(subLoc); jntL.append(jnt); jntGL.append(jntG); infoL.append(info) jntPntChildL.append(jntPntChild); jntPntL.append(jntPnt); pntInfoL.append(pntInfo); pntRotL.append(pntRot) cmds.connectAttr(startHair+'.worldSpace[0]', pntInfo+'.inputCurve') cmds.connectAttr(attachJointCurve+'.worldSpace[0]', info+'.inputCurve') cmds.pointConstraint(subLoc,jntG) normalCon = cmds.normalConstraint(normalBase,jntPntChild,aim=up,u=aim,wut='vector')[0] cmds.connectAttr(pntInfo+'.tangent',normalCon+'.wu') cmds.connectAttr(info+'.position',subLoc+'.translate') cmds.connectAttr(pntInfo+'.position', jntPnt+'.translate') prRt = 0; sRt = 0; editP = 0 if posShp >= 0: sRt = posShp/num_jnt + 1 editP = (j/float(num_jnt-1))**sRt else: sRt = 1-posShp/num_jnt editP = 1-abs(j/float(num_jnt-1)-1)**sRt import maya.mel as mel prRt = mel.eval( 'linstep(0,1,%s)' % editP ) * (num_jnt-1) cmds.setAttr(info+'.parameter', prRt/(num_jnt-1)) cmds.setAttr(pntInfo+'.parameter', prRt/(num_jnt-1)) normalCon = cmds.normalConstraint(normalBase,jntGL[0],aim=up,u=aim,wut='vector')[0] jntPntNormalCon = cmds.normalConstraint(normalBase,jntPntL[0],aim=up,u=aim,wut='vector')[0] cmds.connectAttr(infoL[0]+'.tangent',normalCon+'.wu') cmds.connectAttr(pntInfoL[0]+'.tangent',jntPntNormalCon+'.wu') for j in range(1,num_jnt): cmds.tangentConstraint(attachJointCurve,jntGL[j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=jntGL[j-1]) cmds.tangentConstraint(startHair,jntPntL[j],aim=aim,u=up,wu=up,wut='objectrotation',wuo=jntPntL[j-1]) if len(completeList) < len(jntL)*num_crv: completeList.extend(jntL) #------------- Out joint list #--------------- Grouping subLocG = cmds.group(subLocL,n=subLocL[0]) deformGrp = cmds.group(attachJointCurve,bindCurve,normalBase,subLocG, n=mainName+'_deformGrp') cmds.setAttr(deformGrp+'.v', 0 ) transformGrp = cmds.group(em=1, n=mainName+'_trGrp') parentCon = cmds.parentConstraint(conJoint[0],transformGrp )[0] cmds.delete(parentCon) cmds.parent(jntGL,conJoint[0],transformGrp) #------------ Grouping in hairSystem if hairSys_on != 0: print hairSystem jntPntG = cmds.group(jntPntL, n=mainName+'_jntPntG') cmds.parent(jntPntG,deformGrp) #-------------- Attribute Setting conJointFirst = conJoint[0] conJointSecond = conJoint[1]; cmds.setAttr(conJointSecond+'.template', 1) conJointFirst_sliding = conJointFirst + '.sliding' conJointFirst_length = conJointFirst + '.scale_length' if sliding == 1: cmds.addAttr(conJointFirst,ln='sliding',at='double') cmds.setAttr(conJointFirst_sliding,e=1,k=1) if length == 1: cmds.addAttr(conJointFirst,ln='scale_length',at='double',min=0,max=num_jnt,dv=num_jnt) cmds.setAttr(conJointFirst_length,e=1,k=1) #----------- Set Expression String exString = 'float $ip[];\n\n' for k in range(num_jnt): exString += '$ip[%s] = %s/%s;\n' % (k, jntL[k]+'.infoPos',num_jnt-1) exString += '\n' if length == 1: exString += 'float $numJnt = %s;\n' % num_jnt exString += 'float $length = %s/%s;\n\n' % (conJointFirst_length, num_jnt) if sliding == 1: exString += 'float $ep[];\n' exString += 'float $sliding = %s;\n' % conJointFirst_sliding exString += 'float $sRate;\n\n' exString += 'if($sliding >= 0)\n{\n' exString += '$sRate=$sliding/%s+1;\n' % num_jnt for k in range(num_jnt): exString += '$ep[%s] = pow($ip[%s],$sRate);\n' % (k,k) exString += '}\nelse\n{\n' exString += '$sRate= 1 - $sliding/%s;\n' % num_jnt for k in range(num_jnt): exString += '$ep[%s] = 1-pow(1-$ip[%s],$sRate);\n' % (k,k) exString += '}\n\n' if length == 1 and sliding == 1: for k in range(num_jnt): exString += '%s.parameter = linstep(0,1,$ep[%s])*$length;\n' % (infoL[k], k) elif length == 1: for k in range(num_jnt): exString += '%s.parameter = $ip[%s]*$length;\n' % (infoL[k], k) elif sliding == 1: for k in range(num_jnt): exString += '%s.parameter = linstep(0,1,$ep[%s]);\n' % (infoL[k], k) else: for k in range(num_jnt): exString += '%s.parameter = $ip[%s];\n' % (infoL[k], k) cmds.expression(s=exString,n=mainName+'_ex') #--------- expression #-------------- Twist Attr Adding if hairSys_on != 0: if twist == 0: for j in range(num_jnt): cmds.connectAttr(pntRotL[j]+'.output3D', jntL[j]+'.jo') if twist == 1: cmds.addAttr(conJointFirst,ln='twist',at='double') cmds.setAttr(conJointFirst+'.twist',e=1,k=1) for j in range(num_jnt): cmds.addAttr(jntL[j],ln='twistDetail',at='double',dv=j/float(num_jnt-1)*10) cmds.setAttr(jntL[j]+'.twistDetail',e=1,k=1) twistMult = cmds.createNode('multiplyDivide',n= jntL[j]+'_twistMult') cmds.connectAttr(conJointFirst+'.twist', twistMult+'.input1X') cmds.connectAttr(jntL[j]+'.twistDetail', twistMult+'.input2X') rAxis = '.jo' if aim[0] == 1 or aim[0] == -1:rAxis += 'x' if aim[1] == 1 or aim[1] == -1:rAxis += 'y' if aim[2] == 1 or aim[2] == -1:rAxis += 'z' if hairSys_on == 0: cmds.connectAttr(twistMult+'.outputX', jntL[j]+rAxis) else: cmds.connectAttr(twistMult+'.outputX', pntRotL[j]+'.input3D[1].input3D%s' % (rAxis.replace('.jo','')) ) cmds.connectAttr(pntRotL[j]+'.output3D', jntL[j]+'.jo') #-------------- Add Controler ctrer = []; ctrGG = []; ctrSubLocG = []; getPosShp = '' curveSh = cmds.listRelatives(bindCurve,s=1)[0] exString_in ='' for j in range(num_ctr): ctrer.append( cmds.circle(n=mainName+'_ctr'+str(j),normal=aim)[0] ) cmds.addAttr( ctrer[j], ln='rollS', at='double', min=0,max=num_jnt,dv= num_jnt/2.0) cmds.setAttr( ctrer[j]+'.rollS', e=1,k=1) cmds.addAttr( ctrer[j], ln='rollE', at='double', min=0,max=num_jnt,dv=j*num_jnt/float(num_ctr)) cmds.setAttr( ctrer[j]+'.rollE', e=1,k=1) ctrG = cmds.group( ctrer[j], n = mainName+'ctrG'+str(j) ) info = cmds.createNode('pointOnCurveInfo', n=bindCurve+'_info'+str(j)) cmds.setAttr(info+'.top',1) cmds.connectAttr( curveSh+'.worldSpace[0]', info+'.inputCurve') cmds.connectAttr( info+'.position', ctrG+'.translate') mult = cmds.createNode( 'multiplyDivide', n= mainName+'_ctr_posMult'+str(j) ) cmds.connectAttr( ctrer[j]+'.rollE', mult+'.input1X') cmds.setAttr( mult+'.input2X', 1.0/len(conJoint) ) cmds.connectAttr( mult+'.outputX',info+'.parameter' ) subLoc = cmds.spaceLocator( n=mainName+'_ctr_subLoc'+str(j) )[0] cmds.connectAttr( info+'.position', subLoc+'.translate' ) cmds.pointConstraint( subLoc, ctrG ) normalCon = cmds.normalConstraint( normalBase,ctrG,aim=up,u=aim,wut='vector' )[0] cmds.connectAttr( info+'.tangent', normalCon+'.wu') ctrGG.append(ctrG); ctrSubLocG.append(subLoc) if len(ctrGG) != 0: cmds.parent(ctrGG,transformGrp) if len(ctrSubLocG) != 0: cmds.parent(ctrSubLocG,deformGrp) exString = '' rotDirection = '' for j in range(3): if aim[j] == -1: rotDirection = '-1*' for j in range(len(ctrer)): exString += 'float $rollE%s = %s.rollE;\n' % (j, ctrer[j]) exString += 'float $rollS%s = %s.rollS + $rollE%s;\n' % (j, ctrer[j], j) exString += 'int $irolE%s = $rollE%s;\n' % (j,j) exString += 'int $irolS%s = $rollS%s;\n' % (j,j) exString += 'float $rolev%s = $rollE%s - $irolE%s;\n' % (j,j,j) exString += 'float $rolsv%s = $rollS%s - $irolS%s;\n\n' % (j,j,j) exString += 'float $rx%s = %s%s.rotateX;\n' % (j, rotDirection, ctrer[j]) exString += 'float $ry%s = %s%s.rotateY;\n' % (j, rotDirection, ctrer[j]) exString += 'float $rz%s = %s%s.rotateZ;\n\n' % (j, rotDirection, ctrer[j]) exString += 'float $outRate%s[];\n\n' % j exString += 'int $num_jnt%s = %s;\n\n' % (j,len(conJoint)) exString += 'for($i = 0; $i < $num_jnt%s; $i++)\n{\n' % j exString += ' if($rollE%s > $i)\n $outRate%s[$i] = 0;' % (j,j) exString += ' if($rollE%s > $i && $rollE%s < $i+1)\n $outRate%s[$i] = 1-$rolev%s;\n' % (j,j,j,j) exString += ' if($rollE%s <= $i)\n $outRate%s[$i] = 1;\n\n' % (j,j) exString += ' if($rollS%s > $i)\n $outRate%s[$i] *= 1;\n' % (j,j) exString += ' if($rollS%s > $i && $rollS%s < $i+1)\n $outRate%s[$i] *= $rolsv%s;\n' % (j,j,j,j) exString += ' if($rollS%s <= $i)\n $outRate%s[$i] *= 0;\n}\n\n' % (j,j) rotList = ['rx','ry','rz'] for rot in rotList: for j in range(len(conJoint)): ra = rot.replace('r','ra') exString += '%s.%s = ' % (conJoint[j],ra) for k in range(len(ctrer)): if k == len(ctrer)-1: exString += '%s*$outRate%s[%s]*$%s%s;\n' % (aim[0]+aim[1]+aim[2],k,j,rot,k) else: exString += '%s*$outRate%s[%s]*$%s%s+' % (aim[0]+aim[1]+aim[2],k,j,rot,k) exString+= '\n' if len(ctrer) != 0: cmds.expression(s=exString, name = mainName+'_ctrEx') cmds.select(cl=1)
def polyExtrudeEdge(*args, **kwargs): res = cmds.polyExtrudeEdge(*args, **kwargs) if not kwargs.get('query', kwargs.get('q', False)): res = _factories.maybeConvert(res, _general.PyNode) return res