siren2 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +36 -0
- data/Rakefile +18 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/siren2/extconf.rb +66 -0
- data/ext/siren2/inc/bndbox.h +51 -0
- data/ext/siren2/inc/bo.h +20 -0
- data/ext/siren2/inc/brep.h +17 -0
- data/ext/siren2/inc/common.h +98 -0
- data/ext/siren2/inc/curve.h +65 -0
- data/ext/siren2/inc/curve/bscurve.h +22 -0
- data/ext/siren2/inc/curve/bzcurve.h +17 -0
- data/ext/siren2/inc/curve/circle.h +29 -0
- data/ext/siren2/inc/curve/ellipse.h +15 -0
- data/ext/siren2/inc/curve/hyperbola.h +15 -0
- data/ext/siren2/inc/curve/line.h +17 -0
- data/ext/siren2/inc/curve/offsetcurve.h +15 -0
- data/ext/siren2/inc/curve/parabola.h +15 -0
- data/ext/siren2/inc/filler.h +26 -0
- data/ext/siren2/inc/heal.h +19 -0
- data/ext/siren2/inc/io/iges.h +19 -0
- data/ext/siren2/inc/io/step.h +18 -0
- data/ext/siren2/inc/io/stl.h +13 -0
- data/ext/siren2/inc/offset.h +35 -0
- data/ext/siren2/inc/shape.h +140 -0
- data/ext/siren2/inc/shape/chunk.h +26 -0
- data/ext/siren2/inc/shape/compound.h +22 -0
- data/ext/siren2/inc/shape/edge.h +50 -0
- data/ext/siren2/inc/shape/face.h +67 -0
- data/ext/siren2/inc/shape/shell.h +21 -0
- data/ext/siren2/inc/shape/solid.h +41 -0
- data/ext/siren2/inc/shape/vertex.h +23 -0
- data/ext/siren2/inc/shape/wire.h +31 -0
- data/ext/siren2/inc/siren.h +39 -0
- data/ext/siren2/inc/surface/dummy +0 -0
- data/ext/siren2/inc/topalgo.h +52 -0
- data/ext/siren2/inc/trans.h +48 -0
- data/ext/siren2/inc/vec.h +65 -0
- data/ext/siren2/src/bndbox.cpp +343 -0
- data/ext/siren2/src/bo.cpp +66 -0
- data/ext/siren2/src/brep.cpp +69 -0
- data/ext/siren2/src/common.cpp +18 -0
- data/ext/siren2/src/curve.cpp +75 -0
- data/ext/siren2/src/curve/bscurve.cpp +118 -0
- data/ext/siren2/src/curve/bzcurve.cpp +55 -0
- data/ext/siren2/src/curve/circle.cpp +146 -0
- data/ext/siren2/src/curve/ellipse.cpp +17 -0
- data/ext/siren2/src/curve/hyperbola.cpp +17 -0
- data/ext/siren2/src/curve/line.cpp +24 -0
- data/ext/siren2/src/curve/offsetcurve.cpp +17 -0
- data/ext/siren2/src/curve/parabola.cpp +17 -0
- data/ext/siren2/src/filler.cpp +191 -0
- data/ext/siren2/src/heal.cpp +92 -0
- data/ext/siren2/src/io/iges.cpp +85 -0
- data/ext/siren2/src/io/step.cpp +47 -0
- data/ext/siren2/src/io/stl.cpp +22 -0
- data/ext/siren2/src/offset.cpp +256 -0
- data/ext/siren2/src/shape.cpp +617 -0
- data/ext/siren2/src/shape/chunk.cpp +65 -0
- data/ext/siren2/src/shape/compound.cpp +96 -0
- data/ext/siren2/src/shape/edge.cpp +254 -0
- data/ext/siren2/src/shape/face.cpp +366 -0
- data/ext/siren2/src/shape/shell.cpp +41 -0
- data/ext/siren2/src/shape/solid.cpp +256 -0
- data/ext/siren2/src/shape/vertex.cpp +68 -0
- data/ext/siren2/src/shape/wire.cpp +100 -0
- data/ext/siren2/src/siren.cpp +80 -0
- data/ext/siren2/src/surface/dummy +0 -0
- data/ext/siren2/src/topalgo.cpp +246 -0
- data/ext/siren2/src/trans.cpp +330 -0
- data/ext/siren2/src/vec.cpp +454 -0
- data/lib/io/dxf.rb +68 -0
- data/lib/io/plot.rb +38 -0
- data/lib/io/ply.rb +57 -0
- data/lib/io/stl.rb +35 -0
- data/lib/io/svg.rb +44 -0
- data/lib/kernel/array.rb +133 -0
- data/lib/kernel/float.rb +15 -0
- data/lib/shape.rb +157 -0
- data/lib/shape/compound.rb +11 -0
- data/lib/shape/edge.rb +15 -0
- data/lib/shape/face.rb +7 -0
- data/lib/shape/shell.rb +21 -0
- data/lib/shape/solid.rb +10 -0
- data/lib/shape/vertex.rb +7 -0
- data/lib/shape/wire.rb +14 -0
- data/lib/shapes.rb +52 -0
- data/lib/siren.rb +166 -0
- data/lib/siren2/version.rb +3 -0
- data/lib/vec.rb +81 -0
- data/siren2.gemspec +28 -0
- metadata +195 -0
@@ -0,0 +1,343 @@
|
|
1
|
+
#include "bndbox.h"
|
2
|
+
|
3
|
+
VALUE sr_cBndBox;
|
4
|
+
|
5
|
+
Bnd_Box* siren_bndbox_get(VALUE obj)
|
6
|
+
{
|
7
|
+
Bnd_Box* m;
|
8
|
+
Data_Get_Struct(obj, Bnd_Box, m);
|
9
|
+
return m;
|
10
|
+
}
|
11
|
+
|
12
|
+
static VALUE siren_bndbox_allocate(VALUE klass)
|
13
|
+
{
|
14
|
+
void* p = ruby_xmalloc(sizeof(Bnd_Box));
|
15
|
+
new(p) Bnd_Box();
|
16
|
+
return Data_Wrap_Struct(klass, NULL, siren_bndbox_final, p);
|
17
|
+
}
|
18
|
+
|
19
|
+
bool siren_bndbox_install()
|
20
|
+
{
|
21
|
+
sr_cBndBox = rb_define_class_under(sr_mSiren, "BndBox", rb_cObject);
|
22
|
+
rb_define_alloc_func(sr_cBndBox, siren_bndbox_allocate);
|
23
|
+
rb_define_method(sr_cBndBox, "initialize", RUBY_METHOD_FUNC(siren_bndbox_init), -1);
|
24
|
+
rb_define_method(sr_cBndBox, "inspect", RUBY_METHOD_FUNC(siren_bndbox_to_s), -1);
|
25
|
+
rb_define_method(sr_cBndBox, "to_s", RUBY_METHOD_FUNC(siren_bndbox_to_s), -1);
|
26
|
+
rb_define_method(sr_cBndBox, "min", RUBY_METHOD_FUNC(siren_bndbox_min), -1);
|
27
|
+
rb_define_method(sr_cBndBox, "max", RUBY_METHOD_FUNC(siren_bndbox_max), -1);
|
28
|
+
rb_define_method(sr_cBndBox, "add", RUBY_METHOD_FUNC(siren_bndbox_add), -1);
|
29
|
+
rb_define_method(sr_cBndBox, "out?", RUBY_METHOD_FUNC(siren_bndbox_is_out), -1);
|
30
|
+
rb_define_method(sr_cBndBox, "center", RUBY_METHOD_FUNC(siren_bndbox_center), -1);
|
31
|
+
rb_define_method(sr_cBndBox, "xsize", RUBY_METHOD_FUNC(siren_bndbox_xsize), -1);
|
32
|
+
rb_define_method(sr_cBndBox, "ysize", RUBY_METHOD_FUNC(siren_bndbox_ysize), -1);
|
33
|
+
rb_define_method(sr_cBndBox, "zsize", RUBY_METHOD_FUNC(siren_bndbox_zsize), -1);
|
34
|
+
rb_define_method(sr_cBndBox, "void?", RUBY_METHOD_FUNC(siren_bndbox_is_void), -1);
|
35
|
+
rb_define_method(sr_cBndBox, "whole?", RUBY_METHOD_FUNC(siren_bndbox_is_whole), -1);
|
36
|
+
rb_define_method(sr_cBndBox, "void!", RUBY_METHOD_FUNC(siren_bndbox_void_bang), -1);
|
37
|
+
rb_define_method(sr_cBndBox, "whole!", RUBY_METHOD_FUNC(siren_bndbox_whole_bang), -1);
|
38
|
+
rb_define_method(sr_cBndBox, "xthin?", RUBY_METHOD_FUNC(siren_bndbox_is_xthin), -1);
|
39
|
+
rb_define_method(sr_cBndBox, "ythin?", RUBY_METHOD_FUNC(siren_bndbox_is_ythin), -1);
|
40
|
+
rb_define_method(sr_cBndBox, "zthin?", RUBY_METHOD_FUNC(siren_bndbox_is_zthin), -1);
|
41
|
+
rb_define_method(sr_cBndBox, "openxmin?", RUBY_METHOD_FUNC(siren_bndbox_is_openxmin), -1);
|
42
|
+
rb_define_method(sr_cBndBox, "openxmax?", RUBY_METHOD_FUNC(siren_bndbox_is_openxmax), -1);
|
43
|
+
rb_define_method(sr_cBndBox, "openymin?", RUBY_METHOD_FUNC(siren_bndbox_is_openymin), -1);
|
44
|
+
rb_define_method(sr_cBndBox, "openymax?", RUBY_METHOD_FUNC(siren_bndbox_is_openymax), -1);
|
45
|
+
rb_define_method(sr_cBndBox, "openzmin?", RUBY_METHOD_FUNC(siren_bndbox_is_openzmin), -1);
|
46
|
+
rb_define_method(sr_cBndBox, "openzmax?", RUBY_METHOD_FUNC(siren_bndbox_is_openzmax), -1);
|
47
|
+
rb_define_method(sr_cBndBox, "openxmin!", RUBY_METHOD_FUNC(siren_bndbox_openxmin_bang), -1);
|
48
|
+
rb_define_method(sr_cBndBox, "openxmax!", RUBY_METHOD_FUNC(siren_bndbox_openxmax_bang), -1);
|
49
|
+
rb_define_method(sr_cBndBox, "openymin!", RUBY_METHOD_FUNC(siren_bndbox_openymin_bang), -1);
|
50
|
+
rb_define_method(sr_cBndBox, "openymax!", RUBY_METHOD_FUNC(siren_bndbox_openymax_bang), -1);
|
51
|
+
rb_define_method(sr_cBndBox, "openzmin!", RUBY_METHOD_FUNC(siren_bndbox_openzmin_bang), -1);
|
52
|
+
rb_define_method(sr_cBndBox, "openzmax!", RUBY_METHOD_FUNC(siren_bndbox_openzmax_bang), -1);
|
53
|
+
rb_define_method(sr_cBndBox, "gap", RUBY_METHOD_FUNC(siren_bndbox_get_gap), -1);
|
54
|
+
rb_define_method(sr_cBndBox, "gap=", RUBY_METHOD_FUNC(siren_bndbox_set_gap), -1);
|
55
|
+
rb_define_method(sr_cBndBox, "dist", RUBY_METHOD_FUNC(siren_bndbox_dist), -1);
|
56
|
+
rb_define_method(sr_cBndBox, "square", RUBY_METHOD_FUNC(siren_bndbox_square), -1);
|
57
|
+
return true;
|
58
|
+
}
|
59
|
+
|
60
|
+
VALUE siren_bndbox_init(int argc, VALUE* argv, VALUE self)
|
61
|
+
{
|
62
|
+
return self;
|
63
|
+
}
|
64
|
+
|
65
|
+
void siren_bndbox_final(void* p)
|
66
|
+
{
|
67
|
+
Bnd_Box* pp = static_cast<Bnd_Box*>(p);
|
68
|
+
ruby_xfree(pp);
|
69
|
+
}
|
70
|
+
|
71
|
+
VALUE siren_bndbox_to_s(int argc, VALUE* argv, VALUE self)
|
72
|
+
{
|
73
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
74
|
+
char str[128];
|
75
|
+
if (b->IsVoid()) {
|
76
|
+
snprintf(str, sizeof(str), "#<BndBox:0x%x (void)>", -1 /* (unsigned int)(uintptr_t)rb_cptr(self) */);
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
Standard_Real xmin, ymin, zmin, xmax, ymax, zmax;
|
80
|
+
b->Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
81
|
+
const int s = 16;
|
82
|
+
char sxmin[s]; char sxmax[s];
|
83
|
+
char symin[s]; char symax[s];
|
84
|
+
char szmin[s]; char szmax[s];
|
85
|
+
b->IsOpenXmin() ? snprintf(sxmin, s, "%s", "inf") : snprintf(sxmin, s, "%f", xmin);
|
86
|
+
b->IsOpenXmax() ? snprintf(sxmax, s, "%s", "inf") : snprintf(sxmax, s, "%f", xmax);
|
87
|
+
b->IsOpenYmin() ? snprintf(symin, s, "%s", "inf") : snprintf(symin, s, "%f", ymin);
|
88
|
+
b->IsOpenYmax() ? snprintf(symax, s, "%s", "inf") : snprintf(symax, s, "%f", ymax);
|
89
|
+
b->IsOpenZmin() ? snprintf(szmin, s, "%s", "inf") : snprintf(szmin, s, "%f", zmin);
|
90
|
+
b->IsOpenZmax() ? snprintf(szmax, s, "%s", "inf") : snprintf(szmax, s, "%f", zmax);
|
91
|
+
snprintf(str, sizeof(str),
|
92
|
+
"#<BndBox:0x%x xmin=%s, ymin=%s, zmin=%s, xmax=%s, ymax=%s, zmax=%s>",
|
93
|
+
-1,
|
94
|
+
// (unsigned int)(uintptr_t)rb_cptr(self),
|
95
|
+
sxmin, symin, szmin, sxmax, symax, szmax);
|
96
|
+
}
|
97
|
+
return rb_str_new_cstr(str);
|
98
|
+
}
|
99
|
+
|
100
|
+
VALUE siren_bndbox_min(int argc, VALUE* argv, VALUE self)
|
101
|
+
{
|
102
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
103
|
+
if (b->IsVoid()) {
|
104
|
+
return Qnil;
|
105
|
+
}
|
106
|
+
return siren_pnt_to_ary(b->CornerMin());
|
107
|
+
}
|
108
|
+
|
109
|
+
VALUE siren_bndbox_max(int argc, VALUE* argv, VALUE self)
|
110
|
+
{
|
111
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
112
|
+
if (b->IsVoid()) {
|
113
|
+
return Qnil;
|
114
|
+
}
|
115
|
+
return siren_pnt_to_ary(b->CornerMax());
|
116
|
+
}
|
117
|
+
|
118
|
+
VALUE siren_bndbox_add(int argc, VALUE* argv, VALUE self)
|
119
|
+
{
|
120
|
+
VALUE obj;
|
121
|
+
rb_scan_args(argc, argv, "1", &obj);
|
122
|
+
|
123
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
124
|
+
|
125
|
+
/*
|
126
|
+
if (siren_is_shape(obj)) {
|
127
|
+
TopoDS_Shape* s = siren_shape_get(obj);
|
128
|
+
BRepBndLib::Add(*s, *b);
|
129
|
+
}
|
130
|
+
else if (siren_is_bndbox(obj)) {
|
131
|
+
*/
|
132
|
+
Bnd_Box* bb = siren_bndbox_get(obj);
|
133
|
+
b->Add(*bb);
|
134
|
+
/*
|
135
|
+
}
|
136
|
+
else if (RB_TYPE_P(obj, T_ARRAY)) {
|
137
|
+
b->Add(siren_ary_to_pnt(obj));
|
138
|
+
}
|
139
|
+
*/
|
140
|
+
|
141
|
+
return Qnil;
|
142
|
+
}
|
143
|
+
|
144
|
+
VALUE siren_bndbox_is_out(int argc, VALUE* argv, VALUE self)
|
145
|
+
{
|
146
|
+
VALUE other;
|
147
|
+
rb_scan_args(argc, argv, "1", &other);
|
148
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
149
|
+
return b->IsOut(*siren_bndbox_get(other)) == Standard_True ? Qtrue : Qfalse;
|
150
|
+
}
|
151
|
+
|
152
|
+
VALUE siren_bndbox_center(int argc, VALUE* argv, VALUE self)
|
153
|
+
{
|
154
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
155
|
+
if (b->IsVoid()) {
|
156
|
+
return Qnil;
|
157
|
+
}
|
158
|
+
Standard_Real xmin, ymin, zmin;
|
159
|
+
Standard_Real xmax, ymax, zmax;
|
160
|
+
b->Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
161
|
+
return siren_pnt_new((xmax - xmin) / 2.0, (ymax - ymin) / 2.0, (zmax - zmin) / 2.0);
|
162
|
+
}
|
163
|
+
|
164
|
+
VALUE siren_bndbox_xsize(int argc, VALUE* argv, VALUE self)
|
165
|
+
{
|
166
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
167
|
+
if (b->IsVoid()) {
|
168
|
+
return Qnil;
|
169
|
+
}
|
170
|
+
Standard_Real xmin, ymin, zmin;
|
171
|
+
Standard_Real xmax, ymax, zmax;
|
172
|
+
b->Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
173
|
+
return DBL2NUM(xmax - xmin);
|
174
|
+
}
|
175
|
+
|
176
|
+
VALUE siren_bndbox_ysize(int argc, VALUE* argv, VALUE self)
|
177
|
+
{
|
178
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
179
|
+
if (b->IsVoid()) {
|
180
|
+
return Qnil;
|
181
|
+
}
|
182
|
+
Standard_Real xmin, ymin, zmin;
|
183
|
+
Standard_Real xmax, ymax, zmax;
|
184
|
+
b->Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
185
|
+
return DBL2NUM(ymax - ymin);
|
186
|
+
}
|
187
|
+
|
188
|
+
VALUE siren_bndbox_zsize(int argc, VALUE* argv, VALUE self)
|
189
|
+
{
|
190
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
191
|
+
if (b->IsVoid()) {
|
192
|
+
return Qnil;
|
193
|
+
}
|
194
|
+
Standard_Real xmin, ymin, zmin;
|
195
|
+
Standard_Real xmax, ymax, zmax;
|
196
|
+
b->Get(xmin, ymin, zmin, xmax, ymax, zmax);
|
197
|
+
return DBL2NUM(zmax - zmin);
|
198
|
+
}
|
199
|
+
|
200
|
+
VALUE siren_bndbox_is_void(int argc, VALUE* argv, VALUE self)
|
201
|
+
{
|
202
|
+
return siren_bndbox_get(self)->IsVoid() ? Qtrue : Qfalse;
|
203
|
+
}
|
204
|
+
|
205
|
+
VALUE siren_bndbox_is_whole(int argc, VALUE* argv, VALUE self)
|
206
|
+
{
|
207
|
+
return siren_bndbox_get(self)->IsWhole() ? Qtrue : Qfalse;
|
208
|
+
}
|
209
|
+
|
210
|
+
VALUE siren_bndbox_void_bang(int argc, VALUE* argv, VALUE self)
|
211
|
+
{
|
212
|
+
siren_bndbox_get(self)->SetVoid();
|
213
|
+
return Qnil;
|
214
|
+
}
|
215
|
+
|
216
|
+
VALUE siren_bndbox_whole_bang(int argc, VALUE* argv, VALUE self)
|
217
|
+
{
|
218
|
+
siren_bndbox_get(self)->SetWhole();
|
219
|
+
return Qnil;
|
220
|
+
}
|
221
|
+
|
222
|
+
VALUE siren_bndbox_is_xthin(int argc, VALUE* argv, VALUE self)
|
223
|
+
{
|
224
|
+
VALUE tol;
|
225
|
+
rb_scan_args(argc, argv, "01", &tol);
|
226
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
227
|
+
return b->IsXThin(argc ? tol : 0.0) ? Qtrue : Qfalse;
|
228
|
+
}
|
229
|
+
|
230
|
+
VALUE siren_bndbox_is_ythin(int argc, VALUE* argv, VALUE self)
|
231
|
+
{
|
232
|
+
VALUE tol;
|
233
|
+
rb_scan_args(argc, argv, "01", &tol);
|
234
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
235
|
+
return b->IsYThin(argc ? tol : 0.0) ? Qtrue : Qfalse;
|
236
|
+
}
|
237
|
+
|
238
|
+
VALUE siren_bndbox_is_zthin(int argc, VALUE* argv, VALUE self)
|
239
|
+
{
|
240
|
+
VALUE tol;
|
241
|
+
rb_scan_args(argc, argv, "01", &tol);
|
242
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
243
|
+
return b->IsZThin(argc ? tol : 0.0) ? Qtrue : Qfalse;
|
244
|
+
}
|
245
|
+
|
246
|
+
VALUE siren_bndbox_is_openxmin(int argc, VALUE* argv, VALUE self)
|
247
|
+
{
|
248
|
+
return siren_bndbox_get(self)->IsOpenXmin() ? Qtrue : Qfalse;
|
249
|
+
}
|
250
|
+
|
251
|
+
VALUE siren_bndbox_is_openxmax(int argc, VALUE* argv, VALUE self)
|
252
|
+
{
|
253
|
+
return siren_bndbox_get(self)->IsOpenXmax() ? Qtrue : Qfalse;
|
254
|
+
}
|
255
|
+
|
256
|
+
VALUE siren_bndbox_is_openymin(int argc, VALUE* argv, VALUE self)
|
257
|
+
{
|
258
|
+
return siren_bndbox_get(self)->IsOpenYmin() ? Qtrue : Qfalse;
|
259
|
+
}
|
260
|
+
|
261
|
+
VALUE siren_bndbox_is_openymax(int argc, VALUE* argv, VALUE self)
|
262
|
+
{
|
263
|
+
return siren_bndbox_get(self)->IsOpenYmax() ? Qtrue : Qfalse;
|
264
|
+
}
|
265
|
+
|
266
|
+
VALUE siren_bndbox_is_openzmin(int argc, VALUE* argv, VALUE self)
|
267
|
+
{
|
268
|
+
return siren_bndbox_get(self)->IsOpenZmin() ? Qtrue : Qfalse;
|
269
|
+
}
|
270
|
+
|
271
|
+
VALUE siren_bndbox_is_openzmax(int argc, VALUE* argv, VALUE self)
|
272
|
+
{
|
273
|
+
return siren_bndbox_get(self)->IsOpenZmax() ? Qtrue : Qfalse;
|
274
|
+
}
|
275
|
+
|
276
|
+
VALUE siren_bndbox_openxmin_bang(int argc, VALUE* argv, VALUE self)
|
277
|
+
{
|
278
|
+
siren_bndbox_get(self)->OpenXmin();
|
279
|
+
return Qnil;
|
280
|
+
}
|
281
|
+
|
282
|
+
VALUE siren_bndbox_openxmax_bang(int argc, VALUE* argv, VALUE self)
|
283
|
+
{
|
284
|
+
siren_bndbox_get(self)->OpenXmax();
|
285
|
+
return Qnil;
|
286
|
+
}
|
287
|
+
|
288
|
+
VALUE siren_bndbox_openymin_bang(int argc, VALUE* argv, VALUE self)
|
289
|
+
{
|
290
|
+
siren_bndbox_get(self)->OpenYmin();
|
291
|
+
return Qnil;
|
292
|
+
}
|
293
|
+
|
294
|
+
VALUE siren_bndbox_openymax_bang(int argc, VALUE* argv, VALUE self)
|
295
|
+
{
|
296
|
+
siren_bndbox_get(self)->OpenYmax();
|
297
|
+
return Qnil;
|
298
|
+
}
|
299
|
+
|
300
|
+
VALUE siren_bndbox_openzmin_bang(int argc, VALUE* argv, VALUE self)
|
301
|
+
{
|
302
|
+
siren_bndbox_get(self)->OpenZmin();
|
303
|
+
return Qnil;
|
304
|
+
}
|
305
|
+
|
306
|
+
VALUE siren_bndbox_openzmax_bang(int argc, VALUE* argv, VALUE self)
|
307
|
+
{
|
308
|
+
siren_bndbox_get(self)->OpenZmax();
|
309
|
+
return Qnil;
|
310
|
+
}
|
311
|
+
|
312
|
+
VALUE siren_bndbox_set_gap(int argc, VALUE* argv, VALUE self)
|
313
|
+
{
|
314
|
+
VALUE tol;
|
315
|
+
rb_scan_args(argc, argv, "1", &tol);
|
316
|
+
siren_bndbox_get(self)->SetGap(tol);
|
317
|
+
return Qnil;
|
318
|
+
}
|
319
|
+
|
320
|
+
VALUE siren_bndbox_get_gap(int argc, VALUE* argv, VALUE self)
|
321
|
+
{
|
322
|
+
Standard_Real tol = siren_bndbox_get(self)->GetGap();
|
323
|
+
return DBL2NUM(tol);
|
324
|
+
}
|
325
|
+
|
326
|
+
VALUE siren_bndbox_dist(int argc, VALUE* argv, VALUE self)
|
327
|
+
{
|
328
|
+
VALUE other;
|
329
|
+
rb_scan_args(argc, argv, "1", &other);
|
330
|
+
Bnd_Box* b = siren_bndbox_get(self);
|
331
|
+
Bnd_Box* bb= siren_bndbox_get(other);
|
332
|
+
if (b->IsVoid() || bb->IsVoid()) {
|
333
|
+
return Qnil;
|
334
|
+
}
|
335
|
+
Standard_Real value = b->Distance(*bb);
|
336
|
+
return DBL2NUM(value);
|
337
|
+
}
|
338
|
+
|
339
|
+
VALUE siren_bndbox_square(int argc, VALUE* argv, VALUE self)
|
340
|
+
{
|
341
|
+
Standard_Real value = siren_bndbox_get(self)->SquareExtent();
|
342
|
+
return DBL2NUM(value);
|
343
|
+
}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#include "bo.h"
|
2
|
+
|
3
|
+
bool siren_bo_install()
|
4
|
+
{
|
5
|
+
rb_define_method(sr_cShape, "common", RUBY_METHOD_FUNC(siren_bo_common), -1);
|
6
|
+
rb_define_method(sr_cShape, "fuse", RUBY_METHOD_FUNC(siren_bo_fuse), -1);
|
7
|
+
rb_define_method(sr_cShape, "cut", RUBY_METHOD_FUNC(siren_bo_cut), -1);
|
8
|
+
rb_define_method(sr_cShape, "projwire", RUBY_METHOD_FUNC(siren_bo_projwire), -2);
|
9
|
+
return true;
|
10
|
+
}
|
11
|
+
|
12
|
+
VALUE siren_bo_common(int argc, VALUE* argv, VALUE self)
|
13
|
+
{
|
14
|
+
VALUE target;
|
15
|
+
rb_scan_args(argc, argv, "1", &target);
|
16
|
+
TopoDS_Shape* S1 = siren_shape_get(self);
|
17
|
+
TopoDS_Shape* S2 = siren_shape_get(target);
|
18
|
+
BRepAlgoAPI_Common api(*S1, *S2);
|
19
|
+
api.Build();
|
20
|
+
if (api.ErrorStatus()) {
|
21
|
+
return Qnil;
|
22
|
+
}
|
23
|
+
return siren_shape_new(api.Shape());
|
24
|
+
}
|
25
|
+
|
26
|
+
VALUE siren_bo_fuse(int argc, VALUE* argv, VALUE self)
|
27
|
+
{
|
28
|
+
VALUE target;
|
29
|
+
rb_scan_args(argc, argv, "1", &target);
|
30
|
+
TopoDS_Shape* S1 = siren_shape_get(self);
|
31
|
+
TopoDS_Shape* S2 = siren_shape_get(target);
|
32
|
+
BRepAlgoAPI_Fuse api(*S1, *S2);
|
33
|
+
api.Build();
|
34
|
+
if (api.ErrorStatus()) {
|
35
|
+
return Qnil;
|
36
|
+
}
|
37
|
+
return siren_shape_new(api.Shape());
|
38
|
+
}
|
39
|
+
|
40
|
+
VALUE siren_bo_cut(int argc, VALUE* argv, VALUE self)
|
41
|
+
{
|
42
|
+
VALUE target;
|
43
|
+
rb_scan_args(argc, argv, "1", &target);
|
44
|
+
TopoDS_Shape* S1 = siren_shape_get(self);
|
45
|
+
TopoDS_Shape* S2 = siren_shape_get(target);
|
46
|
+
BRepAlgoAPI_Cut api(*S1, *S2);
|
47
|
+
api.Build();
|
48
|
+
if (api.ErrorStatus()) {
|
49
|
+
return Qnil;
|
50
|
+
}
|
51
|
+
return siren_shape_new(api.Shape());
|
52
|
+
}
|
53
|
+
|
54
|
+
VALUE siren_bo_projwire(int argc, VALUE* argv, VALUE self)
|
55
|
+
{
|
56
|
+
VALUE w, v;
|
57
|
+
rb_scan_args(argc, argv, "2", &w, &v);
|
58
|
+
TopoDS_Shape* wire = siren_shape_get(w);
|
59
|
+
TopoDS_Shape* shape = siren_shape_get(self);
|
60
|
+
gp_Vec* vec = siren_vec_get(v);
|
61
|
+
BRepProj_Projection api(*wire, *shape, *vec);
|
62
|
+
if (!api.IsDone()) {
|
63
|
+
return Qnil;
|
64
|
+
}
|
65
|
+
return siren_shape_new(api.Shape());
|
66
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#include "brep.h"
|
2
|
+
|
3
|
+
bool siren_brep_install()
|
4
|
+
{
|
5
|
+
#if 0
|
6
|
+
// Class method
|
7
|
+
rb_define_class_method(sr_mSiren, "save_brep", RUBY_METHOD_FUNC(siren_brep_save), MRB_ARGS_REQ(2));
|
8
|
+
rb_define_class_method(sr_mSiren, "load_brep", RUBY_METHOD_FUNC(siren_brep_load), MRB_ARGS_REQ(1));
|
9
|
+
rb_define_class_method(sr_mSiren, "dump", RUBY_METHOD_FUNC(siren_brep_dump), MRB_ARGS_REQ(1));
|
10
|
+
#endif
|
11
|
+
// For mix-in
|
12
|
+
rb_define_method(sr_mSiren, "save_brep", RUBY_METHOD_FUNC(siren_brep_save), -1);
|
13
|
+
rb_define_method(sr_mSiren, "load_brep", RUBY_METHOD_FUNC(siren_brep_load), -1);
|
14
|
+
rb_define_method(sr_cShape, "dump", RUBY_METHOD_FUNC(siren_brep_dump), -1);
|
15
|
+
return true;
|
16
|
+
}
|
17
|
+
|
18
|
+
VALUE siren_brep_save(int argc, VALUE* argv, VALUE self)
|
19
|
+
{
|
20
|
+
VALUE target;
|
21
|
+
VALUE path;
|
22
|
+
rb_scan_args(argc, argv, "2", &target, &path);
|
23
|
+
siren_shape_check(target);
|
24
|
+
Check_Type(path, T_STRING);
|
25
|
+
if (NUM2INT(rb_funcall(path, rb_intern("size"), 0)) == 0) {
|
26
|
+
rb_raise(rb_eArgError, "Specified path has no charactors.");
|
27
|
+
}
|
28
|
+
TopoDS_Shape* shape = siren_shape_get(target);
|
29
|
+
try {
|
30
|
+
std::ofstream fst(RSTRING_PTR(path), std::ios_base::out);
|
31
|
+
if (fst.good()) {
|
32
|
+
BRepTools::Write(*shape, fst);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
catch (...) {
|
36
|
+
rb_raise(rb_eIOError, "Failed to save BRep to %s.", RSTRING_PTR(path));
|
37
|
+
}
|
38
|
+
return Qnil;
|
39
|
+
}
|
40
|
+
|
41
|
+
VALUE siren_brep_load(int argc, VALUE* argv, VALUE self)
|
42
|
+
{
|
43
|
+
VALUE path;
|
44
|
+
rb_scan_args(argc, argv, "1", &path);
|
45
|
+
Check_Type(path, T_STRING);
|
46
|
+
if (rb_funcall(rb_cFile, rb_intern("exist?"), 1, path) == Qfalse) {
|
47
|
+
rb_raise(rb_eIOError, "No such file at %s.", RSTRING_PTR(path));
|
48
|
+
}
|
49
|
+
BRep_Builder B;
|
50
|
+
TopoDS_Shape shape;
|
51
|
+
try {
|
52
|
+
std::ifstream fst(RSTRING_PTR(path), std::ios_base::in);
|
53
|
+
if (fst.good()) {
|
54
|
+
BRepTools::Read(shape, fst, B);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
catch (...) {
|
58
|
+
rb_raise(rb_eIOError, "Failed to load BRep from %s.", RSTRING_PTR(path));
|
59
|
+
}
|
60
|
+
return siren_shape_new(shape);
|
61
|
+
}
|
62
|
+
|
63
|
+
VALUE siren_brep_dump(int argc, VALUE* argv, VALUE self)
|
64
|
+
{
|
65
|
+
VALUE target;
|
66
|
+
TopoDS_Shape* shape = siren_shape_get(self);
|
67
|
+
BRepTools::Dump(*shape, std::cout);
|
68
|
+
return Qnil;
|
69
|
+
}
|