1

Forgive me, i'm not incredibly good at Python, so please try and go easy on me. I've got a basic program going that creates NURBS circles for Control Shapes on rigs in Maya, and i'm separating each area (Head, torso etc) into different layers. Firstly, how do I change the layer colour. Watching the script editor, this should work but it doesn't. Probably just a syntax error of a noob: cmds.createDisplayLayer (name = 'Head_Control_Shapes', cmds.setAttr ('Head_Control_Shapes').color=4)

My main question though is once this is created (This is run at Startup of the script), how do I place an object inside of it? This is the code fragment that is relevant. Thank you in advance

import maya.cmds as cmds if cmds.window("RyanWindow", exists = True): cmds.deleteUI("RyanWindow") myWindow = cmds.window(t="Ryan Window",w = 300, h = 300) form = cmds.formLayout() cmds.createDisplayLayer (name = 'Head_Control_Shapes', cmds.setAttr ('Head_Control_Shapes').color=4) cmds.createDisplayLayer (name = 'Torso_Control_Shapes', cmds.setAttr ('Torso_Control_Shapes').color=12) cmds.createDisplayLayer (name = 'Arms_Control_Shapes', cmds.setAttr ('Arms_Control_Shapes').color=13) cmds.createDisplayLayer (name = 'Legs_Control_Shapes', cmds.setAttr ('Legs_Control_Shapes').color=31) cmds.createDisplayLayer (name = 'Other_Control_Shapes', cmds.setAttr ('Other_Control_Shapes').color=2) cmds.columnLayout(adj = True) cmds.text(" Custom Control Shape Creator v1 ") cmds.separator(height = 15, style='double' ) cmds.separator(height = 15, style='double' ) cmds.setParent( '..' ) tabs = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5) cmds.formLayout( form, edit=True, attachForm=((tabs, 'top', 40), (tabs, 'left', 0), (tabs, 'bottom', 0), (tabs, 'right', 0)) ) tab1 = cmds.rowColumnLayout(numberOfColumns=3) cmds.button(label='Circle', command = "makeCircle()") def makeCircle(): cmds.circle( nr=(0, 90, 1), c=(0, 0, 0) ) cmds.button(label='Square', command = "makeSquare()") def makeSquare(): cmds.circle( nr=(0, 90, 1), c=(0, 0, 0) ) cmds.button(label='Oval') cmds.setParent( '..' ) 

2 Answers 2

3

I refactored your code very slightly to make it work: (I will include some pointers below the code)

import maya.cmds as cmds if cmds.window("RyanWindow", exists=True): cmds.deleteUI("RyanWindow") myWindow = cmds.window(t="Ryan Window", w=300, h=300) form = cmds.formLayout() print cmds.createDisplayLayer (name='Head_Control_Shapes', empty=True) cmds.createDisplayLayer (name='Torso_Control_Shapes', empty=True) cmds.createDisplayLayer (name='Arms_Control_Shapes', empty=True) cmds.createDisplayLayer (name='Legs_Control_Shapes', empty=True) cmds.createDisplayLayer (name='Other_Control_Shapes', empty=True) cmds.setAttr ('Head_Control_Shapes.color', 4) cmds.setAttr ('Torso_Control_Shapes.color', 12) cmds.setAttr ('Arms_Control_Shapes.color', 13) cmds.setAttr ('Legs_Control_Shapes.color', 31) cmds.setAttr ('Other_Control_Shapes.color', 2) cmds.columnLayout(adj=True) cmds.text(" Custom Control Shape Creator v1 ") cmds.separator(height = 15, style='double' ) cmds.separator(height = 15, style='double' ) cmds.setParent( '..' ) tabs = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5) cmds.formLayout( form, edit=True, attachForm=((tabs, 'top', 40), (tabs, 'left', 0), (tabs, 'bottom', 0), (tabs, 'right', 0)) ) tab1 = cmds.rowColumnLayout(numberOfColumns=3) cmds.button(label='Circle', command="makeCircle()") cmds.button(label='Square', command="makeSquare()") cmds.button(label='Oval') cmds.setParent( '..' ) def makeCircle(): cmds.circle( nr=(0, 90, 1), c=(0, 0, 0) ) def makeSquare(): cmds.circle( nr=(0, 90, 1), c=(0, 0, 0) ) cmds.showWindow(myWindow) 

The way you were using cmds.setAttr was wrong. setAttr shouldn't be part of the cmds.createDisplayLayers call. It is a separate command. That is why I split those two up like so:

cmds.createDisplayLayer (name='Torso_Control_Shapes', empty=True) cmds.setAttr ('Head_Control_Shapes.color', 4) 

The empty=True flag should be set. Otherwise, any objects possibly selected prior to running the script will be added to the newly created layer.

To add an object to a layer DURING CREATION of the layer, you can just pre-select the object(s) and create the layer using cmds.createDisplayLayers without setting the empty flag. If you set the noRecurse=True flag, only the object selected will be added, otherwise all it's decendants, you would also be added.

To add an object AFTER creation of the layer you would use the editDisplayLayerMembers method. You would do this like:

cmds.editDisplayLayerMembers('Torso_Control_Shapes', object1, object2) # where object1 and object2 are strings containing the names of your objects 

Note: I also removed spacing around the '=' symbol in your method calls. Pep8 recommends not having these in parameter assignment in method calls.

Also do check out the docs for more examples and options: http://download.autodesk.com/us/maya/2010help/CommandsPython/editDisplayLayerMembers.html http://download.autodesk.com/us/maya/2010help/CommandsPython/createDisplayLayer.html

Sign up to request clarification or add additional context in comments.

1 Comment

Cannot thank you enough, also, thanks for the annotations and advice. Very useful.
0

mySelection = cmds.ls(sl=True) # create selection variable

cmds.createDisplayLayer (name = "hidden_item", number = 1, empty=True) # create empty display layer

cmds.editDisplayLayerMembers( 'hidden_item', mySelection ) # store my selection into the display layer

cmds.setAttr("hidden_item.visibility", 0) # change an attr of the display layer

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.