Render.ru
Поддержать

Editable_Poly – surfSubdivide

Рейтинг
47
Добрый день.

Я не пользуюсь модификаторами турбо и меш смус. Предпочитаю функцию у 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)

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

igorznag

Мастер
Рейтинг
103
Попробуй так:
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😉
Рейтинг
47
Большущие спасибо!!!
Я два дня промудохался просматривая уроки CG Academy MaxScript (2DVD) Прорабатывал совершенно безумные варианты и все бес толку. Я признаться почти ни чего не понимаю в этом коде, Но все работает как часы.
Рейтинг
47
Что б не отрывать новую тему, тут же еще один вопрос.

$.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).)

Вложения

igorznag

Мастер
Рейтинг
103
Если нет, естественно выбивает ошибку. Как это можно ограничеть?
if($.modifiers[#unwrap_uvw]!=undefined)then ... else ...
Рейтинг
47
Добавил к условию ограничения «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" -- любой другой скрипт
)
)
Рейтинг
47
Еще одна поправка.
Оказывается при назначении модификатора unwrap_uvw примитиву он для макс скрипта становится Editable_mesh.

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

kolts

Активный участник
Рейтинг
16
В том случае если действие требует соблюдения определенных условий можно использовать try( ....) catch()
Рейтинг
47
Kolts если не сложно объясните хотя бы теоретически как можно воспользоваться try( ....) catch() в данном случае. У меня в Библии пользователя 2008 вообще про макс скрипт очень мало написано. Вот и леплю все через Иф, Тхен, Элс 🙂

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

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
Из квада фукции пишешь сам Выделенным точкам назначаешь нужный тип функцией setKnotType
Про остальные читай в главе SplineShape : Shape
Рейтинг
47
После долгих мучений и переборов разных функций, смог создать малополезный кусок кода полностью ручного управления:

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 $
Может кто-то подскажет как его модернизировать, что б он срабатывал только на выделенных вертексах (возможно разных приатаченных сплайнов (с разными индексами))

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
Замени
for k = 1 to (numKnots $ s) do
на
b = getKnotSelection $ s
for k in b do

Anti Pirate

Активный участник
Рейтинг
5
Я в скриптах вообще ничаго не понимаю, но круг познаний умножаю=)
Вопрос следующий! А как вы назначили "Nurms" скрипт на кнопку мыши?!
Запустить скрипт то я запустил, а как его назначить на кнопку мыши сообразить не могу.
Буду рад любой подсказке=)!
Рейтинг
47
Насколько я понимаю, речь идет о скрипте из сообщения №2.

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

Вложения

Anti Pirate

Активный участник
Рейтинг
5
Хорошая мышка!=) А колличество кнопок, только позавидовать заставляет 😉)
Опробовал метод и всё заработало))) Теперь все кнопки использую на мышке....
Низкий поклон и Большое СПА СИ БО!!! 5+ =)