maker_panel/features/
mechanical_solder_point.rs

1use super::InnerAtom;
2use crate::Layer;
3use geo::{Coordinate, Rect};
4use std::fmt;
5
6/// An interior feature that just renders a smiley on the front silkscreen.
7#[derive(Debug, Clone)]
8pub struct MechanicalSolderPoint {
9    center: Coordinate<f64>,
10    size: (f64, f64),
11    drill_radius: f64,
12}
13
14impl MechanicalSolderPoint {
15    /// Constructs an MSP with the specified width and height.
16    pub fn with_size(size: (f64, f64)) -> Self {
17        Self {
18            size,
19            ..Self::default()
20        }
21    }
22
23    fn rect(&self) -> Rect<f64> {
24        Rect::new(
25            self.center
26                + Coordinate {
27                    x: -self.size.0 / 2.,
28                    y: -self.size.1 / 2.,
29                },
30            self.center
31                + Coordinate {
32                    x: self.size.0 / 2.,
33                    y: self.size.1 / 2.,
34                },
35        )
36    }
37}
38
39impl Default for MechanicalSolderPoint {
40    fn default() -> Self {
41        Self {
42            center: [0., 0.].into(),
43            size: (1.175, 1.45),
44            drill_radius: 0.15,
45        }
46    }
47}
48
49impl fmt::Display for MechanicalSolderPoint {
50    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
51        write!(f, "msp({:?})", self.size)
52    }
53}
54
55impl super::InnerFeature for MechanicalSolderPoint {
56    fn name(&self) -> &'static str {
57        "msp"
58    }
59
60    fn translate(&mut self, v: Coordinate<f64>) {
61        self.center = self.center + v;
62    }
63
64    fn atoms(&self) -> Vec<InnerAtom> {
65        vec![
66            InnerAtom::Rect {
67                layer: Layer::BackCopper,
68                rect: self.rect(),
69            },
70            InnerAtom::Rect {
71                layer: Layer::BackMask,
72                rect: self.rect(),
73            },
74            InnerAtom::Rect {
75                layer: Layer::FrontCopper,
76                rect: self.rect(),
77            },
78            InnerAtom::Rect {
79                layer: Layer::FrontMask,
80                rect: self.rect(),
81            },
82            InnerAtom::Drill {
83                center: self.center,
84                radius: self.drill_radius,
85                plated: true,
86            },
87        ]
88    }
89}