forked from 1b-agent/opencadstudio-upstream
feat(units): read back every form the drawing writes
The readout learned to write lengths as 5'-6 1/2" and angles as N 45d0'0" E, but typed input was still a bare parse::<f64>() — a coordinate could be displayed and not entered. Give the formatters their inverses. parse_length takes feet and inches separated by a dash, a space, or nothing, with the closing quote optional, and whole-plus-fraction in any of those forms: 5', 60", 5'-9", 5'9-1/2, 9-1/2, 1/2. A leading minus is a sign; the one inside 5'-9" is a separator, since after feet there is nothing left to subtract from. parse_angle reads the mark that says which convention an angle is in — g for grads, r for radians, d/'/" for degrees-minutes-seconds, compass letters for a surveyor's bearing — and reads a bare number in whichever convention the drawing is set to. ANGBASE and ANGDIR now apply, but only where they mean something. Which way a thing points is measured from the drawing's zero and runs the way it says; how wide an arc opens is the same number whatever zero is counted from. format_direction and parse_direction are the pair for directions, and the polar readout and polar input both go through them, so the bearing shown is the bearing accepted. format_angle stays for sizes, where applying a base angle would corrupt the value. The command prompts follow the same rule, each classified rather than swept: OFFSET distance, FILLET radius, CHAMFER distances, ARRAY and MINSERT spacing, TRACE width, HELIX, and EXTRUDE height read lengths; the four dimension text-rotation prompts, ARRAY's total angle and INSERT's rotation read angles. MLINE's scale and INSERT's scale factor are left alone — a multiplier has no unit to be written in. INSERT read both through one parse; they are now separate. The typed variants also take a decimal comma, which a single-value prompt has no other use for. parse_length itself does not: inside a coordinate the comma separates the axes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
523b85f42b
commit
6cbec232bb
18 files changed
+298
-58
No files matched your search
@@ -177,7 +177,8 @@ impl CadCommand for ArrayRectCommand {
|
||||
let row_sp = if t.is_empty() {
|
||||
self.default_row_sp
|
||||
} else {
|
||||
let v = t.parse::<f64>().unwrap_or(self.default_row_sp);
|
||||
let v = crate::entities::common::parse_typed_length(t)
|
||||
.unwrap_or(self.default_row_sp);
|
||||
defaults::set_array_row_sp(v);
|
||||
self.default_row_sp = v;
|
||||
v
|
||||
@@ -189,7 +190,8 @@ impl CadCommand for ArrayRectCommand {
|
||||
let col_sp = if t.is_empty() {
|
||||
self.default_col_sp
|
||||
} else {
|
||||
let v = t.parse::<f64>().unwrap_or(self.default_col_sp);
|
||||
let v = crate::entities::common::parse_typed_length(t)
|
||||
.unwrap_or(self.default_col_sp);
|
||||
defaults::set_array_col_sp(v);
|
||||
v
|
||||
};
|
||||
@@ -341,7 +343,10 @@ impl CadCommand for ArrayPolarCommand {
|
||||
let total_deg = if t.is_empty() {
|
||||
self.default_angle
|
||||
} else {
|
||||
let v = t.parse::<f64>().unwrap_or(self.default_angle);
|
||||
// Held in degrees, which is what the stored default is.
|
||||
let v = crate::entities::common::parse_typed_angle(t)
|
||||
.map(f64::to_degrees)
|
||||
.unwrap_or(self.default_angle);
|
||||
defaults::set_array_p_angle(v);
|
||||
v
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user