#!/usr/bin/python

import FreeCAD, Part, Mesh
from FreeCAD import Base
from math import hypot

doc = FreeCAD.newDocument()

mesh = Mesh.Mesh("bot.stl")
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology, 0.01)

vert = Mesh.Mesh()

epsilon = 0.001

margin = 4

z_raw = {}
for facet in mesh.Facets:
	if abs(facet.Normal.z) == 1:
		z_raw[facet.Points[0][2]] = 1
	else:
		v1 = Base.Vector(facet.Points[0])
		v2 = Base.Vector(facet.Points[1])
		v3 = Base.Vector(facet.Points[1])
		vert.addFacet(v1, v2, v3)

#
# @@@ This is perhaps a bit too paranoid
#
# I wrote the Z noise filtering because I had mis-read perfectly good
# distinct coordinates as being essentially the same value but with
# rounding errors.
#

z_levels = []
last = None
for z in sorted(z_raw.keys(), reverse = True):
	if last is None or last - z > epsilon:
		z_levels.append(z)
		last = z
#		print z
#	print facet.Normal

shape = Part.Shape()
#shape.makeShapeFromMesh(vert.Topology, 0.01)
shape.makeShapeFromMesh(mesh.Topology, 0.01)

bb = shape.BoundBox


def dist(a, b):
	pa = a.Point
	pb = b.Point
	return hypot(pa[0] - pb[0], pa[1] - pb[1])


def print_vec(v):
	p = v.Point
	print >>file, p[0], " ", p[1], " ", p[2]


file = open("bot.gp", "w")
for z in z_levels:
	print >>file, "# level z = ", z

	print >>file, bb.XMin - margin, " ", bb.YMin - margin, " ", z + epsilon
	print >>file, bb.XMax + margin, " ", bb.YMin - margin, " ", z + epsilon
	print >>file, bb.XMax + margin, " ", bb.YMax + margin, " ", z + epsilon
	print >>file, bb.XMin - margin, " ", bb.YMax + margin, " ", z + epsilon
	print >>file, bb.XMin - margin, " ", bb.YMin - margin, " ", z + epsilon
	print >>file

	for wire in shape.slice(Base.Vector(0, 0, 1), z + epsilon):
		print >>file, "# wire = ", wire
		first = None
		last = None
		for e in wire.Edges:
			v = e.Vertexes[0]
			if first is None:
				first = v
			if last is None or dist(v, last) > 0.1: #epsilon:
				print_vec(v)
			last = v
		if first is not None:
			print_vec(first)
			print >>file
	print >>file

file.close()

# wires.append(i)

#for face in shape.Faces:
#	surf = face.Surface
#	assert type(surf) == Part.Plane
#	print surf.Position.z
