diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp index 40563956c..6eed17367 100644 --- a/sources/autoNum/assignvariables.cpp +++ b/sources/autoNum/assignvariables.cpp @@ -17,6 +17,8 @@ */ #include "assignvariables.h" +#include + #include "../diagram.h" #include "../diagramposition.h" #include "../qetapp.h" @@ -229,6 +231,7 @@ namespace autonum FormulaContext context; const BorderTitleBlock &border = diagram->border_and_titleblock; context.folio = border.folio(); + context.folio_title = border.title(); context.folio_index = diagram->folioIndex(); context.folio_total = border.folioTotal(); context.plant = border.plant(); @@ -435,6 +438,12 @@ namespace autonum assignTitleBlockVar(); assignProjectVar(); assignSequence(); + + //The folio title last: it is free text, and a title such as + //"Schema %c" must stay as typed, not have the variables in it + //replaced. %T on its own only, not the start of a longer word. + static const QRegularExpression folio_title(QStringLiteral("%T(?![A-Za-z0-9_])")); + m_assigned_label.replace(folio_title, m_context.folio_title); } void AssignVariables::assignTitleBlockVar() diff --git a/sources/autoNum/assignvariables.h b/sources/autoNum/assignvariables.h index 04e353274..1864f3fb3 100644 --- a/sources/autoNum/assignvariables.h +++ b/sources/autoNum/assignvariables.h @@ -69,6 +69,8 @@ namespace autonum { /// border_and_titleblock.folio(), folioIndex(), folioTotal()... QString folio; + /// the folio's title, %T + QString folio_title; int folio_index = 0; int folio_total = 0; QString plant; diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 9512ea0e0..51a14ed0b 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -1143,7 +1143,12 @@ void DynamicElementTextItem::elementInfoChanged() if (m_composite_text.contains("%{label}")) setupFormulaConnection(); - final_text = autonum::AssignVariables::replaceVariable(m_composite_text, dc); + //A report's %{label} is where its partner is, not its own + //label: the same text updateReportText() builds + if (m_parent_element && (m_parent_element.data()->linkType() & Element::AllReport)) + final_text = reportReplacedCompositeText(); + else + final_text = autonum::AssignVariables::replaceVariable(m_composite_text, dc); } else if (m_text_from == UserText) final_text = m_text; @@ -1261,6 +1266,8 @@ void DynamicElementTextItem::setConnectionForReportFormula(const QString &formul connect(other_diagram->project(), &QETProject::projectDiagramsOrderChanged, this, &DynamicElementTextItem::updateReportText); connect(other_diagram->project(), &QETProject::diagramRemoved, this, &DynamicElementTextItem::updateReportText); } + if (other_diagram && string.contains("%T")) + connect(&other_diagram->border_and_titleblock, &BorderTitleBlock::informationChanged, this, &DynamicElementTextItem::updateReportText); if (string.contains("%l")) connect(other_elmt, &Element::yChanged, this, &DynamicElementTextItem::updateReportText); if (string.contains("%c")) @@ -1286,6 +1293,8 @@ void DynamicElementTextItem::removeConnectionForReportFormula(const QString &for if (other_diagram && (string.contains("%f") || string.contains("%id"))) disconnect(other_diagram->project(), &QETProject::projectDiagramsOrderChanged, this, &DynamicElementTextItem::updateReportText); + if (other_diagram && string.contains("%T")) + disconnect(&other_diagram->border_and_titleblock, &BorderTitleBlock::informationChanged, this, &DynamicElementTextItem::updateReportText); if (string.contains("%l")) disconnect(other_element, &Element::yChanged, this, &DynamicElementTextItem::updateReportText); if (string.contains("%c")) @@ -1580,6 +1589,13 @@ QString DynamicElementTextItem::reportReplacedCompositeText() const if(string.contains("%{conductor_section}")) string.replace("%{conductor_section}", ""); } + + //What is left is the report's own information, as in the + //composite text of any other element: a report can then say + //which device and terminal it leads to (%{comment}), the way + //EPLAN prints "-XS27:N 2 UG Raum - 1.1" + string = autonum::AssignVariables::replaceVariable( + string, m_parent_element.data()->elementInformations()); } return string; diff --git a/sources/ui/reportpropertiewidget.ui b/sources/ui/reportpropertiewidget.ui index 4ca2b3504..019ab37ee 100644 --- a/sources/ui/reportpropertiewidget.ui +++ b/sources/ui/reportpropertiewidget.ui @@ -38,6 +38,7 @@ Create your own text using the following variables: %F: the sheet number %M: the installation %LM: the location +%T: the sheet title %l: the row number %c: the column number diff --git a/sources/ui/xrefpropertieswidget.ui b/sources/ui/xrefpropertieswidget.ui index 5e3ac7f71..31fc1f387 100644 --- a/sources/ui/xrefpropertieswidget.ui +++ b/sources/ui/xrefpropertieswidget.ui @@ -285,7 +285,8 @@ %l: the row number %c: the column number %M: the installation -%LM: the location +%LM: the location +%T: the sheet title diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 6dd92f413..eb6cf36cf 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -278,6 +278,9 @@ target_compile_definitions(tst_multielementinfo PRIVATE # collection paths just chosen, not the ones they replace. qet_add_app_test(tst_assistantinfopaths tst_assistantinfopaths.cpp) +# %T in a report or cross reference formula is the target folio's title. +qet_add_app_test(tst_reportfoliotitle tst_reportfoliotitle.cpp) + # Escape during a picture's resize, rotate or pivot drag puts it back, keeps # it selected and records no undo step (#1414); the key goes to the view. qet_add_app_test(tst_imagehandleescape tst_imagehandleescape.cpp) diff --git a/tests/qttest/tst_reportfoliotitle.cpp b/tests/qttest/tst_reportfoliotitle.cpp new file mode 100644 index 000000000..24bd9f4f9 --- /dev/null +++ b/tests/qttest/tst_reportfoliotitle.cpp @@ -0,0 +1,90 @@ +/* + 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 . +*/ +#include "qetapptest.h" +#include "autoNum/assignvariables.h" + +#include + +/** + %T in a folio report or cross reference formula is the title of the + folio the reference points to, so a reference can read like the ones + EPLAN prints: "+UV1/1 Versorgung UG/EG.0". %total and the title block + and project variables (lower case only) keep their own values, and the + title itself is free text: variables in it stay as typed. +*/ +class tst_reportfoliotitle : public QObject +{ + Q_OBJECT + + static QString label(const QString &formula, const autonum::FormulaContext &c) + { + autonum::sequentialNumbers seq; + return autonum::AssignVariables::formulaToLabel(formula, seq, c); + } + + static autonum::FormulaContext context() + { + autonum::FormulaContext c; + c.folio = QStringLiteral("1"); + c.folio_title = QStringLiteral("Versorgung UG/EG"); + c.folio_index = 2; + c.folio_total = 23; + c.locmach = QStringLiteral("UV1"); + return c; + } + +private slots: + void titleIsReplaced() + { + const QString result = label(QStringLiteral("+%LM/%F %T"), context()); + QCOMPARE(result, QStringLiteral("+UV1/1 Versorgung UG/EG")); + } + + void otherVariablesKeepTheirValue() + { + autonum::FormulaContext c = context(); + c.title_block_fields.addValue(QStringLiteral("typ"), QStringLiteral("SH363N")); + const QString result = label(QStringLiteral("%T / %total / %typ / %{typ}"), c); + QCOMPARE(result, QStringLiteral("Versorgung UG/EG / 23 / SH363N / SH363N")); + } + + void titleKeepsTheVariablesItContains() + { + autonum::FormulaContext c = context(); + c.folio_title = QStringLiteral("Schema %c %F %total %{typ}"); + c.title_block_fields.addValue(QStringLiteral("typ"), QStringLiteral("SH363N")); + const QString result = label(QStringLiteral("%F %T"), c); + QCOMPARE(result, QStringLiteral("1 Schema %c %F %total %{typ}")); + } + + void emptyTitleLeavesNothing() + { + autonum::FormulaContext c = context(); + c.folio_title.clear(); + const QString result = label(QStringLiteral("%F%T"), c); + QCOMPARE(result, QStringLiteral("1")); + } +}; + +int main(int argc, char **argv) +{ + QStandardPaths::setTestModeEnabled(true); + return QetAppTest::run(argc, argv); +} + +#include "tst_reportfoliotitle.moc"