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