A selected sketch line stops being white, and a refused constraint says why

Two reports, one root: the sketch tab could not show what was selected.

The bed grid landed last commit, and selection was painted pure white — a freshly
drawn line is auto-selected by the creation tool, so the first thing a new line did
was disappear into the grid. Selection now wears design_selection_color(), the same
cyan a picked solid already wears. White is kept for the hover handle alone.

That invisibility is also why "I apply Parallel and NOTHING HAPPENS": drawing two
lines leaves exactly ONE selected (the last), Parallel needs two, so the planner
correctly refused — but the status text named only the requirement, never the current
pick, which reads as a dead button. It now reports how many are selected and how to
pick the second.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011FbJKJAJxxkhDTs9XdZzKA
This commit is contained in:
Tommaso Bianchi
2026-09-01 05:39:28 +02:00
co-authored by Claude Opus 5
parent 741682f874
commit ea32f8dc2f
2 changed files with 18 additions and 7 deletions
+8 -1
View File
@@ -7848,7 +7848,14 @@ void DesignPanel::apply_live_constraint(SketchConstraintType type)
switch (plan.kind) {
case ConstraintPlan::Kind::Reject:
fail(constraint_reject_text(plan.reason, type));
// "I applied Parallel and NOTHING HAPPENS" is this branch. The text named the
// REQUIREMENT ("applies to two lines") but never the CURRENT PICK, and a creation
// tool auto-selects only the entity it just drew — so after drawing two lines exactly
// one is selected and the button correctly refuses. Say how many are picked, or the
// refusal is indistinguishable from a dead button.
fail(wxString::Format(_L("%s — %d selected. Press Esc for the Select tool, click one "
"line, then Shift- or Ctrl-click the other."),
constraint_reject_text(plan.reason, type), int(sel.size())));
return;
case ConstraintPlan::Kind::AskValue:
m_viewport->open_inline_value(plan.prefill, [this, plan, commit](double v) {
+10 -6
View File
@@ -8614,8 +8614,12 @@ void DesignSketchTool::render(GLCanvas3D& canvas)
// Committed entities of this session. DoF feedback (P3): a fully-constrained
// sketch (dof==0, consistent) paints green; entities touched by a conflicting
// constraint paint red; otherwise the under-constrained default (orange / grey
// construction). Selected entities always override to white.
const ColorRGBA white(1.0f, 1.0f, 1.0f, 1.0f);
// construction). Selected entities always override to the shared selection colour.
// NOT white: the Design tab now paints a bed grid, and white-on-grid made a freshly
// drawn (hence auto-selected) line invisible against it. design_selection_color() is
// the same cyan the solid picks already wear, so "selected" reads the same everywhere.
const ColorRGBA white(1.0f, 1.0f, 1.0f, 1.0f); // hover handle only
const ColorRGBA sel_col = design_selection_color();
const ColorRGBA green(0.30f, 0.85f, 0.42f, 1.0f);
const ColorRGBA conflict(1.0f, 0.22f, 0.22f, 1.0f);
const ColorRGBA opref(0.80f, 0.45f, 1.0f, 1.0f); // violet: the edit-op's reference pick
@@ -8645,7 +8649,7 @@ void DesignSketchTool::render(GLCanvas3D& canvas)
ColorRGBA col;
if (editing_this) col = editing;
else if (op_ref) col = opref;
else if (selected) col = white;
else if (selected) col = sel_col;
else if (bad) col = conflict;
else if (e.construction) col = grey;
else col = fully ? green : orange;
@@ -8666,10 +8670,10 @@ void DesignSketchTool::render(GLCanvas3D& canvas)
if (!point_markers.empty())
draw_vertices(m_vertex_model, point_markers, yellow);
if (!sel_point_markers.empty())
draw_vertices(m_highlight_model, sel_point_markers, white);
draw_vertices(m_highlight_model, sel_point_markers, sel_col);
// Endpoint / centre handles so individual points are visible and pickable in the
// Select and Dimension tools (a line = a segment + 2 points). Selected ones white.
// Select and Dimension tools (a line = a segment + 2 points). Selected ones cyan.
m_show_handles = (m_mode == Mode::Select || m_mode == Mode::Dimension);
if (m_show_handles) {
std::vector<Vec2d> handles, sel_handles;
@@ -8704,7 +8708,7 @@ void DesignSketchTool::render(GLCanvas3D& canvas)
}
}
if (!handles.empty()) draw_vertices(m_vertex_model, handles, ColorRGBA(0.65f, 0.65f, 0.30f, 1.0f));
if (!sel_handles.empty()) draw_vertices(m_highlight_model, sel_handles, white);
if (!sel_handles.empty()) draw_vertices(m_highlight_model, sel_handles, sel_col);
// Midpoint of every segment, drawn smaller and cooler than the endpoint handles
// (snaporca-te8v). Without it the Midpoint snap is invisible: it exists in the