From 4ac8d075849b2ff7d0934a811dda5b6972873540 Mon Sep 17 00:00:00 2001 From: prascle Date: Mon, 28 Mar 2011 14:46:16 +0000 Subject: [PATCH] PR: DoubleNodesOnGroupBoundaries in progress --- doc/salome/tui/doxyfile.in | 2 +- src/SMDS/SMDS_UnstructuredGrid.cxx | 3 +- src/SMDS/SMDS_UnstructuredGrid.hxx | 16 ++++---- src/SMESH/SMESH_MeshEditor.cxx | 46 +++++++++++++++++---- src/SMESH/SMESH_MeshEditor.hxx | 66 +++++++++++++++--------------- src/SMESH_I/SMESH_MeshEditor_i.cxx | 2 + 6 files changed, 82 insertions(+), 53 deletions(-) diff --git a/doc/salome/tui/doxyfile.in b/doc/salome/tui/doxyfile.in index 56d3277d5..8b477a516 100755 --- a/doc/salome/tui/doxyfile.in +++ b/doc/salome/tui/doxyfile.in @@ -262,4 +262,4 @@ DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- -SEARCHENGINE = NO +SEARCHENGINE = YES diff --git a/src/SMDS/SMDS_UnstructuredGrid.cxx b/src/SMDS/SMDS_UnstructuredGrid.cxx index 413b6e644..869e6079c 100644 --- a/src/SMDS/SMDS_UnstructuredGrid.cxx +++ b/src/SMDS/SMDS_UnstructuredGrid.cxx @@ -3,6 +3,7 @@ #include "SMDS_Mesh.hxx" #include "SMDS_MeshInfo.hxx" #include "SMDS_Downward.hxx" +#include "SMDS_MeshVolume.hxx" #include "utilities.h" @@ -924,7 +925,7 @@ void SMDS_UnstructuredGrid::BuildLinks() * @param nodeDomains: map(original id --> map(domain --> duplicated node id)) * @return ok if success. */ -bool SMDS_UnstructuredGrid::extrudeVolumeFromFace(int vtkVolId, +SMDS_MeshVolume* SMDS_UnstructuredGrid::extrudeVolumeFromFace(int vtkVolId, int domain1, int domain2, std::set& originalNodes, diff --git a/src/SMDS/SMDS_UnstructuredGrid.hxx b/src/SMDS/SMDS_UnstructuredGrid.hxx index f969cab10..2afe37800 100644 --- a/src/SMDS/SMDS_UnstructuredGrid.hxx +++ b/src/SMDS/SMDS_UnstructuredGrid.hxx @@ -18,7 +18,7 @@ //#define VTK_HAVE_POLYHEDRON //#ifdef VTK_HAVE_POLYHEDRON - #define VTK_MAXTYPE VTK_POLYHEDRON +#define VTK_MAXTYPE VTK_POLYHEDRON //#else // #define VTK_MAXTYPE VTK_QUADRATIC_PYRAMID //#endif @@ -30,6 +30,7 @@ class SMDS_Downward; class SMDS_Mesh; +class SMDS_MeshVolume; class SMDS_CellLinks: public vtkCellLinks { @@ -54,9 +55,9 @@ public: virtual void UpdateInformation(); virtual vtkPoints *GetPoints(); -//#ifdef VTK_HAVE_POLYHEDRON + //#ifdef VTK_HAVE_POLYHEDRON int InsertNextLinkedCell(int type, int npts, vtkIdType *pts); -//#endif + //#endif int CellIdToDownId(int vtkCellId); void setCellIdToDownId(int vtkCellId, int downId); @@ -68,12 +69,9 @@ public: void ModifyCellNodes(int vtkVolId, std::map localClonedNodeIds); int getOrderedNodesOfFace(int vtkVolId, std::vector& orderedNodes); void BuildLinks(); - bool extrudeVolumeFromFace(int vtkVolId, - int domain1, - int domain2, - std::set& originalNodes, - std::map >& nodeDomains, - std::map >& nodeQuadDomains); + SMDS_MeshVolume* extrudeVolumeFromFace(int vtkVolId, int domain1, int domain2, std::set& originalNodes, + std::map >& nodeDomains, + std::map >& nodeQuadDomains); vtkCellLinks* GetLinks() { return Links; diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 85a8b912c..e7c1cf476 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -95,6 +95,7 @@ #include #include #include +#include #define cast2Node(elem) static_cast( elem ) @@ -5307,7 +5308,7 @@ void SMESH_MeshEditor::LinearAngleVariation(const int nbSteps, * \param theCopy - if true, create translated copies of theElems * \param theMakeGroups - if true and theCopy, create translated groups * \param theTargetMesh - mesh to copy translated elements into - * \retval SMESH_MeshEditor::PGroupIDs - list of ids of created groups + * \return SMESH_MeshEditor::PGroupIDs - list of ids of created groups */ //================================================================================ @@ -9184,7 +9185,7 @@ void SMESH_MeshEditor::UpdateVolumes (const SMDS_MeshNode* theBetweenNode //======================================================================= /*! * \brief Convert elements contained in a submesh to quadratic - * \retval int - nb of checked elements + * \return int - nb of checked elements */ //======================================================================= @@ -9536,7 +9537,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d, //======================================================================= /*! * \brief Convert quadratic elements to linear ones and remove quadratic nodes - * \retval int - nb of checked elements + * \return int - nb of checked elements */ //======================================================================= @@ -10337,7 +10338,7 @@ SMESH_MeshEditor::SewSideElements (TIDSortedElemSet& theSide1, * \param theSecondNode1 - a boundary node of set 1 linked with theFirstNode1 * \param theSecondNode2 - a node of set 2 corresponding to theSecondNode1 * \param nReplaceMap - output map of corresponding nodes - * \retval bool - is a success or not + * \return bool - is a success or not */ //================================================================================ @@ -10847,6 +10848,7 @@ double SMESH_MeshEditor::OrientedAngle(const gp_Pnt& p0, const gp_Pnt& p1, const * The nodes of the internal faces at the boundaries of the groups are doubled. * In option, the internal faces are replaced by flat elements. * Triangles are transformed in prisms, and quadrangles in hexahedrons. + * The flat elements are stored in groups of volumes. * @param theElems - list of groups of volumes, where a group of volume is a set of * SMDS_MeshElements sorted by Id. * @param createJointElems - if TRUE, create the elements @@ -11125,11 +11127,12 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector > nodeQuadDomains; + std::map mapOfJunctionGroups; if (createJointElems) { itface = faceDomains.begin(); - for( ; itface != faceDomains.end();++itface ) + for (; itface != faceDomains.end(); ++itface) { DownIdType face = itface->first; std::set oldNodes; @@ -11137,13 +11140,27 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vectorGetNodeIds(oldNodes, face.cellId, face.cellType); - std::map domvol = itface->second; - std::map::iterator itdom = domvol.begin(); + std::map domvol = itface->second; + std::map::iterator itdom = domvol.begin(); int dom1 = itdom->first; int vtkVolId = itdom->second; itdom++; int dom2 = itdom->first; - grid->extrudeVolumeFromFace(vtkVolId, dom1, dom2, oldNodes, nodeDomains, nodeQuadDomains); + SMDS_MeshVolume *vol = grid->extrudeVolumeFromFace(vtkVolId, dom1, dom2, oldNodes, nodeDomains, + nodeQuadDomains); + stringstream grpname; + grpname << "junction_"; + if (dom1 < dom2) + grpname << dom1 << "_" << dom2; + else + grpname << dom2 << "_" << dom1; + int idg; + string namegrp = grpname.str(); + if (!mapOfJunctionGroups.count(namegrp)) + mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(SMDSAbs_Volume, namegrp.c_str(), idg); + SMESHDS_Group *sgrp = dynamic_cast(mapOfJunctionGroups[namegrp]->GetGroupDS()); + if (sgrp) + sgrp->Add(vol->GetID()); } } @@ -11168,7 +11185,18 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector=0; idom--) orderedNodes.push_back( nodeDomains[nodes[ino]][orderDom[idom]] ); - this->GetMeshDS()->AddVolumeFromVtkIds(orderedNodes); + SMDS_MeshVolume* vol = this->GetMeshDS()->AddVolumeFromVtkIds(orderedNodes); + + stringstream grpname; + grpname << "junction_"; + grpname << 0 << "_" << 0; + int idg; + string namegrp = grpname.str(); + if (!mapOfJunctionGroups.count(namegrp)) + mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(SMDSAbs_Volume, namegrp.c_str(), idg); + SMESHDS_Group *sgrp = dynamic_cast(mapOfJunctionGroups[namegrp]->GetGroupDS()); + if (sgrp) + sgrp->Add(vol->GetID()); } else { diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 4b52b4f10..c4995b43d 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -20,7 +20,7 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes // File : SMESH_MeshEditor.hxx // Created : Mon Apr 12 14:56:19 2004 // Author : Edward AGAPOV (eap) @@ -149,7 +149,7 @@ public: * \param theCriterion - Is used to choose a neighbour to fuse with. * \param theMaxAngle - Is a max angle between element normals at which fusion * is still performed; theMaxAngle is mesured in radians. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool TriToQuad (TIDSortedElemSet & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion, @@ -159,7 +159,7 @@ public: * \brief Split quadrangles into triangles. * \param theElems - The faces to be splitted. * \param theCriterion - Is used to choose a diagonal for splitting. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool QuadToTri (TIDSortedElemSet & theElems, SMESH::Controls::NumericalFunctorPtr theCriterion); @@ -168,7 +168,7 @@ public: * \brief Split quadrangles into triangles. * \param theElems - The faces to be splitted. * \param the13Diag - Is used to choose a diagonal for splitting. - * \retval bool - Success or not. + * \return bool - Success or not. */ bool QuadToTri (TIDSortedElemSet & theElems, const bool the13Diag); @@ -177,7 +177,7 @@ public: * \brief Find better diagonal for splitting. * \param theQuad - The face to find better splitting of. * \param theCriterion - Is used to choose a diagonal for splitting. - * \retval int - 1 for 1-3 diagonal, 2 for 2-4, -1 - for errors. + * \return int - 1 for 1-3 diagonal, 2 for 2-4, -1 - for errors. */ int BestSplit (const SMDS_MeshElement* theQuad, SMESH::Controls::NumericalFunctorPtr theCriterion); @@ -230,7 +230,7 @@ public: }; /*! - * special structire for control of extrusion functionality + * special structure for control of extrusion functionality */ struct ExtrusParam { gp_Dir myDir; // direction of extrusion @@ -240,7 +240,7 @@ public: /*! * Create new node in the mesh with given coordinates - * (auxilary for advanced extrusion) + * (auxiliary for advanced extrusion) */ const SMDS_MeshNode* CreateNode(const double x, const double y, @@ -252,12 +252,12 @@ public: * Generate new elements by extrusion of theElements * It is a method used in .idl file. All functionality * is implemented in the next method (see below) which - * is used in the cuurent method. - * param theElems - list of elements for extrusion - * param newElemsMap returns history of extrusion - * param theFlags set flags for performing extrusion (see description + * is used in the current method. + * @param theElems - list of elements for extrusion + * @param newElemsMap returns history of extrusion + * @param theFlags set flags for performing extrusion (see description * of enum ExtrusionFlags for additional information) - * param theTolerance - uses for comparing locations of nodes if flag + * @param theTolerance - uses for comparing locations of nodes if flag * EXTRUSION_FLAG_SEW is set */ PGroupIDs ExtrusionSweep (TIDSortedElemSet & theElems, @@ -270,13 +270,13 @@ public: /*! * Generate new elements by extrusion of theElements - * param theElems - list of elements for extrusion - * param newElemsMap returns history of extrusion - * param theFlags set flags for performing extrusion (see description + * @param theElems - list of elements for extrusion + * @param newElemsMap returns history of extrusion + * @param theFlags set flags for performing extrusion (see description * of enum ExtrusionFlags for additional information) - * param theTolerance - uses for comparing locations of nodes if flag + * @param theTolerance - uses for comparing locations of nodes if flag * EXTRUSION_FLAG_SEW is set - * param theParams - special structure for manage of extrusion + * @param theParams - special structure for manage of extrusion */ PGroupIDs ExtrusionSweep (TIDSortedElemSet & theElems, ExtrusParam& theParams, @@ -342,7 +342,7 @@ public: SMESH_NodeSearcher* GetNodeSearcher(); /*! - * \brief Return SMESH_ElementSearcher. The caller is responsible for deleteing it + * \brief Return SMESH_ElementSearcher. The caller is responsible for deleting it */ SMESH_ElementSearcher* GetElementSearcher(); SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt ); @@ -523,7 +523,7 @@ public: * \param theSecondNode1 - a boundary node of set 1 linked with theFirstNode1 * \param theSecondNode2 - a node of set 2 corresponding to theSecondNode1 * \param nReplaceMap - output map of corresponding nodes - * \retval Sew_Error - is a success or not + * \return Sew_Error - is a success or not */ static Sew_Error FindMatchingNodes(std::set& theSide1, std::set& theSide2, @@ -537,7 +537,7 @@ public: * \brief Returns true if given node is medium * \param n - node to check * \param typeToCheck - type of elements containing the node to ask about node status - * \retval bool - check result + * \return bool - check result */ static bool IsMedium(const SMDS_MeshNode* node, const SMDSAbs_ElementType typeToCheck = SMDSAbs_All); @@ -593,7 +593,7 @@ public: /*! * \brief Convert elements contained in a submesh to quadratic - * \retval int - nb of checked elements + * \return int - nb of checked elements */ int convertElemToQuadratic(SMESHDS_SubMesh * theSm, SMESH_MesherHelper& theHelper, @@ -601,7 +601,7 @@ public: /*! * \brief Convert quadratic elements to linear ones and remove quadratic nodes - * \retval int - nb of checked elements + * \return nb of checked elements */ int removeQuadElem( SMESHDS_SubMesh * theSm, SMDS_ElemIteratorPtr theItr, @@ -625,11 +625,11 @@ public: /*! * \brief Create elements by sweeping an element - * \param elem - element to sweep - * \param newNodesItVec - nodes generated from each node of the element - * \param newElems - generated elements - * \param nbSteps - number of sweeping steps - * \param srcElements - to append elem for each generated element + * \param elem - element to sweep + * \param newNodesItVec - nodes generated from each node of the element + * \param newElems - generated elements + * \param nbSteps - number of sweeping steps + * \param srcElements - to append elem for each generated element */ void sweepElement(const SMDS_MeshElement* elem, const std::vector & newNodesItVec, @@ -639,12 +639,12 @@ public: /*! * \brief Create 1D and 2D elements around swept elements - * \param mapNewNodes - source nodes and ones generated from them - * \param newElemsMap - source elements and ones generated from them - * \param elemNewNodesMap - nodes generated from each node of each element - * \param elemSet - all swept elements - * \param nbSteps - number of sweeping steps - * \param srcElements - to append elem for each generated element + * \param mapNewNodes - source nodes and ones generated from them + * \param newElemsMap - source elements and ones generated from them + * \param elemNewNodesMap - nodes generated from each node of each element + * \param elemSet - all swept elements + * \param nbSteps - number of sweeping steps + * \param srcElements - to append elem for each generated element */ void makeWalls (TNodeOfNodeListMap & mapNewNodes, TElemOfElemListMap & newElemsMap, diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index cccac710f..218fe5a5d 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -5588,6 +5588,7 @@ CORBA::Boolean SMESH_MeshEditor_i::Make2DMeshFrom3D() * The nodes of the internal faces at the boundaries of the groups are doubled. * In option, the internal faces are replaced by flat elements. * Triangles are transformed in prisms, and quadrangles in hexahedrons. + * The flat elements are stored in groups of volumes. * @param theDomains - list of groups of volumes * @param createJointElems - if TRUE, create the elements * @return TRUE if operation has been completed successfully, FALSE otherwise @@ -5620,6 +5621,7 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::Li } bool aResult = aMeshEditor.DoubleNodesOnGroupBoundaries( domains, createJointElems ); + // TODO publish the groups of flat elements in study storeResult( aMeshEditor) ; myMesh->GetMeshDS()->Modified(); -- 2.39.2