Salome HOME
NRI : Update 1.1a and New organisation.
[modules/med.git] / src / MEDGUI / MedGUI.cxx
1 using namespace std;
2 //=============================================================================
3 // File      : MedGUI.cxx
4 // Project   : SALOME
5 // Copyright : EDF 2001
6 //=============================================================================
7
8 #include "MedGUI.h"
9
10 // SALOME Includes
11 #include "Utils_ORB_INIT.hxx"
12 #include "Utils_SINGLETON.hxx"
13 #include "utilities.h"
14
15 #include "SALOME_Selection.h"
16 #include "SALOME_InteractiveObject.hxx"
17 #include "SALOMEGUI_QtCatchCorbaException.hxx"
18
19 #include "QAD_MessageBox.h"
20 #include "QAD_Tools.h"
21 #include "QAD_FileDlg.h"
22
23 //#include "SMESH_TypeFilter.hxx"
24
25 // QT Includes
26 #include <qinputdialog.h>
27
28 //VRV: porting on Qt 3.0.5
29 #if QT_VERSION >= 0x030005
30 #include <qlineedit.h>
31 #endif
32 //VRV: porting on Qt 3.0.5
33
34 static CORBA::ORB_var   _orb;
35
36 //=============================================================================
37 /*!
38  *
39  */
40 //=============================================================================
41 bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
42 {
43   setOrb();
44   
45   QAD_Study* myActiveStudy   = parent->getActiveStudy();
46   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
47   SALOME_NamingService* myNameService = parent->getNameService();
48
49   QString file;
50   QStringList filtersList ;     
51
52   filtersList.append( tr("MED_MEN_IMPORT_MED") );
53   filtersList.append( tr("MED_MEN_ALL_FILES") ) ;
54
55   switch (theCommandID)
56     {
57     case 4031:
58     case 9031:
59     case 931:
60       {
61         MESSAGE("command " << theCommandID << " activated");
62
63         QString myStudyName = myActiveStudy->getTitle();
64         bool ok=FALSE;
65         int myStudyId = myActiveStudy->getStudyId();
66
67         // load MED engine
68         Engines::Med_Gen_ptr medgen = InitMedGen(parent);
69
70         // Selection du Fichier
71         file = QAD_FileDlg::getFileName(parent,
72                                         "",
73                                         filtersList,
74                                         tr("MED_MEN_IMPORT"),
75                                         true);
76
77         // Selection du Maillage
78         if (!file.isEmpty() )
79           {
80             SCRUTE(file);
81             QString meshName;
82             meshName = QInputDialog::getText( QString( tr("MED_INF_MESHNAME") ), 
83                                               QString::null,
84                                               //VRV: porting on Qt 3.0.5
85 #if QT_VERSION >= 0x030005
86                                               QLineEdit::Normal,
87 #endif
88                                               //VRV: porting on Qt 3.0.5
89                                               QString::null, &ok);
90             if ( ! meshName.isEmpty())
91               {
92                   try
93                     {
94                       medgen->readMeshInFile(file.latin1(),myStudyName,meshName);
95                       if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
96                         QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
97                                                QObject::tr("WRN_WARNING"), 
98                                                QObject::tr("WRN_STUDY_LOCKED"),
99                                                QObject::tr("BUT_OK"));
100                       }
101                     }
102                   catch (const SALOME::SALOME_Exception & S_ex)
103                     {
104                       QtCatchCorbaException(S_ex);
105                     }
106                 }
107                 myActiveStudy->updateObjBrowser();
108           }
109         break;
110       }
111     case 4032:
112     case 9032:
113     case 932:
114       {
115         MESSAGE("command " << theCommandID << " activated");
116
117         QString myStudyName = myActiveStudy->getTitle();
118         bool ok=FALSE;
119         int myStudyId = myActiveStudy->getStudyId();
120
121         // load MED engine
122         Engines::Med_Gen_ptr medgen = InitMedGen(parent);
123
124         // Selection du Fichier
125         file = QAD_FileDlg::getFileName(parent,
126                                         "",
127                                         filtersList,
128                                         tr("MED_MEN_IMPORT"),
129                                         true);
130
131         // Selection du Maillage
132         if (!file.isEmpty() )
133           {
134             SCRUTE(file);
135             QString fieldName;
136             fieldName = QInputDialog::getText(
137                                               QString( tr("MED_INF_FIELDNAME") ), QString::null,
138                                               //VRV: porting on Qt 3.0.5
139 #if QT_VERSION >= 0x030005
140                                               QLineEdit::Normal,
141 #endif
142                                               //VRV: porting on Qt 3.0.5
143                                               QString::null, &ok);
144             if ( ! fieldName.isEmpty())
145               {
146                 try
147                   {
148                     medgen->readFieldInFile(file.latin1(),myStudyName,fieldName,-1,-1);
149                     if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
150                       QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
151                                              QObject::tr("WRN_WARNING"), 
152                                              QObject::tr("WRN_STUDY_LOCKED"),
153                                              QObject::tr("BUT_OK"));
154                     }
155                   }
156                 catch (const SALOME::SALOME_Exception & S_ex)
157                   {
158                     QtCatchCorbaException(S_ex);
159                   }
160
161                 myActiveStudy->updateObjBrowser();
162               }
163           }
164         break;
165       }
166     case 4033:
167     case 933:
168       {
169         MESSAGE("command " << theCommandID << " activated");
170
171         QString myStudyName = myActiveStudy->getTitle();
172         int myStudyId = myActiveStudy->getStudyId();
173
174         // load MED engine
175         Engines::Med_Gen_ptr medgen = InitMedGen(parent);
176
177         // Selection du Fichier
178         file = QAD_FileDlg::getFileName(parent,
179                                         "",
180                                         filtersList,
181                                         tr("MED_MEN_IMPORT"),
182                                         true);
183         if (!file.isEmpty() )
184           {
185             SCRUTE(file);
186             try
187               {
188 //              medgen->readStructFile(file.latin1(),myStudyName);
189                 medgen->readStructFileWithFieldType(file.latin1(),myStudyName);
190                 if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
191                   QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
192                                          QObject::tr("WRN_WARNING"), 
193                                          QObject::tr("WRN_STUDY_LOCKED"),
194                                          QObject::tr("BUT_OK"));
195                 }
196               }
197             catch (const SALOME::SALOME_Exception & S_ex)
198               {
199                 QtCatchCorbaException(S_ex);
200               }
201             myActiveStudy->updateObjBrowser();
202           }
203         break;
204       }
205       
206     case 934:
207       {
208         //Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter( MESH );
209         SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
210         //Sel->AddFilter(aMeshFilter) ;
211         
212         int nbSel = Sel->IObjectCount();
213         if ( nbSel == 1 ) 
214           {
215             //      SMESH::SMESH_Mesh_var aM;
216             SALOME_MED::MESH_var aMesh;
217             Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
218             if ( IObject->hasEntry() ) 
219               {
220                 SALOMEDS::SObject_var aMorSM = aStudy->FindObjectID( IObject->getEntry() );
221                 if ( !aMorSM->_is_nil() ) 
222                   {
223                     SALOMEDS::GenericAttribute_var anAttr;
224                     SALOMEDS::AttributeIOR_var     anIOR;
225                     if (aMorSM->FindAttribute(anAttr, "AttributeIOR")) 
226                       {
227                         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
228                         aMesh = SALOME_MED::MESH::_narrow( _orb->string_to_object(anIOR->Value()) );
229                         if ( aMesh->_is_nil() )
230                           {
231                             //                              aM = SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value()));
232                             //                              if ( aM->_is_nil() )
233                             //                                {
234                             //                                  QAD_MessageBox::warn1
235                             //                                    ( QAD_Application::getDesktop(),
236                             //                                      tr ("MED_WRN_WARNING"),
237                             //                                      tr ("MED_INF_NOTIMPL"),
238                             //                                      tr ("MED_BUT_OK") );
239                             //                                  break;
240                             //                                }
241                             //                              aMesh = aM->GetMEDMesh();
242                             if ( aMesh->_is_nil() )
243                               {
244                                 QAD_MessageBox::warn1
245                                   ( QAD_Application::getDesktop(),
246                                     tr ("MED_WRN_WARNING"),
247                                     tr ("MED_INF_NOTIMPL"),
248                                     tr ("MED_BUT_OK") );
249                                 break;
250                               }
251                           }
252                         DumpMesh( aMesh );
253                         //Sel->ClearFilters() ;
254                       }
255                     else
256                       {
257                         QAD_MessageBox::warn1
258                           ( QAD_Application::getDesktop(),
259                             tr ("MED_WRN_WARNING"),
260                             tr ("MED_INF_NOIOR"),
261                             tr ("MED_BUT_OK") );
262                         break;
263                       }
264                   }
265               }
266           } 
267         break;
268       }
269
270     case 935:
271       {
272         //Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter( SUBMESH );
273         SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
274         //Sel->AddFilter(aSubMeshFilter) ;
275         
276         int nbSel = Sel->IObjectCount();
277         if ( nbSel == 1 ) 
278           {
279             //      SMESH::SMESH_subMesh_var aSubM;
280             SALOME_MED::FAMILY_var aFam;
281             Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
282             if ( IObject->hasEntry() ) 
283               {
284                 SALOMEDS::SObject_var aMorSM = aStudy->FindObjectID( IObject->getEntry() );
285                 if ( !aMorSM->_is_nil() ) 
286                   {
287                     SALOMEDS::GenericAttribute_var anAttr;
288                     SALOMEDS::AttributeIOR_var     anIOR;
289                     if (aMorSM->FindAttribute(anAttr, "AttributeIOR")) 
290                       {
291                         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
292                         //                      aSubM = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
293                         //                      if ( aSubM->_is_nil() )
294                         //                        {
295                         //                          aFam=SALOME_MED::FAMILY::_narrow( _orb->string_to_object(anIOR->Value()));
296                         //                          if ( aFam->_is_nil() )
297                         //                            {
298                         //                              QAD_MessageBox::warn1
299                         //                                ( QAD_Application::getDesktop(),
300                         //                                  tr ("MED_WRN_WARNING"),
301                         //                                  tr ("MED_INF_NOTIMPL"),
302                         //                                  tr ("MED_BUT_OK") );
303                         //                              break;
304                         //                            }
305                         //                          DumpSubMesh( aFam );
306                         //    }
307                         //                      else
308                         //                        {
309                         //                          DumpSubMesh( aSubM );
310                         //Sel->ClearFilters() ;
311                         //       }
312                       }
313                     else
314                       {
315                         QAD_MessageBox::warn1
316                           ( QAD_Application::getDesktop(),
317                             tr ("MED_WRN_WARNING"),
318                             tr ("MED_INFNOIOR"),
319                             tr ("MED_BUT_OK") );
320                         break;
321                       }
322                   }
323               }
324           } 
325         break;
326       }
327     }
328   return true;
329 }
330
331
332 //=============================================================================
333 /*!
334  *
335  */
336 //=============================================================================
337 bool MedGUI::OnMousePress (QMouseEvent* pe ,
338                            QAD_Desktop* parent, 
339                            QAD_StudyFrame* studyFrame)
340 {
341   MESSAGE("MedGUI::OnMousePress");
342   return true;
343 }
344  
345 //=============================================================================
346 /*!
347  *
348  */
349 //=============================================================================
350 bool MedGUI::OnMouseMove (QMouseEvent* pe ,
351                           QAD_Desktop* parent, 
352                           QAD_StudyFrame* studyFrame)
353 {
354   //   MESSAGE("MedGUI::OnMouseMouve");
355   return true;
356 }
357
358 //=============================================================================
359 /*!
360  *
361  */
362 //=============================================================================
363 bool MedGUI::OnKeyPress (QKeyEvent* pe,
364                          QAD_Desktop* parent,
365                          QAD_StudyFrame* studyFrame)
366 {
367   MESSAGE("MedGUI::OnKeyPress");
368   return true;
369 }
370
371 //=============================================================================
372 /*!
373  *
374  */
375 //=============================================================================
376 bool MedGUI::SetSettings (QAD_Desktop* parent)
377 {
378   MESSAGE("MedGUI::SetSettings");
379   return true;
380 }
381
382 //=============================================================================
383 /*!
384  *
385  */
386 //=============================================================================
387 bool MedGUI::CustomPopup ( QAD_Desktop* parent,
388                            QPopupMenu* popup,
389                            const QString & theContext,
390                            const QString & theParent,
391                            const QString & theObject )
392 {
393   MESSAGE("MedGUI::CustomPopup");
394   return true;
395 }
396
397 //=============================================================================
398 /*!
399  *
400  */
401 //=============================================================================
402 void MedGUI::ActiveStudyChanged( QAD_Desktop* parent )
403 {
404 }
405
406 //=============================================================================
407 /*!
408  *
409  */
410 //=============================================================================
411 void MedGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject )
412 {
413   theObject = "";
414   theContext = "";
415 }
416
417 //=============================================================================
418 /*!
419  *
420  */
421 //=============================================================================
422 bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
423 {
424   
425   if ( MEDMesh->_is_nil() )
426     {
427       return false;
428     }
429
430   //SALOME_MED::MESH_var MEDMesh = aMesh->GetMEDMesh();
431   string name = MEDMesh->getName();
432   SCRUTE(name);
433
434   int dim = MEDMesh->getMeshDimension();
435   SCRUTE(dim);
436   int dim2 = MEDMesh->getSpaceDimension();
437   SCRUTE(dim2);
438
439   int k = MEDMesh->getNumberOfNodes() ;
440   SCRUTE(k);
441   Engines::double_array_var coords = MEDMesh->getCoordinates( SALOME_MED::MED_FULL_INTERLACE );
442   int i = 0;
443   int lu = 0;
444   while (lu < k ) {
445     if (dim2==3)
446       {
447         MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] << " Z = " << coords[i+2] ); 
448         i = i + 3; // Only for triangles
449       }
450     else
451       {
452         MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] ); 
453         i = i + 2; 
454       }
455     lu=lu+1;
456   }
457
458   int nbfam=MEDMesh->getNumberOfFamilies(SALOME_MED::MED_NODE);
459   SCRUTE(nbfam);
460   SALOME_MED::Family_array_var Families=MEDMesh->getFamilies(SALOME_MED::MED_NODE) ;
461   
462   for (k=0;  k < nbfam; k++) {
463     SCRUTE(k);
464     string nomFam=Families[k]->getName();
465     SCRUTE(nomFam);
466     int identfam=Families[k]->getIdentifier();
467     SCRUTE(identfam);
468     int nbelemnts=Families[k]->getNumberOfElements(SALOME_MED::MED_NONE);
469     SCRUTE(nbelemnts);
470     Engines::long_array_var tabnoeuds=Families[k]->getNumber(SALOME_MED::MED_NONE);
471     for (int l=0;l<tabnoeuds->length();l++)
472       SCRUTE(tabnoeuds[l]); 
473   }
474    
475   //     int famIdent = 1;
476   //     SALOME_MED::FAMILY_ptr Family=MEDMesh->getFamily(SALOME_MED::MED_NODE,1) ;
477   //     MESSAGE("ici");
478   //     string nomFam=Family->getName();
479   //     SCRUTE(nomFam);
480   //     int identfam=Family->getIdentifier();
481   //     SCRUTE(identfam);
482   //     Engines::long_array_var tabnoeuds=Family->getNumber(SALOME_MED::MED_NONE);
483   //     for (int l=0;l<tabnoeuds->length();l++)
484   //       SCRUTE(tabnoeuds[l]); 
485
486   return true;
487 }
488
489 //=============================================================================
490 /*!
491  *
492  */
493 //=============================================================================
494 //  bool MedGUI::DumpSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh )
495 //  {
496 //    if ( aSubMesh->_is_nil() )
497 //      return false;
498
499 //    SALOME_MED::FAMILY_var Fam = aSubMesh->GetFamily();
500 //    if ( Fam->_is_nil() )
501 //      return false;
502
503 //    Engines::long_array_var tabnoeuds=Fam->getNumber(SALOME_MED::MED_NONE);
504 //    for (int l=0;l<tabnoeuds->length();l++)
505 //      SCRUTE(tabnoeuds[l]); 
506
507 //    return true;
508 //  }
509 //=============================================================================
510 /*!
511  *
512  */
513 //=============================================================================
514 bool MedGUI::DumpSubMesh( SALOME_MED::FAMILY_var Fam )
515 {
516
517   if ( Fam->_is_nil() )
518     return false;
519
520   Engines::long_array_var tabnoeuds=Fam->getNumber(SALOME_MED::MED_NONE);
521   for (int l=0;l<tabnoeuds->length();l++)
522     SCRUTE(tabnoeuds[l]); 
523
524   return true;
525 }
526
527 //=============================================================================
528 /*!
529  *
530  */
531 //=============================================================================
532 Engines::Med_Gen_ptr MedGUI::InitMedGen(QAD_Desktop* parent)
533 {
534   Engines::Component_var comp = 
535     parent->getEngine("FactoryServer", "Med");
536   MESSAGE("_________________________________________");
537   Engines::Med_Gen_var clr = Engines::Med_Gen::_narrow(comp);
538   ASSERT(!CORBA::is_nil(clr));
539   return clr._retn();
540 }
541
542 //=============================================================================
543 /*!
544  *
545  */
546 //=============================================================================
547 void MedGUI::setOrb()
548 {
549   try {
550     ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
551     ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
552     _orb = init( 0 , 0 );
553   } catch (...) {
554     INFOS("internal error : orb not found");
555     _orb = 0;
556   }
557   ASSERT(! CORBA::is_nil(_orb));
558 }
559
560 //=============================================================================
561 /*!
562  *
563  */
564 //=============================================================================
565 extern "C"
566 {
567   bool OnGUIEvent(int theCommandID, QAD_Desktop* parent)
568   {
569     return MedGUI::OnGUIEvent(theCommandID, parent);
570   }
571
572   bool OnKeyPress (QKeyEvent* pe,
573                    QAD_Desktop* parent, 
574                    QAD_StudyFrame* studyFrame)
575   {
576     return MedGUI::OnKeyPress (pe, parent, studyFrame);
577   }
578
579   bool OnMousePress (QMouseEvent* pe,
580                      QAD_Desktop* parent,
581                      QAD_StudyFrame* studyFrame)
582   {
583     return MedGUI::OnMousePress (pe, parent, studyFrame);
584   }
585
586   bool OnMouseMove (QMouseEvent* pe,
587                     QAD_Desktop* parent, 
588                     QAD_StudyFrame* studyFrame)
589   {
590     return MedGUI::OnMouseMove (pe, parent, studyFrame);
591   }
592
593   bool SetSettings ( QAD_Desktop* parent )
594   {
595     return MedGUI::SetSettings( parent );
596   }
597
598   bool customPopup ( QAD_Desktop* parent,
599                      QPopupMenu* popup,
600                      const QString & theContext,
601                      const QString & theParent,
602                      const QString & theObject )
603   {
604     return MedGUI::CustomPopup( parent, popup, theContext,
605                                 theParent, theObject );
606   }
607
608   void definePopup ( QString & theContext, QString & theParent, QString & theObject )
609   {
610     MedGUI::DefinePopup( theContext, theParent, theObject );
611   }
612   
613   bool activeStudyChanged ( QAD_Desktop* parent )
614   {
615     MedGUI::ActiveStudyChanged( parent );
616   }
617 }