-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014 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.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
#include <BRepBndLib.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <Bnd_Box.hxx>
+#include <TColStd_MapOfInteger.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopoDS_Iterator.hxx>
-#include "Utils_ExceptHandlers.hxx"
+#include "SMESH_TryCatch.hxx" // include after OCCT headers!
+#include "Utils_ExceptHandlers.hxx"
+#ifndef WIN32
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
+#else
+#include <pthread.h>
+#endif
using namespace std;
namespace
{
+#ifndef WIN32
void deleteMeshDS(SMESHDS_Mesh* meshDS)
{
//cout << "deleteMeshDS( " << meshDS << endl;
delete meshDS;
}
+#else
+ static void* deleteMeshDS(void* meshDS)
+ {
+ //cout << "deleteMeshDS( " << meshDS << endl;
+ SMESHDS_Mesh* m = (SMESHDS_Mesh*)meshDS;
+ if(m) {
+ delete m;
+ }
+ return 0;
+ }
+#endif
}
//=============================================================================
/*!
- *
+ *
*/
//=============================================================================
_myDocument->RemoveMesh( _id );
_myDocument = 0;
- if ( _myMeshDS )
+ if ( _myMeshDS ) {
// delete _myMeshDS, in a thread in order not to block closing a study with large meshes
+#ifndef WIN32
boost::thread aThread(boost::bind( & deleteMeshDS, _myMeshDS ));
+#else
+ pthread_t thread;
+ int result=pthread_create(&thread, NULL, deleteMeshDS, (void*)_myMeshDS);
+#endif
+ }
}
//================================================================================
{
if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
{
- SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,
- /*complexShapeFirst=*/true);
- while ( smIt->more() )
- {
- sm = smIt->next();
- sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
- }
+ sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
+ sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN );
+ sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
+ sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
}
}
_isModified = false;
{
StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
- return false;
+ return NULL;
SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
return anHyp;
//================================================================================
/*!
* \brief Export the mesh to a med file
+ * \param [in] file - name of the MED file
+ * \param [in] theMeshName - name of this mesh
+ * \param [in] theAutoGroups - boolean parameter for creating/not creating
+ * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ;
+ * the typical use is auto_groups=false.
+ * \param [in] theVersion - defines the version of format of MED file, that will be created
+ * \param [in] meshPart - mesh data to export
+ * \param [in] theAutoDimension - if \c true, a space dimension of a MED mesh can be either
+ * - 1D if all mesh nodes lie on OX coordinate axis, or
+ * - 2D if all mesh nodes lie on XOY coordinate plane, or
+ * - 3D in the rest cases.
+ * If \a theAutoDimension is \c false, the space dimension is always 3.
+ * \return int - mesh index in the file
*/
//================================================================================
bool theAutoGroups,
int theVersion,
const SMESHDS_Mesh* meshPart,
- bool theAutoDimension)
+ bool theAutoDimension,
+ bool theAddODOnVertices)
throw(SALOME_Exception)
{
- Unexpect aCatch(SalomeException);
+ SMESH_TRY;
DriverMED_W_SMESHDS_Mesh myWriter;
myWriter.SetFile ( file, MED::EVersion(theVersion) );
myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
myWriter.SetAutoDimension( theAutoDimension );
+ myWriter.AddODOnVertices ( theAddODOnVertices );
if ( !theMeshName )
myWriter.SetMeshId ( _id );
else {
}
// Perform export
myWriter.Perform();
+
+ SMESH_CATCH( SMESH::throwSalomeEx );
}
//================================================================================
std::string medfilename(file);
medfilename += ".med";
std::string cmd;
-#ifdef WNT
+#ifdef WIN32
cmd = "%PYTHONBIN% ";
#else
cmd = "python ";
cmd += "\"";
system(cmd.c_str());
ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1);
-#ifdef WNT
+#ifdef WIN32
cmd = "%PYTHONBIN% ";
#else
cmd = "python ";
cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')";
cmd += "\"";
system(cmd.c_str());
-#ifdef WNT
+#ifdef WIN32
cmd = "%PYTHONBIN% ";
#else
cmd = "python ";
double totalCost = 1e-100, computedCost = 0;
const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh();
- // get cost of already treated sub-meshes
- if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 ))
- {
- SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true);
- while ( smIt->more() )
- {
- SMESH_subMesh* sm = smIt->next();
- if ( sm->GetComputeState() != SMESH_subMesh::NOT_READY )
- {
- const int smCost = sm->GetComputeCost();
- totalCost += smCost;
- if ( sm != curSM &&
- ( !sm->IsEmpty() ||
- sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE ))
- {
- computedCost += smCost;
- }
- }
- }
- }
- // get progress of a current algo
+ // get progress of a current algo
+ TColStd_MapOfInteger currentSubIds;
if ( curSM )
if ( SMESH_Algo* algo = curSM->GetAlgo() )
{
- double rate = algo->GetProgress();
- if ( 0. < rate && rate < 1.001 )
+ int algoNotDoneCost = 0, algoDoneCost = 0;
+ const std::vector<SMESH_subMesh*>& smToCompute = algo->SubMeshesToCompute();
+ for ( size_t i = 0; i < smToCompute.size(); ++i )
{
- //cout << " rate: " << rate << " cost " << algo->GetComputeCost() << endl;
- computedCost += rate * algo->GetComputeCost();
+ if ( smToCompute[i]->IsEmpty() )
+ algoNotDoneCost += smToCompute[i]->GetComputeCost();
+ else
+ algoDoneCost += smToCompute[i]->GetComputeCost();
+ currentSubIds.Add( smToCompute[i]->GetId() );
+ }
+ double rate = 0;
+ try
+ {
+ OCC_CATCH_SIGNALS;
+ rate = algo->GetProgress();
+ }
+ catch (...) {
+#ifdef _DEBUG_
+ cerr << "Exception in " << algo->GetName() << "::GetProgress()" << endl;
+#endif
}
- else if ( curSM->IsEmpty() )
+ if ( 0. < rate && rate < 1.001 )
{
- computedCost += algo->GetProgressByTic() * algo->GetComputeCost();
+ computedCost += rate * ( algoDoneCost + algoNotDoneCost );
}
else
{
- computedCost += 0.99 * algo->GetComputeCost();
+ rate = algo->GetProgressByTic();
+ computedCost += algoDoneCost + rate * algoNotDoneCost;
+ }
+ // cout << "rate: "<<rate << " algoNotDoneCost: " << algoNotDoneCost << endl;
+ }
+
+ // get cost of already treated sub-meshes
+ if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 ))
+ {
+ SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true);
+ while ( smIt->more() )
+ {
+ const SMESH_subMesh* sm = smIt->next();
+ const int smCost = sm->GetComputeCost();
+ totalCost += smCost;
+ if ( !currentSubIds.Contains( sm->GetId() ) )
+ {
+ if (( !sm->IsEmpty() ) ||
+ ( sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE &&
+ !sm->DependsOn( curSM ) ))
+ computedCost += smCost;
}
}
- //cout << "Total: " << totalCost << " progress: " << computedCost / totalCost << endl;
+ }
+ // cout << "Total: " << totalCost
+ // << " computed: " << computedCost << " progress: " << computedCost / totalCost
+ // << " nbElems: " << GetMeshDS()->GetMeshInfo().NbElements() << endl;
return computedCost / totalCost;
}