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

Мне нужен скрипт, записывающий в txt файл инфу по расположению моделей в сцене

Тема в разделе "MAXScript", создана пользователем Castello, 8 янв 2012.

Модераторы: Savin Denis
  1. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Мне нужен скрипт, записывающий в текстовый файл информацию по расположению выделенных моделей в сцене

    К примеру, в сцене имеем несколько объектов, скрипт должен записать в текстовый файл, название модели/координты x.y.z. / а также углы вращения по координатам x.y.z
    выделенных объектов, в таком вот виде:

    Название: Координаты X,Y,Z: Углы вращения X,Y,Z:

    Код:
    object1 [12.23,45.56,78.9] [0,0,-135]
    object2 [21.32,54.65,87.9] [0,0,90]
    object3 [1,1,1] [0,0,0]
    3ds Max 2012 x64 SP2

    Зарание спасибо
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    В новой сцене создайте один объект чайник (Teapot), установите какие-нибудь координаты положения, вращения.
    Сохраните его координаты с помощью скрипта из этой ТЕМЫ. Проверьте если координаты правильно сохраняются.
     
  3. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Код:
    outFile = getSaveFileName caption:"Safe coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
    
    if outFile != undefined then 
    ( 
    outFile = createfile outFile 
    for i in objects do 
    ( 
     pos2 = i.pos 
     rot1 = i.rotation as eulerAngles 
     rot2 = [rot1.x,rot1.y,rot1.z] 
    
     format "% %\n" pos2 rot2 to:outFile 
    ); 
    close outFile 
    );
    Нет, этот скрипт мне не подходит - он не сохраняет имена объектов, а координаты X.Y.Z вообще непонятно от куда берет, и еще что касается углов вращения - у меня в сцене угол объекта = 0,0,-135, а этот скрипт сохраняет как 0,0,135 (он забыл минус "-", а в моем случае это критично)

    вот так вот выглядит моя сцена:

    http://rghost.ru/35794166/image.png

    объект Teapot001
    координаты [12.34,56.78,9]
    вращение [0,0,-135]

    а скрипт при этом мне выдал

    Код:
    [485.827,2235.43,354.331] [0,0,135]
    нету имени объекта, координаты выообще не соответсвуют, угол без минуса...

    уточню - скрипт должен писать координты учитывая те параметры Unit Setup, которые стоят в данный момент сцены, на скриншоте видно какаие у меня параметры
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Попробуйте этот вариант скрипта. Display unit scale должен быть Metric:Meters.
    Сначала выделяем нужные объекты и потом запускаем скрипт:
    Код:
    fn precision_3 n= (return (floor (n*1000))/1000)
    if(selection.count>0)then
    (
    outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
    if outFile != undefined then 
    ( 
    outFile = createfile outFile 
    for i in selection do 
    (
    obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z]
    if(units.DisplayType==#Metric and units.MetricType==#Meters)then
    (
    s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=s_array[1];
    s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=s_array[1];
    s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=s_array[1];
    obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]";
    )
    obj_rot_x=precision_3 i.rotation.x_rotation; obj_rot_y=precision_3 i.rotation.y_rotation;
    obj_rot_z=precision_3 i.rotation.z_rotation; obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z];
    format "% % %\n" obj_name obj_pos obj_rot to:outFile 
    ); 
    close outFile 
    );
    );
     
  5. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Код:
    Teapot001 [-0,607,1,618,5,1] [0,0,-135]
    Почти то что надо, единственный ньюанс - в записии X,Y,Z координат моделей получается неразбериха - [-0,607,1,618,5,1]
    Нужно чтобы скрипт записывал делитель дробной части не запятой "," а точкой ".", т.е. должно было получится вот так"
    Код:
    Teapot001 [-0.607,1.618,5.1] [0,0,-135]
     
  6. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    fn sep n= (f=filterString n ",";if(f.count==2)then n=f[1]+"."+f[2];return n;)
    fn precision_3 n= (return (floor (n*1000))/1000)
    if(selection.count>0)then
    (
    outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
    if outFile != undefined then 
    ( 
    outFile = createfile outFile 
    for i in selection do 
    (
    obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z]
    if(units.DisplayType==#Metric and units.MetricType==#Meters)then
    (
    s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=sep s_array[1];
    s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=sep s_array[1];
    s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=sep s_array[1];
    obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]";
    )
    obj_rot_x=precision_3 i.rotation.x_rotation; obj_rot_y=precision_3 i.rotation.y_rotation;
    obj_rot_z=precision_3 i.rotation.z_rotation; obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z];
    format "% % %\n" obj_name obj_pos obj_rot to:outFile 
    ); 
    close outFile 
    );
    );
     
  7. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    igorznag
    Все отлично работает, благодарю Вас
     
  8. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    А как теперь зделать так чтобы углы вращения записывались в кватернионах?
    Прим:
    Код:
    Teapot001 [-0.607,1.618,5.1] [0.70710677,0,0,0.70710677]
     
  9. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    fn sep n= (f=filterString n ",";if(f.count==2)then n=f[1]+"."+f[2];return n;) 
    fn precision_3 n= (return (floor (n*1000))/1000) 
    if(selection.count>0)then 
    ( 
    outFile = getSaveFileName caption:"Save coords.:" types:"Coords. list (*.txt)|*.txt|All Files (*.*)|*.*|" 
    if outFile != undefined then 
    ( 
    outFile = createfile outFile 
    for i in selection do 
    ( 
    obj_name=i.name; obj_pos=[precision_3 i.pos.x,precision_3 i.pos.y, precision_3 i.pos.z] 
    if(units.DisplayType==#Metric and units.MetricType==#Meters)then 
    ( 
    s=(units.formatValue i.pos.x); s_array=filterString s "m";obj_pos_x=sep s_array[1]; 
    s=(units.formatValue i.pos.y); s_array=filterString s "m";obj_pos_y=sep s_array[1]; 
    s=(units.formatValue i.pos.z); s_array=filterString s "m";obj_pos_z=sep s_array[1]; 
    obj_pos="["+obj_pos_x+","+obj_pos_y+","+obj_pos_z+"]"; 
    ) 
    
    obj_rot_x=precision_3 i.rotation.x; obj_rot_y=precision_3 i.rotation.y; 
    obj_rot_z=precision_3 i.rotation.z; obj_rot_w=precision_3 i.rotation.w; 
    obj_rot=[obj_rot_x,obj_rot_y,obj_rot_z,obj_rot_w]; 
    format "% % %\n" obj_name obj_pos obj_rot to:outFile 
    ); 
    close outFile 
    ); 
    );
     
  10. jumo

    jumo Активный участник

    С нами с:
    30.01.2009
    Сообщения:
    29
    Симпатии:
    3
    Баллы:
    15
    Спасибо за ответ!

    Запускаю скирпт, выделяю Теапот01, показывает ошибку:

    -- Error occurred in <handler>()
    -- Frame:
    -- hide_unhide: undefined
    -- obj: $Teapot01
    >> MAXScript Change Handler Exception: -- Type error: Call needs function or class, got: undefined <<
     
  11. jumo

    jumo Активный участник

    С нами с:
    30.01.2009
    Сообщения:
    29
    Симпатии:
    3
    Баллы:
    15
    эе,прошу прощения,ни туда послал :)
     
Модераторы: Savin Denis

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