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

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

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

У меня есть скрипт – отображения объектов (по слою), из #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 и т.д.

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
Александр Чернегастановились слои на которых они лежат
Куда они становились ?
В layer manager ты такое руками сделать можешь ?
Рейтинг
47
Я видимо не корректно изложил суть вопроса, и произошло недопонимание

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

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

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

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

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

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

Savin Denis

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

Для отображения 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
Хочется что бы при выделении нескольких слоев с разными параметрами отображения (или 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
Вот это дело, большущие спасибо!
Я не хотел что бы в одном скрипте менялись параметры Display и Display Properties. Когда я писал #boundingbox (backfacecull = false). Имел в виду для двух разных (параллельных скриптом).
Но это ерунда, уже разделил на два:
objs_display_n
objs_prop_n