feat(modify): EXTRIM — cookie-cutter trim on one side of a boundary (#253)
Run EXTRIM, pick a cutting boundary (line/arc/circle/ellipse/spline/ polyline), then click a side: every object crossing the boundary is trimmed on that side and objects wholly on it are erased. Side is decided by a parity crossing count (a segment to the pick point crossing the boundary an even number of times is on the pick side), reusing the trim intersection machinery; line boundaries extend to infinity. Line/arc/ circle are trimmed exactly; polyline/ellipse/spline via dense sampling. Live preview while choosing the side: boundary in yellow, surviving parts in blue, the removed parts in red. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
2367bdf47f
commit
694c5b5a7f
3 changed files with 519 additions and 0 deletions
|
|
@ -914,6 +914,22 @@ impl OpenCADStudio {
|
|||
self.tabs[i].active_cmd = Some(Box::new(new_cmd));
|
||||
}
|
||||
|
||||
"EXTRIM" => {
|
||||
use crate::modules::draw::modify::trim::ExtrimCommand;
|
||||
let all: Vec<_> = self.tabs[i]
|
||||
.scene
|
||||
.entity_wires()
|
||||
.iter()
|
||||
.filter_map(|w| {
|
||||
let h = Scene::handle_from_wire_name(&w.name)?;
|
||||
self.tabs[i].scene.document.get_entity(h).cloned().map(|e| (h, e))
|
||||
})
|
||||
.collect();
|
||||
let new_cmd = ExtrimCommand::new(all);
|
||||
self.command_line.push_info(&new_cmd.prompt());
|
||||
self.tabs[i].active_cmd = Some(Box::new(new_cmd));
|
||||
}
|
||||
|
||||
"EXTEND" | "EX" => {
|
||||
use crate::modules::draw::modify::trim::ExtendCommand;
|
||||
let entities: Vec<_> = self.tabs[i]
|
||||
|
|
|
|||
|
|
@ -462,6 +462,7 @@ inventory::submit!(crate::command::CommandRegistration {
|
|||
"EXPORT",
|
||||
"EXPORTSTEP",
|
||||
"EXPORTSTL",
|
||||
"EXTRIM",
|
||||
"FILETAB",
|
||||
"FIND",
|
||||
"FLATTEN",
|
||||
|
|
|
|||
Loading…
Reference in a new issue