【发布时间】:2017-07-16 23:50:35
【问题描述】:
总的来说,我对 python 和脚本/编码很陌生。
我目前正在编写一个小脚本,用于根据角度选择场景中对象的边缘。我有两个 intfields 供用户指定最小值和最大值。根据输入,我想要一个按钮来选择最小/最大范围内的所有边。
到目前为止一切正常,除了单击按钮时,不考虑最小/最大输入。 Maya 只选择默认值为 0 的所有边,
而不是选择最小/最大范围内的所有边缘,我不知道为什么。
据我所知,“selEdges”功能似乎是问题所在。 “ab=”标志通常采用两个整数值,如果我这样定义它:ab=(0, 30),它可以工作,但我不希望它被硬编码。我只是想不通如何将用户输入从两个内场传递给“selEdges”函数。
这是我的脚本:
import maya.cmds as cmds
if cmds.window('myWindow', exists=True):
cmds.deleteUI('myWindow')
cmds.window('myWindow', title='myWindow', wh=[200, 100])
cmds.rowColumnLayout(numberOfColumns=2)
minNormalAngle = cmds.intField(minValue=0, maxValue=360)
minNA = cmds.intField(minNormalAngle, query=True, value=True)
maxNormalAngle = cmds.intField(minValue=0, maxValue=360)
maxNA = cmds.intField(maxNormalAngle, query=True, value=True)
def selEdges(*pArgs):
cmds.polySelectConstraint(m=3, a=True, w=2, ab=(minNA, maxNA))
cmds.polySelectConstraint(m=0)
def sofEdges(*pArgs):
cmds.polySoftEdge(a=180)
cmds.button(label='select', command=selEdges)
cmds.button(label='soften', command=sofEdges)
cmds.showWindow()
这是一个屏幕截图,用于更好地理解 Maya 中的 UI。 !(http://abload.de/image.php?img=selscriptq9kcy.jpg)
编辑:
这就是我现在拥有的:
# Selection Script by David Sikorsky
#Alpha Version 0.5
# - NOT FEATURE COMPLETE
# - BUGS MAY OCCURE WHILE USING THIS SCRIPT
import maya.cmds as cmds
import functools
# Close window if it already exists
if cmds.window('myWindow', exists=True):
cmds.deleteUI('myWindow')
# Create a Window
myWindow = cmds.window('myWindow', title='Selection Script', resizeToFitChildren=True)
# Column 1: How To Text
cmds.columnLayout('columnLayoutName01', adjustableColumn=True)
cmds.frameLayout('layoutFrame01', label='How To Use:', collapsable=True, collapse=False, borderVisible=False)
cmds.separator(h=1, style='none')
cmds.text('howTo', font='boldLabelFont', label='How to use:', align="center")
cmds.separator()
cmds.text('desciption', font='boldLabelFont', align="center", label='''- Select an Object in your scene.
- Specify min/max Edge Angle.
- Select all Edges In Range.
- Soften or harden or Selected Edges.''')
cmds.separator(h=1, style='none')
cmds.setParent('..')
# Column 2: Soft/Hard Text
cmds.rowColumnLayout('columnLayoutName02', numberOfColumns=3, cw=[(1, 102),(2, 20), (3, 102)])
cmds.text(label='<-Soft->', align='center', font='boldLabelFont')
cmds.separator(h=1, style='none')
cmds.text(label='<-Hard->', align='center', font='boldLabelFont')
cmds.setParent('..')
# Column 2: min/max Text
cmds.rowColumnLayout('columnLayoutName03', numberOfColumns=7, cw=[(1, 51), (2, 51), (3, 20), (4, 51), (5, 51)])
cmds.text(label='Min', align='left')
cmds.text(label='Max', align='right')
cmds.separator(h=1, style='none')
cmds.text(label='Min', align='left')
cmds.text(label='Max', align='right')
cmds.setParent('..')
#Column 3: Infields
cmds.rowColumnLayout('columnLayoutName04', numberOfColumns=7, cw=[(1, 50), (2, 2), (3, 50), (4, 20), (5, 50), (6, 2), (7, 50)])
def selSoftIRFunc(*pArgs):
minSoftNA = cmds.intField(minSoftNormalAngle, query=True, value=True)
maxSoftNA = cmds.intField(maxSoftNormalAngle, query=True, value=True)
cmds.polySelectConstraint(m=3, t=0x8000, a=True, w=2, sm=0, ab=(minSoftNA, maxSoftNA))
cmds.polySelectConstraint(m=0, a=False)
minSoftNormalAngle = cmds.intField(minValue=0, maxValue=180, enterCommand=selSoftIRFunc)
cmds.separator(h=1, style='none')
maxSoftNormalAngle = cmds.intField(minValue=0, maxValue=180, enterCommand=selSoftIRFunc)
cmds.separator(h=1, style='none')
def selHardIRFunc(*pArgs):
minHardNA = cmds.intField(minHardNormalAngle, query=True, value=True)
maxHardNA = cmds.intField(maxHardNormalAngle, query=True, value=True)
cmds.polySelectConstraint(m=3, t=0x8000, a=True, w=2, sm=0, ab=(minHardNA, maxHardNA))
cmds.polySelectConstraint(m=0, a=False)
minHardNormalAngle = cmds.intField(minValue=0, maxValue=180, enterCommand=selHardIRFunc)
cmds.separator(h=1, style='none')
maxHardNormalAngle = cmds.intField(minValue=0, maxValue=180, enterCommand=selHardIRFunc)
cmds.setParent('..')
#column 4: Buttons Layout
cmds.rowColumnLayout('columnLayoutName05', numberOfColumns=3, cw=[(1,102),(2,20),(3,102)])
for i in range(3):
cmds.separator(h=5, style='none')
cmds.button(label='Select Edges', command=selSoftIRFunc)
cmds.separator(h=5, style='none')
cmds.button(label='Select Edges', command=selHardIRFunc)
for i in range(3):
cmds.separator(h=5, style='none')
def softEFunc(*pArgs):
cmds.polySoftEdge(a=180)
cmds.button(label='Soften Edges', command=softEFunc)
cmds.separator(h=5, style='none')
def hardenEFunc(*pArgs):
cmds.polySoftEdge(a=0)
cmds.button(label='Harden Edges', command=hardenEFunc)
for i in range(3):
cmds.separator(h=5, style='none')
def selSoftEFunc(*pArgs):
cmds.polySelectConstraint(m=3, t=0x8000, w=2, sm=2)
cmds.polySelectConstraint(m=0)
cmds.button(label='Select Soft Edges', command=selSoftEFunc)
cmds.separator(h=5, style='none')
def selHardEFunc(*pArgs):
cmds.polySelectConstraint(m=3, t=0x8000, w=2, sm=1)
cmds.polySelectConstraint(m=0)
cmds.button(label='Select Hard Edges', command=selHardEFunc)
for i in range(3):
cmds.separator(h=5, style='none')
def selInvertFunc(*pArgs):
cmds.InvertSelection('*', tgl=True)
cmds.button(label='Invert Selection', command=selInvertFunc)
cmds.separator(h=5, style='none')
cmds.setParent('myWindow')
# Close Button Layout
cmds.rowColumnLayout('columnLayoutName06', numberOfColumns=3, cw=[(1,102),(2,20),(3,102)])
def closeCallback(*pArgs):
if cmds.window('myWindow', exists=True):
cmds.deleteUI('myWindow')
for i in range(20):
cmds.separator(h=10, style='none')
cmds.button(label='Close', command=closeCallback)
cmds.showWindow('myWindow')
【问题讨论】:
-
感谢您的回复。你能再具体一点吗?据我了解,我将两个 intfield 的值存储在两个不同的变量 minNA 和 maxNA 中,因此,如果该值等于用户输入,它们怎么能总是相同的?
-
您将
cmds.intfield用于min和max。在Maya中是这样的吗?这两个 intfields 必须有所不同。 -
intfield 只是将初始化输入字段添加到 UI 的命令。所以两个内场=两个输入场。一个用于最小值,一个用于最大值。我用截图链接编辑了我的初始帖子。
-
好的。您不应该在
selEdges函数中阅读 minNA 和 maxNA 吗?在您的代码中,该函数使用您在创建控件之后读过一次的全局 minNA,因此它可能为 0。 -
你是对的,那行得通。我现在觉得很傻,非常感谢!
标签: python python-3.x scripting maya