Maya Python 3x基于法线角度选择边

2024-09-29 05:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对python和脚本/编码还很陌生。在

我目前正在编写一个小脚本,用于根据对象的角度选择场景中对象的边。我有两个int字段供用户指定最小值和最大值。根据输入,我需要一个按钮来选择最小/最大范围内的所有边。
到目前为止,一切都正常,除了单击按钮时,不考虑最小/最大输入。Maya仅选择默认值为0的所有边, 而不是选择最小/最大范围内的所有边,我不知道为什么。在

据我所知,“selfedges”函数似乎是个问题。 “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

编辑:

这就是我现在所拥有的:

^{pr2}$

Tags: 对象函数用户脚本true编码abwindow
2条回答

通常情况下,您希望使用如下序列来执行此操作:

  1. 将当前选择转化为边
  2. 将polySelectConstraint应用于选择以筛选它
  3. 重置“polySelect”约束,使其不会影响将来的选择

编写这个函数是个好主意,这样它就不会改变选择,因为很容易意外地取消选择值不好的对象。最低版本应该是这样的(注意它如何在最后重置选择)

def edges_by_angle(selection, min_angle, max_angle):
    '''return the edges in selection with a crossing angle between <min_angle> and <max_angle>'''
    result = []
    try:
        edges = cmds.polyListComponentConversion(selection, te=True)
        cmds.select(edges)
        cmds.polySelectConstraint(mode =3, type = 0x8000, a = 1, ab = (min_angle,max_angle))
        result = cmds.ls(sl=True) or []
    finally:
        cmds.polySelectConstraint(dis=True)
        cmds.select(selection)    
    return result

您可以通过使用intFieldGrp而不是两个intFields来简化GUI。养成在函数中构建gui的习惯是个好主意,上面所写的代码可以在监听器中工作,但是如果从模块文件导入,它的行为会很奇怪。将东西放入函数中是一种控制变量范围的廉价方法,因此不难找出需要的回调函数在哪里。下面是一个非常简单的例子:

^{pr2}$

您可以将edges_by_angle()函数与此分开,因为它在其他情况下可能很有用。在

标志awab仅在顶点、边、面和纹理模式下可用。您需要在边缘模式下使用polySelectConstraint()。在

下面是您应该添加到脚本中的Python代码版本:

cmds.polyListComponentConversion( te = 1 )
cmds.ls( sl = 1 )

另请参见MEL等效物:

^{pr2}$

相关问题 更多 >