return;
const double cosTol = Cos( myToler * M_PI / 180. );
- NCollection_Map< SMESH_TLink, SMESH_TLink > checkedLinks;
+ NCollection_Map< SMESH_TLink, SMESH_TLinkHasher > checkedLinks;
std::list< std::pair< const SMDS_MeshElement*, gp_Vec > > faceQueue;
faceQueue.push_back( std::make_pair( face, myNorm ));
#include "DriverSTL_R_SMDS_Mesh.h"
#include <Basics_Utils.hxx>
+#include <Basics_OCCTVersion.hxx>
#include <gp_Pnt.hxx>
#include <NCollection_DataMap.hxx>
//function : HashCode
//purpose :
//=======================================================================
+#if OCC_VERSION_LARGE < 0x07080000
inline static Standard_Integer HashCode
(const gp_Pnt& point, Standard_Integer Upper)
+#else
+ size_t operator()(const gp_Pnt& point) const
+#endif
{
union
{
point.Coord( U.R[0], U.R[1], U.R[2] );
+#if OCC_VERSION_LARGE < 0x07080000
return ::HashCode(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7,Upper);
+#else
+ return static_cast<size_t>(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7);
+#endif
}
//=======================================================================
//function : IsEqual
//purpose :
//=======================================================================
+#if OCC_VERSION_LARGE < 0x07080000
inline static Standard_Boolean IsEqual
(const gp_Pnt& point1, const gp_Pnt& point2)
+#else
+ bool operator()(const gp_Pnt& point1, const gp_Pnt& point2) const
+#endif
{
static Standard_Real tab1[3], tab2[3];
point1.Coord(tab1[0],tab1[1],tab1[2]);
#include "SMESH_TryCatch.hxx" // include after OCCT headers!
#include <smIdType.hxx>
+#include <Basics_OCCTVersion.hxx>
#define cast2Node(elem) static_cast<const SMDS_MeshNode*>( elem )
vector< const SMDS_MeshElement* > facesNearLink;
vector< std::pair< int, int > > nodeIndsOfFace;
TIDSortedElemSet avoidSet, emptySet;
- NCollection_Map< SMESH_TLink, SMESH_TLink > checkedLinks;
+ NCollection_Map< SMESH_TLink, SMESH_TLinkHasher > checkedLinks;
while ( !theRefFaces.empty() )
{
// purpose : allow comparing elements basing on their nodes
// ========================================================
+struct ComparableElementHasher;
+
class ComparableElement : public boost::container::flat_set< smIdType >
{
typedef boost::container::flat_set< smIdType > int_set;
smIdType mySumID;
mutable int myGroupID;
+ friend ComparableElementHasher;
+
public:
ComparableElement( const SMDS_MeshElement* theElem ):
mySumID = src.mySumID;
myGroupID = src.myGroupID;
}
+};
+struct ComparableElementHasher
+{
+#if OCC_VERSION_LARGE < 0x07080000
static int HashCode(const ComparableElement& se, int limit )
{
return ::HashCode( FromSmIdType<int>(se.mySumID), limit );
{
return ( se1 == se2 );
}
+#else
+ size_t operator()(const ComparableElement& se) const
+ {
+ return static_cast<size_t>(FromSmIdType<int>(se.mySumID));
+ }
+ bool operator()(const ComparableElement& se1, const ComparableElement& se2) const
+ {
+ return ( se1 == se2 );
+ }
+#endif
};
//=======================================================================
if ( theElements.empty() ) elemIt = GetMeshDS()->elementsIterator();
else elemIt = SMESHUtils::elemSetIterator( theElements );
- typedef NCollection_Map< ComparableElement, ComparableElement > TMapOfElements;
- typedef std::list<smIdType> TGroupOfElems;
+ typedef NCollection_Map< ComparableElement, ComparableElementHasher > TMapOfElements;
+ typedef std::list<smIdType> TGroupOfElems;
TMapOfElements mapOfElements;
std::vector< TGroupOfElems > arrayOfGroups;
TGroupOfElems groupOfElems;
return tol;
}
+bool CheckAlmostZero(gp_Vec & vec1,gp_Vec & vec2, gp_Vec & vecref)
+{
+ auto v1 = gp_Dir(vec1);
+ auto v2 = gp_Dir(vec2);
+ auto vref = gp_Dir(vecref);
+ auto XYZ = v1.Crossed (v2);
+ double cond = XYZ.X()*vref.X()+XYZ.Y()*vref.Y()+XYZ.Z()*vref.Z();
+ return (Abs(cond) <= 1e-12);
+}
+
//================================================================================
/*!
* \brief Return an angle between two EDGEs sharing a common VERTEX with reference
if ( theE2.Orientation() /*GetSubShapeOri( F, theE2 )*/ == TopAbs_REVERSED )
vec2.Reverse();
angle = vec1.AngleWithRef( vec2, vecRef );
-
+ if ( angle < 0. && CheckAlmostZero(vec1,vec2,vecRef))
+ angle*=-1;
+
if ( Abs ( angle ) >= 0.99 * M_PI )
{
BRep_Tool::Range( theE1, f, l );
SMESHDS_GroupOnGeom.hxx
SMESHDS_GroupOnFilter.hxx
SMESH_SMESHDS.hxx
- SMESHDS_DataMapOfShape.hxx
SMESH_Controls.hxx
)
#include "SMDS_Mesh.hxx"
#include "SMESHDS_SubMesh.hxx"
+#include <Basics_OCCTVersion.hxx>
+
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopoDS_Shape.hxx>
* So this functionality implement on new NCollection_DataMap technology
*/
#include <NCollection_DataMap.hxx>
-#include "SMESHDS_DataMapOfShape.hxx"
typedef std::list<const SMESHDS_Hypothesis*> THypList;
+
+struct SMESHDS_Hasher
+{
+#if OCC_VERSION_LARGE < 0x07080000
+ static inline Standard_Boolean IsEqual(const TopoDS_Shape& S1,
+ const TopoDS_Shape& S2)
+ {
+ return S1.IsSame(S2);
+ }
+ static inline Standard_Integer HashCode(const TopoDS_Shape& S,
+ const Standard_Integer Upper)
+ {
+ return ::HashCode( S, Upper);
+ }
+#else
+ bool operator()(const TopoDS_Shape& S1, const TopoDS_Shape& S2) const
+ {
+ // for the purpose of ShapeToHypothesis map we don't consider shapes orientation
+ return S1.IsSame(S2);
+ }
+ size_t operator()(const TopoDS_Shape& S) const
+ {
+ return std::hash<TopoDS_Shape>{}(S);
+ }
+#endif
+};
+
typedef NCollection_DataMap< TopoDS_Shape, THypList, SMESHDS_Hasher > ShapeToHypothesis;
class SMESHDS_GroupBase;
// File : SMESHGUI.cxx
// Author : Nicolas REJNERI, Open CASCADE S.A.S.
+#include <Basics_OCCTVersion.hxx>
+
+#if OCC_VERSION_LARGE < 0x07080000
+
#include <Standard_math.hxx> // E.A. must be included before Python.h to fix compilation on windows
+
+#else
+
+#ifdef _MSC_VER
+#ifndef _USE_MATH_DEFINES
+#define _USE_MATH_DEFINES
+#endif
+#include <math.h>
+#endif
+
+#endif
+
#ifdef HAVE_FINITE
#undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
#endif
CoincidentFreeBorders & foundFreeBordes)
{
// find free links
- typedef NCollection_DataMap<SMESH_TLink, const SMDS_MeshElement*, SMESH_TLink > TLink2FaceMap;
+ typedef NCollection_DataMap<SMESH_TLink, const SMDS_MeshElement*, SMESH_TLinkHasher > TLink2FaceMap;
TLink2FaceMap linkMap;
int nbSharedLinks = 0;
SMDS_FaceIteratorPtr faceIt = mesh.facesIterator();
bool isManifold = true;
// find free links
- typedef NCollection_DataMap<SMESH_TLink, const SMDS_MeshElement*, SMESH_TLink > TLink2FaceMap;
+ typedef NCollection_DataMap<SMESH_TLink, const SMDS_MeshElement*, SMESH_TLinkHasher > TLink2FaceMap;
TLink2FaceMap linkMap;
int nbSharedLinks = 0;
SMDS_FaceIteratorPtr faceIt = theMesh.facesIterator();
std::vector< Edge > resultEdges;
if ( !theMesh ) return resultEdges;
- typedef std::pair< bool, const SMDS_MeshNode* > TIsSharpAndMedium;
- typedef NCollection_DataMap< SMESH_TLink, TIsSharpAndMedium, SMESH_TLink > TLinkSharpMap;
+ typedef std::pair< bool, const SMDS_MeshNode* > TIsSharpAndMedium;
+ typedef NCollection_DataMap< SMESH_TLink, TIsSharpAndMedium, SMESH_TLinkHasher > TLinkSharpMap;
TLinkSharpMap linkIsSharp;
Standard_Integer nbBuckets = FromSmIdType<Standard_Integer>( theMesh->NbFaces() );
// build map of face edges (SMESH_TLink) and their faces
- typedef std::vector< const SMDS_MeshElement* > TFaceVec;
- typedef NCollection_DataMap< SMESH_TLink, TFaceVec, SMESH_TLink > TFacesByLinks;
+ typedef std::vector< const SMDS_MeshElement* > TFaceVec;
+ typedef NCollection_DataMap< SMESH_TLink, TFaceVec, SMESH_TLinkHasher > TFacesByLinks;
TFacesByLinks facesByLink;
Standard_Integer nbBuckets = FromSmIdType<Standard_Integer>( theMesh->NbFaces() );
if ( nbBuckets > 0 )
bool SMESH_MeshAlgos::IsOn2DBoundary( const SMDS_MeshNode* theNode,
std::vector< const SMDS_MeshNode*> * theNeibors )
{
- typedef NCollection_DataMap< SMESH_TLink, int, SMESH_TLink > TLinkCountMap;
+ typedef NCollection_DataMap< SMESH_TLink, int, SMESH_TLinkHasher > TLinkCountMap;
TLinkCountMap linkCountMap( 10 );
int nbFreeLinks = 0;
#include "SMDS_Mesh.hxx"
#include <Utils_SALOME_Exception.hxx>
+#include <Basics_OCCTVersion.hxx>
#include <Bnd_B3d.hxx>
#include <NCollection_Map.hxx>
const int theMaxNbFaces = 256; // max number of faces sharing a node
typedef NCollection_DataMap< const SMDS_MeshNode*, const SMDS_MeshNode*, SMESH_Hasher > TNNMap;
- typedef NCollection_Map< SMESH_Link, SMESH_Link > TLinkMap;
+ typedef NCollection_Map< SMESH_Link, SMESH_TLinkHasher > TLinkMap;
//--------------------------------------------------------------------------------
/*!
const SMDS_MeshNode* IntNode() const { return myIntNode.Node(); }
const SMDS_MeshNode* Node1() const { return myNode[ myReverse ]; }
const SMDS_MeshNode* Node2() const { return myNode[ !myReverse ]; }
+ };
+ struct CutLinkHasher
+ {
+#if OCC_VERSION_LARGE < 0x07080000
static Standard_Integer HashCode(const CutLink& link,
const Standard_Integer upper)
{
link1.myNode[1] == link2.myNode[1] &&
link1.myIndex == link2.myIndex );
}
+#else
+ size_t operator()(const CutLink& link) const
+ {
+ return size_t( link.myNode[0]->GetID() +
+ link.myNode[1]->GetID() +
+ link.myIndex );
+ }
+ bool operator()(const CutLink& link1, const CutLink& link2 ) const
+ {
+ return ( link1.myNode[0] == link2.myNode[0] &&
+ link1.myNode[1] == link2.myNode[1] &&
+ link1.myIndex == link2.myIndex );
+ }
+#endif
};
- typedef NCollection_Map< CutLink, CutLink > TCutLinkMap;
+ typedef NCollection_Map< CutLink, CutLinkHasher > TCutLinkMap;
//--------------------------------------------------------------------------------
/*!
TLinkMap& theCutOffCoplanarLinks) const;
void InitLinks() const;
bool IsCoplanar( const EdgePart* edge ) const;
+ void Dump() const;
+ private:
+
+ EdgePart* getTwin( const EdgePart* edge ) const;
+ };
+
+ struct CutFaceHasher
+ {
+#if OCC_VERSION_LARGE < 0x07080000
static Standard_Integer HashCode(const CutFace& f, const Standard_Integer upper)
{
return ::HashCode( FromSmIdType<int>(f.myInitFace->GetID()), upper );
{
return f1.myInitFace == f2.myInitFace;
}
- void Dump() const;
-
- private:
+#else
+ size_t operator()(const CutFace& f) const
+ {
+ return FromSmIdType<int>(f.myInitFace->GetID());
+ }
- EdgePart* getTwin( const EdgePart* edge ) const;
+ bool operator()(const CutFace& f1, const CutFace& f2) const
+ {
+ return f1.myInitFace == f2.myInitFace;
+ }
+#endif
};
- typedef NCollection_Map< CutFace, CutFace > TCutFaceMap;
+ typedef NCollection_Map< CutFace, CutFaceHasher > TCutFaceMap;
//--------------------------------------------------------------------------------
/*!
#ifndef __SMESH_TypeDefs_HXX__
#define __SMESH_TypeDefs_HXX__
+#include <Basics_OCCTVersion.hxx>
+
#include "SMESH_Utils.hxx"
#include "SMDS_SetIterator.hxx"
#include <gp_XYZ.hxx>
#include <gp_XY.hxx>
+#include <NCollection_Sequence.hxx>
#include <map>
#include <list>
const SMDS_MeshNode* node2() const { return second; }
// methods for usage of SMESH_TLink as a hasher in NCollection maps
+ //static int HashCode(const SMESH_TLink& link, int aLimit)
+ //{
+ // return smIdHasher::HashCode( link.node1()->GetID() + link.node2()->GetID(), aLimit );
+ //}
+ //static Standard_Boolean IsEqual(const SMESH_TLink& l1, const SMESH_TLink& l2)
+ //{
+ // return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() );
+ //}
+};
+// a hasher in NCollection maps
+struct SMESH_TLinkHasher
+{
+#if OCC_VERSION_LARGE < 0x07080000
static int HashCode(const SMESH_TLink& link, int aLimit)
{
return smIdHasher::HashCode( link.node1()->GetID() + link.node2()->GetID(), aLimit );
{
return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() );
}
+#else
+ size_t operator()(const SMESH_TLink& link) const
+ {
+ return smIdHasher()( link.node1()->GetID() + link.node2()->GetID() );
+ }
+ bool operator()(const SMESH_TLink& l1, const SMESH_TLink& l2) const
+ {
+ return ( l1.node1() == l2.node1() && l1.node2() == l2.node2() );
+ }
+#endif
};
typedef SMESH_TLink SMESH_Link;
struct SMESH_Hasher
{
+#if OCC_VERSION_LARGE < 0x07080000
static Standard_Integer HashCode(const SMDS_MeshElement* e, const Standard_Integer upper)
{
return smIdHasher::HashCode( e->GetID(), upper );
{
return ( e1 == e2 );
}
+#else
+ size_t operator()(const SMDS_MeshElement* e) const
+ {
+ return smIdHasher()( e->GetID() );
+ }
+
+ bool operator()(const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const
+ {
+ return ( e1 == e2 );
+ }
+#endif
};
//--------------------------------------------------
// --------------------------------------------------------------------------------
// class SMESH_SequenceOfNode
-#include <NCollection_DefineSequence.hxx>
-typedef const SMDS_MeshNode* SMDS_MeshNodePtr;
-DEFINE_SEQUENCE(SMESH_SequenceOfNode,
- SMESH_BaseCollectionNodePtr, SMDS_MeshNodePtr)
+typedef const SMDS_MeshNode* SMDS_MeshNodePtr;
+typedef NCollection_Sequence< SMDS_MeshNodePtr > SMESH_SequenceOfNode;
#endif
#include <Bnd_Box.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include <Geom_Surface.hxx>
-#include <NCollection_DefineArray2.hxx>
+#include <NCollection_Array2.hxx>
#include <Precision.hxx>
#include <ShapeAnalysis.hxx>
#include <TColStd_SequenceOfInteger.hxx>
# --- tube coude sain
- geometrieSaine = geompy.MakePartition([tube_1, coude, tube_2, P1, P2], [plan_y], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
+ #Refactor to perform the partition in two steps to avoid break from occt (reported bug#)
+ #geometrieSaine = geompy.MakePartition([tube_1, coude, tube_2, P1, P2], [plan_y], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
+ geometrieSaine0 = geompy.MakePartition([tube_1, coude], [plan_y], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
+ geometrieSaine = geompy.MakePartition([geometrieSaine0, tube_2, P1, P2], [plan_y], [], [], geompy.ShapeType["SOLID"], 0, [], 1)
geomPublish(initLog.debug, geometrieSaine, self.nomCas, self.numeroCas )
[P1, P2] = geompy.RestoreGivenSubShapes(geometrieSaine, [P1, P2], GEOM.FSM_GetInPlaceByHistory, False, True)
# define arguments for MakePolyLine
segments = []
+
# between nodes 20 and 1, default plane
segments.append( SMESH.PolySegment( 20, 0, SMESH.PointStruct(-1, -1, -1), 1, 0, SMESH.PointStruct(-1, -1, -1), smesh.MakeDirStruct(0,0,0) ))
+
# between nodes 1 and 100, default plane
segments.append( SMESH.PolySegment( 1, 0, SMESH.PointStruct(-1, -1, -1), 200, 0, SMESH.PointStruct(-1, -1, -1), smesh.MakeDirStruct(0,0,0) ))
-# between nodes 200 and edge (578, 577), plane includes vector (1,1,1)
-segments.append( SMESH.PolySegment( 200, 0, SMESH.PointStruct(-1, -1, -1), 578, 577, SMESH.PointStruct(-1, -1, -1), smesh.MakeDirStruct(1,1,1) ))
+
+# between node 200 and edge (578, 577), plane includes vector (1,1,1)
+#segments.append( SMESH.PolySegment( 200, 0, SMESH.PointStruct(-1, -1, -1), 578, 577, SMESH.PointStruct(-1, -1, -1), smesh.MakeDirStruct(1,1,1) ))
+# nodes 578 and 577 are not always neighbour, so, use another approach
+
+# between node 200 and an edge, close to point (200, 90, 70), plane includes vector (1,1,1)
+elems = Mesh_1.FindElementsByPoint(200, 90, 70, SMESH.FACE)
+nodes = Mesh_1.GetElemNodes(elems[0])
+segments.append( SMESH.PolySegment( 200, 0, SMESH.PointStruct(-1, -1, -1), nodes[0], nodes[1], SMESH.PointStruct(-1, -1, -1), smesh.MakeDirStruct(1,1,1) ))
Mesh_1.MakePolyLine( segments, "1D group")
print("Nb Segments:", nb_segments)
print("Nb Points:", nb_points)
- assert nb_triangles == 12
- assert nb_points == 8
+ assert nb_triangles == 12*2
+ assert nb_points == 14
assert nb_segments == 12
if __name__ == "__main__":