2006-10-27 15:47:22 +00:00
# include <math.h>
2007-09-21 13:22:18 +00:00
# include "qetapp.h"
2007-10-03 17:02:39 +00:00
# include "conductor.h"
2007-01-30 22:32:21 +00:00
# include "customelement.h"
2007-01-29 00:41:12 +00:00
# include "diagram.h"
2007-02-01 01:07:26 +00:00
# include "exportdialog.h"
2007-09-26 17:14:09 +00:00
# include "diagramcommands.h"
2006-10-27 15:47:22 +00:00
/**
Constructeur
@ param parent Le QObject parent du schema
*/
2007-09-25 23:24:36 +00:00
Diagram : : Diagram ( QObject * parent ) : QGraphicsScene ( parent ) , qgi_manager ( this ) {
2006-10-27 15:47:22 +00:00
setBackgroundBrush ( Qt : : white ) ;
2007-10-03 17:02:39 +00:00
conductor_setter = new QGraphicsLineItem ( 0 , 0 ) ;
conductor_setter - > setZValue ( 1000000 ) ;
2006-10-27 15:47:22 +00:00
QPen t ;
t . setColor ( Qt : : black ) ;
t . setWidthF ( 1.5 ) ;
t . setStyle ( Qt : : DashLine ) ;
2007-10-03 17:02:39 +00:00
conductor_setter - > setPen ( t ) ;
conductor_setter - > setLine ( QLineF ( QPointF ( 0.0 , 0.0 ) , QPointF ( 0.0 , 0.0 ) ) ) ;
2007-02-01 01:07:26 +00:00
draw_grid = true ;
use_border = true ;
2007-09-30 14:20:38 +00:00
moved_elements_fetched = false ;
2007-09-05 20:42:08 +00:00
connect ( this , SIGNAL ( selectionChanged ( ) ) , this , SLOT ( slot_checkSelectionEmptinessChange ( ) ) ) ;
2006-10-27 15:47:22 +00:00
}
2007-04-12 03:13:13 +00:00
/**
Destructeur
*/
Diagram : : ~ Diagram ( ) {
2007-09-29 12:54:01 +00:00
}
2007-04-12 03:13:13 +00:00
2006-10-27 15:47:22 +00:00
/**
Dessine l ' arriere - plan du schema , cad la grille .
@ param p Le QPainter a utiliser pour dessiner
@ param r Le rectangle de la zone a dessiner
*/
2007-01-29 00:41:12 +00:00
void Diagram : : drawBackground ( QPainter * p , const QRectF & r ) {
2006-10-27 15:47:22 +00:00
p - > save ( ) ;
2007-02-01 01:07:26 +00:00
// desactive tout antialiasing, sauf pour le texte
2006-10-27 15:47:22 +00:00
p - > setRenderHint ( QPainter : : Antialiasing , false ) ;
2007-02-01 01:07:26 +00:00
p - > setRenderHint ( QPainter : : TextAntialiasing , true ) ;
2006-10-27 15:47:22 +00:00
p - > setRenderHint ( QPainter : : SmoothPixmapTransform , false ) ;
// dessine un fond blanc
p - > setPen ( Qt : : NoPen ) ;
p - > setBrush ( Qt : : white ) ;
p - > drawRect ( r ) ;
2007-09-04 18:15:41 +00:00
if ( draw_grid ) {
2006-10-27 15:47:22 +00:00
// dessine les points de la grille
p - > setPen ( Qt : : black ) ;
p - > setBrush ( Qt : : NoBrush ) ;
qreal limite_x = r . x ( ) + r . width ( ) ;
qreal limite_y = r . y ( ) + r . height ( ) ;
int g_x = ( int ) ceil ( r . x ( ) ) ;
while ( g_x % GRILLE_X ) + + g_x ;
int g_y = ( int ) ceil ( r . y ( ) ) ;
while ( g_y % GRILLE_Y ) + + g_y ;
for ( int gx = g_x ; gx < limite_x ; gx + = GRILLE_X ) {
for ( int gy = g_y ; gy < limite_y ; gy + = GRILLE_Y ) {
p - > drawPoint ( gx , gy ) ;
}
}
}
2007-01-28 00:53:17 +00:00
2007-02-01 01:07:26 +00:00
if ( use_border ) border_and_inset . draw ( p , MARGIN , MARGIN ) ;
2006-10-27 15:47:22 +00:00
p - > restore ( ) ;
}
2007-09-15 23:45:27 +00:00
/**
Gere le clavier
@ param e QKeyEvent decrivant l ' evenement clavier
*/
void Diagram : : keyPressEvent ( QKeyEvent * e ) {
QPointF movement ;
switch ( e - > key ( ) ) {
case Qt : : Key_Left : movement = QPointF ( - GRILLE_X , 0.0 ) ; break ;
case Qt : : Key_Right : movement = QPointF ( + GRILLE_X , 0.0 ) ; break ;
case Qt : : Key_Up : movement = QPointF ( 0.0 , - GRILLE_Y ) ; break ;
case Qt : : Key_Down : movement = QPointF ( 0.0 , + GRILLE_Y ) ; break ;
}
if ( ! movement . isNull ( ) ) {
QSet < Element * > moved_elements = elementsToMove ( ) ;
if ( ! moved_elements . isEmpty ( ) ) {
2007-09-22 22:20:58 +00:00
Element * first_elmt = NULL ;
2007-09-15 23:45:27 +00:00
foreach ( Element * elmt , moved_elements ) {
first_elmt = elmt ;
break ;
}
first_elmt - > setPos ( first_elmt - > pos ( ) + movement ) ;
first_elmt - > moveOtherElements ( movement ) ;
}
}
QGraphicsScene : : keyPressEvent ( e ) ;
}
void Diagram : : keyReleaseEvent ( QKeyEvent * e ) {
2007-09-26 17:14:09 +00:00
// detecte le relachement d'une touche de direction ( = deplacement d'elements)
if (
( e - > key ( ) = = Qt : : Key_Left | | e - > key ( ) = = Qt : : Key_Right | | \
e - > key ( ) = = Qt : : Key_Up | | e - > key ( ) = = Qt : : Key_Down ) & & \
! current_movement . isNull ( ) & & ! e - > isAutoRepeat ( )
) {
// cree un object d'annulation pour le mouvement qui vient de se finir
undoStack ( ) . push (
new MoveElementsCommand (
this ,
elementsToMove ( ) ,
2007-10-03 17:02:39 +00:00
conductorsToMove ( ) ,
conductorsToUpdate ( ) ,
2007-09-26 17:14:09 +00:00
current_movement
)
) ;
invalidateMovedElements ( ) ;
current_movement = QPointF ( ) ;
}
2007-09-15 23:45:27 +00:00
QGraphicsScene : : keyReleaseEvent ( e ) ;
}
2006-11-11 18:25:42 +00:00
/**
Exporte le schema vers une image
@ return Une QImage representant le schema
*/
2007-02-01 01:07:26 +00:00
QImage Diagram : : toImage ( int width , int height , Qt : : AspectRatioMode aspectRatioMode ) {
// determine la zone source = contenu du schema + marges
QRectF source_area ;
if ( ! use_border ) {
source_area = itemsBoundingRect ( ) ;
source_area . translate ( - MARGIN , - MARGIN ) ;
source_area . setWidth ( source_area . width ( ) + 2.0 * MARGIN ) ;
source_area . setHeight ( source_area . height ( ) + 2.0 * MARGIN ) ;
} else {
source_area = QRectF (
0.0 ,
0.0 ,
border_and_inset . borderWidth ( ) + 2.0 * MARGIN ,
border_and_inset . borderHeight ( ) + 2.0 * MARGIN
) ;
}
2007-01-20 18:11:42 +00:00
// si les dimensions ne sont pas precisees, l'image est exportee a l'echelle 1:1
QSize image_size = ( width = = - 1 & & height = = - 1 ) ? source_area . size ( ) . toSize ( ) : QSize ( width , height ) ;
// initialise une image avec ces dimensions
QImage pix = QImage ( image_size , QImage : : Format_RGB32 ) ;
// prepare le rendu
2006-10-27 15:47:22 +00:00
QPainter p ;
2007-02-01 01:07:26 +00:00
if ( ! p . begin ( & pix ) ) return ( QImage ( ) ) ;
2006-10-27 15:47:22 +00:00
// rendu antialiase
p . setRenderHint ( QPainter : : Antialiasing , true ) ;
p . setRenderHint ( QPainter : : TextAntialiasing , true ) ;
p . setRenderHint ( QPainter : : SmoothPixmapTransform , true ) ;
2007-01-20 18:11:42 +00:00
// deselectionne tous les elements
QList < QGraphicsItem * > selected_elmts = selectedItems ( ) ;
foreach ( QGraphicsItem * qgi , selected_elmts ) qgi - > setSelected ( false ) ;
// effectue le rendu lui-meme
2007-02-01 01:07:26 +00:00
render ( & p , pix . rect ( ) , source_area , aspectRatioMode ) ;
2006-10-27 15:47:22 +00:00
p . end ( ) ;
2007-01-20 18:11:42 +00:00
// restaure les elements selectionnes
foreach ( QGraphicsItem * qgi , selected_elmts ) qgi - > setSelected ( true ) ;
2006-10-27 15:47:22 +00:00
return ( pix ) ;
}
2007-01-20 18:11:42 +00:00
/**
Permet de connaitre les dimensions qu ' aura l ' image generee par la methode toImage ( )
@ return La taille de l ' image generee par toImage ( )
*/
2007-01-29 00:41:12 +00:00
QSize Diagram : : imageSize ( ) const {
2007-02-01 01:07:26 +00:00
// determine la zone source = contenu du schema + marges
qreal image_width , image_height ;
if ( ! use_border ) {
QRectF items_rect = itemsBoundingRect ( ) ;
image_width = items_rect . width ( ) ;
image_height = items_rect . height ( ) ;
} else {
image_width = border_and_inset . borderWidth ( ) ;
image_height = border_and_inset . borderHeight ( ) ;
}
2007-01-20 18:11:42 +00:00
2007-02-01 01:07:26 +00:00
image_width + = 2.0 * MARGIN ;
image_height + = 2.0 * MARGIN ;
2007-01-20 18:11:42 +00:00
// renvoie la taille de la zone source
2007-02-01 01:07:26 +00:00
return ( QSizeF ( image_width , image_height ) . toSize ( ) ) ;
2007-01-20 18:11:42 +00:00
}
2006-10-27 15:47:22 +00:00
/**
Exporte tout ou partie du schema
2007-02-24 18:37:07 +00:00
@ param diagram Booleen ( a vrai par defaut ) indiquant si le XML genere doit
2006-11-11 18:25:42 +00:00
representer tout le schema ou seulement les elements selectionnes
2006-10-27 15:47:22 +00:00
@ return Un Document XML ( QDomDocument )
*/
2007-01-29 00:41:12 +00:00
QDomDocument Diagram : : toXml ( bool diagram ) {
2006-10-27 15:47:22 +00:00
// document
QDomDocument document ;
// racine de l'arbre XML
2007-03-09 19:18:55 +00:00
QDomElement racine = document . createElement ( " diagram " ) ;
2006-10-27 15:47:22 +00:00
// proprietes du schema
2007-01-29 00:41:12 +00:00
if ( diagram ) {
2007-03-09 19:18:55 +00:00
if ( ! border_and_inset . author ( ) . isNull ( ) ) racine . setAttribute ( " author " , border_and_inset . author ( ) ) ;
2007-01-28 00:53:17 +00:00
if ( ! border_and_inset . date ( ) . isNull ( ) ) racine . setAttribute ( " date " , border_and_inset . date ( ) . toString ( " yyyyMMdd " ) ) ;
2007-03-09 19:18:55 +00:00
if ( ! border_and_inset . title ( ) . isNull ( ) ) racine . setAttribute ( " title " , border_and_inset . title ( ) ) ;
2007-01-28 00:53:17 +00:00
if ( ! border_and_inset . fileName ( ) . isNull ( ) ) racine . setAttribute ( " filename " , border_and_inset . fileName ( ) ) ;
if ( ! border_and_inset . folio ( ) . isNull ( ) ) racine . setAttribute ( " folio " , border_and_inset . folio ( ) ) ;
2007-02-28 20:48:11 +00:00
racine . setAttribute ( " cols " , border_and_inset . nbColumn ( ) ) ;
racine . setAttribute ( " colsize " , border_and_inset . columnsWidth ( ) ) ;
racine . setAttribute ( " height " , border_and_inset . columnsHeight ( ) ) ;
2007-10-04 17:32:41 +00:00
racine . setAttribute ( " version " , QET : : version ) ;
2006-10-27 15:47:22 +00:00
}
document . appendChild ( racine ) ;
// si le schema ne contient pas d'element (et donc pas de conducteurs), on retourne de suite le document XML
if ( items ( ) . isEmpty ( ) ) return ( document ) ;
// creation de deux listes : une qui contient les elements, une qui contient les conducteurs
QList < Element * > liste_elements ;
2007-10-03 17:02:39 +00:00
QList < Conductor * > liste_conductors ;
2006-10-27 15:47:22 +00:00
// Determine les elements a <20> XMLiser <20>
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( Element * elmt = qgraphicsitem_cast < Element * > ( qgi ) ) {
2007-01-29 00:41:12 +00:00
if ( diagram ) liste_elements < < elmt ;
2006-10-27 15:47:22 +00:00
else if ( elmt - > isSelected ( ) ) liste_elements < < elmt ;
2007-10-03 17:02:39 +00:00
} else if ( Conductor * f = qgraphicsitem_cast < Conductor * > ( qgi ) ) {
if ( diagram ) liste_conductors < < f ;
2007-01-29 00:41:12 +00:00
// lorsqu'on n'exporte pas tout le diagram, il faut retirer les conducteurs non selectionnes
2006-10-27 15:47:22 +00:00
// et pour l'instant, les conducteurs non selectionnes sont les conducteurs dont un des elements n'est pas relie
2007-10-03 17:02:39 +00:00
else if ( f - > terminal1 - > parentItem ( ) - > isSelected ( ) & & f - > terminal2 - > parentItem ( ) - > isSelected ( ) ) liste_conductors < < f ;
2006-10-27 15:47:22 +00:00
}
}
// table de correspondance entre les adresses des bornes et leurs ids
2007-01-29 20:14:26 +00:00
QHash < Terminal * , int > table_adr_id ;
2007-02-24 18:37:07 +00:00
// enregistrement des elements
if ( liste_elements . isEmpty ( ) ) return ( document ) ;
2006-10-27 15:47:22 +00:00
QDomElement elements = document . createElement ( " elements " ) ;
foreach ( Element * elmt , liste_elements ) {
2007-02-24 18:37:07 +00:00
elements . appendChild ( elmt - > toXml ( document , table_adr_id ) ) ;
2006-10-27 15:47:22 +00:00
}
racine . appendChild ( elements ) ;
// enregistrement des conducteurs
2007-10-03 17:02:39 +00:00
if ( liste_conductors . isEmpty ( ) ) return ( document ) ;
QDomElement conductors = document . createElement ( " conductors " ) ;
foreach ( Conductor * cond , liste_conductors ) {
conductors . appendChild ( cond - > toXml ( document , table_adr_id ) ) ;
2006-10-27 15:47:22 +00:00
}
2007-10-03 17:02:39 +00:00
racine . appendChild ( conductors ) ;
2006-10-27 15:47:22 +00:00
// on retourne le document XML ainsi genere
return ( document ) ;
}
/**
2007-01-29 00:41:12 +00:00
Importe le diagram decrit dans un document XML . Si une position est
2006-11-11 18:25:42 +00:00
precisee , les elements importes sont positionnes de maniere a ce que le
coin superieur gauche du plus petit rectangle pouvant les entourant tous
( le bounding rect ) soit a cette position .
2006-10-27 15:47:22 +00:00
@ param document Le document XML a analyser
2007-01-29 00:41:12 +00:00
@ param position La position du diagram importe
2007-09-26 12:36:31 +00:00
@ param consider_informations Si vrai , les informations complementaires
( auteur , titre , . . . ) seront prises en compte
@ param added_elements si ce pointeur vers une liste d ' elements n ' est pas
NULL , il sera rempli avec les elements ajoutes au schema par le fromXml
@ param added_elements si ce pointeur vers une liste de conducteurs n ' est
pas NULL , il sera rempli avec les conducteurs ajoutes au schema par le
fromXml
2006-10-27 15:47:22 +00:00
@ return true si l ' import a reussi , false sinon
*/
2007-10-03 17:02:39 +00:00
bool Diagram : : fromXml ( QDomDocument & document , QPointF position , bool consider_informations , QList < Element * > * added_elements , QList < Conductor * > * added_conductors ) {
2006-10-27 15:47:22 +00:00
QDomElement racine = document . documentElement ( ) ;
// le premier element doit etre un schema
2007-03-09 19:18:55 +00:00
if ( racine . tagName ( ) ! = " diagram " ) return ( false ) ;
2007-01-29 00:41:12 +00:00
2006-10-27 15:47:22 +00:00
// lecture des attributs de ce schema
2007-01-28 00:53:17 +00:00
if ( consider_informations ) {
2007-03-09 19:18:55 +00:00
border_and_inset . setAuthor ( racine . attribute ( " author " ) ) ;
border_and_inset . setTitle ( racine . attribute ( " title " ) ) ;
2007-01-28 00:53:17 +00:00
border_and_inset . setDate ( QDate : : fromString ( racine . attribute ( " date " ) , " yyyyMMdd " ) ) ;
border_and_inset . setFileName ( racine . attribute ( " filename " ) ) ;
border_and_inset . setFolio ( racine . attribute ( " folio " ) ) ;
2007-02-28 20:48:11 +00:00
bool ok ;
// nombre de colonnes
int nb_cols = racine . attribute ( " cols " ) . toInt ( & ok ) ;
if ( ok ) border_and_inset . setNbColumns ( nb_cols ) ;
// taille des colonnes
double col_size = racine . attribute ( " colsize " ) . toDouble ( & ok ) ;
if ( ok ) border_and_inset . setColumnsWidth ( col_size ) ;
// hauteur du schema
double height = racine . attribute ( " height " ) . toDouble ( & ok ) ;
if ( ok ) border_and_inset . setColumnsHeight ( height ) ;
2007-01-28 00:53:17 +00:00
}
2006-10-27 15:47:22 +00:00
// si la racine n'a pas d'enfant : le chargement est fini (schema vide)
if ( racine . firstChild ( ) . isNull ( ) ) return ( true ) ;
// chargement de tous les Elements du fichier XML
QList < Element * > elements_ajoutes ;
2007-01-29 20:14:26 +00:00
QHash < int , Terminal * > table_adr_id ;
QHash < int , Terminal * > & ref_table_adr_id = table_adr_id ;
2006-10-27 15:47:22 +00:00
for ( QDomNode node = racine . firstChild ( ) ; ! node . isNull ( ) ; node = node . nextSibling ( ) ) {
// on s'interesse a l'element XML "elements" (= groupe d'elements)
QDomElement elmts = node . toElement ( ) ;
if ( elmts . isNull ( ) | | elmts . tagName ( ) ! = " elements " ) continue ;
// parcours des enfants de l'element XML "elements"
for ( QDomNode n = elmts . firstChild ( ) ; ! n . isNull ( ) ; n = n . nextSibling ( ) ) {
// on s'interesse a l'element XML "element" (elements eux-memes)
QDomElement e = n . toElement ( ) ;
if ( e . isNull ( ) | | ! Element : : valideXml ( e ) ) continue ;
2007-02-24 18:37:07 +00:00
// cree un element dont le type correspond <20> l'id type
QString type_id = e . attribute ( " type " ) ;
2007-09-21 13:22:18 +00:00
QString chemin_fichier = QETApp : : realPath ( type_id ) ;
2007-02-24 18:37:07 +00:00
CustomElement * nvel_elmt = new CustomElement ( chemin_fichier ) ;
if ( nvel_elmt - > isNull ( ) ) {
QString debug_message = QString ( " Le chargement de la description de l'element %1 a echoue avec le code d'erreur %2 " ) . arg ( chemin_fichier ) . arg ( nvel_elmt - > etat ( ) ) ;
delete nvel_elmt ;
qDebug ( debug_message . toLatin1 ( ) . data ( ) ) ;
continue ;
}
// charge les caracteristiques de l'element
if ( nvel_elmt - > fromXml ( e , ref_table_adr_id ) ) {
// ajout de l'element au schema et a la liste des elements ajoutes
addItem ( nvel_elmt ) ;
elements_ajoutes < < nvel_elmt ;
} else {
delete nvel_elmt ;
qDebug ( " Le chargement des parametres d'un element a echoue " ) ;
}
2006-10-27 15:47:22 +00:00
}
}
2007-09-26 12:36:31 +00:00
if ( added_elements ) ( * added_elements ) < < elements_ajoutes ;
2006-10-27 15:47:22 +00:00
// aucun Element n'a ete ajoute - inutile de chercher des conducteurs - le chargement est fini
if ( ! elements_ajoutes . size ( ) ) return ( true ) ;
// gere la translation des nouveaux elements si celle-ci est demandee
if ( position ! = QPointF ( ) ) {
// determine quel est le coin superieur gauche du rectangle entourant les elements ajoutes
qreal minimum_x = 0 , minimum_y = 0 ;
bool init = false ;
foreach ( Element * elmt_ajoute , elements_ajoutes ) {
QPointF csg = elmt_ajoute - > mapToScene ( elmt_ajoute - > boundingRect ( ) . topLeft ( ) ) ;
qreal px = csg . x ( ) ;
qreal py = csg . y ( ) ;
if ( ! init ) {
minimum_x = px ;
minimum_y = py ;
init = true ;
} else {
if ( px < minimum_x ) minimum_x = px ;
if ( py < minimum_y ) minimum_y = py ;
}
}
qreal diff_x = position . x ( ) - minimum_x ;
qreal diff_y = position . y ( ) - minimum_y ;
foreach ( Element * elmt_ajoute , elements_ajoutes ) {
elmt_ajoute - > setPos ( elmt_ajoute - > pos ( ) . x ( ) + diff_x , elmt_ajoute - > pos ( ) . y ( ) + diff_y ) ;
}
}
// chargement de tous les Conducteurs du fichier XML
for ( QDomNode node = racine . firstChild ( ) ; ! node . isNull ( ) ; node = node . nextSibling ( ) ) {
// on s'interesse a l'element XML "conducteurs" (= groupe de conducteurs)
2007-10-03 17:02:39 +00:00
QDomElement conductors = node . toElement ( ) ;
if ( conductors . isNull ( ) | | conductors . tagName ( ) ! = " conductors " ) continue ;
2006-10-27 15:47:22 +00:00
// parcours des enfants de l'element XML "conducteurs"
2007-10-03 17:02:39 +00:00
for ( QDomNode n = conductors . firstChild ( ) ; ! n . isNull ( ) ; n = n . nextSibling ( ) ) {
2006-10-27 15:47:22 +00:00
// on s'interesse a l'element XML "element" (elements eux-memes)
QDomElement f = n . toElement ( ) ;
2007-10-03 17:02:39 +00:00
if ( f . isNull ( ) | | ! Conductor : : valideXml ( f ) ) continue ;
2006-10-27 15:47:22 +00:00
// verifie que les bornes que le conducteur relie sont connues
2007-03-09 19:18:55 +00:00
int id_p1 = f . attribute ( " terminal1 " ) . toInt ( ) ;
int id_p2 = f . attribute ( " terminal2 " ) . toInt ( ) ;
2006-10-27 15:47:22 +00:00
if ( table_adr_id . contains ( id_p1 ) & & table_adr_id . contains ( id_p2 ) ) {
// pose le conducteur... si c'est possible
2007-01-29 20:14:26 +00:00
Terminal * p1 = table_adr_id . value ( id_p1 ) ;
Terminal * p2 = table_adr_id . value ( id_p2 ) ;
2006-10-27 15:47:22 +00:00
if ( p1 ! = p2 ) {
2007-10-03 17:02:39 +00:00
bool peut_poser_conductor = true ;
2006-10-27 15:47:22 +00:00
bool cia = ( ( Element * ) p2 - > parentItem ( ) ) - > connexionsInternesAcceptees ( ) ;
2007-10-03 17:02:39 +00:00
if ( ! cia ) foreach ( QGraphicsItem * item , p2 - > parentItem ( ) - > children ( ) ) if ( item = = p1 ) peut_poser_conductor = false ;
if ( peut_poser_conductor ) {
Conductor * c = new Conductor ( table_adr_id . value ( id_p1 ) , table_adr_id . value ( id_p2 ) , 0 , this ) ;
2007-02-18 19:33:15 +00:00
c - > fromXml ( f ) ;
2007-10-03 17:02:39 +00:00
if ( added_conductors ) ( * added_conductors ) < < c ;
2007-02-18 19:33:15 +00:00
}
2006-10-27 15:47:22 +00:00
}
2007-10-03 17:02:39 +00:00
} else qDebug ( ) < < " Le chargement du conductor " < < id_p1 < < id_p2 < < " a echoue " ;
2006-10-27 15:47:22 +00:00
}
}
return ( true ) ;
}
2007-02-25 17:53:16 +00:00
/**
Verifie si la selection est passe d ' un etat ou elle est vide a un etat ou
elle ne l ' est pas , et inversement . Si c ' est le cas , le signal
EmptinessChanged ( ) est emis .
*/
void Diagram : : slot_checkSelectionEmptinessChange ( ) {
static bool selection_was_empty = true ;
bool selection_is_empty = selectedItems ( ) . isEmpty ( ) ;
if ( selection_was_empty ! = selection_is_empty ) {
emit ( selectionEmptinessChanged ( ) ) ;
selection_was_empty = selection_is_empty ;
}
}
2007-01-28 00:53:17 +00:00
/**
@ return Le rectangle ( coordonnees par rapport a la scene ) delimitant le bord du schema
*/
2007-01-29 00:41:12 +00:00
QRectF Diagram : : border ( ) const {
2007-01-28 00:53:17 +00:00
return (
QRectF (
MARGIN ,
MARGIN ,
border_and_inset . borderWidth ( ) ,
border_and_inset . borderHeight ( )
)
) ;
}
2007-09-05 20:42:08 +00:00
2007-09-15 22:14:23 +00:00
/// oublie la liste des elements et conducteurs en mouvement
void Diagram : : invalidateMovedElements ( ) {
if ( ! moved_elements_fetched ) return ;
moved_elements_fetched = false ;
elements_to_move . clear ( ) ;
2007-10-03 17:02:39 +00:00
conductors_to_move . clear ( ) ;
conductors_to_update . clear ( ) ;
2007-09-15 22:14:23 +00:00
}
/// reconstruit la liste des elements et conducteurs en mouvement
void Diagram : : fetchMovedElements ( ) {
// recupere les elements deplaces
foreach ( QGraphicsItem * item , selectedItems ( ) ) {
if ( Element * elmt = qgraphicsitem_cast < Element * > ( item ) ) {
elements_to_move < < elmt ;
}
}
// pour chaque element deplace, determine les conducteurs qui seront modifies
foreach ( Element * elmt , elements_to_move ) {
foreach ( Terminal * terminal , elmt - > terminals ( ) ) {
2007-10-03 17:02:39 +00:00
foreach ( Conductor * conductor , terminal - > conductors ( ) ) {
2007-09-15 22:14:23 +00:00
Terminal * other_terminal ;
2007-10-03 17:02:39 +00:00
if ( conductor - > terminal1 = = terminal ) {
other_terminal = conductor - > terminal2 ;
2007-09-15 22:14:23 +00:00
} else {
2007-10-03 17:02:39 +00:00
other_terminal = conductor - > terminal1 ;
2007-09-15 22:14:23 +00:00
}
// si les deux elements du conducteur sont deplaces
if ( elements_to_move . contains ( static_cast < Element * > ( other_terminal - > parentItem ( ) ) ) ) {
2007-10-03 17:02:39 +00:00
conductors_to_move < < conductor ;
2007-09-15 22:14:23 +00:00
} else {
2007-10-03 17:02:39 +00:00
conductors_to_update . insert ( conductor , terminal ) ;
2007-09-15 22:14:23 +00:00
}
}
}
}
moved_elements_fetched = true ;
}
2007-09-30 12:35:25 +00:00
void Diagram : : setDrawTerminals ( bool dt ) {
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( Terminal * t = qgraphicsitem_cast < Terminal * > ( qgi ) ) {
t - > setVisible ( dt ) ;
}
}
}
2007-10-03 13:11:47 +00:00
2007-10-03 17:02:39 +00:00
QSet < Conductor * > Diagram : : selectedConductors ( ) const {
QSet < Conductor * > conductors_set ;
2007-10-03 13:11:47 +00:00
foreach ( QGraphicsItem * qgi , selectedItems ( ) ) {
2007-10-03 17:02:39 +00:00
if ( Conductor * c = qgraphicsitem_cast < Conductor * > ( qgi ) ) {
conductors_set < < c ;
2007-10-03 13:11:47 +00:00
}
}
2007-10-03 17:02:39 +00:00
return ( conductors_set ) ;
2007-10-03 13:11:47 +00:00
}