global graph = #();
global index_table = #();
global conn = #();

fn DFS v colorVal maxCall=
(
	index_table[v] = colorVal;
	nebrs = graph[v];
	if (maxCall == 0) then
		0;
	else
	(
		for v1 in nebrs do
		(
			if (index_table[v1] == -1) then
			(
				DFS v1 colorVal (maxCall-1);
			)
		) 
	)
)

fn graphConnectivity polyObj=
(
	graph = #();
	num_verts = polyop.getNumVerts polyObj;
	num_edges = polyop.getNumEdges polyObj;
	index_table = #();
	for v = 1 to num_verts do
	(
		neighList = #();
		for e = 1 to num_edges do
		(
			edge = polyOp.getEdgeVerts polyObj e;
			if (edge[1] == v)  then
				append neighList edge[2];
			else if (edge[2] == v) then
				append neighList edge[1];
		)
		append graph neighList ;
		append index_table -1;
	)
	color = 0;
	found = 1;
	do 
	(
		color = color + 1;
		DFS found color 100;
		found = 1;
		for i = found+1 to num_verts do
			if (index_table[i] == -1) then
			(
				found = i;
				break;
			)
	)while (found != 1)
	
	for i in index_table do
		print i;
	--skladanie spojnych skladowych w jedna tablice
	connections = #();
	for i = 1 to color do
	(
		newTab = #();
		append connections newTab;
	)
	
	for i=1 to index_table.count do
	(
		append connections[index_table[i]] i;
	)
	--najwieksza spojna na poczatek
	
	size_s = connections[1].count;
	index = 1;
	for i=2 to connections.count do
	(
		if (connections[i].count > size_s) then
		(
			size_s = connections[i].count;
			index = i;
 		)
	)
	
	if (index != 1) then
	(
		tmp = connections[1];
		connections[1] = connections[index];
		connections[index] = tmp;
	)
	
	return connections;	
)

fn GetMaxLength polyObj=
(
	num_edges = polyop.getNumEdges polyObj;
	maxL = 0.0;
	for e = 1 to num_edges do
	(
		edge = polyop.getEdgeVerts polyObj e;
		point1= polyop.getVert polyObj edge[1];
		point2= polyop.getVert polyObj edge[2];
		dist = point1 - point2;
		len = length dist;
		if (maxL < len) then
			maxL = len;
	)
	maxL
)

fn SaveMeshToF0GFile fileName meshName polyObj scaleP=
(
	
	num_verts = polyop.getNumVerts polyObj;
	num_edges = polyop.getNumEdges polyObj;
	out_file = createfile fileName;
	format "org: \n" to: out_file;
	format "name:%\n" meshName  to: out_file;
	format "genotype:~\n//0\n" to: out_file;
	for v = 1 to num_verts do
	(
		point =   polyop.getVert polyObj v;
		point.x = point.x * scaleP;
		point.y = point.y * scaleP;
		point.z = point.z * scaleP;
		format "p:%,%,%\n" point.x point.y point.z to:out_file;
	)
	--edge list
	for e = 1 to num_edges do
	(
		edge = polyop.getEdgeVerts polyObj e;
		e1 = edge[1]-1;
		e2 = edge[2]-1;
		format "j:%,%\n" e1 e2 to:out_file
	)
	--adding connection to unconnected parts of mesh
	conn = graphConnectivity polyObj;
	while (conn.count > 1) do
	(
		minL = 10000000.0;
		ind1 = 1;
		ind2 = 1;
		sI = 1;
		sJ = 1;
		for i=1 to conn.count-1 do
		(
		
			for j=i+1 to conn.count do
			(
				for v1 in conn[i] do
					for v2 in conn[j] do
					(
						point1 = polyop.getVert polyObj v1;
						point2 = polyop.getVert polyObj v2;
						len = length (point1 - point2);
						if (len < minL) then
						(
							minL = len;
							ind1 = v1;
							ind2 = v2;
							sI = i;
							sJ = j;
						)
					)		
			)
		)
		format "j:%,%\n" (ind1-1) (ind2-1) to:out_file
		--joining arrays
		join conn[sI] conn[sJ];
		deleteItem conn sJ;
	)
	format "~" to:out_file
	format "\ninfo:~\nsee\nhttp://www.frams.alife.pl/wiki/index.php/SolidsConverter~"to:out_file
	close out_file;
 
) 

utility MyExporter "SolidsConverter"
(
	label lab2 "Version 0.1"
	label lab3 "Select editable Polly mesh"
	label lab4	" and press export"
	button bexport "     Export    "

	
		
	on bexport pressed do
	( 
		
		if ($ == undefined) then
		(
			messagebox "Select Mesh to export and try again." title:"No mesh selected";			
		)
		else
		(
			base_obj = $.baseobject;
			if ((classof $) != Editable_Poly) then
			(
				messagebox "Selected Mesh is not Editable Poly. Convert mesh and try again." title:"Editable poly required";
			)
			else
			(
				Filename = getsavefilename caption:"Save As PlasticMesh" filename:lastfile types:"PlasticMesh (*.gen)|*.gen|All Files (*.*)|*.*|"
				if Filename != undefined  do 
				(
					
			
		
					maxLen = GetMaxLength base_obj
					print "max Length";
					print maxLen;
					scaleL = 1.8/maxLen;										
					meshName = $.name;
					SaveMeshToF0GFile fileName meshName base_obj  scaleL;
					print conn;
					
				)
			)
		)
	)
)




