0025113: Mesh - Progress indication and user break functionality for BRepMesh component
[occt.git] / src / IMeshTools / IMeshTools_Context.hxx
1 // Created on: 2016-04-07
2 // Copyright (c) 2016 OPEN CASCADE SAS
3 // Created by: Oleg AGASHIN
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef _IMeshTools_Context_HeaderFile
17 #define _IMeshTools_Context_HeaderFile
18
19 #include <IMeshData_Shape.hxx>
20 #include <Standard_Type.hxx>
21 #include <IMeshTools_ModelBuilder.hxx>
22 #include <IMeshData_Model.hxx>
23 #include <IMeshTools_Parameters.hxx>
24 #include <IMeshTools_ModelAlgo.hxx>
25 #include <Message_ProgressRange.hxx>
26
27 //! Interface class representing context of BRepMesh algorithm.
28 //! Intended to cache discrete model and instances of tools for 
29 //! its processing.
30 class IMeshTools_Context : public IMeshData_Shape
31 {
32 public:
33
34   //! Constructor.
35   Standard_EXPORT IMeshTools_Context()
36   {
37   }
38
39   //! Destructor.
40   Standard_EXPORT virtual ~IMeshTools_Context()
41   {
42   }
43
44   //! Builds model using assined model builder.
45   //! @return True on success, False elsewhere.
46   Standard_EXPORT virtual Standard_Boolean BuildModel ()
47   {
48     if (myModelBuilder.IsNull())
49     {
50       return Standard_False;
51     }
52
53     myModel = myModelBuilder->Perform(GetShape(), myParameters);
54
55     return !myModel.IsNull();
56   }
57
58   //! Performs discretization of model edges using assigned edge discret algorithm.
59   //! @return True on success, False elsewhere.
60   Standard_EXPORT virtual Standard_Boolean DiscretizeEdges()
61   {
62     if (myModel.IsNull() || myEdgeDiscret.IsNull())
63     {
64       return Standard_False;
65     }
66
67     // Discretize edges of a model.
68     return myEdgeDiscret->Perform(myModel, myParameters, Message_ProgressRange());
69   }
70
71   //! Performs healing of discrete model built by DiscretizeEdges() method
72   //! using assigned healing algorithm.
73   //! @return True on success, False elsewhere.
74   Standard_EXPORT virtual Standard_Boolean HealModel()
75   {
76     if (myModel.IsNull())
77     {
78       return Standard_False;
79     }
80
81     return myModelHealer.IsNull() ?
82       Standard_True :
83       myModelHealer->Perform (myModel, myParameters, Message_ProgressRange());
84   }
85
86   //! Performs pre-processing of discrete model using assigned algorithm.
87   //! Performs auxiliary actions such as cleaning shape from old triangulation.
88   //! @return True on success, False elsewhere.
89   Standard_EXPORT virtual Standard_Boolean PreProcessModel()
90   {
91     if (myModel.IsNull())
92     {
93       return Standard_False;
94     }
95
96     return myPreProcessor.IsNull() ? 
97       Standard_True :
98       myPreProcessor->Perform (myModel, myParameters, Message_ProgressRange());
99   }
100
101   //! Performs meshing of faces of discrete model using assigned meshing algorithm.
102   //! @return True on success, False elsewhere.
103   virtual Standard_Boolean DiscretizeFaces (const Message_ProgressRange& theRange)
104   {
105     if (myModel.IsNull() || myFaceDiscret.IsNull())
106     {
107       return Standard_False;
108     }
109
110     // Discretize faces of a model.
111     return myFaceDiscret->Perform (myModel, myParameters, theRange);
112   }
113
114   //! Performs post-processing of discrete model using assigned algorithm.
115   //! @return True on success, False elsewhere.
116   Standard_EXPORT virtual Standard_Boolean PostProcessModel()
117   {
118     if (myModel.IsNull())
119     {
120       return Standard_False;
121     }
122
123     return myPostProcessor.IsNull() ?
124       Standard_True :
125       myPostProcessor->Perform(myModel, myParameters, Message_ProgressRange());
126   }
127
128   //! Cleans temporary context data.
129   Standard_EXPORT virtual void Clean()
130   {
131     if (myParameters.CleanModel)
132     {
133       myModel.Nullify();
134     }
135   }
136
137   //! Gets instance of a tool to be used to build discrete model.
138   inline const Handle (IMeshTools_ModelBuilder)& GetModelBuilder () const
139   {
140     return myModelBuilder;
141   }
142
143   //! Sets instance of a tool to be used to build discrete model.
144   inline void SetModelBuilder (const Handle (IMeshTools_ModelBuilder)& theBuilder)
145   {
146     myModelBuilder = theBuilder;
147   }
148
149   //! Gets instance of a tool to be used to discretize edges of a model.
150   inline const Handle (IMeshTools_ModelAlgo)& GetEdgeDiscret () const
151   {
152     return myEdgeDiscret;
153   }
154
155   //! Sets instance of a tool to be used to discretize edges of a model.
156   inline void SetEdgeDiscret (const Handle (IMeshTools_ModelAlgo)& theEdgeDiscret)
157   {
158     myEdgeDiscret = theEdgeDiscret;
159   }
160
161   //! Gets instance of a tool to be used to heal discrete model.
162   inline const Handle(IMeshTools_ModelAlgo)& GetModelHealer() const
163   {
164     return myModelHealer;
165   }
166
167   //! Sets instance of a tool to be used to heal discrete model.
168   inline void SetModelHealer(const Handle(IMeshTools_ModelAlgo)& theModelHealer)
169   {
170     myModelHealer = theModelHealer;
171   }
172
173   //! Gets instance of pre-processing algorithm.
174   inline const Handle(IMeshTools_ModelAlgo)& GetPreProcessor() const
175   {
176     return myPreProcessor;
177   }
178
179   //! Sets instance of pre-processing algorithm.
180   inline void SetPreProcessor(const Handle(IMeshTools_ModelAlgo)& thePreProcessor)
181   {
182     myPreProcessor = thePreProcessor;
183   }
184
185   //! Gets instance of meshing algorithm.
186   inline const Handle(IMeshTools_ModelAlgo)& GetFaceDiscret() const
187   {
188     return myFaceDiscret;
189   }
190
191   //! Sets instance of meshing algorithm.
192   inline void SetFaceDiscret(const Handle(IMeshTools_ModelAlgo)& theFaceDiscret)
193   {
194     myFaceDiscret = theFaceDiscret;
195   }
196
197   //! Gets instance of post-processing algorithm.
198   inline const Handle(IMeshTools_ModelAlgo)& GetPostProcessor() const
199   {
200     return myPostProcessor;
201   }
202
203   //! Sets instance of post-processing algorithm.
204   inline void SetPostProcessor(const Handle(IMeshTools_ModelAlgo)& thePostProcessor)
205   {
206     myPostProcessor = thePostProcessor;
207   }
208
209   //! Gets parameters to be used for meshing.
210   inline const IMeshTools_Parameters& GetParameters () const 
211   {
212     return myParameters;
213   }
214
215   //! Gets reference to parameters to be used for meshing.
216   inline IMeshTools_Parameters& ChangeParameters ()
217   {
218     return myParameters;
219   }
220
221   //! Returns discrete model of a shape.
222   inline const Handle (IMeshData_Model)& GetModel () const
223   {
224     return myModel;
225   }
226
227   DEFINE_STANDARD_RTTI_INLINE(IMeshTools_Context, IMeshData_Shape)
228
229 private:
230
231   Handle (IMeshTools_ModelBuilder) myModelBuilder;
232   Handle (IMeshData_Model)         myModel;
233   Handle (IMeshTools_ModelAlgo)    myEdgeDiscret;
234   Handle (IMeshTools_ModelAlgo)    myModelHealer;
235   Handle (IMeshTools_ModelAlgo)    myPreProcessor;
236   Handle (IMeshTools_ModelAlgo)    myFaceDiscret;
237   Handle (IMeshTools_ModelAlgo)    myPostProcessor;
238   IMeshTools_Parameters            myParameters;
239 };
240
241 #endif