X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMToolsGUI%2FGEOMToolsGUI.cxx;h=5fe45f595bd1ea0b289b927d4eea2b09bdbe1e93;hb=58803ba33ee53a5944d565373782e5f0868c5461;hp=594d197d69e696321639aa2a3d49aacc16a0337e;hpb=732211808796539fcf1de34e06038e7fb015ece9;p=modules%2Fgeom.git diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 594d197d6..5fe45f595 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -1,121 +1,191 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : GEOMBase_Tools.cxx -// Author : Damien COQUERET -// Module : GEOM -// $Header$ + +// GEOM GEOMGUI : GUI for Geometry component +// File : GEOMBase_Tools.cxx +// Author : Damien COQUERET, Open CASCADE S.A.S. #include "GEOMToolsGUI.h" -#include "GeometryGUI.h" -#include "GEOM_Actor.h" -#include "GEOMBase.h" -#include "GEOM_Operation.h" -#include "GEOM_Displayer.h" +#include "GEOMToolsGUI_DeleteDlg.h" + +#include +#include "GeometryGUI_Operations.h" +#include +#include +#include #include -#include #include #include #include #include #include +#include +#include #include #include +#include +#include -//#include "OCCViewer_Viewer3d.h" -//#include "VTKViewer_ViewWindow.h" -//#include "VTKViewer_RenderWindowInteractor.h" +#include +#include -#include "SALOME_ListIteratorOfListIO.hxx" -//#include "SALOMEGUI_ImportOperation.h" -//#include "SALOMEGUI_QtCatchCorbaException.hxx" +// QT Includes +#include +#include +#include -#include -#include +// OCCT Includes +#include -#include "utilities.h" +typedef QMap FilterMap; +static QString lastUsedFilter; + +//======================================================================= +// function : getParentComponent +// purpose : Get object's parent component entry +//======================================================================= +static QString getParentComponent( _PTR( SObject ) obj ) +{ + if ( obj ) { + _PTR(SComponent) comp = obj->GetFatherComponent(); + if ( comp ) + return QString( comp->GetID().c_str() ); + } + return QString(); +} -using namespace std; +//===================================================================================== +// function : inUse +// purpose : check if the object(s) passed as the the second arguments are used +// by the other objects in the study +//===================================================================================== +static bool inUse( _PTR(Study) study, const QString& component, const QMap& objects ) +{ + _PTR(SObject) comp = study->FindObjectID( component.toLatin1().data() ); + if ( !comp ) + return false; -typedef QMap FilterMap; + // collect all GEOM objects being deleted + QMap gobjects; + QMap::ConstIterator oit; + std::list<_PTR(SObject)> aSelectedSO; + for ( oit = objects.begin(); oit != objects.end(); ++oit ) { + _PTR(SObject) so = study->FindObjectID( oit.key().toLatin1().data() ); + if ( !so ) + continue; + aSelectedSO.push_back(so); + CORBA::Object_var corbaObj_rem = GeometryGUI::ClientSObjectToObject( so ); + GEOM::GEOM_BaseObject_var geomObj_rem = GEOM::GEOM_BaseObject::_narrow( corbaObj_rem ); + if( CORBA::is_nil( geomObj_rem ) ) + continue; + gobjects.insert( oit.key(), geomObj_rem ); + } -#include "SALOMEDSClient.hxx" -#include "SALOMEDS_SObject.hxx" -#include "SALOMEDS_Study.hxx" + // Search References with other Modules + std::list< _PTR(SObject) >::iterator itSO = aSelectedSO.begin(); + for ( ; itSO != aSelectedSO.end(); ++itSO ) { + std::vector<_PTR(SObject)> aReferences = study->FindDependances( *itSO ); + int aRefLength = aReferences.size(); + if (aRefLength) { + for (int i = 0; i < aRefLength; i++) { + _PTR(SObject) firstSO( aReferences[i] ); + _PTR(SComponent) aComponent = firstSO->GetFatherComponent(); + QString type = aComponent->ComponentDataType().c_str(); + if ( type == "SMESH" ) + return true; + } + } + } + // browse through all GEOM data tree + _PTR(ChildIterator) it ( study->NewChildIterator( comp ) ); + for ( it->InitEx( true ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child ); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if( CORBA::is_nil( geomObj ) ) + continue; + GEOM::ListOfGBO_var list = geomObj->GetDependency(); + if( list->length() == 0 ) + continue; + for( int i = 0; i < list->length(); i++ ) { + bool depends = false; + bool deleted = false; + QMap::Iterator git; + for ( git = gobjects.begin(); git != gobjects.end() && ( !depends || !deleted ); ++git ) { + depends = depends || list[i]->_is_equivalent( *git ); + deleted = deleted || git.key() == child->GetID().c_str() ;//geomObj->_is_equivalent( *git ); + } + if ( depends && !deleted ) + return true; + } + } + return false; +} //======================================================================= -// function : getFileName -// purpose : Selection of a file name for Import/Export. Returns also -// the selected file type code through argument. +// function : getGeomChildrenAndFolders +// purpose : Get direct (1-level) GEOM objects under each folder, sub-folder, etc. and these folders itself //======================================================================= -static QString getFileName( QWidget* parent, - const QString& initial, - const FilterMap& filterMap, - const QString& caption, - bool open, - QString& format ) -{ - static QString lastUsedFilter; - QStringList filters; - for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it ) - filters.push_back( it.key() ); - - SUIT_FileDlg* fd = new SUIT_FileDlg( parent, open, true, true ); - if ( !caption.isEmpty() ) - fd->setCaption( caption ); - - if ( !initial.isEmpty() ) - fd->setSelection( initial ); - - if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) - fd->setSelectedFilter( lastUsedFilter ); - - fd->setFilters( filters ); - - fd->exec(); - QString filename = fd->selectedFile(); - format = filterMap[fd->selectedFilter()]; - lastUsedFilter = fd->selectedFilter(); - delete fd; - qApp->processEvents(); - return filename; +static void getGeomChildrenAndFolders( _PTR(SObject) theSO, + QMap& geomObjList, + QMap& folderList ) { + if ( !theSO ) return; + _PTR(Study) aStudy = theSO->GetStudy(); + if ( !aStudy ) return; + _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); + + bool isFolder = false; + _PTR(GenericAttribute) anAttr; + if ( theSO->FindAttribute(anAttr, "AttributeLocalID") ) { + _PTR(AttributeLocalID) aLocalID( anAttr ); + isFolder = aLocalID->Value() == 999; + } + QString anEntry = theSO->GetID().c_str(); + QString aName = theSO->GetName().c_str(); + if ( isFolder ) { + folderList.insert( anEntry, aName ); + _PTR(UseCaseIterator) ucit ( aUseCaseBuilder->GetUseCaseIterator( theSO ) ); + for ( ucit->Init( false ); ucit->More(); ucit->Next() ) { + getGeomChildrenAndFolders( ucit->Value(), geomObjList, folderList ); + } + } else { + geomObjList.insert( anEntry, aName ); + } } //======================================================================= // function : GEOMToolsGUI() // purpose : Constructor //======================================================================= -GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) +GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) : GEOMGUI( parent ) { } - //======================================================================= // function : ~GEOMToolsGUI() // purpose : Destructor @@ -124,110 +194,149 @@ GEOMToolsGUI::~GEOMToolsGUI() { } - //======================================================================= // function : OnGUIEvent() -// purpose : +// purpose : //======================================================================= bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) { getGeometryGUI()->EmitSignalDeactivateDialog(); - switch (theCommandID) - { - case 31: // COPY - { - OnEditCopy(); - break; - } - case 33: // DELETE - { - OnEditDelete(); - break; - } - case 111: // IMPORT BREP - case 112: // IMPORT IGES - case 113: // IMPORT STEP - { - Import(); - break; - } - case 121: // EXPORT BREP - case 122: // EXPORT IGES - case 123: // EXPORT STEP - { - Export(); - break; - } - case 411: // SETTINGS - ADD IN STUDY - { - // SAN -- TO BE REMOVED !!! - break; - } - case 412: // SETTINGS - SHADING COLOR - { - OnSettingsColor(); - break; - } - case 413: // SETTINGS - ISOS - { - OnSettingsIsos(); - break; - } - case 414: // SETTINGS : STEP VALUE FOR SPIN BOXES - { - OnSettingsStep(); - break; - } - case 804: // ADD IN STUDY - POPUP VIEWER - { - // SAN -- TO BE REMOVED !!!! - break; - } - case 901: // RENAME - { - OnRename(); - break; - } - case 5103: // CHECK GEOMETRY - { - OnCheckGeometry(); - break; - } - case 5104: // LOAD SCRIPT - { - OnLoadScript(); - break; - } - case 8032: // COLOR - POPUP VIEWER - { - OnColor(); - break; - } - case 8033: // TRANSPARENCY - POPUP VIEWER - { - OnTransparency(); - break; - } - case 8034: // ISOS - POPUP VIEWER - { - OnNbIsos(); - break; - } - case 9024 : // OPEN - OBJBROSER POPUP - { - OnOpen(); - break; - } - default: - { - SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); - break; - } - } + switch ( theCommandID ) { + case GEOMOp::OpDelete: // EDIT - DELETE + OnEditDelete(); + break; + case GEOMOp::OpCheckGeom: // TOOLS - CHECK GEOMETRY + OnCheckGeometry(); + break; + case GEOMOp::OpSelectVertex: // POPUP - SELECT ONLY - VERTEX + OnSelectOnly( GEOM_POINT ); + break; + case GEOMOp::OpSelectEdge: // POPUP - SELECT ONLY - EDGE + OnSelectOnly( GEOM_EDGE ); + break; + case GEOMOp::OpSelectWire: // POPUP - SELECT ONLY - WIRE + OnSelectOnly( GEOM_WIRE ); + break; + case GEOMOp::OpSelectFace: // POPUP - SELECT ONLY - FACE + OnSelectOnly( GEOM_FACE ); + break; + case GEOMOp::OpSelectShell: // POPUP - SELECT ONLY - SHELL + OnSelectOnly( GEOM_SHELL ); + break; + case GEOMOp::OpSelectSolid: // POPUP - SELECT ONLY - SOLID + OnSelectOnly( GEOM_SOLID ); + break; + case GEOMOp::OpSelectCompound: // POPUP - SELECT ONLY - COMPOUND + OnSelectOnly( GEOM_COMPOUND ); + break; + case GEOMOp::OpSelectAll: // POPUP - SELECT ONLY - SELECT ALL + OnSelectOnly( GEOM_ALLOBJECTS ); + break; + case GEOMOp::OpDeflection: // POPUP - DEFLECTION ANGLE + OnDeflection(); + break; + case GEOMOp::OpColor: // POPUP - COLOR + OnColor(); + break; + case GEOMOp::OpSetTexture: // POPUP - TEXTURE + OnTexture(); + break; + case GEOMOp::OpTransparency: // POPUP - TRANSPARENCY + OnTransparency(); + break; + case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY + OnChangeTransparency( true ); + break; + case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY + OnChangeTransparency( false ); + break; + case GEOMOp::OpIsos: // POPUP - ISOS + OnNbIsos(); + break; + case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOLINES + OnNbIsos( INCR ); + break; + case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOLINES + OnNbIsos( DECR ); + break; + case GEOMOp::OpMaterialProperties: // POPUP - MATERIAL PROPERTIES + OnMaterialProperties(); + break; + case GEOMOp::OpPredefMaterCustom: // POPUP - MATERIAL PROPERTIES - CUSTOM... + OnMaterialProperties(); + break; + case GEOMOp::OpMaterialsLibrary: // POPUP MENU - MATERIAL PROPERTIES + OnMaterialsLibrary(); + break; + case GEOMOp::OpAutoColor: // POPUP - AUTO COLOR + OnAutoColor(); + break; + case GEOMOp::OpNoAutoColor: // POPUP - DISABLE AUTO COLOR + OnDisableAutoColor(); + break; + case GEOMOp::OpDiscloseChildren: // POPUP - SHOW CHILDREN + case GEOMOp::OpConcealChildren: // POPUP - HIDE CHILDREN + OnDiscloseConcealChildren( theCommandID == GEOMOp::OpDiscloseChildren ); + break; + case GEOMOp::OpPointMarker: // POPUP - POINT MARKER + OnPointMarker(); + break; + case GEOMOp::OpUnpublishObject:// POPUP - UNPUBLISH + OnUnpublishObject(); + break; + case GEOMOp::OpPublishObject:// GEOM ROOT OBJECT - POPUP - PUBLISH + OnPublishObject(); + break; + case GEOMOp::OpEdgeWidth: + OnEdgeWidth(); + break; + case GEOMOp::OpIsosWidth: + OnIsosWidth(); + break; + case GEOMOp::OpBringToFront: + OnBringToFront(); + break; + case GEOMOp::OpClsBringToFront: + OnClsBringToFront(); + break; + case GEOMOp::OpCreateFolder: + OnCreateFolder(); + break; + case GEOMOp::OpSortChildren: + OnSortChildren(); + break; + case GEOMOp::OpShowDependencyTree: + OnShowDependencyTree(); + break; + case GEOMOp::OpReduceStudy: + OnReduceStudy(); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } return true; } +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent, const QVariant& theParam ) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + + switch ( theCommandID ) { + case GEOMOp::OpPredefMaterial: // POPUP MENU - MATERIAL PROPERTIES - + OnSetMaterial( theParam ); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } + return true; +} //=============================================================================== // function : OnEditDelete() @@ -235,335 +344,245 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) //=============================================================================== void GEOMToolsGUI::OnEditDelete() { -/* - SALOME_Selection* Sel = SALOME_Selection::Selection( - QAD_Application::getDesktop()->getActiveStudy()->getSelection() ); - - if ( Sel->IObjectCount() == 0 ) - return; - - _PTR(Study) aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - - bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked(); - if ( aLocked ) { - QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED"), - QObject::tr("BUT_OK") ); + SALOME_ListIO selected; + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; - } - // VSR 17/11/04: check if all objects selected belong to GEOM component --> start - QString aParentComponent = ((SALOMEGUI_Desktop*)QAD_Application::getDesktop())->getComponentFromSelection(); - if ( aParentComponent != QAD_Application::getDesktop()->getActiveComponent() ) { - QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), - QObject::tr("ERR_ERROR"), - QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg(QAD_Application::getDesktop()->getComponentUserName( "GEOM" )), - QObject::tr("BUT_OK") ); + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !aSelMgr || !appStudy ) return; - } - // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish - if ( QAD_MessageBox::warn2( QAD_Application::getDesktop(), - tr( "GEOM_WRN_WARNING" ), - tr( "GEOM_REALLY_DELETE" ), - tr( "GEOM_BUT_YES" ), - tr( "GEOM_BUT_NO" ), 1, 0, 0 ) != 1 ) + // get selection + aSelMgr->selectedObjects( selected, "ObjectBrowser", false ); + if ( selected.IsEmpty() ) return; - int nbSf = QAD_Application::getDesktop()->getActiveStudy()->getStudyFramesCount(); + _PTR(Study) aStudy = appStudy->studyDS(); + _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); - Standard_Boolean found; - _PTR(GenericAttribute) anAttr; + // check if study is locked + if ( _PTR(AttributeStudyProperties)( aStudy->GetProperties() )->IsLocked() ) { + SUIT_MessageBox::warning( app->desktop(), + tr("WRN_WARNING"), + tr("WRN_STUDY_LOCKED") ); + return; // study is locked + } - SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); - - QAD_Operation* op = new SALOMEGUI_ImportOperation( QAD_Application::getDesktop()->getActiveStudy() ); + // get GEOM component + CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() ); + QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR.in() ) ); + + // check each selected object: if belongs to GEOM, if not reference... + QMap toBeDeleted; + QMap allDeleted; + QMap toBeDelFolders; + bool isComponentSelected = false; + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + Handle(SALOME_InteractiveObject) anIObject = It.Value(); + if ( !anIObject->hasEntry() ) + continue; // invalid object + // ... + QString entry = anIObject->getEntry(); + _PTR(SObject) obj = aStudy->FindObjectID( entry.toLatin1().data() ); + // check parent component + QString parentComp = getParentComponent( obj ); + if ( parentComp != geomComp ) { + SUIT_MessageBox::warning( app->desktop(), + QObject::tr("ERR_ERROR"), + QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ) ); + return; // not GEOM object selected + } - op->start(); - - Standard_Boolean deleted = false; - - for ( ;It.More();It.Next() ) - { - Handle( SALOME_InteractiveObject ) IObject = It.Value(); - - if ( !IObject->hasEntry() ) + /////////////////////////////////////////////////////// + // if GEOM component is selected, so skip other checks + if ( isComponentSelected ) continue; + /////////////////////////////////////////////////////// + + // check if object is reference + _PTR(SObject) refobj; + if ( obj && obj->ReferencedObject( refobj ) ) { + // get the main object by reference IPAL 21354 + obj = refobj; + entry = obj->GetID().c_str(); + } + // ... + QString aName = obj->GetName().c_str(); + if ( entry == geomComp ) { + // GEOM component is selected, skip other checks + isComponentSelected = true; continue; - - _PTR(SObject) SO ( aStudy->FindObjectID( IObject->getEntry() ) ); - _PTR(AttributeIOR) anIOR; - - // Erase child graphical objects - - _PTR(ChildIterator) it ( aStudy->NewChildIterator( SO ) ); - for ( ; it->More();it->Next() ) - { - _PTR(SObject) CSO ( it->Value() ); - - if ( CSO->FindAttribute( anAttr, "AttributeIOR" ) ) - { - anIOR = anAttr; - - // Delete child( s ) shape in Client : - - const TCollection_AsciiString ASCior( (char*)anIOR->Value().c_str() ) ; - GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCior ); - - for ( int i = 0; i < nbSf; i++ ) - { - GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow( dynamic_cast(CSO.get())->GetObject() ); - if ( !aGeomObj->_is_nil() ) - GEOM_Displayer().Erase( aGeomObj, true ); - } - } } - - // Erase main graphical object - - for ( int i = 0; i < nbSf; i++ ) - { - QAD_StudyFrame* sf = QAD_Application::getDesktop()->getActiveStudy()->getStudyFrame( i ); - GEOM_Displayer().Erase( IObject, true ); + // all sub-objects of folder have to be deleted + getGeomChildrenAndFolders( obj, toBeDeleted, toBeDelFolders ); + allDeleted.insert( entry, aName ); // skip GEOM component + // browse through all children recursively + _PTR(UseCaseIterator) it ( aUseCaseBuilder->GetUseCaseIterator( obj ) ); + for ( it->Init( true ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + if ( child && child->ReferencedObject( refobj ) ) + continue; // skip references + aName = child->GetName().c_str(); + if ( !aName.isEmpty() ) + allDeleted.insert( child->GetID().c_str(), aName ); } + } - // Delete main shape in Client : + // is there is anything to delete? + if ( !isComponentSelected && allDeleted.count() <= 0 ) + return; // nothing to delete + + // show confirmation dialog box + GEOMToolsGUI_DeleteDlg dlg( app->desktop(), allDeleted, isComponentSelected ); + if ( !dlg.exec() ) + return; // operation is cancelled by user + + // get currently opened views + QList views; + SALOME_View* view; + ViewManagerList vmans = app->viewManagers(); + SUIT_ViewManager* vman; + foreach ( vman, vmans ) { + SUIT_ViewModel* vmod = vman->getViewModel(); + view = dynamic_cast ( vmod ); // must work for OCC and VTK views + if ( view ) + views.append( view ); + } - if ( SO->FindAttribute( anAttr, "AttributeIOR" ) ) - { - anIOR = anAttr; - const TCollection_AsciiString ASCIor( (char*)anIOR->Value().c_str() ) ; - GeometryGUI::GetGeomGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCIor ); + _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); + GEOM_Displayer* disp = new GEOM_Displayer( appStudy ); + + if ( isComponentSelected ) { + // GEOM component is selected: delete all objects recursively + _PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() ); + if ( !comp ) + return; + _PTR(ChildIterator) it ( aStudy->NewChildIterator( comp ) ); + // remove top-level objects only + for ( it->InitEx( false ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + // remove object from GEOM engine + removeObjectWithChildren( child, aStudy, views, disp ); + // remove object from study + aStudyBuilder->RemoveObjectWithChildren( child ); + // remove object from use case tree + aUseCaseBuilder->Remove( child ); } - - // Erase objects in Study - - _PTR(SObject) obj ( aStudy->FindObjectID( IObject->getEntry() ) ); - if ( obj ) - { - _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); - aStudyBuilder->RemoveObject( obj ); - - GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(dynamic_cast(obj.get())->GetObject()); - if ( !aGeomObj->_is_nil() ) - GeometryGUI::GetGeomGUI()->GetGeomGen()->RemoveObject( aGeomObj ); - - deleted = true; + } + else { + // GEOM component is not selected: check if selected objects are in use + if ( inUse( aStudy, geomComp, allDeleted ) && + SUIT_MessageBox::question( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("DEP_OBJECT"), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, + SUIT_MessageBox::No ) != SUIT_MessageBox::Yes ) { + return; // object(s) in use } - } - - if ( deleted ) - op->finish(); - else - op->abort(); - - // Clear any previous selection - Sel->ClearIObjects(); - QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser(); - */ -} - - -//============================================================================== -// function : OnEditCopy() -// purpose : -//============================================================================== -void GEOMToolsGUI::OnEditCopy() -{ -/* - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() ); - GEOM::string_array_var listIOR = new GEOM::string_array; - - const SALOME_ListIO& List = Sel->StoredIObjects(); - - myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR); - - Sel->ClearIObjects(); - - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - int aStudyID = aStudy->StudyId(); - - for (unsigned int ind = 0; ind < listIOR->length();ind++) { - GEOM::GEOM_Object_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]); - try { - GEOM::GEOM_IInsertOperations_var IOp = myGeom->GetIInsertOperations(aStudyID); - GEOM::GEOM_Object_var result = IOp->MakeCopy(aShapeInit) ; - myGeomBase->Display(result); + // ... and then delete all objects + QMap::Iterator it; + for ( it = toBeDeleted.begin(); it != toBeDeleted.end(); ++it ) { + _PTR(SObject) obj ( aStudy->FindObjectID( it.key().toLatin1().data() ) ); + // remove object from GEOM engine + removeObjectWithChildren( obj, aStudy, views, disp ); + // remove objects from study + aStudyBuilder->RemoveObjectWithChildren( obj ); + // remove object from use case tree + aUseCaseBuilder->Remove( obj ); } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); + // ... and then delete all folders + for ( it = toBeDelFolders.begin(); it != toBeDelFolders.end(); ++it ) { + _PTR(SObject) obj ( aStudy->FindObjectID( it.key().toLatin1().data() ) ); + // remove object from GEOM engine + removeObjectWithChildren( obj, aStudy, views, disp ); + // remove objects from study + aStudyBuilder->RemoveObjectWithChildren( obj ); + // remove object from use case tree + aUseCaseBuilder->Remove( obj ); } } - - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY")); -*/ -} + selected.Clear(); + aSelMgr->setSelectedObjects( selected ); + getGeometryGUI()->updateObjBrowser(); + app->updateActions(); //SRN: To update a Save button in the toolbar +} //===================================================================================== -// function : Import -// purpose : BRep, Iges, Step +// function : RemoveObjectWithChildren +// purpose : used by OnEditDelete() method //===================================================================================== -bool GEOMToolsGUI::Import() +void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, + _PTR(Study) aStudy, + QList views, + GEOM_Displayer* disp) { - SUIT_Application* app = getGeometryGUI()->getApp(); - if (! app) return false; - - SalomeApp_Study* stud = dynamic_cast ( app->activeStudy() ); - if ( !stud ) { - cout << "FAILED to cast active study to SalomeApp_Study" << endl; - return false; - } - _PTR(Study) aStudy = stud->studyDS(); - - bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked(); - if ( aLocked ) { - SUIT_MessageBox::warn1 ( app->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED"), - QObject::tr("BUT_OK") ); - return false; + // iterate through all children of obj + for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) { + // for (_PTR(UseCaseIterator) it (aStudy->GetUseCaseBuilder()->GetUseCaseIterator(obj)); it->More(); it->Next()) { + _PTR(SObject) child (it->Value()); + removeObjectWithChildren(child, aStudy, views, disp); } - GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen(); - if ( CORBA::is_nil( eng ) ) { - SUIT_MessageBox::error1( app->desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr( "GEOM Engine is not started" ), - QObject::tr("BUT_OK") ); - return false; - } - - GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() ); - if ( aInsOp->_is_nil() ) - return false; - - GEOM::GEOM_Object_var anObj; - - // Obtain a list of available import formats - FilterMap aMap; - GEOM::string_array_var aFormats, aPatterns; - aInsOp->ImportTranslators( aFormats, aPatterns ); - - for ( int i = 0, n = aFormats->length(); i < n; i++ ) - aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); - - QString fileType; - - QString file = getFileName(app->desktop(), "", aMap, tr("GEOM_MEN_IMPORT"), true, fileType ); - if( file.isEmpty() || fileType.isEmpty() ) - return false; - - GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() ); - try { - SUIT_OverrideCursor wc; + // erase object and remove it from engine + _PTR(GenericAttribute) anAttr; + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); - app->putInfo( tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file( file, /*withExten=*/true )) ); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); - anOp->start(); + // Delete shape in Client + const TCollection_AsciiString ASCIor ((char*)anIOR->Value().c_str()); + getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCIor); - anObj = aInsOp->Import( file.latin1(), fileType.latin1() ); + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if (!CORBA::is_nil(geomObj)) { - if ( !anObj->_is_nil() && aInsOp->IsDone() ) { - anObj->SetName( GEOMBase::GetDefaultName( QObject::tr( "GEOM_IMPORT" ) ).latin1() ); - QString aPublishObjName = GEOMBase::GetDefaultName( SUIT_Tools::file( file, /*withExten=*/true )); - GeometryGUI::GetGeomGen()->PublishInStudy(dynamic_cast(aStudy.get())->GetStudy(), - SALOMEDS::SObject::_nil(), - anObj, - aPublishObjName ); + //Remove visual properties of the object + appStudy->removeObjectProperties(obj->GetID().c_str()); - GEOM_Displayer( stud ).Display( anObj.in() ); + // Erase graphical object + QListIterator it( views ); + while ( it.hasNext() ) + if ( SALOME_View* view = it.next() ) + disp->Erase(geomObj, true, true, view); - anOp->commit(); + // Remove object from Engine + // We can't directly remove object from engine. All we can do is to unpublish the object + // from the study. Another client could be using the object. + // Unpublishing is done just after in aStudyBuilder->RemoveObjectWithChildren( child ); + //GeometryGUI::GetGeomGen()->RemoveObject( geomObj ); } - else { - anOp->abort(); - wc.suspend(); - SUIT_MessageBox::error1( app->desktop(), - QObject::tr( "GEOM_ERROR" ), - QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), - QObject::tr("BUT_OK") ); - } - } - catch( const SALOME::SALOME_Exception& S_ex ) { - //QtCatchCorbaException(S_ex); - anOp->abort(); - return false; } - - return true; } - -//===================================================================================== -// function : Export -// purpose : BRep, Iges, Step -//===================================================================================== -bool GEOMToolsGUI::Export() +//================================================================================= +// function : deactivate() +// purpose : Called when GEOM component is deactivated +//================================================================================= +void GEOMToolsGUI::deactivate() { -/* - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGUI()->GetGeomGen()->GetIInsertOperations( aStudy->StudyId() ); - if ( aInsOp->_is_nil() ) - return false; - - // Obtain a list of available export formats - FilterMap aMap; - GEOM::string_array_var aFormats, aPatterns; - aInsOp->ExportTranslators( aFormats, aPatterns ); - for ( int i = 0, n = aFormats->length(); i < n; i++ ) - aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); - - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); - SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); - - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found); - - if ( !found || anObj->_is_nil() ) - continue; - - QString fileType; - QString file = getFileName(QAD_Application::getDesktop(), - QString( IObject->getName() ), - aMap, - tr("GEOM_MEN_EXPORT"), - false, - fileType); - - // User has pressed "Cancel" --> stop the operation - if ( file.isEmpty() || fileType.isEmpty() ) - return false; - - // Standard_Boolean result = BRepTools::Write(Shape->Shape(), strdup(file.latin1()) ); - try { - QAD_WaitCursor wc; - aInsOp->Export( anObj, file, fileType.latin1() ); - if ( !aInsOp->IsDone() ) { - wc.stop(); - QAD_MessageBox::error1( QAD_Application::getDesktop(), - QObject::tr( "GEOM_ERROR" ), - QObject::tr("GEOM_PRP_ABORT") + "\n" + QString( aInsOp->GetErrorCode() ), - QObject::tr("BUT_OK") ); - return false; - } - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + GEOM_Displayer aDisp (appStudy); + aDisp.GlobalSelection(); + getGeometryGUI()->setLocalSelectionMode(GEOM_ALLOBJECTS); } -*/ - return true; } - //===================================================================================== // EXPORTED METHODS //===================================================================================== extern "C" { +#ifdef WIN32 + __declspec( dllexport ) +#endif GEOMGUI* GetLibGUI( GeometryGUI* parent ) { return new GEOMToolsGUI( parent );