X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_Family.cxx;h=25646c67c45a768ae471f0ae52ead8a38a70ef78;hp=ee1123ccd0719e9f7f380d0cca33b0a845d4455b;hb=64c772da5a9dd285f16f1f7efa07bb4c7fbdd4c3;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8 diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index ee1123ccd..25646c67c 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -16,7 +16,7 @@ // 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -26,8 +26,119 @@ // $Header$ #include "DriverMED_Family.h" +#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(theElement); +} + +void +DriverMED_Family +::AddGroupName(std::string theGroupName) +{ + myGroupNames.insert(theGroupName); +} + +void +DriverMED_Family +::SetType(const SMDSAbs_ElementType theType) +{ + myType = theType; +} + +SMDSAbs_ElementType +DriverMED_Family +::GetType() +{ + return myType; +} + +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(); +} + +bool CompareColors( const SALOMEDS::Color& theColor, const SALOMEDS::Color& theRefColor ) +{ + if( fabs( theColor.R - theRefColor.R ) < 0.01 && + fabs( theColor.G - theRefColor.G ) < 0.01 && + fabs( theColor.B - theRefColor.B ) < 0.01 ) + return true; + + return false; +} + //============================================================================= /*! * Split each group from list on some parts (families) @@ -35,15 +146,16 @@ * 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(const SMESHDS_SubMeshPtrMap& theSubMeshes, + const SMESHDS_GroupBasePtrList& theGroups, + const bool doGroupOfNodes, + const bool doGroupOfEdges, + const bool doGroupOfFaces, + const bool doGroupOfVolumes) { - list aFamilies; + DriverMED_FamilyPtrList aFamilies; string anAllNodesGroupName = "Group_Of_All_Nodes"; string anAllEdgesGroupName = "Group_Of_All_Edges"; @@ -57,20 +169,23 @@ list DriverMED_Family::MakeFamilies int aElemFamId = FIRST_ELEM_FAMILY; // Process sub-meshes - map::const_iterator aSMIter = theSubMeshes.begin(); + SMESHDS_SubMeshPtrMap::const_iterator aSMIter = theSubMeshes.begin(); for (; aSMIter != theSubMeshes.end(); aSMIter++) { - list aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first); - list::iterator aSMFamsIter = aSMFams.begin(); + const int anId = aSMIter->first; + SMESHDS_SubMesh* aSubMesh = aSMIter->second; + 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 +198,8 @@ list DriverMED_Family::MakeFamilies { aFamilies.erase(aCurrIter); } - if (aFam2->IsEmpty()) break; + if (aFam2->IsEmpty()) + break; } } // The rest elements of family @@ -95,30 +211,58 @@ list DriverMED_Family::MakeFamilies } // Process groups - list::const_iterator aGroupsIter = theGroups.begin(); - for (; aGroupsIter != theGroups.end(); aGroupsIter++) + SMESHDS_GroupBasePtrList::const_iterator aGroupsIter; + + int id = 0; + ColorMap aColorMap; + for (aGroupsIter = theGroups.begin(); aGroupsIter != theGroups.end(); aGroupsIter++) + { + Quantity_Color aQColor = (*aGroupsIter)->GetColor(); + SALOMEDS::Color aColor; + aColor.R = aQColor.Red(); + aColor.G = aQColor.Green(); + aColor.B = aQColor.Blue(); + + bool isFound = false; + for (ColorMap::iterator aColorIter = aColorMap.begin(); aColorIter != aColorMap.end(); aColorIter++) + { + SALOMEDS::Color aRefColor = aColorIter->second; + if( CompareColors( aColor, aRefColor ) ) + { + isFound = true; + break; + } + } + + if( !isFound ) + aColorMap[ id++ ] = aColor; + } + + for (aGroupsIter = theGroups.begin(); aGroupsIter != theGroups.end(); aGroupsIter++) { DriverMED_FamilyPtr aFam2 (new DriverMED_Family); - aFam2->Init(*aGroupsIter); + aFam2->Init(*aGroupsIter, aColorMap); - 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 +272,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; @@ -200,22 +344,36 @@ 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; + } + + MED::PFamilyInfo anInfo; + string aValue = aStr.str(); + 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 +397,44 @@ 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, const ColorMap& theColorMap) { // Elements myElements.clear(); - group->InitIterator(); - while (group->More()) + SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); + while (elemIt->more()) { - myElements.insert(group->Next()); + myElements.insert(elemIt->next()); } // Type - myType = group->GetType(); + myType = theGroup->GetType(); // Groups list myGroupNames.clear(); - myGroupNames.insert(string(group->GetStoreName())); + myGroupNames.insert(string(theGroup->GetStoreName())); + + myGroupAttributVal = 0; + + ColorMap::const_iterator aColorIter = theColorMap.begin(); + for (; aColorIter != theColorMap.end(); aColorIter++) + { + Quantity_Color aGroupQColor = theGroup->GetColor(); + SALOMEDS::Color aGroupColor; + aGroupColor.R = aGroupQColor.Red(); + aGroupColor.G = aGroupQColor.Green(); + aGroupColor.B = aGroupQColor.Blue(); + + SALOMEDS::Color aColor = aColorIter->second; + if( CompareColors( aGroupColor, aColor ) ) + { + myGroupAttributVal = aColorIter->first; + break; + } + } } //============================================================================= @@ -266,10 +443,12 @@ 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); @@ -340,22 +519,24 @@ 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(); + while ( anIter != by->myElements.end()) { if (myElements.find(*anIter) != myElements.end()) { common->myElements.insert(*anIter); myElements.erase(*anIter); - by->myElements.erase(*anIter); + by->myElements.erase(anIter++); } + else + anIter++; } if (!common->IsEmpty()) { // Groups list common->myGroupNames = myGroupNames; - set::iterator aGrNamesIter = by->myGroupNames.begin(); + MED::TStringSet::iterator aGrNamesIter = by->myGroupNames.begin(); for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++) { common->myGroupNames.insert(*aGrNamesIter);