mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-18 14:32:36 +00:00
CAD: right-click in a sketch offers verbs for what is selected, instead of for nothing
Select a line in a sketch, right-click, and every sketch verb was greyed: Trim,
Extend, Fillet, Chamfer, Offset, Mirror, the arrays, Constrain. The menu was
right and the selection was gone — two independent faults, each of which hid
the other.
FIRST, the Select-mode RightDown branch called clear_selection() before handing
the click back. Handing it back is correct: the m_right_consumed flag means "the
tool USED this right-click", and a plain right-click is not a gesture
terminator, so the offer should open. Clearing first is not: the offer describes
WHAT IS SELECTED, so wiping the selection guaranteed it could only ever describe
nothing. Deselection keeps its own gesture — left-click on empty space, a few
lines above in the same handler.
SECOND, offer_selection_kind() returned SkNone for every sketch state. The offer
table has always carried verbs for a selected line, arc, point or pair, but
nothing ever RETURNED those kinds, so fourteen rows were gated on selection bits
no code path could set. Classify the selection instead: SkLine / SkArc / SkPoint
/ Sk2Ent, via a first_selected_type() accessor on the tool and two forwarders on
the canvas.
Either fix alone measures as a failure — the classification is handed an empty
selection, or the preserved selection has no kind to match — which is why both
land together.
This is the second half of the report behind 3eb6e5d608: a user comparing the
Design tab with Onshape said "adding constraints seems to be missing"
(OrcaSlicer PR #15238). Constrain was one of the fourteen dead rows, and the
gesture that would have shown it threw the selection away first.
Verified at the machine on behemoth by Tommaso: select a line of a rectangle,
right-click, and the sketch verbs are live.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
eb52972a8e
commit
614824ce89
@@ -1338,6 +1338,16 @@ bool DesignCanvas::is_constraining_entities() const
|
||||
return m_sketch_tool.is_constraining_entities();
|
||||
}
|
||||
|
||||
int DesignCanvas::sketch_selection_count() const
|
||||
{
|
||||
return int(m_sketch_tool.selection().size());
|
||||
}
|
||||
|
||||
bool DesignCanvas::sketch_first_selected_type(SketchEntity::Type& out) const
|
||||
{
|
||||
return m_sketch_tool.first_selected_type(out);
|
||||
}
|
||||
|
||||
bool DesignCanvas::selected_constrain_entities(int& e0, int& e1) const
|
||||
{
|
||||
return m_sketch_tool.selected_constrain_entities(e0, e1);
|
||||
|
||||
@@ -261,6 +261,10 @@ public:
|
||||
// Entity-aware Constrain (Fase 4.2): pick Line entities of a committed sketch.
|
||||
void begin_constrain_entities(const std::vector<SketchEntity>& ents, const SketchPlane& plane);
|
||||
bool is_constraining_entities() const;
|
||||
// Sketch selection, for the offer menu: how many entities are selected and what the first
|
||||
// one is. Returns 0 when nothing is selected.
|
||||
int sketch_selection_count() const;
|
||||
bool sketch_first_selected_type(SketchEntity::Type& out) const;
|
||||
|
||||
// In-canvas bbox transform of imported Text/SVG art (replaces the Move/Scale dialog).
|
||||
void begin_imported_transform(int feat,
|
||||
|
||||
@@ -5534,8 +5534,29 @@ bool DesignPanel::sketch_map_applies() const
|
||||
// sketch_plane_from_selection, which deliberately uses m_pick_face. snaporca-3a2.)
|
||||
int DesignPanel::offer_selection_kind() const
|
||||
{
|
||||
if (sketch_map_applies())
|
||||
if (sketch_map_applies()) {
|
||||
// Classify WHAT is selected in the sketch, rather than collapsing every sketch state to
|
||||
// SkNone. The offer table has always described verbs for a selected line, arc, point or
|
||||
// pair — Trim, Extend, Fillet, Chamfer, Offset, Mirror, the arrays, Move/Rotate/Scale,
|
||||
// Constrain, Delete — but nothing ever RETURNED those kinds, so all thirteen were
|
||||
// unreachable from the menu and the sketch-editing vocabulary did not exist in the one
|
||||
// place this app tells users to look. A user comparing against Onshape reported exactly
|
||||
// that about constraints (OrcaSlicer PR #15238).
|
||||
const int n = m_viewport ? m_viewport->sketch_selection_count() : 0;
|
||||
if (n >= 2) return int(OfferSel::Sk2Ent);
|
||||
if (n == 1) {
|
||||
SketchEntity::Type t = SketchEntity::Type::Line;
|
||||
if (m_viewport && m_viewport->sketch_first_selected_type(t)) {
|
||||
switch (t) {
|
||||
case SketchEntity::Type::Line: return int(OfferSel::SkLine);
|
||||
case SketchEntity::Type::Point: return int(OfferSel::SkPoint);
|
||||
// Arc, Circle, Ellipse, EllipseArc, BSpline all take the curve vocabulary.
|
||||
default: return int(OfferSel::SkArc);
|
||||
}
|
||||
}
|
||||
}
|
||||
return int(OfferSel::SkNone);
|
||||
}
|
||||
|
||||
const int nb = int(m_doc.bodies.size());
|
||||
if (m_sel_solid_vertex && m_sel_solid_body >= 0 && m_sel_solid_body < nb)
|
||||
|
||||
@@ -9432,11 +9432,17 @@ bool DesignSketchTool::on_mouse_impl(wxMouseEvent& evt, GLCanvas3D& canvas)
|
||||
return true;
|
||||
}
|
||||
if (evt.RightDown()) {
|
||||
// Merely dropping a selection is not a gesture terminator: the m_right_consumed flag
|
||||
// this return value feeds means "the tool USED this right-click", and suppressing the
|
||||
// offer menu on a plain deselection would leave no way to reach the right-click menu
|
||||
// again once any geometry exists. So clear, but hand the click back.
|
||||
clear_selection();
|
||||
// Hand the click back (return false) so the offer opens: the m_right_consumed flag
|
||||
// this return value feeds means "the tool USED this right-click", and a plain
|
||||
// right-click in Select mode is not a gesture terminator.
|
||||
//
|
||||
// But do NOT drop the selection on the way out. The offer menu describes WHAT IS
|
||||
// SELECTED, so clearing first guaranteed it could only ever describe nothing: select
|
||||
// a line, right-click, and the sketch verbs — Trim, Extend, Fillet, Chamfer, Offset,
|
||||
// Mirror, the arrays, Constrain — were all greyed, because by the time the menu was
|
||||
// built the line was no longer selected. Reported from the machine as "selected a
|
||||
// line, right-click exit from selection: only create and reference are usable".
|
||||
// Deselecting still has a gesture: left-click on empty space, a few lines above.
|
||||
return false;
|
||||
}
|
||||
return false; // let drag orbit the camera
|
||||
|
||||
@@ -425,6 +425,15 @@ public:
|
||||
// Selection (Mode::Select): pick points/lines/arcs/circles of the in-session
|
||||
// sketch; Shift/Ctrl extends, double-click grabs the whole connected loop.
|
||||
const std::vector<int>& selection() const { return m_selection; }
|
||||
// Type of the first selected entity. False when nothing is selected, so the offer menu can
|
||||
// tell a line from an arc from a point and stop collapsing every sketch selection to "none".
|
||||
bool first_selected_type(SketchEntity::Type& out) const {
|
||||
if (m_selection.empty()) return false;
|
||||
const int i = m_selection.front();
|
||||
if (i < 0 || i >= int(m_entities.size())) return false;
|
||||
out = m_entities[i].type;
|
||||
return true;
|
||||
}
|
||||
void clear_selection();
|
||||
void delete_selected(); // erase selected entities
|
||||
// Abort any pending/queued draw-then-edit value-field sequence. Removing an entity that
|
||||
|
||||
Reference in New Issue
Block a user