1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Выбрать edges в poly

Тема в разделе "MAXScript", создана пользователем Di_di_0, 28 апр 2008.

Модераторы: Savin Denis
  1. Di_di_0

    Di_di_0 Активный участник

    С нами с:
    08.12.2007
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    5
    Здравствуйте! Подскажите пожалуйста, как можно выбрать с помощью скрипта все горизонтальные или вертикальные edge в плоскости или кубике? Возможно ли это вообще? Сколько ни бьюсь не могу сообразить как это сделать.
     
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Да это можно сделать, edge легко представить в виде вектора после чего, нужно просто сравнить каждую edge объекта с требуемым референсным вектором (XYZ) и выделить те которые наиболее близко совпадают.
     
  3. Di_di_0

    Di_di_0 Активный участник

    С нами с:
    08.12.2007
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    5
    С трудом разбираюсь в векторах. Я себе это так представлял - что надо определить у каких edges совпадает z координата начальной и конечной точки и их выбрать. Проблема в том, что не могу прописать это. Искал в maxscript reference, но толком не нашел ничего. Может подскажете где там можно найти хотябы? Или что в поиске нужно писать, чтоб нужную тему отыскать?
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Так можно но это частный случай, во многих ситуация не будет работать.

    Код:
    -- 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
    
     
  5. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Можно немного доработать этот скрипт, чтобы референсный вектор брался из первой выделенной грани и оформить в виде макрокомманды, чтобы можно было назначить на кнопку.


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

    Di_di_0 Активный участник

    С нами с:
    08.12.2007
    Сообщения:
    64
    Симпатии:
    0
    Баллы:
    5
    Спасибо, Денис! Даже не предполагал что все так сложно окажется. Попробую теперь разобраться в этом.
     
Модераторы: Savin Denis

Поделиться этой страницей