-// 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
// File : SMESH_Algo.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-//
+
#include "SMESH_Algo.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
+#include "SMESH_subMesh.hxx"
+
+#include <Basics_OCCTVersion.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepLProp.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <Geom_Surface.hxx>
#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
#include <TopLoc_Location.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Wire.hxx>
#include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx>
{
gen->_mapAlgo[hypId] = this;
- _onlyUnaryInput = _requireDescretBoundary = _requireShape = true;
+ _onlyUnaryInput = _requireDiscreteBoundary = _requireShape = true;
_quadraticMesh = _supportSubmeshes = false;
_error = COMPERR_OK;
}
{
}
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+ : SMESH_Algo(hypId, studyId, gen)
+{
+ _shapeType = (1 << TopAbs_VERTEX);
+ _type = ALGO_0D;
+ gen->_map0D_Algo[hypId] = this;
+}
+SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+ : SMESH_Algo(hypId, studyId, gen)
+{
+ _shapeType = (1 << TopAbs_EDGE);
+ _type = ALGO_1D;
+ gen->_map1D_Algo[hypId] = this;
+}
+SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+ : SMESH_Algo(hypId, studyId, gen)
+{
+ _shapeType = (1 << TopAbs_FACE);
+ _type = ALGO_2D;
+ gen->_map2D_Algo[hypId] = this;
+}
+SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+ : SMESH_Algo(hypId, studyId, gen)
+{
+ _shapeType = (1 << TopAbs_SOLID);
+ _type = ALGO_3D;
+ gen->_map3D_Algo[hypId] = this;
+}
+
//=============================================================================
/*!
* Usually an algoritm has nothing to save
return false;
const SMDS_EdgePosition* epos =
static_cast<const SMDS_EdgePosition*>(node->GetPosition());
- theNodes.insert( make_pair( epos->GetUParameter(), node ));
+ theNodes.insert( theNodes.end(), make_pair( epos->GetUParameter(), node ));
//MESSAGE("U " << epos->GetUParameter() << " ID " << node->GetID());
++nbNodes;
}
{
//E1.Orientation(TopAbs_FORWARD), E2.Orientation(TopAbs_FORWARD); // avoid pb with internal edges
if (E1.Orientation() > TopAbs_REVERSED) // INTERNAL
- E1.Orientation( TopAbs_FORWARD );
+ E1.Orientation( TopAbs_FORWARD );
if (E2.Orientation() > TopAbs_REVERSED) // INTERNAL
- E2.Orientation( TopAbs_FORWARD );
- TopoDS_Vertex V = TopExp::LastVertex (E1, true);
- if ( !V.IsSame( TopExp::FirstVertex(E2, true )))
- if ( !TopExp::CommonVertex( E1, E2, V ))
- return GeomAbs_C0;
+ E2.Orientation( TopAbs_FORWARD );
+
+ TopoDS_Vertex V, VV1[2], VV2[2];
+ TopExp::Vertices( E1, VV1[0], VV1[1], true );
+ TopExp::Vertices( E2, VV2[0], VV2[1], true );
+ if ( VV1[1].IsSame( VV2[0] )) { V = VV1[1]; }
+ else if ( VV1[0].IsSame( VV2[1] )) { V = VV1[0]; }
+ else if ( VV1[1].IsSame( VV2[1] )) { V = VV1[1]; E1.Reverse(); }
+ else if ( VV1[0].IsSame( VV2[0] )) { V = VV1[0]; E1.Reverse(); }
+ else { return GeomAbs_C0; }
+
Standard_Real u1 = BRep_Tool::Parameter( V, E1 );
Standard_Real u2 = BRep_Tool::Parameter( V, E2 );
BRepAdaptor_Curve C1( E1 ), C2( E2 );
Standard_Real tol = BRep_Tool::Tolerance( V );
Standard_Real angTol = 2e-3;
try {
-#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
+#if OCC_VERSION_LARGE > 0x06010000
OCC_CATCH_SIGNALS;
#endif
return BRepLProp::Continuity(C1, C2, u1, u2, tol, angTol);
return error( COMPERR_BAD_INPUT_MESH, "Mesh built on shape expected");
}
-#ifdef WITH_SMESH_CANCEL_COMPUTE
+//=======================================================================
+//function : CancelCompute
+//purpose : Sets _computeCanceled to true. It's usage depends on
+// * implementation of a particular mesher.
+//=======================================================================
+
void SMESH_Algo::CancelCompute()
{
+ _computeCanceled = true;
+ _error = COMPERR_CANCELED;
}
-#endif
//================================================================================
/*!
if ( (*elem)->GetID() < 1 )
delete *elem;
_badInputElements.clear();
+
+ _computeCanceled = false;
}
//================================================================================
if ( elem )
_badInputElements.push_back( elem );
}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfWires(const TopoDS_Shape& S)
+{
+ int i = 0;
+ for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
+ i++;
+ return i;
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
+{
+ int nbPoints = 0;
+ for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
+ const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
+ int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
+ if(_quadraticMesh)
+ nb = nb/2;
+ nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
+ }
+ return nbPoints;
+}
+
+