Salome HOME
4efbfbbad598f31f00f9fc3c39dac89795f1c80c
[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.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //
23 //
24 //  File   : GEOMBase_Tools.cxx
25 //  Author : Damien COQUERET
26 //  Module : GEOM
27 //  $Header$
28
29 #include "GEOMToolsGUI.h"
30
31 #include "GeometryGUI.h"
32 #include "GEOM_Actor.h"
33 #include "GEOMBase.h"
34 #include "GEOM_Operation.h"
35 #include "GEOM_Displayer.h"
36
37 #include <SUIT_Session.h>
38 #include <SUIT_Application.h>
39 #include <SUIT_OverrideCursor.h>
40 #include <SUIT_MessageBox.h>
41 #include <SUIT_Tools.h>
42 #include <SUIT_FileDlg.h>
43 #include <SUIT_Desktop.h>
44 #include <SUIT_ViewModel.h>
45
46 #include <SalomeApp_Application.h>
47 #include <SalomeApp_Study.h>
48 #include <LightApp_SelectionMgr.h>
49
50 #include <SALOME_ListIteratorOfListIO.hxx>
51 #include <SALOME_Prs.h>
52
53 #include "utilities.h"
54
55 // QT Includes
56 #include <qapplication.h>
57 #include <qmap.h>
58
59 // OCCT Includes
60 #include <TCollection_AsciiString.hxx>
61
62 using namespace std;
63
64 typedef QMap<QString, QString> FilterMap;
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 =
231     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
232   if ( app ) {
233     LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
234     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
235     if ( aSelMgr && appStudy ) {
236       aSelMgr->selectedObjects( selected, QString::null, false );
237       if ( !selected.IsEmpty() ) {
238         _PTR(Study) aStudy = appStudy->studyDS();
239
240         bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
241         if ( aLocked ) {
242           SUIT_MessageBox::warn1 ( app->desktop(),
243                                    QObject::tr("WRN_WARNING"),
244                                    QObject::tr("WRN_STUDY_LOCKED"),
245                                    QObject::tr("BUT_OK") );
246           return;
247         }
248
249         // VSR 17/11/04: check if all objects selected belong to GEOM component --> start
250         // modifications of ASV 01.06.05
251         QString parentComp = getParentComponent( aStudy, selected );
252         const char* geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() );
253         QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR ) );
254
255         if ( parentComp != geomComp )  {
256           SUIT_MessageBox::warn1 ( app->desktop(),
257                                   QObject::tr("ERR_ERROR"),
258                                   QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ),
259                                   QObject::tr("BUT_OK") );
260           return;
261         }
262         // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish
263
264         if ( SUIT_MessageBox::warn2( app->desktop(),
265                                      QObject::tr( "GEOM_WRN_WARNING" ),
266                                      QObject::tr( "GEOM_REALLY_DELETE" ),
267                                      QObject::tr( "GEOM_BUT_YES" ),
268                                      QObject::tr( "GEOM_BUT_NO" ), 1, 0, 0 ) != 1 )
269           return;
270
271         //      QAD_Operation* op = new SALOMEGUI_ImportOperation(.....);
272         //      op->start();
273
274         // prepare list of SALOME_Views
275         QPtrList<SALOME_View> views;
276         SALOME_View* view;
277         // fill the list
278         ViewManagerList vmans = app->viewManagers();
279         SUIT_ViewManager* vman;
280         for ( vman = vmans.first(); vman; vman = vmans.next() ) {
281           SUIT_ViewModel* vmod = vman->getViewModel();
282           view = dynamic_cast<SALOME_View*> ( vmod ); // must work for OCC and VTK views
283           if ( view )
284             views.append( view );
285         }
286
287         _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder());
288         _PTR(GenericAttribute) anAttr;
289         GEOM_Displayer* disp = new GEOM_Displayer( appStudy );
290
291         _PTR(SComponent) aGeom ( aStudy->FindComponent("GEOM") );
292           if ( !aGeom )
293             return;     
294
295         // MAIN LOOP OF SELECTED OBJECTS
296         for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
297
298           Handle(SALOME_InteractiveObject) io = It.Value();
299           if ( !io->hasEntry() )
300             continue;
301
302           _PTR(SObject) obj ( aStudy->FindObjectID( io->getEntry() ) );
303
304           // disable removal of "Geometry" component object
305           if ( !strcmp( obj->GetIOR().c_str(), geomIOR ) )
306             continue;
307
308           //If the object has been used to create another one,then it can't be deleted 
309           _PTR(ChildIterator) it (aStudy->NewChildIterator(aGeom));
310           for ( it->InitEx( true ); it->More(); it->Next() ) {
311              _PTR(SObject) chobj (it->Value());
312              CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(chobj);
313              GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
314              if( CORBA::is_nil(geomObj) ) 
315                 continue;
316              GEOM::ListOfGO_var list = geomObj->GetDependency();
317              if( list->length() > 1 )
318                for(int i = 0; i < list->length(); i++ ){
319                  CORBA::Object_var corbaObj_rem = GeometryGUI::ClientSObjectToObject(obj);
320                  GEOM::GEOM_Object_var geomObj_rem = GEOM::GEOM_Object::_narrow( corbaObj_rem );
321                  if( list[i]->_is_equivalent( geomObj_rem ) ){
322                    SUIT_MessageBox::warn1 ( app->desktop(),
323                                             QObject::tr("WRN_WARNING"),
324                                             QObject::tr("DEP_OBJECT"),
325                                             QObject::tr("BUT_OK") );
326                    return;
327                 }
328               }
329            }
330
331           RemoveObjectWithChildren(obj, aStudy, views, disp);
332
333           // Remove objects from Study
334           aStudyBuilder->RemoveObject( obj );
335
336           //deleted = true;
337         } // MAIN LOOP of selected
338
339         selected.Clear();
340         aSelMgr->setSelectedObjects( selected );
341         getGeometryGUI()->updateObjBrowser();
342       } // if ( selected not empty )
343     } // if ( selMgr && appStudy )
344
345     app->updateActions(); //SRN: To update a Save button in the toolbar
346
347   } // if ( app )
348
349
350   //  if ( deleted )
351   //    op->finish();
352   //  else
353   //    op->abort();
354 }
355
356
357 //==============================================================================
358 // function : OnEditCopy()
359 // purpose  :
360 //==============================================================================
361 void GEOMToolsGUI::OnEditCopy()
362 {
363 /*
364  SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
365   GEOM::string_array_var listIOR = new GEOM::string_array;
366
367   const SALOME_ListIO& List = Sel->StoredIObjects();
368
369   myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR);
370
371   Sel->ClearIObjects();
372
373   SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
374   int aStudyID = aStudy->StudyId();
375
376   for (unsigned int ind = 0; ind < listIOR->length();ind++) {
377     GEOM::GEOM_Object_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]);
378     try {
379       GEOM::GEOM_IInsertOperations_var IOp =  myGeom->GetIInsertOperations(aStudyID);
380       GEOM::GEOM_Object_var result = IOp->MakeCopy(aShapeInit);
381       myGeomBase->Display(result);
382     }
383     catch  (const SALOME::SALOME_Exception& S_ex) {
384       QtCatchCorbaException(S_ex);
385     }
386   }
387
388   QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY"));
389 */
390 }
391
392
393 //=====================================================================================
394 // function : Import
395 // purpose  : BRep, Iges, Step
396 //=====================================================================================
397 bool GEOMToolsGUI::Import()
398 {
399   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() );
400   //SUIT_Application* app = getGeometryGUI()->getApp();
401   if (! app) return false;
402
403   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
404   if ( !stud ) {
405     cout << "FAILED to cast active study to SalomeApp_Study" << endl;
406     return false;
407   }
408   _PTR(Study) aStudy = stud->studyDS();
409
410   bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
411   if ( aLocked ) {
412     SUIT_MessageBox::warn1 ( app->desktop(),
413                             QObject::tr("WRN_WARNING"),
414                             QObject::tr("WRN_STUDY_LOCKED"),
415                             QObject::tr("BUT_OK") );
416     return false;
417   }
418
419   GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
420   if ( CORBA::is_nil( eng ) ) {
421     SUIT_MessageBox::error1( app->desktop(),
422                             QObject::tr("WRN_WARNING"),
423                             QObject::tr( "GEOM Engine is not started" ),
424                             QObject::tr("BUT_OK") );
425       return false;
426     }
427
428   GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
429   if ( aInsOp->_is_nil() )
430     return false;
431
432   GEOM::GEOM_Object_var anObj;
433
434   // Obtain a list of available import formats
435   FilterMap aMap;
436   GEOM::string_array_var aFormats, aPatterns;
437   aInsOp->ImportTranslators( aFormats, aPatterns );
438
439   for ( int i = 0, n = aFormats->length(); i < n; i++ )
440     aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
441
442   QString fileType;
443
444   QString fileName = getFileName(app->desktop(), "", aMap,
445                                  tr("GEOM_MEN_IMPORT"), true, fileType);
446
447   if (fileType.isEmpty() )
448     {
449       // Trying to detect file type
450       QFileInfo aFileInfo( fileName );
451       QString aPossibleType = (aFileInfo.extension(false)).upper() ;
452
453       if ( (aMap.values()).contains(aPossibleType) )
454         fileType = aPossibleType;
455     }
456
457   if (fileName.isEmpty() || fileType.isEmpty())
458     return false;
459
460   GEOM_Operation* anOp = new GEOM_Operation (app, aInsOp.in());
461   try {
462     SUIT_OverrideCursor wc;
463
464     app->putInfo(tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file(fileName, /*withExten=*/true)));
465
466     anOp->start();
467
468     CORBA::String_var fileN = fileName.latin1();
469     CORBA::String_var fileT = fileType.latin1();
470     anObj = aInsOp->Import(fileN, fileT);
471
472     if ( !anObj->_is_nil() && aInsOp->IsDone() ) {
473       anObj->SetName(GEOMBase::GetDefaultName(QObject::tr("GEOM_IMPORT")).latin1());
474       QString aPublishObjName =
475         GEOMBase::GetDefaultName(SUIT_Tools::file(fileName, /*withExten=*/true));
476
477       SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy(aStudy);
478       GeometryGUI::GetGeomGen()->PublishInStudy(aDSStudy,
479                                                 SALOMEDS::SObject::_nil(),
480                                                 anObj,
481                                                 aPublishObjName);
482
483       GEOM_Displayer( stud ).Display( anObj.in() );
484
485       // update data model and object browser
486       getGeometryGUI()->updateObjBrowser( true );
487
488       anOp->commit();
489     }
490     else {
491       anOp->abort();
492       wc.suspend();
493       SUIT_MessageBox::error1( app->desktop(),
494                               QObject::tr( "GEOM_ERROR" ),
495                               QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ),
496                               QObject::tr("BUT_OK") );
497     }
498   }
499   catch( const SALOME::SALOME_Exception& S_ex ) {
500     //QtCatchCorbaException(S_ex);
501     anOp->abort();
502     return false;
503   }
504
505   app->updateActions(); //SRN: To update a Save button in the toolbar
506
507   return true;
508 }
509
510
511 //=====================================================================================
512 // function : Export
513 // purpose  : BRep, Iges, Step
514 //=====================================================================================
515 bool GEOMToolsGUI::Export()
516 {
517   SalomeApp_Application* app = getGeometryGUI()->getApp();
518   if (!app) return false;
519
520   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
521   if ( !stud ) {
522     cout << "FAILED to cast active study to SalomeApp_Study" << endl;
523     return false;
524   }
525   _PTR(Study) aStudy = stud->studyDS();
526
527   GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
528   if ( CORBA::is_nil( eng ) ) {
529     SUIT_MessageBox::error1( app->desktop(),
530                              QObject::tr("WRN_WARNING"),
531                              QObject::tr( "GEOM Engine is not started" ),
532                              QObject::tr("BUT_OK") );
533     return false;
534   }
535
536   GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
537   if ( aInsOp->_is_nil() )
538     return false;
539
540   // Obtain a list of available export formats
541   FilterMap aMap;
542   GEOM::string_array_var aFormats, aPatterns;
543   aInsOp->ExportTranslators( aFormats, aPatterns );
544   for ( int i = 0, n = aFormats->length(); i < n; i++ )
545     aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
546
547   // Get selected objects
548   LightApp_SelectionMgr* sm = app->selectionMgr();
549   if ( !sm )
550     return false;
551
552   SALOME_ListIO selectedObjects;
553   sm->selectedObjects( selectedObjects );
554
555   SALOME_ListIteratorOfListIO It( selectedObjects );
556   for(;It.More();It.Next()) {
557     Handle(SALOME_InteractiveObject) IObject = It.Value();
558     Standard_Boolean found;
559     GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found);
560
561     if ( !found || anObj->_is_nil() )
562       continue;
563
564     QString fileType;
565     QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap,
566                                tr("GEOM_MEN_EXPORT"), false, fileType);
567
568     // User has pressed "Cancel" --> stop the operation
569     if ( file.isEmpty() || fileType.isEmpty() )
570       return false;
571
572     GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() );
573     try {
574       SUIT_OverrideCursor wc;
575
576       app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) );
577
578       anOp->start();
579
580
581       aInsOp->Export( anObj, file, fileType.latin1() );
582
583       if ( aInsOp->IsDone() )
584         anOp->commit();
585       else
586         {
587           anOp->abort();
588           wc.suspend();
589           SUIT_MessageBox::error1( app->desktop(),
590                                    QObject::tr( "GEOM_ERROR" ),
591                                    QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ),
592                                    QObject::tr("BUT_OK") );
593           return false;
594         }
595     }
596     catch (const SALOME::SALOME_Exception& S_ex) {
597       //QtCatchCorbaException(S_ex);
598       anOp->abort();
599       return false;
600     }
601   }
602
603   return true;
604 }
605
606
607 QString GEOMToolsGUI::getParentComponent( _PTR( Study ) study, const SALOME_ListIO& iobjs )
608 {
609   QString parentComp;
610
611   for ( SALOME_ListIteratorOfListIO it( iobjs ); it.More(); it.Next() ) {
612
613     Handle(SALOME_InteractiveObject) io = it.Value();
614     if ( !io->hasEntry() )
615       continue;
616
617     QString compName = getParentComponent( study->FindObjectID( io->getEntry() ) );
618
619     if ( parentComp.isNull() )
620       parentComp = compName;
621     else if ( parentComp.compare( compName) != 0 ) { // objects belonging to different components are selected
622       parentComp = QString::null;
623       break;
624     }
625   }
626
627   return parentComp;
628 }
629
630 QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj )
631 {
632   if ( obj ) {
633     _PTR(SComponent) comp = obj->GetFatherComponent();
634     if ( comp ) {
635       _PTR(GenericAttribute) anAttr;
636       if ( comp->FindAttribute( anAttr, "AttributeName") ) {
637         _PTR(AttributeName) aName( anAttr );
638         return QString( aName->Value().c_str() );
639       }
640     }
641   }
642   return QString();
643 }
644
645 //=====================================================================================
646 // function : RemoveObjectWithChildren
647 // purpose  : to be used by OnEditDelete() method
648 //=====================================================================================
649 void GEOMToolsGUI::RemoveObjectWithChildren(_PTR(SObject) obj,
650                                             _PTR(Study) aStudy,
651                                             QPtrList<SALOME_View> views,
652                                             GEOM_Displayer* disp)
653 {
654   // iterate through all children of obj
655   for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) {
656     _PTR(SObject) child (it->Value());
657     RemoveObjectWithChildren(child, aStudy, views, disp);
658   }
659
660   // erase object and remove it from engine
661   _PTR(GenericAttribute) anAttr;
662   if (obj->FindAttribute(anAttr, "AttributeIOR")) {
663     _PTR(AttributeIOR) anIOR (anAttr);
664
665     // Delete shape in Client
666     const TCollection_AsciiString ASCIor ((char*)anIOR->Value().c_str());
667     getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCIor);
668
669     CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj);
670     GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
671     if (!CORBA::is_nil(geomObj)) {
672       // Erase graphical object
673       SALOME_View* view = views.first();
674       for (; view; view = views.next()) {
675         disp->Erase(geomObj, true, view);
676       }
677
678       // Remove object from Engine
679       GeometryGUI::GetGeomGen()->RemoveObject( geomObj );
680     }
681   }
682 }
683
684 //=====================================================================================
685 // EXPORTED METHODS
686 //=====================================================================================
687 extern "C"
688 {
689 #ifdef WNT
690         __declspec( dllexport )
691 #endif
692   GEOMGUI* GetLibGUI( GeometryGUI* parent )
693   {
694     return new GEOMToolsGUI( parent );
695   }
696 }