#include "DriverMED_W_SMESHDS_Mesh.h"
#include "DriverMED_R_SMESHDS_Mesh.h"
+#ifdef WITH_CGNS
+#include "DriverCGNS_Read.hxx"
+#endif
#include "SALOMEDS_Tool.hxx"
#include "SALOME_NamingService.hxx"
SALOME::Session_var session = SALOME::Session::_narrow( obj ) ;
if ( !session->_is_nil() )
{
- CORBA::String_var s_host = session->getHostname();
+ CORBA::String_var str_host = session->getHostname();
CORBA::Long s_pid = session->getPID();
string my_host = Kernel_Utils::GetHostname();
#ifdef WNT
#else
long my_pid = (long) getpid();
#endif
- SetEmbeddedMode( s_pid == my_pid && my_host == s_host.in() );
+ SetEmbeddedMode( s_pid == my_pid && my_host == str_host.in() );
}
}
}
}
}
- // let the temporary hypothesis find out some how parameter values by mesh
+ // let the temporary hypothesis find out somehow parameter values by mesh
if ( hyp->SetParametersByMesh( mesh, shape ))
return SMESH::SMESH_Hypothesis::_duplicate( tmpHyp );
}
::SMESH_Hypothesis::TDefaults dflts;
dflts._elemLength = diagonal / myGen.GetBoundaryBoxSegmentation();
dflts._nbSegments = myGen.GetDefaultNbSegments();
+ dflts._shape = &shape;
// let the temporary hypothesis initialize it's values
if ( hyp->SetParametersByDefaults( dflts, mesh ))
return SMESH::SMESH_Hypothesis::_duplicate( tmpHyp );
*/
//=============================================================================
-SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
- SMESH::DriverMED_ReadStatus& theStatus)
- throw ( SALOME::SALOME_Exception )
+SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMEDorSAUV( const char* theFileName,
+ SMESH::DriverMED_ReadStatus& theStatus,
+ const char* theCommandNameForPython,
+ const char* theFileNameForPython)
{
- Unexpect aCatch(SALOME_SalomeException);
- if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" );
-
// Retrieve mesh names from the file
DriverMED_R_SMESHDS_Mesh myReader;
myReader.SetFile( theFileName );
}
// Update Python script
- aPythonDump << "], status) = " << this << ".CreateMeshesFromMED(r'" << theFileName << "')";
+ aPythonDump << "], status) = " << this << "." << theCommandNameForPython << "(r'" << theFileNameForPython << "')";
}
// Dump creation of groups
for ( int i = 0; i < aResult->length(); ++i )
return aResult._retn();
}
+SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName,
+ SMESH::DriverMED_ReadStatus& theStatus)
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" );
+ SMESH::mesh_array* result = CreateMeshesFromMEDorSAUV(theFileName, theStatus, "CreateMeshesFromMED", theFileName);
+ return result;
+}
+
+//=============================================================================
+/*!
+ * SMESH_Gen_i::CreateMeshFromSAUV
+ *
+ * Create mesh and import data from SAUV file
+ */
+//=============================================================================
+
+SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromSAUV( const char* theFileName,
+ SMESH::DriverMED_ReadStatus& theStatus)
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if(MYDEBUG) MESSAGE( "SMESH_Gen_i::CreateMeshFromSAUV" );
+ std::string sauvfilename(theFileName);
+ std::string medfilename(theFileName);
+ medfilename += ".med";
+ std::string cmd;
+#ifdef WNT
+ cmd = "%PYTHONBIN% ";
+#else
+ cmd = "python ";
+#endif
+ cmd += "-c \"";
+ cmd += "from medutilities import convert ; convert(r'" + sauvfilename + "', 'GIBI', 'MED', 1, r'" + medfilename + "')";
+ cmd += "\"";
+ system(cmd.c_str());
+ SMESH::mesh_array* result = CreateMeshesFromMEDorSAUV(medfilename.c_str(), theStatus, "CreateMeshesFromSAUV", sauvfilename.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());
+ return result;
+}
+
//=============================================================================
/*!
* SMESH_Gen_i::CreateMeshFromSTL
return aMesh._retn();
}
+//================================================================================
+/*!
+ * \brief Create meshes and import data from the CGSN file
+ */
+//================================================================================
+
+SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromCGNS( const char* theFileName,
+ SMESH::DriverMED_ReadStatus& theStatus)
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+
+ SMESH::mesh_array_var aResult = new SMESH::mesh_array();
+
+#ifdef WITH_CGNS
+ // Retrieve nb meshes from the file
+ DriverCGNS_Read myReader;
+ myReader.SetFile( theFileName );
+ Driver_Mesh::Status aStatus;
+ int nbMeshes = myReader.GetNbMeshes(aStatus);
+ theStatus = (SMESH::DriverMED_ReadStatus)aStatus;
+
+ aResult->length( nbMeshes );
+
+ { // open a new scope to make aPythonDump die before PythonDump in SMESH_Mesh::GetGroups()
+
+ // Python Dump
+ TPythonDump aPythonDump;
+ aPythonDump << "([";
+
+ if (theStatus == SMESH::DRS_OK)
+ {
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+ aStudyBuilder->NewCommand(); // There is a transaction
+
+ int i = 0;
+
+ // Iterate through all meshes and create mesh objects
+ for ( ; i < nbMeshes; ++i )
+ {
+ // Python Dump
+ if (i > 0) aPythonDump << ", ";
+
+ // create mesh
+ SMESH::SMESH_Mesh_var mesh = createMesh();
+ aResult[i] = SMESH::SMESH_Mesh::_duplicate( mesh );
+
+ // Read mesh data (groups are published automatically by ImportMEDFile())
+ SMESH_Mesh_i* meshServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( mesh ).in() );
+ ASSERT( meshServant );
+ string meshName;
+ SMESH::DriverMED_ReadStatus status1 =
+ meshServant->ImportCGNSFile( theFileName, i, meshName );
+ if (status1 > theStatus)
+ theStatus = status1;
+
+ meshServant->GetImpl().GetMeshDS()->Modified();
+ // publish mesh in the study
+ SALOMEDS::SObject_var aSO;
+ if ( CanPublishInStudy( mesh ) )
+ aSO = PublishMesh( myCurrentStudy, mesh.in(), meshName.c_str() );
+
+ // Python Dump
+ if ( !aSO->_is_nil() )
+ aPythonDump << aSO;
+ else
+ aPythonDump << "mesh_" << i;
+ }
+ aStudyBuilder->CommitCommand();
+ }
+
+ aPythonDump << "], status) = " << this << ".CreateMeshesFromCGNS(r'" << theFileName << "')";
+ }
+ // Dump creation of groups
+ for ( int i = 0; i < aResult->length(); ++i )
+ SMESH::ListOfGroups_var groups = aResult[ i ]->GetGroups();
+#else
+ THROW_SALOME_CORBA_EXCEPTION("CGNS library is unavailable", SALOME::INTERNAL_ERROR);
+#endif
+
+ return aResult._retn();
+}
+
//=============================================================================
/*!
* SMESH_Gen_i::IsReadyToCompute
if ( elem->GetType() != SMDSAbs_Node )
{
int ID = toKeepIDs ? elem->GetID() : 0;
- const SMDS_MeshElement * newElem = editor.AddElement( nodes,
- elem->GetType(),
- elem->IsPoly(),
- ID);
+ const SMDS_MeshElement * newElem;
+ if ( elem->GetEntityType() == SMDSEntity_Polyhedra )
+ newElem = editor.GetMeshDS()->
+ AddPolyhedralVolumeWithID( nodes,
+ static_cast<const SMDS_VtkVolume*>(elem)->GetQuantities(),
+ elem->GetID());
+ else
+ newElem = editor.AddElement( nodes,elem->GetType(),elem->IsPoly(),ID);
+
if ( toCopyGroups && !toKeepIDs )
e2eMapByType[ elem->GetType() ].insert( make_pair( elem, newElem ));
}
if ( !CORBA::is_nil( anObject ) ) {
SMESH::SMESH_Mesh_var myMesh = SMESH::SMESH_Mesh::_narrow( anObject ) ;
if ( !myMesh->_is_nil() ) {
+ TPythonDump pd; // not to dump GetGroups()
SMESH::ListOfGroups_var groups = myMesh->GetGroups();
+ pd << ""; // to avoid optimizing pd out
for ( int i = 0; i < groups->length(); ++i )
{
SMESH_GroupBase_i* grImpl = SMESH::DownCast<SMESH_GroupBase_i*>( groups[i]);
myWriter.AddGroup( aGeomGrp );
}
}
+ else if ( SMESH_GroupOnFilter_i* aFilterGrp_i =
+ dynamic_cast<SMESH_GroupOnFilter_i*>( myGroupImpl ))
+ {
+ std::string str = aFilterGrp_i->FilterToString();
+ std::string hdfGrpName = "Filter " + SMESH_Comment(anId);
+ aSize[ 0 ] = str.length() + 1;
+ aDataset = new HDFdataset( hdfGrpName.c_str(), aGroup, HDF_STRING, aSize, 1);
+ aDataset->CreateOnDisk();
+ aDataset->WriteOnDisk( ( char* )( str.c_str() ) );
+ aDataset->CloseOnDisk();
+ }
}
}
aGroup->CloseOnDisk();
delete[] smIDs;
}
+ aGroup->CloseOnDisk();
+
// Store node positions on sub-shapes (SMDS_Position):
// ----------------------------------------------------
}
}
}
+ // Try to read a filter of SMESH_GroupOnFilter
+ SMESH::Filter_var filter;
+ SMESH_PredicatePtr predicate;
+ std::string hdfGrpName = "Filter " + SMESH_Comment(subid);
+ if ( aGroup->ExistInternalObject( hdfGrpName.c_str() ))
+ {
+ aDataset = new HDFdataset( hdfGrpName.c_str(), aGroup );
+ aDataset->OpenOnDisk();
+ size = aDataset->GetSize();
+ char* persistStr = new char[ size ];
+ aDataset->ReadFromDisk( persistStr );
+ aDataset->CloseOnDisk();
+ if ( strlen( persistStr ) > 0 ) {
+ filter = SMESH_GroupOnFilter_i::StringToFilter( persistStr );
+ predicate = SMESH_GroupOnFilter_i::GetPredicate( filter );
+ }
+ }
+
// Create group servant
SMESH::ElementType type = (SMESH::ElementType)(ii - GetNodeGroupsTag() + 1);
SMESH::SMESH_GroupBase_var aNewGroup = SMESH::SMESH_GroupBase::_duplicate
- ( myNewMeshImpl->createGroup( type, nameFromFile, aShape ) );
+ ( myNewMeshImpl->createGroup( type, nameFromFile, aShape, predicate ) );
// Obtain a SMESHDS_Group object
if ( aNewGroup->_is_nil() )
continue;
int newSubId = myStudyContext->findId( iorSubString );
myStudyContext->mapOldToNew( subid, newSubId );
- SMESH_GroupBase_i* aGroupImpl =
- dynamic_cast<SMESH_GroupBase_i*>( GetServant( aNewGroup ).in() );
+ SMESH_GroupBase_i* aGroupImpl = SMESH::DownCast< SMESH_GroupBase_i*>( aNewGroup );
if ( !aGroupImpl )
continue;
- SMESH_Group* aLocalGroup = myLocMesh.GetGroup( aGroupImpl->GetLocalID() );
- if ( !aLocalGroup )
+ if ( SMESH_GroupOnFilter_i* aFilterGroup =
+ dynamic_cast< SMESH_GroupOnFilter_i*>( aGroupImpl ))
+ aFilterGroup->SetFilter( filter );
+
+ SMESHDS_GroupBase* aGroupBaseDS = aGroupImpl->GetGroupDS();
+ if ( !aGroupBaseDS )
continue;
- SMESHDS_GroupBase* aGroupBaseDS = aLocalGroup->GetGroupDS();
aGroupBaseDS->SetStoreName( name_dataset );
// ouv : NPAL12872
}
} // loop on meshes
+ // update hyps needing full mesh data restored (issue 20918)
+ for ( hyp_data = hypDataList.begin(); hyp_data != hypDataList.end(); ++hyp_data )
+ {
+ SMESH_Hypothesis_i* hyp = hyp_data->first;
+ hyp->UpdateAsMeshesRestored();
+ }
+
// notify algos on completed restoration
for ( meshi_group = meshGroupList.begin(); meshi_group != meshGroupList.end(); ++meshi_group )
{
ComputeStateEngine (SMESH_subMesh::SUBMESH_RESTORED);
}
- for ( hyp_data = hypDataList.begin(); hyp_data != hypDataList.end(); ++hyp_data )
- {
- SMESH_Hypothesis_i* hyp = hyp_data->first;
- hyp->UpdateAsMeshesRestored(); // for hyps needing full mesh data restored (issue 20918)
- }
-
// close mesh group
if(aTopGroup)
aTopGroup->CloseOnDisk();