forked from 1b-agent/opencadstudio-upstream
Merge pull request #985 from HakanSeven12/fix-dimaunit-surveyor
fix(dimension): render surveyor angular units
This commit is contained in:
23 files changed
+101
-1
No files matched your search
@@ -3599,6 +3599,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = نقل النص إلى الخارج أولًا
|
.move-text-outside-first = نقل النص إلى الخارج أولًا
|
||||||
.period = نقطة
|
.period = نقطة
|
||||||
.space = مسافة
|
.space = مسافة
|
||||||
|
.surveyors-units = وحدات المسّاح
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = تباعد المحاذاة
|
.alignment-spacing = تباعد المحاذاة
|
||||||
|
|||||||
@@ -3587,6 +3587,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Първо премести текста навън
|
.move-text-outside-first = Първо премести текста навън
|
||||||
.period = Точка
|
.period = Точка
|
||||||
.space = Интервал
|
.space = Интервал
|
||||||
|
.surveyors-units = Геодезически единици
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Разстояние на подравняване
|
.alignment-spacing = Разстояние на подравняване
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Nejprve přesuňte text ven
|
.move-text-outside-first = Nejprve přesuňte text ven
|
||||||
.period = Období
|
.period = Období
|
||||||
.space = Mezerník
|
.space = Mezerník
|
||||||
|
.surveyors-units = Zeměměřické jednotky
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Rozteč zarovnání
|
.alignment-spacing = Rozteč zarovnání
|
||||||
|
|||||||
@@ -3585,6 +3585,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Zuerst Text nach außen verschieben
|
.move-text-outside-first = Zuerst Text nach außen verschieben
|
||||||
.period = Punkt
|
.period = Punkt
|
||||||
.space = Leerzeichen
|
.space = Leerzeichen
|
||||||
|
.surveyors-units = Vermessungseinheiten
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Ausrichtungsabstand
|
.alignment-spacing = Ausrichtungsabstand
|
||||||
|
|||||||
@@ -3588,6 +3588,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Move text outside first
|
.move-text-outside-first = Move text outside first
|
||||||
.period = Period
|
.period = Period
|
||||||
.space = Space
|
.space = Space
|
||||||
|
.surveyors-units = Surveyor's units
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Alignment spacing
|
.alignment-spacing = Alignment spacing
|
||||||
|
|||||||
@@ -3587,6 +3587,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Mover primero el texto fuera
|
.move-text-outside-first = Mover primero el texto fuera
|
||||||
.period = Punto
|
.period = Punto
|
||||||
.space = Espacio
|
.space = Espacio
|
||||||
|
.surveyors-units = Unidades de topografía
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Espaciado de alineación
|
.alignment-spacing = Espaciado de alineación
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Siirrä teksti ensin ulos
|
.move-text-outside-first = Siirrä teksti ensin ulos
|
||||||
.period = Kausi
|
.period = Kausi
|
||||||
.space = Välilyönti
|
.space = Välilyönti
|
||||||
|
.surveyors-units = Maanmittausyksiköt
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Tasausvälit
|
.alignment-spacing = Tasausvälit
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Déplacer d’abord le texte à l’extérieur
|
.move-text-outside-first = Déplacer d’abord le texte à l’extérieur
|
||||||
.period = Point
|
.period = Point
|
||||||
.space = Espace
|
.space = Espace
|
||||||
|
.surveyors-units = Unités d’arpentage
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Espacement d’alignement
|
.alignment-spacing = Espacement d’alignement
|
||||||
|
|||||||
@@ -3575,6 +3575,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = पहले पाठ बाहर ले जाएँ
|
.move-text-outside-first = पहले पाठ बाहर ले जाएँ
|
||||||
.period = दशमलव बिंदु
|
.period = दशमलव बिंदु
|
||||||
.space = रिक्त स्थान
|
.space = रिक्त स्थान
|
||||||
|
.surveyors-units = सर्वेक्षण इकाइयाँ
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = संरेखण अंतराल
|
.alignment-spacing = संरेखण अंतराल
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Először mozgassa ki a szöveget
|
.move-text-outside-first = Először mozgassa ki a szöveget
|
||||||
.period = Időszak
|
.period = Időszak
|
||||||
.space = Szóköz
|
.space = Szóköz
|
||||||
|
.surveyors-units = Földmérési egységek
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Igazítási távolság
|
.alignment-spacing = Igazítási távolság
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Sposta prima il testo all'esterno
|
.move-text-outside-first = Sposta prima il testo all'esterno
|
||||||
.period = Periodo
|
.period = Periodo
|
||||||
.space = Spazio
|
.space = Spazio
|
||||||
|
.surveyors-units = Unità topografiche
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Spaziatura di allineamento
|
.alignment-spacing = Spaziatura di allineamento
|
||||||
|
|||||||
@@ -3575,6 +3575,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = 先に寸法値を外側へ移動
|
.move-text-outside-first = 先に寸法値を外側へ移動
|
||||||
.period = ピリオド
|
.period = ピリオド
|
||||||
.space = 空白
|
.space = 空白
|
||||||
|
.surveyors-units = 測量単位
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = 位置合わせ間隔
|
.alignment-spacing = 位置合わせ間隔
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = 먼저 텍스트를 외부로 이동하세요.
|
.move-text-outside-first = 먼저 텍스트를 외부로 이동하세요.
|
||||||
.period = 기간
|
.period = 기간
|
||||||
.space = 스페이스바
|
.space = 스페이스바
|
||||||
|
.surveyors-units = 측량 단위
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = 정렬 간격
|
.alignment-spacing = 정렬 간격
|
||||||
|
|||||||
@@ -3587,6 +3587,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Eerst tekst naar buiten verplaatsen
|
.move-text-outside-first = Eerst tekst naar buiten verplaatsen
|
||||||
.period = Punt
|
.period = Punt
|
||||||
.space = Spatie
|
.space = Spatie
|
||||||
|
.surveyors-units = Landmeeteenheden
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Uitlijningsafstand
|
.alignment-spacing = Uitlijningsafstand
|
||||||
|
|||||||
@@ -3586,6 +3586,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Najpierw przenieś tekst na zewnątrz
|
.move-text-outside-first = Najpierw przenieś tekst na zewnątrz
|
||||||
.period = Okres
|
.period = Okres
|
||||||
.space = Spacja
|
.space = Spacja
|
||||||
|
.surveyors-units = Jednostki geodezyjne
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Rozstaw wyrównania
|
.alignment-spacing = Rozstaw wyrównania
|
||||||
|
|||||||
@@ -3587,6 +3587,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Mover primeiro o texto para fora
|
.move-text-outside-first = Mover primeiro o texto para fora
|
||||||
.period = Ponto
|
.period = Ponto
|
||||||
.space = Espaço
|
.space = Espaço
|
||||||
|
.surveyors-units = Unidades de agrimensura
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Espaçamento de alinhamento
|
.alignment-spacing = Espaçamento de alinhamento
|
||||||
|
|||||||
@@ -3590,6 +3590,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Сначала вынести текст
|
.move-text-outside-first = Сначала вынести текст
|
||||||
.period = Точка
|
.period = Точка
|
||||||
.space = Пробел
|
.space = Пробел
|
||||||
|
.surveyors-units = Геодезические единицы
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Интервал выравнивания
|
.alignment-spacing = Интервал выравнивания
|
||||||
|
|||||||
@@ -3511,6 +3511,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = Önce metni dışarı taşı
|
.move-text-outside-first = Önce metni dışarı taşı
|
||||||
.period = Nokta
|
.period = Nokta
|
||||||
.space = Boşluk
|
.space = Boşluk
|
||||||
|
.surveyors-units = Haritacılık birimleri
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = Hizalama aralığı
|
.alignment-spacing = Hizalama aralığı
|
||||||
|
|||||||
@@ -3570,6 +3570,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = 优先将文字移到外部
|
.move-text-outside-first = 优先将文字移到外部
|
||||||
.period = 句点
|
.period = 句点
|
||||||
.space = 空格
|
.space = 空格
|
||||||
|
.surveyors-units = 测量单位
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = 对齐间距
|
.alignment-spacing = 对齐间距
|
||||||
|
|||||||
@@ -3582,6 +3582,7 @@ dimstyle =
|
|||||||
.move-text-outside-first = 優先將文字移到外部
|
.move-text-outside-first = 優先將文字移到外部
|
||||||
.period = 句點
|
.period = 句點
|
||||||
.space = 空白鍵
|
.space = 空白鍵
|
||||||
|
.surveyors-units = 測量單位
|
||||||
|
|
||||||
style-manager =
|
style-manager =
|
||||||
.alignment-spacing = 對齊間距
|
.alignment-spacing = 對齊間距
|
||||||
|
|||||||
@@ -6602,6 +6602,8 @@ fn format_angular_value(measurement_deg: f64, style: Option<&DimStyle>) -> Strin
|
|||||||
swap_decimal_sep(&apply_angular_zero_suppression(&raw, azin), decimal_separator)
|
swap_decimal_sep(&apply_angular_zero_suppression(&raw, azin), decimal_separator)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
// 4 = Surveyor's units
|
||||||
|
4 => format_surveyor(measurement_deg, adec, azin, decimal_separator),
|
||||||
// 0 or unknown = Decimal Degrees
|
// 0 or unknown = Decimal Degrees
|
||||||
_ => {
|
_ => {
|
||||||
let raw = format!("{:.*}", adec, measurement_deg);
|
let raw = format!("{:.*}", adec, measurement_deg);
|
||||||
@@ -6613,6 +6615,48 @@ fn format_angular_value(measurement_deg: f64, style: Option<&DimStyle>) -> Strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Surveyor's units (DIMAUNIT 4): a bearing away from north or south toward
|
||||||
|
/// east or west, so the quoted angle never exceeds a quarter turn. Due north,
|
||||||
|
/// south, east and west have no bearing to quote and are written as the single
|
||||||
|
/// letter, which is also what keeps a quarter turn from reading as a
|
||||||
|
/// contradictory `N 90d0'0" E`. The bearing is DMS, so it carries DIMADEC,
|
||||||
|
/// DIMAZIN and DIMDSEP the same way the DMS format does.
|
||||||
|
fn format_surveyor(deg: f64, sec_dec: usize, azin: i16, decimal_separator: i16) -> String {
|
||||||
|
// Quantise before choosing a cardinal or a quadrant, so a value a hair
|
||||||
|
// under a cardinal direction does not print a quarter-turn bearing.
|
||||||
|
let scale = 3600.0 * 10f64.powi(sec_dec.min(8) as i32);
|
||||||
|
let turn = 360.0 * scale;
|
||||||
|
let ticks = (deg.rem_euclid(360.0) * scale).round().rem_euclid(turn);
|
||||||
|
let at = |d: f64| (ticks - d * scale).abs() < 0.5;
|
||||||
|
if at(0.0) {
|
||||||
|
return "E".into();
|
||||||
|
}
|
||||||
|
if at(90.0) {
|
||||||
|
return "N".into();
|
||||||
|
}
|
||||||
|
if at(180.0) {
|
||||||
|
return "W".into();
|
||||||
|
}
|
||||||
|
if at(270.0) {
|
||||||
|
return "S".into();
|
||||||
|
}
|
||||||
|
let d = ticks / scale;
|
||||||
|
// Measured from the nearer pole, toward the side the angle falls on.
|
||||||
|
let (pole, bearing, side) = if d < 90.0 {
|
||||||
|
("N", 90.0 - d, "E")
|
||||||
|
} else if d < 180.0 {
|
||||||
|
("N", d - 90.0, "W")
|
||||||
|
} else if d < 270.0 {
|
||||||
|
("S", 270.0 - d, "W")
|
||||||
|
} else {
|
||||||
|
("S", d - 270.0, "E")
|
||||||
|
};
|
||||||
|
format!(
|
||||||
|
"{pole} {} {side}",
|
||||||
|
format_dms(bearing, sec_dec, azin, decimal_separator)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn format_dms(deg: f64, sec_dec: usize, azin: i16, decimal_separator: i16) -> String {
|
fn format_dms(deg: f64, sec_dec: usize, azin: i16, decimal_separator: i16) -> String {
|
||||||
let sign = if deg < 0.0 { "-" } else { "" };
|
let sign = if deg < 0.0 { "-" } else { "" };
|
||||||
let scale = 10_u64.pow(sec_dec.min(8) as u32) as f64;
|
let scale = 10_u64.pow(sec_dec.min(8) as u32) as f64;
|
||||||
@@ -7305,6 +7349,41 @@ mod dimtad_tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod angular_unit_tests {
|
||||||
|
use super::format_angular_value;
|
||||||
|
use acadrust::tables::DimStyle;
|
||||||
|
|
||||||
|
fn style(dimaunit: i16, dimadec: i16) -> DimStyle {
|
||||||
|
let mut s = DimStyle::standard();
|
||||||
|
s.dimaunit = dimaunit;
|
||||||
|
s.dimadec = dimadec;
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
// DIMAUNIT 4 is Surveyor's units. It used to fall through to the decimal
|
||||||
|
// branch, so an angular dimension in a drawing authored with surveyor
|
||||||
|
// units read as plain degrees while AUNITS=4 elsewhere wrote a bearing.
|
||||||
|
#[test]
|
||||||
|
fn surveyor_units_write_a_bearing() {
|
||||||
|
assert_eq!(format_angular_value(45.0, Some(&style(4, 0))), "N 45\u{b0}0'0\" E");
|
||||||
|
assert_eq!(format_angular_value(135.0, Some(&style(4, 0))), "N 45\u{b0}0'0\" W");
|
||||||
|
assert_eq!(format_angular_value(200.0, Some(&style(4, 0))), "S 70\u{b0}0'0\" W");
|
||||||
|
assert_eq!(format_angular_value(300.0, Some(&style(4, 0))), "S 30\u{b0}0'0\" E");
|
||||||
|
// A hair under a cardinal must not quote a quarter-turn bearing.
|
||||||
|
assert_eq!(format_angular_value(89.99999, Some(&style(4, 0))), "N");
|
||||||
|
assert_eq!(format_angular_value(90.0, Some(&style(4, 0))), "N");
|
||||||
|
assert_eq!(format_angular_value(0.0, Some(&style(4, 0))), "E");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The other unit formats are untouched.
|
||||||
|
#[test]
|
||||||
|
fn other_angular_units_unchanged() {
|
||||||
|
assert_eq!(format_angular_value(45.5, Some(&style(1, 0))), "45\u{b0}30'0\"");
|
||||||
|
assert_eq!(format_angular_value(90.0, Some(&style(2, 1))), "100.0g");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod dim_color_override_tests {
|
mod dim_color_override_tests {
|
||||||
use super::dim_color_index;
|
use super::dim_color_index;
|
||||||
|
|||||||
@@ -3224,6 +3224,7 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static
|
|||||||
"Suppress second extension line" => Some(("dimstyle", "suppress-second-extension-line")),
|
"Suppress second extension line" => Some(("dimstyle", "suppress-second-extension-line")),
|
||||||
"Suppress zero feet and zero inches" => Some(("dimstyle", "suppress-zero-feet-and-inches")),
|
"Suppress zero feet and zero inches" => Some(("dimstyle", "suppress-zero-feet-and-inches")),
|
||||||
"Suppress zero feet; show zero inches" => Some(("dimstyle", "suppress-zero-feet-show-zero-inches")),
|
"Suppress zero feet; show zero inches" => Some(("dimstyle", "suppress-zero-feet-show-zero-inches")),
|
||||||
|
"Surveyor's units" => Some(("dimstyle", "surveyors-units")),
|
||||||
"Symbols and Arrows" => Some(("dimstyle", "symbols-and-arrows")),
|
"Symbols and Arrows" => Some(("dimstyle", "symbols-and-arrows")),
|
||||||
"Symmetrical" => Some(("dimstyle", "symmetrical")),
|
"Symmetrical" => Some(("dimstyle", "symmetrical")),
|
||||||
"Text background" => Some(("dimstyle", "text-background")),
|
"Text background" => Some(("dimstyle", "text-background")),
|
||||||
|
|||||||
@@ -956,7 +956,7 @@ pub fn view_window<'a>(
|
|||||||
t!("Unit format"),
|
t!("Unit format"),
|
||||||
DsField::Dimaunit,
|
DsField::Dimaunit,
|
||||||
vals.dimaunit,
|
vals.dimaunit,
|
||||||
&[("0", "Decimal degrees"), ("1", "Degrees, minutes, seconds"), ("2", "Gradians"), ("3", "Radians")],
|
&[("0", "Decimal degrees"), ("1", "Degrees, minutes, seconds"), ("2", "Gradians"), ("3", "Radians"), ("4", "Surveyor's units")],
|
||||||
),
|
),
|
||||||
row![lbl(t!("Precision")), mk_field(DsField::Dimadec, vals.dimadec)]
|
row![lbl(t!("Precision")), mk_field(DsField::Dimadec, vals.dimadec)]
|
||||||
.spacing(8).align_y(iced::Center),
|
.spacing(8).align_y(iced::Center),
|
||||||
|
|||||||
Reference in new issue
Block a user