Mantis issue 0021295: [CEA 484] Bug when deleting objects.

This commit is contained in:
jfa 2011-06-15 10:26:00 +00:00
parent e905eeaff1
commit 35239cd2c8
2 changed files with 27 additions and 41 deletions

View File

@ -55,7 +55,6 @@
#define HST_CLIENT_LEN 256 #define HST_CLIENT_LEN 256
//======================================================================= //=======================================================================
// function : Load() // function : Load()
// purpose : // purpose :
@ -105,10 +104,8 @@ GEOM_Client::GEOM_Client()
//======================================================================= //=======================================================================
GEOM_Client::GEOM_Client(const GEOM_Client& client) GEOM_Client::GEOM_Client(const GEOM_Client& client)
{ {
myIORs = client.myIORs;
myShapes = client.myShapes;
_myIndexes = client._myIndexes;
_mySubShapes = client._mySubShapes; _mySubShapes = client._mySubShapes;
myShapesMap = client.myShapesMap;
pid_client = client.pid_client; pid_client = client.pid_client;
} }
@ -142,30 +139,29 @@ GEOM_Client GEOM_Client::get_client()
// function : Find() // function : Find()
// purpose : // purpose :
//======================================================================= //=======================================================================
Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) Standard_Boolean GEOM_Client::Find (const TCollection_AsciiString& IOR, TopoDS_Shape& S)
{ {
if (_myIndexes.count(IOR) != 0) if (myShapesMap.count(IOR) != 0) {
{ S = myShapesMap[IOR];
Standard_Integer i = _myIndexes[IOR]; return Standard_True;
S = myShapes.Value(i);
return i;
} }
return 0; return Standard_False;
} }
//======================================================================= //=======================================================================
// function : Find() // function : Find()
// purpose : // purpose :
//======================================================================= //=======================================================================
Standard_Integer GEOM_Client::Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) Standard_Boolean GEOM_Client::Find (const TopoDS_Shape& S, TCollection_AsciiString& IOR)
{ {
for ( Standard_Integer i = 1; i<= myShapes.Length(); i++ ) { std::map< TCollection_AsciiString, TopoDS_Shape >::const_iterator it;
if (myShapes.Value(i) == S) { for (it = myShapesMap.begin(); it != myShapesMap.end(); ++it) {
IOR = myIORs.Value(i); if ((*it).second == S) {
return i; IOR = (*it).first;
return Standard_True;
} }
} }
return 0; return Standard_False;
} }
//======================================================================= //=======================================================================
@ -174,9 +170,7 @@ Standard_Integer GEOM_Client::Find( const TopoDS_Shape& S, TCollection_AsciiStri
//======================================================================= //=======================================================================
void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S )
{ {
myIORs.Append(IOR); myShapesMap[IOR] = S;
myShapes.Append(S);
_myIndexes[IOR] = myIORs.Length();
} }
//======================================================================= //=======================================================================
@ -185,15 +179,11 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape&
//======================================================================= //=======================================================================
void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR) void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
{ {
if( myIORs.IsEmpty() ) if (myShapesMap.size() == 0)
return; return;
TopoDS_Shape S; if (myShapesMap.count(IOR) != 0) {
Standard_Integer anIndex = Find( IOR, S ); myShapesMap.erase(IOR);
if( anIndex != 0 ) {
myIORs.Remove(anIndex);
myShapes.Remove(anIndex);
_myIndexes.erase(IOR);
_mySubShapes.erase(IOR); _mySubShapes.erase(IOR);
} }
} }
@ -204,13 +194,11 @@ void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
//======================================================================= //=======================================================================
void GEOM_Client::ClearClientBuffer() void GEOM_Client::ClearClientBuffer()
{ {
if( myIORs.IsEmpty() ) if (myShapesMap.size() == 0)
return; return;
myIORs.Clear();
myShapes.Clear();
_myIndexes.clear();
_mySubShapes.clear(); _mySubShapes.clear();
return; myShapesMap.clear();
} }
//======================================================================= //=======================================================================
@ -219,7 +207,7 @@ void GEOM_Client::ClearClientBuffer()
//======================================================================= //=======================================================================
unsigned int GEOM_Client::BufferLength() unsigned int GEOM_Client::BufferLength()
{ {
return myIORs.Length(); return myShapesMap.size();
} }
//======================================================================= //=======================================================================
@ -231,9 +219,9 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
TopoDS_Shape S; TopoDS_Shape S;
CORBA::String_var anIOR = geom->GetStringFromIOR(aShape); CORBA::String_var anIOR = geom->GetStringFromIOR(aShape);
TCollection_AsciiString IOR = (char*)anIOR.in(); TCollection_AsciiString IOR = (char*)anIOR.in();
Standard_Integer anIndex = Find(IOR, S); Standard_Boolean anIndex = Find(IOR, S);
if (anIndex != 0) return S; if (anIndex) return S;
/******* in case of a MAIN GEOM::SHAPE ********/ /******* in case of a MAIN GEOM::SHAPE ********/
if (aShape->IsMainShape()) { if (aShape->IsMainShape()) {
@ -251,7 +239,7 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
TCollection_AsciiString mainIOR = (char*)aMainIOR.in(); TCollection_AsciiString mainIOR = (char*)aMainIOR.in();
//find subshapes only one time //find subshapes only one time
if(_mySubShapes.count(mainIOR)==0) if (_mySubShapes.count(mainIOR) == 0)
{ {
TopTools_IndexedMapOfShape anIndices; TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aMainShape, anIndices); TopExp::MapShapes(aMainShape, anIndices);

View File

@ -111,9 +111,9 @@ class GEOMCLIENT_EXPORT GEOM_Client {
//Standard_EXPORT //Standard_EXPORT
GEOM_Client(const GEOM_Client& client); GEOM_Client(const GEOM_Client& client);
//Standard_EXPORT //Standard_EXPORT
Standard_Integer Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) ; Standard_Boolean Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) ;
//Standard_EXPORT //Standard_EXPORT
Standard_Integer Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) ; Standard_Boolean Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) ;
//Standard_EXPORT //Standard_EXPORT
void Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) ; void Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) ;
//Standard_EXPORT //Standard_EXPORT
@ -134,10 +134,8 @@ class GEOMCLIENT_EXPORT GEOM_Client {
private: private:
// Fields PRIVATE // Fields PRIVATE
// //
TColStd_SequenceOfAsciiString myIORs ;
TopTools_SequenceOfShape myShapes ;
std::map< TCollection_AsciiString , int > _myIndexes;
std::map< TCollection_AsciiString , std::vector<TopoDS_Shape> > _mySubShapes; std::map< TCollection_AsciiString , std::vector<TopoDS_Shape> > _mySubShapes;
std::map< TCollection_AsciiString , TopoDS_Shape > myShapesMap;
long pid_client; long pid_client;
}; };