局部变量 vs 全局变量,'name 'EXAMPLE' is not defined

Local variables vs global variables, 'name 'EXAMPLE' is not defined

我正在创建一个自定义浮动 window,我可以在其中设置像架子这样的按钮,为我调用和 运行 脚本。对于像我这样不编写大量脚本的建模艺术家非常有用! :P 我希望无需过多修改 Script_B 即可解决此问题,但我们将看看必须做什么! :D

目前我有两个脚本,Script_A 和 Script_B。脚本 B 被保存为 "my_custom_script_name.py"。我正在尝试使用 Script_A 运行 它,但变量从未正确定义。

当我 运行 Script_A 和 Script_B 保存在适当的位置时, UI 甚至不会加载,因为它在定义的第一个变量上出错.

# Error: NameError: file C:/Users/polyshifter/Documents/maya/2019/prefs/scripts\my_custom_script_name.py line 2: global name 'mc' is not defined # 

所以我们还没有接触到其他变量,它就坏了。

脚本 A

import maya.cmds as mc
import maya.mel as mel

# Create a custom floating window with 
if mc.window('ToolsWindow', q=True, exists=True):
    mc.deleteUI('ToolsWindow')
if mc.workspaceControl('ToolsWorkspaceControl', q=True, exists=True):
    mc.deleteUI('ToolsWorkspaceControl')
mc.window('ToolsWindow')
mc.tabLayout('ToolsTabs')

###IMPORT PANEL###

tabMenu = mc.columnLayout("Menu", adj=True)
separator_long = mc.separator(
                         height=10,
                         style='in')


mc.button(label="MyCustomScript", command = "my_custom_script_com()")

mc.setParent('..')
mc.showWindow()

#### My custom script ####
def my_custom_script_com(*args):
    import my_custom_script_name
    my_custom_script_name.run_my_custom_script_ui()

脚本 B

def run_my_custom_script_ui():
    import maya.cmds as mc
    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    mc.button(label="Please_print", command = "please_print()")

    mc.setParent('..')
    mc.showWindow()
    def please_print():
        print "OMG IT'S FINALLY WORKING!! YAY!!"

我试过将 Script_B 放在脚本末尾的 Script_A 中,例如:

def my_custom_script_com(*args):
    import maya.cmds as mc
    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    mc.button(label="Please_print", command = "please_print()")

    mc.setParent('..')
    mc.showWindow()
    def please_print():
        print "OMG IT'S FINALLY WORKING!! YAY!!"

其中第一个 UI 加载,然后是第二个,我看到我的按钮,但是当我点击它时我得到:

# Error: NameError: file <maya console> line 1: name 'please_print' is not defined #

如果有太多不需要的代码或任何我试图将其精简的代码,我深表歉意。这是我的第一个问题!

任何使这些变量正常工作的帮助都会很棒! <3 提前致谢!

非常感谢大家的帮助! Theodox 完美解决了这个问题!

但是....问题在我的非简化脚本中仍然存在!

我有这个艺术家 Leonardo Lezzi 的剧本。 “https://www.linkedin.com/pulse/super-bool-tool-python-leonardo-iezzi/” 当我采用他的脚本并尝试将其实施到我的脚本中时,它会导致错误。首先 pma 没有被定义,然后 none 他的定义被定义。

我已经尝试制作他的 UI(教程和主要教程)并将它们定义为命令,但这对我来说也没有成功。原因是因为(根据我今天学到的 :D),在调用 Script_B(现在的布尔脚本)之后,maya 不再具有这些功能。

我发现唯一可行的方法是将布尔脚本放入我的主要脚本中,以便它与它一起使用。然后将他的 UI 定义为命令,然后通过单击 ScriptA 中的按钮列出这 2 个命令。然后运行它。但是然后返回并删除脚本中的定义并取消缩进,然后重新 运行 脚本。因此,定义仍然是从 运行ning 之前定义的,但现在 ui 是在全球范围内制作的...显然,当您重新启动 maya 时,这会中断,我完全错过了如何制作的要点它们已定义,同时在我单击按钮时仍可调用(对吗?)。

这显然是一种 hack 和愚蠢的做法,但我不明白如何从我的脚本中获取 "super bool tool" 到 运行,只能通过采购 super_bool_tool.py

以下是我到目前为止的内容,但这里的想法是 NOT 到 运行 这个在我的架子里 ui脚本。我想调用 python 脚本以便它可以独立存在。

import maya.cmds as mc
import maya.mel as mel
import pymel.all as pma

BOOLEANMODE_ADD = 1
BOOLEANMODE_SUBTRACT = 2
PRIMITIVE_CUBE = 0
PRIMITIVE_CYLINDER = 1
PRIMITIVE_SPHERE = 2
PRIMITIVE_CUSTOM = 3


def cleanUp ():
    pma.delete (constructionHistory=True)
    #pma.select ()
    pma.delete ("*_ctrl*")

def hider(option):
    if (option == 0):
        pma.hide ()
    elif (option == 1):
        pma.select ("*_ctrl*")
        pma.hide ()
    elif (option == 2):
        pma.select ("*_ctrl*")
        pma.showHidden ()
        pma.select (clear=True)

def fixMaterial():
    pma.hyperShade( assign="lambert1" )

def triangulate():
    pma.polyTriangulate()

def creator(primitives):
    selection = pma.ls(sl=True)
    for x in selection:

        if primitives == PRIMITIVE_CUBE:
            a = makeCube() #Create cube
        if primitives == PRIMITIVE_CYLINDER:
            a = makeCyl() #Create cyl 
        if primitives == PRIMITIVE_SPHERE:
            a = makeSphere() #Create sphere 
        if primitives == PRIMITIVE_CUSTOM:
            a = selection[1]  
            x = selection[0]
            pma.select (a)
        b = createController(a)
        meshConstrainer (b,a)
        operator(x,a) 
        pma.select (b)    


def operator(meshA, meshB):
   booleanmode = get_boolean_mode()
   pma.polyBoolOp( meshA, meshB, op=booleanmode, n="basemesh" )
   pma.hyperShade( assign="lambert1" )   #REMINDER: Need to be replaced with the actual assigned material and not with a lambert1 so for who is working with other materials can easyly keep using that


def get_boolean_mode():
    if pma.radioButton(addRadioB, query = True, select = True) :
        return BOOLEANMODE_ADD
    if pma.radioButton(subRadioB, query = True, select = True) :
        return BOOLEANMODE_SUBTRACT
    return None

def makeCube():
    cubeTransform = pma.polyCube(n="cubetobool", w=1, h=1, d=1, sx=1, sy=1, sz=1)[0]   
    return cubeTransform       

def makeCyl():
    cylTransform = pma.polyCylinder(n="cubetobool", r=1, h=2, sx=20)[0]   
    return cylTransform   

def makeSphere():
    sphereTransform = pma.polySphere(n="cubetobool", r=1, sx=20, sy=20, cuv=2)[0]   
    return sphereTransform    


def meshConstrainer(constrainer, constrained):   
    pma.scaleConstraint( constrainer, constrained, maintainOffset=True)
    pma.parentConstraint( constrainer, constrained, maintainOffset=True)


def createController(object):
    #object = pma.ls(sl=True) 
    pivotObj = pma.xform(object,query=True,t=True,worldSpace=True)
    edges = pma.filterExpand(pma.polyListComponentConversion(te=1),sm=32,ex=1) # convert edges to curve ancd create one object
    for edge in edges:
        vtx = pma.ls(pma.polyListComponentConversion(edge,fe=1,tv=1),fl=1)
        p1 = pma.pointPosition(vtx[0])
        p2 = pma.pointPosition(vtx[1])
        curves = pma.curve(n="line_ctrl_curve", d=1,p=(p1,p2))

    ctrl = pma.curve (n="bool_ctrl", d=1,ws=True, p=pivotObj)
    pma.xform (centerPivots=True)
    for curveEdge in pma.ls ("line_ctrl*"):
        pma.parent(curveEdge,ctrl, s=1, r=1)
        pma.rename(curveEdge, "shapeunused")


    transforms =  pma.ls(type='transform')
    deleteList = []
    for tran in transforms:
        if pma.nodeType(tran) == 'transform':
            children = pma.listRelatives(tran, c=True) 
            if children is None:
                #print '%s, has no childred' %(tran)
                deleteList.append(tran)

    if not deleteList:           
       pma.delete(deleteList)       
    return ctrl




#################TUTORIAL
def super_bool_tut():
    windowNameTut = "Tutorial"
    if (pma.window(windowNameTut , exists=True)):
        pma.deleteUI(windowNameTut) 
    windowTutorial = pma.window(windowNameTut, title = windowNameTut, width = 400, height = 300, backgroundColor = [0.2, 0.2, 0.2])
    pma.columnLayout( "testColumn", adjustableColumn = True)
    pma.text("intro", label = "This tool is a super tool to make booleans wrote by Leonardo Iezzi. To make it works correctly, you need to have your base mesh already even if just a cube. With your base mesh selected just press one of the three buttons on the windows to subtract or add those primitives. If you want to use a custom mesh for the operation: select your base mesh then the custom one (it's important to pick your base mesh first) and then press the 'Use custom mesh' button. After you have done, select your base mesh and press 'Clean Up.'",wordWrap= True, height = 100, backgroundColor = [0.2, 0.2, 0.2], align='left', parent = "testColumn")

     #pma.text("first", label = "1- Select always your main mesh first",wordWrap= True, height = 40, backgroundColor = [0.2, 0.2, 0.2], align='left', parent = "testColumn")
     #pma.text("secondo", label = "2- In case you want to use a custom mesh: Select first your main mesh then the mesh you want to add or subtract",wordWrap= True, height = 40, backgroundColor = [0.2, 0.2, 0.2], align='left', parent = "testColumn")
     #pma.text("third", label = "3- Everythong should works",wordWrap= True, height = 40, backgroundColor = [0.2, 0.2, 0.2], align='left', parent = "testColumn")



    pma.separator(parent = "testColumn", height=20)
    pma.button("goit", label = "Got it", width = 120, height = 40, backgroundColor = [0.5, 0.5, 0.5], parent = "testColumn", command = "pma.deleteUI(windowNameTut)")

    pma.showWindow()

################################################################################################UI################################################# 
# @@@@@@@    THIS IS POLYSHIFTER!! I HAVE ADDED THIS AS A FUNCTION INSTEAD OF LEAVING IT UNINDENTED
def super_bool_ui():
    windowName = "SuperBool"
    windowSize = (120, 200)
    if (pma.window(windowName , exists=True)):
        pma.deleteUI(windowName)
    window = pma.window( windowName, title= windowName, width = 120, height = 200 )
    pma.columnLayout( "mainColumn", adjustableColumn = True)

    ################################################################################################UI#################################################
    pma.gridLayout("nameGridLayout01", numberOfRowsColumns = (1,4), cellWidthHeight = (40,40), parent = "mainColumn")
    pma.symbolButton("nameButton1", image = "polyCube.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout01", command = "creator(PRIMITIVE_CUBE)")
    pma.symbolButton("nameButton2", image = "polyCylinder.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout01", command = "creator(PRIMITIVE_CYLINDER)")
    pma.symbolButton("nameButton3", image = "polySphere.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout01", command = "creator(PRIMITIVE_SPHERE)")
    pma.columnLayout("columnLayoutName01", adjustableColumn = True, backgroundColor = [0.2, 0.2, 0.2])
    pma.radioCollection("collection10", parent = "columnLayoutName01")
    subRadioB = pma.radioButton("subRadio", select = True, label = "Sub")
    addRadioB = pma.radioButton("addRadio", label = "Add")
    pma.setParent( '..' )
    pma.setParent( '..' )
    ################################################################################################UI#################################################
    pma.separator(parent = "mainColumn", height=20)

    pma.button("customMeshB", label = "Use Custom Mesh", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "mainColumn", command = "creator(PRIMITIVE_CUSTOM)")

    pma.separator(parent = "mainColumn", height=20)
    ################################################################################################UI#################################################
    pma.gridLayout("nameGridLayout03", numberOfRowsColumns = (1,3), cellWidthHeight = (53,40), parent = "mainColumn")
    pma.button("hidSelB", label = "Hide Sel",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout03", command = "hider(0)")
    pma.button("hidAllB", label = "Hide All",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout03", command = "hider(1)")
    pma.button("showAll", label = "Show All",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout03", command = "hider(2)")

    pma.separator(parent = "mainColumn", height=20)

    pma.button("clean", label = "Clean Up", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "mainColumn", command = "cleanUp()")

    pma.separator(parent = "mainColumn", height=20)
    ################################################################################################UI#################################################
    ################################################################################################UI#################################################
    pma.gridLayout("nameGridLayout02", numberOfRowsColumns = (1,2), cellWidthHeight = (80,40), parent = "mainColumn")
    pma.button("triangB", label = "Triangulate", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout02", command = "triangulate()")
    pma.button("fixMatB", label = "FixMaterial", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = "nameGridLayout02", command = "fixMaterial()")
    ################################################################################################UI#################################################
    pma.showWindow()


###################################################################
##################                              ###################
##################    END OF SUPER BOOL TOOL    ###################
##################                              ###################
###################################################################
###################################################################
##################                              ###################
##################   BEGINNING OF MY UI SCRIPT  ###################
##################                              ###################
###################################################################

# Create a custom floating window with 
if mc.window('ToolsWindow', q=True, exists=True):
    mc.deleteUI('ToolsWindow')
if mc.workspaceControl('ToolsWorkspaceControl', q=True, exists=True):
    mc.deleteUI('ToolsWorkspaceControl')
mc.window('ToolsWindow')
mc.tabLayout('ToolsTabs')

#########################################################
##################    IMPORTING PANEL    ################
#########################################################
tabMenu = mc.columnLayout("Menu", adj=True)
separator_long = mc.separator(
                         height=10,
                         style='in')


mc.button(label="MyCustomScript", command = "my_custom_script_com()")

mc.setParent('..')
mc.showWindow()

#### My custom script ####
def my_custom_script_com(*args):
    super_bool_tool_ui()
    super_bool_tool_tut()

如果我理解正确,那么您可以通过移动您的函数来使用第二种方法。类似于:

def my_custom_script_com(*args):
    import maya.cmds as mc
    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    def please_print(): # define your function here
        print "OMG IT'S FINALLY WORKING!! YAY!!"

    mc.button(label="Please_print", command = "please_print()") # use the function

    mc.setParent('..')
    mc.showWindow()

这是因为必须先定义函数,然后才能调用它们。希望这有助于解决您的问题!我也从未使用过 maya,但我知道在 tkinter 中命令将是 tkinter.Button(label="Please_print", command=please_print),在 please_print 上没有引号。不确定这是否适用于此!

如果您希望将 please_print() 移动到全局 space,您可以将该部分缩减到它自己的函数中(而不是非常不典型的函数的子函数)。它看起来像:

# make a global function
def please_print():
    print "OMG IT'S FINALLY WORKING!! YAY!!"

def my_custom_script_com(*args):
    import maya.cmds as mc
    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    mc.button(label="Please_print", command = "please_print()") # use the function

    mc.setParent('..')
    mc.showWindow()

或者最好的(使用 tkinter 符号)可能是:

# make a global function
def please_print():
    print "OMG IT'S FINALLY WORKING!! YAY!!"

def my_custom_script_com(*args):
    import maya.cmds as mc
    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    mc.button(label="Please_print", command = please_print) # assign function without quotes or parenthesis

    mc.setParent('..')
    mc.showWindow()

这是玛雅常年存在的问题。问题是您使用的是命令的字符串名称:

command = "please_print()"

但是 'please_print' 在 run_my_custom_script_ui 里面,当函数运行时它超出了范围。当您单击按钮时,Maya 没有 'please_print' 函数调用。

如果你颠倒顺序并传递函数对象本身,不带引号,你应该没问题(通过添加 功能的按钮,你确保它不 超出范围并离开:

# this import does not need to be inside the function
import maya.cmds as mc

def run_my_custom_script_ui():

    # define this up here so it's in scope
    # when you want to call it below.  The *_
    # argument lets you ignore the default
    # argument which buttons always fire in Python

    def please_print(*_):
        print "OMG IT'S FINALLY WORKING!! YAY!!"

    if mc.window('my_script_ui', q=True, exists=True):
        mc.deleteUI('my_script_ui')
    else:
        mc.window('my_script_ui')

    mc.columnLayout("Menu", adj=True)

    mc.button(label="Please_print", command = please_print)

    mc.setParent('..')
    mc.showWindow()

更多信息:https://theodox.github.io/2014/maya_callbacks_cheat_sheet

我已经更正了你脚本中的很多地方,你试试看吧。 您的脚本中发生了太多事情,我将在下面放置几个链接:

我可能没有在其他主题上说过的一件事是,如果您只是将它用作 maya.cmds,请不要使用 pymel Pymel 真的很酷,但它真的很慢。

此外,如果您将脚本分成 'superbool.py',它应该可以工作:

import superbool
superbool.super_bool_ui()

最后尽量避免使用字符串来为命令或 ui 元素创建链接。尝试使用变量,dict,class !


import maya.cmds as mc
import pymel.all as pma
from functools import partial

BOOLEANMODE_ADD = 1
BOOLEANMODE_SUBTRACT = 2
PRIMITIVE_CUBE = 0
PRIMITIVE_CYLINDER = 1
PRIMITIVE_SPHERE = 2
PRIMITIVE_CUSTOM = 3


def cleanUp ():
    mc.delete(constructionHistory=True)
    mc.delete("*_ctrl*")

def hider(option, *args):
    if option == 0:
        mc.hide()
    elif option == 1:
        mc.select ("*_ctrl*")
        mc.hide()
    elif option == 2:
        mc.select ("*_ctrl*")
        mc.showHidden()
        mc.select (clear=True)

def fixMaterial():
    # pma.hyperShade( assign="lambert1" )
    # works better with the command sets, jut put the SG you need
    sel = mc.ls(sl = True)
    if not mc.objExists('grey20'):
        shaLambert = mc.shadingNode('lambert', asShader = True, name = 'grey20')
        shaLambertSG = mc.sets(name = 'grey20SG', empty = True, renderable = True, noSurfaceShader = True)
        mc.connectAttr('grey20.outColor', 'grey20SG.surfaceShader')
    mc.sets(sel, edit = True, fe = shaLambertSG)

def triangulate():
    mc.polyTriangulate()

def creator(primitives, *args):
    selection = mc.ls(sl=True)
    for x in selection:
        if primitives == PRIMITIVE_CUBE:
            a = makeCube() #Create cube
        if primitives == PRIMITIVE_CYLINDER:
            a = makeCyl() #Create cyl 
        if primitives == PRIMITIVE_SPHERE:
            a = makeSphere() #Create sphere 
        if primitives == PRIMITIVE_CUSTOM:
            a = selection[1]  
            x = selection[0]
            mc.select(a)
        b = createController(a)
        meshConstrainer (b,a)
        operator(x,a) 
        mc.select(b)

def operator(meshA, meshB):
   booleanmode = get_boolean_mode()
   # is there a way to replace this pymel ?
   pma.polyBoolOp( meshA, meshB, op=booleanmode, n="basemesh" )
   fixMaterial()  #REMINDER: Need to be replaced with the actual assigned material and not with a lambert1 so for who is working with other materials can easyly keep using that


def get_boolean_mode(addRadioB=None, subRadioB=None):
    # should not be implemented as string.....
    if mc.radioButton('addRadio', query = True, select = True) :
        return BOOLEANMODE_ADD
    if mc.radioButton('subRadio', query = True, select = True) :
        return BOOLEANMODE_SUBTRACT
    return None

def makeCube():
    cubeTransform = mc.polyCube(n="cubetobool", w=1, h=1, d=1, sx=1, sy=1, sz=1)[0]
    return cubeTransform       

def makeCyl():
    cylTransform = mc.polyCylinder(n="cubetobool", r=1, h=2, sx=20)[0]
    return cylTransform   

def makeSphere():
    sphereTransform = mc.polySphere(n="cubetobool", r=1, sx=20, sy=20, cuv=2)[0]
    return sphereTransform    


def meshConstrainer(constrainer, constrained):   
    mc.scaleConstraint( constrainer, constrained, maintainOffset=True)
    mc.parentConstraint( constrainer, constrained, maintainOffset=True)


def createController(object):
    #object = pma.ls(sl=True) 
    pivotObj = mc.xform(object,query=True,t=True,worldSpace=True)
    edges = mc.filterExpand(mc.polyListComponentConversion(te=1),sm=32,ex=1) # convert edges to curve ancd create one object
    for edge in edges:
        vtx = mc.ls(mc.polyListComponentConversion(edge,fe=1,tv=1),fl=1)
        p1 = mc.pointPosition(vtx[0])
        p2 = mc.pointPosition(vtx[1])
        curves = mc.curve(n="line_ctrl_curve", d=1,p=(p1,p2))

    ctrl = mc.curve (n="bool_ctrl", d=1,ws=True, p=pivotObj)
    mc.xform (centerPivots=True)
    for curveEdge in mc.ls ("line_ctrl*"):
        mc.parent(curveEdge,ctrl, s=1, r=1)
        mc.rename(curveEdge, "shapeunused")


    transforms =  mc.ls(type='transform')
    deleteList = []
    for tran in transforms:
        if mc.nodeType(tran) == 'transform':
            children = mc.listRelatives(tran, c=True)
            if children is None:
                #print '%s, has no childred' %(tran)
                deleteList.append(tran)

    if not deleteList:           
       mc.delete(deleteList)
    return ctrl


def deleteUI(name, *args):
    mc.deleteUI(name)


#################TUTORIAL
def super_bool_tut():
    windowNameTut = "Tutorial"
    if mc.window(windowNameTut , exists=True):
        mc.deleteUI(windowNameTut)
    windowTutorial = mc.window(windowNameTut, title = windowNameTut, width = 400, height = 300, backgroundColor = [0.2, 0.2, 0.2])
    mainSubLayout = mc.columnLayout( "testColumn", adjustableColumn = True)
    lb_txt = "This tool is a super tool to make booleans wrote by Leonardo Iezzi. To make it works correctly, you need to have your base mesh already even if just a cube. "
    lb_txt += "With your base mesh selected just press one of the three buttons on the windows to subtract or add those primitives. "
    lb_txt += "If you want to use a custom mesh for the operation: select your base mesh then the custom one "
    lb_txt += "(it's important to pick your base mesh first) and then press the 'Use custom mesh' button. After you have done, select your base mesh and press 'Clean Up.'"
    mc.text("intro", label = lb_txt ,wordWrap= True, height = 100, backgroundColor = [0.2, 0.2, 0.2], align='left', parent = mainSubLayout)

    mc.separator(parent = "testColumn", height=20)
    mc.button("goit", label = "Got it", width = 120, height = 40, backgroundColor = [0.5, 0.5, 0.5], parent = mainSubLayout, command = partial(deleteUI, windowNameTut))

    mc.showWindow()

################################################################################################UI################################################# 
# @@@@@@@    THIS IS POLYSHIFTER!! I HAVE ADDED THIS AS A FUNCTION INSTEAD OF LEAVING IT UNINDENTED
def super_bool_ui():
    windowName = "SuperBool"
    w, h = (120, 200)
    if mc.window(windowName , exists=True):
        mc.deleteUI(windowName)
    window = mc.window( windowName, title= windowName, width = w, height = h)
    mainLayout = mc.columnLayout( "mainColumn", adjustableColumn = True)

    ################################################################################################UI#################################################
    gridl_01 = mc.gridLayout("nameGridLayout01", numberOfRowsColumns = (1,4), cellWidthHeight = (40,40), parent = mainLayout)
    btn_symb = mc.symbolButton("nameButton1", image = "polyCube.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_01, command = partial(creator, PRIMITIVE_CUBE))
    mc.symbolButton("nameButton2", image = "polyCylinder.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_01, command = partial(creator, PRIMITIVE_CYLINDER))
    mc.symbolButton("nameButton3", image = "polySphere.png", width = 40, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_01, command = partial(creator, PRIMITIVE_SPHERE))
    vl_column01 = mc.columnLayout("columnLayoutName01", adjustableColumn = True, backgroundColor = [0.2, 0.2, 0.2], p=mainLayout)
    mc.radioCollection("collection10", parent = vl_column01)
    subRadioB = mc.radioButton("subRadio", select = True, label = "Sub")
    addRadioB = mc.radioButton("addRadio", label = "Add")
    ################################################################################################UI#################################################
    mc.separator(parent = mainLayout, height=20)

    mc.button("customMeshB", label = "Use Custom Mesh", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = mainLayout, command = partial(creator, PRIMITIVE_CUSTOM))

    mc.separator(parent = mainLayout, height=20)
    ################################################################################################UI#################################################
    gridl_02 = mc.gridLayout("nameGridLayout03", numberOfRowsColumns = (1,3), cellWidthHeight = (53,40), parent = mainLayout)
    mc.button("hidSelB", label = "Hide Sel",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_02, command = partial(hider, 0))
    mc.button("hidAllB", label = "Hide All",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_02, command = partial(hider, 1))
    mc.button("showAll", label = "Show All",  height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_02, command = partial(hider, 2))

    mc.separator(parent = mainLayout, height=20)

    mc.button("clean", label = "Clean Up", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = mainLayout, command = cleanUp)

    mc.separator(parent = mainLayout, height=20)
    ################################################################################################UI#################################################
    ################################################################################################UI#################################################
    gridl_03 = mc.gridLayout("nameGridLayout02", numberOfRowsColumns = (1,2), cellWidthHeight = (80,40), parent = mainLayout)
    mc.button("triangB", label = "Triangulate", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_03, command = triangulate)
    mc.button("fixMatB", label = "FixMaterial", width = 120, height = 40, backgroundColor = [0.2, 0.2, 0.2], parent = gridl_03, command = fixMaterial)
    ################################################################################################UI#################################################
    mc.showWindow()


###################################################################
##################                              ###################
##################    END OF SUPER BOOL TOOL    ###################
##################                              ###################
###################################################################
###################################################################
##################                              ###################
##################   BEGINNING OF MY UI SCRIPT  ###################
##################                              ###################
###################################################################

#### My custom script ####
def my_custom_script_com(*args):
    super_bool_ui()
    super_bool_tut()

# Create a custom floating window with 
if mc.window('ToolsWindow', q=True, exists=True):
    mc.deleteUI('ToolsWindow')
if mc.workspaceControl('ToolsWorkspaceControl', q=True, exists=True):
    mc.deleteUI('ToolsWorkspaceControl')
mc.window('ToolsWindow')
mainL = mc.columnLayout()
tabLayout = mc.tabLayout('ToolsTabs', p=mainL)

#########################################################
##################    IMPORTING PANEL    ################
#########################################################
tabMenu = mc.columnLayout("Menu", adj=True, p=tabLayout)
separator_long = mc.separator(
                         height=10,
                         style='in', p=tabMenu)

mc.button(label="MyCustomScript", command = my_custom_script_com, p=tabMenu)
mc.showWindow()