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)