-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015 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
#include <GEOMUtils.hxx>
#undef _Precision_HeaderFile
-//#include <BRepBndLib.hxx>
+#include <BRepBndLib.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <Bnd_Box.hxx>
#include <TColStd_MapOfInteger.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>
+#include <pthread.h>
#endif
using namespace std;
{
MESSAGE("SMESH_Mesh::~SMESH_Mesh");
+ // avoid usual removal of elements while processing RemoveHypothesis( algo ) event
+ SMESHDS_SubMeshIteratorPtr smIt = _myMeshDS->SubMeshes();
+ while ( smIt->more() )
+ const_cast<SMESHDS_SubMesh*>( smIt->next() )->Clear();
+
// issue 0020340: EDF 1022 SMESH : Crash with FindNodeClosestTo in a second new study
// Notify event listeners at least that something happens
if ( SMESH_subMesh * sm = GetSubMeshContaining(1))
return _myDocument ? bool( _myDocument->GetMesh( meshId )) : false;
}
+//================================================================================
+/*!
+ * \brief Return a mesh by id
+ */
+//================================================================================
+
+SMESH_Mesh* SMESH_Mesh::FindMesh( int meshId ) const
+{
+ if ( _id == meshId )
+ return (SMESH_Mesh*) this;
+
+ if ( StudyContextStruct *aStudyContext = _gen->GetStudyContext( _studyId ))
+ {
+ std::map < int, SMESH_Mesh * >::iterator i_m = aStudyContext->mapMesh.find( meshId );
+ if ( i_m != aStudyContext->mapMesh.end() )
+ return i_m->second;
+ }
+ return NULL;
+}
+
//=============================================================================
/*!
* \brief Set geometry to be meshed
{
if ( !aShape.IsNull() ) {
Bnd_Box Box;
- GEOMUtils::PreciseBoundingBox(aShape, Box);
- return sqrt( Box.SquareExtent() );
+ // avoid too long waiting on large shapes. PreciseBoundingBox() was added
+ // to assure same result which else depends on presence of triangulation (IPAL52557).
+ const int maxNbFaces = 4000;
+ int nbFaces = 0;
+ for ( TopExp_Explorer f( aShape, TopAbs_FACE ); f.More() && nbFaces < maxNbFaces; f.Next() )
+ ++nbFaces;
+ if ( nbFaces < maxNbFaces )
+ GEOMUtils::PreciseBoundingBox(aShape, Box);
+ else
+ BRepBndLib::Add( aShape, Box);
+ if ( !Box.IsVoid() )
+ return sqrt( Box.SquareExtent() );
}
return 0;
}
// other possible changes are not interesting. (IPAL0052457 - assigning hyp performance pb)
if ( aSubMesh->GetComputeState() != SMESH_subMesh::COMPUTE_OK &&
aSubMesh->GetComputeState() != SMESH_subMesh::FAILED_TO_COMPUTE &&
- aSubMesh->GetAlgoState() != SMESH_subMesh::MISSING_HYP )
+ aSubMesh->GetAlgoState() != SMESH_subMesh::MISSING_HYP &&
+ !hyp->DataDependOnParams() )
continue;
const TopoDS_Shape & aSubShape = aSubMesh->GetSubShape();
//================================================================================
void SMESH_Mesh::ExportCGNS(const char * file,
- const SMESHDS_Mesh* meshDS)
+ const SMESHDS_Mesh* meshDS,
+ const char * meshName)
{
int res = Driver_Mesh::DRS_FAIL;
#ifdef WITH_CGNS
myWriter.SetFile( file );
myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
myWriter.SetMeshName( SMESH_Comment("Mesh_") << meshDS->GetPersistentId());
+ if ( meshName && meshName[0] )
+ myWriter.SetMeshName( meshName );
res = myWriter.Perform();
#endif
if ( res != Driver_Mesh::DRS_OK )
return _myMeshDS->NbSubMesh();
}
+//================================================================================
+/*!
+ * \brief Returns number of meshes in the Study, that is supposed to be
+ * equal to SMESHDS_Document::NbMeshes()
+ */
+//================================================================================
+
+int SMESH_Mesh::NbMeshes() const // nb meshes in the Study
+{
+ return _myDocument->NbMeshes();
+}
+
//=======================================================================
//function : IsNotConformAllowed
//purpose : check if a hypothesis alowing notconform mesh is present
return aGroup;
SMESH_Group* anOldGrp = (*itg).second;
- SMESHDS_GroupBase* anOldGrpDS = anOldGrp->GetGroupDS();
- if ( !anOldGrp || !anOldGrpDS )
+ if ( !anOldGrp || !anOldGrp->GetGroupDS() )
return aGroup;
+ SMESHDS_GroupBase* anOldGrpDS = anOldGrp->GetGroupDS();
// create new standalone group
aGroup = new SMESH_Group (theGroupID, this, anOldGrpDS->GetType(), anOldGrp->GetName() );
TopTools_ListIteratorOfListOfShape ancIt (ancList);
while ( ancIt.More() && ancIt.Value().ShapeType() >= memberType )
ancIt.Next();
- if ( ancIt.More() )
- ancList.InsertBefore( theShape, ancIt );
+ if ( ancIt.More() ) ancList.InsertBefore( theShape, ancIt );
+ else ancList.Append( theShape );
}
}
else // else added for 52457: Addition of hypotheses is 8 time longer than meshing