[qet] [2087] add class for auto numerotation (for the time, only same potential) |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 2087
Author: blacksun
Date: 2013-04-04 18:57:15 +0200 (Thu, 04 Apr 2013)
Log Message:
-----------
add class for auto numerotation (for the time, only same potential)
Modified Paths:
--------------
trunk/sources/conductor.cpp
trunk/sources/conductor.h
trunk/sources/diagramcommands.cpp
trunk/sources/diagramcommands.h
trunk/sources/terminal.cpp
Added Paths:
-----------
trunk/sources/conductorautonumerotation.cpp
trunk/sources/conductorautonumerotation.h
trunk/sources/conductorautonumerotationwidget.cpp
trunk/sources/conductorautonumerotationwidget.h
Modified: trunk/sources/conductor.cpp
===================================================================
--- trunk/sources/conductor.cpp 2013-04-03 15:03:09 UTC (rev 2086)
+++ trunk/sources/conductor.cpp 2013-04-04 16:57:15 UTC (rev 2087)
@@ -23,6 +23,7 @@
#include "element.h"
#include "diagram.h"
#include "diagramcommands.h"
+#include "conductorautonumerotation.h"
#define PR(x) qDebug() << #x " = " << x;
bool Conductor::pen_and_brush_initialized = false;
@@ -1248,6 +1249,15 @@
}
/**
+ * @brief Conductor::autoText
+ *lance l'autoNumerotation sur ce conducteur
+ */
+void Conductor::autoText() {
+ ConductorAutoNumerotation can(this);
+ can.numerate();
+}
+
+/**
Met a jour les proprietes du conducteur apres modification du champ de texte affiche
*/
void Conductor::displayedTextChanged() {
@@ -1279,6 +1289,53 @@
}
/**
+ * @param t_list terminaux a ne pas inclure dans la recherche
+ * @return les conducteurs avec lesquels ce conducteur partage
+ * le meme potentiel electrique a l'exception de lui même
+ */
+QSet<Conductor *> Conductor::relatedPotentialConductors(QList <Terminal *> *t_list) {
+ if (t_list == 0)
+ t_list = new QList <Terminal *>;
+
+ QSet <Conductor *> other_conductors;
+ //renvoie tous les conducteurs du terminal 1
+ if (t_list->contains(terminal1) == false) {
+ t_list->append(terminal1);
+ QList <Conductor *> other_conductors_list_t1 = terminal1 -> conductors();
+ other_conductors_list_t1.removeAll(this);
+ //recherche les conducteurs connecté au conducteur déjà trouvé
+ foreach (Conductor *c, other_conductors_list_t1) {
+ other_conductors += c -> relatedPotentialConductors(t_list);
+ }
+ other_conductors += other_conductors_list_t1.toSet();
+ }
+ //renvoie tous les conducteurs du terminal 2
+ if (t_list->contains(terminal2) == false) {
+ t_list->append(terminal2);
+ QList <Conductor *> other_conductors_list_t2 = terminal2 -> conductors();
+ other_conductors_list_t2.removeAll(this);
+ //recherche les conducteurs connecté au conducteur déjà trouvé
+ foreach (Conductor *c, other_conductors_list_t2) {
+ other_conductors += c -> relatedPotentialConductors(t_list);
+ }
+ other_conductors += other_conductors_list_t2.toSet();
+ }
+ other_conductors.remove(const_cast<Conductor *>(this));
+ return(other_conductors);
+}
+
+/**
+ * @return l'editeur de schemas parent ou 0
+ */
+QETDiagramEditor* Conductor::diagramEditor() const {
+ QWidget *w = const_cast<QGraphicsView *>(diagram() -> views().at(0));
+ while (w -> parentWidget() && !w -> isWindow()) {
+ w = w -> parentWidget();
+ }
+ return(qobject_cast<QETDiagramEditor *>(w));
+}
+
+/**
@param a reel
@param b reel
@param c reel
Modified: trunk/sources/conductor.h
===================================================================
--- trunk/sources/conductor.h 2013-04-03 15:03:09 UTC (rev 2086)
+++ trunk/sources/conductor.h 2013-04-04 16:57:15 UTC (rev 2087)
@@ -21,6 +21,7 @@
#include "terminal.h"
#include "conductorprofile.h"
#include "conductorproperties.h"
+#include "qetdiagrameditor.h"
class ConductorSegment;
class ConductorTextItem;
class Element;
@@ -92,6 +93,9 @@
void adjustTextItemPosition();
virtual Highlight highlight() const;
virtual void setHighlighted(Highlight);
+ void autoText();
+ QSet<Conductor *> relatedPotentialConductors(QList <Terminal *> *t_list=0);
+ QETDiagramEditor* diagramEditor() const;
public slots:
void displayedTextChanged();
Added: trunk/sources/conductorautonumerotation.cpp
===================================================================
--- trunk/sources/conductorautonumerotation.cpp (rev 0)
+++ trunk/sources/conductorautonumerotation.cpp 2013-04-04 16:57:15 UTC (rev 2087)
@@ -0,0 +1,104 @@
+#include <QStringList>
+#include "conductorautonumerotation.h"
+#include "conductorautonumerotationwidget.h"
+#include "diagram.h"
+#include "qetdiagrameditor.h"
+#include "QGraphicsView"
+
+/**
+ * Constructor
+ */
+ConductorAutoNumerotation::ConductorAutoNumerotation() :
+conductor_ (0),
+diagram_ (0),
+strategy_(0)
+{}
+
+/**
+ *Constructor
+ * @param c le conducteur a appliquer une numerotation
+ */
+ConductorAutoNumerotation::ConductorAutoNumerotation(Conductor *c) :
+ conductor_ (c),
+ diagram_ (c -> diagram()),
+ strategy_(0),
+ conductor_list(c -> relatedPotentialConductors())
+{}
+
+/**
+ *destructor
+ */
+ConductorAutoNumerotation::~ConductorAutoNumerotation() {
+ delete strategy_;
+}
+
+/**
+ * @param c le conducteur a appliquer une numerotation
+ */
+void ConductorAutoNumerotation::setConductor(Conductor *c) {
+ conductor_ = c;
+ diagram_ = c -> diagram();
+ strategy_ = 0;
+ conductor_list = c -> relatedPotentialConductors();
+}
+
+/**
+ * @brief ConductorAutoNumerotation::numerate
+ *execute la numerotation automatique du conducteur
+ */
+void ConductorAutoNumerotation::numerate() {
+ if (conductor_ == 0) return;
+ //ce conducteur est sur un potentiel existant
+ if (conductor_list.size() >= 1) {
+ setNumStrategy(new SamePotential);
+ strategy_ -> createNumerotation(conductor_, diagram_);
+ }
+ //ce conducteur est le premier d'un nouveau potentiel
+ else if (conductor_list.size() == 0) {
+ }
+}
+
+/**
+ * @brief ConductorAutoNumerotation::setNumStrategy
+ *applique la strategy adéquate à la situation
+ * @param strategy la class de la strategy à appliquer
+ */
+void ConductorAutoNumerotation::setNumStrategy(NumStrategy *strategy) {
+ if (strategy_ != 0)
+ delete strategy_;
+ strategy_ = strategy;
+}
+
+NumStrategy::NumStrategy () {}
+NumStrategy::~NumStrategy() {}
+
+/**
+ * @brief SamePotential::createNumerotation
+ *crée la numerotation pour le conducteur @c connecté sur un potentiel deja existant
+ */
+void SamePotential::createNumerotation(Conductor *c, Diagram *d) {
+ QSet <Conductor *> cl;
+ QStringList strl;
+
+ cl = c -> relatedPotentialConductors();
+ foreach (const Conductor *cc, cl) strl<<(cc->text());
+ //tout les textes sont identique
+ if (eachIsEqual(strl)) {
+ ConductorProperties cp;
+ cp.text = strl.at(0);
+ c -> setProperties(cp);
+ c -> setText(strl.at(0));
+ }
+ //les textes ne sont pas identique
+ else {
+ ConductorAutoNumerotationWidget canw (c, cl, c -> diagramEditor());
+ canw.exec();
+ }
+}
+
+bool eachIsEqual (const QStringList &qsl) {
+ foreach (const QString t, qsl) {
+ if (qsl.at(0) != t) return false;
+ }
+ return true;
+}
Added: trunk/sources/conductorautonumerotation.h
===================================================================
--- trunk/sources/conductorautonumerotation.h (rev 0)
+++ trunk/sources/conductorautonumerotation.h 2013-04-04 16:57:15 UTC (rev 2087)
@@ -0,0 +1,49 @@
+#ifndef CONDUCTORAUTONUMEROTATION_H
+#define CONDUCTORAUTONUMEROTATION_H
+
+#include <conductor.h>
+
+class NumStrategy;
+
+class ConductorAutoNumerotation
+{
+ public:
+ //constructors & destructor
+ ConductorAutoNumerotation ();
+ ConductorAutoNumerotation(Conductor *);
+ ~ConductorAutoNumerotation();
+
+ //methods
+ void setConductor(Conductor *);
+ void numerate();
+
+ protected:
+ //methods
+ void setNumStrategy (NumStrategy *);
+
+ //attributes
+ Conductor *conductor_;
+ Diagram *diagram_;
+ QSet <Conductor *> conductor_list;
+ NumStrategy *strategy_;
+};
+
+
+class NumStrategy
+{
+ public:
+ NumStrategy ();
+ virtual ~NumStrategy ();
+ virtual void createNumerotation(Conductor *, Diagram *) = 0; //cree la numerotation en fonction de la strategie utilisé
+
+};
+
+
+class SamePotential: public NumStrategy
+{
+ virtual void createNumerotation(Conductor *, Diagram *);
+};
+
+bool eachIsEqual (const QStringList &);
+
+#endif // CONDUCTORAUTONUMEROTATION_H
Added: trunk/sources/conductorautonumerotationwidget.cpp
===================================================================
--- trunk/sources/conductorautonumerotationwidget.cpp (rev 0)
+++ trunk/sources/conductorautonumerotationwidget.cpp 2013-04-04 16:57:15 UTC (rev 2087)
@@ -0,0 +1,144 @@
+#include "conductorautonumerotationwidget.h"
+#include "conductorproperties.h"
+#include "diagramcommands.h"
+#include "diagram.h"
+
+ConductorAutoNumerotationWidget::ConductorAutoNumerotationWidget(Conductor *c, QSet<Conductor *> cl, QWidget *parent) :
+ conductor_(c),
+ c_list(cl),
+ QDialog (parent)
+{
+#ifdef Q_WS_MAC
+ setWindowFlags(Qt::Sheet);
+#endif
+ buildInterface();
+}
+
+void ConductorAutoNumerotationWidget::buildInterface() {
+ QVBoxLayout *mainlayout = new QVBoxLayout;
+ QGroupBox *potential_groupbox = new QGroupBox(tr("Textes de potentiel"), this);
+ QVBoxLayout *vlayout = new QVBoxLayout;
+
+ QLabel *label= new QLabel(tr("Les textes de ce potentiel \351lectrique ne sont pas identiques.\n"
+ "Appliquer un texte \340 l'ensemble de ces conducteurs?"), this);
+ vlayout -> addWidget(label);
+
+ //map the signal for each radio button create in buildRadioList
+ sm_ = new QSignalMapper(this);
+ connect(sm_, SIGNAL(mapped(QString)), this, SLOT(setText(QString)));
+ vlayout -> addLayout(buildRadioList());
+
+ potential_groupbox -> setLayout(vlayout);
+ mainlayout -> addWidget(potential_groupbox);
+
+ QDialogButtonBox *dbb = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Yes, Qt::Horizontal, this);
+ connect(dbb, SIGNAL(rejected()),
+ this, SLOT(reject()));
+ connect(dbb, SIGNAL(accepted()),
+ this, SLOT(accept()));
+
+ mainlayout->addWidget(dbb);
+ setLayout(mainlayout);
+}
+
+/**
+ * @brief ConductorAutoNumerotationWidget::buildRadioList
+ *construit toute la partie de l'interface contenant les boutons radio permetant le choix du texte a appliquer
+ * @return un layout contenant les boutons radio
+ */
+QVBoxLayout* ConductorAutoNumerotationWidget::buildRadioList() {
+ QVBoxLayout *radioLayout = new QVBoxLayout;
+ QHBoxLayout *otherLayout = new QHBoxLayout;
+
+ //create a new radio button for each text of @conductorList
+ QMultiMap<int, QString> conductorlist = conductorsTextToMap(c_list);
+ for (QMultiMap<int, QString>::ConstIterator it = conductorlist.constEnd()-1; it != conductorlist.constBegin()-1; --it) {
+ QRadioButton *rb= new QRadioButton(it.value() + tr(" : est pr\351sent ") + QString::number(it.key()) + tr(" fois."), this);
+ if (it == conductorlist.constEnd()-1) {
+ rb -> setChecked(true);
+ text_ = it.value();
+ }
+ //connect the button to mapper @sm_
+ connect(rb, SIGNAL(clicked()),
+ sm_, SLOT(map()));
+ sm_ -> setMapping(rb, it.value());
+ radioLayout -> addWidget(rb);
+ }
+
+ //create the "other" radio button and is text field
+ QRadioButton *other= new QRadioButton(tr("Autre"), this);
+ text_field = new QLineEdit(this);
+ text_field -> setEnabled(false);
+ connect(other, SIGNAL(toggled(bool)), text_field, SLOT(setEnabled(bool)));
+ otherLayout -> addWidget(other);
+ otherLayout -> addWidget(text_field);
+ radioLayout -> addLayout(otherLayout);
+ return radioLayout;
+}
+
+/**
+ * @param csl liste des conducteurs a analyser
+ * @return QMultiMap avec le nombre de conducteurs possedant le même texte en clee et le texte en question comme valeur
+ */
+QMultiMap <int, QString> ConductorAutoNumerotationWidget::conductorsTextToMap(QSet<Conductor *> csl) {
+ QStringList textList;
+ foreach(Conductor *c, csl) textList << c -> text();
+
+ QMultiMap<int, QString> conductorlist;
+ while (!textList.size() == 0) {
+ QString t = textList.at(0);
+ int n = textList.count(t);
+ textList.removeAll(t);
+ conductorlist.insert(n, t);
+ }
+ return conductorlist;
+}
+
+/**
+ * @brief ConductorAutoNumerotationWidget::applyText
+ *applique le texte selectionne @text_ a tout les conducteur de @c_list et a @conducteur_
+ */
+void ConductorAutoNumerotationWidget::applyText() {
+ QList <ConductorProperties> old_properties, new_properties;
+ ConductorProperties cp;
+ foreach (Conductor *c, c_list) {
+ old_properties << c -> properties();
+ cp = c -> properties();
+ cp.text = text_;
+ c -> setProperties(cp);
+ new_properties << c -> properties();
+ c -> setText(text_);
+ }
+ // initialise l'objet UndoCommand correspondant
+ ChangeSeveralConductorsPropertiesCommand *cscpc = new ChangeSeveralConductorsPropertiesCommand(c_list);
+ cscpc -> setOldSettings(old_properties);
+ cscpc -> setNewSettings(new_properties);
+ conductor_ -> diagram() -> undoStack().push(cscpc);
+
+ cp = conductor_ -> properties();
+ cp.text = text_;
+ conductor_ -> setProperties(cp);
+ conductor_ -> setText(text_);
+}
+
+/**
+ * @brief ConductorAutoNumerotationWidget::setText
+ * enregistre le texte @t passé en parametre
+ */
+void ConductorAutoNumerotationWidget::setText(QString t) {
+ text_ = t;
+}
+
+/**
+ * @brief ConductorAutoNumerotationWidget::accept
+ *action executé lors de l'appuis sur le bouton 'oui'
+ */
+void ConductorAutoNumerotationWidget::accept() {
+ if (text_field -> isEnabled()) {
+ text_ = text_field -> text();
+ applyText();
+ }
+ else
+ applyText();
+ close();
+}
Added: trunk/sources/conductorautonumerotationwidget.h
===================================================================
--- trunk/sources/conductorautonumerotationwidget.h (rev 0)
+++ trunk/sources/conductorautonumerotationwidget.h 2013-04-04 16:57:15 UTC (rev 2087)
@@ -0,0 +1,38 @@
+#ifndef CONDUCTORAUTONUMEROTATIONWIDGET_H
+#define CONDUCTORAUTONUMEROTATIONWIDGET_H
+
+#include <QtGui>
+#include <QList>
+#include <QSet>
+#include <QMultiMap>
+#include <QString>
+#include "conductor.h"
+
+class ConductorAutoNumerotationWidget : public QDialog
+{
+ Q_OBJECT
+ public:
+ explicit ConductorAutoNumerotationWidget(Conductor *, QSet <Conductor *>, QWidget *parent = 0);
+ QMultiMap <int, QString> conductorsTextToMap (QSet <Conductor *>);
+
+ public slots:
+ void setText (QString);
+ void accept();
+
+ private:
+ //methods
+ void buildInterface();
+ QVBoxLayout* buildRadioList();
+ void applyText();
+
+ //attributes
+ QSet<Conductor *> c_list; //liste des conducteurs au même potentiel
+ Conductor *conductor_;
+ QList <QRadioButton *> *radio_List;
+ QLineEdit *text_field;
+ QString text_;
+ QSignalMapper *sm_;
+
+};
+
+#endif // CONDUCTORAUTONUMEROTATIONWIDGET_H
Modified: trunk/sources/diagramcommands.cpp
===================================================================
--- trunk/sources/diagramcommands.cpp 2013-04-03 15:03:09 UTC (rev 2086)
+++ trunk/sources/diagramcommands.cpp 2013-04-04 16:57:15 UTC (rev 2087)
@@ -936,3 +936,62 @@
conductor -> update();
}
}
+
+/**
+ Constructeur
+ @param c La liste des conducteurs dont on modifie les proprietes
+ @param parent QUndoCommand parent
+*/
+ChangeSeveralConductorsPropertiesCommand::ChangeSeveralConductorsPropertiesCommand(QSet<Conductor *>c, QUndoCommand *parent) :
+ QUndoCommand(QObject::tr("modifier les propri\351t\351s de plusieurs conducteurs", "undo caption"), parent),
+ conductors(c),
+ old_settings_set(false),
+ new_settings_set(false)
+{
+}
+
+/// Destructeur
+ChangeSeveralConductorsPropertiesCommand::~ChangeSeveralConductorsPropertiesCommand() {
+}
+
+/// definit l'ancienne configuration
+void ChangeSeveralConductorsPropertiesCommand::setOldSettings(const QList<ConductorProperties> &properties) {
+ old_properties = properties;
+ old_settings_set = true;
+}
+
+/// definit la nouvelle configuration
+void ChangeSeveralConductorsPropertiesCommand::setNewSettings(const QList<ConductorProperties> &properties) {
+ new_properties = properties;
+ new_settings_set = true;
+}
+
+/**
+ Annule les changements - Attention : les anciens et nouveaux parametres
+ doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
+*/
+void ChangeSeveralConductorsPropertiesCommand::undo() {
+ if (old_settings_set && new_settings_set) {
+ int i=0;
+ foreach(Conductor *c, conductors) {
+ c -> setProperties(old_properties.at(i));
+ c -> update();
+ i++;
+ }
+ }
+}
+
+/**
+ Refait les changements - Attention : les anciens et nouveaux parametres
+ doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
+*/
+void ChangeSeveralConductorsPropertiesCommand::redo() {
+ if (old_settings_set && new_settings_set) {
+ int i=0;
+ foreach(Conductor *c, conductors) {
+ c -> setProperties(new_properties.at(0));
+ c -> update();
+ i++;
+ }
+ }
+}
Modified: trunk/sources/diagramcommands.h
===================================================================
--- trunk/sources/diagramcommands.h 2013-04-03 15:03:09 UTC (rev 2086)
+++ trunk/sources/diagramcommands.h 2013-04-04 16:57:15 UTC (rev 2087)
@@ -495,4 +495,36 @@
/// track whether post-change properties were set
bool new_settings_set;
};
+
+/**
+ This command changes the properties for several conductors.
+*/
+class ChangeSeveralConductorsPropertiesCommand : public QUndoCommand {
+ // constructors, destructor
+ public:
+ ChangeSeveralConductorsPropertiesCommand(QSet<Conductor *>, QUndoCommand * = 0);
+ virtual ~ChangeSeveralConductorsPropertiesCommand();
+ private:
+ ChangeSeveralConductorsPropertiesCommand(const ChangeSeveralConductorsPropertiesCommand &);
+
+ // methods
+ public:
+ virtual void undo();
+ virtual void redo();
+ virtual void setOldSettings(const QList<ConductorProperties> &);
+ virtual void setNewSettings(const QList<ConductorProperties> &);
+
+ // attributes
+ private:
+ /// modified conductor
+ QSet<Conductor *> conductors;
+ /// properties before the change
+ QList <ConductorProperties> old_properties;
+ /// properties after the change
+ QList <ConductorProperties> new_properties;
+ /// track whether pre-change properties were set
+ bool old_settings_set;
+ /// track whether post-change properties were set
+ bool new_settings_set;
+};
#endif
Modified: trunk/sources/terminal.cpp
===================================================================
--- trunk/sources/terminal.cpp 2013-04-03 15:03:09 UTC (rev 2086)
+++ trunk/sources/terminal.cpp 2013-04-04 16:57:15 UTC (rev 2087)
@@ -368,6 +368,7 @@
Conductor *new_conductor = new Conductor(this, other_terminal);
new_conductor -> setProperties(d -> defaultConductorProperties);
d -> undoStack().push(new AddConductorCommand(d, new_conductor));
+ new_conductor -> autoText();
}
}