Esempio n. 1
0
 def boundingBox(self):
     block = self.forceCache()
     lowerHandle = block.inputValue(self.boundingBoxCorner1)
     upperHandle = block.inputValue(self.boundingBoxCorner2)
     corner1 = OpenMaya.MPoint(*lowerHandle.asDouble3())
     corner2 = OpenMaya.MPoint(*upperHandle.asDouble3())
     return OpenMaya.MBoundingBox(corner1, corner2)
Esempio n. 2
0
def getShapeBounds(shape):
    boundingBox = om.MBoundingBox()
    for item in shape.values():
        for point in item:
            boundingBox.expand(point)

    return boundingBox
Esempio n. 3
0
    def __init__(self, obj):
        omr.MPxDrawOverride.__init__(self, obj, footPrintDrawOverride.draw)

        ## We want to perform custom bounding box drawing
        ## so return True so that the internal rendering code
        ## will not draw it for us.
        self.mCustomBoxDraw = True
        self.mCurrentBoundingBox = om.MBoundingBox()
Esempio n. 4
0
    def addUIDrawables(self, objPath, drawManager, frameContext, data):
        if not isinstance(data, GuideSpineData):
            return

        normalVector = OpenMaya.MVector([1.0, 0.0, 0.0])
        bounding = OpenMaya.MBoundingBox(data.boundingBoxCorner1,
                                         data.boundingBoxCorner2)
        up = OpenMaya.MVector.kYaxisVector
        width = bounding.depth / 2.0
        height = bounding.height / 2.0

        dormantBorderColor = OpenMaya.MColor([0.0, 0.0, 0.8, 1.0])
        leadBorderColor = OpenMaya.MColor([1.0, 1.0, 1.0, 1.0])
        activeBorderColor = OpenMaya.MColor([0.4, 0.8, 1.0, 1.0])
        lineColor = OpenMaya.MColor([1.0, 1.0, 1.0, 1.0])
        fillColor = OpenMaya.MColor([0.0, 0.0, 1.0, 1.0])
        fillColor.a = 0.4
        borderWidth = 1.0
        lineWidth = 2.0

        displayStatus = OpenMayaRender.MGeometryUtilities.displayStatus(
            objPath)
        selected = True
        if displayStatus == util.DisplayStatus.Lead:
            borderColor = leadBorderColor
            borderWidth = 2.0
        elif displayStatus == util.DisplayStatus.Active:
            borderColor = activeBorderColor
            borderWidth = 2.0
        else:
            # kActiveAffected, kDormant, kHilite.
            borderColor = dormantBorderColor
            borderWidth = 1.0
            selected = False

        drawManager.beginDrawable()

        drawManager.setColor(borderColor)
        drawManager.setLineWidth(borderWidth)
        drawManager.rect(bounding.center,
                         up,
                         normalVector,
                         width,
                         height,
                         filled=False)
        # drawManager.setColor(fillColor)
        # drawManager.rect(bounding.center, up, normalVector, width, height, filled=True)

        # drawManager.setColor(OpenMaya.MColor([1.0, 1.0, 1.0, 1.0]))
        # for position in data.outputPoints:
        #     drawManager.sphere(position, 0.5, filled=False)

        drawManager.endDrawable()
Esempio n. 5
0
def get_inter_bbox(bbox1, bbox2):
    if not bbox1.intersects(bbox2):
        return None
    inter_min_x = max(bbox1.min().x, bbox2.min().x)
    inter_min_y = max(bbox1.min().y, bbox2.min().y)
    inter_min_z = max(bbox1.min().z, bbox2.min().z)
    inter_min = om.MPoint(inter_min_x, inter_min_y, inter_min_z, 1.0)

    inter_max_x = min(bbox1.max().x, bbox2.max().x)
    inter_max_y = min(bbox1.max().y, bbox2.max().y)
    inter_max_z = min(bbox1.max().z, bbox2.max().z)
    inter_max = om.MPoint(inter_max_x, inter_max_y, inter_max_z, 1.0)

    return om.MBoundingBox(inter_min, inter_max)
Esempio n. 6
0
    def boundingBox(self):
        ## Get the size
        ##
        thisNode = self.thisMObject()
        plug = om.MPlug(thisNode, footPrint.size)
        sizeVal = plug.asMDistance()
        multiplier = sizeVal.asCentimeters()

        corner1 = om.MPoint(-0.17, 0.0, -0.7)
        corner2 = om.MPoint(0.17, 0.0, 0.3)

        corner1 *= multiplier
        corner2 *= multiplier

        return om.MBoundingBox(corner1, corner2)
Esempio n. 7
0
    def getBoundingBox(self):
        """
        選択したオブジェクトのバウンディング情報を取得
        """

        self.boundingBox = om.MBoundingBox()
        self.pointArray = om.MPointArray()

        # ポイントの位置情報を取得
        self.pointArray = self.meshFn.getPoints(om.MSpace.kWorld)

        for points in range(len(self.pointArray)):
            self.point = self.pointArray[points]
            self.boundingBox.expand(self.point)

        return self.boundingBox
Esempio n. 8
0
    def boundingBox(self, objPath, cameraPath):
        controlNode = objPath.node()
        c1Plug = OpenMaya.MPlug(controlNode, self.GuideClass.boundingBoxCorner1)
        c2Plug = OpenMaya.MPlug(controlNode, self.GuideClass.boundingBoxCorner2)

        corner1Object = c1Plug.asMObject()
        corner2Object = c2Plug.asMObject()

        fnData = OpenMaya.MFnNumericData()
        fnData.setObject(corner1Object)
        corner1 = fnData.getData()
        fnData.setObject(corner2Object)
        corner2 = fnData.getData()

        corner1Point = OpenMaya.MPoint(corner1[0], corner1[1], corner1[2])
        corner2Point = OpenMaya.MPoint(corner2[0], corner2[1], corner2[2])
        return OpenMaya.MBoundingBox(corner1Point, corner2Point)
Esempio n. 9
0
    def computeBounds(self, plug, dataBlock):
        handleMatrix = OpenMaya.MMatrix(dataBlock.inputValue(self.handleMatrix).asMatrix())
        handleMatrixInverse = handleMatrix.inverse()

        projectedPoints = OpenMaya.MPointArray()
        matrices = dataBlock.inputArrayValue(self.childHandleMatrix)
        while not matrices.isDone():
            dataHandle = matrices.inputValue()

            idx = matrices.elementLogicalIndex()
            matrixPlug = OpenMaya.MPlug(plug.node(), self.childHandleMatrix).elementByLogicalIndex(idx)
            if matrixPlug.isConnected:
                childMatrix = OpenMaya.MMatrix(dataHandle.asMatrix())
                local = childMatrix * handleMatrixInverse
                pt = OpenMaya.MTransformationMatrix(local).translation(OpenMaya.MSpace.kPostTransform)
                projectedPoints.append(pt)
            matrices.next()

        outputArray = dataBlock.outputArrayValue(self.childPosition)
        builder = OpenMaya.MArrayDataBuilder(dataBlock, self.childPosition, len(projectedPoints))

        for i, pt in enumerate(projectedPoints):
            handle = builder.addElement(i)
            handle.set3Double(pt.x, pt.y, pt.z)

        outputArray.set(builder)
        dataBlock.setClean(self.childPosition)

        # Compute Bounding box based on child positions
        radius = 1
        bounds = OpenMaya.MBoundingBox(
            OpenMaya.MPoint(-radius, -radius, -radius),
            OpenMaya.MPoint(radius, radius, radius),
            )

        for pt in projectedPoints:
            bounds.expand(pt)

        lowerHandle = dataBlock.outputValue(self.boundingBoxCorner1)
        upperHandle = dataBlock.outputValue(self.boundingBoxCorner2)
        minPt = bounds.min
        maxPt = bounds.max
        lowerHandle.set3Double(minPt.x, minPt.y, minPt.z)
        upperHandle.set3Double(maxPt.x, maxPt.y, maxPt.z)
        lowerHandle.setClean()
        upperHandle.setClean()
Esempio n. 10
0
    def boundingBox(self):
        # Get the size
        # thisObject Returns the MObject associated with this user defined node.
        # This makes it possible to use MFnDependencyNode or to construct plugs to this node's attributes.
        thisNode = self.thisMObject()
        plug = OpenMaya.MPlug(thisNode, footPrint.size)
        sizeVal = plug.asMDistance()
        multiplier = sizeVal.asCentimeters()

        corner1 = OpenMaya.MPoint(-0.17, 0.0, -0.7)
        corner2 = OpenMaya.MPoint(0.17, 0.0, 0.3)

        # multiply corner values per footPrint.size attribute
        corner1 *= multiplier
        corner2 *= multiplier

        return OpenMaya.MBoundingBox(corner1, corner2)
Esempio n. 11
0
    def getBoundingBox(self, pMeshObj):
        ''' Calculate a bounding box around the mesh vertices. '''

        # Create the bounding box object we will populate with the points of the mesh.
        boundingBox = OpenMaya.MBoundingBox()

        meshFn = OpenMaya.MFnMesh(pMeshObj)

        pointArray = OpenMaya.MPointArray()

        # Get the points of the mesh in its local coordinate space.
        pointArray = meshFn.getPoints(OpenMaya.MSpace.kTransform)

        for i in range(0, len(pointArray)):
            point = pointArray[i]
            boundingBox.expand(point)

        return boundingBox
Esempio n. 12
0
    def __init__(self, obj):
        '''The constructor.
        The isAlwaysDirty flag in the MPxDrawOverride class is set to false so the draw override is updated when the node is marked dirty
        A callback is added to mark the node as dirty for certain circumstances (via MRenderer::setGeometryDrawDirty())
        '''
        omr.MPxDrawOverride.__init__(self, obj, None, False)

        self.m_CurrentBoundingBox = om.MBoundingBox()
        # Position of self and parent NSphere
        self.m_position = (0, 0, 0)
        self.m_parentPosition = (0, 0, 0)
        # Scale of transform node
        self.m_scale = (1.0, 1.0, 1.0)
        # Radius of self and parent NSphere
        self.m_radius = 1.0
        self.m_parentRadius = 1.0
        # List of centres and radii for each sphere to draw
        self.m_radii = []
        self.m_centres = []
Esempio n. 13
0
	def boundingBox(self):
		corner1 = om.MPoint( -0.5, 0.0, -0.5 )
		corner2 = om.MPoint( 0.5, 0.0, 0.5 )

		return om.MBoundingBox( corner1, corner2 )
Esempio n. 14
0
 def world_bounding_box(self):
     # type: () -> _om2.MBoundingBox
     bbox = _cmds.xform(self.mel_object, query=True, boundingBox=True)
     return _om2.MBoundingBox(_om2.MPoint(bbox[0], bbox[1], bbox[2]),
                              _om2.MPoint(bbox[3], bbox[4], bbox[5]))
Esempio n. 15
0
 def boundingBox(self, obj_path, camera_path):
     """
     """
     return om.MBoundingBox()
 def __init__(self):
     OpenMaya.MPxSurfaceShape.__init__(self)
     self.BBox = OpenMaya.MBoundingBox()
    def geometry(self, request, view, prim, writable, indexCount, indexArray,
                 vertexCount, vertexIDs, vertexArray, normalCount,
                 normalArrays, colorCount, colorArrays, texCoordCount,
                 texCoordArrays):

        if self.mDrawBoundingBox:
            points = ((ctypes.c_float * 3) *
                      vertexCount).from_buffer(vertexArray)

            # Compute the bounding box.
            box = om.MBoundingBox()
            for i in range(vertexCount):
                point = points[i]
                box.expand(om.MPoint(point[0], point[1], point[2]))

            # Draw the bounding box.
            wireColor = om.MColor((0.1, 0.15, 0.35))
            drawBoundingBox(box, wireColor)

        ## If we've received a color, that takes priority
        ##
        if colorCount > 0 and colorArrays[colorCount - 1] is not None:
            indexArray = (ctypes.c_uint).from_buffer(indexArray)
            vertexArray = (ctypes.c_float * 3).from_buffer(vertexArray)
            colorArray = (ctypes.c_float * 4).from_buffer(
                colorArrays[colorCount - 1])

            glPushAttrib(GL_ALL_ATTRIB_BITS)
            glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)
            glDisable(GL_LIGHTING)

            glEnableClientState(GL_COLOR_ARRAY)
            glColorPointer(4, GL_FLOAT, 0, colorArray)

            glEnableClientState(GL_VERTEX_ARRAY)
            glVertexPointer(3, GL_FLOAT, 0, vertexArray)
            glDrawElements(prim, indexCount, GL_UNSIGNED_INT, indexArray)

            glDisableClientState(GL_COLOR_ARRAY)

            glPopClientAttrib()
            glPopAttrib()
            return

        ## If this attribute is enabled, normals, tangents,
        ## and binormals can be visualized using false coloring.
        ## Negative values will clamp to black however.
        if normalCount > self.mNormalsPerVertex:
            normalCount = self.mNormalsPerVertex

        if normalCount > 0:
            indexArray = (ctypes.c_uint).from_buffer(indexArray)
            vertexArray = (ctypes.c_float * 3).from_buffer(vertexArray)
            normalArray = (ctypes.c_float * 3).from_buffer(
                normalArrays[normalCount - 1])

            glPushAttrib(GL_ALL_ATTRIB_BITS)
            glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)
            glDisable(GL_LIGHTING)

            glEnableClientState(GL_COLOR_ARRAY)
            glColorPointer(3, GL_FLOAT, 0, normalArray)

            glEnableClientState(GL_VERTEX_ARRAY)
            glVertexPointer(3, GL_FLOAT, 0, vertexArray)
            glDrawElements(prim, indexCount, GL_UNSIGNED_INT, indexArray)

            glDisableClientState(GL_COLOR_ARRAY)

            glPopClientAttrib()
            glPopAttrib()
            return

        self.draw(prim, writable, indexCount, indexArray, vertexCount,
                  vertexArray, colorCount, colorArrays)
    origMtx = origPath.inclusiveMatrix()
    shapeMob = origShapePath.node()
    nodeFn = om2.MFnDependencyNode(shapeMob)
    minValues = []
    maxValues = []
    for i in range(3):
        curPlug = nodeFn.findPlug("MinBoundingBox%s" % i, False)
        curValue = curPlug.asFloat()
        minValues.append(curValue)
    for i in range(3):
        curPlug = nodeFn.findPlug("MaxBoundingBox%s" % i, False)
        curValue = curPlug.asFloat()
        maxValues.append(curValue)
    minPnt = om2.MPoint(minValues)
    maxPnt = om2.MPoint(maxValues)
    objBBox = om2.MBoundingBox(minPnt, maxPnt)
    objWidth = objBBox.width * origMtx[0]
    objHeight = objBBox.height * origMtx[5]
    objDepth = objBBox.depth * origMtx[10]
else:
    raise RuntimeError(
        "Select an polygon mesh or plugin shape as source object.")
srcObj = origPath.fullPathName()

# Get the aim axis
if aimAxis.upper() == "X":
    aimAxis = om2.MVector.kXaxisVector
elif aimAxis.upper() == "Y":
    aimAxis = om2.MVector.kYaxisVector
elif aimAxis.upper() == "Z":
    aimAxis = om2.MVector.kZaxisVector
Esempio n. 19
0
 def boundingBox(self, obj_path, camera_path):
     return OpenMaya.MBoundingBox()
 def __init__(self):
     OpenMayaUI.MPxLocatorNode.__init__(self)
     self.BBox = OpenMaya.MBoundingBox()
Esempio n. 21
0
 def boundingBox(self, *args):
     return om.MBoundingBox(om.MPoint(-1, -1, 0), om.MPoint(1, 1, 0))
Esempio n. 22
0
 def boundingBox(self, objPath, cameraPath):
     return om.MBoundingBox()
Esempio n. 23
0
def printParticleInBoundingbox(start, end, parName, once=True):
    '''{'path':'Dynamics/Particles/printParticleInBoundingbox()ONLYSE',
'icon':':/particle.png',
'tip':'和物体穿插的粒子',
'usage':"""
#返回在指定的时间断内和选择的物体的boundingbox相穿插的粒子的id.
#在outline中选择,例如选择每个动画角色的组。
$fun( 1, 48, "nParticle1", once=True)
#start:
#    开始帧
#end:
#    结束帧
#parName:
#    粒子节点的名字
#once:
#    每次穿插都返回,还是每个粒子最多返回一次
""",
'help':"""<pre>
返回在指定的时间断内和选择的物体的boundingbox相穿插的粒子的id.
在outline中选择,例如选择每个动画角色的组。
start:
    开始帧
end:
    结束帧
parName:
    粒子节点的名字
once:
    每次穿插都返回,还是每个粒子最多返回一次
""",
}
'''
    import maya.api.OpenMaya as newom
    objects = cmds.ls(sl=True, type='transform')
    allIds = set()
    allDatas = []
    end = end + 1
    for curF in range(start, end):
        cmds.currentTime(curF, e=True)
        parIds = cmds.getParticleAttr(parName, at='particleId', array=True)
        if not parIds:
            continue
        parIds = [int(id) for id in parIds]

        bboxes = []
        for obj in objects:
            bbox = cmds.exactWorldBoundingBox(obj, ii=True)
            bboxes.append((obj,
                           newom.MBoundingBox(newom.MPoint(bbox[:3]),
                                              newom.MPoint(bbox[3:]))))

        parPos = cmds.getParticleAttr(parName, at='position', array=True)

        parIdWithPos = [(parIds[i],
                         newom.MPoint(parPos[i * 3], parPos[i * 3 + 1],
                                      parPos[i * 3 + 2]))
                        for i in range(len(parIds))]

        curFrameContainedIds = set()
        objsWithIds = []
        for obj, bbox in bboxes:
            curObjContained = []
            for id, pos, in parIdWithPos:
                if bbox.contains(pos):
                    if once and id in allIds:
                        continue
                    curObjContained.append(id)

            if curObjContained:
                objsWithIds.append((obj, curObjContained))
                curFrameContainedIds = curFrameContainedIds.union(
                    curObjContained)

        if objsWithIds:
            allIds = allIds.union(curFrameContainedIds)
            allDatas.append((curF, tuple(curFrameContainedIds), objsWithIds))

    #allDatas.sort()
    ttCount = 0
    dataStr = 'All ParticleId:%s\n' % (str(tuple(allIds)))
    for data in allDatas:
        dataStr += 'Frame:%s\n\t%s\n' % (data[0], data[1])
        ttCount += len(data[0])

    #infoFile = open( '.txt', 'w')
    #infoFile.write( dataStr )
    #os.startfile( '.txt' )
    print dataStr