0022627: Change OCCT memory management defaults
[occt.git] / src / Graphic3d / Graphic3d_StructureManager.cxx
1
2 #define XTRACE
3
4 // File         Graphic3d_StructureManager.cxx
5 // Created      Mars 1992
6 // Author       NW,JPB,CAL
7
8 //-Copyright    MatraDatavision 1991,1992
9
10 //-Version      
11
12 //-Design       Declaration of variables specific to managers
13
14 //-Warning      Manager manages a set of structures
15
16 //-References   
17
18 //-Language     C++ 2.0
19
20 //-Declarations
21
22 // for the class
23 #include <Graphic3d_StructureManager.ixx>
24 #include <Graphic3d_StructureManager.pxx>
25 static Standard_Boolean Initialisation = Standard_True;
26 static int StructureManager_ArrayId[StructureManager_MAX];
27 static Standard_Integer StructureManager_CurrentId = 0;
28
29 #include <Graphic3d_Structure.pxx>
30 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
31
32 //-Aliases
33
34 //-Global data definitions
35
36 //      -- l'identifieur du manager
37 //      MyId                    :       Standard_Integer;
38
39 //      -- le mode de mise a jour de l'affichage
40 //      MyUpdateMode            :       TypeOfUpdate;
41
42 //      -- les differents contextes de primitives
43 //      MyAspectLine3d          :       AspectLine3d;
44 //      MyAspectText3d          :       AspectText3d;
45 //      MyAspectMarker3d        :       AspectMarker3d;
46 //      MyAspectFillArea3d      :       AspectFillArea3d;
47
48 //      -- les structures affichees
49 //      MyDisplayedStructure    :       SequenceOfStructure;
50
51 //      -- les structures mises en evidence
52 //      MyHighlightedStructure  :       SequenceOfStructure;
53
54 //      -- les structures visibles
55 //      MyVisibleStructure      :       SequenceOfStructure;
56
57 //      -- les structures detectables
58 //      MyPickStructure         :       SequenceOfStructure;
59
60 //      -- le generateur d'identificateurs de structures
61 //      MyStructGenId           :       GenId;
62
63 //-Constructors
64
65 Graphic3d_StructureManager::Graphic3d_StructureManager (const Handle(Aspect_GraphicDevice)& aDevice):
66 MyDisplayedStructure (),
67 MyHighlightedStructure (),
68 MyVisibleStructure (),
69 MyPickStructure () {
70
71 Standard_Real Coef;
72 Standard_Integer i;
73 Standard_Boolean NotFound       = Standard_True;
74 Standard_Integer Limit  = Graphic3d_StructureManager::Limit ();
75
76         /* Initialize PHIGS and start up */
77         if (Initialisation) {
78
79                 Initialisation = Standard_False;
80                 /* table to manage IDs of StructureManager */
81                 for (i=1; i<=Limit; i++) StructureManager_ArrayId[i]    = 0;
82
83                 StructureManager_CurrentId      = 1;
84                 StructureManager_ArrayId[1]     = 1;
85
86         }
87         else {
88                 for (i=1; i<=Limit && NotFound; i++)
89                         if (StructureManager_ArrayId[i] == 0) {
90                                 NotFound        = Standard_False;
91                                 StructureManager_CurrentId      = i;
92                                 StructureManager_ArrayId[i]     = 1;
93                         }
94
95                 if (NotFound)
96                         Graphic3d_InitialisationError::Raise
97                                         ("Too many ViewManagers are defined");
98         }
99
100         Coef            = (Structure_IDMIN+Structure_IDMAX)/Limit;
101         Aspect_GenId theGenId(
102           Standard_Integer (Structure_IDMIN+Coef*(StructureManager_CurrentId-1)),
103           Standard_Integer (Structure_IDMIN+Coef*StructureManager_CurrentId-1));
104         MyStructGenId   = theGenId;
105
106         MyId                    = StructureManager_CurrentId;
107
108         MyAspectLine3d          = new Graphic3d_AspectLine3d ();
109         MyAspectText3d          = new Graphic3d_AspectText3d ();
110         MyAspectMarker3d        = new Graphic3d_AspectMarker3d ();
111         MyAspectFillArea3d      = new Graphic3d_AspectFillArea3d ();
112
113         MyUpdateMode            = Aspect_TOU_WAIT;
114         MyGraphicDevice         = aDevice;
115
116 }
117
118 //-Destructors
119
120 void Graphic3d_StructureManager::Destroy () {
121
122 #ifdef TRACE
123         cout << "Graphic3d_StructureManager::Destroy (" << MyId << ")\n";
124         cout << flush;
125 #endif
126
127         MyDisplayedStructure.Clear ();
128         MyHighlightedStructure.Clear ();
129         MyVisibleStructure.Clear ();
130         MyPickStructure.Clear ();
131         StructureManager_ArrayId[MyId]  = 0;
132
133 }
134
135 //-Methods, in order
136
137 void Graphic3d_StructureManager::SetUpdateMode (const Aspect_TypeOfUpdate AType) {
138
139         MyUpdateMode    = AType;
140
141 }
142
143 Aspect_TypeOfUpdate Graphic3d_StructureManager::UpdateMode () const {
144
145         return (MyUpdateMode);
146
147 }
148
149 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& CTX) {
150
151         MyAspectLine3d          = CTX;
152
153 }
154
155 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& CTX) {
156
157         MyAspectFillArea3d      = CTX;
158
159 }
160
161 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& CTX) {
162
163         MyAspectText3d          = CTX;
164
165 }
166
167 void Graphic3d_StructureManager::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& CTX) {
168
169         MyAspectMarker3d        = CTX;
170
171 }
172
173 void Graphic3d_StructureManager::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& CTXL, Handle(Graphic3d_AspectText3d)& CTXT, Handle(Graphic3d_AspectMarker3d)& CTXM, Handle(Graphic3d_AspectFillArea3d)& CTXF) const {
174
175         CTXL    = MyAspectLine3d;
176         CTXT    = MyAspectText3d;
177         CTXM    = MyAspectMarker3d;
178         CTXF    = MyAspectFillArea3d;
179
180 }
181
182 Handle(Graphic3d_AspectLine3d) Graphic3d_StructureManager::Line3dAspect () const {
183
184         return (MyAspectLine3d);
185
186 }
187
188 Handle(Graphic3d_AspectText3d) Graphic3d_StructureManager::Text3dAspect () const {
189
190         return (MyAspectText3d);
191
192 }
193
194 Handle(Graphic3d_AspectMarker3d) Graphic3d_StructureManager::Marker3dAspect () const {
195
196         return (MyAspectMarker3d);
197
198 }
199
200 Handle(Graphic3d_AspectFillArea3d) Graphic3d_StructureManager::FillArea3dAspect () const {
201
202         return (MyAspectFillArea3d);
203
204 }
205
206 void Graphic3d_StructureManager::Remove (const Standard_Integer AnId) {
207
208 #ifdef TRACE
209         cout << "Graphic3d_StructureManager::Remove " << AnId << "\n" << flush;
210 #endif
211
212         MyStructGenId.Free (AnId);
213
214 }
215
216 void Graphic3d_StructureManager::Visible (const Handle(Graphic3d_Structure)& AStructure) {
217
218   MyVisibleStructure.Add(AStructure);
219
220 }
221
222 void Graphic3d_StructureManager::Invisible (const Handle(Graphic3d_Structure)& AStructure) {
223
224   MyVisibleStructure.Remove(AStructure);
225  
226 }
227
228 void Graphic3d_StructureManager::Detectable (const Handle(Graphic3d_Structure)& AStructure) {
229
230   MyPickStructure.Add(AStructure);
231
232 }
233
234 void Graphic3d_StructureManager::Undetectable (const Handle(Graphic3d_Structure)& AStructure) {
235
236   MyPickStructure.Remove(AStructure);
237  
238 }
239
240 void Graphic3d_StructureManager::DisplayedStructures (Graphic3d_MapOfStructure& SG) const {
241
242   SG.Assign(MyDisplayedStructure);
243
244   //JMBStandard_Integer Length  = MyDisplayedStructure.Length ();
245
246   //JMBfor (Standard_Integer i=1; i<=Length; i++)
247   //JMB SG.Add (MyDisplayedStructure.Value (i));
248
249 }
250
251 Standard_Integer Graphic3d_StructureManager::NumberOfDisplayedStructures () const {
252
253 Standard_Integer Length = MyDisplayedStructure.Extent ();
254
255         return (Length);
256
257 }
258
259 //Handle(Graphic3d_Structure) Graphic3d_StructureManager::DisplayedStructure (const Standard_Integer AnIndex) const {
260
261 //return (MyDisplayedStructure.Value (AnIndex));
262
263 //}
264
265 void Graphic3d_StructureManager::HighlightedStructures (Graphic3d_MapOfStructure& SG) const {
266
267   SG.Assign(MyHighlightedStructure);
268
269 }
270
271 void Graphic3d_StructureManager::PickStructures (Graphic3d_MapOfStructure& SG) const {
272
273   SG.Assign(MyPickStructure);
274
275 }
276
277 void Graphic3d_StructureManager::VisibleStructures (Graphic3d_MapOfStructure& SG) const {
278
279   SG.Assign(MyVisibleStructure);
280
281
282 }
283
284 void Graphic3d_StructureManager::MinMaxValues (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
285
286 Standard_Boolean Flag = Standard_True;
287 Standard_Real Xm, Ym, Zm, XM, YM, ZM, RL, RF;
288
289         RL = RealLast ();
290         RF = RealFirst ();
291
292         XMin = YMin = ZMin = RL;
293         XMax = YMax = ZMax = RF;
294
295         Graphic3d_MapIteratorOfMapOfStructure it(MyDisplayedStructure);
296         for (; it.More(); it.Next()) {
297           Handle(Graphic3d_Structure) SG = it.Key();
298           if (! (SG->IsEmpty() || SG->IsInfinite ())) {
299             SG->MinMaxValues (Xm, Ym, Zm, XM, YM, ZM);
300             if (Xm < XMin) XMin = Xm;
301             if (Ym < YMin) YMin = Ym;
302             if (Zm < ZMin) ZMin = Zm;
303             if (XM > XMax) XMax = XM;
304             if (YM > YMax) YMax = YM;
305             if (ZM > ZMax) ZMax = ZM;
306             Flag = Standard_False;
307           }
308         }
309
310         // If all structures are empty or infinite
311         if (Flag) {
312           XMin = YMin = ZMin = RF;
313           XMax = YMax = ZMax = RL;
314         }
315  
316 }
317  
318 Standard_Integer Graphic3d_StructureManager::NewIdentification () {
319
320 Standard_Integer Id     = MyStructGenId.Next ();
321
322 #ifdef TRACE
323         cout << "Graphic3d_StructureManager::NewIdentification " << Id << "\n";
324         cout << flush;
325 #endif
326
327         return Id;
328
329 }
330
331 Handle(Graphic3d_Structure) Graphic3d_StructureManager::Identification (const Standard_Integer AId) const {
332
333 //  Standard_Integer ind=0;
334   Standard_Boolean notfound     = Standard_True;
335
336   Handle(Graphic3d_Structure) StructNull;
337  
338   Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
339   
340   Handle(Graphic3d_Structure) SGfound;
341
342   for (; it.More() && notfound; it.Next()) {
343     Handle(Graphic3d_Structure) SG = it.Key();
344     if ( SG->Identification () == AId) {
345       notfound  = Standard_False;
346       SGfound = SG;
347     }
348   }
349
350
351   if (notfound)
352     return (StructNull);
353   else
354     return (SGfound);
355
356 }
357
358 Standard_Integer Graphic3d_StructureManager::Identification () const {
359  
360         return (MyId);
361  
362 }
363
364 Standard_Integer Graphic3d_StructureManager::Limit () {
365
366         return (StructureManager_MAX);
367
368 }
369
370 Standard_Integer Graphic3d_StructureManager::CurrentId () {
371
372         return (StructureManager_CurrentId);
373
374 }
375
376 Handle(Aspect_GraphicDevice) Graphic3d_StructureManager::GraphicDevice () const {
377
378         return (MyGraphicDevice);
379
380 }