66 import maya.OpenMaya
as OpenMaya
67 import maya.OpenMayaMPx
as OpenMayaMPx
68 import maya.OpenMayaUI
as OpenMayaUI
71 kPluginCmdName=
"spMoveToolCmd"
72 kPluginCtxName=
"spMoveToolContext"
73 kVectorEpsilon = 1.0e-3
78 kTrackingDictionary = {}
81 class MoveToolCmd(OpenMayaMPx.MPxToolCommand):
82 kDoIt, kUndoIt, kRedoIt = 0, 1, 2
85 OpenMayaMPx.MPxToolCommand.__init__(self)
86 self.setCommandString(kPluginCmdName)
87 self.__delta = OpenMaya.MVector()
88 kTrackingDictionary[OpenMayaMPx.asHashable(self)] = self
91 del kTrackingDictionary[OpenMayaMPx.asHashable(self)]
94 argData = OpenMaya.MArgDatabase(self.syntax(), args)
95 vector = OpenMaya.MVector(1.0, 0.0, 0.0)
96 if args.length() == 1:
97 vector.x = args.asDouble(0)
98 elif args.length == 2:
99 vector.x = args.asDouble(0)
100 vector.y = args.asDouble(1)
101 elif args.length == 3:
102 vector.x = args.asDouble(0)
103 vector.y = args.asDouble(1)
104 vector.z = args.asDouble(2)
105 self.__delta = vector
106 self.__action(MoveToolCmd.kDoIt)
109 self.__action(MoveToolCmd.kRedoIt)
112 self.__action(MoveToolCmd.kUndoIt)
114 def isUndoable(self):
119 Command is finished, construct a string for the command
122 command = OpenMaya.MArgList()
123 command.addArg(self.commandString())
124 command.addArg(self.__delta.x)
125 command.addArg(self.__delta.y)
126 command.addArg(self.__delta.z)
132 OpenMayaMPx.MPxToolCommand._doFinalize(self, command)
136 def setVector(self, x, y, z):
141 def __action(self, flag):
143 Do the actual work here to move the objects by vector
145 if flag == MoveToolCmd.kUndoIt:
146 vector = -self.__delta
148 vector = self.__delta
152 slist = OpenMaya.MSelectionList()
153 OpenMaya.MGlobal.getActiveSelectionList(slist)
154 sIter = OpenMaya.MItSelectionList(slist)
156 mdagPath = OpenMaya.MDagPath()
157 mComponent = OpenMaya.MObject()
158 spc = OpenMaya.MSpace.kWorld
162 while not sIter.isDone():
165 sIter.getDagPath(mdagPath, mComponent)
167 transFn = OpenMaya.MFnTransform(mdagPath)
172 transFn.translateBy(vector, spc)
174 sys.stderr.write(
"Error doing translate on transform\n")
179 cvFn = OpenMaya.MItCurveCV(mdagPath, mComponent)
183 while not cvFn.isDone():
184 cvFn.translateBy(vector, spc)
189 sCvFn = OpenMaya.MItSurfaceCV(mdagPath, mComponent,
True)
194 while not sCvFn.isDone():
195 while not CvFn.isRowDone():
196 sCvFn.translateBy(vector, spc)
199 sCvFn.updateSurface()
202 vtxFn = OpenMaya.MItMeshVertex(mdagPath, mComponent)
206 while not vtxFn.isDone():
207 vtxFn.translateBy(vector, spc)
209 vtxFn.updateSurface()
214 class MoveContext(OpenMayaMPx.MPxSelectionContext):
215 kTop, kFront, kSide, kPersp = 0, 1, 2, 3
218 OpenMayaMPx.MPxSelectionContext.__init__(self)
219 self._setTitleString(
"moveTool")
220 self.setImage(
"moveTool.xpm", OpenMayaMPx.MPxContext.kImage1)
222 self.__view = OpenMayaUI.M3dView()
223 self.__startPos_x = 0
225 self.__startPos_y = 0
229 def toolOnSetup(self, event):
230 self._setHelpString(
"drag to move selected object")
232 def doPress(self, event):
233 OpenMayaMPx.MPxSelectionContext.doPress(self, event)
234 spc = OpenMaya.MSpace.kWorld
239 if not self._isSelecting():
240 argX = OpenMaya.MScriptUtil(0)
241 argXPtr = argX.asShortPtr()
242 argY = OpenMaya.MScriptUtil(0)
243 argYPtr = argY.asShortPtr()
244 event.getPosition(argXPtr, argYPtr)
245 self.__startPos_x = argX.getShort(argXPtr)
246 self.__startPos_y = argY.getShort(argYPtr)
247 self.__view = OpenMayaUI.M3dView.active3dView()
249 camera = OpenMaya.MDagPath()
250 self.__view.getCamera(camera)
251 fnCamera = OpenMaya.MFnCamera(camera)
252 upDir = fnCamera.upDirection(spc)
253 rightDir = fnCamera.rightDirection(spc)
257 if fnCamera.isOrtho():
258 if upDir.isEquivalent(OpenMaya.MVector.zNegAxis, kVectorEpsilon):
259 self.__currWin = MoveContext.kTop
260 elif rightDir.isEquivalent(OpenMaya.MVector.xAxis, kVectorEpsilon):
261 self.__currWin = MoveContext.kFront
263 self.__currWin = MoveContext.kSide
265 OpenMaya.MGlobal.displayWarning(
'moveTool only works in top, front and side views')
266 self.__currWin = MoveContext.kPersp
270 newCmd = self._newToolCommand()
271 self.__cmd = kTrackingDictionary.get(OpenMayaMPx.asHashable(newCmd),
None)
272 self.__cmd.setVector(0.0, 0.0, 0.0)
274 def doDrag(self, event):
275 OpenMayaMPx.MPxSelectionContext.doDrag(self, event)
281 if not self._isSelecting():
282 argX = OpenMaya.MScriptUtil(0)
283 argXPtr = argX.asShortPtr()
284 argY = OpenMaya.MScriptUtil(0)
285 argYPtr = argY.asShortPtr()
286 event.getPosition(argXPtr, argYPtr)
287 self.__endPos_x = argX.getShort(argXPtr)
288 self.__endPos_y = argY.getShort(argYPtr)
290 startW = OpenMaya.MPoint()
291 endW = OpenMaya.MPoint()
292 vec = OpenMaya.MVector()
293 self.__view.viewToWorld(self.__startPos_x, self.__startPos_y, startW, vec)
294 self.__view.viewToWorld(self.__endPos_x, self.__endPos_y, endW, vec)
295 downButton = event.mouseButton()
301 if self.__currWin == MoveContext.kTop:
302 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
303 self.__cmd.setVector(endW.x - startW.x, 0.0, 0.0)
305 self.__cmd.setVector(endW.x - startW.x, 0.0, endW.z - startW.z)
307 elif self.__currWin == MoveContext.kFront:
308 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
310 self.__cmd.setVector(endW.x - startW.x, 0.0, 0.0)
314 self.__cmd.setVector(endW.x - startW.x, endW.y - startW.y, 0.0)
316 elif self.__currWin == MoveContext.kSide:
317 if downButton == OpenMayaUI.MEvent.kMiddleMouse:
318 self.__cmd.setVector(0.0, 0.0, endW.z - startW.z)
320 self.__cmd.setVector(0.0, endW.y - startW.y, endW.z - startW.z)
323 self.__view.refresh(
True)
325 def doRelease(self, event):
326 OpenMayaMPx.MPxSelectionContext.doRelease(self, event)
327 if not self._isSelecting():
328 argX = OpenMaya.MScriptUtil(0)
329 argXPtr = argX.asShortPtr()
330 argY = OpenMaya.MScriptUtil(0)
331 argYPtr = argY.asShortPtr()
332 event.getPosition(argXPtr, argYPtr)
333 self.__endPos_x = argX.getShort(argXPtr)
334 self.__endPos_y = argY.getShort(argYPtr)
341 if (math.fabs(self.__startPos_x - self.__endPos_x) < 2
and
342 math.fabs(self.__startPos_y - self.__endPos_y) < 2):
344 self.__view.refresh(
True)
346 self.__cmd.finalize()
347 self.__view.refresh(
True)
349 def doEnterRegion(self, event):
351 Print the tool description in the help line.
353 self._setHelpString(
"click on object and drag to move it")
359 class MoveContextCommand(OpenMayaMPx.MPxContextCommand):
361 OpenMayaMPx.MPxContextCommand.__init__(self)
364 return OpenMayaMPx.asMPxPtr(MoveContext())
367 return OpenMayaMPx.asMPxPtr(MoveToolCmd())
370 return OpenMayaMPx.asMPxPtr(MoveContextCommand())
373 syntax = OpenMaya.MSyntax()
374 syntax.addArg(OpenMaya.MSyntax.kDouble)
375 syntax.addArg(OpenMaya.MSyntax.kDouble)
376 syntax.addArg(OpenMaya.MSyntax.kDouble)
381 def initializePlugin(mobject):
382 mplugin = OpenMayaMPx.MFnPlugin(mobject,
"Autodesk",
"1.0",
"Any")
384 mplugin.registerContextCommand(kPluginCtxName, ctxCmdCreator, kPluginCmdName, cmdCreator, syntaxCreator)
386 sys.stderr.write(
"Failed to register context command: %s\n" % kPluginCtxName)
390 def uninitializePlugin(mobject):
391 mplugin = OpenMayaMPx.MFnPlugin(mobject)
393 mplugin.deregisterContextCommand(kPluginCtxName, kPluginCmdName)
395 sys.stderr.write(
"Failed to deregister context command: %s\n" % kPluginCtxName)