def set_bounding_box(self): m3d_view = OpenMayaUI.M3dView() for index in range(m3d_view.numberOf3dViews()): view = OpenMayaUI.M3dView() m3d_view.get3dView(index, view) view.setDisplayStyle(0) view.refresh()
def setUp(self): mayaSceneFile = '%s.ma' % self._testName mayaSceneFullPath = os.path.join(self._inputDir, mayaSceneFile) cmds.file(mayaSceneFullPath, open=True, force=True) # Create a new custom viewport. self._window = cmds.window(widthHeight=(500, 400)) cmds.paneLayout() self._panel = cmds.modelPanel() cmds.modelPanel(self._panel, edit=True, camera='persp') cmds.modelEditor(cmds.modelPanel(self._panel, q=True, modelEditor=True), edit=True, displayAppearance='smoothShaded', rnm='vp2Renderer') cmds.showWindow(self._window) # Force all views to re-draw. This causes us to block until the # geometry we're making live has actually been evaluated and is present # in the viewport. Otherwise execution of the test may continue and the # create tool may be invoked before there's any geometry there, in # which case the tool won't create anything. cmds.refresh() # Get the viewport widget. self._view = OMUI.M3dView() OMUI.M3dView.getM3dViewFromModelPanel(self._panel, self._view) self._viewWidget = wrapInstance(long(self._view.widget()), QWidget)
def getIntersectPoint(meshDagPath, mouseX, mouseY): meshMatrix = meshDagPath.inclusiveMatrix() invMtx = meshDagPath.inclusiveMatrixInverse() activeView = OpenMayaUI.M3dView().active3dView() nearPoint = OpenMaya.MPoint() farPoint = OpenMaya.MPoint() activeView.viewToWorld(mouseX, mouseY, nearPoint, farPoint) nearPoint *= invMtx farPoint *= invMtx fnMesh = OpenMaya.MFnMesh(meshDagPath) intersectPoints = OpenMaya.MPointArray() fnMesh.intersect(nearPoint, farPoint - nearPoint, intersectPoints) if not intersectPoints.length(): return None if intersectPoints.length() == 1: return intersectPoints[0] * meshMatrix elif intersectPoints.length() > 1: pointCenter = OpenMaya.MPoint( (intersectPoints[0].x + intersectPoints[1].x) / 2.0, (intersectPoints[0].y + intersectPoints[1].y) / 2.0, (intersectPoints[0].z + intersectPoints[1].z) / 2.0) return pointCenter * meshMatrix
def getIntersection(self): # Create mpoint variables pos = om.MPoint() # 3D point with double-precision coordinates dir = om.MVector() # 3D vector with double-precision coordinates vpX, vpY, _ = cmds.draggerContext(self.ctx, query=True, dragPoint=True) # This takes vpX and vpY as input and outputs position and direction # values for the active view. # - M3dView: provides methods for working with 3D model views # - active3dView(): Returns the active view in the form of a class # - viewToWorld: Takes a point in port coordinates and # returns a corresponding ray in world coordinates omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir) #pos2 = om.MFloatPoint(pos.x, pos.y, pos.z) # Creating a 3 vector float point to use #raySource = om.MFloatPoint(pos2) raySource = om.MFloatPoint(pos) rayDirection = om.MFloatVector(dir) faceIds = None triIds = None idsSorted = False maxParamPtr = 99999999 testBothDirections = False accelParams = None hitpoint = om.MFloatPoint() hitRayParam = None hitFacePtr = om.MScriptUtil().asIntPtr() hitTriangle = None hitBary1 = None hitBary2 = None intersection = self.fnMesh.closestIntersection( raySource, rayDirection, faceIds, triIds, idsSorted, om.MSpace.kWorld, maxParamPtr, testBothDirections, accelParams, hitpoint, hitRayParam, hitFacePtr, hitTriangle, hitBary1, hitBary2) return intersection, hitFacePtr
def __init__(self, editor): """Makes your interaction in viewport fast, by installing this event viewport changes to bounding box Args: editor(str): modelEditor Usage:: >> tracker = BBBlastTracker('modelPanel1') >> tracker.install() >> tracker.uninstall() # OR >> BBBlastTracker.install_from_active_panel() """ super(BBBlastTracker, self).__init__() self.editor = editor self.last_appearance = cmds.modelEditor(self.editor, q=True, displayAppearance=True) self.restore_on_release = True self.timer = None self.timeout = 0.05 # get QWidget from the view view = apiUI.M3dView() apiUI.M3dView.getM3dViewFromModelPanel(self.editor, view) self.view = shiboken2.wrapInstance(long(view.widget()), QtWidgets.QWidget) self.__class__._all.append(self)
def thumbnailApiFromView(filename, width, height, compression='bmp', modelPanel='modelPanel4'): ''' grab the thumbnail direct from the buffer? TODO: not yet figured out how you crop the data here? ''' import maya.OpenMaya as OpenMaya import maya.OpenMayaUI as OpenMayaUI #Grab the last active 3d viewport view = None if modelPanel is None: view = OpenMayaUI.M3dView.active3dView() else: try: view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelEditor(modelPanel, view) except: #in case the given modelPanel doesn't exist!! view = OpenMayaUI.M3dView.active3dView() #read the color buffer from the view, and save the MImage to disk image = OpenMaya.MImage() view.readColorBuffer(image, True) image.resize(width, height, True) image.writeToFile(filename, compression) log.info('API Thumbname call path : %s' % filename)
def testObjectNormal(self): """ Tests that an object created interactively by dragging in the viewport has the correct orientation based on the live surface normal. """ from pxr import Gf # Load our reference assembly. UsdMaya.LoadReferenceAssemblies() # Create a new custom viewport. window = cmds.window(widthHeight=(500, 400)) cmds.paneLayout() panel = cmds.modelPanel() cmds.modelPanel(panel, edit=True, camera='persp') cmds.modelEditor(cmds.modelPanel(panel, q=True, modelEditor=True), edit=True, displayAppearance='smoothShaded', rnm='vp2Renderer') cmds.showWindow(window) # Get the viewport widget. view = OMUI.M3dView() OMUI.M3dView.getM3dViewFromModelPanel(panel, view) viewWidget = wrapInstance(long(view.widget()), QWidget) # Make our assembly live. cmds.makeLive('Block_2') # Enter interactive creation context. cmds.setToolTo('CreatePolyConeCtx') # Click in the center of the viewport widget. QTest.mouseClick(viewWidget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, viewWidget.rect().center()) # Find the cone (it should be called pCone1). self.assertTrue(cmds.ls('pCone1')) # Check the cone's rotation. # Because our scene is Z-axis up, the cone's Z-axis should be aligned # with Block_2's surface normal (though it might not necessarily have # the same exact rotation). rotationAngles = cmds.xform('pCone1', q=True, ro=True) rotation = (Gf.Rotation(Gf.Vec3d.XAxis(), rotationAngles[0]) * Gf.Rotation(Gf.Vec3d.YAxis(), rotationAngles[1]) * Gf.Rotation(Gf.Vec3d.ZAxis(), rotationAngles[2])) actualZAxis = rotation.TransformDir(Gf.Vec3d.ZAxis()) expectedRotation = (Gf.Rotation(Gf.Vec3d.XAxis(), 75.0) * Gf.Rotation(Gf.Vec3d.YAxis(), 90.0)) expectedZAxis = expectedRotation.TransformDir(Gf.Vec3d.ZAxis()) # Verify that the error angle between the two axes is less than # 0.1 degrees (less than ~0.0003 of a revolution, so not bad). That's # about as close as we're going to get. errorRotation = Gf.Rotation(actualZAxis, expectedZAxis) self.assertLess(errorRotation.GetAngle(), 0.1)
def getCam(self): # get current view currentView = omui.M3dView().active3dView() dag = om.MDagPath() cam = currentView.getCamera(dag) cam = om.MFnCamera(dag) return cam
def getClickedParams(self): pressPosition = cmds.draggerContext(self.ctxName, query=True, anchorPoint=True) m3dView = OpenMayaUI.M3dView() active = m3dView.active3dView() cameraPath = OpenMaya.MDagPath() active.getCamera(cameraPath) clip = OpenMaya.MFnCamera(cameraPath).farClippingPlane() pos = OpenMaya.MPoint() dirV = OpenMaya.MVector() active.viewToWorld(int(pressPosition[0]), int(pressPosition[1]), pos, dirV) itrDag = OpenMaya.MItDag(OpenMaya.MItDag.kDepthFirst, OpenMaya.MFn.kMesh) nearDist = None nearPos = None nearDagPath = None while (not itrDag.isDone()): dagPath = OpenMaya.MDagPath() itrDag.getPath(dagPath) if (dagPath.isVisible()): fnMesh = OpenMaya.MFnMesh(dagPath) p = OpenMaya.MFloatPoint() f = OpenMaya.MScriptUtil() f.createFromInt(0) t = OpenMaya.MScriptUtil() t.createFromInt(0) fp = f.asIntPtr() tp = t.asIntPtr() if (fnMesh.closestIntersection(OpenMaya.MFloatPoint(pos), OpenMaya.MFloatVector(dirV), None, None, True, OpenMaya.MSpace.kWorld, clip, True, None, p, None, fp, tp, None, None)): d = (OpenMaya.MFloatPoint(pos) - p).length() if (not nearDist): nearDist = d nearPos = p nearDagPath = dagPath elif (nearDist > d): nearDist = d nearPos = p nearDagPath = dagPath itrDag.next() if (nearPos): n = OpenMaya.MVector() OpenMaya.MFnMesh(nearDagPath).getClosestNormal( OpenMaya.MPoint(nearPos), n, OpenMaya.MSpace.kWorld) return ClickedPos(nearPos, n, nearDagPath) else: return None
def drawViewports(self, *args): glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer() glFT = glRenderer.glFunctionTable() currFrame = int(cmds.currentTime(query=True)) for loopViewport in utilMod.getAllViewports(): rendererName = cmds.modelEditor(loopViewport, query=True, rendererName=True) for loopMotionTrail in self.nodeInfo.keys(): viewportCamera = cmds.modelEditor( loopViewport, query=True, camera=True) if self.cameraRelativeMode else None camera = viewportCamera if viewportCamera in self.cameraInfo.keys( ) and self.cameraRelativeMode else None points = self.getPointsArray(loopMotionTrail, currFrame, camera) pointArray = points["camera"] if camera else points["world"] loopKeysTimes = [] if not self.keysTimesDict.has_key( loopMotionTrail) else self.keysTimesDict[loopMotionTrail] indexMap = self.getIndexMap(loopMotionTrail, loopKeysTimes, currFrame, pointArray) lineColor = self.nodeInfo[loopMotionTrail]["lineColor"] view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelPanel(loopViewport, view) view.beginGL() glFT.glPushAttrib(OpenMayaRender.MGL_ALL_ATTRIB_BITS) glFT.glPushMatrix() glFT.glDepthRange(0, 0) glFT.glEnable(OpenMayaRender.MGL_LINE_SMOOTH) glFT.glEnable(OpenMayaRender.MGL_POINT_SMOOTH) glFT.glEnable(OpenMayaRender.MGL_BLEND) glFT.glDisable(OpenMayaRender.MGL_LIGHTING) glFT.glBlendFunc(OpenMayaRender.MGL_SRC_ALPHA, OpenMayaRender.MGL_ONE_MINUS_SRC_ALPHA) #DRAW if rendererName == "ogsRenderer": self.drawLine(glFT, indexMap, pointArray, lineColor) self.drawPoints(glFT, indexMap, pointArray) else: self.drawPoints(glFT, indexMap, pointArray) self.drawLine(glFT, indexMap, pointArray, lineColor) #WRAP glFT.glDisable(OpenMayaRender.MGL_BLEND) glFT.glDisable(OpenMayaRender.MGL_LINE_SMOOTH) glFT.glDisable(OpenMayaRender.MGL_POINT_SMOOTH) glFT.glEnable(OpenMayaRender.MGL_LIGHTING) glFT.glPopMatrix() glFT.glPopAttrib() view.endGL()
def generateIcon( preset ): ''' given a preset object, this method will generate an icon using the currently active viewport. the path to the icon is returned ''' sel = cmd.ls(sl=True) cmd.select(cl=True) panel = getMostLikelyModelView() if panel is None: raise AnimLibException('cannot determine which panel to use for icon generation') #store some initial settings, change them to what is required, and then restored at the very end settings = "-df", "-cv", "-ca", "-nurbsCurves", "-nurbsSurfaces", "-lt", "-ha", "-dim", "-pv", "-ikh", "-j", "-dy" initialStates = [] for setting in settings: initialStates.append( mel.eval("modelEditor -q %s %s;" % (setting, panel)) ) mel.eval("modelEditor -e %s 0 %s;" % (setting, panel)) #this is WAY more involved than doing a playblast, but it also results in prettier icons... seems like a reasonably tradeoff to me! view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelPanel( panel, view ) xUtil, yUtil, wUtil, hUtil = OpenMaya.MScriptUtil(), OpenMaya.MScriptUtil(), OpenMaya.MScriptUtil(), OpenMaya.MScriptUtil() x, y, w, h = xUtil.asUintPtr(), yUtil.asUintPtr(), wUtil.asUintPtr(), hUtil.asUintPtr() view.viewport( x, y, w, h ) x, y, w, h = xUtil.getUint( x ), xUtil.getUint( y ), xUtil.getUint( w ), xUtil.getUint( h ) #we want a square image, so we need to figure out how best to fit the viewport isLandscape = w > h if isLandscape: x = (w - h) / 2 w = h else: y = (h - w) / 2 h = w view.pushViewport( x, y, w, h ) image = OpenMaya.MImage() try: view.refresh( False, True, True ) view.readColorBuffer( image, True ) finally: view.popViewport() image.resize( ICON_SIZE, ICON_SIZE ) image.writeToFile( preset.icon(), ICON_FMT_STR ) if not preset.icon().exists(): raise AnimLibException( "icon wasn't written out!" ) #restore initial state try: cmd.select(sel) except: pass for setting, initialState in zip(settings, initialStates): mel.eval("modelEditor -e %s %s %s;" % (setting, initialState, panel))
def __init__( self, scene, viewportID=None ): super(MayaSceneViewport, self).__init__(scene, viewportID) if viewportID == None: self._nativePointer = omUI.M3dView.active3dView() else: self._nativePointer = omUI.M3dView() omUI.M3dView.get3dView(viewportID, self._nativePointer) self._name = cross3d.SceneWrapper._mObjName(self._nativeCamera())
def getIntersect(vpX, vpY): pos = om.MPoint() intersect = om.MVector() omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, intersect) # 射线 stPos = om.MFloatPoint(pos) intersect = om.MFloatVector(intersect) return stPos, intersect
def refreshViewports(self): G.deferredManager.removeFromQueue("MT_refreshViewports") for loopViewport in utilMod.getAllViewports(): view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelPanel(loopViewport, view) view.refresh(True, True)
def activeCam(self): try: maya3DViewHandle = omui.M3dView() activeView = maya3DViewHandle.active3dView() cameraDP = om.MDagPath() maya3DViewHandle.active3dView().getCamera(cameraDP) return cameraDP.fullPathName() except: return '|persp|perspShape'
def thumbnailApiFromView(filename, width, height, modelPanel=None, compression='bmp'): ''' grab the thumbnail direct from the buffer. This viewport capture method is apparently flagged as obsolete in the Maya API so this might need some investigation in the future! :param filename: path to store the image too :param width: width of the image to capture :param height: height of the image to capture :param modelPanel: panel to capture :param compression: base format for the image, default is 'bmp' ''' import maya.OpenMaya as OpenMaya import maya.OpenMayaUI as OpenMayaUI # get modelPanel: always proved a reliable way to get the active modelPanel if not modelPanel or not cmds.modelPanel(modelPanel, exists=True): modelPanel = cmds.playblast(activeEditor=True).split('|')[-1] # Grab the last active 3d viewport view = None if modelPanel is None: view = OpenMayaUI.M3dView.active3dView() else: try: view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelEditor(modelPanel, view) except: # in case the given modelPanel doesn't exist!! view = OpenMayaUI.M3dView.active3dView() view.refresh(False, True) # refresh the current view only # read the colour buffer from the view, and save the MImage to disk # BUG fix: 28/11/19 : in Viewport2 the image is stored as float and the default format # of MImage is BGRA so we're now converting # https://around-the-corner.typepad.com/adn/2016/05/get-image-from-m3dviewreadcolorbuffer-in-viewport-2.html # http://discourse.techart.online/t/maya-python-super-weird-behaviour-of-m3dview/5649/4 image = OpenMaya.MImage() if view.getRendererName() == view.kViewport2Renderer: image.create(view.portWidth(), view.portHeight(), 4, OpenMaya.MImage.kFloat) view.readColorBuffer(image, True) image.convertPixelFormat(OpenMaya.MImage.kByte) else: view.readColorBuffer(image, True) image.resize(width, height, True) try: image.writeToFile(filename, compression) except StandardError, err: log.debug(err)
def __init__(self): OpenMayaMPx.MPxSelectionContext.__init__(self) self._setTitleString("moveTool") self.setImage("moveTool.xpm", OpenMayaMPx.MPxContext.kImage1) self.__currWin = 0 self.__view = OpenMayaUI.M3dView() self.__startPos_x = 0 self.__endPos_x = 0 self.__startPos_y = 0 self.__endPos_y = 0 self.__cmd = None
def get_model_editor_screen_port(): """ returns the model editor screen position :return: <> """ model_editor = 'modelPanel4' view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelEditor(model_editor, view) view_y = view.portHeight() view_x = view.portWidth() return view_x, view_y
def testObjectPosition(self): """ Tests that an object created interactively is positioned correctly on the live surface. """ # Load our reference assembly. UsdMaya.LoadReferenceAssemblies() # Create a new custom viewport. window = cmds.window(widthHeight=(500, 400)) cmds.paneLayout() panel = cmds.modelPanel() cmds.modelPanel(panel, edit=True, camera='persp') cmds.modelEditor(cmds.modelPanel(panel, q=True, modelEditor=True), edit=True, displayAppearance='smoothShaded', rnm='vp2Renderer') cmds.showWindow(window) # Force all views to re-draw. This causes us to block until the # geometry we're making live has actually been evaluated and is present # in the viewport. Otherwise execution of the test may continue and the # create tool may be invoked before there's any geometry there, in # which case the tool won't create anything. cmds.refresh() # Get the viewport widget. view = OMUI.M3dView() OMUI.M3dView.getM3dViewFromModelPanel(panel, view) viewWidget = wrapInstance(long(view.widget()), QWidget) # Make our assembly live. cmds.makeLive('Block_1') # Enter interactive creation context. cmds.setToolTo('CreatePolyTorusCtx') # Click in the center of the viewport widget. QTest.mouseClick(viewWidget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, viewWidget.rect().center()) # Find the torus (it should be called pTorus1). self.assertTrue(cmds.ls('pTorus1')) # Check the torus's transform. # The Block_1 is originally 1 unit deep and centered at the origin, so # its original top plane is aligned at z=0.5. # It is scaled 5x, which makes the top plane aligned at z=2.5. # Then it is translated along z by 4.0, so its top plane is finally # aligned at z=6.5. translate = cmds.xform('pTorus1', q=True, t=True) self.assertAlmostEqual(translate[2], 6.5, places=3)
def getCameraFarClip(): ''' Return current camera far clip ''' maya3DViewHandle = omui.M3dView() activeView = maya3DViewHandle.active3dView() cameraDP = om.MDagPath() maya3DViewHandle.active3dView().getCamera(cameraDP) camFn = om.MFnCamera(cameraDP) return camFn.farClippingPlane();
def parseArgs(transformName, view=None): """ Checks input values. :param transformName: Name of a transform to nudge from. :type transformName: str :param view: Optional desired M3dView. :type view: OpenMaya.M3dView or Str :raises RuntimeError: If transformName isn't a transform or doesn't exist. :raises RuntimeError: If view set is not a view. :return: view :rtype: OpenMaya.M3dView """ if not transformName: log.error("No transformName supplied.") raise if not cmds.objExists(transformName) or \ not cmds.nodeType(transformName) == "transform": log.error("%s either does not exist or" " isn't a transform.") raise if not view: log.debug("Getting active view...") view = OpenMayaUI.M3dView.active3dView() else: if not type(view) is OpenMayaUI.M3dView and type(view) is str: log.debug("Converting %s to OpenMayaUI.M3dView..." % view) viewStr = view view = OpenMayaUI.M3dView() try: OpenMayaUI.M3dView.getM3dViewFromModelPanel( viewStr, view) except: log.error("%s is not a model panel or view." % view) raise else: log.error("%s is not a view." % view) raise return view
def iter(cls): '''Yield all Viewport objects. usage:: for view in Viewport.iter(): print v.panel ''' for index in range(cls.count()): m3dview = OpenMayaUI.M3dView() OpenMayaUI.M3dView.get3dView(index, m3dview) yield cls(m3dview)
def viewToWorld(self,x,y): # get current view currentView = omui.M3dView().active3dView() # empty objects resultPt = om.MPoint() resultVtr = om.MVector() # conversion currentView.viewToWorld(int(x),int(y),resultPt,resultVtr) # return return [resultPt.x,resultPt.y,resultPt.z],[resultVtr.x,resultVtr.y,resultVtr.z]
def pickerContext(self, *args): maya3DViewHandle = omui.M3dView() activeView = maya3DViewHandle.active3dView() self.Context = 'Context' self.meshSelection = cmds.ls(g=1) if cmds.draggerContext(self.Context, ex=1): cmds.deleteUI(self.Context) cmds.draggerContext(self.Context, name=self.Context, pressCommand=self.onPress, releaseCommand=self.onRelease, cursor='crossHair') cmds.setToolTo(self.Context)
def getIntersectPoint(mouseX, mouseY, meshDagPath=None): activeView = OpenMayaUI.M3dView().active3dView() nearPoint = OpenMaya.MPoint() farPoint = OpenMaya.MPoint() activeView.viewToWorld(mouseX, mouseY, nearPoint, farPoint) if meshDagPath: meshMatrix = meshDagPath.inclusiveMatrix() invMtx = meshDagPath.inclusiveMatrixInverse() nearPoint *= invMtx farPoint *= invMtx fnMesh = OpenMaya.MFnMesh(meshDagPath) intersectPoints = OpenMaya.MPointArray() fnMesh.intersect(nearPoint, farPoint - nearPoint, intersectPoints) if not intersectPoints.length(): return None if intersectPoints.length() == 1: return intersectPoints[0] * meshMatrix elif intersectPoints.length() > 1: pointCenter = (OpenMaya.MVector(intersectPoints[0]) + OpenMaya.MVector(intersectPoints[1])) / 2.0 return pointCenter * meshMatrix else: activeView = OpenMayaUI.M3dView().active3dView() camDagPath = OpenMaya.MDagPath() activeView.getCamera(camDagPath) fnCam = OpenMaya.MFnCamera(camDagPath) focalLength = fnCam.focalLength() camVector = OpenMaya.MVector(farPoint) - OpenMaya.MVector( nearPoint) camVector.normalize() return camVector * focalLength + nearPoint
def SavePic_zwz(self, myModelPlane, Frame): view = apiUI.M3dView() apiUI.M3dView.getM3dViewFromModelPanel(myModelPlane, view) myCamera = mc.modelPanel(myModelPlane, q=True, camera=True) myCameraShortName = myCamera.split(":")[-1] myCameraShortName = myCameraShortName.replace('|','') img = om.MImage() view.readColorBuffer(img, True) myPath = '%s\\%s' % (self.movieFullPath, myCameraShortName) if not os.path.isdir(myPath): os.makedirs(myPath) fileName = str('%s\\%s.%04d.%s' % (myPath, myCameraShortName, Frame, self.TexModel)).encode('gb2312') img.writeToFile(fileName, self.TexModel)
def get_model_editor_screen_position(): """ returns the model editor screen position :return: """ model_editor = 'modelPanel4' x = create_int_ptr() y = create_int_ptr() view = OpenMayaUI.M3dView() OpenMayaUI.M3dView.getM3dViewFromModelEditor(model_editor, view) view.getScreenPosition(x, y) view_x = get_int_from_int_ptr(x) view_y = get_int_from_int_ptr(y) return view_x, view_y
def getViewportClick(screenX, screenY): ''' return world position and direction of the viewport clicked point (returns point objects) ''' maya3DViewHandle = omui.M3dView() activeView = maya3DViewHandle.active3dView() clickPos = om.MPoint() clickDir = om.MVector() activeView.viewToWorld(int(screenX), int(screenY), clickPos, clickDir) worldPos = point(clickPos.x, clickPos.y, clickPos.z) worldDir = point(clickDir.x, clickDir.y, clickDir.z) return worldPos,worldDir
def worldToView(self, mPt): # get current view currentView = omui.M3dView().active3dView() # empty objects xPos = om.MScriptUtil().asShortPtr() yPos = om.MScriptUtil().asShortPtr() # conversion value = currentView.worldToView(mPt, xPos, yPos) x = om.MScriptUtil().getShort(xPos) y = om.MScriptUtil().getShort(yPos) # return return x, y
def getIntersectPointAndNormal( mouseX, mouseY, meshGrps = [] ): activeView = OpenMayaUI.M3dView().active3dView() nearPoint = OpenMaya.MPoint() farPoint = OpenMaya.MPoint() activeView.viewToWorld( mouseX, mouseY, nearPoint, farPoint ) meshShapes = [] for meshGrp in meshGrps: if cmds.nodeType( meshGrp ) == 'mesh': meshShapes.append( meshGrp ) elif cmds.nodeType( meshGrp ) == 'transform': shapes = cmds.listRelatives( meshGrp, s=1, f=1 ) for shape in shapes: if cmds.getAttr( shape + '.io' ): continue if cmds.nodeType( shape ) == 'mesh': meshShapes.append( shape ) allIntersectPointAndNormal = [] for meshShape in meshShapes: meshDagPath = getDagPath( meshShape ) meshMatrix = meshDagPath.inclusiveMatrix() invMtx = meshDagPath.inclusiveMatrixInverse() localNearPoint = nearPoint * invMtx localFarPoint = farPoint * invMtx fnMesh = OpenMaya.MFnMesh( meshDagPath ) intersectPoints = OpenMaya.MPointArray() fnMesh.intersect( localNearPoint, localFarPoint - localNearPoint, intersectPoints ) if intersectPoints.length(): normal = OpenMaya.MVector() fnMesh.getClosestNormal( intersectPoints[0], normal, OpenMaya.MSpace.kTransform ) allIntersectPointAndNormal.append( [intersectPoints[0]*meshMatrix, normal.normal()*meshMatrix] ) if allIntersectPointAndNormal: minDist = 100000000.0 minDistIndex = 0 for i in range( len(allIntersectPointAndNormal) ): point, normal = allIntersectPointAndNormal[i] dist = nearPoint.distanceTo( point ) if dist < minDist: minDist = dist minDistIndex = i return allIntersectPointAndNormal[minDistIndex] else: return OpenMaya.MPoint(), OpenMaya.MVector(0,1,0)