-// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// function : Bind()
// purpose :
//=======================================================================
-void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S )
+void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S, int Tick )
{
myShapesMap[IOR] = S;
+ myTicksMap[IOR] = Tick;
}
//=======================================================================
myShapesMap.clear();
}
-//=======================================================================
-// function : BufferLength()
-// purpose :
-//=======================================================================
-unsigned int GEOM_Client::BufferLength()
-{
- return myShapesMap.size();
-}
-
//=======================================================================
// function : GetShape()
// purpose :
//=======================================================================
TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
{
- TopoDS_Shape S;
CORBA::String_var anIOR = geom->GetStringFromIOR(aShape);
TCollection_AsciiString IOR = anIOR.in();
+
+ // Special treatment for groups: group value (shape) is computed on
+ // first demand, and its tick is set to main shape's tick after that;
+ // tick of modified group is decremented.
+ // There is a not fixed problem: if anyone modifies a group and updates
+ // it before call to this method, the group will not be changed in the buffer
+ bool isModifiedSubShape = false;
+ int aShapeTick = aShape->GetTick();
+ if ( !aShape->IsMainShape() ) {
+ int anOldTick = aShapeTick;
+ aShape->GetShapeType(); // compute subshape and update its tick, if not yet
+ aShapeTick = aShape->GetTick();
+ isModifiedSubShape = (anOldTick != aShapeTick);
+ }
+
+ std::map< TCollection_AsciiString , int >::iterator i2t = myTicksMap.find( IOR );
+ if ( i2t != myTicksMap.end() ) {
+ if (i2t->second != aShapeTick || isModifiedSubShape) {
+ // The shape was modified, clean the stored one
+ RemoveShapeFromBuffer(IOR);
+ }
+ }
+
+ TopoDS_Shape S;
if ( Find( IOR, S ))
return S;
/******* in case of a MAIN GEOM::SHAPE ********/
if ( aShape->IsMainShape() ) {
S = Load(geom, aShape);
- Bind(IOR, S);
+ Bind(IOR, S, aShapeTick);
return S;
}
subShapes.insert( subShapes.end(), anIndices.cbegin(), anIndices.cend() );
}
- /* Case of only one subshape */
- if ( list->length() == 1 && list[0] > 1 ) {
+ /* Case of only one subshape, excluding groups of one main shape */
+ if ( list->length() == 1 &&
+ !(aShape->GetType() == 37 && list[0] == 1) &&
+ list[0] > 0 ) {
S = subShapes[list[0]-1];
}
else {
S = aCompound;
}
- Bind(IOR, S);
+
+ Bind(IOR, S, aShapeTick);
return S;
}