From 19d95d14264fe00d3640126f912287dbc38f972c Mon Sep 17 00:00:00 2001 From: ptv Date: Mon, 1 Dec 2008 12:08:28 +0000 Subject: [PATCH] Imp 19925 - Mesh preview --- .../gui/SMESH/images/mesh_precompute.png | Bin 750 -> 1145 bytes .../gui/SMESH/images/preview_mesh_1D.png | Bin 0 -> 8824 bytes .../gui/SMESH/images/preview_mesh_2D.png | Bin 0 -> 29776 bytes .../gui/SMESH/images/preview_tmp_data.png | Bin 0 -> 5352 bytes doc/salome/gui/SMESH/input/index.doc | 1 + doc/salome/gui/SMESH/input/preview_meshes.doc | 36 ++++++++++ idl/SMESH_Gen.idl | 11 +++ idl/SMESH_Mesh.idl | 6 ++ src/SMESH/SMESH_Gen.cxx | 68 +++++++++++++----- src/SMESH/SMESH_Gen.hxx | 13 +++- src/SMESH/SMESH_Hypothesis.hxx | 8 +++ src/SMESH/SMESH_Mesh.cxx | 26 +++++++ src/SMESH/SMESH_Mesh.hxx | 5 ++ src/SMESH/SMESH_MeshEditor.cxx | 61 ++++++---------- src/SMESH/SMESH_MeshEditor.hxx | 18 +++++ 15 files changed, 193 insertions(+), 60 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/preview_mesh_1D.png create mode 100644 doc/salome/gui/SMESH/images/preview_mesh_2D.png create mode 100644 doc/salome/gui/SMESH/images/preview_tmp_data.png create mode 100644 doc/salome/gui/SMESH/input/preview_meshes.doc diff --git a/doc/salome/gui/SMESH/images/mesh_precompute.png b/doc/salome/gui/SMESH/images/mesh_precompute.png index 4d7bb3d46b6d1a595d98c2e2e43e1dfa9cd559c3..dd90498cf2807d1c51e06b16eda624dc42e69f6e 100644 GIT binary patch delta 1130 zcmV-w1eN>l1^EawiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4FCWD24YJ` zL;(K){{a7>y{D6tH~}Gl3kESnB=*|?00ag}L_t(I%Y~F(XcSiz$A2?B>}Kz*8bZ>h z+SW*DDosn3#HVqiiJum=Ao}D7_2p=w7!Vh2SMA7+G2|qOH>rK zYl2@1!LQxK#Lb7v&hG3?W_EV>_944VRH*lIxR-m+{onKPKSz;&Qu4B)>$(K6ZF@!W zXu4L`T0w%ul-RS%Qp*1oA%y((%9!jv^FUTsR!U$8@FAdA$*LDV*Is6c5CSPdQ51YW zAHbU8-PEiyn2|yv78)fJIBH8@3DRVUrfb^ zn0R!D{&Qh~Fc4K1CPmkEdHL=W%sG!4(_=E_Fh1juwj6vu4WCaTmzTI!n&jjNW5ZD{ zM-Bl*01Jpd6GPj!Lu=n%nmK;)A@M1T`y-Pi9^E0I%d(_@dKrsrmf;TwR82!l`8?Pl z5LFif3L!FQZ;Uc&INXaTxZi)C(V?rHJ-mzG_HCh%^UySvil9y~RLLiszX50iY+wY4 zsU=rS8BWblaFdR62`geA2YYhX_WgZqmYlIN7 zZ;#x-cJt&55>-`LA~dQ(ek#WPVZ-N}S^nx0QZC@k1Ku1Sq3_f|y1Rc|r!8m_maglW z&YpgMl4cgyu~1bNMNvuS1ElR7OI^yAmB0)mg<%+^-88_Uwy;V%kM=V$og|rvaeU7f z+IAm777FA%2ggctar^=GZ#A&$<7RLmZlvZdymp$ShkJGdE3_6`FfpmFu4ZCthROIK zC%^9ih(x-+XaiWiVGHS*1P=!;FtmO(hG9^DSzCu;%!9?_H!;KQU5nboUnxzpi7BQS zwMRjxlbC$8;Xt~sO?) z8bUzhf}R)Es34!qK2NvlLx;N873+6J(?eitA53N`bBq+ly>i_@%07*qoM6N<$f|u3|6aWAK delta 731 zcmV<10wn$U2<`=ciBL{Q4GJ0x0000DNk~Le0000P0000O2m=5B061%=^Z)<>3s6i{ zMF0Q*000O801yBG7zh9<7yv>!0E9{alu7`cQUI-50KIDf#%l=1a}dURA;wTxP?San zU|3LuG0ucJ&S7X^VrgNFLe7jz&Xh{dZ*OjJaBq}S&c|MV32=CToLbIsfRLPH&YWY` zgoK2gYu2S})`g3ZhK!PojEtpo)`pdojFXwAd)AGUnv|53t$Ws(l9ZE|k&u|6t%TN_ znwp%Poa%@;kf5-&jMk;4rL~mSps28+tE!-|u)Untt*xz~u+Y7w*7KoX#--M^wY9Lg zz{aiKu)xqdy}iB0wcfD6;K0DZ#>U35(D2U2-qyz6&d$!j*znfY*3j7S;OOw+=>OpG z|M2kt@c94#|NoTa*NKrcA%6)23X9x7)Bpeg9dt!lbVF}#ZDnqB07G(RVRU6=Aa`kW zXdqN*WgtgMO;GP-C2jx!0ZmCnK~yNub-?vLH$7C(yui={UW%qG2=1YHBnpOg4&aDN%p@yDI<3oZu( zx)MO)X-Q`y+--yNMnhCREh{>w)7q}wg~CQwe-{dbL_D zpWTE4ew+I=5?=(o+B$Lt`AB*n^uNDKw=62gB6g($8`9F{^GCC^({jclHZNAPa+n3V zJ2}`reQZsHQB^fpwVb$;NzHsriHN_W4#P4bb;=wnXd-iw_ZSyR6#p@`gB#T+Hm(2w N002ovPDHLkV1foKSEv90 diff --git a/doc/salome/gui/SMESH/images/preview_mesh_1D.png b/doc/salome/gui/SMESH/images/preview_mesh_1D.png new file mode 100644 index 0000000000000000000000000000000000000000..3922a19f5b8e60829a28131cebd6443781c9895c GIT binary patch literal 8824 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 TV?Na?0D!8Jrs8LL%h3M;gaVG0 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/preview_mesh_2D.png b/doc/salome/gui/SMESH/images/preview_mesh_2D.png new file mode 100644 index 0000000000000000000000000000000000000000..55ec7b8fbaef5c73e6c40347fd4ff49efc180de2 GIT binary patch literal 29776 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/preview_tmp_data.png b/doc/salome/gui/SMESH/images/preview_tmp_data.png new file mode 100644 index 0000000000000000000000000000000000000000..be1a1251562de42593c67ae14cf5dadf0b956e35 GIT binary patch literal 5352 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/input/index.doc b/doc/salome/gui/SMESH/input/index.doc index 4f772a285..8cb09dbc4 100644 --- a/doc/salome/gui/SMESH/input/index.doc +++ b/doc/salome/gui/SMESH/input/index.doc @@ -33,6 +33,7 @@
  • \ref constructing_submeshes_page
  • \ref building_compounds_page
  • \ref editing_meshes_page
  • +
  • \ref preview_meshes_page
  • \subpage viewing_meshes_page
    • diff --git a/doc/salome/gui/SMESH/input/preview_meshes.doc b/doc/salome/gui/SMESH/input/preview_meshes.doc new file mode 100644 index 000000000..92a4cca27 --- /dev/null +++ b/doc/salome/gui/SMESH/input/preview_meshes.doc @@ -0,0 +1,36 @@ +/*! + +\page preview_meshes_page Preview and Compute meshes + +Before whole mesh computation it is allowed to see the mesh preview. +When mesh object is already created and all hypotheses assigned, +select your mesh in the Object Browser. From the +\b Mesh menu select \b Preview or click "Preview" button of the +toolbar or activate "Preview" item from pop-up menu. + +\image html mesh_precompute.png +
      "Preview" button
      + +The Mesh Preview dialog box appears. In this dialog box you can select +preview mode 1D mesh or 2D mesh depending on assigned +hypotheses to mesh. + +The 1D mesh preview shows as nodes computed on geometry edges + +\image html preview_mesh_1D.png + +The 2D mesh preview shows edge mesh elements, computed on geometry faces + +\image html preview_mesh_2D.png + +Pressing Compute button leads to whole mesh computation +process. +During exit from Preview dialog box, the question about storage temporary +created mesh elements appers: + +\image html preview_tmp_data.png + +Note, that computed temporary mesh elements can be reused during next +mesh computation process. + +*/ diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index cad0d9f62..f12e67ae8 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -221,6 +221,17 @@ module SMESH in GEOM::GEOM_Object theSubObject ) raises ( SALOME::SALOME_Exception ); + /*! + * Calculate Mesh as preview till indicated dimension + * First, verify list of hypothesis associated with the subShape. + * Return mesh preview structure + */ + MeshPreviewStruct Precompute( in SMESH_Mesh theMesh, + in GEOM::GEOM_Object theSubObject, + in Dimension theDimension, + inout long_array theShapesId ) + raises ( SALOME::SALOME_Exception ); + /*! * Return errors of hypotheses definintion * algo_error_array is empty if everything is OK diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index a0fff0fa9..76859da14 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -228,6 +228,12 @@ module SMESH void Clear() raises (SALOME::SALOME_Exception); + /*! + * Remove all nodes and elements of submesh + */ + void ClearSubMesh(in long ShapeID) + raises (SALOME::SALOME_Exception); + /*! * Get the subMesh object associated to a subShape. The subMesh object * gives access to nodes and elements IDs. diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index e8d57f86c..c86699a2a 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -129,9 +129,11 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) */ //============================================================================= -bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - const bool anUpward) +bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, + const TopoDS_Shape & aShape, + const bool anUpward, + const ::MeshDimension aDim, + TSetOfInt* aShapesId) { MESSAGE("SMESH_Gen::Compute"); @@ -155,16 +157,22 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, SMESH_subMesh* smToCompute = smIt->next(); // do not mesh vertices of a pseudo shape - if ( !aMesh.HasShapeToMesh() && - smToCompute->GetSubShape().ShapeType() == TopAbs_VERTEX ) + const TopAbs_ShapeEnum aShType = smToCompute->GetSubShape().ShapeType(); + if ( !aMesh.HasShapeToMesh() && aShType == TopAbs_VERTEX ) continue; + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aShType ) > (int)aDim ) + continue; + if (smToCompute->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE) smToCompute->ComputeStateEngine( SMESH_subMesh::COMPUTE ); // we check all the submeshes here and detect if any of them failed to compute if (smToCompute->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE) ret = false; + else if ( aShapesId ) + aShapesId->insert( smToCompute->GetId() ); } return ret; } @@ -184,7 +192,12 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, continue; const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); - if ( GetShapeDim( aSubShape ) < 1 ) break; + const int aShapeDim = GetShapeDim( aSubShape ); + if ( aShapeDim < 1 ) break; + + // check for preview dimension limitations + if ( aShapesId && aShapeDim > (int)aDim ) + continue; SMESH_Algo* algo = GetAlgo( aMesh, aSubShape ); if ( algo && !algo->NeedDescretBoundary() ) @@ -192,7 +205,11 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, if ( algo->SupportSubmeshes() ) smWithAlgoSupportingSubmeshes.push_back( smToCompute ); else + { smToCompute->ComputeStateEngine( SMESH_subMesh::COMPUTE ); + if ( aShapesId ) + aShapesId->insert( smToCompute->GetId() ); + } } } // ------------------------------------------------------------ @@ -219,8 +236,14 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, SMESH_subMesh* smToCompute = smIt->next(); const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); - if ( aSubShape.ShapeType() == TopAbs_VERTEX ) continue; - + const int aShapeDim = GetShapeDim( aSubShape ); + //if ( aSubShape.ShapeType() == TopAbs_VERTEX ) continue; + if ( aShapeDim < 1 ) continue; + + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim ) + continue; + SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); filter .And( SMESH_HypoFilter::IsApplicableTo( aSubShape )) @@ -230,7 +253,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, SMESH_Hypothesis::Hypothesis_Status status; if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status )) // mesh a lower smToCompute starting from vertices - Compute( aMesh, aSubShape, /*anUpward=*/true ); + Compute( aMesh, aSubShape, /*anUpward=*/true, aDim, aShapesId ); } } } @@ -239,12 +262,21 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // ---------------------------------------------------------- for ( subIt = smWithAlgoSupportingSubmeshes.rbegin(); subIt != subEnd; ++subIt ) if ( sm->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE) + { + const TopAbs_ShapeEnum aShType = sm->GetSubShape().ShapeType(); + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aShType ) > (int)aDim ) + continue; + sm->ComputeStateEngine( SMESH_subMesh::COMPUTE ); + if ( aShapesId ) + aShapesId->insert( sm->GetId() ); + } // ----------------------------------------------- // mesh the rest subshapes starting from vertices // ----------------------------------------------- - ret = Compute( aMesh, aShape, /*anUpward=*/true ); + ret = Compute( aMesh, aShape, /*anUpward=*/true, aDim, aShapesId ); } MESSAGE( "VSR - SMESH_Gen::Compute() finished, OK = " << ret); @@ -708,14 +740,14 @@ int SMESH_Gen::GetShapeDim(const TopAbs_ShapeEnum & aShapeType) if ( dim.empty() ) { dim.resize( TopAbs_SHAPE, -1 ); - dim[ TopAbs_COMPOUND ] = 3; - dim[ TopAbs_COMPSOLID ] = 3; - dim[ TopAbs_SOLID ] = 3; - dim[ TopAbs_SHELL ] = 3; - dim[ TopAbs_FACE ] = 2; - dim[ TopAbs_WIRE ] = 1; - dim[ TopAbs_EDGE ] = 1; - dim[ TopAbs_VERTEX ] = 0; + dim[ TopAbs_COMPOUND ] = MeshDim_3D; + dim[ TopAbs_COMPSOLID ] = MeshDim_3D; + dim[ TopAbs_SOLID ] = MeshDim_3D; + dim[ TopAbs_SHELL ] = MeshDim_3D; + dim[ TopAbs_FACE ] = MeshDim_2D; + dim[ TopAbs_WIRE ] = MeshDim_1D; + dim[ TopAbs_EDGE ] = MeshDim_1D; + dim[ TopAbs_VERTEX ] = MeshDim_0D; } return dim[ aShapeType ]; } diff --git a/src/SMESH/SMESH_Gen.hxx b/src/SMESH/SMESH_Gen.hxx index ef90a40e4..a6a04436a 100644 --- a/src/SMESH/SMESH_Gen.hxx +++ b/src/SMESH/SMESH_Gen.hxx @@ -45,6 +45,7 @@ #include #include +#include class SMESHDS_Document; @@ -57,6 +58,8 @@ typedef struct studyContextStruct SMESHDS_Document * myDocument; } StudyContextStruct; +typedef std::set TSetOfInt; + class SMESH_EXPORT SMESH_Gen { public: @@ -69,11 +72,15 @@ class SMESH_EXPORT SMESH_Gen /*! * \brief Computes aMesh on aShape * \param anUpward - compute from vertices up to more complex shape (internal usage) + * \param aDim - upper level dimension of the mesh computation + * \param aShapesId - list of shapes with computed mesh entities (elements or nodes) * \retval bool - true if none submesh failed to compute */ - bool Compute(::SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - const bool anUpward=false); + bool Compute(::SMESH_Mesh & aMesh, + const TopoDS_Shape & aShape, + const bool anUpward=false, + const ::MeshDimension aDim=::MeshDim_3D, + TSetOfInt* aShapesId=0); bool CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape); // notify on bad state of attached algos, return false diff --git a/src/SMESH/SMESH_Hypothesis.hxx b/src/SMESH/SMESH_Hypothesis.hxx index a63ea921e..ea3f8c6b4 100644 --- a/src/SMESH/SMESH_Hypothesis.hxx +++ b/src/SMESH/SMESH_Hypothesis.hxx @@ -37,6 +37,14 @@ class SMESH_Gen; class TopoDS_Shape; class SMESH_Mesh; +enum MeshDimension // dimension of mesh +{ + MeshDim_0D, + MeshDim_1D, + MeshDim_2D, + MeshDim_3D +}; + class SMESH_EXPORT SMESH_Hypothesis: public SMESHDS_Hypothesis { public: diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 23b16a7a3..d8d8ea780 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -265,6 +265,32 @@ void SMESH_Mesh::Clear() // } } +//======================================================================= +/*! + * \brief Remove all nodes and elements of indicated shape + */ +//======================================================================= + +void SMESH_Mesh::ClearSubMesh(const int theShapeId) +{ + // clear sub-meshes; get ready to re-compute as a side-effect + if ( SMESH_subMesh *sm = GetSubMeshContaining( theShapeId ) ) + { + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true, + /*complexShapeFirst=*/false); + while ( smIt->more() ) + { + sm = smIt->next(); + TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType(); + if ( shapeType == TopAbs_VERTEX || shapeType < TopAbs_SOLID ) + // all other shapes depends on vertices so they are already cleaned + sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); + // to recompute even if failed + sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); + } + } +} + //======================================================================= //function : UNVToMesh //purpose : diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 5fb1c0ab4..c07961fa8 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -87,6 +87,11 @@ public: */ void Clear(); + /*! + * \brief Remove all nodes and elements of indicated shape + */ + void ClearSubMesh(const int theShapeId); + int UNVToMesh(const char* theFileName); /*! * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index d52502f25..14ea394da 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -92,22 +92,6 @@ struct TNodeXYZ : public gp_XYZ { TNodeXYZ( const SMDS_MeshNode* n ):gp_XYZ( n->X(), n->Y(), n->Z() ) {} }; -typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; - -//======================================================================= -/*! - * \brief A sorted pair of nodes - */ -//======================================================================= - -struct TLink: public NLink -{ - TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 ) - { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); } - TLink(const NLink& link ):NLink( link ) - { if ( first->GetID() < second->GetID() ) std::swap( first, second ); } -}; - //======================================================================= //function : SMESH_MeshEditor //purpose : @@ -1460,10 +1444,10 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, // 1. map of elements with their linkIDs // 2. map of linkIDs with their elements - map< TLink, list< const SMDS_MeshElement* > > mapLi_listEl; - map< TLink, list< const SMDS_MeshElement* > >::iterator itLE; - map< const SMDS_MeshElement*, set< TLink > > mapEl_setLi; - map< const SMDS_MeshElement*, set< TLink > >::iterator itEL; + map< SMESH_TLink, list< const SMDS_MeshElement* > > mapLi_listEl; + map< SMESH_TLink, list< const SMDS_MeshElement* > >::iterator itLE; + map< const SMDS_MeshElement*, set< SMESH_TLink > > mapEl_setLi; + map< const SMDS_MeshElement*, set< SMESH_TLink > >::iterator itEL; TIDSortedElemSet::iterator itElem; for ( itElem = theElems.begin(); itElem != theElems.end(); itElem++ ) { @@ -1482,7 +1466,7 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, // fill maps for ( i = 0; i < 3; i++ ) { - TLink link( aNodes[i], aNodes[i+1] ); + SMESH_TLink link( aNodes[i], aNodes[i+1] ); // check if elements sharing a link can be fused itLE = mapLi_listEl.find( link ); if ( itLE != mapLi_listEl.end() ) { @@ -1508,7 +1492,7 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, int nbElems = (*itLE).second.size(); if ( nbElems < 2 ) { const SMDS_MeshElement* elem = (*itLE).second.front(); - TLink link = (*itLE).first; + SMESH_TLink link = (*itLE).first; mapEl_setLi[ elem ].erase( link ); if ( mapEl_setLi[ elem ].empty() ) mapEl_setLi.erase( elem ); @@ -1534,11 +1518,11 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, // search elements to fuse starting from startElem or links of elements // fused earlyer - startLinks - list< TLink > startLinks; + list< SMESH_TLink > startLinks; while ( startElem || !startLinks.empty() ) { while ( !startElem && !startLinks.empty() ) { // Get an element to start, by a link - TLink linkId = startLinks.front(); + SMESH_TLink linkId = startLinks.front(); startLinks.pop_front(); itLE = mapLi_listEl.find( linkId ); if ( itLE != mapLi_listEl.end() ) { @@ -1554,15 +1538,15 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, if ( startElem ) { // Get candidates to be fused const SMDS_MeshElement *tr1 = startElem, *tr2 = 0, *tr3 = 0; - const TLink *link12, *link13; + const SMESH_TLink *link12, *link13; startElem = 0; ASSERT( mapEl_setLi.find( tr1 ) != mapEl_setLi.end() ); - set< TLink >& setLi = mapEl_setLi[ tr1 ]; + set< SMESH_TLink >& setLi = mapEl_setLi[ tr1 ]; ASSERT( !setLi.empty() ); - set< TLink >::iterator itLi; + set< SMESH_TLink >::iterator itLi; for ( itLi = setLi.begin(); itLi != setLi.end(); itLi++ ) { - const TLink & link = (*itLi); + const SMESH_TLink & link = (*itLi); itLE = mapLi_listEl.find( link ); if ( itLE == mapLi_listEl.end() ) continue; @@ -1583,10 +1567,10 @@ bool SMESH_MeshEditor::TriToQuad (TIDSortedElemSet & theElems, } // add other links of elem to list of links to re-start from - set< TLink >& links = mapEl_setLi[ elem ]; - set< TLink >::iterator it; + set< SMESH_TLink >& links = mapEl_setLi[ elem ]; + set< SMESH_TLink >::iterator it; for ( it = links.begin(); it != links.end(); it++ ) { - const TLink& link2 = (*it); + const SMESH_TLink& link2 = (*it); if ( link2 != link ) startLinks.push_back( link2 ); } @@ -2443,9 +2427,8 @@ void SMESH_MeshEditor::Smooth (TIDSortedElemSet & theElems, // fix nodes on mesh boundary if ( checkBoundaryNodes ) { - typedef pair TLink; - map< TLink, int > linkNbMap; // how many times a link encounters in elemsOnFace - map< TLink, int >::iterator link_nb; + map< NLink, int > linkNbMap; // how many times a link encounters in elemsOnFace + map< NLink, int >::iterator link_nb; // put all elements links to linkNbMap list< const SMDS_MeshElement* >::iterator elemIt = elemsOnFace.begin(); for ( ; elemIt != elemsOnFace.end(); ++elemIt ) { @@ -2457,7 +2440,7 @@ void SMESH_MeshEditor::Smooth (TIDSortedElemSet & theElems, const SMDS_MeshNode* curNode, *prevNode = elem->GetNode( nbn ); for ( int iN = 0; iN < nbn; ++iN ) { curNode = elem->GetNode( iN ); - TLink link; + NLink link; if ( curNode < prevNode ) link = make_pair( curNode , prevNode ); else link = make_pair( prevNode , curNode ); prevNode = curNode; @@ -7541,8 +7524,8 @@ SMESH_MeshEditor::FindMatchingNodes(set& theSide1, if ( theSecondNode1 != theSecondNode2 ) nReplaceMap.insert( make_pair( theSecondNode1, theSecondNode2 )); - set< TLink > linkSet; // set of nodes where order of nodes is ignored - linkSet.insert( TLink( theFirstNode1, theSecondNode1 )); + set< SMESH_TLink > linkSet; // set of nodes where order of nodes is ignored + linkSet.insert( SMESH_TLink( theFirstNode1, theSecondNode1 )); list< NLink > linkList[2]; linkList[0].push_back( NLink( theFirstNode1, theSecondNode1 )); @@ -7657,8 +7640,8 @@ SMESH_MeshEditor::FindMatchingNodes(set& theSide1, for ( int i = 0; i < nbN; i++ ) { const SMDS_MeshNode* n2 = f0->GetNode( i ); - pair< set< TLink >::iterator, bool > iter_isnew = - linkSet.insert( TLink( n1, n2 )); + pair< set< SMESH_TLink >::iterator, bool > iter_isnew = + linkSet.insert( SMESH_TLink( n1, n2 )); if ( !iter_isnew.second ) { // already in a set: no need to process linkSet.erase( iter_isnew.first ); } diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 970dfc930..cb3ec6948 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -49,6 +49,24 @@ typedef std::map > TElemOfElemListMap; typedef std::map TNodeNodeMap; + +typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; + +//======================================================================= +/*! + * \brief A sorted pair of nodes + */ +//======================================================================= + +struct SMESH_TLink: public NLink +{ + SMESH_TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 ) + { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); } + SMESH_TLink(const NLink& link ):NLink( link ) + { if ( first->GetID() < second->GetID() ) std::swap( first, second ); } +}; + + class SMDS_MeshFace; class SMDS_MeshNode; class gp_Ax1; -- 2.39.2