messagebox("Actions are stored in Category: \"Niklit Scripts\"")
macroScript UniConnector Category:"Niklit Scripts" Tooltip:"UniConnector"
(
------------------------- Functions -------------------------
gco = modPanel.getCurrentObject()
try (Es=gco.GetSelection #Edge) catch()


fn FN_AddModiferSuit=(
if getCommandPanelTaskMode() != #modify then max modify mode
Try(Case superclassof selection[1] of
	 (	GeometryClass: modPanel.addModToSelection (Edit_Poly ()) ui:on
				Shape: modPanel.addModToSelection (Edit_Spline ()) ui:on
	 )
 	max select
	)Catch()
)

fn FN_drawLineBetweenTwoPoints pointA pointB =
(
	ss = SplineShape pos:pointA
	addNewSpline ss
	addKnot ss 1 #corner #line PointA
	addKnot ss 1 #corner #line PointB
	updateShape ss
	ss
)

fn FN_getKnots_Pos fco =(
SplCount = numSplines fco
arKnotPos=#()
for spl=1 to SplCount do
for k=1 to (getKnotSelection fco spl).count do
append arKnotPos (getKnotPoint fco spl ((getKnotSelection fco spl)[k]))
arKnotPos
)

fn FN_BridgeKnots fco =(
	if classof fco == Edit_Spline 
	then messageBox "Tool works except Edit Spline modifier" else
	(fco=$
	Knot_coords = FN_getKnots_Pos fco
	NewSpline = FN_drawLineBetweenTwoPoints Knot_coords[1] Knot_coords[2]
		(max create mode
		convertToSplineShape fco
		max modify mode
		subObjectLevel=1
		)
	addAndWeld fco NewSpline 1.0
	)
)

fn FN_ShapeConn fco=(
case subobjectlevel of (
	1: FN_BridgeKnots fco
	2:(if classof fco != Edit_Spline then fco = $
		splineOps.divide fco)
	3:(if classof fco != Edit_Spline then fco = $

		spl_index_int=(getSplineSelection fco)[1]
		splCount=numSegments fco spl_index_int
		arSpl=for i=1 to splCount collect i
		for i=1 to numSplines fco do
		setSegSelection fco i #()
		setSegSelection fco spl_index_int arSpl keep: on
		subObjectLevel=2
		splineOps.divide fco
		subObjectLevel=3)
	)
)

fn FN_TriFace fco=(
NumF1=fco.getNumFaces()
if (isKindOf fco Edit_Poly or iskindof fco Editable_Poly)
do fco.CreateFace (fco.getSelection #Vertex as array)
try(fco.Commit())Catch()
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_EdgeConnect fco =(
NumF1=fco.getNumFaces()
fco.connectEdgeSegments = 1
fco.ButtonOp #ConnectEdges
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_BridgeBorder fco =(
NumF1=fco.getNumFaces()
fco.ButtonOp #BridgeBorder
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_BridgePolygon fco =(
NumF1=fco.getNumFaces()
fco.ButtonOp #BridgePolygon
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_BridgeEdge fco =(
NumF1=fco.getNumFaces()
fco.ButtonOp #BridgeEdge
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_getViewDir =(inverse(getViewTM())).row3
fn FN_VertConnect_TroughE fco =(
arVs=(fco.getSelection #Vertex) as Array
startVertex_id=arVs[1]
endPosition_p3=fco.GetVertex arVs[2]
viewDirection_p3=FN_getViewDir()

if iskindof fco Editable_poly do
fco.cutVertices startVertex_id endPosition_p3 viewDirection_p3
if iskindof fco Edit_poly do
for i=1 to selection.count do
(fco.StartCut #Vertex startVertex_id endPosition_p3 viewDirection_p3 node: (selection as array)[i]; fco.Commit() )
)

fn FN_EdgeConnect_TroughE fco =(
arEs=(fco.getSelection #Edge) as Array
if arEs.count!=2 then () else
(
startEdge_id=arEs[1]
EndEdge_id=arEs[2]
viewDirection_p3=FN_getViewDir()

if iskindof fco Editable_poly do
(fco.cutEdges startEdge_id .5 EndEdge_id .5 viewDirection_p3
arEs=fco.getSelection #Edge
fco.setSelection #Edge arEs)
if iskindof fco Edit_poly do
		(
		arS=selection as array
		for i=1 to selection.count do
			(
			fco.setSelection #Vertex #{} node: arS[i]
			for e in arEs do fco.DivideEdge e .5 node: arS[i]; fco.Commit()
			arVs=(fco.getSelection #Vertex node: arS[i]) as Array
			startVertex_id=arVs[1]
			endPosition_p3=fco.GetVertex arVs[2] node: arS[i]
			fco.setSelection #Edge #{} node: arS[i]
			fco.StartCut #Vertex startVertex_id endPosition_p3 viewDirection_p3 node: arS[i]; fco.Commit()
			)
		)
	)
)

fn FN_FilterOpenVert fco =(
usOpenVert=(fco.getSelection #Vertex) as Array
OpenE=#()
resultType = openEdges.Check currentTime selection[1] &OpenE
allOpnVert=for e in OpenE collect fco.GetEdgeVertex e 1
FilterOpenVert = #()
	for i=1 to usOpenVert.count  do
	for j=1 to allOpnVert.count do
	if	 findItem allOpnVert usOpenVert[i]!=0 do appendIfUnique FilterOpenVert usOpenVert[i]
FilterOpenVert.count>2
)

fn FN_PostWeld fco = try (fco.weldThreshold=0.001; fco.buttonOp #WeldSelected)
catch (fco.weldVertexThreshold=0.001; fco.buttonOp #WeldVertex)

fn FN_VertConn fco =(
NumF1=fco.getNumFaces()
fco.ButtonOp #ConnectVertices
NumF2=fco.getNumFaces()
NumF1 != NumF2
)

fn FN_so1_operation fco =(
		if FN_VertConn fco==off do-- Connect Vertex
			if(
			cSys=getRefCoordSys()
			toolMode.coordsys #local
			NumF1=fco.getNumFaces()
			FN_VertConnect_TroughE fco
			setRefCoordSys cSys
			FN_PostWeld fco
			NumF2=fco.getNumFaces()
			NumF1 != NumF2
			)==off do
	if FN_FilterOpenVert fco then FN_TriFace fco -- TriFace
	max select
	)

fn FN_divide fco =(
	fco.setSelection #Edge Es
	for e in Es do fco.DivideEdge e .5; try(fco.Commit())Catch()	)

fn FN_so2_operation fco =(
		if Es.numberset == 1 then FN_divide fco else -- divide
		if FN_EdgeConnect fco == off then -- Edge Connect
		if (
			fco.SetSelection #Edge Es -- TriFace
			fco.ConvertSelection #Edge #Vertex
			Vs=fco.GetSelection #Vertex as array
			if Vs.count==3 then
				(subobjectlevel = 2
				FN_TriFace fco
				)
				else false
		)==off do if FN_BridgeEdge fco==off do (
		cSys=getRefCoordSys()
		toolMode.coordsys #local
		FN_EdgeConnect_TroughE fco
		setRefCoordSys cSys
		)
)

fn FN_so4_operation fco =(
if (fco.getSelection #Face).numberset > 1 
then if FN_BridgePolygon fco==off do (fco.ToggleCommandMode #QuickSlice)
else (try fco.tesselateBy = 1 catch fco.tessellateByFace = 1; fco.buttonop #Tessellate; max select)
)

------------------------- Script -------------------------
if (selection.count>0 and (subObjectLevel==0 or getCommandPanelTaskMode()!=#modify)) do FN_AddModiferSuit()

if iskindof gco Editable_poly or iskindof gco Edit_poly do
Case subobjectlevel of
					(
					 1: (if (gco.getSelection #Vertex).numberset==0 then try gco.ToggleCommandMode #CutVertex catch gco.ToggleCommandMode #Cut
							else 
							if (gco.getSelection #Vertex).numberset==1 then macros.run "Editable Polygon Object" "EPoly_TargetWeld"
							else FN_so1_operation gco)
					 2: (if Es.numberset == 0 then try gco.ToggleCommandMode #CutEdge catch gco.ToggleCommandMode #Cut
							else FN_so2_operation gco)
					 3: (if FN_BridgeBorder gco == off do gco.ButtonOp #Cap; max select)
					 4: (if (gco.getSelection #Face).numberset == 0 then try gco.ToggleCommandMode #CutFace catch gco.ToggleCommandMode #Cut
							else FN_so4_operation gco)
					 5: gco.ToggleCommandMode #QuickSlice
					)
if superclassof gco == shape do try (FN_ShapeConn gco; max select) catch()
)