messagebox("Script are stored in Category: \"Niklit Scripts\"")
macroScript uniremover Category:"Niklit Scripts" Tooltip:"UniRemover"
(
------------------------FUNCTIONS------------------------------
fn fn_NumV fco = fco.GetNumVertices()

fn FN_RemVertEP fco=(
arVert=fco.getSelection #Vertex
Filter_V_not2e = (for v  in arVert where fco.GetVertexEdgeCount v != 2 collect v) as BitArray
fco.SetSelection #Vertex Filter_V_not2e
fco.ConvertSelectionToBorder #Vertex #Edge
fco.Remove selLevel:#Edge
Filter_V_2e = (for v  in arVert where fco.GetVertexEdgeCount v == 2 collect v) as BitArray
fco.SetSelection #Vertex Filter_V_2e
fco.Remove selLevel:#Vertex
)

fn FN_RemVertEtP fco=(
arVert = fco.getSelection #Vertex
Filter_V_not2e = (for v  in arVert where fco.GetVertexEdgeCount v != 2 collect v) as BitArray
fco.SetSelection #Vertex #{}
fco.Select #Vertex Filter_V_not2e
fco.ConvertSelectionToBorder #Vertex #Edge
fco.SetOperation #RemoveEdge
fco.Commit()
Filter_V_2e = (for v  in arVert where fco.GetVertexEdgeCount v == 2 collect v) as BitArray
fco.Select #Vertex Filter_V_2e
fco.SetOperation #RemoveVertex
fco.Commit ()
)

fn FN_EdgeRemove fco =(
fco.ConvertSelection #Edge #Vertex
try fco.Remove selLevel:#Edge catch fco.buttonOp #RemoveEdge
case classof fco of (
Editable_Poly: arV=getVertSelection $.mesh
	Edit_Poly: arV=fco.getSelection #Vertex
	)
set_Vert=(for v in arV where fco.GetVertexEdgeCount v < 3 collect v)as BitArray
arSel = selection as Array
try (fco.setSelection #Vertex set_Vert; fco.Remove selLevel:#Vertex) catch
for i=1 to selection.count
do (
	fco.SetSelection #Vertex #{} node: arSel[i]
	subobjectlevel=1
	fco.Select #Vertex set_Vert node: arSel[i]
	fco.buttonOp #RemoveVertex
	subobjectlevel=2
	)
)

fn FN_SO_2operation fco =(
Es=fco.getselection #Edge; V_state1=fn_NumV fco
if Es.count==Es.numberset
then PolyToolsModeling.Quadrify off off
else FN_EdgeRemove fco
max select
V_state2=fn_NumV fco
differV=V_state1-V_state2
if differV > 0 do PushPrompt (differV as string + " Vertex removed")
)

fn FN_FaceReduce fco =(
with Redraw off
	(
		try fco.tesselateBy = 1 catch fco.tessellateByFace = 1
		fco.buttonop #Tessellate
		fco.ConvertSelectionToBorder #Face #Edge
		fco.SetSelection #Face #{}
		FN_EdgeRemove fco
	)
)

fn FN_RemSpl fco = (
	if classof fco != Edit_Spline then fco = $
	if (subobjectLevel<3 and subobjectLevel != 0)
	then actionMan.executeAction 0 "40020"/*Delete Objects*/ else splineOps.startTrim fco
)

fn FN_ScaleNegativeFixer arO =(
	For o in arO do
	(
	max create mode
	select o
	ResetXForm o
	AddModifier o (Normalmodifier ())
	o.modifiers[#Normal].flip = on
	collapseStack o
	select arO
	max modify mode
	)
)

fn FN_SetVertOpen_2e fco =(
OpenE=#()
openEdges.Check currentTime selection[1] &OpenE
allOpnVert=for e in OpenE collect fco.GetEdgeVertex e 1
Filter_V_2e = (for v  in allOpnVert where fco.GetVertexEdgeCount v == 2 collect v) as BitArray
subObjectLevel=1
			case classof fco of (
			Editable_Poly: fco.setSelection #Vertex Filter_V_2e
			Edit_Poly: fco.Select #Vertex Filter_V_2e
			)
)

fn FN_Filter_V_2e fco = (
	arV=fco.getSelection #Vertex
	if arV.numberset==0 do
	(	arV=for v=1 to arV.count collect v
		Filter_V_2e = for v  in arV where fco.GetVertexEdgeCount v == 2 collect v
		OpenE=#()
		openEdges.Check currentTime selection[1] &OpenE
		OpenVert=for e in OpenE collect fco.GetEdgeVertex e 1
			if OpenVert.count==0 then
				case classof fco of (
				Editable_Poly: fco.setSelection #Vertex (Filter_V_2e as BitArray)
				Edit_Poly: fco.Select #Vertex (Filter_V_2e as BitArray)
				)
			else
			(
				FiltOpV = #{}
				for i=1 to Filter_V_2e.count do
				for j=1 to OpenVert.count do
				if	 findItem OpenVert Filter_V_2e[i]==0 do append FiltOpV Filter_V_2e[i]
						case classof fco of (
						Editable_Poly: fco.setSelection #Vertex FiltOpV
						Edit_Poly: fco.Select #Vertex FiltOpV
						)
			)
	)
)

fn FN_FilterShape fco =(if classOf fco != Line and classOf fco != SplineShape and fco.category == #Splines then true else false)
fn FN_Pp_Vs fco =(PushPrompt ((((fco.getSelection #Vertex).numberset) as String) + " Vertex selected"))

fn FN_fixShapeXform = (
with redraw off
	(
	$.transform = rotateYmatrix 90 * $.transform
	ResetXForm $
	$.transform = rotateYmatrix 270 * $.transform
	maxOps.CollapseNodeTo $ 1 off
	)
)
---------------------------SCRIPT-----------------------------------
for obj in selection do
if obj.modifiers.count>0 == on
	then (if try(subobjectlevel==0)Catch()
				do (SuspendEditing()
				deleteModifier obj 1
				ResumeEditing())
				) 
	else (if FN_FilterShape obj then convertToSplineShape obj
			if superClassOf obj == shape and subObjectLevel==0 then FN_fixShapeXform()
			else
				if (obj.category == #Standard_Primitives or obj.category == #Extended_Primitives) \
				or ((classof obj != Editable_Poly) and subObjectLevel==0) do converttopoly obj
			)

Ar_NegSc = (for o in selection where o.scale == [-1,-1,-1] collect o)
FN_ScaleNegativeFixer Ar_NegSc

if getCommandPanelTaskMode() != #modify then max modify mode
gco = modPanel.getCurrentObject()
CASE classOf gco of
	(
Editable_poly:	case subobjectLevel of
				(
					1:	(Vs=(gco.getSelection #Vertex).numberset;	V_state1=fn_NumV gco
							if Vs>1 then
								if (gco.ConvertSelectionToBorder #Vertex #Edge
									(polyop.getEdgeSelection gco).numberset)==0
									then gco.Remove selLevel:#Vertex
									else FN_RemVertEP gco
							else
								if Vs==1 then gco.Remove selLevel:#Vertex
									else (gco.deleteIsoVerts()
												(FN_Filter_V_2e gco
												FN_Pp_Vs gco)
										)
							max select
							V_state2=fn_NumV gco
							differV=V_state1-V_state2
							if differV > 0 do PushPrompt (differV as string + " Vertex removed")
						)
					2: FN_SO_2operation gco
					3: (FN_SetVertOpen_2e gco; FN_Pp_Vs gco)
					4:	(Fs=(gco.getSelection #Face).numberset
						if Fs>0 then FN_FaceReduce gco else gco.SmGrpFloater()
						max select)
					5: (gco.SmGrpFloater(); max select)
				)
	Edit_Poly:	case subobjectLevel of
				(
				 1:	(Vs=(gco.getSelection #Vertex).numberset;	V_state1=fn_NumV gco
					 	if Vs>1 then 
		 					if (gco.ConvertSelectionToBorder #Vertex #Edge) == 0 
		 						then gco.ButtonOp #RemoveVertex
		 						else FN_RemVertEtP gco
		 					else 
		 						if Vs==1 then gco.ButtonOp #RemoveVertex
		 						else (gco.ButtonOp #RemoveIsoVerts
			 							FN_Filter_V_2e gco)
		 			max select
		 			FN_Pp_Vs gco
		 					V_state2=fn_NumV gco
							differV=V_state1-V_state2
							if differV > 0 do PushPrompt (differV as string + " Vertex removed")
	 				)
				 2:	FN_SO_2operation gco
				 3: (gco.SetSelection #Vertex #{}
				 	FN_SetVertOpen_2e gco
				 	FN_Pp_Vs gco)
				 4: (Fs=(gco.getSelection #Face).numberset
				 	if Fs>0
				 	then (FN_FaceReduce gco
				 	subobjectlevel=4)
				 	else gco.SmGrpFloater()
				 	max select)
				 5: (gco.SmGrpFloater(); max select)
				)
		Line: 	(V_state1 = numKnots $; FN_RemSpl gco; max select; V_state2=numKnots $; differV=V_state1-V_state2
				if differV > 0 do PushPrompt (differV as string + " Knots removed"))
 SplineShape:	(V_state1 = numKnots $; FN_RemSpl gco; max select; V_state2=numKnots $; differV=V_state1-V_state2
				if differV > 0 do PushPrompt (differV as string + " Knots removed"))
 Edit_Spline:  	(FN_RemSpl gco; max select)
	)
)