1extern crate nalgebra as na;
2
3use scad_macros::*;
4use scad_element::ScadElement::*;
5use scad_element::CircleType;
6use scad_object::*;
7
8
9
10pub fn centered_cube(size: na::Vector3<f32>, centering: (bool, bool, bool)) -> ScadObject
14{
15 let (x,y,z) = centering;
16
17 let mut offset = vec3(0.,0.,0.);
18 offset.x = if x {size.x} else {0.};
19 offset.y = if y {size.y} else {0.};
20 offset.z = if z {size.z} else {0.};
21
22 offset /= -2.;
23
24 let mut translation = ScadObject::new(Translate(offset));
25 translation.add_child(ScadObject::new(Cube(size)));
26 translation
27}
28
29pub fn centered_square(size: na::Vector2<f32>, centering: (bool, bool)) -> ScadObject
30{
31 let (x,y) = centering;
32 let offset = vec2(
33 if x {size.x} else {0.},
34 if y {size.y} else {0.}
35 ) / -2.;
36
37 let mut translation = ScadObject::new(Translate2d(offset));
38 translation.add_child(ScadObject::new(Square(size)));
39 translation
40}
41
42pub fn centered_cylinder(height: f32, size: CircleType) -> ScadObject
46{
47 let mut translation = ScadObject::new(Translate(vec3(0., 0., -height / 2.)));
48 let cylinder = ScadObject::new(Cylinder(height, size));
49
50 translation.add_child(cylinder);
51 translation
52}
53
54
55
56#[cfg(test)]
57mod tests
58{
59 extern crate nalgebra as na;
60
61 use super::*;
62
63 #[test]
64 fn cube_center_x()
65 {
66 let obj = centered_cube(vec3(1., 1., 1.), (true, false, false));
67
68 assert_eq!(obj.get_code(), "translate([-0.5,0,0])\n{\n\tcube([1,1,1]);\n}");
69 }
70 #[test]
71 fn cube_center_yz()
72 {
73 let obj = centered_cube(vec3(1., 2., 4.), (false, true, true));
74
75 assert_eq!(obj.get_code(), "translate([0,-1,-2])\n{\n\tcube([1,2,4]);\n}");
76 }
77
78 #[test]
79 fn square_center()
80 {
81 let obj = centered_square(vec2(2., 4.), (true, true));
82
83 assert_eq!(obj.get_code(), "translate([-1,-2])\n{\n\tsquare([2,4]);\n}");
84 }
85
86 #[test]
87 fn cylinder_center()
88 {
89 let obj = centered_cylinder(10., CircleType::Radius(5.));
90
91 assert_eq!(obj.get_code(), "translate([0,0,-5])\n{\n\tcylinder(h=10,r=5);\n}");
92 }
93}