Render.ru

Выбрать edges в poly

Di_di_0

Активный участник
Рейтинг
5
#1
Здравствуйте! Подскажите пожалуйста, как можно выбрать с помощью скрипта все горизонтальные или вертикальные edge в плоскости или кубике? Возможно ли это вообще? Сколько ни бьюсь не могу сообразить как это сделать.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Да это можно сделать, edge легко представить в виде вектора после чего, нужно просто сравнить каждую edge объекта с требуемым референсным вектором (XYZ) и выделить те которые наиболее близко совпадают.
 

Di_di_0

Активный участник
Рейтинг
5
#3
С трудом разбираюсь в векторах. Я себе это так представлял - что надо определить у каких edges совпадает z координата начальной и конечной точки и их выбрать. Проблема в том, что не могу прописать это. Искал в maxscript reference, но толком не нашел ничего. Может подскажете где там можно найти хотябы? Или что в поиске нужно писать, чтоб нужную тему отыскать?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
представлял - что надо определить у каких edges совпадает z координата начальной и конечной точки
Так можно но это частный случай, во многих ситуация не будет работать.

Код:
-- Value
threshold = 0.2	--  0 - 1
vComp = normalize [0,0,1]  -- Compare Vector 
obj = $


polyop.CollapseDeadStructs obj
threshold = 1. - threshold
edgeNum  = polyop.getNumEdges obj
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

polyop.setEdgeSelection obj selEdge
nodeInvalRect obj
subobjectLevel = 2
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#5
Можно немного доработать этот скрипт, чтобы референсный вектор брался из первой выделенной грани и оформить в виде макрокомманды, чтобы можно было назначить на кнопку.


Код:
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

Активный участник
Рейтинг
5
#6
Спасибо, Денис! Даже не предполагал что все так сложно окажется. Попробую теперь разобраться в этом.
 
Сверху