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

Editable_Poly – surfSubdivide

Тема в разделе "MAXScript", создана пользователем Александр Чернега, 11 сен 2010.

Модераторы: Savin Denis
  1. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Добрый день.

    Я не пользуюсь модификаторами турбо и меш смус. Предпочитаю функцию у Editable_Poly – surfSubdivide.
    Вот скрипт, которым я пользуюсь:
    (
    if classof $ == Editable_Poly
    then
    (
    macros.run "Editable Polygon Object" "EPoly_NURMS_Toggle"
    $.iterations = 2
    $.showCage = off
    $.isolineDisplay = off
    )
    )
    Он действует на один объект, и только в случае если тот Editable_Poly. Остальные игнорирует.

    Цель:
    Хочу сделать скрипт который при выделении большого количества разных объектов, включал и выключал у Editable_Poly сглаживание с настройками .iterations = 2 .showCage = off .isolineDisplay = off. В случае если у нескольких выделенных объектах включено а у остальных нет, при первом запуске скрипта у все удалял, а при повторном включал сглаживание.


    Процесс:
    Вот код который работает
    for o in $ where hasProperty o "surfSubdivide" do o.surfSubdivide = off или on

    Но:
    Во первых – для него нужно 2 кнопки (ON и OFF)
    Во вторых – он включает родные настройки объекта (1 уровень сглаживания и т.д.)

    Создал вот такой код:
    (
    for i in selection do
    (
    check_Subdiv = i.surfSubdivide
    if check_Subdiv == off
    then
    (
    $.surfSubdivide = on
    $.iterations = 2
    $.showCage = off
    $.isolineDisplay = off
    )
    else
    (
    $.surfSubdivide = off
    $.iterations = 2
    $.showCage = off
    $.isolineDisplay = off
    )
    )
    )
    Странно, но код работает исключительно с нечетным количеством объектов.
    Выделяешь 2 объекта Макс Лисинер отвечает – OK, но ничего не делает.
    При попадании в выделение объекта Mesh выдает - -- Unknown property: "surfSubdivide" in $Editable_Mesh:Box11

    Я изменил первую текстовую строчку - for i in selection where hasProperty i "surfSubdivide" do

    По идеи он:
    1 строка – определят объекты в которых есть функция surfSubdivide (то есть Editable_Poly )
    2 - Проверяет включена ли эта функция
    3 - если у всех объектов эта функция не включена, отправляет в else и выключает ее.
    При повторном запуске скрипта у всех объектов Editable_Poly включает сглаживание.
    Ура, Ура, Ура.

    Но на самом деле не черта не работает!!!
    Все так же срабатывает при выделение нечетного количества объектов.
    И выдает -- Unknown property: "surfSubdivide" in $Editable_Mesh:Box11 (если в выделении есть Mesh)

    Помогите пожалуйста.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуй так:
    objects_EP=#();objects_temp=#();
    for o in $selection where classof o==Editable_Poly do (append objects_EP o;
    if(o.surfSubdivide==false)then append objects_temp "false")
    for o in objects_EP do (o.isolineDisplay=false;o.showCage=false;o.iterations=2;
    if(objects_temp.count < objects_EP.count)then o.surfSubdivide=false;else o.surfSubdivide=true;)
     
  3. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Большущие спасибо!!!
    Я два дня промудохался просматривая уроки CG Academy MaxScript (2DVD) Прорабатывал совершенно безумные варианты и все бес толку. Я признаться почти ни чего не понимаю в этом коде, Но все работает как часы.
     
  4. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Что б не отрывать новую тему, тут же еще один вопрос.

    $.modifiers[#unwrap_uvw].setTVElementMode off или on

    Срабатывает когда в стеке объекта (неважно поли, мэшь) есть модификатор Unwrap UVW.
    Если нет, естественно выбивает ошибку. Как это можно ограничеть?

    Цель: Хочу на одну кнопу посадить 2 скрипта

    Грубый пример:
    If условия ограничения uvw = правда
    Then $.modifiers[#unwrap_uvw].setTVElementMode off или on – включается кнопка в edit UVWs
    Else другой скрипт сохраненный в отдельно файле (а внутри него действие происходит только если объект поли (ограничено через If classof $ == Editable_Poly).)
     

    Вложения:

    • 1928987.jpg
      1928987.jpg
      Размер файла:
      109,4 КБ
      Просмотров:
      78
  5. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    if($.modifiers[#unwrap_uvw]!=undefined)then ... else ...
     
  6. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Все, эта эпическая проблема тоже решена.
    Спасибо.
     
  7. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Добавил к условию ограничения «and (classof $ == PolyMeshObject)»,
    так как без этого скрипт безошибочно работал только при каком то выделенном объекте.

    Конечный скрипт выглядит так:

    (
    if (classof $ == PolyMeshObject) and ($.modifiers[#unwrap_uvw]!=undefined)
    then
    (

    $.modifiers[#unwrap_uvw].setTVElementMode off -- или on
    )

    else
    (
    macros.run "Editable Polygon Object" "EPoly_Detach" -- любой другой скрипт
    )
    )
     
  8. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Еще одна поправка.
    Оказывается при назначении модификатора unwrap_uvw примитиву он для макс скрипта становится Editable_mesh.

    Так что первая строчка условия должна быть:
    if (classof $ == PolyMeshObject) or (classof $ == Editable_mesh) and ($.modifiers[#unwrap_uvw]!=undefined)
     
  9. kolts

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

    С нами с:
    05.02.2008
    Сообщения:
    448
    Симпатии:
    0
    Баллы:
    17
    В том случае если действие требует соблюдения определенных условий можно использовать try( ....) catch()
     
  10. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Kolts если не сложно объясните хотя бы теоретически как можно воспользоваться try( ....) catch() в данном случае. У меня в Библии пользователя 2008 вообще про макс скрипт очень мало написано. Вот и леплю все через Иф, Тхен, Элс :)

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

    Вложения:

    • 1950922.jpg
      1950922.jpg
      Размер файла:
      79,4 КБ
      Просмотров:
      67
  11. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Из квада фукции пишешь сам Выделенным точкам назначаешь нужный тип функцией setKnotType
    Про остальные читай в главе SplineShape : Shape
     
  12. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    После долгих мучений и переборов разных функций, смог создать малополезный кусок кода полностью ручного управления:

    Код:
    setKnotType $ 1 3 (#corner)
    updateshape $
    В котором точка под номером 3 переводится в Корнер. Если сплайнов приатаченно несколько, переводится 3 точка в сплайне с индексом 1.

    Думаю, что для нормальной работы, должно быть что то вроде этого (в коде не срабатывает не одна строчка)

    Код:
    a = getSplineSelection ($) -- Определяет индекс сплайна
    b = getKnotSelection $ а -- Определяет выделенные точки на сплайне
    setKnotType $ a b (#corner) -- Выделенные точки становятся Корнер.
    updateshape $
    При использовании функции, getSplineSelection ($). Корректно определяет индекс только в режиме сплайна, если к примеру выделяешь вертексы на другом сплайне, его индекс не определяется. После определения индекса создается как я понимаю массив.

    Во время определения точек на сплайне b = getKnotSelection $ а, где по идеи А индекс сплайна, выдает ошибку -- Unable to convert: #(2) to type: Integer. Поэтому вручную указываем индекс, после чего создается массив с выделенными точками на сплайне и в третьей строчке офибки повторяются.

    Вот и заканчивается вся эта эпопея ручным вводом индекса сплайна и точки, которая будет переведена в Корнер :)


    Нашел код, который переводит все точки на всех приатаченных сплайнах в Корнер. Как ни старался его переделать, не вышло.

    Код:
            for s = 1 to (numSplines $) do
            (
                            for k = 1 to (numKnots $ s) do
                            (
                                    knt = getKnotPoint $ s k
                                    setKnotType $ s k (#corner)
                            )
            )
            updateshape $
    Может кто-то подскажет как его модернизировать, что б он срабатывал только на выделенных вертексах (возможно разных приатаченных сплайнов (с разными индексами))
     
  13. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Замени
    Код:
    for k = 1 to (numKnots $ s) do
    на
    Код:
    b = getKnotSelection $ s
    for k in b do 
    
     
  14. Anti Pirate

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

    С нами с:
    15.01.2011
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    5
    Я в скриптах вообще ничаго не понимаю, но круг познаний умножаю=)
    Вопрос следующий! А как вы назначили "Nurms" скрипт на кнопку мыши?!
    Запустить скрипт то я запустил, а как его назначить на кнопку мыши сообразить не могу.
    Буду рад любой подсказке=)!
     
  15. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Насколько я понимаю, речь идет о скрипте из сообщения №2.

    Во первых нужна мышь с дополнительными кнопками (у меня такая рис). А дальше все зависит от драйверов мыши. Я назначил на дополнительные клавиши мыши, кнопки [Num7], [Num8], [Num9] (это цифры в провой части клавиатуры), и [,]. А на них уже в максе поставил скрипты. Вот и получается что скрипт назначен на дополнительную кнопку мыши.
     

    Вложения:

    • 2173797.jpg
      2173797.jpg
      Размер файла:
      163,2 КБ
      Просмотров:
      91
  16. Anti Pirate

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

    С нами с:
    15.01.2011
    Сообщения:
    73
    Симпатии:
    0
    Баллы:
    5
    Хорошая мышка!=) А колличество кнопок, только позавидовать заставляет ;))
    Опробовал метод и всё заработало))) Теперь все кнопки использую на мышке....
    Низкий поклон и Большое СПА СИ БО!!! 5+ =)
     
Модераторы: Savin Denis

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