use crate::types::{Coord, ParameterCollection};
#[derive(Debug, Clone, Default)]
pub struct PcbAdvancedPlacerOptions {
pub large_clearance: Coord,
pub small_clearance: Coord,
pub use_rotation: bool,
pub use_layer_swap: bool,
pub bypass_net1: String,
pub bypass_net2: String,
pub use_advanced_place: bool,
pub use_grouping: bool,
pub params: ParameterCollection,
}
impl PcbAdvancedPlacerOptions {
pub fn from_params(params: &ParameterCollection) -> Self {
Self {
large_clearance: params
.get("PLACELARGECLEAR")
.and_then(|v| v.as_coord().ok())
.unwrap_or_default(),
small_clearance: params
.get("PLACESMALLCLEAR")
.and_then(|v| v.as_coord().ok())
.unwrap_or_default(),
use_rotation: params
.get("PLACEUSEROTATION")
.map(|v| v.as_bool_or(true))
.unwrap_or(true),
use_layer_swap: params
.get("PLACEUSELAYERSWAP")
.map(|v| v.as_bool_or(false))
.unwrap_or(false),
bypass_net1: params
.get("PLACEBYPASSNET1")
.map(|v| v.as_str().to_string())
.unwrap_or_default(),
bypass_net2: params
.get("PLACEBYPASSNET2")
.map(|v| v.as_str().to_string())
.unwrap_or_default(),
use_advanced_place: params
.get("PLACEUSEADVANCEDPLACE")
.map(|v| v.as_bool_or(true))
.unwrap_or(true),
use_grouping: params
.get("PLACEUSEGROUPING")
.map(|v| v.as_bool_or(false))
.unwrap_or(false),
params: params.clone(),
}
}
pub fn to_params(&self) -> ParameterCollection {
let mut params = self.params.clone();
params.add("RECORD", "AdvancedPlacerOptions");
params.add_coord("PLACELARGECLEAR", self.large_clearance);
params.add_coord("PLACESMALLCLEAR", self.small_clearance);
params.add(
"PLACEUSEROTATION",
if self.use_rotation { "TRUE" } else { "FALSE" },
);
params.add(
"PLACEUSELAYERSWAP",
if self.use_layer_swap { "TRUE" } else { "FALSE" },
);
params.add("PLACEBYPASSNET1", &self.bypass_net1);
params.add("PLACEBYPASSNET2", &self.bypass_net2);
params.add(
"PLACEUSEADVANCEDPLACE",
if self.use_advanced_place {
"TRUE"
} else {
"FALSE"
},
);
params.add(
"PLACEUSEGROUPING",
if self.use_grouping { "TRUE" } else { "FALSE" },
);
params
}
}
#[derive(Debug, Clone, Default)]
pub struct PcbDrcOptions {
pub make_drc_file: bool,
pub make_drc_error_list: bool,
pub subnet_details: bool,
pub report_filename: String,
pub params: ParameterCollection,
}
impl PcbDrcOptions {
pub fn from_params(params: &ParameterCollection) -> Self {
Self {
make_drc_file: params
.get("DOMAKEDRCFILE")
.map(|v| v.as_bool_or(true))
.unwrap_or(true),
make_drc_error_list: params
.get("DOMAKEDRCERRORLIST")
.map(|v| v.as_bool_or(true))
.unwrap_or(true),
subnet_details: params
.get("DOSUBNETDETAILS")
.map(|v| v.as_bool_or(true))
.unwrap_or(true),
report_filename: params
.get("REPORTFILENAME")
.map(|v| v.as_str().to_string())
.unwrap_or_default(),
params: params.clone(),
}
}
pub fn to_params(&self) -> ParameterCollection {
let mut params = self.params.clone();
params.add("RECORD", "DesignRuleCheckerOptions");
params.add(
"DOMAKEDRCFILE",
if self.make_drc_file { "TRUE" } else { "FALSE" },
);
params.add(
"DOMAKEDRCERRORLIST",
if self.make_drc_error_list {
"TRUE"
} else {
"FALSE"
},
);
params.add(
"DOSUBNETDETAILS",
if self.subnet_details { "TRUE" } else { "FALSE" },
);
params.add("REPORTFILENAME", &self.report_filename);
params
}
}
#[derive(Debug, Clone, Default)]
pub struct PcbPinSwapOptions {
pub quiet: bool,
pub approximate: bool,
pub params: ParameterCollection,
}
impl PcbPinSwapOptions {
pub fn from_params(params: &ParameterCollection) -> Self {
Self {
quiet: params
.get("QUIET")
.map(|v| v.as_bool_or(false))
.unwrap_or(false),
approximate: params
.get("APPROXIMATE")
.map(|v| v.as_bool_or(false))
.unwrap_or(false),
params: params.clone(),
}
}
pub fn to_params(&self) -> ParameterCollection {
let mut params = self.params.clone();
params.add("RECORD", "PinSwapOptions");
params.add("QUIET", if self.quiet { "TRUE" } else { "FALSE" });
params.add(
"APPROXIMATE",
if self.approximate { "TRUE" } else { "FALSE" },
);
params
}
}