summaryrefslogtreecommitdiff
path: root/export.cc
blob: 9154f4960ad13b28cb5c0b4f9140ac8b946abc06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
 *  OpenSCAD (www.openscad.at)
 *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#define INCLUDE_ABSTRACT_NODE_DETAILS

#include "openscad.h"
#include "printutils.h"
#include "MainWindow.h"

#include <QApplication>

#ifdef ENABLE_CGAL

void export_stl(CGAL_Nef_polyhedron *root_N, QString filename, QProgressDialog *pd)
{
	CGAL_Polyhedron P;
	root_N->p3.convert_to_Polyhedron(P);

	typedef CGAL_Polyhedron::Vertex                                 Vertex;
	typedef CGAL_Polyhedron::Vertex_const_iterator                  VCI;
	typedef CGAL_Polyhedron::Facet_const_iterator                   FCI;
	typedef CGAL_Polyhedron::Halfedge_around_facet_const_circulator HFCC;

	FILE *f = fopen(filename.toUtf8().data(), "w");
	if (!f) {
		PRINTA("Can't open STL file \"%1\" for STL export: %2", 
					 filename, QString(strerror(errno)));
		MainWindow::current_win = NULL;
		return;
	}
	fprintf(f, "solid\n");

	int facet_count = 0;
	for (FCI fi = P.facets_begin(); fi != P.facets_end(); ++fi) {
		HFCC hc = fi->facet_begin();
		HFCC hc_end = hc;
		Vertex v1, v2, v3;
		v1 = *VCI((hc++)->vertex());
		v3 = *VCI((hc++)->vertex());
		do {
			v2 = v3;
			v3 = *VCI((hc++)->vertex());
			double x1 = CGAL::to_double(v1.point().x());
			double y1 = CGAL::to_double(v1.point().y());
			double z1 = CGAL::to_double(v1.point().z());
			double x2 = CGAL::to_double(v2.point().x());
			double y2 = CGAL::to_double(v2.point().y());
			double z2 = CGAL::to_double(v2.point().z());
			double x3 = CGAL::to_double(v3.point().x());
			double y3 = CGAL::to_double(v3.point().y());
			double z3 = CGAL::to_double(v3.point().z());
			QString vs1, vs2, vs3;
			vs1.sprintf("%f %f %f", x1, y1, z1);
			vs2.sprintf("%f %f %f", x2, y2, z2);
			vs3.sprintf("%f %f %f", x3, y3, z3);
			if (vs1 != vs2 && vs1 != vs3 && vs2 != vs3) {
				
				double nx = (y1-y2)*(z1-z3) - (z1-z2)*(y1-y3);
				double ny = (z1-z2)*(x1-x3) - (x1-x2)*(z1-z3);
				double nz = (x1-x2)*(y1-y3) - (y1-y2)*(x1-x3);
				double n_scale = 1 / sqrt(nx*nx + ny*ny + nz*nz);
				fprintf(f, "  facet normal %f %f %f\n",
						nx * n_scale, ny * n_scale, nz * n_scale);
				fprintf(f, "    outer loop\n");
				fprintf(f, "      vertex %s\n", vs1.toAscii().data());
				fprintf(f, "      vertex %s\n", vs2.toAscii().data());
				fprintf(f, "      vertex %s\n", vs3.toAscii().data());
				fprintf(f, "    endloop\n");
				fprintf(f, "  endfacet\n");
			}
		} while (hc != hc_end);
		if (pd) {
			pd->setValue(facet_count++);
			QApplication::processEvents();
		}
	}

	fprintf(f, "endsolid\n");
	fclose(f);
}

void export_off(CGAL_Nef_polyhedron*, QString, QProgressDialog*)
{
	PRINTF("WARNING: OFF import is not implemented yet.");
}

#endif

contact: Jan Huwald // Impressum