From b22e182dd1a2c30be324b21074158390d00714b3 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 1 Jul 2015 14:59:24 +0300 Subject: [PATCH] 23080: [CEA 1497] Do not merge a middle node in quadratic with the extreme nodes of a segment --- doc/salome/gui/SMESH/images/mergenodes.png | Bin 33189 -> 34408 bytes .../gui/SMESH/images/mergenodes_auto.png | Bin 21422 -> 23601 bytes doc/salome/gui/SMESH/input/merging_nodes.doc | 4 + idl/SMESH_MeshEditor.idl | 19 ++-- src/SMESH/SMESH_MeshEditor.cxx | 87 +++++++++++---- src/SMESH/SMESH_MeshEditor.hxx | 3 +- src/SMESHGUI/SMESHGUI_MergeDlg.cxx | 77 ++++++++----- src/SMESHGUI/SMESHGUI_MergeDlg.h | 1 + src/SMESHGUI/SMESH_msg_en.ts | 4 + src/SMESHUtils/SMESH_OctreeNode.cxx | 33 +++--- src/SMESH_I/SMESH_Gen_i.cxx | 7 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 101 +++++++++--------- src/SMESH_I/SMESH_MeshEditor_i.hxx | 15 ++- src/SMESH_SWIG/smeshBuilder.py | 36 ++++--- .../StdMeshers_QuadFromMedialAxis_1D2D.cxx | 33 ++++-- 15 files changed, 259 insertions(+), 161 deletions(-) mode change 100755 => 100644 doc/salome/gui/SMESH/images/mergenodes.png diff --git a/doc/salome/gui/SMESH/images/mergenodes.png b/doc/salome/gui/SMESH/images/mergenodes.png old mode 100755 new mode 100644 index 05286a56e5d1b68d2e53a7e1d5f859046bcb6c2a..499453d456673ce6cbd2560bbec454f71f35029e GIT binary patch literal 34408 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 axO{DVddS500Dgf$Jd#qBERlHX`#%6|fGJ1- literal 33189 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

Z+D3G`6Pi5-jyb94 z0dGg6kx-!i>$z3S)Nd#4x5Z+0>hKvwzc-;u$i2sPm=GK>$%D&z&H7-9pOD0`Gh3^SPbN6 za;U`)jk!P(Fr7Q2bR?JZ`EbYK(Pxdb##7cc3^`MNAC#+P5$?8^ld8$@0;sLz3`QX1 zY>i^g2;*%c*3rQ?mG68D#|l5FUfv81R6dW3diqu75$zLwi*F8(l8;@|Xq`Gv&K^zn zPMLTWkY<_Ui+cawyRx2SX+6i5)MdPeCM-L%shg)F5v92#dAEnoChTE9tv z^^t+^3h%6WTRTj=>n=%n4EU_Ty_!HELNoJ=25v=0=hz63T8~&hR6eho=7$XI$})?s zDj18$Tt(Eq-Qw|?`Aa3;W?A|ivB$>)w=uLlJ79rG{pIF&8*){fsKJENvyHIWf87z~ zc#$zhoi_l&fUe!}jk;cR*XacRgjxXv^+hwSHwn@CO~e$-@?u(O^7m za($RPW^v_c?bHI>QPQ6~F956m4JhIL?{+mI<(wV9qoE}U$GLXC798hBJJP`Uva8v6 z*_q4b*3<|c5`3_%imcAXQY4;YoQYvT@Ml}!L6qd));e#lm~@!qj5er|uSS)Bh_hI7 z8H;-C1;;~bzwrHFJ!9H7a1&S0t#ef%DJjBIV8;(|hO-m5HZeS302`#+@Y+MmnbG)a z)j4|{-hru5S;;x#Q5-^Gf8;&x{uAA#Pdq+2Hx)?NZx;&q5fnc8X^YO4k2ySro;6h5 zp?MS+7!_ZOTp1?yQM{OoZ-Wm+T?u;*AnUP!^4v$T*%mxz3s4tInH)PeU_d;*yA{pZ z%Tc-Wu77mgs1e|tHaMGi?Mks<+6cS%+=B*8Uv}6L%ADOy?12faWQu9bTld{Rt5+40 zt~-GGHZ!t2sk1_@tIhkMPdFYIpJw1%?*R*6aqWd2%IFWMeLa>l}8v*>YyTk<$ zifUB}GZrmU?nxFKSfTpXf=P9bT~Z+@TvZs(wr$g$t5y532E(QNd^NP?O|1l^_ zjJz*C%atIk9QBh@WK+SC9dh7IcJ;IFh2~mBAqBqOYnl8rpCdMFcYMCujZA_$}QM zTd`W z;vUq4D$Pcwdp0e7=g9OLN@T1igc^I5KiF{vCGWIFh_TI^2U4XkS?5kEzrzh@w;c2> z;;r4Pz^geFWM~JDTeJE0FW4ARC$|#7Zj>VI;H*R zubMYJ3l~IIZy@i58qQLzL>g6=A8Oyd4=7|VQiBH$*V-g|-|u;T@uovqz%_&{U~|LO zE)d}XOb)45gl1dZ#sDKI9KzUTs@rZ{!@)evY<%u(*reY1^RB@)O^_M>;hDo<-b(ha zr-As_+>$!g((S)LD@O>{0>Aw8=T-}iciCNA-i28{d(Tp$#by}(`lum&=zdk%(qxF6 zHt>QKJbbr%OZm?7A6#$&WC2*DZoKg)k;6?9$cg0(bQ^`|Xg2B~SBZfrZwUCOB(Ex0 JB4ZrzzW`UjyzKx0 diff --git a/doc/salome/gui/SMESH/images/mergenodes_auto.png b/doc/salome/gui/SMESH/images/mergenodes_auto.png index 6a2a92830dcc0c4d8c7c20242e388087fb2cea98..625083f4df5aab11f679f31d2920b9f14045df0e 100644 GIT binary patch literal 23601 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\b Tolerance is a maximum distance between nodes sufficient for merging. +

  • Activation of No merge of corner and medium nodes check-box + prevents merging medium nodes of quadratic elements with corner + nodes. This check-box is enabled provided that the selected mesh + includes quadratic elements.
  • Exclude Groups group box allows to ignore the nodes which belong to the specified mesh groups. diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 3cdbea8bf..0b4321172 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -609,41 +609,44 @@ module SMESH in AxisStruct Axis, in double AngleInRadians, in boolean CopyGroups, - in string MeshName) + in string MeshName) raises (SALOME::SALOME_Exception); void RotateObject (in SMESH_IDSource theObject, in AxisStruct Axis, in double AngleInRadians, - in boolean Copy) + in boolean Copy) raises (SALOME::SALOME_Exception); ListOfGroups RotateObjectMakeGroups (in SMESH_IDSource theObject, in AxisStruct Axis, - in double AngleInRadians) + in double AngleInRadians) raises (SALOME::SALOME_Exception); SMESH_Mesh RotateObjectMakeMesh (in SMESH_IDSource theObject, in AxisStruct Axis, in double AngleInRadians, in boolean CopyGroups, - in string MeshName) + in string MeshName) raises (SALOME::SALOME_Exception); void FindCoincidentNodes (in double Tolerance, - out array_of_long_array GroupsOfNodes) + out array_of_long_array GroupsOfNodes, + in boolean SeparateCornersAndMedium) raises (SALOME::SALOME_Exception); void FindCoincidentNodesOnPart (in SMESH_IDSource SubMeshOrGroup, in double Tolerance, - out array_of_long_array GroupsOfNodes) + out array_of_long_array GroupsOfNodes, + in boolean SeparateCornersAndMedium) raises (SALOME::SALOME_Exception); void FindCoincidentNodesOnPartBut (in SMESH_IDSource SubMeshOrGroup, in double Tolerance, out array_of_long_array GroupsOfNodes, - in ListOfIDSources ExceptSubMeshOrGroups) + in ListOfIDSources ExceptSubMeshOrGroups, + in boolean SeparateCornersAndMedium) raises (SALOME::SALOME_Exception); - void MergeNodes (in array_of_long_array GroupsOfNodes) + void MergeNodes (in array_of_long_array GroupsOfNodes) raises (SALOME::SALOME_Exception); /*! diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 18666319f..fc945c44e 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -6983,27 +6983,67 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens, //================================================================================ /*! - * \brief Return list of group of nodes close to each other within theTolerance - * Search among theNodes or in the whole mesh if theNodes is empty using - * an Octree algorithm + * * \brief Return list of group of nodes close to each other within theTolerance + * * Search among theNodes or in the whole mesh if theNodes is empty using + * * an Octree algorithm + * \param [in,out] theNodes - the nodes to treat + * \param [in] theTolerance - the tolerance + * \param [out] theGroupsOfNodes - the result groups of coincident nodes + * \param [in] theSeparateCornersAndMedium - if \c true, in quadratic mesh puts + * corner and medium nodes in separate groups */ //================================================================================ void SMESH_MeshEditor::FindCoincidentNodes (TIDSortedNodeSet & theNodes, const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes) + TListOfListOfNodes & theGroupsOfNodes, + bool theSeparateCornersAndMedium) { myLastCreatedElems.Clear(); myLastCreatedNodes.Clear(); - if ( theNodes.empty() ) - { // get all nodes in the mesh + if ( myMesh->NbEdges ( ORDER_QUADRATIC ) + + myMesh->NbFaces ( ORDER_QUADRATIC ) + + myMesh->NbVolumes( ORDER_QUADRATIC ) == 0 ) + theSeparateCornersAndMedium = false; + + TIDSortedNodeSet& corners = theNodes; + TIDSortedNodeSet medium; + + if ( theNodes.empty() ) // get all nodes in the mesh + { + TIDSortedNodeSet* nodes[2] = { &corners, &medium }; SMDS_NodeIteratorPtr nIt = GetMeshDS()->nodesIterator(/*idInceasingOrder=*/true); - while ( nIt->more() ) - theNodes.insert( theNodes.end(),nIt->next()); + if ( theSeparateCornersAndMedium ) + while ( nIt->more() ) + { + const SMDS_MeshNode* n = nIt->next(); + TIDSortedNodeSet* & nodeSet = nodes[ SMESH_MesherHelper::IsMedium( n )]; + nodeSet->insert( nodeSet->end(), n ); + } + else + while ( nIt->more() ) + theNodes.insert( theNodes.end(),nIt->next() ); + } + else if ( theSeparateCornersAndMedium ) // separate corners from medium nodes + { + TIDSortedNodeSet::iterator nIt = corners.begin(); + while ( nIt != corners.end() ) + if ( SMESH_MesherHelper::IsMedium( *nIt )) + { + medium.insert( medium.end(), *nIt ); + corners.erase( nIt++ ); + } + else + { + ++nIt; + } } - SMESH_OctreeNode::FindCoincidentNodes ( theNodes, &theGroupsOfNodes, theTolerance); + if ( !corners.empty() ) + SMESH_OctreeNode::FindCoincidentNodes ( corners, &theGroupsOfNodes, theTolerance ); + if ( !medium.empty() ) + SMESH_OctreeNode::FindCoincidentNodes ( medium, &theGroupsOfNodes, theTolerance ); } //======================================================================= @@ -7763,7 +7803,7 @@ void SMESH_MeshEditor::FindEqualElements(TIDSortedElemSet & theElements, { // get all elements in the mesh SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator(); while ( eIt->more() ) - theElements.insert( theElements.end(), eIt->next()); + theElements.insert( theElements.end(), eIt->next() ); } vector< TGroupOfElems > arrayOfGroups; @@ -7771,31 +7811,32 @@ void SMESH_MeshEditor::FindEqualElements(TIDSortedElemSet & theElements, TMapOfNodeSet mapOfNodeSet; TIDSortedElemSet::iterator elemIt = theElements.begin(); - for ( int i = 0, j=0; elemIt != theElements.end(); ++elemIt, ++j ) { + for ( int i = 0; elemIt != theElements.end(); ++elemIt ) + { const SMDS_MeshElement* curElem = *elemIt; SortableElement SE(curElem); - int ind = -1; // check uniqueness pair< TMapOfNodeSet::iterator, bool> pp = mapOfNodeSet.insert(make_pair(SE, i)); - if( !(pp.second) ) { + if ( !pp.second ) { // one more coincident elem TMapOfNodeSet::iterator& itSE = pp.first; - ind = (*itSE).second; - arrayOfGroups[ind].push_back(curElem->GetID()); + int ind = (*itSE).second; + arrayOfGroups[ind].push_back( curElem->GetID() ); } else { - groupOfElems.clear(); - groupOfElems.push_back(curElem->GetID()); - arrayOfGroups.push_back(groupOfElems); + arrayOfGroups.push_back( groupOfElems ); + arrayOfGroups.back().push_back( curElem->GetID() ); i++; } } + groupOfElems.clear(); vector< TGroupOfElems >::iterator groupIt = arrayOfGroups.begin(); - for ( ; groupIt != arrayOfGroups.end(); ++groupIt ) { - groupOfElems = *groupIt; - if ( groupOfElems.size() > 1 ) { - groupOfElems.sort(); - theGroupsOfElementsID.push_back(groupOfElems); + for ( ; groupIt != arrayOfGroups.end(); ++groupIt ) + { + if ( groupIt->size() > 1 ) { + //groupOfElems.sort(); -- theElements is sorted already + theGroupsOfElementsID.push_back( groupOfElems ); + theGroupsOfElementsID.back().splice( theGroupsOfElementsID.back().end(), *groupIt ); } } } diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index cbe9466de..1dbed7d99 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -440,7 +440,8 @@ public: void FindCoincidentNodes (TIDSortedNodeSet & theNodes, const double theTolerance, - TListOfListOfNodes & theGroupsOfNodes); + TListOfListOfNodes & theGroupsOfNodes, + bool theSeparateCornersAndMedium); // Return list of group of nodes close to each other within theTolerance. // Search among theNodes or in the whole mesh if theNodes is empty. diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx index 1a37b7760..5c62beb67 100644 --- a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx @@ -93,6 +93,10 @@ #define SPACING 6 #define MARGIN 11 +namespace +{ + enum ActionType { MERGE_NODES, MERGE_ELEMENTS }; +} namespace SMESH { class TIdPreview @@ -307,7 +311,7 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) { setModal(false); setAttribute(Qt::WA_DeleteOnClose, true); - setWindowTitle(myAction == 1 ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES")); + setWindowTitle(myAction == MERGE_ELEMENTS ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES")); myIdPreview = new SMESH::TIdPreview(SMESH::GetViewWindow( mySMESHGUI )); @@ -325,7 +329,7 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) DlgLayout->setMargin(MARGIN); /***************************************************************/ - GroupConstructors = new QGroupBox(myAction == 1 ? + GroupConstructors = new QGroupBox(myAction == MERGE_ELEMENTS ? tr("SMESH_MERGE_ELEMENTS") : tr("SMESH_MERGE_NODES"), this); @@ -336,7 +340,7 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) GroupConstructorsLayout->setMargin(MARGIN); RadioButton = new QRadioButton(GroupConstructors); - RadioButton->setIcon(myAction == 1 ? IconMergeElems : IconMergeNodes); + RadioButton->setIcon(myAction == MERGE_ELEMENTS ? IconMergeElems : IconMergeNodes); RadioButton->setChecked(true); GroupConstructorsLayout->addWidget(RadioButton); ButtonGroup->addButton(RadioButton, 0); @@ -378,7 +382,7 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) /***************************************************************/ // Controls for coincident elements detecting - GroupCoincident = new QGroupBox(myAction == 1 ? + GroupCoincident = new QGroupBox(myAction == MERGE_ELEMENTS ? tr("COINCIDENT_ELEMENTS") : tr("COINCIDENT_NODES"), this); @@ -387,12 +391,16 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) aCoincidentLayout->setSpacing(SPACING); aCoincidentLayout->setMargin(MARGIN); - if (myAction == 0) { // case merge nodes + if (myAction == MERGE_NODES) // case merge nodes + { QWidget* foo = new QWidget(GroupCoincident); TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), foo); SpinBoxTolerance = new SMESHGUI_SpinBox(foo); SpinBoxTolerance->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + SeparateCornersAndMedium = new QCheckBox(tr("SEPARATE_CORNERS_AND_MEDIUM"), foo); + SeparateCornersAndMedium->setEnabled( false ); + GroupExclude = new QGroupBox(tr("EXCLUDE_GROUPS"), foo); GroupExclude->setCheckable( true ); GroupExclude->setChecked( false ); @@ -405,9 +413,10 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) QGridLayout* fooLayout = new QGridLayout( foo ); fooLayout->setSpacing(SPACING); fooLayout->setMargin(0); - fooLayout->addWidget(TextLabelTolerance, 0, 0 ); - fooLayout->addWidget(SpinBoxTolerance, 0, 1 ); - fooLayout->addWidget(GroupExclude, 1, 0, 1, 2 ); + fooLayout->addWidget(TextLabelTolerance, 0, 0 ); + fooLayout->addWidget(SpinBoxTolerance, 0, 1 ); + fooLayout->addWidget(SeparateCornersAndMedium, 1, 0 ); + fooLayout->addWidget(GroupExclude, 2, 0, 1, 2 ); aCoincidentLayout->addWidget(foo); } else { @@ -430,7 +439,7 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) RemoveGroupButton = new QPushButton(tr("SMESH_BUT_REMOVE"), GroupCoincidentWidget); SelectAllCB = new QCheckBox(tr("SELECT_ALL"), GroupCoincidentWidget); - ShowIDs = new QCheckBox(myAction == 1 ? tr("SHOW_ELEMS_IDS") : tr("SHOW_NODES_IDS"), GroupCoincidentWidget); + ShowIDs = new QCheckBox(myAction == MERGE_ELEMENTS ? tr("SHOW_ELEMS_IDS") : tr("SHOW_NODES_IDS"), GroupCoincidentWidget); GroupCoincidentLayout->addWidget(ListCoincident, 0, 0, 4, 2); GroupCoincidentLayout->addWidget(DetectButton, 0, 2); @@ -501,9 +510,9 @@ SMESHGUI_MergeDlg::SMESHGUI_MergeDlg (SMESHGUI* theModule, int theAction) DlgLayout->addWidget(GroupEdit); DlgLayout->addWidget(GroupButtons); - GroupCoincidentWidget->setVisible( myAction != 0 ); - GroupCoincident->setVisible( myAction == 0 ); - //if GroupExclude->setVisible( myAction == 0 ); + GroupCoincidentWidget->setVisible( myAction != MERGE_NODES ); + GroupCoincident ->setVisible( myAction == MERGE_NODES ); + //if GroupExclude->setVisible( myAction == MERGE_NODES ); GroupEdit->hide(); this->resize(10,10); @@ -528,7 +537,7 @@ SMESHGUI_MergeDlg::~SMESHGUI_MergeDlg() //================================================================================= void SMESHGUI_MergeDlg::Init() { - if (myAction == 0) { + if ( myAction == MERGE_NODES ) { SpinBoxTolerance->RangeStepAndValidator(0.0, COORD_MAX, 0.00001, "len_tol_precision"); SpinBoxTolerance->SetValue(1e-05); } @@ -578,7 +587,7 @@ void SMESHGUI_MergeDlg::Init() // Update Buttons updateControls(); - if (myAction == 0) + if ( myAction == MERGE_NODES ) myHelpFileName = "merging_nodes_page.html"; else myHelpFileName = "merging_elements_page.html"; @@ -639,7 +648,7 @@ bool SMESHGUI_MergeDlg::ClickOnApply() SMESH::array_of_long_array_var aGroupsOfElements = new SMESH::array_of_long_array; if ( ListCoincident->count() == 0) { - if (myAction == 0) + if ( myAction == MERGE_NODES ) SUIT_MessageBox::warning(this, tr("SMESH_WARNING"), tr("SMESH_NO_NODES_DETECTED")); @@ -663,13 +672,13 @@ bool SMESHGUI_MergeDlg::ClickOnApply() aGroupsOfElements[anArrayNum++] = anIds.inout(); } - if( myAction == 0 ) + if( myAction == MERGE_NODES ) aMeshEditor->MergeNodes (aGroupsOfElements.inout()); else aMeshEditor->MergeElements (aGroupsOfElements.inout()); if ( myTypeId == 0 ) { - if (myAction == 0 ) + if (myAction == MERGE_NODES ) SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INFORMATION"), tr("SMESH_MERGED_NODES").arg(QString::number(ListCoincident->count()).toLatin1().data())); else @@ -805,6 +814,16 @@ void SMESHGUI_MergeDlg::updateControls() buttonOk->setEnabled(enable); buttonApply->setEnabled(enable); DetectButton->setEnabled( !myMesh->_is_nil() ); + + if ( myAction == MERGE_NODES ) + { + bool has2ndOrder = (( !myMesh->_is_nil() ) && + ( myMesh->NbEdgesOfOrder( SMESH::ORDER_QUADRATIC ) > 0 || + myMesh->NbFacesOfOrder( SMESH::ORDER_QUADRATIC ) > 0 || + myMesh->NbVolumesOfOrder( SMESH::ORDER_QUADRATIC ) > 0 )); + + SeparateCornersAndMedium->setEnabled( has2ndOrder ); + } } //================================================================================= @@ -831,7 +850,7 @@ void SMESHGUI_MergeDlg::onDetect() else src = SMESH::SMESH_IDSource::_duplicate( mySubMeshOrGroup ); switch (myAction) { - case 0 : + case MERGE_NODES : for ( int i = 0; GroupExclude->isChecked() && i < ListExclude->count(); i++ ) { if ( ListExclude->item( i )->checkState() == Qt::Checked ) { aExcludeGroups->length( aExcludeGroups->length()+1 ); @@ -841,9 +860,11 @@ void SMESHGUI_MergeDlg::onDetect() aMeshEditor->FindCoincidentNodesOnPartBut(src.in(), SpinBoxTolerance->GetValue(), aGroupsArray.out(), - aExcludeGroups.in()); + aExcludeGroups.in(), + SeparateCornersAndMedium->isEnabled() && + SeparateCornersAndMedium->isChecked()); break; - case 1 : + case MERGE_ELEMENTS : aMeshEditor->FindEqualElements(src.in(), aGroupsArray.out()); break; } @@ -906,7 +927,7 @@ void SMESHGUI_MergeDlg::onSelectGroup() mySelectionMgr->setSelectedObjects(aList,false); if (ShowIDs->isChecked()) - if (myAction == 0) { + if ( myAction == MERGE_NODES ) { myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); } @@ -959,7 +980,7 @@ void SMESHGUI_MergeDlg::onSelectElementFromGroup() mySelectionMgr->setSelectedObjects(aList); if (ShowIDs->isChecked()) - if (myAction == 0) { + if (myAction == MERGE_NODES) { myIdPreview->SetPointsData(myActor->GetObject()->GetMesh(), anIndices); myIdPreview->SetPointsLabeled(!anIndices.IsEmpty(), myActor->GetVisibility()); } @@ -1187,13 +1208,13 @@ void SMESHGUI_MergeDlg::SelectionIntoArgument() if ( myActor && myTypeId == 1 && mySelector->IsSelectionEnabled() ) { mySubMeshOrGroup = SMESH::SMESH_IDSource::_nil(); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); - + if ((!SMESH::IObjectToInterface(IO)->_is_nil() || //SUBMESH OR GROUP !SMESH::IObjectToInterface(IO)->_is_nil()) && !SMESH::IObjectToInterface(IO)->_is_nil()) mySubMeshOrGroup = SMESH::IObjectToInterface(IO); - - if (myAction == 0) { + + if (myAction == MERGE_NODES) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(NodeSelection); @@ -1204,7 +1225,7 @@ void SMESHGUI_MergeDlg::SelectionIntoArgument() } // process groups - if ( myAction == 0 && !myMesh->_is_nil() && myEntry != aCurrentEntry ) { + if ( myAction == MERGE_NODES && !myMesh->_is_nil() && myEntry != aCurrentEntry ) { myGroups.clear(); ListExclude->clear(); SMESH::ListOfGroups_var aListOfGroups = myMesh->GetGroups(); @@ -1317,7 +1338,7 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->clearFilters(); - if (myAction == 0) + if (myAction == MERGE_NODES) GroupCoincidentWidget->hide(); else GroupCoincident->hide(); @@ -1338,7 +1359,7 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id) myMeshOrSubMeshOrGroupFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); - if (myAction == 0) { + if (myAction == MERGE_NODES) { GroupCoincidentWidget->show(); SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.h b/src/SMESHGUI/SMESHGUI_MergeDlg.h index b003b3842..7e777ea43 100644 --- a/src/SMESHGUI/SMESHGUI_MergeDlg.h +++ b/src/SMESHGUI/SMESHGUI_MergeDlg.h @@ -125,6 +125,7 @@ private: QWidget* GroupCoincidentWidget; QLabel* TextLabelTolerance; SMESHGUI_SpinBox* SpinBoxTolerance; + QCheckBox* SeparateCornersAndMedium; QPushButton* DetectButton; QListWidget* ListCoincident; QPushButton* AddGroupButton; diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 45b444feb..45fef3733 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -5100,6 +5100,10 @@ Please select a group and try again EXCLUDE_GROUPS Exclude Groups + + SEPARATE_CORNERS_AND_MEDIUM + No merge of corner and medium nodes + SMESHGUI_ExtrusionAlongPathDlg diff --git a/src/SMESHUtils/SMESH_OctreeNode.cxx b/src/SMESHUtils/SMESH_OctreeNode.cxx index 6225108bd..772a50f99 100644 --- a/src/SMESHUtils/SMESH_OctreeNode.cxx +++ b/src/SMESHUtils/SMESH_OctreeNode.cxx @@ -275,42 +275,33 @@ void SMESH_OctreeNode::FindCoincidentNodes (TIDSortedNodeSet& theSetOfNodes, * \param theGroupsOfNodes - list of nodes closed to each other returned */ //============================= -void SMESH_OctreeNode::FindCoincidentNodes ( TIDSortedNodeSet* theSetOfNodes, - const double theTolerance, +void SMESH_OctreeNode::FindCoincidentNodes ( TIDSortedNodeSet* theSetOfNodes, + const double theTolerance, list< list< const SMDS_MeshNode*> >* theGroupsOfNodes) { TIDSortedNodeSet::iterator it1 = theSetOfNodes->begin(); list::iterator it2; + list ListOfCoincidentNodes; + TIDCompare idLess; + while (it1 != theSetOfNodes->end()) { const SMDS_MeshNode * n1 = *it1; - list ListOfCoincidentNodes;// Initialize the lists via a declaration, it's enough - - list * groupPtr = 0; - // Searching for Nodes around n1 and put them in ListofCoincidentNodes. // Found nodes are also erased from theSetOfNodes FindCoincidentNodes(n1, theSetOfNodes, &ListOfCoincidentNodes, theTolerance); - // We build a list {n1 + his neigbours} and add this list in theGroupsOfNodes - for (it2 = ListOfCoincidentNodes.begin(); it2 != ListOfCoincidentNodes.end(); it2++) + if ( !ListOfCoincidentNodes.empty() ) { - const SMDS_MeshNode* n2 = *it2; - if ( !groupPtr ) - { - theGroupsOfNodes->push_back( list() ); - groupPtr = & theGroupsOfNodes->back(); - groupPtr->push_back( n1 ); - } - if (groupPtr->front() > n2) - groupPtr->push_front( n2 ); - else - groupPtr->push_back( n2 ); + // We build a list {n1 + his neigbours} and add this list in theGroupsOfNodes + if ( idLess( n1, ListOfCoincidentNodes.front() )) ListOfCoincidentNodes.push_front( n1 ); + else ListOfCoincidentNodes.push_back ( n1 ); + ListOfCoincidentNodes.sort( idLess ); + theGroupsOfNodes->push_back( list() ); + theGroupsOfNodes->back().splice( theGroupsOfNodes->back().end(), ListOfCoincidentNodes ); } - if (groupPtr != 0) - groupPtr->sort(); theSetOfNodes->erase(it1); it1 = theSetOfNodes->begin(); diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 81d0e15c1..3afdb9f1f 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -2632,11 +2632,12 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::ListOfIDSources& theMeshesArray, } // if an IDSource is a mesh } //meshes loop - if (theMergeNodesAndElements) { - // merge nodes + if (theMergeNodesAndElements) // merge nodes + { TIDSortedNodeSet aMeshNodes; // no input nodes SMESH_MeshEditor::TListOfListOfNodes aGroupsOfNodes; - aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes ); + aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes, + /*SeparateCornersAndMedium=*/ false ); aNewEditor.MergeNodes( aGroupsOfNodes ); // merge elements aNewEditor.MergeEqualElements(); diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 06481f54b..157983e3c 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -3952,25 +3952,24 @@ SMESH_MeshEditor_i::ScaleMakeMesh(SMESH::SMESH_IDSource_ptr theObject, //======================================================================= -//function : FindCoincidentNodes +//function : findCoincidentNodes //purpose : //======================================================================= -void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tolerance, - SMESH::array_of_long_array_out GroupsOfNodes) - throw (SALOME::SALOME_Exception) +void SMESH_MeshEditor_i:: +findCoincidentNodes (TIDSortedNodeSet & Nodes, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium) { - SMESH_TRY; - initData(); - ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; - TIDSortedNodeSet nodes; // no input nodes - getEditor().FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + getEditor().FindCoincidentNodes( Nodes, Tolerance, aListOfListOfNodes, SeparateCornersAndMedium ); GroupsOfNodes = new SMESH::array_of_long_array; GroupsOfNodes->length( aListOfListOfNodes.size() ); ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); - for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) { + for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) + { list< const SMDS_MeshNode* >& aListOfNodes = *llIt; list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ]; @@ -3978,8 +3977,28 @@ void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tol for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) aGroup[ j ] = (*lIt)->GetID(); } +} + +//======================================================================= +//function : FindCoincidentNodes +//purpose : +//======================================================================= + +void SMESH_MeshEditor_i:: +FindCoincidentNodes (CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium) + throw (SALOME::SALOME_Exception) +{ + SMESH_TRY; + initData(); + + TIDSortedNodeSet nodes; // no input nodes + findCoincidentNodes( nodes, Tolerance, GroupsOfNodes, SeparateCornersAndMedium ); + TPythonDump() << "coincident_nodes = " << this << ".FindCoincidentNodes( " - << Tolerance << " )"; + << Tolerance << ", " + << SeparateCornersAndMedium << " )"; SMESH_CATCH( SMESH::throwCorbaException ); } @@ -3989,9 +4008,11 @@ void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double Tol //purpose : //======================================================================= -void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr theObject, - CORBA::Double Tolerance, - SMESH::array_of_long_array_out GroupsOfNodes) +void SMESH_MeshEditor_i:: +FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr theObject, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium) throw (SALOME::SALOME_Exception) { SMESH_TRY; @@ -4000,25 +4021,12 @@ void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr TIDSortedNodeSet nodes; idSourceToNodeSet( theObject, getMeshDS(), nodes ); - ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; - if(!nodes.empty()) - getEditor().FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); + findCoincidentNodes( nodes, Tolerance, GroupsOfNodes, SeparateCornersAndMedium ); - GroupsOfNodes = new SMESH::array_of_long_array; - GroupsOfNodes->length( aListOfListOfNodes.size() ); - ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); - for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) - { - list< const SMDS_MeshNode* >& aListOfNodes = *llIt; - list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; - SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ]; - aGroup.length( aListOfNodes.size() ); - for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) - aGroup[ j ] = (*lIt)->GetID(); - } TPythonDump() << "coincident_nodes_on_part = " << this << ".FindCoincidentNodesOnPart( " - <GetElements( theExceptSubMeshOrGroups[i], + SMESH::NODE ); + while ( nodeIt->more() ) + nodes.erase( cast2Node( nodeIt->next() )); } - ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; - if(!nodes.empty()) - getEditor().FindCoincidentNodes( nodes, theTolerance, aListOfListOfNodes ); + findCoincidentNodes( nodes, theTolerance, theGroupsOfNodes, theSeparateCornersAndMedium ); - theGroupsOfNodes = new SMESH::array_of_long_array; - theGroupsOfNodes->length( aListOfListOfNodes.size() ); - ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); - for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ ) - { - list< const SMDS_MeshNode* >& aListOfNodes = *llIt; - list< const SMDS_MeshNode* >::iterator lIt = aListOfNodes.begin();; - SMESH::long_array& aGroup = (*theGroupsOfNodes)[ i ]; - aGroup.length( aListOfNodes.size() ); - for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ ) - aGroup[ j ] = (*lIt)->GetID(); - } TPythonDump() << "coincident_nodes_on_part = " << this << ".FindCoincidentNodesOnPartBut( " << theObject<<", " << theTolerance << ", " - << theExceptSubMeshOrGroups << " )"; + << theExceptSubMeshOrGroups << ", " + << theSeparateCornersAndMedium << " )"; SMESH_CATCH( SMESH::throwCorbaException ); } diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index 2cdf9fa61..6d25784d5 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -472,16 +472,19 @@ public: throw (SALOME::SALOME_Exception); void FindCoincidentNodes (CORBA::Double Tolerance, - SMESH::array_of_long_array_out GroupsOfNodes) + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium) throw (SALOME::SALOME_Exception); void FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr Object, CORBA::Double Tolerance, - SMESH::array_of_long_array_out GroupsOfNodes) + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium) throw (SALOME::SALOME_Exception); void FindCoincidentNodesOnPartBut(SMESH::SMESH_IDSource_ptr Object, CORBA::Double Tolerance, SMESH::array_of_long_array_out GroupsOfNodes, - const SMESH::ListOfIDSources& ExceptSubMeshOrGroups) + const SMESH::ListOfIDSources& ExceptSubMeshOrGroups, + CORBA::Boolean SeparateCornersAndMedium) throw (SALOME::SALOME_Exception); void MergeNodes (const SMESH::array_of_long_array& GroupsOfNodes) throw (SALOME::SALOME_Exception); @@ -903,6 +906,12 @@ private: //!< private methods const bool emptyIfIsMesh = false, IDSource_Error* error = 0); + void findCoincidentNodes( TIDSortedNodeSet & Nodes, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes, + CORBA::Boolean SeparateCornersAndMedium); + + private: //!< fields diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index 22e31b4ee..c6e1eabb4 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -4299,31 +4299,39 @@ class Mesh: ## Finds groups of adjacent nodes within Tolerance. # @param Tolerance the value of tolerance - # @return the list of pairs of nodes IDs (e.g. [[1,12],[25,4]]) + # @param SeparateCornerAndMediumNodes if @c True, in quadratic mesh puts + # corner and medium nodes in separate groups thus preventing + # their further merge. + # @return the list of groups of nodes IDs (e.g. [[1,12,13],[4,25]]) # @ingroup l2_modif_trsf - def FindCoincidentNodes (self, Tolerance): - return self.editor.FindCoincidentNodes(Tolerance) + def FindCoincidentNodes (self, Tolerance, SeparateCornerAndMediumNodes=False): + return self.editor.FindCoincidentNodes( Tolerance, SeparateCornerAndMediumNodes ) ## Finds groups of ajacent nodes within Tolerance. # @param Tolerance the value of tolerance # @param SubMeshOrGroup SubMesh or Group # @param exceptNodes list of either SubMeshes, Groups or node IDs to exclude from search - # @return the list of pairs of nodes IDs (e.g. [[1,12],[25,4]]) + # @param SeparateCornerAndMediumNodes if @c True, in quadratic mesh puts + # corner and medium nodes in separate groups thus preventing + # their further merge. + # @return the list of groups of nodes IDs (e.g. [[1,12,13],[4,25]]) # @ingroup l2_modif_trsf - def FindCoincidentNodesOnPart (self, SubMeshOrGroup, Tolerance, exceptNodes=[]): + def FindCoincidentNodesOnPart (self, SubMeshOrGroup, Tolerance, + exceptNodes=[], SeparateCornerAndMediumNodes=False): unRegister = genObjUnRegister() if (isinstance( SubMeshOrGroup, Mesh )): SubMeshOrGroup = SubMeshOrGroup.GetMesh() - if not isinstance( exceptNodes, list): + if not isinstance( exceptNodes, list ): exceptNodes = [ exceptNodes ] - if exceptNodes and isinstance( exceptNodes[0], int): - exceptNodes = [ self.GetIDSource( exceptNodes, SMESH.NODE)] + if exceptNodes and isinstance( exceptNodes[0], int ): + exceptNodes = [ self.GetIDSource( exceptNodes, SMESH.NODE )] unRegister.set( exceptNodes ) - return self.editor.FindCoincidentNodesOnPartBut(SubMeshOrGroup, Tolerance,exceptNodes) + return self.editor.FindCoincidentNodesOnPartBut(SubMeshOrGroup, Tolerance, + exceptNodes, SeparateCornerAndMediumNodes) ## Merges nodes - # @param GroupsOfNodes a list of pairs of nodes IDs for merging - # (e.g. [[1,12],[25,4]], then nodes 12 and 4 will be removed and replaced + # @param GroupsOfNodes a list of groups of nodes IDs for merging + # (e.g. [[1,12,13],[25,4]], then nodes 12, 13 and 4 will be removed and replaced # by nodes 1 and 25 correspondingly in all elements and groups # @ingroup l2_modif_trsf def MergeNodes (self, GroupsOfNodes): @@ -4331,7 +4339,7 @@ class Mesh: ## Finds the elements built on the same nodes. # @param MeshOrSubMeshOrGroup Mesh or SubMesh, or Group of elements for searching - # @return the list of pairs of equal elements IDs (e.g. [[1,12],[25,4]]) + # @return the list of groups of equal elements IDs (e.g. [[1,12,13],[4,25]]) # @ingroup l2_modif_trsf def FindEqualElements (self, MeshOrSubMeshOrGroup=None): if not MeshOrSubMeshOrGroup: @@ -4341,8 +4349,8 @@ class Mesh: return self.editor.FindEqualElements( MeshOrSubMeshOrGroup ) ## Merges elements in each given group. - # @param GroupsOfElementsID a list of pairs of elements IDs for merging - # (e.g. [[1,12],[25,4]], then elements 12 and 4 will be removed and + # @param GroupsOfElementsID a list of groups of elements IDs for merging + # (e.g. [[1,12,13],[25,4]], then elements 12, 13 and 4 will be removed and # replaced by elements 1 and 25 in all groups) # @ingroup l2_modif_trsf def MergeElements(self, GroupsOfElementsID): diff --git a/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx b/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx index 8740859d0..ea8fdc936 100644 --- a/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx @@ -592,7 +592,8 @@ namespace //================================================================================ TopoDS_Edge makeEdgeFromMA( SMESH_MesherHelper& theHelper, - const SMESH_MAT2d::MedialAxis& theMA ) + const SMESH_MAT2d::MedialAxis& theMA, + const double theMinSegLen) { if ( theMA.nbBranches() != 1 ) return TopoDS_Edge(); @@ -605,14 +606,31 @@ namespace TopoDS_Face face = TopoDS::Face( theHelper.GetSubShape() ); Handle(Geom_Surface) surface = BRep_Tool::Surface( face ); + vector< gp_Pnt > pnt; + pnt.reserve( uv.size() * 2 ); + pnt.push_back( surface->Value( uv[0].X(), uv[0].Y() )); + for ( size_t i = 1; i < uv.size(); ++i ) + { + gp_Pnt p = surface->Value( uv[i].X(), uv[i].Y() ); + int nbDiv = int( p.Distance( pnt.back() ) / theMinSegLen ); + for ( int iD = 1; iD < nbDiv; ++iD ) + { + double R = iD / double( nbDiv ); + gp_XY uvR = uv[i-1] * (1 - R) + uv[i] * R; + pnt.push_back( surface->Value( uvR.X(), uvR.Y() )); + } + pnt.push_back( p ); + } + // cout << "from salome.geom import geomBuilder" << endl; // cout << "geompy = geomBuilder.New(salome.myStudy)" << endl; - Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt(1, uv.size()); - for ( size_t i = 0; i < uv.size(); ++i ) + Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt(1, pnt.size()); + for ( size_t i = 0; i < pnt.size(); ++i ) { - gp_Pnt p = surface->Value( uv[i].X(), uv[i].Y() ); + gp_Pnt& p = pnt[i]; points->SetValue( i+1, p ); - //cout << "geompy.MakeVertex( "<< p.X()<<", " << p.Y()<<", " << p.Z()<<" )" << endl; + // cout << "geompy.MakeVertex( "<< p.X()<<", " << p.Y()<<", " << p.Z() + // <<" theName = 'p_" << i << "')" << endl; } GeomAPI_Interpolate interpol( points, /*isClosed=*/false, gp::Resolution()); @@ -658,6 +676,7 @@ namespace const SMESH_MAT2d::MedialAxis& theMA, const SinuousFace& theSinuFace, SMESH_Algo* the1dAlgo, + const double theMinSegLen, vector& theMAParams ) { // check if all EDGEs of one size are meshed, then MA discretization is not needed @@ -674,7 +693,7 @@ namespace return true; // discretization is not needed - TopoDS_Edge branchEdge = makeEdgeFromMA( theHelper, theMA ); + TopoDS_Edge branchEdge = makeEdgeFromMA( theHelper, theMA, theMinSegLen ); if ( branchEdge.IsNull() ) return false; @@ -1446,7 +1465,7 @@ bool StdMeshers_QuadFromMedialAxis_1D2D::Compute(SMESH_Mesh& theMesh, _regular1D->SetSegmentLength( minSegLen ); vector maParams; - if ( ! divideMA( helper, ma, sinuFace, _regular1D, maParams )) + if ( ! divideMA( helper, ma, sinuFace, _regular1D, minSegLen, maParams )) return error(COMPERR_BAD_SHAPE); _progress = 0.4; -- 2.39.2