lib3mf/extensions/
slice.rs1use crate::error::Result;
4use crate::extension::ExtensionHandler;
5use crate::model::{Extension, Model};
6use crate::validator::{validate_slice_extension, validate_slices};
7
8pub struct SliceExtensionHandler;
33
34impl ExtensionHandler for SliceExtensionHandler {
35 fn extension_type(&self) -> Extension {
36 Extension::Slice
37 }
38
39 fn validate(&self, model: &Model) -> Result<()> {
40 validate_slices(model)?;
42 validate_slice_extension(model)?;
43 Ok(())
44 }
45
46 fn is_used_in_model(&self, model: &Model) -> bool {
47 if !model.resources.slice_stacks.is_empty() {
49 return true;
50 }
51
52 model
54 .resources
55 .objects
56 .iter()
57 .any(|obj| obj.slicestackid.is_some())
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use crate::model::{Object, Slice, SlicePolygon, SliceSegment, SliceStack, Vertex2D};
65
66 #[test]
67 fn test_extension_type() {
68 let handler = SliceExtensionHandler;
69 assert_eq!(handler.extension_type(), Extension::Slice);
70 }
71
72 #[test]
73 fn test_namespace() {
74 let handler = SliceExtensionHandler;
75 assert_eq!(
76 handler.namespace(),
77 "http://schemas.microsoft.com/3dmanufacturing/slice/2015/07"
78 );
79 }
80
81 #[test]
82 fn test_name() {
83 let handler = SliceExtensionHandler;
84 assert_eq!(handler.name(), "Slice");
85 }
86
87 #[test]
88 fn test_is_used_in_model_with_slice_stacks() {
89 let handler = SliceExtensionHandler;
90 let mut model = Model::new();
91
92 assert!(!handler.is_used_in_model(&model));
94
95 let slice_stack = SliceStack::new(1, 0.0);
97 model.resources.slice_stacks.push(slice_stack);
98
99 assert!(handler.is_used_in_model(&model));
100 }
101
102 #[test]
103 fn test_is_used_in_model_with_object_reference() {
104 let handler = SliceExtensionHandler;
105 let mut model = Model::new();
106
107 assert!(!handler.is_used_in_model(&model));
109
110 let mut object = Object::new(1);
112 object.slicestackid = Some(1);
113 model.resources.objects.push(object);
114
115 assert!(handler.is_used_in_model(&model));
116 }
117
118 #[test]
119 fn test_validate_empty_model() {
120 let handler = SliceExtensionHandler;
121 let model = Model::new();
122
123 assert!(handler.validate(&model).is_ok());
125 }
126
127 #[test]
128 fn test_validate_valid_slice_stack() {
129 let handler = SliceExtensionHandler;
130 let mut model = Model::new();
131
132 let mut slice_stack = SliceStack::new(1, 0.0);
134
135 let mut slice = Slice::new(1.0);
137 slice.vertices.push(Vertex2D::new(0.0, 0.0));
138 slice.vertices.push(Vertex2D::new(1.0, 0.0));
139 slice.vertices.push(Vertex2D::new(0.5, 1.0));
140
141 let mut polygon = SlicePolygon::new(0);
142 polygon.segments.push(SliceSegment::new(1));
143 polygon.segments.push(SliceSegment::new(2));
144 polygon.segments.push(SliceSegment::new(0)); slice.polygons.push(polygon);
147 slice_stack.slices.push(slice);
148
149 model.resources.slice_stacks.push(slice_stack);
150
151 assert!(handler.validate(&model).is_ok());
153 }
154
155 #[test]
156 fn test_validate_invalid_ztop_below_zbottom() {
157 let handler = SliceExtensionHandler;
158 let mut model = Model::new();
159
160 let mut slice_stack = SliceStack::new(1, 5.0); let slice = Slice::new(1.0); slice_stack.slices.push(slice);
165
166 model.resources.slice_stacks.push(slice_stack);
167
168 assert!(handler.validate(&model).is_err());
170 }
171
172 #[test]
173 fn test_validate_non_increasing_ztop() {
174 let handler = SliceExtensionHandler;
175 let mut model = Model::new();
176
177 let mut slice_stack = SliceStack::new(1, 0.0);
178
179 slice_stack.slices.push(Slice::new(1.0));
181 slice_stack.slices.push(Slice::new(1.0)); model.resources.slice_stacks.push(slice_stack);
184
185 assert!(handler.validate(&model).is_err());
187 }
188
189 #[test]
190 fn test_validate_invalid_polygon_not_closed() {
191 let handler = SliceExtensionHandler;
192 let mut model = Model::new();
193
194 let mut slice_stack = SliceStack::new(1, 0.0);
195
196 let mut slice = Slice::new(1.0);
197 slice.vertices.push(Vertex2D::new(0.0, 0.0));
198 slice.vertices.push(Vertex2D::new(1.0, 0.0));
199 slice.vertices.push(Vertex2D::new(0.5, 1.0));
200
201 let mut polygon = SlicePolygon::new(0);
202 polygon.segments.push(SliceSegment::new(1));
203 polygon.segments.push(SliceSegment::new(2));
204 slice.polygons.push(polygon);
207 slice_stack.slices.push(slice);
208
209 model.resources.slice_stacks.push(slice_stack);
210
211 assert!(handler.validate(&model).is_err());
213 }
214
215 #[test]
216 fn test_post_parse_default() {
217 let handler = SliceExtensionHandler;
218 let mut model = Model::new();
219
220 assert!(handler.post_parse(&mut model).is_ok());
222 }
223
224 #[test]
225 fn test_pre_write_default() {
226 let handler = SliceExtensionHandler;
227 let mut model = Model::new();
228
229 assert!(handler.pre_write(&mut model).is_ok());
231 }
232}