-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014 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.
+// 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
// Reverse theFaces whose orientation to be same as that of theFace
// oriented according to theDirection. Return nb of reoriented faces
+ int Reorient2DBy3D (TIDSortedElemSet & theFaces,
+ TIDSortedElemSet & theVolumes,
+ const bool theOutsideNormal);
+ // Reorient faces basing on orientation of adjacent volumes.
+ // Return nb of reoriented faces
+
/*!
* \brief Fuse neighbour triangles into quadrangles.
* \param theElems - The triangles to be fused.
SMESH::Controls::NumericalFunctorPtr theCriterion);
- enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2, HEXA_TO_24 = 3 };//!<arg of SplitVolumesIntoTetra()
+ typedef std::map < const SMDS_MeshElement*, int, TIDCompare > TFacetOfElem;
+
+ //!<2nd arg of SplitVolumes()
+ enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, // split into tetrahedra
+ HEXA_TO_6,
+ HEXA_TO_24,
+ HEXA_TO_2_PRISMS, // split into prisms
+ HEXA_TO_4_PRISMS };
+ /*!
+ * \brief Split volumic elements into tetrahedra or prisms.
+ * If facet ID < 0, element is split into tetrahedra,
+ * else a hexahedron is split into prisms so that the given facet is
+ * split into triangles
+ */
+ void SplitVolumes (const TFacetOfElem & theElems, const int theMethodFlags);
+
/*!
- * \brief Split volumic elements into tetrahedra.
+ * \brief For hexahedra that will be split into prisms, finds facets to
+ * split into triangles
+ * \param [in,out] theHexas - the hexahedra
+ * \param [in] theFacetNormal - facet normal
+ * \param [out] theFacets - the hexahedra and found facet IDs
*/
- void SplitVolumesIntoTetra (const TIDSortedElemSet & theElems, const int theMethodFlags);
+ void GetHexaFacetsToSplit( TIDSortedElemSet& theHexas,
+ const gp_Ax1& theFacetNormal,
+ TFacetOfElem & theFacets);
enum SmoothMethod { LAPLACIAN = 0, CENTROIDAL };
// If the2D, smoothing is performed using UV parameters of nodes
// on geometrical faces
+ typedef TIDTypeCompare TElemSort;
typedef std::map < const SMDS_MeshElement*,
- std::list<const SMDS_MeshElement*>, TIDTypeCompare > TTElemOfElemListMap;
+ std::list<const SMDS_MeshElement*>, TElemSort > TTElemOfElemListMap;
typedef std::map<const SMDS_MeshNode*, std::list<const SMDS_MeshNode*> > TNodeOfNodeListMap;
typedef TNodeOfNodeListMap::iterator TNodeOfNodeListMapItr;
typedef std::vector<TNodeOfNodeListMapItr> TVecOfNnlmiMap;
- typedef std::map<const SMDS_MeshElement*, TVecOfNnlmiMap, TIDCompare > TElemOfVecOfNnlmiMap;
+ typedef std::map<const SMDS_MeshElement*, TVecOfNnlmiMap, TElemSort > TElemOfVecOfNnlmiMap;
typedef std::auto_ptr< std::list<int> > PGroupIDs;
PGroupIDs RotationSweep (TIDSortedElemSet & theElements,
double OrientedAngle(const gp_Pnt& p0, const gp_Pnt& p1, const gp_Pnt& g1, const gp_Pnt& g2);
bool DoubleNodesOnGroupBoundaries( const std::vector<TIDSortedElemSet>& theElems,
- bool createJointElems);
+ bool createJointElems,
+ bool onAllBoundaries);
bool CreateFlatElementsOnFacesGroups( const std::vector<TIDSortedElemSet>& theElems );
* \param nodeGens - nodes making corresponding myLastCreatedNodes
* \param elemGens - elements making corresponding myLastCreatedElems
* \param postfix - to append to names of new groups
+ * \param targetMesh - mesh to create groups in
+ * \param topPresent - is there "top" elements that are created by sweeping
*/
PGroupIDs generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
const SMESH_SequenceOfElemPtr& elemGens,
const std::string& postfix,
- SMESH_Mesh* targetMesh=0);
+ SMESH_Mesh* targetMesh=0,
+ const bool topPresent=true);
/*!
* \brief Create elements by sweeping an element
* \param elem - element to sweep
std::map< const SMDS_MeshNode*, const SMDS_MeshNode* >& theNodeNodeMap,
const bool theIsDoubleElem );
+ void copyPosition( const SMDS_MeshNode* from,
+ const SMDS_MeshNode* to );
+
private:
SMESH_Mesh * myMesh;