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))
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)
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
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
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)