0022746: Progress indicator in ShapeHealing
[occt.git] / src / ShapeProcess / ShapeProcess_Context.cxx
1 // File:        ShapeProcess_Context.cxx
2 // Created:     Mon Aug 21 19:27:30 2000
3 // Author:      Andrey BETENEV
4 //              <abv@doomox.nnov.matra-dtv.fr>
5
6 #include <ShapeProcess_Context.ixx>
7
8 #include <Standard_ErrorHandler.hxx>
9 #include <Standard_Failure.hxx>
10 #include <TCollection_HAsciiString.hxx>
11 #include <Message_Messenger.hxx>
12 #include <Message.hxx>
13 #include <sys/stat.h>
14
15 //=======================================================================
16 //function : ShapeProcess_Context
17 //purpose  : 
18 //=======================================================================
19
20 ShapeProcess_Context::ShapeProcess_Context() 
21 {
22   myMessenger = Message::DefaultMessenger();
23   myTraceLev = 1;
24 }
25         
26 //=======================================================================
27 //function : ShapeProcess_Context
28 //purpose  : 
29 //=======================================================================
30
31 ShapeProcess_Context::ShapeProcess_Context (const Standard_CString file,
32                                             const Standard_CString scope)
33 {
34   Init ( file, scope );
35   myMessenger = Message::DefaultMessenger();
36   myTraceLev = 1;
37 }
38
39 //=======================================================================
40 //function : Init
41 //purpose  : 
42 //=======================================================================
43
44 Standard_Boolean ShapeProcess_Context::Init (const Standard_CString file,
45                                              const Standard_CString scope)
46 {
47   myScope.Nullify();
48   myRC = LoadResourceManager ( file ); 
49   if ( scope && scope[0] ) {
50     SetScope ( scope );
51   }
52   return Standard_True; // myRC->Length() >0; NOT IMPLEMENTED
53 }
54
55 //=======================================================================
56 //function : LoadResourceManager
57 //purpose  : 
58 //=======================================================================
59
60 Handle(Resource_Manager) ShapeProcess_Context::LoadResourceManager (const Standard_CString file)
61 {
62   // Optimisation of loading resource file: file is load only once
63   // and reloaded only if file date has changed
64   static Handle(Resource_Manager) sRC;
65   static long mtime;
66   static TCollection_AsciiString name;
67   if ( ! sRC.IsNull() && ! name.IsEqual ( file ) ) sRC.Nullify();
68   if ( ! sRC.IsNull() ) {
69     struct stat buf;
70     if ( ! stat ( file, &buf ) && buf.st_mtime != mtime ) {
71       sRC.Nullify();
72       mtime = buf.st_mtime;
73     }
74   }
75   if ( sRC.IsNull() ) {
76 #ifdef DEB
77     cout << "Info: ShapeProcess_Context: Reload Resource_Manager: " 
78          << name.ToCString() << " -> " << file << endl;
79 #endif
80     sRC = new Resource_Manager ( file );
81     name = file;
82   }
83   return sRC;
84 }
85
86 //=======================================================================
87 //function : ResourceManager
88 //purpose  : 
89 //=======================================================================
90
91 const Handle(Resource_Manager) &ShapeProcess_Context::ResourceManager () const
92 {
93   return myRC;
94 }
95
96 //=======================================================================
97 //function : SetScope
98 //purpose  : 
99 //=======================================================================
100
101 void ShapeProcess_Context::SetScope (const Standard_CString scope)
102 {
103   if ( myScope.IsNull() ) myScope = new TColStd_HSequenceOfHAsciiString;
104   Handle(TCollection_HAsciiString) str;
105   if ( myScope->Length() >0 ) {
106     str = new TCollection_HAsciiString ( myScope->Value ( myScope->Length() ) );
107     str->AssignCat ( "." );
108     str->AssignCat ( scope );
109   }
110   else str = new TCollection_HAsciiString ( scope );
111   myScope->Append ( str );
112 }
113         
114 //=======================================================================
115 //function : UnSetScope
116 //purpose  : 
117 //=======================================================================
118
119 void ShapeProcess_Context::UnSetScope ()
120 {
121   if ( ! myScope.IsNull() && myScope->Length() >0 ) 
122     myScope->Remove ( myScope->Length() );
123 }
124         
125 //=======================================================================
126 //function : IsParamSet
127 //purpose  : 
128 //=======================================================================
129
130 static Handle(TCollection_HAsciiString) MakeName (const Handle(TColStd_HSequenceOfHAsciiString) &scope,
131                                                   const Standard_CString param)
132 {
133   Handle(TCollection_HAsciiString) str;
134   if ( ! scope.IsNull() && scope->Length() >0 ) {
135     str = new TCollection_HAsciiString ( scope->Value ( scope->Length() )->String() );
136     str->AssignCat (".");
137     str->AssignCat ( param );
138   }
139   else str = new TCollection_HAsciiString ( param );
140   return str;
141 }
142
143 Standard_Boolean ShapeProcess_Context::IsParamSet (const Standard_CString param) const
144 {
145   return ! myRC.IsNull() && myRC->Find ( MakeName ( myScope, param )->ToCString() );
146 }
147
148 //=======================================================================
149 //function : GetString
150 //purpose  : 
151 //=======================================================================
152
153 Standard_Boolean ShapeProcess_Context::GetString (const Standard_CString param,
154                                                   TCollection_AsciiString &str) const
155 {
156   if ( myRC.IsNull() ) return Standard_False;
157   Handle(TCollection_HAsciiString) pname = MakeName ( myScope, param );
158   if ( ! myRC->Find ( pname->ToCString() ) ) {
159 #ifdef DEB 
160     cout << "Warning: ShapeProcess_Context::GetInteger(): Parameter " << pname->ToCString() << " is not defined" << endl;
161 #endif
162     return Standard_False;
163   }
164   str = myRC->Value ( pname->ToCString() );
165   return Standard_True;
166 }
167
168 //=======================================================================
169 //function : GetReal
170 //purpose  : 
171 //=======================================================================
172
173 Standard_Boolean ShapeProcess_Context::GetReal (const Standard_CString param,
174                                                 Standard_Real &val) const
175 {
176   if ( myRC.IsNull() ) return Standard_False;
177   
178   TCollection_AsciiString str;
179   if ( ! GetString ( param, str ) ) return Standard_False;
180   
181   if ( str.IsRealValue() ) {
182     val = str.RealValue();
183     return Standard_True;
184   }
185
186   // if not real, try to treat as alias "&param"
187   str.LeftAdjust();
188   if ( str.Value(1) == '&' ) {
189     TCollection_AsciiString ref = str.Split ( 1 );
190     ref.LeftAdjust();
191     ref.RightAdjust();
192     if ( ! myRC->Find ( ref.ToCString() ) ) {
193 #ifdef DEB 
194       cout << "Warning: ShapeProcess_Context::GetInteger(): Parameter " << ref.ToCString() << " is not defined" << endl;
195 #endif
196       return Standard_False;
197     }
198     str = myRC->Value ( ref.ToCString() );
199     if ( str.IsRealValue() ) {
200       val = str.RealValue();
201       return Standard_True;
202     }
203   }
204 #ifdef DEB 
205   cout << "Warning: ShapeProcess_Context::GetInteger(): Parameter " << param << " is neither Real nor reference to Real";
206 #endif
207   return Standard_False;
208 }
209
210 //=======================================================================
211 //function : GetInteger
212 //purpose  : 
213 //=======================================================================
214
215 Standard_Boolean ShapeProcess_Context::GetInteger (const Standard_CString param,
216                                                    Standard_Integer &val) const
217 {
218   if ( myRC.IsNull() ) return Standard_False;
219   
220   TCollection_AsciiString str;
221   if ( ! GetString ( param, str ) ) return Standard_False;
222   
223   if ( str.IsIntegerValue() ) {
224     val = str.IntegerValue();
225     return Standard_True;
226   }
227
228   // if not integer, try to treat as alias "&param"
229   str.LeftAdjust();
230   if ( str.Value(1) == '&' ) {
231     TCollection_AsciiString ref = str.Split ( 1 );
232     ref.LeftAdjust();
233     ref.RightAdjust();
234     if ( ! myRC->Find ( ref.ToCString() ) ) {
235 #ifdef DEB 
236       cout << "Warning: ShapeProcess_Context::GetInteger(): Parameter " << ref.ToCString() << " is not defined" << endl;
237 #endif
238       return Standard_False;
239     }
240     str = myRC->Value ( ref.ToCString() );
241     if ( str.IsIntegerValue() ) {
242       val = str.IntegerValue();
243       return Standard_True;
244     }
245   }
246 #ifdef DEB 
247   cout << "Warning: ShapeProcess_Context::GetInteger(): Parameter " << param << " is neither Integer nor reference to Integer";
248 #endif
249   return Standard_False;
250 }
251
252 //=======================================================================
253 //function : GetBoolean
254 //purpose  : 
255 //=======================================================================
256
257 Standard_Boolean ShapeProcess_Context::GetBoolean (const Standard_CString param,
258                                                    Standard_Boolean &val) const
259 {
260   if ( myRC.IsNull() ) return Standard_False;
261   try {
262     OCC_CATCH_SIGNALS
263     val = (Standard_Boolean)myRC->Integer ( MakeName ( myScope, param )->ToCString() );
264     return Standard_True;
265   }
266   catch (Standard_Failure) {
267 #ifdef DEB 
268     cout << "Warning: ShapeProcess_Context::GetInteger(): " << param << ": ";
269     Standard_Failure::Caught()->Print(cout); cout << endl;
270 #endif
271   }
272   return Standard_False;
273 }
274
275 //=======================================================================
276 //function : RealVal
277 //purpose  : 
278 //=======================================================================
279
280 Standard_Real ShapeProcess_Context::RealVal (const Standard_CString param,
281                                              const Standard_Real def) const
282 {
283   Standard_Real val;
284   return GetReal ( param, val ) ? val : def;
285 }
286
287 //=======================================================================
288 //function : BooleanVal
289 //purpose  : 
290 //=======================================================================
291
292 Standard_Boolean ShapeProcess_Context::BooleanVal (const Standard_CString param,
293                                                    const Standard_Boolean def) const
294 {
295   Standard_Boolean val;
296   return GetBoolean ( param, val ) ? val : def;
297 }
298
299 //=======================================================================
300 //function : IntegerVal
301 //purpose  : 
302 //=======================================================================
303
304 Standard_Integer ShapeProcess_Context::IntegerVal (const Standard_CString param,
305                                                    const Standard_Integer def) const
306 {
307   Standard_Integer val;
308   return GetInteger ( param, val ) ? val : def;
309 }
310
311 //=======================================================================
312 //function : StringVal
313 //purpose  : 
314 //=======================================================================
315
316 Standard_CString ShapeProcess_Context::StringVal (const Standard_CString param,
317                                                   const Standard_CString def) const
318 {
319   if ( myRC.IsNull() ) return def;
320   try {
321     OCC_CATCH_SIGNALS
322     return myRC->Value ( MakeName ( myScope, param )->ToCString() );
323   }
324   catch (Standard_Failure) {
325 #ifdef DEB 
326     cout << "Warning: ShapeProcess_Context::GetInteger(): " << param << ": ";
327     Standard_Failure::Caught()->Print(cout); cout << endl;
328 #endif
329   }
330   return def;
331 }
332
333 //=======================================================================
334 //function : SetMessenger
335 //purpose  : 
336 //=======================================================================
337
338 void ShapeProcess_Context::SetMessenger (const Handle(Message_Messenger)& messenger)
339 {
340   if ( messenger.IsNull() )
341     myMessenger = Message::DefaultMessenger();
342   else
343     myMessenger = messenger;
344 }
345
346 //=======================================================================
347 //function : Messenger
348 //purpose  : 
349 //=======================================================================
350
351 Handle(Message_Messenger) ShapeProcess_Context::Messenger () const
352 {
353   return myMessenger;
354 }
355
356 //=======================================================================
357 //function : SetProgress
358 //purpose  : 
359 //=======================================================================
360
361 void ShapeProcess_Context::SetProgress (const Handle(Message_ProgressIndicator)& progress)
362 {
363   myProgress = progress;
364 }
365
366 //=======================================================================
367 //function : Progress
368 //purpose  : 
369 //=======================================================================
370
371 Handle(Message_ProgressIndicator) ShapeProcess_Context::Progress() const
372 {
373   return myProgress;
374 }
375
376 //=======================================================================
377 //function : SetTraceLevel
378 //purpose  : 
379 //=======================================================================
380
381 void ShapeProcess_Context::SetTraceLevel (const Standard_Integer tracelev)
382 {
383   myTraceLev = tracelev;
384 }
385
386 //=======================================================================
387 //function : TraceLevel
388 //purpose  : 
389 //=======================================================================
390
391 Standard_Integer ShapeProcess_Context::TraceLevel () const
392 {
393   return myTraceLev;
394 }
395