X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMToolsGUI%2FGEOMToolsGUI.cxx;h=d79a68e10f9eaa4a42fbcd7a6a818f2ebb9e0957;hb=a9fe5759c52e7f225c6b1403bf93fc97c10874b9;hp=03d85716884fef4ed05e60e5f1490f38d5d299d4;hpb=6fa64130e586f57e807bfb298c52f10bfb2c0b2d;p=modules%2Fgeom.git diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 03d857168..d79a68e10 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -1,104 +1,187 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2016 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 +// 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. +// 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. +// 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 +// 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 +// 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 "GEOMToolsGUI_DeleteDlg.h" -#include "GeometryGUI.h" -#include "GEOM_Actor.h" -#include "GEOMBase.h" -#include "GEOM_Operation.h" -#include "GEOM_Displayer.h" +#include +#include "GeometryGUI_Operations.h" +#include +#include +#include #include -#include #include #include #include #include #include #include +#include #include #include #include +#include -#include +#include #include -#include "utilities.h" - // QT Includes -#include -#include +#include +#include +#include // OCCT Includes #include -using namespace std; - typedef QMap FilterMap; +static QString lastUsedFilter; //======================================================================= -// function : getFileName -// purpose : Selection of a file name for Import/Export. Returns also -// the selected file type code through argument. +// function : getParentComponent +// purpose : Get object's parent component entry //======================================================================= -static QString getFileName( QWidget* parent, - const QString& initial, - const FilterMap& filterMap, - const QString& caption, - bool open, - QString& format ) +static QString getParentComponent( _PTR( SObject ) obj ) +{ + if ( obj ) { + _PTR(SComponent) comp = obj->GetFatherComponent(); + if ( comp ) + return QString( comp->GetID().c_str() ); + } + return QString(); +} + +//===================================================================================== +// function : inUse +// purpose : check if the object(s) passed as the second arguments are used +// by the other objects in the study +//===================================================================================== +static bool inUse( _PTR(Study) study, const QString& component, const QMap& objects ) { - 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; + _PTR(SObject) comp = study->FindObjectID( component.toLatin1().data() ); + if ( !comp ) + return false; + + // 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 )) + gobjects.insert( oit.key(), geomObj_rem ); + } + + // 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(); + 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 to find an object with is not deleted and depends + // on a deleted object + _PTR(ChildIterator) it ( study->NewChildIterator( comp ) ); + for ( it->InitEx( true ); it->More(); it->Next() ) + { + _PTR(SObject) child = it->Value(); + QString childID = child->GetID().c_str(); + bool deleted = objects.contains( childID ); + if ( deleted ) + continue; // deleted object + + 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 dep = geomObj->GetDependency(); // child depends on dep + for( CORBA::ULong i = 0; i < dep->length(); i++ ) + { + CORBA::String_var id = dep[i]->GetStudyEntry(); + bool depends = objects.contains( id.in() ); // depends on deleted + + QMap::Iterator git; + for ( git = gobjects.begin(); git != gobjects.end() && ( !depends || !deleted ); ++git ) + { + depends = depends || dep[i]->_is_equivalent( *git ); + deleted = deleted || git.key() == childID ;//geomObj->_is_equivalent( *git ) + } + if ( depends && !deleted ) + return true; + } + } + return false; +} + +//======================================================================= +// function : getGeomChildrenAndFolders +// purpose : Get direct (1-level) GEOM objects under each folder, sub-folder, etc. and these folders itself +//======================================================================= +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 ); + } } //======================================================================= @@ -106,11 +189,10 @@ static QString getFileName( QWidget* parent, // purpose : Constructor //======================================================================= GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) -: GEOMGUI( parent ) + : GEOMGUI( parent ) { } - //======================================================================= // function : ~GEOMToolsGUI() // purpose : Destructor @@ -119,7 +201,6 @@ GEOMToolsGUI::~GEOMToolsGUI() { } - //======================================================================= // function : OnGUIEvent() // purpose : @@ -128,97 +209,145 @@ 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 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; +#ifndef DISABLE_PYCONSOLE + case GEOMOp::OpCheckGeom: // TOOLS - CHECK GEOMETRY + OnCheckGeometry(); + break; +#endif + 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; +#ifndef DISABLE_GRAPHICSVIEW + case GEOMOp::OpShowDependencyTree: + OnShowDependencyTree(); + break; +#endif + 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() @@ -227,415 +356,238 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) void GEOMToolsGUI::OnEditDelete() { SALOME_ListIO selected; - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if ( app ) { - LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); - SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if ( aSelMgr && appStudy ) { - aSelMgr->selectedObjects( selected, QString::null, false ); - if ( !selected.IsEmpty() ) { - _PTR(Study) aStudy = appStudy->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; - } - - // VSR 17/11/04: check if all objects selected belong to GEOM component --> start - // modifications of ASV 01.06.05 - QString parentComp = getParentComponent( aStudy, selected ); - const char* geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() ); - QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR ) ); - - if ( parentComp != geomComp ) { - SUIT_MessageBox::warn1 ( app->desktop(), - QObject::tr("ERR_ERROR"), - QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ), - QObject::tr("BUT_OK") ); - return; - } - // VSR 17/11/04: check if all objects selected belong to GEOM component <-- finish - - if ( SUIT_MessageBox::warn2( app->desktop(), - QObject::tr( "GEOM_WRN_WARNING" ), - QObject::tr( "GEOM_REALLY_DELETE" ), - QObject::tr( "GEOM_BUT_YES" ), - QObject::tr( "GEOM_BUT_NO" ), 1, 0, 0 ) != 1 ) - return; - - // QAD_Operation* op = new SALOMEGUI_ImportOperation(.....); - // op->start(); - - // prepare list of SALOME_Views - QPtrList views; - SALOME_View* view; - // fill the list - ViewManagerList vmans = app->viewManagers(); - SUIT_ViewManager* vman; - for ( vman = vmans.first(); vman; vman = vmans.next() ) { - SUIT_ViewModel* vmod = vman->getViewModel(); - view = dynamic_cast ( vmod ); // must work for OCC and VTK views - if ( view ) - views.append( view ); - } - - _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); - _PTR(GenericAttribute) anAttr; - GEOM_Displayer* disp = new GEOM_Displayer( appStudy ); - - // MAIN LOOP OF SELECTED OBJECTS - for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { - - Handle(SALOME_InteractiveObject) io = It.Value(); - if ( !io->hasEntry() ) - continue; - - _PTR(SObject) obj ( aStudy->FindObjectID( io->getEntry() ) ); - - // disable removal of "Geometry" component object - if ( !strcmp( obj->GetIOR().c_str(), geomIOR ) ) - continue; - - // iterate through all children of obj, find IOR attributes on children - // and remove shapes that correspond to these IORs - for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) { - _PTR(SObject) child (it->Value()); - if (child->FindAttribute(anAttr, "AttributeIOR")) { - _PTR(AttributeIOR) anIOR (anAttr); - - // Delete child( s ) shape in Client : - const TCollection_AsciiString ASCior ((char*)anIOR->Value().c_str()); - getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCior); - - CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(child); - GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow(corbaObj); - if (!CORBA::is_nil(geomObj)) { - for (view = views.first(); view; view = views.next()) { - disp->Erase(geomObj, true, view); - } - } - } - } // for ( children of obj ) - - // Erase main graphical object - for ( view = views.first(); view; view = views.next() ) - disp->Erase( io, true, view ); - - // Delete main shape in Client : - if ( obj->FindAttribute( anAttr, "AttributeIOR" ) ) { - _PTR(AttributeIOR) anIOR( anAttr ); - const TCollection_AsciiString ASCIor( (char*)anIOR->Value().c_str() ); - getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer( ASCIor ); - } - - CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); - GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); - if ( !CORBA::is_nil( geomObj ) ) - GeometryGUI::GetGeomGen()->RemoveObject( geomObj ); - - // Remove objects from Study - aStudyBuilder->RemoveObject( obj ); - - //deleted = true; - } // MAIN LOOP of selected - - selected.Clear(); - aSelMgr->setSelectedObjects( selected ); - getGeometryGUI()->updateObjBrowser(); - } // if ( selected not empty ) - } // if ( selMgr && appStudy ) - - app->updateActions(); //SRN: To update a Save button in the toolbar - - } // if ( app ) - - - // if ( deleted ) - // op->finish(); - // else - // op->abort(); -} - - -//============================================================================== -// 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(); + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) + return; + + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !aSelMgr || !appStudy ) + return; + + // get selection + aSelMgr->selectedObjects( selected, "ObjectBrowser", false ); + if ( selected.IsEmpty() ) + return; + + _PTR(Study) aStudy = appStudy->studyDS(); + _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder(); + + // 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 + } - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - int aStudyID = aStudy->StudyId(); + // 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 + } - 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); + /////////////////////////////////////////////////////// + // 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(); } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); + // ... + QString aName = obj->GetName().c_str(); + if ( entry == geomComp ) { + // GEOM component is selected, skip other checks + isComponentSelected = true; + continue; + } + // 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 ); } } - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY")); -*/ -} - - -//===================================================================================== -// function : Import -// purpose : BRep, Iges, Step -//===================================================================================== -bool GEOMToolsGUI::Import() -{ - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() ); - //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; + // 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 + + SUIT_OverrideCursor wc; + + // 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 ); } - 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; + _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); + GEOM_Displayer disp( appStudy ); + bool toUpdateColorScale = disp.SetUpdateColorScale( false ); // IPAL54049 + + 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 ); } - - 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 fileName = getFileName(app->desktop(), "", aMap, - tr("GEOM_MEN_IMPORT"), true, fileType); - if (fileName.isEmpty() || fileType.isEmpty()) - return false; - - GEOM_Operation* anOp = new GEOM_Operation (app, aInsOp.in()); - try { - SUIT_OverrideCursor wc; - - app->putInfo(tr("GEOM_PRP_LOADING").arg(SUIT_Tools::file(fileName, /*withExten=*/true))); - - anOp->start(); - - CORBA::String_var fileN = fileName.latin1(); - CORBA::String_var fileT = fileType.latin1(); - anObj = aInsOp->Import(fileN, fileT); - - if ( !anObj->_is_nil() && aInsOp->IsDone() ) { - anObj->SetName(GEOMBase::GetDefaultName(QObject::tr("GEOM_IMPORT")).latin1()); - QString aPublishObjName = - GEOMBase::GetDefaultName(SUIT_Tools::file(fileName, /*withExten=*/true)); - - SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy(aStudy); - GeometryGUI::GetGeomGen()->PublishInStudy(aDSStudy, - SALOMEDS::SObject::_nil(), - anObj, - aPublishObjName); - - GEOM_Displayer( stud ).Display( anObj.in() ); - - // update data model and object browser - getGeometryGUI()->updateObjBrowser( true ); - - anOp->commit(); + } + 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 } - 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") ); + // ... 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 ); + } + // ... 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 ); } - } - catch( const SALOME::SALOME_Exception& S_ex ) { - //QtCatchCorbaException(S_ex); - anOp->abort(); - return false; } + disp.SetUpdateColorScale( toUpdateColorScale ); // IPAL54049 + selected.Clear(); + aSelMgr->setSelectedObjects( selected ); + getGeometryGUI()->updateObjBrowser(); app->updateActions(); //SRN: To update a Save button in the toolbar - - return true; } - //===================================================================================== -// function : Export -// purpose : BRep, Iges, Step +// function : RemoveObjectWithChildren +// purpose : used by OnEditDelete() method //===================================================================================== -bool GEOMToolsGUI::Export() +void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, + _PTR(Study) aStudy, + QList views, + GEOM_Displayer* disp) { - SalomeApp_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; + // 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); } - _PTR(Study) aStudy = stud->studyDS(); - - 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; - - // 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] ); - - // Get selected objects - LightApp_SelectionMgr* sm = app->selectionMgr(); - if ( !sm ) - return false; - - SALOME_ListIO selectedObjects; - sm->selectedObjects( selectedObjects ); - SALOME_ListIteratorOfListIO It( selectedObjects ); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject(IObject, found); + // erase object and remove it from engine + _PTR(GenericAttribute) anAttr; + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); - if ( !found || anObj->_is_nil() ) - continue; + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); - QString fileType; - QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap, - tr("GEOM_MEN_EXPORT"), false, fileType); + // Delete shape in Client + const TCollection_AsciiString ASCIor ((char*)anIOR->Value().c_str()); + getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCIor); - // User has pressed "Cancel" --> stop the operation - if ( file.isEmpty() || fileType.isEmpty() ) - return false; + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if (!CORBA::is_nil(geomObj)) { - GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() ); - try { - SUIT_OverrideCursor wc; + //Remove visual properties of the object + appStudy->removeObjectProperties(obj->GetID().c_str()); - app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) ); + // Erase graphical object + QListIterator it( views ); + while ( it.hasNext() ) + if ( SALOME_View* view = it.next() ) + disp->Erase(geomObj, true, true, view); - anOp->start(); - - - aInsOp->Export( anObj, file, fileType.latin1() ); - - if ( aInsOp->IsDone() ) - anOp->commit(); - 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") ); - return false; - } - } - catch (const SALOME::SALOME_Exception& S_ex) { - //QtCatchCorbaException(S_ex); - anOp->abort(); - return false; + // 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 ); } } - - return true; } - -QString GEOMToolsGUI::getParentComponent( _PTR( Study ) study, const SALOME_ListIO& iobjs ) +//================================================================================= +// function : deactivate() +// purpose : Called when GEOM component is deactivated +//================================================================================= +void GEOMToolsGUI::deactivate() { - QString parentComp; - - for ( SALOME_ListIteratorOfListIO it( iobjs ); it.More(); it.Next() ) { - - Handle(SALOME_InteractiveObject) io = it.Value(); - if ( !io->hasEntry() ) - continue; - - QString compName = getParentComponent( study->FindObjectID( io->getEntry() ) ); - - if ( parentComp.isNull() ) - parentComp = compName; - else if ( parentComp.compare( compName) != 0 ) { // objects belonging to different components are selected - parentComp = QString::null; - break; - } - } - - return parentComp; -} - -QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj ) -{ - if ( obj ) { - _PTR(SComponent) comp = obj->GetFatherComponent(); - if ( comp ) { - _PTR(GenericAttribute) anAttr; - if ( comp->FindAttribute( anAttr, "AttributeName") ) { - _PTR(AttributeName) aName( anAttr ); - return QString( aName->Value().c_str() ); - } - } + 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 QString(); } //===================================================================================== @@ -643,8 +595,8 @@ QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj ) //===================================================================================== extern "C" { -#ifdef WNT - __declspec( dllexport ) +#ifdef WIN32 + __declspec( dllexport ) #endif GEOMGUI* GetLibGUI( GeometryGUI* parent ) {