0

Normally when I run a script with radio button options you select a radio button option and then you activate it with the button. I used to leave my menu gui outside of a function: but ever since I learned importing maya scripts I started wrapping my menu interfaces in a GUI function which mean my radio button technique now no longer works. I have no idea how to get it to work either. The script itself is simple enough: just select a radio button option after importing the script and then create a shape with the button: atleast thats how it SHOULD work. Instead I get no errors and no shapes created and I dont know whats broken.

'''
import cubeTestTemp
reload (cubeTestTemp)
cubeTestTemp.gui()
'''

import maya.cmds as cmds

#Creates ui. 
if cmds.window("cubeWin", exists =True):
    cmds.deleteUI("cubeWin", window = True)

myWindow = cmds.window("cubeWin",t='DS shapeDemo V1',w=200, h=500, toolbox=True)
column = cmds.columnLayout(adj=True)
#Creates variable to indicate the check box status. 1=Checked 0=Not Checked. 

cubeNum1 = 0
cubeNum2 = 0


#Creates Button funtion. 
def defaultButtonPush(*args):
       #The Print checks if button is pushed and what is the check box status. 
       print "Button is pushed."
       print cubeNum1
       #Check box argument finds the status of the variable and determines what to do. 
       #Eather create a cube or display a error dialog box.
       if cubeNum1 == 1:
        print "Cube Creation sucessful"
        cmds.polyCube()

       print "Button is pushed."
       print cubeNum2
       if cubeNum2 == 1:
        print "Sphere Creation sucessful"
        cmds.polySphere()


def gui(*args):
    #Creates check box. 
    #In the onCommand Script (onc) and offCommand Script (ofc) flags all commands must be made in between double quotes.
    cmds.radioCollection()
    cmds.radioButton(label='Cube',align='left',onCommand="cubeNum1 = 1", offCommand="cubeNum1 = 0")
    cmds.radioButton(label='Sphere',align='left',onCommand="cubeNum2 = 1", offCommand="cubeNum2 = 0")
    #Creates Button.
    cmds.button( label='Execute', command=defaultButtonPush ,align='left' )

cmds.showWindow()
Dasteel
  • 101
  • 18
  • instead of lambda in @ababak answer , you could use partial : https://stackoverflow.com/questions/48570602/maya-python-script-works-from-console-doesnt-work-from-file/48579653#48579653 – DrWeeny Feb 10 '20 at 22:38

1 Answers1

1

Here's the modified script. The problem was the scope of the scripts. "onCommand" was executed in its own scope that has its own "cubeNum" variables.

"""
import cubeTestTemp
reload (cubeTestTemp)
cubeTestTemp.gui()
"""

import maya.cmds as cmds

# Variable to indicate the radio button status. 1=Cube, 2=Shpere. 
shape_selector = 0


def action_button(*args):
    """
    Create an object based on the shape_selector status
    """
    print "Button is pushed", repr(args)
    if shape_selector == 1:
        cmds.polyCube()
        print "Cube created"
    elif shape_selector == 2:
        cmds.polySphere()
        print "Sphere created"
    else:
        print "No shape selected"


def selection_changed(shape):
    """
    Save the current shape selection
    into global variable "shape_selector"
    """
    global shape_selector
    shape_selector = shape
    print "Current selection:", shape_selector


def gui():
    """
    Create the GUI
    """
    if cmds.window("cubeWin", exists=True):
        cmds.deleteUI("cubeWin", window=True)
    myWindow = cmds.window("cubeWin", t='DS shapeDemo V1', w=200, h=500, toolbox=True)
    column = cmds.columnLayout(adj=True)
    # Create the radio buttons 
    cmds.radioCollection()
    cmds.radioButton(label='Cube',align='left', select=True, onCommand=lambda x:selection_changed(1))
    cmds.radioButton(label='Sphere',align='left', onCommand=lambda x:selection_changed(2))
    # Create the push button
    cmds.button(label='Create', command=action_button, align='left')
    cmds.showWindow()

if __name__ == "__main__":
    gui()

Another way is to read the radio button state only when needed

"""
import cubeTestTemp
reload (cubeTestTemp)
cubeTestTemp.gui()
"""

import maya.cmds as cmds


def action_button(cube_button, sphere_button):
    """
    Create an object based on the shape_selector status
    """
    if cmds.radioButton(cube_button, query=True,select=True):
        cmds.polyCube()
        print "Cube created"
    elif cmds.radioButton(sphere_button, query=True,select=True):
        cmds.polySphere()
        print "Sphere created"
    else:
        print "No shape selected"


def gui():
    """
    Create the GUI
    """
    if cmds.window("cubeWin", exists=True):
        cmds.deleteUI("cubeWin", window=True)
    myWindow = cmds.window("cubeWin", t='DS shapeDemo V1', w=200, h=500, toolbox=True)
    column = cmds.columnLayout(adj=True)
    # Create the radio buttons 
    cmds.radioCollection()
    # Save the button ids
    cube_button = cmds.radioButton(label='Cube',align='left', select=True)
    sphere_button = cmds.radioButton(label='Sphere',align='left')
    # Create the push button
    cmds.button(label='Create', command=lambda x:action_button(cube_button, sphere_button), align='left')
    cmds.showWindow()

if __name__ == "__main__":
    gui()
ababak
  • 1,685
  • 1
  • 11
  • 23
  • Thank you very much ababak, I do have a few more questions though. Let's say I wanted to add a third radio button, is the "if elif" method of coding able to do more radio buttons or does it max out at 2? – Dasteel Feb 11 '20 at 05:06
  • and then my next question is what is "if __name__ == "__main__" what type of coding term is that and what does it do? The comment seems to have edited out the underscores: but I'm talking about the main line beneath the Gui function – Dasteel Feb 12 '20 at 05:29
  • https://stackoverflow.com/questions/419163/what-does-if-name-main-do – ababak Feb 12 '20 at 13:24
  • If you are happy with the answer to your original question, you may consider accepting it ;) – ababak Feb 12 '20 at 13:25