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

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

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

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

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

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

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

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Куда они становились ?
    В layer manager ты такое руками сделать можешь ?
     
  3. Александр Чернега

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

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

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

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

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

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

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

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

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Понятно,
    тогда просто обойди все выделенные объекты, собери в массив слои которым они принадлежат (уникальные, без повторов).
    И уже сделай по ним(по найденным слоям) цикл, устанавливай свои свойства.
    Ps
    macros.run "Layers" "LayerSet" Не трогай он тебе не мешает
     
  5. Александр Чернега

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

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

    Для отображения 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)
     
  6. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    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;))
     
  7. Александр Чернега

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

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Вот это дело, большущие спасибо!
    Я не хотел что бы в одном скрипте менялись параметры Display и Display Properties. Когда я писал #boundingbox (backfacecull = false). Имел в виду для двух разных (параллельных скриптом).
    Но это ерунда, уже разделил на два:
    objs_display_n
    objs_prop_n
     
Модераторы: Savin Denis

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