Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "kicad_parse_gen"
version = "7.0.2"
version = "7.0.3"
authors = ["Joost Damad <joost@productize.be>", "Adam Heinrich <adam@productize.be>"]
license = "MIT/Apache-2.0"
repository = "https://github.com/productize/kicad-parse-gen"
Expand Down
150 changes: 78 additions & 72 deletions src/footprint/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ impl Module {
self.get_text_mut("value")
}


/// check if the module has the "smd" attribute
pub fn has_smd_attr(&self) -> bool {
for element in &self.elements {
Expand Down Expand Up @@ -331,18 +330,18 @@ impl BoundingBox for Element {
Element::FpCircle(ref x) => x.bounding_box(),
Element::FpText(ref x) => x.bounding_box(),
Element::FpArc(ref x) => x.bounding_box(),
Element::At(_) |
Element::Layer(_) |
Element::TEdit(_) |
Element::Descr(_) |
Element::Path(_) |
Element::Model(_) |
Element::Attr(_) |
Element::SolderMaskMargin(_) |
Element::Clearance(_) |
Element::Tags(_) |
Element::Locked |
Element::TStamp(_) => Bound::default(),
Element::At(_)
| Element::Layer(_)
| Element::TEdit(_)
| Element::Descr(_)
| Element::Path(_)
| Element::Model(_)
| Element::Attr(_)
| Element::SolderMaskMargin(_)
| Element::Clearance(_)
| Element::Tags(_)
| Element::Locked
| Element::TStamp(_) => Bound::default(),
}
}
}
Expand Down Expand Up @@ -383,16 +382,16 @@ impl Flip for Element {
Element::FpText(ref mut p) => p.flip(),
Element::At(ref mut p) => p.flip(),
Element::Layer(ref mut p) => p.flip(),
Element::TEdit(_) |
Element::Descr(_) |
Element::Path(_) |
Element::Model(_) |
Element::TStamp(_) |
Element::SolderMaskMargin(_) |
Element::Clearance(_) |
Element::Tags(_) |
Element::Attr(_) |
Element::Locked => (),
Element::TEdit(_)
| Element::Descr(_)
| Element::Path(_)
| Element::Model(_)
| Element::TStamp(_)
| Element::SolderMaskMargin(_)
| Element::Clearance(_)
| Element::Tags(_)
| Element::Attr(_)
| Element::Locked => (),
}
}
}
Expand All @@ -403,46 +402,46 @@ impl Rotate for Element {
Element::Pad(ref mut p) => p.rotate(rot),
Element::FpText(ref mut p) => p.rotate(rot),
Element::At(ref mut p) => p.rotate(rot),
Element::FpPoly(_) |
Element::FpLine(_) |
Element::FpCircle(_) |
Element::FpArc(_) |
Element::Layer(_) |
Element::TEdit(_) |
Element::Descr(_) |
Element::Path(_) |
Element::Model(_) |
Element::TStamp(_) |
Element::SolderMaskMargin(_) |
Element::Clearance(_) |
Element::Tags(_) |
Element::Attr(_) |
Element::Locked => (),
Element::FpPoly(_)
| Element::FpLine(_)
| Element::FpCircle(_)
| Element::FpArc(_)
| Element::Layer(_)
| Element::TEdit(_)
| Element::Descr(_)
| Element::Path(_)
| Element::Model(_)
| Element::TStamp(_)
| Element::SolderMaskMargin(_)
| Element::Clearance(_)
| Element::Tags(_)
| Element::Attr(_)
| Element::Locked => (),
}
}
}

impl Element {
fn is_graphics(&self) -> bool {
match *self {
Element::Pad(_) |
Element::FpPoly(_) |
Element::FpLine(_) |
Element::FpCircle(_) |
Element::FpArc(_) => true,
Element::FpText(_) |
Element::At(_) |
Element::Layer(_) |
Element::TEdit(_) |
Element::Descr(_) |
Element::Path(_) |
Element::Model(_) |
Element::TStamp(_) |
Element::SolderMaskMargin(_) |
Element::Clearance(_) |
Element::Tags(_) |
Element::Attr(_) |
Element::Locked => false,
Element::Pad(_)
| Element::FpPoly(_)
| Element::FpLine(_)
| Element::FpCircle(_)
| Element::FpArc(_) => true,
Element::FpText(_)
| Element::At(_)
| Element::Layer(_)
| Element::TEdit(_)
| Element::Descr(_)
| Element::Path(_)
| Element::Model(_)
| Element::TStamp(_)
| Element::SolderMaskMargin(_)
| Element::Clearance(_)
| Element::Tags(_)
| Element::Attr(_)
| Element::Locked => false,
}
}

Expand All @@ -452,20 +451,20 @@ impl Element {
Element::FpLine(ref e) => e.is_fab(),
Element::FpCircle(ref e) => e.is_fab(),
Element::FpArc(ref e) => e.is_fab(),
Element::Pad(_) |
Element::FpText(_) |
Element::At(_) |
Element::Layer(_) |
Element::TEdit(_) |
Element::Descr(_) |
Element::Path(_) |
Element::Model(_) |
Element::TStamp(_) |
Element::SolderMaskMargin(_) |
Element::Clearance(_) |
Element::Tags(_) |
Element::Attr(_) |
Element::Locked => false,
Element::Pad(_)
| Element::FpText(_)
| Element::At(_)
| Element::Layer(_)
| Element::TEdit(_)
| Element::Descr(_)
| Element::Path(_)
| Element::Model(_)
| Element::TStamp(_)
| Element::SolderMaskMargin(_)
| Element::Clearance(_)
| Element::Tags(_)
| Element::Attr(_)
| Element::Locked => false,
}
}

Expand Down Expand Up @@ -795,7 +794,7 @@ pub enum PadType {

impl PadType {
/// convert a &str to a pad type
pub fn from_string(s: &str) -> Result<PadType,SexpError> {
pub fn from_string(s: &str) -> Result<PadType, SexpError> {
match s {
"smd" => Ok(PadType::Smd),
"thru_hole" => Ok(PadType::Pth),
Expand Down Expand Up @@ -854,6 +853,10 @@ pub enum LayerSide {
In1,
/// Inner layer 2
In2,
/// Inner layer 3
In3,
/// Inner layer 4
In4,
/// no side
None,
}
Expand Down Expand Up @@ -945,6 +948,8 @@ impl Layer {
"Edge" => LayerSide::Edge,
"In1" => LayerSide::In1,
"In2" => LayerSide::In2,
"In3" => LayerSide::In3,
"In4" => LayerSide::In4,
"*" => LayerSide::Both,
x => return Err(format!("unknown layer side {}", x).into()),
};
Expand Down Expand Up @@ -1136,7 +1141,8 @@ impl BoundingBox for Pad {
fn bounding_box(&self) -> Bound {
let x = self.at.x;
let y = self.at.y;
let (dx, dy) = if (self.at.rot - 90.0).abs() < 0.1 || (self.at.rot + 90.0).abs() < 0.1
let (dx, dy) = if (self.at.rot - 90.0).abs() < 0.1
|| (self.at.rot + 90.0).abs() < 0.1
|| (self.at.rot - 270.0).abs() < 0.1
|| (self.at.rot + 270.0).abs() < 0.1
{
Expand Down
6 changes: 4 additions & 2 deletions src/footprint/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ use std::fmt;
use std::result;

// get from parent
use formatter::KicadFormatter;
use symbolic_expressions;
use symbolic_expressions::IntoSexp;
use formatter::KicadFormatter;
use KicadError;

// pub use footprint;
Expand All @@ -34,6 +34,8 @@ impl fmt::Display for Layer {
LayerSide::Edge => write!(f, "Edge."),
LayerSide::In1 => write!(f, "In1."),
LayerSide::In2 => write!(f, "In2."),
LayerSide::In3 => write!(f, "In3."),
LayerSide::In4 => write!(f, "In4."),
LayerSide::Both => write!(f, "*."),
LayerSide::None => Ok(()),
}?;
Expand Down Expand Up @@ -61,5 +63,5 @@ pub fn parse(s: &str) -> Result<Module, KicadError> {
}

mod data;
mod ser;
mod de;
mod ser;
86 changes: 48 additions & 38 deletions src/layout/data.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// (c) 2016-2017 Productize SPRL <joost@productize.be>

// from parent
use str_error;
use footprint;
use Sexp;
use layout::{Adjust, Bound, BoundingBox};
use std::{fmt, result};
use str_error;
use KicadError;
use Sexp;

/// a Kicad layout
#[derive(Debug)]
Expand Down Expand Up @@ -443,6 +443,8 @@ pub struct GrCircle {
pub width: f64,
/// timestamp
pub tstamp: Option<String>,
/// fill
pub fill: Option<String>,
}

impl Adjust for GrCircle {
Expand Down Expand Up @@ -663,16 +665,20 @@ impl Layout {
Element::Net(ref mut net) => {
update(&mut net.name)?;
}
Element::NetClass(ref mut nc) => for name in &mut nc.nets {
update(name)?;
},
Element::Module(ref mut module) => for m_e in &mut module.elements {
if let footprint::Element::Pad(ref mut pad) = *m_e {
if let Some(ref mut net) = pad.net {
update(&mut net.name)?;
Element::NetClass(ref mut nc) => {
for name in &mut nc.nets {
update(name)?;
}
}
Element::Module(ref mut module) => {
for m_e in &mut module.elements {
if let footprint::Element::Pad(ref mut pad) = *m_e {
if let Some(ref mut net) = pad.net {
update(&mut net.name)?;
}
}
}
},
}
Element::Zone(ref mut zone) => {
update(&mut zone.net_name)?;
}
Expand All @@ -697,20 +703,22 @@ impl Layout {
pub fn get_module(&self, reference: &str) -> Option<&footprint::Module> {
for x in &self.elements[..] {
match *x {
Element::Module(ref m) => if m.is_reference_with_name(reference) {
return Some(m);
},
Element::Via(_) |
Element::Segment(_) |
Element::Net(_) |
Element::NetClass(_) |
Element::GrText(_) |
Element::GrLine(_) |
Element::GrArc(_) |
Element::GrCircle(_) |
Element::Dimension(_) |
Element::Zone(_) |
Element::Other(_) => (),
Element::Module(ref m) => {
if m.is_reference_with_name(reference) {
return Some(m);
}
}
Element::Via(_)
| Element::Segment(_)
| Element::Net(_)
| Element::NetClass(_)
| Element::GrText(_)
| Element::GrLine(_)
| Element::GrArc(_)
| Element::GrCircle(_)
| Element::Dimension(_)
| Element::Zone(_)
| Element::Other(_) => (),
}
}
None
Expand All @@ -734,20 +742,22 @@ impl Layout {
{
for x in &mut self.elements {
match *x {
Element::Module(ref mut m) => if m.is_reference_with_name(reference) {
return Ok(fun(m));
},
Element::Via(_) |
Element::Segment(_) |
Element::Net(_) |
Element::NetClass(_) |
Element::GrText(_) |
Element::GrLine(_) |
Element::GrArc(_) |
Element::GrCircle(_) |
Element::Dimension(_) |
Element::Zone(_) |
Element::Other(_) => (),
Element::Module(ref mut m) => {
if m.is_reference_with_name(reference) {
return Ok(fun(m));
}
}
Element::Via(_)
| Element::Segment(_)
| Element::Net(_)
| Element::NetClass(_)
| Element::GrText(_)
| Element::GrLine(_)
| Element::GrArc(_)
| Element::GrCircle(_)
| Element::Dimension(_)
| Element::Zone(_)
| Element::Other(_) => (),
}
}
str_error(format!("did not find module with reference {}", reference))
Expand Down
Loading