Render.ru

Назначение свойств объектов (по слою), сразу нескольким слоям.

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

У меня есть скрипт – отображения объектов (по слою), из #viewport в #boundingbox.
За основу взят скрипт Coopera и изрядно доработан:

Код:
(
	if selection.count > 0 do (macros.run "Layers" "LayerSet"
	$.displayByLayer = on)
	layermanager.current.boxmode = false
	( case of
	(
	( layermanager.current.display != #boundingbox): (layermanager.current.display = #boundingbox)
	( layermanager.current.display == #boundingbox): (layermanager.current.display = #viewport)
	)
	)
	completeredraw()
)
Данный скрипт работает с одним активным слоем (из за LayerSet в его коде).

Вопрос: Можно ли организовать таким образом, что б при выделении нескольких объектов, #boundingbox-ом становились слои на которых они лежат . То есть, сразу несколько слоев, с одного нажатия кнопки. И так же назад.

Ps. Наличие ответа, позволит модернизировать скрикты отображения #viewport, #shaded, #wireframe, vertexTicks, layermanager.current.visibility = 0.5 и т.д.
 
Рейтинг
47
#3
Я видимо не корректно изложил суть вопроса, и произошло недопонимание

К примеру есть модель машины.

В layer manager три слоя:
1 Kolesa (ему присвоено 4 колеса),
2 Dveri (на нем лежат 4 двери),
3 Default (все остальное).

Выделяю любое колесо, запускаю выше приведенный код и во вьюпорте все колеса отображаются box-ами.
Выделяю другое колесо (оно в виде box-а), запускаю скрипт, и все колеса во вьюпорте возвращаются в прежний вид (а точнее все объекты присвоенные слою Kolesa )

При выделении колеса и двери, в режиме #boundingbox отобразится только одни слой, второй останется без изменения, в режиме #viewport.
(Это происходит из-за LayerSet. Функция делает один из слоев активным и меняет его настройки отображение, а второй игнорируется)

И вот вопрос: как сделать так, что бы при выделении колеса и двери (объектов не лежащих на одном слое), все колеса и двери, а точнее слои Kolesa и Dveri отображались в режиме #boundingbox.

Конечно можно это проделать последовательно. Но хочется что бы скрипт менял настройки отображение сразу нескольким слоям
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Понятно,
тогда просто обойди все выделенные объекты, собери в массив слои которым они принадлежат (уникальные, без повторов).
И уже сделай по ним(по найденным слоям) цикл, устанавливай свои свойства.
Ps
macros.run "Layers" "LayerSet" Не трогай он тебе не мешает
 
Рейтинг
47
#5
С участием более знающих людей, на данный момент есть такой работающий вариант:

Для отображения Display во вьюпорте

Код:
(
if selection.count > 0 do 
(
    ArrLayer=#()
    for obj in selection do
    (
        Objlayer=obj.INodeLayerProperties.layer
        if (appendifUnique ArrLayer ObjLayer) do
        
	( case of
		(
( Objlayer.display!=#wireframe): (Objlayer.display = #wireframe) [i]--#shaded; #boundingbox[/i]
( Objlayer.display==#wireframe): (Objlayer.display = #viewport)

		)
	)
        
		completeredraw()
    )
)
)
Для отображения Display Properties во вьюпорте

Код:
(
if selection.count > 0 do 
(
    ArrLayer=#()
    for obj in selection do
    (
        Objlayer=obj.INodeLayerProperties.layer
        if (appendifUnique ArrLayer ObjLayer) do
        (
Objlayer.backfacecull = not Objlayer.backfacecull  [i]-- Objlayer.vertexTicks;  Objlayer.ignoreExtents и т.д.[/i]
        )
    )
)
)
Недостаток: При выделении 2-х слоев, первый из которых отображается #boundingbox, а второй #viewport, после запуска скрипта, параметры меняются у обоих. То есть первый отображается #viewport, второй - #boundingbox

Хочется что бы при выделении нескольких слоев с разными параметрами отображения (или Properties). При первом запуске скрипта, все отображались #boundingbox (backfacecull = false). При повторном #viewport (backfacecull = true)
 

igorznag

Мастер
Рейтинг
103
#6
Хочется что бы при выделении нескольких слоев с разными параметрами отображения (или Properties). При первом запуске скрипта, все отображались #boundingbox (backfacecull = false). При повторном #viewport (backfacecull = true)
Код:
objs_display_n=0; objs_prop_n=0;
for o in selection do (ol=o.INodeLayerProperties.layer;
if(ol.display==#boundingbox)then objs_display_n=objs_display_n+1;
if(ol.backfacecull==false)then objs_prop_n=objs_prop_n+1;)
for o in selection do(ol=o.INodeLayerProperties.layer;
if(selection.count==objs_display_n and selection.count==objs_prop_n)then 
(ol.display=#viewport;ol.backfacecull=true;)
else (ol.display=#boundingbox;ol.backfacecull=false;))
 
Рейтинг
47
#7
Вот это дело, большущие спасибо!
Я не хотел что бы в одном скрипте менялись параметры Display и Display Properties. Когда я писал #boundingbox (backfacecull = false). Имел в виду для двух разных (параллельных скриптом).
Но это ерунда, уже разделил на два:
objs_display_n
objs_prop_n
 
Сверху