0027607: Visualization - Implement adaptive screen space sampling in path tracing
[occt.git] / src / Prs3d / Prs3d_Drawer.cxx
... / ...
CommitLineData
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
30IMPLEMENT_STANDARD_RTTIEXT(Prs3d_Drawer,MMgt_TShared)
31
32// =======================================================================
33// function : Prs3d_Drawer
34// purpose :
35// =======================================================================
36Prs3d_Drawer::Prs3d_Drawer()
37: myNbPoints (30),
38 myHasOwnNbPoints (Standard_False),
39 myMaximalParameterValue (500000.),
40 myHasOwnMaximalParameterValue (Standard_False),
41 myChordialDeviation (0.0001),
42 myHasOwnChordialDeviation (Standard_False),
43 myTypeOfDeflection (Aspect_TOD_RELATIVE),
44 myHasOwnTypeOfDeflection (Standard_False),
45 myTypeOfHLR (Prs3d_TOH_NotSet),
46 myDeviationCoefficient (0.001),
47 myHasOwnDeviationCoefficient (Standard_False),
48 myHLRDeviationCoefficient (0.02),
49 myHasOwnHLRDeviationCoefficient (Standard_False),
50 myDeviationAngle (12.0 * M_PI / 180.0),
51 myHasOwnDeviationAngle (Standard_False),
52 myHLRAngle (20.0 * M_PI / 180.0),
53 myHasOwnHLRDeviationAngle (Standard_False),
54 myIsoOnPlane (Standard_False),
55 myHasOwnIsoOnPlane (Standard_False),
56 myIsoOnTriangulation (Standard_False),
57 myHasOwnIsoOnTriangulation (Standard_False),
58 myIsAutoTriangulated (Standard_True),
59 myHasOwnIsAutoTriangulated (Standard_False),
60
61 myHasOwnUIsoAspect (Standard_False),
62 myHasOwnVIsoAspect (Standard_False),
63 myHasOwnWireAspect (Standard_False),
64 myWireDraw (Standard_True),
65 myHasOwnWireDraw (Standard_False),
66 myHasOwnPointAspect (Standard_False),
67 myHasOwnLineAspect (Standard_False),
68 myHasOwnTextAspect (Standard_False),
69 myHasOwnShadingAspect (Standard_False),
70 myHasOwnPlaneAspect (Standard_False),
71 myHasOwnSeenLineAspect (Standard_False),
72 myHasOwnArrowAspect (Standard_False),
73 myLineArrowDraw (Standard_False),
74 myHasOwnLineArrowDraw (Standard_False),
75 myHasOwnHiddenLineAspect (Standard_False),
76 myDrawHiddenLine (Standard_False),
77 myHasOwnDrawHiddenLine (Standard_False),
78 myHasOwnVectorAspect (Standard_False),
79 myVertexDrawMode (Prs3d_VDM_Inherited),
80 myHasOwnDatumAspect (Standard_False),
81 myHasOwnSectionAspect (Standard_False),
82
83 myHasOwnFreeBoundaryAspect (Standard_False),
84 myFreeBoundaryDraw (Standard_True),
85 myHasOwnFreeBoundaryDraw (Standard_False),
86 myHasOwnUnFreeBoundaryAspect (Standard_False),
87 myUnFreeBoundaryDraw (Standard_True),
88 myHasOwnUnFreeBoundaryDraw (Standard_False),
89 myHasOwnFaceBoundaryAspect (Standard_False),
90 myFaceBoundaryDraw (Standard_False),
91 myHasOwnFaceBoundaryDraw (Standard_False),
92
93 myHasOwnDimensionAspect (Standard_False),
94 myHasOwnDimLengthModelUnits (Standard_False),
95 myHasOwnDimAngleModelUnits (Standard_False),
96 myHasOwnDimLengthDisplayUnits (Standard_False),
97 myHasOwnDimAngleDisplayUnits (Standard_False)
98{
99 myDimensionModelUnits.SetLengthUnits ("m");
100 myDimensionModelUnits.SetAngleUnits ("rad");
101 myDimensionDisplayUnits.SetLengthUnits ("m");
102 myDimensionDisplayUnits.SetAngleUnits ("deg");
103}
104
105// =======================================================================
106// function : SetTypeOfDeflection
107// purpose :
108// =======================================================================
109
110void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
111{
112 myHasOwnTypeOfDeflection = Standard_True;
113 myTypeOfDeflection = theTypeOfDeflection;
114}
115
116// =======================================================================
117// function : SetMaximalChordialDeviation
118// purpose :
119// =======================================================================
120
121void Prs3d_Drawer::SetMaximalChordialDeviation (const Quantity_Length theChordialDeviation)
122{
123 myHasOwnChordialDeviation = Standard_True;
124 myChordialDeviation = theChordialDeviation;
125}
126
127// =======================================================================
128// function : SetTypeOfHLR
129// purpose : set type of HLR algorithm
130// =======================================================================
131
132void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
133{
134 myTypeOfHLR = theTypeOfHLR;
135}
136
137// =======================================================================
138// function : TypeOfHLR
139// purpose : gets type of HLR algorithm
140// =======================================================================
141
142Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
143{
144 if (!HasOwnTypeOfHLR())
145 {
146 if (!myLink.IsNull())
147 {
148 return myLink->TypeOfHLR();
149 }
150 // Prs3d_TOH_PolyAlgo is default value for this setting.
151 myTypeOfHLR = Prs3d_TOH_PolyAlgo;
152 }
153 return myTypeOfHLR;
154}
155
156// =======================================================================
157// function : SetIsoOnTriangulation
158// purpose :
159// =======================================================================
160void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
161{
162 myHasOwnIsoOnTriangulation = Standard_True;
163 myIsoOnTriangulation = theToEnable;
164}
165
166// =======================================================================
167// function : SetMaximalParameterValue
168// purpose :
169// =======================================================================
170
171void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
172{
173 myHasOwnMaximalParameterValue = Standard_True;
174 myMaximalParameterValue = theValue;
175}
176
177// =======================================================================
178// function : SetIsoOnPlane
179// purpose :
180// =======================================================================
181
182void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
183{
184 myHasOwnIsoOnPlane = Standard_True;
185 myIsoOnPlane = theIsEnabled;
186}
187
188// =======================================================================
189// function : SetDiscretisation
190// purpose :
191// =======================================================================
192
193void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue)
194{
195 myHasOwnNbPoints = Standard_True;
196 myNbPoints = theValue;
197}
198
199//=======================================================================
200//function : SetDeviationCoefficient
201//purpose :
202//=======================================================================
203
204void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
205{
206 myPreviousDeviationCoefficient = DeviationCoefficient();
207 myDeviationCoefficient = theCoefficient;
208 myHasOwnDeviationCoefficient = Standard_True;
209}
210
211//=======================================================================
212//function : SetHLRDeviationCoefficient
213//purpose :
214//=======================================================================
215
216void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
217{
218 myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient();
219 myHLRDeviationCoefficient = theCoefficient;
220 myHasOwnHLRDeviationCoefficient = Standard_True;
221}
222
223//=======================================================================
224//function : SetDeviationAngle
225//purpose :
226//=======================================================================
227
228void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
229{
230 myPreviousDeviationAngle = DeviationAngle();
231 myDeviationAngle = theAngle;
232 myHasOwnDeviationAngle = Standard_True;
233}
234
235//=======================================================================
236//function : SetHLRAngle
237//purpose :
238//=======================================================================
239
240void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle)
241{
242 myPreviousHLRDeviationAngle = HLRAngle();
243 myHLRAngle = theAngle;
244 myHasOwnHLRDeviationAngle = Standard_True;
245}
246
247// =======================================================================
248// function : SetAutoTriangulation
249// purpose :
250// =======================================================================
251
252void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
253{
254 myHasOwnIsAutoTriangulated = Standard_True;
255 myIsAutoTriangulated = theIsEnabled;
256}
257
258// =======================================================================
259// function : FreeBoundaryAspect
260// purpose :
261// =======================================================================
262
263const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
264{
265 if (!HasOwnFreeBoundaryAspect())
266 {
267 if (!myLink.IsNull())
268 {
269 return myLink->FreeBoundaryAspect();
270 }
271 if (myFreeBoundaryAspect.IsNull())
272 {
273 myFreeBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_GREEN, Aspect_TOL_SOLID, 1.0);
274 }
275 }
276 return myFreeBoundaryAspect;
277}
278
279// =======================================================================
280// function : FreeBoundaryAspect
281// purpose :
282// =======================================================================
283
284void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
285{
286 myFreeBoundaryAspect = theAspect;
287 myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
288}
289
290// =======================================================================
291// function : SetFreeBoundaryDraw
292// purpose :
293// =======================================================================
294
295void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
296{
297 myHasOwnFreeBoundaryDraw = Standard_True;
298 myFreeBoundaryDraw = theIsEnabled;
299}
300
301// =======================================================================
302// function : UnFreeBoundaryAspect
303// purpose :
304// =======================================================================
305
306const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
307{
308 if (!HasOwnUnFreeBoundaryAspect())
309 {
310 if (!myLink.IsNull())
311 {
312 return myLink->UnFreeBoundaryAspect();
313 }
314 if (myUnFreeBoundaryAspect.IsNull())
315 {
316 myUnFreeBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
317 }
318 }
319 return myUnFreeBoundaryAspect;
320}
321
322// =======================================================================
323// function : SetUnFreeBoundaryAspect
324// purpose :
325// =======================================================================
326
327void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
328{
329 myUnFreeBoundaryAspect = theAspect;
330 myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
331}
332
333// =======================================================================
334// function : SetUnFreeBoundaryDraw
335// purpose :
336// =======================================================================
337
338void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
339{
340 myHasOwnUnFreeBoundaryDraw = Standard_True;
341 myUnFreeBoundaryDraw = theIsEnabled;
342}
343
344// =======================================================================
345// function : FaceBoundaryAspect
346// purpose :
347// =======================================================================
348
349const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
350{
351 if (!HasOwnFaceBoundaryAspect())
352 {
353 if (!myLink.IsNull())
354 {
355 return myLink->FaceBoundaryAspect();
356 }
357 if (myFaceBoundaryAspect.IsNull())
358 {
359 myFaceBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0);
360 }
361 }
362 return myFaceBoundaryAspect;
363}
364
365// =======================================================================
366// function : SetFaceBoundaryAspect
367// purpose :
368// =======================================================================
369
370void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
371{
372 myFaceBoundaryAspect = theAspect;
373 myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
374}
375
376// =======================================================================
377// function : SetFaceBoundaryDraw
378// purpose :
379// =======================================================================
380
381void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
382{
383 myHasOwnFaceBoundaryDraw = Standard_True;
384 myFaceBoundaryDraw = theIsEnabled;
385}
386
387// =======================================================================
388// function : DimensionAspect
389// purpose :
390// =======================================================================
391
392const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
393{
394 if (!HasOwnDimensionAspect())
395 {
396 if (!myLink.IsNull())
397 {
398 return myLink->DimensionAspect();
399 }
400 if (myDimensionAspect.IsNull())
401 {
402 myDimensionAspect = new Prs3d_DimensionAspect;
403 }
404 }
405 return myDimensionAspect;
406}
407
408// =======================================================================
409// function : SetDimensionAspect
410// purpose :
411// =======================================================================
412
413void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
414{
415 myDimensionAspect = theAspect;
416 myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
417}
418
419// =======================================================================
420// function : SetDimLengthModelUnits
421// purpose :
422// =======================================================================
423
424void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
425{
426 myHasOwnDimLengthModelUnits = Standard_True;
427 myDimensionModelUnits.SetLengthUnits (theUnits);
428}
429
430// =======================================================================
431// function : SetDimAngleModelUnits
432// purpose :
433// =======================================================================
434
435void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
436{
437 myHasOwnDimAngleModelUnits = Standard_True;
438 myDimensionModelUnits.SetAngleUnits (theUnits);
439}
440
441// =======================================================================
442// function : SetDimLengthDisplayUnits
443// purpose :
444// =======================================================================
445
446void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
447{
448 myHasOwnDimLengthDisplayUnits = Standard_True;
449 myDimensionDisplayUnits.SetLengthUnits (theUnits);
450}
451
452// =======================================================================
453// function : SetDimAngleDisplayUnits
454// purpose :
455// =======================================================================
456
457void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
458{
459 myHasOwnDimAngleDisplayUnits = Standard_True;
460 myDimensionDisplayUnits.SetAngleUnits (theUnits);
461}
462
463// =======================================================================
464// function : UIsoAspect
465// purpose :
466// =======================================================================
467
468const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
469{
470 if (!HasOwnUIsoAspect())
471 {
472 if (!myLink.IsNull())
473 {
474 return myLink->UIsoAspect();
475 }
476 if (myUIsoAspect.IsNull())
477 {
478 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
479 }
480 }
481 return myUIsoAspect;
482}
483
484// =======================================================================
485// function : SetUIsoAspect
486// purpose :
487// =======================================================================
488
489void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
490{
491 myUIsoAspect = theAspect;
492 myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
493}
494
495// =======================================================================
496// function : VIsoAspect
497// purpose :
498// =======================================================================
499
500const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
501{
502 if (!HasOwnVIsoAspect())
503 {
504 if (!myLink.IsNull())
505 {
506 return myLink->VIsoAspect();
507 }
508 if (myVIsoAspect.IsNull())
509 {
510 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
511 }
512 }
513 return myVIsoAspect;
514}
515
516// =======================================================================
517// function : SetVIsoAspect
518// purpose :
519// =======================================================================
520
521void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
522{
523 myVIsoAspect = theAspect;
524 myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
525}
526
527// =======================================================================
528// function : WireAspect
529// purpose :
530// =======================================================================
531
532const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
533{
534 if (!HasOwnWireAspect())
535 {
536 if (!myLink.IsNull())
537 {
538 return myLink->WireAspect();
539 }
540 if (myWireAspect.IsNull())
541 {
542 myWireAspect = new Prs3d_LineAspect (Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0);
543 }
544 }
545 return myWireAspect;
546}
547
548// =======================================================================
549// function : SetWireAspect
550// purpose :
551// =======================================================================
552
553void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
554{
555 myWireAspect = theAspect;
556 myHasOwnWireAspect = !myWireAspect.IsNull();
557}
558
559// =======================================================================
560// function : SetWireDraw
561// purpose :
562// =======================================================================
563
564void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
565{
566 myHasOwnWireDraw = Standard_True;
567 myWireDraw = theIsEnabled;
568}
569
570// =======================================================================
571// function : PointAspect
572// purpose :
573// =======================================================================
574
575const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
576{
577 if (!HasOwnPointAspect())
578 {
579 if (!myLink.IsNull())
580 {
581 return myLink->PointAspect();
582 }
583 if (myPointAspect.IsNull())
584 {
585 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
586 }
587 }
588 return myPointAspect;
589}
590
591// =======================================================================
592// function : SetPointAspect
593// purpose :
594// =======================================================================
595
596void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
597{
598 myPointAspect = theAspect;
599 myHasOwnPointAspect = !myPointAspect.IsNull();
600}
601
602// =======================================================================
603// function : LineAspect
604// purpose :
605// =======================================================================
606
607const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
608{
609 if (!HasOwnLineAspect())
610 {
611 if (!myLink.IsNull())
612 {
613 return myLink->LineAspect();
614 }
615 if (myLineAspect.IsNull())
616 {
617 myLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
618 }
619 }
620 return myLineAspect;
621}
622
623// =======================================================================
624// function : SetLineAspect
625// purpose :
626// =======================================================================
627
628void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
629{
630 myLineAspect = theAspect;
631 myHasOwnLineAspect = !myLineAspect.IsNull();
632}
633
634// =======================================================================
635// function : TextAspect
636// purpose :
637// =======================================================================
638
639const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
640{
641 if (!HasOwnTextAspect())
642 {
643 if (!myLink.IsNull())
644 {
645 return myLink->TextAspect();
646 }
647 if (myTextAspect.IsNull())
648 {
649 myTextAspect = new Prs3d_TextAspect();
650 }
651 }
652 return myTextAspect;
653}
654
655// =======================================================================
656// function : SetTextAspect
657// purpose :
658// =======================================================================
659
660void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
661{
662 myTextAspect = theAspect;
663 myHasOwnTextAspect = !myTextAspect.IsNull();
664}
665
666// =======================================================================
667// function : ShadingAspect
668// purpose :
669// =======================================================================
670
671const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
672{
673 if (!HasOwnShadingAspect())
674 {
675 if (!myLink.IsNull())
676 {
677 return myLink->ShadingAspect();
678 }
679 if (myShadingAspect.IsNull())
680 {
681 myShadingAspect = new Prs3d_ShadingAspect();
682 }
683 }
684 return myShadingAspect;
685}
686
687// =======================================================================
688// function : SetShadingAspect
689// purpose :
690// =======================================================================
691
692void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
693{
694 myShadingAspect = theAspect;
695 myHasOwnShadingAspect = !myShadingAspect.IsNull();
696}
697
698// =======================================================================
699// function : PlaneAspect
700// purpose :
701// =======================================================================
702
703const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
704{
705 if (!HasOwnPlaneAspect())
706 {
707 if (!myLink.IsNull())
708 {
709 return myLink->PlaneAspect();
710 }
711 if (myPlaneAspect.IsNull())
712 {
713 myPlaneAspect = new Prs3d_PlaneAspect();
714 }
715 }
716 return myPlaneAspect;
717}
718
719// =======================================================================
720// function : SetPlaneAspect
721// purpose :
722// =======================================================================
723
724void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
725{
726 myPlaneAspect = theAspect;
727 myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
728}
729
730// =======================================================================
731// function : SeenLineAspect
732// purpose :
733// =======================================================================
734
735const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
736{
737 if (!HasOwnSeenLineAspect())
738 {
739 if (!myLink.IsNull())
740 {
741 return myLink->SeenLineAspect();
742 }
743 if (mySeenLineAspect.IsNull())
744 {
745 mySeenLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
746 }
747 }
748 return mySeenLineAspect;
749}
750
751// =======================================================================
752// function : SetSeenLineAspect
753// purpose :
754// =======================================================================
755
756void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
757{
758 mySeenLineAspect = theAspect;
759 myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
760}
761
762// =======================================================================
763// function : ArrowAspect
764// purpose :
765// =======================================================================
766
767const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
768{
769 if (!HasOwnArrowAspect())
770 {
771 if (!myLink.IsNull())
772 {
773 return myLink->ArrowAspect();
774 }
775 if (myArrowAspect.IsNull())
776 {
777 myArrowAspect = new Prs3d_ArrowAspect();
778 }
779 }
780 return myArrowAspect;
781}
782
783// =======================================================================
784// function : SetArrowAspect
785// purpose :
786// =======================================================================
787
788void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
789{
790 myArrowAspect = theAspect;
791 myHasOwnArrowAspect = !myArrowAspect.IsNull();
792}
793
794// =======================================================================
795// function : SetLineArrowDraw
796// purpose :
797// =======================================================================
798
799void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
800{
801 myHasOwnLineArrowDraw = Standard_True;
802 myLineArrowDraw = theIsEnabled;
803}
804
805// =======================================================================
806// function : HiddenLineAspect
807// purpose :
808// =======================================================================
809
810const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
811{
812 if (!HasOwnHiddenLineAspect())
813 {
814 if (!myLink.IsNull())
815 {
816 return myLink->HiddenLineAspect();
817 }
818 if (myHiddenLineAspect.IsNull())
819 {
820 myHiddenLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_DASH, 1.0);
821 }
822 }
823 return myHiddenLineAspect;
824}
825
826// =======================================================================
827// function : SetHiddenLineAspect
828// purpose :
829// =======================================================================
830
831void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
832{
833 myHiddenLineAspect = theAspect;
834 myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
835}
836
837// =======================================================================
838// function : EnableDrawHiddenLineDraw
839// purpose :
840// =======================================================================
841
842void Prs3d_Drawer::EnableDrawHiddenLine()
843{
844 myHasOwnDrawHiddenLine = Standard_True;
845 myDrawHiddenLine = Standard_True;
846}
847
848// =======================================================================
849// function : DisableDrawHiddenLine
850// purpose :
851// =======================================================================
852
853void Prs3d_Drawer::DisableDrawHiddenLine()
854{
855 myHasOwnDrawHiddenLine = Standard_True;
856 myDrawHiddenLine = Standard_False;
857}
858
859// =======================================================================
860// function : VectorAspect
861// purpose :
862// =======================================================================
863
864const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
865{
866 if (!HasOwnVectorAspect())
867 {
868 if (!myLink.IsNull())
869 {
870 return myLink->VectorAspect();
871 }
872 if (myVectorAspect.IsNull())
873 {
874 myVectorAspect = new Prs3d_LineAspect (Quantity_NOC_SKYBLUE, Aspect_TOL_SOLID, 1.0);
875 }
876 }
877 return myVectorAspect;
878}
879
880// =======================================================================
881// function : SetVectorAspect
882// purpose :
883// =======================================================================
884
885void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
886{
887 myVectorAspect = theAspect;
888 myHasOwnVectorAspect = !myVectorAspect.IsNull();
889}
890
891// =======================================================================
892// function : SetVertexDrawMode
893// purpose :
894// =======================================================================
895
896void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
897{
898 // Prs3d_VDM_Inherited is default value and means
899 // that correct value should be taken from the Link if it exists.
900 myVertexDrawMode = theMode;
901}
902
903// =======================================================================
904// function : VertexDrawMode
905// purpose :
906// =======================================================================
907
908Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
909{
910 if (!HasOwnVertexDrawMode())
911 {
912 if (!myLink.IsNull())
913 {
914 return myLink->VertexDrawMode();
915 }
916 // Prs3d_VDM_Isolated is default value for this setting.
917 myVertexDrawMode = Prs3d_VDM_Isolated;
918 }
919 return myVertexDrawMode;
920}
921
922// =======================================================================
923// function : DatumAspect
924// purpose :
925// =======================================================================
926
927const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
928{
929 if (!HasOwnDatumAspect())
930 {
931 if (!myLink.IsNull())
932 {
933 return myLink->DatumAspect();
934 }
935 if (myDatumAspect.IsNull())
936 {
937 myDatumAspect = new Prs3d_DatumAspect();
938 }
939 }
940 return myDatumAspect;
941}
942
943// =======================================================================
944// function : SetDatumAspect
945// purpose :
946// =======================================================================
947
948void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
949{
950 myDatumAspect = theAspect;
951 myHasOwnDatumAspect = !myDatumAspect.IsNull();
952}
953
954// =======================================================================
955// function : SectionAspect
956// purpose :
957// =======================================================================
958
959const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
960{
961 if (!HasOwnSectionAspect())
962 {
963 if (!myLink.IsNull())
964 {
965 return myLink->SectionAspect();
966 }
967 if (mySectionAspect.IsNull())
968 {
969 mySectionAspect = new Prs3d_LineAspect (Quantity_NOC_ORANGE, Aspect_TOL_SOLID, 1.0);
970 }
971 }
972 return mySectionAspect;
973}
974
975// =======================================================================
976// function : SetSectionAspect
977// purpose :
978// =======================================================================
979
980void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
981{
982 mySectionAspect = theAspect;
983 myHasOwnSectionAspect = !mySectionAspect.IsNull();
984}
985
986// =======================================================================
987// function : SetSectionAspect
988// purpose :
989// =======================================================================
990
991void Prs3d_Drawer::ClearLocalAttributes()
992{
993 if (myLink.IsNull())
994 {
995 return;
996 }
997
998 myUIsoAspect.Nullify();
999 myVIsoAspect.Nullify();
1000 myFreeBoundaryAspect.Nullify();
1001 myUnFreeBoundaryAspect.Nullify();
1002 myFaceBoundaryAspect.Nullify();
1003 myWireAspect.Nullify();
1004 myLineAspect.Nullify();
1005 myTextAspect.Nullify();
1006 myShadingAspect.Nullify();
1007 myPointAspect.Nullify();
1008 myPlaneAspect.Nullify();
1009 myArrowAspect.Nullify();
1010 myHiddenLineAspect.Nullify();
1011 mySeenLineAspect.Nullify();
1012 myVectorAspect .Nullify();
1013 myDatumAspect.Nullify();
1014 myDimensionAspect.Nullify();
1015 mySectionAspect.Nullify();
1016
1017 myHasOwnUIsoAspect = Standard_False;
1018 myHasOwnVIsoAspect = Standard_False;
1019 myHasOwnWireAspect = Standard_False;
1020 myHasOwnPointAspect = Standard_False;
1021 myHasOwnLineAspect = Standard_False;
1022 myHasOwnTextAspect = Standard_False;
1023 myHasOwnShadingAspect = Standard_False;
1024 myHasOwnPlaneAspect = Standard_False;
1025 myHasOwnSeenLineAspect = Standard_False;
1026 myHasOwnArrowAspect = Standard_False;
1027 myHasOwnHiddenLineAspect = Standard_False;
1028 myHasOwnVectorAspect = Standard_False;
1029 myHasOwnDatumAspect = Standard_False;
1030 myHasOwnSectionAspect = Standard_False;
1031 myHasOwnFreeBoundaryAspect = Standard_False;
1032 myHasOwnUnFreeBoundaryAspect = Standard_False;
1033 myHasOwnFaceBoundaryAspect = Standard_False;
1034 myHasOwnDimensionAspect = Standard_False;
1035
1036 myHasOwnNbPoints = Standard_False;
1037 myHasOwnMaximalParameterValue = Standard_False;
1038 myHasOwnTypeOfDeflection = Standard_False;
1039 myHasOwnChordialDeviation = Standard_False;
1040 myHasOwnDeviationCoefficient = Standard_False;
1041 myHasOwnHLRDeviationCoefficient = Standard_False;
1042 myHasOwnDeviationAngle = Standard_False;
1043 myHasOwnHLRDeviationAngle = Standard_False;
1044 myHasOwnIsoOnPlane = Standard_False;
1045 myHasOwnIsoOnTriangulation = Standard_False;
1046 myHasOwnIsAutoTriangulated = Standard_False;
1047 myHasOwnWireDraw = Standard_False;
1048 myHasOwnLineArrowDraw = Standard_False;
1049 myHasOwnDrawHiddenLine = Standard_False;
1050 myHasOwnFreeBoundaryDraw = Standard_False;
1051 myHasOwnUnFreeBoundaryDraw = Standard_False;
1052 myHasOwnFaceBoundaryDraw = Standard_False;
1053 myHasOwnDimLengthModelUnits = Standard_False;
1054 myHasOwnDimLengthDisplayUnits = Standard_False;
1055 myHasOwnDimAngleModelUnits = Standard_False;
1056 myHasOwnDimAngleDisplayUnits = Standard_False;
1057
1058 myVertexDrawMode = Prs3d_VDM_Inherited;
1059 myTypeOfHLR = Prs3d_TOH_NotSet;
1060}
1061
1062//! Copy line aspect defaults from the Link.
1063inline void copyLineAspect (const Handle(Prs3d_Drawer)& theLink,
1064 Handle(Prs3d_LineAspect)& theAspect,
1065 const Handle(Prs3d_LineAspect)& theBaseAspect)
1066{
1067 Handle(Prs3d_LineAspect) aBaseAspect = theBaseAspect;
1068 if (!theLink.IsNull())
1069 {
1070 theAspect = new Prs3d_LineAspect (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0);
1071 *theAspect->Aspect() = *aBaseAspect->Aspect();
1072 }
1073}
1074
1075//! Assign the shader program.
1076template <typename T>
1077inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1078 T thePrsAspect)
1079{
1080 if (!thePrsAspect.IsNull())
1081 {
1082 thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1083 }
1084}
1085
1086// =======================================================================
1087// function : SetShaderProgram
1088// purpose :
1089// =======================================================================
1090void Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1091 const Graphic3d_GroupAspect theAspect,
1092 const bool theToOverrideDefaults)
1093{
1094 switch (theAspect)
1095 {
1096 case Graphic3d_ASPECT_LINE:
1097 {
1098 if (theToOverrideDefaults)
1099 {
1100 if (myUIsoAspect.IsNull())
1101 {
1102 Handle(Prs3d_IsoAspect) anAspect = UIsoAspect();
1103 if (!myLink.IsNull())
1104 {
1105 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1106 *myUIsoAspect->Aspect() = *anAspect->Aspect();
1107 myUIsoAspect->SetNumber (anAspect->Number());
1108 }
1109 }
1110 if (myVIsoAspect.IsNull())
1111 {
1112 Handle(Prs3d_IsoAspect) anAspect = VIsoAspect();
1113 if (!myLink.IsNull())
1114 {
1115 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1116 *myVIsoAspect->Aspect() = *anAspect->Aspect();
1117 myUIsoAspect->SetNumber (anAspect->Number());
1118 }
1119 }
1120 if (myWireAspect.IsNull())
1121 {
1122 copyLineAspect (myLink, myWireAspect, WireAspect());
1123 }
1124 if (myLineAspect.IsNull())
1125 {
1126 copyLineAspect (myLink, myLineAspect, LineAspect());
1127 }
1128 if (mySeenLineAspect.IsNull())
1129 {
1130 copyLineAspect (myLink, mySeenLineAspect, SeenLineAspect());
1131 }
1132 if (myHiddenLineAspect.IsNull())
1133 {
1134 copyLineAspect (myLink, myHiddenLineAspect, HiddenLineAspect());
1135 }
1136 if (myVectorAspect.IsNull())
1137 {
1138 copyLineAspect (myLink, myVectorAspect, VectorAspect());
1139 }
1140 if (mySectionAspect.IsNull())
1141 {
1142 copyLineAspect (myLink, mySectionAspect, SectionAspect());
1143 }
1144 if (myFreeBoundaryAspect.IsNull())
1145 {
1146 copyLineAspect (myLink, myFreeBoundaryAspect, FreeBoundaryAspect());
1147 }
1148 if (myUnFreeBoundaryAspect.IsNull())
1149 {
1150 copyLineAspect (myLink, myUnFreeBoundaryAspect, UnFreeBoundaryAspect());
1151 }
1152 if (myFaceBoundaryAspect.IsNull())
1153 {
1154 copyLineAspect (myLink, myFaceBoundaryAspect, FaceBoundaryAspect());
1155 }
1156
1157 if (myPlaneAspect.IsNull())
1158 {
1159 myPlaneAspect = new Prs3d_PlaneAspect();
1160 }
1161 if (myArrowAspect.IsNull())
1162 {
1163 myArrowAspect = new Prs3d_ArrowAspect();
1164 }
1165 if (myDatumAspect.IsNull())
1166 {
1167 myDatumAspect = new Prs3d_DatumAspect();
1168 }
1169 }
1170
1171 setAspectProgram (theProgram, myUIsoAspect);
1172 setAspectProgram (theProgram, myVIsoAspect);
1173 setAspectProgram (theProgram, myWireAspect);
1174 setAspectProgram (theProgram, myLineAspect);
1175 setAspectProgram (theProgram, mySeenLineAspect);
1176 setAspectProgram (theProgram, myHiddenLineAspect);
1177 setAspectProgram (theProgram, myVectorAspect);
1178 setAspectProgram (theProgram, mySectionAspect);
1179 setAspectProgram (theProgram, myFreeBoundaryAspect);
1180 setAspectProgram (theProgram, myUnFreeBoundaryAspect);
1181 setAspectProgram (theProgram, myFaceBoundaryAspect);
1182 if (!myPlaneAspect.IsNull())
1183 {
1184 setAspectProgram (theProgram, myPlaneAspect->EdgesAspect());
1185 setAspectProgram (theProgram, myPlaneAspect->IsoAspect());
1186 setAspectProgram (theProgram, myPlaneAspect->ArrowAspect());
1187 }
1188 if (!myDatumAspect.IsNull())
1189 {
1190 setAspectProgram (theProgram, myDatumAspect->FirstAxisAspect());
1191 setAspectProgram (theProgram, myDatumAspect->SecondAxisAspect());
1192 setAspectProgram (theProgram, myDatumAspect->ThirdAxisAspect());
1193 }
1194 setAspectProgram (theProgram, myArrowAspect);
1195 return;
1196 }
1197 case Graphic3d_ASPECT_TEXT:
1198 {
1199 if (theToOverrideDefaults
1200 && myTextAspect.IsNull())
1201 {
1202 myTextAspect = new Prs3d_TextAspect();
1203 if (!myLink.IsNull())
1204 {
1205 *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1206 }
1207 }
1208
1209 setAspectProgram (theProgram, myTextAspect);
1210 return;
1211 }
1212 case Graphic3d_ASPECT_MARKER:
1213 {
1214 if (theToOverrideDefaults
1215 && myPointAspect.IsNull())
1216 {
1217 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
1218 if (!myLink.IsNull())
1219 {
1220 *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
1221 }
1222 }
1223
1224 setAspectProgram (theProgram, myPointAspect);
1225 return;
1226 }
1227 case Graphic3d_ASPECT_FILL_AREA:
1228 {
1229 if (myShadingAspect.IsNull()
1230 && theToOverrideDefaults)
1231 {
1232 myShadingAspect = new Prs3d_ShadingAspect();
1233 if (!myLink.IsNull())
1234 {
1235 *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
1236 }
1237 }
1238 setAspectProgram (theProgram, myShadingAspect);
1239 return;
1240 }
1241 }
1242}