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)
34 static const Quantity_NameOfColor THE_DEF_COLOR_FreeBoundary = Quantity_NOC_GREEN;
35 static const Quantity_NameOfColor THE_DEF_COLOR_UnFreeBoundary = Quantity_NOC_YELLOW;
36 static const Quantity_NameOfColor THE_DEF_COLOR_FaceBoundary = Quantity_NOC_BLACK;
37 static const Quantity_NameOfColor THE_DEF_COLOR_Wire = Quantity_NOC_RED;
38 static const Quantity_NameOfColor THE_DEF_COLOR_Line = Quantity_NOC_YELLOW;
39 static const Quantity_NameOfColor THE_DEF_COLOR_SeenLine = Quantity_NOC_YELLOW;
40 static const Quantity_NameOfColor THE_DEF_COLOR_HiddenLine = Quantity_NOC_YELLOW;
41 static const Quantity_NameOfColor THE_DEF_COLOR_Vector = Quantity_NOC_SKYBLUE;
42 static const Quantity_NameOfColor THE_DEF_COLOR_Section = Quantity_NOC_ORANGE;
45 // =======================================================================
46 // function : Prs3d_Drawer
48 // =======================================================================
49 Prs3d_Drawer::Prs3d_Drawer()
51 myHasOwnNbPoints (Standard_False),
52 myMaximalParameterValue (500000.),
53 myHasOwnMaximalParameterValue (Standard_False),
54 myChordialDeviation (0.0001),
55 myHasOwnChordialDeviation (Standard_False),
56 myTypeOfDeflection (Aspect_TOD_RELATIVE),
57 myHasOwnTypeOfDeflection (Standard_False),
58 myTypeOfHLR (Prs3d_TOH_NotSet),
59 myDeviationCoefficient (0.001),
60 myHasOwnDeviationCoefficient (Standard_False),
61 myHLRDeviationCoefficient (0.02),
62 myHasOwnHLRDeviationCoefficient (Standard_False),
63 myDeviationAngle (12.0 * M_PI / 180.0),
64 myHasOwnDeviationAngle (Standard_False),
65 myHLRAngle (20.0 * M_PI / 180.0),
66 myHasOwnHLRDeviationAngle (Standard_False),
67 myIsoOnPlane (Standard_False),
68 myHasOwnIsoOnPlane (Standard_False),
69 myIsoOnTriangulation (Standard_False),
70 myHasOwnIsoOnTriangulation (Standard_False),
71 myIsAutoTriangulated (Standard_True),
72 myHasOwnIsAutoTriangulated (Standard_False),
74 myHasOwnUIsoAspect (Standard_False),
75 myHasOwnVIsoAspect (Standard_False),
76 myHasOwnWireAspect (Standard_False),
77 myWireDraw (Standard_True),
78 myHasOwnWireDraw (Standard_False),
79 myHasOwnPointAspect (Standard_False),
80 myHasOwnLineAspect (Standard_False),
81 myHasOwnTextAspect (Standard_False),
82 myHasOwnShadingAspect (Standard_False),
83 myHasOwnPlaneAspect (Standard_False),
84 myHasOwnSeenLineAspect (Standard_False),
85 myHasOwnArrowAspect (Standard_False),
86 myLineArrowDraw (Standard_False),
87 myHasOwnLineArrowDraw (Standard_False),
88 myHasOwnHiddenLineAspect (Standard_False),
89 myDrawHiddenLine (Standard_False),
90 myHasOwnDrawHiddenLine (Standard_False),
91 myHasOwnVectorAspect (Standard_False),
92 myVertexDrawMode (Prs3d_VDM_Inherited),
93 myHasOwnDatumAspect (Standard_False),
94 myHasOwnSectionAspect (Standard_False),
96 myHasOwnFreeBoundaryAspect (Standard_False),
97 myFreeBoundaryDraw (Standard_True),
98 myHasOwnFreeBoundaryDraw (Standard_False),
99 myHasOwnUnFreeBoundaryAspect (Standard_False),
100 myUnFreeBoundaryDraw (Standard_True),
101 myHasOwnUnFreeBoundaryDraw (Standard_False),
102 myHasOwnFaceBoundaryAspect (Standard_False),
103 myFaceBoundaryDraw (Standard_False),
104 myHasOwnFaceBoundaryDraw (Standard_False),
106 myHasOwnDimensionAspect (Standard_False),
107 myHasOwnDimLengthModelUnits (Standard_False),
108 myHasOwnDimAngleModelUnits (Standard_False),
109 myHasOwnDimLengthDisplayUnits (Standard_False),
110 myHasOwnDimAngleDisplayUnits (Standard_False)
112 myDimensionModelUnits.SetLengthUnits ("m");
113 myDimensionModelUnits.SetAngleUnits ("rad");
114 myDimensionDisplayUnits.SetLengthUnits ("m");
115 myDimensionDisplayUnits.SetAngleUnits ("deg");
118 // =======================================================================
119 // function : SetTypeOfDeflection
121 // =======================================================================
123 void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
125 myHasOwnTypeOfDeflection = Standard_True;
126 myTypeOfDeflection = theTypeOfDeflection;
129 // =======================================================================
130 // function : SetMaximalChordialDeviation
132 // =======================================================================
134 void Prs3d_Drawer::SetMaximalChordialDeviation (const Standard_Real theChordialDeviation)
136 myHasOwnChordialDeviation = Standard_True;
137 myChordialDeviation = theChordialDeviation;
140 // =======================================================================
141 // function : SetTypeOfHLR
142 // purpose : set type of HLR algorithm
143 // =======================================================================
145 void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
147 myTypeOfHLR = theTypeOfHLR;
150 // =======================================================================
151 // function : TypeOfHLR
152 // purpose : gets type of HLR algorithm
153 // =======================================================================
155 Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
157 if (!HasOwnTypeOfHLR())
159 if (!myLink.IsNull())
161 return myLink->TypeOfHLR();
163 // Prs3d_TOH_PolyAlgo is default value for this setting.
164 myTypeOfHLR = Prs3d_TOH_PolyAlgo;
169 // =======================================================================
170 // function : SetIsoOnTriangulation
172 // =======================================================================
173 void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
175 myHasOwnIsoOnTriangulation = Standard_True;
176 myIsoOnTriangulation = theToEnable;
179 // =======================================================================
180 // function : SetMaximalParameterValue
182 // =======================================================================
184 void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
186 myHasOwnMaximalParameterValue = Standard_True;
187 myMaximalParameterValue = theValue;
190 // =======================================================================
191 // function : SetIsoOnPlane
193 // =======================================================================
195 void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
197 myHasOwnIsoOnPlane = Standard_True;
198 myIsoOnPlane = theIsEnabled;
201 // =======================================================================
202 // function : SetDiscretisation
204 // =======================================================================
206 void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue)
208 myHasOwnNbPoints = Standard_True;
209 myNbPoints = theValue;
212 //=======================================================================
213 //function : SetDeviationCoefficient
215 //=======================================================================
217 void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
219 myPreviousDeviationCoefficient = DeviationCoefficient();
220 myDeviationCoefficient = theCoefficient;
221 myHasOwnDeviationCoefficient = Standard_True;
224 //=======================================================================
225 //function : SetHLRDeviationCoefficient
227 //=======================================================================
229 void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
231 myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient();
232 myHLRDeviationCoefficient = theCoefficient;
233 myHasOwnHLRDeviationCoefficient = Standard_True;
236 //=======================================================================
237 //function : SetDeviationAngle
239 //=======================================================================
241 void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
243 myPreviousDeviationAngle = DeviationAngle();
244 myDeviationAngle = theAngle;
245 myHasOwnDeviationAngle = Standard_True;
248 //=======================================================================
249 //function : SetHLRAngle
251 //=======================================================================
253 void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle)
255 myPreviousHLRDeviationAngle = HLRAngle();
256 myHLRAngle = theAngle;
257 myHasOwnHLRDeviationAngle = Standard_True;
260 // =======================================================================
261 // function : SetAutoTriangulation
263 // =======================================================================
265 void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
267 myHasOwnIsAutoTriangulated = Standard_True;
268 myIsAutoTriangulated = theIsEnabled;
271 // =======================================================================
272 // function : FreeBoundaryAspect
274 // =======================================================================
276 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
278 if (!HasOwnFreeBoundaryAspect())
280 if (!myLink.IsNull())
282 return myLink->FreeBoundaryAspect();
284 if (myFreeBoundaryAspect.IsNull())
286 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
289 return myFreeBoundaryAspect;
292 // =======================================================================
293 // function : FreeBoundaryAspect
295 // =======================================================================
297 void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
299 myFreeBoundaryAspect = theAspect;
300 myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
303 // =======================================================================
304 // function : SetFreeBoundaryDraw
306 // =======================================================================
308 void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
310 myHasOwnFreeBoundaryDraw = Standard_True;
311 myFreeBoundaryDraw = theIsEnabled;
314 // =======================================================================
315 // function : UnFreeBoundaryAspect
317 // =======================================================================
319 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
321 if (!HasOwnUnFreeBoundaryAspect())
323 if (!myLink.IsNull())
325 return myLink->UnFreeBoundaryAspect();
327 if (myUnFreeBoundaryAspect.IsNull())
329 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
332 return myUnFreeBoundaryAspect;
335 // =======================================================================
336 // function : SetUnFreeBoundaryAspect
338 // =======================================================================
340 void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
342 myUnFreeBoundaryAspect = theAspect;
343 myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
346 // =======================================================================
347 // function : SetUnFreeBoundaryDraw
349 // =======================================================================
351 void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
353 myHasOwnUnFreeBoundaryDraw = Standard_True;
354 myUnFreeBoundaryDraw = theIsEnabled;
357 // =======================================================================
358 // function : FaceBoundaryAspect
360 // =======================================================================
362 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
364 if (!HasOwnFaceBoundaryAspect())
366 if (!myLink.IsNull())
368 return myLink->FaceBoundaryAspect();
370 if (myFaceBoundaryAspect.IsNull())
372 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
375 return myFaceBoundaryAspect;
378 // =======================================================================
379 // function : SetFaceBoundaryAspect
381 // =======================================================================
383 void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
385 myFaceBoundaryAspect = theAspect;
386 myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
389 // =======================================================================
390 // function : SetFaceBoundaryDraw
392 // =======================================================================
394 void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
396 myHasOwnFaceBoundaryDraw = Standard_True;
397 myFaceBoundaryDraw = theIsEnabled;
400 // =======================================================================
401 // function : DimensionAspect
403 // =======================================================================
405 const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
407 if (!HasOwnDimensionAspect())
409 if (!myLink.IsNull())
411 return myLink->DimensionAspect();
413 if (myDimensionAspect.IsNull())
415 myDimensionAspect = new Prs3d_DimensionAspect;
418 return myDimensionAspect;
421 // =======================================================================
422 // function : SetDimensionAspect
424 // =======================================================================
426 void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
428 myDimensionAspect = theAspect;
429 myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
432 // =======================================================================
433 // function : SetDimLengthModelUnits
435 // =======================================================================
437 void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
439 myHasOwnDimLengthModelUnits = Standard_True;
440 myDimensionModelUnits.SetLengthUnits (theUnits);
443 // =======================================================================
444 // function : SetDimAngleModelUnits
446 // =======================================================================
448 void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
450 myHasOwnDimAngleModelUnits = Standard_True;
451 myDimensionModelUnits.SetAngleUnits (theUnits);
454 // =======================================================================
455 // function : SetDimLengthDisplayUnits
457 // =======================================================================
459 void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
461 myHasOwnDimLengthDisplayUnits = Standard_True;
462 myDimensionDisplayUnits.SetLengthUnits (theUnits);
465 // =======================================================================
466 // function : SetDimAngleDisplayUnits
468 // =======================================================================
470 void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
472 myHasOwnDimAngleDisplayUnits = Standard_True;
473 myDimensionDisplayUnits.SetAngleUnits (theUnits);
476 // =======================================================================
477 // function : UIsoAspect
479 // =======================================================================
481 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
483 if (!HasOwnUIsoAspect())
485 if (!myLink.IsNull())
487 return myLink->UIsoAspect();
489 if (myUIsoAspect.IsNull())
491 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
497 // =======================================================================
498 // function : SetUIsoAspect
500 // =======================================================================
502 void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
504 myUIsoAspect = theAspect;
505 myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
508 // =======================================================================
509 // function : VIsoAspect
511 // =======================================================================
513 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
515 if (!HasOwnVIsoAspect())
517 if (!myLink.IsNull())
519 return myLink->VIsoAspect();
521 if (myVIsoAspect.IsNull())
523 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
529 // =======================================================================
530 // function : SetVIsoAspect
532 // =======================================================================
534 void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
536 myVIsoAspect = theAspect;
537 myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
540 // =======================================================================
541 // function : WireAspect
543 // =======================================================================
545 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
547 if (!HasOwnWireAspect())
549 if (!myLink.IsNull())
551 return myLink->WireAspect();
553 if (myWireAspect.IsNull())
555 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
561 // =======================================================================
562 // function : SetWireAspect
564 // =======================================================================
566 void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
568 myWireAspect = theAspect;
569 myHasOwnWireAspect = !myWireAspect.IsNull();
572 // =======================================================================
573 // function : SetWireDraw
575 // =======================================================================
577 void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
579 myHasOwnWireDraw = Standard_True;
580 myWireDraw = theIsEnabled;
583 // =======================================================================
584 // function : PointAspect
586 // =======================================================================
588 const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
590 if (!HasOwnPointAspect())
592 if (!myLink.IsNull())
594 return myLink->PointAspect();
596 if (myPointAspect.IsNull())
598 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
601 return myPointAspect;
604 // =======================================================================
605 // function : SetupOwnPointAspect
607 // =======================================================================
608 Standard_Boolean Prs3d_Drawer::SetupOwnPointAspect (const Handle(Prs3d_Drawer)& theDefaults)
610 if (myHasOwnPointAspect)
612 return Standard_False;
615 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
616 if (!theDefaults.IsNull() && theDefaults != this)
618 *myPointAspect->Aspect() = *theDefaults->PointAspect()->Aspect();
620 else if (!myLink.IsNull())
622 *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
624 myHasOwnPointAspect = Standard_True;
625 return Standard_True;
628 // =======================================================================
629 // function : SetPointAspect
631 // =======================================================================
633 void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
635 myPointAspect = theAspect;
636 myHasOwnPointAspect = !myPointAspect.IsNull();
639 // =======================================================================
640 // function : LineAspect
642 // =======================================================================
644 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
646 if (!HasOwnLineAspect())
648 if (!myLink.IsNull())
650 return myLink->LineAspect();
652 if (myLineAspect.IsNull())
654 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
660 // =======================================================================
661 // function : SetLineAspect
663 // =======================================================================
665 void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
667 myLineAspect = theAspect;
668 myHasOwnLineAspect = !myLineAspect.IsNull();
671 // =======================================================================
672 // function : TextAspect
674 // =======================================================================
676 const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
678 if (!HasOwnTextAspect())
680 if (!myLink.IsNull())
682 return myLink->TextAspect();
684 if (myTextAspect.IsNull())
686 myTextAspect = new Prs3d_TextAspect();
692 // =======================================================================
693 // function : SetTextAspect
695 // =======================================================================
697 void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
699 myTextAspect = theAspect;
700 myHasOwnTextAspect = !myTextAspect.IsNull();
703 // =======================================================================
704 // function : ShadingAspect
706 // =======================================================================
708 const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
710 if (!HasOwnShadingAspect())
712 if (!myLink.IsNull())
714 return myLink->ShadingAspect();
716 if (myShadingAspect.IsNull())
718 myShadingAspect = new Prs3d_ShadingAspect();
721 return myShadingAspect;
724 // =======================================================================
725 // function : SetupOwnShadingAspect
727 // =======================================================================
728 Standard_Boolean Prs3d_Drawer::SetupOwnShadingAspect (const Handle(Prs3d_Drawer)& theDefaults)
730 if (myHasOwnShadingAspect)
732 return Standard_False;
735 myShadingAspect = new Prs3d_ShadingAspect();
736 if (!theDefaults.IsNull() && theDefaults != this)
738 *myShadingAspect->Aspect() = *theDefaults->ShadingAspect()->Aspect();
740 else if (!myLink.IsNull())
742 *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
744 myHasOwnShadingAspect = Standard_True;
745 return Standard_True;
748 // =======================================================================
749 // function : SetShadingAspect
751 // =======================================================================
753 void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
755 myShadingAspect = theAspect;
756 myHasOwnShadingAspect = !myShadingAspect.IsNull();
759 // =======================================================================
760 // function : PlaneAspect
762 // =======================================================================
764 const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
766 if (!HasOwnPlaneAspect())
768 if (!myLink.IsNull())
770 return myLink->PlaneAspect();
772 if (myPlaneAspect.IsNull())
774 myPlaneAspect = new Prs3d_PlaneAspect();
777 return myPlaneAspect;
780 // =======================================================================
781 // function : SetPlaneAspect
783 // =======================================================================
785 void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
787 myPlaneAspect = theAspect;
788 myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
791 // =======================================================================
792 // function : SeenLineAspect
794 // =======================================================================
796 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
798 if (!HasOwnSeenLineAspect())
800 if (!myLink.IsNull())
802 return myLink->SeenLineAspect();
804 if (mySeenLineAspect.IsNull())
806 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
809 return mySeenLineAspect;
812 // =======================================================================
813 // function : SetSeenLineAspect
815 // =======================================================================
817 void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
819 mySeenLineAspect = theAspect;
820 myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
823 // =======================================================================
824 // function : ArrowAspect
826 // =======================================================================
828 const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
830 if (!HasOwnArrowAspect())
832 if (!myLink.IsNull())
834 return myLink->ArrowAspect();
836 if (myArrowAspect.IsNull())
838 myArrowAspect = new Prs3d_ArrowAspect();
841 return myArrowAspect;
844 // =======================================================================
845 // function : SetArrowAspect
847 // =======================================================================
849 void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
851 myArrowAspect = theAspect;
852 myHasOwnArrowAspect = !myArrowAspect.IsNull();
855 // =======================================================================
856 // function : SetLineArrowDraw
858 // =======================================================================
860 void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
862 myHasOwnLineArrowDraw = Standard_True;
863 myLineArrowDraw = theIsEnabled;
866 // =======================================================================
867 // function : HiddenLineAspect
869 // =======================================================================
871 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
873 if (!HasOwnHiddenLineAspect())
875 if (!myLink.IsNull())
877 return myLink->HiddenLineAspect();
879 if (myHiddenLineAspect.IsNull())
881 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
884 return myHiddenLineAspect;
887 // =======================================================================
888 // function : SetHiddenLineAspect
890 // =======================================================================
892 void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
894 myHiddenLineAspect = theAspect;
895 myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
898 // =======================================================================
899 // function : EnableDrawHiddenLineDraw
901 // =======================================================================
903 void Prs3d_Drawer::EnableDrawHiddenLine()
905 myHasOwnDrawHiddenLine = Standard_True;
906 myDrawHiddenLine = Standard_True;
909 // =======================================================================
910 // function : DisableDrawHiddenLine
912 // =======================================================================
914 void Prs3d_Drawer::DisableDrawHiddenLine()
916 myHasOwnDrawHiddenLine = Standard_True;
917 myDrawHiddenLine = Standard_False;
920 // =======================================================================
921 // function : VectorAspect
923 // =======================================================================
925 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
927 if (!HasOwnVectorAspect())
929 if (!myLink.IsNull())
931 return myLink->VectorAspect();
933 if (myVectorAspect.IsNull())
935 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
938 return myVectorAspect;
941 // =======================================================================
942 // function : SetVectorAspect
944 // =======================================================================
946 void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
948 myVectorAspect = theAspect;
949 myHasOwnVectorAspect = !myVectorAspect.IsNull();
952 // =======================================================================
953 // function : SetVertexDrawMode
955 // =======================================================================
957 void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
959 // Prs3d_VDM_Inherited is default value and means
960 // that correct value should be taken from the Link if it exists.
961 myVertexDrawMode = theMode;
964 // =======================================================================
965 // function : VertexDrawMode
967 // =======================================================================
969 Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
971 if (!HasOwnVertexDrawMode())
973 if (!myLink.IsNull())
975 return myLink->VertexDrawMode();
977 // Prs3d_VDM_Isolated is default value for this setting.
978 myVertexDrawMode = Prs3d_VDM_Isolated;
980 return myVertexDrawMode;
983 // =======================================================================
984 // function : DatumAspect
986 // =======================================================================
988 const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
990 if (!HasOwnDatumAspect())
992 if (!myLink.IsNull())
994 return myLink->DatumAspect();
996 if (myDatumAspect.IsNull())
998 myDatumAspect = new Prs3d_DatumAspect();
1001 return myDatumAspect;
1004 // =======================================================================
1005 // function : SetDatumAspect
1007 // =======================================================================
1009 void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
1011 myDatumAspect = theAspect;
1012 myHasOwnDatumAspect = !myDatumAspect.IsNull();
1015 // =======================================================================
1016 // function : SectionAspect
1018 // =======================================================================
1020 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
1022 if (!HasOwnSectionAspect())
1024 if (!myLink.IsNull())
1026 return myLink->SectionAspect();
1028 if (mySectionAspect.IsNull())
1030 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1033 return mySectionAspect;
1036 // =======================================================================
1037 // function : SetSectionAspect
1039 // =======================================================================
1041 void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
1043 mySectionAspect = theAspect;
1044 myHasOwnSectionAspect = !mySectionAspect.IsNull();
1047 // =======================================================================
1048 // function : SetSectionAspect
1050 // =======================================================================
1052 void Prs3d_Drawer::ClearLocalAttributes()
1054 if (myLink.IsNull())
1059 myUIsoAspect.Nullify();
1060 myVIsoAspect.Nullify();
1061 myFreeBoundaryAspect.Nullify();
1062 myUnFreeBoundaryAspect.Nullify();
1063 myFaceBoundaryAspect.Nullify();
1064 myWireAspect.Nullify();
1065 myLineAspect.Nullify();
1066 myTextAspect.Nullify();
1067 myShadingAspect.Nullify();
1068 myPointAspect.Nullify();
1069 myPlaneAspect.Nullify();
1070 myArrowAspect.Nullify();
1071 myHiddenLineAspect.Nullify();
1072 mySeenLineAspect.Nullify();
1073 myVectorAspect .Nullify();
1074 myDatumAspect.Nullify();
1075 myDimensionAspect.Nullify();
1076 mySectionAspect.Nullify();
1078 myHasOwnUIsoAspect = Standard_False;
1079 myHasOwnVIsoAspect = Standard_False;
1080 myHasOwnWireAspect = Standard_False;
1081 myHasOwnPointAspect = Standard_False;
1082 myHasOwnLineAspect = Standard_False;
1083 myHasOwnTextAspect = Standard_False;
1084 myHasOwnShadingAspect = Standard_False;
1085 myHasOwnPlaneAspect = Standard_False;
1086 myHasOwnSeenLineAspect = Standard_False;
1087 myHasOwnArrowAspect = Standard_False;
1088 myHasOwnHiddenLineAspect = Standard_False;
1089 myHasOwnVectorAspect = Standard_False;
1090 myHasOwnDatumAspect = Standard_False;
1091 myHasOwnSectionAspect = Standard_False;
1092 myHasOwnFreeBoundaryAspect = Standard_False;
1093 myHasOwnUnFreeBoundaryAspect = Standard_False;
1094 myHasOwnFaceBoundaryAspect = Standard_False;
1095 myHasOwnDimensionAspect = Standard_False;
1097 myHasOwnNbPoints = Standard_False;
1098 myHasOwnMaximalParameterValue = Standard_False;
1099 myHasOwnTypeOfDeflection = Standard_False;
1100 myHasOwnChordialDeviation = Standard_False;
1101 myHasOwnDeviationCoefficient = Standard_False;
1102 myHasOwnHLRDeviationCoefficient = Standard_False;
1103 myHasOwnDeviationAngle = Standard_False;
1104 myHasOwnHLRDeviationAngle = Standard_False;
1105 myHasOwnIsoOnPlane = Standard_False;
1106 myHasOwnIsoOnTriangulation = Standard_False;
1107 myHasOwnIsAutoTriangulated = Standard_False;
1108 myHasOwnWireDraw = Standard_False;
1109 myHasOwnLineArrowDraw = Standard_False;
1110 myHasOwnDrawHiddenLine = Standard_False;
1111 myHasOwnFreeBoundaryDraw = Standard_False;
1112 myHasOwnUnFreeBoundaryDraw = Standard_False;
1113 myHasOwnFaceBoundaryDraw = Standard_False;
1114 myHasOwnDimLengthModelUnits = Standard_False;
1115 myHasOwnDimLengthDisplayUnits = Standard_False;
1116 myHasOwnDimAngleModelUnits = Standard_False;
1117 myHasOwnDimAngleDisplayUnits = Standard_False;
1119 myVertexDrawMode = Prs3d_VDM_Inherited;
1120 myTypeOfHLR = Prs3d_TOH_NotSet;
1123 // =======================================================================
1124 // function : SetOwnLineAspects
1126 // =======================================================================
1127 Standard_Boolean Prs3d_Drawer::SetOwnLineAspects (const Handle(Prs3d_Drawer)& theDefaults)
1129 bool isUpdateNeeded = false;
1130 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1131 if (!myHasOwnUIsoAspect)
1133 isUpdateNeeded = true;
1134 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1135 if (!aLink.IsNull())
1137 *myUIsoAspect->Aspect() = *aLink->UIsoAspect()->Aspect();
1138 myUIsoAspect->SetNumber (aLink->UIsoAspect()->Number());
1140 myHasOwnUIsoAspect = true;
1142 if (!myHasOwnVIsoAspect)
1144 isUpdateNeeded = true;
1145 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1146 if (!aLink.IsNull())
1148 *myVIsoAspect->Aspect() = *aLink->VIsoAspect()->Aspect();
1149 myUIsoAspect->SetNumber (aLink->VIsoAspect()->Number());
1151 myHasOwnVIsoAspect = true;
1153 if (!myHasOwnWireAspect)
1155 isUpdateNeeded = true;
1156 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
1157 myHasOwnWireAspect = true;
1158 if (!aLink.IsNull())
1160 *myWireAspect->Aspect() = *aLink->WireAspect()->Aspect();
1163 if (!myHasOwnLineAspect)
1165 isUpdateNeeded = true;
1166 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
1167 myHasOwnLineAspect = true;
1168 if (!aLink.IsNull())
1170 *myLineAspect->Aspect() = *aLink->LineAspect()->Aspect();
1173 if (!myHasOwnSeenLineAspect)
1175 isUpdateNeeded = true;
1176 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
1177 myHasOwnSeenLineAspect = true;
1178 if (!aLink.IsNull())
1180 *mySeenLineAspect->Aspect() = *aLink->SeenLineAspect()->Aspect();
1183 if (!myHasOwnHiddenLineAspect)
1185 isUpdateNeeded = true;
1186 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
1187 myHasOwnHiddenLineAspect = true;
1188 if (!aLink.IsNull())
1190 *myHiddenLineAspect->Aspect() = *aLink->HiddenLineAspect()->Aspect();
1193 if (!myHasOwnFreeBoundaryAspect)
1195 isUpdateNeeded = true;
1196 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
1197 myHasOwnFreeBoundaryAspect = true;
1198 if (!aLink.IsNull())
1200 *myFreeBoundaryAspect->Aspect() = *aLink->FreeBoundaryAspect()->Aspect();
1203 if (!myHasOwnUnFreeBoundaryAspect)
1205 isUpdateNeeded = true;
1206 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
1207 myHasOwnUnFreeBoundaryAspect = true;
1208 if (!aLink.IsNull())
1210 *myUnFreeBoundaryAspect->Aspect() = *aLink->UnFreeBoundaryAspect()->Aspect();
1213 if (!myHasOwnFaceBoundaryAspect)
1215 isUpdateNeeded = true;
1216 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
1217 myHasOwnFaceBoundaryAspect = true;
1218 if (!aLink.IsNull())
1220 *myFaceBoundaryAspect->Aspect() = *aLink->FaceBoundaryAspect()->Aspect();
1223 return isUpdateNeeded;
1226 // =======================================================================
1227 // function : SetOwnDatumAspects
1229 // =======================================================================
1230 Standard_Boolean Prs3d_Drawer::SetOwnDatumAspects (const Handle(Prs3d_Drawer)& theDefaults)
1232 bool isUpdateNeeded = false;
1233 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1234 if (!myHasOwnVectorAspect)
1236 isUpdateNeeded = true;
1237 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
1238 myHasOwnVectorAspect = true;
1239 if (!aLink.IsNull())
1241 *myVectorAspect->Aspect() = *aLink->VectorAspect()->Aspect();
1244 if (!myHasOwnSectionAspect)
1246 isUpdateNeeded = true;
1247 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1248 myHasOwnSectionAspect = true;
1249 if (!aLink.IsNull())
1251 *mySectionAspect->Aspect() = *aLink->SectionAspect()->Aspect();
1254 if (!myHasOwnPlaneAspect)
1256 isUpdateNeeded = true;
1257 myPlaneAspect = new Prs3d_PlaneAspect();
1258 myHasOwnPlaneAspect = true;
1260 if (!myHasOwnArrowAspect)
1262 isUpdateNeeded = true;
1263 myArrowAspect = new Prs3d_ArrowAspect();
1264 myHasOwnArrowAspect = true;
1266 if (!myHasOwnDatumAspect)
1268 isUpdateNeeded = true;
1269 myDatumAspect = new Prs3d_DatumAspect();
1270 myHasOwnDatumAspect = true;
1272 return isUpdateNeeded;
1275 //! Assign the shader program.
1276 template <typename T>
1277 inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1281 if (!thePrsAspect.IsNull()
1284 thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1288 // =======================================================================
1289 // function : SetShaderProgram
1291 // =======================================================================
1292 bool Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1293 const Graphic3d_GroupAspect theAspect,
1294 const bool theToOverrideDefaults)
1296 bool isUpdateNeeded = false;
1299 case Graphic3d_ASPECT_LINE:
1301 if (theToOverrideDefaults)
1303 isUpdateNeeded = SetOwnLineAspects() || isUpdateNeeded;
1304 isUpdateNeeded = SetOwnDatumAspects() || isUpdateNeeded;
1307 setAspectProgram (theProgram, myHasOwnUIsoAspect, myUIsoAspect);
1308 setAspectProgram (theProgram, myHasOwnVIsoAspect, myVIsoAspect);
1309 setAspectProgram (theProgram, myHasOwnWireAspect, myWireAspect);
1310 setAspectProgram (theProgram, myHasOwnLineAspect, myLineAspect);
1311 setAspectProgram (theProgram, myHasOwnSeenLineAspect, mySeenLineAspect);
1312 setAspectProgram (theProgram, myHasOwnHiddenLineAspect, myHiddenLineAspect);
1313 setAspectProgram (theProgram, myHasOwnVectorAspect, myVectorAspect);
1314 setAspectProgram (theProgram, myHasOwnSectionAspect, mySectionAspect);
1315 setAspectProgram (theProgram, myHasOwnFreeBoundaryAspect, myFreeBoundaryAspect);
1316 setAspectProgram (theProgram, myHasOwnUnFreeBoundaryAspect, myUnFreeBoundaryAspect);
1317 setAspectProgram (theProgram, myHasOwnFaceBoundaryAspect, myFaceBoundaryAspect);
1318 if (myHasOwnPlaneAspect)
1320 setAspectProgram (theProgram, true, myPlaneAspect->EdgesAspect());
1321 setAspectProgram (theProgram, true, myPlaneAspect->IsoAspect());
1322 setAspectProgram (theProgram, true, myPlaneAspect->ArrowAspect());
1324 if (myHasOwnDatumAspect)
1326 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_XAxis));
1327 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_YAxis));
1328 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_ZAxis));
1330 setAspectProgram (theProgram, myHasOwnArrowAspect, myArrowAspect);
1331 return isUpdateNeeded;
1333 case Graphic3d_ASPECT_TEXT:
1335 if (theToOverrideDefaults
1336 && !myHasOwnTextAspect)
1338 isUpdateNeeded = true;
1339 myTextAspect = new Prs3d_TextAspect();
1340 myHasOwnTextAspect = true;
1341 if (!myLink.IsNull())
1343 *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1347 setAspectProgram (theProgram, myHasOwnTextAspect, myTextAspect);
1348 return isUpdateNeeded;
1350 case Graphic3d_ASPECT_MARKER:
1352 if (theToOverrideDefaults
1353 && SetupOwnPointAspect())
1355 isUpdateNeeded = true;
1358 setAspectProgram (theProgram, myHasOwnPointAspect, myPointAspect);
1359 return isUpdateNeeded;
1361 case Graphic3d_ASPECT_FILL_AREA:
1363 if (theToOverrideDefaults
1364 && SetupOwnShadingAspect())
1366 isUpdateNeeded = true;
1368 setAspectProgram (theProgram, myHasOwnShadingAspect, myShadingAspect);
1369 return isUpdateNeeded;
1375 // =======================================================================
1376 // function : SetShadingModel
1378 // =======================================================================
1379 bool Prs3d_Drawer::SetShadingModel (Graphic3d_TypeOfShadingModel theModel,
1380 bool theToOverrideDefaults)
1382 bool isUpdateNeeded = false;
1384 if (theToOverrideDefaults
1385 && SetupOwnShadingAspect())
1387 isUpdateNeeded = true;
1390 if (!myShadingAspect.IsNull()
1391 && myHasOwnShadingAspect)
1393 myShadingAspect->Aspect()->SetShadingModel (theModel);
1396 return isUpdateNeeded;