Browse Source

Add query hatch power

Kevin Lee 1 month ago
parent
commit
6daafb8b80
3 changed files with 37 additions and 19 deletions
  1. 17 0
      Cargo.lock
  2. 1 0
      Cargo.toml
  3. 19 19
      src/main.rs

+ 17 - 0
Cargo.lock

@@ -65,6 +65,12 @@ version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
 
+[[package]]
+name = "arrayvec"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+
 [[package]]
 name = "autocfg"
 version = "1.1.0"
@@ -389,6 +395,7 @@ dependencies = [
  "log",
  "modular-bitfield",
  "num",
+ "num-format",
  "num_enum",
  "rand",
  "regex",
@@ -453,6 +460,16 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "num-format"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3"
+dependencies = [
+ "arrayvec",
+ "itoa",
+]
+
 [[package]]
 name = "num-integer"
 version = "0.1.45"

+ 1 - 0
Cargo.toml

@@ -25,6 +25,7 @@ itertools = "0.12.0"
 log = "0.4.20"
 modular-bitfield = "0.11.2"
 num = "0.4.1"
+num-format = "0.4.4"
 num_enum = "0.7.1"
 rand = "0.8.5"
 regex = "1.10.4"

+ 19 - 19
src/main.rs

@@ -12,8 +12,10 @@ use clap_verbosity_flag::{InfoLevel, Verbosity};
 use dialoguer::Confirm;
 use diff::Diff;
 use env_logger::Target;
-use ezcad::{file::EzCadHeader, layer::Layer, objects::Object};
+use ezcad::{file::EzCadHeader, layer::Layer, objects::Object, pen::Pen, types::PulseWidth};
 use log::{info, trace, warn};
+use num_enum::TryFromPrimitive;
+use num_format::{Locale, ToFormattedString};
 use regex::Regex;
 
 use crate::config::{Config, Operations};
@@ -186,15 +188,10 @@ fn main() {
             );
         }
         SubCommands::Query(args) => {
+            let pens: &Vec<Pen> = &file.pens_offset.data.pens;
+
             // Print info on pens with non-default settings
-            for (index, pen) in file
-                .pens_offset
-                .data
-                .pens
-                .iter()
-                .filter(|x| *x.use_default == 0)
-                .enumerate()
-            {
+            for (index, pen) in pens.iter().filter(|x| *x.use_default == 0).enumerate() {
                 trace!("Pen {}: {:#?}", index, pen);
             }
 
@@ -216,11 +213,7 @@ fn main() {
                     info!(
                         "Pen #{}: {}",
                         pen,
-                        file.pens_offset
-                            .data
-                            .pens
-                            .get(pen)
-                            .expect("Invalid pen index")
+                        pens.get(pen).expect("Invalid pen index")
                     );
                 }
             });
@@ -241,18 +234,25 @@ fn main() {
                         .get(object_index)
                         .expect("Invalid object index");
                     let pen_index: u32 = *object.core().pen;
+                    let pen: &Pen = pens.get(pen_index as usize).expect("Invalid pen index in object");
                     info!(
                         "Layer #{}, Object #{}:\n{}\nPen: #{}: {}",
                         layer_index,
                         object_index,
                         object,
                         pen_index,
-                        file.pens_offset
-                            .data
-                            .pens
-                            .get(pen_index as usize)
-                            .expect("Invalid pen index in object")
+                        pen
                     );
+                    if let Object::Hatch(hatch) = object {
+                        let line_spacing: f64 = *hatch.hatch_settings.iter().find(|h| h.enabled.into()).expect("Hatch object does not have enabled settings").line_spacing;
+                        let power: f64 = *pen.power;
+                        let speed: f64 = *pen.speed;
+                        let frequency: f64 = f64::from(*pen.frequency);
+                        let pulse: f64 = PulseWidth::try_from_primitive(*pen.pulse_width).expect("Invalid pen pulse width").power_ratio();
+
+                        let calc_power: u64 = ((1.0/line_spacing) * power * (1.0/speed) * frequency * pulse) as u64;
+                        info!("Hatch object calculated power: {}", calc_power.to_formatted_string(&Locale::en));
+                    }
                 }
             });
         }