admesh 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/ext/admesh/admesh/AUTHORS +11 -0
  3. data/ext/admesh/admesh/COPYING +339 -0
  4. data/ext/admesh/admesh/ChangeLog +143 -0
  5. data/ext/admesh/admesh/ChangeLog.old +42 -0
  6. data/ext/admesh/admesh/INSTALL +14 -0
  7. data/ext/admesh/admesh/Makefile.am +62 -0
  8. data/ext/admesh/admesh/Makefile.in +1100 -0
  9. data/ext/admesh/admesh/README.md +115 -0
  10. data/ext/admesh/admesh/aclocal.m4 +1183 -0
  11. data/ext/admesh/admesh/admesh-doc.txt +475 -0
  12. data/ext/admesh/admesh/admesh.1 +173 -0
  13. data/ext/admesh/admesh/block.stl +86 -0
  14. data/ext/admesh/admesh/compile +347 -0
  15. data/ext/admesh/admesh/config.guess +1420 -0
  16. data/ext/admesh/admesh/config.h.in +65 -0
  17. data/ext/admesh/admesh/config.sub +1798 -0
  18. data/ext/admesh/admesh/configure +14671 -0
  19. data/ext/admesh/admesh/configure.ac +90 -0
  20. data/ext/admesh/admesh/depcomp +791 -0
  21. data/ext/admesh/admesh/install-sh +527 -0
  22. data/ext/admesh/admesh/libadmesh.pc.in +11 -0
  23. data/ext/admesh/admesh/ltmain.sh +9655 -0
  24. data/ext/admesh/admesh/m4/libtool.m4 +7992 -0
  25. data/ext/admesh/admesh/m4/ltoptions.m4 +384 -0
  26. data/ext/admesh/admesh/m4/ltsugar.m4 +123 -0
  27. data/ext/admesh/admesh/m4/ltversion.m4 +23 -0
  28. data/ext/admesh/admesh/m4/lt~obsolete.m4 +98 -0
  29. data/ext/admesh/admesh/missing +215 -0
  30. data/ext/admesh/admesh/src/admesh.c +425 -0
  31. data/ext/admesh/admesh/src/connect.c +971 -0
  32. data/ext/admesh/admesh/src/normals.c +333 -0
  33. data/ext/admesh/admesh/src/shared.c +262 -0
  34. data/ext/admesh/admesh/src/stl.h +201 -0
  35. data/ext/admesh/admesh/src/stl_io.c +479 -0
  36. data/ext/admesh/admesh/src/stlinit.c +377 -0
  37. data/ext/admesh/admesh/src/util.c +557 -0
  38. data/ext/admesh/extconf.rb +14 -0
  39. data/lib/admesh.rb +40 -0
  40. metadata +84 -0
@@ -0,0 +1,201 @@
1
+ /* ADMesh -- process triangulated solid meshes
2
+ * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
3
+ * Copyright (C) 2013, 2014 several contributors, see AUTHORS
4
+ *
5
+ * This program is free software; you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation; either version 2 of the License, or
8
+ * (at your option) any later version.
9
+
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ *
19
+ * Questions, comments, suggestions, etc to
20
+ * https://github.com/admesh/admesh/issues
21
+ */
22
+
23
+ #ifndef __admesh_stl__
24
+ #define __admesh_stl__
25
+
26
+ #include <stdio.h>
27
+
28
+ #ifdef __cplusplus
29
+ extern "C" {
30
+ #endif
31
+
32
+ #define STL_MAX(A,B) ((A)>(B)? (A):(B))
33
+ #define STL_MIN(A,B) ((A)<(B)? (A):(B))
34
+ #define ABS(X) ((X) < 0 ? -(X) : (X))
35
+
36
+ #define LABEL_SIZE 80
37
+ #define NUM_FACET_SIZE 4
38
+ #define HEADER_SIZE 84
39
+ #define STL_MIN_FILE_SIZE 284
40
+ #define ASCII_LINES_PER_FACET 7
41
+ #define SIZEOF_EDGE_SORT 24
42
+
43
+ typedef struct {
44
+ float x;
45
+ float y;
46
+ float z;
47
+ } stl_vertex;
48
+
49
+ typedef struct {
50
+ float x;
51
+ float y;
52
+ float z;
53
+ } stl_normal;
54
+
55
+ typedef char stl_extra[2];
56
+
57
+ typedef struct {
58
+ stl_normal normal;
59
+ stl_vertex vertex[3];
60
+ stl_extra extra;
61
+ } stl_facet;
62
+ #define SIZEOF_STL_FACET 50
63
+
64
+ typedef enum {binary, ascii, inmemory} stl_type;
65
+
66
+ typedef struct {
67
+ stl_vertex p1;
68
+ stl_vertex p2;
69
+ int facet_number;
70
+ } stl_edge;
71
+
72
+ typedef struct stl_hash_edge {
73
+ unsigned key[6];
74
+ int facet_number;
75
+ int which_edge;
76
+ struct stl_hash_edge *next;
77
+ } stl_hash_edge;
78
+
79
+ typedef struct {
80
+ int neighbor[3];
81
+ char which_vertex_not[3];
82
+ } stl_neighbors;
83
+
84
+ typedef struct {
85
+ int vertex[3];
86
+ } v_indices_struct;
87
+
88
+ typedef struct {
89
+ char header[81];
90
+ stl_type type;
91
+ int number_of_facets;
92
+ stl_vertex max;
93
+ stl_vertex min;
94
+ stl_vertex size;
95
+ float bounding_diameter;
96
+ float shortest_edge;
97
+ float volume;
98
+ unsigned number_of_blocks;
99
+ int connected_edges;
100
+ int connected_facets_1_edge;
101
+ int connected_facets_2_edge;
102
+ int connected_facets_3_edge;
103
+ int facets_w_1_bad_edge;
104
+ int facets_w_2_bad_edge;
105
+ int facets_w_3_bad_edge;
106
+ int original_num_facets;
107
+ int edges_fixed;
108
+ int degenerate_facets;
109
+ int facets_removed;
110
+ int facets_added;
111
+ int facets_reversed;
112
+ int backwards_edges;
113
+ int normals_fixed;
114
+ int number_of_parts;
115
+ int malloced;
116
+ int freed;
117
+ int facets_malloced;
118
+ int collisions;
119
+ int shared_vertices;
120
+ int shared_malloced;
121
+ } stl_stats;
122
+
123
+ typedef struct {
124
+ FILE *fp;
125
+ stl_facet *facet_start;
126
+ stl_edge *edge_start;
127
+ stl_hash_edge **heads;
128
+ stl_hash_edge *tail;
129
+ int M;
130
+ stl_neighbors *neighbors_start;
131
+ v_indices_struct *v_indices;
132
+ stl_vertex *v_shared;
133
+ stl_stats stats;
134
+ char error;
135
+ } stl_file;
136
+
137
+
138
+ extern void stl_open(stl_file *stl, char *file);
139
+ extern void stl_close(stl_file *stl);
140
+ extern void stl_stats_out(stl_file *stl, FILE *file, char *input_file);
141
+ extern void stl_print_edges(stl_file *stl, FILE *file);
142
+ extern void stl_print_neighbors(stl_file *stl, char *file);
143
+ extern void stl_put_little_int(FILE *fp, int value_in);
144
+ extern void stl_put_little_float(FILE *fp, float value_in);
145
+ extern void stl_write_ascii(stl_file *stl, const char *file, const char *label);
146
+ extern void stl_write_binary(stl_file *stl, const char *file, const char *label);
147
+ extern void stl_write_binary_block(stl_file *stl, FILE *fp);
148
+ extern void stl_check_facets_exact(stl_file *stl);
149
+ extern void stl_check_facets_nearby(stl_file *stl, float tolerance);
150
+ extern void stl_remove_unconnected_facets(stl_file *stl);
151
+ extern void stl_write_vertex(stl_file *stl, int facet, int vertex);
152
+ extern void stl_write_facet(stl_file *stl, char *label, int facet);
153
+ extern void stl_write_edge(stl_file *stl, char *label, stl_hash_edge edge);
154
+ extern void stl_write_neighbor(stl_file *stl, int facet);
155
+ extern void stl_write_quad_object(stl_file *stl, char *file);
156
+ extern void stl_verify_neighbors(stl_file *stl);
157
+ extern void stl_fill_holes(stl_file *stl);
158
+ extern void stl_fix_normal_directions(stl_file *stl);
159
+ extern void stl_fix_normal_values(stl_file *stl);
160
+ extern void stl_reverse_all_facets(stl_file *stl);
161
+ extern void stl_translate(stl_file *stl, float x, float y, float z);
162
+ extern void stl_translate_relative(stl_file *stl, float x, float y, float z);
163
+ extern void stl_scale_versor(stl_file *stl, float versor[3]);
164
+ extern void stl_scale(stl_file *stl, float factor);
165
+ extern void stl_rotate_x(stl_file *stl, float angle);
166
+ extern void stl_rotate_y(stl_file *stl, float angle);
167
+ extern void stl_rotate_z(stl_file *stl, float angle);
168
+ extern void stl_mirror_xy(stl_file *stl);
169
+ extern void stl_mirror_yz(stl_file *stl);
170
+ extern void stl_mirror_xz(stl_file *stl);
171
+ extern void stl_open_merge(stl_file *stl, char *file);
172
+ extern void stl_invalidate_shared_vertices(stl_file *stl);
173
+ extern void stl_generate_shared_vertices(stl_file *stl);
174
+ extern void stl_write_obj(stl_file *stl, char *file);
175
+ extern void stl_write_off(stl_file *stl, char *file);
176
+ extern void stl_write_dxf(stl_file *stl, char *file, char *label);
177
+ extern void stl_write_vrml(stl_file *stl, char *file);
178
+ extern void stl_calculate_normal(float normal[], stl_facet *facet);
179
+ extern void stl_normalize_vector(float v[]);
180
+ extern void stl_calculate_volume(stl_file *stl);
181
+
182
+ extern void stl_repair(stl_file *stl, int fixall_flag, int exact_flag, int tolerance_flag, float tolerance, int increment_flag, float increment, int nearby_flag, int iterations, int remove_unconnected_flag, int fill_holes_flag, int normal_directions_flag, int normal_values_flag, int reverse_all_flag, int verbose_flag);
183
+
184
+ extern void stl_initialize(stl_file *stl);
185
+ extern void stl_count_facets(stl_file *stl, char *file);
186
+ extern void stl_allocate(stl_file *stl);
187
+ extern void stl_read(stl_file *stl, int first_facet, int first);
188
+ extern void stl_facet_stats(stl_file *stl, stl_facet facet, int first);
189
+ extern void stl_reallocate(stl_file *stl);
190
+ extern void stl_add_facet(stl_file *stl, stl_facet *new_facet);
191
+ extern void stl_get_size(stl_file *stl);
192
+
193
+ extern void stl_clear_error(stl_file *stl);
194
+ extern int stl_get_error(stl_file *stl);
195
+ extern void stl_exit_on_error(stl_file *stl);
196
+
197
+ #ifdef __cplusplus
198
+ }
199
+ #endif
200
+
201
+ #endif
@@ -0,0 +1,479 @@
1
+ /* ADMesh -- process triangulated solid meshes
2
+ * Copyright (C) 1995, 1996 Anthony D. Martin <amartin@engr.csulb.edu>
3
+ * Copyright (C) 2013, 2014 several contributors, see AUTHORS
4
+ *
5
+ * This program is free software; you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation; either version 2 of the License, or
8
+ * (at your option) any later version.
9
+
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ *
19
+ * Questions, comments, suggestions, etc to
20
+ * https://github.com/admesh/admesh/issues
21
+ */
22
+
23
+ #include <stdlib.h>
24
+ #include <string.h>
25
+ #include "stl.h"
26
+ #include "config.h"
27
+
28
+ #if !defined(SEEK_SET)
29
+ #define SEEK_SET 0
30
+ #define SEEK_CUR 1
31
+ #define SEEK_END 2
32
+ #endif
33
+
34
+ void
35
+ stl_print_edges(stl_file *stl, FILE *file) {
36
+ int i;
37
+ int edges_allocated;
38
+
39
+ if (stl->error) return;
40
+
41
+ edges_allocated = stl->stats.number_of_facets * 3;
42
+ for(i = 0; i < edges_allocated; i++) {
43
+ fprintf(file, "%d, %f, %f, %f, %f, %f, %f\n",
44
+ stl->edge_start[i].facet_number,
45
+ stl->edge_start[i].p1.x, stl->edge_start[i].p1.y,
46
+ stl->edge_start[i].p1.z, stl->edge_start[i].p2.x,
47
+ stl->edge_start[i].p2.y, stl->edge_start[i].p2.z);
48
+ }
49
+ }
50
+
51
+
52
+ void
53
+ stl_stats_out(stl_file *stl, FILE *file, char *input_file) {
54
+ if (stl->error) return;
55
+
56
+ /* this is here for Slic3r, without our config.h
57
+ it won't use this part of the code anyway */
58
+ #ifndef VERSION
59
+ #define VERSION "unknown"
60
+ #endif
61
+ fprintf(file, "\n\
62
+ ================= Results produced by ADMesh version " VERSION " ================\n");
63
+ fprintf(file, "\
64
+ Input file : %s\n", input_file);
65
+ if(stl->stats.type == binary) {
66
+ fprintf(file, "\
67
+ File type : Binary STL file\n");
68
+ } else {
69
+ fprintf(file, "\
70
+ File type : ASCII STL file\n");
71
+ }
72
+ fprintf(file, "\
73
+ Header : %s\n", stl->stats.header);
74
+ fprintf(file, "============== Size ==============\n");
75
+ fprintf(file, "Min X = % f, Max X = % f\n",
76
+ stl->stats.min.x, stl->stats.max.x);
77
+ fprintf(file, "Min Y = % f, Max Y = % f\n",
78
+ stl->stats.min.y, stl->stats.max.y);
79
+ fprintf(file, "Min Z = % f, Max Z = % f\n",
80
+ stl->stats.min.z, stl->stats.max.z);
81
+
82
+ fprintf(file, "\
83
+ ========= Facet Status ========== Original ============ Final ====\n");
84
+ fprintf(file, "\
85
+ Number of facets : %5d %5d\n",
86
+ stl->stats.original_num_facets, stl->stats.number_of_facets);
87
+ fprintf(file, "\
88
+ Facets with 1 disconnected edge : %5d %5d\n",
89
+ stl->stats.facets_w_1_bad_edge, stl->stats.connected_facets_2_edge -
90
+ stl->stats.connected_facets_3_edge);
91
+ fprintf(file, "\
92
+ Facets with 2 disconnected edges : %5d %5d\n",
93
+ stl->stats.facets_w_2_bad_edge, stl->stats.connected_facets_1_edge -
94
+ stl->stats.connected_facets_2_edge);
95
+ fprintf(file, "\
96
+ Facets with 3 disconnected edges : %5d %5d\n",
97
+ stl->stats.facets_w_3_bad_edge, stl->stats.number_of_facets -
98
+ stl->stats.connected_facets_1_edge);
99
+ fprintf(file, "\
100
+ Total disconnected facets : %5d %5d\n",
101
+ stl->stats.facets_w_1_bad_edge + stl->stats.facets_w_2_bad_edge +
102
+ stl->stats.facets_w_3_bad_edge, stl->stats.number_of_facets -
103
+ stl->stats.connected_facets_3_edge);
104
+
105
+ fprintf(file,
106
+ "=== Processing Statistics === ===== Other Statistics =====\n");
107
+ fprintf(file, "\
108
+ Number of parts : %5d Volume : % f\n",
109
+ stl->stats.number_of_parts, stl->stats.volume);
110
+ fprintf(file, "\
111
+ Degenerate facets : %5d\n", stl->stats.degenerate_facets);
112
+ fprintf(file, "\
113
+ Edges fixed : %5d\n", stl->stats.edges_fixed);
114
+ fprintf(file, "\
115
+ Facets removed : %5d\n", stl->stats.facets_removed);
116
+ fprintf(file, "\
117
+ Facets added : %5d\n", stl->stats.facets_added);
118
+ fprintf(file, "\
119
+ Facets reversed : %5d\n", stl->stats.facets_reversed);
120
+ fprintf(file, "\
121
+ Backwards edges : %5d\n", stl->stats.backwards_edges);
122
+ fprintf(file, "\
123
+ Normals fixed : %5d\n", stl->stats.normals_fixed);
124
+ }
125
+
126
+ void
127
+ stl_write_ascii(stl_file *stl, const char *file, const char *label) {
128
+ int i;
129
+ FILE *fp;
130
+ char *error_msg;
131
+
132
+ if (stl->error) return;
133
+
134
+ /* Open the file */
135
+ fp = fopen(file, "w");
136
+ if(fp == NULL) {
137
+ error_msg = (char*)
138
+ malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
139
+ sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
140
+ file);
141
+ perror(error_msg);
142
+ free(error_msg);
143
+ stl->error = 1;
144
+ return;
145
+ }
146
+
147
+ fprintf(fp, "solid %s\n", label);
148
+
149
+ for(i = 0; i < stl->stats.number_of_facets; i++) {
150
+ fprintf(fp, " facet normal % .8E % .8E % .8E\n",
151
+ stl->facet_start[i].normal.x, stl->facet_start[i].normal.y,
152
+ stl->facet_start[i].normal.z);
153
+ fprintf(fp, " outer loop\n");
154
+ fprintf(fp, " vertex % .8E % .8E % .8E\n",
155
+ stl->facet_start[i].vertex[0].x, stl->facet_start[i].vertex[0].y,
156
+ stl->facet_start[i].vertex[0].z);
157
+ fprintf(fp, " vertex % .8E % .8E % .8E\n",
158
+ stl->facet_start[i].vertex[1].x, stl->facet_start[i].vertex[1].y,
159
+ stl->facet_start[i].vertex[1].z);
160
+ fprintf(fp, " vertex % .8E % .8E % .8E\n",
161
+ stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
162
+ stl->facet_start[i].vertex[2].z);
163
+ fprintf(fp, " endloop\n");
164
+ fprintf(fp, " endfacet\n");
165
+ }
166
+
167
+ fprintf(fp, "endsolid %s\n", label);
168
+
169
+ fclose(fp);
170
+ }
171
+
172
+ void
173
+ stl_print_neighbors(stl_file *stl, char *file) {
174
+ int i;
175
+ FILE *fp;
176
+ char *error_msg;
177
+
178
+ if (stl->error) return;
179
+
180
+ /* Open the file */
181
+ fp = fopen(file, "w");
182
+ if(fp == NULL) {
183
+ error_msg = (char*)
184
+ malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
185
+ sprintf(error_msg, "stl_print_neighbors: Couldn't open %s for writing",
186
+ file);
187
+ perror(error_msg);
188
+ free(error_msg);
189
+ stl->error = 1;
190
+ return;
191
+ }
192
+
193
+ for(i = 0; i < stl->stats.number_of_facets; i++) {
194
+ fprintf(fp, "%d, %d,%d, %d,%d, %d,%d\n",
195
+ i,
196
+ stl->neighbors_start[i].neighbor[0],
197
+ (int)stl->neighbors_start[i].which_vertex_not[0],
198
+ stl->neighbors_start[i].neighbor[1],
199
+ (int)stl->neighbors_start[i].which_vertex_not[1],
200
+ stl->neighbors_start[i].neighbor[2],
201
+ (int)stl->neighbors_start[i].which_vertex_not[2]);
202
+ }
203
+ fclose(fp);
204
+ }
205
+
206
+ void
207
+ stl_put_little_int(FILE *fp, int value_in) {
208
+ int new_value;
209
+ union {
210
+ int int_value;
211
+ char char_value[4];
212
+ } value;
213
+
214
+ value.int_value = value_in;
215
+
216
+ new_value = value.char_value[0] & 0xFF;
217
+ new_value |= (value.char_value[1] & 0xFF) << 0x08;
218
+ new_value |= (value.char_value[2] & 0xFF) << 0x10;
219
+ new_value |= (value.char_value[3] & 0xFF) << 0x18;
220
+ fwrite(&new_value, sizeof(int), 1, fp);
221
+ }
222
+
223
+ void
224
+ stl_put_little_float(FILE *fp, float value_in) {
225
+ int new_value;
226
+ union {
227
+ float float_value;
228
+ char char_value[4];
229
+ } value;
230
+
231
+ value.float_value = value_in;
232
+
233
+ new_value = value.char_value[0] & 0xFF;
234
+ new_value |= (value.char_value[1] & 0xFF) << 0x08;
235
+ new_value |= (value.char_value[2] & 0xFF) << 0x10;
236
+ new_value |= (value.char_value[3] & 0xFF) << 0x18;
237
+ fwrite(&new_value, sizeof(int), 1, fp);
238
+ }
239
+
240
+ void
241
+ stl_write_binary_block(stl_file *stl, FILE *fp)
242
+ {
243
+ int i;
244
+ for(i = 0; i < stl->stats.number_of_facets; i++)
245
+ {
246
+ stl_put_little_float(fp, stl->facet_start[i].normal.x);
247
+ stl_put_little_float(fp, stl->facet_start[i].normal.y);
248
+ stl_put_little_float(fp, stl->facet_start[i].normal.z);
249
+ stl_put_little_float(fp, stl->facet_start[i].vertex[0].x);
250
+ stl_put_little_float(fp, stl->facet_start[i].vertex[0].y);
251
+ stl_put_little_float(fp, stl->facet_start[i].vertex[0].z);
252
+ stl_put_little_float(fp, stl->facet_start[i].vertex[1].x);
253
+ stl_put_little_float(fp, stl->facet_start[i].vertex[1].y);
254
+ stl_put_little_float(fp, stl->facet_start[i].vertex[1].z);
255
+ stl_put_little_float(fp, stl->facet_start[i].vertex[2].x);
256
+ stl_put_little_float(fp, stl->facet_start[i].vertex[2].y);
257
+ stl_put_little_float(fp, stl->facet_start[i].vertex[2].z);
258
+ fputc(stl->facet_start[i].extra[0], fp);
259
+ fputc(stl->facet_start[i].extra[1], fp);
260
+ }
261
+ }
262
+
263
+ void
264
+ stl_write_binary(stl_file *stl, const char *file, const char *label) {
265
+ FILE *fp;
266
+ int i;
267
+ char *error_msg;
268
+
269
+ if (stl->error) return;
270
+
271
+ /* Open the file */
272
+ fp = fopen(file, "w");
273
+ if(fp == NULL) {
274
+ error_msg = (char*)
275
+ malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
276
+ sprintf(error_msg, "stl_write_binary: Couldn't open %s for writing",
277
+ file);
278
+ perror(error_msg);
279
+ free(error_msg);
280
+ stl->error = 1;
281
+ return;
282
+ }
283
+
284
+ fprintf(fp, "%s", label);
285
+ for(i = strlen(label); i < LABEL_SIZE; i++) putc(0, fp);
286
+
287
+ fseek(fp, LABEL_SIZE, SEEK_SET);
288
+
289
+ stl_put_little_int(fp, stl->stats.number_of_facets);
290
+
291
+ stl_write_binary_block(stl, fp);
292
+
293
+ fclose(fp);
294
+ }
295
+
296
+ void
297
+ stl_write_vertex(stl_file *stl, int facet, int vertex) {
298
+ if (stl->error) return;
299
+ printf(" vertex %d/%d % .8E % .8E % .8E\n", vertex, facet,
300
+ stl->facet_start[facet].vertex[vertex].x,
301
+ stl->facet_start[facet].vertex[vertex].y,
302
+ stl->facet_start[facet].vertex[vertex].z);
303
+ }
304
+
305
+ void
306
+ stl_write_facet(stl_file *stl, char *label, int facet) {
307
+ if (stl->error) return;
308
+ printf("facet (%d)/ %s\n", facet, label);
309
+ stl_write_vertex(stl, facet, 0);
310
+ stl_write_vertex(stl, facet, 1);
311
+ stl_write_vertex(stl, facet, 2);
312
+ }
313
+
314
+ void
315
+ stl_write_edge(stl_file *stl, char *label, stl_hash_edge edge) {
316
+ if (stl->error) return;
317
+ printf("edge (%d)/(%d) %s\n", edge.facet_number, edge.which_edge, label);
318
+ if(edge.which_edge < 3) {
319
+ stl_write_vertex(stl, edge.facet_number, edge.which_edge % 3);
320
+ stl_write_vertex(stl, edge.facet_number, (edge.which_edge + 1) % 3);
321
+ } else {
322
+ stl_write_vertex(stl, edge.facet_number, (edge.which_edge + 1) % 3);
323
+ stl_write_vertex(stl, edge.facet_number, edge.which_edge % 3);
324
+ }
325
+ }
326
+
327
+ void
328
+ stl_write_neighbor(stl_file *stl, int facet) {
329
+ if (stl->error) return;
330
+ printf("Neighbors %d: %d, %d, %d ; %d, %d, %d\n", facet,
331
+ stl->neighbors_start[facet].neighbor[0],
332
+ stl->neighbors_start[facet].neighbor[1],
333
+ stl->neighbors_start[facet].neighbor[2],
334
+ stl->neighbors_start[facet].which_vertex_not[0],
335
+ stl->neighbors_start[facet].which_vertex_not[1],
336
+ stl->neighbors_start[facet].which_vertex_not[2]);
337
+ }
338
+
339
+ void
340
+ stl_write_quad_object(stl_file *stl, char *file) {
341
+ FILE *fp;
342
+ int i;
343
+ int j;
344
+ char *error_msg;
345
+ stl_vertex connect_color;
346
+ stl_vertex uncon_1_color;
347
+ stl_vertex uncon_2_color;
348
+ stl_vertex uncon_3_color;
349
+ stl_vertex color;
350
+
351
+ if (stl->error) return;
352
+
353
+ /* Open the file */
354
+ fp = fopen(file, "w");
355
+ if(fp == NULL) {
356
+ error_msg = (char*)
357
+ malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
358
+ sprintf(error_msg, "stl_write_quad_object: Couldn't open %s for writing",
359
+ file);
360
+ perror(error_msg);
361
+ free(error_msg);
362
+ stl->error = 1;
363
+ return;
364
+ }
365
+
366
+ connect_color.x = 0.0;
367
+ connect_color.y = 0.0;
368
+ connect_color.z = 1.0;
369
+ uncon_1_color.x = 0.0;
370
+ uncon_1_color.y = 1.0;
371
+ uncon_1_color.z = 0.0;
372
+ uncon_2_color.x = 1.0;
373
+ uncon_2_color.y = 1.0;
374
+ uncon_2_color.z = 1.0;
375
+ uncon_3_color.x = 1.0;
376
+ uncon_3_color.y = 0.0;
377
+ uncon_3_color.z = 0.0;
378
+
379
+ fprintf(fp, "CQUAD\n");
380
+ for(i = 0; i < stl->stats.number_of_facets; i++) {
381
+ j = ((stl->neighbors_start[i].neighbor[0] == -1) +
382
+ (stl->neighbors_start[i].neighbor[1] == -1) +
383
+ (stl->neighbors_start[i].neighbor[2] == -1));
384
+ if(j == 0) {
385
+ color = connect_color;
386
+ } else if(j == 1) {
387
+ color = uncon_1_color;
388
+ } else if(j == 2) {
389
+ color = uncon_2_color;
390
+ } else {
391
+ color = uncon_3_color;
392
+ }
393
+ fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
394
+ stl->facet_start[i].vertex[0].x,
395
+ stl->facet_start[i].vertex[0].y,
396
+ stl->facet_start[i].vertex[0].z, color.x, color.y, color.z);
397
+ fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
398
+ stl->facet_start[i].vertex[1].x,
399
+ stl->facet_start[i].vertex[1].y,
400
+ stl->facet_start[i].vertex[1].z, color.x, color.y, color.z);
401
+ fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
402
+ stl->facet_start[i].vertex[2].x,
403
+ stl->facet_start[i].vertex[2].y,
404
+ stl->facet_start[i].vertex[2].z, color.x, color.y, color.z);
405
+ fprintf(fp, "%f %f %f %1.1f %1.1f %1.1f 1\n",
406
+ stl->facet_start[i].vertex[2].x,
407
+ stl->facet_start[i].vertex[2].y,
408
+ stl->facet_start[i].vertex[2].z, color.x, color.y, color.z);
409
+ }
410
+ fclose(fp);
411
+ }
412
+
413
+ void
414
+ stl_write_dxf(stl_file *stl, char *file, char *label) {
415
+ int i;
416
+ FILE *fp;
417
+ char *error_msg;
418
+
419
+ if (stl->error) return;
420
+
421
+ /* Open the file */
422
+ fp = fopen(file, "w");
423
+ if(fp == NULL) {
424
+ error_msg = (char*)
425
+ malloc(81 + strlen(file)); /* Allow 80 chars+file size for message */
426
+ sprintf(error_msg, "stl_write_ascii: Couldn't open %s for writing",
427
+ file);
428
+ perror(error_msg);
429
+ free(error_msg);
430
+ stl->error = 1;
431
+ return;
432
+ }
433
+
434
+ fprintf(fp, "999\n%s\n", label);
435
+ fprintf(fp, "0\nSECTION\n2\nHEADER\n0\nENDSEC\n");
436
+ fprintf(fp, "0\nSECTION\n2\nTABLES\n0\nTABLE\n2\nLAYER\n70\n1\n\
437
+ 0\nLAYER\n2\n0\n70\n0\n62\n7\n6\nCONTINUOUS\n0\nENDTAB\n0\nENDSEC\n");
438
+ fprintf(fp, "0\nSECTION\n2\nBLOCKS\n0\nENDSEC\n");
439
+
440
+ fprintf(fp, "0\nSECTION\n2\nENTITIES\n");
441
+
442
+ for(i = 0; i < stl->stats.number_of_facets; i++) {
443
+ fprintf(fp, "0\n3DFACE\n8\n0\n");
444
+ fprintf(fp, "10\n%f\n20\n%f\n30\n%f\n",
445
+ stl->facet_start[i].vertex[0].x, stl->facet_start[i].vertex[0].y,
446
+ stl->facet_start[i].vertex[0].z);
447
+ fprintf(fp, "11\n%f\n21\n%f\n31\n%f\n",
448
+ stl->facet_start[i].vertex[1].x, stl->facet_start[i].vertex[1].y,
449
+ stl->facet_start[i].vertex[1].z);
450
+ fprintf(fp, "12\n%f\n22\n%f\n32\n%f\n",
451
+ stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
452
+ stl->facet_start[i].vertex[2].z);
453
+ fprintf(fp, "13\n%f\n23\n%f\n33\n%f\n",
454
+ stl->facet_start[i].vertex[2].x, stl->facet_start[i].vertex[2].y,
455
+ stl->facet_start[i].vertex[2].z);
456
+ }
457
+
458
+ fprintf(fp, "0\nENDSEC\n0\nEOF\n");
459
+
460
+ fclose(fp);
461
+ }
462
+
463
+ void
464
+ stl_clear_error(stl_file *stl) {
465
+ stl->error = 0;
466
+ }
467
+
468
+ void
469
+ stl_exit_on_error(stl_file *stl) {
470
+ if (!stl->error) return;
471
+ stl->error = 0;
472
+ stl_close(stl);
473
+ exit(1);
474
+ }
475
+
476
+ int
477
+ stl_get_error(stl_file *stl) {
478
+ return stl->error;
479
+ }