Files
qelectrotech-source-mirror/sources/cable/cablecopy.h
T
Kellermorph bf9b34398d Add cable management: drawing, cores, numbering, cross-references and cable list
Cables are drawn line objects (toolbar button next to the auto
break/reconnect button, click-move-click, right click cancels), not
components. The type comes from a CSV catalog following the material
list pattern (designation, cores, core colours, editable through the
entry dialog with "Nouvelle entrée" / "Modifier l'entrée").

Each core is bound to the wire its colour label stands on, and the
cable reference is generated per core and written into the Conductor
entry via Conductor::setCableReference(label, cable uuid, slot). The
conductor entry is where it has to live because the terminal strip
plan (Klemmenplan) consumes it in the next step.

Numbering: "Cables" rule under Programmeinstellungen/Neues
Projekt/Nummerierung auto (mirrored in project properties), literal
"W" fallback without a rule, French gate dialog when no rule exists,
Nummerierung menu with the renumber dialog (preferred axis, per-folio
counter, rule and counter state written back, hand-typed names ask,
whole-project scope).

Also included: label block and under-line texts with per-text font and
alignment plus the material-list cell margins, free-core placement and
right-click removal, claim questions for wires of other cables,
multi-selection drag as one undo step, type change with confirmation,
cross-references for type "Cable" (%f-%l%c, own font, clickable links
in exported PDFs), report propagation of the cable definition,
Listes menu (table of contents, material list, terminal strip manager,
terminal generator plugin, cable list), cable list with freely
selectable columns (installation/localisation of cable, start and end,
Blatt start/end, length, used cores...), CSV export dialog with column
pick and preview in the Projekt menu, script API (addTable kind
"cable_list", exportCableList) and a unit test for the type catalog.
2026-10-08 15:56:00 +02:00

127 lines
5.0 KiB
C++

/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CABLECOPY_H
#define CABLECOPY_H
#include "cable.h"
#include <QList>
#include <QPointer>
class CablePart;
class Conductor;
class Diagram;
class QDomDocument;
class QDomElement;
class QUndoCommand;
/**
@brief Carrying a drawn cable line over into a copy -- through the
clipboard (Ctrl+C then Ctrl+V) or as a duplicate (Ctrl+D).
What travels is the line and everything which made the cable what it
was: its type, its installation, the place it runs through, its
length, how many cores it has, which colours those have -- and where
the colour labels of the copied section stand, so a copy arrives as
a whole even onto a folio which holds no wire at all. What does not
travel is which wire each core is on: a copy is a cable of its own
with a number of its own, and it takes the wire each colour label
happens to stand on at the place it is put -- those of the folio it
lands on which no other cable describes. A wire another cable
already holds is left to that cable, and a label put where there is
no wire goes on standing there, to be wired when the line is pulled
into place.
A cable line is not one of the folio's items (the cable owns it),
so Diagram::toXml() never writes it: the block travels beside the
folio's own XML rather than inside it, and Diagram::fromXml() reads
it back only when its caller asks to be handed the lines it built.
*/
namespace CableCopy
{
///Put the cable lines selected on @a diagram into @a document
void write(Diagram *diagram, QDomDocument &document);
///Build new cables of their own for the lines @a root holds,
///at the coordinates the fragment carries, with the colour
///labels of the copied section carried over as they were.
///Nothing is asked and no wire is taken yet: that needs the
///place the lines have really been put at, which only the
///caller knows
QList<CablePart *> read(Diagram *diagram, const QDomElement &root);
///One core of a line, and the wire it was given
struct Bound
{
int core = -1;
Conductor *conductor = nullptr;
};
///One line which was built, with what it had to take away
struct Wired
{
QPointer<CablePart> part;
QList<CableCoreTaken> taken;
///The wires the colour labels of this line were given,
///so they can be pointed at them again afterwards
QList<Bound> bound;
};
///Give each colour label of a line the wire it stands on now
///that the line is where it will stay.
///
///@a fresh lists the wires which came along with the copy
///itself. They are new wires on this folio: the cable field
///they carry describes the folio they were copied from, where
///they used to be one of that cable's own wires -- and carried
///over, that reference would make every one of them look like
///a wire some other cable holds, so the copy would be refused
///all of them and arrive without a single entry although it is
///standing on wires of its own. They are let go of first, the
///same way read() lets go of the wires the cores used to name.
///
///A wire the folio already held, which another cable
///describes, is never taken away from that cable: nothing is
///asked and nothing is written for it, and the colour label
///standing on it simply names nothing until the user drags it
///onto a free wire himself, which is where the question is
///still asked. A label standing on no wire at all goes on
///standing where it is, to be wired when the line is pulled
///into place.
QList<Wired> wire(Diagram *diagram,
const QList<CablePart *> &parts,
const QList<Conductor *> &fresh);
///Point the cores @a wired lists at the wires they were given,
///again: putting the copy on the undo stack may have renewed
///the identity of a pasted conductor (PasteDiagramCommand::redo),
///and a cable binds a wire by its identity. Nothing is asked and
///nothing moves here. The cable fields are written out once more
///afterwards, from the cables themselves, so the entries a copy
///was given as it was put down are on the wires it really
///landed on rather than on the identity they had one moment
///earlier.
void repoint(const QList<Wired> &wired);
///Take a built line back off the folio without leaving a trace
///in the undo history, for a copy which was refused
void discard(Diagram *diagram, CablePart *part);
}
#endif // CABLECOPY_H