84 import maya.OpenMaya 
as OpenMaya
 
   85 import maya.OpenMayaMPx 
as OpenMayaMPx
 
   86 import maya.OpenMayaUI 
as OpenMayaUI
 
   89 kPluginCmdName=
"spMoveToolCmd" 
   90 kPluginCtxName=
"spMoveToolContext" 
   91 kVectorEpsilon = 1.0e-3
 
   96 kTrackingDictionary = {}
 
   99 class MoveToolCmd(OpenMayaMPx.MPxToolCommand):
 
  100     kDoIt, kUndoIt, kRedoIt = 0, 1, 2
 
  103         OpenMayaMPx.MPxToolCommand.__init__(self)
 
  104         self.setCommandString(kPluginCmdName)
 
  106         kTrackingDictionary[OpenMayaMPx.asHashable(self)] = self
 
  109         del kTrackingDictionary[OpenMayaMPx.asHashable(self)]
 
  111     def doIt(self, args):
 
  114         if args.length() == 1:
 
  115             vector.x = args.asDouble(0)
 
  116         elif args.length == 2:
 
  117             vector.x = args.asDouble(0)
 
  118             vector.y = args.asDouble(1)
 
  119         elif args.length == 3:
 
  120             vector.x = args.asDouble(0)
 
  121             vector.y = args.asDouble(1)
 
  122             vector.z = args.asDouble(2)
 
  123         self.__delta = vector
 
  124         self.__action(MoveToolCmd.kDoIt)
 
  127         self.__action(MoveToolCmd.kRedoIt)
 
  130         self.__action(MoveToolCmd.kUndoIt)
 
  132     def isUndoable(self):
 
  137         Command is finished, construct a string for the command 
  141         command.addArg(self.commandString())
 
  142         command.addArg(self.__delta.x)
 
  143         command.addArg(self.__delta.y)
 
  144         command.addArg(self.__delta.z)
 
  150             OpenMayaMPx.MPxToolCommand._doFinalize(self, command)
 
  154     def setVector(self, x, y, z):
 
  159     def __action(self, flag):
 
  161         Do the actual work here to move the objects by vector 
  163         if flag == MoveToolCmd.kUndoIt:
 
  164             vector = -self.__delta
 
  166             vector = self.__delta
 
  176         spc = OpenMaya.MSpace.kWorld
 
  180         while not sIter.isDone():
 
  183             sIter.getDagPath(mdagPath, mComponent)
 
  190                     transFn.translateBy(vector, spc)
 
  192                     sys.stderr.write(
"Error doing translate on transform\n")
 
  197                 cvFn = OpenMaya.MItCurveCV(mdagPath, mComponent)
 
  201                 while not cvFn.isDone():
 
  202                     cvFn.translateBy(vector, spc)
 
  212                 while not sCvFn.isDone():
 
  213                     while not CvFn.isRowDone():
 
  214                         sCvFn.translateBy(vector, spc)
 
  217                 sCvFn.updateSurface()
 
  224                 while not vtxFn.isDone():
 
  225                     vtxFn.translateBy(vector, spc)
 
  227                 vtxFn.updateSurface()
 
  232 class MoveContext(OpenMayaMPx.MPxSelectionContext):
 
  233     kTop, kFront, kSide, kPersp = 0, 1, 2, 3
 
  236         OpenMayaMPx.MPxSelectionContext.__init__(self)
 
  237         self._setTitleString(
"moveTool")
 
  238         self.setImage(
"moveTool.xpm", OpenMayaMPx.MPxContext.kImage1)
 
  241         self.__startPos_x = 0
 
  243         self.__startPos_y = 0
 
  247     def toolOnSetup(self, event):
 
  248         self._setHelpString(
"drag to move selected object")
 
  250     def doPress(self, event):
 
  251         OpenMayaMPx.MPxSelectionContext.doPress(self, event)
 
  252         spc = OpenMaya.MSpace.kWorld
 
  257         if not self._isSelecting():
 
  258             argX = OpenMaya.MScriptUtil(0)
 
  259             argXPtr = argX.asShortPtr()
 
  260             argY = OpenMaya.MScriptUtil(0)
 
  261             argYPtr = argY.asShortPtr()
 
  262             event.getPosition(argXPtr, argYPtr)
 
  263             self.__startPos_x = argX.getShort(argXPtr)
 
  264             self.__startPos_y = argY.getShort(argYPtr)
 
  268             self.__view.getCamera(camera)
 
  270             upDir = fnCamera.upDirection(spc)
 
  271             rightDir = fnCamera.rightDirection(spc)
 
  275             if fnCamera.isOrtho():
 
  276                 if upDir.isEquivalent(OpenMaya.MVector.zNegAxis, kVectorEpsilon):
 
  277                     self.__currWin = MoveContext.kTop
 
  278                 elif rightDir.isEquivalent(OpenMaya.MVector.xAxis, kVectorEpsilon):
 
  279                     self.__currWin = MoveContext.kFront
 
  281                     self.__currWin = MoveContext.kSide
 
  284                 self.__currWin = MoveContext.kPersp
 
  288             newCmd = self._newToolCommand()
 
  289             self.__cmd = kTrackingDictionary.get(OpenMayaMPx.asHashable(newCmd), 
None)
 
  290             self.__cmd.setVector(0.0, 0.0, 0.0)
 
  292     def doDrag(self, event):
 
  293         OpenMayaMPx.MPxSelectionContext.doDrag(self, event)
 
  299         if not self._isSelecting():
 
  300             argX = OpenMaya.MScriptUtil(0)
 
  301             argXPtr = argX.asShortPtr()
 
  302             argY = OpenMaya.MScriptUtil(0)
 
  303             argYPtr = argY.asShortPtr()
 
  304             event.getPosition(argXPtr, argYPtr)
 
  305             self.__endPos_x = argX.getShort(argXPtr)
 
  306             self.__endPos_y = argY.getShort(argYPtr)
 
  311             self.__view.viewToWorld(self.__startPos_x, self.__startPos_y, startW, vec)
 
  312             self.__view.viewToWorld(self.__endPos_x, self.__endPos_y, endW, vec)
 
  313             downButton = event.mouseButton()
 
  319             if self.__currWin == MoveContext.kTop:
 
  320                 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
 
  321                     self.__cmd.setVector(endW.x - startW.x, 0.0, 0.0)
 
  323                     self.__cmd.setVector(endW.x - startW.x, 0.0, endW.z - startW.z)
 
  325             elif self.__currWin == MoveContext.kFront:
 
  326                 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
 
  328                     self.__cmd.setVector(endW.x - startW.x, 0.0, 0.0)
 
  332                     self.__cmd.setVector(endW.x - startW.x, endW.y - startW.y, 0.0)
 
  334             elif self.__currWin == MoveContext.kSide:
 
  335                 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
 
  336                     self.__cmd.setVector(0.0, 0.0, endW.z - startW.z)
 
  338                     self.__cmd.setVector(0.0, endW.y - startW.y, endW.z - startW.z)
 
  341             self.__view.refresh(
True)
 
  343     def doRelease(self, event):
 
  344         OpenMayaMPx.MPxSelectionContext.doRelease(self, event)
 
  345         if not self._isSelecting():
 
  346             argX = OpenMaya.MScriptUtil(0)
 
  347             argXPtr = argX.asShortPtr()
 
  348             argY = OpenMaya.MScriptUtil(0)
 
  349             argYPtr = argY.asShortPtr()
 
  350             event.getPosition(argXPtr, argYPtr)
 
  351             self.__endPos_x = argX.getShort(argXPtr)
 
  352             self.__endPos_y = argY.getShort(argYPtr)
 
  359             if (math.fabs(self.__startPos_x - self.__endPos_x) < 2 
and  
  360                     math.fabs(self.__startPos_y - self.__endPos_y) < 2):
 
  362                 self.__view.refresh(
True)
 
  364                 self.__cmd.finalize()
 
  365                 self.__view.refresh(
True)
 
  367     def doEnterRegion(self, event):
 
  369         Print the tool description in the help line. 
  371         self._setHelpString(
"click on object and drag to move it")
 
  377 class MoveContextCommand(OpenMayaMPx.MPxContextCommand):
 
  379         OpenMayaMPx.MPxContextCommand.__init__(self)
 
  382         return OpenMayaMPx.asMPxPtr(MoveContext())
 
  385     return OpenMayaMPx.asMPxPtr(MoveToolCmd())
 
  388     return OpenMayaMPx.asMPxPtr(MoveContextCommand())
 
  392     syntax.addArg(OpenMaya.MSyntax.kDouble)
 
  393     syntax.addArg(OpenMaya.MSyntax.kDouble)
 
  394     syntax.addArg(OpenMaya.MSyntax.kDouble)
 
  399 def initializePlugin(mobject):
 
  400     mplugin = OpenMayaMPx.MFnPlugin(mobject, 
"Autodesk", 
"1.0", 
"Any")
 
  402         mplugin.registerContextCommand(kPluginCtxName, ctxCmdCreator, kPluginCmdName, cmdCreator, syntaxCreator)
 
  404         sys.stderr.write(
"Failed to register context command: %s\n" % kPluginCtxName)
 
  408 def uninitializePlugin(mobject):
 
  409     mplugin = OpenMayaMPx.MFnPlugin(mobject)
 
  411         mplugin.deregisterContextCommand(kPluginCtxName, kPluginCmdName)
 
  413         sys.stderr.write(
"Failed to deregister context command: %s\n" % kPluginCtxName)