新增获取动态字体宽度系数

qdj
邱德佳 4 months ago
parent 842daed2a3
commit 2bbb51b91d

@ -30,6 +30,7 @@ pub struct DynamicText {
frame: bool,
text_height: f64,
text_width: f64,
pub relative_x_scale_factor: f64,
keep_visual_rotation: bool,
color: HexColor,
reference_rectangle_width: f64,
@ -59,6 +60,7 @@ impl From<&DynamicText> for XMLElement {
println!("文本:{}", txt.text);
println!("对齐方式:{}, {}", txt.h_alignment, txt.v_alignment);
println!("文本宽度: {}", txt.text_width);
println!("relative_x_scale_factor: {}", txt.relative_x_scale_factor);
println!("文本高度:{}", pt_size);
println!("初始左下角位置: x={}, y={}", txt.x, txt.y);
println!("初始对齐位置: x={}, y={}", txt.align_x, txt.align_y);
@ -132,6 +134,7 @@ impl From<&DynamicText> for XMLElement {
dtxt_xml.add_attribute("frame", txt.frame);
dtxt_xml.add_attribute("text_height", txt.text_height);
dtxt_xml.add_attribute("text_width", txt.text_width);
dtxt_xml.add_attribute("relative_x_scale_factor", two_dec(txt.relative_x_scale_factor));
dtxt_xml.add_attribute("color", txt.color.display_rgb());
dtxt_xml.add_attribute("align_x", two_dec(align_x));
dtxt_xml.add_attribute("align_y", two_dec(align_y));
@ -239,7 +242,7 @@ impl<'a> DTextBuilder<'a> {
reference_rectangle_width,
align_x,
align_y,
relative_x_scale_factor,
) = match self.text {
TextEntity::Text(txt) => {
// let (x, y) = if txt.horizontal_text_justification == HorizontalTextJustification::Left && (txt.vertical_text_justification == VerticalTextJustification::Bottom || txt.vertical_text_justification == VerticalTextJustification::Baseline) {
@ -259,7 +262,8 @@ impl<'a> DTextBuilder<'a> {
VAlignment::from_text_entity(txt.vertical_text_justification, false),
0.0, // as Placeholder: no "reference_rectangle_width" with Text!!!
txt.second_alignment_point.x,
-txt.second_alignment_point.y
-txt.second_alignment_point.y,
txt.width_factor,
)},
TextEntity::MText(mtxt) => {
// 计算实际的旋转角度优先使用x_axis_direction向量
@ -300,6 +304,7 @@ impl<'a> DTextBuilder<'a> {
mtxt.reference_rectangle_width,
mtxt.insertion_point.x,
-mtxt.insertion_point.y,
1.0,
)},
TextEntity::Attrib(attrib) => {
// 根据DXF文本对齐规则当水平对齐不是Left时使用second_alignment_point
@ -322,7 +327,8 @@ impl<'a> DTextBuilder<'a> {
VAlignment::from_text_entity(attrib.vertical_text_justification, true),
0.0, // as Placeholder: not need to check if Attrib has something similar
attrib.second_alignment_point.x,
-attrib.second_alignment_point.y
-attrib.second_alignment_point.y,
attrib.width_factor,
)
},
};
@ -358,8 +364,14 @@ impl<'a> DTextBuilder<'a> {
dbg!(&y);
dbg!(&self.text);*/
let value = super::strip_mtext_control_sequences(&value);
// 将 DXF 中读取到的 text_height 放大 2 倍(用户要求)
// 将 DXF 中读取到的 text_height 放大 2 倍(用户要求)
let text_height = text_height * 2.0;
let text_width = if reference_rectangle_width > 0.0 {
reference_rectangle_width
} else {
estimate_text_width(&value, text_height, relative_x_scale_factor)
};
DynamicText {
//x: x - (calc_width as f64/2.0),
x,
@ -387,7 +399,8 @@ impl<'a> DTextBuilder<'a> {
text_from: "UserText".into(),
frame: false,
text_height,
text_width: -1.0, // for now, until I figure out what this should be
text_width,
relative_x_scale_factor,
color: self.color.unwrap_or(HexColor::BLACK),
text: value,
@ -482,3 +495,29 @@ pub fn adjust_mtext_coordinates(
(adjusted_x, adjusted_y)
}
fn estimate_text_width(text: &str, line_height: f64, relative_x_scale_factor: f64) -> f64 {
let effective_height = line_height.abs();
if effective_height == 0.0 {
return 0.0;
}
let base_width = text
.lines()
.map(|line| line.graphemes(true).count() as f64)
.fold(0.0, f64::max);
let base_width = if base_width > 0.0 {
base_width * effective_height * 0.75
} else {
effective_height
};
let scale = if relative_x_scale_factor.abs() <= f64::EPSILON {
1.0
} else {
relative_x_scale_factor
};
base_width * scale
}

Loading…
Cancel
Save