Нужно создать между двумя не параллельными ребрами 3е перпендикулярное одному из них
Пример: Создаем новую сцену.
Создаем один чайник и конвертируем его в Editable Poly.
Выделяем один планарный полигон и одно ребро выделенного полигона.
Переходин на уровень полигонов (нажимаем клавишу 4).
В свитке Edit Geometry нажимаем кнопку Slice Plane.
Запускаем скрипт. В новом окне нажимаем кнопку Align.
Перемещаем Slice Plane по оси X в новой системе координат.
В свитке Edit Geometry нажимаем кнопку Slice.
Код:
try destroydialog igorznag_slice_plane_align catch()
rollout igorznag_slice_plane_align "Slice"
(
button btn_apply "Align" pos:[5,5] width:70 height:25
on btn_apply pressed do
(
if(selection.count==1)then
(
obj=modPanel.getCurrentObject()
if(classof obj==Editable_Poly)then
(
fs_ba=polyop.getFaceSelection obj; fs_a=fs_ba as array
if(fs_a.count==1)then
(
ef_ba=polyOp.getEdgesUsingFace obj fs_a
es_ba=polyop.getEdgeSelection obj; es_a=es_ba as array
if(es_a.count==1 and (es_ba*ef_ba).numberSet==1)then
(
ev=polyOp.getEdgeVerts obj es_a[1]
ev1_coord=polyop.getVert obj ev[1] node:selection[1]
ev2_coord=polyop.getVert obj ev[2] node:selection[1]
ev1ev2=ev2_coord-ev1_coord
if(length ev1ev2>0)then
(
undo on
(
with animate off
(
rightVector=normalize ev1ev2
faceNormal = polyop.getFaceNormal obj fs_a[1] node:selection[1]
upVector = normalize (cross rightVector faceNormal)
p=(ev1_coord+ev2_coord)/2
theMatrix = matrix3 rightVector -upVector faceNormal p
try delete $grid_poly_igorznag catch ()
g=grid name:"grid_poly_igorznag"; g.transform=theMatrix
toolmode.coordsys g; freeze g; hide g
polyOp.setSlicePlane selection[1] (ray p rightVector) ((length ev1ev2)/2.0)
redrawViews();
)--with animate off
)--undo on
)--if(length ev1ev2>0)then
)--if(es_a.count==1 and (es_ba*ef_ba).numberSet==1)then
)--if(fs_a.count==1)then
)--if(classof obj==Editable_Poly)then
)--if(selection.count==1)then
)--on btn_apply pressed do
); createdialog igorznag_slice_plane_align 80 35
поставить на ребре вершину на определённом расстоянии от другой вершины
Пример: Создаем новую сцену.
Создаем один чайник и конвертируем его в Editable Poly.
Выделяем одно ребро и одну вершину выделенного ребра.
Запускаем скрипт. В новом окне нажимаем кнопку Apply.
Код:
try destroydialog igorznag_insert_vertex catch()
rollout igorznag_igorznag_insert_vertex "Insert vertex"
(
spinner sp_dist "Distance:" range:[0,1e9,1] fieldWidth:60 type:#worldunits pos:[5,5]
button btn_apply "Apply" pos:[35,30] width:70 height:25
on btn_apply pressed do
(
if(selection.count==1)then
(
obj=modPanel.getCurrentObject()
if(classof obj==Editable_Poly)then
(
es_ba=polyop.getEdgeSelection obj; es_a=es_ba as array
if(es_a.count==1)then
(
ve_ba=polyOp.getVertsUsingEdge obj es_a
vs_ba=polyop.getVertSelection obj; vs_a=vs_ba as array
if(vs_a.count==1 and (vs_ba*ve_ba).numberSet==1)then
(
ev1_coord=polyop.getVert obj vs_a[1] node:selection[1]
ev2_ba=ve_ba-vs_ba;ev2_a=ev2_ba as array
ev2_coord=polyop.getVert obj ev2_a[1] node:selection[1]
ev1ev2=ev2_coord-ev1_coord
if(sp_dist.value<length ev1ev2)then
(
undo on
(
with animate off
(
p_index=polyOp.divideEdge obj es_a[1] 0.5
p_coord=ev1_coord+sp_dist.value*(normalize ev1ev2)
polyop.setVert obj p_index p_coord node:selection[1]
polyop.setVertSelection obj p_index
redrawviews()
)--with animate off
)--undo on
)--if(sp_dist.value<length ev1ev2)then
)--if(vs_a.count==1 and (vs_ba*ve_ba).numberSet==1)then
)--if(es_a.count==1)then
)--if(classof obj==Editable_Poly)then
)--if(selection.count==1)then
)--on btn_apply pressed do
); createdialog igorznag_igorznag_insert_vertex 130 60
Чтобы запустить скрипт нужно:
1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
2. Сохраняем текстовый файл с названием "test.ms"
3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"