#include "DriverMED_R_SMESHDS_Mesh.h"
#include "DriverUNV_R_SMDS_Mesh.h"
#include "DriverSTL_R_SMDS_Mesh.h"
+#ifdef WITH_CGNS
+#include "DriverCGNS_Read.hxx"
+#include "DriverCGNS_Write.hxx"
+#endif
#undef _Precision_HeaderFile
#include <BRepBndLib.hxx>
return 1;
}
+//================================================================================
+/*!
+ * \brief Reads the given mesh from the CGNS file
+ * \param theFileName - name of the file
+ * \retval int - Driver_Mesh::Status
+ */
+//================================================================================
+
+int SMESH_Mesh::CGNSToMesh(const char* theFileName,
+ const int theMeshIndex,
+ std::string& theMeshName)
+{
+ int res = Driver_Mesh::DRS_FAIL;
+#ifdef WITH_CGNS
+
+ DriverCGNS_Read myReader;
+ myReader.SetMesh(_myMeshDS);
+ myReader.SetFile(theFileName);
+ myReader.SetMeshId(theMeshIndex);
+ res = myReader.Perform();
+ theMeshName = myReader.GetMeshName();
+
+ // create groups
+ SynchronizeGroups();
+
+#endif
+ return res;
+}
+
//=============================================================================
/*!
*
{
Unexpect aCatch(SalomeException);
+ if ( !GetMeshDS()->IsUsedHypothesis( hyp ))
+ return;
+
const SMESH_Algo *foundAlgo = 0;
SMESH_HypoFilter algoKind, compatibleHypoKind;
list <const SMESHDS_Hypothesis * > usedHyps;
if ( ! _isModified )
return false;
- // return true if there the next Compute() will be partial and
+ // return true if the next Compute() will be partial and
// existing but changed elements may prevent successful re-compute
bool hasComputed = false, hasNotComputed = false;
map <int, SMESH_subMesh*>::const_iterator i_sm = _mapSubMesh.begin();
return true;
}
- if ( !hasComputed )
+ if ( NbNodes() < 1 )
const_cast<SMESH_Mesh*>(this)->_isModified = false;
return false;
}
-//=============================================================================
-/*! Export* methods.
- * To store mesh contents on disk in different formats.
+//================================================================================
+/*!
+ * \brief Check if any groups of the same type have equal names
*/
-//=============================================================================
+//================================================================================
bool SMESH_Mesh::HasDuplicatedGroupNamesMED()
{
return false;
}
-void SMESH_Mesh::ExportMED(const char *file,
- const char* theMeshName,
- bool theAutoGroups,
- int theVersion)
+//================================================================================
+/*!
+ * \brief Export the mesh to a med file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportMED(const char * file,
+ const char* theMeshName,
+ bool theAutoGroups,
+ int theVersion,
+ const SMESHDS_Mesh* meshPart)
throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
DriverMED_W_SMESHDS_Mesh myWriter;
myWriter.SetFile ( file, MED::EVersion(theVersion) );
- myWriter.SetMesh ( _myMeshDS );
+ myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
if ( !theMeshName )
myWriter.SetMeshId ( _idDoc );
else {
// Pass groups to writer. Provide unique group names.
//set<string> aGroupNames; // Corrected for Mantis issue 0020028
- map< SMDSAbs_ElementType, set<string> > aGroupNames;
- char aString [256];
- int maxNbIter = 10000; // to guarantee cycle finish
- for ( map<int, SMESH_Group*>::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) {
- SMESH_Group* aGroup = it->second;
- SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS();
- if ( aGroupDS ) {
- SMDSAbs_ElementType aType = aGroupDS->GetType();
- string aGroupName0 = aGroup->GetName();
- aGroupName0.resize(MAX_MED_GROUP_NAME_LENGTH);
- string aGroupName = aGroupName0;
- for (int i = 1; !aGroupNames[aType].insert(aGroupName).second && i < maxNbIter; i++) {
- sprintf(&aString[0], "GR_%d_%s", i, aGroupName0.c_str());
- aGroupName = aString;
- aGroupName.resize(MAX_MED_GROUP_NAME_LENGTH);
+ if ( !meshPart )
+ {
+ map< SMDSAbs_ElementType, set<string> > aGroupNames;
+ char aString [256];
+ int maxNbIter = 10000; // to guarantee cycle finish
+ for ( map<int, SMESH_Group*>::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) {
+ SMESH_Group* aGroup = it->second;
+ SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS();
+ if ( aGroupDS ) {
+ SMDSAbs_ElementType aType = aGroupDS->GetType();
+ string aGroupName0 = aGroup->GetName();
+ aGroupName0.resize(MAX_MED_GROUP_NAME_LENGTH);
+ string aGroupName = aGroupName0;
+ for (int i = 1; !aGroupNames[aType].insert(aGroupName).second && i < maxNbIter; i++) {
+ sprintf(&aString[0], "GR_%d_%s", i, aGroupName0.c_str());
+ aGroupName = aString;
+ aGroupName.resize(MAX_MED_GROUP_NAME_LENGTH);
+ }
+ aGroupDS->SetStoreName( aGroupName.c_str() );
+ myWriter.AddGroup( aGroupDS );
}
- aGroupDS->SetStoreName( aGroupName.c_str() );
- myWriter.AddGroup( aGroupDS );
}
}
-
// Perform export
myWriter.Perform();
}
-void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception)
+void SMESH_Mesh::ExportSAUV(const char *file,
+ const char* theMeshName,
+ bool theAutoGroups)
+ throw(SALOME_Exception)
+{
+ std::string medfilename(file);
+ medfilename += ".med";
+ std::string cmd;
+#ifdef WNT
+ cmd = "%PYTHONBIN% ";
+#else
+ cmd = "python ";
+#endif
+ cmd += "-c \"";
+ cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')";
+ cmd += "\"";
+ system(cmd.c_str());
+ ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1);
+#ifdef WNT
+ cmd = "%PYTHONBIN% ";
+#else
+ cmd = "python ";
+#endif
+ cmd += "-c \"";
+ cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')";
+ cmd += "\"";
+ system(cmd.c_str());
+#ifdef WNT
+ cmd = "%PYTHONBIN% ";
+#else
+ cmd = "python ";
+#endif
+ cmd += "-c \"";
+ cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')";
+ cmd += "\"";
+ system(cmd.c_str());
+}
+
+//================================================================================
+/*!
+ * \brief Export the mesh to a DAT file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportDAT(const char * file,
+ const SMESHDS_Mesh* meshPart) throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
DriverDAT_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
- myWriter.SetMesh(_myMeshDS);
+ myWriter.SetFile( file );
+ myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
myWriter.SetMeshId(_idDoc);
myWriter.Perform();
}
-void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception)
+//================================================================================
+/*!
+ * \brief Export the mesh to an UNV file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportUNV(const char * file,
+ const SMESHDS_Mesh* meshPart) throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
DriverUNV_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
- myWriter.SetMesh(_myMeshDS);
+ myWriter.SetFile( file );
+ myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
myWriter.SetMeshId(_idDoc);
// myWriter.SetGroups(_mapGroup);
- for ( map<int, SMESH_Group*>::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) {
- SMESH_Group* aGroup = it->second;
- SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS();
- if ( aGroupDS ) {
- string aGroupName = aGroup->GetName();
- aGroupDS->SetStoreName( aGroupName.c_str() );
- myWriter.AddGroup( aGroupDS );
+ if ( !meshPart )
+ {
+ for ( map<int, SMESH_Group*>::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) {
+ SMESH_Group* aGroup = it->second;
+ SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS();
+ if ( aGroupDS ) {
+ string aGroupName = aGroup->GetName();
+ aGroupDS->SetStoreName( aGroupName.c_str() );
+ myWriter.AddGroup( aGroupDS );
+ }
}
}
myWriter.Perform();
}
-void SMESH_Mesh::ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception)
+//================================================================================
+/*!
+ * \brief Export the mesh to an STL file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportSTL(const char * file,
+ const bool isascii,
+ const SMESHDS_Mesh* meshPart) throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
DriverSTL_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
+ myWriter.SetFile( file );
myWriter.SetIsAscii( isascii );
- myWriter.SetMesh(_myMeshDS);
+ myWriter.SetMesh( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS);
myWriter.SetMeshId(_idDoc);
myWriter.Perform();
}
+//================================================================================
+/*!
+ * \brief Export the mesh to the CGNS file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportCGNS(const char * file,
+ const SMESHDS_Mesh* meshDS)
+{
+ int res = Driver_Mesh::DRS_FAIL;
+#ifdef WITH_CGNS
+ DriverCGNS_Write myWriter;
+ myWriter.SetFile( file );
+ myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
+ myWriter.SetMeshName( SMESH_Comment("Mesh_") << meshDS->GetPersistentId());
+ res = myWriter.Perform();
+#endif
+ if ( res != Driver_Mesh::DRS_OK )
+ throw SALOME_Exception("Export failed");
+}
+
//================================================================================
/*!
* \brief Return number of nodes in the mesh
SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType,
const char* theName,
int& theId,
- const TopoDS_Shape& theShape)
+ const TopoDS_Shape& theShape,
+ const SMESH_PredicatePtr& thePredicate)
{
- if (_mapGroup.find(_groupId) != _mapGroup.end())
+ if (_mapGroup.count(_groupId))
return NULL;
theId = _groupId;
- SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape);
+ SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape, thePredicate);
GetMeshDS()->AddGroup( aGroup->GetGroupDS() );
_mapGroup[_groupId++] = aGroup;
return aGroup;
}
+//================================================================================
+/*!
+ * \brief Creates SMESH_Groups for not wrapped SMESHDS_Groups
+ * \retval bool - true if new SMESH_Groups have been created
+ *
+ */
+//================================================================================
+
+bool SMESH_Mesh::SynchronizeGroups()
+{
+ int nbGroups = _mapGroup.size();
+ const set<SMESHDS_GroupBase*>& groups = _myMeshDS->GetGroups();
+ set<SMESHDS_GroupBase*>::const_iterator gIt = groups.begin();
+ for ( ; gIt != groups.end(); ++gIt )
+ {
+ SMESHDS_GroupBase* groupDS = (SMESHDS_GroupBase*) *gIt;
+ _groupId = groupDS->GetID();
+ if ( !_mapGroup.count( _groupId ))
+ _mapGroup[_groupId] = new SMESH_Group( groupDS );
+ }
+ if ( !_mapGroup.empty() )
+ _groupId = _mapGroup.rbegin()->first + 1;
+
+ return nbGroups < _mapGroup.size();
+}
+
//================================================================================
/*!
* \brief Return iterator on all existing groups
while ( anItr->more() )
aNewGrpDS->Add( (anItr->next())->GetID() );
+ // set color
+ aNewGrpDS->SetColor( anOldGrpDS->GetColor() );
+
// remove old group
delete anOldGrp;
list<SMESH_subMesh*>::iterator onlyBIt = onlyOrderedList.begin();
list<SMESH_subMesh*>::iterator onlyEIt = onlyOrderedList.end();
- // iterates on ordered submeshes and insert them in detected positions
+ // iterate on ordered submeshes and insert them in detected positions
map< int, TPosInList >::iterator i_pos = sortedPos.begin();
for ( ; onlyBIt != onlyEIt; ++onlyBIt, ++i_pos )
*(i_pos->second) = *onlyBIt;