def _createHeader( self, columnLayout, **kw ) : IECoreMaya.CompoundParameterUI._createHeader( self, columnLayout, **kw ) maya.cmds.rowLayout( numberOfColumns = 2, parent = columnLayout ) collapsable = True with IECore.IgnoredExceptions( KeyError ) : collapsable = self.parameter.userData()["UI"]["collapsable"].value lable = "Class" if collapsable else self.label() font = "smallPlainLabelFont" if collapsable else "tinyBoldLabelFont" maya.cmds.text( label = lable, font = font, align = "right", annotation = self.description() ) self.__menuParent = maya.cmds.iconTextStaticLabel( image = "arrowDown.xpm", font = "smallBoldLabelFont", label = self.__menuParentLabel(), style = "iconAndTextHorizontal", height = 23, ) # popup menu can be activated with either right or left buttons IECoreMaya.createMenu( self.__menuDefinition, self.__menuParent ) IECoreMaya.createMenu( self.__menuDefinition, self.__menuParent, button = 1 )
def __init__( self, layoutName, classNameOrParameterised, classVersion=None, envVarName=None ) : """ Creates a temporary TransientParameterisedHolderNode in order to present the UI for the specified parameterised object in the given layout. The node is automatically deleted when the holding layout is destroyed """ nodeName = maya.cmds.createNode( "ieTransientParameterisedHolderNode", skipSelect = True ) # Script jobs aren't available from maya.cmds. Maya Python bindings generate swig warnings # such as "swig/python detected a memory leak of type 'MCallbackId *', no destructor found" IECoreMaya.mel( 'scriptJob -uiDeleted "%s" "delete %s" -protected' % ( layoutName, nodeName ) ) object = StringUtil.dependencyNodeFromString( nodeName ) maya.OpenMaya.MFnDependencyNode.__init__( self, object ) if isinstance( classNameOrParameterised, str ) : res = _IECoreMaya._parameterisedHolderSetParameterised( self, classNameOrParameterised, classVersion, envVarName ) else : assert( not classVersion ) assert( not envVarName ) res = _IECoreMaya._parameterisedHolderSetParameterised( self, classNameOrParameterised ) parameterised = self.getParameterised()[0] if parameterised: maya.cmds.setParent( layoutName ) IECoreMaya.ParameterUI.create( object, parameterised.parameters() ) maya.cmds.setParent( layoutName ) return res
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] 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 )
def create( layoutName, classNameOrParameterised, classVersion=None, envVarName=None ) : with IECoreMaya.UndoDisabled() : nodeName = maya.cmds.createNode( "ieTransientParameterisedHolderNode", skipSelect = True ) # Script jobs aren't available from maya.cmds. Maya Python bindings generate swig warnings # such as "swig/python detected a memory leak of type 'MCallbackId *', no destructor found" IECoreMaya.mel( 'scriptJob -uiDeleted "%s" "python( \\\"import IECoreMaya; IECoreMaya.FnTransientParameterisedHolderNode._deleteNode( \'%s\' )\\\" )" -protected' % ( layoutName, nodeName ) ) fnTPH = FnTransientParameterisedHolderNode( nodeName ) if isinstance( classNameOrParameterised, str ) : fnTPH.setParameterised( classNameOrParameterised, classVersion, envVarName ) else : assert( not classVersion ) assert( not envVarName ) fnTPH.setParameterised( classNameOrParameterised ) parameterised = fnTPH.getParameterised()[0] if parameterised : maya.cmds.setParent( layoutName ) IECoreMaya.ParameterUI.create( fnTPH.fullPathName(), parameterised.parameters() ) maya.cmds.setParent( layoutName ) return fnTPH
def __showEditor( self, attributeName ) : split = attributeName.split('.', 1 ) node = split[0] melCmd = 'showEditor "' + node + '"' IECoreMaya.mel( melCmd.encode('ascii') )
def __expressionEditor( self, attributeName = None ) : split = attributeName.split('.', 1 ) node = split[0] attr = split[1] melCmd = 'expressionEditor EE "' + node + '" "' + attr + '"' IECoreMaya.mel( melCmd.encode('ascii') )
def _addPopupMenu( self, parentUI, **kw ) : existingMenus = maya.cmds.control( parentUI, query=True, popupMenuArray=True ) if existingMenus : for m in existingMenus : maya.cmds.deleteUI( m, menu=True ) IECoreMaya.createMenu( definition = IECore.curry( self.__popupMenuDefinition, **kw ), parent = parentUI, useInterToUI=False ) if "button1" in kw and kw["button1"] : IECoreMaya.createMenu( definition = IECore.curry( self.__popupMenuDefinition, **kw ), parent = parentUI, button = 1, useInterToUI=False )
def label( self ): if self.__labelWithNodeName : n = self.nodeName() + "." + self.__longParameterName if not self.__longParameterName : # Top-level parameter comes through into here without a name n = self.nodeName() + ".parameters" return IECoreMaya.mel( "interToUI(\"" + n + "\")" ).value else : return IECoreMaya.mel( "interToUI(\"" + self.parameter.name + "\")" ).value
def create(meshDagPath, className, classVersion, **kw): if type(meshDagPath) is str: sel = OpenMaya.MSelectionList() sel.add(meshDagPath) meshDagPath = OpenMaya.MDagPath() sel.getDagPath(0, meshDagPath) meshDagPath.extendToShape() constructionHistoryEnabled = IECoreMaya.mel("constructionHistory -q -tgl").value if not __hasHistory(meshDagPath) and constructionHistoryEnabled == 0: # \todo we can't actually do this right now because we're unable to convert the resultant MeshPrimitive # back into the original meshNode MObject given to us raise RuntimeError("Currently unable to apply MeshOp in-place ") meshNode = meshDagPath.node() __applyMeshOp(meshNode, className, classVersion, **kw) return None else: modifierNode = __createMeshOpNode(className, classVersion, **kw) __connectNodes(modifierNode, meshDagPath) fnDN = OpenMaya.MFnDependencyNode(modifierNode) return str(fnDN.name())
def __init__( self, node, parameter, **kw ) : IECoreMaya.ParameterUI.__init__( self, node, parameter, maya.cmds.frameLayout( labelVisible = False, collapsable = False, ), **kw ) # passing borderVisible=False to the constructor does bugger all so we do it here instead. maya.cmds.frameLayout( self._topLevelUI(), edit=True, borderVisible=False ) collapsible = self.__parameterIsCollapsible() self.__kw = kw.copy() if collapsible : self.__kw["hierarchyDepth"] = self.__kw.get( "hierarchyDepth", -1 ) + 1 collapsed = self._retrieveCollapsedState( collapsible ) self.__collapsible = IECoreMaya.Collapsible( annotation = self.description(), label = self.label(), labelFont = IECoreMaya.CompoundParameterUI._labelFont( self.__kw["hierarchyDepth"] ), labelIndent = IECoreMaya.CompoundParameterUI._labelIndent( self.__kw["hierarchyDepth"] ), labelVisible = collapsible, collapsed = collapsed, expandCommand = self.__expand, collapseCommand = self.__collapse, ) self.__formLayout = maya.cmds.formLayout( parent=self.__collapsible.frameLayout() ) self.__buttonRow = maya.cmds.rowLayout( nc=3, adj=3, cw3=( 25, 25, 40 ), parent=self.__formLayout ) self.__addButton = maya.cmds.picture( image="ie_addIcon_grey.xpm", parent=self.__buttonRow, width=21 ) IECoreMaya.createMenu( IECore.curry( self.__classMenuDefinition, None ), self.__addButton, useInterToUI=False ) IECoreMaya.createMenu( IECore.curry( self.__classMenuDefinition, None ), self.__addButton, useInterToUI=False, button=1 ) self.__toolsButton = maya.cmds.picture( image="ie_actionIcon_grey.xpm", parent=self.__buttonRow, width=21 ) IECoreMaya.createMenu( IECore.curry( self.__toolsMenuDefinition, None ), self.__toolsButton, useInterToUI=False ) IECoreMaya.createMenu( IECore.curry( self.__toolsMenuDefinition, None ), self.__toolsButton, useInterToUI=False, button=1 ) self.__classInfo = [] self.__childUIs = {} # mapping from parameter name to ui name self.replace( node, parameter )
def testManyUVConversionsFromPlug( self ) : coreMesh = IECore.Reader.create( "test/IECore/data/cobFiles/pSphereShape1.cob" ).read() self.assertTrue( "s" in coreMesh ) self.assertTrue( "t" in coreMesh ) for i in range( 0, 7 ) : coreMesh[ "testUVSet%d_s" % i ] = IECore.PrimitiveVariable( coreMesh["s"].interpolation, coreMesh["s"].data.copy() ) coreMesh[ "testUVSet%d_t" % i ] = IECore.PrimitiveVariable( coreMesh["t"].interpolation, coreMesh["t"].data.copy() ) fn = IECoreMaya.FnOpHolder.create( "test", "meshMerge" ) mayaMesh = maya.cmds.ls( maya.cmds.polyPlane(), dag=True, type="mesh" )[0] maya.cmds.connectAttr( fn.name()+".result", mayaMesh+".inMesh", force=True ) op = fn.getOp() with fn.parameterModificationContext() : op["input"].setValue( coreMesh ) maya.cmds.file( rename="/tmp/test.ma" ) maya.cmds.file( save=True ) maya.cmds.file( new=True, f=True ) maya.cmds.file( "/tmp/test.ma", open=True ) fnMesh = OpenMaya.MFnMesh( IECoreMaya.dagPathFromString( mayaMesh ) ) self.assertEqual( fnMesh.numPolygons(), 760 ) # When calling fnMesh.numFaceVertices() (and other MFnMesh API calls), given a mesh with 6 # or more UV sets, which has never been evaluated before, the first call throws kFailure. # From within the ToMayaMeshConverter itself, the output plug appears fine, and the API calls # evaluate as expected. Despite this, the resulting mesh cannot be evaluated on the first try. # Making the mesh visible, or making any attempt to evaluate it, will trigger some unknown # internal updating, and subsequent attempts to evaluate it will succeed. Meshes with 5 or less # UV sets do not suffer from this problem. Leaving this test failing in case it is fixed in a # future Maya, and to mark the issue so users of ToMayaMeshConverter have breadcrumbs to follow. self.assertEqual( fnMesh.numFaceVertices(), 2280 ) # Known failure. See note above for an explanation. self.assertEqual( maya.cmds.polyEvaluate( mayaMesh, vertex=True ), 382 ) self.assertEqual( maya.cmds.polyEvaluate( mayaMesh, face=True ), 760 ) u = OpenMaya.MFloatArray() v = OpenMaya.MFloatArray() fnMesh.getUVs( u, v ) self.assertEqual( u.length(), 2280 ) self.assertEqual( v.length(), 2280 ) self.assertEqual( u[0], coreMesh[ "s" ].data[0] ) self.assertEqual( v[0], 1.0 - coreMesh[ "t" ].data[0] ) for i in range( 0, 7 ) : fnMesh.getUVs( u, v, "testUVSet%d" % i ) self.assertEqual( u.length(), 2280 ) self.assertEqual( v.length(), 2280 ) self.assertEqual( u[12], coreMesh[ "testUVSet%d_s" % i ].data[12] ) self.assertEqual( v[12], 1.0 - coreMesh[ "testUVSet%d_t" % i ].data[12] )
def testSingleNumericPlugs(self): locator = maya.cmds.spaceLocator()[0] attr = ("tBool", IECore.BoolData, True) maya.cmds.addAttr(ln=attr[0], at="bool") maya.cmds.setAttr(locator + '.' + attr[0], attr[2]) converter = IECoreMaya.FromMayaPlugConverter.create( IECoreMaya.plugFromString(locator + '.' + attr[0]) ) self.assert_(converter) cValue = converter.convert() self.assert_(isinstance(cValue, attr[1])) self.assertAlmostEqual(cValue.value, attr[2]) attr = ("tFloat", IECore.FloatData, 0.123456) maya.cmds.addAttr(ln=attr[0], at="float") maya.cmds.setAttr(locator + '.' + attr[0], attr[2]) converter = IECoreMaya.FromMayaPlugConverter.create( IECoreMaya.plugFromString(locator + '.' + attr[0]) ) self.assert_(converter) cValue = converter.convert() self.assert_(isinstance(cValue, attr[1])) self.assertAlmostEqual(cValue.value, attr[2]) attr = ("tDouble", IECore.DoubleData, 0.123456) maya.cmds.addAttr(ln=attr[0], at="double") maya.cmds.setAttr(locator + '.' + attr[0], attr[2]) converter = IECoreMaya.FromMayaPlugConverter.create( IECoreMaya.plugFromString(locator + '.' + attr[0]) ) self.assert_(converter) cValue = converter.convert() self.assert_(isinstance(cValue, attr[1])) self.assertAlmostEqual(cValue.value, attr[2]) attr = ("tShort", IECore.ShortData, 1) maya.cmds.addAttr(ln=attr[0], at="enum", en="A:B:C") maya.cmds.setAttr(locator + '.' + attr[0], attr[2]) converter = IECoreMaya.FromMayaPlugConverter.create( IECoreMaya.plugFromString(locator + '.' + attr[0]) ) self.assert_(converter) cValue = converter.convert() self.assert_(isinstance(cValue, attr[1])) self.assertAlmostEqual(cValue.value, attr[2])
def testCreases( self ): cube = maya.cmds.polyCube()[0] fnMesh = OpenMaya.MFnMesh( IECoreMaya.dagPathFromString(cube) ) cornerIds = OpenMaya.MUintArray() cornerIds.append( 5 ) cornerSharpnesses = OpenMaya.MDoubleArray() cornerSharpnesses.append( 10 ) fnMesh.setCreaseVertices( cornerIds, cornerSharpnesses ) edgeIds = OpenMaya.MUintArray() edgeIds.append( 0 ) edgeIds.append( 1 ) edgeSharpnesses = OpenMaya.MDoubleArray() edgeSharpnesses.append( 1 ) edgeSharpnesses.append( 5 ) fnMesh.setCreaseEdges( edgeIds, edgeSharpnesses ) # store which vertices belong to the affected edges util = OpenMaya.MScriptUtil() vertices = [] for edgeId in edgeIds : edgeVertices = util.asInt2Ptr() fnMesh.getEdgeVertices( edgeId, edgeVertices ) vertices.append( util.getInt2ArrayItem( edgeVertices, 0, 0 ) ) vertices.append( util.getInt2ArrayItem( edgeVertices, 0, 1 ) ) # convert and test cube = maya.cmds.listRelatives( cube, shapes=True )[0] converter = IECoreMaya.FromMayaMeshConverter.create( cube, IECoreScene.MeshPrimitive.staticTypeId() ) cortexCube = converter.convert() self.assertEqual( cortexCube.cornerIds(), IECore.IntVectorData( [ 5 ] ) ) self.assertEqual( cortexCube.cornerSharpnesses(), IECore.FloatVectorData( [ 10.0 ] ) ) self.assertEqual( cortexCube.creaseLengths(), IECore.IntVectorData( [ 2, 2 ] ) ) self.assertEqual( cortexCube.creaseIds(), IECore.IntVectorData( vertices ) ) self.assertEqual( cortexCube.creaseSharpnesses(), IECore.FloatVectorData( [ 1, 5 ] ) )
def testFactory( self ) : locator = maya.cmds.spaceLocator( position=( 1, 2, 3 ) )[0] converter = IECoreMaya.FromMayaPlugConverter.create( locator + ".translateX" ) self.assert_( converter ) self.assert_( converter.isInstanceOf( IECoreMaya.FromMayaPlugConverter.staticTypeId() ) ) converter = IECoreMaya.FromMayaPlugConverter.create( locator + ".scaleX" ) self.assert_( converter ) self.assert_( converter.isInstanceOf( IECoreMaya.FromMayaPlugConverter.staticTypeId() ) ) converter = IECoreMaya.FromMayaPlugConverter.create( locator + ".scale" ) self.assert_( converter ) self.assert_( converter.isInstanceOf( IECoreMaya.FromMayaPlugConverter.staticTypeId() ) ) converter = IECoreMaya.FromMayaPlugConverter.create( IECoreMaya.plugFromString( locator + ".translateX" ) ) self.assert_( converter ) self.assert_( converter.isInstanceOf( IECoreMaya.FromMayaPlugConverter.staticTypeId() ) )
def createCortexMenu() : if os.environ.get( "IECOREMAYA_DISABLE_MENU", "0" ) == "1" : return m = IECore.MenuDefinition() m.append( "/Create Procedural", { "subMenu" : proceduralCreationMenuDefinition, } ) m.append( "/Create Op", { "subMenu" : opCreationMenuDefinition, } ) global __cortexMenu __cortexMenu = IECoreMaya.createMenu( m, "MayaWindow", "Cortex" )
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 __drawHeaderParameterControl( self, parameter, fnPH ) : ## \todo This would be so much easier if we could just use ParameterUI # instances for each of the controls. We can't because they all do their # own labelling and are layed out for an attribute editor. if we do the # todo in ParameterUI to remove the labels and stuff then we can do the # todo here. control = None parameterPlugPath = fnPH.parameterPlugPath( parameter ) annotation = IECore.StringUtil.wrap( "%s\n\n%s" % ( parameterPlugPath.split( "." )[1], parameter.description ), 48 ) if parameter.presetsOnly : control = maya.cmds.iconTextStaticLabel( image = "arrowDown.xpm", font = "smallBoldLabelFont", style = "iconAndTextHorizontal", height = 23, width = 80, annotation = annotation, ) IECoreMaya.createMenu( IECore.curry( self.__presetsMenu, parameter ), control ) IECoreMaya.createMenu( IECore.curry( self.__presetsMenu, parameter ), control, button=1 ) self.__presetParameters.append( parameter ) self.__presetUIs.append( control ) if self.__attributeChangedCallbackId is None : self.__attributeChangedCallbackId = IECoreMaya.CallbackId( maya.OpenMaya.MNodeMessage.addAttributeChangedCallback( self.__vectorParent().node(), self.__attributeChanged ) ) self.__updatePresetLabel( len( self.__presetUIs ) - 1 ) elif isinstance( parameter, IECore.BoolParameter ) : control = maya.cmds.checkBox( label="", annotation=annotation ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.FloatParameter ) : control = maya.cmds.floatField( annotation = annotation, minValue = parameter.minValue, maxValue = parameter.maxValue, width = 45, pre = 4 ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.IntParameter ) : kw = {} if parameter.hasMinValue() : kw["minValue"] = parameter.minValue if parameter.hasMaxValue() : kw["maxValue"] = parameter.maxValue control = maya.cmds.intField( annotation = annotation, width = 45, **kw ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.Color3fParameter ) : control = maya.cmds.attrColorSliderGrp( label = "", columnWidth = ( ( 1, 1 ), ( 2, 30 ), ( 3, 1 ) ), columnAttach = ( ( 1, "both", 0 ), ( 2, "both", 0 ), ( 3, "left", 0 ) ), attribute = parameterPlugPath, annotation = annotation, showButton = False ) elif isinstance( parameter, IECore.StringParameter ) : control = maya.cmds.textField( annotation = annotation, width = 150 ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.V2fParameter ) : control = maya.cmds.rowLayout( nc=2, cw2=( 45, 45 ) ) column1 = maya.cmds.floatField( annotation = annotation, width = 45, pre = 4, parent = control ) maya.cmds.connectControl( column1, parameterPlugPath + "X" ) column2 = maya.cmds.floatField( annotation = annotation, width = 45, pre = 4, parent = control ) maya.cmds.connectControl( column2, parameterPlugPath + "Y" ) else : IECore.msg( IECore.Msg.Level.Warning, "ClassVectorParameterUI", "Parameter \"%s\" has unsupported type for inclusion in header ( %s )." % ( parameter.name, parameter.typeName() ) ) return control
def test(self): s = maya.cmds.spaceLocator()[0] maya.cmds.addAttr(s, at="enum", sn="enumTest", enumName="A:B:C", defaultValue=1) self.assertEqual(maya.cmds.getAttr(s + ".enumTest"), 1) maya.cmds.addAttr(s, at="bool", sn="boolTest", defaultValue=1) self.assertEqual(maya.cmds.getAttr(s + ".boolTest"), 1) maya.cmds.addAttr(s, at="float", sn="floatTest") self.assertEqual(maya.cmds.getAttr(s + ".floatTest"), 0) maya.cmds.addAttr(s, at="long", sn="intTest") self.assertEqual(maya.cmds.getAttr(s + ".intTest"), 0) maya.cmds.addAttr(s, at="float2", sn="float2Test") maya.cmds.addAttr(s, at="float", sn="float2TestX", parent="float2Test") maya.cmds.addAttr(s, at="float", sn="float2TestY", parent="float2Test") self.assertEqual(maya.cmds.getAttr(s + ".float2TestX"), 0) self.assertEqual(maya.cmds.getAttr(s + ".float2TestY"), 0) maya.cmds.addAttr(s, at="long2", sn="int2Test") maya.cmds.addAttr(s, at="long", sn="int2TestX", parent="int2Test", defaultValue=1) maya.cmds.addAttr(s, at="long", sn="int2TestY", parent="int2Test", defaultValue=2) self.assertEqual(maya.cmds.getAttr(s + ".int2TestX"), 1) self.assertEqual(maya.cmds.getAttr(s + ".int2TestY"), 2) maya.cmds.addAttr(s, at="float3", sn="float3Test") maya.cmds.addAttr(s, at="float", sn="float3TestX", parent="float3Test", defaultValue=10) maya.cmds.addAttr(s, at="float", sn="float3TestY", parent="float3Test", defaultValue=20) maya.cmds.addAttr(s, at="float", sn="float3TestZ", parent="float3Test", defaultValue=30) self.assertEqual(maya.cmds.getAttr(s + ".float3TestX"), 10) self.assertEqual(maya.cmds.getAttr(s + ".float3TestY"), 20) self.assertEqual(maya.cmds.getAttr(s + ".float3TestZ"), 30) maya.cmds.addAttr(s, at="short3", sn="short3Test") maya.cmds.addAttr(s, at="short", sn="short3TestX", parent="short3Test", defaultValue=101) maya.cmds.addAttr(s, at="short", sn="short3TestY", parent="short3Test", defaultValue=201) maya.cmds.addAttr(s, at="short", sn="short3TestZ", parent="short3Test", defaultValue=301) self.assertEqual(maya.cmds.getAttr(s + ".short3TestX"), 101) self.assertEqual(maya.cmds.getAttr(s + ".short3TestY"), 201) self.assertEqual(maya.cmds.getAttr(s + ".short3TestZ"), 301) maya.cmds.addAttr(s, dt="string", sn="stringTest") maya.cmds.setAttr(s + ".stringTest", "hi", type="string") self.assertEqual(maya.cmds.getAttr(s + ".stringTest"), "hi") context = IECoreMaya.TemporaryAttributeValues({ s + ".enumTest": 2, s + ".boolTest": False, s + ".floatTest": 10, s + ".intTest": 20, s + ".float2Test": (1, 2), s + ".int2Test": IECore.V2i(3, 4), s + ".float3Test": (9, 6, 1), s + ".short3Test": (500, 2, -1), s + ".stringTest": "bye", }) with context: self.assertEqual(maya.cmds.getAttr(s + ".enumTest"), 2) self.assertEqual(maya.cmds.getAttr(s + ".boolTest"), 0) self.assertEqual(maya.cmds.getAttr(s + ".floatTest"), 10) self.assertEqual(maya.cmds.getAttr(s + ".intTest"), 20) self.assertEqual(maya.cmds.getAttr(s + ".float2TestX"), 1) self.assertEqual(maya.cmds.getAttr(s + ".float2TestY"), 2) self.assertEqual(maya.cmds.getAttr(s + ".int2TestX"), 3) self.assertEqual(maya.cmds.getAttr(s + ".int2TestY"), 4) self.assertEqual(maya.cmds.getAttr(s + ".float3TestX"), 9) self.assertEqual(maya.cmds.getAttr(s + ".float3TestY"), 6) self.assertEqual(maya.cmds.getAttr(s + ".float3TestZ"), 1) self.assertEqual(maya.cmds.getAttr(s + ".short3TestX"), 500) self.assertEqual(maya.cmds.getAttr(s + ".short3TestY"), 2) self.assertEqual(maya.cmds.getAttr(s + ".short3TestZ"), -1) self.assertEqual(maya.cmds.getAttr(s + ".stringTest"), "bye") self.assertEqual(maya.cmds.getAttr(s + ".enumTest"), 1) self.assertEqual(maya.cmds.getAttr(s + ".boolTest"), 1) self.assertEqual(maya.cmds.getAttr(s + ".floatTest"), 0) self.assertEqual(maya.cmds.getAttr(s + ".intTest"), 0) self.assertEqual(maya.cmds.getAttr(s + ".float2TestX"), 0) self.assertEqual(maya.cmds.getAttr(s + ".float2TestY"), 0) self.assertEqual(maya.cmds.getAttr(s + ".int2TestX"), 1) self.assertEqual(maya.cmds.getAttr(s + ".int2TestY"), 2) self.assertEqual(maya.cmds.getAttr(s + ".float3TestX"), 10) self.assertEqual(maya.cmds.getAttr(s + ".float3TestY"), 20) self.assertEqual(maya.cmds.getAttr(s + ".float3TestZ"), 30) self.assertEqual(maya.cmds.getAttr(s + ".stringTest"), "hi")
def _dagMenu( menu, sceneShape ) : sceneShapes = __selectedSceneShapes() if not sceneShapes: return fnScS = [] for target in sceneShapes: fnScS.append( IECoreMaya.FnSceneShape( target ) ) maya.cmds.setParent( menu, menu=True ) invalidSceneShapes = __invalidSceneShapes( sceneShapes ) if invalidSceneShapes: maya.cmds.menuItem( label = "Invalid Inputs for selected SceneShapes!", radialPosition = "N", ) # Component mode elif fnScS[0].selectedComponentNames(): maya.cmds.menuItem( label = "Object", radialPosition = "N", command = IECore.curry( __objectCallback, sceneShapes[0] ), ) maya.cmds.menuItem( label = "Print Component Names", radialPosition = "NW", command = IECore.curry( __printComponents, sceneShapes[0] ) ) maya.cmds.menuItem( label = "Print Selected Component Names", radialPosition = "NE", command = IECore.curry( __printSelectedComponents, sceneShapes[0] ) ) maya.cmds.menuItem( label = "Expand...", radialPosition = "SE", subMenu = True ) maya.cmds.menuItem( label = "Expand to Selected Components", radialPosition = "S", command = IECore.curry( __expandToSelected, sceneShapes[0] ) ) maya.cmds.setParent( "..", menu=True ) maya.cmds.menuItem( label = "Create Locator", radialPosition = "SW", subMenu = True, ) maya.cmds.menuItem( label = "At Bound Min", radialPosition = "N", command = IECore.curry( __createLocatorAtPoints, sceneShapes[0], [ "Min" ] ), ) maya.cmds.menuItem( label = "At Bound Max", radialPosition = "NE", command = IECore.curry( __createLocatorAtPoints, sceneShapes[0], [ "Max" ] ), ) maya.cmds.menuItem( label = "At Bound Min And Max", radialPosition = "E", command = IECore.curry( __createLocatorAtPoints, sceneShapes[0], [ "Min", "Max" ] ), ) maya.cmds.menuItem( label = "At Bound Centre", radialPosition = "SE", command = IECore.curry( __createLocatorAtPoints, sceneShapes[0], [ "Center" ] ), ) maya.cmds.menuItem( label = "At Transform Origin", radialPosition = "S", command = IECore.curry( __createLocatorWithTransform, sceneShapes[0] ), ) maya.cmds.setParent( "..", menu=True ) # Object mode else: if len( sceneShapes ) == 1: if maya.cmds.getAttr( sceneShapes[0]+".drawGeometry" ) or maya.cmds.getAttr( sceneShapes[0]+".drawChildBounds" ): maya.cmds.menuItem( label = "Component", radialPosition = "N", command = IECore.curry( __componentCallback, sceneShapes[0] ) ) maya.cmds.menuItem( label = "Preview...", radialPosition = "NW", subMenu = True ) maya.cmds.menuItem( label = "All Geometry On", radialPosition = "E", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawGeometry", True ) ) maya.cmds.menuItem( label = "All Child Bounds On", radialPosition = "SE", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawChildBounds", True ) ) maya.cmds.menuItem( label = "All Root Bound On", radialPosition = "NE", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawRootBound", True ) ) maya.cmds.menuItem( label = "All Geometry Off", radialPosition = "W", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawGeometry", False ) ) maya.cmds.menuItem( label = "All Child Bounds Off", radialPosition = "SW", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawChildBounds", False ) ) maya.cmds.menuItem( label = "All Root Bound Off", radialPosition = "NW", command = IECore.curry( __setChildrenPreviewAttributes, sceneShapes, "drawRootBound", False ) ) maya.cmds.setParent( "..", menu=True ) commonTags = None for fn in fnScS: scene = fn.sceneInterface() tmpTags = scene.readTags(IECore.SceneInterface.EveryTag) if commonTags is None: commonTags = set( tmpTags ) else: commonTags.intersection_update( set(tmpTags) ) tagTree = dict() if not commonTags is None: tags = list(commonTags) for tag in tags : tag = str(tag) parts = tag.split(":") leftOverTag = tag[len(parts[0])+1:] if not parts[0] in tagTree : tagTree[parts[0]] = [ leftOverTag ] else : tagTree[parts[0]].append( leftOverTag ) if tagTree : tags = tagTree.keys() tags.sort() def addTagSubMenuItems( command ): import copy copiedTagTree = copy.deepcopy( tagTree ) for tag in tags : subtags = copiedTagTree[tag] subtags.sort() if "" in subtags: maya.cmds.menuItem( label = tag, command = IECore.curry( command, sceneShapes, tag ) ) subtags.remove("") if subtags: maya.cmds.menuItem( label = tag, subMenu = True ) for tagSuffix in subtags : maya.cmds.menuItem( label = tagSuffix, command = IECore.curry( command, sceneShapes, tag + ":" + tagSuffix ) ) maya.cmds.setParent( "..", menu=True ) maya.cmds.menuItem( label = "Tags filter...", radialPosition = "S", subMenu = True ) maya.cmds.menuItem( label = "Display All", command = IECore.curry( __setTagsFilterPreviewAttributes, sceneShapes, "" ) ) addTagSubMenuItems( __setTagsFilterPreviewAttributes ) maya.cmds.setParent( "..", menu=True ) maya.cmds.menuItem( label = "Expand...", radialPosition = "SE", subMenu = True ) maya.cmds.menuItem( label = "Recursive Expand As Geometry", radialPosition = "W", command = IECore.curry( __expandAsGeometry, sceneShapes ) ) if any( map(lambda x: x.canBeExpanded(), fnScS) ): maya.cmds.menuItem( label = "Expand One Level", radialPosition = "E", command = IECore.curry( __expandOnce, sceneShapes ) ) maya.cmds.menuItem( label = "Recursive Expand", radialPosition = "N", command = IECore.curry( __expandAll, sceneShapes ) ) if len( sceneShapes ) == 1: if fnScS[0].selectedComponentNames() : maya.cmds.menuItem( label = "Expand to Selected Components", radialPosition = "S", command = IECore.curry( __expandToSelected, sceneShapes[0] ) ) if tagTree : maya.cmds.menuItem( label = "Expand by Tag...", radialPosition = "S", subMenu = True ) addTagSubMenuItems( __expandAll ) maya.cmds.setParent( "..", menu=True ) maya.cmds.setParent( "..", menu=True ) parentSceneShape = __parentSceneShape( sceneShapes ) if any( map(lambda x: x.canBeCollapsed(), fnScS) ) or ( parentSceneShape and IECoreMaya.FnSceneShape( parentSceneShape ).canBeCollapsed() ): maya.cmds.menuItem( label = "Collapse...", radialPosition = "SW", subMenu = True ) if parentSceneShape and IECoreMaya.FnSceneShape( parentSceneShape ).canBeCollapsed(): parentName = maya.cmds.listRelatives( parentSceneShape, p=True )[0] maya.cmds.menuItem( label = "Collapse to Parent: "+parentName, radialPosition = "N", command = IECore.curry( __collapseChildren, [parentSceneShape] ) ) if any( map(lambda x: x.canBeCollapsed(), fnScS) ): maya.cmds.menuItem( label = "Collapse Children", radialPosition = "W", command = IECore.curry( __collapseChildren, sceneShapes ) ) maya.cmds.setParent( "..", menu=True ) for c in __dagMenuCallbacks : c( menu, sceneShape )
def __buildOptionalHeaderUI( self, formLayout, attachForm, attachControl, lastControl ) : defaultLabel = "" try : parentUIUserData = self.__vectorParent().parameter.userData()["UI"] defaultLabelStyle = parentUIUserData["defaultChildLabel"].value if 'classname' in defaultLabelStyle.lower() : defaultLabel = self.__class()[2] if defaultLabelStyle.startswith( 'abbreviated' ) : if "classNameFilter" in parentUIUserData : classNameFilter = parentUIUserData["classNameFilter"].value defaultLabel = defaultLabel.replace( classNameFilter.strip( '*' ), '' ) if defaultLabelStyle.endswith( 'ToUI' ) : defaultLabel = maya.mel.eval( 'interToUI( "%s" )' % defaultLabel ) defaultDescription = self.__class()[0].description except : defaultLabel = "" defaultDescription = "" labelPlugPath = self.__labelPlugPath() if labelPlugPath or defaultLabel : label = maya.cmds.getAttr( labelPlugPath ) if labelPlugPath else defaultLabel description = self.__parameter["label"].description if labelPlugPath else defaultDescription self.__label = maya.cmds.text( parent = formLayout, align = "left", label = label, font = IECoreMaya.CompoundParameterUI._labelFont( self.__kw["hierarchyDepth"] ), annotation = IECore.StringUtil.wrap( description, 48 ), width = 190 - IECoreMaya.CompoundParameterUI._labelIndent( self.__kw["hierarchyDepth"] ), recomputeSize = False, ) if labelPlugPath : lockedLabel = False with IECore.IgnoredExceptions( KeyError ) : lockedLabel = self.__parameter["label"].userData()["UI"]["locked"] if not lockedLabel : renameMenu = IECore.MenuDefinition( [ ( "Change label...", { "command" : self.__changeLabel } ), ] ) IECoreMaya.createMenu( renameMenu, self.__label ) IECoreMaya.createMenu( renameMenu, self.__label, button = 1 ) attachForm += [ ( self.__label, "top", 0 ), ( self.__label, "bottom", 0 ), ] attachControl += [ ( self.__label, "left", 4, lastControl ), ] lastControl = self.__label return self.__drawHeaderParameterControls( formLayout, attachForm, attachControl, lastControl, "classVectorParameterHeader" )
from GeometryCombinerTest import GeometryCombinerTest from FromMayaSkinClusterConverterTest import * from ToMayaSkinClusterConverterTest import * from ToMayaGroupConverterTest import ToMayaGroupConverterTest from RunTimeTypedTest import RunTimeTypedTest from ToMayaParticleConverterTest import ToMayaParticleConverterTest from ImageConverterTest import ImageConverterTest from ObjectDataTest import ObjectDataTest from ToMayaCameraConverterTest import ToMayaCameraConverterTest from MayaSceneTest import * from SceneShapeTest import SceneShapeTest from FnSceneShapeTest import FnSceneShapeTest from FromMayaLocatorConverterTest import FromMayaLocatorConverterTest from ToMayaLocatorConverterTest import ToMayaLocatorConverterTest IECoreMaya.TestProgram( testRunner = unittest.TextTestRunner( stream = IECore.CompoundStream( [ sys.stderr, open( "test/IECoreMaya/resultsPython.txt", "w" ) ] ), verbosity = 2 ), plugins = [ "ieCore" ], )
def __expandAsGeometry( sceneShapes, *unused ) : for sceneShape in sceneShapes: fnS = IECoreMaya.FnSceneShape( sceneShape ) fnS.convertAllToGeometry( True )
def testQuery(self): maya.cmds.file(new=True, f=True) def createSceneFile(): scene = IECoreScene.SceneCache(FnSceneShapeTest.__testFile, IECore.IndexedIO.OpenMode.Write) sc = scene.createChild(str(1)) curves = IECoreScene.CurvesPrimitive.createBox( imath.Box3f(imath.V3f(0), imath.V3f(1))) # 6 curves. sc.writeObject(curves, 0.0) matrix = imath.M44d().translate(imath.V3d(0, 0, 0)) sc.writeTransform(IECore.M44dData(matrix), 0.0) createSceneFile() node = maya.cmds.createNode("ieSceneShape") maya.cmds.setAttr(node + '.file', FnSceneShapeTest.__testFile, type='string') maya.cmds.setAttr(node + '.root', '/', type='string') fn = IECoreMaya.FnSceneShape(node) self.assertEqual( maya.cmds.getAttr(fn.fullPathName() + ".outObjects[0]", type=True), None) self.assertEqual( maya.cmds.getAttr(fn.fullPathName() + ".outObjects[1]", type=True), None) maya.cmds.setAttr(fn.fullPathName() + ".queryPaths[0]", "/1", type="string") maya.cmds.setAttr(fn.fullPathName() + ".queryPaths[1]", "/1", type="string") maya.cmds.setAttr(fn.fullPathName() + ".queryConvertParameters[0]", "-index 0", type="string") # Set it to output 0 th box curve. maya.cmds.setAttr(fn.fullPathName() + ".queryConvertParameters[1]", "-index 1", type="string") # Set it to output 1 th box curve. self.assertEqual( maya.cmds.getAttr(fn.fullPathName() + ".outObjects[0]", type=True), "nurbsCurve") self.assertEqual( maya.cmds.getAttr(fn.fullPathName() + ".outObjects[1]", type=True), "nurbsCurve") curveShape0 = maya.cmds.createNode("nurbsCurve") curveShape1 = maya.cmds.createNode("nurbsCurve") maya.cmds.connectAttr(fn.fullPathName() + ".outObjects[0]", curveShape0 + '.create') maya.cmds.connectAttr(fn.fullPathName() + ".outObjects[1]", curveShape1 + '.create') self.assertNotEqual(maya.cmds.pointPosition(curveShape0 + '.cv[0]'), maya.cmds.pointPosition(curveShape1 + '.cv[0]')) maya.cmds.setAttr(fn.fullPathName() + ".queryConvertParameters[1]", "-index 0", type="string") self.assertEqual(maya.cmds.pointPosition(curveShape0 + '.cv[0]'), maya.cmds.pointPosition(curveShape1 + '.cv[0]'))
def expandOnce(self): node = self.fullPathName() transform = maya.cmds.listRelatives(node, parent=True, f=True)[0] scene = self.sceneInterface() if not scene: return [] sceneChildren = scene.childNames() if sceneChildren == []: # No children to expand to return [] sceneFile = maya.cmds.getAttr(node + ".file") sceneRoot = maya.cmds.getAttr(node + ".root") maya.cmds.setAttr(node + ".querySpace", 1) maya.cmds.setAttr(node + ".objectOnly", l=False) maya.cmds.setAttr(node + ".objectOnly", 1) maya.cmds.setAttr(node + ".objectOnly", l=True) drawGeo = maya.cmds.getAttr(node + ".drawGeometry") drawChildBounds = maya.cmds.getAttr(node + ".drawChildBounds") drawRootBound = maya.cmds.getAttr(node + ".drawRootBound") drawTagsFilter = maya.cmds.getAttr(node + ".drawTagsFilter") timeConnection = maya.cmds.listConnections(node + ".time", source=True, destination=False, plugs=True) newSceneShapeFns = [] for i, child in enumerate(sceneChildren): if maya.cmds.objExists(transform + "|" + child): shape = maya.cmds.listRelatives(transform + "|" + child, f=True, type="ieSceneShape") if shape: fnChild = IECoreMaya.FnSceneShape(shape[0]) else: fnChild = IECoreMaya.FnSceneShape.createShape(transform + "|" + child) else: fnChild = IECoreMaya.FnSceneShape.create( child, transformParent=transform) childNode = fnChild.fullPathName() childTransform = maya.cmds.listRelatives(childNode, parent=True, f=True)[0] maya.cmds.setAttr(childNode + ".file", sceneFile, type="string") sceneRootName = "/" + child if sceneRoot == "/" else sceneRoot + "/" + child maya.cmds.setAttr(childNode + ".root", sceneRootName, type="string") index = self.__queryIndexForPath("/" + child) outTransform = node + ".outTransform[" + str(index) + "]" if not maya.cmds.isConnected(outTransform + ".outTranslate", childTransform + ".translate"): maya.cmds.connectAttr(outTransform + ".outTranslate", childTransform + ".translate", f=True) if not maya.cmds.isConnected(outTransform + ".outRotate", childTransform + ".rotate"): maya.cmds.connectAttr(outTransform + ".outRotate", childTransform + ".rotate", f=True) if not maya.cmds.isConnected(outTransform + ".outScale", childTransform + ".scale"): maya.cmds.connectAttr(outTransform + ".outScale", childTransform + ".scale", f=True) maya.cmds.setAttr(childNode + ".drawGeometry", drawGeo) maya.cmds.setAttr(childNode + ".drawChildBounds", drawChildBounds) maya.cmds.setAttr(childNode + ".drawRootBound", drawRootBound) if drawTagsFilter: parentTags = drawTagsFilter.split() childTags = fnChild.sceneInterface().readTags() commonTags = filter(lambda x: str(x) in childTags, parentTags) if not commonTags: # Hide that child since it doesn't match any filter maya.cmds.setAttr(childTransform + ".visibility", 0) else: maya.cmds.setAttr(childNode + ".drawTagsFilter", " ".join(commonTags), type="string") # Connect child time to its parent so they're in sync if not maya.cmds.isConnected(node + ".outTime", childNode + ".time"): maya.cmds.connectAttr(node + ".outTime", childNode + ".time", f=True) newSceneShapeFns.append(fnChild) return newSceneShapeFns
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 & IECore.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 & IECore.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( IECore.SceneInterface.TagFilter.EveryTag)), set([ IECore.InternedString('renderable'), IECore.InternedString('archivable') ])) self.assertEqual( sphereScene.readTags(IECore.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 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 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 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 testArrayPlugCreation(self): op = IECore.Op('test op', IECore.IntParameter('result', '', 0)) op.parameters().addParameters([ IECore.V3fVectorParameter('v3fVector', '', IECore.V3fVectorData()), IECore.V3dVectorParameter('v3dVector', '', IECore.V3dVectorData()), IECore.StringVectorParameter('stringVector', '', IECore.StringVectorData()), IECore.DoubleVectorParameter('doubleVector', '', IECore.DoubleVectorData()), IECore.FloatVectorParameter('floatVector', '', IECore.FloatVectorData()), IECore.IntVectorParameter('intVector', '', IECore.IntVectorData()), IECore.BoolVectorParameter('boolVector', '', IECore.BoolVectorData()), IECore.M44fVectorParameter('m44fVector', '', IECore.M44fVectorData()), IECore.M44dVectorParameter('m44dVector', '', IECore.M44dVectorData()), ]) node = maya.cmds.createNode('ieOpHolderNode') fnPH = IECoreMaya.FnParameterisedHolder(node) self.assert_(not maya.cmds.objExists(node + '.parm_v3fVector')) self.assert_(not maya.cmds.objExists(node + '.parm_v3dVector')) self.assert_(not maya.cmds.objExists(node + '.parm_stringVector')) self.assert_(not maya.cmds.objExists(node + '.parm_doubleVector')) self.assert_(not maya.cmds.objExists(node + '.parm_floatVector')) self.assert_(not maya.cmds.objExists(node + '.parm_intVector')) self.assert_(not maya.cmds.objExists(node + '.parm_boolVector')) self.assert_(not maya.cmds.objExists(node + '.parm_m44fVector')) self.assert_(not maya.cmds.objExists(node + '.parm_m44dVector')) fnPH.setParameterised(op) self.assert_(maya.cmds.objExists(node + '.parm_v3fVector')) self.assert_(maya.cmds.objExists(node + '.parm_v3dVector')) self.assert_(maya.cmds.objExists(node + '.parm_stringVector')) self.assert_(maya.cmds.objExists(node + '.parm_doubleVector')) self.assert_(maya.cmds.objExists(node + '.parm_floatVector')) self.assert_(maya.cmds.objExists(node + '.parm_intVector')) self.assert_(maya.cmds.objExists(node + '.parm_boolVector')) self.assert_(maya.cmds.objExists(node + '.parm_m44fVector')) self.assert_(maya.cmds.objExists(node + '.parm_m44dVector')) self.assertEqual( maya.cmds.getAttr(node + '.parm_v3fVector', type=True), 'vectorArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_v3dVector', type=True), 'vectorArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_stringVector', type=True), 'stringArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_doubleVector', type=True), 'doubleArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_floatVector', type=True), 'doubleArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_intVector', type=True), 'Int32Array') self.assertEqual( maya.cmds.getAttr(node + '.parm_boolVector', type=True), 'Int32Array') self.assertEqual( maya.cmds.getAttr(node + '.parm_m44fVector', type=True), 'doubleArray') self.assertEqual( maya.cmds.getAttr(node + '.parm_m44dVector', type=True), 'doubleArray')
def loadAssetManager(): import IECore, IECoreMaya def __publishRender() : import maya.cmds as m #m.file() import IECore import Gaffer import GafferUI import os, pipe os.environ['PIPE_PUBLISH_FILTER'] = 'render/maya' appLoader = IECore.ClassLoader.defaultLoader( "GAFFER_APP_PATHS" ) appLoader.classNames() app=appLoader.load( 'opa' )() app.parameters()['arguments'] = IECore.StringVectorData(['-Asset.type','render/maya','1','IECORE_ASSET_OP_PATHS']) app.parameters()['op'] = 'publish' app.parameters()['gui'] = 1 app.run() def __publish(f='particle', t='nParticles') : import maya.cmds as m import IECore import Gaffer import PySide import os, pipe os.environ['PIPE_PUBLISH_FILTER'] = f appLoader = IECore.ClassLoader.defaultLoader( "GAFFER_APP_PATHS" ) appLoader.classNames() app=appLoader.load( 'opa' )() app.parameters()['arguments'] = IECore.StringVectorData(['-Asset.type','%s/%s' % (f,t),'1','IECORE_ASSET_OP_PATHS']) app.parameters()['op'] = 'publish' app.parameters()['gui'] = 1 app.run() def __gather() : global sam_window import IECore import Gaffer import GafferUI import assetBrowser import os, pipe scriptNode = Gaffer.ScriptNode() with GafferUI.Window( "Gaffer Browser" ) as sam_window : browser = GafferUI.BrowserEditor( scriptNode ) browser.pathChooser().getPath().setFromString( '/' ) sam_window.setVisible( True ) GafferUI.EventLoop.mainEventLoop().start() menu = IECore.MenuDefinition() menu.append("/Publish/Render", {"command" : __publishRender,"active" : True}) menu.append("/Publish/Particle/nParticle", {"command" : lambda: __publish('particle', 'nParticles'), "active" : True}) menu.append("/Publish/Model", {"command" : lambda: __publish('model', 'cortex'), "active" : True}) menu.append("/Publish/Rig/skeleton", {"command" : __gather, "active" : False}) menu.append("/Publish/Rig/light", {"command" : __gather, "active" : False}) menu.append("/Publish/Animation/camera", {"command" : __gather, "active" : False}) menu.append("/Publish/Animation/vertex", {"command" : __gather, "active" : False}) menu.append("/Publish/Animation/skeleton", {"command" : __gather, "active" : False}) menu.append("/Publish/Animation/particles", {"command" : __gather, "active" : False}) menu.append("/Publish/Texture", {"command" : __gather, "active" : False}) menu.append("/Gather", {"command" : __gather, "active" : True}) #create our custom one! global __cortexMenu __cortexMenu = IECoreMaya.createMenu( menu, "MayaWindow", "SAM" )
def testMatrixVectorPlugs(self): m44fVector = IECore.M44fVectorData( [IECore.M44f(1), IECore.M44f(2), IECore.M44f(3)]) m44dVector = IECore.M44dVectorData( [IECore.M44d(1), IECore.M44d(2), IECore.M44d(3)]) reverseM44fVector = IECore.M44fVectorData( [IECore.M44f(3), IECore.M44f(2), IECore.M44f(1)]) reverseM44dVector = IECore.M44dVectorData( [IECore.M44d(3), IECore.M44d(2), IECore.M44d(1)]) mayaArray = [] for i in range(0, 3): for j in range(0, 16): mayaArray.append(i + 1) reverseMayaArray = list(mayaArray) reverseMayaArray.reverse() op = IECore.Op('test op', IECore.IntParameter('result', '', 0)) op.parameters().addParameters([ IECore.M44fVectorParameter('m44fVector', '', IECore.M44fVectorData()), IECore.M44dVectorParameter('m44dVector', '', IECore.M44dVectorData()), ]) node = maya.cmds.createNode('ieOpHolderNode') fnPH = IECoreMaya.FnParameterisedHolder(node) fnPH.setParameterised(op) # set from cortex to maya self.assertNotEqual(mayaArray, maya.cmds.getAttr(node + '.parm_m44fVector')) self.assertNotEqual(mayaArray, maya.cmds.getAttr(node + '.parm_m44dVector')) fnPH.getParameterised()[0].parameters()['m44fVector'].setValue( m44fVector) fnPH.getParameterised()[0].parameters()['m44dVector'].setValue( m44dVector) fnPH.setNodeValues() self.assertEqual(mayaArray, maya.cmds.getAttr(node + '.parm_m44fVector')) self.assertEqual(mayaArray, maya.cmds.getAttr(node + '.parm_m44dVector')) # set from maya to cortex self.assertNotEqual( reverseM44fVector, fnPH.getParameterised()[0].parameters()['m44fVector'].getValue()) self.assertNotEqual( reverseM44dVector, fnPH.getParameterised()[0].parameters()['m44dVector'].getValue()) maya.cmds.setAttr(node + '.parm_m44fVector', reverseMayaArray, type="doubleArray") maya.cmds.setAttr(node + '.parm_m44dVector', reverseMayaArray, type="doubleArray") fnPH.setParameterisedValues() self.assertEqual( reverseM44fVector, fnPH.getParameterised()[0].parameters()['m44fVector'].getValue()) self.assertEqual( reverseM44dVector, fnPH.getParameterised()[0].parameters()['m44dVector'].getValue()) # set to incorrect length from maya maya.cmds.setAttr(node + '.parm_m44fVector', [0, 1, 2], type="doubleArray") maya.cmds.setAttr(node + '.parm_m44dVector', [0, 1, 2], type="doubleArray") fnPH.setParameterisedValues() self.assertEqual( None, fnPH.getParameterised()[0].parameters()['m44fVector'].getValue()) self.assertEqual( None, fnPH.getParameterised()[0].parameters()['m44dVector'].getValue())
def testFullPathName(self): node = maya.cmds.createNode("ieOpHolderNode") fnPH = IECoreMaya.FnParameterisedHolder(node) self.assertEqual(node, fnPH.fullPathName())
locator = maya.cmds.spaceLocator()[0] maya.cmds.addAttr(locator, ln="myVectors", dt="vectorArray") maya.cmds.setAttr(locator + "." + "myVectors", 2, *data, type="vectorArray") sl = om.MSelectionList() sl.add(locator) o = om.MObject() sl.getDependNode(0, o) fn = om.MFnDependencyNode(o) plug = fn.findPlug("myVectors") converter = IECoreMaya.FromMayaPlugConverter.create(plug) self.assert_(converter) converted = converter.convert() self.assert_( converted.isInstanceOf(IECore.V3dVectorData.staticTypeId())) for point, index in itertools.product(xrange(2), xrange(3)): self.assertAlmostEqual(converted[point][index], data[point][index]) self.assertEqual(converted.getInterpretation(), IECore.GeometricData.Interpretation.Vector) if __name__ == "__main__": IECoreMaya.TestProgram()
def __init__( self, parameter, **kw ) : IECoreMaya.UIElement.__init__( self, maya.cmds.columnLayout() ) if not isinstance( self.__vectorParent(), ClassVectorParameterUI ) : raise RuntimeError( "Parent must be a ClassVectorParameterUI" ) self.__kw = kw.copy() self.__kw["hierarchyDepth"] = self.__kw.get( "hierarchyDepth", -1 ) + 1 self.__parameter = parameter headerFormLayout = maya.cmds.formLayout() attachForm = [] attachControl = [] # triangle for expanding to view all parameters self.__parameterVisibilityIcon = maya.cmds.iconTextButton( style="iconOnly", height = 20, width = 20, image="arrowRight.xpm", command = self._createCallback( self.__toggleParameterVisibility ), annotation = "Show parameters", visible = self.__parameterIsCollapsible(), ) attachForm += [ ( self.__parameterVisibilityIcon, "left", IECoreMaya.CompoundParameterUI._labelIndent( self.__kw["hierarchyDepth"] ) ), ( self.__parameterVisibilityIcon, "top", 0 ), ( self.__parameterVisibilityIcon, "bottom", 0 ), ] lastControl = self.__buildOptionalPreHeaderUI( headerFormLayout, attachForm, attachControl, self.__parameterVisibilityIcon ) # layer icon layerIcon = maya.cmds.picture( width = 20, image = "%s.xpm" % self.__classIconName(), annotation = IECore.StringUtil.wrap( self.__class()[0].description + "\n\n" + "Click to reorder or remove.", 48, ) ) IECoreMaya.createMenu( self.__layerMenu, layerIcon, useInterToUI=False ) IECoreMaya.createMenu( self.__layerMenu, layerIcon, useInterToUI=False, button=1 ) attachControl += [ ( layerIcon, "left", 0, lastControl ), ] attachForm += [ ( layerIcon, "top", 0 ), ( layerIcon, "bottom", 0 ), ] # class specific fields self.__attributeChangedCallbackId = None self.__presetParameters = [] self.__presetUIs = [] self.__buildOptionalHeaderUI( headerFormLayout, attachForm, attachControl, layerIcon ) maya.cmds.formLayout( headerFormLayout, edit = True, attachForm = attachForm, attachControl = attachControl, ) # CompoundParameterUI to hold child parameters maya.cmds.setParent( self._topLevelUI() ) self.__compoundParameterUI = IECoreMaya.CompoundParameterUI( self.__vectorParent().node(), parameter, labelVisible = False, **kw ) self.setCollapsed( self.getCollapsed(), False )
def __collapseChildren( sceneShapes, *unused ) : for sceneShape in sceneShapes: fnS = IECoreMaya.FnSceneShape( sceneShape ) fnS.collapse()
def test(self): p1 = IECoreMaya.DAGPathVectorParameter("n", "d") p2 = IECoreMaya.DAGPathParameter("n", "d")
for j in range(0, len(origNormal)): self.assertAlmostEqual(origNormal[j], normal3f[j], 6) self.assertAlmostEqual(origNormal[j], normal3d[j], 6) def testSetMeshInterpolation(self): sphere = maya.cmds.polySphere(subdivisionsX=10, subdivisionsY=5, constructionHistory=False) sphere = maya.cmds.listRelatives(sphere, shapes=True)[0] self.assertRaises(ValueError, maya.cmds.getAttr, sphere + ".ieMeshInterpolation") IECoreMaya.ToMayaMeshConverter.setMeshInterpolationAttribute(sphere) self.assertEqual(maya.cmds.getAttr(sphere + ".ieMeshInterpolation"), 0) coreMesh = IECore.MeshPrimitive.createBox( IECore.Box3f(IECore.V3f(-10), IECore.V3f(10))) coreMesh.interpolation = "catmullClark" converter = IECoreMaya.ToMayaObjectConverter.create(coreMesh) transform = maya.cmds.createNode("transform") self.assert_(converter.convert(transform)) mayaMesh = maya.cmds.listRelatives(transform, shapes=True)[0] self.assertEqual(maya.cmds.getAttr(mayaMesh + ".ieMeshInterpolation"), 1) if __name__ == "__main__": IECoreMaya.TestProgram(plugins=["ieCore"])
def __selectCoordinateSystem( self ) : fnPH = IECoreMaya.FnProceduralHolder( self.node() ) fnPH.selectComponentNames( set( [ "coordinateSystem:" + maya.cmds.getAttr( self.plugName() ) ] ) )
def __createChild( self, childName, sceneFile, sceneRoot, drawGeo = False, drawChildBounds = False, drawRootBound = True, drawTagsFilter = "", namespace = "" ) : if namespace: namespace += ":" dag = maya.OpenMaya.MDagPath() self.getPath( dag ) dag.pop() parentPath = dag.fullPathName() childPath = parentPath+"|"+namespace+childName try : childDag = IECoreMaya.dagPathFromString( childPath ) childExists = True except RuntimeError : childExists = False if childExists : shape = maya.cmds.listRelatives( childPath, f=True, type="ieSceneShape" ) if shape: fnChild = IECoreMaya.FnSceneShape( shape[0] ) else: fnChild = IECoreMaya.FnSceneShape.createShape( childPath ) else: fnChild = IECoreMaya.FnSceneShape.create( childName, transformParent = parentPath ) fnChild.findPlug( "file" ).setString( sceneFile ) sceneRootName = "/"+childName if sceneRoot == "/" else sceneRoot+"/"+childName fnChild.findPlug( "root" ).setString( sceneRootName ) fnChildTransform = maya.OpenMaya.MFnDagNode( fnChild.parent( 0 ) ) index = self.__queryIndexForPath( "/"+childName ) outTransform = self.findPlug( "outTransform" ).elementByLogicalIndex( index ) dgMod = maya.OpenMaya.MDGModifier() childTranslate = fnChildTransform.findPlug( "translate" ) if childTranslate.isConnected() : connections = maya.OpenMaya.MPlugArray() childTranslate.connectedTo( connections, True, False ) dgMod.disconnect( connections[0], childTranslate ) dgMod.connect( outTransform.child( self.attribute( "outTranslate" ) ), childTranslate ) childRotate = fnChildTransform.findPlug( "rotate" ) if childRotate.isConnected() : connections = maya.OpenMaya.MPlugArray() childRotate.connectedTo( connections, True, False ) dgMod.disconnect( connections[0], childRotate ) dgMod.connect( outTransform.child( self.attribute( "outRotate" ) ), childRotate ) childScale = fnChildTransform.findPlug( "scale" ) if childScale.isConnected() : connections = maya.OpenMaya.MPlugArray() childScale.connectedTo( connections, True, False ) dgMod.disconnect( connections[0], childScale ) dgMod.connect( outTransform.child( self.attribute( "outScale" ) ), childScale ) childTime = fnChild.findPlug( "time" ) if childTime.isConnected() : connections = maya.OpenMaya.MPlugArray() childTime.connectedTo( connections, True, False ) dgMod.disconnect( connections[0], childTime ) dgMod.connect( self.findPlug( "outTime" ), childTime ) dgMod.doIt() fnChild.findPlug( "drawGeometry" ).setBool( drawGeo ) fnChild.findPlug( "drawChildBounds" ).setBool( drawChildBounds ) fnChild.findPlug( "drawRootBound" ).setBool( drawRootBound ) if drawTagsFilter: parentTags = drawTagsFilter.split() childTags = fnChild.sceneInterface().readTags(IECore.SceneInterface.EveryTag) commonTags = filter( lambda x: str(x) in childTags, parentTags ) if not commonTags: # Hide that child since it doesn't match any filter fnChildTransform.findPlug( "visibility" ).setBool( False ) else: fnChild.findPlug( "drawTagsFilter" ).setString( " ".join( commonTags ) ) return fnChild
def testSetNodeValueUndo(self): p = IECore.Parameterised("") p.parameters().addParameters([ IECore.IntParameter("i", "", 1), IECore.FloatParameter("f", "", 2) ]) node = maya.cmds.createNode("ieParameterisedHolderLocator") fnOH = IECoreMaya.FnParameterisedHolder(node) fnOH.setParameterised(p) # check the start values are as expected self.assertEqual(p["i"].getNumericValue(), 1) self.assertEqual(p["f"].getNumericValue(), 2) self.assertEqual(fnOH.parameterPlug(p["i"]).asInt(), 1) self.assertEqual(fnOH.parameterPlug(p["f"]).asInt(), 2) # change both parameters self.assert_(maya.cmds.undoInfo(query=True, state=True)) p["i"].setNumericValue(10) p["f"].setNumericValue(11) self.assertEqual(p["i"].getNumericValue(), 10) self.assertEqual(p["f"].getNumericValue(), 11) self.assertEqual(fnOH.parameterPlug(p["i"]).asInt(), 1) self.assertEqual(fnOH.parameterPlug(p["f"]).asInt(), 2) # but push only one into maya fnOH.setNodeValue(p["i"]) # and check we see what we expect self.assertEqual(p["i"].getNumericValue(), 10) self.assertEqual(p["f"].getNumericValue(), 11) self.assertEqual(fnOH.parameterPlug(p["i"]).asInt(), 10) self.assertEqual(fnOH.parameterPlug(p["f"]).asInt(), 2) # undo and check maya.cmds.undo() self.assertEqual(p["i"].getNumericValue(), 10) self.assertEqual(p["f"].getNumericValue(), 11) self.assertEqual(fnOH.parameterPlug(p["i"]).asInt(), 1) self.assertEqual(fnOH.parameterPlug(p["f"]).asInt(), 2) # redo and check maya.cmds.redo() self.assertEqual(p["i"].getNumericValue(), 10) self.assertEqual(p["f"].getNumericValue(), 11) self.assertEqual(fnOH.parameterPlug(p["i"]).asInt(), 10) self.assertEqual(fnOH.parameterPlug(p["f"]).asInt(), 2)
def __drawHeaderParameterControl( self, parameter, fnPH ) : ## \todo This would be so much easier if we could just use ParameterUI # instances for each of the controls. We can't because they all do their # own labelling and are layed out for an attribute editor. if we do the # todo in ParameterUI to remove the labels and stuff then we can do the # todo here. control = None parameterPlugPath = fnPH.parameterPlugPath( parameter ) annotation = IECore.StringUtil.wrap( "%s\n\n%s" % ( parameterPlugPath.split( "." )[1], parameter.description ), 48 ) if parameter.presetsOnly : control = maya.cmds.iconTextStaticLabel( image = "arrowDown.xpm", font = "smallBoldLabelFont", style = "iconAndTextHorizontal", height = 23, width = 80, annotation = annotation, ) IECoreMaya.Menu( IECore.curry( self.__presetsMenu, parameter ), control ) IECoreMaya.Menu( IECore.curry( self.__presetsMenu, parameter ), control, button=1 ) self.__presetParameters.append( parameter ) self.__presetUIs.append( control ) if self.__attributeChangedCallbackId is None : self.__attributeChangedCallbackId = IECoreMaya.CallbackId( maya.OpenMaya.MNodeMessage.addAttributeChangedCallback( self.__vectorParent().node(), self.__attributeChanged ) ) self.__updatePresetLabel( len( self.__presetUIs ) - 1 ) elif isinstance( parameter, IECore.BoolParameter ) : control = maya.cmds.checkBox( label="", annotation=annotation ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.FloatParameter ) : control = maya.cmds.floatField( annotation = annotation, minValue = parameter.minValue, maxValue = parameter.maxValue, width = 45, pre = 4 ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.IntParameter ) : kw = {} if parameter.hasMinValue() : kw["minValue"] = parameter.minValue if parameter.hasMaxValue() : kw["maxValue"] = parameter.maxValue control = maya.cmds.intField( annotation = annotation, width = 45, **kw ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.Color3fParameter ) : control = maya.cmds.attrColorSliderGrp( label = "", columnWidth = ( ( 1, 1 ), ( 2, 30 ), ( 3, 1 ) ), columnAttach = ( ( 1, "both", 0 ), ( 2, "both", 0 ), ( 3, "left", 0 ) ), attribute = parameterPlugPath, annotation = annotation, showButton = False ) elif isinstance( parameter, IECore.StringParameter ) : control = maya.cmds.textField( annotation = annotation, width = 150 ) maya.cmds.connectControl( control, parameterPlugPath ) elif isinstance( parameter, IECore.V2fParameter ) : control = maya.cmds.rowLayout( nc=2, cw2=( 45, 45 ) ) column1 = maya.cmds.floatField( annotation = annotation, width = 45, pre = 4, parent = control ) maya.cmds.connectControl( column1, parameterPlugPath + "X" ) column2 = maya.cmds.floatField( annotation = annotation, width = 45, pre = 4, parent = control ) maya.cmds.connectControl( column2, parameterPlugPath + "Y" ) else : IECore.msg( IECore.Msg.Level.Warning, "ClassVectorParameterUI", "Parameter \"%s\" has unsupported type for inclusion in header ( %s )." % ( parameter.name, parameter.typeName() ) ) return control
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 testSetNodeValuesUndo(self): # make an opholder ########################################################################## node = maya.cmds.createNode("ieOpHolderNode") fnPH = IECoreMaya.FnParameterisedHolder(node) op = IECore.ClassLoader.defaultOpLoader().load("parameterTypes", 1)() op.parameters().removeParameter("m") # no color4f support in maya fnPH.setParameterised(op) # check we have the starting values we expect ########################################################################### self.assertEqual(op["a"].getNumericValue(), 1) aPlug = fnPH.parameterPlug(op["a"]) self.assertEqual(aPlug.asInt(), 1) self.assertEqual(op["b"].getNumericValue(), 2) bPlug = fnPH.parameterPlug(op["b"]) self.assertEqual(bPlug.asFloat(), 2) self.assertEqual(op["c"].getNumericValue(), 3) cPlug = fnPH.parameterPlug(op["c"]) self.assertEqual(cPlug.asDouble(), 3) self.assertEqual(op["d"].getTypedValue(), "ssss") dPlug = fnPH.parameterPlug(op["d"]) self.assertEqual(dPlug.asString(), "ssss") self.assertEqual(op["e"].getValue(), IECore.IntVectorData([4, -1, 2])) ePlug = fnPH.parameterPlug(op["e"]) fnE = maya.OpenMaya.MFnIntArrayData(ePlug.asMObject()) self.assertEqual(fnE[0], 4) self.assertEqual(fnE[1], -1) self.assertEqual(fnE[2], 2) self.assertEqual(fnE.length(), 3) self.assertEqual(op["f"].getValue(), IECore.StringVectorData(["one", "two", "three"])) fPlug = fnPH.parameterPlug(op["f"]) fnF = maya.OpenMaya.MFnStringArrayData(fPlug.asMObject()) fList = [] fnF.copyTo(fList) self.assertEqual(fList, ["one", "two", "three"]) self.assertEqual(op["g"].getTypedValue(), IECore.V2f(1, 2)) gPlug = fnPH.parameterPlug(op["g"]) self.assertEqual(gPlug.child(0).asFloat(), 1) self.assertEqual(gPlug.child(1).asFloat(), 2) self.assertEqual(op["h"].getTypedValue(), IECore.V3f(1, 1, 1)) hPlug = fnPH.parameterPlug(op["h"]) self.assertEqual(hPlug.child(0).asFloat(), 1) self.assertEqual(hPlug.child(1).asFloat(), 1) self.assertEqual(hPlug.child(2).asFloat(), 1) self.assertEqual(op["q"].getTypedValue(), False) qPlug = fnPH.parameterPlug(op["q"]) self.assertEqual(qPlug.asBool(), False) self.assertEqual(op["t"].getTypedValue(), IECore.Box3f(IECore.V3f(-1), IECore.V3f(1))) tPlug = fnPH.parameterPlug(op["t"]) self.assertEqual(tPlug.child(0).child(0).asFloat(), -1) self.assertEqual(tPlug.child(0).child(1).asFloat(), -1) self.assertEqual(tPlug.child(0).child(2).asFloat(), -1) self.assertEqual(tPlug.child(1).child(0).asFloat(), 1) self.assertEqual(tPlug.child(1).child(1).asFloat(), 1) self.assertEqual(tPlug.child(1).child(2).asFloat(), 1) # change all the node values, making sure undo is enabled ############################################################################# self.assert_(maya.cmds.undoInfo(query=True, state=True)) # change the parameters op["a"].setNumericValue(10) op["b"].setNumericValue(100) op["c"].setNumericValue(12) op["d"].setTypedValue("a") op["e"].setValue(IECore.IntVectorData([1, 2, 3, 4])) op["f"].setValue(IECore.StringVectorData(["hi"])) op["g"].setTypedValue(IECore.V2f(10, 100)) op["h"].setTypedValue(IECore.V3f(-1, -2, -3)) op["q"].setTypedValue(True) op["t"].setTypedValue(IECore.Box3f(IECore.V3f(-10), IECore.V3f(0))) # check they are changed self.assertEqual(op["a"].getNumericValue(), 10) self.assertEqual(op["b"].getNumericValue(), 100) self.assertEqual(op["c"].getNumericValue(), 12) self.assertEqual(op["d"].getTypedValue(), "a") self.assertEqual(op["e"].getValue(), IECore.IntVectorData([1, 2, 3, 4])) self.assertEqual(op["f"].getValue(), IECore.StringVectorData(["hi"])) self.assertEqual(op["g"].getTypedValue(), IECore.V2f(10, 100)) self.assertEqual(op["h"].getTypedValue(), IECore.V3f(-1, -2, -3)) self.assertEqual(op["q"].getTypedValue(), True) self.assertEqual(op["t"].getTypedValue(), IECore.Box3f(IECore.V3f(-10), IECore.V3f(0))) # push the changes onto the node fnPH.setNodeValues() # check the node values are changed ############################################################################# self.assertEqual(aPlug.asInt(), 10) self.assertEqual(bPlug.asFloat(), 100) self.assertEqual(cPlug.asDouble(), 12) self.assertEqual(dPlug.asString(), "a") fnE = maya.OpenMaya.MFnIntArrayData(ePlug.asMObject()) self.assertEqual(fnE[0], 1) self.assertEqual(fnE[1], 2) self.assertEqual(fnE[2], 3) self.assertEqual(fnE[3], 4) self.assertEqual(fnE.length(), 4) fnF = maya.OpenMaya.MFnStringArrayData(fPlug.asMObject()) fList = [] fnF.copyTo(fList) self.assertEqual(fList, ["hi"]) self.assertEqual(gPlug.child(0).asFloat(), 10) self.assertEqual(gPlug.child(1).asFloat(), 100) self.assertEqual(hPlug.child(0).asFloat(), -1) self.assertEqual(hPlug.child(1).asFloat(), -2) self.assertEqual(hPlug.child(2).asFloat(), -3) self.assertEqual(qPlug.asBool(), True) self.assertEqual(tPlug.child(0).child(0).asFloat(), -10) self.assertEqual(tPlug.child(0).child(1).asFloat(), -10) self.assertEqual(tPlug.child(0).child(2).asFloat(), -10) self.assertEqual(tPlug.child(1).child(0).asFloat(), 0) self.assertEqual(tPlug.child(1).child(1).asFloat(), 0) self.assertEqual(tPlug.child(1).child(2).asFloat(), 0) # check that the parameter values are unchanged in the process of # pushing them to maya ############################################################################# self.assertEqual(op["a"].getNumericValue(), 10) self.assertEqual(op["b"].getNumericValue(), 100) self.assertEqual(op["c"].getNumericValue(), 12) self.assertEqual(op["d"].getTypedValue(), "a") self.assertEqual(op["e"].getValue(), IECore.IntVectorData([1, 2, 3, 4])) self.assertEqual(op["f"].getValue(), IECore.StringVectorData(["hi"])) self.assertEqual(op["g"].getTypedValue(), IECore.V2f(10, 100)) self.assertEqual(op["h"].getTypedValue(), IECore.V3f(-1, -2, -3)) self.assertEqual(op["q"].getTypedValue(), True) self.assertEqual(op["t"].getTypedValue(), IECore.Box3f(IECore.V3f(-10), IECore.V3f(0))) # undo, and check the node values are back to before ############################################################################# maya.cmds.undo() self.assertEqual(aPlug.asInt(), 1) self.assertEqual(bPlug.asFloat(), 2) self.assertEqual(cPlug.asDouble(), 3) self.assertEqual(dPlug.asString(), "ssss") fnE = maya.OpenMaya.MFnIntArrayData(ePlug.asMObject()) self.assertEqual(fnE[0], 4) self.assertEqual(fnE[1], -1) self.assertEqual(fnE[2], 2) self.assertEqual(fnE.length(), 3) fnF = maya.OpenMaya.MFnStringArrayData(fPlug.asMObject()) fList = [] fnF.copyTo(fList) self.assertEqual(fList, ["one", "two", "three"]) self.assertEqual(gPlug.child(0).asFloat(), 1) self.assertEqual(gPlug.child(1).asFloat(), 2) self.assertEqual(hPlug.child(0).asFloat(), 1) self.assertEqual(hPlug.child(1).asFloat(), 1) self.assertEqual(hPlug.child(2).asFloat(), 1) self.assertEqual(qPlug.asBool(), False) self.assertEqual(tPlug.child(0).child(0).asFloat(), -1) self.assertEqual(tPlug.child(0).child(1).asFloat(), -1) self.assertEqual(tPlug.child(0).child(2).asFloat(), -1) self.assertEqual(tPlug.child(1).child(0).asFloat(), 1) self.assertEqual(tPlug.child(1).child(1).asFloat(), 1) self.assertEqual(tPlug.child(1).child(2).asFloat(), 1) # check that the parameter values are unchanged in the undo process ############################################################################# self.assertEqual(op["a"].getNumericValue(), 10) self.assertEqual(op["b"].getNumericValue(), 100) self.assertEqual(op["c"].getNumericValue(), 12) self.assertEqual(op["d"].getTypedValue(), "a") self.assertEqual(op["e"].getValue(), IECore.IntVectorData([1, 2, 3, 4])) self.assertEqual(op["f"].getValue(), IECore.StringVectorData(["hi"])) self.assertEqual(op["g"].getTypedValue(), IECore.V2f(10, 100)) self.assertEqual(op["h"].getTypedValue(), IECore.V3f(-1, -2, -3)) self.assertEqual(op["q"].getTypedValue(), True) self.assertEqual(op["t"].getTypedValue(), IECore.Box3f(IECore.V3f(-10), IECore.V3f(0))) # redo, and check they are changed again ############################################################################# maya.cmds.redo() self.assertEqual(aPlug.asInt(), 10) self.assertEqual(bPlug.asFloat(), 100) self.assertEqual(cPlug.asDouble(), 12) self.assertEqual(dPlug.asString(), "a") fnE = maya.OpenMaya.MFnIntArrayData(ePlug.asMObject()) self.assertEqual(fnE[0], 1) self.assertEqual(fnE[1], 2) self.assertEqual(fnE[2], 3) self.assertEqual(fnE[3], 4) self.assertEqual(fnE.length(), 4) fnF = maya.OpenMaya.MFnStringArrayData(fPlug.asMObject()) fList = [] fnF.copyTo(fList) self.assertEqual(fList, ["hi"]) self.assertEqual(gPlug.child(0).asFloat(), 10) self.assertEqual(gPlug.child(1).asFloat(), 100) self.assertEqual(hPlug.child(0).asFloat(), -1) self.assertEqual(hPlug.child(1).asFloat(), -2) self.assertEqual(hPlug.child(2).asFloat(), -3) self.assertEqual(qPlug.asBool(), True) self.assertEqual(tPlug.child(0).child(0).asFloat(), -10) self.assertEqual(tPlug.child(0).child(1).asFloat(), -10) self.assertEqual(tPlug.child(0).child(2).asFloat(), -10) self.assertEqual(tPlug.child(1).child(0).asFloat(), 0) self.assertEqual(tPlug.child(1).child(1).asFloat(), 0) self.assertEqual(tPlug.child(1).child(2).asFloat(), 0) # check that the parameter values are unchanged in the redo process ############################################################################# self.assertEqual(op["a"].getNumericValue(), 10) self.assertEqual(op["b"].getNumericValue(), 100) self.assertEqual(op["c"].getNumericValue(), 12) self.assertEqual(op["d"].getTypedValue(), "a") self.assertEqual(op["e"].getValue(), IECore.IntVectorData([1, 2, 3, 4])) self.assertEqual(op["f"].getValue(), IECore.StringVectorData(["hi"])) self.assertEqual(op["g"].getTypedValue(), IECore.V2f(10, 100)) self.assertEqual(op["h"].getTypedValue(), IECore.V3f(-1, -2, -3)) self.assertEqual(op["q"].getTypedValue(), True) self.assertEqual(op["t"].getTypedValue(), IECore.Box3f(IECore.V3f(-10), IECore.V3f(0)))
def _menuDefinition( callbackShape ) : sceneShapes = __selectedSceneShapes() if not sceneShapes : return mainDef = IECore.MenuDefinition() fnShapes = [ IECoreMaya.FnSceneShape( shape ) for shape in sceneShapes ] # INVALID SHAPES invalidSceneShapes = __invalidSceneShapes( sceneShapes ) if invalidSceneShapes : mainDef.append( "/Invalid Inputs for selected SceneShapes!", { "blindData" : { "maya" : { "radialPosition" : "N" } } } ) return mainDef # COMPONENT MODE if fnShapes[ 0 ].selectedComponentNames() : mainDef.append( "/Object", { "blindData" : { "maya" : { "radialPosition" : "N" } }, "command" : functools.partial( __objectCallback, sceneShapes[ 0 ] ) } ) mainDef.append( "/Print Component Names", { "blindData" : { "maya" : { "radialPosition" : "NW" } }, "command" : functools.partial( __printComponents, sceneShapes[ 0 ] ) } ) mainDef.append( "/Print Selected Component Names", { "blindData" : { "maya" : { "radialPosition" : "NE" } }, "command" : functools.partial( __printSelectedComponents, sceneShapes[ 0 ] ) } ) # EXPAND expandDef = IECore.MenuDefinition( [ ("/Expand to Selected Components", { "blindData" : { "maya" : { "radialPosition" : "S" } }, "command" : functools.partial( __expandToSelected, sceneShapes[ 0 ] ) }), ] ) mainDef.append( "/Expand...", { "blindData" : { "maya" : { "radialPosition" : "SE" } }, "subMenu" : expandDef } ) locatorDef = IECore.MenuDefinition( [ ("/At Bound Min", { "blindData" : { "maya" : { "radialPosition" : "N" } }, "command" : functools.partial( __createLocatorAtPoints, sceneShapes[ 0 ], [ "Min" ] ) }), ("/At Bound Max", { "blindData" : { "maya" : { "radialPosition" : "NE" } }, "command" : functools.partial( __createLocatorAtPoints, sceneShapes[ 0 ], [ "Max" ] ) }), ("/At Bound Min And Max", { "blindData" : { "maya" : { "radialPosition" : "E" } }, "command" : functools.partial( __createLocatorAtPoints, sceneShapes[ 0 ], [ "Min", "Max" ] ) }), ("/At Bound Centre", { "blindData" : { "maya" : { "radialPosition" : "SE" } }, "command" : functools.partial( __createLocatorAtPoints, sceneShapes[ 0 ], [ "Center" ] ) }), ("/At Transform Origin", { "blindData" : { "maya" : { "radialPosition" : "S" } }, "command" : functools.partial( __createLocatorWithTransform, sceneShapes[ 0 ] ) }), ] ) mainDef.append( "/Create Locator", { "blindData" : { "maya" : { "radialPosition" : "SW" } }, "subMenu" : locatorDef } ) # OBJECT MODE else : # PREVIEW if len( sceneShapes ) == 1 and (maya.cmds.getAttr( sceneShapes[ 0 ] + ".drawGeometry" ) or maya.cmds.getAttr( sceneShapes[ 0 ] + ".drawChildBounds" )) : mainDef.append( "/Component", { "blindData" : { "maya" : { "radialPosition" : "N" } }, "command" : functools.partial( __componentCallback, sceneShapes[ 0 ] ) } ) previewDef = IECore.MenuDefinition( [ ("/All Geometry On", { "blindData" : { "maya" : { "radialPosition" : "E" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawGeometry", True ) }), ("/All Child Bounds On", { "blindData" : { "maya" : { "radialPosition" : "SE" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawChildBounds", True ) }), ("/All Root Bound On", { "blindData" : { "maya" : { "radialPosition" : "NE" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawRootBound", True ) }), ("/All Geometry Off", { "blindData" : { "maya" : { "radialPosition" : "W" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawGeometry", False ) }), ("/All Child Bounds Off", { "blindData" : { "maya" : { "radialPosition" : "SW" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawChildBounds", False ) }), ("/All Root Bound Off", { "blindData" : { "maya" : { "radialPosition" : "NE" } }, "command" : functools.partial( __setChildrenPreviewAttributes, sceneShapes, "drawRootBound", False ) }) ] ) mainDef.append( "/Preview...", { "blindData" : { "maya" : { "radialPosition" : "NW" } }, "subMenu" : previewDef } ) # get all tags that are shared between all shapes commonTags = None for fn in fnShapes : scene = fn.sceneInterface() tmpTags = scene.readTags( IECoreScene.SceneInterface.EveryTag ) if commonTags is None : commonTags = set( tmpTags ) else : commonTags.intersection_update( set( tmpTags ) ) tagTree = dict() if commonTags : for tag in commonTags : tag = str( tag ) namespace, _, subTagsString = tag.partition( ':' ) subTags = set( subTagsString.split( ':' ) ) if not namespace in tagTree : tagTree[ namespace ] = subTags else : tagTree[ namespace ].update( subTags ) # EXPAND expandDef = IECore.MenuDefinition( [ ("/Recursive Expand As Geometry", { "blindData" : { "maya" : { "radialPosition" : "W" } }, "command" : functools.partial( _expandAsGeometry, sceneShapes)})] ) mainDef.append( "/Expand...", { "blindData" : { "maya" : { "radialPosition" : "SE" } }, "subMenu" : expandDef } ) if any( map( lambda x : x.canBeExpanded(), fnShapes ) ) : expandDef.append( "/Expand One Level", { "blindData" : { "maya" : { "radialPosition" : "E" } }, "command" : functools.partial( __expandOnce, sceneShapes ) } ) expandDef.append( "/Recursive Expand", { "blindData" : { "maya" : { "radialPosition" : "N" } }, "command" : functools.partial( _expandAll, sceneShapes)}) if len( sceneShapes ) == 1 and fnShapes[ 0 ].selectedComponentNames() : expandDef.append( "/Expand to Selected Components", { "blindData" : { "maya" : { "radialPosition" : "S" } }, "command" : functools.partial( __expandToSelected, sceneShapes[ 0 ] ) } ) if tagTree : tags = tagTree.keys() tags.sort() def addTagSubMenuItems( menuDef, command ) : import copy copiedTagTree = copy.deepcopy( tagTree ) for tag in tags : subtags = list( copiedTagTree[ tag ] ) subtags.sort() for subtag in subtags : if subtag == '' : label = "/{}".format( tag ) expandTag = tag else : label = "/{}/{}".format( tag, subtag ) expandTag = "{}:{}".format( tag, subtag ) menuDef.append( label, { "command" : functools.partial( command, sceneShapes, expandTag ) } ) filterDef = IECore.MenuDefinition( [ ("/Display All", { "command" : functools.partial( _setTagsFilterPreviewAttributes, sceneShapes, "")}) ] ) expandTagDef = IECore.MenuDefinition() expandTagGeoDef = IECore.MenuDefinition() mainDef.append( "/Tags filter...", { "blindData" : { "maya" : { "radialPosition" : "S" } }, "subMenu" : filterDef } ) addTagSubMenuItems( filterDef, _setTagsFilterPreviewAttributes) addTagSubMenuItems( expandTagDef, _expandAll) addTagSubMenuItems( expandTagGeoDef, _expandAsGeometry) expandDef.append( "/Expand by Tag...", { "blindData" : { "maya" : { "radialPosition" : "SW" } }, "subMenu" : expandTagDef } ) expandDef.append( "/Expand by Tag as Geo...", { "blindData" : { "maya" : { "radialPosition" : "SE" } }, "subMenu" : expandTagGeoDef } ) parentSceneShape = __parentSceneShape( sceneShapes ) # COLLAPSE if any( map( lambda x : x.canBeCollapsed(), fnShapes ) ) or (parentSceneShape and IECoreMaya.FnSceneShape( parentSceneShape ).canBeCollapsed()) : collapseDef = IECore.MenuDefinition() if parentSceneShape and IECoreMaya.FnSceneShape( parentSceneShape ).canBeCollapsed() : parentName = maya.cmds.listRelatives( parentSceneShape, p = True )[ 0 ] collapseDef.append( "/Collapse to Parent: {}".format( parentName ), { "blindData" : { "maya" : { "radialPosition" : "N" } }, "command" : functools.partial( __collapseChildren, [ parentSceneShape ] ) } ) if any( map( lambda x : x.canBeCollapsed(), fnShapes ) ) : collapseDef.append( "/Collapse Children", { "blindData" : { "maya" : { "radialPosition" : "W" } }, "command" : functools.partial( __collapseChildren, sceneShapes ) } ) mainDef.append( "/Collapse...", { "blindData" : { "maya" : { "radialPosition" : "SW" } }, "subMenu" : collapseDef } ) return mainDef
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 __createChild(self, childName, sceneFile, sceneRoot, drawGeo=False, drawChildBounds=False, drawRootBound=True, drawTagsFilter="", namespace=""): if namespace: namespace += ":" if not sceneRoot.endswith('/'): sceneRoot += '/' # Construct the child sceneShapes's path dag = maya.OpenMaya.MDagPath() self.getPath(dag) dag.pop() parentPath = dag.fullPathName() childPath = parentPath + "|" + namespace + childName # Create (or retrieve) the child sceneShape if maya.cmds.objExists(childPath): shape = maya.cmds.listRelatives(childPath, fullPath=True, type="ieSceneShape") if shape: fnChild = IECoreMaya.FnSceneShape(shape[0]) else: fnChild = IECoreMaya.FnSceneShape.createShape(childPath) else: fnChild = IECoreMaya.FnSceneShape.create( childName, transformParent=parentPath) fnChildTransform = maya.OpenMaya.MFnDagNode(fnChild.parent(0)) # Set the child's sceneShapes plugs dgMod = maya.OpenMaya.MDGModifier() dgMod.newPlugValueString(fnChild.findPlug("file"), sceneFile) dgMod.newPlugValueString(fnChild.findPlug("root"), sceneRoot + childName) dgMod.newPlugValueBool(fnChild.findPlug("drawGeometry"), drawGeo) dgMod.newPlugValueBool(fnChild.findPlug("drawChildBounds"), drawChildBounds) dgMod.newPlugValueBool(fnChild.findPlug("drawRootBound"), drawRootBound) dgMod.doIt() # Set visible if I have any of the draw flags in my hierarchy, otherwise set hidden if drawTagsFilter: childTags = fnChild.sceneInterface().readTags( IECoreScene.SceneInterface.EveryTag) commonTags = filter(lambda x: str(x) in childTags, drawTagsFilter.split()) if not commonTags: dgMod.newPlugValueBool(fnChildTransform.findPlug("visibility"), False) else: dgMod.newPlugValueString(fnChild.findPlug("drawTagsFilter"), " ".join(commonTags)) dgMod.newPlugValueBool(fnChildTransform.findPlug("visibility"), True) # Drive the child's transforms through the parent sceneShapes plugs index = self.__queryIndexForPath("/" + childName) outTransform = self.findPlug("outTransform").elementByLogicalIndex( index) childTranslate = fnChildTransform.findPlug("translate") FnSceneShape.__disconnectPlug(dgMod, childTranslate) dgMod.connect(outTransform.child(self.attribute("outTranslate")), childTranslate) childRotate = fnChildTransform.findPlug("rotate") FnSceneShape.__disconnectPlug(dgMod, childRotate) dgMod.connect(outTransform.child(self.attribute("outRotate")), childRotate) childScale = fnChildTransform.findPlug("scale") FnSceneShape.__disconnectPlug(dgMod, childScale) dgMod.connect(outTransform.child(self.attribute("outScale")), childScale) childTime = fnChild.findPlug("time") FnSceneShape.__disconnectPlug(dgMod, childTime) dgMod.connect(self.findPlug("outTime"), childTime) dgMod.doIt() return fnChild
def _dagMenu(menu, proceduralHolder): if maya.cmds.nodeType(proceduralHolder) != "ieProceduralHolder": children = maya.cmds.listRelatives(proceduralHolder, children=True, type="ieProceduralHolder", fullPath=True) if not children: return else: proceduralHolder = children[0] maya.cmds.setParent(menu, menu=True) maya.cmds.menuItem(label="Component", radialPosition="N", command=IECore.curry(__componentCallback, proceduralHolder)) maya.cmds.menuItem( label="Object", radialPosition="W", command=IECore.curry(__objectCallback, proceduralHolder), ) maya.cmds.menuItem(label="Print Component Names", radialPosition="NE", command=IECore.curry(__printComponents, proceduralHolder)) fnPH = IECoreMaya.FnProceduralHolder(proceduralHolder) if fnPH.selectedComponentNames(): maya.cmds.menuItem(label="Print Selected Component Names", radialPosition="E", command=IECore.curry(__printSelectedComponents, proceduralHolder)) if fnPH.selectedComponentNames(): maya.cmds.menuItem( label="Create Locator", radialPosition="SE", subMenu=True, ) maya.cmds.menuItem( label="At Bound Min", radialPosition="N", command=IECore.curry(__createLocatorAtPoints, proceduralHolder, ["Min"]), ) maya.cmds.menuItem( label="At Bound Max", radialPosition="NE", command=IECore.curry(__createLocatorAtPoints, proceduralHolder, ["Max"]), ) maya.cmds.menuItem( label="At Bound Min And Max", radialPosition="E", command=IECore.curry(__createLocatorAtPoints, proceduralHolder, ["Min", "Max"]), ) maya.cmds.menuItem( label="At Bound Centre", radialPosition="SE", command=IECore.curry(__createLocatorAtPoints, proceduralHolder, ["Center"]), ) maya.cmds.menuItem( label="At Transform Origin", radialPosition="S", command=IECore.curry(__createLocatorWithTransform, proceduralHolder), ) maya.cmds.setParent(menu, menu=True) maya.cmds.menuItem( label="Convert To Geometry", radialPosition="S", command= "import IECoreMaya; IECoreMaya.ProceduralHolderUI._convertToGeometry( \"" + proceduralHolder + "\" )", ) for c in __dagMenuCallbacks: c(menu, proceduralHolder)
def __buildOptionalHeaderUI( self, formLayout, attachForm, attachControl, lastControl ) : defaultLabel = "" try : parentUIUserData = self.__vectorParent().parameter.userData()["UI"] defaultLabelStyle = parentUIUserData["defaultChildLabel"].value if 'classname' in defaultLabelStyle.lower() : defaultLabel = self.__class()[2] if defaultLabelStyle.startswith( 'abbreviated' ) : if "classNameFilter" in parentUIUserData : classNameFilter = parentUIUserData["classNameFilter"].value defaultLabel = defaultLabel.replace( classNameFilter.strip( '*' ), '' ) if defaultLabelStyle.endswith( 'ToUI' ) : defaultLabel = maya.mel.eval( 'interToUI( "%s" )' % defaultLabel ) defaultDescription = self.__class()[0].description except : defaultLabel = "" defaultDescription = "" labelPlugPath = self.__labelPlugPath() if labelPlugPath or defaultLabel : label = maya.cmds.getAttr( labelPlugPath ) if labelPlugPath else defaultLabel description = self.__parameter["label"].description if labelPlugPath else defaultDescription self.__label = maya.cmds.text( parent = formLayout, align = "left", label = label, font = IECoreMaya.CompoundParameterUI._labelFont( self.__kw["hierarchyDepth"] ), annotation = IECore.StringUtil.wrap( description, 48 ), width = 190 - IECoreMaya.CompoundParameterUI._labelIndent( self.__kw["hierarchyDepth"] ), recomputeSize = False, ) if labelPlugPath : lockedLabel = False with IECore.IgnoredExceptions( KeyError ) : lockedLabel = self.__parameter["label"].userData()["UI"]["locked"] if not lockedLabel : renameMenu = IECore.MenuDefinition( [ ( "Change label...", { "command" : self.__changeLabel } ), ] ) IECoreMaya.Menu( renameMenu, self.__label ) IECoreMaya.Menu( renameMenu, self.__label, button = 1 ) attachForm += [ ( self.__label, "top", 0 ), ( self.__label, "bottom", 0 ), ] attachControl += [ ( self.__label, "left", 4, lastControl ), ] lastControl = self.__label return self.__drawHeaderParameterControls( formLayout, attachForm, attachControl, lastControl, "classVectorParameterHeader" )
def pipeIdleStartup(): # force auto-load of these plugins at startup! plugs=[ 'slumMayaPlugin.py', 'ieCore.so', '3delight_for_maya%s' % os.environ['MAYA_VERSION_MAJOR'], ] if plugs: for each in plugs: print '='*80 print 'PIPE: auto-loading %s plugin...\n' % each try: m.loadPlugin( each ) except: pass print '='*80 # re-initialize cortex menu to filter out admin ops! try: import IECore, IECoreMaya except: IECore=None IECoreMaya=None if IECore: def __createOp( className ) : fnOH = IECoreMaya.FnOpHolder.create( os.path.basename( className ), className ) maya.cmds.select( fnOH.fullPathName() ) def filteredOpCreationMenuDefinition() : menu = IECore.MenuDefinition() loader = IECore.ClassLoader.defaultOpLoader() for className in loader.classNames() : if not filter( lambda x: x in className, ['admin/'] ): menu.append( "/" + className, { "command" : IECore.curry( __createOp, className ), } ) return menu menu = IECore.MenuDefinition() menu.append( "/Create Procedural", { "subMenu" : IECoreMaya.Menus.proceduralCreationMenuDefinition, } ) menu.append( "/Create Op", { "subMenu" : filteredOpCreationMenuDefinition, } ) #delete default cortex menu! for each in filter( lambda x: m.menu( x, q=1, l=1)=='Cortex', m.window( "MayaWindow", query=True, menuArray=True ) ): m.deleteUI( each, menu=True ) #create our custom one! global __cortexMenu __cortexMenu = IECoreMaya.createMenu( menu, "MayaWindow", "Cortex" ) # force unload of Alembic plugins!! m.unloadPlugin('AbcExport') m.unloadPlugin('AbcImport')
def testConstructor( self ) : converter = IECoreMaya.FromMayaLocatorConverter( "myLocator" ) camera = converter.convert() self.assert_( camera.isInstanceOf( IECore.CoordinateSystem.staticTypeId() ) )