1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
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.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <Prs3d_Drawer.hxx>
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>
30 IMPLEMENT_STANDARD_RTTIEXT(Prs3d_Drawer, Graphic3d_PresentationAttributes)
32 // =======================================================================
33 // function : Prs3d_Drawer
35 // =======================================================================
36 Prs3d_Drawer::Prs3d_Drawer()
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),
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),
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),
93 myHasOwnDimensionAspect (Standard_False),
94 myHasOwnDimLengthModelUnits (Standard_False),
95 myHasOwnDimAngleModelUnits (Standard_False),
96 myHasOwnDimLengthDisplayUnits (Standard_False),
97 myHasOwnDimAngleDisplayUnits (Standard_False)
99 myDimensionModelUnits.SetLengthUnits ("m");
100 myDimensionModelUnits.SetAngleUnits ("rad");
101 myDimensionDisplayUnits.SetLengthUnits ("m");
102 myDimensionDisplayUnits.SetAngleUnits ("deg");
105 // =======================================================================
106 // function : SetTypeOfDeflection
108 // =======================================================================
110 void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
112 myHasOwnTypeOfDeflection = Standard_True;
113 myTypeOfDeflection = theTypeOfDeflection;
116 // =======================================================================
117 // function : SetMaximalChordialDeviation
119 // =======================================================================
121 void Prs3d_Drawer::SetMaximalChordialDeviation (const Quantity_Length theChordialDeviation)
123 myHasOwnChordialDeviation = Standard_True;
124 myChordialDeviation = theChordialDeviation;
127 // =======================================================================
128 // function : SetTypeOfHLR
129 // purpose : set type of HLR algorithm
130 // =======================================================================
132 void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
134 myTypeOfHLR = theTypeOfHLR;
137 // =======================================================================
138 // function : TypeOfHLR
139 // purpose : gets type of HLR algorithm
140 // =======================================================================
142 Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
144 if (!HasOwnTypeOfHLR())
146 if (!myLink.IsNull())
148 return myLink->TypeOfHLR();
150 // Prs3d_TOH_PolyAlgo is default value for this setting.
151 myTypeOfHLR = Prs3d_TOH_PolyAlgo;
156 // =======================================================================
157 // function : SetIsoOnTriangulation
159 // =======================================================================
160 void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
162 myHasOwnIsoOnTriangulation = Standard_True;
163 myIsoOnTriangulation = theToEnable;
166 // =======================================================================
167 // function : SetMaximalParameterValue
169 // =======================================================================
171 void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
173 myHasOwnMaximalParameterValue = Standard_True;
174 myMaximalParameterValue = theValue;
177 // =======================================================================
178 // function : SetIsoOnPlane
180 // =======================================================================
182 void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
184 myHasOwnIsoOnPlane = Standard_True;
185 myIsoOnPlane = theIsEnabled;
188 // =======================================================================
189 // function : SetDiscretisation
191 // =======================================================================
193 void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue)
195 myHasOwnNbPoints = Standard_True;
196 myNbPoints = theValue;
199 //=======================================================================
200 //function : SetDeviationCoefficient
202 //=======================================================================
204 void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
206 myPreviousDeviationCoefficient = DeviationCoefficient();
207 myDeviationCoefficient = theCoefficient;
208 myHasOwnDeviationCoefficient = Standard_True;
211 //=======================================================================
212 //function : SetHLRDeviationCoefficient
214 //=======================================================================
216 void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
218 myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient();
219 myHLRDeviationCoefficient = theCoefficient;
220 myHasOwnHLRDeviationCoefficient = Standard_True;
223 //=======================================================================
224 //function : SetDeviationAngle
226 //=======================================================================
228 void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
230 myPreviousDeviationAngle = DeviationAngle();
231 myDeviationAngle = theAngle;
232 myHasOwnDeviationAngle = Standard_True;
235 //=======================================================================
236 //function : SetHLRAngle
238 //=======================================================================
240 void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle)
242 myPreviousHLRDeviationAngle = HLRAngle();
243 myHLRAngle = theAngle;
244 myHasOwnHLRDeviationAngle = Standard_True;
247 // =======================================================================
248 // function : SetAutoTriangulation
250 // =======================================================================
252 void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
254 myHasOwnIsAutoTriangulated = Standard_True;
255 myIsAutoTriangulated = theIsEnabled;
258 // =======================================================================
259 // function : FreeBoundaryAspect
261 // =======================================================================
263 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
265 if (!HasOwnFreeBoundaryAspect())
267 if (!myLink.IsNull())
269 return myLink->FreeBoundaryAspect();
271 if (myFreeBoundaryAspect.IsNull())
273 myFreeBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_GREEN, Aspect_TOL_SOLID, 1.0);
276 return myFreeBoundaryAspect;
279 // =======================================================================
280 // function : FreeBoundaryAspect
282 // =======================================================================
284 void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
286 myFreeBoundaryAspect = theAspect;
287 myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
290 // =======================================================================
291 // function : SetFreeBoundaryDraw
293 // =======================================================================
295 void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
297 myHasOwnFreeBoundaryDraw = Standard_True;
298 myFreeBoundaryDraw = theIsEnabled;
301 // =======================================================================
302 // function : UnFreeBoundaryAspect
304 // =======================================================================
306 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
308 if (!HasOwnUnFreeBoundaryAspect())
310 if (!myLink.IsNull())
312 return myLink->UnFreeBoundaryAspect();
314 if (myUnFreeBoundaryAspect.IsNull())
316 myUnFreeBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
319 return myUnFreeBoundaryAspect;
322 // =======================================================================
323 // function : SetUnFreeBoundaryAspect
325 // =======================================================================
327 void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
329 myUnFreeBoundaryAspect = theAspect;
330 myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
333 // =======================================================================
334 // function : SetUnFreeBoundaryDraw
336 // =======================================================================
338 void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
340 myHasOwnUnFreeBoundaryDraw = Standard_True;
341 myUnFreeBoundaryDraw = theIsEnabled;
344 // =======================================================================
345 // function : FaceBoundaryAspect
347 // =======================================================================
349 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
351 if (!HasOwnFaceBoundaryAspect())
353 if (!myLink.IsNull())
355 return myLink->FaceBoundaryAspect();
357 if (myFaceBoundaryAspect.IsNull())
359 myFaceBoundaryAspect = new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0);
362 return myFaceBoundaryAspect;
365 // =======================================================================
366 // function : SetFaceBoundaryAspect
368 // =======================================================================
370 void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
372 myFaceBoundaryAspect = theAspect;
373 myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
376 // =======================================================================
377 // function : SetFaceBoundaryDraw
379 // =======================================================================
381 void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
383 myHasOwnFaceBoundaryDraw = Standard_True;
384 myFaceBoundaryDraw = theIsEnabled;
387 // =======================================================================
388 // function : DimensionAspect
390 // =======================================================================
392 const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
394 if (!HasOwnDimensionAspect())
396 if (!myLink.IsNull())
398 return myLink->DimensionAspect();
400 if (myDimensionAspect.IsNull())
402 myDimensionAspect = new Prs3d_DimensionAspect;
405 return myDimensionAspect;
408 // =======================================================================
409 // function : SetDimensionAspect
411 // =======================================================================
413 void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
415 myDimensionAspect = theAspect;
416 myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
419 // =======================================================================
420 // function : SetDimLengthModelUnits
422 // =======================================================================
424 void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
426 myHasOwnDimLengthModelUnits = Standard_True;
427 myDimensionModelUnits.SetLengthUnits (theUnits);
430 // =======================================================================
431 // function : SetDimAngleModelUnits
433 // =======================================================================
435 void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
437 myHasOwnDimAngleModelUnits = Standard_True;
438 myDimensionModelUnits.SetAngleUnits (theUnits);
441 // =======================================================================
442 // function : SetDimLengthDisplayUnits
444 // =======================================================================
446 void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
448 myHasOwnDimLengthDisplayUnits = Standard_True;
449 myDimensionDisplayUnits.SetLengthUnits (theUnits);
452 // =======================================================================
453 // function : SetDimAngleDisplayUnits
455 // =======================================================================
457 void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
459 myHasOwnDimAngleDisplayUnits = Standard_True;
460 myDimensionDisplayUnits.SetAngleUnits (theUnits);
463 // =======================================================================
464 // function : UIsoAspect
466 // =======================================================================
468 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
470 if (!HasOwnUIsoAspect())
472 if (!myLink.IsNull())
474 return myLink->UIsoAspect();
476 if (myUIsoAspect.IsNull())
478 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
484 // =======================================================================
485 // function : SetUIsoAspect
487 // =======================================================================
489 void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
491 myUIsoAspect = theAspect;
492 myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
495 // =======================================================================
496 // function : VIsoAspect
498 // =======================================================================
500 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
502 if (!HasOwnVIsoAspect())
504 if (!myLink.IsNull())
506 return myLink->VIsoAspect();
508 if (myVIsoAspect.IsNull())
510 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
516 // =======================================================================
517 // function : SetVIsoAspect
519 // =======================================================================
521 void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
523 myVIsoAspect = theAspect;
524 myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
527 // =======================================================================
528 // function : WireAspect
530 // =======================================================================
532 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
534 if (!HasOwnWireAspect())
536 if (!myLink.IsNull())
538 return myLink->WireAspect();
540 if (myWireAspect.IsNull())
542 myWireAspect = new Prs3d_LineAspect (Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0);
548 // =======================================================================
549 // function : SetWireAspect
551 // =======================================================================
553 void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
555 myWireAspect = theAspect;
556 myHasOwnWireAspect = !myWireAspect.IsNull();
559 // =======================================================================
560 // function : SetWireDraw
562 // =======================================================================
564 void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
566 myHasOwnWireDraw = Standard_True;
567 myWireDraw = theIsEnabled;
570 // =======================================================================
571 // function : PointAspect
573 // =======================================================================
575 const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
577 if (!HasOwnPointAspect())
579 if (!myLink.IsNull())
581 return myLink->PointAspect();
583 if (myPointAspect.IsNull())
585 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
588 return myPointAspect;
591 // =======================================================================
592 // function : SetPointAspect
594 // =======================================================================
596 void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
598 myPointAspect = theAspect;
599 myHasOwnPointAspect = !myPointAspect.IsNull();
602 // =======================================================================
603 // function : LineAspect
605 // =======================================================================
607 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
609 if (!HasOwnLineAspect())
611 if (!myLink.IsNull())
613 return myLink->LineAspect();
615 if (myLineAspect.IsNull())
617 myLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
623 // =======================================================================
624 // function : SetLineAspect
626 // =======================================================================
628 void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
630 myLineAspect = theAspect;
631 myHasOwnLineAspect = !myLineAspect.IsNull();
634 // =======================================================================
635 // function : TextAspect
637 // =======================================================================
639 const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
641 if (!HasOwnTextAspect())
643 if (!myLink.IsNull())
645 return myLink->TextAspect();
647 if (myTextAspect.IsNull())
649 myTextAspect = new Prs3d_TextAspect();
655 // =======================================================================
656 // function : SetTextAspect
658 // =======================================================================
660 void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
662 myTextAspect = theAspect;
663 myHasOwnTextAspect = !myTextAspect.IsNull();
666 // =======================================================================
667 // function : ShadingAspect
669 // =======================================================================
671 const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
673 if (!HasOwnShadingAspect())
675 if (!myLink.IsNull())
677 return myLink->ShadingAspect();
679 if (myShadingAspect.IsNull())
681 myShadingAspect = new Prs3d_ShadingAspect();
684 return myShadingAspect;
687 // =======================================================================
688 // function : SetShadingAspect
690 // =======================================================================
692 void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
694 myShadingAspect = theAspect;
695 myHasOwnShadingAspect = !myShadingAspect.IsNull();
698 // =======================================================================
699 // function : PlaneAspect
701 // =======================================================================
703 const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
705 if (!HasOwnPlaneAspect())
707 if (!myLink.IsNull())
709 return myLink->PlaneAspect();
711 if (myPlaneAspect.IsNull())
713 myPlaneAspect = new Prs3d_PlaneAspect();
716 return myPlaneAspect;
719 // =======================================================================
720 // function : SetPlaneAspect
722 // =======================================================================
724 void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
726 myPlaneAspect = theAspect;
727 myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
730 // =======================================================================
731 // function : SeenLineAspect
733 // =======================================================================
735 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
737 if (!HasOwnSeenLineAspect())
739 if (!myLink.IsNull())
741 return myLink->SeenLineAspect();
743 if (mySeenLineAspect.IsNull())
745 mySeenLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 1.0);
748 return mySeenLineAspect;
751 // =======================================================================
752 // function : SetSeenLineAspect
754 // =======================================================================
756 void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
758 mySeenLineAspect = theAspect;
759 myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
762 // =======================================================================
763 // function : ArrowAspect
765 // =======================================================================
767 const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
769 if (!HasOwnArrowAspect())
771 if (!myLink.IsNull())
773 return myLink->ArrowAspect();
775 if (myArrowAspect.IsNull())
777 myArrowAspect = new Prs3d_ArrowAspect();
780 return myArrowAspect;
783 // =======================================================================
784 // function : SetArrowAspect
786 // =======================================================================
788 void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
790 myArrowAspect = theAspect;
791 myHasOwnArrowAspect = !myArrowAspect.IsNull();
794 // =======================================================================
795 // function : SetLineArrowDraw
797 // =======================================================================
799 void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
801 myHasOwnLineArrowDraw = Standard_True;
802 myLineArrowDraw = theIsEnabled;
805 // =======================================================================
806 // function : HiddenLineAspect
808 // =======================================================================
810 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
812 if (!HasOwnHiddenLineAspect())
814 if (!myLink.IsNull())
816 return myLink->HiddenLineAspect();
818 if (myHiddenLineAspect.IsNull())
820 myHiddenLineAspect = new Prs3d_LineAspect (Quantity_NOC_YELLOW, Aspect_TOL_DASH, 1.0);
823 return myHiddenLineAspect;
826 // =======================================================================
827 // function : SetHiddenLineAspect
829 // =======================================================================
831 void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
833 myHiddenLineAspect = theAspect;
834 myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
837 // =======================================================================
838 // function : EnableDrawHiddenLineDraw
840 // =======================================================================
842 void Prs3d_Drawer::EnableDrawHiddenLine()
844 myHasOwnDrawHiddenLine = Standard_True;
845 myDrawHiddenLine = Standard_True;
848 // =======================================================================
849 // function : DisableDrawHiddenLine
851 // =======================================================================
853 void Prs3d_Drawer::DisableDrawHiddenLine()
855 myHasOwnDrawHiddenLine = Standard_True;
856 myDrawHiddenLine = Standard_False;
859 // =======================================================================
860 // function : VectorAspect
862 // =======================================================================
864 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
866 if (!HasOwnVectorAspect())
868 if (!myLink.IsNull())
870 return myLink->VectorAspect();
872 if (myVectorAspect.IsNull())
874 myVectorAspect = new Prs3d_LineAspect (Quantity_NOC_SKYBLUE, Aspect_TOL_SOLID, 1.0);
877 return myVectorAspect;
880 // =======================================================================
881 // function : SetVectorAspect
883 // =======================================================================
885 void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
887 myVectorAspect = theAspect;
888 myHasOwnVectorAspect = !myVectorAspect.IsNull();
891 // =======================================================================
892 // function : SetVertexDrawMode
894 // =======================================================================
896 void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
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;
903 // =======================================================================
904 // function : VertexDrawMode
906 // =======================================================================
908 Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
910 if (!HasOwnVertexDrawMode())
912 if (!myLink.IsNull())
914 return myLink->VertexDrawMode();
916 // Prs3d_VDM_Isolated is default value for this setting.
917 myVertexDrawMode = Prs3d_VDM_Isolated;
919 return myVertexDrawMode;
922 // =======================================================================
923 // function : DatumAspect
925 // =======================================================================
927 const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
929 if (!HasOwnDatumAspect())
931 if (!myLink.IsNull())
933 return myLink->DatumAspect();
935 if (myDatumAspect.IsNull())
937 myDatumAspect = new Prs3d_DatumAspect();
940 return myDatumAspect;
943 // =======================================================================
944 // function : SetDatumAspect
946 // =======================================================================
948 void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
950 myDatumAspect = theAspect;
951 myHasOwnDatumAspect = !myDatumAspect.IsNull();
954 // =======================================================================
955 // function : SectionAspect
957 // =======================================================================
959 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
961 if (!HasOwnSectionAspect())
963 if (!myLink.IsNull())
965 return myLink->SectionAspect();
967 if (mySectionAspect.IsNull())
969 mySectionAspect = new Prs3d_LineAspect (Quantity_NOC_ORANGE, Aspect_TOL_SOLID, 1.0);
972 return mySectionAspect;
975 // =======================================================================
976 // function : SetSectionAspect
978 // =======================================================================
980 void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
982 mySectionAspect = theAspect;
983 myHasOwnSectionAspect = !mySectionAspect.IsNull();
986 // =======================================================================
987 // function : SetSectionAspect
989 // =======================================================================
991 void Prs3d_Drawer::ClearLocalAttributes()
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();
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;
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;
1058 myVertexDrawMode = Prs3d_VDM_Inherited;
1059 myTypeOfHLR = Prs3d_TOH_NotSet;
1062 //! Copy line aspect defaults from the Link.
1063 inline void copyLineAspect (const Handle(Prs3d_Drawer)& theLink,
1064 Handle(Prs3d_LineAspect)& theAspect,
1065 const Handle(Prs3d_LineAspect)& theBaseAspect)
1067 Handle(Prs3d_LineAspect) aBaseAspect = theBaseAspect;
1068 if (!theLink.IsNull())
1070 theAspect = new Prs3d_LineAspect (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0);
1071 *theAspect->Aspect() = *aBaseAspect->Aspect();
1075 //! Assign the shader program.
1076 template <typename T>
1077 inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1080 if (!thePrsAspect.IsNull())
1082 thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1086 // =======================================================================
1087 // function : SetShaderProgram
1089 // =======================================================================
1090 void Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1091 const Graphic3d_GroupAspect theAspect,
1092 const bool theToOverrideDefaults)
1096 case Graphic3d_ASPECT_LINE:
1098 if (theToOverrideDefaults)
1100 if (myUIsoAspect.IsNull())
1102 Handle(Prs3d_IsoAspect) anAspect = UIsoAspect();
1103 if (!myLink.IsNull())
1105 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1106 *myUIsoAspect->Aspect() = *anAspect->Aspect();
1107 myUIsoAspect->SetNumber (anAspect->Number());
1110 if (myVIsoAspect.IsNull())
1112 Handle(Prs3d_IsoAspect) anAspect = VIsoAspect();
1113 if (!myLink.IsNull())
1115 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1116 *myVIsoAspect->Aspect() = *anAspect->Aspect();
1117 myUIsoAspect->SetNumber (anAspect->Number());
1120 if (myWireAspect.IsNull())
1122 copyLineAspect (myLink, myWireAspect, WireAspect());
1124 if (myLineAspect.IsNull())
1126 copyLineAspect (myLink, myLineAspect, LineAspect());
1128 if (mySeenLineAspect.IsNull())
1130 copyLineAspect (myLink, mySeenLineAspect, SeenLineAspect());
1132 if (myHiddenLineAspect.IsNull())
1134 copyLineAspect (myLink, myHiddenLineAspect, HiddenLineAspect());
1136 if (myVectorAspect.IsNull())
1138 copyLineAspect (myLink, myVectorAspect, VectorAspect());
1140 if (mySectionAspect.IsNull())
1142 copyLineAspect (myLink, mySectionAspect, SectionAspect());
1144 if (myFreeBoundaryAspect.IsNull())
1146 copyLineAspect (myLink, myFreeBoundaryAspect, FreeBoundaryAspect());
1148 if (myUnFreeBoundaryAspect.IsNull())
1150 copyLineAspect (myLink, myUnFreeBoundaryAspect, UnFreeBoundaryAspect());
1152 if (myFaceBoundaryAspect.IsNull())
1154 copyLineAspect (myLink, myFaceBoundaryAspect, FaceBoundaryAspect());
1157 if (myPlaneAspect.IsNull())
1159 myPlaneAspect = new Prs3d_PlaneAspect();
1161 if (myArrowAspect.IsNull())
1163 myArrowAspect = new Prs3d_ArrowAspect();
1165 if (myDatumAspect.IsNull())
1167 myDatumAspect = new Prs3d_DatumAspect();
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())
1184 setAspectProgram (theProgram, myPlaneAspect->EdgesAspect());
1185 setAspectProgram (theProgram, myPlaneAspect->IsoAspect());
1186 setAspectProgram (theProgram, myPlaneAspect->ArrowAspect());
1188 if (!myDatumAspect.IsNull())
1190 setAspectProgram (theProgram, myDatumAspect->LineAspect(Prs3d_DP_XAxis));
1191 setAspectProgram (theProgram, myDatumAspect->LineAspect(Prs3d_DP_YAxis));
1192 setAspectProgram (theProgram, myDatumAspect->LineAspect(Prs3d_DP_ZAxis));
1194 setAspectProgram (theProgram, myArrowAspect);
1197 case Graphic3d_ASPECT_TEXT:
1199 if (theToOverrideDefaults
1200 && myTextAspect.IsNull())
1202 myTextAspect = new Prs3d_TextAspect();
1203 if (!myLink.IsNull())
1205 *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1209 setAspectProgram (theProgram, myTextAspect);
1212 case Graphic3d_ASPECT_MARKER:
1214 if (theToOverrideDefaults
1215 && myPointAspect.IsNull())
1217 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
1218 if (!myLink.IsNull())
1220 *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
1224 setAspectProgram (theProgram, myPointAspect);
1227 case Graphic3d_ASPECT_FILL_AREA:
1229 if (myShadingAspect.IsNull()
1230 && theToOverrideDefaults)
1232 myShadingAspect = new Prs3d_ShadingAspect();
1233 if (!myLink.IsNull())
1235 *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
1238 setAspectProgram (theProgram, myShadingAspect);