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

Поворот на 90 на хоткей.

Тема в разделе "MAXScript", создана пользователем Mechos, 10 июн 2013.

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

    Mechos Пользователь сайта

    С нами с:
    28.09.2007
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Приветствую, коллеги !
    В своей работе приходится часто и много поворачивать объекты ровно на 90 градусов и хотелось бы посадить эту операцию на хоткей, чтобы делать это на лету, а не вбивать постоянно "90" в окошко.. В максе есть функция RotateCW, но она поворачивает объект только вокруг пивота, даже если выбрана опция "use selection center" и еще она не работает, если выделено больше одного объекта.

    Также пытался сделать это скриптом:
    (
    rotate $ (angleaxis 90 [0,0,1])
    )

    Такой скрипт работает, если выделено несколько объектов или группа, но так же вращает их только вокруг их пивотов - даже внутри группы..
    Есть ли способ сделать так, чтобы скрипт вел себя точно так же, как если бы я вручную выбрал комманду "Select and rotate" и вбивал в окошко значение "90" ? То есть поворачивал объекты вокруг их центров, множество выделенных объектов - поворачивал вокруг центра этого множетсва, а группу - соответственно вокруг центра группы..
    В AutoCAD'е, например, наряду с языком AutoLISP есть еще макросы, просто имитирующие ввод комманд пользователем вручную.. В максе я с таким не сталкивался, но, возможно, это было бы решением ?
     
  2. Black Sphinx

    Black Sphinx Знаток

    С нами с:
    05.09.2003
    Сообщения:
    234
    Симпатии:
    1
    Баллы:
    29
    Скрипт должен выглядеть примерно так:
    Код:
    rotate_center = [0, 0, 0]
    for o in selection do rotate_center += o.center
    rotate_center /= selection.count
    for o in selection where o.parent == undefined do
    	in coordsys grid about rotate_center rotate o (angleaxis 90 [0,0,1])
    
    Здесь учитываются различия при повороте отдельных объектов, групп и линкованных объектов. Вроде работает ))

    В Максе тоже есть такая фишка: MacroRecorder называется. Только реализация... подкачала. Так что реальной пользы от макрорекордера - как от козла молока ((
     
  3. Mechos

    Mechos Пользователь сайта

    С нами с:
    28.09.2007
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Огромное спасибо !
    Действительно, вроде бы работает )
    Я совершенно не знаком с синтаксисом максскрипта и такими особенностями, так что сам бы до этого не додумался.
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Если выделить подгруппы, тогда скрипт будет длинее.
    Код:
    fn group_children_all g &g_c=
    (
    if(g.children.count>0)then
    for obj in g.children do 
    (append g_c obj; group_children_all obj &g_c)
    )--fn group_children_all g &g_c=
    
    if(selection.count>0)then
    (
    objs=selection as array; objs_temp=selection as array;objs_rot=#()
    c=[0,0,0];for obj in selection do c+=obj.center; c/=selection.count
    acc=1
    while acc!=0 do
    (
    acc=0
    for obj in objs where isGroupHead obj do
    (
    obj_children=#(); group_children_all obj obj_children
    for obj_c in obj_children where (not isGroupHead obj_c) do
    (
    if(findItem objs_rot obj_c==0)then 
    (
    append objs_rot obj_c; acc=1
    )--if(findItem objs_rot obj_c==0)then
    ind=findItem objs_temp obj_c; if ind!=0 then deleteItem objs_temp ind
    )--for obj_c in obj.children do
    ind=findItem objs_temp obj; if ind!=0 then deleteItem objs_temp ind
    )--for obj in objs where isGroupHead obj do
    objs=objs_temp
    )--while acc!=0
    join objs_rot objs 
    for obj in objs_rot do about c rotate obj (angleaxis 90 [0,0,1])
    )--if(selection.count>0)then
     
  5. Black Sphinx

    Black Sphinx Знаток

    С нами с:
    05.09.2003
    Сообщения:
    234
    Симпатии:
    1
    Баллы:
    29
    Ты бы не мог прокомментировать логику твоего скрипта. Что-то уж больно наворочено :eek:

    Из замеченных недочётов:
    1. Крутит объекты только по оси Z в мировой системе координат.
    2. Неправильно работает с линкованными объектами.
    3. У меня почему-то после выполнения скрипта ничего не происходит, пока в Listener не сделаешь какого-либо действия. Тогда происходит поворот. (Первый раз такое вижу!)
     
  6. Black Sphinx

    Black Sphinx Знаток

    С нами с:
    05.09.2003
    Сообщения:
    234
    Симпатии:
    1
    Баллы:
    29
    Благодаря igorznag нашел ошибочку в своём скрипте из #2. Неправильно отрабатывалась ситуация, когда при открытой группе нужно повернуть часть объектов из группы, но не саму группу. Вот подправленный вариант:
    Код:
    rotate_center = [0, 0, 0]
    for o in selection do rotate_center += o.center
    rotate_center /= selection.count
    for o in selection where o.parent == undefined or not o.parent.isSelected do
    	in coordsys grid about rotate_center rotate o (angleaxis 90 [0,0,1])
    
    Может, конечно, что-то ещё не учёл...
     
  7. Mechos

    Mechos Пользователь сайта

    С нами с:
    28.09.2007
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Еще раз, большое спасибо ! Действительно, теперь и внутри открытой группы объекты крутит .
     
Модераторы: Savin Denis

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