| 
					
				 | 
			
			
				@@ -114,7 +114,7 @@ pub struct ArrayConfig { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     spacing: f64,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     randomize_order: bool,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     starting_pen: usize,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pattern_x: PatternField,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    pattern_x: Option<PatternField>,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pattern_y: Option<PatternField>,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -258,78 +258,87 @@ impl ObjectOperation { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Process array generation of object
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let new_objects = self.array.as_ref().map_or(vec![object.clone()], |array| {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let mut new_obj: Vec<Object> = vec![];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let bottom_left: Coordinate = Coordinate {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                x: (array.columns - 1) as f64 * array.spacing / -2.0,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                y: (array.rows - 1) as f64 * array.spacing / -2.0,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            };
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Generate objects
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            for y in 0..array.rows {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for x in 0..array.columns {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    let delta: Coordinate = bottom_left
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        + Coordinate {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            x: array.spacing * x as f64,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            y: array.spacing * y as f64,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        };
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    let pen: usize = array.starting_pen + y * array.columns + x;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    let mut object: Object = object.clone();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    object.move_relative(Some(delta), None);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    object.set_pen(pen.try_into().unwrap());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    debug!(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        "Adding new object at {} with pen #{}",
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        object.core().origin,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        pen
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    new_obj.push(object);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let new_objects = self.array.as_ref().map_or_else(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            || vec![object.clone()],
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            |array| {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let mut new_obj: Vec<Object> = vec![];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let bottom_left: Coordinate = Coordinate {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    x: (array.columns - 1) as f64 * array.spacing / -2.0,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    y: (array.rows - 1) as f64 * array.spacing / -2.0,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                };
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Generate objects
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for y in 0..array.rows {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for x in 0..array.columns {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        let delta: Coordinate = bottom_left
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            + Coordinate {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                x: array.spacing * x as f64,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                y: array.spacing * y as f64,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            };
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        let pen: usize = array.starting_pen + y * array.columns + x;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        let mut object: Object = object.clone();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        object.move_relative(Some(delta), None);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        object.set_pen(pen.try_into().unwrap());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        debug!(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            "Adding new object at {} with pen #{}",
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            object.core().origin,
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            pen
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        new_obj.push(object);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Generate pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            match &array.pattern_y {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                None => {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    array.pattern_x.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .skip(array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .take(array.columns * array.rows),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Some(pattern_y) => {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    pattern_y.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .skip(array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .step_by(array.columns)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            .take(array.rows),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    for y in 0..array.rows {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        array.pattern_x.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                .skip(array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                .skip(y * array.columns)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                .take(array.columns),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        )
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Generate pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                match &array.pattern_y {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None => {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if let Some(pattern_x) = &array.pattern_x {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            pattern_x.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .skip(array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .take(array.columns * array.rows),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Some(pattern_y) => {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for x in 0..array.columns {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            pattern_y.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .skip(x + array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .step_by(array.columns)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .take(array.rows),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if let Some(pattern_x) = &array.pattern_x {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for y in 0..array.rows {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                pattern_x.pattern(
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    &mut pens
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        .iter_mut()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        .enumerate()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        .skip(array.starting_pen)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        .skip(y * array.columns)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        .take(array.columns),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                )
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if array.randomize_order {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                debug!("Randomizing draw order of array objects");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                new_obj.shuffle(&mut thread_rng());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if array.randomize_order {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    debug!("Randomizing draw order of array objects");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new_obj.shuffle(&mut thread_rng());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            new_obj
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new_obj
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            },
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        );
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let layer_id: usize = self.layer.unwrap_or(0);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let layer: &mut Layer = layers.get_mut(layer_id).expect("Invalid layer index");
 
			 |