Render.ru

Ускоряя Maya, послесловие. Скрипты для ускорения работы в Maya.

4i4ikov

Знаток
Рейтинг
37
import maya.cmds as cmds
cmds.selectMode(component=True)
cmds.selectMode(object=True)
import maya.cmds as mc
vertModeON = mc.selectType(q=1, pv=True)
if vertModeON:
mc.selectMode(object=True)
mc.selectType(alc=False)
else:
mc.selectMode(component=True)
mc.selectType(pv=True)


есть этот код от многоуважаемого Александра Чернега.
запускается не всегда с первого раза.
выделяешь объект - запускаешь, и вот иногда скабатывает только со 2 раза.
В чем может быть загвоздка?
СПС
Например так
Код:
import maya.cmds as mc
if mc.selectMode(q=1,object=True):
  mc.selectMode(object=False,component=True)
  mc.selectType(v=True,cv=True)
else:
  mc.selectMode(object=True,component=False)
объект <-> вершины, полигоны и нурбсы. Вообще тут уйма вариантов по-разному сделать.
Если не срабатывает, показывайте сцену.
 

2manoff

Активный участник
Рейтинг
14
Код:
import maya.cmds as cmds
import maya.mel as mel
import os
import re


def poly_to_nurbs():
    ws = os.path.normpath(cmds.workspace(act=True, q=True))
    path_1 = os.path.join(ws , 'scenes\edits')
    path_2 = os.path.join(ws , 'scenes')
    fn = cmds.file( q=True, shortName = True, sceneName= True)
    tmpName = re.split(r'[.]', '%s' % fn)[0]
   
   
    allLayers = [x for x in cmds.ls(type='displayLayer')if x not in ['defaultLayer','crease']]
    for l in range(len(allLayers)):
        pObj = cmds.editDisplayLayerMembers( allLayers[l], query=True )
        cmds.select(pObj)
        mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )')
        sbdObj =cmds.listRelatives([x for x in cmds.ls(type='subdiv')], p=True)
        nrbObj = []
        for i in range(len(sbdObj)):
            cmds.makeIdentity(sbdObj[i], apply=True, t=True, r=True, s=True)
            nrb = cmds.subdToNurbs(sbdObj[i], n = allLayers[l], ch=False)[0]
            nrbObj.append(nrb)

        cmds.editDisplayLayerMembers( allLayers[l], nrbObj )
        cmds.delete(sbdObj)
       
       
        shortName = tmpName + '_' + allLayers[l]
        fullName = os.path.join(path_1, shortName+'.iges')
        cmds.select(nrbObj)
        cmds.file(fullName,
                  options=";scaleFactor=1",
                  typ="IGESExport",
                  pr=True,
                  es=True)
Всем привет! Я написал скрипт, который конвертит полигональные объекты в нурбсовые, и экспортит нурбсы в igse. Столкнулся с такой проблемой: если в сцене присутствует пустой слой, то выдается ошибка, что нет выделенных объектов, и скрипт прекращает работу. Подскажите, как сделать проверку есть ли в слое объекты, и если есть, то продолжить конвертацию, если нет, то перейти к следующему слою, и продолжить конвертацию?
 

4i4ikov

Знаток
Рейтинг
37
Подскажите, как сделать проверку есть ли в слое объекты, и если есть, то продолжить конвертацию, если нет, то перейти к следующему слою, и продолжить конвертацию?
Проверять там где берутся обжэкты из слоя
если пустой слой, то pObj == None
...
pObj = cmds.editDisplayLayerMembers( allLayers[l], query=True )
if not pObj: continue
cmds.select(pObj)
mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )')
...

+
и фильтрацию полигонов лучше добавить
...
pObj = cmds.editDisplayLayerMembers( allLayers[l], query=True )
pObj = cmds.filterExpand(pObj, sm=12) # только поли
if not pObj: continue
cmds.select(pObj)
mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )')
...
 
Последнее редактирование:

2manoff

Активный участник
Рейтинг
14
Проверять там где берутся обжэкты из слоя
если пустой слой, то pObj == None
...
pObj = cmds.editDisplayLayerMembers( allLayers[l], query=True )
if not pObj: continue
cmds.select(pObj)
mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )')
...

+
и фильтрацию полигонов лучше добавить
...
pObj = cmds.editDisplayLayerMembers( allLayers[l], query=True )
pObj = cmds.filterExpand(pObj, sm=12) # только поли
if not pObj: continue
cmds.select(pObj)
mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )')
...
Спасибо большое
 
Последнее редактирование:

Andots

Знаток
Рейтинг
66
Полностью повторяет полигоны! класс!
можете дать законченную версию, пожалуйста
Накой оно тебе, там же по скрипту видно что происходит. Сначало полики конвертятся в сабдивы
mel.eval('doSubdivCreate( "2", { "1","1","20000","100"} )') там правда макс полей стоит 20к, можно увеличить если меш большой
Потом сабдивы конвертятся в нурбасы
cmds.subdToNurbs(sbdObj, n = allLayers[l], ch=False)[0]

Все это можно ручками сделать в меню Convert.
Modify -> Convert -> Polygons to Subdiv
Modify -> Convert -> Subdivs to NURBS
Вся суть скрипта что делает все и сразу по всем объектам на сцене.
Особого смысла такой конверт , кроме перегонки для использования в другой проге не несет, работать с нурбасами на плотной полигональной сетке в майке та еще задница.
Разве что в автокад потом загонять или в что то подобное.
 
Последнее редактирование:

2manoff

Активный участник
Рейтинг
14
Полностью повторяет полигоны! класс!
можете дать законченную версию, пожалуйста
я его писал под свои задачи
Andots отметил, что можно ручками, но когда большое количество объектов ручками долго получается. Код что выше и есть финальный
 

RoN43

Активный участник
Рейтинг
11
4i4ikov
а можно подредактировать скрипт, чтобы из режима еджей или поликов сразу входил в режим вертексов. Сейчас сначала выходит в режим объекта, а только после второго нажатия в режим вертексов.
 

4i4ikov

Знаток
Рейтинг
37
RoN43, ошибка с переключением осталась, то что я выше написал также будет работать с ошибкой, как выяснилось. Так что тут ничем не помогу и не помог.

Для тех захочет разобраться - ошибка возникает из-за того что mc.selectMode(q=1,object=True) читает режим только из статус лайна. Там может быть включен режим Объекта, а по контексному меню выбраны вершины. Для опроса режима того что реально включено во вьюпорте нужно искать другую команду.
 

Максим Ярушин

Пользователь сайта
Рейтинг
4
Добрый вечер, ребята подскажите как решить задачу. Есть такой список к примеру
a = ['file1' , 'name1', 'value1']
как из него забрать все значения 'file' , в независимости от положения в списке и цифры в названии
 

Александр Иванов

Активный участник
Рейтинг
7
Добрый вечер, ребята подскажите как решить задачу. Есть такой список к примеру
a = ['file1' , 'name1', 'value1']
как из него забрать все значения 'file' , в независимости от положения в списке и цифры в названии
Привет! Тебе нужна функция filter. Вот тут можно почитать подробнее.
 

2manoff

Активный участник
Рейтинг
14
Всем привет! При выполнении скрита:
Код:
polyObj=[x for x in cmds.ls(sl=True)]
polyObj=cmds.filterExpand(polyObj, sm=12)
sbdObj=[]
for obj in polyObj:
    sbd=cmds.polyToSubdiv(obj, mpc=20000, me=32)[0]
    if sbd:
        sbdObj.append(sbd)
    else:
        continue
cmds.delete(polyObj)
возникает ошибка:
Код:
# Error: RuntimeError: file <maya console> line 5: Command polyToSubdiv failed. Open Script Editor for details. #
с чем может быть связана, данная ошибка?
 

Александр Иванов

Активный участник
Рейтинг
7
Что значит данный изысканный код? - flatten?

PS У меня, данный код, работает.
Дык генератор списков же. Типа "сделай список из каждого x в cmds.ls(sl=True)".
Опять же можно модифицировать, например так:
polyObj=[x*2 + cmds.ls(sl=True)[0] for x in cmds.ls(sl=True)]​
 
Сверху