Render.ru

Editable_Poly – surfSubdivide

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

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

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

Вложения

Рейтинг
47
#7
Добавил к условию ограничения «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
#8
Еще одна поправка.
Оказывается при назначении модификатора unwrap_uvw примитиву он для макс скрипта становится Editable_mesh.

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

kolts

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

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

Вложения

Savin Denis

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

Код:
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
#13
Замени
Код:
for k = 1 to (numKnots $ s) do
на
Код:
b = getKnotSelection $ s
for k in b do
 

Anti Pirate

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

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

Вложения

Anti Pirate

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