Add a wires-per-terminal limit, with an application master switch

Discussion #1158: a real terminal takes one or two wires (four with
double ferrules), a folio report is a virtual point that carries one, but
QElectroTech lets any number of wires be connected anywhere.

Project properties > General gets a "Conducteurs par borne" group:
- the most wires a terminal may take (0, the default, is no limit);
- "one wire per folio report".
When set, a new wire that would go past the limit is refused: the
terminal shows red while dragging, as for any refused link, and a tooltip
says why on release. Auto-connect on placing, moving or multi-pasting a
symbol skips full terminals, and qet.addConductor() refuses with its own
message. Wires already drawn, opening, pasting and undo are never
refused.

Settings > General gets a master switch, on by default, that turns every
rule of this feature off in every project; the project group is greyed
with a note while it is off.

The rules live in wiringrules.cpp. The project setting is saved as
<wiring_rules .../> only when a rule is on, so a project that never used
it saves exactly as before; an older version drops it, which means "off".

tst_wiringrules covers the rules, the save round trip and, through the
real binary, that a wire past the limit is refused unless the master
switch is off (checked to fail with the limit check removed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FPuYPS4T7QuEwjNu22rXD
This commit is contained in:
ispyisail
2026-10-03 21:42:12 +13:00
parent 6144da0f91
commit 20e134f2bd
15 changed files with 615 additions and 3 deletions
+5 -2
View File
@@ -1345,7 +1345,8 @@ bool Element::removeTextFromGroup(DynamicElementTextItem *text,
The first Terminal of QPair is a Terminal owned by this element,
this terminal haven't got any conductor docked.
The second Terminal of QPair is a Terminal owned by an other element,
which is aligned with the first Terminal. The second Terminal can have or not docked conductors.
which is aligned with the first Terminal. The second Terminal can have or not docked conductors,
but no more than the project's wires-per-terminal limit allows (discussion #1158).
*/
QList <QPair <Terminal *, Terminal *> > Element::AlignedFreeTerminals() const
{
@@ -1357,7 +1358,9 @@ QList <QPair <Terminal *, Terminal *> > Element::AlignedFreeTerminals() const
{
Terminal *other_terminal =
terminal -> alignedWithTerminal();
if (other_terminal)
if (other_terminal
&& terminal->hasRoomForWire()
&& other_terminal->hasRoomForWire())
list << qMakePair(terminal, other_terminal);
}
}