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,80 @@
1
+ #include "siren.h"
2
+
3
+ #include "vec.h"
4
+ #include "trans.h"
5
+ #include "bndbox.h"
6
+ #include "shape.h"
7
+ #include "brep.h"
8
+ #include "topalgo.h"
9
+ #include "curve.h"
10
+ #include "filler.h"
11
+
12
+ #ifdef SR_ENABLE_BO
13
+ #include "bo.h"
14
+ #endif
15
+
16
+ #ifdef SR_ENABLE_SHHEALING
17
+ #include "heal.h"
18
+ #endif
19
+
20
+ #ifdef SR_ENABLE_OFFSET
21
+ #include "offset.h"
22
+ #endif
23
+
24
+ #ifdef SR_ENABLE_IGES
25
+ #include "io/iges.h"
26
+ #endif
27
+
28
+ #ifdef SR_ENABLE_STL
29
+ #include "io/stl.h"
30
+ #endif
31
+
32
+ #ifdef SR_ENABLE_STEP
33
+ #include "io/step.h"
34
+ #endif
35
+
36
+ VALUE sr_mSiren;
37
+
38
+ extern "C" {
39
+
40
+ // initializer
41
+ void Init_siren2()
42
+ {
43
+ // Siren module
44
+ sr_mSiren = rb_define_module("Siren");
45
+
46
+ // Class
47
+ siren_vec_install ();
48
+ siren_trans_install ();
49
+ siren_bndbox_install ();
50
+ siren_shape_install ();
51
+ siren_curve_install ();
52
+ siren_topalgo_install();
53
+ siren_brep_install ();
54
+ siren_filler_install ();
55
+ #ifdef SR_ENABLE_OFFSET
56
+ siren_offset_install ();
57
+ #endif
58
+ #ifdef SR_ENABLE_BO
59
+ siren_bo_install ();
60
+ #endif
61
+ #ifdef SR_ENABLE_IGES
62
+ siren_iges_install ();
63
+ #endif
64
+ #ifdef SR_ENABLE_STL
65
+ siren_stl_install ();
66
+ #endif
67
+ #ifdef SR_ENABLE_STEP
68
+ siren_step_install ();
69
+ #endif
70
+
71
+ return;
72
+ }
73
+
74
+ // finalizer
75
+ void rb_mruby_siren_gem_final()
76
+ {
77
+ return;
78
+ }
79
+
80
+ } // extern "C" {
File without changes
@@ -0,0 +1,246 @@
1
+ #include "topalgo.h"
2
+
3
+ bool siren_topalgo_install()
4
+ {
5
+ // Class method
6
+ #if 0
7
+ rb_define_class_method(sr_mSiren, "copy", RUBY_METHOD_FUNC(siren_topalgo_copy), -1);
8
+ rb_define_class_method(sr_mSiren, "line", RUBY_METHOD_FUNC(siren_topalgo_line), -1);
9
+ rb_define_class_method(sr_mSiren, "infline", RUBY_METHOD_FUNC(siren_topalgo_infline), -1);
10
+ rb_define_class_method(sr_mSiren, "polyline", RUBY_METHOD_FUNC(siren_topalgo_polyline), -1);
11
+ rb_define_class_method(sr_mSiren, "interpolate",RUBY_METHOD_FUNC(siren_topalgo_interpolate), -1);
12
+ rb_define_class_method(sr_mSiren, "arc", RUBY_METHOD_FUNC(siren_topalgo_arc), -1);
13
+ rb_define_class_method(sr_mSiren, "arc3p", RUBY_METHOD_FUNC(siren_topalgo_arc3p), -1);
14
+ rb_define_class_method(sr_mSiren, "circle", RUBY_METHOD_FUNC(siren_topalgo_circle), -1);
15
+ rb_define_class_method(sr_mSiren, "circle3p", RUBY_METHOD_FUNC(siren_topalgo_circle3p), -1);
16
+ #endif
17
+ // For mix-in
18
+ rb_define_method(sr_mSiren, "copy", RUBY_METHOD_FUNC(siren_topalgo_copy), -1);
19
+ rb_define_method(sr_mSiren, "line", RUBY_METHOD_FUNC(siren_topalgo_line), -1);
20
+ rb_define_method(sr_mSiren, "infline", RUBY_METHOD_FUNC(siren_topalgo_infline), -1);
21
+ rb_define_method(sr_mSiren, "polyline", RUBY_METHOD_FUNC(siren_topalgo_polyline), -1);
22
+ rb_define_method(sr_mSiren, "interpolate", RUBY_METHOD_FUNC(siren_topalgo_interpolate), -1);
23
+ rb_define_method(sr_mSiren, "arc", RUBY_METHOD_FUNC(siren_topalgo_arc), -1);
24
+ rb_define_method(sr_mSiren, "arc3p", RUBY_METHOD_FUNC(siren_topalgo_arc3p), -1);
25
+ rb_define_method(sr_mSiren, "circle", RUBY_METHOD_FUNC(siren_topalgo_circle), -1);
26
+ rb_define_method(sr_mSiren, "circle3p", RUBY_METHOD_FUNC(siren_topalgo_circle3p), -1);
27
+ rb_define_method(sr_cShape, "cog", RUBY_METHOD_FUNC(siren_topalgo_cog), -1);
28
+ rb_define_method(sr_cShape, "area", RUBY_METHOD_FUNC(siren_topalgo_area), -1);
29
+ rb_define_method(sr_cShape, "volume", RUBY_METHOD_FUNC(siren_topalgo_volume), -1);
30
+
31
+ return true;
32
+ }
33
+
34
+ VALUE siren_topalgo_copy(int argc, VALUE* argv, VALUE self)
35
+ {
36
+ VALUE target;
37
+ VALUE copy_geom = Standard_True;
38
+
39
+ rb_scan_args(argc, argv, "11", &target, &copy_geom);
40
+
41
+ TopoDS_Shape* src = siren_shape_get(target);
42
+ TopoDS_Shape res = BRepBuilderAPI_Copy(*src, (Standard_Boolean)copy_geom);
43
+ return siren_shape_new(res);
44
+ }
45
+
46
+ VALUE siren_topalgo_line(int argc, VALUE* argv, VALUE self)
47
+ {
48
+ VALUE sp, tp;
49
+ rb_scan_args(argc, argv, "02", &sp, &tp);
50
+ gp_Pnt S(0., 0., 0.);
51
+ gp_Pnt T(1., 1., 1.);
52
+ if (argc > 0) {
53
+ S = siren_ary_to_pnt(sp);
54
+ }
55
+ if (argc > 1) {
56
+ T = siren_ary_to_pnt(tp);
57
+ }
58
+ Standard_Real linear_tolerance = 1.0e-7;
59
+ if (S.IsEqual(T, linear_tolerance)) {
60
+ rb_raise(Qnil,
61
+ "Specified terminal point same as the start point.");
62
+ }
63
+ TopoDS_Shape shape = BRepBuilderAPI_MakeEdge(S, T);
64
+ return siren_shape_new(shape);
65
+ }
66
+
67
+ VALUE siren_topalgo_infline(int argc, VALUE* argv, VALUE self)
68
+ {
69
+ VALUE orig, dir;
70
+ rb_scan_args(argc, argv, "02", &orig, &dir);
71
+ gp_Pnt p(0., 0., 0.);
72
+ gp_Dir d(1., 0., 0.);
73
+ if (argc > 0) {
74
+ p = siren_ary_to_pnt(orig);
75
+ }
76
+ if (argc > 1) {
77
+ d = siren_ary_to_dir(dir);
78
+ }
79
+ TopoDS_Shape shape = BRepBuilderAPI_MakeEdge(gp_Lin(p, d));
80
+ return siren_shape_new(shape);
81
+ }
82
+
83
+ VALUE siren_topalgo_polyline(int argc, VALUE* argv, VALUE self)
84
+ {
85
+ VALUE ary;
86
+ rb_scan_args(argc, argv, "1", &ary);
87
+ BRepBuilderAPI_MakePolygon poly;
88
+ for (int i = 0; i < RARRAY_LEN(ary); i++) {
89
+ poly.Add(siren_ary_to_pnt(RARRAY_AREF(ary, i)));
90
+ }
91
+ TopoDS_Shape shape = poly.Wire();
92
+ return siren_shape_new(shape);
93
+ }
94
+
95
+ VALUE siren_topalgo_interpolate(int argc, VALUE* argv, VALUE self)
96
+ {
97
+ VALUE pts, vecs;
98
+ rb_scan_args(argc, argv, "11", &pts, &vecs);
99
+
100
+ int psize = RARRAY_LEN(pts);
101
+ opencascade::handle<TColgp_HArray1OfPnt> pary = new TColgp_HArray1OfPnt(1, psize);
102
+ for (int i=0; i<psize; i++) {
103
+ pary->SetValue(i+1, siren_ary_to_pnt(RARRAY_AREF(pts, i)));
104
+ }
105
+
106
+ try {
107
+ Standard_Real tolerance = 1.0e-7;
108
+ Standard_Boolean periodic_flag = Standard_False;
109
+
110
+ // Raise exception when got pary has same points.
111
+ GeomAPI_Interpolate intp(pary, periodic_flag, tolerance);
112
+
113
+ if (argc == 2) {
114
+ TColgp_Array1OfVec vec(1, psize);
115
+ opencascade::handle<TColStd_HArray1OfBoolean> use = new TColStd_HArray1OfBoolean(1, psize);
116
+
117
+ for (int i=0; i<psize; i++) {
118
+ VALUE avec = RARRAY_AREF(vecs, i);
119
+ if (NIL_P(avec)) {
120
+ use->SetValue(i+1, Standard_False);
121
+ }
122
+ else {
123
+ vec.SetValue(i+1, siren_ary_to_vec(avec));
124
+ use->SetValue(i+1, Standard_True);
125
+ }
126
+ }
127
+ intp.Load(vec, use, Standard_True);
128
+ }
129
+
130
+ intp.Perform();
131
+ if (!intp.IsDone()) {
132
+ rb_raise(Qnil, "Failed to make a curve.");
133
+ }
134
+
135
+ opencascade::handle<Geom_BSplineCurve> geSpl = intp.Curve();
136
+ if (geSpl.IsNull()) {
137
+ rb_raise(Qnil, "Failed to make a curve.");
138
+ }
139
+
140
+ TopoDS_Shape shape = BRepBuilderAPI_MakeEdge(geSpl);
141
+ return siren_shape_new(shape);
142
+ }
143
+ catch (...) {
144
+ rb_raise(Qnil, "Failed to make a curve. Incorrect points specified.");
145
+ }
146
+ return Qnil;
147
+ }
148
+
149
+ VALUE siren_topalgo_arc(int argc, VALUE* argv, VALUE self)
150
+ {
151
+ VALUE orig, dir, vx;
152
+ VALUE r, start_ang, term_ang;
153
+ rb_scan_args(argc, argv, "6", &orig, &dir, &vx, &r, &start_ang, &term_ang);
154
+ gp_Circ circle = gp_Circ(gp_Ax2(siren_ary_to_pnt(orig), siren_ary_to_dir(dir), siren_ary_to_dir(vx)), NUM2DBL(r));
155
+ opencascade::handle<Geom_TrimmedCurve> gc = GC_MakeArcOfCircle(circle, NUM2DBL(start_ang), NUM2DBL(term_ang), Standard_True);
156
+ if (gc.IsNull()) {
157
+ rb_raise(Qnil, "Failed to make a curve.");
158
+ return Qnil;
159
+ }
160
+ else {
161
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gc);
162
+ return siren_shape_new(E);
163
+ }
164
+ }
165
+
166
+ VALUE siren_topalgo_arc3p(int argc, VALUE* argv, VALUE self)
167
+ {
168
+ VALUE p1, p2, p3;
169
+ rb_scan_args(argc, argv, "3", &p1, &p2, &p3);
170
+ opencascade::handle<Geom_TrimmedCurve> gc = GC_MakeArcOfCircle(
171
+ siren_ary_to_pnt(p1),
172
+ siren_ary_to_pnt(p2),
173
+ siren_ary_to_pnt(p3));
174
+ if (gc.IsNull()) {
175
+ rb_raise(Qnil, "Failed to make a curve.");
176
+ return Qnil;
177
+ }
178
+ else {
179
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gc);
180
+ return siren_shape_new(E);
181
+ }
182
+ }
183
+
184
+ VALUE siren_topalgo_circle(int argc, VALUE* argv, VALUE self)
185
+ {
186
+ VALUE orig, dir;
187
+ VALUE r;
188
+ rb_scan_args(argc, argv, "3", &orig, &dir, &r);
189
+ opencascade::handle<Geom_Circle> gc = GC_MakeCircle(
190
+ siren_ary_to_pnt(orig),
191
+ siren_ary_to_dir(dir),
192
+ NUM2DBL(r));
193
+ if (gc.IsNull()) {
194
+ rb_raise(Qnil, "Failed to make a curve.");
195
+ return Qnil;
196
+ }
197
+ else {
198
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gc);
199
+ return siren_shape_new(E);
200
+ }
201
+ }
202
+
203
+ VALUE siren_topalgo_circle3p(int argc, VALUE* argv, VALUE self)
204
+ {
205
+ VALUE p1, p2, p3;
206
+ rb_scan_args(argc, argv, "3", &p1, &p2, &p3);
207
+ opencascade::handle<Geom_Circle> gc = GC_MakeCircle(
208
+ siren_ary_to_pnt(p1),
209
+ siren_ary_to_pnt(p2),
210
+ siren_ary_to_pnt(p3));
211
+ if (gc.IsNull()) {
212
+ rb_raise(Qnil, "Failed to make a curve.");
213
+ return Qnil;
214
+ }
215
+ else {
216
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(gc);
217
+ return siren_shape_new(E);
218
+ }
219
+ }
220
+
221
+ VALUE siren_topalgo_volume(int argc, VALUE* argv, VALUE self)
222
+ {
223
+ TopoDS_Shape* shape = siren_shape_get(self);
224
+ GProp_GProps gprops;
225
+ BRepGProp::VolumeProperties(*shape, gprops);
226
+ Standard_Real vol = gprops.Mass();
227
+ return DBL2NUM(vol);
228
+ }
229
+
230
+ VALUE siren_topalgo_cog(int argc, VALUE* argv, VALUE self)
231
+ {
232
+ TopoDS_Shape* shape = siren_shape_get(self);
233
+ GProp_GProps gprops;
234
+ BRepGProp::VolumeProperties(*shape, gprops);
235
+ gp_Pnt cog = gprops.CentreOfMass();
236
+ return siren_pnt_to_ary(cog);
237
+ }
238
+
239
+ VALUE siren_topalgo_area(int argc, VALUE* argv, VALUE self)
240
+ {
241
+ TopoDS_Shape* shape = siren_shape_get(self);
242
+ GProp_GProps gprops;
243
+ BRepGProp::SurfaceProperties(*shape, gprops);
244
+ Standard_Real area = gprops.Mass();
245
+ return DBL2NUM(area);
246
+ }
@@ -0,0 +1,330 @@
1
+ #include "trans.h"
2
+
3
+ VALUE sr_cTrans;
4
+
5
+ gp_Trsf* siren_trans_get(VALUE obj)
6
+ {
7
+ gp_Trsf* m;
8
+ Data_Get_Struct(obj, gp_Trsf, m);
9
+ return m;
10
+ }
11
+
12
+ static VALUE siren_trans_allocate(VALUE klass)
13
+ {
14
+ void* p = ruby_xmalloc(sizeof(gp_Trsf));
15
+ new(p) gp_Trsf();
16
+ return Data_Wrap_Struct(klass, NULL, siren_trans_final, p);
17
+ }
18
+
19
+ VALUE siren_trans_new(const gp_Trsf& src)
20
+ {
21
+ VALUE t = siren_trans_allocate(sr_cTrans);
22
+ gp_Trsf* pt = siren_trans_get(t);
23
+ *pt = src;
24
+ return t;
25
+ }
26
+
27
+ bool siren_trans_install()
28
+ {
29
+ sr_cTrans = rb_define_class_under(sr_mSiren, "Trans", rb_cObject);
30
+ rb_define_alloc_func(sr_cTrans, siren_trans_allocate);
31
+ rb_define_method(sr_cTrans, "initialize" , RUBY_METHOD_FUNC(siren_trans_init ), -1);
32
+ rb_define_method(sr_cTrans, "to_s" , RUBY_METHOD_FUNC(siren_trans_to_s ), -1);
33
+ rb_define_method(sr_cTrans, "to_a" , RUBY_METHOD_FUNC(siren_trans_matrix ), -1);
34
+ rb_define_method(sr_cTrans, "matrix" , RUBY_METHOD_FUNC(siren_trans_matrix ), -1);
35
+ rb_define_method(sr_cTrans, "matrix=" , RUBY_METHOD_FUNC(siren_trans_set_matrix ), -1);
36
+ rb_define_method(sr_cTrans, "multiply" , RUBY_METHOD_FUNC(siren_trans_multiply ), -1);
37
+ rb_define_method(sr_cTrans, "multiply!" , RUBY_METHOD_FUNC(siren_trans_multiply_bang ), -1);
38
+ rb_define_method(sr_cTrans, "power" , RUBY_METHOD_FUNC(siren_trans_power ), -1);
39
+ rb_define_method(sr_cTrans, "power!" , RUBY_METHOD_FUNC(siren_trans_power_bang ), -1);
40
+ rb_define_method(sr_cTrans, "translate!" , RUBY_METHOD_FUNC(siren_trans_translate_bang ), -1);
41
+ rb_define_method(sr_cTrans, "translatef" , RUBY_METHOD_FUNC(siren_trans_translatef ), -1);
42
+ rb_define_method(sr_cTrans, "translatef=" , RUBY_METHOD_FUNC(siren_trans_set_translatef ), -1);
43
+ rb_define_method(sr_cTrans, "mirror" , RUBY_METHOD_FUNC(siren_trans_mirror ), -1);
44
+ rb_define_method(sr_cTrans, "mirror!" , RUBY_METHOD_FUNC(siren_trans_mirror_bang ), -1);
45
+ rb_define_method(sr_cTrans, "rotate!" , RUBY_METHOD_FUNC(siren_trans_rotate_bang ), -1);
46
+ rb_define_method(sr_cTrans, "scale!" , RUBY_METHOD_FUNC(siren_trans_scale_bang ), -1);
47
+ rb_define_method(sr_cTrans, "scalef" , RUBY_METHOD_FUNC(siren_trans_scalef ), -1);
48
+ rb_define_method(sr_cTrans, "scalef=" , RUBY_METHOD_FUNC(siren_trans_set_scalef ), -1);
49
+ rb_define_method(sr_cTrans, "invert" , RUBY_METHOD_FUNC(siren_trans_invert ), -1);
50
+ rb_define_method(sr_cTrans, "invert!" , RUBY_METHOD_FUNC(siren_trans_invert_bang ), -1);
51
+ rb_define_method(sr_cTrans, "reverse" , RUBY_METHOD_FUNC(siren_trans_invert ), -1);
52
+ rb_define_method(sr_cTrans, "reverse!" , RUBY_METHOD_FUNC(siren_trans_invert_bang ), -1);
53
+ rb_define_method(sr_cTrans, "negative?" , RUBY_METHOD_FUNC(siren_trans_is_negative ), -1);
54
+ rb_define_method(sr_cTrans, "transform!" , RUBY_METHOD_FUNC(siren_trans_transform_bang ), -1);
55
+ rb_define_method(sr_cTrans, "move_point" , RUBY_METHOD_FUNC(siren_trans_move_point ), -1);
56
+ // rb_define_method(sr_cTrans, "rotatef" , siren_trans_rotatef , -1);
57
+ // rb_define_method(sr_cTrans, "rotatef=" , siren_trans_set_rotatef , -1);
58
+ return true;
59
+ }
60
+
61
+ VALUE siren_trans_init(int argc, VALUE* argv, VALUE self)
62
+ {
63
+ return self;
64
+ }
65
+
66
+ void siren_trans_final(void* p)
67
+ {
68
+ gp_Trsf* t = static_cast<gp_Trsf*>(p);
69
+ ruby_xfree(t);
70
+ }
71
+
72
+ VALUE siren_trans_to_s(int argc, VALUE* argv, VALUE self)
73
+ {
74
+ char str[256];
75
+ Standard_Real a11 = siren_trans_get(self)->Value(1, 1);
76
+ Standard_Real a12 = siren_trans_get(self)->Value(1, 2);
77
+ Standard_Real a13 = siren_trans_get(self)->Value(1, 3);
78
+ Standard_Real a14 = siren_trans_get(self)->Value(1, 4);
79
+ Standard_Real a21 = siren_trans_get(self)->Value(2, 1);
80
+ Standard_Real a22 = siren_trans_get(self)->Value(2, 2);
81
+ Standard_Real a23 = siren_trans_get(self)->Value(2, 3);
82
+ Standard_Real a24 = siren_trans_get(self)->Value(2, 4);
83
+ Standard_Real a31 = siren_trans_get(self)->Value(3, 1);
84
+ Standard_Real a32 = siren_trans_get(self)->Value(3, 2);
85
+ Standard_Real a33 = siren_trans_get(self)->Value(3, 3);
86
+ Standard_Real a34 = siren_trans_get(self)->Value(3, 4);
87
+ snprintf(str, sizeof(str),
88
+ "#<Trans:0x%x\n"
89
+ " X = % 2.6f, % 2.6f, % 2.6f\n"
90
+ " Y = % 2.6f, % 2.6f, % 2.6f\n"
91
+ " Z = % 2.6f, % 2.6f, % 2.6f\n"
92
+ " T = % 2.6f, % 2.6f, % 2.6f>",
93
+ -1, // (unsigned int)(uintptr_t)rb_cptr(self),
94
+ a11, a21, a31,
95
+ a12, a22, a32,
96
+ a13, a23, a33,
97
+ a14, a24, a34
98
+ );
99
+ return rb_str_new_cstr(str);
100
+ }
101
+
102
+ VALUE siren_trans_translate_bang(int argc, VALUE* argv, VALUE self)
103
+ {
104
+ VALUE v;
105
+ rb_scan_args(argc, argv, "1", &v);
106
+ gp_Vec vec = siren_ary_to_vec(v);
107
+ gp_Trsf* trans = siren_trans_get(self);
108
+ trans->SetTranslation(vec);
109
+ return self;
110
+ }
111
+
112
+ VALUE siren_trans_rotate_bang(int argc, VALUE* argv, VALUE self)
113
+ {
114
+ VALUE op, norm;
115
+ VALUE angle;
116
+ rb_scan_args(argc, argv, "3", &op, &norm, &angle);
117
+ gp_Trsf* trans = siren_trans_get(self);
118
+ trans->SetRotation(siren_ary_to_ax1(op, norm), angle);
119
+ return self;
120
+ }
121
+
122
+ /*
123
+ VALUE siren_trans_rotatef(int argc, VALUE* argv, VALUE self)
124
+ {
125
+ gp_XYZ axis;
126
+ Standard_Real angle;
127
+ if (siren_trans_get(self)->GetRotation(axis, angle) == Standard_False) {
128
+ return Qnil;
129
+ }
130
+ VALUE res[] = {
131
+ siren_pnt_new(axis.X(), axis.Y(), axis.Z()),
132
+ (angle)
133
+ };
134
+ return rb_ary_new_from_values(2, res);
135
+ }
136
+
137
+ VALUE siren_trans_set_rotatef(int argc, VALUE* argv, VALUE self)
138
+ {
139
+ return Qnil;
140
+ }
141
+ */
142
+
143
+ VALUE siren_trans_scale_bang(int argc, VALUE* argv, VALUE self)
144
+ {
145
+ VALUE op;
146
+ VALUE factor;
147
+ rb_scan_args(argc, argv, "2", &op, &factor);
148
+ gp_Trsf* trans = siren_trans_get(self);
149
+ trans->SetScale(siren_ary_to_pnt(op), factor);
150
+ return self;
151
+ }
152
+
153
+ VALUE siren_trans_scalef(int argc, VALUE* argv, VALUE self)
154
+ {
155
+ gp_Trsf* trans = siren_trans_get(self);
156
+ Standard_Real f = trans->ScaleFactor();
157
+ return (f);
158
+ }
159
+
160
+ VALUE siren_trans_set_scalef(int argc, VALUE* argv, VALUE self)
161
+ {
162
+ VALUE f;
163
+ rb_scan_args(argc, argv, "1", &f);
164
+ gp_Trsf* trans = siren_trans_get(self);
165
+ trans->SetScaleFactor(f);
166
+ return (f);
167
+ }
168
+
169
+ VALUE siren_trans_mirror(int argc, VALUE* argv, VALUE self)
170
+ {
171
+ VALUE op, norm, vx;
172
+ rb_scan_args(argc, argv, "12", &op, &norm, &vx);
173
+ auto res = siren_trans_new(*siren_trans_get(self));
174
+ auto p = siren_trans_get(res);
175
+ switch (argc) {
176
+ case 1:
177
+ p->SetMirror(siren_ary_to_pnt(op));
178
+ break;
179
+ case 2:
180
+ p->SetMirror(siren_ary_to_ax1(op, norm));
181
+ break;
182
+ case 3:
183
+ p->SetMirror(siren_ary_to_ax2(op, norm, vx));
184
+ break;
185
+ }
186
+ return res;
187
+ }
188
+
189
+ VALUE siren_trans_mirror_bang(int argc, VALUE* argv, VALUE self)
190
+ {
191
+ VALUE op, norm, vx;
192
+ rb_scan_args(argc, argv, "12", &op, &norm, &vx);
193
+ switch (argc) {
194
+ case 1:
195
+ siren_trans_get(self)->SetMirror(siren_ary_to_pnt(op));
196
+ break;
197
+ case 2:
198
+ siren_trans_get(self)->SetMirror(siren_ary_to_ax1(op, norm));
199
+ break;
200
+ case 3:
201
+ siren_trans_get(self)->SetMirror(siren_ary_to_ax2(op, norm, vx));
202
+ break;
203
+ }
204
+ return self;
205
+ }
206
+
207
+ VALUE siren_trans_multiply(int argc, VALUE* argv, VALUE self)
208
+ {
209
+ VALUE other;
210
+ rb_scan_args(argc, argv, "1", &other);
211
+ gp_Trsf* trans_me = siren_trans_get(self);
212
+ gp_Trsf* trans_other = siren_trans_get(other);
213
+ gp_Trsf t = trans_me->Multiplied(*trans_other);
214
+ return siren_trans_new(t);
215
+ }
216
+
217
+ VALUE siren_trans_multiply_bang(int argc, VALUE* argv, VALUE self)
218
+ {
219
+ VALUE other;
220
+ rb_scan_args(argc, argv, "1", &other);
221
+ gp_Trsf* trans_me = siren_trans_get(self);
222
+ gp_Trsf* trans_other = siren_trans_get(other);
223
+ trans_me->Multiply(*trans_other);
224
+ return self;
225
+ }
226
+
227
+ VALUE siren_trans_power(int argc, VALUE* argv, VALUE self)
228
+ {
229
+ VALUE n;
230
+ rb_scan_args(argc, argv, "1", &n);
231
+ return siren_trans_new(siren_trans_get(self)->Powered(n));
232
+ }
233
+
234
+ VALUE siren_trans_power_bang(int argc, VALUE* argv, VALUE self)
235
+ {
236
+ VALUE n;
237
+ rb_scan_args(argc, argv, "1", &n);
238
+ siren_trans_get(self)->Power(n);
239
+ return self;
240
+ }
241
+
242
+ VALUE siren_trans_invert(int argc, VALUE* argv, VALUE self)
243
+ {
244
+ return siren_trans_new(siren_trans_get(self)->Inverted());
245
+ }
246
+
247
+ VALUE siren_trans_invert_bang(int argc, VALUE* argv, VALUE self)
248
+ {
249
+ siren_trans_get(self)->Invert();
250
+ return self;
251
+ }
252
+
253
+ VALUE siren_trans_is_negative(int argc, VALUE* argv, VALUE self)
254
+ {
255
+ return siren_trans_get(self)->IsNegative() ? Qtrue : Qfalse;
256
+ }
257
+
258
+ VALUE siren_trans_transform_bang(int argc, VALUE* argv, VALUE self)
259
+ {
260
+ VALUE pos1, norm1, vdir1;
261
+ VALUE pos2, norm2, vdir2;
262
+ rb_scan_args(argc, argv, "33", &pos1, &norm1, &vdir1, &pos2, &norm2, &vdir2);
263
+ gp_Trsf* trans = siren_trans_get(self);
264
+ if (argc == 3) {
265
+ trans->SetTransformation(siren_ary_to_ax3(pos1, norm1, vdir1));
266
+ }
267
+ else if (argc == 6) {
268
+ trans->SetTransformation(siren_ary_to_ax3(pos1, norm1, vdir1), siren_ary_to_ax3(pos2, norm2, vdir2));
269
+ }
270
+ else {
271
+ rb_raise(Qnil, "Number of arguments is wrong.");
272
+ }
273
+ return self;
274
+ }
275
+
276
+ VALUE siren_trans_matrix(int argc, VALUE* argv, VALUE self)
277
+ {
278
+ VALUE result[4];
279
+ for (int row = 1; row <= 4; row++) {
280
+ result[row - 1] = rb_ary_new();
281
+ for (int col = 1; col <= 3; col++) {
282
+ rb_ary_push(result[row - 1], DBL2NUM(siren_trans_get(self)->Value(col, row)));
283
+ }
284
+ }
285
+ return rb_ary_new_from_values(4, result);
286
+ }
287
+
288
+ VALUE siren_trans_set_matrix(int argc, VALUE* argv, VALUE self)
289
+ {
290
+ VALUE ary;
291
+ rb_scan_args(argc, argv, "1", &ary);
292
+ if (RARRAY_LEN(ary) != 4) {
293
+ rb_raise(Qnil, "Number of items of specified array is wrong.");
294
+ }
295
+ gp_Vec x = siren_ary_to_vec(RARRAY_AREF(ary, 0));
296
+ gp_Vec y = siren_ary_to_vec(RARRAY_AREF(ary, 1));
297
+ gp_Vec z = siren_ary_to_vec(RARRAY_AREF(ary, 2));
298
+ gp_Vec t = siren_ary_to_vec(RARRAY_AREF(ary, 3));
299
+ gp_Trsf* trans = siren_trans_get(self);
300
+ trans->SetValues(
301
+ x.X(), y.X(), z.X(), t.X(),
302
+ x.Y(), y.Y(), z.Y(), t.Y(),
303
+ x.Z(), y.Z(), z.Z(), t.Z());
304
+ return self;
305
+ }
306
+
307
+ VALUE siren_trans_translatef(int argc, VALUE* argv, VALUE self)
308
+ {
309
+ gp_Trsf* trans = siren_trans_get(self);
310
+ gp_XYZ xyz = trans->TranslationPart();
311
+ return siren_pnt_new(xyz.X(), xyz.Y(), xyz.Z());
312
+ }
313
+
314
+ VALUE siren_trans_set_translatef(int argc, VALUE* argv, VALUE self)
315
+ {
316
+ VALUE v;
317
+ rb_scan_args(argc, argv, "1", &v);
318
+ siren_trans_get(self)->SetTranslationPart(siren_ary_to_vec(v));
319
+ return Qnil;
320
+ }
321
+
322
+ VALUE siren_trans_move_point(int argc, VALUE* argv, VALUE self)
323
+ {
324
+ VALUE ary;
325
+ rb_scan_args(argc, argv, "1", &ary);
326
+ gp_Pnt point = siren_ary_to_pnt(ary);
327
+ gp_Trsf* trans = siren_trans_get(self);
328
+ point.Transform(*trans);
329
+ return siren_pnt_to_ary(point);
330
+ }