2016-06-24 2 views
1

Прошло некоторое время, когда я делал скрипты python после 8 месяцев перерыва. На самом деле нужны некоторые идеи. Я пытаюсь установить или изменить атрибут filmback/film gate камеры через кодирование, и после долгих проб и ошибок я наконец нашел для него команду, но теперь я встречаюсь с некоторыми другими проблемами.Python, добавляющий 2D-массив?

Первый элемент в списке, с точки зрения Python - индекс обычно начинается с 0, однако в Maya термин для этого filmbackMenu, она начинается с 1.

cmds.optionMenu('filmbackMenu', edit = True, select = 0) # Errors-out, stating that it is out of range 
cmds.optionMenu('filmbackMenu', edit = True, select = 1) # No errors 

Предположим, если мой filmback меню выглядит следующим образом:

list01 = ['itemA-01', 'itemB-02', 'itemC-02', 'itemD-01', 'itemE-01', 'itemF-03'] 
list01.insert(0,"") 
for index, item in enumerate(list01): 
    print index, item 

пока мне удается найти способ мои объекты начинаются с индекса «1», вставляя фиктивный/пустой. Поскольку я пытаюсь отфильтровать что-либо, содержащее «-01», и добавить как имя, так и индекс в список02, однако я знаю только, как это сделать для или просто имя или индекс, но я считаю, что мне нужны оба. Это мой раздел кода:

list02 = [] 
for i in list01: 
    if '-01' in str(i): 
     list02.append(i) 
# Result: ['itemA-01', 'itemD-01', 'itemE-01'] # The index here should be 1, 4, 5 

Можно ли одновременно добавить имя и индекс? Например, itemA-01 1, 'itemD-01' 4, 'itemE-01' 5? Индекс не обязательно должен отображаться в пользовательском интерфейсе, имя будет выполняться, но мне нужно будет получить значение индекса в конце концов ...

Пожалуйста, см. Ниже мой код, возможно, это может дать лучшее понимание и, пожалуйста, сделайте не стесняйтесь критиковать, если нужно.

import maya.cmds as cmds 

list01 = ['itemA-01', 'itemB-02', 'itemC-02', 'itemD-01', 'itemE-01', 'itemF-03'] 
list01.insert(0,"") 
for index, item in enumerate(list01): 
    print index, item 

list02 = [] 
for i in list01: 
    if '01' in str(i): 
     list02.append(i) 

window = cmds.window() 
cmds.columnLayout() 
cmds.optionMenu (label = 'Select a format') 
for x in list02: 
    cmds.menuItem(label=x) 
cmds.button(label = 'Ok') 
cmds.button(label = 'Cancel') 

cmds.showWindow(window) 

Что происходит с моим пользовательским интерфейсом, так это то, что при выборе пользователем, например. если я выбрал itemD-01, который является индексом 4, следующий код должен работать:

cmds.optionMenu('filmbackMenu', edit = True, select = 4) 

Обратите внимание, что флаг для выбора будет изменен ..

ответ

1

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

list02 = [] 

list01 = ['itemA-01', 'itemB-02', 'itemC-02', 'itemD-01', 'itemE-01', 'itemF-03'] 
for index, item in enumerate(list01, 1): 
    if '-01' in item: 
     list02.append([index, item]) 

print(list02) 

результат

[[1, 'itemA-01'], [4, 'itemD-01'], [5, 'itemE-01']] 

Вы даже можете превратить в в элегантный список понимания

result = [[index, item] for index, item in enumerate(list01, 1) if '-01' in item] 
+0

круто, не знал, что я могу перечислить его таким образом ... Интересно, есть ли у вас какие-либо идеи относительно того, как я могу вернуть значение в флагом 'command' в' cmds.button'? Когда я пробовал что-то вроде 'print item', он продолжает печатать последний элемент в списке02 .. – dissidia

+0

что-то вроде этого' cmds.optionMenu ('filmbackMenu', edit = True, select = list02 [0]) '? ... я не знаком с майей, или вы хотите вернуть значение, когда пользователь нажимает кнопку – danidee

+0

. Я делаю что-то простое, например 'cmds.button (label = 'Ok', command = ('print list02 [0]')) 'но на самом деле, я пытаюсь захватить/вернуть значение индекса на основе выбора. Пользовательский интерфейс будет функционировать - например. 'def ui()', в котором все выполнение будет занимать места в другой функции. – dissidia