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

Как получить габаритные размеры всех объектов в сцене ?

Тема в разделе "Общие вопросы", создана пользователем Василий Антипов, 12 июл 2014.

Модераторы: Артер
  1. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95
    Каждый объект имеет габаритные размеры, посмотреть их можно в Properties каждого объекта. Так же можно посмотреть в основном меню Properties/Summary info, там список всех объектов, но вот размеров каждого объекта там нет.
    Подскажите, может быть как-то можно получить список всех объектов в сцене с их габаритными размерами ? может плагин какой есть для этого ?
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Пример. Запускаем скрипт. Размеры будут в Generic Units:
    Код:
    actionMan.executeAction 0 "40472";clearlistener();
    for o in objects do (n=in coordsys local nodelocalboundingbox o;
    n=(n[2]-n[1])*o.scale;print (o.name+" "+n as string))
     
    Василий Антипов нравится это.
  3. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95

    спасибо !
    Скажите, а можно ли его доработать ?
    имена объектов я убрал, а можно убрать кавычки и скобки ?
    "Box4870 [-1.60001,-72.1999,-31]"
    хотелось бы как-то округлить размеры:
    т.е. размер объекта 1.6, 72.2, 31
    а в скрипте вот что -1.60001,-72.1999,-31
    можно как-то округлить размеры и убрать минус перед размерами ?
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Да. Запускаем скрипт. В новом окне нажимаем кнопку Get.
    Код:
    rollout test "Test"
    (
    fn prec v p= if p==0 then v as integer else floor (v*(pow 10 p))/(pow 10 p)
    spinner sp_p "Precision:" range:[0,6,1] type:#integer scale:1 fieldWidth:40
    button btn_get "Get"; edittext et_size height:200;  on btn_get pressed do
    (
    str="";for o in objects do 
    (
    n=in coordsys local nodelocalboundingbox o;n=(n[2]-n[1])*o.scale;
    p=sp_p.value;n_x=(prec(abs n[1]) p)as string
    n_y=(prec(abs n[2]) p)as string;n_z=(prec(abs n[3]) p)as string
    n=n_x+","+n_y+","+n_z;str+=n+"\n"
    )--for o in objects do 
    et_size.text=str
    )--on bnt_get pressed do
    ); createdialog test 300 280
     
    Василий Антипов нравится это.
  5. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95

    Спасибо большое, Ваши скрипты, то что нужно !
    округление правда не работает, скрипт просто убирает знаки после запятой, но не округляет, это не фатально конечно, т.к. дальше через буфер обмена передаю в эксель и там уже дорабатываю, видимо в максе такое нельзя сделать.
    а можно маштабность ввести ? т.е. все размеры умножить на 10
    а можно между размерами не запятые ставить, а пробел ?
    а можно между целой и дробной частью ставить не точку, а запятую ?
    можно сделать, что бы скрипт показывал размеры только выделенных объектов ?
    а можно как-то скроллинг списка сделать

    как можно скрипт вывести на кнопочку ?
    _______________________________
     
  6. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95
    Хорошо, что теперь размеры разбиты на три колонки, до этого они были в одну строчку, при переносе в эксель

    что сам смог изменить:
    - умножил размеры на 10 (хорошо бы кнопочку маштабирования и число, на которое нужно умножить все размеры)
    - убрал запятую между размерами, заменив на пробел
    _________________
    что хотелось бы ещё:
    - если возможно, то округление, а не отбрасывание разрядности, т.е. 51.1999 -> 51.2
    - заменить точку, между целой и дробной части на запятую
    - добавить скроллинг в окне с размерами
    - что бы показывал размеры только выделенных объектов, или сделать такую возможность, что бы не копировать нужные объекты в отдельный файл, что бы получить список их размеров.
    Если округление сделать нельзя, то Precision сделать по умолчанию 6, а коэффициент, на который умножаются размеры, по умолчанию 10 и чт бы скрипт сразу выдавал результат, по настройкам по умолчанию, что бы не жать кнопочку Get. А если нужно изменить умолчания, то меняешь и жмешь опять Get
    как добавить скрипт на кнопочку на тулбаре ?


    Код:
    rollout test "Test"
    (
    fn prec v p= if p==0 then v as integer else floor (v*(pow 10 p))/(pow 10 p)
    spinner sp_p "Precision:" range:[0,6,1] type:#integer scale:1 fieldWidth:40
    button btn_get "Get"; edittext et_size height:820; on btn_get pressed do
    (
    str="";for o in objects do
    (
    n=in coordsys local nodelocalboundingbox o;n=(n[2]-n[1])*o.scale;
    p=sp_p.value;n_x=(prec(abs n[1]*10) p)as string
    n_y=(prec(abs n[2]*10) p)as string;n_z=(prec(abs n[3]*10) p)as string
    n=n_x+" "+n_y+" "+n_z;str+=n+"\n"
    )--for o in objects do
    et_size.text=str
    )--on bnt_get pressed do
    ); createdialog test 300 900
     
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Чтобы добавить скрипт на кнопочку на тулбаре, нужно выделить текст скрипта и перетащить его на тулбар.
    Код:
    rollout test "Test"
    (
    fn round_to val n = 
    (
    mult = pow 10 n; a=(floor ((val * mult) + 0.5)) / mult; a=a as string
    if a.count>2 then if a[a.count]=="0" and a[a.count-1]=="." then a=substring a 1 (a.count-2)
    a
    )
    fn comma val = (a=val;b=filterstring val "."; if b.count==2 then a=b[1]+","+b[2];a)
    spinner sp_p "Round:" range:[0,6,1] type:#integer scale:1 fieldWidth:40
    spinner sp_s "Scale:" range:[0,1e+9,1] type:#float fieldWidth:50
    button btn_get "Get"; button btn_copy_to_clipboard "Copy to clipboard"
    listbox lb_size height:12
    on btn_copy_to_clipboard pressed do 
    (
    str=""; for i=1 to lb_size.items.count do str+=lb_size.items[i]+"\n"
    setclipboardText str
    )--on btn_copy_to_clipboard pressed do 
    on btn_get pressed do
    (
    size_a=#();for o in selection do 
    (
    n=in coordsys local nodelocalboundingbox o;n=(n[2]-n[1])*o.scale*sp_s.value; p=sp_p.value;
    n_x=(n[1] as string) as float
    n_y=(n[2] as string) as float
    n_z=(n[3] as string) as float
    n_x=comma((round_to(abs n_x) p)as string)
    n_y=comma((round_to(abs n_y) p)as string)
    n_z=comma((round_to(abs n_z) p)as string)
    n=n_x+" "+n_y+" "+n_z; append size_a n
    )--for o in objects do 
    lb_size.items=size_a 
    )--on bnt_get pressed do
    on test open do btn_get.pressed()
    ); createdialog test 300 280
     
    Василий Антипов нравится это.
  8. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95
    Спасибо, тестирую перенос размеров в файл...
    _____________________________________________
    всё отлично, округляется правильно !!!
    просто супер !
    все функции работают
     
  9. Василий Антипов

    Василий Антипов Мастер

    С нами с:
    19.08.2000
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    95

    обнаружена ошибка !
    если размер больше 3-х символов в целой части, т.е. 1000 и больше, то при переносе в эксель, все три размера пишутся слитно, без пробелов =(
    _____________________________________
    вылечил добавлением второго пробела между размерами
     
Модераторы: Артер

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