增加处理虚线样式功能

master
liaoxianglian 5 months ago
parent 5ce0de699a
commit f8d92515bd

@ -68,6 +68,15 @@ impl From<&Arc> for XMLElement {
} }
} }
impl Arc {
pub fn update_line_style<F>(&mut self, update_fn: F)
where
F: FnOnce(&mut String),
{
update_fn(&mut self.style);
}
}
impl ScaleEntity for Arc { impl ScaleEntity for Arc {
fn scale(&mut self, fact_x: f64, fact_y: f64) { fn scale(&mut self, fact_x: f64, fact_y: f64) {
self.x *= fact_x; self.x *= fact_x;

@ -151,6 +151,19 @@ impl From<&Ellipse> for XMLElement {
} }
} }
impl Ellipse {
pub fn set_style(&mut self, style: String) {
self.style = style;
}
pub fn update_line_style<F>(&mut self, update_fn: F)
where
F: FnOnce(&mut String),
{
update_fn(&mut self.style);
}
}
impl ScaleEntity for Ellipse { impl ScaleEntity for Ellipse {
fn scale(&mut self, fact_x: f64, fact_y: f64) { fn scale(&mut self, fact_x: f64, fact_y: f64) {
self.x *= fact_x; self.x *= fact_x;

@ -171,6 +171,15 @@ impl From<&Line> for XMLElement {
} }
} }
impl Line {
pub fn update_line_style<F>(&mut self, update_fn: F)
where
F: FnOnce(&mut String),
{
update_fn(&mut self.style);
}
}
impl ScaleEntity for Line { impl ScaleEntity for Line {
fn scale(&mut self, fact_x: f64, fact_y: f64) { fn scale(&mut self, fact_x: f64, fact_y: f64) {
self.x1 *= fact_x; self.x1 *= fact_x;

@ -530,7 +530,7 @@ pub struct ObjectsBuilder<'a> {
spline_step: u32, spline_step: u32,
blocks: &'a [&'a Block], blocks: &'a [&'a Block],
offset: Offset, offset: Offset,
scale_fact: ScaleFactor, scale_fact: ScaleFactor
} }
impl<'a> ObjectsBuilder<'a> { impl<'a> ObjectsBuilder<'a> {
@ -575,6 +575,28 @@ impl<'a> ObjectsBuilder<'a> {
if !self.ent.common.is_visible { if !self.ent.common.is_visible {
return Err("Entity is not visible"); return Err("Entity is not visible");
} }
// 获取线型名称
let line_type_name: String = self.ent.common.line_type_name.clone();
// 通用样式修改函数根据line_type_name修改现有style中的line-style
let update_line_style = |style: &mut String| {
// 只有当line_type_name需要虚线样式时才进行修改提高性能
if line_type_name.contains("DASH") || line_type_name == "BORDURE" {
// 使用正则表达式替换line-style部分
if style.contains("line-style:") {
*style = style.replace(
&format!("line-style:{}",
if style.contains("line-style:normal") { "normal" }
else if style.contains("line-style:dashed") { "dashed" }
else { "normal" }
),
"line-style:dashed"
);
}
}
// 如果不是特殊线型,保持原有样式不变,避免不必要的操作
};
// 实体类型转换处理 // 实体类型转换处理
match &self.ent.specific { match &self.ent.specific {
@ -582,6 +604,9 @@ impl<'a> ObjectsBuilder<'a> {
EntityType::Circle(circle) => { EntityType::Circle(circle) => {
let mut ellipse: Ellipse = circle.into(); let mut ellipse: Ellipse = circle.into();
// 根据line_type_name更新线型样式
ellipse.update_line_style(&update_line_style);
ellipse.scale(self.scale_fact.x, self.scale_fact.y); ellipse.scale(self.scale_fact.x, self.scale_fact.y);
ellipse.x += self.offset.x; ellipse.x += self.offset.x;
ellipse.y -= self.offset.y; ellipse.y -= self.offset.y;
@ -590,6 +615,9 @@ impl<'a> ObjectsBuilder<'a> {
EntityType::Line(line) => { EntityType::Line(line) => {
let mut line: Line = line.into(); let mut line: Line = line.into();
// 根据line_type_name更新线型样式
line.update_line_style(&update_line_style);
line.scale(self.scale_fact.x, self.scale_fact.y); line.scale(self.scale_fact.x, self.scale_fact.y);
line.x1 += self.offset.x; line.x1 += self.offset.x;
@ -603,6 +631,9 @@ impl<'a> ObjectsBuilder<'a> {
EntityType::Arc(arc) => { EntityType::Arc(arc) => {
let mut arc: Arc = arc.into(); let mut arc: Arc = arc.into();
// 根据line_type_name更新线型样式
arc.update_line_style(&update_line_style);
arc.scale(self.scale_fact.x, self.scale_fact.y); arc.scale(self.scale_fact.x, self.scale_fact.y);
arc.x += self.offset.x; arc.x += self.offset.x;
@ -613,6 +644,9 @@ impl<'a> ObjectsBuilder<'a> {
EntityType::Spline(spline) => { EntityType::Spline(spline) => {
let mut poly: Polygon = (spline, self.spline_step).into(); let mut poly: Polygon = (spline, self.spline_step).into();
// 根据line_type_name更新线型样式
poly.update_line_style(&update_line_style);
match poly.coordinates.len() { match poly.coordinates.len() {
0 | 1 => Err("Error removing empty Spline"), 0 | 1 => Err("Error removing empty Spline"),
//I'll need to improve my understanding of splines and the math here //I'll need to improve my understanding of splines and the math here
@ -668,6 +702,9 @@ impl<'a> ObjectsBuilder<'a> {
EntityType::Ellipse(ellipse) => { EntityType::Ellipse(ellipse) => {
let mut ellipse: Ellipse = ellipse.into(); let mut ellipse: Ellipse = ellipse.into();
// 根据line_type_name更新线型样式
ellipse.update_line_style(&update_line_style);
ellipse.scale(self.scale_fact.x, self.scale_fact.y); ellipse.scale(self.scale_fact.x, self.scale_fact.y);
ellipse.x += self.offset.x; ellipse.x += self.offset.x;
ellipse.y -= self.offset.y; ellipse.y -= self.offset.y;
@ -709,6 +746,9 @@ impl<'a> ObjectsBuilder<'a> {
2 => { 2 => {
let mut line = Line::try_from(polyline)?; let mut line = Line::try_from(polyline)?;
// 根据line_type_name更新线型样式
line.update_line_style(&update_line_style);
line.scale(self.scale_fact.x, self.scale_fact.x); line.scale(self.scale_fact.x, self.scale_fact.x);
line.x1 += self.offset.x; line.x1 += self.offset.x;
@ -721,6 +761,9 @@ impl<'a> ObjectsBuilder<'a> {
} }
_ => { _ => {
if let Ok(mut ellipse) = Ellipse::try_from(polyline) { if let Ok(mut ellipse) = Ellipse::try_from(polyline) {
// 根据line_type_name更新线型样式
ellipse.update_line_style(&update_line_style);
ellipse.scale(self.scale_fact.x, self.scale_fact.y); ellipse.scale(self.scale_fact.x, self.scale_fact.y);
ellipse.x += self.offset.x; ellipse.x += self.offset.x;
@ -730,6 +773,9 @@ impl<'a> ObjectsBuilder<'a> {
} else { } else {
let mut poly: Polygon = polyline.into(); let mut poly: Polygon = polyline.into();
// 根据line_type_name更新线型样式
poly.update_line_style(&update_line_style);
poly.scale(self.scale_fact.x, self.scale_fact.y); poly.scale(self.scale_fact.x, self.scale_fact.y);
for cord in &mut poly.coordinates { for cord in &mut poly.coordinates {
@ -746,6 +792,9 @@ impl<'a> ObjectsBuilder<'a> {
2 => { 2 => {
let mut line = Line::try_from(lwpolyline)?; let mut line = Line::try_from(lwpolyline)?;
// 根据line_type_name更新线型样式
line.update_line_style(&update_line_style);
line.scale(self.scale_fact.x, self.scale_fact.y); line.scale(self.scale_fact.x, self.scale_fact.y);
line.x1 += self.offset.x; line.x1 += self.offset.x;
@ -758,6 +807,9 @@ impl<'a> ObjectsBuilder<'a> {
} }
_ => { _ => {
if let Ok(mut ellipse) = Ellipse::try_from(lwpolyline) { if let Ok(mut ellipse) = Ellipse::try_from(lwpolyline) {
// 根据line_type_name更新线型样式
ellipse.update_line_style(&update_line_style);
ellipse.scale(self.scale_fact.x, self.scale_fact.y); ellipse.scale(self.scale_fact.x, self.scale_fact.y);
ellipse.x += self.offset.x; ellipse.x += self.offset.x;
@ -767,6 +819,9 @@ impl<'a> ObjectsBuilder<'a> {
} else { } else {
let mut poly: Polygon = lwpolyline.into(); let mut poly: Polygon = lwpolyline.into();
// 根据line_type_name更新线型样式
poly.update_line_style(&update_line_style);
poly.scale(self.scale_fact.x, self.scale_fact.y); poly.scale(self.scale_fact.x, self.scale_fact.y);
for cord in &mut poly.coordinates { for cord in &mut poly.coordinates {

@ -214,6 +214,15 @@ impl From<&Polygon> for XMLElement {
} }
} }
impl Polygon {
pub fn update_line_style<F>(&mut self, update_fn: F)
where
F: FnOnce(&mut String),
{
update_fn(&mut self.style);
}
}
impl ScaleEntity for Polygon { impl ScaleEntity for Polygon {
fn scale(&mut self, fact_x: f64, fact_y: f64) { fn scale(&mut self, fact_x: f64, fact_y: f64) {
self.coordinates.iter_mut().for_each(|coord| { self.coordinates.iter_mut().for_each(|coord| {

Loading…
Cancel
Save