Salome HOME
bos #29332 [CEA 26899] GroupOnGeom returns None
[modules/geom.git] / src / GEOMClient / GEOM_Client.cxx
index 73558480d9a1deabdac3b317b808870885841004..871cd861a93274e97ebe3191cd97bef9ce16bba1 100644 (file)
@@ -1,4 +1,4 @@
-// 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
@@ -167,9 +167,10 @@ Standard_Boolean GEOM_Client::Find (const TopoDS_Shape& S, TCollection_AsciiStri
 // 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;
 }
 
 //=======================================================================
@@ -192,31 +193,45 @@ void GEOM_Client::ClearClientBuffer()
   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;
   }
 
@@ -239,8 +254,10 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
     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 {
@@ -254,6 +271,7 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
 
     S = aCompound;
   }
-  Bind(IOR, S);
+
+  Bind(IOR, S, aShapeTick);
   return S;
 }