X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_Family.cxx;h=1acc37831e2b1c69f63bbb2dbe0f811795e0003b;hp=55a857f61b0dfef14fb9ad5665735e40a26eab7f;hb=8d297d6698f361d4f2dde723050bcfbaea050920;hpb=7a8032bb6e4ffdf1054e828832bc25e5fc5c32ba diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index 55a857f61..1acc37831 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -6,7 +6,7 @@ // 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 @@ -69,7 +69,7 @@ void DriverMED_Family ::AddElement(const SMDS_MeshElement* theElement) { - myElements.insert(theElement); + myElements.insert( myElements.end(), theElement ); } void @@ -93,7 +93,7 @@ DriverMED_Family return myType; } -const std::set< SMDSAbs_ElementType >& +const ElemTypeSet& DriverMED_Family ::GetTypes() const { @@ -145,14 +145,15 @@ DriverMED_Family //============================================================================= DriverMED_FamilyPtrList DriverMED_Family -::MakeFamilies(const SMESHDS_SubMeshPtrMap& theSubMeshes, +::MakeFamilies(SMESHDS_SubMeshIteratorPtr theSubMeshes, const SMESHDS_GroupBasePtrList& theGroups, const bool doGroupOfNodes, const bool doGroupOfEdges, const bool doGroupOfFaces, const bool doGroupOfVolumes, const bool doGroupOf0DElems, - const bool doGroupOfBalls) + const bool doGroupOfBalls, + const bool doAllInGroups) { DriverMED_FamilyPtrList aFamilies; @@ -170,11 +171,10 @@ DriverMED_Family int aElemFamId = FIRST_ELEM_FAMILY; // Process sub-meshes - SMESHDS_SubMeshPtrMap::const_iterator aSMIter = theSubMeshes.begin(); - for (; aSMIter != theSubMeshes.end(); aSMIter++) + while ( theSubMeshes->more() ) { - const int anId = aSMIter->first; - SMESHDS_SubMesh* aSubMesh = aSMIter->second; + SMESHDS_SubMesh* aSubMesh = const_cast< SMESHDS_SubMesh* >( theSubMeshes->next() ); + const int anId = aSubMesh->GetID(); if ( aSubMesh->IsComplexSubmesh() ) continue; // submesh containing other submeshs DriverMED_FamilyPtrList aSMFams = SplitByType(aSubMesh,anId); @@ -331,10 +331,38 @@ DriverMED_Family } DriverMED_FamilyPtr aNullFam (new DriverMED_Family); - aNullFam->SetId(0); + aNullFam->SetId( 0 ); aNullFam->myType = SMDSAbs_All; aFamilies.push_back(aNullFam); + if ( doAllInGroups ) + { + if ( !doGroupOfEdges ) + { + DriverMED_FamilyPtr aNigEdgeFam (new DriverMED_Family); + aNigEdgeFam->SetId( NIG_EDGES_FAMILY ); + aNigEdgeFam->myType = SMDSAbs_Edge; + aNigEdgeFam->myGroupNames.insert( NIG_GROUP_PREFIX "_EDGES" ); + aFamilies.push_back(aNigEdgeFam); + } + if ( !doGroupOfFaces ) + { + DriverMED_FamilyPtr aNigFaceFam (new DriverMED_Family); + aNigFaceFam->SetId( NIG_FACES_FAMILY ); + aNigFaceFam->myType = SMDSAbs_Face; + aNigFaceFam->myGroupNames.insert( NIG_GROUP_PREFIX "_FACES" ); + aFamilies.push_back(aNigFaceFam); + } + if ( !doGroupOfVolumes ) + { + DriverMED_FamilyPtr aNigVolFam (new DriverMED_Family); + aNigVolFam->SetId( NIG_VOLS_FAMILY ); + aNigVolFam->myType = SMDSAbs_Volume; + aNigVolFam->myGroupNames.insert( NIG_GROUP_PREFIX "_VOLS" ); + aFamilies.push_back(aNigVolFam); + } + } + return aFamilies; } @@ -343,7 +371,7 @@ DriverMED_Family * Create TFamilyInfo for this family */ //============================================================================= -MED::PFamilyInfo +MED::PFamilyInfo DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, const MED::PMeshInfo& theMeshInfo) const { @@ -355,11 +383,7 @@ DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, } string aValue = aStr.str(); // PAL19785,0019867 - med forbids whitespace to be the last char in the name - int maxSize; - //if ( theWrapper->GetVersion() == MED::eV2_1 ) - // maxSize = MED::GetNOMLength(); - //else - maxSize = MED::GetNOMLength(); + int maxSize = MED::GetNOMLength(); int lastCharPos = min( maxSize, (int) aValue.size() ) - 1; while ( isspace( aValue[ lastCharPos ] )) aValue.resize( lastCharPos-- ); @@ -415,7 +439,7 @@ void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); while (elemIt->more()) { - myElements.insert(elemIt->next()); + myElements.insert( myElements.end(), elemIt->next() ); } // Type @@ -446,9 +470,8 @@ void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) */ //============================================================================= DriverMED_FamilyPtrList -DriverMED_Family -::SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId) +DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh, + const int theId) { DriverMED_FamilyPtrList aFamilies; DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); @@ -547,3 +570,21 @@ void DriverMED_Family::Split (DriverMED_FamilyPtr by, common->myType = myType; } } + +//================================================================================ +/*! + * \brief Return a number of elements of a given type + */ +//================================================================================ + +size_t DriverMED_Family::NbElements( SMDSAbs_ElementType theType ) const +{ + if ( myTypes.size() < 2 ) + return myElements.size(); + + int nb = 0; + for ( ElementsSet::iterator e = myElements.begin(); e != myElements.end(); ++e ) + nb += ( theType == (*e)->GetType() ); + + return nb; +}