【发布时间】:2019-10-01 21:25:48
【问题描述】:
我正在创建一个自定义浮动窗口,我可以在其中拥有像架子一样的按钮,为我调用和运行脚本。对于像我这样不经常编写脚本的建模艺术家非常有用! :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 #
如果有太多不需要的代码或任何我试图将其尽可能精简的内容,我深表歉意。这是我的第一个问题!
任何有助于使这些变量正常工作的帮助都会令人惊叹!
非常感谢大家的帮助! Theodox 能够完美地解决这个问题!
但是....问题仍然存在于我的非简化脚本中!
我有这个艺术家莱昂纳多·莱齐 (Leonardo Lezzi) 的剧本。 "https://www.linkedin.com/pulse/super-bool-tool-python-leonardo-iezzi/" 当我使用他的脚本并尝试将其实施到我的脚本中时,它会导致错误。首先 pma 没有定义,然后他的定义都没有定义。
我尝试过制作他的 UI(教程一和主界面)并将它们定义为命令,但这对我来说也没有奏效。原因是因为(根据我今天学到的知识:D),在调用 Script_B(现在的布尔脚本)之后,maya 不再具有这些功能。
我发现唯一可行的方法是将布尔脚本放在我的主要脚本中,以便它与它一起使用。然后将他的 UI 定义为命令,然后在 ScriptA 中单击我的按钮列出这 2 个命令。然后运行它。但是然后返回并删除脚本中的定义并取消缩进,然后重新运行脚本。所以定义仍然是从以前运行定义的,但现在 ui 是在全局范围内创建的......显然,当你重新启动 Maya 时这会中断,我完全错过了如何定义它们的要点,同时仍然可以调用(是对吗?)当我点击按钮时。
这显然是一种黑客和愚蠢的做法,但我不明白如何让“超级布尔工具”从我的脚本中运行,只能通过采购 super_bool_tool.py
以下是我到目前为止的内容,但这里的想法再次是 不 在我的书架 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()
【问题讨论】:
-
除了
please_print未定义的错误,我还没有阅读所有内容,您可能只需将定义移到my_custom_script_com函数之外。只需取消最后两行的标签,看看是否有效!