]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
CCAR: GEOM_Client modification to optimize the method find
authorcaremoli <caremoli>
Fri, 26 Nov 2010 11:05:09 +0000 (11:05 +0000)
committercaremoli <caremoli>
Fri, 26 Nov 2010 11:05:09 +0000 (11:05 +0000)
and the method GetShape when a main shape has a lot of subshapes
The way of creation of GEOM_Client has also been changed : now, it's
a singleton object. It is possible to revert to the old creation way
by commenting the #define SINGLE_CLIENT instruction in GEOM_Client.hxx

12 files changed:
src/EntityGUI/EntityGUI_SketcherDlg.cxx
src/EntityGUI/Makefile.am
src/GEOMBase/GEOMBase.cxx
src/GEOMBase/GEOMBase_Helper.cxx
src/GEOMClient/GEOM_Client.cxx
src/GEOMClient/GEOM_Client.hxx
src/GEOMFiltersSelection/GEOM_SelectionFilter.cxx
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GeometryGUI.h
src/GEOMGUI/GeometryGUI_Swig.cxx
src/GroupGUI/GroupGUI_GroupDlg.cxx
src/RepairGUI/RepairGUI_SuppressFacesDlg.cxx

index 0400c1a4af9ae39ff6819d3c5b9a74e942642e6d..26f75a9523332e2c8b4c471f5dbb95141ce7c6f3 100644 (file)
@@ -2309,7 +2309,7 @@ void EntityGUI_SketcherDlg::FindLocalCS()
       continue;
     if (geomObj->GetType() == GEOM_MARKER) {
       ComboBox1->addItem(geomObj->GetName());
-      TopoDS_Shape aShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), geomObj);
+      TopoDS_Shape aShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), geomObj);
       
       gp_Ax3 aLCS;
       aLCS.Transform(aShape.Location().Transformation());
index 1508f378f388dfbe1ecd52fc63be4e248b2cc4b9..c91a7ec91862c72beec42ed63e17664e2b821ddf 100644 (file)
@@ -53,7 +53,7 @@ nodist_libEntityGUI_la_SOURCES =      \
 
 UIC_FILES =                            \
        ui_EntityGUI_1Sel_QTD.h         \
-       ui_EntityGUI_2Sel1Check_QTD.h   \       
+       ui_EntityGUI_2Sel1Check_QTD.h   \
        ui_EntityGUI_1Sel1Spin1Check_QTD.h      \
        ui_EntityGUI_1Spin_QTD.h        \
        ui_EntityGUI_2Spin_QTD.h        \
index efd69ff3c6024c5419a63839b6742b40e1d96ae8..c35c11ea486776ef99b1b88baad8b58df443db19 100644 (file)
@@ -85,7 +85,7 @@ TopoDS_Shape GEOMBase::GetShapeFromIOR(QString IOR)
   if (GeomObject->_is_nil())
     return result;
 
-  result = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), GeomObject);
+  result = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), GeomObject);
   return result;
 }
 
@@ -909,7 +909,7 @@ bool GEOMBase::GetShape( const GEOM::GEOM_Object_ptr& theObject, TopoDS_Shape& t
 {
   if ( !CORBA::is_nil( theObject ) )
   {
-    TopoDS_Shape aTopoDSShape = GEOM_Client().GetShape(  GeometryGUI::GetGeomGen(), theObject );
+    TopoDS_Shape aTopoDSShape = GEOM_Client::get_client().GetShape(  GeometryGUI::GetGeomGen(), theObject );
     if ( !aTopoDSShape.IsNull() && ( theType == TopAbs_SHAPE || theType == aTopoDSShape.ShapeType() ) )
     {
        theShape = aTopoDSShape;
index de5f92978a387ffe1dea7b401cd842499f8037f3..28e585e941b56baf9144b14830dfd02d0268123a 100755 (executable)
@@ -656,7 +656,7 @@ void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
 
   CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
-  GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
+  GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
 
   if ( !getStudy() || !getStudy()->studyDS() )
     return;
@@ -672,7 +672,7 @@ void GEOMBase_Helper::clearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
       _PTR(AttributeIOR) anIOR ( anAttr );
       TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
-      GEOM_Client().RemoveShapeFromBuffer( asciiIOR );
+      GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
     }
   }
 }
index 0e07e69d3bbd9a8ae93aeff9206695e316728869..3e047e220b8c602fcef5c2db61a28967eaf2e872 100644 (file)
@@ -117,12 +117,12 @@ GEOM_Client::GEOM_Client(Engines::Container_ptr client)
 //=======================================================================
 Standard_Integer GEOM_Client::Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S )
 {
-  for ( Standard_Integer i = 1; i<= myIORs.Length(); i++ ) {
-    if (myIORs.Value(i).IsEqual(IOR)) {
+  if(_myIndexes.count(IOR) != 0)
+    {
+      Standard_Integer i =_myIndexes[IOR];
       S = myShapes.Value(i);
       return i;
     }
-  }
   return 0;
 }
 
@@ -149,6 +149,7 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape&
 {
   myIORs.Append(IOR);
   myShapes.Append(S);
+  _myIndexes[IOR]=myIORs.Length();
 }
 
 //=======================================================================
@@ -165,6 +166,8 @@ void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
   if( anIndex != 0 ) {
     myIORs.Remove(anIndex);
     myShapes.Remove(anIndex);
+    _myIndexes.erase(IOR);
+    _mySubShapes.erase(IOR);
   }
   return;
 }
@@ -179,6 +182,8 @@ void GEOM_Client::ClearClientBuffer()
     return;
   myIORs.Clear();
   myShapes.Clear();
+  _myIndexes.clear();
+  _mySubShapes.clear();
   return;
 }
 
@@ -217,11 +222,23 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
   GEOM::ListOfLong_var list = aShape->GetSubShapeIndices();
 
   TopTools_IndexedMapOfShape anIndices;
-  TopExp::MapShapes(aMainShape, anIndices);
+  CORBA::String_var aMainIOR = geom->GetStringFromIOR(aShape->GetMainShape());
+  TCollection_AsciiString mainIOR = (char*)aMainIOR.in();
+
+  //find subshapes only one time
+  if(_mySubShapes.count(mainIOR)==0)
+    {
+      TopExp::MapShapes(aMainShape, anIndices);
+      Standard_Integer ii = 1, nbSubSh = anIndices.Extent();
+      for (; ii <= nbSubSh; ii++) 
+        {
+          _mySubShapes[mainIOR].push_back(anIndices.FindKey(ii));
+        }
+    }
 
   /* Case of only one subshape */
   if (list->length() == 1 && list[0] > 0) {
-    S = anIndices.FindKey(list[0]);
+    S = _mySubShapes[mainIOR][list[0]-1];
   }
   else {
     BRep_Builder B;
@@ -229,7 +246,7 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
     B.MakeCompound(aCompound);
     for (int i = 0; i < list->length(); i++) {
       if (0 < list[i] && list[i] <= anIndices.Extent()) {
-        TopoDS_Shape aSubShape = anIndices.FindKey(list[i]);
+        TopoDS_Shape aSubShape = _mySubShapes[mainIOR][list[i]-1];
         B.Add(aCompound, aSubShape);
       }
     }
index f5f9cafc2727aa3d774da36ad0397d85375ee57d..d200297195aade71902ee05bde4f29da26f95e19 100644 (file)
@@ -73,6 +73,18 @@ class TopoDS_Shape;
  #define GEOMCLIENT_EXPORT
 #endif
 
+#include <TCollection_AsciiString.hxx>
+#include <TopoDS_Shape.hxx>
+#include <map>
+#include <vector>
+
+/*
+ * if define SINGLE_CLIENT is not commented, the method get_client always returns the same GEOM_Client object (singleton object)
+ * and the SHAPE_READER macro can be used to define an object that is always this singleton object
+ * if define SINGLE_CLIENT is commented, we get the old way to define the GEOM_Client objects : get_client returns a new object
+ * and the SHAPE_READER macro defines also a new object
+ */
+#define SINGLE_CLIENT
 //=====================================================================
 // GEOM_Client : class definition
 //=====================================================================
@@ -113,14 +125,26 @@ public:
   //Standard_EXPORT   
   unsigned int BufferLength() ;
   TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape);
+#ifdef SINGLE_CLIENT
+  static GEOM_Client& get_client() { static GEOM_Client a;return a; }
+#else
+  static GEOM_Client get_client() { return GEOM_Client(); }
+#endif
 
 private: 
   // Fields PRIVATE
   //
   TColStd_SequenceOfAsciiString myIORs ;
   TopTools_SequenceOfShape myShapes ;
+  std::map< TCollection_AsciiString , int > _myIndexes;
+  std::map< TCollection_AsciiString , std::vector<TopoDS_Shape> > _mySubShapes;
   long  pid_client;
 };
 
+#ifdef SINGLE_CLIENT
+#define SHAPE_READER(obj) GEOM_Client& obj=GEOM_Client::get_client()
+#else
+#define SHAPE_READER(obj) GEOM_Client obj
+#endif
 
 #endif
index f90cc20e538c5b180ee89dc8cf2e0886153072a7..e8ca2276e54b4459bbab4aa1d62b7e45f3223f4f 100644 (file)
@@ -139,7 +139,7 @@ bool GEOM_SelectionFilter::getShape (const GEOM::GEOM_Object_ptr& theObject,
       }
       if ( !CORBA::is_nil( geomGen ) )
       {
-        TopoDS_Shape aTopoDSShape = GEOM_Client().GetShape( geomGen, theObject );
+        TopoDS_Shape aTopoDSShape = GEOM_Client::get_client().GetShape( geomGen, theObject );
 
         if ( !aTopoDSShape.IsNull() )
         {
index 3196289e5fb2b854a5e38850812ab4f6c0438131..eb0cf2658045d72f652a3c4509ab34d0dac3afc4 100644 (file)
@@ -968,7 +968,7 @@ SALOME_Prs* GEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj )
     return 0;
 
   internalReset();
-  setShape( GEOM_Client().GetShape( GeometryGUI::GetGeomGen(), theObj ) );
+  setShape( GEOM_Client::get_client().GetShape( GeometryGUI::GetGeomGen(), theObj ) );
   myType = theObj->GetType();
 
   // Update presentation
@@ -1049,7 +1049,7 @@ SALOME_Prs* GEOM_Displayer::buildPresentation( const QString& entry,
                 if ( !GeomObject->_is_nil() )
                 {
                   // finally set shape
-                  setShape( GEOM_Client().GetShape( GeometryGUI::GetGeomGen(), GeomObject ) );
+                  setShape( GEOM_Client::get_client().GetShape( GeometryGUI::GetGeomGen(), GeomObject ) );
                   myType = GeomObject->GetType();
                 }
               }
index 4e4dd392155b0a3b366671f115c8b5c7abf717d6..175daa04ce4f955178278cf526b49f94411d918a 100644 (file)
@@ -89,7 +89,7 @@ public:
 
   static void                 Modified( bool = true );
 
-  GEOM_Client&                GetShapeReader()    { return myShapeReader; }
+  GEOM_Client&                GetShapeReader()    { static SHAPE_READER(myShapeReader);return myShapeReader; }
 
   // Get active dialog box
   QDialog*                    GetActiveDialogBox(){ return myActiveDialogBox; }
@@ -169,7 +169,6 @@ private:
 
   GUIMap                      myGUIMap;          // GUI libraries map
   QDialog*                    myActiveDialogBox; // active dialog box
-  GEOM_Client                 myShapeReader;     // geom shape reader
   gp_Ax3                      myWorkingPlane;
   QMap<int,QString>           myRules;           // popup rules
   static StudyTextureMap      myTextureMap;      // texture map
index 9c9c9533d58e4cb2efe6c422734439901a5e6050..e052481da676e3ea2c28fb9de9a0bf4d08020fe7 100644 (file)
@@ -68,7 +68,7 @@
 
 #include <vtkRenderer.h>
 
-static GEOM_Client ShapeReader;
+static SHAPE_READER(ShapeReader);
 
 inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){
   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
index 327b0d4bbb53f7fab29f16b78d75526bff2c8df5..1b2caa0d2005dd9ed8636318b274a08518f150ba 100644 (file)
@@ -654,7 +654,7 @@ int GroupGUI_GroupDlg::getSelectedSubshapes (TColStd_IndexedMapOfInteger& theMap
         if (GEOMBase::GetShape(aGeomObj, aShape)) {
           if (aGeomObj->GetType() == GEOM_GROUP || aShape.ShapeType() == getShapeType()) {
             TopTools_IndexedMapOfShape aMainMap;
-            TopoDS_Shape aMainShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
+            TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
             TopExp::MapShapes(aMainShape, aMainMap);
 
             TopExp_Explorer anExp (aShape, getShapeType());
@@ -804,12 +804,12 @@ void GroupGUI_GroupDlg::activateSelection()
     SALOME_View* aView = dynamic_cast<SALOME_View*>(aViewModel);
     if (aView == 0) return;
 
-    TopoDS_Shape aMainShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
+    TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myMainObj);
     TopoDS_Shape aRestrictionShape;
     if (subSelectionWay() == ALL_SUBSHAPES)
       aRestrictionShape = aMainShape;
     else if (!myInPlaceObj->_is_nil())
-      aRestrictionShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), myInPlaceObj);
+      aRestrictionShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myInPlaceObj);
     else ;
 
     TopTools_IndexedMapOfShape aSubShapesMap;
index 2469cefe6d7b2e301fc240c1f1ff98ce07be1f01..65a3900552efba7b2c4947d34bce58fc1fb7018a 100644 (file)
@@ -213,7 +213,7 @@ void RepairGUI_SuppressFacesDlg::SelectionIntoArgument()
       _PTR(Study) aStudy = appStudy->studyDS();
 
       TopTools_IndexedMapOfShape aMainMap;
-      TopoDS_Shape aMainShape = GEOM_Client().GetShape(GeometryGUI::GetGeomGen(), myObject);
+      TopoDS_Shape aMainShape = GEOM_Client::get_client().GetShape(GeometryGUI::GetGeomGen(), myObject);
       TopExp::MapShapes(aMainShape, aMainMap);
 
       SALOME_ListIteratorOfListIO anIter (aSelList);