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,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
|