Render.ru

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

Mechos

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

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

Такой скрипт работает, если выделено несколько объектов или группа, но так же вращает их только вокруг их пивотов - даже внутри группы..
Есть ли способ сделать так, чтобы скрипт вел себя точно так же, как если бы я вручную выбрал комманду "Select and rotate" и вбивал в окошко значение "90" ? То есть поворачивал объекты вокруг их центров, множество выделенных объектов - поворачивал вокруг центра этого множетсва, а группу - соответственно вокруг центра группы..
В AutoCAD'е, например, наряду с языком AutoLISP есть еще макросы, просто имитирующие ввод комманд пользователем вручную.. В максе я с таким не сталкивался, но, возможно, это было бы решением ?
 
Рейтинг
31
#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 do
	in coordsys grid about rotate_center rotate o (angleaxis 90 [0,0,1])
Здесь учитываются различия при повороте отдельных объектов, групп и линкованных объектов. Вроде работает ))

В AutoCAD'е, например, наряду с языком AutoLISP есть еще макросы, просто имитирующие ввод комманд пользователем вручную.. В максе я с таким не сталкивался, но, возможно, это было бы решением ?
В Максе тоже есть такая фишка: MacroRecorder называется. Только реализация... подкачала. Так что реальной пользы от макрорекордера - как от козла молока ((
 

Mechos

Пользователь сайта
Рейтинг
2
#3
Огромное спасибо !
Действительно, вроде бы работает )
Я совершенно не знаком с синтаксисом максскрипта и такими особенностями, так что сам бы до этого не додумался.
 

igorznag

Мастер
Рейтинг
103
#4
а группу - соответственно вокруг центра группы
Если выделить подгруппы, тогда скрипт будет длинее.
Код:
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
 
Рейтинг
31
#5
Если выделить подгруппы, тогда скрипт будет длинее.
Ты бы не мог прокомментировать логику твоего скрипта. Что-то уж больно наворочено :eek:

Из замеченных недочётов:
1. Крутит объекты только по оси Z в мировой системе координат.
2. Неправильно работает с линкованными объектами.
3. У меня почему-то после выполнения скрипта ничего не происходит, пока в Listener не сделаешь какого-либо действия. Тогда происходит поворот. (Первый раз такое вижу!)
 
Рейтинг
31
#6
Благодаря 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])
Может, конечно, что-то ещё не учёл...
 

Mechos

Пользователь сайта
Рейтинг
2
#7
Еще раз, большое спасибо ! Действительно, теперь и внутри открытой группы объекты крутит .
 
Сверху