Salome HOME
Merge from V6_5_BR 05/06/2012
[modules/smesh.git] / src / StdMeshers / StdMeshers_ProjectionUtils.hxx
index 225a5fc47cc942f169b4045f99d27fed0b16a15b..685536a4dca7305eb2513b32d8682966c2dcf6cc 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  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
@@ -45,6 +45,29 @@ class SMESH_Hypothesis;
 class SMESH_subMesh;
 class TopTools_IndexedDataMapOfShapeListOfShape;
 
+/*!
+ * \brief Struct used instead of a sole TopTools_DataMapOfShapeShape to avoid
+ *        problems with bidirectional bindings
+ */
+struct StdMeshers_ShapeShapeBiDirectionMap
+{
+  TopTools_DataMapOfShapeShape _map1to2, _map2to1;
+
+  // convension: s1 - target, s2 - source
+  bool Bind( const TopoDS_Shape& s1, const TopoDS_Shape& s2 )
+  { _map1to2.Bind( s1, s2 ); return _map2to1.Bind( s2, s1 ); }
+  bool IsBound( const TopoDS_Shape& s, const bool isShape2=false ) const 
+  { return (isShape2 ? _map2to1 : _map1to2).IsBound( s ); }
+  bool IsEmpty() const { return _map1to2.IsEmpty(); }
+  int Extent() const { return _map1to2.Extent(); }
+  void Clear() { _map1to2.Clear(); _map2to1.Clear(); }
+  const TopoDS_Shape& operator()( const TopoDS_Shape& s, const bool isShape2=false ) const
+  { // if we get a Standard_NoSuchObject here, it means that the calling code
+    // passes incorrect isShape2
+    return (isShape2 ? _map2to1 : _map1to2)( s );
+  }
+};
+
 /*!
  * \brief Class encapsulating methods common to Projection algorithms
  */
@@ -52,7 +75,7 @@ class StdMeshers_ProjectionUtils
 {
  public:
 
-  typedef TopTools_DataMapOfShapeShape                         TShapeShapeMap;
+  typedef StdMeshers_ShapeShapeBiDirectionMap                  TShapeShapeMap;
   typedef TopTools_IndexedDataMapOfShapeListOfShape            TAncestorMap;
   typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
 
@@ -96,21 +119,19 @@ class StdMeshers_ProjectionUtils
     * \param theTargetShape - the shape theHyp assigned to
    */
   static void InitVertexAssociation( const SMESH_Hypothesis* theHyp,
-                                     TShapeShapeMap &        theAssociationMap,
-                                     const TopoDS_Shape&     theTargetShape);
+                                     TShapeShapeMap &        theAssociationMap);
 
   /*!
    * \brief Inserts association theShape1 <-> theShape2 to TShapeShapeMap
-    * \param theShape1 - shape 1
-    * \param theShape2 - shape 2
+    * \param theShape1 - target shape
+    * \param theShape2 - source shape
     * \param theAssociationMap - association map 
     * \param theBidirectional - if false, inserts theShape1 -> theShape2 association
     * \retval bool - true if there was no association for these shapes before
    */
-  static bool InsertAssociation( const TopoDS_Shape& theShape1,
-                                 const TopoDS_Shape& theShape2,
-                                 TShapeShapeMap &    theAssociationMap,
-                                 const bool          theBidirectional=true);
+  static bool InsertAssociation( const TopoDS_Shape& theShape1, // target
+                                 const TopoDS_Shape& theShape2, // source
+                                 TShapeShapeMap &    theAssociationMap);
 
   /*!
    * \brief Finds an edge by its vertices in a main shape of the mesh