41 import maya.OpenMaya
as OpenMaya
42 import maya.OpenMayaMPx
as OpenMayaMPx
43 import maya.OpenMayaUI
as OpenMayaUI
44 import maya.OpenMayaRender
as OpenMayaRender
46 glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
47 glFT = glRenderer.glFunctionTable()
49 kPluginCmdName =
"spNarrowPolyViewer"
52 kInitFlagLong =
"-init"
55 kResultsFlagLong =
"-results"
58 kClearFlagLong =
"-clear"
60 kToleranceFlag =
"-tol"
61 kToleranceFlagLong =
"-tolerance"
63 class narrowPolyViewer(OpenMayaMPx.MPx3dModelView):
65 OpenMayaMPx.MPx3dModelView.__init__(self)
67 self.fOldCamera = OpenMaya.MDagPath()
68 self.fCameraList = OpenMaya.MDagPathArray()
70 self.fDrawManips =
True
71 self.fOldDisplayStyle = OpenMayaUI.M3dView.kWireFrame
72 self.fLightTest =
False
73 self.fListList = OpenMaya.MDagPathArray()
76 self.setMultipleDrawEnable(
True)
78 def multipleDrawPassCount(self):
79 return self.fCameraList.length() + 1
81 def setCameraList(self, cameraList):
82 setMultipleDrawEnable(
True)
83 self.fCameraList.clear()
85 for i
in range(cameraList.length()):
86 self.fCameraList.append(cameraList[i])
90 def removeAllCameras(self):
91 self.fCameraList.clear()
94 def getCameraHUDName(self):
95 cameraPath = OpenMaya.MDagPath()
96 self.getCamera(cameraPath)
100 hudName =
"spNarrowPolyViewer: " + cameraPath.partialPathName()
103 def setIsolateSelect(self, list):
104 self.setViewSelected(
True)
105 return self.setObjectsToView(list)
107 def setIsolateSelectOff(self):
108 return self.setViewSelected(
False)
110 def preMultipleDraw(self):
111 self.fCurrentPass = 0
112 self.fDrawManips =
False
114 dagPath = OpenMaya.MDagPath()
117 oldCamera = OpenMaya.MDagPath()
118 self.getCamera(oldCamera)
120 self.fOldCamera = oldCamera
124 sList = OpenMaya.MSelectionList()
125 OpenMaya.MGlobal.getActiveSelectionList(sList)
127 sList.getDagPath(0, dagPath)
133 itMeshPolygon = OpenMaya.MItMeshPolygon(dagPath, OpenMaya.cvar.MObject_kNullObj)
135 if None == itMeshPolygon:
140 while not itMeshPolygon.isDone():
141 points = OpenMaya.MPointArray()
142 itMeshPolygon.getPoints(points, OpenMaya.MSpace.kWorld)
143 length = points.length()
146 for i
in range(length):
148 p1 = points[(i+1)%length]
149 p2 = points[(i+2)%length]
151 v1 = OpenMaya.MVector(p1 - p)
152 v2 = OpenMaya.MVector(p2 - p)
154 angle = v1.angle(v2) * 180.0 / math.pi
156 if math.fabs(angle - self.tol) < 0.0001
or angle < self.tol:
157 glFT.glBegin( OpenMayaRender.MGL_POLYGON )
158 glFT.glVertex3f(points[0].x, points[0].y, points[0].z)
159 glFT.glVertex3f(points[1].x, points[1].y, points[1].z)
160 glFT.glVertex3f(points[2].x, points[2].y, points[2].z)
162 glFT.glNormal3f(points[0].x, points[0].y, points[0].z)
163 glFT.glNormal3f(points[1].x, points[1].y, points[1].z)
164 glFT.glNormal3f(points[2].x, points[2].y, points[2].z)
166 glFT.glTexCoord3f(points[0].x, points[0].y, points[0].z)
167 glFT.glTexCoord3f(points[1].x, points[1].y, points[1].z)
168 glFT.glTexCoord3f(points[2].x, points[2].y, points[2].z)
178 def postMultipleDraw(self):
180 self.setCamera(self.fOldCamera)
181 self.fDrawManips =
True
182 self.updateViewingParameters()
184 sys.stderr.write(
"ERROR: spNarrowPolyViewer.postMultipleDraw\n")
187 def preMultipleDrawPass(self, index):
188 self.fCurrentPass = index
191 self.setDisplayAxis(
False)
192 self.setDisplayAxisAtOrigin(
False)
193 self.setDisplayCameraAnnotation(
False)
195 dagPath = OpenMaya.MDagPath()
197 if self.fCurrentPass == 0:
198 self.getCamera(dagPath)
200 nCameras = self.fCameraList.length()
201 if self.fCurrentPass <= nCameras:
202 dagPath = self.fCameraList[self.fCurrentPass-1]
204 sys.stderr.write(
"ERROR: ...too many passes specified\n")
207 self.setCameraInDraw(dagPath)
209 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything,
True)
211 if dagPath == self.fOldCamera:
212 self.fDrawManips =
True
213 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid,
True)
215 self.setFogEnabled(
True)
217 self.setBackgroundFogEnabled(
False)
219 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights,
True)
220 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras,
True)
221 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles,
True)
222 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions,
True)
223 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles,
True)
225 textPos = OpenMaya.MPoint(0.0, 0.0, 0.0)
227 self.drawText(str, textPos, OpenMayaUI.M3dView.kLeft)
229 self.fDrawManips =
False
230 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid,
False)
232 self.setFogEnabled(
True)
234 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights,
False)
235 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras,
False)
236 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles,
False)
237 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions,
False)
238 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles,
False)
240 sys.stderr.write(
"ERROR: spNarrowPolyViewer.preMultipleDrawPass\n")
247 if ((self.fCurrentPass % 2) == 0):
248 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsSurfaces,
True );
249 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsCurves,
True );
251 self.updateViewingParameters()
253 def postMultipleDrawPass(self, index):
254 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything,
True)
256 def okForMultipleDraw(self, dagPath):
257 if not self.fDrawManips
and dagPath.hasFn(OpenMaya.MFn.kManipulator3D):
261 def multipleDrawPassCount(self):
262 return self.fCameraList.length() + 1
265 return "spNarrowPolyViewer";
270 class narrowPolyViewerCmd(OpenMayaMPx.MPxModelEditorCommand):
272 OpenMayaMPx.MPxModelEditorCommand.__init__(self)
273 self.fCameraList = OpenMaya.MDagPathArray()
275 def appendSyntax(self):
277 theSyntax = self._syntax()
278 theSyntax.addFlag(kInitFlag, kInitFlagLong)
279 theSyntax.addFlag(kResultsFlag, kResultsFlagLong)
280 theSyntax.addFlag(kClearFlag, kClearFlagLong)
281 theSyntax.addFlag(kToleranceFlag, kToleranceFlagLong, OpenMaya.MSyntax.kDouble)
284 sys.stderr.write(
"ERROR: creating syntax for model editor command: %s" % kPluginCmdName )
286 def doEditFlags(self):
288 user3dModelView = self.modelView()
290 if user3dModelView.viewType() == kPluginCmdName:
291 argData = self._parser()
293 if argData.isFlagSet(kInitFlag):
294 self.initTests(user3dModelView)
295 elif argData.isFlagSet(kResultsFlag):
296 self.testResults(user3dModelView)
297 elif argData.isFlagSet(kClearFlag):
298 self.clearResults(user3dModelView)
299 elif argData.isFlagSet(kToleranceFlag):
300 tol = argData.flagArgumentDouble(kToleranceFlag, 0)
301 user3dModelView.tol = tol
302 user3dModelView.refresh(
True,
True)
304 return OpenMaya.kUnknownParameter
306 sys.stderr.write(
"ERROR: in doEditFlags for model editor command: %s" % kPluginCmdName )
308 def initTests(self, view):
309 clearResults(self, view)
314 cameraPath = OpenMaya.MDagPath()
315 dagIterator = OpenMaya.MItDag(OpenMaya.MItDag.kDepthFirst, OpenMaya.MFn.kCamera)
317 while not dagIterator.isDone():
319 dagIterator.getPath(cameraPath)
320 camera = OpenMaya.MFnCamera(cameraPath)
324 OpenMaya.MGlobal.displayInfo(camera.fullPathName())
325 self.fCameraList.append(cameraPath)
330 view.setCameraList(self.fCameraList)
332 OpenMaya.MGlobal.displayError(
"Could not set list of cameras\n")
337 def testResults(self, view):
338 print "fCameraLIst.length() = %d " % (self.fCameraList.length(), )
339 length = self.fCameraList.length()
341 def clearResults(self, view):
342 view.removeAllCameras()
343 self.fCameraList.clear()
348 return OpenMayaMPx.asMPxPtr( narrowPolyViewerCmd() )
351 return OpenMayaMPx.asMPxPtr( narrowPolyViewer() )
354 def initializePlugin(mobject):
355 mplugin = OpenMayaMPx.MFnPlugin(mobject)
357 mplugin.registerModelEditorCommand( kPluginCmdName, cmdCreator, viewerCreator)
359 sys.stderr.write(
"Failed to register model editor command: %s" % kPluginCmdName )
363 def uninitializePlugin(mobject):
364 mplugin = OpenMayaMPx.MFnPlugin(mobject)
366 mplugin.deregisterModelEditorCommand( kPluginCmdName )
368 sys.stderr.write(
"Failed to deregister model editor command: %s" % kPluginCmdName )