#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <TColStd_ListIteratorOfListOfInteger.hxx>
-
#ifdef _DEBUG_
#include <gp_Pnt.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
#endif
//=============================================================================
for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
{
SMESH_subMesh *sm = (*itsub).second;
-
- const TopoDS_Shape & ss = sm->GetSubShape();
- int type = ss.ShapeType();
- bool computeOk = (sm->GetComputeState() == COMPUTE_OK);
+ SMESHDS_SubMesh * ds = sm->GetSubMeshDS();
+ // PAL10974.
+ // There are some tricks with compute states, e.g. Penta_3D leaves
+ // one face with READY_TO_COMPUTE state in order to be able to
+ // recompute 3D when a locale triangle hypo changes (see PAL7428).
+ // So we check if mesh is really present
+ //bool computeOk = (sm->GetComputeState() == COMPUTE_OK);
+ bool computeOk = ( ds && ( ds->GetNodes()->more() || ds->GetElements()->more() ));
if (!computeOk)
{
+ const TopoDS_Shape & ss = sm->GetSubShape();
+ int type = ss.ShapeType();
+
subMeshesComputed = false;
switch (type)
for (its = dependson.begin(); its != dependson.end(); its++)
{
SMESH_subMesh *sm = (*its).second;
- //SCRUTE((*its).first);
sm->ComputeStateEngine(CLEAN);
}
}
*/
//=============================================================================
+static void removeSubMesh( SMESHDS_Mesh * meshDS, const TopoDS_Shape& subShape)
+{
+ SMESHDS_SubMesh * subMeshDS = meshDS->MeshElements(subShape);
+ if (subMeshDS!=NULL)
+ {
+ SMDS_ElemIteratorPtr ite=subMeshDS->GetElements();
+ while(ite->more())
+ {
+ const SMDS_MeshElement * elt = ite->next();
+ //MESSAGE( " RM elt: "<<elt->GetID()<<" ( "<<elt->NbNodes()<<" )" );
+ meshDS->RemoveElement(elt);
+ }
+
+ SMDS_NodeIteratorPtr itn=subMeshDS->GetNodes();
+ while(itn->more())
+ {
+ const SMDS_MeshNode * node = itn->next();
+ //MESSAGE( " RM node: "<<node->GetID());
+ meshDS->RemoveNode(node);
+ }
+ }
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
bool SMESH_subMesh::ComputeStateEngine(int event)
{
//MESSAGE("SMESH_subMesh::ComputeStateEngine");
_computeState = FAILED_TO_COMPUTE;
break;
}
- RemoveSubMeshElementsAndNodes();
// compute
+ CleanDependants();
+ //RemoveSubMeshElementsAndNodes();
+ //removeSubMesh( _meshDS, _subShape );
if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput())
ret = ApplyToCollection( algo, GetCollection( gen, algo ) );
else
#ifdef _DEBUG_
// Show vertices location of a failed shape
- TopExp_Explorer exp( _subShape, TopAbs_VERTEX);
- for ( ; exp.More(); exp.Next() ) {
- gp_Pnt P( BRep_Tool::Pnt( TopoDS::Vertex( exp.Current() )));
+ TopTools_IndexedMapOfShape vMap;
+ TopExp::MapShapes( _subShape, TopAbs_VERTEX, vMap );
+ for ( int iv = 1; iv <= vMap.Extent(); ++iv ) {
+ gp_Pnt P( BRep_Tool::Pnt( TopoDS::Vertex( vMap( iv ) )));
cout << P.X() << " " << P.Y() << " " << P.Z() << " " << endl;
}
#endif
*/
//=============================================================================
-static void removeSubMesh( SMESHDS_Mesh * meshDS, const TopoDS_Shape& subShape)
-{
- SMESHDS_SubMesh * subMeshDS = meshDS->MeshElements(subShape);
- if (subMeshDS!=NULL)
- {
- SMDS_ElemIteratorPtr ite=subMeshDS->GetElements();
- while(ite->more())
- {
- const SMDS_MeshElement * elt = ite->next();
- //MESSAGE( " RM elt: "<<elt->GetID()<<" ( "<<elt->NbNodes()<<" )" );
- meshDS->RemoveElement(elt);
- }
-
- SMDS_NodeIteratorPtr itn=subMeshDS->GetNodes();
- while(itn->more())
- {
- const SMDS_MeshNode * node = itn->next();
- //MESSAGE( " RM node: "<<node->GetID());
- meshDS->RemoveNode(node);
- }
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
void SMESH_subMesh::RemoveSubMeshElementsAndNodes()
{
//SCRUTE(_subShape.ShapeType());