From b7027ae60309ae9b0bae1152cabec8b12b3ded84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Cicho=C5=84?= Date: Sat, 28 Sep 2024 06:13:59 +0200 Subject: [PATCH] specctra: changes for compatibility with EasyEDA --- src/specctra/mesadata.rs | 15 ++++++++++++++- src/specctra/structure.rs | 29 +++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/specctra/mesadata.rs b/src/specctra/mesadata.rs index 9c422ca..33bd4d4 100644 --- a/src/specctra/mesadata.rs +++ b/src/specctra/mesadata.rs @@ -103,8 +103,21 @@ impl SpecctraMesadata { .map(|class| (class.name.clone(), SpecctraRule::from_dsn(&class.rule))), ); + let mut structure_rule = super::structure::Rule { + width: 0.0, + clearances: Vec::new(), + }; + // workaround for differing syntax + // collapse multiple rule entries into a single one + for rule in &pcb.structure.rules { + if rule.width.is_some() { + structure_rule.width = rule.width.unwrap() + } + structure_rule.clearances.extend_from_slice(&rule.clearances); + } + Self { - structure_rule: SpecctraRule::from_dsn(&pcb.structure.rule), + structure_rule: SpecctraRule::from_dsn(&structure_rule), class_rules, layer_layername, net_netname, diff --git a/src/specctra/structure.rs b/src/specctra/structure.rs index d0a6c36..e7825db 100644 --- a/src/specctra/structure.rs +++ b/src/specctra/structure.rs @@ -53,9 +53,9 @@ pub struct DsnFile { pub struct Pcb { #[anon] pub name: String, - pub parser: Parser, + pub parser: Option, pub resolution: Resolution, - pub unit: String, + pub unit: Option, pub structure: Structure, pub placement: Placement, pub library: Library, @@ -87,7 +87,13 @@ pub struct Structure { #[vec("plane")] pub planes: Vec, pub via: ViaNames, - pub rule: Rule, + #[vec("grid")] + pub grids: Vec, + // this is a vec of special structs because EasyEDA uses different syntax + // it outputs a sequence of rules containing a clearance each + // (in class rules it outputs a single rule with all clearances like KiCad) + #[vec("rule")] + pub rules: Vec, } #[derive(ReadDsn, WriteSes, Debug)] @@ -121,6 +127,21 @@ pub struct ViaNames { pub names: Vec, } +#[derive(ReadDsn, WriteSes, Debug)] +pub struct Grid { + #[anon] + pub kind: String, + #[anon] + pub value: f64, +} + +#[derive(ReadDsn, WriteSes, Debug)] +pub struct StructureRule { + pub width: Option, + #[vec("clearance")] + pub clearances: Vec, +} + #[derive(ReadDsn, WriteSes, Debug)] pub struct Placement { #[vec("component")] @@ -428,7 +449,7 @@ pub struct Rule { pub clearances: Vec, } -#[derive(ReadDsn, WriteSes, Debug)] +#[derive(ReadDsn, WriteSes, Clone, Debug)] pub struct Clearance { #[anon] pub value: f32,