gapMea  1.0-rc1-1.5.3.2
GapMea est un outil visuel écrit en c++ à l'aide de la bibliothèque QT qui sert de base entre autre à l'environnement graphique de KDE.Il permet de dessiner des schémas recueillant et structurant les informations nécessaires à un domaine de gestion. Le schéma obtenu est enregistré dans un fichier texte au format xml.
 All Classes Functions Variables
lien.cpp
1 #include "lien.h"
2 #include <QDebug>
3 #include <QAction>
4 #include <QMenu>
5 #include <QTextDocument>
6 #include <QPainter>
7 #include "math.h"
8 #include <QInputDialog>
9 #include <QVector>
10 #include <QGraphicsEllipseItem>
11 #include <association.h>
12 
13 Lien::~Lien()
14 {
15  qDebug()<<"destructeur du lien";
16  //je me retire du vecteur de mes deux tables
17  int monIndexDansT1=t1->vectLiens.indexOf(this);
18  if(monIndexDansT1!=-1) t1->vectLiens.remove(monIndexDansT1,1);
19  int monIndexDansT2=t2->vectLiens.indexOf(this);
20  if(monIndexDansT2!=-1) t2->vectLiens.remove(monIndexDansT2,1);
21  //je me retire du vecteur de la MainWindow
22  int monIndexDansLaMW=t1->maman->vectLiens.indexOf(this);
23  if(monIndexDansLaMW!=-1) t1->maman->vectLiens.remove(monIndexDansLaMW,1);
24 
25  //l'effacement du lien dans le vecteur central est réalisé par la méthode supprimeLien de la classe dialogRelation
26  if(role!=NULL) delete role;
27  if(cardinalite1!=NULL)delete cardinalite1;
28  if(cardinalite2!=NULL)delete cardinalite2;
29 }
30 
31 Lien::Lien(Entite* pt1,Entite* pt2,QGraphicsItem * parent,QString typ, QString relationName, QString pRole)
32 {
33  qDebug()<<"lien::lien(Entite* pt1,Entite* pt2,QGraphicsItem * parent,QString typ, QString relationName, QString pRole)";
34  //construction de la ligne
35  line=new QGraphicsLineItem(pt1->pos().x()+pt1->boundingRect().width()/2,pt1->pos().y(),pt2->pos().x()+pt2->boundingRect().width()/2,pt2->pos().y(),this);
36  //line->setFlags(QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemClipsChildrenToShape);
37  addToGroup(line);
38  //le lien est sélectionnable
39  this->setFlags(QGraphicsItem::ItemIsSelectable);//|QGraphicsItem::ItemIsMovable);
40  //constructeur du lien
41  t1=pt2;
42  t2=pt1;
43  cardinalite1=new QGraphicsSimpleTextItem(this);
44  addToGroup(cardinalite1);
45  cardinalite1->setZValue(129);
46  if(!pRole.isEmpty())
47  {
48  //création du rôle
49  this->texteDuRole=pRole;
50  role=new QGraphicsSimpleTextItem(texteDuRole,this);
51  addToGroup(role);
52  role->setZValue(130);
53  cardinalite2=NULL;
54  }
55  else
56  {
57  cardinalite2=new QGraphicsSimpleTextItem(this);
58  addToGroup(cardinalite2);
59  role=NULL;
60  }
61 
62 
63  //position et orientation à voir
64 
65 
66  //si c'est une cif ou une df ou une entité faible
67  if(typ==QObject::tr("Cif") or typ==QObject::tr("Df") or typ==QObject::tr("Leak Relation"))
68  {
69  //le rond
70  leRond=new QGraphicsEllipseItem(this);
71  addToGroup(leRond);
72  leRond->setData(32,"Lien");//il dit que c'est un lien
73  leRond->setBrush(QBrush(QColor("#FFD4A3")));
74  //le text
76  //determination largeur du rond
77  int largeur=QFontMetrics(leTexteDuRond->font()).width(" CIF ");
78  //largeur = hauteur
79  int hauteur=largeur;
80  QPoint position=boundingRect().center().toPoint();
81  position.setX(position.x()-largeur/2);
82 
83  leRond->setRect(position.x(),position.y(),largeur,hauteur);
84 
85  leTexteDuRond->setData(32,"Lien");//il dit que c'est un lien
86  leTexteDuRond->setHtml(typ.toUpper().left(3));
87  //position du texte
88  QPoint positionTexte=boundingRect().center().toPoint();
89  positionTexte.setX(positionTexte.x()-QFontMetrics(leTexteDuRond->font()).width(" CIF ")/2);
90  leTexteDuRond->setPos(positionTexte);
91  leTexteDuRond->setDefaultTextColor(Qt::black);
92  //les cardinalites
93  if(typ==QObject::tr("Cif"))
94  {
95  cardinalite1->setText("1,1");
96  if(cardinalite2!=NULL)cardinalite2->setText("0,n");
97  }
98  else
99  {
100  if(typ==QObject::tr("Df"))
101  {
102  cardinalite1->setText("0,1");
103  if(cardinalite2!=NULL)cardinalite2->setText("0,n");
104  }
105  else
106  {
107 
108  if(typ==QObject::tr("Leak Relation"))
109  {
110  cardinalite1->setText("(1,1)");
111  if(cardinalite2!=NULL)cardinalite2->setText("0,n");
112  }
113  else
114  {
115  if(typ==QObject::tr("Leg"))
116  {
117  cardinalite1->setText("0,n");
118  if(cardinalite2!=NULL)cardinalite2->setText("");
119  }
120  }
121  }
122  }
123  }
124  if(typ==QObject::tr("Leg"))
125  {
126  cardinalite1->setText("0,n");
127 
128  }
129  //si c'est une association
130  if(typ==QObject::tr("Relation"))
131  {
132  typ=QObject::tr("Leg");
133  cardinalite1->setText("0,n");
134  if(cardinalite2!=NULL)cardinalite2->setText("");
135  //création de l'association
136  QStringList listeVide;
137 
138  Association* nouvelleAssoc=new Association(t1->maman,relationName,this->boundingRect().x()+this->boundingRect().width()/2,this->boundingRect().y()+this->boundingRect().height()/2,parent,(QCustomGraphicsScene*)this->scene(),listeVide,true);
139  //abcisse et ordonnee
140  float abcisse=(t1->x()+t1->boundingRect().width()+t2->x()+t2->boundingRect().width()-nouvelleAssoc->rect().width())/2.0;
141  float ordonnee=(t1->y()+t1->boundingRect().height()+t2->y()+t2->boundingRect().height()-nouvelleAssoc->boundingRect().height())/2.0;
142  //ajout au vecteur de la mainWindow
143  t1->maman->ajouteTable(nouvelleAssoc);
144  t1->maman->getScene()->addItem(nouvelleAssoc);
145  //créer un autre lien entre l'assoc et t2
146  Lien* nouveauLien=new Lien(nouvelleAssoc,t2,0,QObject::tr("Leg"));
147  //je l'ajoute à la scene
148  t1->maman->getScene()->addItem(nouveauLien);
149  //faire pointer t2 sur l'association
150  t2=nouvelleAssoc;
151  t2->setPos(abcisse,ordonnee);
152 
153  }
154 
155  this->typeDeJointure=typ;
156  setData(32,"Lien");
157  //en arrière plan
158  setZValue(-1000.0);
159  //remplir les vecteurs de lien
160  //de la mainWindow
161  t1->maman->vectLiens.append(this);
162  //de la table t1
163  t1->vectLiens.append(this);
164  //de la table t2 si ce n'est pas la même que t1(reflexive)
165 #warning attention a voir
166  if(t2!=t1)
167  t2->vectLiens.append(this);
168 
169 
170 }
171 
172 
173 void Lien::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
174  QWidget *)
175 {
176  qDebug()<<this->texteDuRole;
177  qDebug()<<"void lien::paint(QPainter *painter, const QStyleOptionGraphicsItem *,QWidget *)";
178  /*if (t1->collidesWithItem(t2))
179  return;*/
180  painter->setRenderHint(QPainter::Antialiasing,true);
181 
182  QColor myColor(Qt::black);
183  /*QPen myPen = pen();
184  myPen.setColor(myColor);
185  painter->setPen(myPen);*/
186  painter->setBrush(myColor);
187  //décaler si plus d'un lien entre les deux mêmes objets
188  int noLien=t1->noLien(t2,this);
189  int ordonnee=10*noLien;
190  //obtenir le nb de lien
191  int nbLiensEntreT1EtT2=t1->nbLien(t2);
192  //répartir en fonction du nb de lien
193  //calculs dans t1
194  int ecartEntreDeuxLiensDansT1=(t1->boundingRect().width()-20)/nbLiensEntreT1EtT2;
195  //xDuPremier
196  int abcisseDuCentreDansT1=t1->boundingRect().width()/2;
197  int abcisseDuPremierDanT1=abcisseDuCentreDansT1-(nbLiensEntreT1EtT2-1)/2.0*ecartEntreDeuxLiensDansT1;
198  int monAbcisseDansT1=abcisseDuPremierDanT1+(noLien-1)*ecartEntreDeuxLiensDansT1;
199  QPointF origine=t1->pos()+QPointF(monAbcisseDansT1,ordonnee);
200  //calculs dans t2
201  int ecartEntreDeuxLiensDansT2=(t2->boundingRect().width()-20)/nbLiensEntreT1EtT2;
202  //xDuPremier
203  int abcisseDuCentreDansT2=t2->boundingRect().width()/2;
204  int abcisseDuPremierDanT2=abcisseDuCentreDansT2-(nbLiensEntreT1EtT2-1)/2.0*ecartEntreDeuxLiensDansT2;
205  int monAbcisseDansT2=abcisseDuPremierDanT2+(noLien-1)*ecartEntreDeuxLiensDansT2;
206  QPointF destination=t2->pos()+QPointF(monAbcisseDansT2,ordonnee);
207  QLineF centerLine(origine,destination);
208  QPolygonF endPolygon = t2->polygon();
209  QPolygonF beginPolygon = t1->polygon();
210 
211  QPointF p1 = endPolygon.first()+t2->pos() ;
212  QPointF p2;
213  QPointF intersectPointT2;
214  QLineF polyLine;
215  for (int i = 1; i < endPolygon.count(); ++i)
216  {
217  p2 = endPolygon.at(i)+t2->pos();
218  polyLine = QLineF(p1, p2);
219  QLineF::IntersectType intersectType =
220  polyLine.intersect(centerLine, &intersectPointT2);
221  if (intersectType == QLineF::BoundedIntersection)
222  break;
223  p1 = p2;
224  }
225  p1 = beginPolygon.first()+t1->pos() ;
226 
227  QPointF intersectPointT1;
228 
229  for (int i = 1; i < beginPolygon.count(); ++i)
230  {
231  p2 = beginPolygon.at(i)+t1->pos();
232  polyLine = QLineF(p1, p2);
233  QLineF::IntersectType intersectType =
234  polyLine.intersect(centerLine, &intersectPointT1);
235  if (intersectType == QLineF::BoundedIntersection)
236  break;
237  p1 = p2;
238  }
239  //pour que les pattes ne touchent pas les pseudos entités
240  if(t2->association && t1->association)
241  {
242  QLineF myLine=QLineF(intersectPointT1,intersectPointT2);
243  QPointF destination(myLine.pointAt(0.1).x(),myLine.pointAt(0.1).y());
244  myLine.setP1(destination);
245  intersectPointT1=myLine.p1();
246  //dessiner les pointillés
247  QLineF perpendiculaire=myLine.normalVector();
248  perpendiculaire.setLength(10);
249  QPointF deb,fin;
250  deb=perpendiculaire.p2();
251  fin=perpendiculaire.p1();
252  perpendiculaire.setP1(deb);
253  perpendiculaire.setP2(fin);
254  //je double la longueur
255  perpendiculaire.setLength(perpendiculaire.length()*2);
256  painter->drawLine(perpendiculaire);
257 
258  }
259 
260 
261  //desssin de la ligne
262  line->setLine(QLineF(intersectPointT1,intersectPointT2));
263 
264  if(typeDeJointure==QObject::tr("Cif") || typeDeJointure==QObject::tr("Df")|| typeDeJointure==QObject::tr("Leak Relation"))
265  {
266  //dessin de la flêche
267  QPointF presquAuBout=line->line().pointAt(0.99);
268  QLineF maLigne(presquAuBout,intersectPointT2);
269  QLineF normalVector=maLigne.normalVector();
270  QPointF bout1=normalVector.pointAt(1);
271  QLineF normalVector2=QLineF(intersectPointT2,bout1).normalVector();
272  QPointF bout2=normalVector2.pointAt(1);
273  QVector<QPointF> vectP;
274  vectP<<intersectPointT2<<bout1<<bout2;
275  painter->drawPolygon(QPolygonF(vectP));
276  }
277  //placement du rond de la cif ou df ou entité faible
278  if(typeDeJointure==QObject::tr("Cif") || typeDeJointure==QObject::tr("Df") || typeDeJointure==QObject::tr("Leak Relation"))
279  {
280 
281  //déplacement du rond
282  QPointF position=line->line().pointAt(0.5);
283 
284  int largeur=leRond->rect().width();
285  position.setX(position.x()-largeur/2);
286  position.setY(position.y()-largeur/2);
287 
288  leRond->setRect(position.x(),position.y(),largeur,leRond->rect().height());
289  leTexteDuRond->setPos(position);
290 
291  }
292 
293  int tailleDuRole=0;
294  if(role!=NULL)tailleDuRole=role->boundingRect().width();
295  //les cardinalités et le rôle
296 
297  QPointF posTexte1,posTexte2,posRole;
298 
299  if(intersectPointT1.x()<intersectPointT2.x())//t1 a gauche
300  {
301  posTexte1.setX(intersectPointT1.x());
302  if(cardinalite2!=NULL)posTexte2.setX(intersectPointT2.x()-cardinalite2->boundingRect().width());
303  //positionnement du role
304  float position=(tailleDuRole+10)/line->line().length();
305  if(role!=NULL)
306  {
307  posRole=line->line().pointAt(1-position);
308  role->setRotation(-1*line->line().angle());
309  }
310  if(intersectPointT1.y()<intersectPointT2.y())//t1 est en haut à gauche
311  {
312  posTexte1.setY(intersectPointT1.y());
313  if(cardinalite2!=NULL)posTexte2.setY(intersectPointT2.y()-cardinalite2->boundingRect().height());
314  //diminution du y du role
315  if(role!=NULL)posRole.setY(posRole.y()-25);
316  qDebug("haut/gauche");
317 
318  }
319  else//t1 est en bas à gauche
320  {
321  posTexte2.setY(intersectPointT2.y());
322  posTexte1.setY(intersectPointT1.y()-cardinalite1->boundingRect().height());
323  qDebug("bas gauche");
324 
325  }
326 
327  }
328  else//t1 à droite
329  {
330  posTexte2.setX(intersectPointT2.x());
331  posTexte1.setX(intersectPointT1.x()-cardinalite1->boundingRect().width());
332  //positionnement du role
333  if(role!=NULL)
334  {
335  posRole=line->line().pointAt(0.9);
336  //rotation
337  role->setRotation(180-line->line().angle());
338  }
339  if(intersectPointT1.y()<intersectPointT2.y())//t1 est en haut droite
340  {
341  posTexte1.setY(intersectPointT1.y());
342  if(cardinalite2!=NULL)posTexte2.setY(intersectPointT2.y()-cardinalite2->boundingRect().height());
343  //diminution du x du role
344  if(role!=NULL)posRole.setY(posRole.y()-20);
345  qDebug()<<"haut droite";
346 
347  }
348  else//t1 est en bas droite
349  {
350  posTexte2.setY(intersectPointT2.y());
351  posTexte1.setY(intersectPointT1.y()-cardinalite1->boundingRect().height());
352  //diminution du x du role
353  if(role!=NULL)
354  {
355  posRole.setX(posRole.x()+20);
356  posRole.setY(posRole.y()-20);
357  }
358  qDebug()<<"bas droite";
359  }
360 
361 
362  }
363  cardinalite1->setPos(posTexte1);
364 
365  //positionnement du role
366 
367  if(texteDuRole.isEmpty())
368  {
369  if(cardinalite2!=NULL)cardinalite2->setPos(posTexte2);
370  }
371  else
372  {
373  if(role!=NULL)role->setPos(posRole);
374 
375  }
376  //on dessine le lien
377  painter->drawLine(line->line());
378 
379 
380  /*
381  if (isSelected())//mise en évidence du lien sélectionné
382  {
383  painter->setPen(QPen(myColor, 1, Qt::DashLine));
384  QLineF myLine = line();
385  myLine.translate(0, 4.0);
386  painter->drawLine(myLine);
387  myLine.translate(0,-8.0);
388  painter->drawLine(myLine);
389  }
390  */
391  //painter->drawRect(boundingRect());
392  }
393  QRectF Lien::boundingRect() const
394  {
395  //prise en compte des cardinalités
396  //prise en compte des rôles s'il y en a
397  QRectF resultat;
398  //*******************************************************************************
399  //trouver le xmin et le xmax
400  qreal xmin,xmax;
401  //x de la ligne
402  if(line->line().p1().x()<line->line().p2().x())
403  {
404  xmin=line->line().p1().x();
405  xmax=line->line().p2().x();
406  }
407  else
408  {
409  xmin=line->line().p2().x();
410  xmax=line->line().p1().x();
411  }
412  //cardinalité1 et cardinalite2 ou role
413  qreal xDeCard1=cardinalite1->boundingRect().x();
414  qreal xMaxDeCard1=cardinalite1->boundingRect().x()+cardinalite1->boundingRect().width();
415  if(xmin>xDeCard1)xmin=xDeCard1;
416  if(xMaxDeCard1>xmax) xmax=xMaxDeCard1;
417 
418 
419  QGraphicsSimpleTextItem * lAutre;
420  if(role!=NULL)
421  lAutre=role;
422  else
423  lAutre=cardinalite2;
424  if(lAutre!=NULL)
425  {
426  qreal sonX=lAutre->boundingRect().x();
427  if(sonX<xmin)xmin=sonX;
428  qreal sonXMax=lAutre->boundingRect().x()+lAutre->boundingRect().width();
429  if(sonXMax>xmax)xmax=sonXMax;
430  }
431 
432 
433 
434 
435 
436 
437  //****************les ordonnees ***************************************************
438  //trouver le ymin et le ymax
439  qreal ymin,ymax;
440  //x de la ligne
441  if(line->line().p1().y()<line->line().p2().y())
442  {
443  ymin=line->line().p1().y();
444  ymax=line->line().p2().y();
445  }
446  else
447  {
448  ymin=line->line().p2().y();
449  ymax=line->line().p1().y();
450  }
451  //cardinalité1 et cardinalite2 ou role
452  if(ymin>cardinalite1->boundingRect().y())
453  {
454  ymin=cardinalite1->boundingRect().y();
455  }
456  if(ymax<cardinalite1->boundingRect().y()+cardinalite1->boundingRect().height())
457  ymax=cardinalite1->boundingRect().y()+cardinalite1->boundingRect().height();
458 
459  //examen de l'autre
460  if(lAutre!=NULL)
461  {
462  if(ymin>lAutre->boundingRect().y())
463  ymin=lAutre->boundingRect().y();
464  if(ymax<lAutre->boundingRect().y()+lAutre->boundingRect().height())
465  ymax=lAutre->boundingRect().y()+lAutre->boundingRect().height();
466  }
467 
468 #warning en cours de dev
469  qreal extra = (line->pen().width()+40)/ 2.0;
470  resultat.setCoords(xmin,ymin,xmax,ymax);
471  //return resultat.normalized().adjusted(-extra,-extra,extra,extra);
472  /*return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),
473  line().p2().y() - line().p1().y()))
474  .normalized()
475  .adjusted(-extra, -extra, extra, extra);*/
476 
477  return QGraphicsItemGroup::boundingRect().normalized().adjusted(-extra,-extra,extra,extra);
478  }
479 
480 
481 
482 void Lien::contextMenuEvent(QGraphicsSceneMouseEvent *event)
483 {
484  //ce qui se passe lorsque le menu contextuel de la table est appelé
485  qDebug()<<"void lien::contextMenuEvent(QGraphicsSceneMouseEvent *event)";
486  QMenu menu(QObject::tr("Link Menu"));
487  //si je n'était pas sélectionnée, je le deviens
488  this->setSelected(true);
489  //titre du menu
490  QAction* titre=new QAction(menu.title(),scene());
491  titre->setDisabled(true);
492  menu.addAction(titre);
493  //titre->setSeparator(true);
494  titre->setFont(QFont("verdana",9,3,true));
495  //si je n'était pas sélectionnée, je le deviens
496  this->setSelected(!this->isSelected());
497  //création des actions du menu
498  QAction *removeAction = menu.addAction(QObject::tr("&Remove"));
499 
500  //s'il y a une condition proposer de l'éditer
501  QAction* editRoleAction=menu.addAction(QObject::tr("&editRole"));
502 
503  //exécution du menu et récupération de l'action choisie
504  QAction * actionChoisie=menu.exec(event->screenPos());
505 
506  //autre choix du menu
507  if(actionChoisie==removeAction)
508  {
509  t1->maman->supprimerLien(this);
510  }
511  else
512  {
513  if(actionChoisie==editRoleAction)
514  {
515  bool ok;
516  QString text = QInputDialog::getText(0, QObject::tr("Edit Rôle"),
517  QObject::tr("Rôle:"), QLineEdit::Normal,
518  this->texteDuRole, &ok);
519  if (ok && !text.isEmpty()&& text!=texteDuRole)//il a changé le rôle
520  {
521  this->texteDuRole=text;
522  if(role==NULL)
523  {
524  role=new QGraphicsSimpleTextItem(text,this);
525  delete cardinalite2;
526  cardinalite2=NULL;
527  }
528  else
529  role->setText(text);
530  }
531  }
532  }
533 }
534 
535 bool Lien::estRelieA(Lien* autreLien)
536 {
537  return ((autreLien->t1==t1) or (autreLien->t1==t2) or (autreLien->t2==t1) or (autreLien->t2==t2));
538 }
Entite * t2
t2 second object
Definition: lien.h:40
The QCustomGraphicsScene class This class is designed to deal with mouse events.
QCustomGraphicsScene * getScene()
getScene
Definition: mainwindow.h:71
QGraphicsLineItem * line
line the line
Definition: lien.h:30
void supprimerLien(Lien *leLien)
supprimerLien
Definition: mainwindow.cpp:426
Lien(Entite *qg1, Entite *qg2, QGraphicsItem *parent, QString typ="Natural", QString relationName="", QString pRole="")
Lien.
Definition: lien.cpp:31
int noLien(Entite *lAutre, Lien *leLien)
noLien
Definition: entite.cpp:96
The Lien class a link is betwwen to objects it contains a line a role text cardinality ...
Definition: lien.h:17
Entite * t1
t1 first object
Definition: lien.h:35
QVector< Lien * > vectLiens
vectLiens this vector contains adresses of the links concerning entity
Definition: entite.h:69
QGraphicsEllipseItem * leRond
leRond Pour les cifs et dfs et entités faibles le rond central
Definition: lien.h:85
int nbLien(Entite *lAutre)
nbLien
Definition: entite.cpp:109
The Association class Association inherit Entite Association is a relation between at least two entit...
Definition: association.h:9
QString texteDuRole
texteDuRole example: chief
Definition: lien.h:61
QGraphicsSimpleTextItem * cardinalite1
cardinalite1 example:0,1 or 1,1 or 0,n
Definition: lien.h:45
QGraphicsSimpleTextItem * cardinalite2
cardinalite2 example:0,1 or 1,1 or 0,n
Definition: lien.h:50
QString typeDeJointure
typeDeJointure cif –1,1–CIF–0,n–> df –0,1–DF–0,n–>or leg --------—
Definition: lien.h:79
QGraphicsTextItem * leTexteDuRond
leTexteDuRond text writen into central disk
Definition: lien.h:90
QPolygonF polygon()
polygon
Definition: entite.h:90
QGraphicsSimpleTextItem * role
role if there are several links between two same objects
Definition: lien.h:56
void ajouteTable(Entite *t)
ajouteTable
Definition: mainwindow.cpp:124
void contextMenuEvent(QGraphicsSceneMouseEvent *event)
contextMenuEvent
Definition: lien.cpp:482
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
paint
Definition: lien.cpp:173
The Entite class Entity is an object we have to deal with.
Definition: entite.h:20
QVector< Lien * > vectLiens
vectLiens all links
Definition: mainwindow.h:55
QRectF boundingRect() const
boundingRect
Definition: lien.cpp:393
bool estRelieA(Lien *autreLien)
estRelieA
Definition: lien.cpp:535
MainWindow * maman
maman the main window
Definition: entite.h:85