Browse Source

Add density range to randomization

Kevin Lee 1 month ago
parent
commit
41a76c99ab
4 changed files with 38 additions and 17 deletions
  1. 2 0
      README.md
  2. 20 7
      src/config/pen.rs
  3. 3 10
      src/ezcad/objects/hatch.rs
  4. 13 0
      src/ezcad/pen.rs

+ 2 - 0
README.md

@@ -174,6 +174,8 @@ Op:
     Power: [10, 100, 5] # [min, max, step]
     Frequency: [20000, 100000, 1000] # [min, max, step]
     PulseWidth: [2, 350, 2] # [min, max, step]
+
+    PowerDensity: [10000, 1000000] # [min, max]
 ```
 
 Exporting a pen to a file:

+ 20 - 7
src/config/pen.rs

@@ -314,6 +314,7 @@ pub struct RandomizePen {
     power: Option<(f64, f64, f64)>,
     frequency: Option<(u32, u32, u32)>,
     pulse_width: Option<(PulseWidth, PulseWidth, usize)>,
+    power_density: Option<(u64, u64)>,
 }
 
 impl RandomizePen {
@@ -379,17 +380,29 @@ impl RandomizePen {
                     setting.pulse_width = Some(*width);
                 }
 
+                setting.apply(pen);
+
+                // Check if power density value is within range
+                if let Some((range_min, range_max)) = self.power_density {
+                    let power_density: u64 = pen.power_density();
+                    if power_density < range_min || power_density > range_max {
+                        debug!("Retrying (power density {power_density} out of range)");
+                        continue;
+                    }
+                }
+
+                // Check settings
+                if !pen.valid_settings() {
+                    debug!("Retrying (invalid setting)");
+                    continue;
+                }
+
                 // Check for duplicates
                 if !generated.contains(&setting) {
                     generated.push(setting);
-                    setting.apply(pen);
-                    if !pen.valid_settings() {
-                        debug!("Retrying..");
-                    } else {
-                        break;
-                    }
+                    break;
                 } else {
-                    debug!("Duplicate random setting");
+                    debug!("Retrying (duplicate setting)");
                 }
 
                 // Fail out if max attempts reached (insufficient search space)

+ 3 - 10
src/ezcad/objects/hatch.rs

@@ -4,7 +4,7 @@ use crate::{
     array_of::ArrayOf,
     field_of::FieldOf,
     pen::Pen,
-    types::{Field, Point, PulseWidth, F64, U32},
+    types::{Field, Point, F64, U32},
     FP,
 };
 use binrw::{binrw, BinRead, BinWrite};
@@ -13,7 +13,6 @@ use modular_bitfield::{
     bitfield,
     specifiers::{B1, B18},
 };
-use num_enum::TryFromPrimitive;
 use serde::{Deserialize, Serialize};
 
 use super::{line::Lines, Object, ObjectCore, Translate};
@@ -489,7 +488,7 @@ impl Translate for Hatch {
 impl Hatch {
     /// Estimate the power density from the hatch's line spacing and pen speed/frequency/power/pulse
     pub fn calc_power_density(&self, pens: &Vec<Pen>) -> u64 {
-        let pen = pens
+        let pen: &Pen = pens
             .get(*self.core.pen as usize)
             .expect("Invalid pen index");
         let line_spacing: f64 = *self
@@ -498,13 +497,7 @@ impl Hatch {
             .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();
 
-        ((1.0 / line_spacing) * power * (1.0 / speed) * frequency * pulse) as u64
+        (1.0 / line_spacing) as u64 * pen.power_density()
     }
 }

+ 13 - 0
src/ezcad/pen.rs

@@ -9,6 +9,7 @@ use binrw::{BinRead, BinWrite, BinWriterExt, FilePtr64};
 use diff::Diff;
 use human_repr::HumanCount;
 use log::{error, warn};
+use num_enum::TryFromPrimitive;
 
 use crate::{
     field_of::FieldOf,
@@ -171,6 +172,18 @@ impl Pen {
 
         ret
     }
+
+    /// Estimate the power density from the speed/frequency/power/pulse
+    pub fn power_density(&self) -> u64 {
+        let power: f64 = *self.power;
+        let speed: f64 = *self.speed;
+        let frequency: f64 = f64::from(*self.frequency);
+        let pulse: f64 = PulseWidth::try_from_primitive(*self.pulse_width)
+            .expect("Invalid pen pulse width")
+            .power_ratio();
+
+        (power * (1.0 / speed) * frequency * pulse) as u64
+    }
 }
 
 impl std::fmt::Display for Pen {