X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_PolyhedralVolumeOfNodes.cxx;h=ce8ace8300e9efde4316b00c9d1aab9c067b264f;hp=1c4fd4761bf1d4868ecf248247c3e8fd1fdcd5bb;hb=f31477795020e2cfc50d5b625579285c644a6a96;hpb=c63ee099ad2b149bd70136839c973e8910137bc5 diff --git a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx index 1c4fd4761..ce8ace830 100644 --- a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx +++ b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx @@ -1,30 +1,34 @@ +// Copyright (C) 2007-2008 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. +// +// 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 SMDS : implementaion of Salome mesh data structure // -// Copyright (C) 2003 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. -// -// 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 - #ifdef _MSC_VER #pragma warning(disable:4786) #endif #include "SMDS_PolyhedralVolumeOfNodes.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_SetIterator.hxx" +#include "SMDS_VolumeTool.hxx" #include "utilities.h" #include @@ -36,8 +40,8 @@ using namespace std; //purpose : Create a volume of many faces //======================================================================= SMDS_PolyhedralVolumeOfNodes::SMDS_PolyhedralVolumeOfNodes - (std::vector nodes, - std::vector quantities) + (vector nodes, + vector quantities) : SMDS_VolumeOfNodes(NULL, NULL, NULL, NULL) { ChangeNodes(nodes, quantities); @@ -57,51 +61,36 @@ SMDSAbs_ElementType SMDS_PolyhedralVolumeOfNodes::GetType() const //function : ChangeNodes //purpose : //======================================================================= -bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (std::vector nodes, - std::vector quantities) +bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (const vector& nodes, + const vector& quantities) { myNodesByFaces = nodes; myQuantities = quantities; - // Init fields of parent class - int aNbNodes = 0; - std::set aSet; - int nodes_len = nodes.size(); - for (int j = 0; j < nodes_len; j++) { - if (aSet.find(nodes[j]) == aSet.end()) { - aSet.insert(nodes[j]); - aNbNodes++; - } - } - - int k = 0; -#ifndef WNT - const SMDS_MeshNode* aNodes [aNbNodes]; -#else - const SMDS_MeshNode** aNodes = (const SMDS_MeshNode **)new SMDS_MeshNode*[aNbNodes]; -#endif - std::set::iterator anIter = aSet.begin(); - for (; anIter != aSet.end(); anIter++, k++) { - aNodes[k] = *anIter; - } + // Init fields of parent class, it allows to get only unique nodes(?) + set aSet; + aSet.insert( nodes.begin(), nodes.end()); //SMDS_VolumeOfNodes::ChangeNodes(aNodes, aNbNodes); delete [] myNodes; - //myNbNodes = nodes.size(); - myNbNodes = aNbNodes; + myNbNodes = aSet.size(); myNodes = new const SMDS_MeshNode* [myNbNodes]; - for (int i = 0; i < myNbNodes; i++) { - //myNodes[i] = nodes[i]; - myNodes[i] = aNodes[i]; - } - -#ifdef WNT - delete [] aNodes; -#endif + set::iterator anIter = aSet.begin(); + for (int k=0; anIter != aSet.end(); anIter++, k++) + myNodes[k] = *anIter; return true; } +//======================================================================= +//function : NbEdges +//purpose : +//======================================================================= +int SMDS_PolyhedralVolumeOfNodes::NbNodes() const +{ + return myNodesByFaces.size(); +} + //======================================================================= //function : NbEdges //purpose : @@ -188,3 +177,87 @@ bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[], { return false; } + +/// =================================================================== +/*! + * \brief Iterator on node of volume + */ +/// =================================================================== + +struct _MyIterator:public SMDS_NodeVectorElemIterator +{ + _MyIterator(const vector& nodes): + SMDS_NodeVectorElemIterator( nodes.begin(), nodes.end()) {} +}; + +/// =================================================================== +/*! + * \brief Iterator on faces or edges of volume + */ +/// =================================================================== + +class _MySubIterator : public SMDS_ElemIterator +{ + vector< const SMDS_MeshElement* > myElems; + int myIndex; +public: + _MySubIterator(const SMDS_MeshVolume* vol, SMDSAbs_ElementType type):myIndex(0) { + SMDS_VolumeTool vTool(vol); + if (type == SMDSAbs_Face) + vTool.GetAllExistingFaces( myElems ); + else + vTool.GetAllExistingEdges( myElems ); + } + /// Return true if and only if there are other object in this iterator + virtual bool more() { return myIndex < myElems.size(); } + + /// Return the current object and step to the next one + virtual const SMDS_MeshElement* next() { return myElems[ myIndex++ ]; } +}; + +//================================================================================ +/*! + * \brief Return Iterator of sub elements + */ +//================================================================================ + +SMDS_ElemIteratorPtr SMDS_PolyhedralVolumeOfNodes::elementsIterator(SMDSAbs_ElementType type) const +{ + switch(type) + { + case SMDSAbs_Volume: + return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume); + case SMDSAbs_Node: + return SMDS_ElemIteratorPtr(new _MyIterator(myNodesByFaces)); + case SMDSAbs_Face: + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Face)); + case SMDSAbs_Edge: + return SMDS_ElemIteratorPtr(new _MySubIterator(this,SMDSAbs_Edge)); + default: + MESSAGE("ERROR : Iterator not implemented"); + return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); + } +} + +//================================================================================ +/*! + * \brief Return iterator on unique nodes + */ +//================================================================================ + +SMDS_ElemIteratorPtr SMDS_PolyhedralVolumeOfNodes::uniqueNodesIterator() const +{ + return SMDS_ElemIteratorPtr + (new SMDS_NodeArrayElemIterator( myNodes, & myNodes[ myNbNodes ])); +} + +//================================================================================ +/*! + * \brief Return node by its index + */ +//================================================================================ + +const SMDS_MeshNode* SMDS_PolyhedralVolumeOfNodes::GetNode(const int ind) const +{ + return myNodesByFaces[ ind ]; +}