Python o按照如下顺序执行此操作: 将当前选择转换为边 将polySelectConstraint应用于选择以将其向下筛选 重置polySelect约束,使其不会干扰将来的选择

Python o按照如下顺序执行此操作: 将当前选择转换为边 将polySelectConstraint应用于选择以将其向下筛选 重置polySelect约束,使其不会干扰将来的选择,python,python-3.x,scripting,maya,Python,Python 3.x,Scripting,Maya,编写该函数是一个好主意,这样它就不会更改选择,因为很容易意外地取消选择值不正确的内容。最低版本是这样的(注意它在最后是如何重置选择的) 您可以将edges\u by\u angle()功能与此分开,因为它可能在其他情况下有用。谢谢您的回复。你能再具体一点吗?据我所知,我将两个intfield的值存储在两个不同的变量minNA和maxNA中,因此,如果该值等于用户输入,它们怎么可能总是相同的呢?您正在使用cmds.intfield来表示min和max。玛雅人就是这样做的吗?这两个intfield必

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


您可以将
edges\u by\u angle()
功能与此分开,因为它可能在其他情况下有用。

谢谢您的回复。你能再具体一点吗?据我所知,我将两个intfield的值存储在两个不同的变量minNA和maxNA中,因此,如果该值等于用户输入,它们怎么可能总是相同的呢?您正在使用
cmds.intfield
来表示
min
max
。玛雅人就是这样做的吗?这两个intfield必须有所不同。intfield只是将initger输入字段添加到UI的命令。所以两个内场=两个输入场。一个用于最小值,一个用于最大值。我用截图的链接编辑了我的第一篇文章。您不应该在
selfedges
函数中读取minNA和maxNA吗?在您的代码中,函数使用了您在创建控件之后读取过一次的全局minNA,因此它可能是0。您是对的,这是有效的。我现在觉得很傻,非常感谢!谢谢你的回复。我通过在select函数中定义t=0x8000将模式设置为edges。这不是问题所在。通过从功能内部而不是外部阅读minNA和maxNA,解决了这个问题。它是有用的,但不是针对我的具体问题。不管怎么说,我的投票结果是,我的帖子不到15篇,所以它不会显示出来
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()
# 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')
cmds.polyListComponentConversion( te = 1 )
cmds.ls( sl = 1 )
ConvertSelectionToEdges;
string $sel[] = `ls -sl`;
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
def selection_window():

    # callbacks
    def select_by_angle(a, b):
        old_sel = cmds.ls(sl=True, o=True) or []
        new_sel = (edges_by_angle(old_sel, a, b))
        if new_sel:
            cmds.select(new_sel)

    def smooth_edges(*_):
        cmds.polySoftEdge(a=180)

    def harden_edges(*_):
        cmds.polySoftEdge(a=0)

    # gui....
    w = cmds.window(title='select by edges')
    c = cmds.columnLayout()
    ifg = cmds.intFieldGrp(label = 'angles', nf = 2, cc = select_by_angle)
    cmds.rowLayout(nc=2)
    cmds.button('Soften', c= smooth_edges)
    cmds.button('Harden', c= harden_edges)

    #show the window and return it if you need it's name later...
    cmds.showWindow(w)
    return w