-// Copyright (C) 2007-2012 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
class SMESH_EXPORT SMESH_subMesh
{
public:
- SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS,
+ SMESH_subMesh(int Id,
+ SMESH_Mesh * father,
+ SMESHDS_Mesh * meshDS,
const TopoDS_Shape & aSubShape);
virtual ~ SMESH_subMesh();
- int GetId() const;
+ int GetId() const; // == meshDS->ShapeToIndex( aSubShape )
SMESH_Mesh* GetFather() { return _father; }
- SMESHDS_SubMesh * GetSubMeshDS();
+ SMESHDS_SubMesh * GetSubMeshDS();
+ const SMESHDS_SubMesh * GetSubMeshDS() const;
SMESHDS_SubMesh* CreateSubMeshDS();
// Explicit SMESHDS_SubMesh creation method, required for persistence mechanism
SMESH_Algo* GetAlgo() const;
const std::map < int, SMESH_subMesh * >& DependsOn();
+ bool DependsOn( const SMESH_subMesh* other ) const;
/*!
- * \brief Return iterator on the submeshes this one depends on
+ * \brief Return iterator on the sub-meshes this one depends on. By default
+ * most simple sub-meshes go first.
*/
SMESH_subMeshIteratorPtr getDependsOnIterator(const bool includeSelf,
- const bool complexShapeFirst);
+ const bool complexShapeFirst=false) const;
+
+ const std::vector< SMESH_subMesh * > & GetAncestors() const;
+ void ClearAncestors();
const TopoDS_Shape & GetSubShape() const;
};
enum compute_event
{
- MODIF_ALGO_STATE, COMPUTE, COMPUTE_CANCELED,
+ MODIF_ALGO_STATE, COMPUTE, COMPUTE_SUBMESH, COMPUTE_CANCELED,
CLEAN, SUBMESH_COMPUTED, SUBMESH_RESTORED, SUBMESH_LOADED,
MESH_ENTITY_REMOVED, CHECK_COMPUTE_STATE
};
/*!
* \brief Return an event listener data
* \param listener - the listener whose data is
+ * \param myOwn - if \c true, returns a listener set by this sub-mesh,
+ * else returns a listener listening to events of this sub-mesh
+ * \retval EventListenerData* - found data, maybe NULL
+ */
+ EventListenerData* GetEventListenerData(EventListener* listener,
+ const bool myOwn=false) const;
+
+ /*!
+ * \brief Return an event listener data
+ * \param listenerName - the listener name
+ * \param myOwn - if \c true, returns a listener set by this sub-mesh,
+ * else returns a listener listening to events of this sub-mesh
* \retval EventListenerData* - found data, maybe NULL
*/
- EventListenerData* GetEventListenerData(EventListener* listener) const;
+ EventListenerData* GetEventListenerData(const std::string& listenerName,
+ const bool myOwn=false) const;
/*!
* \brief Unregister the listener and delete it and it's data
AlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
SMESH_Hypothesis::Hypothesis_Status
- SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
+ SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp, bool exitOnFatal=false);
- int GetAlgoState() const { return _algoState; }
- int GetComputeState() const { return _computeState; };
- SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; }
+ algo_state GetAlgoState() const { return _algoState; }
+ compute_state GetComputeState() const { return _computeState; }
+ SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; }
void DumpAlgoState(bool isMain);
bool IsEmpty() const;
bool IsMeshComputed() const;
- // check if _subMeshDS contains mesh elements
+ // check if _subMeshDS contains mesh elements unless _alwaysComputed==true
/*!
* \brief Allow algo->Compute() if a subshape of lower dim is meshed but
void SetIsAlwaysComputed(bool isAlCo);
bool IsAlwaysComputed() { return _alwaysComputed; }
+ bool SubMeshesComputed(bool * isFailedToCompute=0) const;
+
+ int GetComputeCost() const;
+ // how costly is to compute this sub-mesh
/*!
* \brief Find common submeshes (based on shared subshapes with other
// ==================================================================
void insertDependence(const TopoDS_Shape aSubShape);
- bool subMeshesComputed();
- //bool SubMeshesReady();
-
void removeSubMeshElementsAndNodes();
void updateDependantsState(const compute_event theEvent);
void updateSubMeshState(const compute_state theState);
void cleanDependants();
- void cleanDependsOn();
- void setAlgoState(int state);
+ void cleanDependsOn( SMESH_Algo* algoRequiringCleaning=0 );
+ void setAlgoState(algo_state state);
/*!
* \brief Return a shape containing all sub-shapes of the MainShape that can be
*/
TopoDS_Shape getCollection(SMESH_Gen * theGen,
SMESH_Algo* theAlgo,
- bool & theSubComputed);
+ bool & theSubComputed,
+ bool & theSubFailed,
+ std::vector<SMESH_subMesh*>& theSubs);
/*!
* \brief Update compute_state by _computeError
* \retval bool - false if there are errors
*/
- bool checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape=TopoDS_Shape());
+ bool checkComputeError(SMESH_Algo* theAlgo,
+ const bool theComputeOK,
+ const TopoDS_Shape& theShape=TopoDS_Shape());
/*!
* \brief Return a hypothesis attached to theShape.
const SMESH_Hypothesis * theHyp,
const int theHypType = 0);
//
+ int computeCost() const;
protected:
std::map < int, SMESH_subMesh * >_mapDepend;
bool _dependenceAnalysed;
+ std::vector< SMESH_subMesh * > _ancestors;
- int _algoState;
- int _computeState;
+ SMESH_Algo * _algo; // the algorithm found by last *StateEngine() call
+ algo_state _algoState;
+ compute_state _computeState;
SMESH_ComputeErrorPtr _computeError;
+ int _computeCost; // how costly is to compute this sub-mesh
+ int _realComputeCost; // _computeCost depending on presence of needed hypotheses
- // allow algo->Compute() if a subshape of lower dim is meshed but
+ // allow algo->Compute() if a sub-shape of lower dim is meshed but
// none mesh entity is bound to it. Eg StdMeshers_CompositeSegment_1D can
// mesh several edges as a whole and leave some of them without mesh entities
bool _alwaysComputed;