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