2007-12-01 10:47:15 +00:00
/*
2015-02-20 14:56:22 +00:00
Copyright 2006 - 2015 The QElectroTech Team
2007-12-01 10:47:15 +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/>.
*/
2006-10-27 15:47:22 +00:00
# include <math.h>
2013-11-14 10:11:22 +00:00
# include "qetgraphicsitem/conductor.h"
# include "qetgraphicsitem/conductortextitem.h"
# include "qetgraphicsitem/customelement.h"
2013-12-20 20:30:55 +00:00
# include "factory/elementfactory.h"
2007-01-29 00:41:12 +00:00
# include "diagram.h"
2007-09-26 17:14:09 +00:00
# include "diagramcommands.h"
2007-11-09 13:06:51 +00:00
# include "diagramcontent.h"
2009-05-20 21:29:17 +00:00
# include "diagramposition.h"
2013-11-14 10:11:22 +00:00
# include "qetgraphicsitem/elementtextitem.h"
2010-05-08 21:24:43 +00:00
# include "elementsmover.h"
2010-04-18 17:59:54 +00:00
# include "exportdialog.h"
2013-11-14 10:11:22 +00:00
# include "qetgraphicsitem/ghostelement.h"
# include "qetgraphicsitem/independenttextitem.h"
# include "qetgraphicsitem/diagramimageitem.h"
2014-02-28 14:30:59 +00:00
# include "qetgraphicsitem/qetshapeitem.h"
2014-07-21 20:44:32 +00:00
# include "terminal.h"
2014-10-25 21:21:52 +00:00
# include "elementtextsmover.h"
2015-03-04 21:13:13 +00:00
# include "diagrameventinterface.h"
2006-10-27 15:47:22 +00:00
2007-10-10 22:35:32 +00:00
const int Diagram : : xGrid = 10 ;
const int Diagram : : yGrid = 10 ;
const qreal Diagram : : margin = 5.0 ;
2013-12-26 17:59:58 +00:00
// static variable to keep track of present background color of the diagram.
QColor Diagram : : background_color = Qt : : white ;
2014-12-21 12:50:26 +00:00
2006-10-27 15:47:22 +00:00
/**
2014-12-21 12:50:26 +00:00
* @ brief Diagram : : Diagram
* Constructor
* @ param project : The project of this diagram and also parent QObject
*/
Diagram : : Diagram ( QETProject * project ) :
QGraphicsScene ( project ) ,
2016-03-15 18:42:18 +00:00
m_project ( nullptr ) ,
2014-12-21 12:50:26 +00:00
diagram_qet_version_ ( - 1 ) ,
draw_grid_ ( true ) ,
use_border_ ( true ) ,
draw_terminals_ ( true ) ,
2015-03-04 21:13:13 +00:00
draw_colored_conductors_ ( true ) ,
m_event_interface ( nullptr )
2007-10-11 12:51:56 +00:00
{
2014-12-21 12:50:26 +00:00
setProject ( project ) ;
2012-11-09 21:09:24 +00:00
qgi_manager_ = new QGIManager ( this ) ;
2006-10-27 15:47:22 +00:00
setBackgroundBrush ( Qt : : white ) ;
2015-03-02 20:14:56 +00:00
conductor_setter_ = new QGraphicsLineItem ( 0 ) ;
2012-11-09 21:09:24 +00:00
conductor_setter_ - > setZValue ( 1000000 ) ;
2015-03-04 21:13:13 +00:00
2015-03-02 20:14:56 +00:00
QPen pen ( Qt : : NoBrush , 1.5 , Qt : : DashLine ) ;
pen . setColor ( Qt : : black ) ;
conductor_setter_ - > setPen ( pen ) ;
2010-05-08 21:24:43 +00:00
2014-12-21 12:50:26 +00:00
//Init object for manage movement
elements_mover_ = new ElementsMover ( ) ;
element_texts_mover_ = new ElementTextsMover ( ) ;
2014-10-25 21:21:52 +00:00
2014-12-21 12:50:26 +00:00
connect ( & border_and_titleblock , SIGNAL ( needTitleBlockTemplate ( const QString & ) ) , this , SLOT ( setTitleBlockTemplate ( const QString & ) ) ) ;
connect ( & border_and_titleblock , SIGNAL ( diagramTitleChanged ( const QString & ) ) , this , SLOT ( titleChanged ( const QString & ) ) ) ;
2015-03-30 15:58:16 +00:00
connect ( & border_and_titleblock , SIGNAL ( borderChanged ( QRectF , QRectF ) ) , this , SLOT ( adjustSceneRect ( ) ) ) ;
adjustSceneRect ( ) ;
2006-10-27 15:47:22 +00:00
}
2007-04-12 03:13:13 +00:00
/**
2014-04-20 23:37:03 +00:00
* @ brief Diagram : : ~ Diagram
* Destructor
*/
2007-04-12 03:13:13 +00:00
Diagram : : ~ Diagram ( ) {
2014-01-05 15:00:46 +00:00
// clear undo stack to prevent errors, because contains pointers to this diagram and is elements.
undoStack ( ) . clear ( ) ;
2014-04-20 23:37:03 +00:00
//delete of QGIManager, every elements he knows are removed
2012-11-09 21:09:24 +00:00
delete qgi_manager_ ;
2013-09-17 20:14:30 +00:00
// remove of conductor setter
delete conductor_setter_ ;
2008-07-17 22:57:50 +00:00
2014-04-20 23:37:03 +00:00
// delete of object for manage movement
2010-05-08 21:24:43 +00:00
delete elements_mover_ ;
2014-10-25 21:21:52 +00:00
delete element_texts_mover_ ;
2015-03-04 21:13:13 +00:00
if ( m_event_interface ) delete m_event_interface ;
2010-05-08 21:24:43 +00:00
2014-04-20 23:37:03 +00:00
// list removable items
2008-07-17 22:57:50 +00:00
QList < QGraphicsItem * > deletable_items ;
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( qgi - > parentItem ( ) ) continue ;
if ( qgraphicsitem_cast < Conductor * > ( qgi ) ) continue ;
deletable_items < < qgi ;
}
2014-04-20 23:37:03 +00:00
qDeleteAll ( deletable_items ) ;
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 ) ;
2013-12-26 17:59:58 +00:00
//set brush color to present background color.
p - > setBrush ( Diagram : : background_color ) ;
2006-10-27 15:47:22 +00:00
p - > drawRect ( r ) ;
2012-11-09 21:09:24 +00:00
if ( draw_grid_ ) {
2015-03-02 20:14:56 +00:00
//Draw the point of the grid
// if background color is black, then grid spots shall be white, else they shall be black in color.
QPen pen ;
Diagram : : background_color = = Qt : : black ? pen . setColor ( Qt : : white ) : pen . setColor ( Qt : : black ) ;
pen . setCosmetic ( true ) ;
p - > setPen ( pen ) ;
2006-10-27 15:47:22 +00:00
p - > setBrush ( Qt : : NoBrush ) ;
2015-03-24 23:10:15 +00:00
2015-03-29 12:15:25 +00:00
//If user allow zoom out beyond of folio, we draw grid outside of border.
2015-09-16 15:11:13 +00:00
QSettings settings ;
QRectF rect = settings . value ( " diagrameditor/zoom-out-beyond-of-folio " , false ) . toBool ( ) ?
2015-03-24 23:10:15 +00:00
r :
border_and_titleblock . insideBorderRect ( ) . intersected ( r ) ;
2015-03-14 21:40:44 +00:00
qreal limite_x = rect . x ( ) + rect . width ( ) ;
qreal limite_y = rect . y ( ) + rect . height ( ) ;
2006-10-27 15:47:22 +00:00
2015-03-14 21:40:44 +00:00
int g_x = ( int ) ceil ( rect . x ( ) ) ;
2007-10-10 22:35:32 +00:00
while ( g_x % xGrid ) + + g_x ;
2015-03-14 21:40:44 +00:00
int g_y = ( int ) ceil ( rect . y ( ) ) ;
2007-10-10 22:35:32 +00:00
while ( g_y % yGrid ) + + g_y ;
2006-10-27 15:47:22 +00:00
2010-01-10 20:22:52 +00:00
QPolygon points ;
2007-10-10 22:35:32 +00:00
for ( int gx = g_x ; gx < limite_x ; gx + = xGrid ) {
for ( int gy = g_y ; gy < limite_y ; gy + = yGrid ) {
2010-01-10 20:22:52 +00:00
points < < QPoint ( gx , gy ) ;
2006-10-27 15:47:22 +00:00
}
}
2010-01-10 20:22:52 +00:00
p - > drawPoints ( points ) ;
2006-10-27 15:47:22 +00:00
}
2007-01-28 00:53:17 +00:00
2015-03-16 13:29:27 +00:00
if ( use_border_ ) border_and_titleblock . draw ( p ) ;
2006-10-27 15:47:22 +00:00
p - > restore ( ) ;
}
2007-09-15 23:45:27 +00:00
/**
2015-03-04 21:13:13 +00:00
* @ brief Diagram : : mouseDoubleClickEvent
* This event is managed by diagram event interface if any .
* @ param event :
*/
void Diagram : : mouseDoubleClickEvent ( QGraphicsSceneMouseEvent * event )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > mouseDoubleClickEvent ( event ) ) return ;
2015-03-04 21:13:13 +00:00
QGraphicsScene : : mouseDoubleClickEvent ( event ) ;
}
/**
* @ brief Diagram : : mousePressEvent
* This event is managed by diagram event interface if any .
* @ param event
*/
void Diagram : : mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > mousePressEvent ( event ) ) return ;
2015-03-04 21:13:13 +00:00
QGraphicsScene : : mousePressEvent ( event ) ;
}
/**
* @ brief Diagram : : mouseMoveEvent
* This event is managed by diagram event interface if any .
* @ param event
*/
void Diagram : : mouseMoveEvent ( QGraphicsSceneMouseEvent * event )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > mouseMoveEvent ( event ) ) return ;
2015-03-04 21:13:13 +00:00
QGraphicsScene : : mouseMoveEvent ( event ) ;
}
/**
* @ brief Diagram : : mouseReleaseEvent
* This event is managed by diagram event interface if any .
* @ param event
*/
void Diagram : : mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > mouseReleaseEvent ( event ) ) return ;
2015-03-04 21:13:13 +00:00
QGraphicsScene : : mouseReleaseEvent ( event ) ;
}
/**
* @ brief Diagram : : wheelEvent
* This event is managed by diagram event interface if any .
* @ param event
*/
void Diagram : : wheelEvent ( QGraphicsSceneWheelEvent * event )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > wheelEvent ( event ) ) return ;
QGraphicsScene : : wheelEvent ( event ) ;
2015-03-04 21:13:13 +00:00
}
/**
* @ brief Diagram : : keyPressEvent
* This event is managed by diagram event interface if any .
* Else move selected elements
* @ param e
*/
void Diagram : : keyPressEvent ( QKeyEvent * e )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > keyPressEvent ( e ) ) return ;
2015-03-04 21:13:13 +00:00
2012-04-28 23:22:34 +00:00
bool transmit_event = true ;
2009-04-03 19:30:25 +00:00
if ( ! isReadOnly ( ) ) {
QPointF movement ;
2016-05-13 13:10:32 +00:00
if ( ! this - > selectedContent ( ) . elements . isEmpty ( ) ) {
2009-04-03 19:30:25 +00:00
switch ( e - > key ( ) ) {
case Qt : : Key_Left : movement = QPointF ( - xGrid , 0.0 ) ; break ;
case Qt : : Key_Right : movement = QPointF ( + xGrid , 0.0 ) ; break ;
case Qt : : Key_Up : movement = QPointF ( 0.0 , - yGrid ) ; break ;
case Qt : : Key_Down : movement = QPointF ( 0.0 , + yGrid ) ; break ;
}
if ( ! movement . isNull ( ) & & ! focusItem ( ) ) {
2010-05-08 21:24:43 +00:00
beginMoveElements ( ) ;
continueMoveElements ( movement ) ;
2012-04-16 06:33:26 +00:00
e - > accept ( ) ;
2012-04-28 23:22:34 +00:00
transmit_event = false ;
2009-04-03 19:30:25 +00:00
}
2007-09-15 23:45:27 +00:00
}
2012-04-28 23:22:34 +00:00
if ( transmit_event ) {
2012-04-16 06:33:26 +00:00
QGraphicsScene : : keyPressEvent ( e ) ;
2016-05-13 13:10:32 +00:00
}
2012-04-16 06:33:26 +00:00
}
2007-09-15 23:45:27 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2015-03-04 21:13:13 +00:00
* @ brief Diagram : : keyReleaseEvent
* This event is managed by diagram event interface if any .
* Else move selected element
* @ param e
*/
void Diagram : : keyReleaseEvent ( QKeyEvent * e )
{
2015-11-09 20:20:11 +00:00
if ( m_event_interface & & m_event_interface - > KeyReleaseEvent ( e ) ) return ;
2015-03-04 21:13:13 +00:00
2012-04-28 23:22:34 +00:00
bool transmit_event = true ;
2009-04-03 19:30:25 +00:00
if ( ! isReadOnly ( ) ) {
// detecte le relachement d'une touche de direction ( = deplacement d'elements)
if (
2010-05-08 21:24:43 +00:00
( e - > key ( ) = = Qt : : Key_Left | | e - > key ( ) = = Qt : : Key_Right | |
e - > key ( ) = = Qt : : Key_Up | | e - > key ( ) = = Qt : : Key_Down ) & &
! e - > isAutoRepeat ( )
2009-04-03 19:30:25 +00:00
) {
2010-05-08 21:24:43 +00:00
endMoveElements ( ) ;
2012-04-28 23:22:34 +00:00
e - > accept ( ) ;
transmit_event = false ;
2009-04-03 19:30:25 +00:00
}
2007-09-26 17:14:09 +00:00
}
2012-04-28 23:22:34 +00:00
if ( transmit_event ) {
2012-04-16 06:33:26 +00:00
QGraphicsScene : : keyReleaseEvent ( e ) ;
}
2007-09-15 23:45:27 +00:00
}
2015-03-04 21:13:13 +00:00
/**
* @ brief Diagram : : setEventInterface
* Set event_interface has current interface .
* Diagram become the ownership of event_interface
* If there is a previous interface , they will be delete before
* and call init ( ) to the new interface .
2015-11-09 20:20:11 +00:00
* The derivated class of DiagramEventInterface need to emit the signal " finish " when the job is done ,
* diagram use this signal to delete the interface . If the signal isn ' t send , the interface will never be deleted .
2015-03-04 21:13:13 +00:00
* @ param event_interface
*/
void Diagram : : setEventInterface ( DiagramEventInterface * event_interface )
{
if ( m_event_interface )
{
delete m_event_interface ;
event_interface - > init ( ) ;
}
m_event_interface = event_interface ;
2015-11-09 20:20:11 +00:00
connect ( m_event_interface , & DiagramEventInterface : : finish , this , [ this ] ( ) { delete this - > m_event_interface ; this - > m_event_interface = nullptr ; } , Qt : : QueuedConnection ) ;
2015-03-04 21:13:13 +00:00
}
2014-07-31 10:02:33 +00:00
/**
* @ brief Diagram : : conductorsAutonumName
* @ return the name of autonum to use .
*/
QString Diagram : : conductorsAutonumName ( ) const {
return m_conductors_autonum_name ;
}
/**
* @ brief Diagram : : setConductorsAutonumName
* @ param name , name of autonum to use .
*/
void Diagram : : setConductorsAutonumName ( const QString & name ) {
m_conductors_autonum_name = name ;
}
2006-11-11 18:25:42 +00:00
/**
Exporte le schema vers une image
@ return Une QImage representant le schema
*/
2007-10-05 12:06:39 +00:00
bool Diagram : : toPaintDevice ( QPaintDevice & pix , int width , int height , Qt : : AspectRatioMode aspectRatioMode ) {
2007-02-01 01:07:26 +00:00
// determine la zone source = contenu du schema + marges
QRectF source_area ;
2012-11-09 21:09:24 +00:00
if ( ! use_border_ ) {
2007-02-01 01:07:26 +00:00
source_area = itemsBoundingRect ( ) ;
2007-10-10 22:35:32 +00:00
source_area . translate ( - margin , - margin ) ;
source_area . setWidth ( source_area . width ( ) + 2.0 * margin ) ;
source_area . setHeight ( source_area . height ( ) + 2.0 * margin ) ;
2007-02-01 01:07:26 +00:00
} else {
source_area = QRectF (
0.0 ,
0.0 ,
2015-03-18 18:07:18 +00:00
border_and_titleblock . borderAndTitleBlockRect ( ) . width ( ) + 2.0 * margin ,
border_and_titleblock . borderAndTitleBlockRect ( ) . height ( ) + 2.0 * margin
2007-02-01 01:07:26 +00:00
) ;
}
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 ) ;
// prepare le rendu
2006-10-27 15:47:22 +00:00
QPainter p ;
2007-10-05 12:06:39 +00:00
if ( ! p . begin ( & pix ) ) return ( false ) ;
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-10-05 12:06:39 +00:00
render ( & p , QRect ( QPoint ( 0 , 0 ) , image_size ) , 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 ) ;
2007-10-05 12:06:39 +00:00
return ( true ) ;
2006-10-27 15:47:22 +00:00
}
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 ;
2012-11-09 21:09:24 +00:00
if ( ! use_border_ ) {
2007-02-01 01:07:26 +00:00
QRectF items_rect = itemsBoundingRect ( ) ;
image_width = items_rect . width ( ) ;
image_height = items_rect . height ( ) ;
} else {
2015-03-18 18:07:18 +00:00
image_width = border_and_titleblock . borderAndTitleBlockRect ( ) . width ( ) ;
image_height = border_and_titleblock . borderAndTitleBlockRect ( ) . height ( ) ;
2007-02-01 01:07:26 +00:00
}
2007-01-20 18:11:42 +00:00
2007-10-10 22:35:32 +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
}
2009-04-03 19:30:25 +00:00
/**
@ return true si le schema est considere comme vide , false sinon .
Un schema vide ne contient ni element , ni conducteur , ni champ de texte
*/
bool Diagram : : isEmpty ( ) const {
return ( ! items ( ) . count ( ) ) ;
}
2013-04-19 14:59:20 +00:00
/**
* @ brief Diagram : : potential
* @ return all potential in the diagram
* each potential are in the QList and each conductors of one potential are in the QSet
*/
QList < QSet < Conductor * > > Diagram : : potentials ( ) {
QList < QSet < Conductor * > > potential_List ;
if ( content ( ) . conductors ( ) . size ( ) = = 0 ) return ( potential_List ) ; //return an empty potential
QList < Conductor * > conductors_list = content ( ) . conductors ( ) ;
do {
QSet < Conductor * > one_potential = conductors_list . first ( ) - > relatedPotentialConductors ( ) ;
one_potential < < conductors_list . takeFirst ( ) ;
foreach ( Conductor * c , one_potential ) conductors_list . removeOne ( c ) ;
potential_List < < one_potential ;
} while ( ! conductors_list . empty ( ) ) ;
return ( potential_List ) ;
}
2006-10-27 15:47:22 +00:00
/**
Exporte tout ou partie du schema
2010-04-18 21:00:27 +00:00
@ param whole_content Booleen ( a vrai par defaut ) indiquant si le XML genere doit
representer l ' integralite du schema ou seulement le contenu selectionne
2006-10-27 15:47:22 +00:00
@ return Un Document XML ( QDomDocument )
*/
2010-04-18 21:00:27 +00:00
QDomDocument Diagram : : toXml ( bool whole_content ) {
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
2011-08-29 21:50:43 +00:00
// add the application version number
racine . setAttribute ( " version " , QET : : version ) ;
2006-10-27 15:47:22 +00:00
// proprietes du schema
2010-04-18 21:08:49 +00:00
if ( whole_content ) {
2011-01-09 00:01:38 +00:00
border_and_titleblock . titleBlockToXml ( racine ) ;
border_and_titleblock . borderToXml ( racine ) ;
2007-10-14 21:38:27 +00:00
2014-08-04 14:39:57 +00:00
// Default conductor properties
2007-10-14 21:38:27 +00:00
QDomElement default_conductor = document . createElement ( " defaultconductor " ) ;
2009-04-03 19:30:25 +00:00
defaultConductorProperties . toXml ( default_conductor ) ;
2007-10-14 21:38:27 +00:00
racine . appendChild ( default_conductor ) ;
2014-08-04 14:39:57 +00:00
// Conductor autonum
if ( ! m_conductors_autonum_name . isEmpty ( ) ) {
racine . setAttribute ( " conductorAutonum " , m_conductors_autonum_name ) ;
}
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 ) ;
2007-10-27 13:18:17 +00:00
// creation de trois listes : une qui contient les elements, une qui contient les conducteurs, une qui contient les champs de texte
QList < Element * > list_elements ;
QList < Conductor * > list_conductors ;
QList < DiagramTextItem * > list_texts ;
2013-08-24 15:18:45 +00:00
QList < DiagramImageItem * > list_images ;
2014-02-28 14:30:59 +00:00
QList < QetShapeItem * > list_shapes ;
2006-10-27 15:47:22 +00:00
2014-02-28 14:30:59 +00:00
QList < QGraphicsItem * > list_items = items ( ) ;
;
2009-04-11 13:09:47 +00:00
// Determine les elements a "XMLiser"
2014-02-28 14:30:59 +00:00
foreach ( QGraphicsItem * qgi , list_items ) {
2006-10-27 15:47:22 +00:00
if ( Element * elmt = qgraphicsitem_cast < Element * > ( qgi ) ) {
2010-04-18 21:08:49 +00:00
if ( whole_content ) list_elements < < elmt ;
2007-10-27 13:18:17 +00:00
else if ( elmt - > isSelected ( ) ) list_elements < < elmt ;
2007-10-03 17:02:39 +00:00
} else if ( Conductor * f = qgraphicsitem_cast < Conductor * > ( qgi ) ) {
2010-04-18 21:08:49 +00:00
if ( whole_content ) list_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
2010-04-18 17:59:54 +00:00
// et pour l'instant, les conducteurs non selectionnes sont les conducteurs dont un des elements n'est pas selectionne
else if ( f - > terminal1 - > parentItem ( ) - > isSelected ( ) & & f - > terminal2 - > parentItem ( ) - > isSelected ( ) ) {
list_conductors < < f ;
2007-10-27 13:18:17 +00:00
}
2010-04-18 17:59:54 +00:00
} else if ( IndependentTextItem * iti = qgraphicsitem_cast < IndependentTextItem * > ( qgi ) ) {
2010-04-18 21:08:49 +00:00
if ( whole_content ) list_texts < < iti ;
2010-04-18 17:59:54 +00:00
else if ( iti - > isSelected ( ) ) list_texts < < iti ;
2013-08-24 15:18:45 +00:00
} else if ( DiagramImageItem * dii = qgraphicsitem_cast < DiagramImageItem * > ( qgi ) ) {
if ( whole_content ) list_images < < dii ;
else if ( dii - > isSelected ( ) ) list_images < < dii ;
2014-03-02 13:49:11 +00:00
} else if ( QetShapeItem * dsi = qgraphicsitem_cast < QetShapeItem * > ( qgi ) ) {
2014-02-28 14:30:59 +00:00
if ( whole_content ) list_shapes < < dsi ;
else if ( dsi - > isSelected ( ) ) list_shapes < < dsi ;
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
2007-10-27 13:18:17 +00:00
if ( ! list_elements . isEmpty ( ) ) {
QDomElement elements = document . createElement ( " elements " ) ;
foreach ( Element * elmt , list_elements ) {
elements . appendChild ( elmt - > toXml ( document , table_adr_id ) ) ;
}
racine . appendChild ( elements ) ;
2006-10-27 15:47:22 +00:00
}
// enregistrement des conducteurs
2007-10-27 13:18:17 +00:00
if ( ! list_conductors . isEmpty ( ) ) {
QDomElement conductors = document . createElement ( " conductors " ) ;
foreach ( Conductor * cond , list_conductors ) {
conductors . appendChild ( cond - > toXml ( document , table_adr_id ) ) ;
}
racine . appendChild ( conductors ) ;
}
// enregistrement des champs de texte
if ( ! list_texts . isEmpty ( ) ) {
QDomElement inputs = document . createElement ( " inputs " ) ;
foreach ( DiagramTextItem * dti , list_texts ) {
inputs . appendChild ( dti - > toXml ( document ) ) ;
}
racine . appendChild ( inputs ) ;
2006-10-27 15:47:22 +00:00
}
2013-08-24 15:18:45 +00:00
// save of images
if ( ! list_images . isEmpty ( ) ) {
QDomElement images = document . createElement ( " images " ) ;
foreach ( DiagramImageItem * dii , list_images ) {
images . appendChild ( dii - > toXml ( document ) ) ;
}
racine . appendChild ( images ) ;
}
2014-02-28 14:30:59 +00:00
// save of basic shapes
if ( ! list_shapes . isEmpty ( ) ) {
QDomElement shapes = document . createElement ( " shapes " ) ;
foreach ( QetShapeItem * dii , list_shapes ) {
shapes . appendChild ( dii - > toXml ( document ) ) ;
}
racine . appendChild ( shapes ) ;
}
2006-10-27 15:47:22 +00:00
// on retourne le document XML ainsi genere
return ( document ) ;
}
/**
2009-04-03 19:30:25 +00:00
Importe le schema 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
2009-04-03 19:30:25 +00:00
@ param position La position du schema importe
2007-09-26 12:36:31 +00:00
@ param consider_informations Si vrai , les informations complementaires
( auteur , titre , . . . ) seront prises en compte
2009-04-28 18:04:29 +00:00
@ param content_ptr si ce pointeur vers un DiagramContent est different de 0 ,
il sera rempli avec le contenu ajoute au schema par le fromXml
2006-10-27 15:47:22 +00:00
@ return true si l ' import a reussi , false sinon
*/
2007-11-09 13:06:51 +00:00
bool Diagram : : fromXml ( QDomDocument & document , QPointF position , bool consider_informations , DiagramContent * content_ptr ) {
2007-10-27 13:18:17 +00:00
QDomElement root = document . documentElement ( ) ;
2009-04-03 19:30:25 +00:00
return ( fromXml ( root , position , consider_informations , content_ptr ) ) ;
}
2009-04-28 18:04:29 +00:00
/**
Importe le schema decrit dans un element XML . Cette methode delegue son travail a Diagram : : fromXml
Si l ' import reussit , cette methode initialise egalement le document XML
interne permettant de bien gerer l ' enregistrement de ce schema dans le
projet auquel il appartient .
@ see Diagram : : fromXml
@ param document Le document XML a analyser
@ param position La position du schema importe
@ param consider_informations Si vrai , les informations complementaires
( auteur , titre , . . . ) seront prises en compte
@ param content_ptr si ce pointeur vers un DiagramContent est different de 0 ,
il sera rempli avec le contenu ajoute au schema par le fromXml
@ return true si l ' import a reussi , false sinon
*/
bool Diagram : : initFromXml ( QDomElement & document , QPointF position , bool consider_informations , DiagramContent * content_ptr ) {
// import le contenu et les proprietes du schema depuis l'element XML fourni en parametre
bool from_xml = fromXml ( document , position , consider_informations , content_ptr ) ;
// initialise le document XML interne a partir de l'element XML fourni en parametre
if ( from_xml ) {
2012-11-09 21:09:24 +00:00
xml_document_ . clear ( ) ;
xml_document_ . appendChild ( xml_document_ . importNode ( document , true ) ) ;
2009-04-28 18:04:29 +00:00
// a ce stade, le document XML interne contient le code XML qui a ete importe, et non pas une version re-exporte par la methode toXml()
}
return ( from_xml ) ;
}
2009-04-03 19:30:25 +00:00
/**
Importe le schema decrit dans un element XML . Si une position est
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 .
@ param document Le document XML a analyser
@ param position La position du schema importe
@ param consider_informations Si vrai , les informations complementaires
( auteur , titre , . . . ) seront prises en compte
2009-04-28 18:04:29 +00:00
@ param content_ptr si ce pointeur vers un DiagramContent est different de 0 ,
il sera rempli avec le contenu ajoute au schema par le fromXml
2009-04-03 19:30:25 +00:00
@ return true si l ' import a reussi , false sinon
*/
bool Diagram : : fromXml ( QDomElement & document , QPointF position , bool consider_informations , DiagramContent * content_ptr ) {
QDomElement root = document ;
2014-08-04 14:39:57 +00:00
// The first element must be a diagram
2007-10-27 13:18:17 +00:00
if ( root . tagName ( ) ! = " diagram " ) return ( false ) ;
2007-01-29 00:41:12 +00:00
2014-08-04 14:39:57 +00:00
// Read attributes of this diagram
2007-01-28 00:53:17 +00:00
if ( consider_informations ) {
2014-08-04 14:39:57 +00:00
// Version of diagram
2011-08-29 21:50:43 +00:00
bool conv_ok ;
qreal version_value = root . attribute ( " version " ) . toDouble ( & conv_ok ) ;
if ( conv_ok ) {
diagram_qet_version_ = version_value ;
}
2014-08-04 14:39:57 +00:00
// Load border and titleblock
2011-01-09 00:01:38 +00:00
border_and_titleblock . titleBlockFromXml ( root ) ;
border_and_titleblock . borderFromXml ( root ) ;
2007-11-14 20:27:45 +00:00
2014-08-04 14:39:57 +00:00
// Find the element "defaultconductor".
// If found, load default conductor properties.
2011-01-09 00:01:38 +00:00
QDomElement default_conductor_elmt = root . firstChildElement ( " defaultconductor " ) ;
if ( ! default_conductor_elmt . isNull ( ) ) {
defaultConductorProperties . fromXml ( default_conductor_elmt ) ;
2007-10-14 21:38:27 +00:00
}
2014-08-04 14:39:57 +00:00
// Load the autonum
m_conductors_autonum_name = root . attribute ( " conductorAutonum " ) ;
2007-01-28 00:53:17 +00:00
}
2006-10-27 15:47:22 +00:00
2014-08-04 14:39:57 +00:00
// if child haven't got a child, loading is finish (diagram is empty)
2009-04-03 19:30:25 +00:00
if ( root . firstChild ( ) . isNull ( ) ) {
write ( document ) ;
return ( true ) ;
}
2007-10-27 13:18:17 +00:00
2011-08-29 21:50:43 +00:00
// Backward compatibility: prior to version 0.3, we need to compensate, at
// diagram-opening time, the rotation of the element for each of its
// textfields having the "FollowParentRotation" option disabled.
// After 0.3, elements textfields get userx, usery and userrotation attributes
// that explicitly specify their position and orientation.
qreal project_qet_version = declaredQElectroTechVersion ( true ) ;
bool handle_inputs_rotation = (
project_qet_version ! = - 1 & & project_qet_version < 0.3 & &
2016-03-15 18:42:18 +00:00
m_project - > state ( ) = = QETProject : : ProjectParsingRunning
2011-08-29 21:50:43 +00:00
) ;
2015-05-18 22:19:14 +00:00
//Load all elements from the XML
2007-10-27 13:18:17 +00:00
QList < Element * > added_elements ;
QHash < int , Terminal * > table_adr_id ;
2015-05-18 22:19:14 +00:00
foreach ( QDomElement element_xml , QET : : findInDomElement ( root , " elements " , " element " ) )
{
2010-04-18 17:59:54 +00:00
if ( ! Element : : valideXml ( element_xml ) ) continue ;
2007-10-27 13:18:17 +00:00
2007-12-05 21:16:01 +00:00
// cree un element dont le type correspond a l'id type
2010-04-18 17:59:54 +00:00
QString type_id = element_xml . attribute ( " type " ) ;
2016-03-15 18:42:18 +00:00
ElementsLocation element_location ;
if ( type_id . startsWith ( " embed:// " ) ) {
element_location = ElementsLocation ( type_id , m_project ) ;
}
else {
element_location = ElementsLocation ( type_id ) ;
}
2009-04-03 19:30:25 +00:00
2013-12-20 20:30:55 +00:00
int state = 0 ;
2014-12-14 13:06:21 +00:00
Element * nvel_elmt = ElementFactory : : Instance ( ) - > createElement ( element_location , 0 , & state ) ;
2015-05-18 22:19:14 +00:00
if ( state )
{
2013-12-20 20:30:55 +00:00
QString debug_message = QString ( " Diagram::fromXml() : Le chargement de la description de l'element %1 a echoue avec le code d'erreur %2 " ) . arg ( element_location . path ( ) ) . arg ( state ) ;
2009-04-13 01:35:01 +00:00
qDebug ( ) < < qPrintable ( debug_message ) ;
2007-10-27 13:18:17 +00:00
delete nvel_elmt ;
2009-04-03 19:30:25 +00:00
2009-04-13 01:35:01 +00:00
qDebug ( ) < < " Diagram::fromXml() : Utilisation d'un GhostElement en lieu et place de cet element. " ;
2009-04-03 19:30:25 +00:00
nvel_elmt = new GhostElement ( element_location ) ;
2007-10-27 13:18:17 +00:00
}
// charge les caracteristiques de l'element
2010-07-18 19:16:52 +00:00
if ( nvel_elmt - > fromXml ( element_xml , table_adr_id , handle_inputs_rotation ) ) {
2007-10-27 13:18:17 +00:00
// ajout de l'element au schema et a la liste des elements ajoutes
2014-10-10 08:58:44 +00:00
addItem ( nvel_elmt ) ;
2007-10-27 13:18:17 +00:00
added_elements < < nvel_elmt ;
} else {
delete nvel_elmt ;
2009-04-13 01:35:01 +00:00
qDebug ( ) < < " Diagram::fromXml() : Le chargement des parametres d'un element a echoue " ;
2006-10-27 15:47:22 +00:00
}
}
2014-11-14 19:58:25 +00:00
// Load text
2010-04-18 17:59:54 +00:00
QList < IndependentTextItem * > added_texts ;
foreach ( QDomElement text_xml , QET : : findInDomElement ( root , " inputs " , " input " ) ) {
2014-12-14 13:06:21 +00:00
IndependentTextItem * iti = new IndependentTextItem ( ) ;
2010-04-18 17:59:54 +00:00
iti - > fromXml ( text_xml ) ;
2014-10-10 08:58:44 +00:00
addItem ( iti ) ;
2010-04-18 17:59:54 +00:00
added_texts < < iti ;
2007-10-27 13:18:17 +00:00
}
2013-08-24 15:18:45 +00:00
2014-11-14 19:58:25 +00:00
// Load image
2013-08-24 15:18:45 +00:00
QList < DiagramImageItem * > added_images ;
foreach ( QDomElement image_xml , QET : : findInDomElement ( root , " images " , " image " ) ) {
2013-11-14 10:11:22 +00:00
DiagramImageItem * dii = new DiagramImageItem ( ) ;
2013-08-24 15:18:45 +00:00
dii - > fromXml ( image_xml ) ;
addItem ( dii ) ;
added_images < < dii ;
}
2014-02-28 14:30:59 +00:00
2014-11-14 19:58:25 +00:00
// Load shape
2014-02-28 14:30:59 +00:00
QList < QetShapeItem * > added_shapes ;
foreach ( QDomElement shape_xml , QET : : findInDomElement ( root , " shapes " , " shape " ) ) {
QetShapeItem * dii = new QetShapeItem ( QPointF ( 0 , 0 ) ) ;
dii - > fromXml ( shape_xml ) ;
addItem ( dii ) ;
added_shapes < < dii ;
}
2014-11-14 19:58:25 +00:00
2014-12-23 19:00:37 +00:00
// Load conductor
2007-10-27 13:18:17 +00:00
QList < Conductor * > added_conductors ;
2014-12-23 19:00:37 +00:00
foreach ( QDomElement f , QET : : findInDomElement ( root , " conductors " , " conductor " ) )
{
2007-10-27 13:18:17 +00:00
if ( ! Conductor : : valideXml ( f ) ) continue ;
2014-12-23 19:00:37 +00:00
//Check if terminal that conductor must be linked is know
2007-10-27 13:18:17 +00:00
int id_p1 = f . attribute ( " terminal1 " ) . toInt ( ) ;
int id_p2 = f . attribute ( " terminal2 " ) . toInt ( ) ;
2014-12-23 19:00:37 +00:00
if ( table_adr_id . contains ( id_p1 ) & & table_adr_id . contains ( id_p2 ) )
{
2007-10-27 13:18:17 +00:00
Terminal * p1 = table_adr_id . value ( id_p1 ) ;
Terminal * p2 = table_adr_id . value ( id_p2 ) ;
2014-12-23 19:00:37 +00:00
if ( p1 ! = p2 )
{
2015-05-18 22:19:14 +00:00
Conductor * c = new Conductor ( p1 , p2 ) ;
if ( c - > isValid ( ) )
{
addItem ( c ) ;
c - > fromXml ( f ) ;
added_conductors < < c ;
}
else
delete c ;
2007-10-27 13:18:17 +00:00
}
2014-12-23 19:00:37 +00:00
}
else qDebug ( ) < < " Diagram::fromXml() : Le chargement du conducteur " < < id_p1 < < id_p2 < < " a echoue " ;
2006-10-27 15:47:22 +00:00
}
2014-11-14 19:58:25 +00:00
//Translate items if a new position was given in parameter
if ( position ! = QPointF ( ) ) {
QList < QGraphicsItem * > added_items ;
foreach ( Element * added_element , added_elements ) added_items < < added_element ;
foreach ( Conductor * added_cond , added_conductors ) added_items < < added_cond ;
foreach ( QetShapeItem * added_shape , added_shapes ) added_items < < added_shape ;
foreach ( DiagramTextItem * added_text , added_texts ) added_items < < added_text ;
foreach ( DiagramImageItem * added_image , added_images ) added_items < < added_image ;
//Get the top left corner of the rectangle that contain all added items
QRectF items_rect ;
foreach ( QGraphicsItem * item , added_items ) {
items_rect = items_rect . united ( item - > mapToScene ( item - > boundingRect ( ) ) . boundingRect ( ) ) ;
}
QPointF point_ = items_rect . topLeft ( ) ;
QPointF pos_ = Diagram : : snapToGrid ( QPointF ( position . x ( ) - point_ . x ( ) ,
position . y ( ) - point_ . y ( ) ) ) ;
//Translate all added items
foreach ( QGraphicsItem * qgi , added_items )
qgi - > setPos ( qgi - > pos ( ) + = pos_ ) ;
}
2007-10-27 13:18:17 +00:00
// remplissage des listes facultatives
2009-04-28 18:04:29 +00:00
if ( content_ptr ) {
2010-05-08 21:24:43 +00:00
content_ptr - > elements = added_elements . toSet ( ) ;
content_ptr - > conductorsToMove = added_conductors . toSet ( ) ;
content_ptr - > textFields = added_texts . toSet ( ) ;
2013-08-24 15:18:45 +00:00
content_ptr - > images = added_images . toSet ( ) ;
2014-02-28 14:30:59 +00:00
content_ptr - > shapes = added_shapes . toSet ( ) ;
2007-11-09 13:06:51 +00:00
}
2015-03-30 15:58:16 +00:00
adjustSceneRect ( ) ;
2006-10-27 15:47:22 +00:00
return ( true ) ;
}
2009-04-03 19:30:25 +00:00
/**
Enregistre le schema XML dans son document XML interne et emet le signal
written ( ) .
*/
2015-08-03 05:43:44 +00:00
void Diagram : : write ( )
{
qDebug ( ) < < qPrintable ( QString ( " Diagram::write() : saving changes from diagram \" %1 \" " ) . arg ( title ( ) ) ) < < " [ " < < this < < " ] " ;
2009-04-03 19:30:25 +00:00
write ( toXml ( ) . documentElement ( ) ) ;
}
/**
Enregistre un element XML dans son document XML interne et emet le signal
written ( ) .
@ param element xml a enregistrer
*/
void Diagram : : write ( const QDomElement & element ) {
2012-11-09 21:09:24 +00:00
xml_document_ . clear ( ) ;
xml_document_ . appendChild ( xml_document_ . importNode ( element , true ) ) ;
2009-04-03 19:30:25 +00:00
emit ( written ( ) ) ;
}
/**
@ return true si la fonction write a deja ete appele ( pour etre plus exact :
si le document XML utilise en interne n ' est pas vide ) , false sinon
*/
bool Diagram : : wasWritten ( ) const {
2012-11-09 21:09:24 +00:00
return ( ! xml_document_ . isNull ( ) ) ;
2009-04-03 19:30:25 +00:00
}
/**
@ return le schema en XML tel qu ' il doit etre enregistre dans le fichier projet
@ param xml_doc document XML a utiliser pour creer l ' element
*/
QDomElement Diagram : : writeXml ( QDomDocument & xml_doc ) const {
// si le schema n'a pas ete enregistre explicitement, on n'ecrit rien
if ( ! wasWritten ( ) ) return ( QDomElement ( ) ) ;
2012-11-09 21:09:24 +00:00
QDomElement diagram_elmt = xml_document_ . documentElement ( ) ;
2009-04-03 19:30:25 +00:00
QDomNode new_node = xml_doc . importNode ( diagram_elmt , true ) ;
return ( new_node . toElement ( ) ) ;
}
2013-12-31 14:39:34 +00:00
void Diagram : : initElementsLinks ( ) {
foreach ( Element * elmt , elements ( ) )
elmt - > initLink ( project ( ) ) ;
}
2009-04-04 21:47:07 +00:00
/**
2014-10-10 08:58:44 +00:00
* @ brief Diagram : : addItem
2015-07-12 15:05:59 +00:00
* Réimplemented from QGraphicsScene : : addItem ( QGraphicsItem * item )
* Do some specific operation if item need it ( for exemple an element )
2014-10-10 08:58:44 +00:00
* @ param item
*/
2015-07-12 15:05:59 +00:00
void Diagram : : addItem ( QGraphicsItem * item )
{
if ( ! item | | isReadOnly ( ) | | item - > scene ( ) = = this ) return ;
QGraphicsScene : : addItem ( item ) ;
2014-10-10 08:58:44 +00:00
2015-07-12 15:05:59 +00:00
switch ( item - > type ( ) )
{
case Element : : Type :
{
const Element * elmt = static_cast < const Element * > ( item ) ;
foreach ( ElementTextItem * eti , elmt - > texts ( ) )
connect ( eti , & ElementTextItem : : diagramTextChanged , this , & Diagram : : diagramTextChanged ) ;
}
break ;
2014-10-10 08:58:44 +00:00
2015-07-12 15:05:59 +00:00
case Conductor : : Type :
{
Conductor * conductor = static_cast < Conductor * > ( item ) ;
conductor - > terminal1 - > addConductor ( conductor ) ;
conductor - > terminal2 - > addConductor ( conductor ) ;
conductor - > calculateTextItemPosition ( ) ;
}
break ;
2014-10-10 08:58:44 +00:00
2015-07-12 15:05:59 +00:00
case IndependentTextItem : : Type :
{
const IndependentTextItem * text = static_cast < const IndependentTextItem * > ( item ) ;
connect ( text , & IndependentTextItem : : diagramTextChanged , this , & Diagram : : diagramTextChanged ) ;
}
2009-04-04 21:47:07 +00:00
}
}
/**
2014-10-10 08:58:44 +00:00
* @ brief Diagram : : removeItem
2015-07-12 15:05:59 +00:00
* Réimplemented from QGraphicsScene : : removeItem ( QGraphicsItem * item )
* Do some specific operation if item need it ( for exemple an element )
* @ param item
2014-10-10 08:58:44 +00:00
*/
2015-07-12 15:05:59 +00:00
void Diagram : : removeItem ( QGraphicsItem * item )
{
if ( ! item | | isReadOnly ( ) ) return ;
2014-10-10 08:58:44 +00:00
2015-07-12 15:05:59 +00:00
switch ( item - > type ( ) )
{
case Element : : Type :
{
Element * elmt = static_cast < Element * > ( item ) ;
elmt - > unlinkAllElements ( ) ;
foreach ( ElementTextItem * text , elmt - > texts ( ) )
disconnect ( text , & ElementTextItem : : diagramTextChanged , this , & Diagram : : diagramTextChanged ) ;
}
break ;
2009-04-04 21:47:07 +00:00
2015-07-12 15:05:59 +00:00
case Conductor : : Type :
{
Conductor * conductor = static_cast < Conductor * > ( item ) ;
conductor - > terminal1 - > removeConductor ( conductor ) ;
conductor - > terminal2 - > removeConductor ( conductor ) ;
}
break ;
2014-10-10 08:58:44 +00:00
2015-07-12 15:05:59 +00:00
case IndependentTextItem : : Type :
{
const IndependentTextItem * text = static_cast < const IndependentTextItem * > ( item ) ;
disconnect ( text , & IndependentTextItem : : diagramTextChanged , this , & Diagram : : diagramTextChanged ) ;
}
}
2009-04-04 21:47:07 +00:00
2014-10-10 08:58:44 +00:00
QGraphicsScene : : removeItem ( item ) ;
}
2012-02-06 21:21:43 +00:00
void Diagram : : titleChanged ( const QString & title ) {
emit ( diagramTitleChanged ( this , title ) ) ;
}
2008-07-09 21:14:30 +00:00
/**
Gere le fait qu ' un texte du schema ait ete modifie
@ param text_item Texte modifie
@ param old_text Ancien texte
@ param new_text Nouveau texte
*/
void Diagram : : diagramTextChanged ( DiagramTextItem * text_item , const QString & old_text , const QString & new_text ) {
if ( ! text_item ) return ;
2014-01-05 15:00:46 +00:00
undoStack ( ) . push ( new ChangeDiagramTextCommand ( text_item , old_text , new_text ) ) ;
2008-07-09 21:14:30 +00:00
}
2010-12-24 21:00:11 +00:00
/**
This slot may be used to inform the diagram object that the given title
block template has changed . The diagram will thus flush its title
block - dedicated rendering cache .
@ param template_name Name of the title block template that has changed
*/
void Diagram : : titleBlockTemplateChanged ( const QString & template_name ) {
2010-12-24 23:35:40 +00:00
if ( border_and_titleblock . titleBlockTemplateName ( ) ! = template_name ) return ;
border_and_titleblock . titleBlockTemplateChanged ( template_name ) ;
2010-12-24 21:00:11 +00:00
update ( ) ;
}
/**
This slot has to be be used to inform this class that the given title block
template is about to be removed and is no longer accessible . This class
will either use the provided optional TitleBlockTemplate or the default
title block provided by QETApp : : defaultTitleBlockTemplate ( )
@ param template_name Name of the title block template that has changed
@ param new_template ( Optional ) Name of the title block template to use instead
*/
2015-11-16 08:59:43 +00:00
void Diagram : : titleBlockTemplateRemoved ( const QString & template_name , const QString & new_template )
{
if ( border_and_titleblock . titleBlockTemplateName ( ) ! = template_name ) return ;
2016-03-15 18:42:18 +00:00
const TitleBlockTemplate * final_template = m_project - > embeddedTitleBlockTemplatesCollection ( ) - > getTemplate ( new_template ) ;
2010-12-24 23:35:40 +00:00
border_and_titleblock . titleBlockTemplateRemoved ( template_name , final_template ) ;
update ( ) ;
}
/**
Set the template to use to render the title block of this diagram .
@ param template_name Name of the title block template .
*/
2015-11-16 08:59:43 +00:00
void Diagram : : setTitleBlockTemplate ( const QString & template_name )
{
2016-03-15 18:42:18 +00:00
if ( ! m_project ) return ;
2010-12-24 23:35:40 +00:00
QString current_name = border_and_titleblock . titleBlockTemplateName ( ) ;
2016-03-15 18:42:18 +00:00
const TitleBlockTemplate * titleblock_template = m_project - > embeddedTitleBlockTemplatesCollection ( ) - > getTemplate ( template_name ) ;
2010-12-24 23:35:40 +00:00
border_and_titleblock . titleBlockTemplateRemoved ( current_name , titleblock_template ) ;
2012-01-23 20:36:51 +00:00
2015-11-16 08:59:43 +00:00
if ( template_name ! = current_name )
2012-01-23 20:36:51 +00:00
emit ( usedTitleBlockTemplateChanged ( template_name ) ) ;
2010-12-24 21:00:11 +00:00
}
2007-02-25 17:53:16 +00:00
/**
2009-04-18 15:30:44 +00:00
Selectionne tous les objets du schema
2007-02-25 17:53:16 +00:00
*/
2009-04-18 15:30:44 +00:00
void Diagram : : selectAll ( ) {
if ( items ( ) . isEmpty ( ) ) return ;
blockSignals ( true ) ;
foreach ( QGraphicsItem * qgi , items ( ) ) qgi - > setSelected ( true ) ;
blockSignals ( false ) ;
emit ( selectionChanged ( ) ) ;
}
/**
Deslectionne tous les objets selectionnes
*/
void Diagram : : deselectAll ( ) {
if ( items ( ) . isEmpty ( ) ) return ;
clearSelection ( ) ;
}
/**
Inverse l ' etat de selection de tous les objets du schema
*/
void Diagram : : invertSelection ( ) {
if ( items ( ) . isEmpty ( ) ) return ;
blockSignals ( true ) ;
foreach ( QGraphicsItem * item , items ( ) ) item - > setSelected ( ! item - > isSelected ( ) ) ;
blockSignals ( false ) ;
emit ( selectionChanged ( ) ) ;
2007-02-25 17:53:16 +00:00
}
2009-04-03 19:30:25 +00:00
/**
@ return le titre du cartouche
*/
QString Diagram : : title ( ) const {
2010-12-20 02:45:36 +00:00
return ( border_and_titleblock . title ( ) ) ;
2009-04-03 19:30:25 +00:00
}
/**
@ return la liste des elements de ce schema
*/
QList < CustomElement * > Diagram : : customElements ( ) const {
QList < CustomElement * > elements_list ;
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( CustomElement * elmt = qgraphicsitem_cast < CustomElement * > ( qgi ) ) {
elements_list < < elmt ;
}
}
return ( elements_list ) ;
}
2013-12-29 13:39:48 +00:00
QList < Element * > Diagram : : elements ( ) const {
QList < Element * > element_list ;
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( Element * elmt = qgraphicsitem_cast < Element * > ( qgi ) )
element_list < < elmt ;
}
return ( element_list ) ;
}
2009-04-13 01:35:01 +00:00
/**
2010-05-08 21:24:43 +00:00
Initialise un deplacement d ' elements , conducteurs et champs de texte sur le
schema .
@ param driver_item Item deplace par la souris et ne necessitant donc pas
d ' etre deplace lors des appels a continueMovement .
@ see ElementsMover
2009-04-13 01:35:01 +00:00
*/
2010-05-08 21:24:43 +00:00
int Diagram : : beginMoveElements ( QGraphicsItem * driver_item ) {
return ( elements_mover_ - > beginMovement ( this , driver_item ) ) ;
2007-09-15 22:14:23 +00:00
}
2009-04-13 01:35:01 +00:00
/**
2010-05-08 21:24:43 +00:00
Prend en compte un mouvement composant un deplacement d ' elements ,
conducteurs et champs de texte
@ param movement mouvement a ajouter au deplacement en cours
@ see ElementsMover
2009-04-13 01:35:01 +00:00
*/
2010-05-08 21:24:43 +00:00
void Diagram : : continueMoveElements ( const QPointF & movement ) {
elements_mover_ - > continueMovement ( movement ) ;
2007-09-15 22:14:23 +00:00
}
2007-09-30 12:35:25 +00:00
2007-10-27 13:18:17 +00:00
/**
2010-05-08 21:24:43 +00:00
Finalise un deplacement d ' elements , conducteurs et champs de texte
@ see ElementsMover
2007-10-27 13:18:17 +00:00
*/
2010-05-08 21:24:43 +00:00
void Diagram : : endMoveElements ( ) {
elements_mover_ - > endMovement ( ) ;
2007-10-27 13:18:17 +00:00
}
2014-10-25 21:21:52 +00:00
/**
Initialise un deplacement d ' ElementTextItems
@ param driver_item Item deplace par la souris et ne necessitant donc pas
d ' etre deplace lors des appels a continueMovement .
@ see ElementTextsMover
*/
int Diagram : : beginMoveElementTexts ( QGraphicsItem * driver_item ) {
return ( element_texts_mover_ - > beginMovement ( this , driver_item ) ) ;
}
/**
Prend en compte un mouvement composant un deplacement d ' ElementTextItems
@ param movement mouvement a ajouter au deplacement en cours
@ see ElementTextsMover
*/
void Diagram : : continueMoveElementTexts ( const QPointF & movement ) {
element_texts_mover_ - > continueMovement ( movement ) ;
}
/**
Finalise un deplacement d ' ElementTextItems
@ see ElementTextsMover
*/
void Diagram : : endMoveElementTexts ( ) {
element_texts_mover_ - > endMovement ( ) ;
}
2009-04-03 19:30:25 +00:00
/**
Permet de savoir si un element est utilise sur un schema
@ param location Emplacement d ' un element
@ return true si l ' element location est utilise sur ce schema , false sinon
*/
bool Diagram : : usesElement ( const ElementsLocation & location ) {
foreach ( CustomElement * element , customElements ( ) ) {
if ( element - > location ( ) = = location ) {
return ( true ) ;
}
}
return ( false ) ;
}
2012-01-23 20:36:51 +00:00
/**
@ param a title block template name
@ return true if the provided template is used by this diagram , false
otherwise .
*/
bool Diagram : : usesTitleBlockTemplate ( const QString & name ) {
return ( name = = border_and_titleblock . titleBlockTemplateName ( ) ) ;
}
2015-03-30 15:58:16 +00:00
/**
* @ brief Diagram : : adjustSceneRect
* Recalcul and adjust the size of the scene
*/
void Diagram : : adjustSceneRect ( )
{
QRectF old_rect = sceneRect ( ) ;
setSceneRect ( border_and_titleblock . borderAndTitleBlockRect ( ) . united ( itemsBoundingRect ( ) ) ) ;
update ( old_rect . united ( sceneRect ( ) ) ) ;
}
2009-11-22 16:12:22 +00:00
/**
Cette methode permet d ' appliquer de nouvelles options de rendu tout en
accedant aux proprietes de rendu en cours .
@ param new_properties Nouvelles options de rendu a appliquer
@ return les options de rendu avant l ' application de new_properties
*/
ExportProperties Diagram : : applyProperties ( const ExportProperties & new_properties ) {
// exporte les options de rendu en cours
ExportProperties old_properties ;
old_properties . draw_grid = displayGrid ( ) ;
2010-12-20 02:45:36 +00:00
old_properties . draw_border = border_and_titleblock . borderIsDisplayed ( ) ;
2011-01-09 00:01:38 +00:00
old_properties . draw_titleblock = border_and_titleblock . titleBlockIsDisplayed ( ) ;
2009-11-22 16:12:22 +00:00
old_properties . draw_terminals = drawTerminals ( ) ;
old_properties . draw_colored_conductors = drawColoredConductors ( ) ;
old_properties . exported_area = useBorder ( ) ? QET : : BorderArea : QET : : ElementsArea ;
// applique les nouvelles options de rendu
setUseBorder ( new_properties . exported_area = = QET : : BorderArea ) ;
setDrawTerminals ( new_properties . draw_terminals ) ;
setDrawColoredConductors ( new_properties . draw_colored_conductors ) ;
setDisplayGrid ( new_properties . draw_grid ) ;
2010-12-20 02:45:36 +00:00
border_and_titleblock . displayBorder ( new_properties . draw_border ) ;
border_and_titleblock . displayTitleBlock ( new_properties . draw_titleblock ) ;
2009-11-22 16:12:22 +00:00
// retourne les anciennes options de rendu
return ( old_properties ) ;
}
2009-05-20 21:29:17 +00:00
/**
@ param pos Position cartesienne ( ex : 10.3 , 45.2 ) a transformer en position
dans la grille ( ex : B2 )
@ return la position dans la grille correspondant a pos
*/
DiagramPosition Diagram : : convertPosition ( const QPointF & pos ) {
2010-12-20 02:45:36 +00:00
// delegue le calcul au BorderTitleBlock
2015-03-18 18:07:18 +00:00
DiagramPosition diagram_position = border_and_titleblock . convertPosition ( pos ) ;
2009-05-20 21:29:17 +00:00
// embarque la position cartesienne
diagram_position . setPosition ( pos ) ;
return ( diagram_position ) ;
}
2014-06-14 16:04:34 +00:00
/**
* @ brief Diagram : : snapToGrid
* Return a nearest snap point of p
* @ param p point to find the nearest snaped point
* @ return
*/
2015-02-12 21:37:56 +00:00
QPointF Diagram : : snapToGrid ( const QPointF & p )
{
//Return a point rounded to the nearest pixel
if ( QApplication : : keyboardModifiers ( ) . testFlag ( Qt : : ControlModifier ) )
{
int p_x = qRound ( p . x ( ) ) ;
int p_y = qRound ( p . y ( ) ) ;
return ( QPointF ( p_x , p_y ) ) ;
2015-02-12 12:43:13 +00:00
}
2015-02-12 21:37:56 +00:00
//Return a point snapped to the grid
int p_x = qRound ( p . x ( ) / Diagram : : xGrid ) * Diagram : : xGrid ;
int p_y = qRound ( p . y ( ) / Diagram : : yGrid ) * Diagram : : yGrid ;
2014-06-14 16:04:34 +00:00
return ( QPointF ( p_x , p_y ) ) ;
}
2015-02-12 12:43:13 +00:00
2007-10-10 17:50:26 +00:00
/**
Definit s ' il faut afficher ou non les bornes
@ param dt true pour afficher les bornes , false sinon
*/
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
2009-11-22 16:12:22 +00:00
/**
Definit s ' il faut respecter ou non les couleurs des conducteurs .
Si non , les conducteurs sont tous dessines en noir .
@ param dcc true pour respecter les couleurs , false sinon
*/
void Diagram : : setDrawColoredConductors ( bool dcc ) {
draw_colored_conductors_ = dcc ;
}
2007-10-10 17:50:26 +00:00
/**
@ return la liste des conducteurs selectionnes sur le schema
*/
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
}
2007-11-03 20:20:34 +00:00
2010-02-11 23:35:04 +00:00
/**
@ return la liste de tous les textes selectionnes : les textes independants ,
mais aussi ceux rattaches a des conducteurs ou des elements
*/
QSet < DiagramTextItem * > Diagram : : selectedTexts ( ) const {
QSet < DiagramTextItem * > selected_texts ;
foreach ( QGraphicsItem * item , selectedItems ( ) ) {
2010-04-18 17:59:54 +00:00
if ( ConductorTextItem * cti = qgraphicsitem_cast < ConductorTextItem * > ( item ) ) {
selected_texts < < cti ;
2010-02-11 23:35:04 +00:00
} else if ( ElementTextItem * eti = qgraphicsitem_cast < ElementTextItem * > ( item ) ) {
selected_texts < < eti ;
2010-04-18 17:59:54 +00:00
} else if ( IndependentTextItem * iti = qgraphicsitem_cast < IndependentTextItem * > ( item ) ) {
selected_texts < < iti ;
2010-02-11 23:35:04 +00:00
}
}
return ( selected_texts ) ;
}
2013-05-28 16:50:35 +00:00
/**
* @ brief Diagram : : selectedConductorTexts
* @ return the list of conductor texts selected
*/
QSet < ConductorTextItem * > Diagram : : selectedConductorTexts ( ) const {
QSet < ConductorTextItem * > selected_texts ;
foreach ( QGraphicsItem * item , selectedItems ( ) ) {
if ( ConductorTextItem * cti = qgraphicsitem_cast < ConductorTextItem * > ( item ) ) {
selected_texts < < cti ;
}
}
return ( selected_texts ) ;
}
2014-12-23 02:06:36 +00:00
/**
* @ brief Diagram : : selectedElementTexts
* @ return the list of element texts selected
*/
2014-12-23 01:51:17 +00:00
QSet < ElementTextItem * > Diagram : : selectedElementTexts ( ) const {
QSet < ElementTextItem * > selected_texts ;
foreach ( QGraphicsItem * item , selectedItems ( ) ) {
if ( ElementTextItem * cti = qgraphicsitem_cast < ElementTextItem * > ( item ) ) {
selected_texts < < cti ;
}
}
return ( selected_texts ) ;
}
2007-11-03 20:20:34 +00:00
/// @return true si le presse-papier semble contenir un schema
bool Diagram : : clipboardMayContainDiagram ( ) {
QString clipboard_text = QApplication : : clipboard ( ) - > text ( ) . trimmed ( ) ;
bool may_be_diagram = clipboard_text . startsWith ( " <diagram " ) & & clipboard_text . endsWith ( " </diagram> " ) ;
return ( may_be_diagram ) ;
}
2007-11-09 13:06:51 +00:00
2009-04-03 19:30:25 +00:00
/**
@ return le projet auquel ce schema appartient ou 0 s ' il s ' agit d ' un schema
independant .
*/
QETProject * Diagram : : project ( ) const {
2016-03-15 18:42:18 +00:00
return ( m_project ) ;
2009-04-03 19:30:25 +00:00
}
/**
2014-04-11 09:51:21 +00:00
* @ brief Diagram : : setProject
2014-12-21 12:50:26 +00:00
* Set parent project of this diagram , project also become the parent QObject of this diagram
* @ param project new project
2014-04-11 09:51:21 +00:00
*/
2014-12-21 12:50:26 +00:00
void Diagram : : setProject ( QETProject * project )
{
2016-03-15 18:42:18 +00:00
if ( m_project = = project ) return ;
2014-12-21 12:50:26 +00:00
2016-03-15 18:42:18 +00:00
if ( m_project )
2014-12-21 12:50:26 +00:00
{
2016-03-15 18:42:18 +00:00
disconnect ( m_project , SIGNAL ( reportPropertiesChanged ( QString ) ) , this , SIGNAL ( reportPropertiesChanged ( QString ) ) ) ;
disconnect ( m_project , SIGNAL ( XRefPropertiesChanged ( ) ) , this , SIGNAL ( XRefPropertiesChanged ( ) ) ) ;
2014-04-11 09:51:21 +00:00
}
2014-12-21 12:50:26 +00:00
2016-03-15 18:42:18 +00:00
m_project = project ;
2014-12-21 12:50:26 +00:00
setParent ( project ) ;
2016-03-15 18:42:18 +00:00
connect ( m_project , SIGNAL ( reportPropertiesChanged ( QString ) ) , this , SIGNAL ( reportPropertiesChanged ( QString ) ) ) ;
connect ( m_project , SIGNAL ( XRefPropertiesChanged ( ) ) , this , SIGNAL ( XRefPropertiesChanged ( ) ) ) ;
2009-04-03 19:30:25 +00:00
}
2009-04-05 11:48:26 +00:00
2011-09-08 19:03:13 +00:00
/**
@ return the folio number of this diagram within its parent project , or - 1
if it is has no parent project
*/
int Diagram : : folioIndex ( ) const {
2016-03-15 18:42:18 +00:00
if ( ! m_project ) return ( - 1 ) ;
return ( m_project - > folioIndex ( this ) ) ;
2011-09-08 19:03:13 +00:00
}
2011-08-29 21:50:43 +00:00
/**
@ param fallback_to_project When a diagram does not have a declared version ,
this method will use the one declared by its parent project only if
fallback_to_project is true .
@ return the declared QElectroTech version of this diagram
*/
qreal Diagram : : declaredQElectroTechVersion ( bool fallback_to_project ) const {
if ( diagram_qet_version_ ! = - 1 ) {
return diagram_qet_version_ ;
}
2016-03-15 18:42:18 +00:00
if ( fallback_to_project & & m_project ) {
return ( m_project - > declaredQElectroTechVersion ( ) ) ;
2011-08-29 21:50:43 +00:00
}
return ( - 1 ) ;
}
2009-04-03 19:30:25 +00:00
/**
2014-12-21 13:17:35 +00:00
* @ brief Diagram : : isReadOnly
* @ return true if this diagram is read only .
* This method is same has call Diagram : : project ( ) - > isReadOnly ( )
*/
bool Diagram : : isReadOnly ( ) const
{
2016-03-15 18:42:18 +00:00
return m_project - > isReadOnly ( ) ;
2009-04-03 19:30:25 +00:00
}
2007-11-09 13:06:51 +00:00
/**
@ return Le contenu du schema . Les conducteurs sont tous places dans
conductorsToMove .
*/
DiagramContent Diagram : : content ( ) const {
DiagramContent dc ;
foreach ( QGraphicsItem * qgi , items ( ) ) {
if ( Element * e = qgraphicsitem_cast < Element * > ( qgi ) ) {
dc . elements < < e ;
2010-04-18 17:59:54 +00:00
} else if ( IndependentTextItem * iti = qgraphicsitem_cast < IndependentTextItem * > ( qgi ) ) {
dc . textFields < < iti ;
2007-11-09 13:06:51 +00:00
} else if ( Conductor * c = qgraphicsitem_cast < Conductor * > ( qgi ) ) {
dc . conductorsToMove < < c ;
}
}
return ( dc ) ;
}
/**
@ return le contenu selectionne du schema .
*/
DiagramContent Diagram : : selectedContent ( ) {
DiagramContent dc ;
2007-11-11 16:12:45 +00:00
2010-05-08 21:24:43 +00:00
// recupere les elements deplaces
foreach ( QGraphicsItem * item , selectedItems ( ) ) {
if ( Element * elmt = qgraphicsitem_cast < Element * > ( item ) ) {
dc . elements < < elmt ;
} else if ( IndependentTextItem * iti = qgraphicsitem_cast < IndependentTextItem * > ( item ) ) {
dc . textFields < < iti ;
} else if ( Conductor * c = qgraphicsitem_cast < Conductor * > ( item ) ) {
// recupere les conducteurs selectionnes isoles (= non deplacables mais supprimables)
2007-11-11 16:12:45 +00:00
if (
! c - > terminal1 - > parentItem ( ) - > isSelected ( ) & & \
! c - > terminal2 - > parentItem ( ) - > isSelected ( )
) {
dc . otherConductors < < c ;
}
2013-08-24 15:18:45 +00:00
} else if ( DiagramImageItem * dii = qgraphicsitem_cast < DiagramImageItem * > ( item ) ) {
dc . images < < dii ;
2014-03-06 14:04:19 +00:00
} else if ( QetShapeItem * dsi = qgraphicsitem_cast < QetShapeItem * > ( item ) ) {
dc . shapes < < dsi ;
2007-11-11 16:12:45 +00:00
}
}
2010-05-08 21:24:43 +00:00
// pour chaque element deplace, determine les conducteurs qui seront modifies
foreach ( Element * elmt , dc . elements ) {
foreach ( Terminal * terminal , elmt - > terminals ( ) ) {
foreach ( Conductor * conductor , terminal - > conductors ( ) ) {
Terminal * other_terminal ;
if ( conductor - > terminal1 = = terminal ) {
other_terminal = conductor - > terminal2 ;
} else {
other_terminal = conductor - > terminal1 ;
}
// si les deux elements du conducteur sont deplaces
if ( dc . elements . contains ( other_terminal - > parentElement ( ) ) ) {
dc . conductorsToMove < < conductor ;
} else {
dc . conductorsToUpdate < < conductor ;
}
}
}
}
2007-11-09 13:06:51 +00:00
return ( dc ) ;
}
2009-06-16 22:37:15 +00:00
/**
@ return true s ' il est possible de tourner les elements selectionnes .
Concretement , cette methode retourne true s ' il y a des elements selectionnes
et qu ' au moins l ' un d ' entre eux peut etre pivote .
*/
bool Diagram : : canRotateSelection ( ) const {
foreach ( QGraphicsItem * qgi , selectedItems ( ) ) {
2013-11-14 10:11:22 +00:00
if ( qgraphicsitem_cast < IndependentTextItem * > ( qgi ) | |
qgraphicsitem_cast < ConductorTextItem * > ( qgi ) | |
qgraphicsitem_cast < DiagramImageItem * > ( qgi ) | |
qgraphicsitem_cast < ElementTextItem * > ( qgi ) | |
qgraphicsitem_cast < Element * > ( qgi ) ) return ( true ) ;
2009-06-16 22:37:15 +00:00
}
return ( false ) ;
}