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