Browse Source

Initial hatch work

Kevin Lee 1 year ago
parent
commit
4a95440057
2 changed files with 114 additions and 4 deletions
  1. 107 1
      src/ezcad/objects/hatch.rs
  2. 7 3
      src/ezcad/objects/mod.rs

+ 107 - 1
src/ezcad/objects/hatch.rs

@@ -1 +1,107 @@
-
+use std::fmt::Display;
+
+use binrw::{BinRead, BinWrite};
+use modular_bitfield::{
+    bitfield,
+    specifiers::{B1, B2, B21, B4},
+};
+
+use crate::{
+    array_of::ArrayOf,
+    field_of::FieldOf,
+    types::{Field, WString, F64, U32},
+};
+
+use super::{line::Lines, Object, ObjectBase};
+
+#[bitfield(bits = 32)]
+#[derive(BinRead, BinWrite, Debug, Copy, Clone)]
+#[br(map = Self::from_bytes)]
+#[bw(map = |&x| Self::into_bytes(x))]
+pub struct ObjectFlags {
+    #[skip]
+    __: B1,
+    pub follow_edge_once: B1,
+    #[skip]
+    __: B4,
+    pub auto_rotate_hatch_angle: B1,
+    pub average_distribute_line: B1,
+    #[skip]
+    __: B2,
+    pub cross_patch: B1,
+    #[skip]
+    __: B21,
+}
+
+#[derive(BinRead, BinWrite, Debug)]
+pub struct HatchLine {
+    lines: ArrayOf<Lines>,
+}
+
+#[derive(BinRead, BinWrite, Debug)]
+#[brw(magic(46u32))] // Number of fields in this struct
+pub struct HatchSettings1 {
+    pub mark_contour: U32,
+    _unknown_1: Field,
+    pub pen: U32,
+    pub flags: FieldOf<ObjectFlags>,
+    pub edge_offset: F64,
+    pub line_spacing: F64,
+    pub start_offset: F64,
+    pub end_offset: F64,
+    pub angle: F64,
+    _unknown_2: [Field; 9],
+    pub auto_rotate_angle: F64,
+    _unknown_3: [Field; 10],
+    pub line_reduction: F64,
+    _unknown_4: [Field; 2],
+    pub loop_count: U32,
+    _unknown_5: [Field; 2],
+    pub loop_distance: F64,
+    _unknown_6: [Field; 5],
+    pub contour_first: U32,
+    pub count: U32,
+    _unknown_7: [Field; 3],
+}
+
+#[derive(BinRead, BinWrite, Debug)]
+#[brw(magic(15u32))] // Number of fields in this struct
+pub struct HatchSettings2 {
+    pub count: U32,
+    _unknown_1: Field,
+    pub pen: U32,
+    pub flags: FieldOf<ObjectFlags>,
+    pub edge_offset: F64,
+    pub line_spacing: F64,
+    pub start_offset: F64,
+    pub end_offset: F64,
+    pub angle: F64,
+    pub auto_rotate_angle: F64,
+    pub line_reduction: F64,
+    pub loop_distance: F64,
+    pub loop_count: U32,
+    _unknown_2: [Field; 2],
+}
+
+#[derive(BinRead, BinWrite, Debug)]
+pub struct Hatch {
+    pub base: ObjectBase,
+    pub outline: ArrayOf<Object>,
+    pub settings_1: HatchSettings1,
+    pub settings_2: HatchSettings2,
+    _unknown_1: ArrayOf<Field>,
+    _unknown_2: u32,
+    _unknown_3: u32,
+    _unknown_4: u32,
+    pub pen: U32,
+    _unknown_5: [Field; 2],
+    pub name: WString,
+    _unknown_6: [Field; 13],
+    pub lines: ArrayOf<HatchLine>,
+}
+
+impl Display for Hatch {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "[HATCH]")
+    }
+}

+ 7 - 3
src/ezcad/objects/mod.rs

@@ -11,7 +11,10 @@ use crate::{
     types::{Field, ObjectType, Point, WString, F64, U16, U32},
 };
 
-use self::{circle::Circle, ellipse::Ellipse, line::Lines, polygon::Polygon, rectangle::Rectangle};
+use self::{
+    circle::Circle, ellipse::Ellipse, hatch::Hatch, line::Lines, polygon::Polygon,
+    rectangle::Rectangle,
+};
 
 pub mod circle;
 pub mod ellipse;
@@ -79,8 +82,8 @@ pub enum Object {
     Ellipse(Ellipse),
     #[brw(magic = 6u32)]
     Polygon(Polygon),
-    // #[brw(magic = 32u32)]
-    // Hatch(Hatch),
+    #[brw(magic = 32u32)]
+    Hatch(Hatch),
 }
 
 impl Display for Object {
@@ -92,6 +95,7 @@ impl Display for Object {
             Object::Circle(x) => write!(f, "{}", x),
             Object::Ellipse(x) => write!(f, "{}", x),
             Object::Polygon(x) => write!(f, "{}", x),
+            Object::Hatch(x) => write!(f, "{}", x),
         }
     }
 }