def testTimeException( self ) : sphere = maya.cmds.polySphere( name="pSphere1" ) maya.cmds.setKeyframe( "pSphere1", attribute="tx", t="0sec", v=1 ) maya.cmds.setKeyframe( "pSphere1", attribute="ty", t="0sec", v=2 ) maya.cmds.setKeyframe( "pSphere1", attribute="tz", t="0sec", v=3 ) maya.cmds.setKeyframe( "pSphere1", attribute="tx", t="1sec", v=4 ) maya.cmds.setKeyframe( "pSphere1", attribute="ty", t="1sec", v=5 ) maya.cmds.setKeyframe( "pSphere1", attribute="tz", t="1sec", v=6 ) scene = IECoreMaya.LiveScene() transformChild = scene.child( "pSphere1" ) # move to frame -1: maya.cmds.currentTime( -1 ) # test it returns the correct transform in local space self.assertRaises( RuntimeError, IECore.curry( transformChild.readTransform, 0.0 ) ) self.assertRaises( RuntimeError, IECore.curry( transformChild.readTransform, 0.5 ) ) self.assertRaises( RuntimeError, IECore.curry( transformChild.readTransform, 1.0 ) )
def testAnimatedBound( self ) : # Currently fails, because I'm pulling on the boundingBox plugs at arbitrary # times, and that doesn't work, although it kind of should! maya.cmds.polyCube( name = "pCube1" ) maya.cmds.createNode( "transform", name = "pCube1Parent" ) maya.cmds.parent( "pCube1", "pCube1Parent" ) maya.cmds.setKeyframe( "pCube1", attribute="tx", t="0sec", v=0 ) maya.cmds.setKeyframe( "pCube1", attribute="tx", t="1sec", v=-1 ) scene = IECoreMaya.LiveScene() transformChild = scene.child( "pCube1Parent" ) maya.cmds.currentTime( "0.0sec" ) self.assertEqual( transformChild.readBound( 0.0 ), IECore.Box3d( IECore.V3d( -0.5, -0.5, -0.5 ), IECore.V3d( 0.5, 0.5, 0.5 ) ) ) maya.cmds.currentTime( "0.5sec" ) self.assertEqual( transformChild.readBound( 0.5 ), IECore.Box3d( IECore.V3d( -1.0, -0.5, -0.5 ), IECore.V3d( 0.0, 0.5, 0.5 ) ) ) maya.cmds.currentTime( "1.0sec" ) self.assertEqual( transformChild.readBound( 1.0 ), IECore.Box3d( IECore.V3d( -1.5, -0.5, -0.5 ), IECore.V3d( -0.5, 0.5, 0.5 ) ) )
def testNoDuplicateAttributeNames(self): t = maya.cmds.createNode("transform") maya.cmds.currentTime("0sec") maya.cmds.addAttr(t, ln="ieAttr_test", at="bool") doDuplicateNameTest = True def myAttributeNames(node): if not doDuplicateNameTest: return [] return ["user:test"] def readMyAttribute(node, attr): if not doDuplicateNameTest: return None if attr == "user:test": return IECore.IntData(1) IECoreMaya.LiveScene.registerCustomAttributes(myAttributeNames, readMyAttribute) try: scene = IECoreMaya.LiveScene() transformScene = scene.child(str(t)) # we've specified an attribute called "user:test" in two ways - once through an ieAttr_, # once through a custom reader. The name "user:test" should only appear once: self.assertEqual(len(transformScene.attributeNames()), 2) self.assertEqual(set(transformScene.attributeNames()), set(["scene:visible", "user:test"])) # The custom reader should override the ieAttr_ self.failUnless( isinstance(transformScene.readAttribute("user:test", 0), IECore.IntData)) finally: doDuplicateNameTest = False
def testReadMesh(self): # create a cube: maya.cmds.polyCube(name="pCube1") # transform a bit, so we can check it's returning the mesh in world space: maya.cmds.setAttr("pCube1.tx", 0.1) maya.cmds.setAttr("pCube1.ty", 0.2) maya.cmds.setAttr("pCube1.tz", 0.3) maya.cmds.setAttr("pCube1.rx", 10) maya.cmds.setAttr("pCube1.ry", 20) maya.cmds.setAttr("pCube1.rz", 30) scene = IECoreMaya.LiveScene() cube = scene.child("pCube1") # read mesh at time 0: maya.cmds.currentTime("0.0sec") mesh = cube.readObject(0) vertList = list(mesh["P"].data) # check it's got the right length: self.assertEqual(len(vertList), 8) # check it's got the right verts: self.assertEqual(vertList.count(IECore.V3f(-0.5, -0.5, 0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(0.5, -0.5, 0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(-0.5, 0.5, 0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(0.5, 0.5, 0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(-0.5, 0.5, -0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(0.5, 0.5, -0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(-0.5, -0.5, -0.5)), 1) self.assertEqual(vertList.count(IECore.V3f(0.5, -0.5, -0.5)), 1) # check read primvars self.assertEqual(mesh["P"], cube.readObjectPrimitiveVariables(["P"], 0)["P"])
def testSceneMethod( self ) : sphere = maya.cmds.polySphere( name="pSphere1" ) sphere2 = maya.cmds.polySphere( name="pSphere2" ) sphere3 = maya.cmds.polySphere( name="pSphere3" ) maya.cmds.parent( "pSphere2", "pSphere1" ) maya.cmds.parent( "pSphere3", "pSphere1" ) scene = IECoreMaya.LiveScene() self.assertEqual( str( scene.scene( ["pSphere1"] ).name() ), "pSphere1" ) # does it still return absolute paths if we've gone to another location? scene = scene.scene( ["pSphere1"] ) self.assertEqual( str( scene.scene( [] ).name() ), "/" ) self.assertEqual( str( scene.scene( ["pSphere1", "pSphere2"] ).name() ), "pSphere2" ) self.assertEqual( str( scene.scene( ["pSphere1", "pSphere3"] ).name() ), "pSphere3" ) self.assertEqual( scene.scene( ["idontexist"], IECore.SceneInterface.MissingBehaviour.NullIfMissing ), None ) self.assertRaises( RuntimeError, IECore.curry( scene.scene, ["idontexist"] ) )
def testHasChild( self ) : sphere = maya.cmds.polySphere( name="pSphere1" ) sphere2 = maya.cmds.polySphere( name="pSphere2" ) sphere3 = maya.cmds.polySphere( name="pSphere3" ) maya.cmds.parent( "pSphere2", "pSphere1" ) maya.cmds.parent( "pSphere3", "pSphere1" ) scene = IECoreMaya.LiveScene() child = scene.child( "pSphere1" ) self.assertEqual( scene.hasChild("pSphere1"), True ) self.assertEqual( child.hasChild("pSphere1Shape"), False ) self.assertEqual( child.hasChild("pSphere2"), True ) self.assertEqual( child.hasChild("pSphere3"), True ) self.assertEqual( child.hasChild("pSphere3Shape"), False ) self.assertEqual( child.hasChild("pSphere2Shape"), False ) self.assertEqual( child.hasChild("asdfasdf"), False )
def testSceneShapeVisible( self ) : # make sure we are at time 0 maya.cmds.currentTime( "0sec" ) scene = IECoreMaya.LiveScene() envShape = str( IECoreMaya.FnSceneShape.create( "ieScene1" ).fullPathName() ) envNode = 'ieScene1' envScene = scene.child( envNode ) self.failUnless( IECore.InternedString( "scene:visible" ) in envScene.attributeNames() ) maya.cmds.setAttr( envShape+'.file', 'test/IECore/data/sccFiles/animatedSpheres.scc',type='string' ) self.failUnless( IECore.InternedString( "scene:visible" ) in envScene.attributeNames() ) maya.cmds.setAttr( "ieScene1.visibility", False ) self.assertEqual( envScene.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) ) maya.cmds.setAttr( "ieScene1.visibility", True ) self.assertEqual( envScene.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) maya.cmds.setAttr( envShape + ".visibility", False ) self.assertEqual( envScene.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) )
def testConvertsMayaSetsOfSetsToTags( self ) : maya.cmds.createNode( "transform", name="sharedParent" ) sphere = maya.cmds.polySphere( name="pSphere" )[0] maya.cmds.select( sphere ) maya.cmds.sets(name="mySet") maya.cmds.addAttr("mySet", longName="ieExport", at="bool") maya.cmds.setAttr("mySet.ieExport", True) maya.cmds.select( "mySet" ) maya.cmds.sets(name="mySet2") maya.cmds.addAttr("mySet2", longName="ieExport", at="bool") maya.cmds.setAttr("mySet2.ieExport", True) root = IECoreMaya.LiveScene() tags = root.child('pSphere').readTags() self.assertEqual( len(tags), 2) self.assertEqual( set(tags), set([IECore.InternedString("mySet"), IECore.InternedString("mySet2")]))
def testNames( self ) : sphere = maya.cmds.polySphere( name="pSphere1" ) sphere2 = maya.cmds.polySphere( name="pSphere2" ) sphere3 = maya.cmds.polySphere( name="pSphere3" ) maya.cmds.parent( "pSphere2", "pSphere1" ) maya.cmds.parent( "pSphere3", "pSphere1" ) scene = IECoreMaya.LiveScene() sphere1 = scene.child( "pSphere1" ) sphere2 = sphere1.child( "pSphere2" ) sphere3 = sphere1.child( "pSphere3" ) self.assertEqual( str( scene.name() ), "/" ) self.assertEqual( str( sphere1.name() ), "pSphere1" ) self.assertEqual( str( sphere2.name() ), "pSphere2" ) self.assertEqual( str( sphere3.name() ), "pSphere3" )
def testAnimatedMeshBound( self ) : # Currently fails, because I'm pulling on the boundingBox plugs at arbitrary # times, and that doesn't work, although it kind of should! maya.cmds.polyCube( name = "pCube2" ) # create a skin cluster to animate vertex 0: maya.cmds.select( cl=True ) maya.cmds.select( "pCube2.vtx[0]", r=True ) cluster = maya.mel.eval( 'newCluster "-envelope 1"' )[1] maya.cmds.setKeyframe( cluster, attribute="tx", t="0sec" ) maya.cmds.setKeyframe( cluster, attribute="tx", t="1sec", v=-1 ) scene = IECoreMaya.LiveScene() transformChild = scene.child( "pCube2" ) maya.cmds.currentTime( "0.0sec" ) self.assertEqual( transformChild.readBound( 0.0 ), imath.Box3d( imath.V3d( -0.5, -0.5, -0.5 ), imath.V3d( 0.5, 0.5, 0.5 ) ) ) maya.cmds.currentTime( "0.5sec" ) self.assertEqual( transformChild.readBound( 0.5 ), imath.Box3d( imath.V3d( -1.0, -0.5, -0.5 ), imath.V3d( 0.5, 0.5, 0.5 ) ) ) maya.cmds.currentTime( "1.0sec" ) self.assertEqual( transformChild.readBound( 1.0 ), imath.Box3d( imath.V3d( -1.5, -0.5, -0.5 ), imath.V3d( 0.5, 0.5, 0.5 ) ) )
def testPaths( self ) : sphere = maya.cmds.polySphere( name="pSphere1" ) sphere2 = maya.cmds.polySphere( name="pSphere2" ) sphere3 = maya.cmds.polySphere( name="pSphere3" ) maya.cmds.parent( "pSphere2", "pSphere1" ) maya.cmds.parent( "pSphere3", "pSphere1" ) scene = IECoreMaya.LiveScene() sphere1 = scene.child( "pSphere1" ) sphere2 = sphere1.child( "pSphere2" ) sphere3 = sphere1.child( "pSphere3" ) self.assertEqual( scene.path(), [] ) self.assertEqual( sphere1.path(), [ "pSphere1" ] ) self.assertEqual( sphere2.path(), [ "pSphere1", "pSphere2" ] ) self.assertEqual( sphere3.path(), [ "pSphere1", "pSphere3" ] )
def testTags(self): self.writeTagSCC(file=SceneShapeTest.__testFile) maya.cmds.file(new=True, f=True) node = maya.cmds.createNode('ieSceneShape') fn = IECoreMaya.FnSceneShape(node) transform = str(maya.cmds.listRelatives(node, parent=True)[0]) maya.cmds.setAttr(node + '.file', SceneShapeTest.__testFile, type='string') scene = IECoreMaya.LiveScene().child(transform) self.assertEqual( sorted([ str(x) for x in scene.readTags( IECoreScene.SceneInterface.TagFilter.EveryTag) ]), ["ObjectType:MeshPrimitive", "a", "b", "c", "top"]) self.assertEqual(sorted([str(x) for x in scene.readTags()]), ["top"]) for tag in scene.readTags( IECoreScene.SceneInterface.TagFilter.EveryTag): self.assertTrue( scene.hasTag(tag, IECoreScene.SceneInterface.TagFilter.EveryTag)) self.assertFalse( scene.hasTag("fakeTag", IECoreScene.SceneInterface.TagFilter.EveryTag)) # double expanding because the first level has all the same tags childFn = fn.expandOnce()[0].expandOnce()[0] scene = childFn.sceneInterface() self.assertEqual( set([ str(x) for x in scene.readTags( IECoreScene.SceneInterface.TagFilter.DescendantTag | IECoreScene.SceneInterface.TagFilter.LocalTag) ]), set(["ObjectType:MeshPrimitive", "b", "c"])) self.assertEqual(sorted([str(x) for x in scene.readTags()]), ["ObjectType:MeshPrimitive", "b"]) for tag in scene.readTags( IECoreScene.SceneInterface.TagFilter.EveryTag): self.assertTrue( scene.hasTag(tag, IECoreScene.SceneInterface.TagFilter.EveryTag)) self.assertFalse( scene.hasTag("fakeTag", IECoreScene.SceneInterface.TagFilter.EveryTag)) childFn = childFn.expandOnce()[0] scene = childFn.sceneInterface() self.assertEqual( sorted([ str(x) for x in scene.readTags( IECoreScene.SceneInterface.TagFilter.DescendantTag | IECoreScene.SceneInterface.TagFilter.LocalTag) ]), ["ObjectType:MeshPrimitive", "c"]) self.assertEqual(sorted([str(x) for x in scene.readTags()]), ["ObjectType:MeshPrimitive", "c"]) for tag in scene.readTags( IECoreScene.SceneInterface.TagFilter.EveryTag): self.assertTrue( scene.hasTag(tag, IECoreScene.SceneInterface.TagFilter.EveryTag)) self.assertFalse( scene.hasTag("fakeTag", IECoreScene.SceneInterface.TagFilter.EveryTag))
def testSceneVisible( self ) : maya.cmds.createNode( "transform", name = "t1" ) maya.cmds.createNode( "transform", name = "t2" ) scene = IECoreMaya.LiveScene() t1 = scene.child( "t1" ) t2 = scene.child( "t2" ) self.assertEqual( t1.attributeNames(), ["scene:visible"] ) self.assertEqual( t2.attributeNames(), ["scene:visible"] ) self.assertEqual( t1.hasAttribute( "scene:visible" ), True ) self.assertEqual( t2.hasAttribute( "scene:visible" ), True ) self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) self.assertEqual( t2.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) # test visibility on transform: maya.cmds.setAttr( "t1.visibility", False ) self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) ) self.assertEqual( t2.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) maya.cmds.setAttr( "t1.visibility", True ) # test visibility on shape. Add a mesh to the two transforms, along with an image plane to confuse it: maya.cmds.createNode( "mesh", name = "m1", parent="t1" ) maya.cmds.createNode( "imagePlane", name = "i1", parent="t1" ) maya.cmds.createNode( "imagePlane", name = "i2", parent="t2" ) maya.cmds.createNode( "mesh", name = "m2", parent="t2" ) maya.cmds.setAttr( "i1.visibility", False ) maya.cmds.setAttr( "i2.visibility", False ) # these should both be visible, as cortex ignores image planes and the meshes are visible: self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) self.assertEqual( t2.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) maya.cmds.setAttr( "m1.visibility", False ) maya.cmds.setAttr( "m2.visibility", False ) # should both be invisible now, as we've hidden the meshes: self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) ) self.assertEqual( t2.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) ) # test override of maya visibility with ieVisibility attribute maya.cmds.addAttr( "t1", ln="ieVisibility", at="bool" ) maya.cmds.setAttr( "t1.visibility", False ) maya.cmds.setAttr( "m1.visibility", False ) maya.cmds.setAttr( "t1.ieVisibility", True ) self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( True ) ) # shape ieVisibility should be ignored since we set the transform level to invisible maya.cmds.addAttr( "m1", ln="ieVisibility", at="bool" ) maya.cmds.setAttr( "t1.visibility", False ) maya.cmds.setAttr( "t1.ieVisibility", False ) maya.cmds.setAttr( "m1.ieVisibility", True ) self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) ) # shape ieVisibility should override the transform ieVisibility maya.cmds.setAttr( "t1.visibility", False ) maya.cmds.setAttr( "t1.ieVisibility", True ) maya.cmds.setAttr( "m1.ieVisibility", False ) self.assertEqual( t1.readAttribute( "scene:visible", 0 ), IECore.BoolData( False ) )
def testCustomAttributes( self ) : t = maya.cmds.createNode( "transform" ) maya.cmds.select( clear = True ) sphere = maya.cmds.polySphere( name="pSphere" ) maya.cmds.currentTime( "0sec" ) doTest = True def myAttributeNames( node ) : if not doTest: return [] if not node: return ["root"] dagPath = IECoreMaya.StringUtil.dagPathFromString(node) try: dagPath.extendToShapeDirectlyBelow(0) except: return ["transformAttribute"] if dagPath.apiType() != maya.OpenMaya.MFn.kMesh : return [] return ["shapeAttribute"] def readMyAttribute( node, attr ) : if not doTest: return None if not node : if attr == "root": return IECore.BoolData( True ) return None dagPath = IECoreMaya.StringUtil.dagPathFromString(node) try: dagPath.extendToShapeDirectlyBelow(0) except: if attr == "shapeAttribute": return None return IECore.FloatData( 5 ) if attr == "transformAttribute": return None if dagPath.apiType() != maya.OpenMaya.MFn.kMesh : return None return IECore.StringData("mesh") try: IECoreMaya.LiveScene.registerCustomAttributes( myAttributeNames, readMyAttribute ) scene = IECoreMaya.LiveScene() transformScene = scene.child(str(t)) sphereScene = scene.child('pSphere') self.assertEqual( set( scene.attributeNames() ), set( [ "scene:visible", "root" ] ) ) self.assertEqual( scene.readAttribute("anyAttr", 0.0), IECore.NullObject.defaultNullObject() ) self.assertEqual( scene.readAttribute("scene:visible", 0.0), IECore.BoolData(True) ) self.assertEqual( scene.readAttribute("root", 0.0), IECore.BoolData(True) ) self.assertEqual( transformScene.attributeNames(), [ IECore.InternedString("scene:visible"), IECore.InternedString("transformAttribute") ] ) self.assertEqual( transformScene.hasAttribute("shapeAttribute"), False ) self.assertEqual( transformScene.readAttribute("shapeAttribute", 0.0), IECore.NullObject.defaultNullObject() ) self.assertEqual( transformScene.readAttribute( "transformAttribute", 0.0), IECore.FloatData(5) ) self.assertEqual( sphereScene.attributeNames(), [ IECore.InternedString("scene:visible"), IECore.InternedString('shapeAttribute') ] ) self.assertEqual( sphereScene.readAttribute( "shapeAttribute", 0.0), IECore.StringData("mesh") ) finally: # Disable custom attribute functions so they don't mess with other tests doTest = False
def testCustomTags( self ) : t = maya.cmds.createNode( "transform" ) maya.cmds.select( clear = True ) sphere = maya.cmds.polySphere( name="pSphere" ) doTest = True def hasMyTags( node, tag, tagFilter ) : #'archivable' should be on all transforms and 'renderable' only at shape transforms. if not doTest: return False if tag not in ( "renderable", "archivable" ) : return False if tag == "archivable" : return True dagPath = IECoreMaya.StringUtil.dagPathFromString(node) try: dagPath.extendToShapeDirectlyBelow(0) except: return False if not ( tagFilter & IECoreScene.SceneInterface.TagFilter.LocalTag ) : return False if dagPath.apiType() != maya.OpenMaya.MFn.kMesh : return False return dagPath.fullPathName().endswith("Shape") def readMyTags( node, tagFilter ) : #'archivable' should be on all transforms and 'renderable' only at shape transforms. if not doTest: return [] result = [ "archivable" ] dagPath = IECoreMaya.StringUtil.dagPathFromString(node) try: dagPath.extendToShapeDirectlyBelow(0) except: return result if tagFilter & IECoreScene.SceneInterface.TagFilter.LocalTag and dagPath.apiType() == maya.OpenMaya.MFn.kMesh : result.append( "renderable" ) return result IECoreMaya.LiveScene.registerCustomTags( hasMyTags, readMyTags ) scene = IECoreMaya.LiveScene() transformScene = scene.child(str(t)) sphereScene = scene.child('pSphere') self.assertFalse( scene.hasTag( 'renderable' ) ) self.assertFalse( scene.hasTag( 'archivable' ) ) self.assertEqual( scene.readTags(), [] ) self.assertFalse( transformScene.hasTag( 'renderable' ) ) self.assertTrue( transformScene.hasTag( 'archivable' ) ) self.assertEqual( transformScene.readTags(), [ IECore.InternedString('archivable') ] ) self.assertEqual( set(sphereScene.readTags()), set([ IECore.InternedString('renderable'), IECore.InternedString('archivable') ]) ) self.assertEqual( set(sphereScene.readTags( IECoreScene.SceneInterface.TagFilter.EveryTag )), set([ IECore.InternedString('renderable'), IECore.InternedString('archivable') ]) ) self.assertEqual( sphereScene.readTags( IECoreScene.SceneInterface.TagFilter.AncestorTag ), [ IECore.InternedString('archivable') ] ) self.assertTrue( sphereScene.hasTag( 'renderable') ) self.assertTrue( sphereScene.hasTag( 'archivable') ) # Disable custom tag functions so they don't mess with other tests doTest = False
def testFileName( self ) : scene = IECoreMaya.LiveScene() self.assertRaises( RuntimeError, scene.fileName )
def testReadBound(self): # create some cubes: maya.cmds.polyCube(name="pCube1") maya.cmds.polyCube(name="pCube2") maya.cmds.polyCube(name="pCube3") maya.cmds.polyCube(name="pCube4") maya.cmds.parent("pCube2", "pCube1") maya.cmds.parent("pCube3", "pCube1") maya.cmds.setAttr("pCube4.tx", 3) maya.cmds.setAttr("pCube4.ty", 3) maya.cmds.setAttr("pCube4.tz", 3) maya.cmds.setAttr("pCube2.tx", 1) maya.cmds.setAttr("pCube2.ty", 1) maya.cmds.setAttr("pCube2.tz", 1) maya.cmds.setAttr("pCube3.tx", -1) maya.cmds.setAttr("pCube3.ty", -1) maya.cmds.setAttr("pCube3.tz", -1) scene = IECoreMaya.LiveScene() cube4Transform = scene.child("pCube4") cube1Transform = scene.child("pCube1") maya.cmds.currentTime("0.0sec") self.assertEqual( scene.readBound(0.0), IECore.Box3d(IECore.V3d(-1.5, -1.5, -1.5), IECore.V3d(3.5, 3.5, 3.5))) self.assertEqual( cube4Transform.readBound(0.0), IECore.Box3d(IECore.V3d(-0.5, -0.5, -0.5), IECore.V3d(0.5, 0.5, 0.5))) # check it's including its children: self.assertEqual( cube1Transform.readBound(0.0), IECore.Box3d(IECore.V3d(-1.5, -1.5, -1.5), IECore.V3d(1.5, 1.5, 1.5))) maya.cmds.setAttr("pCube1.tx", 1) maya.cmds.setAttr("pCube1.ty", 1) maya.cmds.setAttr("pCube1.tz", 1) # should be in object space!!! self.assertEqual( cube1Transform.readBound(0.0), IECore.Box3d(IECore.V3d(-1.5, -1.5, -1.5), IECore.V3d(1.5, 1.5, 1.5))) cube2Transform = cube1Transform.child("pCube2") self.assertEqual( cube2Transform.readBound(0.0), IECore.Box3d(IECore.V3d(-0.5, -0.5, -0.5), IECore.V3d(0.5, 0.5, 0.5))) cube3Transform = cube1Transform.child("pCube3") self.assertEqual( cube3Transform.readBound(0.0), IECore.Box3d(IECore.V3d(-0.5, -0.5, -0.5), IECore.V3d(0.5, 0.5, 0.5)))
def testSceneShapeCustomReaders(self): # make sure we are at time 0 maya.cmds.currentTime("0sec") scene = IECoreMaya.LiveScene() envShape = str( IECoreMaya.FnSceneShape.create("ieScene1").fullPathName()) envNode = 'ieScene1' envScene = scene.child(envNode) self.assertFalse( envScene.hasAttribute(IECore.LinkedScene.linkAttribute)) maya.cmds.setAttr(envShape + '.file', 'test/IECore/data/sccFiles/environment.lscc', type='string') self.assertTrue(envScene.hasAttribute( IECore.LinkedScene.linkAttribute)) spheresShape = str( IECoreMaya.FnSceneShape.create("ieScene2").fullPathName()) spheresNode = 'ieScene2' maya.cmds.setAttr(spheresShape + '.file', 'test/IECore/data/sccFiles/animatedSpheres.scc', type='string') self.assertEqual( set(scene.childNames()).intersection([envNode, spheresNode]), set([envNode, spheresNode])) self.assertTrue( IECore.LinkedScene.linkAttribute in envScene.attributeNames()) self.assertEqual( envScene.readAttribute(IECore.LinkedScene.linkAttribute, 0), IECore.CompoundData({ "fileName": IECore.StringData( 'test/IECore/data/sccFiles/environment.lscc'), "root": IECore.InternedStringVectorData() })) self.assertFalse(envScene.hasObject()) spheresScene = scene.child(spheresNode) self.assertTrue( spheresScene.hasAttribute(IECore.LinkedScene.linkAttribute)) self.assertEqual( spheresScene.readAttribute(IECore.LinkedScene.linkAttribute, 0), IECore.CompoundData({ "fileName": IECore.StringData( 'test/IECore/data/sccFiles/animatedSpheres.scc'), "root": IECore.InternedStringVectorData() })) self.assertFalse(spheresScene.hasObject()) # expand the scene fnSpheres = IECoreMaya.FnSceneShape(spheresShape) fnSpheres.expandAll() self.assertFalse( spheresScene.hasAttribute(IECore.LinkedScene.linkAttribute)) leafScene = spheresScene.child("A").child("a") self.assertTrue( leafScene.hasAttribute(IECore.LinkedScene.linkAttribute)) # When expanding, we connect the child time attributes to their scene shape parent time attribute to propagate time remapping. When checking for time remapping, the scene shape # currently only checks the direct connection, so we have here time in the link attributes. Will have to look out for performance issues. self.assertEqual( leafScene.readAttribute(IECore.LinkedScene.linkAttribute, 0), IECore.CompoundData({ "fileName": IECore.StringData( 'test/IECore/data/sccFiles/animatedSpheres.scc'), "root": IECore.InternedStringVectorData(['A', 'a']), 'time': IECore.DoubleData(0) })) self.assertFalse(leafScene.hasObject()) # expand scene to meshes fnSpheres.convertAllToGeometry() self.assertFalse( leafScene.hasAttribute(IECore.LinkedScene.linkAttribute)) self.assertTrue(leafScene.hasObject()) self.assertTrue( isinstance(leafScene.readObject(0), IECore.MeshPrimitive)) # test time remapped scene readers... spheresShape = str(maya.cmds.createNode('ieSceneShape')) maya.cmds.setAttr(spheresShape + '.file', 'test/IECore/data/sccFiles/animatedSpheres.scc', type='string') maya.cmds.setAttr(spheresShape + '.time', 24.0 * 10) spheresScene = scene.child('ieScene3') self.assertTrue( spheresScene.hasAttribute(IECore.LinkedScene.linkAttribute)) self.assertEqual( spheresScene.readAttribute(IECore.LinkedScene.linkAttribute, 0), IECore.CompoundData({ "fileName": IECore.StringData( 'test/IECore/data/sccFiles/animatedSpheres.scc'), "root": IECore.InternedStringVectorData(), "time": IECore.DoubleData(10.0) }))
def testCustomAttributes(self): t = maya.cmds.createNode("transform") maya.cmds.select(clear=True) sphere = maya.cmds.polySphere(name="pSphere") maya.cmds.currentTime("0sec") attrFnResult = [] mightHaveFnResult = [] doTest = True def readMyAttribute(node, attr): return None def myAttributeNames(node): if not doTest: return [] attrFnResult.append(node) return ["mightHaveAttribute2"] def myAttributeMightHave(node, attr): if not doTest: return False mightHaveFnResult.append((node, attr)) return attr in ["mightHaveAttribute1", "mightHaveAttribute2"] try: IECoreMaya.LiveScene.registerCustomAttributes( myAttributeNames, readMyAttribute, myAttributeMightHave) scene = IECoreMaya.LiveScene() transformScene = scene.child(str(t)) self.assertEqual( transformScene.hasAttribute("nonExistentCustomAttribute"), False) self.assertEqual( mightHaveFnResult[0][1], "nonExistentCustomAttribute" ) # myAttributeMightHave() should always be called when specified. self.assertEqual( len(attrFnResult), 0 ) # myAttributeNames() should not have been called because myAttributeMightHave had returned False. self.assertEqual( transformScene.hasAttribute("mightHaveAttribute1"), False) self.assertEqual(mightHaveFnResult[1][1], "mightHaveAttribute1") self.assertEqual( len(attrFnResult), 1 ) # myAttributeNames() should have been called because myAttributeMightHave had returned True. self.assertEqual( transformScene.hasAttribute("mightHaveAttribute2"), True) self.assertEqual(mightHaveFnResult[2][1], "mightHaveAttribute2") self.assertEqual(len(attrFnResult), 2) finally: # Disable custom attribute functions so they don't mess with other tests doTest = False