/*//////////   SCRIPT:   Hard Edges v1.1   //////////*/	
/*//////////   WRITTEN BY:   Branko Zivkovic   //////////*/
/*//////////   EMAIL:   barigazy@hotmail.com   //////////*/	

global heRoll
if heRoll  != undefined do try (destroyDialog heRoll) catch()
rollout heRoll " Hard Edges v1.0"
(
	label heLbl " Set Min and Max Angle\r\n  Between Edge Faces" pos:[0,0] width:115 height:32 style_sunkenedge:true
	spinner heSpn1 "MinAngle:  " pos:[4,34] fieldwidth:45 height:16 range:[-360,360,60] type:#float
	spinner heSpn2 "MaxAngle: " pos:[3,52] fieldwidth:45 height:16 range:[-360,360,120] type:#float
	button heBtn "Select Hard Edges" pos:[2,70] width:111 height:16 border:false

	local gef = polyOp.getEdgeFaces, gfn = polyop.getFaceNormal, ses = polyOp.setEdgeSelection
	fn isMody node = isKindof node modifier 
	fn edgeFacesAngle dir1 dir2 = (acos (dot (normalize dir2) (normalize dir1)))
	fn findHardEdges obj minA maxA =
	(
		local edgelist = #{}
		local edgeCnt = if isMody obj then obj.GetNumEdges() else polyop.getNumEdges obj
		if isMody obj then
		(
			for ed = 1 to edgeCnt do
			(
				facesArr = for i = 1 to 2 where (number = obj.GetEdgeFace ed i) != 0 collect number
				if facesArr.count == 2 do
				(
					v1 = obj.getFaceNormal facesArr[1]
					v2 = obj.getFaceNormal facesArr[2]
					theAngle = edgeFacesAngle v1 v2
					if theAngle >= minA and theAngle <= maxA do append edgelist ed
				)				
			)
		)
		else
		(
			for ed = 1 to edgeCnt do
			(
				if (facesArr = (gef obj ed)).count == 2 do
				(
					v1 = (gfn obj facesArr[1])
					v2 = (gfn obj facesArr[2])
					theAngle = edgeFacesAngle v1 v2
					if theAngle >= minA and theAngle <= maxA do append edgelist ed
				)
			)
		)
		if edgelist.numberSet != 0 do
		(
			if isMody obj then (obj.Select #Edge #{} ; obj.SetSelection #Edge edgelist) else ses obj edgelist
		)
	)
	on heBtn pressed do
	(
		if selection.count == 1 do
		(
			if getCommandPanelTaskMode() != #modify do (max modify mode) ; obj = modPanel.getCurrentObject()
			if isKindOf obj Editable_Poly or isKindOf obj Edit_Poly do (findHardEdges obj heSpn1.value heSpn2.value)
			subobjectLevel = 2
		)
	)
)
createdialog heRoll 115 88 10 110 style:#(#style_titlebar, #style_sysmenu, #style_toolwindow) fgcolor:(color 51 153 225)