siren2 0.1.2
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.
- 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,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* line.cpp
|
|
3
|
+
* Implementation of singleton methods for LINE
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include "curve.h"
|
|
7
|
+
|
|
8
|
+
VALUE sr_cLine;
|
|
9
|
+
|
|
10
|
+
SR_CURVE_GET(Line, line)
|
|
11
|
+
|
|
12
|
+
bool siren_line_install()
|
|
13
|
+
{
|
|
14
|
+
SR_CURVE_INIT(Line)
|
|
15
|
+
rb_define_method(sr_cLine, "initialize", RUBY_METHOD_FUNC(siren_curve_init), -1);
|
|
16
|
+
rb_define_method(sr_cLine, "dir", RUBY_METHOD_FUNC(siren_line_dir), -1);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
VALUE siren_line_dir(int argc, VALUE* argv, VALUE self)
|
|
21
|
+
{
|
|
22
|
+
handle<Geom_Line> line = siren_line_get(self);
|
|
23
|
+
return siren_dir_to_ary(line->Lin().Direction());
|
|
24
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* offsetcurve.cpp
|
|
3
|
+
* Implementation of singleton methods for OFFSETCURVE
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include "curve.h"
|
|
7
|
+
|
|
8
|
+
VALUE sr_cOffsetCurve;
|
|
9
|
+
|
|
10
|
+
SR_CURVE_GET(OffsetCurve, offsetcurve)
|
|
11
|
+
|
|
12
|
+
bool siren_offsetcurve_install()
|
|
13
|
+
{
|
|
14
|
+
SR_CURVE_INIT(OffsetCurve)
|
|
15
|
+
rb_define_method(sr_cOffsetCurve, "initialize", RUBY_METHOD_FUNC(siren_curve_init), -1);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parabola.cpp
|
|
3
|
+
* Implementation of singleton methods for PARABOLA
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include "curve.h"
|
|
7
|
+
|
|
8
|
+
VALUE sr_cParabola;
|
|
9
|
+
|
|
10
|
+
SR_CURVE_GET(Parabola, parabola)
|
|
11
|
+
|
|
12
|
+
bool siren_parabola_install()
|
|
13
|
+
{
|
|
14
|
+
SR_CURVE_INIT(Parabola)
|
|
15
|
+
rb_define_method(sr_cParabola, "initialize", RUBY_METHOD_FUNC(siren_curve_init), -1);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#include "filler.h"
|
|
2
|
+
|
|
3
|
+
VALUE sr_cFiller;
|
|
4
|
+
|
|
5
|
+
VALUE siren_filler_allocate(VALUE klass)
|
|
6
|
+
{
|
|
7
|
+
void* p = ruby_xmalloc(sizeof(BRepFill_Filling));
|
|
8
|
+
new(p) BRepFill_Filling();
|
|
9
|
+
return Data_Wrap_Struct(klass, NULL, siren_filler_final, p);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
BRepFill_Filling* siren_filler_get(VALUE obj)
|
|
13
|
+
{
|
|
14
|
+
BRepFill_Filling* m;
|
|
15
|
+
Data_Get_Struct(obj, BRepFill_Filling, m);
|
|
16
|
+
return m;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
bool siren_filler_install()
|
|
20
|
+
{
|
|
21
|
+
sr_cFiller = rb_define_class_under(sr_mSiren, "Filler", rb_cObject);
|
|
22
|
+
rb_define_alloc_func(sr_cFiller, siren_filler_allocate);
|
|
23
|
+
|
|
24
|
+
rb_define_method(sr_cFiller, "initialize", RUBY_METHOD_FUNC(siren_filler_init), -1);
|
|
25
|
+
rb_define_method(sr_cFiller, "add_bound", RUBY_METHOD_FUNC(siren_filler_add_bound), 2);
|
|
26
|
+
rb_define_method(sr_cFiller, "add", RUBY_METHOD_FUNC(siren_filler_add), 2);
|
|
27
|
+
rb_define_method(sr_cFiller, "build", RUBY_METHOD_FUNC(siren_filler_build), 0);
|
|
28
|
+
rb_define_method(sr_cFiller, "done?", RUBY_METHOD_FUNC(siren_filler_is_done), 0);
|
|
29
|
+
rb_define_method(sr_cFiller, "face", RUBY_METHOD_FUNC(siren_filler_face), 0);
|
|
30
|
+
rb_define_method(sr_cFiller, "g0error", RUBY_METHOD_FUNC(siren_filler_g0error), 1);
|
|
31
|
+
rb_define_method(sr_cFiller, "g1error", RUBY_METHOD_FUNC(siren_filler_g1error), 1);
|
|
32
|
+
rb_define_method(sr_cFiller, "g2error", RUBY_METHOD_FUNC(siren_filler_g2error), 1);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
VALUE
|
|
37
|
+
siren_filler_init(int argc, VALUE* argv, VALUE self)
|
|
38
|
+
{
|
|
39
|
+
VALUE degree, nbptsoncur, nbiter;
|
|
40
|
+
VALUE anisotropie;
|
|
41
|
+
VALUE tol2d, tol3d, tolang, tolcurv;
|
|
42
|
+
VALUE maxdeg, maxsegs;
|
|
43
|
+
// rb_scan_args(argc, argv, "|iiibffffii",
|
|
44
|
+
// °ree, &nbptsoncur, &nbiter, &anisotropie,
|
|
45
|
+
// &tol2d, &tol3d, &tolang, &tolcurv, &maxdeg, &maxsegs);
|
|
46
|
+
// issue: unsupports over 10 args?
|
|
47
|
+
rb_scan_args(argc, argv, "19",
|
|
48
|
+
°ree, &nbptsoncur, &nbiter, &anisotropie,
|
|
49
|
+
&tol2d, &tol3d, &tolang, &tolcurv, &maxdeg, &maxsegs);
|
|
50
|
+
|
|
51
|
+
auto p = siren_filler_get(self);
|
|
52
|
+
|
|
53
|
+
switch (argc) {
|
|
54
|
+
case 1:
|
|
55
|
+
p->SetResolParam(NUM2INT(degree));
|
|
56
|
+
break;
|
|
57
|
+
case 2:
|
|
58
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur));
|
|
59
|
+
break;
|
|
60
|
+
case 3:
|
|
61
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter));
|
|
62
|
+
break;
|
|
63
|
+
case 4:
|
|
64
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
65
|
+
break;
|
|
66
|
+
/*
|
|
67
|
+
case 5:
|
|
68
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
69
|
+
p->SetConstrParam(NUM2DBL(tol2d));
|
|
70
|
+
break;
|
|
71
|
+
case 6:
|
|
72
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
73
|
+
p->SetConstrParam(NUM2DBL(tol2d), NUM2DBL(tol3d));
|
|
74
|
+
break;
|
|
75
|
+
case 7:
|
|
76
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
77
|
+
p->SetConstrParam(NUM2DBL(tol2d), NUM2DBL(tol3d), NUM2DBL(tolang));
|
|
78
|
+
break;
|
|
79
|
+
case 8:
|
|
80
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
81
|
+
p->SetConstrParam(NUM2DBL(tol2d), NUM2DBL(tol3d), NUM2DBL(tolang), NUM2DBL(tolcurv));
|
|
82
|
+
break;
|
|
83
|
+
case 9:
|
|
84
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
85
|
+
p->SetConstrParam(NUM2DBL(tol2d), NUM2DBL(tol3d), NUM2DBL(tolang), NUM2DBL(tolcurv), NUM2INT(maxdeg));
|
|
86
|
+
break;
|
|
87
|
+
case 10:
|
|
88
|
+
p->SetResolParam(NUM2INT(degree), NUM2INT(nbptsoncur), NUM2INT(nbiter), anisotropie == Qtrue);
|
|
89
|
+
p->SetConstrParam(NUM2DBL(tol2d), NUM2DBL(tol3d), NUM2DBL(tolang), NUM2DBL(tolcurv), NUM2INT(maxdeg), NUM2INT(maxsegs));
|
|
90
|
+
break;
|
|
91
|
+
*/
|
|
92
|
+
default:
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return self;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
void siren_filler_final( void* p)
|
|
99
|
+
{
|
|
100
|
+
BRepFill_Filling* pp = static_cast<BRepFill_Filling*>(p);
|
|
101
|
+
ruby_xfree(pp);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
VALUE siren_filler_add_bound(int argc, VALUE* argv, VALUE self)
|
|
105
|
+
{
|
|
106
|
+
VALUE edge;
|
|
107
|
+
VALUE order;
|
|
108
|
+
rb_scan_args(argc, argv, "2", &edge, &order);
|
|
109
|
+
|
|
110
|
+
auto e = siren_edge_get(edge);
|
|
111
|
+
siren_filler_get(self)->Add(e, (GeomAbs_Shape)NUM2INT(order),
|
|
112
|
+
/* IsBound= */ Standard_True);
|
|
113
|
+
return Qnil;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
VALUE siren_filler_add(int argc, VALUE* argv, VALUE self)
|
|
117
|
+
{
|
|
118
|
+
VALUE obj;
|
|
119
|
+
VALUE order;
|
|
120
|
+
rb_scan_args(argc, argv, "11", &obj, &order);
|
|
121
|
+
if (order != Qnil) {
|
|
122
|
+
TopoDS_Edge e = siren_edge_get(obj);
|
|
123
|
+
siren_filler_get(self)->Add(e, (GeomAbs_Shape)NUM2INT(order),
|
|
124
|
+
/* IsBound= */ Standard_False);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
gp_Pnt pnt = siren_ary_to_pnt(obj);
|
|
128
|
+
siren_filler_get(self)->Add(pnt);
|
|
129
|
+
}
|
|
130
|
+
return Qnil;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
VALUE siren_filler_build(int argc, VALUE* argv, VALUE self)
|
|
134
|
+
{
|
|
135
|
+
siren_filler_get(self)->Build();
|
|
136
|
+
return Qnil;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
VALUE siren_filler_is_done(int argc, VALUE* argv, VALUE self)
|
|
140
|
+
{
|
|
141
|
+
return siren_filler_get(self)->IsDone() == Standard_True ?
|
|
142
|
+
Qtrue : Qfalse;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
VALUE siren_filler_face(int argc, VALUE* argv, VALUE self)
|
|
146
|
+
{
|
|
147
|
+
TopoDS_Face f = siren_filler_get(self)->Face();
|
|
148
|
+
return siren_shape_new(f);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
VALUE siren_filler_g0error(int argc, VALUE* argv, VALUE self)
|
|
152
|
+
{
|
|
153
|
+
VALUE index;
|
|
154
|
+
rb_scan_args(argc, argv, "01", &index);
|
|
155
|
+
Standard_Real value;
|
|
156
|
+
if (index != Qnil) {
|
|
157
|
+
value = siren_filler_get(self)->G0Error(NUM2INT(index));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
value = siren_filler_get(self)->G0Error();
|
|
161
|
+
}
|
|
162
|
+
return (value);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
VALUE siren_filler_g1error(int argc, VALUE* argv, VALUE self)
|
|
166
|
+
{
|
|
167
|
+
VALUE index;
|
|
168
|
+
rb_scan_args(argc, argv, "01", &index);
|
|
169
|
+
Standard_Real value;
|
|
170
|
+
if (index != Qnil) {
|
|
171
|
+
value = siren_filler_get(self)->G1Error(NUM2INT(index));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
value = siren_filler_get(self)->G1Error();
|
|
175
|
+
}
|
|
176
|
+
return (value);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
VALUE siren_filler_g2error(int argc, VALUE* argv, VALUE self)
|
|
180
|
+
{
|
|
181
|
+
VALUE index;
|
|
182
|
+
rb_scan_args(argc, argv, "01", &index);
|
|
183
|
+
Standard_Real value;
|
|
184
|
+
if (index != Qnil) {
|
|
185
|
+
value = siren_filler_get(self)->G2Error(NUM2INT(index));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
value = siren_filler_get(self)->G2Error();
|
|
189
|
+
}
|
|
190
|
+
return (value);
|
|
191
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#include "heal.h"
|
|
2
|
+
|
|
3
|
+
#ifdef SR_ENABLE_HEALING
|
|
4
|
+
|
|
5
|
+
VALUE siren_heal_outerwire(int argc, VALUE* argv, VALUE self)
|
|
6
|
+
{
|
|
7
|
+
VALUE tol = DBL2NUM(1.0e-1);
|
|
8
|
+
rb_scan_args(argc, argv, "01", &tol);
|
|
9
|
+
|
|
10
|
+
TopoDS_Shape* shape = siren_shape_get(self);
|
|
11
|
+
|
|
12
|
+
VALUE res = Qnil;
|
|
13
|
+
|
|
14
|
+
if (shape->ShapeType() == TopAbs_FACE) {
|
|
15
|
+
TopoDS_Face face = TopoDS::Face(*shape);
|
|
16
|
+
TopoDS_Wire wire = ShapeAnalysis::OuterWire(face);
|
|
17
|
+
// ShapeAnalysis_FreeBounds
|
|
18
|
+
// ::ConnectWiresToWires
|
|
19
|
+
res = siren_shape_new(wire);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
ShapeAnalysis_FreeBounds safb(*shape, NUM2DBL(tol));
|
|
23
|
+
TopoDS_Compound comp = safb.GetClosedWires();
|
|
24
|
+
res = siren_shape_new(comp);
|
|
25
|
+
}
|
|
26
|
+
return res;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
VALUE siren_heal_fix( VALUE self)
|
|
30
|
+
{
|
|
31
|
+
TopoDS_Shape* shape = siren_shape_get(self);
|
|
32
|
+
VALUE res = Qnil;
|
|
33
|
+
|
|
34
|
+
opencascade::handle<ShapeFix_Shape> sfs = new ShapeFix_Shape();
|
|
35
|
+
sfs->Init(*shape);
|
|
36
|
+
sfs->SetPrecision(1.0);
|
|
37
|
+
sfs->SetMinTolerance(1.0e-6);
|
|
38
|
+
sfs->SetMaxTolerance(1.0e-1);
|
|
39
|
+
|
|
40
|
+
switch (shape->ShapeType()) {
|
|
41
|
+
case TopAbs_SOLID:
|
|
42
|
+
sfs->FixSolidTool()->FixShellMode() = 1;
|
|
43
|
+
case TopAbs_SHELL:
|
|
44
|
+
sfs->FixShellTool()->FixFaceMode() = 1;
|
|
45
|
+
sfs->FixShellTool()->FixOrientationMode() = 1;
|
|
46
|
+
case TopAbs_FACE:
|
|
47
|
+
sfs->FixFaceTool()->FixAddNaturalBoundMode() = 1;
|
|
48
|
+
sfs->FixFaceTool()->FixIntersectingWiresMode() = 1;
|
|
49
|
+
sfs->FixFaceTool()->FixLoopWiresMode() = 1;
|
|
50
|
+
sfs->FixFaceTool()->FixOrientationMode() = 1;
|
|
51
|
+
sfs->FixFaceTool()->FixPeriodicDegeneratedMode() = 1;
|
|
52
|
+
sfs->FixFaceTool()->FixSmallAreaWireMode() = 1;
|
|
53
|
+
sfs->FixFaceTool()->FixSplitFaceMode() = 1;
|
|
54
|
+
sfs->FixFaceTool()->FixWireMode() = 1;
|
|
55
|
+
case TopAbs_WIRE:
|
|
56
|
+
//sfs->FixWireTool()->FixAddCurve3dMode() = 1;
|
|
57
|
+
//sfs->FixWireTool()->FixAddPCurveMode() = 1;
|
|
58
|
+
sfs->FixWireTool()->FixConnectedMode() = 1;
|
|
59
|
+
sfs->FixWireTool()->FixDegeneratedMode() = 1;
|
|
60
|
+
sfs->FixWireTool()->FixEdgeCurvesMode() = 1;
|
|
61
|
+
//sfs->FixWireTool()->FixGaps2dMode() = 1;
|
|
62
|
+
sfs->FixWireTool()->FixGaps3dMode() = 1;
|
|
63
|
+
sfs->FixWireTool()->FixGapsByRangesMode() = 1;
|
|
64
|
+
sfs->FixWireTool()->FixIntersectingEdgesMode() = 1;
|
|
65
|
+
sfs->FixWireTool()->FixLackingMode() = 1;
|
|
66
|
+
sfs->FixWireTool()->FixNonAdjacentIntersectingEdgesMode() = 1;
|
|
67
|
+
sfs->FixWireTool()->FixNotchedEdgesMode() = 1;
|
|
68
|
+
//sfs->FixWireTool()->FixRemoveCurve3dMode() = 1;
|
|
69
|
+
//sfs->FixWireTool()->FixRemovePCurveMode() = 1;
|
|
70
|
+
sfs->FixWireTool()->FixReorderMode() = 1;
|
|
71
|
+
//sfs->FixWireTool()->FixReversed2dMode() = 1;
|
|
72
|
+
sfs->FixWireTool()->FixSameParameterMode() = 1;
|
|
73
|
+
sfs->FixWireTool()->FixSeamMode() = 1;
|
|
74
|
+
sfs->FixWireTool()->FixSelfIntersectingEdgeMode() = 1;
|
|
75
|
+
sfs->FixWireTool()->FixSelfIntersectionMode() = 1;
|
|
76
|
+
sfs->FixWireTool()->FixShiftedMode() = 1;
|
|
77
|
+
sfs->FixWireTool()->FixSmallMode() = 1;
|
|
78
|
+
sfs->FixWireTool()->FixVertexToleranceMode() = 1;
|
|
79
|
+
default:
|
|
80
|
+
sfs->FixVertexPositionMode() = 1;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
sfs->Perform();
|
|
84
|
+
|
|
85
|
+
TopoDS_Shape fixedshape = sfs->Shape();
|
|
86
|
+
if (!fixedshape.IsNull()) {
|
|
87
|
+
res = siren_shape_new(fixedshape);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return res;
|
|
91
|
+
}
|
|
92
|
+
#endif
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#include "io/iges.h"
|
|
2
|
+
|
|
3
|
+
#ifdef SR_ENABLE_IGES
|
|
4
|
+
|
|
5
|
+
bool siren_iges_install()
|
|
6
|
+
{
|
|
7
|
+
#if 0
|
|
8
|
+
rb_define_class_method(sr_mSiren, "save_iges", RUBY_METHOD_FUNC(siren_iges_save), -1);
|
|
9
|
+
rb_define_class_method(sr_mSiren, "load_iges", RUBY_METHOD_FUNC(siren_iges_load), -1);
|
|
10
|
+
#else
|
|
11
|
+
rb_define_method (sr_mSiren, "save_iges", RUBY_METHOD_FUNC(siren_iges_save), -1);
|
|
12
|
+
rb_define_method (sr_mSiren, "load_iges", RUBY_METHOD_FUNC(siren_iges_load), -1);
|
|
13
|
+
#endif
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
VALUE siren_iges_save(int argc, VALUE* argv, VALUE self)
|
|
18
|
+
{
|
|
19
|
+
VALUE target;
|
|
20
|
+
VALUE path;
|
|
21
|
+
rb_scan_args(argc, argv, "2", &target, &path);
|
|
22
|
+
|
|
23
|
+
IGESControl_Controller::Init();
|
|
24
|
+
// IGESControl_Writer writer(Interface_Static::CVal("XSTEP.iges.unit"),
|
|
25
|
+
// Interface_Static::IVal("XSTEP.iges.writebrep.mode"));
|
|
26
|
+
IGESControl_Writer writer(Interface_Static::CVal("XSTEP.iges.unit"), 1); // the second argument "1" sets the OCCT => IGES conversion method to "BRep"
|
|
27
|
+
|
|
28
|
+
writer.AddShape(*siren_shape_get(target));
|
|
29
|
+
writer.ComputeModel();
|
|
30
|
+
|
|
31
|
+
std::ofstream fst(RSTRING_PTR(path), std::ios_base::out);
|
|
32
|
+
if (writer.Write(fst) == Standard_False) {
|
|
33
|
+
rb_raise(Qnil, "Failed to save IGES to %S.", (wchar_t*)RSTRING_PTR(path));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return Qnil;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
VALUE siren_iges_load(int argc, VALUE* argv, VALUE self)
|
|
40
|
+
{
|
|
41
|
+
VALUE path;
|
|
42
|
+
VALUE as_ary = Qfalse;
|
|
43
|
+
rb_scan_args(argc, argv, "11", &path, &as_ary);
|
|
44
|
+
|
|
45
|
+
IGESControl_Reader iges_reader;
|
|
46
|
+
int stat = iges_reader.ReadFile((Standard_CString)RSTRING_PTR(path));
|
|
47
|
+
VALUE result;
|
|
48
|
+
|
|
49
|
+
if (stat == IFSelect_RetDone) {
|
|
50
|
+
try {
|
|
51
|
+
iges_reader.TransferRoots();
|
|
52
|
+
}
|
|
53
|
+
catch (...) {
|
|
54
|
+
rb_raise(Qnil, "Failed to TransferRoots() with an IGES.");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (as_ary == Qtrue) {
|
|
58
|
+
// Return array
|
|
59
|
+
result = rb_ary_new();
|
|
60
|
+
for (int i=1; i <= iges_reader.NbShapes(); i++) {
|
|
61
|
+
try {
|
|
62
|
+
TopoDS_Shape shape = iges_reader.Shape(i);
|
|
63
|
+
VALUE mrshape = siren_shape_new(shape);
|
|
64
|
+
rb_ary_push(result, mrshape);
|
|
65
|
+
}
|
|
66
|
+
catch(...) {
|
|
67
|
+
rb_warn("Failed to get entitiy at %d.", i);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (RARRAY_LEN(result) < 1) {
|
|
71
|
+
result = Qnil;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// As one shape
|
|
76
|
+
result = siren_shape_new(iges_reader.OneShape());
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
rb_raise(Qnil, "Failed to load IGES from %S.", (wchar_t*)RSTRING_PTR(path));
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#endif
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#include "io/step.h"
|
|
2
|
+
|
|
3
|
+
#ifdef SR_ENABLE_STEP
|
|
4
|
+
|
|
5
|
+
bool siren_step_install()
|
|
6
|
+
{
|
|
7
|
+
#if 0
|
|
8
|
+
// Class method
|
|
9
|
+
rb_define_class_method(sr_mSiren, "save_step", RUBY_METHOD_FUNC(siren_step_save), -1);
|
|
10
|
+
rb_define_class_method(sr_mSiren, "load_step", RUBY_METHOD_FUNC(siren_step_load), -1);
|
|
11
|
+
#endif
|
|
12
|
+
// For mix-in
|
|
13
|
+
rb_define_method (sr_mSiren, "save_step", RUBY_METHOD_FUNC(siren_step_save), -1);
|
|
14
|
+
rb_define_method (sr_mSiren, "load_step", RUBY_METHOD_FUNC(siren_step_load), -1);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
VALUE siren_step_save(int argc, VALUE* argv, VALUE self)
|
|
19
|
+
{
|
|
20
|
+
VALUE s;
|
|
21
|
+
VALUE path;
|
|
22
|
+
rb_scan_args(argc, argv, "2", &s, &path);
|
|
23
|
+
TopoDS_Shape* shape = siren_shape_get(s);
|
|
24
|
+
STEPControl_Writer writer;
|
|
25
|
+
if (writer.Transfer(*shape, STEPControl_AsIs, Standard_True) != IFSelect_RetDone) {
|
|
26
|
+
rb_raise(Qnil, "Failed to transfer Shape to STEP entity.");
|
|
27
|
+
}
|
|
28
|
+
if (writer.Write(RSTRING_PTR(path)) != IFSelect_RetDone) {
|
|
29
|
+
rb_raise(Qnil, "Failed to write STEP to %S.", (wchar_t*)RSTRING_PTR(path));
|
|
30
|
+
}
|
|
31
|
+
return Qnil;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
VALUE siren_step_load(int argc, VALUE* argv, VALUE self)
|
|
35
|
+
{
|
|
36
|
+
VALUE path;
|
|
37
|
+
rb_scan_args(argc, argv, "1", &path);
|
|
38
|
+
STEPControl_Reader reader;
|
|
39
|
+
if (!reader.ReadFile((Standard_CString)RSTRING_PTR(path))) {
|
|
40
|
+
rb_raise(Qnil, "Failed to load STEP from %S.", (wchar_t*)RSTRING_PTR(path));
|
|
41
|
+
}
|
|
42
|
+
reader.NbRootsForTransfer();
|
|
43
|
+
reader.TransferRoots();
|
|
44
|
+
return siren_shape_new(reader.OneShape());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#endif
|