#![allow(dead_code)]
use crate::types::{Coord, CoordRect, UnknownFields};
use altium_format_derive::AltiumRecord;
use super::{LineWidth, PinConglomerateFlags, PinElectricalType, PinSymbol, SchGraphicalBase};
#[derive(Debug, Clone, Default, AltiumRecord)]
#[altium(record_id = 2, format = "params")]
pub struct SchPinNew {
#[altium(flatten)]
pub graphical: SchGraphicalBase,
#[altium(param = "SYMBOL_INNEREDGE", default)]
pub symbol_inner_edge: PinSymbol,
#[altium(param = "SYMBOL_OUTEREDGE", default)]
pub symbol_outer_edge: PinSymbol,
#[altium(param = "SYMBOL_INSIDE", default)]
pub symbol_inside: PinSymbol,
#[altium(param = "SYMBOL_OUTSIDE", default)]
pub symbol_outside: PinSymbol,
#[altium(param = "SYMBOL_LINEWIDTH", default)]
pub symbol_line_width: LineWidth,
#[altium(param = "DESCRIPTION", default)]
pub description: String,
#[altium(param = "FORMALTYPE", default)]
pub formal_type: i32,
#[altium(param = "ELECTRICAL", default)]
pub electrical: PinElectricalType,
#[altium(param = "PINCONGLOMERATE", default)]
pub pin_conglomerate: PinConglomerateFlags,
#[altium(param = "PINLENGTH", frac = "PINLENGTH_FRAC")]
pub pin_length: i32,
#[altium(param = "NAME", default)]
pub name: String,
#[altium(param = "DESIGNATOR", default)]
pub designator: String,
#[altium(param = "SWAPIDGROUP", default)]
pub swap_id_group: String,
#[altium(param = "SWAPIDPART", default)]
pub swap_id_part: i32,
#[altium(param = "SWAPIDSEQUENCE", default)]
pub swap_id_sequence: String,
#[altium(param = "HIDDENNETNAME", default)]
pub hidden_net_name: String,
#[altium(param = "DEFAULTVALUE", default)]
pub default_value: String,
#[altium(param = "PINPROPAGATIONDELAY", default)]
pub pin_propagation_delay: f64,
#[altium(param = "UNIQUEID", default)]
pub unique_id: String,
#[altium(unknown)]
pub unknown_params: UnknownFields,
}
impl SchPinNew {
pub fn is_name_visible(&self) -> bool {
self.pin_conglomerate
.contains(PinConglomerateFlags::DISPLAY_NAME_VISIBLE)
}
pub fn is_designator_visible(&self) -> bool {
self.pin_conglomerate
.contains(PinConglomerateFlags::DESIGNATOR_VISIBLE)
}
pub fn is_hidden(&self) -> bool {
self.pin_conglomerate.contains(PinConglomerateFlags::HIDE)
}
pub fn get_corner(&self) -> (i32, i32) {
let rotated = self
.pin_conglomerate
.contains(PinConglomerateFlags::ROTATED);
let flipped = self
.pin_conglomerate
.contains(PinConglomerateFlags::FLIPPED);
if rotated {
if flipped {
(
self.graphical.location_x,
self.graphical.location_y - self.pin_length,
)
} else {
(
self.graphical.location_x,
self.graphical.location_y + self.pin_length,
)
}
} else if flipped {
(
self.graphical.location_x - self.pin_length,
self.graphical.location_y,
)
} else {
(
self.graphical.location_x + self.pin_length,
self.graphical.location_y,
)
}
}
}
impl SchPinNew {
pub fn calculate_bounds(&self) -> CoordRect {
let (cx, cy) = self.get_corner();
CoordRect::from_points(
Coord::from_raw(self.graphical.location_x),
Coord::from_raw(self.graphical.location_y),
Coord::from_raw(cx),
Coord::from_raw(cy),
)
}
}