def testAddFloatSplineToReferencedNode( self ) : # make a scene with an empty op holder ###################################### maya.cmds.createNode( "ieOpHolderNode" ) maya.cmds.file( rename = os.path.join( os.getcwd(), "test", "IECoreMaya", "opHolderReference.ma" ) ) referenceScene = maya.cmds.file( force = True, type = "mayaAscii", save = True ) # reference it in and add an op with a color spline ################################################### maya.cmds.file( new = True, force = True ) maya.cmds.file( referenceScene, reference = True, namespace = "ns1" ) fnOH = IECoreMaya.FnOpHolder( "ns1:ieOpHolderNode1" ) fnOH.setOp( "splineInput", 1 ) fnOH.setParameterisedValues() self.assertEqual( fnOH.getOp()["spline"].getValue().value, IECore.Splineff( IECore.CubicBasisf.catmullRom(), ( ( 0, 1 ), ( 0, 1 ), ( 1, 0 ), ( 1, 0 ), ), ) ) # save the scene, and reload it. check that we've worked # around another wonderful maya referencing bug ######################################################## maya.cmds.file( rename = os.path.join( os.getcwd(), "test", "IECoreMaya", "opHolderReferencer.ma" ) ) referencerScene = maya.cmds.file( force = True, type = "mayaAscii", save = True ) maya.cmds.file( new = True, force = True ) maya.cmds.file( referencerScene, force = True, open = True ) fnOH = IECoreMaya.FnOpHolder( "ns1:ieOpHolderNode1" ) fnOH.setParameterisedValues() self.assertEqual( fnOH.getOp()["spline"].getValue().value, IECore.Splineff( IECore.CubicBasisf.catmullRom(), ( ( 0, 1 ), ( 0, 1 ), ( 1, 0 ), ( 1, 0 ), ), ) )
def testResultAttrSaveLoadMeshConnections(self): box = maya.cmds.listRelatives(maya.cmds.polyCube(), shapes=True)[0] torus = maya.cmds.listRelatives(maya.cmds.polyTorus(), shapes=True)[0] node = maya.cmds.createNode("ieOpHolderNode") fnPH = IECoreMaya.FnOpHolder(node) fnPH.setOp("meshMerge") maya.cmds.connectAttr(box + ".outMesh", node + ".parm_input") maya.cmds.connectAttr(torus + ".outMesh", node + ".parm_mesh") mesh = maya.cmds.createNode("mesh") maya.cmds.connectAttr(node + ".result", mesh + ".inMesh") quads = maya.cmds.polyQuad(mesh)[0] ## \todo: this makes the test fail, but not seg fault. remove once the seg fault is solved. maya.cmds.setAttr(quads + ".nodeState", 1) joint = maya.cmds.createNode("joint") cluster = maya.cmds.skinCluster(mesh, joint) fnMesh = maya.OpenMaya.MFnMesh( IECoreMaya.dependencyNodeFromString(mesh)) self.assertEqual(fnMesh.numVertices(), 408) self.assertEqual(fnMesh.numPolygons(), 406) maya.cmds.file(rename=os.path.join(os.getcwd(), "test", "IECoreMaya", "resultAttrLoadTest.ma")) testScene = maya.cmds.file(force=True, type="mayaAscii", save=True) maya.cmds.file(testScene, f=True, o=True) fnMesh = maya.OpenMaya.MFnMesh( IECoreMaya.dependencyNodeFromString(mesh)) self.assertEqual(fnMesh.numVertices(), 408) self.assertEqual(fnMesh.numPolygons(), 406) self.assertEqual(maya.cmds.getAttr(quads + ".nodeState"), 0) # Known bug. See todo above.
def testSparseEntries(self): # load a scene where we have a spline parameter with sparse entries. maya.cmds.file(os.getcwd() + "/test/IECoreMaya/scenes/splineWithSparseEntries.ma", force=True, open=True) fnOH = IECoreMaya.FnOpHolder("test") op = fnOH.getOp() # stick a new value on splineData = IECore.SplineffData( IECore.Splineff(IECore.CubicBasisf.catmullRom(), ((0, 0.644737), (0, 0.644737), (0.257426, 0.0789474), (1, -0.3), (1, -0.3)))) op["spline"].setValue(splineData) # convert the value to maya fnOH.setNodeValue(op["spline"]) # convert it back fnOH.setParameterisedValue(op["spline"]) # make sure it worked splineData2 = op["spline"].getValue() self.assertEqual(splineData, splineData2) # do it all again just for kicks op["spline"].setValue(splineData) fnOH.setNodeValue(op["spline"]) fnOH.setParameterisedValue(op["spline"]) splineData2 = op["spline"].getValue() self.assertEqual(splineData, splineData2)
def testExcessReferenceEdits( self ) : IECoreMaya.FnOpHolder.create( "testOp", "maths/multiply", 2 ) # Save the scene out so we can reference it maya.cmds.file( rename = os.path.join( os.getcwd(), "test", "IECoreMaya", "referenceEditCounts.ma" ) ) referenceScene = maya.cmds.file( force = True, type = "mayaAscii", save = True ) # New scene, and read it in. maya.cmds.file( new = True, force = True ) maya.cmds.file( referenceScene, reference = True, namespace = "ns1" ) # Check there are no reference edits fnOH = IECoreMaya.FnOpHolder( 'ns1:testOp' ) op = fnOH.getOp() aPath = fnOH.parameterPlugPath( op["a"] ) bPath = fnOH.parameterPlugPath( op["b"] ) self.assertEqual( maya.cmds.getAttr( aPath ), 1 ) self.assertEqual( maya.cmds.getAttr( bPath ), 2 ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 0 ) # set values, but with no changes with fnOH.parameterModificationContext() : op["a"].setNumericValue( 1 ) op["b"].setNumericValue( 2 ) # Check the values are the same, and there are still no reference edits self.assertEqual( maya.cmds.getAttr( aPath ), 1 ) self.assertEqual( maya.cmds.getAttr( bPath ), 2 ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 0 ) # change a value to a genuinely new value with fnOH.parameterModificationContext() : op["a"].setNumericValue( 100 ) # Check the maya value is updated and there is 1 reference edit self.assertEqual( maya.cmds.getAttr( aPath ), 100 ) self.assertEqual( maya.cmds.getAttr( bPath ), 2 ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 1 ) # Undo and check there is still 1 reference edit. Ideally there would be none but # maya isn't that clever. maya.cmds.undo() self.assertEqual( maya.cmds.getAttr( aPath ), 1 ) self.assertEqual( maya.cmds.getAttr( bPath ), 2 ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 1 )
def testExcessClassVectorParameterReferenceEdits( self ) : # Save a scene with a ClassParameter in it fnOH = IECoreMaya.FnOpHolder.create( "node", "classVectorParameterTest", 1 ) op = fnOH.getOp() with fnOH.parameterModificationContext() : op["cv"].setClasses( [ ( "mult", "maths/multiply", 1 ), ( "coIO", "compoundObjectInOut", 1 ), ] ) maya.cmds.file( rename = os.path.join( os.getcwd(), "test", "IECoreMaya", "referenceEditCounts.ma" ) ) referenceScene = maya.cmds.file( force = True, type = "mayaAscii", save = True ) # And reference it back in to a new scene maya.cmds.file( new = True, force = True ) maya.cmds.file( referenceScene, reference = True, namespace = "ns1" ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 0 ) # Make a modification which does nothing and check that there are no reference edits fnOH = IECoreMaya.FnOpHolder( "ns1:node" ) with fnOH.parameterModificationContext() : pass self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 0 ) # Make a modification which happens to set things to the values they're already at and # check that there are no reference edits with fnOH.parameterModificationContext() : op["cv"].setClasses( [ ( "mult", "maths/multiply", 1 ), ( "coIO", "compoundObjectInOut", 1 ), ] ) self.assertEqual( len(maya.cmds.referenceQuery( referenceScene, editStrings=True )), 0 )
def testParameterPlugForMissingPlug(self): ## Make sure that null plugs are returned from the parameterPlug() method # if no plug exists. node = maya.cmds.createNode("ieOpHolderNode") fnPH = IECoreMaya.FnOpHolder(node) fnPH.setOp("floatParameter") op = fnPH.getOp() plug = fnPH.parameterPlug(op.parameters()) self.failUnless(isinstance(plug, maya.OpenMaya.MPlug)) self.failUnless(plug.isNull())
def testRoundTripAfterSerialisation( self ) : # make a scene with an OpHolder holding an op with a spline parameter fnOH = IECoreMaya.FnOpHolder.create( "test", "splineInput", 1 ) opNode = fnOH.fullPathName() op = fnOH.getOp() # save it maya.cmds.file( rename = os.getcwd() + "/test/IECoreMaya/splineParameterHandlerTest.ma" ) sceneFileName = maya.cmds.file( force = True, type = "mayaAscii", save = True ) # load it maya.cmds.file( new=True, force=True ) maya.cmds.file( sceneFileName, force=True, open=True ) fnOH = IECoreMaya.FnOpHolder( opNode ) op = fnOH.getOp() # stick a new value on splineData = IECore.SplineffData( IECore.Splineff( IECore.CubicBasisf.catmullRom(), ( ( 0, 0.644737 ), ( 0, 0.644737 ), ( 0.257426, 0.0789474 ), ( 1, -0.3 ), ( 1, -0.3 ) ) ) ) op["spline"].setValue( splineData ) # convert the value to maya fnOH.setNodeValue( op["spline"] ) # convert it back fnOH.setParameterisedValue( op["spline"] ) # make sure it worked splineData2 = op["spline"].getValue() self.assertEqual( splineData, splineData2 ) # do it all again just for kicks op["spline"].setValue( splineData ) fnOH.setNodeValue( op["spline"] ) fnOH.setParameterisedValue( op["spline"] ) splineData2 = op["spline"].getValue() self.assertEqual( splineData, splineData2 )
def testLsMethods(self): # create a couple of holders: opHolderNode = maya.cmds.createNode("ieOpHolderNode") fnOH = IECoreMaya.FnOpHolder(opHolderNode) fnOH.setOp("floatParameter") converterHolderNode = maya.cmds.createNode("ieConverterHolder") fnCH = IECoreMaya.FnConverterHolder(converterHolderNode) #fnCH.setOp( "floatParameter" ) node = maya.cmds.createNode("ieProceduralHolder") node2 = maya.cmds.createNode("ieProceduralHolder") fnPH = IECoreMaya.FnProceduralHolder(node) proc = IECore.ReadProcedural() fnPH.setParameterised(proc) fnPH2 = IECoreMaya.FnProceduralHolder(node2) # do an ls on the op holders: should only be one opHolders = IECoreMaya.FnOpHolder.ls() self.assertEqual(len(opHolders), 1) self.failUnless(isinstance(opHolders[0], IECoreMaya.FnOpHolder)) self.assertEqual(opHolders[0].fullPathName(), opHolderNode) # do an ls on the procedural holders: should be two self.assertEqual(len(IECoreMaya.FnProceduralHolder.ls()), 2) # do an ls on the procedural holders containing IECore.ReadProcedurals: should be one self.assertEqual( len( IECoreMaya.FnProceduralHolder.ls( classType=IECore.ReadProcedural)), 1) # find full path name of node holding ReadProcedural, and check it's the same as the one returned by ls: node = maya.cmds.ls(node, l=True)[0] self.assertEqual( IECoreMaya.FnProceduralHolder.ls( classType=IECore.ReadProcedural)[0].fullPathName(), node) # do an ls on the converter holders, this time just returning node names: converterHolders = IECoreMaya.FnConverterHolder.ls(fnSets=False) self.assertEqual(len(converterHolders), 1) self.assertEqual(converterHolders[0], converterHolderNode)
def testResultAttrSaveLoad( self ) : node = maya.cmds.createNode( "ieOpHolderNode" ) fnPH = IECoreMaya.FnOpHolder( node ) fnPH.setOp( "floatParameter" ) self.assertNotEqual( maya.cmds.getAttr( node + ".parm_f" ), 50.5 ) self.assertNotEqual( maya.cmds.getAttr( node + ".result" ), 50.5 ) maya.cmds.setAttr( node + ".parm_f", 50.5 ) self.assertEqual( maya.cmds.getAttr( node + ".parm_f" ), 50.5 ) self.assertEqual( maya.cmds.getAttr( node + ".result" ), 50.5 ) maya.cmds.file( rename = os.path.join( os.getcwd(), "test", "IECoreMaya", "resultAttrLoadTest.ma" ) ) testScene = maya.cmds.file( force = True, type = "mayaAscii", save = True ) maya.cmds.file( testScene, f = True, o = True ) self.assertEqual( maya.cmds.getAttr( node + ".parm_f" ), 50.5 ) self.assertEqual( maya.cmds.getAttr( node + ".result" ), 50.5 )
def testLsMethods(self): # create a couple of holders: opHolderNode = maya.cmds.createNode("ieOpHolderNode") fnOH = IECoreMaya.FnOpHolder(opHolderNode) fnOH.setOp("floatParameter") converterHolderNode = maya.cmds.createNode("ieConverterHolder") fnCH = IECoreMaya.FnConverterHolder(converterHolderNode) #fnCH.setOp( "floatParameter" ) # do an ls on the op holders: should only be one opHolders = IECoreMaya.FnOpHolder.ls() self.assertEqual(len(opHolders), 1) self.assertTrue(isinstance(opHolders[0], IECoreMaya.FnOpHolder)) self.assertEqual(opHolders[0].fullPathName(), opHolderNode) # do an ls on the converter holders, this time just returning node names: converterHolders = IECoreMaya.FnConverterHolder.ls(fnSets=False) self.assertEqual(len(converterHolders), 1) self.assertEqual(converterHolders[0], converterHolderNode)