-// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "SMDS_SetIterator.hxx"
#include "SMESHDS_Group.hxx"
#include "SMESHDS_Hypothesis.hxx"
+#include "SMESHDS_Mesh.hxx"
#include "SMESH_Algo.hxx"
#include "SMESH_ComputeError.hxx"
#include "SMESH_ControlsDef.hxx"
//virtual int NbElements() const { return _elements.size()+1; }
virtual int NbNodes() const { return Max( 0, _uvPtStructVec.size()-2 ); }
void SetUVPtStructVec(UVPtStructVec& vec) { _uvPtStructVec.swap( vec ); }
+ UVPtStructVec& GetUVPtStructVec() { return _uvPtStructVec; }
};
_ProxyMeshOfFace(const SMESH_Mesh& mesh): SMESH_ProxyMesh(mesh) {}
_EdgeSubMesh* GetEdgeSubMesh(int ID) { return (_EdgeSubMesh*) getProxySubMesh(ID); }
double _D; // _vec1.Crossed( _vec2 )
double _param1, _param2; // intersection param on _seg1 and _seg2
+ _SegmentIntersection(): _D(0), _param1(0), _param2(0) {}
+
bool Compute(const _Segment& seg1, const _Segment& seg2, bool seg2IsRay = false )
{
// !!! If seg2IsRay, returns true at any _param2 !!!
StdMeshers_ViscousLayers2D::Compute(SMESH_Mesh& theMesh,
const TopoDS_Face& theFace)
{
- SMESH_ProxyMesh::Ptr pm;
-
+ using namespace VISCOUS_2D;
vector< const StdMeshers_ViscousLayers2D* > hyps;
vector< TopoDS_Shape > hypShapes;
- if ( VISCOUS_2D::findHyps( theMesh, theFace, hyps, hypShapes ))
+
+ SMESH_ProxyMesh::Ptr pm = _ProxyMeshHolder::FindProxyMeshOfFace( theFace, theMesh );
+ if ( !pm )
{
- VISCOUS_2D::_ViscousBuilder2D builder( theMesh, theFace, hyps, hypShapes );
- pm = builder.Compute();
- SMESH_ComputeErrorPtr error = builder.GetError();
- if ( error && !error->IsOK() )
- theMesh.GetSubMesh( theFace )->GetComputeError() = error;
- else if ( !pm )
+ if ( findHyps( theMesh, theFace, hyps, hypShapes ))
+ {
+ VISCOUS_2D::_ViscousBuilder2D builder( theMesh, theFace, hyps, hypShapes );
+ pm = builder.Compute();
+ SMESH_ComputeErrorPtr error = builder.GetError();
+ if ( error && !error->IsOK() )
+ theMesh.GetSubMesh( theFace )->GetComputeError() = error;
+ else if ( !pm )
+ pm.reset( new SMESH_ProxyMesh( theMesh ));
+ if ( getenv("__ONLY__VL2D__"))
+ pm.reset();
+ }
+ else
+ {
pm.reset( new SMESH_ProxyMesh( theMesh ));
- if ( getenv("__ONLY__VL2D__"))
- pm.reset();
- }
- else
- {
- pm.reset( new SMESH_ProxyMesh( theMesh ));
+ }
}
return pm;
}
// --------------------------------------------------------------------------------
+void StdMeshers_ViscousLayers2D::SetProxyMeshOfEdge( const StdMeshers_FaceSide& edgeNodes )
+{
+ using namespace VISCOUS_2D;
+ SMESH_ProxyMesh::Ptr pm =
+ _ProxyMeshHolder::FindProxyMeshOfFace( edgeNodes.Face(), *edgeNodes.GetMesh() );
+ if ( !pm ) {
+ _ProxyMeshOfFace* proxyMeshOfFace = new _ProxyMeshOfFace( *edgeNodes.GetMesh() );
+ pm.reset( proxyMeshOfFace );
+ new _ProxyMeshHolder( edgeNodes.Face(), pm );
+ }
+ _ProxyMeshOfFace* proxyMeshOfFace = static_cast<_ProxyMeshOfFace*>( pm.get() );
+ _ProxyMeshOfFace::_EdgeSubMesh* sm = proxyMeshOfFace->GetEdgeSubMesh( edgeNodes.EdgeID(0) );
+ sm->GetUVPtStructVec() = edgeNodes.GetUVPtStruct();
+}
+// --------------------------------------------------------------------------------
+bool StdMeshers_ViscousLayers2D::HasProxyMesh( const TopoDS_Face& face, SMESH_Mesh& mesh )
+{
+ return VISCOUS_2D::_ProxyMeshHolder::FindProxyMeshOfFace( face, mesh ).get();
+}
+// --------------------------------------------------------------------------------
SMESH_ComputeErrorPtr
StdMeshers_ViscousLayers2D::CheckHypothesis(SMESH_Mesh& theMesh,
const TopoDS_Shape& theShape,
VISCOUS_2D::_ViscousBuilder2D builder( theMesh, face, hyps, hypShapes );
builder._faceSideVec =
StdMeshers_FaceSide::GetFaceWires( face, theMesh, true, error,
- SMESH_ProxyMesh::Ptr(),
+ NULL, SMESH_ProxyMesh::Ptr(),
/*theCheckVertexNodes=*/false);
if ( error->IsOK() && !builder.findEdgesWithLayers())
{
SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute()
{
- _faceSideVec = StdMeshers_FaceSide::GetFaceWires( _face, *_mesh, true, _error);
+ _faceSideVec = StdMeshers_FaceSide::GetFaceWires( _face, *_mesh, true, _error, &_helper );
if ( !_error->IsOK() )
return _proxyMesh;
if ( isR )
LR._lEdges.erase( LR._lEdges.begin()+1, eIt );
else
- LL._lEdges.erase( eIt, --LL._lEdges.end() );
+ LL._lEdges.erase( eIt+1, --LL._lEdges.end() );
// eIt = isR ? L._lEdges.begin()+1 : L._lEdges.end()-2;
// for ( size_t i = 1; i < iLE; ++i, eIt += dIt )
// eIt->_isBlocked = true;
faceProj->Perform( p );
if ( !faceProj->IsDone() || faceProj->NbPoints() < 1 )
return setLayerEdgeData( lEdge, u, pcurve, curve, p, reverse, NULL );
- Quantity_Parameter U,V;
+ Standard_Real U,V;
faceProj->LowerDistanceParameters(U,V);
lEdge._normal2D.SetCoord( U - uv.X(), V - uv.Y() );
lEdge._normal2D.Normalize();
}
} // loop on FACEs sharing E
+ // Check if L is an already shrinked seam
+ if ( adjFace.IsNull() && _helper.IsRealSeam( edgeID ))
+ if ( L._wire->Edge( L._edgeInd ).Orientation() == TopAbs_FORWARD )
+ continue;
// Commented as a case with a seam EDGE (issue 0052461) is hard to support
// because SMESH_ProxyMesh can't hold different sub-meshes for two
// 2D representations of the seam. But such a case is not a real practice one.
- // Check if L is an already shrinked seam
- // if ( adjFace.IsNull() && _helper.IsRealSeam( edgeID ))
// {
// for ( int iL2 = iL1-1; iL2 > -1; --iL2 )
// {
// x-x-x-x-----x-----x----
// | | | | e1 e2 e3
- int isRShrinkedForAdjacent;
+ int isRShrinkedForAdjacent = 0;
UVPtStructVec nodeDataForAdjacent;
for ( int isR = 0; isR < 2; ++isR )
{
vector< double > segLen( L._lEdges.size() );
segLen[0] = 0.0;
- // check if length modification is usefull: look for _LayerEdge's
+ // check if length modification is useful: look for _LayerEdge's
// with length limited due to collisions
bool lenLimited = false;
for ( size_t iLE = 1; ( iLE < L._lEdges.size()-1 && !lenLimited ); ++iLE )
nodeDataVec.front().param = L._wire->FirstU( L._edgeInd );
nodeDataVec.back() .param = L._wire->LastU ( L._edgeInd );
+ if (( nodeDataVec[0].node == nodeDataVec.back().node ) &&
+ ( _helper.GetPeriodicIndex() == 1 || _helper.GetPeriodicIndex() == 2 )) // closed EDGE
+ {
+ const int iCoord = _helper.GetPeriodicIndex();
+ gp_XY uv = nodeDataVec[0].UV();
+ uv.SetCoord( iCoord, L._lEdges[0]._uvOut.Coord( iCoord ));
+ nodeDataVec[0].SetUV( uv );
+
+ uv = nodeDataVec.back().UV();
+ uv.SetCoord( iCoord, L._lEdges.back()._uvOut.Coord( iCoord ));
+ nodeDataVec.back().SetUV( uv );
+ }
+
_ProxyMeshOfFace::_EdgeSubMesh* edgeSM
= getProxyMesh()->GetEdgeSubMesh( L._wire->EdgeID( L._edgeInd ));
edgeSM->SetUVPtStructVec( nodeDataVec );