Форум CG художников

Ваши вопросы => Autodesk Maya => Тема начата: zzz7net от 11 Января 2015 в 21:16

Название: Python поля данных
Отправлено: zzz7net от 11 Января 2015 в 21:16
Не могу понять, как в Python использовать поля данных. Уж больно специфично в нем реализована работа с областями видимости.

Допустим мне нужно где-то хранить промежуточные значения, между вызовами функций. Насколько я понимаю для этого мне нужно
создать переменные, которые будут видны из любой функции внутри моего скрипта. Но данный код не работает:

Код: (python) [Выделить]
import maya.cmds as cmds

# variables to store transforms
bpiv_loc_rotations
apiv_loc_rotations
hpiv_loc_rotations

def UI():

# check to see if our window exists
if cmds.window("matchUI", exists = True):
cmds.deleteUI("matchUI")

# create our window
window = cmds.window("matchUI", title = "Space Match", w = 256, h = 300, mnb = False, mxb = False, sizeable = False)
   
# create a main layout
mainLayout = cmds.columnLayout(w = 256, h = 300)   

# create the buttons
cmds.separator(h = 15)
cmds.button(label = "Get transforms",  w = 256, h = 50, command = getTransforms)
cmds.button(label = "Match", w = 256, h = 50, command = printCommand)

# show window
cmds.showWindow(window)

def getTransforms(*args):
bpiv_loc_rotations = cmds.xform('balloonsPiv_loc', ws = True, q = True, ro = True)
apiv_loc_rotations = cmds.xform('anchorPiv_loc', ws = True, q = True, ro = True)
hpiv_loc_rotations = cmds.xform('hutPiv_loc', ws = True, q = True, ro = True)

def printCommand(*args):
print bpiv_loc_rotations
print apiv_loc_rotations
print hpiv_loc_rotations

В каком месте сценария нужно определять переменные:

bpiv_loc_rotations
apiv_loc_rotations
hpiv_loc_rotations

Чтобы с ними можно было работать из любой части кода?
Название: Re: Python поля данных
Отправлено: VARVAR от 11 Января 2015 в 21:38
Присвой в самом начале переменным значение None
типа :
bpiv_loc_rotations=None
apiv_loc_rotations=None
hpiv_loc_rotations=None

В Python переменным нужно присвоить что-то в самом начале, так как переменные это есть ссылки на некие объекты ( числа, строки, etc)

Название: Re: Python поля данных
Отправлено: zzz7net от 11 Января 2015 в 22:15
Присвоил  :)
Результат работы кода, кнопка Match, после нажатия которой вызывается функция printCommand:
None
None
None

В Python так не получится. Я и говорю, что это странный язык, который позволяет разным переменным
одновременно иметь одинаковые имена.

С одной стороны они глобальные, но если им будет присваиваться значение, то внутри функций этих переменных будет не видно.
Они будут видны только для чтения. В случае присваивания, вместо них будут созданы локальные переменные с теми же именами, что и у глобальных!
Очевидно, что после выхода из области видимости функции локальные переменные будут уничтожены.

Что делает невозможным работу с полями данных. Чтобы этого не происходило, мне нужно будет присвоить начальные значения переменным в первых строках кода. Затем назвать их по именам с флагом global уже внутри функции. И снова присвоить значения. Это выглядит крайне топорно и уж точно не делает код более лаконичным и понятным.

Цитировать
Несмотря на то, что Python обладает достаточно самобытным синтаксисом, одним из принципов дизайна этого языка является принцип наименьшего удивления

Ну не знаю, не знаю. Я лично с такого дизайна не то, чтобы сильно удивился (я просто о`куел)  :o
В общем необходимо более изящное решение, которое я очень надеюсь Гвидо предусмотрел, когда создавал свой шедевр.

Название: Re: Python поля данных
Отправлено: VARVAR от 11 Января 2015 в 22:59
ну вообще такое лучше всего организовать через классы...
с другой стороны не понятно зачем тебе сначала сохранять данные  переменные, а потом отдельно их принтить, нельзя сразу их принтить?
Название: Re: Python поля данных
Отправлено: zzz7net от 12 Января 2015 в 02:34
Принт пока как муляж, в целях тестирования. И да, принтить сразу нельзя, так как их значения с момента запуска сцены и до нажатия на кнопу 'Get transformations'
могут десять раз поменяться.

В этом как раз вся сложность. Если бы значения не нужно было использовать многократно, то и глобальные
переменные не понадобились бы.
Название: Re: Python поля данных
Отправлено: zzz7net от 12 Января 2015 в 05:34
Исправленный рабочий код:
Скрытый текст (показать/скрыть)

С другой стороны, использование классов также полностью решает проблему,
даже размер кода почти не увеличился - всего на 3 строки длинее:

import maya.cmds as cmds

class TransformsData:

def __init__(self):

self.rotations = [None, None, None]

bpiv_loc = TransformsData()
apiv_loc = TransformsData()
hpiv_loc = TransformsData()

def UI():

# check to see if our window exists
if cmds.window("matchUI", exists = True):
cmds.deleteUI("matchUI")

# create our window
window = cmds.window("matchUI", title = "Space Match", w = 256, h = 300, mnb = False, mxb = False, sizeable = False)
   
# create a main layout
mainLayout = cmds.columnLayout(w = 256, h = 300)   

# create the buttons
cmds.separator(h = 15)
cmds.button(label = "Get transforms",  w = 256, h = 50, command = getTransforms)
cmds.button(label = "Match", w = 256, h = 50, command = printCommand)

# show window
cmds.showWindow(window)

def getTransforms(*args):
bpiv_loc.rotations = cmds.xform('balloonsPiv_loc', ws = True, q = True, ro = True)
apiv_loc.rotations = cmds.xform('anchorPiv_loc', ws = True, q = True, ro = True)
hpiv_loc.rotations = cmds.xform('hutPiv_loc', ws = True, q = True, ro = True)

def printCommand(*args):
print bpiv_loc.rotations
print apiv_loc.rotations
print hpiv_loc.rotations
Название: Re: Python поля данных
Отправлено: VARVAR от 12 Января 2015 в 09:55
и все таки хотелось бы узнать что это в итоге будет...
так как не понимаю зачем тебе лишнее промежуточное сохранение
Название: Re: Python поля данных
Отправлено: zzz7net от 12 Января 2015 в 12:20
и все таки хотелось бы узнать что это в итоге будет...

 Space Matching  (https://cgforum.ru/go.php?url=aHR0cDovL3dpbGxpZXdvcmsuYmxvZ3Nwb3QucnUvMjAxMi8wOC9zcGFjZS1zd2l0Y2hpbmctYW5kLXNwYWNlLW1hdGNoaW5nLmh0bWw=) для рига
Название: Re: Python поля данных
Отправлено: Land от 07 Апреля 2015 в 18:05
ну вообще такое лучше всего организовать через классы...
с другой стороны не понятно зачем тебе сначала сохранять данные  переменные, а потом отдельно их принтить, нельзя сразу их принтить?

а шо в пайтоне есть классы? он типа объектно ориентированный получается?
Название: Re: Python поля данных
Отправлено: VARVAR от 07 Апреля 2015 в 18:08
а шо в пайтоне есть классы? он типа объектно ориентированный получается?

https://ru.wikipedia.org/wiki/Python     ;)
Название: Re: Python поля данных
Отправлено: Land от 07 Апреля 2015 в 18:53
а шо в пайтоне есть классы? он типа объектно ориентированный получается?

https://ru.wikipedia.org/wiki/Python     ;)
Ну я имел ввиду в майе можно использовать все его возможности?
Название: Re: Python поля данных
Отправлено: VARVAR от 07 Апреля 2015 в 19:01
да в майке не сам питон - но Pyside
TinyPortal 1.6.6 © 2005-2020