From 8d94e7dd809e3c7663fa15591cf79a04968b9f39 Mon Sep 17 00:00:00 2001 From: jfa Date: Fri, 11 Aug 2006 11:33:49 +0000 Subject: [PATCH] PAL13091: dump study echec. Correctly remove all sub-objects on removal of main object. --- src/GEOMToolsGUI/GEOMToolsGUI.cxx | 81 ++++++++++++++++--------------- src/GEOMToolsGUI/GEOMToolsGUI.h | 13 +++++ 2 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 96fe7ff01..c18dc6c65 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -227,7 +227,8 @@ 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() ); + 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() ); @@ -300,42 +301,7 @@ void GEOMToolsGUI::OnEditDelete() 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 ); + RemoveObjectWithChildren(obj, aStudy, views, disp); // Remove objects from Study aStudyBuilder->RemoveObject( obj ); @@ -456,7 +422,7 @@ bool GEOMToolsGUI::Import() // Trying to detect file type QFileInfo aFileInfo( fileName ); QString aPossibleType = (aFileInfo.extension(false)).upper() ; - + if ( (aMap.values()).contains(aPossibleType) ) fileType = aPossibleType; } @@ -649,6 +615,45 @@ QString GEOMToolsGUI::getParentComponent( _PTR( SObject ) obj ) return QString(); } +//===================================================================================== +// function : RemoveObjectWithChildren +// purpose : to be used by OnEditDelete() method +//===================================================================================== +void GEOMToolsGUI::RemoveObjectWithChildren(_PTR(SObject) obj, + _PTR(Study) aStudy, + QPtrList views, + GEOM_Displayer* disp) +{ + // iterate through all children of obj + for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) { + _PTR(SObject) child (it->Value()); + RemoveObjectWithChildren(child, aStudy, views, disp); + } + + // erase object and remove it from engine + _PTR(GenericAttribute) anAttr; + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); + + // Delete shape in Client + 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)) { + // Erase graphical object + SALOME_View* view = views.first(); + for (; view; view = views.next()) { + disp->Erase(geomObj, true, view); + } + + // Remove object from Engine + GeometryGUI::GetGeomGen()->RemoveObject( geomObj ); + } + } +} + //===================================================================================== // EXPORTED METHODS //===================================================================================== diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 9db5170ef..f5829ecfd 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -30,16 +30,23 @@ #define GEOMTOOLSGUI_H #include "GEOMGUI.h" +#include "GEOM_Displayer.h" + +#include #include #include #include + +#include + #if defined WNT && defined WIN32 && defined SALOME_WNT_EXPORTS #define GEOMTOOLSGUI_WNT_EXPORT __declspec( dllexport ) #else #define GEOMTOOLSGUI_WNT_EXPORT #endif + //================================================================================= // class : GEOMToolsGUI // purpose : @@ -76,6 +83,12 @@ private: // if objects belong to different Components, a NULL string is returned. QString getParentComponent( _PTR( Study ), const SALOME_ListIO& ); QString getParentComponent( _PTR(SObject) ); + + // Recursive deletion of object with children + void RemoveObjectWithChildren(_PTR(SObject) obj, + _PTR(Study) aStudy, + QPtrList views, + GEOM_Displayer* disp); }; #endif