0

我意识到有类似的问题

这里: 文本字段查询和前缀替换

这里: Python - 浏览后更改文本字段 - MAYA

textField但是,如果您有两个定义并且需要查询中的文本(实际上是更改 textField 中的文本),这些并不能解决问题。

我从经验中知道,在 MelScript 中执行以下操作实际上是可行的,但是为了 Python,并学习如何在 Python 中执行此操作,它似乎行不通。我错过了什么吗?我是否需要 lambda 来获取所选对象的名称并查询 textField?

我有一个例子(需要修复的部分):

from pymel.core import *
def mainWindow():
    window('myWin')
    columnLayout(adj=1)
    button('retopoplz', ann='Select a Mesh to Retopologize', bgc=[.15,.15,.15],
           l='START RETOPOLOGY', c='Retopo(TextToMakeLive)')
    TextToMakeLive = textField(ann='Mesh Selected', bgc=[.2,0,0],
                               edit=0, tx='NONE')
    setParent('..')
    showWindow('myWin')
def Retopo(TextToMakeLive):
    #This tool selects the object to retopologize
    MakeLiveField = textField(TextToMakeLive, q=1, tx=1)
    MakeSelectionLive = (ls(sl=1))
    if MakeSelectionLive is None:
        warning('Please select an object to retopologize')
    if MakeSelectionLive == 1:
        TextToMakeLive = textField(TextToMakeLive, ed=1, 
                                   tx=MakeSelectionLive,
                                   bgc=[0,.2,0])
        shape = ls(s=MakeSelectionLive[0])
        setAttr((shape + '.backfaceCulling'),3)
        createDisplayLayer(n='RetopoLayer', num=1, nr=1)
        makeLive(shape)
        print('Retopology Activated!')
    else:
        warning('Select only ONE Object')
mainWindow()
4

2 回答 2

2

只要您存储了 GUI 对象的名称,就可以随时编辑 GUI 对象——包括更改它们的命令。因此,您的 mainWindow() 可以返回您想要再次编辑的 gui 控件的名称,第二个函数可以使用这些名称来更改创建对象的外观或行为。

但是,如果您使用 python 类来“记住”对象的名称和任何其他状态信息,这一切都会容易得多:该类很容易“看到”所有相关信息和状态。这是您的原始转换为类:

from pymel.core import *
class RetopoWindow(object):

    def __init__(self):
        self.window = window('myWin')
        columnLayout(adj=1)
        button('retopoplz',ann='Select a Mesh to Retopologize', bgc=[.15,.15,.15],l='START RETOPOLOGY', c = self.do_retopo)
        self.TextToMakeLive=textField(ann='Mesh Selected', bgc=[.2,0,0],edit=0,tx='NONE')


    def show(self):
        showWindow(self.window)

    def do_retopo(self, *_):
        #This tool selects the object to retopologize
        MakeLiveField= textField(self.TextToMakeLive,q=1,tx=1)
        MakeSelectionLive=(ls(sl=1))
        if MakeSelectionLive is None:
            warning('Please select an object to retopologize')
        if len( MakeSelectionLive) == 1:
            TextToMakeLive=textField(self.TextToMakeLive,ed=1,tx=MakeSelectionLive,bgc=[0,.2,0])
            shape=ls(s=MakeSelectionLive[0])
            setAttr((shape+'.backfaceCulling'),3)
            createDisplayLayer(n='RetopoLayer',num=1,nr=1)
            makeLive(shape)
            print('Retopology Activated!')
        else:
            warning('Select only ONE Object')

RetopoWindow().show()

至于回调:有用的参考here

于 2015-03-11T17:53:00.437 回答
1

您需要在command创建textField 要查询的标志之后分配标志。

所以你会这样做:

my_button = button('retopoplz',ann='Select a Mesh to Retopologize', bgc=[.15,.15,.15],l='START RETOPOLOGY')

TextToMakeLive=textField(ann='Mesh Selected', bgc=[.2,0,0],edit=0,tx='NONE')

button(my_button, e=True,  c=windows.Callback(Retopo, TextToMakeLive))

当您建议 lambda 时,您的思路是正确的。Pymel 的回调在这里比 lambda 更有优势。查看文档:http: //download.autodesk.com/global/docs/maya2014/zh_cn/PyMel/generated/classes/pymel.core.windows/pymel.core.windows.Callback.html

于 2015-03-11T12:36:39.657 回答