forked from 1b-agent/opencadstudio-upstream
feat: complete freehand sketch workflow
Co-authored-by: ramox81 <184937705+ramox81@users.noreply.github.com>
This commit is contained in:
commit
464971969c
32 files changed
+926
-113
No files matched your search
@@ -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 ──────────────────────────────────────────────────
|
||||
|
||||
Reference in new issue
Block a user