From f0ec416a91233193f3e2f6582c5c0ad869f855de Mon Sep 17 00:00:00 2001 From: joshua Date: Fri, 3 Oct 2025 21:49:21 +0200 Subject: [PATCH] Terminal strip graphic item can display Xref of terminal --- .../GraphicsItem/demoterminalstrip.cpp | 110 ++++---- .../properties/terminalstriplayoutpattern.cpp | 27 +- .../properties/terminalstriplayoutpattern.h | 16 +- .../GraphicsItem/terminalstripdrawer.cpp | 32 ++- .../GraphicsItem/terminalstripdrawer.h | 1 + .../GraphicsItem/trueterminalstrip.cpp | 10 + .../GraphicsItem/trueterminalstrip.h | 1 + .../ui/terminalstriplayouteditor.cpp | 41 +++ .../ui/terminalstriplayouteditor.ui | 244 ++++++++++++++---- sources/xml/terminalstriplayoutpatternxml.cpp | 15 ++ 10 files changed, 390 insertions(+), 107 deletions(-) diff --git a/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp b/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp index bea467656..91edb3092 100644 --- a/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp +++ b/sources/TerminalStrip/GraphicsItem/demoterminalstrip.cpp @@ -38,9 +38,10 @@ namespace TerminalStripDrawer class DemoRealTerminal : public AbstractRealTerminalInterface { public: - DemoRealTerminal(const QString &label, const QUuid &bridge) : - m_label { label }, - m_bridge { bridge } + DemoRealTerminal(const QString &label, const QString &xref, const QUuid &bridge) : + m_label { label }, + m_xref{ xref }, + m_bridge { bridge } {} QString label() const override { @@ -55,8 +56,12 @@ namespace TerminalStripDrawer return new DemoBridge { m_bridge }; } + QString xref() const override { + return m_xref; + } + private: - QString m_label; + QString m_label, m_xref; QUuid m_bridge; }; @@ -101,52 +106,65 @@ namespace TerminalStripDrawer QVector > real_terminals_vector; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("1_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("1_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("1_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("1_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; real_terminals_vector.clear(); - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("2_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("2_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("2_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("2_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector.clear(); - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("24vdc"), - lvl_1)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("0vdc"), - lvl_2)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("signal"), - lvl_3)}; - real_terminals_vector << QSharedPointer { - new DemoRealTerminal( QStringLiteral("teach"), - lvl_4)}; - m_physical_terminal << QSharedPointer { - new DemoPhysicalTerminal {real_terminals_vector}}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("24vdc"), + QStringLiteral("3_A1"), + lvl_1)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("0vdc"), + QStringLiteral("3_A2"), + lvl_2)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("signal"), + QStringLiteral("3_A3"), + lvl_3)}; + real_terminals_vector << QSharedPointer { + new DemoRealTerminal( QStringLiteral("teach"), + QStringLiteral("3_A4"), + lvl_4)}; + m_physical_terminal << QSharedPointer { + new DemoPhysicalTerminal {real_terminals_vector}}; } } diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp index 84baeb591..82fba3498 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.cpp @@ -17,7 +17,6 @@ */ #include "terminalstriplayoutpattern.h" #include "../../../utils/qetutils.h" -#include TerminalStripLayoutPattern::TerminalStripLayoutPattern() { @@ -80,6 +79,29 @@ QTextOption TerminalStripLayoutPattern::terminalsTextOption() const return m_terminals_text_option; } +/** + * @brief TerminalStripLayoutPattern::setXrefTextAlignment + * Set text alignment to @param alignment. If alignment have no + * flag this function do nothing + * @param alignment + */ +void TerminalStripLayoutPattern::setXrefTextAlignment(const Qt::Alignment &alignment) +{ + if (!alignment) return; + m_xref_text_alignment = alignment; + updateTerminalsTextOption(); +} + +Qt::Alignment TerminalStripLayoutPattern::xrefTextAlignment() const +{ + return m_xref_text_alignment; +} + +QTextOption TerminalStripLayoutPattern::xrefTextOption() const +{ + return m_xref_text_option; +} + void TerminalStripLayoutPattern::updateHeaderTextOption() { m_header_text_option.setAlignment(m_header_text_alignment); @@ -90,4 +112,7 @@ void TerminalStripLayoutPattern::updateTerminalsTextOption() { m_terminals_text_option.setAlignment(m_terminals_text_alignment); m_terminals_text_option.setWrapMode(QTextOption::WordWrap); + + m_xref_text_option.setAlignment(m_xref_text_alignment); + m_xref_text_option.setWrapMode(QTextOption::WordWrap); } diff --git a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h index 1b5f0c40a..6dbc0da82 100644 --- a/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h +++ b/sources/TerminalStrip/GraphicsItem/properties/terminalstriplayoutpattern.h @@ -74,6 +74,14 @@ class TerminalStripLayoutPattern qreal m_terminals_text_y{35}; Qt::Orientation m_terminals_text_orientation {Qt::Vertical}; + //Xref text + void setXrefTextAlignment(const Qt::Alignment &alignment); + Qt::Alignment xrefTextAlignment() const; + QTextOption xrefTextOption() const; + qreal m_xref_text_height{60}; + qreal m_xref_text_y{95}; + Qt::Orientation m_xref_text_orientation {Qt::Vertical}; + qreal m_bridge_point_d{5}; QVector m_bridge_point_y_offset{50,70,90,110}; @@ -89,8 +97,12 @@ class TerminalStripLayoutPattern Qt::Alignment m_header_text_alignment{Qt::AlignCenter}; QTextOption m_header_text_option; - Qt::Alignment m_terminals_text_alignment {Qt::AlignRight | Qt::AlignVCenter}; - QTextOption m_terminals_text_option{QTextOption()}; + Qt::Alignment + m_terminals_text_alignment {Qt::AlignRight | Qt::AlignVCenter}, + m_xref_text_alignment {Qt::AlignLeft | Qt::AlignVCenter}; + QTextOption + m_terminals_text_option{QTextOption()}, + m_xref_text_option{QTextOption()}; }; #endif // TERMINALSTRIPLAYOUTPATTERN_H diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp index 4b94b9284..f71542c3d 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "terminalstripdrawer.h" + #include namespace TerminalStripDrawer { @@ -111,6 +112,12 @@ void TerminalStripDrawer::paint(QPainter *painter) const auto terminals_text_y{m_pattern->m_terminals_text_y}; QRectF terminal_rect; + const auto xref_text_orientation{m_pattern->m_xref_text_orientation}; + const auto xref_text_option{m_pattern->xrefTextOption()}; + const auto xref_text_height{m_pattern->m_xref_text_height}; + const auto xref_text_y{m_pattern->m_xref_text_y}; + QRectF xref_rect; + QHash> bridges_anchor_points; //Loop over physical terminals @@ -170,9 +177,9 @@ void TerminalStripDrawer::paint(QPainter *painter) } const auto shared_real_terminal{real_terminal_vector[i]}; - painter->drawText(text_rect, - shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), - terminals_text_option); + painter->drawText(text_rect, + shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), + terminals_text_option); if (m_preview_draw) { @@ -182,6 +189,25 @@ void TerminalStripDrawer::paint(QPainter *painter) painter->restore(); + //Draw xref + auto xref_string = shared_real_terminal->xref(); + painter->save(); + xref_rect.setRect(0, xref_text_y, terminal_rect.width(), xref_text_height); + if (xref_text_orientation == Qt::Vertical) + { + painter->translate(xref_rect.bottomLeft()); + painter->rotate(270); + xref_rect.setRect(0, 0, xref_rect.height(), xref_rect.width()); + } + painter->drawText(xref_rect, xref_string, xref_text_option); + + if (m_preview_draw) + { + painter->setPen(Qt::blue); + painter->drawRect(xref_rect); + } + painter->restore(); + //Add bridge anchor if (shared_real_terminal->isBridged()) { diff --git a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h index 72286c41d..8fa5fd8e1 100644 --- a/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h +++ b/sources/TerminalStrip/GraphicsItem/terminalstripdrawer.h @@ -43,6 +43,7 @@ namespace TerminalStripDrawer virtual QString label() const = 0; virtual bool isBridged() const = 0; virtual AbstractBridgeInterface* bridge() const = 0; + virtual QString xref() const = 0; }; class AbstractPhysicalTerminalInterface diff --git a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp index 15273e4c1..29e1ad0ef 100644 --- a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp +++ b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.cpp @@ -20,6 +20,7 @@ #include "../realterminal.h" #include "../terminalstrip.h" #include "../terminalstripbridge.h" +#include "../../autoNum/assignvariables.h" #include "terminalstripdrawer.h" @@ -118,6 +119,15 @@ namespace TerminalStripDrawer return new TrueBridge(m_real->bridge()); } + QString TrueRealTerminal::xref() const + { + if (m_real && m_real->isElement()) { + return autonum::AssignVariables::genericXref(m_real->element()); + } else { + return QString{}; + } + } + TrueBridge::TrueBridge(QSharedPointer bridge) : m_bridge { bridge } {} diff --git a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h index 10b3775fa..d94827553 100644 --- a/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h +++ b/sources/TerminalStrip/GraphicsItem/trueterminalstrip.h @@ -58,6 +58,7 @@ namespace TerminalStripDrawer QString label() const override; bool isBridged() const override; AbstractBridgeInterface* bridge() const override; + QString xref() const override; private: QSharedPointer m_real; diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp index b54164f94..85744e00e 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.cpp @@ -108,6 +108,7 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->setHeaderTextAlignment(Qt::AlignRight | Qt::AlignVCenter); break; } + //Terminal text m_layout.data()->m_terminals_text_orientation = ui->m_terminal_text_orientation_cb->currentIndex() == 0 ? Qt::Horizontal : Qt::Vertical; @@ -127,6 +128,26 @@ void TerminalStripLayoutEditor::valueEdited() m_layout.data()->m_terminals_text_y = ui->m_terminal_text_y_sb->value(); m_layout.data()->m_terminals_text_height = ui->m_terminal_text_height_sb->value(); + //Xref text + m_layout.data()->m_xref_text_orientation = ui->m_xref_orientation_cb->currentIndex() == 0 ? + Qt::Horizontal : + Qt::Vertical; + + switch (ui->m_xref_alignment_cb->currentIndex()) { + case 0: + m_layout.data()->setXrefTextAlignment(Qt::Alignment {Qt::AlignLeft | Qt::AlignVCenter}); + break; + case 1: + m_layout.data()->setXrefTextAlignment(Qt::Alignment { Qt::AlignHCenter | Qt::AlignVCenter}); + break; + default: + m_layout.data()->setXrefTextAlignment(Qt::Alignment { Qt::AlignRight | Qt::AlignVCenter}); + break; + } + + m_layout.data()->m_xref_text_y = ui->m_xref_y_sb->value(); + m_layout.data()->m_xref_text_height = ui->m_xref_height_sb->value(); + updateUi(); m_preview_strip_item.update(); } @@ -200,6 +221,7 @@ void TerminalStripLayoutEditor::updateUi() ui->m_header_text_alignment_cb->setCurrentIndex(2); } + //Terminal text const auto terminal_alignment = data->terminalsTextAlignment(); if (terminal_alignment &Qt::AlignLeft) { ui->m_terminal_text_alignment_cb->setCurrentIndex(0); @@ -212,6 +234,25 @@ void TerminalStripLayoutEditor::updateUi() ui->m_terminal_text_y_sb->setValue(data->m_terminals_text_y); ui->m_terminal_text_height_sb->setValue(data->m_terminals_text_height); + //Xref text + if (data->m_xref_text_orientation == Qt::Horizontal) { + ui->m_xref_orientation_cb->setCurrentIndex(0); + } else { + ui->m_xref_orientation_cb->setCurrentIndex(1); + } + + const auto xref_alignment = data->xrefTextAlignment(); + if (xref_alignment &Qt::AlignLeft) { + ui->m_xref_alignment_cb->setCurrentIndex(0); + } else if (xref_alignment &Qt::AlignHCenter) { + ui->m_xref_alignment_cb->setCurrentIndex(1); + } else if (xref_alignment &Qt::AlignRight) { + ui->m_xref_alignment_cb->setCurrentIndex(2); + } + + ui->m_xref_y_sb->setValue(data->m_xref_text_y); + ui->m_xref_height_sb->setValue(data->m_xref_text_height); + m_ui_updating = false; updatePreview(); } diff --git a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui index f8f74789a..c9a762252 100644 --- a/sources/TerminalStrip/ui/terminalstriplayouteditor.ui +++ b/sources/TerminalStrip/ui/terminalstriplayouteditor.ui @@ -6,8 +6,8 @@ 0 0 - 683 - 589 + 961 + 624 @@ -15,7 +15,7 @@ - QLayout::SizeConstraint::SetMaximumSize + QLayout::SetMaximumSize @@ -34,7 +34,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -173,7 +173,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -213,13 +213,6 @@ 0 - - - - Longueur maximal du texte de borne - - - @@ -253,38 +246,17 @@ - - - - - Horizontal - - - - - Vertical - - - - - Orientation du texte d'en tête : + Orientation - Alignement du texte d'en tête : - - - - - - - Origine vertical du texte de borne : + Alignement @@ -330,7 +302,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -343,7 +315,48 @@ - + + + + Texte d'en tête + + + Qt::AlignCenter + + + + + + + Origine vertical + + + + + + + Longueur maximal + + + + + + + 1000 + + + + + + + 30 + + + 1000 + + + + @@ -362,30 +375,87 @@ - - - - 30 + + + + + Horizontal + + + + + Vertical + + + + + + + + Texte borne + + Qt::AlignCenter + + + + + + + Référence croisée + + + Qt::AlignCenter + + + + + + + + Horizontal + + + + + Vertical + + + + + + + + + Gauche + + + + + Centre + + + + + Droite + + + + + + 1000 - - - - Orientation du texte de borne : + + + + 30 - - - - - - - - - Alignement du texte de borne : + + 1000 @@ -430,7 +500,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -960,6 +1030,70 @@ + + m_xref_alignment_cb + currentIndexChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 365 + + + 480 + 311 + + + + + m_xref_height_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 431 + + + 480 + 311 + + + + + m_xref_orientation_cb + currentIndexChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 333 + + + 480 + 311 + + + + + m_xref_y_sb + valueChanged(int) + TerminalStripLayoutEditor + valueEdited() + + + 836 + 398 + + + 480 + 311 + + + valueEdited() diff --git a/sources/xml/terminalstriplayoutpatternxml.cpp b/sources/xml/terminalstriplayoutpatternxml.cpp index 5ea20a1cb..687dd5b53 100644 --- a/sources/xml/terminalstriplayoutpatternxml.cpp +++ b/sources/xml/terminalstriplayoutpatternxml.cpp @@ -117,6 +117,13 @@ QDomElement TerminalStripLayoutPatternXml::toXml(const QSharedPointerm_terminals_text_height, terminals_text_xml); terminals_xml.appendChild(terminals_text_xml); + auto xref_text_xml = document.createElement(QStringLiteral("xref")); + QETXML::orientationToAttribute(pattern->m_xref_text_orientation, xref_text_xml); + QETXML::alignmentToAttribute(pattern->xrefTextAlignment(),xref_text_xml); + QETSVG::yToAttribute(pattern->m_xref_text_y, xref_text_xml); + QETSVG::heightToAttribute(pattern->m_xref_text_height, xref_text_xml); + terminals_xml.appendChild(xref_text_xml); + auto bridge_xml = document.createElement(QStringLiteral("bridges")); QETSVG::rToAttribute(pattern->m_bridge_point_d/2, bridge_xml); QVector points_vector; @@ -176,6 +183,14 @@ void TerminalStripLayoutPatternXml::fromXml(QSharedPointerm_terminals_text_height = QETSVG::heightFromAttribute(terminals_text_xml); } + if (const auto xref_text_xml = terminals_xml.firstChildElement(QStringLiteral("xref")); + !xref_text_xml.isNull()) { + layout->m_xref_text_orientation = QETXML::orientationFromAttribute(xref_text_xml, layout->m_xref_text_orientation); + layout->setXrefTextAlignment(QETXML::alignmentFromAttribute(xref_text_xml)); + layout->m_xref_text_y = QETSVG::yFromAttribute(xref_text_xml); + layout->m_xref_text_height = QETSVG::heightFromAttribute(xref_text_xml); + } + if (const auto bridge_xml = terminals_xml.firstChildElement(QStringLiteral("bridges")); !bridge_xml.isNull()) { layout->m_bridge_point_d = QETSVG::rFromAttribute(bridge_xml, 2.5)*2;