1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем Дмитрий damat Астапкович, 19 июл 2009.

Модераторы: Dark™, Skif
  1. 4i4ikov

    4i4ikov Знаток

    С нами с:
    07.04.2015
    Сообщения:
    267
    Симпатии:
    93
    Баллы:
    28
    Например так
    Код:
    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 нравится это.
  2. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    Код:
    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. Столкнулся с такой проблемой: если в сцене присутствует пустой слой, то выдается ошибка, что нет выделенных объектов, и скрипт прекращает работу. Подскажите, как сделать проверку есть ли в слое объекты, и если есть, то продолжить конвертацию, если нет, то перейти к следующему слою, и продолжить конвертацию?
     
  3. 4i4ikov

    4i4ikov Знаток

    С нами с:
    07.04.2015
    Сообщения:
    267
    Симпатии:
    93
    Баллы:
    28
    Проверять там где берутся обжэкты из слоя
    если пустой слой, то 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"} )')
    ...
     
    Последнее редактирование: 9 сен 2017
    2manoff нравится это.
  4. Бабуин

    Бабуин Мастер

    С нами с:
    17.10.2012
    Сообщения:
    2.800
    Симпатии:
    429
    Баллы:
    116
    Туманов а можно увидеть как выглядет сетка такого нюрбса?
     
  5. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    Спасибо большое
     
    Последнее редактирование: 9 сен 2017
  6. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    Как то так выглядит сетка, но все зависит от полигоналльной сетки LADA.jpg
     
  7. Бабуин

    Бабуин Мастер

    С нами с:
    17.10.2012
    Сообщения:
    2.800
    Симпатии:
    429
    Баллы:
    116
    Полностью повторяет полигоны! класс!
    можете дать законченную версию, пожалуйста
     
  8. Andots

    Andots Знаток

    С нами с:
    12.03.2009
    Сообщения:
    804
    Симпатии:
    161
    Баллы:
    48
    Накой оно тебе, там же по скрипту видно что происходит. Сначало полики конвертятся в сабдивы
    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
    Вся суть скрипта что делает все и сразу по всем объектам на сцене.
    Особого смысла такой конверт , кроме перегонки для использования в другой проге не несет, работать с нурбасами на плотной полигональной сетке в майке та еще задница.
    Разве что в автокад потом загонять или в что то подобное.
     
    Последнее редактирование: 10 сен 2017
  9. RoN43

    RoN43 Активный участник

    С нами с:
    29.11.2007
    Сообщения:
    113
    Симпатии:
    2
    Баллы:
    11
    4i4ikov
    Огромное СПАСИБО ВАМ!!!
     
  10. Бабуин

    Бабуин Мастер

    С нами с:
    17.10.2012
    Сообщения:
    2.800
    Симпатии:
    429
    Баллы:
    116
    а мне показалось, что сетка не как от сабдивов. Впечатлительный что то я очень =)
     
  11. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    я ж говорил, зависит от полигональной сетки
     
  12. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    я его писал под свои задачи
    Andots отметил, что можно ручками, но когда большое количество объектов ручками долго получается. Код что выше и есть финальный
     
  13. RoN43

    RoN43 Активный участник

    С нами с:
    29.11.2007
    Сообщения:
    113
    Симпатии:
    2
    Баллы:
    11
    4i4ikov
    а можно подредактировать скрипт, чтобы из режима еджей или поликов сразу входил в режим вертексов. Сейчас сначала выходит в режим объекта, а только после второго нажатия в режим вертексов.
     
  14. 4i4ikov

    4i4ikov Знаток

    С нами с:
    07.04.2015
    Сообщения:
    267
    Симпатии:
    93
    Баллы:
    28
    RoN43, ошибка с переключением осталась, то что я выше написал также будет работать с ошибкой, как выяснилось. Так что тут ничем не помогу и не помог.

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

    Максим Ярушин Пользователь сайта

    С нами с:
    14.01.2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    2
    Добрый вечер, ребята подскажите как решить задачу. Есть такой список к примеру
    a = ['file1' , 'name1', 'value1']
    как из него забрать все значения 'file' , в независимости от положения в списке и цифры в названии
     
  16. Александр Иванов

    Александр Иванов Активный участник

    С нами с:
    18.06.2013
    Сообщения:
    41
    Симпатии:
    5
    Баллы:
    7
    Привет! Тебе нужна функция filter. Вот тут можно почитать подробнее.
     
  17. 2manoff

    2manoff Активный участник

    С нами с:
    31.08.2008
    Сообщения:
    173
    Симпатии:
    8
    Баллы:
    13
    Всем привет! При выполнении скрита:
    Код:
    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. # 
    с чем может быть связана, данная ошибка?
     
  18. Daniil_D

    Daniil_D Пользователь сайта

    С нами с:
    27.09.2017
    Сообщения:
    10
    Симпатии:
    1
    Баллы:
    4
    Ищу скрипт который делает UV шелы, сделанные согласно хардам :)
     
  19. Lemieux

    Lemieux Знаток

    С нами с:
    08.06.2011
    Сообщения:
    1.147
    Симпатии:
    133
    Баллы:
    58
    Что значит данный изысканный код? - flatten?

    PS У меня, данный код, работает.
     
  20. Александр Иванов

    Александр Иванов Активный участник

    С нами с:
    18.06.2013
    Сообщения:
    41
    Симпатии:
    5
    Баллы:
    7
    Дык генератор списков же. Типа "сделай список из каждого x в cmds.ls(sl=True)".
    Опять же можно модифицировать, например так:
    polyObj=[x*2 + cmds.ls(sl=True)[0] for x in cmds.ls(sl=True)]​
     
Модераторы: Dark™, Skif

Поделиться этой страницей