1 // GEOM GEOMGUI : GUI for Geometry component
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 // File : GEOMBase_Tools.cxx
25 // Author : Damien COQUERET
29 #include "GEOMToolsGUI.h"
31 #include "GeometryGUI.h"
32 #include "GEOM_Actor.h"
34 #include "GEOM_Operation.h"
35 #include "GEOM_Displayer.h"
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>
46 #include <SalomeApp_Application.h>
47 #include <SalomeApp_Study.h>
48 #include <LightApp_SelectionMgr.h>
50 #include <SALOME_ListIteratorOfListIO.hxx>
51 #include <SALOME_Prs.h>
53 #include "utilities.h"
56 #include <qapplication.h>
60 #include <TCollection_AsciiString.hxx>
64 typedef QMap<QString, QString> FilterMap;
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,
78 static QString lastUsedFilter;
80 for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it )
81 filters.push_back( it.key() );
83 SUIT_FileDlg* fd = new SUIT_FileDlg( parent, open, true, true );
84 if ( !caption.isEmpty() )
85 fd->setCaption( caption );
87 if ( !initial.isEmpty() )
88 fd->setSelection( initial );
90 if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) )
91 fd->setSelectedFilter( lastUsedFilter );
93 fd->setFilters( filters );
96 QString filename = fd->selectedFile();
97 format = filterMap[fd->selectedFilter()];
98 lastUsedFilter = fd->selectedFilter();
100 qApp->processEvents();
104 //=======================================================================
105 // function : GEOMToolsGUI()
106 // purpose : Constructor
107 //=======================================================================
108 GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent )
114 //=======================================================================
115 // function : ~GEOMToolsGUI()
116 // purpose : Destructor
117 //=======================================================================
118 GEOMToolsGUI::~GEOMToolsGUI()
123 //=======================================================================
124 // function : OnGUIEvent()
126 //=======================================================================
127 bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
129 getGeometryGUI()->EmitSignalDeactivateDialog();
131 switch (theCommandID)
143 case 111: // IMPORT BREP
144 case 112: // IMPORT IGES
145 case 113: // IMPORT STEP
150 case 121: // EXPORT BREP
151 case 122: // EXPORT IGES
152 case 123: // EXPORT STEP
157 case 411: // SETTINGS - ADD IN STUDY
159 // SAN -- TO BE REMOVED !!!
162 case 412: // SETTINGS - SHADING COLOR
167 case 413: // SETTINGS - ISOS
172 case 414: // SETTINGS : STEP VALUE FOR SPIN BOXES
177 case 804: // ADD IN STUDY - POPUP VIEWER
179 // SAN -- TO BE REMOVED !!!!
187 case 5103: // CHECK GEOMETRY
192 case 8032: // COLOR - POPUP VIEWER
197 case 8033: // TRANSPARENCY - POPUP VIEWER
202 case 8034: // ISOS - POPUP VIEWER
207 case 9024 : // OPEN - OBJBROSER POPUP
214 SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID));
223 //===============================================================================
224 // function : OnEditDelete()
226 //===============================================================================
227 void GEOMToolsGUI::OnEditDelete()
229 SALOME_ListIO selected;
230 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
232 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
233 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
234 if ( aSelMgr && appStudy ) {
235 aSelMgr->selectedObjects( selected, QString::null, false );
236 if ( !selected.IsEmpty() ) {
237 _PTR(Study) aStudy = appStudy->studyDS();
239 bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
241 SUIT_MessageBox::warn1 ( app->desktop(),
242 QObject::tr("WRN_WARNING"),
243 QObject::tr("WRN_STUDY_LOCKED"),
244 QObject::tr("BUT_OK") );
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 ) );
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") );
261 // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish
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_BUT_NO" ), 1, 0, 0 ) != 1 )
270 // QAD_Operation* op = new SALOMEGUI_ImportOperation(.....);
273 // prepare list of SALOME_Views
274 QPtrList<SALOME_View> views;
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
283 views.append( view );
286 _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder());
287 _PTR(GenericAttribute) anAttr;
288 GEOM_Displayer* disp = new GEOM_Displayer( appStudy );
290 // MAIN LOOP OF SELECTED OBJECTS
291 for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
293 Handle(SALOME_InteractiveObject) io = It.Value();
294 if ( !io->hasEntry() )
297 _PTR(SObject) obj ( aStudy->FindObjectID( io->getEntry() ) );
299 // disable removal of "Geometry" component object
300 if ( !strcmp( obj->GetIOR().c_str(), geomIOR ) )
303 // iterate through all children of obj, find IOR attributes on children
304 // and remove shapes that 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);
310 // Delete child( s ) shape in Client :
311 const TCollection_AsciiString ASCior ((char*)anIOR->Value().c_str());
312 getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCior);
314 CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(child);
315 GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow(corbaObj);
316 if (!CORBA::is_nil(geomObj)) {
317 for (view = views.first(); view; view = views.next()) {
318 disp->Erase(geomObj, true, view);
322 } // for ( children of obj )
324 // Erase main graphical object
325 for ( view = views.first(); view; view = views.next() )
326 disp->Erase( io, true, view );
328 // Delete main shape in Client :
329 if ( obj->FindAttribute( anAttr, "AttributeIOR" ) ) {
330 _PTR(AttributeIOR) anIOR( anAttr );
331 const TCollection_AsciiString ASCIor( (char*)anIOR->Value().c_str() );
332 getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCIor );
335 CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj);
336 GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
337 if ( !CORBA::is_nil( geomObj ) )
338 GeometryGUI::GetGeomGen()->RemoveObject( geomObj );
340 // Remove objects from Study
341 aStudyBuilder->RemoveObject( obj );
344 } // MAIN LOOP of selected
347 aSelMgr->setSelectedObjects( selected );
348 getGeometryGUI()->updateObjBrowser();
349 } // if ( selected not empty )
350 } // if ( selMgr && appStudy )
352 app->updateActions(); //SRN: To update a Save button in the toolbar
364 //==============================================================================
365 // function : OnEditCopy()
367 //==============================================================================
368 void GEOMToolsGUI::OnEditCopy()
371 SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
372 GEOM::string_array_var listIOR = new GEOM::string_array;
374 const SALOME_ListIO& List = Sel->StoredIObjects();
376 myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR);
378 Sel->ClearIObjects();
380 SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
381 int aStudyID = aStudy->StudyId();
383 for (unsigned int ind = 0; ind < listIOR->length();ind++) {
384 GEOM::GEOM_Object_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]);
386 GEOM::GEOM_IInsertOperations_var IOp = myGeom->GetIInsertOperations(aStudyID);
387 GEOM::GEOM_Object_var result = IOp->MakeCopy(aShapeInit);
388 myGeomBase->Display(result);
390 catch (const SALOME::SALOME_Exception& S_ex) {
391 QtCatchCorbaException(S_ex);
395 QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY"));
400 //=====================================================================================
402 // purpose : BRep, Iges, Step
403 //=====================================================================================
404 bool GEOMToolsGUI::Import()
406 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() );
407 //SUIT_Application* app = getGeometryGUI()->getApp();
408 if (! app) return false;
410 SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
412 cout << "FAILED to cast active study to SalomeApp_Study" << endl;
415 _PTR(Study) aStudy = stud->studyDS();
417 bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked();
419 SUIT_MessageBox::warn1 ( app->desktop(),
420 QObject::tr("WRN_WARNING"),
421 QObject::tr("WRN_STUDY_LOCKED"),
422 QObject::tr("BUT_OK") );
426 GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
427 if ( CORBA::is_nil( eng ) ) {
428 SUIT_MessageBox::error1( app->desktop(),
429 QObject::tr("WRN_WARNING"),
430 QObject::tr( "GEOM Engine is not started" ),
431 QObject::tr("BUT_OK") );
435 GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
436 if ( aInsOp->_is_nil() )
439 GEOM::GEOM_Object_var anObj;
441 // Obtain a list of available import formats
443 GEOM::string_array_var aFormats, aPatterns;
444 aInsOp->ImportTranslators( aFormats, aPatterns );
446 for ( int i = 0, n = aFormats->length(); i < n; i++ )
447 aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
451 QString fileName = getFileName(app->desktop(), "", aMap,
452 tr("GEOM_MEN_IMPORT"), true, fileType);
454 if (fileType.isEmpty() )
456 // Trying to detect file type
457 QFileInfo aFileInfo( fileName );
458 QString aPossibleType = (aFileInfo.extension(false)).upper() ;
460 if ( (aMap.values()).contains(aPossibleType) )
461 fileType = aPossibleType;
464 if (fileName.isEmpty() || fileType.isEmpty())
467 GEOM_Operation* anOp = new GEOM_Operation (app, aInsOp.in());
469 SUIT_OverrideCursor wc;
471 app->putInfo(tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file(fileName, /*withExten=*/true)));
475 CORBA::String_var fileN = fileName.latin1();
476 CORBA::String_var fileT = fileType.latin1();
477 anObj = aInsOp->Import(fileN, fileT);
479 if ( !anObj->_is_nil() && aInsOp->IsDone() ) {
480 anObj->SetName(GEOMBase::GetDefaultName(QObject::tr("GEOM_IMPORT")).latin1());
481 QString aPublishObjName =
482 GEOMBase::GetDefaultName(SUIT_Tools::file(fileName, /*withExten=*/true));
484 SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy(aStudy);
485 GeometryGUI::GetGeomGen()->PublishInStudy(aDSStudy,
486 SALOMEDS::SObject::_nil(),
490 GEOM_Displayer( stud ).Display( anObj.in() );
492 // update data model and object browser
493 getGeometryGUI()->updateObjBrowser( true );
500 SUIT_MessageBox::error1( app->desktop(),
501 QObject::tr( "GEOM_ERROR" ),
502 QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ),
503 QObject::tr("BUT_OK") );
506 catch( const SALOME::SALOME_Exception& S_ex ) {
507 //QtCatchCorbaException(S_ex);
512 app->updateActions(); //SRN: To update a Save button in the toolbar
518 //=====================================================================================
520 // purpose : BRep, Iges, Step
521 //=====================================================================================
522 bool GEOMToolsGUI::Export()
524 SalomeApp_Application* app = getGeometryGUI()->getApp();
525 if (!app) return false;
527 SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
529 cout << "FAILED to cast active study to SalomeApp_Study" << endl;
532 _PTR(Study) aStudy = stud->studyDS();
534 GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen();
535 if ( CORBA::is_nil( eng ) ) {
536 SUIT_MessageBox::error1( app->desktop(),
537 QObject::tr("WRN_WARNING"),
538 QObject::tr( "GEOM Engine is not started" ),
539 QObject::tr("BUT_OK") );
543 GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() );
544 if ( aInsOp->_is_nil() )
547 // Obtain a list of available export formats
549 GEOM::string_array_var aFormats, aPatterns;
550 aInsOp->ExportTranslators( aFormats, aPatterns );
551 for ( int i = 0, n = aFormats->length(); i < n; i++ )
552 aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] );
554 // Get selected objects
555 LightApp_SelectionMgr* sm = app->selectionMgr();
559 SALOME_ListIO selectedObjects;
560 sm->selectedObjects( selectedObjects );
562 SALOME_ListIteratorOfListIO It( selectedObjects );
563 for(;It.More();It.Next()) {
564 Handle(SALOME_InteractiveObject) IObject = It.Value();
565 Standard_Boolean found;
566 GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found);
568 if ( !found || anObj->_is_nil() )
572 QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap,
573 tr("GEOM_MEN_EXPORT"), false, fileType);
575 // User has pressed "Cancel" --> stop the operation
576 if ( file.isEmpty() || fileType.isEmpty() )
579 GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() );
581 SUIT_OverrideCursor wc;
583 app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) );
588 aInsOp->Export( anObj, file, fileType.latin1() );
590 if ( aInsOp->IsDone() )
596 SUIT_MessageBox::error1( app->desktop(),
597 QObject::tr( "GEOM_ERROR" ),
598 QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ),
599 QObject::tr("BUT_OK") );
603 catch (const SALOME::SALOME_Exception& S_ex) {
604 //QtCatchCorbaException(S_ex);
614 QString GEOMToolsGUI::getParentComponent( _PTR( Study ) study, const SALOME_ListIO& iobjs )
618 for ( SALOME_ListIteratorOfListIO it( iobjs ); it.More(); it.Next() ) {
620 Handle(SALOME_InteractiveObject) io = it.Value();
621 if ( !io->hasEntry() )
624 QString compName = getParentComponent( study->FindObjectID( io->getEntry() ) );
626 if ( parentComp.isNull() )
627 parentComp = compName;
628 else if ( parentComp.compare( compName) != 0 ) { // objects belonging to different components are selected
629 parentComp = QString::null;
637 QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj )
640 _PTR(SComponent) comp = obj->GetFatherComponent();
642 _PTR(GenericAttribute) anAttr;
643 if ( comp->FindAttribute( anAttr, "AttributeName") ) {
644 _PTR(AttributeName) aName( anAttr );
645 return QString( aName->Value().c_str() );
652 //=====================================================================================
654 //=====================================================================================
658 __declspec( dllexport )
660 GEOMGUI* GetLibGUI( GeometryGUI* parent )
662 return new GEOMToolsGUI( parent );