示例#1
0
文件: lib.py 项目: adamcobabe/AnimIO
	def from_file( cls, input_file ):
		"""references imput_file into scene by using an unique namespace, returning
			FileReference as well as an iterator yielding AmimationHandles of input_file
			
		:return: tuple(FileReference, iterator of AnimationHandles)
		:param input_file: valid path to a maya file"""
		ahref=FileReference.create(input_file, loadReferenceDepth="topOnly")
		refns=ahref.namespace()
		return (ahref, cls.iter_instances(predicate = lambda x: x.namespace() == refns))
示例#2
0
 def _create_references(self, refpaths):
     """Create reference to the given reference paths, being strings to the file 
     in question"""
     for ref in refpaths:
         FileReference.create(ref)
示例#3
0
    def test_usage_examples(self):
        # NOTE: If this test fails ( because of name changes for instance ), the
        # documentation needs to be fixed as well, usage.rst.

        # NODES
        #######
        p = Node("persp")
        t = Node("time1")
        assert p == p
        assert p != t
        assert p in [p]

        s = set()
        s.add(p)
        s.add(t)
        assert p in s and t in s and len(s | s) == 2

        # getApiObject returns the api object which represents the underlying maya node best
        assert isinstance(p.apiObject(), api.MDagPath)
        assert isinstance(t.apiObject(), api.MObject)

        assert isinstance(p.dagPath(), api.MDagPath)
        assert isinstance(p.object(), api.MObject)

        # api types
        assert isinstance(p, Transform) and p.apiType() == api.MFn.kTransform
        assert isinstance(t, Time) and t.apiType() == api.MFn.kTime
        assert p.hasFn(p.apiType())

        # get the MObject representation
        assert isinstance(p.object(), api.MObject) and isinstance(
            t.object(), api.MObject)

        # METHODS
        #########
        self.failUnlessRaises(AttributeError, getattr, p, 'doesnt_exist')

        assert p.isFromReferencedFile() == p.isReferenced()

        assert isinstance(p.getMFnClasses(), list)

        # static methods #
        assert DependNode.classification(
            'lambert') == api.MFnDependencyNode.classification('lambert')
        rnl = RenderLayer.currentLayer()
        assert isinstance(rnl, Node)
        rnlobj = apirender.MFnRenderLayer.currentLayer()
        assert rnl == rnlobj
        assert isinstance(rnlobj, api.MObject)

        # enumerations #
        assert Node.Type.kMesh == api.MFn.kMesh
        assert Attribute.DisconnectBehavior.kReset == api.MFnAttribute.kReset
        assert Data.Type.kPlugin == api.MFnData.kPlugin

        assert Node.Type.nameByValue(api.MFn.kMesh) == 'kMesh'

        # DAG NAVIGATION
        ################
        ps = p.children()[0]
        assert ps == p[0]
        assert ps[-1] == p

        assert ps == p.shapes()[0]
        assert ps.parent() == p == ps.transform()

        # filtering
        assert len(p.childrenByType(Transform)) == 0
        assert p.childrenByType(Camera) == p.childrenByType(Shape)
        assert p.children(lambda n: n.apiType() == Node.Type.kCamera)[0] == ps

        # deep and iteration
        assert ps.iterParents().next() == p == ps.root()
        assert ps.parentDeep()[0] == p
        assert p.childrenDeep()[0] == ps

        # NODE CREATION
        ###############
        cs = createNode(
            "namespace:subspace:group|other:camera|other:cameraShape",
            "camera")
        assert len(cs.parentDeep()) == 2

        m = Mesh()
        assert isinstance(m, Mesh) and m.isValid()

        assert m == Mesh(forceNewLeaf=False)

        # NODE DUPLICATION
        ##################
        # this duplicated tweaks, set and shader assignments as well
        md = m.duplicate()
        assert md != m

        # NAMESPACES
        #############
        ons = cs.namespace()
        assert ons == cs[-1].namespace()  # namespace of parent node

        sns = cs[-2].namespace()
        assert sns != ons

        pns = sns.parent()
        assert pns.children()[0] == sns

        assert len(list(sns.iterNodes())) == 1
        assert len(list(pns.iterNodes())) == 0
        assert len(list(pns.iterNodes(depth=1))) == 1

        # DAG MANIPULATION
        ##################
        csp = cs.transform()
        cs.setParent(p)
        assert cs.instanceCount(0) == 1
        csi = cs.addParent(csp)

        assert csi.isInstanced() and cs.instanceCount(0) == 2
        assert csi != cs
        assert csi.object() == cs.object()

        assert cs.parentAtIndex(0) == p
        assert cs.parentAtIndex(1) == csp

        p.removeChild(csi)
        assert not cs.isValid() and csi.isValid()
        assert not csi.isInstanced()

        # reparent
        cspp = csp[-1]
        csi.reparent(cspp)

        csp.unparent()
        assert csp.parent() is None and len(csp.children()) == 0
        assert len(cspp.children()) == 1
        assert csi.instanceCount(0) == 1

        # NODE- AND GRAPH-ITERATION
        ###########################
        for dagnode in it.iterDagNodes():
            assert isinstance(dagnode, DagNode)

        for dg_or_dagnode in it.iterDgNodes():
            assert isinstance(dg_or_dagnode, DependNode)

        rlm = Node("renderLayerManager")
        assert len(list(it.iterGraph(rlm))) == 2

        # SELECTIONLISTS
        ################
        nl = (p, t, rlm)
        sl = toSelectionList(nl)
        assert isinstance(sl, api.MSelectionList) and len(sl) == 3

        sl2 = api.MSelectionList.mfromList(nl)
        sl3 = api.MSelectionList.mfromStrings([str(n) for n in nl])

        osl = selection()
        select(sl)
        select(p, t)
        # clear the selection
        select()
        assert len(selection()) == 0

        for n in sl.mtoIter():
            assert isinstance(n, DependNode)

        assert list(sl.mtoIter()) == sl.mtoList()
        assert list(sl.mtoIter()) == list(it.iterSelectionList(sl))

        # OBJECTSETS AND PARTITIONS
        ###########################
        objset = ObjectSet()
        aobjset = ObjectSet()
        partition = Partition()

        assert len(objset) == 0
        objset.addMembers(sl)
        objset.add(csp)
        aobjset.addMember(csi)
        assert len(objset) - 1 == len(sl)
        assert len(aobjset) == 1
        assert csp in objset

        partition.addSets([objset, aobjset])
        assert objset in partition and aobjset in partition
        partition.discard(aobjset)
        assert aobjset not in partition

        assert len(objset + aobjset) == len(objset) + len(aobjset)
        assert len(objset & aobjset) == 0
        aobjset.add(p)
        assert len(aobjset) == 2
        assert len(aobjset & objset) == 1
        assert len(aobjset - objset) == 1

        assert len(aobjset.clear()) == 0

        # COMPONENTS AND COMPONENT ASSIGNMENTS
        ######################################
        # create a polycube and pipe its output into our mesh shape
        isb = Node("initialShadingGroup")
        pc = PolyCube()
        pc.output.mconnectTo(m.inMesh)
        assert m.numVertices() == 8
        assert m not in isb  # it has no shaders on object level
        assert len(m.componentAssignments()) == 0  # nor on component leveld

        # object level
        m.addTo(isb)
        assert m in isb

        assert m.sets(m.fSetsRenderable)[0] == isb
        m.removeFrom(isb)
        assert not m.isMemberOf(isb)

        # component level
        isb.add(m, m.cf[range(0, 6, 2)])  # add every second face
        isb.discard(m, m.cf[:])  # remove all component assignments

        isb.add(m, m.cf[:3])  # add faces 0 to 2
        isb.add(m, m.cf[3])  # add single face 3
        isb.add(m, m.cf[4, 5])  # add remaining faces

        # query assignments
        se, comp = m.componentAssignments()[0]
        assert se == isb
        e = comp.elements()
        assert len(e) == 6  # we have added all 6 faces

        # Plugs and Attributes
        ######################
        # PLUGS #
        assert isinstance(p.translate, api.MPlug)
        assert p.translate == p.findPlug('t')
        assert p.t == p.translate

        # connections
        p.tx.mconnectTo(p.ty).mconnectTo(p.tz)
        assert p.tx.misConnectedTo(p.ty)
        assert p.ty.misConnectedTo(p.tz)
        assert not p.tz.misConnectedTo(p.ty)

        p.tx.mdisconnectFrom(p.ty).mdisconnectFrom(p.tz)
        assert len(p.ty.minputs()) + len(p.tz.minputs()) == 0
        assert p.tz.minput().isNull()

        p.tx.mconnectTo(p.tz, force=False)
        self.failUnlessRaises(RuntimeError, p.ty.mconnectTo, p.tz,
                              force=False)  # tz is already connected
        p.ty.mconnectTo(p.tz)  # force the connection, force defaults True
        p.tz.mdisconnect()  # disconnect all

        # query
        assert isinstance(p.tx.asFloat(), float)
        assert isinstance(t.outTime.asMTime(), api.MTime)

        ninst = p.instanceNumber()
        assert p.isInstancedAttribute(p.attribute('wm'))
        pewm = p.worldMatrix.elementByLogicalIndex(ninst)

        matfn = api.MFnMatrixData(pewm.asMObject())
        matrix = matfn.matrix()  # wrap data manually

        dat = pewm.masData()  # or get a wrapped version right away
        assert matrix == dat.matrix()

        # set values
        newx = 10.0
        p.tx.msetDouble(newx)
        assert p.tx.asDouble() == newx

        meshdata = m.outMesh.asMObject()
        meshfn = api.MFnMesh(meshdata)
        meshfn.deleteFace(0)  # delete one face of copied cube data
        assert meshfn.numPolygons() == 5

        mc = Mesh()  # create new empty mesh to
        mc.cachedInMesh.msetMObject(meshdata)  # hold the new mesh in the scene
        assert mc.numPolygons() == 5
        assert m.numPolygons() == 6

        # compounds and arrays
        ptc = p.t.mchildren()
        assert len(ptc) == 3
        assert (ptc[0] == p.tx) and (ptc[1] == p.ty)
        assert ptc[2] == p.t.mchildByName('tz')
        assert p.tx.parent() == p.t
        assert p.t.isCompound()
        assert p.tx.isChild()

        assert p.wm.isArray()
        assert len(p.wm) == 1

        for element_plug in p.wm:
            assert element_plug.isElement()

        # graph traversal
        mihistory = list(m.inMesh.miterInputGraph())
        assert len(mihistory) > 2
        assert mihistory[0] == m.inMesh
        assert mihistory[2] == pc.output  # ignore groupparts

        pcfuture = list(pc.output.miterOutputGraph())
        assert len(pcfuture) > 2
        assert pcfuture[0] == pc.output
        assert pcfuture[2] == m.inMesh  # ignore groupparts

        # ATTRIBUTES #
        cattr = CompoundAttribute.create("compound", "co")
        cattr.setArray(True)
        if cattr:
            sattr = TypedAttribute.create("string", "str", Data.Type.kString)
            pattr = NumericAttribute.createPoint("point", "p")
            mattr = MessageAttribute.create("mymessage", "mmsg")
            mattr.setArray(True)

            cattr.addChild(sattr)
            cattr.addChild(pattr)
            cattr.addChild(mattr)
        # END compound attribute

        n = Network()
        n.addAttribute(cattr)
        assert n.compound.isArray()
        assert n.compound.isCompound()
        assert len(n.compound.mchildren()) == 3
        assert n.compound.mchildByName('mymessage').isArray()

        n.removeAttribute(n.compound.attribute())

        # MESH COMPONENT ITERATION
        average_x = 0.0
        for vit in m.vtx:  # iterate the whole mesh
            average_x += vit.position().x
        average_x /= m.numVertices()
        assert m.vtx.iter.count() == m.numVertices()

        sid = 3
        for vit in m.vtx[sid:sid + 3]:  # iterate subsets
            assert sid == vit.index()
            sid += 1

        for eit in m.e:  # iterate edges
            eit.point(0)
            eit.point(1)

        for fit in m.f:  # iterate faces
            fit.isStarlike()
            fit.isPlanar()

        for mit in m.map:  # iterate face-vertices
            mit.faceId()
            mit.vertId()

        # SELECTIONS
        #############
        select(p.t, "time1", p, ps)
        assert len(selection()) == 4

        # simple filtering
        assert activeSelectionList().miterPlugs().next() == p.t
        assert selection(Node.Type.kTransform)[-1] == p

        # adjustments
        sl = activeSelectionList()
        sl.remove(0)  # remove plug
        select(sl)
        assert len(activeSelectionList()) == len(selection()) == 3

        assert len(selection(predicate=lambda n: n.isReferenced())) == 0

        # COMPONENTS AND PLUGS#
        sl = api.MSelectionList()
        sl.add(m.dagPath(), m.cf[:4])  # first 4 faces
        select(sl)
        assert len(
            activeSelectionList().miterComponents().next()[1].elements()) == 4

        sl.clear()
        sl.add(p.t)
        sl.add(m.outMesh)
        select(sl)
        assert len(selection()) == 2

        # NAMESPACES
        ############
        assert p.namespace() == RootNamespace
        # we created 2 namespaces implicitly with objects
        assert len(RootNamespace.children()) == 2

        barns = Namespace.create("foo:bar")
        foons = barns.parent()
        assert len(RootNamespace.children()) == 3

        assert len(list(barns.iterNodes())) == 0 and len(
            list(RootNamespace.iterNodes())) != 0

        # editing namespaces
        m.setNamespace(barns)
        assert m.namespace() == barns

        barns.moveNodes(foons)
        assert foons.iterNodes().next() == m

        # deleting / rename
        foons.delete()
        assert not barns.exists() and not foons.exists()
        assert m.namespace() == RootNamespace

        subns = Namespace.create("sub")
        subnsrenamed = subns.rename("bar")
        assert subnsrenamed != subns
        assert subnsrenamed.exists() and not subns.exists()

        # REFERENCES
        #############
        refa = FileReference.create(
            get_maya_file('ref8m.ma'))  # file with 8 meshes
        refb = FileReference.create(
            get_maya_file('ref2re.ma'))  # two subreferences with subreferences

        assert refb.isLoaded()
        assert len(FileReference.ls()) == 2

        assert len(refa.children()) == 0 and len(refb.children()) == 2
        subrefa, subrefb = refb.children()

        assert subrefa.namespace() != subrefb.namespace()
        assert subrefa.path() == subrefb.path()
        assert subrefa.parent() == refb

        refa.setLoaded(False)
        assert not refa.isLoaded()
        assert refa.setLoaded(True).isLoaded()

        assert len(list(refa.iterNodes(Node.Type.kMesh))) == 8

        refa.remove()
        refb.remove()
        assert not refa.exists() and not refb.exists()
        assert len(FileReference.ls()) == 0

        # SCENE
        #######
        empty_scene = get_maya_file('empty.ma')
        mrv.Scene.open(empty_scene, force=1)
        assert mrv.Scene.name().tonative() == empty_scene

        files = list()

        def beforeAndAfterNewCB(data):
            assert data is None
            files.append(mrv.Scene.name())

        mrv.Scene.beforeNew = beforeAndAfterNewCB
        mrv.Scene.afterNew = beforeAndAfterNewCB

        assert len(files) == 0
        mrv.Scene.new()
        assert len(files) == 2
        assert files[0].tonative() == empty_scene

        mrv.Scene.beforeNew.remove(beforeAndAfterNewCB)
        mrv.Scene.afterNew.remove(beforeAndAfterNewCB)

        # UNDO
        ######
        @undoable
        def undoable_func(delobj):
            p.tx.mconnectTo(p.tz)
            delobj.delete()

        p = Node("persp")
        t = Transform()
        assert not p.tx.misConnectedTo(p.tz)
        assert t.isValid() and t.isAlive()
        undoable_func(t)
        assert p.tx.misConnectedTo(p.tz)
        assert not t.isValid() and t.isAlive()

        cmds.undo()
        assert not p.tx.misConnectedTo(p.tz)
        assert t.isValid() and t.isAlive()

        # Advanced Uses #
        ur = undo.UndoRecorder()
        ur.startRecording()
        p.tx.mconnectTo(p.ty)
        p.tx.mconnectTo(p.tz)
        ur.stopRecording()
        p.t.mconnectTo(t.t)

        assert p.tx.misConnectedTo(p.ty)
        assert p.tx.misConnectedTo(p.tz)
        assert p.t.misConnectedTo(t.t)
        ur.undo()
        assert not p.tx.misConnectedTo(p.ty)
        assert not p.tx.misConnectedTo(p.tz)
        assert p.t.misConnectedTo(t.t)

        # PERSISTENCE
        #############
        did = 'dataid'
        sn = StorageNode()
        snn = sn.name()
        pd = sn.pythonData(did, autoCreate=True)

        pd[0] = "hello"
        pd['l'] = [1, 2, 3]

        tmpscene = tempfile.gettempdir() + "/persistence.mb"
        mrv.Scene.save(tmpscene)
        mrv.Scene.open(tmpscene)

        sn = Node(snn)
        pd = sn.pythonData(did)
        assert len(pd) == 2
        assert pd[0] == "hello"
        assert pd['l'] == [1, 2, 3]

        objset = sn.objectSet(did, 0, autoCreate=True)
        objset.add(Transform())

        mrv.Scene.save(tmpscene)
        mrv.Scene.open(tmpscene)

        assert len(Node(snn).objectSet(did, 0)) == 1

        os.remove(tmpscene)

        # ABOUT METHODS AND TYPES
        #########################
        p = Node("persp")
        ps = p.child(0)  # method originally on MFnDagNode
        assert isinstance(ps, DagNode)

        self.failUnlessRaises(TypeError, ps.hasSamePerspective, ps)
        assert ps.hasSamePerspective(ps.dagPath())  # method on MFnCamera
示例#4
0
	def test_usage_examples(self):
		# NOTE: If this test fails ( because of name changes for instance ), the 
		# documentation needs to be fixed as well, usage.rst.
		
		# NODES
		#######
		p = Node("persp")
		t = Node("time1")
		assert p == p
		assert p != t
		assert p in [p]
		
		s = set()
		s.add(p)
		s.add(t)
		assert p in s and t in s and len(s | s) == 2
		
		# getApiObject returns the api object which represents the underlying maya node best
		assert isinstance(p.apiObject(), api.MDagPath)
		assert isinstance(t.apiObject(), api.MObject)
		
		assert isinstance(p.dagPath(), api.MDagPath)
		assert isinstance(p.object(), api.MObject)
		
		# api types
		assert isinstance(p, Transform) and p.apiType() == api.MFn.kTransform
		assert isinstance(t, Time) and t.apiType() == api.MFn.kTime
		assert p.hasFn(p.apiType())
		
		# get the MObject representation
		assert isinstance(p.object(), api.MObject) and isinstance(t.object(), api.MObject)
		
		
		# METHODS
		#########
		self.failUnlessRaises(AttributeError, getattr, p, 'doesnt_exist')
		
		assert p.isFromReferencedFile() == p.isReferenced()
		
		assert isinstance(p.getMFnClasses(), list)
		
		# static methods #
		assert DependNode.classification('lambert') == api.MFnDependencyNode.classification('lambert')
		rnl = RenderLayer.currentLayer()
		assert isinstance(rnl, Node)
		rnlobj = apirender.MFnRenderLayer.currentLayer()
		assert rnl == rnlobj
		assert isinstance(rnlobj, api.MObject)
		
		# enumerations #
		assert Node.Type.kMesh == api.MFn.kMesh
		assert Attribute.DisconnectBehavior.kReset == api.MFnAttribute.kReset
		assert Data.Type.kPlugin == api.MFnData.kPlugin
		
		assert Node.Type.nameByValue(api.MFn.kMesh) == 'kMesh'
		
		# DAG NAVIGATION
		################
		ps = p.children()[0]
		assert ps == p[0]
		assert ps[-1] == p
		
		assert ps == p.shapes()[0]
		assert ps.parent() == p == ps.transform()
		
		# filtering
		assert len(p.childrenByType(Transform)) == 0
		assert p.childrenByType(Camera) == p.childrenByType(Shape)
		assert p.children(lambda n: n.apiType()==Node.Type.kCamera)[0] == ps
		
		# deep and iteration
		assert ps.iterParents().next() == p == ps.root()
		assert ps.parentDeep()[0] == p
		assert p.childrenDeep()[0] == ps
		
		# NODE CREATION
		###############
		cs = createNode("namespace:subspace:group|other:camera|other:cameraShape", "camera")
		assert len(cs.parentDeep()) == 2
		
		m = Mesh()
		assert isinstance(m, Mesh) and m.isValid()
		
		assert m == Mesh(forceNewLeaf=False) 
		
		# NODE DUPLICATION
		##################
		# this duplicated tweaks, set and shader assignments as well
		md = m.duplicate()
		assert md != m
		
		# NAMESPACES
		#############
		ons = cs.namespace()
		assert ons == cs[-1].namespace()	# namespace of parent node
		
		sns = cs[-2].namespace()
		assert sns != ons
		
		pns = sns.parent()
		assert pns.children()[0] == sns
		
		assert len(list(sns.iterNodes())) == 1
		assert len(list(pns.iterNodes())) == 0
		assert len(list(pns.iterNodes(depth=1))) == 1
		
		# DAG MANIPULATION
		##################
		csp = cs.transform()
		cs.setParent(p)
		assert cs.instanceCount(0) == 1
		csi = cs.addParent(csp)
		
		assert csi.isInstanced() and cs.instanceCount(0) == 2
		assert csi != cs
		assert csi.object() == cs.object()
		
		assert cs.parentAtIndex(0) == p
		assert cs.parentAtIndex(1) == csp
		
		p.removeChild(csi)
		assert not cs.isValid() and csi.isValid()
		assert not csi.isInstanced()
		
		
		# reparent
		cspp = csp[-1]
		csi.reparent(cspp)
		
		csp.unparent()
		assert csp.parent() is None and len(csp.children()) == 0
		assert len(cspp.children()) == 1
		assert csi.instanceCount(0) == 1
		
		
		# NODE- AND GRAPH-ITERATION
		###########################
		for dagnode in it.iterDagNodes():
			assert isinstance(dagnode, DagNode)
			
		for dg_or_dagnode in it.iterDgNodes():
			assert isinstance(dg_or_dagnode, DependNode)
		
		rlm = Node("renderLayerManager")
		assert len(list(it.iterGraph(rlm))) == 2
		
		# SELECTIONLISTS
		################
		nl = (p, t, rlm)
		sl = toSelectionList(nl)
		assert isinstance(sl, api.MSelectionList) and len(sl) == 3
		
		sl2 = api.MSelectionList.mfromList(nl)
		sl3 = api.MSelectionList.mfromStrings([str(n) for n in nl])
		
		
		osl = selection()
		select(sl)
		select(p, t)
		# clear the selection
		select()
		assert len(selection()) == 0
		
		for n in sl.mtoIter():
			assert isinstance(n, DependNode)
		
		assert list(sl.mtoIter()) == sl.mtoList()
		assert list(sl.mtoIter()) == list(it.iterSelectionList(sl))
		
		# OBJECTSETS AND PARTITIONS
		###########################
		objset = ObjectSet()
		aobjset = ObjectSet()
		partition = Partition()
		
		assert len(objset) == 0
		objset.addMembers(sl)
		objset.add(csp)
		aobjset.addMember(csi)
		assert len(objset)-1 == len(sl)
		assert len(aobjset) == 1
		assert csp in objset
		
		partition.addSets([objset, aobjset])
		assert objset in partition and aobjset in partition
		partition.discard(aobjset)
		assert aobjset not in partition
		
		assert len(objset + aobjset) == len(objset) + len(aobjset)
		assert len(objset & aobjset) == 0
		aobjset.add(p)
		assert len(aobjset) == 2
		assert len(aobjset & objset) == 1
		assert len(aobjset - objset) == 1
		
		assert len(aobjset.clear()) == 0
		
		
		# COMPONENTS AND COMPONENT ASSIGNMENTS
		######################################
		# create a polycube and pipe its output into our mesh shape
		isb = Node("initialShadingGroup")
		pc = PolyCube()
		pc.output.mconnectTo(m.inMesh)
		assert m.numVertices() == 8
		assert m not in isb                            # it has no shaders on object level
		assert len(m.componentAssignments()) == 0   # nor on component leveld 
		
		# object level
		m.addTo(isb)
		assert m in isb
		
		assert m.sets(m.fSetsRenderable)[0] == isb
		m.removeFrom(isb)
		assert not m.isMemberOf(isb)
		
		# component level
		isb.add(m, m.cf[range(0,6,2)])     # add every second face
		isb.discard(m, m.cf[:])	            # remove all component assignments
		
		isb.add(m, m.cf[:3])				# add faces 0 to 2
		isb.add(m, m.cf[3])					# add single face 3
		isb.add(m, m.cf[4,5])				# add remaining faces
		
		# query assignments
		se, comp = m.componentAssignments()[0]
		assert se == isb
		e = comp.elements()
		assert len(e) == 6					# we have added all 6 faces
		
		
		# Plugs and Attributes
		######################
		# PLUGS #
		assert isinstance(p.translate, api.MPlug)
		assert p.translate == p.findPlug('t')
		assert p.t == p.translate
		
		# connections
		p.tx.mconnectTo(p.ty).mconnectTo(p.tz)
		assert p.tx.misConnectedTo(p.ty)
		assert p.ty.misConnectedTo(p.tz)
		assert not p.tz.misConnectedTo(p.ty)
		
		p.tx.mdisconnectFrom(p.ty).mdisconnectFrom(p.tz)
		assert len(p.ty.minputs()) + len(p.tz.minputs()) == 0
		assert p.tz.minput().isNull()
		
		p.tx.mconnectTo(p.tz, force=False)
		self.failUnlessRaises(RuntimeError, p.ty.mconnectTo, p.tz, force=False)     # tz is already connected
		p.ty.mconnectTo(p.tz)                              # force the connection, force defaults True
		p.tz.mdisconnect()                                    # disconnect all
		
		# query
		assert isinstance(p.tx.asFloat(), float)
		assert isinstance(t.outTime.asMTime(), api.MTime)
		
		ninst = p.instanceNumber()
		assert p.isInstancedAttribute(p.attribute('wm')) 
		pewm = p.worldMatrix.elementByLogicalIndex(ninst)
		
		matfn = api.MFnMatrixData(pewm.asMObject())
		matrix = matfn.matrix()                       # wrap data manually

		dat = pewm.masData()							# or get a wrapped version right away
		assert matrix == dat.matrix()
	
		
		# set values
		newx = 10.0
		p.tx.msetDouble(newx)
		assert p.tx.asDouble() == newx
		
		meshdata = m.outMesh.asMObject()
		meshfn = api.MFnMesh(meshdata)
		meshfn.deleteFace(0)                        # delete one face of copied cube data
		assert meshfn.numPolygons() == 5
		
		mc = Mesh()                                 # create new empty mesh to 
		mc.cachedInMesh.msetMObject(meshdata)        # hold the new mesh in the scene
		assert mc.numPolygons() == 5
		assert m.numPolygons() == 6
		
		# compounds and arrays
		ptc = p.t.mchildren()
		assert len(ptc) == 3
		assert (ptc[0] == p.tx) and (ptc[1] == p.ty)
		assert ptc[2] == p.t.mchildByName('tz')
		assert p.tx.parent() == p.t
		assert p.t.isCompound()
		assert p.tx.isChild()
		
		assert p.wm.isArray()
		assert len(p.wm) == 1
		
		for element_plug in p.wm:
			assert element_plug.isElement()
			
		# graph traversal
		mihistory = list(m.inMesh.miterInputGraph())
		assert len(mihistory) > 2
		assert mihistory[0] == m.inMesh
		assert mihistory[2] == pc.output		# ignore groupparts
		
		pcfuture = list(pc.output.miterOutputGraph())
		assert len(pcfuture) > 2
		assert pcfuture[0] == pc.output
		assert pcfuture[2] == m.inMesh			# ignore groupparts
		
		# ATTRIBUTES #
		cattr = CompoundAttribute.create("compound", "co")
		cattr.setArray(True)
		if cattr:
			sattr = TypedAttribute.create("string", "str", Data.Type.kString)
			pattr = NumericAttribute.createPoint("point", "p")
			mattr = MessageAttribute.create("mymessage", "mmsg")
			mattr.setArray(True)
			
			cattr.addChild(sattr)
			cattr.addChild(pattr)
			cattr.addChild(mattr)
		# END compound attribute
		
		n = Network()
		n.addAttribute(cattr)
		assert n.compound.isArray()
		assert n.compound.isCompound()
		assert len(n.compound.mchildren()) == 3
		assert n.compound.mchildByName('mymessage').isArray()
		
		n.removeAttribute(n.compound.attribute())
		
		
		# MESH COMPONENT ITERATION
		average_x = 0.0
		for vit in m.vtx:                  # iterate the whole mesh
			average_x += vit.position().x
		average_x /= m.numVertices()
		assert m.vtx.iter.count() == m.numVertices()
		
		sid = 3
		for vit in m.vtx[sid:sid+3]:       # iterate subsets
			assert sid == vit.index()
			sid += 1
		
		for eit in m.e:                    # iterate edges
			eit.point(0); eit.point(1)
			
		for fit in m.f:                    # iterate faces
			fit.isStarlike(); fit.isPlanar()
			
		for mit in m.map:                  # iterate face-vertices
			mit.faceId(); mit.vertId() 
		
		
		# SELECTIONS
		#############
		select(p.t, "time1", p, ps)
		assert len(selection()) == 4
		
		# simple filtering
		assert activeSelectionList().miterPlugs().next() == p.t
		assert selection(Node.Type.kTransform)[-1] == p
		
		# adjustments
		sl = activeSelectionList()
		sl.remove(0)		# remove plug
		select(sl)
		assert len(activeSelectionList()) == len(selection()) == 3
		
		assert len(selection(predicate=lambda n: n.isReferenced())) == 0
		
		# COMPONENTS AND PLUGS#
		sl = api.MSelectionList()
		sl.add(m.dagPath(), m.cf[:4])			# first 4 faces
		select(sl)
		assert len(activeSelectionList().miterComponents().next()[1].elements()) == 4
		
		sl.clear()
		sl.add(p.t)
		sl.add(m.outMesh)
		select(sl)
		assert len(selection()) == 2
		
		
		# NAMESPACES
		############
		assert p.namespace() == RootNamespace
		# we created 2 namespaces implicitly with objects
		assert len(RootNamespace.children()) == 2
		
		barns = Namespace.create("foo:bar")
		foons = barns.parent()
		assert len(RootNamespace.children()) == 3
		
		assert len(list(barns.iterNodes())) == 0 and len(list(RootNamespace.iterNodes())) != 0
		
		
		# editing namespaces
		m.setNamespace(barns)
		assert m.namespace() == barns
		
		barns.moveNodes(foons)
		assert foons.iterNodes().next() == m
		
		# deleting / rename
		foons.delete()
		assert not barns.exists() and not foons.exists()
		assert m.namespace() == RootNamespace
		
		subns = Namespace.create("sub")
		subnsrenamed = subns.rename("bar")
		assert subnsrenamed != subns
		assert subnsrenamed.exists() and not subns.exists() 
		
		
		# REFERENCES 
		#############
		refa = FileReference.create(get_maya_file('ref8m.ma'))     # file with 8 meshes
		refb = FileReference.create(get_maya_file('ref2re.ma'))    # two subreferences with subreferences
		
		assert refb.isLoaded()
		assert len(FileReference.ls()) == 2
		
		assert len(refa.children()) == 0 and len(refb.children()) == 2
		subrefa, subrefb = refb.children()
		
		assert subrefa.namespace() != subrefb.namespace()
		assert subrefa.path() == subrefb.path()
		assert subrefa.parent() == refb
		
		refa.setLoaded(False)
		assert not refa.isLoaded()
		assert refa.setLoaded(True).isLoaded()
		
		assert len(list(refa.iterNodes(Node.Type.kMesh))) == 8
		
		refa.remove(); refb.remove()
		assert not refa.exists() and not refb.exists()
		assert len(FileReference.ls()) == 0
		
		
		# SCENE
		#######
		empty_scene = get_maya_file('empty.ma')
		mrv.Scene.open(empty_scene, force=1)
		assert mrv.Scene.name().tonative() == empty_scene
		
		files = list()
		def beforeAndAfterNewCB( data ):
			assert data is None
			files.append(mrv.Scene.name())
			
		mrv.Scene.beforeNew = beforeAndAfterNewCB
		mrv.Scene.afterNew = beforeAndAfterNewCB
		
		assert len(files) == 0
		mrv.Scene.new()
		assert len(files) == 2
		assert files[0].tonative() == empty_scene
		
		mrv.Scene.beforeNew.remove(beforeAndAfterNewCB)
		mrv.Scene.afterNew.remove(beforeAndAfterNewCB)
		
		
		# UNDO
		######
		@undoable
		def undoable_func( delobj ):
			p.tx.mconnectTo(p.tz)
			delobj.delete()
		
		p = Node("persp")
		t = Transform()
		assert not p.tx.misConnectedTo(p.tz)
		assert t.isValid() and t.isAlive()
		undoable_func(t)
		assert p.tx.misConnectedTo(p.tz)
		assert not t.isValid() and t.isAlive()
		
		cmds.undo()
		assert not p.tx.misConnectedTo(p.tz)
		assert t.isValid() and t.isAlive()
		
		# Advanced Uses #
		ur = undo.UndoRecorder()
		ur.startRecording()
		p.tx.mconnectTo(p.ty)
		p.tx.mconnectTo(p.tz)
		ur.stopRecording()
		p.t.mconnectTo(t.t)
		
		assert p.tx.misConnectedTo(p.ty)
		assert p.tx.misConnectedTo(p.tz)
		assert p.t.misConnectedTo(t.t)
		ur.undo()
		assert not p.tx.misConnectedTo(p.ty)
		assert not p.tx.misConnectedTo(p.tz)
		assert p.t.misConnectedTo(t.t)
		
		
		# PERSISTENCE
		#############
		did = 'dataid'
		sn = StorageNode()
		snn = sn.name()
		pd = sn.pythonData( did, autoCreate = True )
		
		pd[0] = "hello"
		pd['l'] = [1,2,3]
		
		tmpscene = tempfile.gettempdir() + "/persistence.mb"
		mrv.Scene.save(tmpscene)
		mrv.Scene.open(tmpscene)
		
		sn = Node(snn)
		pd = sn.pythonData( did )
		assert len(pd) == 2
		assert pd[0]  == "hello"
		assert pd['l'] == [1,2,3]
		
		objset = sn.objectSet(did, 0, autoCreate=True)
		objset.add(Transform())
		
		mrv.Scene.save(tmpscene)
		mrv.Scene.open(tmpscene)
		
		assert len(Node(snn).objectSet(did, 0)) == 1
		
		os.remove(tmpscene)
		
		# ABOUT METHODS AND TYPES
		#########################
		p = Node("persp")
		ps = p.child(0)			# method originally on MFnDagNode
		assert isinstance(ps, DagNode)
		
		self.failUnlessRaises(TypeError, ps.hasSamePerspective, ps)
		assert ps.hasSamePerspective(ps.dagPath())		# method on MFnCamera
示例#5
0
 def test_plugin_handling(self):
     mrp = "Mayatomr"
     pp = 'persistence'
     assert not cmds.pluginInfo(mrp, q=1, loaded=1)
     
     assert not hasattr(nt, 'Transmat')
     cmds.loadPlugin(mrp)
     
     # loading a plugin will add the node types
     assert hasattr(nt, 'Transmat')
     assert nt.typ.nodeTypeTree.has_node('transmat')
     tmat = nt.Transmat()    # mr dep node
     tmat.delete()
     
     dll = nt.MapVizShape()  # mr dag node
     assert isinstance(dll, nt.DagNode)
     dll.delete()
     cmds.flushUndo()    # make sure we get rid of the custom data
     
     
     # custom node types are favored and not overwritten by dummies when 
     # loading
     assert nt.StorageNode is mstorage.StorageNode
     
     # custom node types will remain when unloaded
     cmds.unloadPlugin(pp)
     assert not cmds.pluginInfo(pp, q=1, loaded=1) 
     assert hasattr(nt, 'StorageNode')
     
     # unloading a plugin will remove the nodetypes as well as the hierarchy 
     # entries
     # NOTE: on OSX unloading the plugin beautifully crashes maya, probably
     # a memory exception as MR claims to have had a peak memory of 136 GB
     # As a final goal, this test should be fixed to run here, there 
     # probably is some kind of workaround.
     # http://tracking.byronimo.de/view.php?id=144
     mr_testobj = "contour_composite1"
     if sys.platform != 'darwin':
         cmds.unloadPlugin(mrp, force=1)
         
         assert not hasattr(nt, 'Transmat')
         assert not hasattr(nt, 'MapVizShape')
         assert not nt.typ.nodeTypeTree.has_node('transmat')
         assert not nt.typ.nodeTypeTree.has_node('mapVizShape')
     
 
         # plugins required by a scene trigger the database to update as well
         assert not cmds.pluginInfo(mrp, q=1, loaded=1)
         assert not nt.objExists('transmat1')
         needs_mr_scene = get_maya_file('needsMayatomr.ma')
         mrvmaya.Scene.open(needs_mr_scene, force=True)
         assert hasattr(nt, 'Transmat')
         assert not nt.objExists(mr_testobj), "object shouldn't exist if it works"
         
         # try it during reference and import scenarios
         mrvmaya.Scene.new(force=True)
         cmds.unloadPlugin(mrp, force=0)
         assert not hasattr(nt, 'Transmat')
         
         FileReference.create(needs_mr_scene)
         assert hasattr(nt, 'Transmat'), "Should have triggered the callback"
         assert not nt.objExists(mr_testobj), "object shouldn't exist if it works"
         
         # try import
         mrvmaya.Scene.new(force=True)
         cmds.unloadPlugin(mrp, force=0)
         assert not hasattr(nt, 'Transmat')
         
         
         cmds.file(needs_mr_scene, i=True)
         assert hasattr(nt, 'Transmat'), "Should have triggered callback by import"
         assert not nt.objExists(mr_testobj), "object shouldn't exist if it works"
     # END skip this on osx
     
     assert not nt.objExists(mr_testobj)
     cmds.undoInfo(st=0)
     mod = api.MDGModifier()
     mod.createNode('transmat')
     assert not nt.objExists(mr_testobj), "Shouldn't actually create the object even if undo is off"
     cmds.undoInfo(st=1)
     
     # dynamically added types (which will not trigger a plugin changed event)
     # can be wrapped as well
     customMI = get_maya_file('customshader.mi')
     csn = "testCustomShader"
     csnc = "TestCustomShader"
     mrvmaya.Mel.mrFactory('-load',customMI)
     
     # it doesnt exist, but can be wrapped nontheless, then it exists
     assert not hasattr(nt, csnc)
     cs = nt.Node(cmds.createNode(csn))
     assert hasattr(nt, csnc)