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