From 674c0d8b9d98776136d216ec8f1bad56acac5bf5 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 29 Sep 2015 19:25:32 +0300 Subject: [PATCH 1/1] 23173: EDF 11552 - Problem using Add 0D element function IPAL52875: Extrusion along a path: the buttons are not active if the path is closed IPAL52882: Hexahedron (i,j,k) makes a wrong mesh on a block with composite sides --- doc/salome/gui/SMESH/images/hexa_ijk_mesh.png | Bin 0 -> 5212 bytes doc/salome/gui/SMESH/images/image88.jpg | Bin 11338 -> 9536 bytes doc/salome/gui/SMESH/images/sewing_auto.png | Bin 17839 -> 18928 bytes .../SMESH/input/adding_nodes_and_elements.doc | 28 +-- .../gui/SMESH/input/basic_meshing_algos.doc | 13 +- .../gui/SMESH/input/constructing_meshes.doc | 35 ++-- .../SMESH/input/selection_filter_library.doc | 2 +- doc/salome/gui/SMESH/input/sewing_meshes.doc | 6 +- src/SMESH/SMESH_MeshEditor.cxx | 4 - .../SMESHGUI_Add0DElemsOnAllNodesDlg.cxx | 51 +++++- .../SMESHGUI_Add0DElemsOnAllNodesDlg.h | 2 + .../SMESHGUI_ExtrusionAlongPathDlg.cxx | 136 +++++++------- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 17 +- src/SMESHGUI/SMESHGUI_SewingDlg.cxx | 56 +++--- src/SMESHUtils/SMESH_FreeBorders.cxx | 167 +++++++++++++----- src/SMESHUtils/SMESH_MeshAlgos.cxx | 5 - .../StdMeshers_CompositeHexa_3D.cxx | 10 +- 17 files changed, 344 insertions(+), 188 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/hexa_ijk_mesh.png mode change 100755 => 100644 doc/salome/gui/SMESH/images/image88.jpg diff --git a/doc/salome/gui/SMESH/images/hexa_ijk_mesh.png b/doc/salome/gui/SMESH/images/hexa_ijk_mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..577ee8ec61101625bf84922d141aee2815f17366 GIT binary patch literal 5212 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 literal 11338 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 literal 17839 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 LCz37v+U5TNekvZ1 diff --git a/doc/salome/gui/SMESH/input/adding_nodes_and_elements.doc b/doc/salome/gui/SMESH/input/adding_nodes_and_elements.doc index 1aa0661ab..855b7e5ea 100644 --- a/doc/salome/gui/SMESH/input/adding_nodes_and_elements.doc +++ b/doc/salome/gui/SMESH/input/adding_nodes_and_elements.doc @@ -90,29 +90,35 @@ selecting them in the 3D viewer and click the \b Apply or \anchor adding_0delems_on_all_nodes_anchor

Making 0D elements on Element Nodes

-There is another way to create 0D elements. It is possible to create +There is another way to create 0D elements. It is possible to create 0D elements on all nodes of the selected mesh, sub-mesh, or a group of elements or nodes. \image html dlg_0D_on_all_nodes.png -In this dialog +In this dialog
  • The radio-buttons allow choosing the type of object to create 0D elements on.
      -
    • Mesh, sub-mesh, group - this button allows selecting - a mesh, a sub-mesh or a group to create 0D elements on the nodes of its +
    • Mesh, sub-mesh, group - this button allows selecting + a mesh, a sub-mesh or a group to create 0D elements on the nodes of its elements. The name of the selected object is shown in the dialog.
    • Elements - this button allows selecting elements in the VTK viewer or typing their IDs in the dialog.
    • Nodes - this button allows selecting nodes to create 0D elements on in the VTK viewer or typing their IDs in the dialog.
  • -
  • Set Filter button allows selecting elements or nodes -by filtering mesh elements or nodes with different criteria -(see \ref filtering_elements "Filter usage").
  • -
  • Switching on Add to group check-box allows specifying the - name of the group to which all created or found 0D elements will be added. You can either select an existing group from - a drop-down list, or enter the name of the group to be created.
  • +
  • Set Filter button allows selecting elements or nodes + by filtering mesh elements or nodes with different criteria + (see \ref filtering_elements "Filter usage").
  • +
  • Switching on Add to group check-box allows specifying the + name of the group to which all created or found (existing) 0D elements will + be added. You can either select an existing group from a drop-down + list, or enter the name of the group to be created. If a selected + existing \ref grouping_elements_page "group" is not Standalone + (Group On Geometry or Group On Filter) it will be converted to + Standalone. + \warning If Add to group is activated it has to be filled in. +
@@ -124,7 +130,7 @@ by filtering mesh elements or nodes with different criteria In this dialog box specify the nodes, which will form your ball elements, either by selecting them in the 3D viewer or by manually entering their IDs, specify the ball diameter and click the \b Apply or Apply and -Close button. + Close button. \image html add_ball.png diff --git a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc index 4804800c5..090abd76f 100644 --- a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc +++ b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc @@ -39,8 +39,15 @@ number of mesh segments following an 1D hypothesis.
  • For meshing of 3D entities (solid objects):
    • -
    • Hexahedron (i,j,k)meshing algorithm - 6-sided solids are - split into hexahedral (cuboid) elements.
    • +
    • Hexahedron (i,j,k) meshing algorithm - solids are + split into hexahedral elements thus forming a structured 3D + mesh. The algorithm requires that 2D mesh generated on a solid could + be considered as a mesh of a box, i.e. there should be six nodes shared + by three quadrangles and the rest nodes should be shared by four + quadrangles. +\image html hexa_ijk_mesh.png "Structured mesh generated by Hexahedron (i,j,k) on a solid bound by 16 faces" +
    • +
    • \subpage cartesian_algo_page "Body Fitting" meshing algorithm - solids are split into hexahedral elements forming a Cartesian grid; polyhedra and other types of elements are generated @@ -66,7 +73,7 @@ There is also a number of more specific algorithms:
    • \subpage projection_algos_page "for meshing by projection of another mesh"
    • \subpage import_algos_page "for meshing by importing elements from another mesh"
    • \subpage radial_prism_algo_page "for meshing geometrical objects with cavities"
    • -
    • \subpage radial_quadrangle_1D2D_algo_page "for meshing special 2d faces (circles and part of circles)"
    • +
    • \subpage radial_quadrangle_1D2D_algo_page "for meshing special faces (circles and parts of circles)"
    • \subpage use_existing_page "Use Edges to be Created Manually" and \ref use_existing_page "Use Faces to be Created Manually" algorithms can be used to create a 1D or a 2D mesh in a python script.
    • diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index f28be8601..1a5112839 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -187,13 +187,9 @@ creation and computing) of the following steps: which is a 2D object, you do not need to define a 3D Algorithm and Hypotheses. - In the Object Browser the structure of the new mesh will be + In the Object Browser the structure of the new mesh is displayed as follows: - -
      \image html image88.jpg -
      - It contains:
      • a mesh name (Mesh_mechanic); @@ -203,6 +199,13 @@ creation and computing) of the following steps: to the hypotheses chosen at the construction of the mesh;
      • Applied algorithms folder containing the references to the algorithms chosen at the construction of the mesh.
      • +
      • SubMeshes on Face folder containing the sub-meshes + defined on geometrical faces. There also can be folders for + sub-meshes on vertices, edges, wires, shells, solids and + compounds.
      • +
      • Groups of Faces folder containing the groups of mesh + faces. There also can be folders for groups of nodes, edges, + volumes 0D elements and balls.
      There is an alternative way to assign Algorithms and Hypotheses by @@ -212,15 +215,25 @@ creation and computing) of the following steps: CustomMeshers.xml file located in the home directory. CustomMeshers.xml file must describe sets of hypotheses in the same way as ${SMESH_ROOT_DIR}/share/salome/resources/smesh/StdMeshers.xml - file does (sets of hypotheses are enclosed between - tags). - -
      + file does (sets of hypotheses are enclosed between \ + tags). For example: +~~~~~~{.xml} + + + + + + + +~~~~~~ +
      +
      \image html hypo_sets.png List of sets of hypotheses. Tag [custom] is automatically added to the sets defined by the user. -
      - +
      \note - \a "Automatic" in the names of predefined sets of hypotheses does not actually mean that they are suitable for meshing any diff --git a/doc/salome/gui/SMESH/input/selection_filter_library.doc b/doc/salome/gui/SMESH/input/selection_filter_library.doc index 6acd7e751..308706075 100644 --- a/doc/salome/gui/SMESH/input/selection_filter_library.doc +++ b/doc/salome/gui/SMESH/input/selection_filter_library.doc @@ -3,7 +3,7 @@ \page selection_filter_library_page Selection filter library \n Selection filter library allows creating and storing in files -filters that can be later reused for operations on meshes. You can +filters that can be later loaded and used for operations on meshes. You can access to it from the Main Menu via Tools / Selection filter library. It is also possible to save any filter by invoking the filter library from \a Filter dialog launched from any mesh operation. diff --git a/doc/salome/gui/SMESH/input/sewing_meshes.doc b/doc/salome/gui/SMESH/input/sewing_meshes.doc index 18be054a3..8697b36f4 100644 --- a/doc/salome/gui/SMESH/input/sewing_meshes.doc +++ b/doc/salome/gui/SMESH/input/sewing_meshes.doc @@ -63,9 +63,9 @@ To use \b Automatic sewing:
    • The found groups of Coincident Free Borders are shown in a list, a group per a line. Each group has its own color which is used to display the borders of the group in the VTK Viewer. A free border - within a group is designated by IDs of its first and last nodes within - parenthesis. All borders present in the list will be sewn upon \b - Apply.
    • + within a group is designated by IDs of its first, second and last + nodes within parenthesis. All borders present in the list will be + sewn upon \b Apply.
    • \b Remove button removes selected groups from the list.
    • Select All check-box selects all groups in the list.
    • When a group is selected, its borders appear in Edit Selected diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 146e8c12a..bb114051d 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -7963,10 +7963,6 @@ public: const SMDS_MeshElement* Get() const { return myElem; } - void Set(const SMDS_MeshElement* e) const - { myElem = e; } - - private: mutable const SMDS_MeshElement* myElem; }; diff --git a/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx index 295f5c52e..96fca0d9f 100644 --- a/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx @@ -223,6 +223,7 @@ SMESHGUI_Add0DElemsOnAllNodesOp::SMESHGUI_Add0DElemsOnAllNodesOp() connect( myDlg, SIGNAL( selTypeChanged(int) ), SLOT( onSelTypeChange(int))); connect( myDlg->myFilterBtn, SIGNAL( clicked()), SLOT( onSetFilter() )); + connect( myDlg->myGroupBox, SIGNAL( clicked(bool)), SLOT( updateButtons() )); } //================================================================================ @@ -270,6 +271,7 @@ void SMESHGUI_Add0DElemsOnAllNodesOp::selectionDone() myIO.Nullify(); myDlg->setObjectText( 0, ""); + updateButtons(); SALOME_ListIO aList; selectionMgr()->selectedObjects( aList ); @@ -297,7 +299,8 @@ void SMESHGUI_Add0DElemsOnAllNodesOp::selectionDone() // fill the list of existing groups myDlg->myGroupListCmBox->clear(); myDlg->myGroupListCmBox->addItem( QString() ); - if ( !myIO.IsNull() && myIO->hasEntry()) { + if ( !myIO.IsNull() && myIO->hasEntry()) + { SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO( myIO ); _PTR(SObject) meshSO = SMESH::ObjectToSObject( mesh ); _PTR(SObject) group0DRoot; @@ -313,7 +316,42 @@ void SMESHGUI_Add0DElemsOnAllNodesOp::selectionDone() myDlg->myGroupListCmBox->addItem( groupName.c_str() ); } } + // enable buttons + updateButtons(); + } +} + +//======================================================================= +//function : updateButtons +//purpose : enable [Apply] +//======================================================================= + +void SMESHGUI_Add0DElemsOnAllNodesOp::updateButtons() +{ + bool ok = false; + + if (( !myIO.IsNull() && myIO->hasEntry() && !myDlg->objectText( 0 ).isEmpty() ) && + ( !myDlg->myGroupBox->isChecked() || !myDlg->myGroupListCmBox->currentText().isEmpty() )) + { + SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO( myIO ); + if ( !mesh->_is_nil() ) + { + if ( myDlg->getSelectionType() == SEL_OBJECT ) + ok = true; + else + { + QString ids = myDlg->objectText( 0 ); + QStringList idList = ids.split( " ", QString::SkipEmptyParts ); + const bool isElem = ( myDlg->getSelectionType() == SEL_ELEMENTS ); + QStringList::iterator idIt = idList.begin(); + for ( ; idIt != idList.end() && !ok; ++idIt ) + ok = ( mesh->GetElementType( idIt->toLong(), isElem ) != SMESH::ALL ); + } + } } + + myDlg->button( QtxDialog::Apply )->setEnabled( ok ); + myDlg->button( QtxDialog::OK )->setEnabled( ok ); } //================================================================================ @@ -496,3 +534,14 @@ void SMESHGUI_Add0DElemsOnAllNodesOp::onSetFilter() myFilterDlg->show(); } + +//======================================================================= +//function : onTextChanged +//purpose : SLOT called when the user types IDs +//======================================================================= + +void SMESHGUI_Add0DElemsOnAllNodesOp::onTextChanged( int obj, const QStringList& text ) +{ + SMESHGUI_SelectionOp::onTextChanged( obj, text ); + updateButtons(); +} diff --git a/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h b/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h index 49ae8724a..805b9316b 100644 --- a/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h +++ b/src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h @@ -99,6 +99,8 @@ class SMESHGUI_EXPORT SMESHGUI_Add0DElemsOnAllNodesOp : public SMESHGUI_Selectio virtual bool onApply(); void onSelTypeChange(int); void onSetFilter(); + virtual void onTextChanged( int, const QStringList& ); + void updateButtons(); private: SMESHGUI_Add0DElemsOnAllNodesDlg* myDlg; diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx index 53b2cbf48..4c6ebea19 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx @@ -253,7 +253,7 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod OkButton->setAutoDefault(true); OkButton->setDefault(true); - ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); + ApplyButton = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons); ApplyButton->setAutoDefault(true); CloseButton = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons); @@ -444,64 +444,64 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); - SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources(); - SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources(); - SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources(); - maxSelType = SelectorWdg->GetSelected( nodes, edges, faces ); - - // is it necessary to switch on the next Display Mode? - SMESH::ElementType newType = (SMESH::ElementType)( maxSelType + 1 ); - SMESH::array_of_ElementType_var oldTypes = mesh->GetTypes(); - meshHadNewTypeBefore = false; - for ( size_t i = 0; i < oldTypes->length() && !meshHadNewTypeBefore; ++i ) - meshHadNewTypeBefore = ( oldTypes[i] >= newType ); - - SMESH::SMESH_MeshEditor_var aMeshEditor = mesh->GetMeshEditor(); - SMESH::SMESH_MeshEditor::Extrusion_Error retVal; - - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObjects( nodes, edges, faces, myPath, - GEOM::GEOM_Object::_nil(), - aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - makeGroups, retVal ); - - wc.suspend(); - switch (retVal) { - case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("NO_ELEMENTS_SELECTED")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("SELECTED_PATH_IS_NOT_EDGE")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("BAD_SHAPE_TYPE")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("EXTR_BAD_STARTING_NODE")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("WRONG_ANGLES_NUMBER")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT: - SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("CANT_GET_TANGENT")); - return false; break; - case SMESH::SMESH_MeshEditor::EXTR_OK: - break; - } + SMESH::ListOfIDSources_var nodes = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var edges = new SMESH::ListOfIDSources(); + SMESH::ListOfIDSources_var faces = new SMESH::ListOfIDSources(); + maxSelType = SelectorWdg->GetSelected( nodes, edges, faces ); + + // is it necessary to switch on the next Display Mode? + SMESH::ElementType newType = (SMESH::ElementType)( maxSelType + 1 ); + SMESH::array_of_ElementType_var oldTypes = mesh->GetTypes(); + meshHadNewTypeBefore = false; + for ( size_t i = 0; i < oldTypes->length() && !meshHadNewTypeBefore; ++i ) + meshHadNewTypeBefore = ( oldTypes[i] >= newType ); + + SMESH::SMESH_MeshEditor_var aMeshEditor = mesh->GetMeshEditor(); + SMESH::SMESH_MeshEditor::Extrusion_Error retVal; + + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathObjects( nodes, edges, faces, myPath, + GEOM::GEOM_Object::_nil(), + aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + makeGroups, retVal ); + + wc.suspend(); + switch (retVal) { + case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("NO_ELEMENTS_SELECTED")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("SELECTED_PATH_IS_NOT_EDGE")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("BAD_SHAPE_TYPE")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("EXTR_BAD_STARTING_NODE")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("WRONG_ANGLES_NUMBER")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT: + SUIT_MessageBox::warning(this, + tr("SMESH_ERROR"), + tr("CANT_GET_TANGENT")); + return false; break; + case SMESH::SMESH_MeshEditor::EXTR_OK: + break; + } } catch (...) { return false; } @@ -1048,11 +1048,19 @@ bool SMESHGUI_ExtrusionAlongPathDlg::isValuesValid() if ( type != SMESH::NODE ) return false; - SMESH::long_array_var elems = mesh->GetNodeInverseElements( aNodeStart ); - if ( elems->length() != 1 || - mesh->GetElementType( elems[0], true ) != SMESH::EDGE ) - return false; - + if ( mesh->HasShapeToMesh() ) + { + SMESH::NodePosition_var pos = mesh->GetNodePosition( aNodeStart ); + if ( pos->shapeType != GEOM::VERTEX ) + return false; + } + else + { + SMESH::long_array_var elems = mesh->GetNodeInverseElements( aNodeStart ); + if ( elems->length() != 1 || + mesh->GetElementType( elems[0], true ) != SMESH::EDGE ) + return false; + } return true; } diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 0b4c1eafc..f4912f423 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -206,11 +206,11 @@ void SMESHGUI_MeshOp::startOperation() for ( int i = SMESH::DIM_0D; i <= SMESH::DIM_3D; i++ ) { connect( myDlg->tab( i ), SIGNAL( createHyp( const int, const int ) ), - this, SLOT( onCreateHyp( const int, const int ) ) ); + this, SLOT( onCreateHyp( const int, const int ) ) ); connect( myDlg->tab( i ), SIGNAL( editHyp( const int, const int ) ), - this, SLOT( onEditHyp( const int, const int ) ) ); + this, SLOT( onEditHyp( const int, const int ) ) ); connect( myDlg->tab( i ), SIGNAL( selectAlgo( const int ) ), - this, SLOT( onAlgoSelected( const int ) ) ); + this, SLOT( onAlgoSelected( const int ) ) ); } connect( myDlg, SIGNAL( hypoSet( const QString& )), SLOT( onHypoSet( const QString& ))); connect( myDlg, SIGNAL( geomSelectionByMesh( bool )), SLOT( onGeomSelectionByMesh( bool ))); @@ -1583,11 +1583,12 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, // remember current algo prevAlgo = algoByDim[ dim ] = hypData( dim, Algo, algoIndex ); } - if ( myMaxShapeDim == SMESH::DIM_3D && forward && algoDim == SMESH::DIM_1D ) { - algoDim = SMESH::DIM_3D; - forward = -1; - a3DAlgo = prevAlgo; - continue; + if ( myMaxShapeDim == SMESH::DIM_3D && forward && algoDim == SMESH::DIM_1D ) + { + algoDim = SMESH::DIM_3D; + forward = -1; + a3DAlgo = prevAlgo; + continue; } } diff --git a/src/SMESHGUI/SMESHGUI_SewingDlg.cxx b/src/SMESHGUI/SMESHGUI_SewingDlg.cxx index 00ce12ef3..3753dff1d 100644 --- a/src/SMESHGUI/SMESHGUI_SewingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SewingDlg.cxx @@ -54,6 +54,7 @@ #include #include #include +#include // OCCT includes #include @@ -832,8 +833,9 @@ QString SMESHGUI_SewingDlg::getPartText(const SMESH::FreeBorderPart& aPART) if ( 0 <= aPART.node1 && aPART.node1 < aBRD.nodeIDs.length() && 0 <= aPART.nodeLast && aPART.nodeLast < aBRD.nodeIDs.length() ) { - text += QString("( %1 %2 ) ") + text += QString("( %1 %2 %3 ) ") .arg( aBRD.nodeIDs[ aPART.node1 ] ) + .arg( aBRD.nodeIDs[ aPART.node2 ] ) .arg( aBRD.nodeIDs[ aPART.nodeLast ] ); } } @@ -883,30 +885,30 @@ void SMESHGUI_SewingDlg::onDetectClicked() SMESH::SMESH_MeshEditor_var editor = myMesh->GetMeshEditor(); myBorders = editor->FindCoincidentFreeBorders( SpinBoxTolerance->GetValue() ); - if ( !haveBorders() ) - return; - - for ( size_t i = 0; i < myBorderDisplayers.size(); ++i ) + if ( haveBorders() ) { - delete myBorderDisplayers[ i ]; - myBorderDisplayers[ i ] = 0; - } - myBorderDisplayers.resize( myBorders->coincidentGroups.length(), 0 ); + for ( size_t i = 0; i < myBorderDisplayers.size(); ++i ) + { + delete myBorderDisplayers[ i ]; + myBorderDisplayers[ i ] = 0; + } + myBorderDisplayers.resize( myBorders->coincidentGroups.length(), 0 ); - for ( CORBA::ULong i = 0; i < myBorders->coincidentGroups.length(); ++i ) - { - QString groupText = getGroupText( i ); - if ( groupText.isEmpty() ) - continue; - - QColor groupColor; - groupColor.setHsvF( float(i) / myBorders->coincidentGroups.length(), 1., 1. ); - QPixmap icon( QSize( 20, 20 )); - icon.fill( groupColor ); - - QListWidgetItem * item = new QListWidgetItem( icon, groupText, ListCoincident ); - item->setData( GROUP_COLOR, groupColor ); - item->setData( GROUP_INDEX, i ); + for ( CORBA::ULong i = 0; i < myBorders->coincidentGroups.length(); ++i ) + { + QString groupText = getGroupText( i ); + if ( groupText.isEmpty() ) + continue; + + QColor groupColor; + groupColor.setHsvF( float(i) / myBorders->coincidentGroups.length(), 1., 1. ); + QPixmap icon( QSize( 20, 20 )); + icon.fill( groupColor ); + + QListWidgetItem * item = new QListWidgetItem( icon, groupText, ListCoincident ); + item->setData( GROUP_COLOR, groupColor ); + item->setData( GROUP_INDEX, i ); + } } myBusy = false; @@ -1389,7 +1391,11 @@ bool SMESHGUI_SewingDlg::ClickOnApply() QString msg = tr(QString("ERROR_%1").arg(anError).toLatin1().data()); SUIT_MessageBox::warning(this, tr("SMESH_WRN_WARNING"), msg); } - } catch (...) { + } + catch ( const SALOME::SALOME_Exception& S_ex ) + { + SalomeApp_Tools::QtCatchCorbaException( S_ex ); + return false; } if (aResult) { @@ -1887,7 +1893,6 @@ SMESHGUI_SewingDlg::BorderGroupDisplayer::~BorderGroupDisplayer() } } myIdPreview.SetPointsLabeled(false); - //myViewWindow->Repaint(); } void SMESHGUI_SewingDlg::BorderGroupDisplayer::Hide() @@ -2010,7 +2015,6 @@ void SMESHGUI_SewingDlg::BorderGroupDisplayer::Update() myPartActors[ i ]->SetMarkerStd( VTK::MT_POINT, 13 ); myPartActors[ i ]->SetPickable ( false ); myViewWindow->AddActor( myPartActors[ i ]); - //myViewWindow->Repaint(); } } } diff --git a/src/SMESHUtils/SMESH_FreeBorders.cxx b/src/SMESHUtils/SMESH_FreeBorders.cxx index 939178f73..6d180f8c2 100644 --- a/src/SMESHUtils/SMESH_FreeBorders.cxx +++ b/src/SMESHUtils/SMESH_FreeBorders.cxx @@ -54,12 +54,13 @@ namespace BNode(const SMDS_MeshNode * node): SMESH_TNodeXYZ( node ) {} const SMDS_MeshNode * Node() const { return _node; } - void AddLinked( BEdge* e ) const; - void AddClose ( const BEdge* e, double u ) const; + void AddLinked( BEdge* e ) const; + void AddClose ( const BEdge* e, double u ) const; BEdge* GetCloseEdge( size_t i ) const { return myCloseEdges[i].first; } double GetCloseU( size_t i ) const { return myCloseEdges[i].second; } BEdge* GetCloseEdgeOfBorder( int borderID, double * u = 0 ) const; - bool IsCloseEdge( const BEdge* ) const; + bool HasCloseEdgeWithNode( const BNode* n ) const; + bool IsCloseEdge( const BEdge*, double * u = 0 ) const; bool operator<(const BNode& other) const { return Node()->GetID() < other.Node()->GetID(); } }; /*! @@ -149,8 +150,8 @@ namespace // is1st shows which end of toE is projected on this at u double u2; const double eps = 0.1; - if ( toE == myBNode1->GetCloseEdgeOfBorder( toE->myBorderID, &u2 ) || - toE == myBNode2->GetCloseEdgeOfBorder( toE->myBorderID, &u2 )) + if ( myBNode1->IsCloseEdge( toE, &u2 ) || + myBNode2->IsCloseEdge( toE, &u2 )) return (( 0 < u2 && u2 < 1 ) && // u2 is proj param of myBNode's on toE ( Abs( u2 - int( !is1st )) > eps )); @@ -164,24 +165,59 @@ namespace if ( this->myCloseBorders != bordIDs ) return false; - eRange[0] = this; - while ( eRange[0]->myPrev && eRange[0]->myPrev->myCloseBorders == bordIDs ) + if ( bordIDs.size() == 1 && bordIDs.count( myBorderID )) // border close to self { - if ( eRange[0]->myPrev == this /*|| eRange[0]->myPrev->myInGroup*/ ) - break; - eRange[0] = eRange[0]->myPrev; - } - - eRange[1] = this; - if ( eRange[0]->myPrev != this ) // not closed range - while ( eRange[1]->myNext && eRange[1]->myNext->myCloseBorders == bordIDs ) + double u; + eRange[0] = this; + while ( eRange[0]->myBNode1->GetCloseEdgeOfBorder( myBorderID, &u )) + { + if ( eRange[0]->myPrev == this || u < 0 || u > 1 ) + break; + eRange[0] = eRange[0]->myPrev; + } + eRange[1] = this; + while ( eRange[1]->myBNode2->GetCloseEdgeOfBorder( myBorderID, &u )) { - if ( eRange[1]->myNext == this /*|| eRange[1]->myNext->myInGroup*/ ) + if ( eRange[1]->myNext == this || u < 0 || u > 1 ) break; eRange[1] = eRange[1]->myNext; } + } + else + { + eRange[0] = this; + while ( eRange[0]->myPrev && eRange[0]->myPrev->myCloseBorders == bordIDs ) + { + if ( eRange[0]->myPrev == this ) + break; + eRange[0] = eRange[0]->myPrev; + } - return ( eRange[0] != eRange[1] ); + eRange[1] = this; + if ( eRange[0]->myPrev != this ) // not closed border + while ( eRange[1]->myNext && eRange[1]->myNext->myCloseBorders == bordIDs ) + { + if ( eRange[1]->myNext == this ) + break; + eRange[1] = eRange[1]->myNext; + } + } + + if ( eRange[0] == eRange[1] ) + { + std::set::iterator closeBord = eRange[0]->myCloseBorders.begin(); + for ( ; closeBord != eRange[0]->myCloseBorders.end(); ++closeBord ) + { + if ( BEdge* be = eRange[0]->myBNode1->GetCloseEdgeOfBorder( *closeBord )) + if ( be->myCloseBorders == eRange[0]->myCloseBorders ) + return true; + if ( BEdge* be = eRange[0]->myBNode2->GetCloseEdgeOfBorder( *closeBord )) + if ( be->myCloseBorders == eRange[0]->myCloseBorders ) + return true; + } + return false; + } + return true; } }; // class BEdge @@ -197,8 +233,7 @@ namespace if ( e1->myPrev ) { for ( bord = bordIDs.begin(); bord != bordIDs.end(); ++bord ) - if (( *bord != e1->myBorderID ) && - (( be = e1->myBNode1->GetCloseEdgeOfBorder( *bord, &u ))) && + if ((( be = e1->myBNode1->GetCloseEdgeOfBorder( *bord, &u ))) && ( be->myInGroup == groupID ) && ( 0 < u && u < 1 ) && ( be->IsOverlappingProjection( e1->myPrev, u, false ))) @@ -206,12 +241,17 @@ namespace e1 = e1->myPrev; break; } + if ( bord == bordIDs.end() && // not extended + e1->myBNode1->HasCloseEdgeWithNode( e1->myPrev->myBNode1 )) + { + e1 = e1->myPrev; + } + e1->myInGroup = groupID; } if ( e2->myNext ) { for ( bord = bordIDs.begin(); bord != bordIDs.end(); ++bord ) - if (( *bord != e2->myBorderID ) && - (( be = e2->myBNode2->GetCloseEdgeOfBorder( *bord, &u ))) && + if ((( be = e2->myBNode2->GetCloseEdgeOfBorder( *bord, &u ))) && ( be->myInGroup == groupID ) && ( 0 < u && u < 1 ) && ( be->IsOverlappingProjection( e2->myNext, u, true ))) @@ -219,6 +259,12 @@ namespace e2 = e2->myNext; break; } + if ( bord == bordIDs.end() && // not extended + e2->myBNode2->HasCloseEdgeWithNode( e2->myNext->myBNode2 )) + { + e2 = e2->myNext; + } + e2->myInGroup = groupID; } } @@ -261,11 +307,22 @@ namespace if ( uPtr ) *uPtr = u; return e; } - bool BNode::IsCloseEdge( const BEdge* e ) const + bool BNode::HasCloseEdgeWithNode( const BNode* n ) const + { + for ( size_t i = 0; i < myCloseEdges.size(); ++i ) + if ( GetCloseEdge( i )->Contains( n ) && + 0 < GetCloseU( i ) && GetCloseU( i ) < 1 ) + return true; + return false; + } + bool BNode::IsCloseEdge( const BEdge* e, double * uPtr ) const { for ( size_t i = 0; i < myCloseEdges.size(); ++i ) if ( e == GetCloseEdge( i ) ) + { + if ( uPtr ) *uPtr = GetCloseU( i ); return true; + } return false; } @@ -315,6 +372,7 @@ void SMESH_MeshAlgos::FindCoincidentFreeBorders(SMDS_Mesh& mesh, // find free links typedef NCollection_DataMap TLink2FaceMap; TLink2FaceMap linkMap; + int nbSharedLinks = 0; SMDS_FaceIteratorPtr faceIt = mesh.facesIterator(); while ( faceIt->more() ) { @@ -327,27 +385,36 @@ void SMESH_MeshAlgos::FindCoincidentFreeBorders(SMDS_Mesh& mesh, { const SMDS_MeshNode* n1 = nodeIt->next(); SMESH_TLink link( n0, n1 ); - if ( !linkMap.Bind( link, face )) - linkMap.UnBind( link ); + if ( const SMDS_MeshElement** faceInMap = linkMap.ChangeSeek( link )) + { + nbSharedLinks += bool( *faceInMap ); + *faceInMap = 0; + } + else + { + linkMap.Bind( link, face ); + } n0 = n1; } } - if ( linkMap.IsEmpty() ) + if ( linkMap.Extent() == nbSharedLinks ) return; // form free borders std::set < BNode > bNodes; - std::vector< BEdge > bEdges( linkMap.Extent() ); + std::vector< BEdge > bEdges( linkMap.Extent() - nbSharedLinks ); TLink2FaceMap::Iterator linkIt( linkMap ); - for ( int iEdge = 0; linkIt.More(); linkIt.Next(), ++iEdge ) + for ( int iEdge = 0; linkIt.More(); linkIt.Next() ) { + if ( !linkIt.Value() ) continue; const SMESH_TLink & link = linkIt.Key(); std::set< BNode >::iterator n1 = bNodes.insert( BNode( link.node1() )).first; std::set< BNode >::iterator n2 = bNodes.insert( BNode( link.node2() )).first; bEdges[ iEdge ].Set( &*n1, &*n2, linkIt.Value(), iEdge+1 ); n1->AddLinked( & bEdges[ iEdge ] ); n2->AddLinked( & bEdges[ iEdge ] ); + ++iEdge; } linkMap.Clear(); @@ -563,36 +630,44 @@ void SMESH_MeshAlgos::FindCoincidentFreeBorders(SMDS_Mesh& mesh, } beRange[1]->myInGroup = groupID; + // get starting edge of each close border + closeEdges.clear(); + be = beRange[0]; + if ( be->myCloseBorders.empty() ) + be = beRange[0]->myNext; + std::set::iterator closeBord = be->myCloseBorders.begin(); + for ( ; closeBord != be->myCloseBorders.end(); ++closeBord ) + if ( BEdge* e = be->myBNode2->GetCloseEdgeOfBorder( *closeBord )) + closeEdges.push_back( e ); + + for ( size_t iE = 0; iE < closeEdges.size(); ++iE ) + if ( be->myCloseBorders != closeEdges[iE]->myCloseBorders ) + { + closeBord = closeEdges[iE]->myCloseBorders.begin(); + for ( ; closeBord != closeEdges[iE]->myCloseBorders.end(); ++closeBord ) + if ( !be->myCloseBorders.count( *closeBord )) + if ( BEdge* e = closeEdges[iE]->myBNode2->GetCloseEdgeOfBorder( *closeBord )) + if ( std::find( closeEdges.begin(), closeEdges.end(), e ) == closeEdges.end() ) + closeEdges.push_back( e ); + } + // add parts of other borders BEdge* be1st = beRange[0]; - closeEdges.clear(); - std::set::iterator closeBord = be1st->myCloseBorders.begin(); - for ( ; closeBord != be1st->myCloseBorders.end(); ++closeBord ) - closeEdges.push_back( be1st->myBNode2->GetCloseEdgeOfBorder( *closeBord )); - for ( size_t iE = 0; iE < closeEdges.size(); ++iE ) { be = closeEdges[ iE ]; if ( !be ) continue; bool ok = be->GetRangeOfSameCloseBorders( beRange, be->myCloseBorders ); - if ( !ok && be->myPrev ) - ok = be->myPrev->GetRangeOfSameCloseBorders( beRange, be1st->myCloseBorders ); - if ( !ok && be->myNext ) - ok = be->myNext->GetRangeOfSameCloseBorders( beRange, be1st->myCloseBorders ); + // if ( !ok && be->myPrev ) + // ok = be->myPrev->GetRangeOfSameCloseBorders( beRange, be1st->myCloseBorders ); + // if ( !ok && be->myNext ) + // ok = be->myNext->GetRangeOfSameCloseBorders( beRange, be1st->myCloseBorders ); if ( !ok ) continue; be = beRange[0]; - if ( be->myCloseBorders != be1st->myCloseBorders ) - { - //add missing edges to closeEdges - closeBord = be->myCloseBorders.begin(); - for ( ; closeBord != be->myCloseBorders.end(); ++closeBord ) - if ( !be1st->myCloseBorders.count( *closeBord )) - closeEdges.push_back( be->myBNode2->GetCloseEdgeOfBorder( *closeBord )); - } ranges.push_back( beRange[0] ); ranges.push_back( beRange[1] ); @@ -645,9 +720,11 @@ void SMESH_MeshAlgos::FindCoincidentFreeBorders(SMDS_Mesh& mesh, part._node2 = beRange[0]->myID + 1; part._nodeLast = beRange[1]->myID + 1; } + // if ( group[0]._node2 != part._node2 ) group.push_back( part ); } - foundFreeBordes._coincidentGroups.push_back( group ); + //if ( group.size() > 1 ) + foundFreeBordes._coincidentGroups.push_back( group ); } else { diff --git a/src/SMESHUtils/SMESH_MeshAlgos.cxx b/src/SMESHUtils/SMESH_MeshAlgos.cxx index 1a9dd65bb..a5171703b 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.cxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.cxx @@ -1541,10 +1541,8 @@ SMESH_MeshAlgos::FindFaceInSet(const SMDS_MeshNode* n1, const SMDS_MeshElement* face = 0; SMDS_ElemIteratorPtr invElemIt = n1->GetInverseElementIterator(SMDSAbs_Face); - //MESSAGE("n1->GetInverseElementIterator(SMDSAbs_Face) " << invElemIt); while ( invElemIt->more() && !face ) // loop on inverse faces of n1 { - //MESSAGE("in while ( invElemIt->more() && !face )"); const SMDS_MeshElement* elem = invElemIt->next(); if (avoidSet.count( elem )) continue; @@ -1563,9 +1561,6 @@ SMESH_MeshAlgos::FindFaceInSet(const SMDS_MeshNode* n1, if ( !face && elem->IsQuadratic()) { // analysis for quadratic elements using all nodes - // const SMDS_VtkFace* F = dynamic_cast(elem); - // if (!F) throw SALOME_Exception(LOCALIZED("not an SMDS_VtkFace")); - // use special nodes iterator SMDS_ElemIteratorPtr anIter = elem->interlacedNodesElemIterator(); const SMDS_MeshNode* prevN = static_cast( anIter->next() ); for ( i1 = -1, i2 = 0; anIter->more() && !face; i1++, i2++ ) diff --git a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx index 6edbf2b85..7c9dca548 100644 --- a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx @@ -1115,9 +1115,9 @@ bool _QuadFaceGrid::LoadGrid( SMESH_Mesh& mesh ) // store the rest nodes row by row - const SMDS_MeshNode* dummy = mesh.GetMeshDS()->AddNode(0,0,0); - const SMDS_MeshElement* firstQuad = dummy; // most left face above the last row of found nodes - + TIDSortedElemSet emptySet, avoidSet; + const SMDS_MeshElement* firstQuad = 0; // most left face above the last row of found nodes + int nbFoundNodes = myIndexer._xSize; while ( nbFoundNodes != myGrid.size() ) { @@ -1134,8 +1134,6 @@ bool _QuadFaceGrid::LoadGrid( SMESH_Mesh& mesh ) // o---o o o o o //n1down n2down // - TIDSortedElemSet emptySet, avoidSet; - avoidSet.insert( firstQuad ); firstQuad = SMESH_MeshAlgos::FindFaceInSet( n1down, n2down, emptySet, avoidSet); while ( firstQuad && !faceSubMesh->Contains( firstQuad )) { avoidSet.insert( firstQuad ); @@ -1182,8 +1180,8 @@ bool _QuadFaceGrid::LoadGrid( SMESH_Mesh& mesh ) n1down = myGrid[ nbFoundNodes - myIndexer._xSize - 1 ]; n1up = n2up; } + avoidSet.clear(); avoidSet.insert( firstQuad ); } - mesh.GetMeshDS()->RemoveNode(dummy); DumpGrid(); // debug return true; -- 2.30.2