scripted/narrowPolyViewer.py

scripted/narrowPolyViewer.py
1 #-
2 # ==========================================================================
3 # Copyright (C) 1995 - 2006 Autodesk, Inc. and/or its licensors. All
4 # rights reserved.
5 #
6 # The coded instructions, statements, computer programs, and/or related
7 # material (collectively the "Data") in these files contain unpublished
8 # information proprietary to Autodesk, Inc. ("Autodesk") and/or its
9 # licensors, which is protected by U.S. and Canadian federal copyright
10 # law and by international treaties.
11 #
12 # The Data is provided for use exclusively by You. You have the right
13 # to use, modify, and incorporate this Data into other products for
14 # purposes authorized by the Autodesk software license agreement,
15 # without fee.
16 #
17 # The copyright notices in the Software and this entire statement,
18 # including the above license grant, this restriction and the
19 # following disclaimer, must be included in all copies of the
20 # Software, in whole or in part, and all derivative works of
21 # the Software, unless such copies or derivative works are solely
22 # in the form of machine-executable object code generated by a
23 # source language processor.
24 #
25 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
26 # AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
27 # WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
28 # NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
29 # PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR
30 # TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS
31 # BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL,
32 # DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK
33 # AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY
34 # OR PROBABILITY OF SUCH DAMAGES.
35 #
36 # ==========================================================================
37 #+
38 
39 import sys
40 import math
41 import maya.OpenMaya as OpenMaya
42 import maya.OpenMayaMPx as OpenMayaMPx
43 import maya.OpenMayaUI as OpenMayaUI
44 import maya.OpenMayaRender as OpenMayaRender
45 
46 glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
47 glFT = glRenderer.glFunctionTable()
48 
49 kPluginCmdName = "spNarrowPolyViewer"
50 
51 kInitFlag = "-in"
52 kInitFlagLong = "-init"
53 
54 kResultsFlag = "-r"
55 kResultsFlagLong = "-results"
56 
57 kClearFlag = "-cl"
58 kClearFlagLong = "-clear"
59 
60 kToleranceFlag = "-tol"
61 kToleranceFlagLong = "-tolerance"
62 
63 class narrowPolyViewer(OpenMayaMPx.MPx3dModelView):
64  def __init__(self):
65  OpenMayaMPx.MPx3dModelView.__init__(self)
66 
67  self.fOldCamera = OpenMaya.MDagPath()
68  self.fCameraList = OpenMaya.MDagPathArray()
69  self.fCurrentPass = 0
70  self.fDrawManips = True
71  self.fOldDisplayStyle = OpenMayaUI.M3dView.kWireFrame
72  self.fLightTest = False
73  self.fListList = OpenMaya.MDagPathArray()
74  self.tol = 10.0
75 
76  self.setMultipleDrawEnable(True)
77 
78  def multipleDrawPassCount(self):
79  return self.fCameraList.length() + 1
80 
81  def setCameraList(self, cameraList):
82  setMultipleDrawEnable(True)
83  self.fCameraList.clear()
84 
85  for i in range(cameraList.length()):
86  self.fCameraList.append(cameraList[i])
87 
88  self.refresh()
89 
90  def removeAllCameras(self):
91  self.fCameraList.clear()
92  self.refresh()
93 
94  def getCameraHUDName(self):
95  cameraPath = OpenMaya.MDagPath()
96  self.getCamera(cameraPath)
97 
98  cameraPath.pop()
99 
100  hudName = "spNarrowPolyViewer: " + cameraPath.partialPathName()
101  return hudName
102 
103  def setIsolateSelect(self, list):
104  self.setViewSelected(True)
105  return self.setObjectsToView(list)
106 
107  def setIsolateSelectOff(self):
108  return self.setViewSelected(False)
109 
110  def preMultipleDraw(self):
111  self.fCurrentPass = 0
112  self.fDrawManips = False
113 
114  dagPath = OpenMaya.MDagPath()
115 
116  try:
117  oldCamera = OpenMaya.MDagPath()
118  self.getCamera(oldCamera)
119 
120  self.fOldCamera = oldCamera
121 
122  displayHUD(False)
123 
124  sList = OpenMaya.MSelectionList()
125  OpenMaya.MGlobal.getActiveSelectionList(sList)
126 
127  sList.getDagPath(0, dagPath)
128  except:
129  # sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw b\n")
130  pass
131 
132  try:
133  itMeshPolygon = OpenMaya.MItMeshPolygon(dagPath, OpenMaya.cvar.MObject_kNullObj)
134 
135  if None == itMeshPolygon:
136  return;
137 
138  self.beginGL()
139 
140  while not itMeshPolygon.isDone():
141  points = OpenMaya.MPointArray()
142  itMeshPolygon.getPoints(points, OpenMaya.MSpace.kWorld)
143  length = points.length()
144 
145  if length == 3:
146  for i in range(length):
147  p = points[i]
148  p1 = points[(i+1)%length]
149  p2 = points[(i+2)%length]
150 
151  v1 = OpenMaya.MVector(p1 - p)
152  v2 = OpenMaya.MVector(p2 - p)
153 
154  angle = v1.angle(v2) * 180.0 / math.pi
155 
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)
161 
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)
165 
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)
169  glFT.glEnd()
170 
171  itMeshPolygon.next()
172 
173  self.endGL()
174  except:
175  # sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw c\n")
176  pass
177 
178  def postMultipleDraw(self):
179  try:
180  self.setCamera(self.fOldCamera)
181  self.fDrawManips = True
182  self.updateViewingParameters()
183  except:
184  sys.stderr.write("ERROR: spNarrowPolyViewer.postMultipleDraw\n")
185  raise
186 
187  def preMultipleDrawPass(self, index):
188  self.fCurrentPass = index
189 
190  try:
191  self.setDisplayAxis(False)
192  self.setDisplayAxisAtOrigin(False)
193  self.setDisplayCameraAnnotation(False)
194 
195  dagPath = OpenMaya.MDagPath()
196 
197  if self.fCurrentPass == 0:
198  self.getCamera(dagPath)
199  else:
200  nCameras = self.fCameraList.length()
201  if self.fCurrentPass <= nCameras:
202  dagPath = self.fCameraList[self.fCurrentPass-1]
203  else:
204  sys.stderr.write("ERROR: ...too many passes specified\n")
205  return
206 
207  self.setCameraInDraw(dagPath)
208 
209  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, True)
210 
211  if dagPath == self.fOldCamera:
212  self.fDrawManips = True
213  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, True)
214 
215  self.setFogEnabled(True)
216 
217  self.setBackgroundFogEnabled(False)
218 
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)
224 
225  textPos = OpenMaya.MPoint(0.0, 0.0, 0.0)
226  str = "Main View"
227  self.drawText(str, textPos, OpenMayaUI.M3dView.kLeft)
228  else:
229  self.fDrawManips = False
230  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, False)
231 
232  self.setFogEnabled(True)
233 
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)
239  except:
240  sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDrawPass\n")
241  raise
242 
243  # note do not have light test in here
244 
245  # self.setLightingMode(OpenMayaUI.kLightDefault)
246 
247  if ((self.fCurrentPass % 2) == 0):
248  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsSurfaces, True );
249  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsCurves, True );
250 
251  self.updateViewingParameters()
252 
253  def postMultipleDrawPass(self, index):
254  self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, True)
255 
256  def okForMultipleDraw(self, dagPath):
257  if not self.fDrawManips and dagPath.hasFn(OpenMaya.MFn.kManipulator3D):
258  return False
259  return True
260 
261  def multipleDrawPassCount(self):
262  return self.fCameraList.length() + 1
263 
264  def viewType(self):
265  return "spNarrowPolyViewer";
266 
267 
268 
269 
270 class narrowPolyViewerCmd(OpenMayaMPx.MPxModelEditorCommand):
271  def __init__(self):
272  OpenMayaMPx.MPxModelEditorCommand.__init__(self)
273  self.fCameraList = OpenMaya.MDagPathArray()
274 
275  def appendSyntax(self):
276  try:
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)
282 
283  except:
284  sys.stderr.write( "ERROR: creating syntax for model editor command: %s" % kPluginCmdName )
285 
286  def doEditFlags(self):
287  try:
288  user3dModelView = self.modelView()
289 
290  if user3dModelView.viewType() == kPluginCmdName:
291  argData = self._parser()
292 
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)
303  else:
304  return OpenMaya.kUnknownParameter
305  except:
306  sys.stderr.write( "ERROR: in doEditFlags for model editor command: %s" % kPluginCmdName )
307 
308  def initTests(self, view):
309  clearResults(self, view)
310 
311  # Add every camera into the scene. Don't change the main camera,
312  # it is OK that it gets reused.
313  #
314  cameraPath = OpenMaya.MDagPath()
315  dagIterator = OpenMaya.MItDag(OpenMaya.MItDag.kDepthFirst, OpenMaya.MFn.kCamera)
316 
317  while not dagIterator.isDone():
318  try:
319  dagIterator.getPath(cameraPath)
320  camera = OpenMaya.MFnCamera(cameraPath)
321  except:
322  continue
323 
324  OpenMaya.MGlobal.displayInfo(camera.fullPathName())
325  self.fCameraList.append(cameraPath)
326 
327  dagIterator.next()
328 
329  try:
330  view.setCameraList(self.fCameraList)
331  except:
332  OpenMaya.MGlobal.displayError("Could not set list of cameras\n")
333  raise
334 
335  view.refresh()
336 
337  def testResults(self, view):
338  print "fCameraLIst.length() = %d " % (self.fCameraList.length(), )
339  length = self.fCameraList.length()
340 
341  def clearResults(self, view):
342  view.removeAllCameras()
343  self.fCameraList.clear()
344 
345 
346 
347 def cmdCreator():
348  return OpenMayaMPx.asMPxPtr( narrowPolyViewerCmd() )
349 
350 def viewerCreator():
351  return OpenMayaMPx.asMPxPtr( narrowPolyViewer() )
352 
353 # initialize the script plug-in
354 def initializePlugin(mobject):
355  mplugin = OpenMayaMPx.MFnPlugin(mobject)
356  try:
357  mplugin.registerModelEditorCommand( kPluginCmdName, cmdCreator, viewerCreator)
358  except:
359  sys.stderr.write( "Failed to register model editor command: %s" % kPluginCmdName )
360  raise
361 
362 # uninitialize the script plug-in
363 def uninitializePlugin(mobject):
364  mplugin = OpenMayaMPx.MFnPlugin(mobject)
365  try:
366  mplugin.deregisterModelEditorCommand( kPluginCmdName )
367  except:
368  sys.stderr.write( "Failed to deregister model editor command: %s" % kPluginCmdName )
369  raise
370