]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMToolsGUI/GEOMToolsGUI.cxx
Salome HOME
c19ba6a6d9e14c190017a3bd7d64150835a3ae2b
[modules/geom.git] / src / GEOMToolsGUI / GEOMToolsGUI.cxx
1 //  GEOM GEOMGUI : GUI for Geometry component
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   : GEOMBase_Tools.cxx
25 //  Author : Damien COQUERET
26 //  Module : GEOM
27 //  $Header$
28
29 #include "GEOMToolsGUI.h"
30 #include "GeometryGUI.h"
31 #include "GEOM_Actor.h"
32 #include "GEOMBase.h"
33 #include "GEOM_Operation.h"
34 #include "GEOM_Displayer.h"
35
36 #include <SUIT_Session.h>
37 #include <SUIT_Application.h>
38 #include <SUIT_OverrideCursor.h>
39 #include <SUIT_MessageBox.h>
40 #include <SUIT_Tools.h>
41 #include <SUIT_FileDlg.h>
42 #include <SUIT_Desktop.h>
43 #include <SUIT_ViewModel.h>
44
45 #include <SalomeApp_Application.h>
46 #include <SalomeApp_Study.h>
47 #include <SalomeApp_SelectionMgr.h>
48
49 #include <SALOME_ListIteratorOfListIO.hxx>
50 #include <SALOME_Prs.h>
51
52 #include <qapplication.h>
53 #include <qmap.h>
54
55 #include "utilities.h"
56
57 using namespace std;
58
59 typedef QMap<QString, QString> FilterMap;
60
61 #include <SALOMEDS_SObject.hxx>
62
63
64
65
66 //=======================================================================
67 // function : getFileName
68 // purpose  : Selection of a file name for Import/Export. Returns also 
69 //            the selected file type code through <filter> argument.
70 //=======================================================================
71 static QString getFileName( QWidget*           parent, 
72                             const QString&     initial, 
73                             const FilterMap&   filterMap, 
74                             const QString&     caption,
75                             bool               open,
76                             QString&           format )
77 {
78   static QString lastUsedFilter;
79   QStringList filters;
80   for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it )
81     filters.push_back( it.key() );
82
83   SUIT_FileDlg* fd = new SUIT_FileDlg( parent, open, true, true );    
84   if ( !caption.isEmpty() )
85     fd->setCaption( caption );
86
87   if ( !initial.isEmpty() )
88     fd->setSelection( initial );
89
90   if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) )
91     fd->setSelectedFilter( lastUsedFilter );
92
93   fd->setFilters( filters );
94
95   fd->exec();
96   QString filename = fd->selectedFile();
97   format = filterMap[fd->selectedFilter()];
98   lastUsedFilter = fd->selectedFilter();
99   delete fd;
100   qApp->processEvents();
101   return filename;
102 }
103
104 //=======================================================================
105 // function : GEOMToolsGUI()
106 // purpose  : Constructor
107 //=======================================================================
108 GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) 
109 : GEOMGUI( parent )
110 {
111 }
112
113
114 //=======================================================================
115 // function : ~GEOMToolsGUI()
116 // purpose  : Destructor
117 //=======================================================================
118 GEOMToolsGUI::~GEOMToolsGUI()
119 {
120 }
121
122
123 //=======================================================================
124 // function : OnGUIEvent()
125 // purpose  : 
126 //=======================================================================
127 bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
128 {
129   getGeometryGUI()->EmitSignalDeactivateDialog();
130
131   switch (theCommandID)
132     {
133     case 31: // COPY
134       {
135         OnEditCopy();
136         break;
137       }
138     case 33: // DELETE
139       {
140         OnEditDelete();
141         break;
142       }
143     case 111: // IMPORT BREP
144     case 112: // IMPORT IGES
145     case 113: // IMPORT STEP
146       {
147         Import();
148         break;
149       }
150     case 121: // EXPORT BREP
151     case 122: // EXPORT IGES
152     case 123: // EXPORT STEP
153       {
154         Export();
155         break;
156       }
157     case 411: // SETTINGS - ADD IN STUDY
158       {
159         // SAN -- TO BE REMOVED !!!
160         break;
161       }
162     case 412: // SETTINGS - SHADING COLOR
163       {
164         OnSettingsColor();
165         break;
166       }
167     case 413: // SETTINGS - ISOS
168       {
169         OnSettingsIsos();
170         break;
171       }
172     case 414: // SETTINGS : STEP VALUE FOR SPIN BOXES
173       {
174         OnSettingsStep();
175         break;
176       }
177     case 804: // ADD IN STUDY - POPUP VIEWER
178       {
179         // SAN -- TO BE REMOVED !!!!
180         break;
181       }
182     case 901: // RENAME
183       {
184         OnRename();
185         break;
186       }
187     case 5103: // CHECK GEOMETRY
188       {
189         OnCheckGeometry();
190         break;
191       }
192     case 8032: // COLOR - POPUP VIEWER
193       {
194         OnColor();
195         break;
196       }
197     case 8033: // TRANSPARENCY - POPUP VIEWER
198       {
199         OnTransparency();
200         break;
201       }
202     case 8034: // ISOS - POPUP VIEWER
203       {
204         OnNbIsos();
205         break;
206       }
207     case 9024 : // OPEN - OBJBROSER POPUP
208       {
209         OnOpen();
210         break;
211       }
212     default:
213       {
214         SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID));
215         break;
216       }
217     }
218   return true;
219 }
220
221
222
223 //===============================================================================
224 // function : OnEditDelete()
225 // purpose  :
226 //===============================================================================
227 void GEOMToolsGUI::OnEditDelete()
228 {
229   SALOME_ListIO selected;
230   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
231   if ( app ) {
232     SalomeApp_SelectionMgr* aSelMgr = app->selectionMgr();
233     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
234     if ( aSelMgr && appStudy ) {
235       aSelMgr->selectedObjects( selected );
236       if ( !selected.IsEmpty() ) {
237         _PTR(Study) aStudy = appStudy->studyDS();
238
239         bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
240         if ( aLocked ) {
241           SUIT_MessageBox::warn1 ( app->desktop(),
242                                    QObject::tr("WRN_WARNING"), 
243                                    QObject::tr("WRN_STUDY_LOCKED"),
244                                    QObject::tr("BUT_OK") );
245           return;
246         }
247   
248         // VSR 17/11/04: check if all objects selected belong to GEOM component --> start
249         // modifications of ASV 01.06.05
250         QString parentComp = getParentComponent( aStudy, selected );
251         const char* geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() );
252         QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR ) );
253
254         if ( parentComp != geomComp )  {
255           SUIT_MessageBox::warn1 ( app->desktop(),
256                                   QObject::tr("ERR_ERROR"), 
257                                   QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ),
258                                   QObject::tr("BUT_OK") );
259           return;
260         }
261         // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish
262
263         if ( SUIT_MessageBox::warn2( app->desktop(), 
264                                      QObject::tr( "GEOM_WRN_WARNING" ),
265                                      QObject::tr( "GEOM_REALLY_DELETE" ),
266                                      QObject::tr( "GEOM_BUT_YES" ),
267                                      QObject::tr( "GEOM_BUG_NO" ), 1, 0, 0 ) != 1 )
268           return;
269
270         //      QAD_Operation* op = new SALOMEGUI_ImportOperation(.....);
271         //      op->start();
272         
273         // prepare list of SALOME_Views
274         QPtrList<SALOME_View> views;
275         SALOME_View* view;
276         // fill the list
277         ViewManagerList vmans = app->viewManagers();
278         SUIT_ViewManager* vman;
279         for ( vman = vmans.first(); vman; vman = vmans.next() ) {
280           SUIT_ViewModel* vmod = vman->getViewModel();
281           view = dynamic_cast<SALOME_View*> ( vmod ); // must work for OCC and VTK views
282           if ( view )
283             views.append( view );
284         }
285         
286         _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder());
287         _PTR(GenericAttribute) anAttr;
288         GEOM_Displayer* disp = new GEOM_Displayer( appStudy );
289
290         // MAIN LOOP OF SELECTED OBJECTS
291         for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
292
293           Handle(SALOME_InteractiveObject) io = It.Value();
294           if ( !io->hasEntry() )
295             continue;
296
297           _PTR(SObject) obj ( aStudy->FindObjectID( io->getEntry() ) );
298
299           // disable removal of "Geometry" component object
300           if ( !strcmp( obj->GetIOR().c_str(), geomIOR ) )
301             continue;
302
303           // iterate through all childres of obj, find IOR attributes on children and remove shapes that 
304           // correspond to these IORs
305           for ( _PTR(ChildIterator) it ( aStudy->NewChildIterator( obj ) ); it->More();it->Next() ) {
306             _PTR(SObject) child ( it->Value() );
307             if ( child->FindAttribute( anAttr, "AttributeIOR" ) ) {
308               _PTR(AttributeIOR) anIOR( anAttr );
309
310               // Delete child( s ) shape in Client :
311               const TCollection_AsciiString ASCior( (char*)anIOR->Value().c_str() ) ;
312               getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCior );
313
314               for ( view = views.first(); view; view = views.next() ) { 
315                 CORBA::Object_var corbaObj = (dynamic_cast<SALOMEDS_SObject*>(child.get()))->GetObject();
316                 GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
317                 if ( !CORBA::is_nil( geomObj ) )
318                   disp->Erase( geomObj, true, view );
319               }
320             }
321           } // for ( childres of obj )
322
323           // Erase main graphical object
324           for ( view = views.first(); view; view = views.next() ) 
325             disp->Erase( io, true, view );
326
327           // Delete main shape in Client :
328           if ( obj->FindAttribute( anAttr, "AttributeIOR" ) ) {
329             _PTR(AttributeIOR) anIOR( anAttr );
330             const TCollection_AsciiString ASCIor( (char*)anIOR->Value().c_str() ) ;
331             getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCIor );
332           }
333
334           // Remove objects from Study
335           aStudyBuilder->RemoveObject( obj );
336
337           CORBA::Object_var corbaObj = (dynamic_cast<SALOMEDS_SObject*>(obj.get()))->GetObject();
338           GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
339           if ( !CORBA::is_nil( geomObj ) )
340             GeometryGUI::GetGeomGen()->RemoveObject( geomObj );
341       
342           //deleted = true;
343         } // MAIN LOOP of selected
344         
345         selected.Clear();
346         aSelMgr->setSelectedObjects( selected );
347         getGeometryGUI()->updateObjBrowser();
348       } // if ( selected not empty )
349     } // if ( selMgr && appStudy )
350   } // if ( app )
351
352   //  if ( deleted )
353   //    op->finish();
354   //  else
355   //    op->abort();
356 }
357
358
359 //==============================================================================
360 // function : OnEditCopy()
361 // purpose  :
362 //==============================================================================
363 void GEOMToolsGUI::OnEditCopy()
364 {  
365 /* 
366  SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
367   GEOM::string_array_var listIOR = new GEOM::string_array;
368
369   const SALOME_ListIO& List = Sel->StoredIObjects();
370
371   myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR);
372
373   Sel->ClearIObjects();
374
375   SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
376   int aStudyID = aStudy->StudyId();    
377
378   for (unsigned int ind = 0; ind < listIOR->length();ind++) {
379     GEOM::GEOM_Object_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]);
380     try {
381       GEOM::GEOM_IInsertOperations_var IOp =  myGeom->GetIInsertOperations(aStudyID);
382       GEOM::GEOM_Object_var result = IOp->MakeCopy(aShapeInit) ;
383       myGeomBase->Display(result);
384     }
385     catch  (const SALOME::SALOME_Exception& S_ex) {
386       QtCatchCorbaException(S_ex);
387     }
388   }
389   
390   QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY"));
391 */
392 }
393
394
395 //=====================================================================================
396 // function : Import
397 // purpose  : BRep, Iges, Step
398 //=====================================================================================
399 bool GEOMToolsGUI::Import()
400 {
401   SUIT_Application* app = getGeometryGUI()->getApp();
402   if (! app) return false;
403  
404   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
405   if ( !stud ) {
406     cout << "FAILED to cast active study to SalomeApp_Study" << endl;
407     return false;
408   }
409   _PTR(Study) aStudy = stud->studyDS();
410
411   bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
412   if ( aLocked ) {
413     SUIT_MessageBox::warn1 ( app->desktop(),
414                             QObject::tr("WRN_WARNING"), 
415                             QObject::tr("WRN_STUDY_LOCKED"),
416                             QObject::tr("BUT_OK") );
417     return false;
418   }
419
420   GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
421   if ( CORBA::is_nil( eng ) ) {
422     SUIT_MessageBox::error1( app->desktop(), 
423                             QObject::tr("WRN_WARNING"),
424                             QObject::tr( "GEOM Engine is not started" ), 
425                             QObject::tr("BUT_OK") );
426       return false;
427     }
428
429   GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
430   if ( aInsOp->_is_nil() )
431     return false;
432   
433   GEOM::GEOM_Object_var anObj;
434
435   // Obtain a list of available import formats
436   FilterMap aMap;
437   GEOM::string_array_var aFormats, aPatterns;
438   aInsOp->ImportTranslators( aFormats, aPatterns );
439
440   for ( int i = 0, n = aFormats->length(); i < n; i++ ) 
441     aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
442
443   QString fileType;
444
445   QString file = getFileName(app->desktop(), "", aMap, tr("GEOM_MEN_IMPORT"), true, fileType );
446   if( file.isEmpty() || fileType.isEmpty() ) 
447     return false;
448   
449   GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() );
450   try {
451     SUIT_OverrideCursor wc;
452
453     app->putInfo( tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file( file, /*withExten=*/true )) );
454
455     anOp->start();
456
457     anObj = aInsOp->Import( file.latin1(), fileType.latin1() );  
458
459     if ( !anObj->_is_nil() && aInsOp->IsDone() ) {
460       anObj->SetName( GEOMBase::GetDefaultName( QObject::tr( "GEOM_IMPORT" ) ).latin1() );
461       QString aPublishObjName = GEOMBase::GetDefaultName( SUIT_Tools::file( file, /*withExten=*/true ));
462       GeometryGUI::GetGeomGen()->PublishInStudy(dynamic_cast<SALOMEDS_Study*>(aStudy.get())->GetStudy(), 
463                                                 SALOMEDS::SObject::_nil(), 
464                                                 anObj, 
465                                                 aPublishObjName );
466
467       GEOM_Displayer( stud ).Display( anObj.in() );
468
469       // update data model and object browser
470       getGeometryGUI()->updateObjBrowser( true );
471       
472       anOp->commit();      
473     }
474     else {
475       anOp->abort();
476       wc.suspend();
477       SUIT_MessageBox::error1( app->desktop(), 
478                               QObject::tr( "GEOM_ERROR" ),
479                               QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), 
480                               QObject::tr("BUT_OK") );
481     }
482   }
483   catch( const SALOME::SALOME_Exception& S_ex ) {
484     //QtCatchCorbaException(S_ex);
485     anOp->abort();
486     return false;
487   }
488
489   return true;
490 }
491
492
493 //=====================================================================================
494 // function : Export
495 // purpose  : BRep, Iges, Step
496 //=====================================================================================
497 bool GEOMToolsGUI::Export()
498 {
499   SalomeApp_Application* app = getGeometryGUI()->getApp();
500   if (!app) return false;
501   
502   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
503   if ( !stud ) {
504     cout << "FAILED to cast active study to SalomeApp_Study" << endl;
505     return false;
506   }
507   _PTR(Study) aStudy = stud->studyDS();
508   
509   GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
510   if ( CORBA::is_nil( eng ) ) {
511     SUIT_MessageBox::error1( app->desktop(), 
512                              QObject::tr("WRN_WARNING"),
513                              QObject::tr( "GEOM Engine is not started" ), 
514                              QObject::tr("BUT_OK") );
515     return false;
516   }
517   
518   GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
519   if ( aInsOp->_is_nil() )
520     return false;
521
522   // Obtain a list of available export formats
523   FilterMap aMap;
524   GEOM::string_array_var aFormats, aPatterns;
525   aInsOp->ExportTranslators( aFormats, aPatterns );
526   for ( int i = 0, n = aFormats->length(); i < n; i++ ) 
527     aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
528
529   // Get selected objects
530   SalomeApp_SelectionMgr* sm = app->selectionMgr();
531   if ( !sm )
532     return false;
533
534   SALOME_ListIO selectedObjects;
535   sm->selectedObjects( selectedObjects );
536
537   SALOME_ListIteratorOfListIO It( selectedObjects );
538   for(;It.More();It.Next()) {
539     Handle(SALOME_InteractiveObject) IObject = It.Value();
540     Standard_Boolean found;
541     GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found);
542
543     if ( !found || anObj->_is_nil() )
544       continue;
545     
546     QString fileType;
547     QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap, 
548                                tr("GEOM_MEN_EXPORT"), false, fileType);
549     
550     // User has pressed "Cancel" --> stop the operation
551     if ( file.isEmpty() || fileType.isEmpty() )
552       return false;
553     
554     GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() );
555     try {
556       SUIT_OverrideCursor wc;
557       
558       app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) );
559       
560       anOp->start();
561
562
563       aInsOp->Export( anObj, file, fileType.latin1() );
564
565       if ( aInsOp->IsDone() )
566         anOp->commit();
567       else
568         {
569           anOp->abort();
570           wc.suspend();
571           SUIT_MessageBox::error1( app->desktop(), 
572                                    QObject::tr( "GEOM_ERROR" ),
573                                    QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), 
574                                    QObject::tr("BUT_OK") );
575           return false;
576         }
577     }  
578     catch (const SALOME::SALOME_Exception& S_ex) {
579       //QtCatchCorbaException(S_ex);
580       anOp->abort();
581       return false;
582     }
583   }
584   
585   return true; 
586 }
587
588
589 QString GEOMToolsGUI::getParentComponent( _PTR( Study ) study, const SALOME_ListIO& iobjs )
590 {
591   QString parentComp;
592
593   for ( SALOME_ListIteratorOfListIO it( iobjs ); it.More(); it.Next() ) {
594
595     Handle(SALOME_InteractiveObject) io = it.Value();
596     if ( !io->hasEntry() ) 
597       continue;
598
599     QString compName = getParentComponent( study->FindObjectID( io->getEntry() ) );
600
601     if ( parentComp.isNull() )
602       parentComp = compName;
603     else if ( parentComp.compare( compName) != 0 ) { // objects belonging to different components are selected
604       parentComp = QString::null;
605       break;
606     }
607   }
608
609   return parentComp;
610 }
611
612 QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj )
613 {
614   if ( obj ) {
615     _PTR(SComponent) comp = obj->GetFatherComponent();
616     if ( comp ) {
617       _PTR(GenericAttribute) anAttr;
618       if ( comp->FindAttribute( anAttr, "AttributeName") ) {
619         _PTR(AttributeName) aName( anAttr );
620         return QString( aName->Value().c_str() );
621       }
622     }
623   }
624   return QString();
625 }
626
627 //=====================================================================================
628 // EXPORTED METHODS
629 //=====================================================================================
630 extern "C"
631 {
632   GEOMGUI* GetLibGUI( GeometryGUI* parent )
633   {
634     return new GEOMToolsGUI( parent );
635   }
636 }