Здравствуйте! Подскажите пожалуйста, как можно выбрать с помощью скрипта все горизонтальные или вертикальные edge в плоскости или кубике? Возможно ли это вообще? Сколько ни бьюсь не могу сообразить как это сделать.
Да это можно сделать, edge легко представить в виде вектора после чего, нужно просто сравнить каждую edge объекта с требуемым референсным вектором (XYZ) и выделить те которые наиболее близко совпадают.
С трудом разбираюсь в векторах. Я себе это так представлял - что надо определить у каких edges совпадает z координата начальной и конечной точки и их выбрать. Проблема в том, что не могу прописать это. Искал в maxscript reference, но толком не нашел ничего. Может подскажете где там можно найти хотябы? Или что в поиске нужно писать, чтоб нужную тему отыскать?
Можно немного доработать этот скрипт, чтобы референсный вектор брался из первой выделенной грани и оформить в виде макрокомманды, чтобы можно было назначить на кнопку.
MacroScript EPoly_SelectRefEdge
enabledIn:#("max", "viz")
ButtonText:"SelREdge"
Category:"Editable Polygon Object"
internalCategory:"Editable Polygon Object"
Tooltip:"SelectRefEdge (Poly)"
-- Needs Icon
(
On IsEnabled Return Filters.Is_EPolySpecifyLevel #{3}
On IsVisible Return Filters.Is_EPolySpecifyLevel #{3}
On Execute Do (
Try (
If SubObjectLevel == undefined then Max Modify Mode
local obj = Filters.GetModOrObj()
local fEPoly = (classof obj == Editable_Poly)
-- Value
threshold = 0.001 -- 0 - 1
selEdgeVec = (obj.GetSelection #Edge) as array
vComp = normalize [0,0,1] -- Default Compare Vector
if selEdgeVec.count != 0 do
(
local i = selEdgeVec[1]
local p1 = obj.GetVertex (obj.GetEdgeVertex i 1)
local p2 = obj.GetVertex (obj.GetEdgeVertex i 2)
vComp = Normalize (p2 - p1)
)
if fEPoly do polyop.CollapseDeadStructs obj
threshold = 1. - threshold
edgeNum = obj.GetNumEdges()
selEdge = for i = 1 to edgeNum where
(
-- vEdge Vector
local p1 = obj.GetVertex (obj.GetEdgeVertex i 1)
local p2 = obj.GetVertex (obj.GetEdgeVertex i 2)
local vEdge = Normalize (p2 - p1)
-- Commpare
local a = abs (dot vComp vEdge)
(a >= threshold)
) collect i
selEdge = selEdge as BitArray
obj.SetSelection #Edge selEdge
if not fEPoly do obj.Select #Edge selEdge
for o in $selection do nodeInvalRect o
subobjectLevel = 2
)
Catch(MessageBox "Operation Failed" Title:"Poly Editing")
)
)
Код нужно поместить в файл c расширением xxx.mcr и положить 3dsmax\UI\Macroscript и пезапустить макс
После чего в UI Customize в категории Editable Polygon Object сможеш найти свою кнопку, называться будет SelectRefEdge (Poly).
Дальше выделяеш одну грань жмеш на кнопку: выделятся все параллельные ей.
PS
Сделал также чтоб корректно работал с модификатором Edit_Poly
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Di_di_0
Savin Denis
Di_di_0
Savin Denis
Savin Denis
MacroScript EPoly_SelectRefEdge enabledIn:#("max", "viz") ButtonText:"SelREdge" Category:"Editable Polygon Object" internalCategory:"Editable Polygon Object" Tooltip:"SelectRefEdge (Poly)" -- Needs Icon ( On IsEnabled Return Filters.Is_EPolySpecifyLevel #{3} On IsVisible Return Filters.Is_EPolySpecifyLevel #{3} On Execute Do ( Try ( If SubObjectLevel == undefined then Max Modify Mode local obj = Filters.GetModOrObj() local fEPoly = (classof obj == Editable_Poly) -- Value threshold = 0.001 -- 0 - 1 selEdgeVec = (obj.GetSelection #Edge) as array vComp = normalize [0,0,1] -- Default Compare Vector if selEdgeVec.count != 0 do ( local i = selEdgeVec[1] local p1 = obj.GetVertex (obj.GetEdgeVertex i 1) local p2 = obj.GetVertex (obj.GetEdgeVertex i 2) vComp = Normalize (p2 - p1) ) if fEPoly do polyop.CollapseDeadStructs obj threshold = 1. - threshold edgeNum = obj.GetNumEdges() selEdge = for i = 1 to edgeNum where ( -- vEdge Vector local p1 = obj.GetVertex (obj.GetEdgeVertex i 1) local p2 = obj.GetVertex (obj.GetEdgeVertex i 2) local vEdge = Normalize (p2 - p1) -- Commpare local a = abs (dot vComp vEdge) (a >= threshold) ) collect i selEdge = selEdge as BitArray obj.SetSelection #Edge selEdge if not fEPoly do obj.Select #Edge selEdge for o in $selection do nodeInvalRect o subobjectLevel = 2 ) Catch(MessageBox "Operation Failed" Title:"Poly Editing") ) )Код нужно поместить в файл c расширением xxx.mcr и положить 3dsmax\UI\Macroscript и пезапустить максПосле чего в UI Customize в категории Editable Polygon Object сможеш найти свою кнопку, называться будет SelectRefEdge (Poly).
Дальше выделяеш одну грань жмеш на кнопку: выделятся все параллельные ей.
PS
Сделал также чтоб корректно работал с модификатором Edit_Poly
Di_di_0