用对象名称替换 textField 中的文本 - Pymel
Replace text in textField with object name - Pymel
我发现有类似的问题
此处:
textfield query and prefix replacing
和
此处:
Python - Change the textField after browsing - MAYA
但是,如果您有两个定义并且需要查询 textField
中的文本(实际上是更改 textField 中的文本),这些都不能解决问题。
根据经验,我知道在 MelScript 中执行下面的操作确实有效,但为了 Python,并学习如何在 Python 中执行,它似乎不起作用。我错过了什么吗?我是否需要 lambda 来获取所选对象的名称并查询文本字段?
我有一个例子(需要修复的部分):
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()
您需要在创建要查询的 textField
之后分配 command
标志。
所以你会这样做:
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
GUI 对象始终可以被编辑——包括更改它们的命令——只要你存储它们的名称。因此,您的 mainWindow() 可以 return 您想要再次编辑的 gui 控件的名称,第二个函数可以使用这些名称来更改所创建对象的外观或行为。
但是,如果您使用 python class 到 'remember' 对象的名称和任何其他状态信息,这一切都会容易得多:class 到 'see' 所有相关信息和状态。这是您转换为 classes 的原始文件:
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
我发现有类似的问题
此处: textfield query and prefix replacing
和
此处: Python - Change the textField after browsing - MAYA
但是,如果您有两个定义并且需要查询 textField
中的文本(实际上是更改 textField 中的文本),这些都不能解决问题。
根据经验,我知道在 MelScript 中执行下面的操作确实有效,但为了 Python,并学习如何在 Python 中执行,它似乎不起作用。我错过了什么吗?我是否需要 lambda 来获取所选对象的名称并查询文本字段?
我有一个例子(需要修复的部分):
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()
您需要在创建要查询的 textField
之后分配 command
标志。
所以你会这样做:
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
GUI 对象始终可以被编辑——包括更改它们的命令——只要你存储它们的名称。因此,您的 mainWindow() 可以 return 您想要再次编辑的 gui 控件的名称,第二个函数可以使用这些名称来更改所创建对象的外观或行为。
但是,如果您使用 python class 到 'remember' 对象的名称和任何其他状态信息,这一切都会容易得多:class 到 'see' 所有相关信息和状态。这是您转换为 classes 的原始文件:
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