if(MYDEBUG) MESSAGE(aGroupName);
aFamily->AddGroupName(aGroupName);
}
+ aFamily->SetId( aFamId );
myFamilies[aFamId] = aFamily;
}
}
EBooleen anIsNodeNum = aNodeInfo->IsElemNum();
TInt aNbElems = aNodeInfo->GetNbElem();
if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<<aNbElems<<"; anIsNodeNum = "<<anIsNodeNum);
+ DriverMED_FamilyPtr aFamily = myFamilies.begin()->second;
for(TInt iElem = 0; iElem < aNbElems; iElem++){
double aCoords[3] = {0.0, 0.0, 0.0};
for(TInt iDim = 0; iDim < 3; iDim++)
// Save reference to this node from its family
TInt aFamNum = aNodeInfo->GetFamNum(iElem);
- if (myFamilies.find(aFamNum) != myFamilies.end())
+ if ( checkFamilyID ( aFamily, aFamNum ))
{
- myFamilies[aFamNum]->AddElement(aNode);
- myFamilies[aFamNum]->SetType(SMDSAbs_Node);
+ aFamily->AddElement(aNode);
+ aFamily->SetType(SMDSAbs_Node);
}
}
if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if (myFamilies.find(aFamNum) != myFamilies.end()) {
+ if ( checkFamilyID ( aFamily, aFamNum ))
+ {
// Save reference to this element from its family
- myFamilies[aFamNum]->AddElement(anElement);
- myFamilies[aFamNum]->SetType(anElement->GetType());
+ aFamily->AddElement(anElement);
+ aFamily->SetType(anElement->GetType());
}
}
} // for (TInt iPG = 0; iPG < nbPolygons; iPG++)
if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if (myFamilies.find(aFamNum) != myFamilies.end()) {
+ if ( checkFamilyID ( aFamily, aFamNum ))
+ {
// Save reference to this element from its family
- myFamilies[aFamNum]->AddElement(anElement);
- myFamilies[aFamNum]->SetType(anElement->GetType());
+ aFamily->AddElement(anElement);
+ aFamily->SetType(anElement->GetType());
}
}
} // for (int iPE = 0; iPE < nbPolyedres; iPE++)
if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if (myFamilies.find(aFamNum) != myFamilies.end()) {
+ if ( checkFamilyID ( aFamily, aFamNum ))
+ {
// Save reference to this element from its family
- myFamilies[aFamNum]->AddElement(anElement);
- myFamilies[aFamNum]->SetType(anElement->GetType());
+ aFamily->AddElement(anElement);
+ aFamily->SetType(anElement->GetType());
}
}
}
return aMeshNames;
}
-list<string> DriverMED_R_SMESHDS_Mesh::GetGroupNames()
+list<TNameAndType> DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes()
{
- list<string> aResult;
- set<string> aResGroupNames;
+ list<TNameAndType> aResult;
+ set<TNameAndType> aResGroupNames;
map<int, DriverMED_FamilyPtr>::iterator aFamsIter = myFamilies.begin();
for (; aFamsIter != myFamilies.end(); aFamsIter++)
set<string>::const_iterator aGrNamesIter = aGroupNames.begin();
for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++)
{
- string aName = *aGrNamesIter;
+ TNameAndType aNameAndType = make_pair( *aGrNamesIter, aFamily->GetType() );
// Check, if this is a Group or SubMesh name
//if (aName.substr(0, 5) == string("Group")) {
- if (aResGroupNames.find(aName) == aResGroupNames.end()) {
- aResGroupNames.insert(aName);
- aResult.push_back(aName);
+ if ( aResGroupNames.insert( aNameAndType ).second ) {
+ aResult.push_back( aNameAndType );
}
// }
}
for (; aFamsIter != myFamilies.end(); aFamsIter++)
{
DriverMED_FamilyPtr aFamily = (*aFamsIter).second;
- if (aFamily->MemberOf(aGroupName))
+ if (aFamily->GetType() == theGroup->GetType() && aFamily->MemberOf(aGroupName))
{
const set<const SMDS_MeshElement *>& anElements = aFamily->GetElements();
set<const SMDS_MeshElement *>::const_iterator anElemsIter = anElements.begin();
}
}
}
+/*!
+ * \brief Ensure aFamily to have required ID
+ * \param aFamily - a family to check and update
+ * \param anID - an ID aFamily should have
+ * \retval bool - true if successful
+ */
+bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const
+{
+ if ( !aFamily || aFamily->GetId() != anID ) {
+ map<int, DriverMED_FamilyPtr>::const_iterator i_fam = myFamilies.find(anID);
+ if ( i_fam == myFamilies.end() )
+ return false;
+ aFamily = i_fam->second;
+ }
+ return ( aFamily->GetId() == anID );
+}
+
class SMESHDS_Group;
class SMESHDS_SubMesh;
+typedef std::pair< std::string, SMDSAbs_ElementType > TNameAndType;
+
class DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
{
public:
virtual Status Perform();
- std::list<std::string> GetGroupNames();
+ std::list< TNameAndType > GetGroupNamesAndTypes();
void GetGroup(SMESHDS_Group* theGroup);
void CreateAllSubMeshes();
void GetSubMesh(SMESHDS_SubMesh* theSubMesh, const int theId);
std::list<std::string> GetMeshNames(Status& theStatus);
void SetMeshName(std::string theMeshName);
+ private:
+ /*!
+ * \brief Ensure aFamily has required ID
+ * \param aFamily - a family to check
+ * \param anID - an ID aFamily should have
+ * \retval bool - true if successful
+ */
+ bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const;
+
private:
std::string myMeshName;
std::map<int, DriverMED_FamilyPtr> myFamilies;