X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_Family.cxx;h=a31488e4aabfe6b0287371869bf63df76c9dd874;hp=ee1123ccd0719e9f7f380d0cca33b0a845d4455b;hb=4c16067d4281f56bd07d3f92fb63fff9c0c1d169;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8 diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index ee1123ccd..a31488e4a 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -1,32 +1,140 @@ -// SMESH DriverMED : tool to split groups on families +// 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 +// +// 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. // -// Copyright (C) 2003 CEA -// -// 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.org +// 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 DriverMED : tool to split groups on families // File : DriverMED_Family.cxx // Author : Julia DOROVSKIKH // Module : SMESH -// $Header$ - +// #include "DriverMED_Family.h" -#include +#include "MED_Factory.hxx" + +#include + +using namespace std; + +//============================================================================= +/*! + * Default constructor + */ +//============================================================================= +DriverMED_Family +::DriverMED_Family(): + myGroupAttributVal(0) +{} + + +//============================================================================= +const ElementsSet& +DriverMED_Family +::GetElements () const +{ + return myElements; +} + +int +DriverMED_Family +::GetId () const +{ + return myId; +} + +void +DriverMED_Family +::SetId (const int theId) +{ + myId = theId; +} + +void +DriverMED_Family +::AddElement(const SMDS_MeshElement* theElement) +{ + myElements.insert( myElements.end(), theElement ); +} + +void +DriverMED_Family +::AddGroupName(std::string theGroupName) +{ + myGroupNames.insert(theGroupName); +} + +void +DriverMED_Family +::SetType(const SMDSAbs_ElementType theType) +{ + myTypes.insert( myType = theType ); +} + +SMDSAbs_ElementType +DriverMED_Family +::GetType() +{ + return myType; +} + +const ElemTypeSet& +DriverMED_Family +::GetTypes() const +{ + return myTypes; +} + +bool +DriverMED_Family +::MemberOf(std::string theGroupName) const +{ + return myGroupNames.find(theGroupName) != myGroupNames.end(); +} + +const MED::TStringSet& +DriverMED_Family +::GetGroupNames () const +{ + return myGroupNames; +} + + +int +DriverMED_Family +::GetGroupAttributVal() const +{ + return myGroupAttributVal; +} + +void +DriverMED_Family +::SetGroupAttributVal( int theValue) +{ + myGroupAttributVal = theValue; +} + +bool +DriverMED_Family +::IsEmpty () const +{ + return myElements.empty(); +} //============================================================================= /*! @@ -35,42 +143,50 @@ * Resulting families have no common elements. */ //============================================================================= -list DriverMED_Family::MakeFamilies - (const map & theSubMeshes, - const list& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes) +DriverMED_FamilyPtrList +DriverMED_Family +::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 doAllInGroups) { - list aFamilies; + DriverMED_FamilyPtrList aFamilies; - string anAllNodesGroupName = "Group_Of_All_Nodes"; - string anAllEdgesGroupName = "Group_Of_All_Edges"; - string anAllFacesGroupName = "Group_Of_All_Faces"; + string anAllNodesGroupName = "Group_Of_All_Nodes"; + string anAllEdgesGroupName = "Group_Of_All_Edges"; + string anAllFacesGroupName = "Group_Of_All_Faces"; string anAllVolumesGroupName = "Group_Of_All_Volumes"; + string anAll0DElemsGroupName = "Group_Of_All_0DElems"; + string anAllBallsGroupName = "Group_Of_All_Balls"; - // Reserve four ids for families of free elements - // (1 - nodes, -1 - edges, -2 - faces, -3 - volumes). + // Reserve 6 ids for families of free elements + // (1 - nodes, -1 - edges, -2 - faces, -3 - volumes, -4 - 0D, -5 - balls). // 'Free' means here not belonging to any group. int aNodeFamId = FIRST_NODE_FAMILY; int aElemFamId = FIRST_ELEM_FAMILY; // Process sub-meshes - map::const_iterator aSMIter = theSubMeshes.begin(); - for (; aSMIter != theSubMeshes.end(); aSMIter++) + while ( theSubMeshes->more() ) { - list aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first); - list::iterator aSMFamsIter = aSMFams.begin(); + 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); + DriverMED_FamilyPtrList::iterator aSMFamsIter = aSMFams.begin(); for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++) { DriverMED_FamilyPtr aFam2 = (*aSMFamsIter); - - list::iterator aFamsIter = aFamilies.begin(); + DriverMED_FamilyPtrList::iterator aFamsIter = aFamilies.begin(); while (aFamsIter != aFamilies.end()) { DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; + DriverMED_FamilyPtrList::iterator aCurrIter = aFamsIter++; if (aFam1->myType == aFam2->myType) { DriverMED_FamilyPtr aCommon (new DriverMED_Family); @@ -83,7 +199,8 @@ list DriverMED_Family::MakeFamilies { aFamilies.erase(aCurrIter); } - if (aFam2->IsEmpty()) break; + if (aFam2->IsEmpty()) + break; } } // The rest elements of family @@ -95,30 +212,32 @@ list DriverMED_Family::MakeFamilies } // Process groups - list::const_iterator aGroupsIter = theGroups.begin(); + SMESHDS_GroupBasePtrList::const_iterator aGroupsIter = theGroups.begin(); for (; aGroupsIter != theGroups.end(); aGroupsIter++) { DriverMED_FamilyPtr aFam2 (new DriverMED_Family); aFam2->Init(*aGroupsIter); - list::iterator aFamsIter = aFamilies.begin(); + DriverMED_FamilyPtrList::iterator aFamsIter = aFamilies.begin(); while (aFamsIter != aFamilies.end()) { DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; + DriverMED_FamilyPtrList::iterator aCurrIter = aFamsIter++; if (aFam1->myType == aFam2->myType) { DriverMED_FamilyPtr aCommon (new DriverMED_Family); aFam1->Split(aFam2, aCommon); if (!aCommon->IsEmpty()) { + aCommon->SetGroupAttributVal(0); aFamilies.push_back(aCommon); } if (aFam1->IsEmpty()) { aFamilies.erase(aCurrIter); } - if (aFam2->IsEmpty()) break; + if (aFam2->IsEmpty()) + break; } } // The rest elements of group @@ -128,7 +247,7 @@ list DriverMED_Family::MakeFamilies } } - list::iterator aFamsIter = aFamilies.begin(); + DriverMED_FamilyPtrList::iterator aFamsIter = aFamilies.begin(); for (; aFamsIter != aFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFam = *aFamsIter; @@ -147,6 +266,12 @@ list DriverMED_Family::MakeFamilies else if (aFam->myType == SMDSAbs_Volume) { if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllVolumesGroupName); } + else if (aFam->myType == SMDSAbs_0DElement) { + if (doGroupOfVolumes) aFam->myGroupNames.insert(anAll0DElemsGroupName); + } + else if (aFam->myType == SMDSAbs_Ball) { + if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllBallsGroupName); + } } } @@ -187,11 +312,57 @@ list DriverMED_Family::MakeFamilies aFamilies.push_back(aFreeVolumesFam); } + if (doGroupOf0DElems) + { + DriverMED_FamilyPtr aFree0DFam (new DriverMED_Family); + aFree0DFam->SetId(REST_0DELEM_FAMILY); + aFree0DFam->myType = SMDSAbs_0DElement; + aFree0DFam->myGroupNames.insert(anAll0DElemsGroupName); + aFamilies.push_back(aFree0DFam); + } + + if (doGroupOfBalls) + { + DriverMED_FamilyPtr aFreeBallsFam (new DriverMED_Family); + aFreeBallsFam->SetId(REST_BALL_FAMILY); + aFreeBallsFam->myType = SMDSAbs_Ball; + aFreeBallsFam->myGroupNames.insert(anAllBallsGroupName); + aFamilies.push_back(aFreeBallsFam); + } + 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; } @@ -200,22 +371,45 @@ list DriverMED_Family::MakeFamilies * Create TFamilyInfo for this family */ //============================================================================= -MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo - (const MEDA::PMeshInfo& theMeshInfo) const +MED::PFamilyInfo +DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, + const MED::PMeshInfo& theMeshInfo) const { - string aValue; ostringstream aStr; - aStr << myId; - aValue = aStr.str(); - MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, - MED::TIntVector anAttrIds (1, myId); // Id=0, - MED::TIntVector anAttrVals (1, myId); // Value=0 - - MEDA::PFamilyInfo anInfo = MEDA::TWrapper::CrFamilyInfo(theMeshInfo, - aValue, - myId, - myGroupNames, - anAttrDescs,anAttrIds,anAttrVals); + aStr << "FAM_" << myId; + set::const_iterator aGrIter = myGroupNames.begin(); + for(; aGrIter != myGroupNames.end(); aGrIter++){ + aStr << "_" << *aGrIter; + } + 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 lastCharPos = min( maxSize, (int) aValue.size() ) - 1; + while ( isspace( aValue[ lastCharPos ] )) + aValue.resize( lastCharPos-- ); + + MED::PFamilyInfo anInfo; + if(myId == 0 || myGroupAttributVal == 0){ + anInfo = theWrapper->CrFamilyInfo(theMeshInfo, + aValue, + myId, + myGroupNames); + }else{ + MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, + MED::TIntVector anAttrIds (1, myId); // Id=0, + MED::TIntVector anAttrVals (1, myGroupAttributVal); + anInfo = theWrapper->CrFamilyInfo(theMeshInfo, + aValue, + myId, + myGroupNames, + anAttrDescs, + anAttrIds, + anAttrVals); + } // cout << endl; // cout << "Groups: "; @@ -239,25 +433,38 @@ MEDA::PFamilyInfo DriverMED_Family::GetFamilyInfo //============================================================================= /*! - * Initialize the tool by SMESHDS_Group + * Initialize the tool by SMESHDS_GroupBase */ //============================================================================= -void DriverMED_Family::Init (SMESHDS_Group* group) +void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) { // Elements myElements.clear(); - group->InitIterator(); - while (group->More()) + SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); + while (elemIt->more()) { - myElements.insert(group->Next()); + myElements.insert( myElements.end(), elemIt->next() ); } // Type - myType = group->GetType(); + myType = theGroup->GetType(); // Groups list myGroupNames.clear(); - myGroupNames.insert(string(group->GetStoreName())); + myGroupNames.insert(string(theGroup->GetStoreName())); + + Quantity_Color aColor = theGroup->GetColor(); + double aRed = aColor.Red(); + double aGreen = aColor.Green(); + double aBlue = aColor.Blue(); + int aR = int( aRed*255 ); + int aG = int( aGreen*255 ); + int aB = int( aBlue*255 ); +// cout << "aRed = " << aR << endl; +// cout << "aGreen = " << aG << endl; +// cout << "aBlue = " << aB << endl; + myGroupAttributVal = (int)(aR*1000000 + aG*1000 + aB); + //cout << "myGroupAttributVal = " << myGroupAttributVal << endl; } //============================================================================= @@ -266,14 +473,17 @@ void DriverMED_Family::Init (SMESHDS_Group* group) * on the basis of the elements type. */ //============================================================================= -list DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId) +DriverMED_FamilyPtrList +DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh, + const int theId) { - list aFamilies; + DriverMED_FamilyPtrList aFamilies; DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); DriverMED_FamilyPtr anEdgesFamily (new DriverMED_Family); DriverMED_FamilyPtr aFacesFamily (new DriverMED_Family); DriverMED_FamilyPtr aVolumesFamily (new DriverMED_Family); + // DriverMED_FamilyPtr a0DElemsFamily (new DriverMED_Family); + // DriverMED_FamilyPtr aBallsFamily (new DriverMED_Family); char submeshGrpName[ 30 ]; sprintf( submeshGrpName, "SubMesh %d", theId ); @@ -340,28 +550,45 @@ void DriverMED_Family::Split (DriverMED_FamilyPtr by, DriverMED_FamilyPtr common) { // Elements - set::iterator anIter = by->myElements.begin(); - for (; anIter != by->myElements.end(); anIter++) + ElementsSet::iterator anIter = by->myElements.begin(), elemInMe; + while ( anIter != by->myElements.end()) { - if (myElements.find(*anIter) != myElements.end()) + elemInMe = myElements.find(*anIter); + if (elemInMe != myElements.end()) { common->myElements.insert(*anIter); - myElements.erase(*anIter); - by->myElements.erase(*anIter); + myElements.erase(elemInMe); + by->myElements.erase(anIter++); } + else + anIter++; } if (!common->IsEmpty()) { // Groups list common->myGroupNames = myGroupNames; - set::iterator aGrNamesIter = by->myGroupNames.begin(); - for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++) - { - common->myGroupNames.insert(*aGrNamesIter); - } + common->myGroupNames.insert( by->myGroupNames.begin(), by->myGroupNames.end() ); // Type 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; +}