feat: complete freehand sketch workflow

Co-authored-by: ramox81 <184937705+ramox81@users.noreply.github.com>
This commit is contained in:
Hakan Sevenandramox81 committed 2026-08-21 00:17:44 +03:00
commit 464971969c
32 files changed
+926 -113

No files matched your search

+56
View File
@@ -1784,6 +1784,7 @@ fn fix_current_style_names(doc: &mut CadDocument) {
doc.header.current_mleader_style_name = v;
}
}
reflect_sketch_settings(doc);
}
/// Find the handle of the `DictionaryVariable` registered under `name` in any
@@ -1818,6 +1819,32 @@ pub(crate) fn drawing_variable(doc: &CadDocument, name: &str) -> Option<String>
vardict_value(doc, name)
}
fn reflect_sketch_settings(doc: &mut CadDocument) {
let sketch_type = vardict_value(doc, "SKPOLY")
.and_then(|value| value.parse::<i16>().ok())
.unwrap_or(doc.header.sketch_type)
.clamp(0, 2);
let increment = vardict_value(doc, "SKETCHINC")
.and_then(|value| value.parse::<f64>().ok())
.filter(|value| value.is_finite() && *value > 0.0)
.unwrap_or(doc.header.sketch_increment);
let tolerance = vardict_value(doc, "SKTOLERANCE")
.and_then(|value| value.parse::<f64>().ok())
.filter(|value| value.is_finite() && (0.0..=1.0).contains(value))
.unwrap_or(doc.header.sketch_tolerance);
doc.header.sketch_type = sketch_type;
doc.header.sketch_increment = if increment.is_finite() && increment > 0.0 {
increment
} else {
0.1
};
doc.header.sketch_tolerance = if tolerance.is_finite() {
tolerance.clamp(0.0, 1.0)
} else {
0.5
};
}
/// Write a drawing variable, creating the variable dictionary and record when
/// needed so new drawings preserve the value too.
pub(crate) fn set_drawing_variable(doc: &mut CadDocument, name: &str, value: &str) {
@@ -1859,6 +1886,31 @@ pub(crate) fn set_drawing_variable(doc: &mut CadDocument, name: &str, value: &st
}
}
pub(crate) fn set_sketch_settings(
doc: &mut CadDocument,
sketch_type: i16,
increment: f64,
tolerance: f64,
) {
let sketch_type = sketch_type.clamp(0, 2);
let increment = if increment.is_finite() && increment > 0.0 {
increment
} else {
0.1
};
let tolerance = if tolerance.is_finite() {
tolerance.clamp(0.0, 1.0)
} else {
0.5
};
doc.header.sketch_type = sketch_type;
doc.header.sketch_increment = increment;
doc.header.sketch_tolerance = tolerance;
set_drawing_variable(doc, "SKPOLY", &sketch_type.to_string());
set_drawing_variable(doc, "SKETCHINC", &increment.to_string());
set_drawing_variable(doc, "SKTOLERANCE", &tolerance.to_string());
}
/// The layout tab that was active when the drawing was saved — the `CTAB`
/// system variable (stored in the variable dictionary as a `DICTIONARYVAR`).
/// `None` when the file recorded no current tab.
@@ -1919,6 +1971,10 @@ fn sync_current_styles_on_save(doc: &mut CadDocument) {
set_drawing_variable(doc, "CMLEADERSTYLE", &mleader);
let annotation = doc.header.current_annotation_scale.clone();
set_drawing_variable(doc, "CANNOSCALE", &annotation);
let sketch_type = doc.header.sketch_type;
let increment = doc.header.sketch_increment;
let tolerance = doc.header.sketch_tolerance;
set_sketch_settings(doc, sketch_type, increment, tolerance);
}
// ── Corrupt-entity guard ──────────────────────────────────────────────────