forked from 1b-agent/opencadstudio-upstream
Dimensional constraints: dynamic dimension persistence, lock mark, display variables, DIMCONSTRAINT
The dynamic dimension of a dimensional constraint is now linked in the drawing file (AcDbAssocDependency + AcDbAssocDimDependencyBody on the constraint node), reread on load, hidden by DCHIDE/DYNCONSTRAINTDISPLAY and never plotted; it carries a lock mark before its text. New CONSTRAINTNAMEFORMAT and DYNCONSTRAINTDISPLAY variables and the DIMCONSTRAINT option front end. A transformed entity whose own end points a driving dimension measures keeps only the first constraint point, so a scaled line returns to its dimension value. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
72fd3fd35b
commit
971abe64a4
12 files changed
+433
-24
No files matched your search
@@ -390,6 +390,70 @@ impl CadCommand for DimConstraintCommand {
|
||||
}
|
||||
}
|
||||
|
||||
/// `DIMCONSTRAINT`: the reference's option front end for the dimensional
|
||||
/// constraint family; each choice runs the focused command.
|
||||
pub struct DimConstraintMenuCommand;
|
||||
|
||||
impl DimConstraintMenuCommand {
|
||||
fn dispatch(keyword: &str) -> Option<&'static str> {
|
||||
Some(match keyword {
|
||||
"L" | "LINEAR" => "DCLINEAR",
|
||||
"H" | "HORIZONTAL" => "DCHORIZONTAL",
|
||||
"V" | "VERTICAL" => "DCVERTICAL",
|
||||
"A" | "ALIGNED" => "DCALIGNED",
|
||||
"AN" | "ANGULAR" => "DCANGULAR",
|
||||
"R" | "RADIAL" | "RADIUS" => "DCRADIUS",
|
||||
"D" | "DIAMETER" => "DCDIAMETER",
|
||||
"C" | "CONVERT" => "DCCONVERT",
|
||||
_ => return None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl CadCommand for DimConstraintMenuCommand {
|
||||
fn name(&self) -> &'static str {
|
||||
"DIMCONSTRAINT"
|
||||
}
|
||||
|
||||
fn prompt(&self) -> String {
|
||||
"DIMCONSTRAINT Enter dimensional constraint option [Linear/Horizontal/Vertical/Aligned/ANgular/Radial/Diameter/Convert] <Aligned>:".to_string()
|
||||
}
|
||||
|
||||
fn options(&self) -> Vec<CmdOption> {
|
||||
vec![
|
||||
CmdOption::new("Linear", "L"),
|
||||
CmdOption::new("Horizontal", "H"),
|
||||
CmdOption::new("Vertical", "V"),
|
||||
CmdOption::new("Aligned", "A"),
|
||||
CmdOption::new("ANgular", "AN"),
|
||||
CmdOption::new("Radial", "R"),
|
||||
CmdOption::new("Diameter", "D"),
|
||||
CmdOption::new("Convert", "C"),
|
||||
]
|
||||
}
|
||||
|
||||
fn wants_text_input(&self) -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
fn on_text_input(&mut self, text: &str) -> Option<CmdResult> {
|
||||
let keyword = text.trim().trim_start_matches('_').to_ascii_uppercase();
|
||||
Self::dispatch(&keyword).map(|command| CmdResult::Dispatch(command.to_string()))
|
||||
}
|
||||
|
||||
fn on_point(&mut self, _point: DVec3) -> CmdResult {
|
||||
CmdResult::NeedPoint
|
||||
}
|
||||
|
||||
fn on_enter(&mut self) -> CmdResult {
|
||||
CmdResult::Dispatch("DCALIGNED".to_string())
|
||||
}
|
||||
|
||||
fn on_escape(&mut self) -> CmdResult {
|
||||
CmdResult::Cancel
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
@@ -26,7 +26,7 @@ mod tools;
|
||||
mod value;
|
||||
pub use coincident::{coincident_tool, CoincidentConstraintCommand};
|
||||
pub use concentric::ConcentricConstraintCommand;
|
||||
pub use dim_constraint::{DimConstraintAxis, DimConstraintCommand};
|
||||
pub use dim_constraint::{DimConstraintAxis, DimConstraintCommand, DimConstraintMenuCommand};
|
||||
pub use constraint_bar::ConstraintBarOptionCommand;
|
||||
pub use equal_command::EqualConstraintCommand;
|
||||
pub use equal_distance::{equal_distance_tool, EqualDistanceConstraintCommand};
|
||||
@@ -158,7 +158,7 @@ inventory::submit!(crate::command::CommandRegistration {
|
||||
names: &[
|
||||
"AUTOCONSTRAIN", "CONSTRAINTSETTINGS", "GCSMOOTH", "GCSHOW", "GCHIDE", "GCRESET",
|
||||
"GCSHOWALL", "GCHIDEALL", "DCSHOW", "DCHIDE", "DCSHOWALL", "DCHIDEALL",
|
||||
"DCCONVERT", "DELCONSTRAINT",
|
||||
"DCCONVERT", "DELCONSTRAINT", "DIMCONSTRAINT",
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user