Render.ru
Поддержать

Выбрать edges в poly

Di_di_0

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

Savin Denis

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

Di_di_0

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

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
представлял - что надо определить у каких 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
Можно немного доработать этот скрипт, чтобы референсный вектор брался из первой выделенной грани и оформить в виде макрокомманды, чтобы можно было назначить на кнопку.


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
Спасибо, Денис! Даже не предполагал что все так сложно окажется. Попробую теперь разобраться в этом.