def pickWalkHairCtrl(d='right', add=False): '''Pick Walk and hide Controls''' sel = pm.selected() hairInfoAll = selHair(returnInfo=True) pm.setToolTo(pm.context.manipMoveContext()) if not hairInfoAll: return ToggleHairCtrlVis(state='hide') if d == 'up': pm.select([h[0][0] for h in hairInfoAll]) selHair() for o in pm.selected(): o.show() elif d == 'down': pm.select([h[0][0] for h in hairInfoAll]) selHair(selectTip=True) for o in pm.selected(): o.show() else: ctrlGroups = [h[1] for h in hairInfoAll] for ob in sel: ctrls = ctrlGroups[sel.index(ob)].listRelatives( type=pm.nt.Transform) if ctrls.count(ob): for c in ctrls: c.show() pm.select(ob, add=1) else: selHair(selectTip=True) if d == 'left': pm.pickWalk(d='right') for c in ctrls: c.show() pm.pickWalk(d=d)
def loc_edgeLoop(): sel = pm.ls(sl=True,fl=True) index=1 for obj in sel: transform = obj if isinstance(obj,pm.MeshEdge): transform = obj.node().getParent() pm.polySelect(transform,elb=obj.indices()[0]) edgeLoop=pm.ls(sl=True) pm.language.melGlobals.initVar( 'string', 'gMove' ) pm.setToolTo(pm.language.melGlobals['gMove']) moveManip = pm.manipMoveContext('Move', q=True,p=True) grpName = transform+'_ELP_LOC_GRP' if pm.objExists(grpName): elp_grp=pm.PyNode(grpName) print 'addingIndex' index+=1 else: print 'removing index' index=1 elp_grp = pm.group(em=True,n=grpName) locName=transform+'_'+str(index)+'_LOC' loc = pm.spaceLocator(n=locName) loc.translate.set(moveManip) loc.setParent(elp_grp) pm.select(edgeLoop, r=True)
def __init__(self, myface) : self.myface = myface self.base = pm.PyNode(self.myface.name) self.cur = myface.curve # 口角の位置に球を生成 self.pinIndexList = myface.parts_vertex[myface.context_parts] self.paramList = myface.param_list self.constPinIndexList = self.pinIndexList self.mouthcorner_pos = [pm.pointPosition(self.base.vtx[i]) for i in [self.pinIndexList[0], self.pinIndexList[5]]] self.curve_corner_pos = curvetool.getCurvePoint(self.cur, [self.paramList[0],self.paramList[5]]) self.reflesh_viewer() self.ctx = "paramSetCtx" self.make_my_drag_context() self.paramProgress = 0.0 self.paramProgress_befor = 0.0 # 現在何番目のピンを操作しているのか self.no_of_editing_pin = 0 self.no_of_editing_pin_max = 1 pm.setToolTo(self.ctx)
def installModule(self, module, *args): #1. Create Unique Module Name: name = BlueprintModuleName__UserSpecifiedName:objectName basename = "instance_" pm.namespace(setNamespace=":") namespace = pm.namespaceInfo(listOnlyNamespaces=True) #1a. search existing namespaces for all that have __UserSpecifiedName for i in range(len(namespace)): #index of first occurence, find __, if found if namespace[i].find("__") != -1: namespace[i] = namespace[i].partition("__")[2] #1b. create unique UserSpecifiedName (get hightest digit that exists and add 1) newSuffix = utils.findHeighestTrailingNumber(namespace, basename) + 1 userSpecName = basename + str(newSuffix) #import module mod = __import__("Blueprint." + module, {}, {}, [module]) reload(mod) #create class reference from string (without ()) moduleClass = getattr(mod, mod.CLASS_NAME) #with class reference, call constructor and istall method of this module moduleInstance = moduleClass(userSpecName) moduleInstance.install() moduleTransform = mod.CLASS_NAME + "__" + userSpecName + ":module_transform" pm.select(moduleTransform, replace=True) pm.setToolTo("moveSuperContext")
def splitHairCtrl(d='up'): '''add Hair Controls''' sel = pm.selected() if not sel: return directionDict = {'up': 1, 'down': -1} if not directionDict.has_key(d): return hairInfoAll = selHair(returnInfo=True) if not hairInfoAll: return #print hairInfo[0][0] #print hairInfo for selOb in sel: pm.select(selOb, r=1) hairInfo = hairInfoAll[sel.index(selOb)] ctrls = hairInfo[1].listRelatives(type=pm.nt.Transform) hair = hairInfo[0][0] for ctrl in ctrls: pm.rename(ctrl, '_'.join([ctrl.name(), "old"])) ctrlID = ctrls.index(selOb) if ctrlID == 0: directionDict[d] = 1 elif ctrlID == (len(ctrls) - 1): directionDict[d] = -1 newCtrl = pm.duplicate(ctrls[ctrlID])[0] pm.move( newCtrl, (ctrls[ctrlID].getTranslation(space='world') + ctrls[ctrlID + directionDict[d]].getTranslation(space='world')) / 2, a=1, ws=1) pm.scale(newCtrl, (ctrls[ctrlID].attr('scale').get() + ctrls[ctrlID + directionDict[d]].attr('scale').get()) / 2, a=1) ctrls.insert(ctrlID + (directionDict[d] + 1) / 2, newCtrl) for ctrl in ctrls: pm.rename( ctrl, '_'.join( [ctrl.name().split('_')[0], str(ctrls.index(ctrl) + 1)])) pm.parent(ctrl, w=1) pm.parent(ctrl, hairInfo[1]) oldname = hair.name() oldParent = hair.getParent() curMaterial = hair.getShape().listConnections( type=pm.nodetypes.ShadingEngine)[0].name() pm.rename(hair, '_'.join([oldname, 'old'])) newHair = createHairMesh(ctrls, name=oldname, mat=curMaterial, lengthDivs=hair.attr('lengthDivisions').get(), widthDivs=hair.attr('widthDivisions').get()) pm.parent(newHair[0], oldParent) pm.delete(hair) pm.select(newCtrl) pm.setToolTo('moveSuperContext')
def selectNextItem(self): ''' ''' if self.txt_jntCurrent.getLabel() == 'Select mouth lips loop': self.txt_jntCurrent.setLabel('Select left eyelid loop') fullRefPath = self.imageRefPath + "LT_eyeLidLoop.jpg" pm.image(self.img_jntReference, image=fullRefPath, e=True) # assign selection to placement_grp attr sel = pm.ls(sl=True, fl=True) self.placementGrp.addAttr('mouthLipsLoop', dt='stringArray') self.placementGrp.attr('mouthLipsLoop').set(len(sel), *sel, type='stringArray') pm.select(cl=True) placementGrp.addMouthLoopPlacements(self.placementGrp) elif self.txt_jntCurrent.getLabel() == 'Select left eyelid loop': # READY! self.txt_jntCurrent.setLabel('Ready to Build!') fullRefPath = self.imageRefPath + "default.jpg" pm.image(self.img_jntReference, image=fullRefPath, e=True) self.btn_jntScrollRt.setEnable(False) self.btn_updateLocs.setEnable(True) self.btn_buildRig.setEnable(True) pm.setToolTo('selectSuperContext') # assign selection to placement_grp attr sel = pm.ls(sl=True, fl=True) self.placementGrp.addAttr('leftEyelidLoop', dt='stringArray') self.placementGrp.attr('leftEyelidLoop').set(len(sel), *sel, type='stringArray') placementGrp.addEyeLoopPlacements(self.placementGrp) # override for mathilda # placementGrp.addEyeLoopPlacements(self.placementGrp, [23,15,9,3]) # mathilda_override # pm.PyNode('LT_innerUpper_eyelid_pLoc').cv_id.set(18) placementGrp.addIndependentPlacers(self.placementGrp, self.indMapping) # align jaw pLoc cons = mc.aimConstraint('CT__mouthMover_pLoc', 'CT__jaw_pLoc', aim=[0, 0, 1], u=[1, 0, 0], wu=[1, 0, 0]) mc.delete(cons) pm.selectMode(object=True) mel.setObjectPickMask("Surface", False) placementGrp.snapPlacementsToMesh(self.placementGrp) placementGrp.mirrorAllPlacements(self.placementGrp) placementGrp.orientAllPlacements(self.placementGrp)
def editJointPivotTool(self): objs = pm.selected() pm.selectMode(co=True) pm.selectType(ra=True) pm.select(objs[0].rotateAxis, r=True) rotateCtx = pm.manipRotateContext(psc=pm.Callback(self.editJointPivotExit, objs)) pm.setToolTo(rotateCtx)
def runContext(self): """ Set maya tool to this context """ if pm.draggerContext(self.context, exists=True): pm.setToolTo(self.context) self.nextJoint()
def decorated_function(*args, **kwargs): currenttool = pm.currentCtx() selecttool = pm.melGlobals['gSelect'] if currenttool != selecttool: pm.setToolTo(selecttool) function(*args, **kwargs) pm.setToolTo(currenttool) else: function(*args, **kwargs)
def exitContext(self): ''' ''' pm.select(cl=True) pm.setToolTo('polySelectContext') fullRefPath = self.ui.imageRefPath + "CT__mouthLipLoop.jpg" pm.image(self.ui.img_jntReference, image=fullRefPath, e=True) self.ui.txt_jntCurrent.setLabel('Select mouth lips loop')
def addPointsToRiver( self, river ): ctxName = "CurveAddPtCtx" pm.select( river , r=True ) if pm.contextInfo(ctxName, ex=True) is False: ctx = pm.curveAddPtCtx("CurveAddPtCtx") print ctx else: ctx = ctxName pm.setToolTo(ctx)
def ShowUI(self): self.FindSelectionToGroup() if len(self.objectsToGroup) == 0: return self.UIElements = {} if pm.window("groupSelected_UI_window", exists = True): pm.deleteUI("groupSelected_UI_window") windowWidth = 300 windowHeight = 150 self.UIElements["window"] = pm.window("groupSelected_UI_window", width = windowWidth, height = windowHeight, title = "Group Selected", sizeable = False) self.UIElements["topLevelColumn"] = pm.columnLayout(adjustableColumn = True, columnAlign = 'center', rowSpacing = 3) self.UIElements["groupName_rowColumn"] = pm.rowColumnLayout(numberOfColumns = 2, columnAttach = (1, 'right', 0), columnWidth = [(1, 80), (2, windowWidth - 90)], parent = self.UIElements["topLevelColumn"]) pm.text(label = "Group Name: ", parent = self.UIElements["groupName_rowColumn"]) self.UIElements["groupName"] = pm.textField(text = "group", parent = self.UIElements["groupName_rowColumn"]) self.UIElements["createAt_rowColumn"] = pm.rowColumnLayout(numberOfColumns = 3, rowOffset = [(1, 'top', 2), (2, 'both', 2), (3, 'both', 2)], columnWidth = [(1, 80), (2, windowWidth - 170), (3, 80)], parent = self.UIElements["topLevelColumn"]) pm.text(label = "Position at: ", parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) self.UIElements["createAt_lastSelected"] = pm.button(label = "Last Selected", command = self.CreateAtLastSelected, parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) self.UIElements["createAt_averagePosition"] = pm.button(label = "Average Position", command = self.CreateAtAveragePosition, parent = self.UIElements["createAt_rowColumn"]) pm.text(label = '', parent = self.UIElements["createAt_rowColumn"]) pm.separator(style = 'in', parent = self.UIElements["topLevelColumn"]) columnWidth = (windowWidth / 2) - 5 self.UIElements["button_row"] = pm.rowLayout(numberOfColumns = 2, columnWidth = [(1, columnWidth), (2, columnWidth)], columnAttach = [(1, 'both', 10), (2, 'both', 10)], columnAlign = [(1, 'center'), (2, 'center')], parent = self.UIElements["topLevelColumn"]) pm.button(label = "Accept", command = self.AcceptWindow, parent = self.UIElements["button_row"]) pm.button(label = "Cancel", command = self.CancelWindow, parent = self.UIElements["button_row"]) pm.showWindow(self.UIElements["window"]) self.CreateTemporaryGroupRepresentation() self.CreateAtAveragePosition() pm.select(self.tempGroupTransform, replace = True) pm.setToolTo("moveSuperContext")
def ForceSceneUpdate(): # Select objects in scene with move tool to force an update pm.setToolTo("moveSuperContext") nodes = pm.ls() for node in nodes: pm.select(node, replace = True) pm.select(clear = True) pm.setToolTo("selectSuperContext")
def RotPro(menu1, menu2, rotationDict, *args): print 'ran' buttons = pm.radioCollection(menu2, q=True, sl=True) rtype = pm.radioButton(buttons, q=True, label=True) type = menu1.getValue() axis = rotationDict[rtype][0] mod = rotationDict[rtype][1] print type, axis, mod modx = 0 mody = 0 modz = 0 faces = '' rotationamount = mod if axis == 'x': modx = rotationamount print 'modx', modx if axis == 'y': mody = rotationamount if axis == 'z': modz = rotationamount selected = pm.ls(sl=True) if (len(selected) < 1): pm.informBox(title='Object Selection Error', message='Please Select a Single Object', ok='Ok') return try: shape = selected[0].getChildren() faces = shape[0].f[0:] except: try: faces = selected except: pm.informBox(title='Object Selection Error', message='Please Select a valid Object', ok='Ok') return projection = pm.polyProjection(faces, rx=modx, ry=mody, rz=modz, type=type, ibd=True, sf=True)[0] print projection pm.select(d=True) pm.select(projection, r=True) pm.setToolTo('ShowManips') pm.showManipCtx() pm.ShowManipulators()
def __init__( self, cur , # nt.Transform("name") base, # str myface, pinIndexList = [], paramList = [], prePos = 0, blender = 0, alpha = 0 ): self.pinIndexList = pinIndexList self.paramList = paramList self.cur = cur self.base_name = base self.base_transform = pm.PyNode(self.base_name) self.ctx = "paramSetCtx" self.paramProgress = 0.0 self.paramProgress_befor = 0.0 self.myface = myface self.prePos = prePos self.blender = blender self.alpha = alpha self.constParamList = paramList self.constPinIndexList = pinIndexList #self.constPinIt = 0 # 現在何番目のピンを操作しているのか self.no_of_editing_pin = 0 self.no_of_editing_pin_max = len(pinIndexList) #self.initialization() self.make_param_set_cmd() pm.setToolTo(self.ctx) self.make_ui() self.update_field(pinIndexList,paramList) # 現在の口のラインを作成 self.sph_befor_move = [0] self.meke_mouth_line() """ pm.select(self.base_name) pm.mel.doMenuComponentSelectionExt("base", "vertex", 1) pm.setToolTo("selectSuperContext") """ pm.hilite(self.cur)
def snap_eye_ctl(): ''' snap eye Control to end Bone Position ''' for dir in ['Left','Right']: eye_endbone = ul.get_node('eye%sEnd_bon'%dir) eye_ctl = ul.get_node('eye%s_frmGp'%dir) pm.select(eye_ctl,r=True) pm.setToolTo('moveSuperContext') mm.eval('BakeCustomPivot;') eye_endbone_pos = eye_endbone.getTranslation(space='world') eye_ctl_pos = eye_ctl.getTranslation(space='world') eye_ctl.setTranslation((eye_endbone_pos[0],eye_endbone_pos[1],eye_ctl_pos[2]), space='world')
def selectNextItem(self): ''' ''' if self.txt_jntCurrent.getLabel() == 'Select mouth lips loop': self.txt_jntCurrent.setLabel('Select left eyelid loop') fullRefPath = self.imageRefPath + "LT_eyeLidLoop.jpg" pm.image(self.img_jntReference, image=fullRefPath, e=True) # assign selection to placement_grp attr sel = pm.ls(sl=True, fl=True) self.placementGrp.addAttr('mouthLipsLoop', dt='stringArray') self.placementGrp.attr('mouthLipsLoop').set(len(sel), *sel, type='stringArray') pm.select(cl=True) placementGrp.addMouthLoopPlacements(self.placementGrp) elif self.txt_jntCurrent.getLabel() == 'Select left eyelid loop': # READY! self.txt_jntCurrent.setLabel('Ready to Build!') fullRefPath = self.imageRefPath + "default.jpg" pm.image(self.img_jntReference, image=fullRefPath, e=True) self.btn_jntScrollRt.setEnable(False) self.btn_updateLocs.setEnable(True) self.btn_buildRig.setEnable(True) pm.setToolTo('selectSuperContext') # assign selection to placement_grp attr sel = pm.ls(sl=True, fl=True) self.placementGrp.addAttr('leftEyelidLoop', dt='stringArray') self.placementGrp.attr('leftEyelidLoop').set(len(sel), *sel, type='stringArray') placementGrp.addEyeLoopPlacements(self.placementGrp) # override for mathilda # placementGrp.addEyeLoopPlacements(self.placementGrp, [23,15,9,3]) # mathilda_override # pm.PyNode('LT_innerUpper_eyelid_pLoc').cv_id.set(18) placementGrp.addIndependentPlacers(self.placementGrp, self.indMapping) # align jaw pLoc cons = mc.aimConstraint('CT__mouthMover_pLoc', 'CT__jaw_pLoc', aim=[0,0,1], u=[1,0,0], wu=[1,0,0]) mc.delete(cons) pm.selectMode(object=True) mel.setObjectPickMask("Surface", False) placementGrp.snapPlacementsToMesh(self.placementGrp) placementGrp.mirrorAllPlacements(self.placementGrp) placementGrp.orientAllPlacements(self.placementGrp)
def set_symmetry_axis_and_activate_symmetry_brush(): selection = pm.ls(sl=True) # Convert the selection to UVs. uvs = pm.polyListComponentConversion(selection, ff=True, fuv=True, fe=True, fvf=True, tuv=True) if uvs: set_symmetry_axis(uvs) pm.setToolTo('texSymmetrizeUVContext')
def getPosition(transform): """ Gets position of move manipulator where control is. Args: transform (string): name of object to get position from. Returns: (list): [x, y, z], world position of object in three coordinates. """ pm.select(transform) pm.setToolTo('Move') pos = pm.manipMoveContext('Move', q=1, p=1) pm.select(clear=True) return pos
def tear_face(self): sel = pm.selected() movetool = pm.melGlobals['gMove'] if all(isinstance(i, pm.MeshFace) for i in sel): if len(sel) == 1: pm.polyMapCut(sel) sel = pm.polyListComponentConversion(sel, ff=True, tuv=True) pm.select(sel) else: sewSel = pm.polyListComponentConversion(ff=True, te=True, internal=True) pm.polyMapCut(sel) pm.polyMapSewMove(sewSel, nf=10, lps=0, ch=1) sel = pm.polyListComponentConversion(sel, ff=True, tuv=True) pm.select(sel) pm.setToolTo(movetool)
def getManipulatorPosition(transform): """ Gets position of move manipulator where control is. Args: transform (string, PyNode, list, tuple, or set): Name of object(s) to get position from. Returns: (list): [x, y, z], World position of object in three coordinates. """ pm.select(transform) pm.setToolTo('Move') position = pm.manipMoveContext('Move', q=1, p=1) pm.select(clear=True) return position
def add_pin(self, *args) : print "- - - Add pins - - -" index = self.no_of_editing_pin slls = pm.ls(sl = 1, fl = 1) if len(slls) == 1 and str(type(slls[0])) == "<class 'pymel.core.general.MeshVertex'>" : self.pinIndexList.insert(index, slls[0].index()) self.paramList.insert(index, 0.0) # 対応点編集モードへ pm.setToolTo(self.ctx) self.next_pin() self.update_field(self.pinIndexList,self.paramList) else : print "頂点を1つだけ選択してください"
def apply_greasepencil(filename, clear_existing_frames=False): import pymel.core as pm ctxName = 'syncSketchGreasePencil' # create grease pencil if it doesn't exist if not pm.greasePencilCtx(ctxName, exists=True): ctx = pm.greasePencilCtx(ctxName) pm.setToolTo(ctx) else: nodeNames = pm.greasePencilCtx(ctxName,sequenceNodeName=True, query=True) if nodeNames and clear_existing_frames: pm.delete(nodeNames) logger.info('Deleted Existing Greasepencil frames ...') active_panel = get_active_editor() cmds.modelEditor(active_panel, edit=True, greasePencils=True) pm.greasePencilCtx(ctxName, edit = True, importArchive = filename )
def placeSine(sineTool, cntrlList): tempGrp = pm.group(pm.parent(pm.duplicate(cntrlList), w=True)) pm.setToolTo('Move') pos = pm.manipMoveContext('Move', q=1, p=1) pm.delete(tempGrp) pm.select(clear=True) pm.move(sineTool, pos) distanceNum = getDistance(cntrlList[0], cntrlList[-1]) sineTool.scale.set([distanceNum, distanceNum, distanceNum]) pm.aimConstraint(cntrlList[-1], sineTool) pm.delete(pm.listRelatives(sineTool, type='aimConstraint')) return distanceNum
def _onRelease(self): ''' This is called when the tool is released. Here we'll remove our callback and cleanup everything. ''' # Remove the callback om.MMessage.removeCallback(self.callbackID) # Set the current tool to the move tool pmc.setToolTo('moveSuperContext') # Simplify the animation curves if self.simplify: for target in self.targets: pmc.filterCurve(target, f='simplify', startTime=self.startFrame, endTime=pmc.currentTime(q=True), timeTolerance=self.tolerance) # End the scrub pmc.timeControl(self.playbackSlider, edit=True, endScrub=True)
def weldVertContext(cls): ''' ''' if not pm.scriptCtx('vertWeldCustom', exists=True): weldVert = pm.scriptCtx( 'vertWeldCustom', t='Weld Verts', tss=1, fcs='weldVertCustom($Selection1)', esl=1, snp= 'Select a Vertex, click a second vertex to weld to, Hold CTRL to merge to middle', ssp= 'Click a second vertex to weld to, Hold CTRL to merge to middle', setDoneSelectionPrompt='Select only one vertex to start', sat=1, ssc=2, sac=1, pv=1, euc=0, tct='edit', ts=lambda *args: cls.weldVertexToolStart()) cls.weldVertexContextToolStart() pm.setToolTo(weldVert)
def setManipTool(self, toolType): if toolType == "translate": pm.setToolTo( 'moveSuperContext' ) elif toolType == "rotate": pm.setToolTo( 'RotateSuperContext' ) elif toolType == "scale": pm.setToolTo( 'scaleSuperContext' ) #mayaMainWindowPtr = omui.MQtUtil.mainWindow() #mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget) #import xsiPanel #from xsiPanel import xsiTransformPanel_maya #reload(xsiTransformPanel_maya) #view = xsiTransformPanel_maya.XsiTransformPanel_Maya("Transform", mayaMainWindow) #view.show()
def setManipTool(self, toolType): if toolType == "translate": pm.setToolTo('moveSuperContext') elif toolType == "rotate": pm.setToolTo('RotateSuperContext') elif toolType == "scale": pm.setToolTo('scaleSuperContext') #mayaMainWindowPtr = omui.MQtUtil.mainWindow() #mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget) #import xsiPanel #from xsiPanel import xsiTransformPanel_maya #reload(xsiTransformPanel_maya) #view = xsiTransformPanel_maya.XsiTransformPanel_Maya("Transform", mayaMainWindow) #view.show()
def CreateGroup(self, _groupName): fullGroupName = "Group__%s" %_groupName # Check for valid names if pm.objExists(fullGroupName): pm.confirmDialog(title = "Name Conflict", message = 'Group "%s" already exits.' %_groupName, button= "Accept", defaultButton = "Accept") return None groupTransform = pm.rename(self.tempGroupTransform, fullGroupName) # Create container for grouped objects groupContainer = "Group_container" if not pm.objExists(groupContainer): pm.container(name = groupContainer) # Store containers to be grouped in a list containers = [groupContainer] for obj in self.objectsToGroup: if obj.find("Group__") == 0: continue objNamespace = utils.StripLeadingNamespace(obj)[0] containers.append("%s:module_container" %objNamespace) # Unlock all grouped containers for c in containers: pm.lockNode(c, lock = False, lockUnpublished = False) if len(self.objectsToGroup) != 0: # Group objects temprorarily to simulate final heirarchy tempGroup = pm.group(self.objectsToGroup, absolute = True) groupParent = pm.listRelatives(tempGroup, parent = True) if groupParent != []: pm.parent(groupTransform, groupParent[0], absolute = True) pm.parent(self.objectsToGroup, groupTransform, absolute = True) pm.delete(tempGroup) self.AddGroupToContainer(groupTransform) # Lock all group containers for c in containers: pm.lockNode(c, lock = True, lockUnpublished = True) # Make sure the created group is selected pm.setToolTo("moveSuperContext") pm.select(groupTransform, replace = True) return groupTransform
def __enter__(self): # for safety, reset tool context pmc.setToolTo("selectSuperContext") pmc.undoInfo(openChunk=True)
def startTool(ctx) : [ pm.setAttr(w,0.0) for w in blender.w ] pm.setToolTo(ctx) tools.deltemp()
def weldVertContext(cls): ''' ''' if not pm.scriptCtx('vertWeldCustom', exists=True): weldVert = pm.scriptCtx('vertWeldCustom', t='Weld Verts', tss=1, fcs='weldVertCustom($Selection1)', esl=1, snp='Select a Vertex, click a second vertex to weld to, Hold CTRL to merge to middle', ssp='Click a second vertex to weld to, Hold CTRL to merge to middle', setDoneSelectionPrompt='Select only one vertex to start', sat=1, ssc=2, sac=1, pv=1, euc=0, tct='edit', ts=lambda *args: cls.weldVertexToolStart() ) cls.weldVertexContextToolStart() pm.setToolTo(weldVert)
def create(self, targets, sensitivity=1.0, timeScale=1.0, singleAxis=False, simplify=True, verticalControl=True, tolerance=0.05, inverted=False, framerate=24): # Set each of the tool settings self.targets = targets self.target = pmc.PyNode(self.targets[0].split('.')[0]) self.framerate = framerate self.sensitivity = sensitivity self.timeScale = timeScale self.singleAxis = singleAxis self.simplify = simplify self.verticalControl = verticalControl self.tolerance = tolerance self.playbackSlider = maya.mel.eval('$tmpVar=$gPlayBackSlider') self.inverted = inverted # Set up default input values self.lastInput = (0, 0, 0) self.input = 0 # Check if an existing dragger context exists, if so, delete it if (pmc.draggerContext(animSketchTool.contextname, exists=True)): pmc.deleteUI(animSketchTool.contextname) # Create the dragger context. This will create a new tool that watches for drag events if singleAxis: # Determine the cursor shape based on the direction if self.verticalControl: cursor = 'dolly' else: cursor = 'track' # Create the dragger context with the correct space and cursor shape pmc.draggerContext(animSketchTool.contextname, pressCommand=self._onPress, dragCommand=self._onDrag, cursor=cursor, releaseCommand=self._onRelease, undoMode='step', image1='/MotionBlur.png') else: # Create the dragger context with space set to 'world' pmc.draggerContext(animSketchTool.contextname, pressCommand=self._onPress, dragCommand=self._onDrag, cursor='hand', releaseCommand=self._onRelease, undoMode='step', image1='/MotionBlur.png', space='world') # Set the currentTool pmc.setToolTo(animSketchTool.contextname)
def unset(s): """ Set us back to the last tool """ if s.active: pmc.setToolTo(s.last_tool)
def hairJiggle( nodes=[], prefix='jiggle', stretchable=True ): ''' update : 2015-04-27 # # 마야에서 기본으로 같은 기능을 하는 MakeCurvesDynamic 스크립트가 있으나 # 리턴 값이 없어 사용이 불가 # pm.runtime.MakeCurvesDynamic('curve1') # # makeCurvesDynamic 2 { "0", "1", "0", "1", "0"}; # $args[0] = surfaceAttach If true then connect the hairs to a surface(also selected) basing the uv on the nearest point to the first curve cv # $args[1] = snapToSurface If true and attaching to a surface then also snap the curve to the surface. # $args[2] = matchPosition If true then make the input curve a degree one so resulting output curve exactly matches the position. # $args[3] = createOutCurves If true then output curves are created # $args[4] = createPfxHair If true then hair is created. # ''' if nodes: pm.select(nodes) # get joints joints = pm.ls(sl=True, type='joint') if not joints: raise # get hairSystem hairSystem=None hairSystems = pm.ls(sl=True, dag=True, type='hairSystem') if hairSystems: hairSystem = hairSystems[-1] # get nucleus nucleus=None nucleuss = pm.ls(sl=True, dag=True, type='nucleus') if nucleuss: nucleus = nucleuss[-1] # store current state currentToolMode = pm.currentCtx() pm.setToolTo( 'selectSuperContext' ) sel = pm.selected() # # nucleus # if not nucleus and not hairSystem: nucleus = pm.createNode( 'nucleus' ) nucleus.rename( prefix+'_nucleus' ) pm.PyNode('time1').outTime >> nucleus.currentTime # # hairSystem # hairSystemTr = None if hairSystem: hairSystemTr = hairSystem.getParent() else: hairSystem = pm.createNode( 'hairSystem' ) hairSystemTr = hairSystem.getParent() hairSystemTr.rename( prefix+'_hairSys' ) # 새로 생성된 헤어와 뉴클리어스 연결 << connectAttr nextAvailable플래그로 해결해보려했으나.. 복잡.. 멜을 사용하는게 제일 편함. #pm.PyNode('time1').outTime >> hairSystem.currentTime #hairSystem.currentState >> nucleus.inputActive[0] #hairSystem.startState >> nucleus.inputActiveStart[0] #nucleus.outputObjects[0] >> hairSystem.nextState #nucleus.startFrame >> hairSystem.startFrame # 새로 생성된 헤어와 뉴클리어스 연결 pm.mel.assignNSolver( nucleus ) # default Value hairSystem.active.set( True ) # # follicle 생성 # follicle = pm.createNode( 'follicle' ) follicleTr = follicle.getParent() follicleTr.rename( prefix+'_follicle' ) # follicle 위치조정 pm.delete( pm.pointConstraint( joints[0], follicleTr ) ) pm.delete( pm.orientConstraint( joints[0], follicleTr, offset=(0, 90, 0) ) ) # follicle이 조인트, parent를 따라가도록설정 # Start Joint의 Parent가 없으면 현재 Start에 페어런트 검. parent = joints[0].getParent() const = None if parent: const = pm.parentConstraint( parent, follicleTr, mo=True) else: const = pm.parentConstraint( joints[0], follicleTr, mo=True) # 기본값 follicle.restPose.set(1) # same as start follicle.startDirection.set(1) # start Curve base follicle.degree.set(2) follicle.clumpWidth.set(5) # 폴리클 디스플레이 크기 # # curve Setting # # startCurve 생성 startCurve = jntToCrv( joints, degree=3, ep=True ) startCurve.setParent( follicleTr ) startCurve.rename( prefix+'_startCurve' ) # outputCurve 생성 outputCurveShape = pm.createNode( 'nurbsCurve' ) outputCurve = outputCurveShape.getParent() outputCurve.rename( prefix+'_outputCurve' ) # # DG # settableNum = 0 while True: if hairSystem.inputHair[ settableNum ].isSettable(): break settableNum +=1 startCurve.getShape().worldSpace >> follicle.startPosition follicle.outHair >> hairSystem.inputHair[ settableNum ] hairSystem.outputHair[ settableNum ] >> follicle.currentPosition pm.connectAttr( follicle+'.outCurve', outputCurveShape+'.create' ) # follicle.outCurve >> outputCurveShape.create # 이부분에서 다음 경고 발생: Warning: pymel.core.general : Could not create desired MFn. Defaulting to MFnDagNode. # # # # ikHandle # HDL, EFF = pm.ikHandle( solver='ikSplineSolver', startJoint=joints[0], endEffector=joints[-1], createCurve=False, curve=outputCurveShape, parentCurve=False ) HDL.rename( prefix+'_HDL') EFF.rename( prefix+'_EFF') # # # 그루핑 # rigGrp = pm.group(n=prefix+'_jointChainRig_grp#',em=True) rigGrp.v.set(False) pm.parent(follicleTr, HDL, outputCurve, rigGrp) # # # 스트레치 세팅 # if stretchable: # # 커브 리빌드, 익스텐드 # rdbCrv, rbd = pm.rebuildCurve( outputCurveShape, ch=True, replaceOriginal=False, rebuildType=0, # uniform endKnots=1, # 0 - uniform end knots, 1 - multiple end knots keepRange=0, # 0 - reparameterize the resulting curve from 0 to 1, 1 - keep the original curve parameterization, 2 - reparameterize the result from 0 to number of spans keepControlPoints=False, keepEndPoints=True, keepTangents=True, spans=len(joints), degree=3, tol=0.001 ) # # Locators on Curve # unit = 1.0 / (len(joints)-1) locOnCrvs = [] for i in range(len(joints)): param = unit * i xformOnCrv = pm.spaceLocator( n='xformOnCrv#') xformOnCrv.addAttr( 'parameter', sn='pr', dv=param, keyable=True ) xformOnCrv.addAttr( 'turnOnPercentage', sn='top', dv=False, at='bool', keyable=True ) xformOnCrv.addAttr( 'revRotation', sn='rot', keyable=True ) xformOnCrv.it.set(False) xformOnCrv.rename( 'xformOnCrv%02d'%i ) pntOnCrv = pm.PyNode( pm.pointOnCurve( rdbCrv.getShape(), parameter=param, ch=True ) ) pntOnCrv.turnOnPercentage.set(True) pntOnCrv.setAttr('parameter', keyable=True) pntOnCrv.setAttr('turnOnPercentage', keyable=True) pntOnCrv.rename( xformOnCrv+'_POC' ) xformOnCrv.parameter >> pntOnCrv.parameter xformOnCrv.turnOnPercentage >> pntOnCrv.turnOnPercentage pntOnCrv.position >> xformOnCrv.t locOnCrvs.append(xformOnCrv) # # distance Rig # distNodes = [] for i in range(len(locOnCrvs)-1): dist = pm.createNode( 'distanceDimShape' ) locOnCrvs[i].worldPosition[0] >> dist.startPoint locOnCrvs[i+1].worldPosition[0] >> dist.endPoint distNodes.append( dist ) # # ik핸들 커브 변경 # pm.ikHandle( HDL, e=True, curve=rdbCrv ) # # connect To Joint # for dist, jnt in zip(distNodes, joints[1:]): dist.distance >> jnt.tx # # 그루핑 # pm.parent(rdbCrv, locOnCrvs, [dist.getParent() for dist in distNodes], rigGrp) # # # restore state # pm.setToolTo( currentToolMode ) if sel: pm.select(sel) else: pm.select(cl=True)
def set(s): """ Activate Tool """ pmc.setToolTo(s.name) # Set our tool to the active tool