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>
29 #include <Standard_Dump.hxx>
31 IMPLEMENT_STANDARD_RTTIEXT(Prs3d_Drawer, Graphic3d_PresentationAttributes)
35 static const Quantity_NameOfColor THE_DEF_COLOR_FreeBoundary = Quantity_NOC_GREEN;
36 static const Quantity_NameOfColor THE_DEF_COLOR_UnFreeBoundary = Quantity_NOC_YELLOW;
37 static const Quantity_NameOfColor THE_DEF_COLOR_FaceBoundary = Quantity_NOC_BLACK;
38 static const Quantity_NameOfColor THE_DEF_COLOR_Wire = Quantity_NOC_RED;
39 static const Quantity_NameOfColor THE_DEF_COLOR_Line = Quantity_NOC_YELLOW;
40 static const Quantity_NameOfColor THE_DEF_COLOR_SeenLine = Quantity_NOC_YELLOW;
41 static const Quantity_NameOfColor THE_DEF_COLOR_HiddenLine = Quantity_NOC_YELLOW;
42 static const Quantity_NameOfColor THE_DEF_COLOR_Vector = Quantity_NOC_SKYBLUE;
43 static const Quantity_NameOfColor THE_DEF_COLOR_Section = Quantity_NOC_ORANGE;
46 // =======================================================================
47 // function : Prs3d_Drawer
49 // =======================================================================
50 Prs3d_Drawer::Prs3d_Drawer()
52 myHasOwnNbPoints (Standard_False),
53 myMaximalParameterValue (500000.),
54 myHasOwnMaximalParameterValue (Standard_False),
55 myChordialDeviation (0.0001),
56 myHasOwnChordialDeviation (Standard_False),
57 myTypeOfDeflection (Aspect_TOD_RELATIVE),
58 myHasOwnTypeOfDeflection (Standard_False),
59 myTypeOfHLR (Prs3d_TOH_NotSet),
60 myDeviationCoefficient (0.001),
61 myHasOwnDeviationCoefficient (Standard_False),
62 myHLRDeviationCoefficient (0.02),
63 myHasOwnHLRDeviationCoefficient (Standard_False),
64 myDeviationAngle (12.0 * M_PI / 180.0),
65 myHasOwnDeviationAngle (Standard_False),
66 myHLRAngle (20.0 * M_PI / 180.0),
67 myHasOwnHLRDeviationAngle (Standard_False),
68 myIsoOnPlane (Standard_False),
69 myHasOwnIsoOnPlane (Standard_False),
70 myIsoOnTriangulation (Standard_False),
71 myHasOwnIsoOnTriangulation (Standard_False),
72 myIsAutoTriangulated (Standard_True),
73 myHasOwnIsAutoTriangulated (Standard_False),
75 myHasOwnUIsoAspect (Standard_False),
76 myHasOwnVIsoAspect (Standard_False),
77 myHasOwnWireAspect (Standard_False),
78 myWireDraw (Standard_True),
79 myHasOwnWireDraw (Standard_False),
80 myHasOwnPointAspect (Standard_False),
81 myHasOwnLineAspect (Standard_False),
82 myHasOwnTextAspect (Standard_False),
83 myHasOwnShadingAspect (Standard_False),
84 myHasOwnPlaneAspect (Standard_False),
85 myHasOwnSeenLineAspect (Standard_False),
86 myHasOwnArrowAspect (Standard_False),
87 myLineArrowDraw (Standard_False),
88 myHasOwnLineArrowDraw (Standard_False),
89 myHasOwnHiddenLineAspect (Standard_False),
90 myDrawHiddenLine (Standard_False),
91 myHasOwnDrawHiddenLine (Standard_False),
92 myHasOwnVectorAspect (Standard_False),
93 myVertexDrawMode (Prs3d_VDM_Inherited),
94 myHasOwnDatumAspect (Standard_False),
95 myHasOwnSectionAspect (Standard_False),
97 myHasOwnFreeBoundaryAspect (Standard_False),
98 myFreeBoundaryDraw (Standard_True),
99 myHasOwnFreeBoundaryDraw (Standard_False),
100 myHasOwnUnFreeBoundaryAspect (Standard_False),
101 myUnFreeBoundaryDraw (Standard_True),
102 myHasOwnUnFreeBoundaryDraw (Standard_False),
103 myFaceBoundaryUpperContinuity(-1),
104 myHasOwnFaceBoundaryAspect (Standard_False),
105 myFaceBoundaryDraw (Standard_False),
106 myHasOwnFaceBoundaryDraw (Standard_False),
108 myHasOwnDimensionAspect (Standard_False),
109 myHasOwnDimLengthModelUnits (Standard_False),
110 myHasOwnDimAngleModelUnits (Standard_False),
111 myHasOwnDimLengthDisplayUnits (Standard_False),
112 myHasOwnDimAngleDisplayUnits (Standard_False)
114 myDimensionModelUnits.SetLengthUnits ("m");
115 myDimensionModelUnits.SetAngleUnits ("rad");
116 myDimensionDisplayUnits.SetLengthUnits ("m");
117 myDimensionDisplayUnits.SetAngleUnits ("deg");
120 // =======================================================================
121 // function : SetTypeOfDeflection
123 // =======================================================================
125 void Prs3d_Drawer::SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection)
127 myHasOwnTypeOfDeflection = Standard_True;
128 myTypeOfDeflection = theTypeOfDeflection;
131 // =======================================================================
132 // function : SetMaximalChordialDeviation
134 // =======================================================================
136 void Prs3d_Drawer::SetMaximalChordialDeviation (const Standard_Real theChordialDeviation)
138 myHasOwnChordialDeviation = Standard_True;
139 myChordialDeviation = theChordialDeviation;
142 // =======================================================================
143 // function : SetTypeOfHLR
144 // purpose : set type of HLR algorithm
145 // =======================================================================
147 void Prs3d_Drawer::SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR)
149 myTypeOfHLR = theTypeOfHLR;
152 // =======================================================================
153 // function : TypeOfHLR
154 // purpose : gets type of HLR algorithm
155 // =======================================================================
157 Prs3d_TypeOfHLR Prs3d_Drawer::TypeOfHLR()
159 if (!HasOwnTypeOfHLR())
161 if (!myLink.IsNull())
163 return myLink->TypeOfHLR();
165 // Prs3d_TOH_PolyAlgo is default value for this setting.
166 myTypeOfHLR = Prs3d_TOH_PolyAlgo;
171 // =======================================================================
172 // function : SetIsoOnTriangulation
174 // =======================================================================
175 void Prs3d_Drawer::SetIsoOnTriangulation (const Standard_Boolean theToEnable)
177 myHasOwnIsoOnTriangulation = Standard_True;
178 myIsoOnTriangulation = theToEnable;
181 // =======================================================================
182 // function : SetMaximalParameterValue
184 // =======================================================================
186 void Prs3d_Drawer::SetMaximalParameterValue (const Standard_Real theValue)
188 myHasOwnMaximalParameterValue = Standard_True;
189 myMaximalParameterValue = theValue;
192 // =======================================================================
193 // function : SetIsoOnPlane
195 // =======================================================================
197 void Prs3d_Drawer::SetIsoOnPlane (const Standard_Boolean theIsEnabled)
199 myHasOwnIsoOnPlane = Standard_True;
200 myIsoOnPlane = theIsEnabled;
203 // =======================================================================
204 // function : SetDiscretisation
206 // =======================================================================
208 void Prs3d_Drawer::SetDiscretisation (const Standard_Integer theValue)
210 myHasOwnNbPoints = Standard_True;
211 myNbPoints = theValue;
214 //=======================================================================
215 //function : SetDeviationCoefficient
217 //=======================================================================
219 void Prs3d_Drawer::SetDeviationCoefficient (const Standard_Real theCoefficient)
221 myPreviousDeviationCoefficient = DeviationCoefficient();
222 myDeviationCoefficient = theCoefficient;
223 myHasOwnDeviationCoefficient = Standard_True;
226 //=======================================================================
227 //function : SetHLRDeviationCoefficient
229 //=======================================================================
231 void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
233 myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient();
234 myHLRDeviationCoefficient = theCoefficient;
235 myHasOwnHLRDeviationCoefficient = Standard_True;
238 //=======================================================================
239 //function : SetDeviationAngle
241 //=======================================================================
243 void Prs3d_Drawer::SetDeviationAngle (const Standard_Real theAngle)
245 myPreviousDeviationAngle = DeviationAngle();
246 myDeviationAngle = theAngle;
247 myHasOwnDeviationAngle = Standard_True;
250 //=======================================================================
251 //function : SetHLRAngle
253 //=======================================================================
255 void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle)
257 myPreviousHLRDeviationAngle = HLRAngle();
258 myHLRAngle = theAngle;
259 myHasOwnHLRDeviationAngle = Standard_True;
262 // =======================================================================
263 // function : SetAutoTriangulation
265 // =======================================================================
267 void Prs3d_Drawer::SetAutoTriangulation (const Standard_Boolean theIsEnabled)
269 myHasOwnIsAutoTriangulated = Standard_True;
270 myIsAutoTriangulated = theIsEnabled;
273 // =======================================================================
274 // function : FreeBoundaryAspect
276 // =======================================================================
278 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FreeBoundaryAspect()
280 if (!HasOwnFreeBoundaryAspect())
282 if (!myLink.IsNull())
284 return myLink->FreeBoundaryAspect();
286 if (myFreeBoundaryAspect.IsNull())
288 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
291 return myFreeBoundaryAspect;
294 // =======================================================================
295 // function : FreeBoundaryAspect
297 // =======================================================================
299 void Prs3d_Drawer::SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
301 myFreeBoundaryAspect = theAspect;
302 myHasOwnFreeBoundaryAspect = !myFreeBoundaryAspect.IsNull();
305 // =======================================================================
306 // function : SetFreeBoundaryDraw
308 // =======================================================================
310 void Prs3d_Drawer::SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
312 myHasOwnFreeBoundaryDraw = Standard_True;
313 myFreeBoundaryDraw = theIsEnabled;
316 // =======================================================================
317 // function : UnFreeBoundaryAspect
319 // =======================================================================
321 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::UnFreeBoundaryAspect()
323 if (!HasOwnUnFreeBoundaryAspect())
325 if (!myLink.IsNull())
327 return myLink->UnFreeBoundaryAspect();
329 if (myUnFreeBoundaryAspect.IsNull())
331 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
334 return myUnFreeBoundaryAspect;
337 // =======================================================================
338 // function : SetUnFreeBoundaryAspect
340 // =======================================================================
342 void Prs3d_Drawer::SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
344 myUnFreeBoundaryAspect = theAspect;
345 myHasOwnUnFreeBoundaryAspect = !myUnFreeBoundaryAspect.IsNull();
348 // =======================================================================
349 // function : SetUnFreeBoundaryDraw
351 // =======================================================================
353 void Prs3d_Drawer::SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled)
355 myHasOwnUnFreeBoundaryDraw = Standard_True;
356 myUnFreeBoundaryDraw = theIsEnabled;
359 // =======================================================================
360 // function : FaceBoundaryAspect
362 // =======================================================================
364 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::FaceBoundaryAspect()
366 if (!HasOwnFaceBoundaryAspect())
368 if (!myLink.IsNull())
370 return myLink->FaceBoundaryAspect();
372 if (myFaceBoundaryAspect.IsNull())
374 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
377 return myFaceBoundaryAspect;
380 // =======================================================================
381 // function : SetFaceBoundaryAspect
383 // =======================================================================
385 void Prs3d_Drawer::SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect)
387 myFaceBoundaryAspect = theAspect;
388 myHasOwnFaceBoundaryAspect = !myFaceBoundaryAspect.IsNull();
391 // =======================================================================
392 // function : SetFaceBoundaryDraw
394 // =======================================================================
396 void Prs3d_Drawer::SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled)
398 myHasOwnFaceBoundaryDraw = Standard_True;
399 myFaceBoundaryDraw = theIsEnabled;
402 // =======================================================================
403 // function : DimensionAspect
405 // =======================================================================
407 const Handle(Prs3d_DimensionAspect)& Prs3d_Drawer::DimensionAspect()
409 if (!HasOwnDimensionAspect())
411 if (!myLink.IsNull())
413 return myLink->DimensionAspect();
415 if (myDimensionAspect.IsNull())
417 myDimensionAspect = new Prs3d_DimensionAspect;
420 return myDimensionAspect;
423 // =======================================================================
424 // function : SetDimensionAspect
426 // =======================================================================
428 void Prs3d_Drawer::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect)
430 myDimensionAspect = theAspect;
431 myHasOwnDimensionAspect = !myDimensionAspect.IsNull();
434 // =======================================================================
435 // function : SetDimLengthModelUnits
437 // =======================================================================
439 void Prs3d_Drawer::SetDimLengthModelUnits (const TCollection_AsciiString& theUnits)
441 myHasOwnDimLengthModelUnits = Standard_True;
442 myDimensionModelUnits.SetLengthUnits (theUnits);
445 // =======================================================================
446 // function : SetDimAngleModelUnits
448 // =======================================================================
450 void Prs3d_Drawer::SetDimAngleModelUnits (const TCollection_AsciiString& theUnits)
452 myHasOwnDimAngleModelUnits = Standard_True;
453 myDimensionModelUnits.SetAngleUnits (theUnits);
456 // =======================================================================
457 // function : SetDimLengthDisplayUnits
459 // =======================================================================
461 void Prs3d_Drawer::SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits)
463 myHasOwnDimLengthDisplayUnits = Standard_True;
464 myDimensionDisplayUnits.SetLengthUnits (theUnits);
467 // =======================================================================
468 // function : SetDimAngleDisplayUnits
470 // =======================================================================
472 void Prs3d_Drawer::SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits)
474 myHasOwnDimAngleDisplayUnits = Standard_True;
475 myDimensionDisplayUnits.SetAngleUnits (theUnits);
478 // =======================================================================
479 // function : UIsoAspect
481 // =======================================================================
483 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::UIsoAspect()
485 if (!HasOwnUIsoAspect())
487 if (!myLink.IsNull())
489 return myLink->UIsoAspect();
491 if (myUIsoAspect.IsNull())
493 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
499 // =======================================================================
500 // function : SetUIsoAspect
502 // =======================================================================
504 void Prs3d_Drawer::SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
506 myUIsoAspect = theAspect;
507 myHasOwnUIsoAspect = !myUIsoAspect.IsNull();
510 // =======================================================================
511 // function : VIsoAspect
513 // =======================================================================
515 const Handle(Prs3d_IsoAspect)& Prs3d_Drawer::VIsoAspect()
517 if (!HasOwnVIsoAspect())
519 if (!myLink.IsNull())
521 return myLink->VIsoAspect();
523 if (myVIsoAspect.IsNull())
525 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
531 // =======================================================================
532 // function : SetVIsoAspect
534 // =======================================================================
536 void Prs3d_Drawer::SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect)
538 myVIsoAspect = theAspect;
539 myHasOwnVIsoAspect= !myVIsoAspect.IsNull();
542 // =======================================================================
543 // function : WireAspect
545 // =======================================================================
547 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::WireAspect()
549 if (!HasOwnWireAspect())
551 if (!myLink.IsNull())
553 return myLink->WireAspect();
555 if (myWireAspect.IsNull())
557 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
563 // =======================================================================
564 // function : SetWireAspect
566 // =======================================================================
568 void Prs3d_Drawer::SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect)
570 myWireAspect = theAspect;
571 myHasOwnWireAspect = !myWireAspect.IsNull();
574 // =======================================================================
575 // function : SetWireDraw
577 // =======================================================================
579 void Prs3d_Drawer::SetWireDraw (const Standard_Boolean theIsEnabled)
581 myHasOwnWireDraw = Standard_True;
582 myWireDraw = theIsEnabled;
585 // =======================================================================
586 // function : PointAspect
588 // =======================================================================
590 const Handle(Prs3d_PointAspect)& Prs3d_Drawer::PointAspect()
592 if (!HasOwnPointAspect())
594 if (!myLink.IsNull())
596 return myLink->PointAspect();
598 if (myPointAspect.IsNull())
600 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
603 return myPointAspect;
606 // =======================================================================
607 // function : SetupOwnPointAspect
609 // =======================================================================
610 Standard_Boolean Prs3d_Drawer::SetupOwnPointAspect (const Handle(Prs3d_Drawer)& theDefaults)
612 if (myHasOwnPointAspect)
614 return Standard_False;
617 myPointAspect = new Prs3d_PointAspect (Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.0);
618 if (!theDefaults.IsNull() && theDefaults != this)
620 *myPointAspect->Aspect() = *theDefaults->PointAspect()->Aspect();
622 else if (!myLink.IsNull())
624 *myPointAspect->Aspect() = *myLink->PointAspect()->Aspect();
626 myHasOwnPointAspect = Standard_True;
627 return Standard_True;
630 // =======================================================================
631 // function : SetPointAspect
633 // =======================================================================
635 void Prs3d_Drawer::SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect)
637 myPointAspect = theAspect;
638 myHasOwnPointAspect = !myPointAspect.IsNull();
641 // =======================================================================
642 // function : LineAspect
644 // =======================================================================
646 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::LineAspect()
648 if (!HasOwnLineAspect())
650 if (!myLink.IsNull())
652 return myLink->LineAspect();
654 if (myLineAspect.IsNull())
656 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
662 // =======================================================================
663 // function : SetLineAspect
665 // =======================================================================
667 void Prs3d_Drawer::SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
669 myLineAspect = theAspect;
670 myHasOwnLineAspect = !myLineAspect.IsNull();
673 // =======================================================================
674 // function : TextAspect
676 // =======================================================================
678 const Handle(Prs3d_TextAspect)& Prs3d_Drawer::TextAspect()
680 if (!HasOwnTextAspect())
682 if (!myLink.IsNull())
684 return myLink->TextAspect();
686 if (myTextAspect.IsNull())
688 myTextAspect = new Prs3d_TextAspect();
694 // =======================================================================
695 // function : SetTextAspect
697 // =======================================================================
699 void Prs3d_Drawer::SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect)
701 myTextAspect = theAspect;
702 myHasOwnTextAspect = !myTextAspect.IsNull();
705 // =======================================================================
706 // function : ShadingAspect
708 // =======================================================================
710 const Handle(Prs3d_ShadingAspect)& Prs3d_Drawer::ShadingAspect()
712 if (!HasOwnShadingAspect())
714 if (!myLink.IsNull())
716 return myLink->ShadingAspect();
718 if (myShadingAspect.IsNull())
720 myShadingAspect = new Prs3d_ShadingAspect();
723 return myShadingAspect;
726 // =======================================================================
727 // function : SetupOwnShadingAspect
729 // =======================================================================
730 Standard_Boolean Prs3d_Drawer::SetupOwnShadingAspect (const Handle(Prs3d_Drawer)& theDefaults)
732 if (myHasOwnShadingAspect)
734 return Standard_False;
737 myShadingAspect = new Prs3d_ShadingAspect();
738 if (!theDefaults.IsNull() && theDefaults != this)
740 *myShadingAspect->Aspect() = *theDefaults->ShadingAspect()->Aspect();
742 else if (!myLink.IsNull())
744 *myShadingAspect->Aspect() = *myLink->ShadingAspect()->Aspect();
746 myHasOwnShadingAspect = Standard_True;
747 return Standard_True;
750 // =======================================================================
751 // function : SetShadingAspect
753 // =======================================================================
755 void Prs3d_Drawer::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect)
757 myShadingAspect = theAspect;
758 myHasOwnShadingAspect = !myShadingAspect.IsNull();
761 // =======================================================================
762 // function : PlaneAspect
764 // =======================================================================
766 const Handle(Prs3d_PlaneAspect)& Prs3d_Drawer::PlaneAspect()
768 if (!HasOwnPlaneAspect())
770 if (!myLink.IsNull())
772 return myLink->PlaneAspect();
774 if (myPlaneAspect.IsNull())
776 myPlaneAspect = new Prs3d_PlaneAspect();
779 return myPlaneAspect;
782 // =======================================================================
783 // function : SetPlaneAspect
785 // =======================================================================
787 void Prs3d_Drawer::SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect)
789 myPlaneAspect = theAspect;
790 myHasOwnPlaneAspect = !myPlaneAspect.IsNull();
793 // =======================================================================
794 // function : SeenLineAspect
796 // =======================================================================
798 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SeenLineAspect()
800 if (!HasOwnSeenLineAspect())
802 if (!myLink.IsNull())
804 return myLink->SeenLineAspect();
806 if (mySeenLineAspect.IsNull())
808 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
811 return mySeenLineAspect;
814 // =======================================================================
815 // function : SetSeenLineAspect
817 // =======================================================================
819 void Prs3d_Drawer::SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
821 mySeenLineAspect = theAspect;
822 myHasOwnSeenLineAspect = !mySeenLineAspect.IsNull();
825 // =======================================================================
826 // function : ArrowAspect
828 // =======================================================================
830 const Handle(Prs3d_ArrowAspect)& Prs3d_Drawer::ArrowAspect()
832 if (!HasOwnArrowAspect())
834 if (!myLink.IsNull())
836 return myLink->ArrowAspect();
838 if (myArrowAspect.IsNull())
840 myArrowAspect = new Prs3d_ArrowAspect();
843 return myArrowAspect;
846 // =======================================================================
847 // function : SetArrowAspect
849 // =======================================================================
851 void Prs3d_Drawer::SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect)
853 myArrowAspect = theAspect;
854 myHasOwnArrowAspect = !myArrowAspect.IsNull();
857 // =======================================================================
858 // function : SetLineArrowDraw
860 // =======================================================================
862 void Prs3d_Drawer::SetLineArrowDraw (const Standard_Boolean theIsEnabled)
864 myHasOwnLineArrowDraw = Standard_True;
865 myLineArrowDraw = theIsEnabled;
868 // =======================================================================
869 // function : HiddenLineAspect
871 // =======================================================================
873 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::HiddenLineAspect()
875 if (!HasOwnHiddenLineAspect())
877 if (!myLink.IsNull())
879 return myLink->HiddenLineAspect();
881 if (myHiddenLineAspect.IsNull())
883 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
886 return myHiddenLineAspect;
889 // =======================================================================
890 // function : SetHiddenLineAspect
892 // =======================================================================
894 void Prs3d_Drawer::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect)
896 myHiddenLineAspect = theAspect;
897 myHasOwnHiddenLineAspect = !myHiddenLineAspect.IsNull();
900 // =======================================================================
901 // function : EnableDrawHiddenLineDraw
903 // =======================================================================
905 void Prs3d_Drawer::EnableDrawHiddenLine()
907 myHasOwnDrawHiddenLine = Standard_True;
908 myDrawHiddenLine = Standard_True;
911 // =======================================================================
912 // function : DisableDrawHiddenLine
914 // =======================================================================
916 void Prs3d_Drawer::DisableDrawHiddenLine()
918 myHasOwnDrawHiddenLine = Standard_True;
919 myDrawHiddenLine = Standard_False;
922 // =======================================================================
923 // function : VectorAspect
925 // =======================================================================
927 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::VectorAspect()
929 if (!HasOwnVectorAspect())
931 if (!myLink.IsNull())
933 return myLink->VectorAspect();
935 if (myVectorAspect.IsNull())
937 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
940 return myVectorAspect;
943 // =======================================================================
944 // function : SetVectorAspect
946 // =======================================================================
948 void Prs3d_Drawer::SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect)
950 myVectorAspect = theAspect;
951 myHasOwnVectorAspect = !myVectorAspect.IsNull();
954 // =======================================================================
955 // function : SetVertexDrawMode
957 // =======================================================================
959 void Prs3d_Drawer::SetVertexDrawMode (const Prs3d_VertexDrawMode theMode)
961 // Prs3d_VDM_Inherited is default value and means
962 // that correct value should be taken from the Link if it exists.
963 myVertexDrawMode = theMode;
966 // =======================================================================
967 // function : VertexDrawMode
969 // =======================================================================
971 Prs3d_VertexDrawMode Prs3d_Drawer::VertexDrawMode()
973 if (!HasOwnVertexDrawMode())
975 if (!myLink.IsNull())
977 return myLink->VertexDrawMode();
979 // Prs3d_VDM_Isolated is default value for this setting.
980 myVertexDrawMode = Prs3d_VDM_Isolated;
982 return myVertexDrawMode;
985 // =======================================================================
986 // function : DatumAspect
988 // =======================================================================
990 const Handle(Prs3d_DatumAspect)& Prs3d_Drawer::DatumAspect()
992 if (!HasOwnDatumAspect())
994 if (!myLink.IsNull())
996 return myLink->DatumAspect();
998 if (myDatumAspect.IsNull())
1000 myDatumAspect = new Prs3d_DatumAspect();
1003 return myDatumAspect;
1006 // =======================================================================
1007 // function : SetDatumAspect
1009 // =======================================================================
1011 void Prs3d_Drawer::SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect)
1013 myDatumAspect = theAspect;
1014 myHasOwnDatumAspect = !myDatumAspect.IsNull();
1017 // =======================================================================
1018 // function : SectionAspect
1020 // =======================================================================
1022 const Handle(Prs3d_LineAspect)& Prs3d_Drawer::SectionAspect()
1024 if (!HasOwnSectionAspect())
1026 if (!myLink.IsNull())
1028 return myLink->SectionAspect();
1030 if (mySectionAspect.IsNull())
1032 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1035 return mySectionAspect;
1038 // =======================================================================
1039 // function : SetSectionAspect
1041 // =======================================================================
1043 void Prs3d_Drawer::SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect)
1045 mySectionAspect = theAspect;
1046 myHasOwnSectionAspect = !mySectionAspect.IsNull();
1049 // =======================================================================
1050 // function : SetSectionAspect
1052 // =======================================================================
1054 void Prs3d_Drawer::ClearLocalAttributes()
1056 if (myLink.IsNull())
1061 myUIsoAspect.Nullify();
1062 myVIsoAspect.Nullify();
1063 myFreeBoundaryAspect.Nullify();
1064 myUnFreeBoundaryAspect.Nullify();
1065 myFaceBoundaryAspect.Nullify();
1066 myWireAspect.Nullify();
1067 myLineAspect.Nullify();
1068 myTextAspect.Nullify();
1069 myShadingAspect.Nullify();
1070 myPointAspect.Nullify();
1071 myPlaneAspect.Nullify();
1072 myArrowAspect.Nullify();
1073 myHiddenLineAspect.Nullify();
1074 mySeenLineAspect.Nullify();
1075 myVectorAspect .Nullify();
1076 myDatumAspect.Nullify();
1077 myDimensionAspect.Nullify();
1078 mySectionAspect.Nullify();
1080 myHasOwnUIsoAspect = Standard_False;
1081 myHasOwnVIsoAspect = Standard_False;
1082 myHasOwnWireAspect = Standard_False;
1083 myHasOwnPointAspect = Standard_False;
1084 myHasOwnLineAspect = Standard_False;
1085 myHasOwnTextAspect = Standard_False;
1086 myHasOwnShadingAspect = Standard_False;
1087 myHasOwnPlaneAspect = Standard_False;
1088 myHasOwnSeenLineAspect = Standard_False;
1089 myHasOwnArrowAspect = Standard_False;
1090 myHasOwnHiddenLineAspect = Standard_False;
1091 myHasOwnVectorAspect = Standard_False;
1092 myHasOwnDatumAspect = Standard_False;
1093 myHasOwnSectionAspect = Standard_False;
1094 myHasOwnFreeBoundaryAspect = Standard_False;
1095 myHasOwnUnFreeBoundaryAspect = Standard_False;
1096 myHasOwnFaceBoundaryAspect = Standard_False;
1097 myHasOwnDimensionAspect = Standard_False;
1099 myHasOwnNbPoints = Standard_False;
1100 myHasOwnMaximalParameterValue = Standard_False;
1101 myHasOwnTypeOfDeflection = Standard_False;
1102 myHasOwnChordialDeviation = Standard_False;
1103 myHasOwnDeviationCoefficient = Standard_False;
1104 myHasOwnHLRDeviationCoefficient = Standard_False;
1105 myHasOwnDeviationAngle = Standard_False;
1106 myHasOwnHLRDeviationAngle = Standard_False;
1107 myHasOwnIsoOnPlane = Standard_False;
1108 myHasOwnIsoOnTriangulation = Standard_False;
1109 myHasOwnIsAutoTriangulated = Standard_False;
1110 myHasOwnWireDraw = Standard_False;
1111 myHasOwnLineArrowDraw = Standard_False;
1112 myHasOwnDrawHiddenLine = Standard_False;
1113 myHasOwnFreeBoundaryDraw = Standard_False;
1114 myHasOwnUnFreeBoundaryDraw = Standard_False;
1115 myHasOwnFaceBoundaryDraw = Standard_False;
1116 myHasOwnDimLengthModelUnits = Standard_False;
1117 myHasOwnDimLengthDisplayUnits = Standard_False;
1118 myHasOwnDimAngleModelUnits = Standard_False;
1119 myHasOwnDimAngleDisplayUnits = Standard_False;
1121 myVertexDrawMode = Prs3d_VDM_Inherited;
1122 myTypeOfHLR = Prs3d_TOH_NotSet;
1125 // =======================================================================
1126 // function : SetupOwnFaceBoundaryAspect
1128 // =======================================================================
1129 Standard_Boolean Prs3d_Drawer::SetupOwnFaceBoundaryAspect (const Handle(Prs3d_Drawer)& theDefaults)
1131 if (myHasOwnFaceBoundaryAspect)
1136 myFaceBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FaceBoundary, Aspect_TOL_SOLID, 1.0);
1137 myHasOwnFaceBoundaryAspect = true;
1139 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1140 if (!aLink.IsNull())
1142 *myFaceBoundaryAspect->Aspect() = *aLink->FaceBoundaryAspect()->Aspect();
1147 // =======================================================================
1148 // function : SetOwnLineAspects
1150 // =======================================================================
1151 Standard_Boolean Prs3d_Drawer::SetOwnLineAspects (const Handle(Prs3d_Drawer)& theDefaults)
1153 bool isUpdateNeeded = false;
1154 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1155 if (!myHasOwnUIsoAspect)
1157 isUpdateNeeded = true;
1158 myUIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1159 if (!aLink.IsNull())
1161 *myUIsoAspect->Aspect() = *aLink->UIsoAspect()->Aspect();
1162 myUIsoAspect->SetNumber (aLink->UIsoAspect()->Number());
1164 myHasOwnUIsoAspect = true;
1166 if (!myHasOwnVIsoAspect)
1168 isUpdateNeeded = true;
1169 myVIsoAspect = new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 1.0, 1);
1170 if (!aLink.IsNull())
1172 *myVIsoAspect->Aspect() = *aLink->VIsoAspect()->Aspect();
1173 myUIsoAspect->SetNumber (aLink->VIsoAspect()->Number());
1175 myHasOwnVIsoAspect = true;
1177 if (!myHasOwnWireAspect)
1179 isUpdateNeeded = true;
1180 myWireAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Wire, Aspect_TOL_SOLID, 1.0);
1181 myHasOwnWireAspect = true;
1182 if (!aLink.IsNull())
1184 *myWireAspect->Aspect() = *aLink->WireAspect()->Aspect();
1187 if (!myHasOwnLineAspect)
1189 isUpdateNeeded = true;
1190 myLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Line, Aspect_TOL_SOLID, 1.0);
1191 myHasOwnLineAspect = true;
1192 if (!aLink.IsNull())
1194 *myLineAspect->Aspect() = *aLink->LineAspect()->Aspect();
1197 if (!myHasOwnSeenLineAspect)
1199 isUpdateNeeded = true;
1200 mySeenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_SeenLine, Aspect_TOL_SOLID, 1.0);
1201 myHasOwnSeenLineAspect = true;
1202 if (!aLink.IsNull())
1204 *mySeenLineAspect->Aspect() = *aLink->SeenLineAspect()->Aspect();
1207 if (!myHasOwnHiddenLineAspect)
1209 isUpdateNeeded = true;
1210 myHiddenLineAspect = new Prs3d_LineAspect (THE_DEF_COLOR_HiddenLine, Aspect_TOL_DASH, 1.0);
1211 myHasOwnHiddenLineAspect = true;
1212 if (!aLink.IsNull())
1214 *myHiddenLineAspect->Aspect() = *aLink->HiddenLineAspect()->Aspect();
1217 if (!myHasOwnFreeBoundaryAspect)
1219 isUpdateNeeded = true;
1220 myFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_FreeBoundary, Aspect_TOL_SOLID, 1.0);
1221 myHasOwnFreeBoundaryAspect = true;
1222 if (!aLink.IsNull())
1224 *myFreeBoundaryAspect->Aspect() = *aLink->FreeBoundaryAspect()->Aspect();
1227 if (!myHasOwnUnFreeBoundaryAspect)
1229 isUpdateNeeded = true;
1230 myUnFreeBoundaryAspect = new Prs3d_LineAspect (THE_DEF_COLOR_UnFreeBoundary, Aspect_TOL_SOLID, 1.0);
1231 myHasOwnUnFreeBoundaryAspect = true;
1232 if (!aLink.IsNull())
1234 *myUnFreeBoundaryAspect->Aspect() = *aLink->UnFreeBoundaryAspect()->Aspect();
1237 isUpdateNeeded = SetupOwnFaceBoundaryAspect (theDefaults) || isUpdateNeeded;
1238 return isUpdateNeeded;
1241 // =======================================================================
1242 // function : SetOwnDatumAspects
1244 // =======================================================================
1245 Standard_Boolean Prs3d_Drawer::SetOwnDatumAspects (const Handle(Prs3d_Drawer)& theDefaults)
1247 bool isUpdateNeeded = false;
1248 const Handle(Prs3d_Drawer)& aLink = (!theDefaults.IsNull() && theDefaults != this) ? theDefaults : myLink;
1249 if (!myHasOwnVectorAspect)
1251 isUpdateNeeded = true;
1252 myVectorAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Vector, Aspect_TOL_SOLID, 1.0);
1253 myHasOwnVectorAspect = true;
1254 if (!aLink.IsNull())
1256 *myVectorAspect->Aspect() = *aLink->VectorAspect()->Aspect();
1259 if (!myHasOwnSectionAspect)
1261 isUpdateNeeded = true;
1262 mySectionAspect = new Prs3d_LineAspect (THE_DEF_COLOR_Section, Aspect_TOL_SOLID, 1.0);
1263 myHasOwnSectionAspect = true;
1264 if (!aLink.IsNull())
1266 *mySectionAspect->Aspect() = *aLink->SectionAspect()->Aspect();
1269 if (!myHasOwnPlaneAspect)
1271 isUpdateNeeded = true;
1272 myPlaneAspect = new Prs3d_PlaneAspect();
1273 myHasOwnPlaneAspect = true;
1275 if (!myHasOwnArrowAspect)
1277 isUpdateNeeded = true;
1278 myArrowAspect = new Prs3d_ArrowAspect();
1279 myHasOwnArrowAspect = true;
1281 if (!myHasOwnDatumAspect)
1283 isUpdateNeeded = true;
1284 myDatumAspect = new Prs3d_DatumAspect();
1285 myHasOwnDatumAspect = true;
1287 return isUpdateNeeded;
1290 //! Assign the shader program.
1291 template <typename T>
1292 inline void setAspectProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1296 if (!thePrsAspect.IsNull()
1299 thePrsAspect->Aspect()->SetShaderProgram (theProgram);
1303 // =======================================================================
1304 // function : SetShaderProgram
1306 // =======================================================================
1307 bool Prs3d_Drawer::SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
1308 const Graphic3d_GroupAspect theAspect,
1309 const bool theToOverrideDefaults)
1311 bool isUpdateNeeded = false;
1314 case Graphic3d_ASPECT_LINE:
1316 if (theToOverrideDefaults)
1318 isUpdateNeeded = SetOwnLineAspects() || isUpdateNeeded;
1319 isUpdateNeeded = SetOwnDatumAspects() || isUpdateNeeded;
1322 setAspectProgram (theProgram, myHasOwnUIsoAspect, myUIsoAspect);
1323 setAspectProgram (theProgram, myHasOwnVIsoAspect, myVIsoAspect);
1324 setAspectProgram (theProgram, myHasOwnWireAspect, myWireAspect);
1325 setAspectProgram (theProgram, myHasOwnLineAspect, myLineAspect);
1326 setAspectProgram (theProgram, myHasOwnSeenLineAspect, mySeenLineAspect);
1327 setAspectProgram (theProgram, myHasOwnHiddenLineAspect, myHiddenLineAspect);
1328 setAspectProgram (theProgram, myHasOwnVectorAspect, myVectorAspect);
1329 setAspectProgram (theProgram, myHasOwnSectionAspect, mySectionAspect);
1330 setAspectProgram (theProgram, myHasOwnFreeBoundaryAspect, myFreeBoundaryAspect);
1331 setAspectProgram (theProgram, myHasOwnUnFreeBoundaryAspect, myUnFreeBoundaryAspect);
1332 setAspectProgram (theProgram, myHasOwnFaceBoundaryAspect, myFaceBoundaryAspect);
1333 if (myHasOwnPlaneAspect)
1335 setAspectProgram (theProgram, true, myPlaneAspect->EdgesAspect());
1336 setAspectProgram (theProgram, true, myPlaneAspect->IsoAspect());
1337 setAspectProgram (theProgram, true, myPlaneAspect->ArrowAspect());
1339 if (myHasOwnDatumAspect)
1341 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_XAxis));
1342 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_YAxis));
1343 setAspectProgram (theProgram, true, myDatumAspect->LineAspect(Prs3d_DP_ZAxis));
1345 setAspectProgram (theProgram, myHasOwnArrowAspect, myArrowAspect);
1346 return isUpdateNeeded;
1348 case Graphic3d_ASPECT_TEXT:
1350 if (theToOverrideDefaults
1351 && !myHasOwnTextAspect)
1353 isUpdateNeeded = true;
1354 myTextAspect = new Prs3d_TextAspect();
1355 myHasOwnTextAspect = true;
1356 if (!myLink.IsNull())
1358 *myTextAspect->Aspect() = *myLink->TextAspect()->Aspect();
1362 setAspectProgram (theProgram, myHasOwnTextAspect, myTextAspect);
1363 return isUpdateNeeded;
1365 case Graphic3d_ASPECT_MARKER:
1367 if (theToOverrideDefaults
1368 && SetupOwnPointAspect())
1370 isUpdateNeeded = true;
1373 setAspectProgram (theProgram, myHasOwnPointAspect, myPointAspect);
1374 return isUpdateNeeded;
1376 case Graphic3d_ASPECT_FILL_AREA:
1378 if (theToOverrideDefaults
1379 && SetupOwnShadingAspect())
1381 isUpdateNeeded = true;
1383 setAspectProgram (theProgram, myHasOwnShadingAspect, myShadingAspect);
1384 return isUpdateNeeded;
1390 // =======================================================================
1391 // function : SetShadingModel
1393 // =======================================================================
1394 bool Prs3d_Drawer::SetShadingModel (Graphic3d_TypeOfShadingModel theModel,
1395 bool theToOverrideDefaults)
1397 bool isUpdateNeeded = false;
1399 if (theToOverrideDefaults
1400 && SetupOwnShadingAspect())
1402 isUpdateNeeded = true;
1405 if (!myShadingAspect.IsNull()
1406 && myHasOwnShadingAspect)
1408 myShadingAspect->Aspect()->SetShadingModel (theModel);
1411 return isUpdateNeeded;
1414 // =======================================================================
1415 // function : DumpJson
1417 // =======================================================================
1418 void Prs3d_Drawer::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const
1420 DUMP_CLASS_BEGIN (theOStream, Prs3d_Drawer);
1421 DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShadingAspect.get());