forked from 1b-agent/opencadstudio-upstream
feat(pline): create polyline as a live entity so it snaps while drawing
The polyline was only committed to the document on finish, so its partial
geometry produced no snap points — you could not snap to vertices already
placed. Publish it as a real LwPolyline at the second vertex and replace
its geometry in place as later vertices land, so it lives in the document
(and the snapper) throughout the draw.
New CmdResult::CommitLiveEntity / UpdateLiveEntity{finish} plus a
set_live_handle() hook let a command own an entity mid-run. The create
pushes a single undo snapshot; in-place updates push none, so the whole
object reverts as one unit. Updates preserve the entity's handle and
layer (a fresh built entity carries a NULL handle that would desync it
from the document map key and drop it from rendering). (#119)
Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
cdd72c62ca
commit
188d310789
3 files changed
+115
-40
No files matched your search
@@ -225,6 +225,21 @@ pub enum CmdResult {
|
||||
/// The host should look up the attdefs for `block_name` from the document
|
||||
/// and call `attreq_set_attdefs()` on the command, then loop on text input.
|
||||
AttreqNeeded { block_name: String },
|
||||
/// Add a command-owned "live" entity to the document mid-command and hand
|
||||
/// its assigned handle back to the active command via `set_live_handle()`.
|
||||
/// One undo snapshot is pushed here, so the whole in-progress object reverts
|
||||
/// as a single unit. The command stays active. Used by PLINE so the partial
|
||||
/// polyline is a real, snappable entity while later vertices are placed.
|
||||
CommitLiveEntity(EntityType),
|
||||
/// Replace the geometry of the live entity `handle` in place — preserving
|
||||
/// its layer — without pushing a new undo snapshot. When `finish` is true
|
||||
/// the command also exits (the entity is already committed, so no separate
|
||||
/// commit is needed).
|
||||
UpdateLiveEntity {
|
||||
handle: Handle,
|
||||
entity: EntityType,
|
||||
finish: bool,
|
||||
},
|
||||
}
|
||||
|
||||
/// What kind of value the active command is currently asking for. Drives
|
||||
@@ -417,6 +432,11 @@ pub trait CadCommand: Send {
|
||||
CmdResult::Cancel
|
||||
}
|
||||
|
||||
/// Host callback after `CmdResult::CommitLiveEntity`: records the handle the
|
||||
/// new live entity was assigned so later `UpdateLiveEntity` results can
|
||||
/// target it.
|
||||
fn set_live_handle(&mut self, _handle: Handle) {}
|
||||
|
||||
/// Point-click pick of domain objects (wire hit-test often misses small markers).
|
||||
fn needs_structure_point_pick(&self) -> bool {
|
||||
false
|
||||
|
||||
Reference in new issue
Block a user