-// 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
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
*/
{
public:
- typedef TopTools_DataMapOfShapeShape TShapeShapeMap;
+ typedef StdMeshers_ShapeShapeBiDirectionMap TShapeShapeMap;
typedef TopTools_IndexedDataMapOfShapeListOfShape TAncestorMap;
typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
/*!
- * \brief Looks for association of all subshapes of two shapes
+ * \brief Looks for association of all sub-shapes of two shapes
* \param theShape1 - shape 1
* \param theMesh1 - mesh built on shape 1
* \param theShape2 - shape 2
* \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
* \param mesh1 - mesh containing elements on the first face
* \param face2 - the second face
* \param mesh2 - mesh containing elements on the second face
- * \param assocMap - map associating subshapes of the faces
+ * \param assocMap - map associating sub-shapes of the faces
* \param nodeIn2OutMap - map containing found matching nodes
* \retval bool - is a success
*/
const TShapeShapeMap & assocMap,
TNodeNodeMap & nodeIn2OutMap);
/*!
- * \brief Return any subshape of a face belonging to the outer wire
+ * \brief Return any sub-shape of a face belonging to the outer wire
* \param face - the face
- * \param type - type of subshape to return
- * \retval TopoDS_Shape - the found subshape
+ * \param type - type of sub-shape to return
+ * \retval TopoDS_Shape - the found sub-shape
*/
static TopoDS_Shape OuterShape( const TopoDS_Face& face,
TopAbs_ShapeEnum type);
static bool MakeComputed(SMESH_subMesh * sm, const int iterationNb = 0);
/*!
- * \brief Count nb of subshapes
+ * \brief Count nb of sub-shapes
* \param shape - the shape
- * \param type - the type of subshapes to count
+ * \param type - the type of sub-shapes to count
* \param ignoreSame - if true, use map not to count same shapes, esle use explorer
* \retval int - the calculated number
*/
SMESH_Mesh* srcMesh);
/*!
- * \brief Return true if edge is a boundary of edgeContainer
+ * \brief Return a boundary EDGE of edgeContainer
*/
- static bool IsBoundaryEdge(const TopoDS_Edge& edge,
- const TopoDS_Shape& edgeContainer,
- SMESH_Mesh& mesh);
+ static TopoDS_Edge GetBoundaryEdge(const TopoDS_Shape& edgeContainer,
+ const SMESH_Mesh& mesh);
};
#endif