-// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012 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
+// 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.
+// 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.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_subMesh.hxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-// $Header$
//
#ifndef _SMESH_SUBMESH_HXX_
#define _SMESH_SUBMESH_HXX_
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_subMesh *GetFirstToCompute();
+ SMESH_Algo* GetAlgo() const;
+
const std::map < int, SMESH_subMesh * >& DependsOn();
- //const map < int, SMESH_subMesh * >&Dependants();
/*!
* \brief Return iterator on the submeshes this one depends on
*/
SMESH_subMeshIteratorPtr getDependsOnIterator(const bool includeSelf,
- const bool complexShapeFirst);
+ const bool complexShapeFirst) const;
const TopoDS_Shape & GetSubShape() const;
{
NOT_READY, READY_TO_COMPUTE,
COMPUTE_OK, FAILED_TO_COMPUTE
- };
+ };
enum algo_state
{
NO_ALGO, MISSING_HYP, HYP_OK
- };
+ };
enum algo_event
{
ADD_HYP , ADD_ALGO,
ADD_FATHER_HYP , ADD_FATHER_ALGO,
REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO,
MODIF_HYP
- };
+ };
enum compute_event
{
- MODIF_ALGO_STATE, COMPUTE,
- CLEAN, SUBMESH_COMPUTED, SUBMESH_RESTORED,
+ MODIF_ALGO_STATE, COMPUTE, COMPUTE_CANCELED,
+ CLEAN, SUBMESH_COMPUTED, SUBMESH_RESTORED, SUBMESH_LOADED,
MESH_ENTITY_REMOVED, CHECK_COMPUTE_STATE
- };
+ };
enum event_type
{
ALGO_EVENT, COMPUTE_EVENT
* \param where - the submesh to store the listener and it's data
*
* The method remembers the submesh \awhere it puts the listener in order to delete
- * them when HYP_OK algo_state is lost
+ * it when HYP_OK algo_state is lost
* After being set, event listener is notified on each event of \awhere submesh.
*/
void SetEventListener(EventListener* listener,
*/
EventListenerData* GetEventListenerData(EventListener* listener) const;
+ /*!
+ * \brief Return an event listener data
+ * \param listenerName - the listener name
+ * \retval EventListenerData* - found data, maybe NULL
+ */
+ EventListenerData* GetEventListenerData(const std::string& listenerName) const;
+
/*!
* \brief Unregister the listener and delete it and it's data
* \param listener - the event listener to delete
protected:
//!< event listeners to notify
- std::map< EventListener*, EventListenerData* > myEventListeners;
+ std::map< EventListener*, EventListenerData* > _eventListeners;
+
//!< event listeners to delete when HYP_OK algo_state is lost
- std::list< std::pair< SMESH_subMesh*, EventListener* > > myOwnListeners;
+ struct OwnListenerData {
+ SMESH_subMesh* mySubMesh;
+ int myMeshID; // id of mySubMesh->GetFather()
+ int mySubMeshID;
+ EventListener* myListener;
+ OwnListenerData( SMESH_subMesh* sm=0, EventListener* el=0);
+ };
+ std::list< OwnListenerData > _ownListeners;
/*!
* \brief Sets an event listener and its data to a submesh
*
* After being set, event listener is notified on each event of a submesh.
*/
- void SetEventListener(EventListener* listener, EventListenerData* data);
+ void setEventListener(EventListener* listener, EventListenerData* data);
/*!
* \brief Notify stored event listeners on the occured event
* \param eventType - algo_event or compute_event
* \param hyp - hypothesis, if eventType is algo_event
*/
- void NotifyListenersOnEvent( const int event,
+ void notifyListenersOnEvent( const int event,
const event_type eventType,
SMESH_Hypothesis* hyp = 0);
/*!
* \brief Delete event listeners depending on algo of this submesh
*/
- void DeleteOwnListeners();
+ void deleteOwnListeners();
- // ==================================================================
+ /*!
+ * \brief loads dependent meshes on SUBMESH_LOADED event
+ */
+ void loadDependentMeshes();
+
+ // END: Members to track non hierarchical dependencies between submeshes
+ // =====================================================================
public:
SMESH_Hypothesis::Hypothesis_Status
SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
- 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 ComputeStateEngine(int event);
- void ComputeSubMeshStateEngine(int event);
+ void ComputeSubMeshStateEngine(int event, const bool includeSelf=false);
bool Evaluate(MapShapeNbElems& aResMap);
void SetIsAlwaysComputed(bool isAlCo);
bool IsAlwaysComputed() { return _alwaysComputed; }
+ bool SubMeshesComputed() const;
+
/*!
* \brief Find common submeshes (based on shared subshapes with other
protected:
// ==================================================================
- void InsertDependence(const TopoDS_Shape aSubShape);
-
- bool SubMeshesComputed();
+ void insertDependence(const TopoDS_Shape aSubShape);
- 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 removeSubMeshElementsAndNodes();
+ void updateDependantsState(const compute_event theEvent);
+ void updateSubMeshState(const compute_state theState);
+ void cleanDependants();
+ void cleanDependsOn();
+ void setAlgoState(algo_state state);
/*!
* \brief Return a shape containing all sub-shapes of the MainShape that can be
* meshed at once along with _subShape
*/
- TopoDS_Shape GetCollection(SMESH_Gen * theGen,
+ TopoDS_Shape getCollection(SMESH_Gen * theGen,
SMESH_Algo* theAlgo,
bool & theSubComputed);
-
- /*!
- * \brief Apply theAlgo to all subshapes in theCollection
- */
- bool ApplyToCollection (SMESH_Algo* theAlgo,
- const TopoDS_Shape& theCollection);
-
/*!
* \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.
* is returned; else an applicable ones having theHypType
* is returned
*/
- const SMESH_Hypothesis* GetSimilarAttached(const TopoDS_Shape& theShape,
+ const SMESH_Hypothesis* getSimilarAttached(const TopoDS_Shape& theShape,
const SMESH_Hypothesis * theHyp,
const int theHypType = 0);
//
std::map < int, SMESH_subMesh * >_mapDepend;
bool _dependenceAnalysed;
- int _algoState;
- int _computeState;
+ algo_state _algoState;
+ compute_state _computeState;
SMESH_ComputeErrorPtr _computeError;
// allow algo->Compute() if a subshape of lower dim is meshed but