Salome HOME
projects
/
modules
/
smesh.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
#17956 [CEA 17925] COMPERR_OCC_EXCEPTION
[modules/smesh.git]
/
src
/
SMESH
/
SMESH_Pattern.cxx
diff --git
a/src/SMESH/SMESH_Pattern.cxx
b/src/SMESH/SMESH_Pattern.cxx
index db6e60e8ca629adbb489633dcffe0758783b0583..c1694cb248214c9888251a5136c2235213003bb4 100644
(file)
--- a/
src/SMESH/SMESH_Pattern.cxx
+++ b/
src/SMESH/SMESH_Pattern.cxx
@@
-1,4
+1,4
@@
-// Copyright (C) 2007-201
6
CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-201
9
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
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@
-38,6
+38,7
@@
#include "SMESH_Block.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_MeshAlgos.hxx"
#include "SMESH_Block.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_MeshAlgos.hxx"
+#include "SMESH_MeshEditor.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_subMesh.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_subMesh.hxx"
@@
-75,14
+76,13
@@
#include <gp_XY.hxx>
#include <gp_XYZ.hxx>
#include <gp_XY.hxx>
#include <gp_XYZ.hxx>
-#include <Basics_OCCTVersion.hxx>
-
#include <Basics_Utils.hxx>
#include "utilities.h"
using namespace std;
#include <Basics_Utils.hxx>
#include "utilities.h"
using namespace std;
-typedef map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::map< const SMDS_MeshElement*, int > TNodePointIDMap;
+typedef std::list< TopoDS_Edge > TWire;
#define smdsNode( elem ) static_cast<const SMDS_MeshNode*>( elem )
#define smdsNode( elem ) static_cast<const SMDS_MeshNode*>( elem )
@@
-803,8
+803,7
@@
bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
++nbMeduimNodes;
continue;
}
++nbMeduimNodes;
continue;
}
- const SMDS_EdgePosition* epos =
- static_cast<const SMDS_EdgePosition*>(node->GetPosition());
+ SMDS_EdgePositionPtr epos = node->GetPosition();
double u = epos->GetUParameter();
paramNodeMap.insert( make_pair( u, node ));
}
double u = epos->GetUParameter();
paramNodeMap.insert( make_pair( u, node ));
}
@@
-931,8
+930,7
@@
bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
if ( theProject || edgesUVBox.IsOut( p->myInitUV ) )
p->myInitUV = project( node, projector );
else {
if ( theProject || edgesUVBox.IsOut( p->myInitUV ) )
p->myInitUV = project( node, projector );
else {
- const SMDS_FacePosition* pos =
- static_cast<const SMDS_FacePosition*>(node->GetPosition());
+ SMDS_FacePositionPtr pos = node->GetPosition();
p->myInitUV.SetCoord( pos->GetUParameter(), pos->GetVParameter() );
}
p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 );
p->myInitUV.SetCoord( pos->GetUParameter(), pos->GetVParameter() );
}
p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 );
@@
-2483,20
+2481,21
@@
bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
// If there are several wires, define the order of edges of inner wires:
// compute UV of inner edge-points using 2 methods: the one for in-face points
// and the one for on-edge points and then choose the best edge order
// If there are several wires, define the order of edges of inner wires:
// compute UV of inner edge-points using 2 methods: the one for in-face points
// and the one for on-edge points and then choose the best edge order
- // by the best correspondance of the 2 results
+ // by the best correspondence of the 2 results.
+ // The wires are sorted by number of edges to correspond to wires of the pattern
if ( nbWires > 1 )
{
// compute UV of inner edge-points using the method for in-face points
// and divide eList into a list of separate wires
bool aBool;
if ( nbWires > 1 )
{
// compute UV of inner edge-points using the method for in-face points
// and divide eList into a list of separate wires
bool aBool;
- list<
list< TopoDS_Edge >
> wireList;
+ list<
TWire
> wireList;
list<TopoDS_Edge>::iterator eIt = elIt;
list<int>::iterator nbEIt = nbVertexInWires.begin();
for ( nbEIt++; nbEIt != nbVertexInWires.end(); nbEIt++ )
{
int nbEdges = *nbEIt;
wireList.push_back( list< TopoDS_Edge >() );
list<TopoDS_Edge>::iterator eIt = elIt;
list<int>::iterator nbEIt = nbVertexInWires.begin();
for ( nbEIt++; nbEIt != nbVertexInWires.end(); nbEIt++ )
{
int nbEdges = *nbEIt;
wireList.push_back( list< TopoDS_Edge >() );
-
list< TopoDS_Edge >
& wire = wireList.back();
+
TWire
& wire = wireList.back();
for ( iE = 0 ; iE < nbEdges; eIt++, iE++ )
{
list< TPoint* > & ePoints = getShapePoints( *eIt );
for ( iE = 0 ; iE < nbEdges; eIt++, iE++ )
{
list< TPoint* > & ePoints = getShapePoints( *eIt );
@@
-2527,13
+2526,13
@@
bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
// find points - edge correspondence for wires of unique size,
// edge order within a wire should be defined only
// find points - edge correspondence for wires of unique size,
// edge order within a wire should be defined only
- list<
list< TopoDS_Edge >
>::iterator wlIt = wireList.begin();
+ list<
TWire
>::iterator wlIt = wireList.begin();
while ( wlIt != wireList.end() )
{
while ( wlIt != wireList.end() )
{
-
list< TopoDS_Edge >
& wire = (*wlIt);
+
TWire
& wire = (*wlIt);
size_t nbEdges = wire.size();
wlIt++;
size_t nbEdges = wire.size();
wlIt++;
- if ( wlIt
!= wireList.end() &&
(*wlIt).size() != nbEdges ) // a unique size wire
+ if ( wlIt
== wireList.end() ||
(*wlIt).size() != nbEdges ) // a unique size wire
{
// choose the best first edge of a wire
setFirstEdge( wire, id1 );
{
// choose the best first edge of a wire
setFirstEdge( wire, id1 );
@@
-2549,6
+2548,12
@@
bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
edgesPoints->insert( edgesPoints->end(), ePoints.begin(), (--ePoints.end()));
}
}
edgesPoints->insert( edgesPoints->end(), ePoints.begin(), (--ePoints.end()));
}
}
+ else
+ {
+ // skip same size wires
+ while ( wlIt != wireList.end() && (*wlIt).size() == nbEdges )
+ wlIt++;
+ }
id1 += nbEdges;
}
id1 += nbEdges;
}
@@
-2559,7
+2564,7
@@
bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
while ( wlIt != wireList.end() )
{
size_t nbSameSize = 0, nbEdges = (*wlIt).size();
while ( wlIt != wireList.end() )
{
size_t nbSameSize = 0, nbEdges = (*wlIt).size();
- list<
list< TopoDS_Edge >
>::iterator wlIt2 = wlIt;
+ list<
TWire
>::iterator wlIt2 = wlIt;
wlIt2++;
while ( wlIt2 != wireList.end() && (*wlIt2).size() == nbEdges ) { // a same size wire
nbSameSize++;
wlIt2++;
while ( wlIt2 != wireList.end() && (*wlIt2).size() == nbEdges ) { // a same size wire
nbSameSize++;
@@
-2576,7
+2581,7
@@
bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
for ( wlIt = wireList.begin(); wlIt != wireList.end(); wlIt++ )
{
for ( wlIt = wireList.begin(); wlIt != wireList.end(); wlIt++ )
{
-
list< TopoDS_Edge >
& wire = (*wlIt);
+
TWire
& wire = (*wlIt);
eList.splice( eList.end(), wire, wire.begin(), wire.end() );
}
eList.splice( eList.end(), wire, wire.begin(), wire.end() );
}
@@
-3290,8
+3295,7
@@
bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
const SMDS_MeshNode* node = nIt->next();
if ( isQuadMesh && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge ))
continue;
const SMDS_MeshNode* node = nIt->next();
if ( isQuadMesh && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge ))
continue;
- const SMDS_EdgePosition* epos =
- static_cast<const SMDS_EdgePosition*>(node->GetPosition());
+ SMDS_EdgePositionPtr epos = node->GetPosition();
double u = ( epos->GetUParameter() - f ) / ( l - f );
(*pIt)->myInitXYZ.SetCoord( iCoord, isForward ? u : 1 - u );
}
double u = ( epos->GetUParameter() - f ) / ( l - f );
(*pIt)->myInitXYZ.SetCoord( iCoord, isForward ? u : 1 - u );
}
@@
-4174,7
+4178,8
@@
bool SMESH_Pattern::MakeMesh(SMESH_Mesh* theMesh,
createElements( theMesh, nodesVector, myElemPointIDs, myElements );
}
createElements( theMesh, nodesVector, myElemPointIDs, myElements );
}
- aMeshDS->compactMesh();
+ aMeshDS->Modified();
+ aMeshDS->CompactMesh();
if ( myToKeepNodes )
myOutNodes.swap( nodesVector );
if ( myToKeepNodes )
myOutNodes.swap( nodesVector );
@@
-4933,12
+4938,12
@@
void SMESH_Pattern::DumpPoints() const
SMESH_Pattern::TPoint::TPoint()
{
#ifdef _DEBUG_
SMESH_Pattern::TPoint::TPoint()
{
#ifdef _DEBUG_
- myInitXYZ.SetCoord(
0,0,0
);
- myInitUV.SetCoord(
0.,0
.);
- myInitU =
0
;
- myXYZ.SetCoord(
0,0,0
);
- myUV.SetCoord(
0.,0
.);
- myU =
0
;
+ myInitXYZ.SetCoord(
7,7,7
);
+ myInitUV.SetCoord(
7.,7
.);
+ myInitU =
7
;
+ myXYZ.SetCoord(
7,7,7
);
+ myUV.SetCoord(
7.,7
.);
+ myU =
7
;
#endif
}
#endif
}