def testAttribWrangleName( self ) : geo = hou.node( "/obj" ).createNode( "geo" ) torus = geo.createNode( "torus" ) torus.parm( "rows" ).set( 10 ) torus.parm( "cols" ).set( 10 ) name = torus.createOutputNode( "name" ) name.parm( "name1" ).set( "/a" ) wrangle = name.createOutputNode( "attribwrangle" ) wrangle.parm( "class" ).set( 1 ) # primitive wrangle.parm( "snippet" ).set( 's@name = "/b";' ) # since the geo is named it doesn't count as a # local object, but rather as a child scene. name.setRenderFlag( True ) scene = IECoreHoudini.LiveScene( geo.path() ) self.assertFalse( scene.hasObject() ) self.assertEqual( scene.childNames(), [ "a" ] ) childScene = scene.child( "a" ) self.assertTrue( childScene.hasObject() ) self.assertEqual( childScene.childNames(), [] ) self.assertEqual( childScene.readObject( 0 ).variableSize( IECore.PrimitiveVariable.Interpolation.Uniform ), 100 ) # this is still true after wrangling the name attrib, # which we are testing because attribwrangle nodes # do not clean up the mess they've made with the # string table for attributes. wrangle.setRenderFlag( True ) scene = IECoreHoudini.LiveScene( geo.path() ) self.assertFalse( scene.hasObject() ) self.assertEqual( scene.childNames(), [ "b" ] ) childScene = scene.child( "b" ) self.assertTrue( childScene.hasObject() ) self.assertEqual( childScene.childNames(), [] ) self.assertEqual( childScene.readObject( 0 ).variableSize( IECore.PrimitiveVariable.Interpolation.Uniform ), 100 ) # it works for nested names too wrangle.parm( "snippet" ).set( 's@name = "/c/d/e";' ) scene = IECoreHoudini.LiveScene( geo.path() ) self.assertFalse( scene.hasObject() ) self.assertEqual( scene.childNames(), [ "c" ] ) childScene = scene.child( "c" ) self.assertFalse( childScene.hasObject() ) self.assertEqual( childScene.childNames(), [ "d" ] ) childScene = childScene.child( "d" ) self.assertFalse( childScene.hasObject() ) self.assertEqual( childScene.childNames(), [ "e" ] ) childScene = childScene.child( "e" ) self.assertTrue( childScene.hasObject() ) self.assertEqual( childScene.childNames(), [] ) self.assertEqual( childScene.readObject( 0 ).variableSize( IECore.PrimitiveVariable.Interpolation.Uniform ), 100 )
def test() : scene = IECoreHoudini.LiveScene() self.assertEqual( scene.childNames(), [ "boxes" ] ) boxesScene = scene.child( "boxes" ) self.assertEqual( boxesScene.childNames(), [ "box1", "box2" ] ) self.assertFalse( boxesScene.hasObject() ) box1Scene = boxesScene.child( "box1" ) self.assertEqual( box1Scene.childNames(), [] ) self.assertTrue( box1Scene.hasObject() ) box1Obj = box1Scene.readObject( 0 ) self.assertTrue( isinstance( box1Obj, IECore.MeshPrimitive ) ) self.assertEqual( box1Obj.numFaces(), 6 ) self.assertTrue( box1Obj.arePrimitiveVariablesValid() ) box2Scene = boxesScene.child( "box2" ) self.assertEqual( box2Scene.childNames(), [] ) self.assertTrue( box2Scene.hasObject() ) box2Obj = box2Scene.readObject( 0 ) self.assertTrue( isinstance( box2Obj, IECore.MeshPrimitive ) ) self.assertEqual( box2Obj.numFaces(), 6 ) self.assertTrue( box2Obj.arePrimitiveVariablesValid() ) self.assertNotEqual( box1Obj, box2Obj ) box2Obj["P"] = box1Obj["P"] self.assertEqual( box1Obj, box2Obj )
def buildScene( self ) : obj = hou.node( "/obj" ) sub1 = obj.createNode( "subnet", "sub1" ) sub2 = obj.createNode( "subnet", "sub2" ) box1 = sub1.createOutputNode( "geo", "box1", run_init_scripts=False ) box1.createNode( "box", "actualBox" ) actualBox = box1.children()[0] bname = actualBox.createOutputNode( "name" ) bname.parm( "name1" ).set( "/" ) torus = box1.createNode( "torus" ) torus.parm( "rows" ).set( 10 ) torus.parm( "cols" ).set( 10 ) tname = torus.createOutputNode( "name" ) tname.parm( "name1" ).set( "/gap/torus" ) merge = bname.createOutputNode( "merge" ) merge.setInput( 1, tname ) merge.setRenderFlag( True ) box2 = obj.createNode( "geo", "box2", run_init_scripts=False ) box2.createNode( "box", "actualBox" ) torus1 = sub1.createNode( "geo", "torus1", run_init_scripts=False ) actualTorus1 = torus1.createNode( "torus", "actualTorus" ) actualTorus1.parm( "rows" ).set( 10 ) actualTorus1.parm( "cols" ).set( 10 ) torus2 = torus1.createOutputNode( "geo", "torus2", run_init_scripts=False ) actualTorus2 = torus2.createNode( "torus", "actualTorus" ) actualTorus2.parm( "rows" ).set( 10 ) actualTorus2.parm( "cols" ).set( 10 ) return IECoreHoudini.LiveScene()
def testStringArrayDetail( self ) : obj = hou.node( "/obj" ) box1 = obj.createNode( "geo", "box1", run_init_scripts = False ) box1.createNode( "box", "actualBox" ) actualBox = box1.children()[0] wrangle = actualBox.createOutputNode( "attribwrangle" ) wrangle.parm( "class" ).set( 0 ) wrangle.parm( "snippet" ).set( """ string tmp[] = {"stringA", "stringB", "stringC"}; string tmp2 = "stringD"; s[]@foo = tmp; s@bar = tmp2; """ ) wrangle.setRenderFlag( True ) obj = IECoreHoudini.LiveScene().child( "box1" ).readObject( 0.0 ) self.assertTrue( "foo" in obj.keys() ) self.assertTrue( "bar" in obj.keys() ) self.assertEqual( obj["foo"].data, IECore.StringVectorData( ['stringA', 'stringB', 'stringC'] ) ) self.assertEqual( obj["bar"].data, IECore.StringData( 'stringD' ) )
def testMultipleTransforms( self ) : obj = hou.node( "/obj" ) sub1 = obj.createNode( "subnet", "sub1" ) sub2 = sub1.createNode( "subnet", "sub2" ) sub2.setInput( 0, hou.node( "/obj/sub1" ).indirectInputs()[0] ) sub3 = sub1.createOutputNode( "subnet", "sub3" ) sub1.parmTuple("t").set( (5.0,5.0,0.0) ) sc = IECoreHoudini.LiveScene() sub1Sc = sc.scene(["sub1"]) sub1Transform = sub1Sc.readTransform( 0 ).value self.assertEqual( sub1Transform.translate, IECore.V3d( 5.0, 5.0, 0.0 ) ) sub2Sc = sub1Sc.child("sub2") sub2Transform = sub2Sc.readTransform( 0 ).value self.assertEqual( sub2Transform.translate, IECore.V3d( 0.0, 0.0, 0.0 ) ) sub3Sc = sub1Sc.child("sub3") sub3Transform = sub3Sc.readTransform( 0 ).value self.assertEqual( sub3Transform.translate, IECore.V3d( 0.0, 0.0, 0.0 ) )
def testDefaultTime( self ) : self.buildScene() box = hou.node( "/obj/box1" ) deformer = box.renderNode().createOutputNode( "twist" ) deformer.parm( "paxis" ).set( 1 ) deformer.parm( "strength" ).setExpression( "10*($T+1.0/$FPS)" ) deformer.setRenderFlag( True ) self.assertNotEqual( hou.time(), 0.5 ) self.assertEqual( deformer.cookCount(), 0 ) scene = IECoreHoudini.LiveScene( box.path(), defaultTime = 0.5 ) self.assertEqual( scene.getDefaultTime(), 0.5 ) self.assertEqual( deformer.cookCount(), 1 ) self.assertTrue( scene.hasObject() ) self.assertEqual( deformer.cookCount(), 1 ) self.assertEqual( scene.childNames(), [ "gap" ] ) self.assertEqual( deformer.cookCount(), 1 ) mesh0_5 = scene.readObject( 0.5 ) self.assertEqual( deformer.cookCount(), 1 ) self.assertEqual( len(mesh0_5["P"].data), 8 ) self.assertAlmostEqual( mesh0_5["P"].data[0].x, -0.521334, 6 ) scene.setDefaultTime( 0 ) self.assertEqual( scene.getDefaultTime(), 0 ) self.assertEqual( deformer.cookCount(), 1 ) self.assertTrue( scene.hasObject() ) self.assertEqual( deformer.cookCount(), 2 ) self.assertEqual( scene.childNames(), [ "gap" ] ) self.assertEqual( deformer.cookCount(), 2 ) mesh0 = scene.readObject( 0 ) self.assertEqual( deformer.cookCount(), 2 ) self.assertEqual( len(mesh0["P"].data), 8 ) self.assertEqual( mesh0["P"].data[0].x, -0.5 ) scene.setDefaultTime( 0.5 ) self.assertTrue( scene.hasObject() ) self.assertEqual( deformer.cookCount(), 3 ) gap = scene.scene( scene.path() + [ "gap" ] ) self.assertEqual( deformer.cookCount(), 3 )
def testRerooting( self ) : self.buildScene() scene = IECoreHoudini.LiveScene( "/obj/sub1", rootPath = [ "sub1" ] ) self.assertEqual( scene.path(), [] ) self.assertEqual( scene.pathAsString(), "/" ) self.assertEqual( scene.name(), "/" ) self.assertEqual( sorted( scene.childNames() ), [ "box1", "torus1" ] ) self.assertEqual( scene.hasChild( "box1" ), True ) self.assertEqual( scene.hasChild( "torus1" ), True ) self.assertEqual( scene.hasChild( "torus2" ), False ) self.assertEqual( scene.hasObject(), False ) torus1 = scene.child( "torus1" ) self.assertEqual( torus1.path(), [ "torus1" ] ) self.assertEqual( torus1.pathAsString(), "/torus1" ) self.assertEqual( torus1.name(), "torus1" ) self.assertEqual( sorted( torus1.childNames() ), [ "torus2" ] ) self.assertEqual( torus1.hasChild( "torus2" ), True ) self.assertEqual( torus1.hasObject(), True ) mesh = torus1.readObject( 0 ) self.failUnless( isinstance( mesh, IECore.MeshPrimitive ) ) self.assertEqual( mesh["P"].data.size(), 100 ) self.assertEqual( mesh.blindData(), IECore.CompoundData() ) torus2 = torus1.child( "torus2" ) self.assertEqual( torus2.path(), [ "torus1", "torus2" ] ) self.assertEqual( torus2.pathAsString(), "/torus1/torus2" ) self.assertEqual( torus2.name(), "torus2" ) self.assertEqual( sorted( torus2.childNames() ), [] ) self.assertEqual( torus2.hasObject(), True ) mesh = torus2.readObject( 0 ) self.failUnless( isinstance( mesh, IECore.MeshPrimitive ) ) self.assertEqual( mesh["P"].data.size(), 100 ) self.assertEqual( mesh.blindData(), IECore.CompoundData() ) box1 = scene.child( "box1" ) self.assertEqual( box1.path(), [ "box1" ] ) self.assertEqual( box1.pathAsString(), "/box1" ) self.assertEqual( box1.name(), "box1" ) self.assertEqual( sorted( box1.childNames() ), [ "gap" ] ) self.assertEqual( box1.hasChild( "gap" ), True ) self.assertEqual( box1.hasObject(), True ) mesh = box1.readObject( 0 ) self.failUnless( isinstance( mesh, IECore.MeshPrimitive ) ) self.assertEqual( mesh["P"].data.size(), 8 ) self.assertEqual( mesh.blindData(), IECore.CompoundData() ) gap = box1.child( "gap" ) self.assertEqual( gap.path(), [ "box1", "gap" ] ) self.assertEqual( gap.pathAsString(), "/box1/gap" ) self.assertEqual( gap.name(), "gap" ) self.assertEqual( sorted( gap.childNames() ), [ "torus" ] ) self.assertEqual( gap.hasChild( "torus" ), True ) self.assertEqual( gap.hasObject(), False ) boxTorus = gap.child( "torus" ) self.assertEqual( boxTorus.path(), [ "box1", "gap", "torus" ] ) self.assertEqual( boxTorus.pathAsString(), "/box1/gap/torus" ) self.assertEqual( boxTorus.name(), "torus" ) self.assertEqual( boxTorus.childNames(), [] ) self.assertEqual( boxTorus.hasObject(), True ) mesh = boxTorus.readObject( 0 ) self.failUnless( isinstance( mesh, IECore.MeshPrimitive ) ) self.assertEqual( mesh["P"].data.size(), 100 ) self.assertEqual( mesh.blindData(), IECore.CompoundData() ) self.assertRaises( RuntimeError, scene.child, "box2" ) self.assertEqual( scene.child( "box2", IECore.SceneInterface.MissingBehaviour.NullIfMissing ), None ) # test the node that does exist according to houdini, but is actually a grandchild in our world self.assertRaises( RuntimeError, scene.child, "torus2" ) self.assertEqual( scene.child( "torus2", IECore.SceneInterface.MissingBehaviour.NullIfMissing ), None ) torus1 = scene.scene( [ "torus1" ] ) self.assertEqual( torus1.pathAsString(), "/torus1" ) # can't use scene() to go outside of the re-rooting self.assertRaises( RuntimeError, scene.scene, [ "sub2" ] ) self.assertEqual( scene.scene( [ "sub2" ], IECore.SceneInterface.MissingBehaviour.NullIfMissing ), None )