siren2 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +21 -0
  6. data/README.md +36 -0
  7. data/Rakefile +18 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/ext/siren2/extconf.rb +66 -0
  11. data/ext/siren2/inc/bndbox.h +51 -0
  12. data/ext/siren2/inc/bo.h +20 -0
  13. data/ext/siren2/inc/brep.h +17 -0
  14. data/ext/siren2/inc/common.h +98 -0
  15. data/ext/siren2/inc/curve.h +65 -0
  16. data/ext/siren2/inc/curve/bscurve.h +22 -0
  17. data/ext/siren2/inc/curve/bzcurve.h +17 -0
  18. data/ext/siren2/inc/curve/circle.h +29 -0
  19. data/ext/siren2/inc/curve/ellipse.h +15 -0
  20. data/ext/siren2/inc/curve/hyperbola.h +15 -0
  21. data/ext/siren2/inc/curve/line.h +17 -0
  22. data/ext/siren2/inc/curve/offsetcurve.h +15 -0
  23. data/ext/siren2/inc/curve/parabola.h +15 -0
  24. data/ext/siren2/inc/filler.h +26 -0
  25. data/ext/siren2/inc/heal.h +19 -0
  26. data/ext/siren2/inc/io/iges.h +19 -0
  27. data/ext/siren2/inc/io/step.h +18 -0
  28. data/ext/siren2/inc/io/stl.h +13 -0
  29. data/ext/siren2/inc/offset.h +35 -0
  30. data/ext/siren2/inc/shape.h +140 -0
  31. data/ext/siren2/inc/shape/chunk.h +26 -0
  32. data/ext/siren2/inc/shape/compound.h +22 -0
  33. data/ext/siren2/inc/shape/edge.h +50 -0
  34. data/ext/siren2/inc/shape/face.h +67 -0
  35. data/ext/siren2/inc/shape/shell.h +21 -0
  36. data/ext/siren2/inc/shape/solid.h +41 -0
  37. data/ext/siren2/inc/shape/vertex.h +23 -0
  38. data/ext/siren2/inc/shape/wire.h +31 -0
  39. data/ext/siren2/inc/siren.h +39 -0
  40. data/ext/siren2/inc/surface/dummy +0 -0
  41. data/ext/siren2/inc/topalgo.h +52 -0
  42. data/ext/siren2/inc/trans.h +48 -0
  43. data/ext/siren2/inc/vec.h +65 -0
  44. data/ext/siren2/src/bndbox.cpp +343 -0
  45. data/ext/siren2/src/bo.cpp +66 -0
  46. data/ext/siren2/src/brep.cpp +69 -0
  47. data/ext/siren2/src/common.cpp +18 -0
  48. data/ext/siren2/src/curve.cpp +75 -0
  49. data/ext/siren2/src/curve/bscurve.cpp +118 -0
  50. data/ext/siren2/src/curve/bzcurve.cpp +55 -0
  51. data/ext/siren2/src/curve/circle.cpp +146 -0
  52. data/ext/siren2/src/curve/ellipse.cpp +17 -0
  53. data/ext/siren2/src/curve/hyperbola.cpp +17 -0
  54. data/ext/siren2/src/curve/line.cpp +24 -0
  55. data/ext/siren2/src/curve/offsetcurve.cpp +17 -0
  56. data/ext/siren2/src/curve/parabola.cpp +17 -0
  57. data/ext/siren2/src/filler.cpp +191 -0
  58. data/ext/siren2/src/heal.cpp +92 -0
  59. data/ext/siren2/src/io/iges.cpp +85 -0
  60. data/ext/siren2/src/io/step.cpp +47 -0
  61. data/ext/siren2/src/io/stl.cpp +22 -0
  62. data/ext/siren2/src/offset.cpp +256 -0
  63. data/ext/siren2/src/shape.cpp +617 -0
  64. data/ext/siren2/src/shape/chunk.cpp +65 -0
  65. data/ext/siren2/src/shape/compound.cpp +96 -0
  66. data/ext/siren2/src/shape/edge.cpp +254 -0
  67. data/ext/siren2/src/shape/face.cpp +366 -0
  68. data/ext/siren2/src/shape/shell.cpp +41 -0
  69. data/ext/siren2/src/shape/solid.cpp +256 -0
  70. data/ext/siren2/src/shape/vertex.cpp +68 -0
  71. data/ext/siren2/src/shape/wire.cpp +100 -0
  72. data/ext/siren2/src/siren.cpp +80 -0
  73. data/ext/siren2/src/surface/dummy +0 -0
  74. data/ext/siren2/src/topalgo.cpp +246 -0
  75. data/ext/siren2/src/trans.cpp +330 -0
  76. data/ext/siren2/src/vec.cpp +454 -0
  77. data/lib/io/dxf.rb +68 -0
  78. data/lib/io/plot.rb +38 -0
  79. data/lib/io/ply.rb +57 -0
  80. data/lib/io/stl.rb +35 -0
  81. data/lib/io/svg.rb +44 -0
  82. data/lib/kernel/array.rb +133 -0
  83. data/lib/kernel/float.rb +15 -0
  84. data/lib/shape.rb +157 -0
  85. data/lib/shape/compound.rb +11 -0
  86. data/lib/shape/edge.rb +15 -0
  87. data/lib/shape/face.rb +7 -0
  88. data/lib/shape/shell.rb +21 -0
  89. data/lib/shape/solid.rb +10 -0
  90. data/lib/shape/vertex.rb +7 -0
  91. data/lib/shape/wire.rb +14 -0
  92. data/lib/shapes.rb +52 -0
  93. data/lib/siren.rb +166 -0
  94. data/lib/siren2/version.rb +3 -0
  95. data/lib/vec.rb +81 -0
  96. data/siren2.gemspec +28 -0
  97. 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
+ // &degree, &nbptsoncur, &nbiter, &anisotropie,
45
+ // &tol2d, &tol3d, &tolang, &tolcurv, &maxdeg, &maxsegs);
46
+ // issue: unsupports over 10 args?
47
+ rb_scan_args(argc, argv, "19",
48
+ &degree, &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