scad/
common_objects.rs

1extern crate nalgebra as na;
2
3use scad_macros::*;
4use scad_element::ScadElement::*;
5use scad_element::CircleType;
6use scad_object::*;
7
8
9
10/**
11  Creates a cube that is centered on the specified axis
12*/
13pub 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
42/**
43  Creates a cylinder that is centered along all axis
44*/
45pub 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}