diff --git a/src/qelmt/arc.rs b/src/qelmt/arc.rs index 1c7c945..fb5b5a5 100644 --- a/src/qelmt/arc.rs +++ b/src/qelmt/arc.rs @@ -68,6 +68,15 @@ impl From<&Arc> for XMLElement { } } +impl Arc { + pub fn update_line_style(&mut self, update_fn: F) + where + F: FnOnce(&mut String), + { + update_fn(&mut self.style); + } +} + impl ScaleEntity for Arc { fn scale(&mut self, fact_x: f64, fact_y: f64) { self.x *= fact_x; diff --git a/src/qelmt/ellipse.rs b/src/qelmt/ellipse.rs index 7dc4b11..6cce6e5 100644 --- a/src/qelmt/ellipse.rs +++ b/src/qelmt/ellipse.rs @@ -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(&mut self, update_fn: F) + where + F: FnOnce(&mut String), + { + update_fn(&mut self.style); + } +} + impl ScaleEntity for Ellipse { fn scale(&mut self, fact_x: f64, fact_y: f64) { self.x *= fact_x; diff --git a/src/qelmt/line.rs b/src/qelmt/line.rs index 87c6f04..0acaf95 100644 --- a/src/qelmt/line.rs +++ b/src/qelmt/line.rs @@ -171,6 +171,15 @@ impl From<&Line> for XMLElement { } } +impl Line { + pub fn update_line_style(&mut self, update_fn: F) + where + F: FnOnce(&mut String), + { + update_fn(&mut self.style); + } +} + impl ScaleEntity for Line { fn scale(&mut self, fact_x: f64, fact_y: f64) { self.x1 *= fact_x; diff --git a/src/qelmt/mod.rs b/src/qelmt/mod.rs index 874bd39..c4a41ac 100644 --- a/src/qelmt/mod.rs +++ b/src/qelmt/mod.rs @@ -530,7 +530,7 @@ pub struct ObjectsBuilder<'a> { spline_step: u32, blocks: &'a [&'a Block], offset: Offset, - scale_fact: ScaleFactor, + scale_fact: ScaleFactor } impl<'a> ObjectsBuilder<'a> { @@ -575,6 +575,28 @@ impl<'a> ObjectsBuilder<'a> { if !self.ent.common.is_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 { @@ -582,6 +604,9 @@ impl<'a> ObjectsBuilder<'a> { EntityType::Circle(circle) => { 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.x += self.offset.x; ellipse.y -= self.offset.y; @@ -590,6 +615,9 @@ impl<'a> ObjectsBuilder<'a> { EntityType::Line(line) => { 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.x1 += self.offset.x; @@ -603,6 +631,9 @@ impl<'a> ObjectsBuilder<'a> { EntityType::Arc(arc) => { 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.x += self.offset.x; @@ -613,6 +644,9 @@ impl<'a> ObjectsBuilder<'a> { EntityType::Spline(spline) => { let mut poly: Polygon = (spline, self.spline_step).into(); + // 根据line_type_name更新线型样式 + poly.update_line_style(&update_line_style); + match poly.coordinates.len() { 0 | 1 => Err("Error removing empty Spline"), //I'll need to improve my understanding of splines and the math here @@ -668,6 +702,9 @@ impl<'a> ObjectsBuilder<'a> { EntityType::Ellipse(ellipse) => { 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.x += self.offset.x; ellipse.y -= self.offset.y; @@ -709,6 +746,9 @@ impl<'a> ObjectsBuilder<'a> { 2 => { 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.x1 += self.offset.x; @@ -721,6 +761,9 @@ impl<'a> ObjectsBuilder<'a> { } _ => { 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.x += self.offset.x; @@ -730,6 +773,9 @@ impl<'a> ObjectsBuilder<'a> { } else { 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); for cord in &mut poly.coordinates { @@ -746,6 +792,9 @@ impl<'a> ObjectsBuilder<'a> { 2 => { 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.x1 += self.offset.x; @@ -758,6 +807,9 @@ impl<'a> ObjectsBuilder<'a> { } _ => { 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.x += self.offset.x; @@ -767,6 +819,9 @@ impl<'a> ObjectsBuilder<'a> { } else { 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); for cord in &mut poly.coordinates { diff --git a/src/qelmt/polygon.rs b/src/qelmt/polygon.rs index 7c2662f..b10a53a 100644 --- a/src/qelmt/polygon.rs +++ b/src/qelmt/polygon.rs @@ -214,6 +214,15 @@ impl From<&Polygon> for XMLElement { } } +impl Polygon { + pub fn update_line_style(&mut self, update_fn: F) + where + F: FnOnce(&mut String), + { + update_fn(&mut self.style); + } +} + impl ScaleEntity for Polygon { fn scale(&mut self, fact_x: f64, fact_y: f64) { self.coordinates.iter_mut().for_each(|coord| {