forked from 1b-agent/opencadstudio-upstream
Command aliases (L→LINE, CC→COPYCLIP) were scattered across dispatch match arms and CommandRegistration name arrays. Move them all into a single user-editable file: - assets/ocad.pgp: shipped default alias table (ALIAS,*COMMAND format), embedded and copied to config/ocad.pgp on first launch; only that user copy is read after. AA→AREA default closes #286. - resolve_alias() rewrites the leading command token at the top of dispatch_command_inner, so aliases resolve for every path (families, plugins, Repeat menu). Args after the first space are untouched. - Autocomplete hides alias keys and, when the whole input is an alias, surfaces its target command as the top (highlighted) suggestion so the highlight matches what Enter runs (AA→AREA, L→LINE). - ALIASEDIT opens a new editor modal (add/edit/delete rows) with an Apply button; Apply persists to ocad.pgp, closing discards unapplied edits. - Strip alias tokens from all 8 dispatch match-arm files and 71 module CommandRegistration arrays, keeping canonical/synonym/distinct-command names. ocad.pgp is now the sole source: deleting or remapping an alias there takes effect. CUI stays on the keyboard-shortcut panel. Co-Authored-By: Claude Opus 4.8 <[email protected]>
104 lines
3.2 KiB
Rust
104 lines
3.2 KiB
Rust
// DIMBREAK command — insert a break in a dimension/extension line where
|
|
// another object crosses it.
|
|
//
|
|
// Simplified workflow:
|
|
// 1. Select the dimension to break
|
|
// 2. Select the object that crosses it (or Enter for AUTO mode on all crossings)
|
|
//
|
|
// Because breaking a dimension line requires deep geometric intersection logic
|
|
// that depends on the renderer, this implementation records the target handles
|
|
// and emits a ReplaceEntity sentinel that commands.rs intercepts to apply the break.
|
|
|
|
use acadrust::Handle;
|
|
use glam::DVec3;
|
|
|
|
use crate::command::{CadCommand, CmdResult};
|
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
|
|
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/dim_break.svg"));
|
|
|
|
pub fn tool() -> ToolDef {
|
|
ToolDef {
|
|
id: "DIMBREAK",
|
|
label: "Dim Break",
|
|
icon: ICON,
|
|
event: ModuleEvent::Command("DIMBREAK".to_string()),
|
|
}
|
|
}
|
|
|
|
enum Step {
|
|
PickDim,
|
|
PickCrossing { dim_handle: Handle },
|
|
}
|
|
|
|
pub struct DimBreakCommand {
|
|
step: Step,
|
|
}
|
|
|
|
impl DimBreakCommand {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
step: Step::PickDim,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CadCommand for DimBreakCommand {
|
|
fn name(&self) -> &'static str {
|
|
"DIMBREAK"
|
|
}
|
|
|
|
fn prompt(&self) -> String {
|
|
match &self.step {
|
|
Step::PickDim => "DIMBREAK Select dimension to break:".into(),
|
|
Step::PickCrossing { .. } => {
|
|
"DIMBREAK Select object to break at, or Enter for Auto:".into()
|
|
}
|
|
}
|
|
}
|
|
|
|
fn needs_entity_pick(&self) -> bool {
|
|
true
|
|
}
|
|
|
|
fn on_entity_pick(&mut self, handle: Handle, _pt: DVec3) -> CmdResult {
|
|
if handle.is_null() {
|
|
return CmdResult::NeedPoint;
|
|
}
|
|
match &self.step {
|
|
Step::PickDim => {
|
|
self.step = Step::PickCrossing { dim_handle: handle };
|
|
CmdResult::NeedPoint
|
|
}
|
|
Step::PickCrossing { dim_handle } => {
|
|
let dim_h = *dim_handle;
|
|
// Emit sentinel: the actual break logic is in commands.rs
|
|
use acadrust::entities::XLine;
|
|
let mut xl = XLine::default();
|
|
xl.common.layer = format!("__DIMBREAK__{},{}", dim_h.value(), handle.value());
|
|
CmdResult::ReplaceEntity(dim_h, vec![acadrust::EntityType::XLine(xl)])
|
|
}
|
|
}
|
|
}
|
|
|
|
fn on_point(&mut self, _pt: DVec3) -> CmdResult {
|
|
CmdResult::NeedPoint
|
|
}
|
|
|
|
fn on_enter(&mut self) -> CmdResult {
|
|
// Auto mode: apply to all crossings
|
|
if let Step::PickCrossing { dim_handle } = &self.step {
|
|
let dim_h = *dim_handle;
|
|
use acadrust::entities::XLine;
|
|
let mut xl = XLine::default();
|
|
xl.common.layer = format!("__DIMBREAK_AUTO__{}", dim_h.value());
|
|
return CmdResult::ReplaceEntity(dim_h, vec![acadrust::EntityType::XLine(xl)]);
|
|
}
|
|
CmdResult::Cancel
|
|
}
|
|
}
|
|
|
|
|
|
// ── Autocomplete registry ─────────────────────────────────
|
|
inventory::submit!(crate::command::CommandRegistration { names: &["DIMBREAK"] }); // DimBreakCommand
|