0031424: Visualization - stop using Prs3d_Drawer::HLRAngle() parameter
[occt.git] / src / Prs3d / Prs3d_Drawer.cxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <Prs3d_Drawer.hxx>
16
17 #include <Graphic3d_AspectFillArea3d.hxx>
18 #include <Graphic3d_AspectMarker3d.hxx>
19 #include <Graphic3d_AspectText3d.hxx>
20 #include <Prs3d_ArrowAspect.hxx>
21 #include <Prs3d_DatumAspect.hxx>
22 #include <Prs3d_DimensionAspect.hxx>
23 #include <Prs3d_IsoAspect.hxx>
24 #include <Prs3d_LineAspect.hxx>
25 #include <Prs3d_PlaneAspect.hxx>
26 #include <Prs3d_PointAspect.hxx>
27 #include <Prs3d_ShadingAspect.hxx>
28 #include <Prs3d_TextAspect.hxx>
29 #include <Standard_Dump.hxx>
30
31 IMPLEMENT_STANDARD_RTTIEXT(Prs3d_Drawer, Graphic3d_PresentationAttributes)
32
33 namespace
34 {
35   static const Quantity_NameOfColor THE_DEF_COLOR_FreeBoundary   = Quantity_NOC_GREEN;
36   static const Quantity_NameOfColor THE_DEF_COLOR_UnFreeBoundary = Quantity_NOC_YELLOW;
37   static const Quantity_NameOfColor THE_DEF_COLOR_FaceBoundary   = Quantity_NOC_BLACK;
38   static const Quantity_NameOfColor THE_DEF_COLOR_Wire           = Quantity_NOC_RED;
39   static const Quantity_NameOfColor THE_DEF_COLOR_Line           = Quantity_NOC_YELLOW;
40   static const Quantity_NameOfColor THE_DEF_COLOR_SeenLine       = Quantity_NOC_YELLOW;
41   static const Quantity_NameOfColor THE_DEF_COLOR_HiddenLine     = Quantity_NOC_YELLOW;
42   static const Quantity_NameOfColor THE_DEF_COLOR_Vector         = Quantity_NOC_SKYBLUE;
43   static const Quantity_NameOfColor THE_DEF_COLOR_Section        = Quantity_NOC_ORANGE;
44 }
45
46 // =======================================================================
47 // function : Prs3d_Drawer
48 // purpose  :
49 // =======================================================================
50 Prs3d_Drawer::Prs3d_Drawer()
51 : myNbPoints                      (30),
52   myHasOwnNbPoints                (Standard_False),
53   myMaximalParameterValue         (500000.),
54   myHasOwnMaximalParameterValue   (Standard_False),
55   myChordialDeviation             (0.0001),
56   myHasOwnChordialDeviation       (Standard_False),
57   myTypeOfDeflection              (Aspect_TOD_RELATIVE),
58   myHasOwnTypeOfDeflection        (Standard_False),
59   myTypeOfHLR                     (Prs3d_TOH_NotSet),
60   myDeviationCoefficient          (0.001),
61   myHasOwnDeviationCoefficient    (Standard_False),
62   myDeviationAngle                (20.0 * M_PI / 180.0),
63   myHasOwnDeviationAngle          (Standard_False),
64   myIsoOnPlane                    (Standard_False),
65   myHasOwnIsoOnPlane              (Standard_False),
66   myIsoOnTriangulation            (Standard_False),
67   myHasOwnIsoOnTriangulation      (Standard_False),
68   myIsAutoTriangulated            (Standard_True),
69   myHasOwnIsAutoTriangulated      (Standard_False),
70
71   myHasOwnUIsoAspect          (Standard_False),
72   myHasOwnVIsoAspect          (Standard_False),
73   myHasOwnWireAspect          (Standard_False),
74   myWireDraw                  (Standard_True),
75   myHasOwnWireDraw            (Standard_False),
76   myHasOwnPointAspect         (Standard_False),
77   myHasOwnLineAspect          (Standard_False),
78   myHasOwnTextAspect          (Standard_False),
79   myHasOwnShadingAspect       (Standard_False),
80   myHasOwnPlaneAspect         (Standard_False),
81   myHasOwnSeenLineAspect      (Standard_False),
82   myHasOwnArrowAspect         (Standard_False),
83   myLineArrowDraw             (Standard_False),
84   myHasOwnLineArrowDraw       (Standard_False),
85   myHasOwnHiddenLineAspect    (Standard_False),
86   myDrawHiddenLine            (Standard_False),
87   myHasOwnDrawHiddenLine      (Standard_False),
88   myHasOwnVectorAspect        (Standard_False),
89   myVertexDrawMode            (Prs3d_VDM_Inherited),
90   myHasOwnDatumAspect         (Standard_False),
91   myHasOwnSectionAspect       (Standard_False),
92
93   myHasOwnFreeBoundaryAspect   (Standard_False),
94   myFreeBoundaryDraw           (Standard_True),
95   myHasOwnFreeBoundaryDraw     (Standard_False),
96   myHasOwnUnFreeBoundaryAspect (Standard_False),
97   myUnFreeBoundaryDraw         (Standard_True),
98   myHasOwnUnFreeBoundaryDraw   (Standard_False),
99   myFaceBoundaryUpperContinuity(-1),
100   myHasOwnFaceBoundaryAspect   (Standard_False),
101   myFaceBoundaryDraw           (Standard_False),
102   myHasOwnFaceBoundaryDraw     (Standard_False),
103
104   myHasOwnDimensionAspect       (Standard_False),
105   myHasOwnDimLengthModelUnits   (Standard_False),
106   myHasOwnDimAngleModelUnits    (Standard_False),
107   myHasOwnDimLengthDisplayUnits (Standard_False),
108   myHasOwnDimAngleDisplayUnits  (Standard_False)
109 {
110   myDimensionModelUnits.SetLengthUnits ("m");
111   myDimensionModelUnits.SetAngleUnits ("rad");
112   myDimensionDisplayUnits.SetLengthUnits ("m");
113   myDimensionDisplayUnits.SetAngleUnits ("deg");
114 }
115
116 // =======================================================================
117 // function : SetTypeOfDeflection
118 // purpose  :
119 // =======================================================================
120
121 void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
122 {
123   myHasOwnTypeOfDeflection = Standard_True;
124   myTypeOfDeflection       = theTypeOfDeflection;
125 }
126
127 // =======================================================================
128 // function : SetMaximalChordialDeviation
129 // purpose  :
130 // =======================================================================
131
132 void Prs3d_Drawer::SetMaximalChordialDeviation (const Standard_Real theChordialDeviation)
133 {
134   myHasOwnChordialDeviation = Standard_True;
135   myChordialDeviation       = theChordialDeviation;
136 }
137
138 // =======================================================================
139 // function : SetTypeOfHLR
140 // purpose  : set type of HLR algorithm
141 // =======================================================================
142
143 void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
144 {
145   myTypeOfHLR = theTypeOfHLR;
146 }
147
148 // =======================================================================
149 // function : TypeOfHLR
150 // purpose  : gets type of HLR algorithm
151 // =======================================================================
152
153 Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
154 {
155   if (!HasOwnTypeOfHLR())
156   {
157     if (!myLink.IsNull())
158     {
159       return myLink->TypeOfHLR();
160     }
161     // Prs3d_TOH_PolyAlgo is default value for this setting.
162     myTypeOfHLR = Prs3d_TOH_PolyAlgo;
163   }
164   return myTypeOfHLR;
165 }
166
167 // =======================================================================
168 // function : SetIsoOnTriangulation
169 // purpose  :
170 // =======================================================================
171 void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
172 {
173   myHasOwnIsoOnTriangulation = Standard_True;
174   myIsoOnTriangulation = theToEnable;
175 }
176
177 // =======================================================================
178 // function : SetMaximalParameterValue
179 // purpose  :
180 // =======================================================================
181
182 void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
183 {
184   myHasOwnMaximalParameterValue = Standard_True;
185   myMaximalParameterValue       = theValue;
186 }
187
188 // =======================================================================
189 // function : SetIsoOnPlane
190 // purpose  :
191 // =======================================================================
192
193 void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
194 {
195   myHasOwnIsoOnPlane = Standard_True;
196   myIsoOnPlane       = theIsEnabled;
197 }
198
199 // =======================================================================
200 // function : SetDiscretisation
201 // purpose  :
202 // =======================================================================
203
204 void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue) 
205 {
206   myHasOwnNbPoints = Standard_True;
207   myNbPoints       = theValue;
208 }
209
210 //=======================================================================
211 //function : SetDeviationCoefficient
212 //purpose  : 
213 //=======================================================================
214
215 void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
216 {
217   myPreviousDeviationCoefficient = DeviationCoefficient();
218   myDeviationCoefficient         = theCoefficient;
219   myHasOwnDeviationCoefficient   = Standard_True;
220 }
221
222 //=======================================================================
223 //function : SetDeviationAngle
224 //purpose  : 
225 //=======================================================================
226
227 void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
228 {
229   myPreviousDeviationAngle = DeviationAngle();
230   myDeviationAngle         = theAngle;
231   myHasOwnDeviationAngle   = Standard_True;
232 }
233
234 // =======================================================================
235 // function : SetAutoTriangulation
236 // purpose  :
237 // =======================================================================
238
239 void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
240 {
241   myHasOwnIsAutoTriangulated = Standard_True;
242   myIsAutoTriangulated       = theIsEnabled;
243 }
244
245 // =======================================================================
246 // function : FreeBoundaryAspect
247 // purpose  :
248 // =======================================================================
249
250 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
251 {
252   if (!HasOwnFreeBoundaryAspect())
253   {
254     if (!myLink.IsNull())
255     {
256       return myLink->FreeBoundaryAspect();
257     }
258     if (myFreeBoundaryAspect.IsNull())
259     {
260       myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
261     }
262   }
263   return myFreeBoundaryAspect;
264 }
265
266 // =======================================================================
267 // function : FreeBoundaryAspect
268 // purpose  :
269 // =======================================================================
270
271 void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
272 {
273   myFreeBoundaryAspect = theAspect;
274   myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
275 }
276
277 // =======================================================================
278 // function : SetFreeBoundaryDraw
279 // purpose  :
280 // =======================================================================
281
282 void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
283 {
284   myHasOwnFreeBoundaryDraw = Standard_True;
285   myFreeBoundaryDraw       = theIsEnabled;
286 }
287
288 // =======================================================================
289 // function : UnFreeBoundaryAspect
290 // purpose  :
291 // =======================================================================
292
293 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
294 {
295   if (!HasOwnUnFreeBoundaryAspect())
296   {
297     if (!myLink.IsNull())
298     {
299       return myLink->UnFreeBoundaryAspect();
300     }
301     if (myUnFreeBoundaryAspect.IsNull())
302     {
303       myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
304     }
305   }
306   return myUnFreeBoundaryAspect;
307 }
308
309 // =======================================================================
310 // function : SetUnFreeBoundaryAspect
311 // purpose  :
312 // =======================================================================
313
314 void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
315 {
316   myUnFreeBoundaryAspect = theAspect;
317   myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
318 }
319
320 // =======================================================================
321 // function : SetUnFreeBoundaryDraw
322 // purpose  :
323 // =======================================================================
324
325 void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
326 {
327   myHasOwnUnFreeBoundaryDraw = Standard_True;
328   myUnFreeBoundaryDraw       = theIsEnabled;
329 }
330
331 // =======================================================================
332 // function : FaceBoundaryAspect
333 // purpose  :
334 // =======================================================================
335
336 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
337 {
338   if (!HasOwnFaceBoundaryAspect())
339   {
340     if (!myLink.IsNull())
341     {
342       return myLink->FaceBoundaryAspect();
343     }
344     if (myFaceBoundaryAspect.IsNull())
345     {
346       myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
347     }
348   }
349   return myFaceBoundaryAspect;
350 }
351
352 // =======================================================================
353 // function : SetFaceBoundaryAspect
354 // purpose  :
355 // =======================================================================
356
357 void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
358 {
359   myFaceBoundaryAspect = theAspect;
360   myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
361 }
362
363 // =======================================================================
364 // function : SetFaceBoundaryDraw
365 // purpose  :
366 // =======================================================================
367
368 void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
369 {
370   myHasOwnFaceBoundaryDraw = Standard_True;
371   myFaceBoundaryDraw       = theIsEnabled;
372 }
373
374 // =======================================================================
375 // function : DimensionAspect
376 // purpose  :
377 // =======================================================================
378
379 const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
380 {
381   if (!HasOwnDimensionAspect())
382   {
383     if (!myLink.IsNull())
384     {
385       return myLink->DimensionAspect();
386     }
387     if (myDimensionAspect.IsNull())
388     {
389       myDimensionAspect = new Prs3d_DimensionAspect;
390     }
391   }
392   return myDimensionAspect;
393 }
394
395 // =======================================================================
396 // function : SetDimensionAspect
397 // purpose  :
398 // =======================================================================
399
400 void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
401 {
402   myDimensionAspect = theAspect;
403   myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
404 }
405
406 // =======================================================================
407 // function : SetDimLengthModelUnits
408 // purpose  :
409 // =======================================================================
410
411 void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
412 {
413   myHasOwnDimLengthModelUnits = Standard_True;
414   myDimensionModelUnits.SetLengthUnits (theUnits);
415 }
416
417 // =======================================================================
418 // function : SetDimAngleModelUnits
419 // purpose  :
420 // =======================================================================
421
422 void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
423 {
424   myHasOwnDimAngleModelUnits = Standard_True;
425   myDimensionModelUnits.SetAngleUnits (theUnits);
426 }
427
428 // =======================================================================
429 // function : SetDimLengthDisplayUnits
430 // purpose  :
431 // =======================================================================
432
433 void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
434 {
435   myHasOwnDimLengthDisplayUnits = Standard_True;
436   myDimensionDisplayUnits.SetLengthUnits (theUnits);
437 }
438
439 // =======================================================================
440 // function : SetDimAngleDisplayUnits
441 // purpose  :
442 // =======================================================================
443
444 void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
445 {
446   myHasOwnDimAngleDisplayUnits = Standard_True;
447   myDimensionDisplayUnits.SetAngleUnits (theUnits);
448 }
449
450 // =======================================================================
451 // function : UIsoAspect
452 // purpose  :
453 // =======================================================================
454
455 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
456 {
457   if (!HasOwnUIsoAspect())
458   {
459     if (!myLink.IsNull())
460     {
461       return myLink->UIsoAspect();
462     }
463     if (myUIsoAspect.IsNull())
464     {
465       myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
466     }
467   }
468   return myUIsoAspect;
469 }
470
471 // =======================================================================
472 // function : SetUIsoAspect
473 // purpose  :
474 // =======================================================================
475
476 void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
477 {
478   myUIsoAspect = theAspect;
479   myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
480 }
481
482 // =======================================================================
483 // function : VIsoAspect
484 // purpose  :
485 // =======================================================================
486
487 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
488 {
489   if (!HasOwnVIsoAspect())
490   {
491     if (!myLink.IsNull())
492     {
493       return myLink->VIsoAspect();
494     }
495     if (myVIsoAspect.IsNull())
496     {
497       myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
498     }
499   }
500   return myVIsoAspect;
501 }
502
503 // =======================================================================
504 // function : SetVIsoAspect
505 // purpose  :
506 // =======================================================================
507
508 void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
509 {
510   myVIsoAspect = theAspect;
511   myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
512 }
513
514 // =======================================================================
515 // function : WireAspect
516 // purpose  :
517 // =======================================================================
518
519 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
520 {
521   if (!HasOwnWireAspect())
522   {
523     if (!myLink.IsNull())
524     {
525       return myLink->WireAspect();
526     }
527     if (myWireAspect.IsNull())
528     {
529       myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
530     }
531   }
532   return myWireAspect;
533 }
534
535 // =======================================================================
536 // function : SetWireAspect
537 // purpose  :
538 // =======================================================================
539
540 void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
541 {
542   myWireAspect = theAspect;
543   myHasOwnWireAspect = !myWireAspect.IsNull();
544 }
545
546 // =======================================================================
547 // function : SetWireDraw
548 // purpose  :
549 // =======================================================================
550
551 void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
552 {
553   myHasOwnWireDraw = Standard_True;
554   myWireDraw       = theIsEnabled;
555 }
556
557 // =======================================================================
558 // function : PointAspect
559 // purpose  :
560 // =======================================================================
561
562 const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
563 {
564   if (!HasOwnPointAspect())
565   {
566     if (!myLink.IsNull())
567     {
568       return myLink->PointAspect();
569     }
570     if (myPointAspect.IsNull())
571     {
572       myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
573     }
574   }
575   return myPointAspect;
576 }
577
578 // =======================================================================
579 // function : SetupOwnPointAspect
580 // purpose  :
581 // =======================================================================
582 Standard_Boolean Prs3d_Drawer::SetupOwnPointAspect (const Handle(Prs3d_Drawer)& theDefaults)
583 {
584   if (myHasOwnPointAspect)
585   {
586     return Standard_False;
587   }
588
589   myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
590   if (!theDefaults.IsNull() && theDefaults != this)
591   {
592     *myPointAspect->Aspect() = *theDefaults->PointAspect()->Aspect();
593   }
594   else if (!myLink.IsNull())
595   {
596     *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
597   }
598   myHasOwnPointAspect = Standard_True;
599   return Standard_True;
600 }
601
602 // =======================================================================
603 // function : SetPointAspect
604 // purpose  :
605 // =======================================================================
606
607 void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
608 {
609   myPointAspect = theAspect;
610   myHasOwnPointAspect = !myPointAspect.IsNull();
611 }
612
613 // =======================================================================
614 // function : LineAspect
615 // purpose  :
616 // =======================================================================
617
618 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
619 {
620   if (!HasOwnLineAspect())
621   {
622     if (!myLink.IsNull())
623     {
624       return myLink->LineAspect();
625     }
626     if (myLineAspect.IsNull())
627     {
628       myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
629     }
630   }
631   return myLineAspect;
632 }
633
634 // =======================================================================
635 // function : SetLineAspect
636 // purpose  :
637 // =======================================================================
638
639 void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
640 {
641   myLineAspect = theAspect;
642   myHasOwnLineAspect = !myLineAspect.IsNull();
643 }
644
645 // =======================================================================
646 // function : TextAspect
647 // purpose  :
648 // =======================================================================
649
650 const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
651 {
652   if (!HasOwnTextAspect())
653   {
654     if (!myLink.IsNull())
655     {
656       return myLink->TextAspect();
657     }
658     if (myTextAspect.IsNull())
659     {
660       myTextAspect = new Prs3d_TextAspect();
661     }
662   }
663   return myTextAspect;
664 }
665
666 // =======================================================================
667 // function : SetTextAspect
668 // purpose  :
669 // =======================================================================
670
671 void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
672 {
673   myTextAspect = theAspect;
674   myHasOwnTextAspect = !myTextAspect.IsNull();
675 }
676
677 // =======================================================================
678 // function : ShadingAspect
679 // purpose  :
680 // =======================================================================
681
682 const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
683 {
684   if (!HasOwnShadingAspect())
685   {
686     if (!myLink.IsNull())
687     {
688       return myLink->ShadingAspect();
689     }
690     if (myShadingAspect.IsNull())
691     {
692       myShadingAspect = new Prs3d_ShadingAspect();
693     }
694   }
695   return myShadingAspect;
696 }
697
698 // =======================================================================
699 // function : SetupOwnShadingAspect
700 // purpose  :
701 // =======================================================================
702 Standard_Boolean Prs3d_Drawer::SetupOwnShadingAspect (const Handle(Prs3d_Drawer)& theDefaults)
703 {
704   if (myHasOwnShadingAspect)
705   {
706     return Standard_False;
707   }
708
709   myShadingAspect = new Prs3d_ShadingAspect();
710   if (!theDefaults.IsNull() && theDefaults != this)
711   {
712     *myShadingAspect->Aspect() = *theDefaults->ShadingAspect()->Aspect();
713   }
714   else if (!myLink.IsNull())
715   {
716     *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
717   }
718   myHasOwnShadingAspect = Standard_True;
719   return Standard_True;
720 }
721
722 // =======================================================================
723 // function : SetShadingAspect
724 // purpose  :
725 // =======================================================================
726
727 void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
728 {
729   myShadingAspect = theAspect;
730   myHasOwnShadingAspect = !myShadingAspect.IsNull();
731 }
732
733 // =======================================================================
734 // function : PlaneAspect
735 // purpose  :
736 // =======================================================================
737
738 const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
739 {
740   if (!HasOwnPlaneAspect())
741   {
742     if (!myLink.IsNull())
743     {
744       return myLink->PlaneAspect();
745     }
746     if (myPlaneAspect.IsNull())
747     {
748       myPlaneAspect = new Prs3d_PlaneAspect();
749     }
750   }
751   return myPlaneAspect;
752 }
753
754 // =======================================================================
755 // function : SetPlaneAspect
756 // purpose  :
757 // =======================================================================
758
759 void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
760 {
761   myPlaneAspect = theAspect;
762   myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
763 }
764
765 // =======================================================================
766 // function : SeenLineAspect
767 // purpose  :
768 // =======================================================================
769
770 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
771 {
772   if (!HasOwnSeenLineAspect())
773   {
774     if (!myLink.IsNull())
775     {
776       return myLink->SeenLineAspect();
777     }
778     if (mySeenLineAspect.IsNull())
779     {
780       mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
781     }
782   }
783   return mySeenLineAspect;
784 }
785
786 // =======================================================================
787 // function : SetSeenLineAspect
788 // purpose  :
789 // =======================================================================
790
791 void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
792 {
793   mySeenLineAspect = theAspect;
794   myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
795 }
796
797 // =======================================================================
798 // function : ArrowAspect
799 // purpose  :
800 // =======================================================================
801
802 const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
803 {
804   if (!HasOwnArrowAspect())
805   {
806     if (!myLink.IsNull())
807     {
808       return myLink->ArrowAspect();
809     }
810     if (myArrowAspect.IsNull())
811     {
812       myArrowAspect = new Prs3d_ArrowAspect();
813     }
814   }
815   return myArrowAspect;
816 }
817
818 // =======================================================================
819 // function : SetArrowAspect
820 // purpose  :
821 // =======================================================================
822
823 void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
824 {
825   myArrowAspect = theAspect;
826   myHasOwnArrowAspect = !myArrowAspect.IsNull();
827 }
828
829 // =======================================================================
830 // function : SetLineArrowDraw
831 // purpose  :
832 // =======================================================================
833
834 void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
835 {
836   myHasOwnLineArrowDraw = Standard_True;
837   myLineArrowDraw       = theIsEnabled;
838 }
839
840 // =======================================================================
841 // function : HiddenLineAspect
842 // purpose  :
843 // =======================================================================
844
845 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
846 {
847   if (!HasOwnHiddenLineAspect())
848   {
849     if (!myLink.IsNull())
850     {
851       return myLink->HiddenLineAspect();
852     }
853     if (myHiddenLineAspect.IsNull())
854     {
855       myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
856     }
857   }
858   return myHiddenLineAspect;
859 }
860
861 // =======================================================================
862 // function : SetHiddenLineAspect
863 // purpose  :
864 // =======================================================================
865
866 void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
867 {
868   myHiddenLineAspect = theAspect;
869   myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
870 }
871
872 // =======================================================================
873 // function : EnableDrawHiddenLineDraw
874 // purpose  :
875 // =======================================================================
876
877 void Prs3d_Drawer::EnableDrawHiddenLine()
878 {
879     myHasOwnDrawHiddenLine = Standard_True;
880     myDrawHiddenLine       = Standard_True;
881 }
882
883 // =======================================================================
884 // function : DisableDrawHiddenLine
885 // purpose  :
886 // =======================================================================
887
888 void Prs3d_Drawer::DisableDrawHiddenLine()
889 {
890     myHasOwnDrawHiddenLine = Standard_True;
891     myDrawHiddenLine       = Standard_False;
892 }
893
894 // =======================================================================
895 // function : VectorAspect
896 // purpose  :
897 // =======================================================================
898
899 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
900 {
901   if (!HasOwnVectorAspect())
902   {
903     if (!myLink.IsNull())
904     {
905       return myLink->VectorAspect();
906     }
907     if (myVectorAspect.IsNull())
908     {
909       myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
910     }
911   }
912   return myVectorAspect;
913 }
914
915 // =======================================================================
916 // function : SetVectorAspect
917 // purpose  :
918 // =======================================================================
919
920 void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
921 {
922   myVectorAspect = theAspect;
923   myHasOwnVectorAspect = !myVectorAspect.IsNull();
924 }
925
926 // =======================================================================
927 // function : SetVertexDrawMode
928 // purpose  :
929 // =======================================================================
930
931 void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
932 {
933   // Prs3d_VDM_Inherited is default value and means
934   // that correct value should be taken from the Link if it exists.
935   myVertexDrawMode = theMode;
936 }
937
938 // =======================================================================
939 // function : VertexDrawMode
940 // purpose  :
941 // =======================================================================
942
943 Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
944 {
945   if (!HasOwnVertexDrawMode())
946   {
947       if (!myLink.IsNull())
948       {
949           return myLink->VertexDrawMode();
950       }
951       // Prs3d_VDM_Isolated is default value for this setting.
952       myVertexDrawMode = Prs3d_VDM_Isolated;
953   }
954   return myVertexDrawMode;
955 }
956
957 // =======================================================================
958 // function : DatumAspect
959 // purpose  :
960 // =======================================================================
961
962 const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
963 {
964   if (!HasOwnDatumAspect())
965   {
966     if (!myLink.IsNull())
967     {
968       return myLink->DatumAspect();
969     }
970     if (myDatumAspect.IsNull())
971     {
972       myDatumAspect = new Prs3d_DatumAspect();
973     }
974   }
975   return myDatumAspect;
976 }
977
978 // =======================================================================
979 // function : SetDatumAspect
980 // purpose  :
981 // =======================================================================
982
983 void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
984 {
985   myDatumAspect = theAspect;
986   myHasOwnDatumAspect = !myDatumAspect.IsNull();
987 }
988
989 // =======================================================================
990 // function : SectionAspect
991 // purpose  :
992 // =======================================================================
993
994 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
995 {
996   if (!HasOwnSectionAspect())
997   {
998     if (!myLink.IsNull())
999     {
1000       return myLink->SectionAspect();
1001     }
1002     if (mySectionAspect.IsNull())
1003     {
1004       mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1005     }
1006   }
1007   return mySectionAspect;
1008 }
1009
1010 // =======================================================================
1011 // function : SetSectionAspect
1012 // purpose  :
1013 // =======================================================================
1014
1015 void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
1016 {
1017   mySectionAspect = theAspect;
1018   myHasOwnSectionAspect = !mySectionAspect.IsNull();
1019 }
1020
1021 // =======================================================================
1022 // function : SetSectionAspect
1023 // purpose  :
1024 // =======================================================================
1025
1026 void Prs3d_Drawer::ClearLocalAttributes()
1027 {
1028   if (myLink.IsNull())
1029   {
1030     return;
1031   }
1032
1033   myUIsoAspect.Nullify();
1034   myVIsoAspect.Nullify();
1035   myFreeBoundaryAspect.Nullify();
1036   myUnFreeBoundaryAspect.Nullify();
1037   myFaceBoundaryAspect.Nullify();
1038   myWireAspect.Nullify();
1039   myLineAspect.Nullify();
1040   myTextAspect.Nullify();
1041   myShadingAspect.Nullify();
1042   myPointAspect.Nullify();
1043   myPlaneAspect.Nullify();
1044   myArrowAspect.Nullify();
1045   myHiddenLineAspect.Nullify();
1046   mySeenLineAspect.Nullify();
1047   myVectorAspect .Nullify();
1048   myDatumAspect.Nullify();
1049   myDimensionAspect.Nullify();
1050   mySectionAspect.Nullify();
1051
1052   myHasOwnUIsoAspect           = Standard_False;
1053   myHasOwnVIsoAspect           = Standard_False;
1054   myHasOwnWireAspect           = Standard_False;
1055   myHasOwnPointAspect          = Standard_False;
1056   myHasOwnLineAspect           = Standard_False;
1057   myHasOwnTextAspect           = Standard_False;
1058   myHasOwnShadingAspect        = Standard_False;
1059   myHasOwnPlaneAspect          = Standard_False;
1060   myHasOwnSeenLineAspect       = Standard_False;
1061   myHasOwnArrowAspect          = Standard_False;
1062   myHasOwnHiddenLineAspect     = Standard_False;
1063   myHasOwnVectorAspect         = Standard_False;
1064   myHasOwnDatumAspect          = Standard_False;
1065   myHasOwnSectionAspect        = Standard_False;
1066   myHasOwnFreeBoundaryAspect   = Standard_False;
1067   myHasOwnUnFreeBoundaryAspect = Standard_False;
1068   myHasOwnFaceBoundaryAspect   = Standard_False;
1069   myHasOwnDimensionAspect      = Standard_False;
1070
1071   myHasOwnNbPoints                = Standard_False;
1072   myHasOwnMaximalParameterValue   = Standard_False;
1073   myHasOwnTypeOfDeflection        = Standard_False;
1074   myHasOwnChordialDeviation       = Standard_False;
1075   myHasOwnDeviationCoefficient    = Standard_False;
1076   myHasOwnDeviationAngle          = Standard_False;
1077   myHasOwnIsoOnPlane              = Standard_False;
1078   myHasOwnIsoOnTriangulation      = Standard_False;
1079   myHasOwnIsAutoTriangulated      = Standard_False;
1080   myHasOwnWireDraw                = Standard_False;
1081   myHasOwnLineArrowDraw           = Standard_False;
1082   myHasOwnDrawHiddenLine          = Standard_False;
1083   myHasOwnFreeBoundaryDraw        = Standard_False;
1084   myHasOwnUnFreeBoundaryDraw      = Standard_False;
1085   myHasOwnFaceBoundaryDraw        = Standard_False;
1086   myHasOwnDimLengthModelUnits     = Standard_False;
1087   myHasOwnDimLengthDisplayUnits   = Standard_False;
1088   myHasOwnDimAngleModelUnits      = Standard_False;
1089   myHasOwnDimAngleDisplayUnits    = Standard_False;
1090
1091   myVertexDrawMode = Prs3d_VDM_Inherited;
1092   myTypeOfHLR      = Prs3d_TOH_NotSet;
1093 }
1094
1095 // =======================================================================
1096 // function : SetupOwnFaceBoundaryAspect
1097 // purpose  :
1098 // =======================================================================
1099 Standard_Boolean Prs3d_Drawer::SetupOwnFaceBoundaryAspect (const Handle(Prs3d_Drawer)& theDefaults)
1100 {
1101   if (myHasOwnFaceBoundaryAspect)
1102   {
1103     return false;
1104   }
1105
1106   myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
1107   myHasOwnFaceBoundaryAspect = true;
1108
1109   const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1110   if (!aLink.IsNull())
1111   {
1112     *myFaceBoundaryAspect->Aspect() = *aLink->FaceBoundaryAspect()->Aspect();
1113   }
1114   return true;
1115 }
1116
1117 // =======================================================================
1118 // function : SetOwnLineAspects
1119 // purpose  :
1120 // =======================================================================
1121 Standard_Boolean Prs3d_Drawer::SetOwnLineAspects (const Handle(Prs3d_Drawer)& theDefaults)
1122 {
1123   bool isUpdateNeeded = false;
1124   const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1125   if (!myHasOwnUIsoAspect)
1126   {
1127     isUpdateNeeded = true;
1128     myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1129     if (!aLink.IsNull())
1130     {
1131       *myUIsoAspect->Aspect() = *aLink->UIsoAspect()->Aspect();
1132       myUIsoAspect->SetNumber (aLink->UIsoAspect()->Number());
1133     }
1134     myHasOwnUIsoAspect = true;
1135   }
1136   if (!myHasOwnVIsoAspect)
1137   {
1138     isUpdateNeeded = true;
1139     myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1140     if (!aLink.IsNull())
1141     {
1142       *myVIsoAspect->Aspect() = *aLink->VIsoAspect()->Aspect();
1143       myUIsoAspect->SetNumber (aLink->VIsoAspect()->Number());
1144     }
1145     myHasOwnVIsoAspect = true;
1146   }
1147   if (!myHasOwnWireAspect)
1148   {
1149     isUpdateNeeded = true;
1150     myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
1151     myHasOwnWireAspect = true;
1152     if (!aLink.IsNull())
1153     {
1154       *myWireAspect->Aspect() = *aLink->WireAspect()->Aspect();
1155     }
1156   }
1157   if (!myHasOwnLineAspect)
1158   {
1159     isUpdateNeeded = true;
1160     myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
1161     myHasOwnLineAspect = true;
1162     if (!aLink.IsNull())
1163     {
1164       *myLineAspect->Aspect() = *aLink->LineAspect()->Aspect();
1165     }
1166   }
1167   if (!myHasOwnSeenLineAspect)
1168   {
1169     isUpdateNeeded = true;
1170     mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
1171     myHasOwnSeenLineAspect = true;
1172     if (!aLink.IsNull())
1173     {
1174       *mySeenLineAspect->Aspect() = *aLink->SeenLineAspect()->Aspect();
1175     }
1176   }
1177   if (!myHasOwnHiddenLineAspect)
1178   {
1179     isUpdateNeeded = true;
1180     myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
1181     myHasOwnHiddenLineAspect = true;
1182     if (!aLink.IsNull())
1183     {
1184       *myHiddenLineAspect->Aspect() = *aLink->HiddenLineAspect()->Aspect();
1185     }
1186   }
1187   if (!myHasOwnFreeBoundaryAspect)
1188   {
1189     isUpdateNeeded = true;
1190     myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
1191     myHasOwnFreeBoundaryAspect = true;
1192     if (!aLink.IsNull())
1193     {
1194       *myFreeBoundaryAspect->Aspect() = *aLink->FreeBoundaryAspect()->Aspect();
1195     }
1196   }
1197   if (!myHasOwnUnFreeBoundaryAspect)
1198   {
1199     isUpdateNeeded = true;
1200     myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
1201     myHasOwnUnFreeBoundaryAspect = true;
1202     if (!aLink.IsNull())
1203     {
1204       *myUnFreeBoundaryAspect->Aspect() = *aLink->UnFreeBoundaryAspect()->Aspect();
1205     }
1206   }
1207   isUpdateNeeded = SetupOwnFaceBoundaryAspect (theDefaults) || isUpdateNeeded;
1208   return isUpdateNeeded;
1209 }
1210
1211 // =======================================================================
1212 // function : SetOwnDatumAspects
1213 // purpose  :
1214 // =======================================================================
1215 Standard_Boolean Prs3d_Drawer::SetOwnDatumAspects (const Handle(Prs3d_Drawer)& theDefaults)
1216 {
1217   bool isUpdateNeeded = false;
1218   const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1219   if (!myHasOwnVectorAspect)
1220   {
1221     isUpdateNeeded = true;
1222     myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
1223     myHasOwnVectorAspect = true;
1224     if (!aLink.IsNull())
1225     {
1226       *myVectorAspect->Aspect() = *aLink->VectorAspect()->Aspect();
1227     }
1228   }
1229   if (!myHasOwnSectionAspect)
1230   {
1231     isUpdateNeeded = true;
1232     mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1233     myHasOwnSectionAspect = true;
1234     if (!aLink.IsNull())
1235     {
1236       *mySectionAspect->Aspect() = *aLink->SectionAspect()->Aspect();
1237     }
1238   }
1239   if (!myHasOwnPlaneAspect)
1240   {
1241     isUpdateNeeded = true;
1242     myPlaneAspect = new Prs3d_PlaneAspect();
1243     myHasOwnPlaneAspect = true;
1244   }
1245   if (!myHasOwnArrowAspect)
1246   {
1247     isUpdateNeeded = true;
1248     myArrowAspect = new Prs3d_ArrowAspect();
1249     myHasOwnArrowAspect = true;
1250   }
1251   if (!myHasOwnDatumAspect)
1252   {
1253     isUpdateNeeded = true;
1254     myDatumAspect = new Prs3d_DatumAspect();
1255     myHasOwnDatumAspect = true;
1256   }
1257   return isUpdateNeeded;
1258 }
1259
1260 //! Assign the shader program.
1261 template <typename T>
1262 inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1263                               bool theHasAspect,
1264                               T thePrsAspect)
1265 {
1266   if (!thePrsAspect.IsNull()
1267     && theHasAspect)
1268   {
1269     thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1270   }
1271 }
1272
1273 // =======================================================================
1274 // function : SetShaderProgram
1275 // purpose  :
1276 // =======================================================================
1277 bool Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1278                                      const Graphic3d_GroupAspect            theAspect,
1279                                      const bool                             theToOverrideDefaults)
1280 {
1281   bool isUpdateNeeded = false;
1282   switch (theAspect)
1283   {
1284     case Graphic3d_ASPECT_LINE:
1285     {
1286       if (theToOverrideDefaults)
1287       {
1288         isUpdateNeeded = SetOwnLineAspects()  || isUpdateNeeded;
1289         isUpdateNeeded = SetOwnDatumAspects() || isUpdateNeeded;
1290       }
1291
1292       setAspectProgram (theProgram, myHasOwnUIsoAspect, myUIsoAspect);
1293       setAspectProgram (theProgram, myHasOwnVIsoAspect, myVIsoAspect);
1294       setAspectProgram (theProgram, myHasOwnWireAspect, myWireAspect);
1295       setAspectProgram (theProgram, myHasOwnLineAspect, myLineAspect);
1296       setAspectProgram (theProgram, myHasOwnSeenLineAspect,       mySeenLineAspect);
1297       setAspectProgram (theProgram, myHasOwnHiddenLineAspect,     myHiddenLineAspect);
1298       setAspectProgram (theProgram, myHasOwnVectorAspect,         myVectorAspect);
1299       setAspectProgram (theProgram, myHasOwnSectionAspect,        mySectionAspect);
1300       setAspectProgram (theProgram, myHasOwnFreeBoundaryAspect,   myFreeBoundaryAspect);
1301       setAspectProgram (theProgram, myHasOwnUnFreeBoundaryAspect, myUnFreeBoundaryAspect);
1302       setAspectProgram (theProgram, myHasOwnFaceBoundaryAspect,   myFaceBoundaryAspect);
1303       if (myHasOwnPlaneAspect)
1304       {
1305         setAspectProgram (theProgram, true, myPlaneAspect->EdgesAspect());
1306         setAspectProgram (theProgram, true, myPlaneAspect->IsoAspect());
1307         setAspectProgram (theProgram, true, myPlaneAspect->ArrowAspect());
1308       }
1309       if (myHasOwnDatumAspect)
1310       {
1311         setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_XAxis));
1312         setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_YAxis));
1313         setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_ZAxis));
1314       }
1315       setAspectProgram (theProgram, myHasOwnArrowAspect, myArrowAspect);
1316       return isUpdateNeeded;
1317     }
1318     case Graphic3d_ASPECT_TEXT:
1319     {
1320       if (theToOverrideDefaults
1321       && !myHasOwnTextAspect)
1322       {
1323         isUpdateNeeded = true;
1324         myTextAspect = new Prs3d_TextAspect();
1325         myHasOwnTextAspect = true;
1326         if (!myLink.IsNull())
1327         {
1328           *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1329         }
1330       }
1331
1332       setAspectProgram (theProgram, myHasOwnTextAspect, myTextAspect);
1333       return isUpdateNeeded;
1334     }
1335     case Graphic3d_ASPECT_MARKER:
1336     {
1337       if (theToOverrideDefaults
1338        && SetupOwnPointAspect())
1339       {
1340         isUpdateNeeded = true;
1341       }
1342
1343       setAspectProgram (theProgram, myHasOwnPointAspect, myPointAspect);
1344       return isUpdateNeeded;
1345     }
1346     case Graphic3d_ASPECT_FILL_AREA:
1347     {
1348       if (theToOverrideDefaults
1349        && SetupOwnShadingAspect())
1350       {
1351         isUpdateNeeded = true;
1352       }
1353       setAspectProgram (theProgram, myHasOwnShadingAspect, myShadingAspect);
1354       return isUpdateNeeded;
1355     }
1356   }
1357   return false;
1358 }
1359
1360 // =======================================================================
1361 // function : SetShadingModel
1362 // purpose  :
1363 // =======================================================================
1364 bool Prs3d_Drawer::SetShadingModel (Graphic3d_TypeOfShadingModel theModel,
1365                                     bool theToOverrideDefaults)
1366 {
1367   bool isUpdateNeeded = false;
1368
1369   if (theToOverrideDefaults
1370    && SetupOwnShadingAspect())
1371   {
1372     isUpdateNeeded  = true;
1373   }
1374
1375   if (!myShadingAspect.IsNull()
1376     && myHasOwnShadingAspect)
1377   {
1378     myShadingAspect->Aspect()->SetShadingModel (theModel);
1379   }
1380
1381   return isUpdateNeeded;
1382 }
1383
1384 // =======================================================================
1385 // function : DumpJson
1386 // purpose  :
1387 // =======================================================================
1388 void Prs3d_Drawer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
1389 {
1390   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
1391
1392   OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myLink.get())
1393
1394   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnNbPoints)
1395   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaximalParameterValue)
1396   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnMaximalParameterValue)
1397   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myChordialDeviation)
1398   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnChordialDeviation)
1399   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTypeOfDeflection)
1400   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnTypeOfDeflection)
1401   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTypeOfHLR)
1402   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeviationCoefficient)
1403   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPreviousDeviationCoefficient)
1404   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDeviationCoefficient)
1405   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeviationAngle)
1406   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDeviationAngle)
1407   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPreviousDeviationAngle)
1408   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoOnPlane)
1409   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsoOnPlane)
1410   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoOnTriangulation)
1411   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsoOnTriangulation)
1412   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsAutoTriangulated)
1413   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsAutoTriangulated)
1414
1415   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUIsoAspect)
1416
1417   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnVIsoAspect)
1418
1419   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnWireAspect)
1420   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myWireDraw)
1421   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnWireDraw)
1422
1423   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPointAspect)
1424
1425   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnLineAspect)
1426
1427   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get())
1428
1429   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShadingAspect.get())
1430   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnShadingAspect)
1431
1432   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPlaneAspect)
1433
1434   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnSeenLineAspect)
1435
1436   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnArrowAspect)
1437   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLineArrowDraw)
1438   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnLineArrowDraw)
1439
1440   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnHiddenLineAspect)
1441   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawHiddenLine)
1442   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDrawHiddenLine)
1443
1444   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnVectorAspect)
1445   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVertexDrawMode)
1446
1447   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDatumAspect)
1448
1449   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnSectionAspect)
1450
1451   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFreeBoundaryAspect)
1452   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFreeBoundaryDraw)
1453   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFreeBoundaryDraw)
1454
1455   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUnFreeBoundaryAspect)
1456   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUnFreeBoundaryDraw)
1457   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUnFreeBoundaryDraw)
1458
1459   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFaceBoundaryUpperContinuity)
1460   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFaceBoundaryAspect)
1461   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFaceBoundaryDraw)
1462   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFaceBoundaryDraw)
1463
1464   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimensionAspect)
1465   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimLengthModelUnits)
1466   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimAngleModelUnits)
1467   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimLengthDisplayUnits)
1468   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimAngleDisplayUnits)
1469 }