b311480e |
1 | // Copyright (c) 1999-2012 OPEN CASCADE SAS |
2 | // |
3 | // The content of this file is subject to the Open CASCADE Technology Public |
4 | // License Version 6.5 (the "License"). You may not use the content of this file |
5 | // except in compliance with the License. Please obtain a copy of the License |
6 | // at http://www.opencascade.org and read it completely before using this file. |
7 | // |
8 | // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its |
9 | // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. |
10 | // |
11 | // The Original Code and all software distributed under the License is |
12 | // distributed on an "AS IS" basis, without warranty of any kind, and the |
13 | // Initial Developer hereby disclaims all such warranties, including without |
14 | // limitation, any warranties of merchantability, fitness for a particular |
15 | // purpose or non-infringement. Please see the License for the specific terms |
16 | // and conditions governing the rights and limitations under the License. |
17 | |
7fd59977 |
18 | #include <MoniTool_CaseData.ixx> |
19 | #include <Standard_Failure.hxx> |
20 | #include <TCollection_AsciiString.hxx> |
21 | #include <TopoDS_HShape.hxx> |
22 | #include <Geom_CartesianPoint.hxx> |
23 | #include <Geom2d_CartesianPoint.hxx> |
24 | |
25 | #include <TopAbs.hxx> |
26 | //#include <GeomTools.hxx> |
27 | #include <TCollection_HAsciiString.hxx> |
28 | #include <Geom2d_Curve.hxx> |
29 | #include <Geom_Curve.hxx> |
30 | #include <Geom_Surface.hxx> |
31 | #include <OSD_Timer.hxx> |
32 | |
33 | // definitions |
34 | #include <Dico_DictionaryOfInteger.hxx> |
35 | #include <Dico_DictionaryOfTransient.hxx> |
36 | |
37 | static Handle(Dico_DictionaryOfInteger)& defchecks() |
38 | { |
39 | static Handle(Dico_DictionaryOfInteger) defch; |
40 | if (defch.IsNull()) defch = new Dico_DictionaryOfInteger(); |
41 | return defch; |
42 | } |
43 | |
44 | static Handle(Dico_DictionaryOfTransient)& defmess() |
45 | { |
46 | static Handle(Dico_DictionaryOfTransient) defms; |
47 | if (defms.IsNull()) defms = new Dico_DictionaryOfTransient(); |
48 | return defms; |
49 | } |
50 | |
51 | |
52 | static Standard_Boolean stachr = Standard_False; |
53 | |
54 | //static OSD_Timer chrono; |
55 | // because merdouille link dynamique & perf, ne creer le static qu au 1er usage |
56 | static OSD_Timer& chrono() { |
57 | static OSD_Timer chr; |
58 | return chr; |
59 | } |
60 | |
61 | |
62 | MoniTool_CaseData::MoniTool_CaseData |
63 | (const Standard_CString caseid, const Standard_CString name) |
64 | : thesubst (0) , thecase (caseid) , thename (name) |
65 | { thecheck = DefCheck(caseid); } |
66 | |
67 | void MoniTool_CaseData::SetCaseId (const Standard_CString caseid) |
68 | { thecase.Clear(); thecase.AssignCat (caseid); thecheck = DefCheck(caseid); thesubst = 0; } |
69 | |
70 | void MoniTool_CaseData::SetName (const Standard_CString name) |
71 | { thename.Clear(); thename.AssignCat (name); thesubst = 0; } |
72 | |
73 | Standard_CString MoniTool_CaseData::CaseId () const |
74 | { return thecase.ToCString(); } |
75 | |
76 | Standard_CString MoniTool_CaseData::Name () const |
77 | { return thename.ToCString(); } |
78 | |
79 | |
80 | Standard_Boolean MoniTool_CaseData::IsCheck () const |
81 | { return (thecheck > 0); } |
82 | |
83 | Standard_Boolean MoniTool_CaseData::IsWarning () const |
84 | { return (thecheck == 1); } |
85 | |
86 | Standard_Boolean MoniTool_CaseData::IsFail () const |
87 | { return (thecheck == 2); } |
88 | |
89 | void MoniTool_CaseData::ResetCheck () |
90 | { thecheck = 0; } |
91 | |
92 | void MoniTool_CaseData::SetWarning () |
93 | { thecheck = 1; } |
94 | |
95 | void MoniTool_CaseData::SetFail () |
96 | { thecheck = 2; } |
97 | |
98 | // #### DATA #### |
99 | |
100 | void MoniTool_CaseData::SetChange () |
101 | { thesubst = -1; } |
102 | |
103 | void MoniTool_CaseData::SetReplace (const Standard_Integer num) |
104 | { thesubst = num; } |
105 | |
106 | void MoniTool_CaseData::AddData |
107 | (const Handle(Standard_Transient)& val, |
108 | const Standard_Integer kind, const Standard_CString name) |
109 | { |
110 | TCollection_AsciiString aname(name); |
111 | Standard_Integer subs = thesubst; |
112 | |
113 | // SetChange (calculer la position d apres Name) |
114 | if (thesubst < 0) { |
115 | if (name[0] != '\0') subs = NameNum (name); |
116 | } |
117 | // SetChange / SetReplace |
118 | if (subs > 0 && subs <= thedata.Length()) { |
119 | thedata.SetValue (subs,val); |
120 | thekind.SetValue (subs,kind); |
121 | if (aname.Length() > 0) thednam.SetValue (subs,aname); |
122 | // Ajout Normal |
123 | } else { |
124 | thedata.Append (val); |
125 | thekind.Append (kind); |
126 | thednam.Append (aname); |
127 | } |
128 | thesubst = 0; |
129 | } |
130 | |
131 | void MoniTool_CaseData::AddRaised (const Standard_CString name) |
132 | { AddData ( Standard_Failure::Caught(),1,name); } |
133 | |
134 | void MoniTool_CaseData::AddShape |
135 | (const TopoDS_Shape& sh, const Standard_CString name) |
136 | { AddData ( new TopoDS_HShape(sh), 4,name); } |
137 | |
138 | void MoniTool_CaseData::AddXYZ |
139 | (const gp_XYZ& aXYZ, const Standard_CString name) |
140 | { AddData ( new Geom_CartesianPoint (aXYZ), 5,name); } |
141 | |
142 | void MoniTool_CaseData::AddXY |
143 | (const gp_XY& aXY, const Standard_CString name) |
144 | { AddData ( new Geom2d_CartesianPoint (aXY), 6,name); } |
145 | |
146 | void MoniTool_CaseData::AddReal |
147 | (const Standard_Real val, const Standard_CString name) |
148 | { AddData ( new Geom2d_CartesianPoint (val,0.), 8,name); } |
149 | |
150 | void MoniTool_CaseData::AddReals |
151 | (const Standard_Real v1, const Standard_Real v2, const Standard_CString name) |
152 | { AddData ( new Geom2d_CartesianPoint (v1,v2), 7,name); } |
153 | |
154 | void MoniTool_CaseData::AddCPU |
155 | (const Standard_Real lastCPU, const Standard_Real curCPU, |
156 | const Standard_CString name) |
157 | { |
158 | Standard_Real cpu = curCPU; |
159 | if (cpu == 0.) { |
160 | Standard_Real sec; Standard_Integer i1,i2; |
161 | chrono().Show (sec,i1,i2,cpu); |
162 | } |
163 | cpu = cpu - lastCPU; |
164 | AddData ( new Geom2d_CartesianPoint (cpu,0.), 9,name); |
165 | } |
166 | |
167 | Standard_Real MoniTool_CaseData::GetCPU () const |
168 | { |
169 | if (!stachr) { chrono().Start(); stachr = Standard_True; } |
170 | Standard_Real sec,cpu; Standard_Integer i1,i2; |
171 | chrono().Show (sec,i1,i2,cpu); |
172 | return cpu; |
173 | } |
174 | |
175 | Standard_Boolean MoniTool_CaseData::LargeCPU |
176 | (const Standard_Real maxCPU, |
177 | const Standard_Real lastCPU, const Standard_Real curCPU) const |
178 | { |
179 | Standard_Real cpu = curCPU; |
180 | if (cpu == 0.) { |
181 | Standard_Real sec; Standard_Integer i1,i2; |
182 | chrono().Show (sec,i1,i2,cpu); |
183 | } |
184 | cpu = cpu - lastCPU; |
185 | return (cpu >= maxCPU); |
186 | } |
187 | |
188 | void MoniTool_CaseData::AddGeom |
189 | (const Handle(Standard_Transient)& val, const Standard_CString name) |
190 | { AddData (val,3,name); } |
191 | |
192 | void MoniTool_CaseData::AddEntity |
193 | (const Handle(Standard_Transient)& val, const Standard_CString name) |
194 | { AddData (val,2,name); } |
195 | |
196 | void MoniTool_CaseData::AddText |
197 | (const Standard_CString text, const Standard_CString name) |
198 | { AddData (new TCollection_HAsciiString(text),10,name); } |
199 | |
200 | void MoniTool_CaseData::AddInteger |
201 | (const Standard_Integer val, const Standard_CString name) |
202 | { |
203 | Standard_Real rval = val; |
204 | AddData ( new Geom2d_CartesianPoint (rval,0.), 11,name); |
205 | } |
206 | |
207 | void MoniTool_CaseData::AddAny |
208 | (const Handle(Standard_Transient)& val, const Standard_CString name) |
209 | { AddData (val,0,name); } |
210 | |
211 | |
212 | void MoniTool_CaseData::RemoveData (const Standard_Integer num) |
213 | { |
214 | if (num < 1 || num > thedata.Length()) return; |
215 | thedata.Remove(num); thekind.Remove(num); thednam.Remove(num); |
216 | } |
217 | |
218 | // #### INTERROGATIONS #### |
219 | |
220 | Standard_Integer MoniTool_CaseData::NbData () const |
221 | { return thedata.Length(); } |
222 | |
223 | Handle(Standard_Transient) MoniTool_CaseData::Data |
224 | (const Standard_Integer nd) const |
225 | { |
226 | Handle(Standard_Transient) val; |
227 | if (nd < 1 || nd > thedata.Length()) return val; |
228 | return thedata (nd); |
229 | } |
230 | |
231 | Standard_Boolean MoniTool_CaseData::GetData |
232 | (const Standard_Integer nd, const Handle(Standard_Type)& type, |
233 | Handle(Standard_Transient)& val) const |
234 | { |
235 | if (type.IsNull()) return Standard_False; |
236 | if (nd < 1 || nd > thedata.Length()) return Standard_False; |
237 | Handle(Standard_Transient) v = thedata (nd); |
238 | if (v.IsNull()) return Standard_False; |
239 | if (!v->IsKind(type)) return Standard_False; |
240 | val = v; |
241 | return Standard_True; |
242 | } |
243 | |
244 | Standard_Integer MoniTool_CaseData::Kind |
245 | (const Standard_Integer nd) const |
246 | { |
247 | if (nd < 1 || nd > thekind.Length()) return 0; |
248 | return thekind (nd); |
249 | } |
250 | |
251 | |
252 | static const TCollection_AsciiString& nulname () |
253 | { |
254 | static TCollection_AsciiString nuln; |
255 | return nuln; |
256 | } |
257 | |
258 | const TCollection_AsciiString& MoniTool_CaseData::Name |
259 | (const Standard_Integer nd) const |
260 | { |
261 | if (nd < 1 || nd > thednam.Length()) return nulname(); |
262 | return thednam(nd); |
263 | } |
264 | |
265 | static Standard_Integer NameKind (const Standard_CString name) |
266 | { |
267 | char n0 = name[0]; |
268 | if (n0 == 'A' && name[1] == 'N' && name[2] == 'Y' && name[3] == '\0') return 0; |
269 | if (n0 == 'E') { |
270 | if (name[1] == 'X' && name[2] == '\0') return 1; |
271 | if (name[1] == 'N' && name[2] == '\0') return 2; |
272 | return 0; |
273 | } |
274 | if (n0 == 'G' && name[1] == '\0') return 3; |
275 | if (n0 == 'S' && name[1] == 'H' && name[2] == '\0') return 4; |
276 | if (n0 == 'X' && name[1] == 'Y') { |
277 | if (name[2] == 'Z' && name[3] == '\0') return 5; |
278 | if (name[2] == '\0') return 6; |
279 | } |
280 | if (n0 == 'U' && name[1] == 'V' && name[2] == '\0') return 6; |
281 | if (n0 == 'R') { |
282 | if (name[1] == '\0') return 8; |
283 | if (name[1] == 'R' && name[2] == '\0') return 7; |
284 | } |
285 | if (n0 == 'C' && name[1] == 'P' && name[2] == 'U' && name[3] == '\0') return 9; |
286 | if (n0 == 'T' && name[1] == '\0') return 10; |
287 | if (n0 == 'I' && name[1] == '\0') return 11; |
288 | |
289 | return 0; |
290 | } |
291 | |
292 | static Standard_Integer NameRank (const Standard_CString name) |
293 | { |
294 | for (Standard_Integer i = 0; name[i] != '\0'; i ++) { |
295 | if (name[i] == ':' && name[i+1] != '\0') return atoi(&name[i+1]); |
296 | } |
297 | return 1; |
298 | } |
299 | |
300 | Standard_Integer MoniTool_CaseData::NameNum |
301 | (const Standard_CString name) const |
302 | { |
303 | if (!name || name[0] == '\0') return 0; |
304 | Standard_Integer nd, nn = 0, nb = NbData(); |
305 | for (nd = 1; nd <= nb; nd ++) { |
306 | if (thednam(nd).IsEqual(name)) return nd; |
307 | } |
308 | |
309 | Standard_Integer kind = NameKind (name); |
310 | if (kind < 0) return 0; |
311 | Standard_Integer num = NameRank (name); |
312 | |
313 | for (nd = 1; nd <= nb; nd ++) { |
314 | if (thekind(nd) == kind) { |
315 | nn ++; |
316 | if (nn == num) return nd; |
317 | } |
318 | } |
319 | return 0; |
320 | } |
321 | |
322 | |
323 | // #### RETOUR DES VALEURS #### |
324 | |
325 | TopoDS_Shape MoniTool_CaseData::Shape |
326 | (const Standard_Integer nd) const |
327 | { |
328 | TopoDS_Shape sh; |
329 | Handle(TopoDS_HShape) hs = Handle(TopoDS_HShape)::DownCast (Data(nd)); |
330 | if (!hs.IsNull()) sh = hs->Shape(); |
331 | return sh; |
332 | } |
333 | |
334 | Standard_Boolean MoniTool_CaseData::XYZ |
335 | (const Standard_Integer nd, gp_XYZ& val) const |
336 | { |
337 | Handle(Geom_CartesianPoint) p = Handle(Geom_CartesianPoint)::DownCast(Data(nd)); |
338 | if (p.IsNull()) return Standard_False; |
339 | val = p->Pnt().XYZ(); |
340 | return Standard_True; |
341 | } |
342 | |
343 | Standard_Boolean MoniTool_CaseData::XY |
344 | (const Standard_Integer nd, gp_XY& val) const |
345 | { |
346 | Handle(Geom2d_CartesianPoint) p = Handle(Geom2d_CartesianPoint)::DownCast(Data(nd)); |
347 | if (p.IsNull()) return Standard_False; |
348 | val = p->Pnt2d().XY(); |
349 | return Standard_True; |
350 | } |
351 | |
352 | Standard_Boolean MoniTool_CaseData::Reals |
353 | (const Standard_Integer nd, |
354 | Standard_Real& v1, Standard_Real& v2) const |
355 | { |
356 | Handle(Geom2d_CartesianPoint) p = Handle(Geom2d_CartesianPoint)::DownCast(Data(nd)); |
357 | if (p.IsNull()) return Standard_False; |
358 | v1 = p->X(); v2 = p->Y(); |
359 | return Standard_True; |
360 | } |
361 | |
362 | |
363 | Standard_Boolean MoniTool_CaseData::Real |
364 | (const Standard_Integer nd, |
365 | Standard_Real& val) const |
366 | { |
367 | Handle(Geom2d_CartesianPoint) p = Handle(Geom2d_CartesianPoint)::DownCast(Data(nd)); |
368 | if (p.IsNull()) return Standard_False; |
369 | val = p->X(); |
370 | return Standard_True; |
371 | } |
372 | |
373 | Standard_Boolean MoniTool_CaseData::Text |
374 | (const Standard_Integer nd, |
375 | Standard_CString& text) const |
376 | { |
377 | Handle(TCollection_HAsciiString) t = Handle(TCollection_HAsciiString)::DownCast(Data(nd)); |
378 | if (t.IsNull()) return Standard_False; |
379 | text = t->ToCString(); |
380 | return Standard_True; |
381 | } |
382 | |
383 | Standard_Boolean MoniTool_CaseData::Integer |
384 | (const Standard_Integer nd, |
385 | Standard_Integer& val) const |
386 | { |
387 | Handle(Geom2d_CartesianPoint) p = Handle(Geom2d_CartesianPoint)::DownCast(Data(nd)); |
388 | // if (p.IsNull()) return Standard_False; |
389 | if (thekind(nd) != 11) return Standard_False; |
390 | Standard_Real rval = p->X(); |
391 | val = (Standard_Integer)rval; |
392 | return Standard_True; |
393 | } |
394 | |
395 | |
396 | // #### MESSAGES ET DEFINITIONS #### |
397 | |
398 | Message_Msg MoniTool_CaseData::Msg () const |
399 | { |
400 | Standard_CString defm = DefMsg (thecase.ToCString()); |
401 | |
402 | // A REPRENDRE COMPLETEMENT ! Il faut analyser defm = mescode + variables |
403 | Message_Msg mess; |
404 | mess.Set (defm); |
405 | |
406 | return mess; |
407 | } |
408 | |
409 | |
410 | void MoniTool_CaseData::SetDefWarning (const Standard_CString acode) |
411 | { defchecks()->SetItem (acode,1); } |
412 | |
413 | void MoniTool_CaseData::SetDefFail (const Standard_CString acode) |
414 | { defchecks()->SetItem (acode,2); } |
415 | |
416 | Standard_Integer MoniTool_CaseData::DefCheck (const Standard_CString acode) |
417 | { |
418 | Standard_Integer val; |
419 | if (!defchecks()->GetItem (acode,val)) val = 0; |
420 | return val; |
421 | } |
422 | |
423 | |
424 | void MoniTool_CaseData::SetDefMsg |
425 | (const Standard_CString casecode, const Standard_CString mesdef) |
426 | { |
427 | Handle(TCollection_HAsciiString) str = new TCollection_HAsciiString (mesdef); |
428 | defmess()->SetItem (casecode,str); |
429 | } |
430 | |
431 | Standard_CString MoniTool_CaseData::DefMsg (const Standard_CString casecode) |
432 | { |
433 | //Standard_CString mesd; |
434 | Handle(TCollection_HAsciiString) str; |
435 | if (!defmess()->GetItem (casecode,str)) return ""; |
436 | if (str.IsNull()) return ""; |
437 | return str->ToCString(); |
438 | } |