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 myFaceBoundaryUpperContinuity(-1),
103 myHasOwnFaceBoundaryAspect (Standard_False),
104 myFaceBoundaryDraw (Standard_False),
105 myHasOwnFaceBoundaryDraw (Standard_False),
107 myHasOwnDimensionAspect (Standard_False),
108 myHasOwnDimLengthModelUnits (Standard_False),
109 myHasOwnDimAngleModelUnits (Standard_False),
110 myHasOwnDimLengthDisplayUnits (Standard_False),
111 myHasOwnDimAngleDisplayUnits (Standard_False)
113 myDimensionModelUnits.SetLengthUnits ("m");
114 myDimensionModelUnits.SetAngleUnits ("rad");
115 myDimensionDisplayUnits.SetLengthUnits ("m");
116 myDimensionDisplayUnits.SetAngleUnits ("deg");
119 // =======================================================================
120 // function : SetTypeOfDeflection
122 // =======================================================================
124 void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
126 myHasOwnTypeOfDeflection = Standard_True;
127 myTypeOfDeflection = theTypeOfDeflection;
130 // =======================================================================
131 // function : SetMaximalChordialDeviation
133 // =======================================================================
135 void Prs3d_Drawer::SetMaximalChordialDeviation (const Standard_Real theChordialDeviation)
137 myHasOwnChordialDeviation = Standard_True;
138 myChordialDeviation = theChordialDeviation;
141 // =======================================================================
142 // function : SetTypeOfHLR
143 // purpose : set type of HLR algorithm
144 // =======================================================================
146 void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
148 myTypeOfHLR = theTypeOfHLR;
151 // =======================================================================
152 // function : TypeOfHLR
153 // purpose : gets type of HLR algorithm
154 // =======================================================================
156 Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
158 if (!HasOwnTypeOfHLR())
160 if (!myLink.IsNull())
162 return myLink->TypeOfHLR();
164 // Prs3d_TOH_PolyAlgo is default value for this setting.
165 myTypeOfHLR = Prs3d_TOH_PolyAlgo;
170 // =======================================================================
171 // function : SetIsoOnTriangulation
173 // =======================================================================
174 void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
176 myHasOwnIsoOnTriangulation = Standard_True;
177 myIsoOnTriangulation = theToEnable;
180 // =======================================================================
181 // function : SetMaximalParameterValue
183 // =======================================================================
185 void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
187 myHasOwnMaximalParameterValue = Standard_True;
188 myMaximalParameterValue = theValue;
191 // =======================================================================
192 // function : SetIsoOnPlane
194 // =======================================================================
196 void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
198 myHasOwnIsoOnPlane = Standard_True;
199 myIsoOnPlane = theIsEnabled;
202 // =======================================================================
203 // function : SetDiscretisation
205 // =======================================================================
207 void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue)
209 myHasOwnNbPoints = Standard_True;
210 myNbPoints = theValue;
213 //=======================================================================
214 //function : SetDeviationCoefficient
216 //=======================================================================
218 void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
220 myPreviousDeviationCoefficient = DeviationCoefficient();
221 myDeviationCoefficient = theCoefficient;
222 myHasOwnDeviationCoefficient = Standard_True;
225 //=======================================================================
226 //function : SetHLRDeviationCoefficient
228 //=======================================================================
230 void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
232 myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient();
233 myHLRDeviationCoefficient = theCoefficient;
234 myHasOwnHLRDeviationCoefficient = Standard_True;
237 //=======================================================================
238 //function : SetDeviationAngle
240 //=======================================================================
242 void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
244 myPreviousDeviationAngle = DeviationAngle();
245 myDeviationAngle = theAngle;
246 myHasOwnDeviationAngle = Standard_True;
249 //=======================================================================
250 //function : SetHLRAngle
252 //=======================================================================
254 void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle)
256 myPreviousHLRDeviationAngle = HLRAngle();
257 myHLRAngle = theAngle;
258 myHasOwnHLRDeviationAngle = Standard_True;
261 // =======================================================================
262 // function : SetAutoTriangulation
264 // =======================================================================
266 void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
268 myHasOwnIsAutoTriangulated = Standard_True;
269 myIsAutoTriangulated = theIsEnabled;
272 // =======================================================================
273 // function : FreeBoundaryAspect
275 // =======================================================================
277 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
279 if (!HasOwnFreeBoundaryAspect())
281 if (!myLink.IsNull())
283 return myLink->FreeBoundaryAspect();
285 if (myFreeBoundaryAspect.IsNull())
287 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
290 return myFreeBoundaryAspect;
293 // =======================================================================
294 // function : FreeBoundaryAspect
296 // =======================================================================
298 void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
300 myFreeBoundaryAspect = theAspect;
301 myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
304 // =======================================================================
305 // function : SetFreeBoundaryDraw
307 // =======================================================================
309 void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
311 myHasOwnFreeBoundaryDraw = Standard_True;
312 myFreeBoundaryDraw = theIsEnabled;
315 // =======================================================================
316 // function : UnFreeBoundaryAspect
318 // =======================================================================
320 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
322 if (!HasOwnUnFreeBoundaryAspect())
324 if (!myLink.IsNull())
326 return myLink->UnFreeBoundaryAspect();
328 if (myUnFreeBoundaryAspect.IsNull())
330 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
333 return myUnFreeBoundaryAspect;
336 // =======================================================================
337 // function : SetUnFreeBoundaryAspect
339 // =======================================================================
341 void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
343 myUnFreeBoundaryAspect = theAspect;
344 myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
347 // =======================================================================
348 // function : SetUnFreeBoundaryDraw
350 // =======================================================================
352 void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
354 myHasOwnUnFreeBoundaryDraw = Standard_True;
355 myUnFreeBoundaryDraw = theIsEnabled;
358 // =======================================================================
359 // function : FaceBoundaryAspect
361 // =======================================================================
363 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
365 if (!HasOwnFaceBoundaryAspect())
367 if (!myLink.IsNull())
369 return myLink->FaceBoundaryAspect();
371 if (myFaceBoundaryAspect.IsNull())
373 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
376 return myFaceBoundaryAspect;
379 // =======================================================================
380 // function : SetFaceBoundaryAspect
382 // =======================================================================
384 void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
386 myFaceBoundaryAspect = theAspect;
387 myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
390 // =======================================================================
391 // function : SetFaceBoundaryDraw
393 // =======================================================================
395 void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
397 myHasOwnFaceBoundaryDraw = Standard_True;
398 myFaceBoundaryDraw = theIsEnabled;
401 // =======================================================================
402 // function : DimensionAspect
404 // =======================================================================
406 const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
408 if (!HasOwnDimensionAspect())
410 if (!myLink.IsNull())
412 return myLink->DimensionAspect();
414 if (myDimensionAspect.IsNull())
416 myDimensionAspect = new Prs3d_DimensionAspect;
419 return myDimensionAspect;
422 // =======================================================================
423 // function : SetDimensionAspect
425 // =======================================================================
427 void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
429 myDimensionAspect = theAspect;
430 myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
433 // =======================================================================
434 // function : SetDimLengthModelUnits
436 // =======================================================================
438 void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
440 myHasOwnDimLengthModelUnits = Standard_True;
441 myDimensionModelUnits.SetLengthUnits (theUnits);
444 // =======================================================================
445 // function : SetDimAngleModelUnits
447 // =======================================================================
449 void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
451 myHasOwnDimAngleModelUnits = Standard_True;
452 myDimensionModelUnits.SetAngleUnits (theUnits);
455 // =======================================================================
456 // function : SetDimLengthDisplayUnits
458 // =======================================================================
460 void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
462 myHasOwnDimLengthDisplayUnits = Standard_True;
463 myDimensionDisplayUnits.SetLengthUnits (theUnits);
466 // =======================================================================
467 // function : SetDimAngleDisplayUnits
469 // =======================================================================
471 void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
473 myHasOwnDimAngleDisplayUnits = Standard_True;
474 myDimensionDisplayUnits.SetAngleUnits (theUnits);
477 // =======================================================================
478 // function : UIsoAspect
480 // =======================================================================
482 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
484 if (!HasOwnUIsoAspect())
486 if (!myLink.IsNull())
488 return myLink->UIsoAspect();
490 if (myUIsoAspect.IsNull())
492 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
498 // =======================================================================
499 // function : SetUIsoAspect
501 // =======================================================================
503 void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
505 myUIsoAspect = theAspect;
506 myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
509 // =======================================================================
510 // function : VIsoAspect
512 // =======================================================================
514 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
516 if (!HasOwnVIsoAspect())
518 if (!myLink.IsNull())
520 return myLink->VIsoAspect();
522 if (myVIsoAspect.IsNull())
524 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
530 // =======================================================================
531 // function : SetVIsoAspect
533 // =======================================================================
535 void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
537 myVIsoAspect = theAspect;
538 myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
541 // =======================================================================
542 // function : WireAspect
544 // =======================================================================
546 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
548 if (!HasOwnWireAspect())
550 if (!myLink.IsNull())
552 return myLink->WireAspect();
554 if (myWireAspect.IsNull())
556 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
562 // =======================================================================
563 // function : SetWireAspect
565 // =======================================================================
567 void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
569 myWireAspect = theAspect;
570 myHasOwnWireAspect = !myWireAspect.IsNull();
573 // =======================================================================
574 // function : SetWireDraw
576 // =======================================================================
578 void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
580 myHasOwnWireDraw = Standard_True;
581 myWireDraw = theIsEnabled;
584 // =======================================================================
585 // function : PointAspect
587 // =======================================================================
589 const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
591 if (!HasOwnPointAspect())
593 if (!myLink.IsNull())
595 return myLink->PointAspect();
597 if (myPointAspect.IsNull())
599 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
602 return myPointAspect;
605 // =======================================================================
606 // function : SetupOwnPointAspect
608 // =======================================================================
609 Standard_Boolean Prs3d_Drawer::SetupOwnPointAspect (const Handle(Prs3d_Drawer)& theDefaults)
611 if (myHasOwnPointAspect)
613 return Standard_False;
616 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
617 if (!theDefaults.IsNull() && theDefaults != this)
619 *myPointAspect->Aspect() = *theDefaults->PointAspect()->Aspect();
621 else if (!myLink.IsNull())
623 *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
625 myHasOwnPointAspect = Standard_True;
626 return Standard_True;
629 // =======================================================================
630 // function : SetPointAspect
632 // =======================================================================
634 void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
636 myPointAspect = theAspect;
637 myHasOwnPointAspect = !myPointAspect.IsNull();
640 // =======================================================================
641 // function : LineAspect
643 // =======================================================================
645 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
647 if (!HasOwnLineAspect())
649 if (!myLink.IsNull())
651 return myLink->LineAspect();
653 if (myLineAspect.IsNull())
655 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
661 // =======================================================================
662 // function : SetLineAspect
664 // =======================================================================
666 void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
668 myLineAspect = theAspect;
669 myHasOwnLineAspect = !myLineAspect.IsNull();
672 // =======================================================================
673 // function : TextAspect
675 // =======================================================================
677 const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
679 if (!HasOwnTextAspect())
681 if (!myLink.IsNull())
683 return myLink->TextAspect();
685 if (myTextAspect.IsNull())
687 myTextAspect = new Prs3d_TextAspect();
693 // =======================================================================
694 // function : SetTextAspect
696 // =======================================================================
698 void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
700 myTextAspect = theAspect;
701 myHasOwnTextAspect = !myTextAspect.IsNull();
704 // =======================================================================
705 // function : ShadingAspect
707 // =======================================================================
709 const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
711 if (!HasOwnShadingAspect())
713 if (!myLink.IsNull())
715 return myLink->ShadingAspect();
717 if (myShadingAspect.IsNull())
719 myShadingAspect = new Prs3d_ShadingAspect();
722 return myShadingAspect;
725 // =======================================================================
726 // function : SetupOwnShadingAspect
728 // =======================================================================
729 Standard_Boolean Prs3d_Drawer::SetupOwnShadingAspect (const Handle(Prs3d_Drawer)& theDefaults)
731 if (myHasOwnShadingAspect)
733 return Standard_False;
736 myShadingAspect = new Prs3d_ShadingAspect();
737 if (!theDefaults.IsNull() && theDefaults != this)
739 *myShadingAspect->Aspect() = *theDefaults->ShadingAspect()->Aspect();
741 else if (!myLink.IsNull())
743 *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
745 myHasOwnShadingAspect = Standard_True;
746 return Standard_True;
749 // =======================================================================
750 // function : SetShadingAspect
752 // =======================================================================
754 void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
756 myShadingAspect = theAspect;
757 myHasOwnShadingAspect = !myShadingAspect.IsNull();
760 // =======================================================================
761 // function : PlaneAspect
763 // =======================================================================
765 const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
767 if (!HasOwnPlaneAspect())
769 if (!myLink.IsNull())
771 return myLink->PlaneAspect();
773 if (myPlaneAspect.IsNull())
775 myPlaneAspect = new Prs3d_PlaneAspect();
778 return myPlaneAspect;
781 // =======================================================================
782 // function : SetPlaneAspect
784 // =======================================================================
786 void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
788 myPlaneAspect = theAspect;
789 myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
792 // =======================================================================
793 // function : SeenLineAspect
795 // =======================================================================
797 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
799 if (!HasOwnSeenLineAspect())
801 if (!myLink.IsNull())
803 return myLink->SeenLineAspect();
805 if (mySeenLineAspect.IsNull())
807 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
810 return mySeenLineAspect;
813 // =======================================================================
814 // function : SetSeenLineAspect
816 // =======================================================================
818 void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
820 mySeenLineAspect = theAspect;
821 myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
824 // =======================================================================
825 // function : ArrowAspect
827 // =======================================================================
829 const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
831 if (!HasOwnArrowAspect())
833 if (!myLink.IsNull())
835 return myLink->ArrowAspect();
837 if (myArrowAspect.IsNull())
839 myArrowAspect = new Prs3d_ArrowAspect();
842 return myArrowAspect;
845 // =======================================================================
846 // function : SetArrowAspect
848 // =======================================================================
850 void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
852 myArrowAspect = theAspect;
853 myHasOwnArrowAspect = !myArrowAspect.IsNull();
856 // =======================================================================
857 // function : SetLineArrowDraw
859 // =======================================================================
861 void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
863 myHasOwnLineArrowDraw = Standard_True;
864 myLineArrowDraw = theIsEnabled;
867 // =======================================================================
868 // function : HiddenLineAspect
870 // =======================================================================
872 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
874 if (!HasOwnHiddenLineAspect())
876 if (!myLink.IsNull())
878 return myLink->HiddenLineAspect();
880 if (myHiddenLineAspect.IsNull())
882 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
885 return myHiddenLineAspect;
888 // =======================================================================
889 // function : SetHiddenLineAspect
891 // =======================================================================
893 void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
895 myHiddenLineAspect = theAspect;
896 myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
899 // =======================================================================
900 // function : EnableDrawHiddenLineDraw
902 // =======================================================================
904 void Prs3d_Drawer::EnableDrawHiddenLine()
906 myHasOwnDrawHiddenLine = Standard_True;
907 myDrawHiddenLine = Standard_True;
910 // =======================================================================
911 // function : DisableDrawHiddenLine
913 // =======================================================================
915 void Prs3d_Drawer::DisableDrawHiddenLine()
917 myHasOwnDrawHiddenLine = Standard_True;
918 myDrawHiddenLine = Standard_False;
921 // =======================================================================
922 // function : VectorAspect
924 // =======================================================================
926 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
928 if (!HasOwnVectorAspect())
930 if (!myLink.IsNull())
932 return myLink->VectorAspect();
934 if (myVectorAspect.IsNull())
936 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
939 return myVectorAspect;
942 // =======================================================================
943 // function : SetVectorAspect
945 // =======================================================================
947 void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
949 myVectorAspect = theAspect;
950 myHasOwnVectorAspect = !myVectorAspect.IsNull();
953 // =======================================================================
954 // function : SetVertexDrawMode
956 // =======================================================================
958 void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
960 // Prs3d_VDM_Inherited is default value and means
961 // that correct value should be taken from the Link if it exists.
962 myVertexDrawMode = theMode;
965 // =======================================================================
966 // function : VertexDrawMode
968 // =======================================================================
970 Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
972 if (!HasOwnVertexDrawMode())
974 if (!myLink.IsNull())
976 return myLink->VertexDrawMode();
978 // Prs3d_VDM_Isolated is default value for this setting.
979 myVertexDrawMode = Prs3d_VDM_Isolated;
981 return myVertexDrawMode;
984 // =======================================================================
985 // function : DatumAspect
987 // =======================================================================
989 const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
991 if (!HasOwnDatumAspect())
993 if (!myLink.IsNull())
995 return myLink->DatumAspect();
997 if (myDatumAspect.IsNull())
999 myDatumAspect = new Prs3d_DatumAspect();
1002 return myDatumAspect;
1005 // =======================================================================
1006 // function : SetDatumAspect
1008 // =======================================================================
1010 void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
1012 myDatumAspect = theAspect;
1013 myHasOwnDatumAspect = !myDatumAspect.IsNull();
1016 // =======================================================================
1017 // function : SectionAspect
1019 // =======================================================================
1021 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
1023 if (!HasOwnSectionAspect())
1025 if (!myLink.IsNull())
1027 return myLink->SectionAspect();
1029 if (mySectionAspect.IsNull())
1031 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1034 return mySectionAspect;
1037 // =======================================================================
1038 // function : SetSectionAspect
1040 // =======================================================================
1042 void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
1044 mySectionAspect = theAspect;
1045 myHasOwnSectionAspect = !mySectionAspect.IsNull();
1048 // =======================================================================
1049 // function : SetSectionAspect
1051 // =======================================================================
1053 void Prs3d_Drawer::ClearLocalAttributes()
1055 if (myLink.IsNull())
1060 myUIsoAspect.Nullify();
1061 myVIsoAspect.Nullify();
1062 myFreeBoundaryAspect.Nullify();
1063 myUnFreeBoundaryAspect.Nullify();
1064 myFaceBoundaryAspect.Nullify();
1065 myWireAspect.Nullify();
1066 myLineAspect.Nullify();
1067 myTextAspect.Nullify();
1068 myShadingAspect.Nullify();
1069 myPointAspect.Nullify();
1070 myPlaneAspect.Nullify();
1071 myArrowAspect.Nullify();
1072 myHiddenLineAspect.Nullify();
1073 mySeenLineAspect.Nullify();
1074 myVectorAspect .Nullify();
1075 myDatumAspect.Nullify();
1076 myDimensionAspect.Nullify();
1077 mySectionAspect.Nullify();
1079 myHasOwnUIsoAspect = Standard_False;
1080 myHasOwnVIsoAspect = Standard_False;
1081 myHasOwnWireAspect = Standard_False;
1082 myHasOwnPointAspect = Standard_False;
1083 myHasOwnLineAspect = Standard_False;
1084 myHasOwnTextAspect = Standard_False;
1085 myHasOwnShadingAspect = Standard_False;
1086 myHasOwnPlaneAspect = Standard_False;
1087 myHasOwnSeenLineAspect = Standard_False;
1088 myHasOwnArrowAspect = Standard_False;
1089 myHasOwnHiddenLineAspect = Standard_False;
1090 myHasOwnVectorAspect = Standard_False;
1091 myHasOwnDatumAspect = Standard_False;
1092 myHasOwnSectionAspect = Standard_False;
1093 myHasOwnFreeBoundaryAspect = Standard_False;
1094 myHasOwnUnFreeBoundaryAspect = Standard_False;
1095 myHasOwnFaceBoundaryAspect = Standard_False;
1096 myHasOwnDimensionAspect = Standard_False;
1098 myHasOwnNbPoints = Standard_False;
1099 myHasOwnMaximalParameterValue = Standard_False;
1100 myHasOwnTypeOfDeflection = Standard_False;
1101 myHasOwnChordialDeviation = Standard_False;
1102 myHasOwnDeviationCoefficient = Standard_False;
1103 myHasOwnHLRDeviationCoefficient = Standard_False;
1104 myHasOwnDeviationAngle = Standard_False;
1105 myHasOwnHLRDeviationAngle = Standard_False;
1106 myHasOwnIsoOnPlane = Standard_False;
1107 myHasOwnIsoOnTriangulation = Standard_False;
1108 myHasOwnIsAutoTriangulated = Standard_False;
1109 myHasOwnWireDraw = Standard_False;
1110 myHasOwnLineArrowDraw = Standard_False;
1111 myHasOwnDrawHiddenLine = Standard_False;
1112 myHasOwnFreeBoundaryDraw = Standard_False;
1113 myHasOwnUnFreeBoundaryDraw = Standard_False;
1114 myHasOwnFaceBoundaryDraw = Standard_False;
1115 myHasOwnDimLengthModelUnits = Standard_False;
1116 myHasOwnDimLengthDisplayUnits = Standard_False;
1117 myHasOwnDimAngleModelUnits = Standard_False;
1118 myHasOwnDimAngleDisplayUnits = Standard_False;
1120 myVertexDrawMode = Prs3d_VDM_Inherited;
1121 myTypeOfHLR = Prs3d_TOH_NotSet;
1124 // =======================================================================
1125 // function : SetupOwnFaceBoundaryAspect
1127 // =======================================================================
1128 Standard_Boolean Prs3d_Drawer::SetupOwnFaceBoundaryAspect (const Handle(Prs3d_Drawer)& theDefaults)
1130 if (myHasOwnFaceBoundaryAspect)
1135 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
1136 myHasOwnFaceBoundaryAspect = true;
1138 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1139 if (!aLink.IsNull())
1141 *myFaceBoundaryAspect->Aspect() = *aLink->FaceBoundaryAspect()->Aspect();
1146 // =======================================================================
1147 // function : SetOwnLineAspects
1149 // =======================================================================
1150 Standard_Boolean Prs3d_Drawer::SetOwnLineAspects (const Handle(Prs3d_Drawer)& theDefaults)
1152 bool isUpdateNeeded = false;
1153 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1154 if (!myHasOwnUIsoAspect)
1156 isUpdateNeeded = true;
1157 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1158 if (!aLink.IsNull())
1160 *myUIsoAspect->Aspect() = *aLink->UIsoAspect()->Aspect();
1161 myUIsoAspect->SetNumber (aLink->UIsoAspect()->Number());
1163 myHasOwnUIsoAspect = true;
1165 if (!myHasOwnVIsoAspect)
1167 isUpdateNeeded = true;
1168 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1169 if (!aLink.IsNull())
1171 *myVIsoAspect->Aspect() = *aLink->VIsoAspect()->Aspect();
1172 myUIsoAspect->SetNumber (aLink->VIsoAspect()->Number());
1174 myHasOwnVIsoAspect = true;
1176 if (!myHasOwnWireAspect)
1178 isUpdateNeeded = true;
1179 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
1180 myHasOwnWireAspect = true;
1181 if (!aLink.IsNull())
1183 *myWireAspect->Aspect() = *aLink->WireAspect()->Aspect();
1186 if (!myHasOwnLineAspect)
1188 isUpdateNeeded = true;
1189 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
1190 myHasOwnLineAspect = true;
1191 if (!aLink.IsNull())
1193 *myLineAspect->Aspect() = *aLink->LineAspect()->Aspect();
1196 if (!myHasOwnSeenLineAspect)
1198 isUpdateNeeded = true;
1199 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
1200 myHasOwnSeenLineAspect = true;
1201 if (!aLink.IsNull())
1203 *mySeenLineAspect->Aspect() = *aLink->SeenLineAspect()->Aspect();
1206 if (!myHasOwnHiddenLineAspect)
1208 isUpdateNeeded = true;
1209 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
1210 myHasOwnHiddenLineAspect = true;
1211 if (!aLink.IsNull())
1213 *myHiddenLineAspect->Aspect() = *aLink->HiddenLineAspect()->Aspect();
1216 if (!myHasOwnFreeBoundaryAspect)
1218 isUpdateNeeded = true;
1219 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
1220 myHasOwnFreeBoundaryAspect = true;
1221 if (!aLink.IsNull())
1223 *myFreeBoundaryAspect->Aspect() = *aLink->FreeBoundaryAspect()->Aspect();
1226 if (!myHasOwnUnFreeBoundaryAspect)
1228 isUpdateNeeded = true;
1229 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
1230 myHasOwnUnFreeBoundaryAspect = true;
1231 if (!aLink.IsNull())
1233 *myUnFreeBoundaryAspect->Aspect() = *aLink->UnFreeBoundaryAspect()->Aspect();
1236 isUpdateNeeded = SetupOwnFaceBoundaryAspect (theDefaults) || isUpdateNeeded;
1237 return isUpdateNeeded;
1240 // =======================================================================
1241 // function : SetOwnDatumAspects
1243 // =======================================================================
1244 Standard_Boolean Prs3d_Drawer::SetOwnDatumAspects (const Handle(Prs3d_Drawer)& theDefaults)
1246 bool isUpdateNeeded = false;
1247 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1248 if (!myHasOwnVectorAspect)
1250 isUpdateNeeded = true;
1251 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
1252 myHasOwnVectorAspect = true;
1253 if (!aLink.IsNull())
1255 *myVectorAspect->Aspect() = *aLink->VectorAspect()->Aspect();
1258 if (!myHasOwnSectionAspect)
1260 isUpdateNeeded = true;
1261 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1262 myHasOwnSectionAspect = true;
1263 if (!aLink.IsNull())
1265 *mySectionAspect->Aspect() = *aLink->SectionAspect()->Aspect();
1268 if (!myHasOwnPlaneAspect)
1270 isUpdateNeeded = true;
1271 myPlaneAspect = new Prs3d_PlaneAspect();
1272 myHasOwnPlaneAspect = true;
1274 if (!myHasOwnArrowAspect)
1276 isUpdateNeeded = true;
1277 myArrowAspect = new Prs3d_ArrowAspect();
1278 myHasOwnArrowAspect = true;
1280 if (!myHasOwnDatumAspect)
1282 isUpdateNeeded = true;
1283 myDatumAspect = new Prs3d_DatumAspect();
1284 myHasOwnDatumAspect = true;
1286 return isUpdateNeeded;
1289 //! Assign the shader program.
1290 template <typename T>
1291 inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1295 if (!thePrsAspect.IsNull()
1298 thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1302 // =======================================================================
1303 // function : SetShaderProgram
1305 // =======================================================================
1306 bool Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1307 const Graphic3d_GroupAspect theAspect,
1308 const bool theToOverrideDefaults)
1310 bool isUpdateNeeded = false;
1313 case Graphic3d_ASPECT_LINE:
1315 if (theToOverrideDefaults)
1317 isUpdateNeeded = SetOwnLineAspects() || isUpdateNeeded;
1318 isUpdateNeeded = SetOwnDatumAspects() || isUpdateNeeded;
1321 setAspectProgram (theProgram, myHasOwnUIsoAspect, myUIsoAspect);
1322 setAspectProgram (theProgram, myHasOwnVIsoAspect, myVIsoAspect);
1323 setAspectProgram (theProgram, myHasOwnWireAspect, myWireAspect);
1324 setAspectProgram (theProgram, myHasOwnLineAspect, myLineAspect);
1325 setAspectProgram (theProgram, myHasOwnSeenLineAspect, mySeenLineAspect);
1326 setAspectProgram (theProgram, myHasOwnHiddenLineAspect, myHiddenLineAspect);
1327 setAspectProgram (theProgram, myHasOwnVectorAspect, myVectorAspect);
1328 setAspectProgram (theProgram, myHasOwnSectionAspect, mySectionAspect);
1329 setAspectProgram (theProgram, myHasOwnFreeBoundaryAspect, myFreeBoundaryAspect);
1330 setAspectProgram (theProgram, myHasOwnUnFreeBoundaryAspect, myUnFreeBoundaryAspect);
1331 setAspectProgram (theProgram, myHasOwnFaceBoundaryAspect, myFaceBoundaryAspect);
1332 if (myHasOwnPlaneAspect)
1334 setAspectProgram (theProgram, true, myPlaneAspect->EdgesAspect());
1335 setAspectProgram (theProgram, true, myPlaneAspect->IsoAspect());
1336 setAspectProgram (theProgram, true, myPlaneAspect->ArrowAspect());
1338 if (myHasOwnDatumAspect)
1340 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_XAxis));
1341 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_YAxis));
1342 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_ZAxis));
1344 setAspectProgram (theProgram, myHasOwnArrowAspect, myArrowAspect);
1345 return isUpdateNeeded;
1347 case Graphic3d_ASPECT_TEXT:
1349 if (theToOverrideDefaults
1350 && !myHasOwnTextAspect)
1352 isUpdateNeeded = true;
1353 myTextAspect = new Prs3d_TextAspect();
1354 myHasOwnTextAspect = true;
1355 if (!myLink.IsNull())
1357 *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1361 setAspectProgram (theProgram, myHasOwnTextAspect, myTextAspect);
1362 return isUpdateNeeded;
1364 case Graphic3d_ASPECT_MARKER:
1366 if (theToOverrideDefaults
1367 && SetupOwnPointAspect())
1369 isUpdateNeeded = true;
1372 setAspectProgram (theProgram, myHasOwnPointAspect, myPointAspect);
1373 return isUpdateNeeded;
1375 case Graphic3d_ASPECT_FILL_AREA:
1377 if (theToOverrideDefaults
1378 && SetupOwnShadingAspect())
1380 isUpdateNeeded = true;
1382 setAspectProgram (theProgram, myHasOwnShadingAspect, myShadingAspect);
1383 return isUpdateNeeded;
1389 // =======================================================================
1390 // function : SetShadingModel
1392 // =======================================================================
1393 bool Prs3d_Drawer::SetShadingModel (Graphic3d_TypeOfShadingModel theModel,
1394 bool theToOverrideDefaults)
1396 bool isUpdateNeeded = false;
1398 if (theToOverrideDefaults
1399 && SetupOwnShadingAspect())
1401 isUpdateNeeded = true;
1404 if (!myShadingAspect.IsNull()
1405 && myHasOwnShadingAspect)
1407 myShadingAspect->Aspect()->SetShadingModel (theModel);
1410 return isUpdateNeeded;