Render.ru

вопросы по MEL

Lemieux

Знаток
Рейтинг
58
Как узнать какие материалы назначены на выделенный объект?
Нашёл решение
Код:
string $lmxListAssignMaterials[];
$lmxObjectShape = `listRelatives -shapes`;
$lmxListSG = `listConnections -source 0 -destination 1 -type "shadingEngine" $lmxObjectShape`;
$lmxSizeListSG = `size($lmxListSG)`;
for ($i=0; $i<$lmxSizeListSG; $i++) {
    $lmxConnectToSG = `listConnections ($lmxListSG[$i]+".surfaceShader")                           ($lmxListSG[$i]+".miMaterialShader")`;
    $lmxListAssignMaterials[$i] = $lmxConnectToSG[0];
}
print($lmxListAssignMaterials)
И для питона
Код:
import maya.cmds as mc

lmxObjectShape = mc.listRelatives(shapes=True)
lmxListSG = mc.listConnections(lmxObjectShape, source=False, destination=True, type='shadingEngine')
lmxSizeListSG = len(lmxListSG)

lmxListAssignMaterials=[]
for i in range(lmxSizeListSG):
    lmxConnectToSG = mc.listConnections((lmxListSG[i]+".surfaceShader"), (lmxListSG[i]+".miMaterialShader"))
    lmxListAssignMaterials.insert(i,lmxConnectToSG)
print(lmxListAssignMaterials)
Может у кого-нибудь есть изящнее решение?
 
Последнее редактирование:

4i4ikov

Знаток
Рейтинг
37
Нашёл решение
Код:
string $lmxListAssignMaterials[];
$lmxObjectShape = `listRelatives -shapes`;
$lmxListSG = `listConnections -source 0 -destination 1 -type "shadingEngine" $lmxObjectShape`;
$lmxSizeListSG = `size($lmxListSG)`;
for ($i=0; $i<$lmxSizeListSG; $i++) {
    $lmxConnectToSG = `listConnections ($lmxListSG[$i]+".surfaceShader")                           ($lmxListSG[$i]+".miMaterialShader")`;
    $lmxListAssignMaterials[$i] = $lmxConnectToSG[0];
}
print($lmxListAssignMaterials)
Может у кого-нибудь есть изящнее решение?
Ну немножко поменьше есть строчек)))

hyperShade -smn "";
ls -sl;
 

Lemieux

Знаток
Рейтинг
58
Как с помощью списков можно переносить атрибуты?
Например - есть 2 разные ноды, делают одно и то же, но некоторые атрибуты у них различаются. Сначала составляет списки атрибутов, потом через цикл копируем. Примерный код
Код:
$lmxListAttrGet = {"color", "transparency", "diffuse"};
$lmxListAttrSet = {"color", "transparency", "diffuse"};

for ($i=0; $i<3; $i++) {
    $lmxGettingAttr = `getAttr ("lambert2."+$lmxListAttrGet[i])`;
    setAttr ("lambert3."+$lmxListAttrSet[i]) $lmxGettingAttr;
}
Похожие ноды взяты для простоты. При выполнении пишет - "Error: line 6: setAttr: Error reading data element number 1:" Тут всё понятно, вот как обойти это?
В питоне с color и transparency прокатывает использовать на массиве "*", но этот приём не прокатывает с diffuse.
 

Lemieux

Знаток
Рейтинг
58
Как с помощью списков можно переносить атрибуты?
Например - есть 2 разные ноды, делают одно и то же, но некоторые атрибуты у них различаются. Сначала составляет списки атрибутов, потом через цикл копируем. Примерный код
Код:
$lmxListAttrGet = {"color", "transparency", "diffuse"};
$lmxListAttrSet = {"color", "transparency", "diffuse"};

for ($i=0; $i<3; $i++) {
    $lmxGettingAttr = `getAttr ("lambert2."+$lmxListAttrGet[i])`;
    setAttr ("lambert3."+$lmxListAttrSet[i]) $lmxGettingAttr;
}
Похожие ноды взяты для простоты. При выполнении пишет - "Error: line 6: setAttr: Error reading data element number 1:" Тут всё понятно, вот как обойти это?
В питоне с color и transparency прокатывает использовать на массиве "*", но этот приём не прокатывает с diffuse.
В питоне решил вот так
Код:
import pymel.core as pm

lmxListAttrGet = ['color', 'transparency', 'diffuse']
lmxListAttrSet = ['color', 'transparency', 'diffuse']

for i in range(3):
    pm.setAttr(('lambert3.'+lmxListAttrSet[i]), pm.getAttr('lambert2.'+lmxListAttrGet[i]))
PS Это способ не подойдёт для mel и для maya.cmds
 
Последнее редактирование:

Andots

Знаток
Рейтинг
66
Всем привет. Кто нибудь в курсе каким образом в майке на питоне или меле перехватить нажатие шифта? Сложность в том что на него в хоткей редакторе нельзя повесить команду или скрипт. Иначе все было бы просто.
 

ПетрКр

Пользователь сайта
Рейтинг
2
Привет. У меня очень земной вопрос
я хочу сделать кнопку-переключалку параметра Opaque в Арнольд-свойствах шейпового нода (по умолчанию всегда выкл.)

Команда такая
Код:
setAttr ".aiOpaque" 0;
я хочу ее засунуть в if-else конструкцию, чтобы туда-сюда переключала, но знаний не хватает

Я мутил вот такое, но она ругается

Код:
int $val = getAttr ".aiOpaque";
if (".aiOpaque" == 1)
{
setAttr ".aiOpaque" 0;
print "Opaque off"; 
}
else
{
setAttr ".aiOpaque" 1;
print "Opaque on"; 
}

поможете?
 
Рейтинг
22
Чтобы обратится к атрибуту нужен полный путь к этому атрибуту, в простом случае такой - имя ноды.имя атрибута. Как в вашем примере maya узнает у какого объекта вы запрашиваете атрибут? Когда присваиваете значение переменной через исполнение команды, то команду нужно заключать в обратные кавычки (ё), например - имя переменной = `команда`; Если вы инициируете переменную то в дальнейшем используйте её в своем коде, иначе для чего она нужна? Посмотрите справочную документацию по командам и синтаксису MEL в хелпе maya, там есть примеры.
 

ПетрКр

Пользователь сайта
Рейтинг
2
меня воодушевило, что команда
Код:
setAttr ".aiOpaque" 0;
работает с текущим выделенным объектом без указания конкретного нода.
Если кто-то может помочь с переключалкой, буду признателен
 

Cyberika

Знаток
Рейтинг
21
Не знаю как в MEL, не помню, но в PyMel это будет выглядеть так:
Код:
from pymel.core import*

selectedObject = selected()

shapes = selectedObject[0].getShapes()

for s in shapes:
    if nodeType(s) == 'mesh' or nodeType(s) == 'nurbsCurve' or nodeType(s) == 'nurbsSurface':
        if PyNode(s).aiOpaque.get() == True:
            s.aiOpaque.set(0)
        else:
            s.aiOpaque.set(1)
Нужно выделить обьект и запустить скрипт.
Работает с мешами, кривыми и нурбсами.
 

Cyberika

Знаток
Рейтинг
21
Надо историю подчистить. Если нет то тогда вот так:

Код:
from pymel.core import*

selectedObject = selected(transforms=True)

shapes = selectedObject[0].getShapes()

for s in shapes:
    if nodeType(s) == 'mesh' or nodeType(s) == 'nurbsCurve' or nodeType(s) == 'nurbsSurface':
        if PyNode(s).aiOpaque.get() == True:
            s.aiOpaque.set(0)
        else:
            s.aiOpaque.set(1)
 

4i4ikov

Знаток
Рейтинг
37
Короткая переключалка, она же toggle, как шаблон для любых атрибутов типа on/off, но для одного объекта
Код:
setAttr ".v" (!`getAttr ".v"`)
просто красиво)
 
Сверху