From 49674e7d33328450eb6eeb287066651cab446c07 Mon Sep 17 00:00:00 2001 From: joshua Date: Tue, 16 Mar 2021 19:59:45 +0100 Subject: [PATCH] Add terminal strip class --- qelectrotech.pro | 6 +- sources/TerminalStrip/terminalstrip.cpp | 315 ++++++++++++++++++++++++ sources/TerminalStrip/terminalstrip.h | 66 +++++ 3 files changed, 385 insertions(+), 2 deletions(-) create mode 100644 sources/TerminalStrip/terminalstrip.cpp create mode 100644 sources/TerminalStrip/terminalstrip.h diff --git a/qelectrotech.pro b/qelectrotech.pro index f182f8587..049939a02 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -160,7 +160,8 @@ HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) \ $$files(sources/dataBase/*.h) \ $$files(sources/dataBase/ui/*.h) \ $$files(sources/factory/ui/*.h) \ - $$files(sources/print/*.h) + $$files(sources/print/*.h) \ + $$files(sources/TerminalStrip/*.h) SOURCES += $$files(sources/*.cpp) \ $$files(sources/editor/*.cpp) \ @@ -193,7 +194,8 @@ SOURCES += $$files(sources/*.cpp) \ $$files(sources/dataBase/*.cpp) \ $$files(sources/dataBase/ui/*.cpp) \ $$files(sources/factory/ui/*.cpp) \ - $$files(sources/print/*.cpp) + $$files(sources/print/*.cpp) \ + $$files(sources/TerminalStrip/*.cpp) # Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt RESOURCES += qelectrotech.qrc diff --git a/sources/TerminalStrip/terminalstrip.cpp b/sources/TerminalStrip/terminalstrip.cpp new file mode 100644 index 000000000..4b47c76cd --- /dev/null +++ b/sources/TerminalStrip/terminalstrip.cpp @@ -0,0 +1,315 @@ +/* + Copyright 2006-2021 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 "terminalstrip.h" +#include "../qetproject.h" +#include "../qetgraphicsitem/element.h" + +using shared_real_terminal = QSharedPointer; +using shared_physical_terminal = QSharedPointer; + + +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ + +/** + * @brief The RealTerminal class + * Represent a real terminal. + * A real terminal can be a drawed terminal in a folio + * or a terminal set by user but not present + * on any folio (for example a reserved terminal). + */ +class RealTerminal +{ + public : + + /** + * @brief RealTerminal + * @param parent_strip : parent terminal strip + * @param terminal : terminal element (if any) in a folio + */ + RealTerminal(TerminalStrip *parent_strip, Element *terminal = nullptr) : + m_element(terminal), + m_parent_terminal_strip(parent_strip) + {} + + /** + * @brief isElement + * @return true if this real terminal is linked to a terminal element + */ + bool isElement() const { + return m_element.isNull() ? false : true; + } + + /** + * @brief element + * @return the element linked to this real terminal + * or nullptr if not linked to an Element. + */ + Element *element() const { + return m_element.data(); + } + + private : + QPointer m_element; + QPointer m_parent_terminal_strip; +}; + + +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ + + + + +/** + * @brief The PhysicalTerminal class + * Represent a physical terminal. + * A physical terminal is composed a least by one real terminal. + * When a physical terminal have more than one real terminal + * that mean the physical terminal have levels (one by real terminal). + * The index of terminals returned by the function terminals() + * is the same as the real level of the physical terminal, the index are from back to front. + * + * Example for a 3 levels terminal. + * index 0 = back (mounting plate) + * index 1 = middle + * index 2 = front (electrical cabinet door) + * + * m + * o _ + * u | | + * n | | _ + * t | || | + * i | || | _ + * n | || || | d + * g |0||1||2| o + * | || ||_| o + * p | || | r + * l | ||_| + * a | | + * t |_| + * e + * + */ +class PhysicalTerminal +{ + public: + /** + * @brief PhysicalTerminal + * @param parent_strip : Parent terminal strip + * @param terminals : A vector of real terminals + * who compose this physical terminal. + * \p terminals must have at least one terminal + */ + PhysicalTerminal(TerminalStrip *parent_strip, + QVector terminals) : + m_parent_terminal_strip(parent_strip), + m_real_terminal(terminals) + {} + + /** + * @brief setTerminals + * Set the real terminal of this physical terminal + * the order of the terminal in \p terminals represent + * the level index. + * @param terminals + */ + void setTerminals(QVector terminals) { + m_real_terminal = terminals; + } + + /** + * @brief levelCount + * @return the number of level of this terminal + */ + int levelCount() const { + return m_real_terminal.size(); + } + + /** + * @brief terminals + * @return A vector of real terminal who compose this physical terminal + */ + QVector terminals() const { + return m_real_terminal; + } + + private: + QPointer m_parent_terminal_strip; + QVector m_real_terminal; +}; + + +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ +/************************************************************************************/ + + + +/** + * @brief TerminalStrip::TerminalStrip + * @param name + * @param project + */ +TerminalStrip::TerminalStrip(const QString &name, QETProject *project) : + QObject(project), + m_name(name), + m_project(project) +{} + +TerminalStrip::TerminalStrip(const QString &installation, const QString &location, const QString &name, QETProject *project) : + QObject(project), + m_installation(installation), + m_location(location), + m_name(name), + m_project(project) +{} + +void TerminalStrip::setInstallation(const QString &installation) { + m_installation = installation; +} + +void TerminalStrip::setLocation(const QString &location) { + m_location = location; +} + +void TerminalStrip::setName(const QString &name) { + m_name = name; +} + +/** + * @brief TerminalStrip::addTerminal + * Add terminal to this terminal strip + * @param terminal + * @return true if the terminal was successfully added. + * Return false, if terminal already exist. + * Return false, if terminal is not a terminal element. + */ +bool TerminalStrip::addTerminal(Element *terminal) +{ + if (m_terminal_elements_vector.contains(terminal)) { + return false; + } + if (terminal->elementData().m_type != ElementData::Terminale) { + return false; + } + + //Create the real terminal + shared_real_terminal real_terminal(new RealTerminal(this, terminal)); + m_real_terminals.append(real_terminal); + + //Create a new single level physical terminal + shared_physical_terminal physical_terminal( + new PhysicalTerminal(this, + QVector{real_terminal})); + + m_physical_terminals.append(physical_terminal); + + return true; +} + +/** + * @brief TerminalStrip::removeTerminal + * Remove terminal from this terminal strip + * @param terminal + * @return true if terminal was successfully removed + */ +bool TerminalStrip::removeTerminal(Element *terminal) +{ + if (auto real_terminal = realTerminal(terminal)) + { + if (auto physical_terminal = physicalTerminal(real_terminal)) + { + if (physical_terminal->levelCount() == 1) { + m_physical_terminals.removeOne(physical_terminal); + } else { + auto v = physical_terminal->terminals(); + v.removeOne(real_terminal); + physical_terminal->setTerminals(v); + } + } + m_real_terminals.removeOne(real_terminal); + + return true; + } + + return false; +} + +/** + * @brief TerminalStrip::haveTerminal + * @param terminal + * @return true if \p terminal belong to this strip + */ +bool TerminalStrip::haveTerminal(Element *terminal) { + return m_terminal_elements_vector.contains(terminal); +} + +/** + * @brief TerminalStrip::realTerminal + * @param terminal + * @return the real terminal linked to \p terminal + * the returned QSharedPointer can be null. + */ +QSharedPointer TerminalStrip::realTerminal(Element *terminal) +{ + shared_real_terminal rt; + + if (m_terminal_elements_vector.contains(terminal)) + { + for (auto &real : qAsConst(m_real_terminals)) + { + if (real->element() == terminal) { + rt = real; + break; + } + } + } + + return rt; +} + +/** + * @brief TerminalStrip::physicalTerminal + * @param terminal + * @return the physical terminal linked to \p terminal. + * The returned QSharedPointer can be null. + */ +QSharedPointer TerminalStrip::physicalTerminal(QSharedPointer terminal) +{ + shared_physical_terminal pt; + + for (auto &physical : qAsConst(m_physical_terminals)) + { + if (physical->terminals().contains(terminal)) + { + pt = physical; + break; + } + } + + return pt; +} diff --git a/sources/TerminalStrip/terminalstrip.h b/sources/TerminalStrip/terminalstrip.h new file mode 100644 index 000000000..a6c8d1475 --- /dev/null +++ b/sources/TerminalStrip/terminalstrip.h @@ -0,0 +1,66 @@ +/* + Copyright 2006-2021 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 . +*/ +#ifndef TERMINALSTRIP_H +#define TERMINALSTRIP_H + +#include +#include + +class Element; +class RealTerminal; +class QETProject; +class PhysicalTerminal; + +class TerminalStrip : public QObject +{ + Q_OBJECT + public: + TerminalStrip(const QString &name, QETProject *project); + + TerminalStrip(const QString &installation, + const QString &location, + const QString &name, + QETProject *project); + + void setInstallation(const QString &installation); + void setLocation(const QString &location); + void setName(const QString &name); + + bool addTerminal(Element *terminal); + bool removeTerminal(Element *terminal); + bool haveTerminal(Element *terminal); + + private: + QSharedPointer realTerminal(Element *terminal); + QSharedPointer physicalTerminal(QSharedPointer terminal); + + private: + QString m_installation; + QString m_location; + QString m_name; + QPointer m_project; + QVector> m_terminal_elements_vector; + QVector> m_real_terminals; + QVector> m_physical_terminals; +}; + + + + + +#endif // TERMINALSTRIP_H