2015-08-29 14:18:30 +00:00
/*
2017-01-20 10:55:49 +00:00
Copyright 2006 - 2017 The QElectroTech Team
2015-08-29 14:18:30 +00:00
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/>.
*/
# include "potentialselectordialog.h"
# include "ui_potentialselectordialog.h"
# include "conductor.h"
# include "terminal.h"
# include <QRadioButton>
# include "QPropertyUndoCommand/qpropertyundocommand.h"
# include "diagram.h"
# include "element.h"
# include "reportelement.h"
2016-12-28 10:03:47 +00:00
# include "assignvariables.h"
2017-01-15 12:23:05 +00:00
# include "formulaassistantdialog.h"
2015-08-29 14:18:30 +00:00
2015-09-27 12:26:59 +00:00
//### BEGIN PRIVATE CLASS ###//
2015-08-29 14:18:30 +00:00
/**
* @ brief The NewConductorPotentialSelector class
* Use for get the conductor propertie when two potentials is linked by a conductor
*/
class NewConductorPotentialSelector : public AbstractPotentialSelector
{
public :
NewConductorPotentialSelector ( Conductor * conductor ) :
m_is_valid ( false )
{
Terminal * terminal_1 = conductor - > terminal1 ;
Terminal * terminal_2 = conductor - > terminal2 ;
//We temporarily remove the conductor of his two terminals, to get the two existing potential
terminal_1 - > removeConductor ( conductor ) ;
terminal_2 - > removeConductor ( conductor ) ;
2017-01-05 19:32:52 +00:00
getPotential ( terminal_1 , m_seq_num_1 , m_conductor_number_1 , m_properties_list_1 , m_conductors_list_1 ) ;
getPotential ( terminal_2 , m_seq_num_2 , m_conductor_number_2 , m_properties_list_2 , m_conductors_list_2 ) ;
2015-08-29 14:18:30 +00:00
2015-09-27 12:26:59 +00:00
//There isn't a potential at terminal 1 or 2.
if ( m_conductor_number_1 = = 0 & & m_conductor_number_2 = = 0 ) return ;
2015-08-29 14:18:30 +00:00
//Re-add conductor to his terminals.
terminal_1 - > addConductor ( conductor ) ;
terminal_2 - > addConductor ( conductor ) ;
m_is_valid = true ;
}
2017-08-05 02:10:01 +00:00
bool isValid ( ) const override { return m_is_valid ; }
2015-08-29 14:18:30 +00:00
2015-09-27 12:26:59 +00:00
/**
* @ brief getPotential
* Get the conductor propertie of the potential at terminal , and the number of wire in this potential .
* @ param terminal
* @ param properties
* @ param number
*/
2017-01-05 19:32:52 +00:00
void getPotential ( Terminal * terminal , autonum : : sequentialNumbers & seq_num , int & number , QList < ConductorProperties > & properties_list , QList < Conductor * > & c_list )
2015-09-27 12:26:59 +00:00
{
Conductor * conductor_in_potential = nullptr ;
//Terminal have conductor linked to, we get it.
if ( ! terminal - > conductors ( ) . isEmpty ( ) )
conductor_in_potential = terminal - > conductors ( ) . first ( ) ;
//Terminal haven't got a conductor, but if parent element is a folio report or a terminal element, we search a potential
//through the report or in another terminal of the terminal element.
else if ( terminal - > parentElement ( ) - > linkType ( ) & ( Element : : Terminale | Element : : AllReport ) )
{
Element * elmt_ = terminal - > parentElement ( ) ;
if ( ( elmt_ - > linkType ( ) & Element : : Terminale ) & & ! elmt_ - > terminals ( ) . isEmpty ( ) )
{
2017-02-05 16:18:50 +00:00
foreach ( Terminal * t , elmt_ - > terminals ( ) )
2015-09-27 12:26:59 +00:00
{
if ( t - > conductors ( ) . isEmpty ( ) ) continue ;
conductor_in_potential = t - > conductors ( ) . first ( ) ;
break ;
}
}
else if ( ( elmt_ - > linkType ( ) & Element : : AllReport ) & & ! elmt_ - > isFree ( ) )
{
Element * other_report = elmt_ - > linkedElements ( ) . first ( ) ;
if ( other_report - > terminals ( ) . isEmpty ( ) ) return ;
Terminal * t = other_report - > terminals ( ) . first ( ) ;
if ( t - > conductors ( ) . isEmpty ( ) ) return ;
conductor_in_potential = t - > conductors ( ) . first ( ) ;
}
}
2017-01-05 15:25:07 +00:00
if ( ! conductor_in_potential )
return ;
2016-12-28 10:03:47 +00:00
seq_num = conductor_in_potential - > sequenceNum ( ) ;
2015-09-27 12:26:59 +00:00
number = conductor_in_potential - > relatedPotentialConductors ( ) . size ( ) + 1 ; //We add +1 because conductor_in_potential isn't count by relatedPotentialConductors
2017-01-05 15:25:07 +00:00
2017-01-05 19:32:52 +00:00
c_list = conductor_in_potential - > relatedPotentialConductors ( ) . toList ( ) ;
2017-01-05 15:25:07 +00:00
c_list . append ( conductor_in_potential ) ;
2017-02-05 16:18:50 +00:00
foreach ( Conductor * c , c_list )
2017-01-05 15:25:07 +00:00
properties_list . append ( c - > properties ( ) ) ;
2015-09-27 12:26:59 +00:00
}
2017-08-05 02:10:01 +00:00
~ NewConductorPotentialSelector ( ) override { }
2015-08-29 14:18:30 +00:00
private :
bool m_is_valid ;
} ;
/**
* @ brief The LinkReportPotentialSelector class
* Use for get the conductor propertie when two potentials is linked with a folio report
*/
class LinkReportPotentialSelector : public AbstractPotentialSelector
{
public :
LinkReportPotentialSelector ( Element * report ) :
m_is_valid ( false )
{
2015-09-27 12:26:59 +00:00
if ( ( report - > linkType ( ) & Element : : AllReport ) & & ! report - > isFree ( ) )
2015-08-29 14:18:30 +00:00
{
//We temporarily unlink report to get the two existing potential
Element * other_report = report - > linkedElements ( ) . first ( ) ;
report - > unlinkAllElements ( ) ;
2017-01-05 15:25:07 +00:00
if ( report - > conductors ( ) . isEmpty ( ) | | other_report - > conductors ( ) . isEmpty ( ) )
return ;
2015-08-29 14:18:30 +00:00
m_conductor_number_1 = report - > conductors ( ) . first ( ) - > relatedPotentialConductors ( ) . size ( ) + 1 ;
2017-01-02 18:46:19 +00:00
m_seq_num_1 = report - > conductors ( ) . first ( ) - > sequenceNum ( ) ;
2017-01-05 19:32:52 +00:00
m_conductors_list_1 . append ( report - > conductors ( ) . first ( ) - > relatedPotentialConductors ( ) . toList ( ) ) ;
m_conductors_list_1 . append ( report - > conductors ( ) . first ( ) ) ;
2017-02-05 16:18:50 +00:00
foreach ( Conductor * c , m_conductors_list_1 )
2017-01-05 15:25:07 +00:00
m_properties_list_1 < < c - > properties ( ) ;
2015-08-29 14:18:30 +00:00
m_conductor_number_2 = other_report - > conductors ( ) . first ( ) - > relatedPotentialConductors ( ) . size ( ) + 1 ;
2017-01-02 18:46:19 +00:00
m_seq_num_2 = other_report - > conductors ( ) . first ( ) - > sequenceNum ( ) ;
2017-01-05 19:32:52 +00:00
m_conductors_list_2 . append ( other_report - > conductors ( ) . first ( ) - > relatedPotentialConductors ( ) . toList ( ) ) ;
m_conductors_list_2 . append ( other_report - > conductors ( ) . first ( ) ) ;
2017-02-05 16:18:50 +00:00
foreach ( Conductor * c , m_conductors_list_2 )
2017-01-05 15:25:07 +00:00
m_properties_list_2 < < c - > properties ( ) ;
2015-08-29 14:18:30 +00:00
//We relink the report
report - > linkToElement ( other_report ) ;
m_is_valid = true ;
}
}
2017-08-05 02:10:01 +00:00
~ LinkReportPotentialSelector ( ) override { }
2015-08-29 14:18:30 +00:00
2017-08-05 02:10:01 +00:00
bool isValid ( ) const override { return m_is_valid ; }
2015-08-29 14:18:30 +00:00
private :
bool m_is_valid ;
} ;
2015-09-27 12:26:59 +00:00
//### END PRIVATE CLASS ###//
2015-08-29 14:18:30 +00:00
/**
* @ brief PotentialSelectorDialog : : PotentialSelectorDialog
* Constructor when we link two potentiels together , with a conductor
* @ param conductor : the new conductor who connect to existing potential
* @ param parent_undo : undo parent to use .
* @ param parent : parent widget .
*/
PotentialSelectorDialog : : PotentialSelectorDialog ( Conductor * conductor , QUndoCommand * parent_undo , QWidget * parent ) :
QDialog ( parent ) ,
ui ( new Ui : : PotentialSelectorDialog ) ,
m_conductor ( conductor ) ,
m_report ( nullptr ) ,
m_parent_undo ( parent_undo )
{
ui - > setupUi ( this ) ;
m_potential_selector = new NewConductorPotentialSelector ( conductor ) ;
buildWidget ( ) ;
}
/**
* @ brief PotentialSelectorDialog : : PotentialSelectorDialog
* Constructor when we link two potentiels together , with a folio report .
* @ param report : one of the report used to link the potentials ( report must be linked to another report )
* @ param parent_undo : undo parent to use
2016-12-28 10:03:47 +00:00
* @ param parent : parent widget
2015-08-29 14:18:30 +00:00
*/
PotentialSelectorDialog : : PotentialSelectorDialog ( Element * report , QUndoCommand * parent_undo , QWidget * parent ) :
QDialog ( parent ) ,
ui ( new Ui : : PotentialSelectorDialog ) ,
m_conductor ( nullptr ) ,
m_report ( report ) ,
m_parent_undo ( parent_undo )
{
ui - > setupUi ( this ) ;
m_potential_selector = new LinkReportPotentialSelector ( report ) ;
buildWidget ( ) ;
}
PotentialSelectorDialog : : ~ PotentialSelectorDialog ( )
{
delete ui ;
delete m_potential_selector ;
}
/**
* @ brief PotentialSelectorDialog : : buildWidget
* Build the dialog
*/
void PotentialSelectorDialog : : buildWidget ( )
{
2017-10-04 23:07:35 +00:00
QString text1 ( tr ( " %n conducteurs composent le potentiel suivant : " , " " , m_potential_selector - > m_conductor_number_1 ) ) ;
2017-12-05 12:29:44 +00:00
ConductorProperties cp1 ;
if ( ! m_potential_selector - > m_properties_list_1 . isEmpty ( ) )
cp1 = m_potential_selector - > m_properties_list_1 . first ( ) ; ;
2017-08-27 11:27:41 +00:00
if ( ! cp1 . text . isEmpty ( ) )
2017-10-04 23:07:35 +00:00
text1 . append ( tr ( " \n Numéro : %1 " ) . arg ( cp1 . text ) ) ;
2017-08-27 11:27:41 +00:00
if ( ! cp1 . m_function . isEmpty ( ) )
text1 . append ( tr ( " \n Fonction : %1 " ) . arg ( cp1 . m_function ) ) ;
if ( ! cp1 . m_tension_protocol . isEmpty ( ) )
text1 . append ( tr ( " \n Tension/protocole : %1 " ) . arg ( cp1 . m_tension_protocol ) ) ;
QString text2 ( tr ( " %n conducteurs composent le potentiel suivant : " , " " , m_potential_selector - > m_conductor_number_2 ) ) ;
2017-12-05 12:29:44 +00:00
ConductorProperties cp2 ;
if ( ! m_potential_selector - > m_properties_list_2 . isEmpty ( ) )
cp2 = m_potential_selector - > m_properties_list_2 . first ( ) ;
2017-08-27 11:27:41 +00:00
if ( ! cp2 . text . isEmpty ( ) )
2017-10-04 23:07:35 +00:00
text2 . append ( tr ( " \n Numéro : %1 " ) . arg ( cp2 . text ) ) ;
2017-08-27 11:27:41 +00:00
if ( ! cp2 . m_function . isEmpty ( ) )
text2 . append ( tr ( " \n Fonction : %1 " ) . arg ( cp2 . m_function ) ) ;
if ( ! cp2 . m_tension_protocol . isEmpty ( ) )
text2 . append ( tr ( " \n Tension/protocole : %1 " ) . arg ( cp2 . m_tension_protocol ) ) ;
2018-07-30 15:24:29 +00:00
QRadioButton * rb1 = new QRadioButton ( text1 , this ) ;
QRadioButton * rb2 = new QRadioButton ( text2 , this ) ;
2015-08-29 14:18:30 +00:00
2016-12-28 10:03:47 +00:00
connect ( rb1 , & QRadioButton : : toggled , [ this ] ( bool t )
{
if ( t )
{
this - > m_sequential_num = this - > m_potential_selector - > m_seq_num_1 ;
2017-01-05 15:25:07 +00:00
this - > m_properties_list = this - > m_potential_selector - > m_properties_list_1 ;
2017-01-05 19:32:52 +00:00
this - > m_conductors_to_change = this - > m_potential_selector - > m_conductors_list_2 ;
2016-12-28 10:03:47 +00:00
}
} ) ;
connect ( rb2 , & QRadioButton : : toggled , [ this ] ( bool t )
{
if ( t )
{
this - > m_sequential_num = this - > m_potential_selector - > m_seq_num_2 ;
2017-01-05 15:25:07 +00:00
this - > m_properties_list = this - > m_potential_selector - > m_properties_list_2 ;
2017-01-05 19:32:52 +00:00
this - > m_conductors_to_change = this - > m_potential_selector - > m_conductors_list_1 ;
2016-12-28 10:03:47 +00:00
}
} ) ;
2015-08-29 14:18:30 +00:00
//Set the radio button of potential with the bigger number of conductors,
//at first position, and check it
if ( m_potential_selector - > m_conductor_number_1 > = m_potential_selector - > m_conductor_number_2 )
{
ui - > verticalLayout - > insertWidget ( 1 , rb1 ) ;
ui - > verticalLayout - > insertWidget ( 2 , rb2 ) ;
rb1 - > setChecked ( true ) ;
}
else
{
ui - > verticalLayout - > insertWidget ( 1 , rb2 ) ;
ui - > verticalLayout - > insertWidget ( 2 , rb1 ) ;
rb2 - > setChecked ( true ) ;
}
}
/**
* @ brief PotentialSelectorDialog : : on_buttonBox_accepted
* Action when user click on OK button
*/
void PotentialSelectorDialog : : on_buttonBox_accepted ( )
{
2017-01-05 15:25:07 +00:00
if ( ! m_potential_selector - > isValid ( ) )
return ;
2016-12-28 10:03:47 +00:00
QUndoCommand * undo = nullptr ;
if ( m_parent_undo )
undo = m_parent_undo ;
else
undo = new QUndoCommand ( tr ( " Modifier les propriétés de plusieurs conducteurs " , " undo caption " ) ) ;
2017-01-05 15:25:07 +00:00
Diagram * diagram = nullptr ;
if ( m_report )
{
if ( ( m_report - > linkType ( ) & Element : : AllReport ) & & ! m_report - > isFree ( ) )
{
if ( m_report - > diagram ( ) )
diagram = m_report - > diagram ( ) ;
QVariant old_value , new_value ;
QVariant old_seq , new_seq ;
new_seq . setValue ( m_sequential_num ) ;
//Set the new properties for each conductors of the new potential
2017-02-05 16:18:50 +00:00
foreach ( Conductor * cond , m_conductors_to_change )
2017-01-05 15:25:07 +00:00
{
ConductorProperties new_properties = cond - > properties ( ) ;
new_properties . applyForEqualAttributes ( m_properties_list ) ;
old_value . setValue ( cond - > properties ( ) ) ;
new_value . setValue ( new_properties ) ;
old_seq . setValue ( cond - > sequenceNum ( ) ) ;
new QPropertyUndoCommand ( cond , " sequenceNum " , old_seq , new_seq , undo ) ;
new QPropertyUndoCommand ( cond , " properties " , old_value , new_value , undo ) ;
}
2017-01-15 12:23:05 +00:00
//Check if formula of the new potential have incompatible variable with folio report
2018-12-01 12:55:05 +00:00
QRegularExpression rx ( " %sequf_|%seqtf_|%seqhf_|%id|%F|%M|%LM " ) ;
2017-02-05 16:18:50 +00:00
foreach ( ConductorProperties cp , m_properties_list )
2017-01-15 12:23:05 +00:00
{
if ( cp . m_formula . contains ( rx ) )
{
QStringList forbidden_str ;
2018-12-01 12:55:05 +00:00
forbidden_str < < " %sequf_ " < < " %seqtf_ " < < " %seqhf_ " < < " %id " < < " %F " < < " %M " < < " %LM " ;
2017-01-15 12:23:05 +00:00
2017-01-15 19:29:10 +00:00
QString text ( tr ( " La formule du nouveau potentiel contient des variables incompatibles avec les reports de folio. \n "
2017-01-15 12:23:05 +00:00
" Veuillez saisir une formule compatible pour ce potentiel. \n "
2017-01-15 19:29:10 +00:00
" Les variables suivantes sont incompatibles : \n "
2018-12-01 12:55:05 +00:00
" %sequf_ %seqtf_ %seqhf_ %id %F %M %LM " ) ) ;
2017-01-15 12:23:05 +00:00
FormulaAssistantDialog fag ( this ) ;
fag . setForbiddenVariables ( forbidden_str ) ;
fag . setText ( text ) ;
fag . setFormula ( cp . m_formula ) ;
fag . exec ( ) ;
QString new_formula = fag . formula ( ) ;
QSet < Conductor * > c_list = m_report - > conductors ( ) . first ( ) - > relatedPotentialConductors ( ) ;
c_list . insert ( m_report - > conductors ( ) . first ( ) ) ;
2017-02-05 16:18:50 +00:00
foreach ( Conductor * cond , c_list )
2017-01-15 12:23:05 +00:00
{
old_value . setValue ( cond - > properties ( ) ) ;
ConductorProperties new_properties = cond - > properties ( ) ;
new_properties . m_formula = new_formula ;
new_value . setValue ( new_properties ) ;
new QPropertyUndoCommand ( cond , " properties " , old_value , new_value , undo ) ;
}
break ;
}
}
2017-01-05 15:25:07 +00:00
}
}
else if ( m_conductor )
2015-08-29 14:18:30 +00:00
{
2017-01-05 15:25:07 +00:00
if ( m_conductor - > diagram ( ) )
diagram = m_conductor - > diagram ( ) ;
ConductorProperties new_properties = m_conductor - > properties ( ) ;
new_properties . applyForEqualAttributes ( m_properties_list ) ;
QVariant old_value , new_value ;
old_value . setValue ( m_conductor - > properties ( ) ) ;
2015-08-29 14:18:30 +00:00
new_value . setValue ( new_properties ) ;
2017-01-05 15:25:07 +00:00
QVariant old_seq , new_seq ;
old_seq . setValue ( m_conductor - > sequenceNum ( ) ) ;
new_seq . setValue ( m_sequential_num ) ;
new QPropertyUndoCommand ( m_conductor , " sequenceNum " , old_seq , new_seq , undo ) ;
new QPropertyUndoCommand ( m_conductor , " properties " , old_value , new_value , undo ) ;
//Set the new properties for each conductors of the new potential
2017-02-05 16:18:50 +00:00
foreach ( Conductor * cond , m_conductor - > relatedPotentialConductors ( ) )
2017-01-05 15:25:07 +00:00
{
new_properties = cond - > properties ( ) ;
new_properties . applyForEqualAttributes ( m_properties_list ) ;
old_value . setValue ( cond - > properties ( ) ) ;
new_value . setValue ( new_properties ) ;
old_seq . setValue ( cond - > sequenceNum ( ) ) ;
new QPropertyUndoCommand ( cond , " sequenceNum " , old_seq , new_seq , undo ) ;
new QPropertyUndoCommand ( cond , " properties " , old_value , new_value , undo ) ;
}
2015-08-29 14:18:30 +00:00
}
//There is an undo parent, we stop here, the owner of m_parent_undo will push it to an undo stack
2017-01-05 15:25:07 +00:00
if ( m_parent_undo )
return ;
2015-08-29 14:18:30 +00:00
//There isn't a parent, we push the undo command to diagram undo stack.
2017-01-05 15:25:07 +00:00
if ( diagram )
diagram - > undoStack ( ) . push ( undo ) ;
2015-08-29 14:18:30 +00:00
}