2015-03-11 5 views
0

Я понял, что есть подобные вопросы, расположенныеЗаменить текст в текстовое поле с именем объекта - Pymel

здесь: textfield query and prefix replacing

и

здесь: Python - Change the textField after browsing - MAYA

Однако эти не обращайтесь к проблеме, если у вас есть два определения и нужен текст в textField для запроса (фактически ИЗМЕНИТЬ текст в текстовом поле).

Я знаю по опыту, что выполнение того, что у меня ниже в MelScript, действительно работает, но ради Python и обучения тому, как это сделать на Python, похоже, что это не работает. Я что-то упускаю? Нужна ли мне лямбда, чтобы получить имя выбранного объекта и запросить текстовое поле?

У меня есть пример (надрез-бит, что должно быть исправлено):

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() 

ответ

2

Объекты 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() шоу()

Что касается обратных вызовов: полезные ссылки here

+0

Wow это очень полезная информация. – SirJames

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)) 

Вы были вдоль правой мысли цепи, когда вы предложили лямбда. Обратный звонок Пимеля может быть более выгодным по сравнению с лямбдой здесь. Ознакомьтесь с документами: http://download.autodesk.com/global/docs/maya2014/zh_cn/PyMel/generated/classes/pymel.core.windows/pymel.core.windows.Callback.html

+0

Хм ... Я дам ему попробовать в момент и отвечать тем, что я получаю. Я продолжал получать NameError до того, как попытался исправить свое изменение текста, очевидно, потому что функция обратного вызова, которую я использовал, не была подходящей (я знаю достаточно, чтобы знать это, но недостаточно, чтобы исправить ее). Каково значение «окон» в «windows.Callback»? EDIT: [Закончена моя мысль] – SirJames

+0

Хорошо, я скажу, что это работает. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что она не обнаружит, что она выбрала объект. Я думаю, это лучше, чем не заставить его работать вообще ... Спасибо kartikg3 !! – SirJames

+0

Добро пожаловать! Примите ответ, если сочтете это полезным. – kartikg3

 Смежные вопросы

  • Нет связанных вопросов^_^