X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_BlockRenumber.hxx;fp=src%2FStdMeshers%2FStdMeshers_BlockRenumber.hxx;h=f68b17ecd8566885fda321ff3c5f00d4bb5724ad;hp=0000000000000000000000000000000000000000;hb=d245f797f1b69aca678fa372391275d7042faa10;hpb=34d237befeb90f2b48ddb43cfd40fd6f80d58603 diff --git a/src/StdMeshers/StdMeshers_BlockRenumber.hxx b/src/StdMeshers/StdMeshers_BlockRenumber.hxx new file mode 100644 index 000000000..f68b17ecd --- /dev/null +++ b/src/StdMeshers/StdMeshers_BlockRenumber.hxx @@ -0,0 +1,170 @@ +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// SMESH SMESH : implementation of SMESH idl descriptions +// File : StdMeshers_BlockRenumber.hxx +// Author : Edward AGAPOV, OCC +// Module : SMESH +// +#ifndef _SMESH_BlockRenumber_HXX_ +#define _SMESH_BlockRenumber_HXX_ + +#include "SMESH_StdMeshers.hxx" + +#include "SMESH_ComputeError.hxx" +#include "SMESH_Hypothesis.hxx" +#include "SMESH_MeshEditor.hxx" + +#include +#include +#include + +#include +#include + +class SMESH_Mesh; +class TopoDS_Shape; +class TopoDS_TShape; +class TopoDS_Vertex; + +// ========================================================= +struct StdMeshers_BlockCS // Local coordinate system of a block +{ + std::string _solid; + std::string _vertex000; + std::string _vertex001; + + bool operator==( const StdMeshers_BlockCS& other ) const + { + return ( _solid == other._solid && + _vertex000 == other._vertex000 && + _vertex001 == other._vertex001 ); + } +}; + +// ========================================================= +/*! + * \class 3D Hypothesis used by Hexahedron(ijk) algorithm + * to renumber mesh of a block to be structured-like + */ +// ========================================================= + +class STDMESHERS_EXPORT StdMeshers_BlockRenumber : public SMESH_Hypothesis +{ +public: + StdMeshers_BlockRenumber(int hypId, SMESH_Gen * gen); + + void SetBlocksOrientation( std::vector< StdMeshers_BlockCS > & blockCS ); + + const std::vector< StdMeshers_BlockCS > & GetBlocksOrientation() const { return _blockCS; } + + virtual std::ostream & SaveTo(std::ostream & save) override; + virtual std::istream & LoadFrom(std::istream & load) override; + + /*! + * \brief Initialize Fineness by the mesh built on the geometry + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + */ + bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape) override + { return false; } + + /*! + * \brief Initialize my parameter values by default parameters. + * \retval bool - true if parameter values have been successfully defined + */ + bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0) override + { return false; } + + public: + + /*! + * \brief Check validity of parameter + */ + SMESH_ComputeErrorPtr CheckHypothesis(SMESH_Mesh& theMesh, const TopoDS_Shape& theShape) const; + + /*! + * \brief Return true and vertices if block orientation is defined for a given solid + */ + bool IsSolidIncluded( SMESH_Mesh& mesh, + const TopoDS_Shape& solid, + TopoDS_Vertex& vertex000, + TopoDS_Vertex& vertex001 ) const; + + private: + + // Persistence: define both input and output at once + friend class boost::serialization::access; + template void serialize( Archive & ar, const unsigned int version ) + { + ar & _blockCS; + } + + protected: + + std::vector< StdMeshers_BlockCS > _blockCS; + + typedef NCollection_DataMap< TopoDS_Shape, std::pair< TopoDS_Vertex, TopoDS_Vertex > > TSolid2VV; + TSolid2VV _solids2vertices; // shapes defined by _blockCS, non-persistent +}; + +// ========================================================= +/*! + * \brief Help in using StdMeshers_BlockRenumber + */ +class StdMeshers_RenumberHelper +{ +public: + + StdMeshers_RenumberHelper( SMESH_Mesh& mesh, + const StdMeshers_BlockRenumber* hyp); + /*! + * \brief Find default vertex at (0,0,0) local position + */ + static TopoDS_Vertex GetVertex000( const TopTools_MapOfShape& cornerVertices ); + + /*! + * \brief Find a vertex of a solid located at the given point + */ + static TopoDS_Vertex GetVertexAtPoint( const TopoDS_Shape& solid, const TopoDS_Shape& point ); + + /*! + * \brief Create a copy of an old node and remember this couple of nodes for replacement + */ + void AddReplacingNode( const SMDS_MeshNode* & oldNode ); + + /*! + * \brief Replace old nodes by new ones + */ + void DoReplaceNodes(); + +private: + + SMESH_Mesh* _mesh; + const StdMeshers_BlockRenumber* _hyp; + + SMESH_MeshEditor::TListOfListOfNodes _nodesToMerge; + std::list< const SMDS_MeshNode* > _newOldNodes; +}; + +#endif