0029076: Visualization - implement element shrinking Shader
[occt.git] / src / Prs3d / Prs3d_Drawer.hxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _Prs3d_Drawer_HeaderFile
16 #define _Prs3d_Drawer_HeaderFile
17
18 #include <Standard.hxx>
19 #include <Standard_Type.hxx>
20
21 #include <Standard_Integer.hxx>
22 #include <Standard_Boolean.hxx>
23 #include <Aspect_TypeOfDeflection.hxx>
24 #include <Graphic3d_GroupAspect.hxx>
25 #include <Graphic3d_PresentationAttributes.hxx>
26 #include <Graphic3d_ShaderProgram.hxx>
27 #include <Standard_Real.hxx>
28 #include <Prs3d_VertexDrawMode.hxx>
29 #include <Prs3d_DimensionUnits.hxx>
30 #include <Prs3d_TypeOfHLR.hxx>
31 #include <Standard_Transient.hxx>
32
33 class Prs3d_IsoAspect;
34 class Prs3d_LineAspect;
35 class Prs3d_TextAspect;
36 class Prs3d_ShadingAspect;
37 class Prs3d_PointAspect;
38 class Prs3d_PlaneAspect;
39 class Prs3d_ArrowAspect;
40 class Prs3d_DatumAspect;
41 class Prs3d_DimensionAspect;
42 class TCollection_AsciiString;
43
44 DEFINE_STANDARD_HANDLE(Prs3d_Drawer, Graphic3d_PresentationAttributes)
45
46 //! A graphic attribute manager which governs how
47 //! objects such as color, width, line thickness and deflection are displayed.
48 //! A drawer includes an instance of the Aspect classes with particular default values.
49 class Prs3d_Drawer : public Graphic3d_PresentationAttributes
50 {
51   DEFINE_STANDARD_RTTIEXT(Prs3d_Drawer, Graphic3d_PresentationAttributes)
52 public:
53
54   //! Default constructor.
55   Standard_EXPORT Prs3d_Drawer();
56
57   //! Sets the type of chordal deflection.
58   //! This indicates whether the deflection value is absolute or relative to the size of the object.
59   Standard_EXPORT void SetTypeOfDeflection (const Aspect_TypeOfDeflection theTypeOfDeflection);
60
61   //! Returns the type of chordal deflection.
62   //! This indicates whether the deflection value is absolute or relative to the size of the object.
63   Aspect_TypeOfDeflection TypeOfDeflection() const
64   {
65     return HasOwnTypeOfDeflection() || myLink.IsNull()
66          ? myTypeOfDeflection
67          : myLink->TypeOfDeflection();
68   }
69
70   //! Returns true if the drawer has a type of deflection setting active.
71   Standard_Boolean HasOwnTypeOfDeflection() const { return myHasOwnTypeOfDeflection; }
72
73   //! Defines the maximal chordial deviation when drawing any curve.
74   //! Even if the type of deviation is set to TOD_Relative, this value is used by: 
75   //!   Prs3d_DeflectionCurve
76   //!   Prs3d_WFDeflectionSurface
77   //!   Prs3d_WFDeflectionRestrictedFace
78   Standard_EXPORT void SetMaximalChordialDeviation (const Standard_Real theChordialDeviation);
79
80   //! Returns the maximal chordal deviation. The default value is 0.1.
81   //! Drawings of curves or patches are made with respect to an absolute maximal chordal deviation.
82   Standard_Real MaximalChordialDeviation() const
83   {
84     return HasOwnMaximalChordialDeviation() || myLink.IsNull()
85          ? myChordialDeviation
86          : myLink->MaximalChordialDeviation();
87   }
88
89   //! Returns true if the drawer has a maximal chordial deviation setting active.
90   Standard_Boolean HasOwnMaximalChordialDeviation() const { return myHasOwnChordialDeviation; }
91
92   //! Sets the type of HLR algorithm used by drawer's interactive objects
93   Standard_EXPORT void SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR);
94
95   //! Returns the type of HLR algorithm currently in use.
96   Standard_EXPORT Prs3d_TypeOfHLR TypeOfHLR();
97
98   //! Returns true if the type of HLR is not equal to Prs3d_TOH_NotSet.
99   Standard_Boolean HasOwnTypeOfHLR() const { return (myTypeOfHLR != Prs3d_TOH_NotSet); }
100
101   //! Defines the maximum value allowed for the first and last
102   //! parameters of an infinite curve.
103   Standard_EXPORT void SetMaximalParameterValue (const Standard_Real theValue);
104
105   //! Sets the maximum value allowed for the first and last
106   //! parameters of an infinite curve. By default, this value is 500000.
107   Standard_Real MaximalParameterValue() const
108   {
109     return HasOwnMaximalParameterValue() || myLink.IsNull()
110          ? myMaximalParameterValue
111          : myLink->MaximalParameterValue();
112   }
113
114   //! Returns true if the drawer has a maximum value allowed for the first and last
115   //! parameters of an infinite curve setting active.
116   Standard_Boolean HasOwnMaximalParameterValue() const { return myHasOwnMaximalParameterValue; }
117
118   //! Sets IsoOnPlane on or off by setting the parameter theIsEnabled to true or false.
119   Standard_EXPORT void SetIsoOnPlane (const Standard_Boolean theIsEnabled);
120
121   //! Returns True if the drawing of isos on planes is enabled.
122   Standard_Boolean IsoOnPlane() const
123   {
124     return HasOwnIsoOnPlane() || myLink.IsNull()
125          ? myIsoOnPlane
126          : myLink->IsoOnPlane();
127   }
128
129   //! Returns true if the drawer has IsoOnPlane setting active.
130   Standard_Boolean HasOwnIsoOnPlane() const { return myHasOwnIsoOnPlane; }
131
132   //! Returns True if the drawing of isos on triangulation is enabled.
133   Standard_Boolean IsoOnTriangulation() const
134   {
135     return HasOwnIsoOnTriangulation() || myLink.IsNull()
136          ? myIsoOnTriangulation
137          : myLink->IsoOnTriangulation();
138   }
139
140   //! Returns true if the drawer has IsoOnTriangulation setting active.
141   Standard_Boolean HasOwnIsoOnTriangulation() const { return myHasOwnIsoOnTriangulation; }
142
143   //! Enables or disables isolines on triangulation by setting the parameter theIsEnabled to true or false.
144   Standard_EXPORT void SetIsoOnTriangulation (const Standard_Boolean theToEnable);
145
146   //! Sets the discretisation parameter theValue.
147   Standard_EXPORT void SetDiscretisation (const Standard_Integer theValue);
148
149   //! Returns the discretisation setting. 
150   Standard_Integer Discretisation() const
151   {
152     return HasOwnDiscretisation() || myLink.IsNull()
153          ? myNbPoints
154          : myLink->Discretisation();
155   }
156
157   //! Returns true if the drawer has discretisation setting active.
158   Standard_Boolean HasOwnDiscretisation() const { return myHasOwnNbPoints; }
159
160   //! Sets the deviation coefficient theCoefficient.
161   //! Also sets the hasOwnDeviationCoefficient flag to Standard_True and myPreviousDeviationCoefficient
162   Standard_EXPORT void SetDeviationCoefficient (const Standard_Real theCoefficient);
163
164   //! Returns the deviation coefficient.
165   //! Drawings of curves or patches are made with respect
166   //! to a maximal chordal deviation. A Deviation coefficient
167   //! is used in the shading display mode. The shape is
168   //! seen decomposed into triangles. These are used to
169   //! calculate reflection of light from the surface of the
170   //! object. The triangles are formed from chords of the
171   //! curves in the shape. The deviation coefficient gives
172   //! the highest value of the angle with which a chord can
173   //! deviate from a tangent to a   curve. If this limit is
174   //! reached, a new triangle is begun.
175   //! This deviation is absolute and is set through the
176   //! method: SetMaximalChordialDeviation. The default value is 0.001.
177   //! In drawing shapes, however, you are allowed to ask
178   //! for a relative deviation. This deviation will be:
179   //! SizeOfObject * DeviationCoefficient.
180   Standard_Real DeviationCoefficient() const
181   {
182     return HasOwnDeviationCoefficient() || myLink.IsNull()
183          ? myDeviationCoefficient
184          : myLink->DeviationCoefficient();
185   }
186
187   //! Sets the hasOwnDeviationCoefficient flag to Standard_False
188   void SetDeviationCoefficient()
189   {
190     myHasOwnDeviationCoefficient = Standard_False;
191   }
192
193   //! Returns true if there is a local setting for deviation
194   //! coefficient in this framework for a specific interactive object.
195   Standard_Boolean HasOwnDeviationCoefficient() const { return myHasOwnDeviationCoefficient; }
196
197   //! Saves the previous value used for the chordal
198   //! deviation coefficient. 
199   Standard_Real PreviousDeviationCoefficient() const
200   {
201     return myHasOwnDeviationCoefficient
202          ? myPreviousDeviationCoefficient
203          : 0.0;
204   }
205
206   //! Updates the previous value used for the chordal deviation coefficient to the current state.
207   void UpdatePreviousDeviationCoefficient()
208   {
209     if (myHasOwnDeviationCoefficient)
210     {
211       myPreviousDeviationCoefficient = DeviationCoefficient();
212     }
213   }
214
215   //! Sets the deviation coefficient aCoefficient for removal
216   //! of hidden lines created by different viewpoints in
217   //! different presentations. The Default value is 0.02.
218   //! Also sets the hasOwnHLRDeviationCoefficient flag to Standard_True and myPreviousHLRDeviationCoefficient
219   Standard_EXPORT void SetHLRDeviationCoefficient (const Standard_Real theCoefficient);
220
221   //! Returns the real number value of the hidden line
222   //! removal deviation coefficient in this framework, if the flag
223   //! hasOwnHLRDeviationCoefficient is true or there is no Link.
224   //! Else the shape's HLR deviation coefficient is used.
225   //! A Deviation coefficient is used in the shading display
226   //! mode. The shape is seen decomposed into triangles.
227   //! These are used to calculate reflection of light from the
228   //! surface of the object.
229   //! The triangles are formed from chords of the curves in
230   //! the shape. The deviation coefficient give the highest
231   //! value of the angle with which a chord can deviate
232   //! from a tangent to a curve. If this limit is reached, a new triangle is begun.
233   //! To find the hidden lines, hidden line display mode
234   //! entails recalculation of the view at each different projector perspective.
235   //! Since hidden lines entail calculations of more than
236   //! usual complexity to decompose them into these
237   //! triangles, a deviation coefficient allowing greater
238   //! tolerance is used. This increases efficiency in calculation.
239   //! The Default value is 0.02.
240   Standard_Real HLRDeviationCoefficient() const
241   {
242     return HasOwnHLRDeviationCoefficient() || myLink.IsNull()
243          ? myHLRDeviationCoefficient
244          : myLink->HLRDeviationCoefficient();
245   }
246
247   //! Sets the hasOwnHLRDeviationCoefficient flag to Standard_False 
248   void SetHLRDeviationCoefficient()
249   {
250     myHasOwnHLRDeviationCoefficient = Standard_False;
251   }
252
253   //! Returns true if the there is a setting for HLR deviation
254   //! coefficient in this framework for a specific interactive object.
255   Standard_Boolean HasOwnHLRDeviationCoefficient() const { return myHasOwnHLRDeviationCoefficient; }
256
257   //! Returns the previous value of the hidden line removal deviation coefficient.
258   Standard_Real PreviousHLRDeviationCoefficient() const
259   {
260     return myHasOwnHLRDeviationCoefficient
261          ? myPreviousHLRDeviationCoefficient
262          : 0.0;
263   }
264
265   //! Sets the deviation angle theAngle.
266   //! Also sets the hasOwnDeviationAngle flag to Standard_True, and myPreviousDeviationAngle.
267   Standard_EXPORT void SetDeviationAngle (const Standard_Real theAngle);
268
269   //! Returns the value for deviation angle.
270   Standard_Real DeviationAngle() const
271   {
272     return HasOwnDeviationAngle() || myLink.IsNull()
273          ? myDeviationAngle
274          : myLink->DeviationAngle();
275   }
276
277   //! Sets the hasOwnDeviationAngle flag to Standard_False
278   void SetDeviationAngle()
279   {
280     myHasOwnDeviationAngle = Standard_False;
281   }
282
283   //! Returns true if the there is a local setting for deviation
284   //! angle in this framework for a specific interactive object.
285   Standard_Boolean HasOwnDeviationAngle() const { return myHasOwnDeviationAngle; }
286
287   //! Returns the previous deviation angle
288   Standard_Real PreviousDeviationAngle() const
289   {
290     return myHasOwnDeviationAngle
291          ? myPreviousDeviationAngle
292          : 0.0;
293   }
294
295   //! Updates the previous deviation angle to the current value
296   void UpdatePreviousDeviationAngle()
297   {
298     if (myHasOwnDeviationAngle)
299     {
300       myPreviousDeviationAngle = DeviationAngle();
301     }
302   }
303
304   //! Sets anAngle, the angle of maximum chordal deviation for removal of hidden lines created by
305   //! different viewpoints in different presentations.
306   //! The default value is 20 * M_PI / 180.
307   //! Also sets the hasOwnHLRDeviationAngle flag to Standard_True and myPreviousHLRDeviationAngle.
308   Standard_EXPORT void SetHLRAngle (const Standard_Real theAngle);
309
310   //! Returns the real number value of the deviation angle
311   //! in hidden line removal views. The default value is 20 * M_PI / 180.
312   Standard_Real HLRAngle() const
313   {
314     return HasOwnHLRDeviationAngle() || myLink.IsNull()
315          ? myHLRAngle
316          : myLink->HLRAngle();
317   }
318
319   //! Sets the hasOwnHLRDeviationAngle flag to Standard_False
320   void SetHLRAngle()
321   {
322     myHasOwnHLRDeviationAngle = Standard_False;
323   }
324
325   //! Returns true if the there is a setting for HLR deviation
326   //! angle in this framework for a specific interactive object.
327   Standard_Boolean HasOwnHLRDeviationAngle() const { return myHasOwnHLRDeviationAngle; }
328
329   //! Returns the previous value of the HLR deviation angle.
330   Standard_Real PreviousHLRDeviationAngle() const
331   {
332     return myHasOwnHLRDeviationAngle
333          ? myPreviousHLRDeviationAngle
334          : 0.0;
335   }
336
337   //! Sets IsAutoTriangulated on or off by setting the parameter theIsEnabled to true or false.
338   //! If this flag is True automatic re-triangulation with deflection-check logic will be applied.
339   //! Else this feature will be disable and triangulation is expected to be computed by application itself
340   //! and no shading presentation at all if unavailable.
341   Standard_EXPORT void SetAutoTriangulation (const Standard_Boolean theIsEnabled);
342
343   //! Returns True if automatic triangulation is enabled.
344   Standard_Boolean IsAutoTriangulation() const
345   {
346     return HasOwnIsAutoTriangulation() || myLink.IsNull()
347          ? myIsAutoTriangulated
348          : myLink->IsAutoTriangulation();
349   }
350
351   //! Returns true if the drawer has IsoOnPlane setting active.
352   Standard_Boolean HasOwnIsAutoTriangulation() const { return myHasOwnIsAutoTriangulated; }
353
354   //! Defines the attributes which are used when drawing an
355   //! U isoparametric curve of a face. Defines the number
356   //! of U isoparametric curves to be drawn for a single face.
357   //! The LineAspect for U isoparametric lines can be edited
358   //! (methods SetColor, SetTypeOfLine, SetWidth, SetNumber)
359   //! The default values are:
360   //!   COLOR       : Quantity_NOC_GRAY75
361   //!   TYPE OF LINE: Aspect_TOL_SOLID
362   //!   WIDTH       : 0.5
363   //!
364   //! These attributes are used by the following algorithms:
365   //!   Prs3d_WFDeflectionSurface
366   //!   Prs3d_WFDeflectionRestrictedFace
367   Standard_EXPORT const Handle(Prs3d_IsoAspect)& UIsoAspect();
368
369   Standard_EXPORT void SetUIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect);
370
371   //! Returns true if the drawer has its own attribute for
372   //! UIso aspect that overrides the one in the link.
373   Standard_Boolean HasOwnUIsoAspect() const { return myHasOwnUIsoAspect; }
374
375   //! Defines the attributes which are used when drawing an
376   //! V isoparametric curve of a face. Defines the number
377   //! of V isoparametric curves to be drawn for a single face.
378   //! The LineAspect for V isoparametric lines can be edited
379   //! (methods SetColor, SetTypeOfLine, SetWidth, SetNumber)
380   //! The default values are:
381   //!   COLOR       : Quantity_NOC_GRAY82
382   //!   TYPE OF LINE: Aspect_TOL_SOLID
383   //!   WIDTH       : 0.5
384   //!
385   //! These attributes are used by the following algorithms:
386   //!   Prs3d_WFDeflectionSurface
387   //!   Prs3d_WFDeflectionRestrictedFace
388   Standard_EXPORT const Handle(Prs3d_IsoAspect)& VIsoAspect();
389
390   //! Sets the appearance of V isoparameters - theAspect.
391   Standard_EXPORT void SetVIsoAspect (const Handle(Prs3d_IsoAspect)& theAspect);
392
393   //! Returns true if the drawer has its own attribute for
394   //! VIso aspect that overrides the one in the link.
395   Standard_Boolean HasOwnVIsoAspect() const { return myHasOwnVIsoAspect; }
396
397   //! Returns wire aspect settings.
398   //! The LineAspect for the free boundaries can be edited.
399   //! The default values are:
400   //!   Color: Quantity_NOC_GREEN
401   //!   Type of line: Aspect_TOL_SOLID
402   //!   Width: 1.0
403   //! These attributes are used by the algorithm Prs3d_WFShape.
404   Standard_EXPORT const Handle(Prs3d_LineAspect)& WireAspect();
405
406   //! Sets the parameter theAspect for display of wires.
407   Standard_EXPORT void SetWireAspect (const Handle(Prs3d_LineAspect)& theAspect);
408
409   //! Returns true if the drawer has its own attribute for
410   //! wire aspect that overrides the one in the link.
411   Standard_Boolean HasOwnWireAspect() const { return myHasOwnWireAspect; }
412
413   //! Sets WireDraw on or off by setting the parameter theIsEnabled to true or false.
414   Standard_EXPORT void SetWireDraw(const Standard_Boolean theIsEnabled);
415
416   //! Returns True if the drawing of the wire is enabled.
417   Standard_Boolean WireDraw() const
418   {
419     return HasOwnWireDraw() || myLink.IsNull()
420          ? myWireDraw
421          : myLink->WireDraw();
422   }
423
424   //! Returns true if the drawer has its own attribute for
425   //! "draw wires" flag that overrides the one in the link.
426   Standard_Boolean HasOwnWireDraw() const { return myHasOwnWireDraw; }
427
428   //! Returns the point aspect setting. The default values are
429   //!   Color: Quantity_NOC_YELLOW
430   //!   Type of marker: Aspect_TOM_PLUS
431   //!   Scale: 1.0
432   //! These attributes are used by the algorithms Prs3d_Point.
433   Standard_EXPORT const Handle(Prs3d_PointAspect)& PointAspect();
434
435   //! Sets the parameter theAspect for display attributes of points
436   Standard_EXPORT void SetPointAspect (const Handle(Prs3d_PointAspect)& theAspect);
437
438   //! Returns true if the drawer has its own attribute for
439   //! point aspect that overrides the one in the link.
440   Standard_Boolean HasOwnPointAspect() const { return myHasOwnPointAspect; }
441
442   //! Sets own point aspect.
443   //! Returns FALSE if the drawer already has its own attribute for point aspect.
444   Standard_EXPORT Standard_Boolean SetupOwnPointAspect (const Handle(Prs3d_Drawer)& theDefaults = Handle(Prs3d_Drawer)());
445
446   //! Returns settings for line aspects.
447   //! These settings can be edited. The default values are:
448   //!   Color: Quantity_NOC_YELLOW
449   //!   Type of line: Aspect_TOL_SOLID
450   //!   Width: 1.0
451   //! These attributes are used by the following algorithms:
452   //!   Prs3d_Curve
453   //!   Prs3d_Line
454   //!   Prs3d_HLRShape
455   Standard_EXPORT const Handle(Prs3d_LineAspect)& LineAspect();
456
457   //! Sets the parameter theAspect for display attributes of lines.
458   Standard_EXPORT void SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect);
459
460   //! Returns true if the drawer has its own attribute for
461   //! line aspect that overrides the one in the link.
462   Standard_Boolean HasOwnLineAspect() const { return myHasOwnLineAspect; }
463
464   //! Sets own line aspects.
465   //! Returns FALSE if own line aspect are already set.
466   Standard_EXPORT Standard_Boolean SetOwnLineAspects (const Handle(Prs3d_Drawer)& theDefaults = Handle(Prs3d_Drawer)());
467
468   //! Sets own line aspects for datums.
469   //! Returns FALSE if own line for datums are already set.
470   Standard_EXPORT Standard_Boolean SetOwnDatumAspects (const Handle(Prs3d_Drawer)& theDefaults = Handle(Prs3d_Drawer)());
471
472   //! Returns settings for text aspect.
473   //! These settings can be edited. The default value is:
474   //! - Color: Quantity_NOC_YELLOW
475   Standard_EXPORT const Handle(Prs3d_TextAspect)& TextAspect();
476
477   //! Sets the parameter theAspect for display attributes of text.
478   Standard_EXPORT void SetTextAspect (const Handle(Prs3d_TextAspect)& theAspect);
479
480   //! Returns true if the drawer has its own attribute for
481   //! text aspect that overrides the one in the link.
482   Standard_Boolean HasOwnTextAspect() const { return myHasOwnTextAspect; }
483
484   //! Returns settings for shading aspects.
485   //! These settings can be edited. The default values are:
486   //! -   Color: Quantity_NOC_YELLOW
487   //! -   Material: Graphic3d_NOM_BRASS
488   //! Shading aspect is obtained through decomposition of
489   //! 3d faces into triangles, each side of each triangle
490   //! being a chord of the corresponding curved edge in the face.
491   //! Reflection of light in each projector perspective is then calculated for each of the
492   //! resultant triangular planes.
493   Standard_EXPORT const Handle(Prs3d_ShadingAspect)& ShadingAspect();
494
495   //! Sets the parameter theAspect for display attributes of shading.
496   Standard_EXPORT  void SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theAspect);
497
498   //! Returns true if the drawer has its own attribute for
499   //! shading aspect that overrides the one in the link.
500   Standard_Boolean HasOwnShadingAspect() const { return myHasOwnShadingAspect; }
501
502   //! Sets own shading aspect.
503   //! Returns FALSE if the drawer already has its own attribute for shading aspect.
504   Standard_EXPORT Standard_Boolean SetupOwnShadingAspect (const Handle(Prs3d_Drawer)& theDefaults = Handle(Prs3d_Drawer)());
505
506   //! Returns settings for seen line aspects.
507   //! These settings can be edited. The default values are:
508   //!   Color: Quantity_NOC_YELLOW
509   //!   Type of line: Aspect_TOL_SOLID
510   //!   Width: 1.0
511   Standard_EXPORT const Handle(Prs3d_LineAspect)& SeenLineAspect();
512
513   //! Sets the parameter theAspect for the display of seen lines in hidden line removal mode.
514   Standard_EXPORT void SetSeenLineAspect (const Handle(Prs3d_LineAspect)& theAspect);
515
516   //! Returns true if the drawer has its own attribute for
517   //! seen line aspect that overrides the one in the link.
518   Standard_Boolean HasOwnSeenLineAspect() const { return myHasOwnSeenLineAspect; }
519
520   //! Returns settings for the appearance of planes.
521   Standard_EXPORT const Handle(Prs3d_PlaneAspect)& PlaneAspect();
522
523   //! Sets the parameter theAspect for the display of planes. 
524   Standard_EXPORT void SetPlaneAspect (const Handle(Prs3d_PlaneAspect)& theAspect);
525
526   //! Returns true if the drawer has its own attribute for
527   //! plane aspect that overrides the one in the link.
528   Standard_Boolean HasOwnPlaneAspect() const { return myHasOwnPlaneAspect; }
529
530   //! Returns the attributes for display of arrows.
531   Standard_EXPORT const Handle(Prs3d_ArrowAspect)& ArrowAspect();
532
533   //! Sets the parameter theAspect for display attributes of arrows.
534   Standard_EXPORT void SetArrowAspect (const Handle(Prs3d_ArrowAspect)& theAspect);
535
536   //! Returns true if the drawer has its own attribute for
537   //! arrow aspect that overrides the one in the link.
538   Standard_Boolean HasOwnArrowAspect() const { return myHasOwnArrowAspect; }
539
540   //! Enables the drawing of an arrow at the end of each line.
541   //! By default the arrows are not drawn.
542   Standard_EXPORT void SetLineArrowDraw (const Standard_Boolean theIsEnabled);
543
544   //! Returns True if drawing an arrow at the end of each edge is enabled
545   //! and False otherwise (the default).
546   Standard_Boolean LineArrowDraw() const
547   {
548     return HasOwnLineArrowDraw() || myLink.IsNull()
549          ? myLineArrowDraw
550          : myLink->LineArrowDraw();
551   }
552
553   //! Returns true if the drawer has its own attribute for
554   //! "draw arrow" flag that overrides the one in the link.
555   Standard_Boolean HasOwnLineArrowDraw() const
556   {
557     return myHasOwnLineArrowDraw;
558   }
559
560   //! Returns settings for hidden line aspects.
561   //! These settings can be edited. The default values are:
562   //!   Color: Quantity_NOC_YELLOW
563   //!   Type of line: Aspect_TOL_DASH
564   //!   Width: 1.0
565   Standard_EXPORT const Handle(Prs3d_LineAspect)& HiddenLineAspect();
566
567   //! Sets the parameter theAspect for the display of hidden lines in hidden line removal mode.
568   Standard_EXPORT void SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect);
569
570   //! Returns true if the drawer has its own attribute for
571   //! hidden lines aspect that overrides the one in the link.
572   Standard_Boolean HasOwnHiddenLineAspect() const { return myHasOwnHiddenLineAspect; }
573
574   //! Returns Standard_True if the hidden lines are to be drawn.
575   //! By default the hidden lines are not drawn.
576   Standard_Boolean DrawHiddenLine() const
577   {
578     return HasOwnDrawHiddenLine() || myLink.IsNull()
579          ? myDrawHiddenLine
580          : myLink->DrawHiddenLine();
581   }
582
583   //! Enables the DrawHiddenLine function.
584   Standard_EXPORT void EnableDrawHiddenLine();
585
586   //! Disables the DrawHiddenLine function.
587   Standard_EXPORT void DisableDrawHiddenLine();
588
589   //! Returns true if the drawer has its own attribute for
590   //! "draw hidden lines" flag that overrides the one in the link.
591   Standard_Boolean HasOwnDrawHiddenLine() const { return myHasOwnDrawHiddenLine; }
592
593   //! Returns settings for the appearance of vectors.
594   //! These settings can be edited. The default values are:
595   //!   Color: Quantity_NOC_SKYBLUE
596   //!   Type of line: Aspect_TOL_SOLID
597   //!   Width: 1.0
598   Standard_EXPORT const Handle(Prs3d_LineAspect)& VectorAspect();
599
600   //! Sets the modality theAspect for the display of vectors.
601   Standard_EXPORT void SetVectorAspect (const Handle(Prs3d_LineAspect)& theAspect);
602
603   //! Returns true if the drawer has its own attribute for
604   //! vector aspect that overrides the one in the link.
605   Standard_Boolean HasOwnVectorAspect() const { return myHasOwnVectorAspect; }
606
607   //! Sets the mode of visualization of vertices of a TopoDS_Shape instance.
608   //! By default, only stand-alone vertices (not belonging topologically to an edge) are drawn,
609   //! that corresponds to Prs3d_VDM_Standalone mode. 
610   //! Switching to Prs3d_VDM_Standalone mode makes all shape's vertices visible.
611   //! To inherit this parameter from the global drawer instance ("the link") when it is present,
612   //! Prs3d_VDM_Inherited value should be used.
613   Standard_EXPORT void SetVertexDrawMode (const Prs3d_VertexDrawMode theMode);
614
615   //! Returns the current mode of visualization of vertices of a TopoDS_Shape instance.
616   Standard_EXPORT Prs3d_VertexDrawMode VertexDrawMode();
617
618   //! Returns true if the vertex draw mode is not equal to <b>Prs3d_VDM_Inherited</b>. 
619   //! This means that individual vertex draw mode value (i.e. not inherited from the global 
620   //! drawer) is used for a specific interactive object.
621   Standard_Boolean HasOwnVertexDrawMode() const { return (myVertexDrawMode != Prs3d_VDM_Inherited); }
622
623   //! Returns settings for the appearance of datums.
624   //! These settings can be edited. The default values for the three axes are:
625   //!   Color: Quantity_NOC_PEACHPUFF
626   //!   Type of line: Aspect_TOL_SOLID
627   //!   Width: 1.0
628   Standard_EXPORT const Handle(Prs3d_DatumAspect)& DatumAspect();
629
630   //! Sets the modality theAspect for the display of datums.
631   Standard_EXPORT void SetDatumAspect (const Handle(Prs3d_DatumAspect)& theAspect);
632
633   //! Returns true if the drawer has its own attribute for
634   //! datum aspect that overrides the one in the link.
635   Standard_Boolean HasOwnDatumAspect() const { return myHasOwnDatumAspect; }
636
637   //! The LineAspect for the wire can be edited.
638   //! The default values are:
639   //!   Color: Quantity_NOC_ORANGE
640   //!   Type of line: Aspect_TOL_SOLID
641   //!   Width: 1.0
642   //! These attributes are used by the algorithm Prs3d_WFShape.
643   Standard_EXPORT const Handle(Prs3d_LineAspect)& SectionAspect();
644
645   //! Sets the parameter theAspect for display attributes of sections. 
646   Standard_EXPORT void SetSectionAspect (const Handle(Prs3d_LineAspect)& theAspect);
647
648   //! Returns true if the drawer has its own attribute for
649   //! section aspect that overrides the one in the link.
650   Standard_Boolean HasOwnSectionAspect() const { return myHasOwnSectionAspect; }
651
652   //! Sets the parameter theAspect for the display of free boundaries.
653   //! The method sets aspect owned by the drawer that will be used during
654   //! visualization instead of the one set in link.
655   Standard_EXPORT void SetFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect);
656
657   //! Returns the values for presentation of free boundaries,
658   //! in other words, boundaries which are not shared.
659   //! The LineAspect for the  free boundaries can be edited.
660   //! The default values are:
661   //!   Color: Quantity_NOC_GREEN
662   //!   Type of line: Aspect_TOL_SOLID
663   //!   Width: 1.0
664   //! These attributes are used by the algorithm Prs3d_WFShape
665   Standard_EXPORT const Handle(Prs3d_LineAspect)& FreeBoundaryAspect();
666
667   //! Returns true if the drawer has its own attribute for
668   //! free boundaries aspect that overrides the one in the link.
669   Standard_Boolean HasOwnFreeBoundaryAspect() const { return myHasOwnFreeBoundaryAspect; }
670
671   //! Enables or disables drawing of free boundaries for shading presentations.
672   //! The method sets drawing flag owned by the drawer that will be used during
673   //! visualization instead of the one set in link.
674   //! theIsEnabled is a boolean flag indicating whether the free boundaries should be
675   //! drawn or not.
676   Standard_EXPORT void SetFreeBoundaryDraw (const Standard_Boolean theIsEnabled);
677
678   //! Returns True if the drawing of the free boundaries is enabled
679   //! True is the default setting.
680   Standard_Boolean FreeBoundaryDraw() const
681   {
682     return HasOwnFreeBoundaryDraw() || myLink.IsNull()
683          ? myFreeBoundaryDraw
684          : myLink->FreeBoundaryDraw();
685   }
686
687   //! Returns true if the drawer has its own attribute for
688   //! "draw free boundaries" flag that overrides the one in the link.
689   Standard_Boolean HasOwnFreeBoundaryDraw() const { return myHasOwnFreeBoundaryDraw; }
690
691   //! Sets the parameter theAspect for the display of shared boundaries.
692   //! The method sets aspect owned by the drawer that will be used during
693   //! visualization instead of the one set in link.
694   Standard_EXPORT void SetUnFreeBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect);
695
696   //! Returns settings for shared boundary line aspects.
697   //! The LineAspect for the unfree boundaries can be edited.
698   //! The default values are:
699   //! Color: Quantity_NOC_YELLOW
700   //! Type of line: Aspect_TOL_SOLID
701   //! Width: 1.
702   //! These attributes are used by the algorithm Prs3d_WFShape
703   Standard_EXPORT const Handle(Prs3d_LineAspect)& UnFreeBoundaryAspect();
704
705   //! Returns true if the drawer has its own attribute for
706   //! unfree boundaries aspect that overrides the one in the link.
707   Standard_Boolean HasOwnUnFreeBoundaryAspect() const { return myHasOwnUnFreeBoundaryAspect; }
708
709   //! Enables or disables drawing of shared boundaries for shading presentations.
710   //! The method sets drawing flag owned by the drawer that will be used during
711   //! visualization instead of the one set in link.
712   //! theIsEnabled is a boolean flag indicating whether the shared boundaries should be drawn or not.
713   Standard_EXPORT void SetUnFreeBoundaryDraw (const Standard_Boolean theIsEnabled);
714
715   //! Returns True if the drawing of the shared boundaries is enabled.
716   //! True is the default setting.
717   Standard_Boolean UnFreeBoundaryDraw() const
718   {
719     return HasOwnUnFreeBoundaryDraw() || myLink.IsNull()
720          ? myUnFreeBoundaryDraw
721          : myLink->UnFreeBoundaryDraw();
722   }
723
724   //! Returns true if the drawer has its own attribute for
725   //! "draw shared boundaries" flag that overrides the one in the link.
726   Standard_Boolean HasOwnUnFreeBoundaryDraw() const { return myHasOwnUnFreeBoundaryDraw; }
727
728   //! Sets line aspect for face boundaries.
729   //! The method sets line aspect owned by the drawer that will be used during
730   //! visualization instead of the one set in link.
731   //! theAspect is the line aspect that determines the look of the face boundaries.
732   Standard_EXPORT void SetFaceBoundaryAspect (const Handle(Prs3d_LineAspect)& theAspect);
733
734   //! Returns line aspect of face boundaries.
735   Standard_EXPORT const Handle(Prs3d_LineAspect)& FaceBoundaryAspect();
736
737   //! Returns true if the drawer has its own attribute for
738   //! face boundaries aspect that overrides the one in the link.
739   Standard_Boolean HasOwnFaceBoundaryAspect() const { return myHasOwnFaceBoundaryAspect; }
740
741   //! Enables or disables face boundary drawing for shading presentations. 
742   //! The method sets drawing flag owned by the drawer that will be used during
743   //! visualization instead of the one set in link.
744   //! theIsEnabled is a boolean flag indicating whether the face boundaries should be drawn or not.
745   Standard_EXPORT void SetFaceBoundaryDraw (const Standard_Boolean theIsEnabled);
746
747   //! Checks whether the face boundary drawing is enabled or not.
748   Standard_Boolean FaceBoundaryDraw() const
749   {
750     return HasOwnFaceBoundaryDraw() || myLink.IsNull()
751          ? myFaceBoundaryDraw
752          : myLink->FaceBoundaryDraw();
753   }
754
755   //! Returns true if the drawer has its own attribute for
756   //! "draw face boundaries" flag that overrides the one in the link.
757   Standard_Boolean HasOwnFaceBoundaryDraw() const { return myHasOwnFaceBoundaryDraw; }
758
759   //! Returns settings for the appearance of dimensions. 
760   Standard_EXPORT const Handle(Prs3d_DimensionAspect)& DimensionAspect();
761
762   //! Sets the settings for the appearance of dimensions.
763   //! The method sets aspect owned by the drawer that will be used during
764   //! visualization instead of the one set in link.
765   Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theAspect);
766
767   //! Returns true if the drawer has its own attribute for
768   //! the appearance of dimensions that overrides the one in the link.
769   Standard_Boolean HasOwnDimensionAspect() const { return myHasOwnDimensionAspect; }
770
771   //! Sets dimension length model units for computing of dimension presentation.
772   //! The method sets value owned by the drawer that will be used during
773   //! visualization instead of the one set in link.
774   Standard_EXPORT void SetDimLengthModelUnits (const TCollection_AsciiString& theUnits);
775
776   //! Sets dimension angle model units for computing of dimension presentation.
777   //! The method sets value owned by the drawer that will be used during
778   //! visualization instead of the one set in link.
779   Standard_EXPORT void SetDimAngleModelUnits (const TCollection_AsciiString& theUnits);
780
781   //! Returns length model units for the dimension presentation. 
782   const TCollection_AsciiString& DimLengthModelUnits() const
783   {
784     return HasOwnDimLengthModelUnits() || myLink.IsNull()
785          ? myDimensionModelUnits.GetLengthUnits()
786          : myLink->DimLengthModelUnits();
787   }
788
789   //! Returns angle model units for the dimension presentation. 
790   const TCollection_AsciiString& DimAngleModelUnits() const
791   {
792     return HasOwnDimAngleModelUnits() || myLink.IsNull()
793          ? myDimensionModelUnits.GetAngleUnits()
794          : myLink->DimAngleModelUnits();
795   }
796
797   //! Returns true if the drawer has its own attribute for
798   //! dimension length model units that overrides the one in the link.
799   Standard_Boolean HasOwnDimLengthModelUnits() const { return myHasOwnDimLengthModelUnits; }
800
801   //! Returns true if the drawer has its own attribute for
802   //! dimension angle model units that overrides the one in the link.
803   Standard_Boolean HasOwnDimAngleModelUnits() const { return myHasOwnDimAngleModelUnits; }
804
805   //! Sets length units in which value for dimension presentation is displayed.
806   //! The method sets value owned by the drawer that will be used during
807   //! visualization instead of the one set in link.
808   Standard_EXPORT void SetDimLengthDisplayUnits (const TCollection_AsciiString& theUnits);
809
810   //! Sets angle units in which value for dimension presentation is displayed.
811   //! The method sets value owned by the drawer that will be used during
812   //! visualization instead of the one set in link.
813   Standard_EXPORT void SetDimAngleDisplayUnits (const TCollection_AsciiString& theUnits);
814
815   //! Returns length units in which dimension presentation is displayed.
816   const TCollection_AsciiString& DimLengthDisplayUnits() const
817   {
818     return HasOwnDimLengthDisplayUnits() || myLink.IsNull()
819          ? myDimensionDisplayUnits.GetLengthUnits()
820          : myLink->DimLengthDisplayUnits();
821   }
822
823   //! Returns angle units in which dimension presentation is displayed.
824   const TCollection_AsciiString& DimAngleDisplayUnits() const
825   {
826     return HasOwnDimAngleDisplayUnits() || myLink.IsNull()
827          ? myDimensionDisplayUnits.GetAngleUnits()
828          : myLink->DimAngleDisplayUnits();
829   }
830
831   //! Returns true if the drawer has its own attribute for
832   //! length units in which dimension presentation is displayed
833   //! that overrides the one in the link.
834   Standard_Boolean HasOwnDimLengthDisplayUnits() const { return myHasOwnDimLengthDisplayUnits; }
835
836   //! Returns true if the drawer has its own attribute for
837   //! angle units in which dimension presentation is displayed
838   //! that overrides the one in the link.
839   Standard_Boolean HasOwnDimAngleDisplayUnits() const { return myHasOwnDimAngleDisplayUnits; }
840
841   //! Returns the drawer to which the current object references.
842   const Handle(Prs3d_Drawer)& Link() { return myLink; }
843
844   //! Returns true if the current object has a link on the other drawer.
845   Standard_Boolean HasLink() const { return !myLink.IsNull(); }
846
847   //! Sets theDrawer as a link to which the current object references.
848   void Link (const Handle(Prs3d_Drawer)& theDrawer) { SetLink (theDrawer); }
849
850   //! Sets theDrawer as a link to which the current object references.
851   void SetLink (const Handle(Prs3d_Drawer)& theDrawer) { myLink = theDrawer; }
852
853   //! Removes local attributes. 
854   Standard_EXPORT void ClearLocalAttributes();
855
856   //! Assign shader program for specified type of primitives.
857   //! @param theProgram new program to set (might be NULL)
858   //! @param theAspect  the type of primitives
859   //! @param theToOverrideDefaults if true then non-overridden attributes using defaults will be allocated and copied from the Link;
860   //!                              otherwise, only already customized attributes will be changed
861   //! @return TRUE if presentation should be recomputed after creating aspects not previously customized (if theToOverrideDefaults is also TRUE)
862   Standard_EXPORT bool SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram,
863                                          const Graphic3d_GroupAspect            theAspect,
864                                          const bool                             theToOverrideDefaults = false);
865
866   //! Sets Shading Model type for the shading aspect.
867   Standard_EXPORT bool SetShadingModel (Graphic3d_TypeOfShadingModel theModel,
868                                         bool theToOverrideDefaults = false);
869
870 protected:
871
872   Handle(Prs3d_Drawer)          myLink;
873
874   Standard_Integer              myNbPoints;
875   Standard_Boolean              myHasOwnNbPoints;
876   Standard_Real                 myMaximalParameterValue;
877   Standard_Boolean              myHasOwnMaximalParameterValue;
878   Standard_Real                 myChordialDeviation;
879   Standard_Boolean              myHasOwnChordialDeviation;
880   Aspect_TypeOfDeflection       myTypeOfDeflection;
881   Standard_Boolean              myHasOwnTypeOfDeflection;
882   Prs3d_TypeOfHLR               myTypeOfHLR;
883   Standard_Real                 myDeviationCoefficient;
884   Standard_Real                 myPreviousDeviationCoefficient;
885   Standard_Boolean              myHasOwnDeviationCoefficient;
886   Standard_Real                 myHLRDeviationCoefficient;
887   Standard_Boolean              myHasOwnHLRDeviationCoefficient;
888   Standard_Real                 myPreviousHLRDeviationCoefficient;
889   Standard_Real                 myDeviationAngle;
890   Standard_Boolean              myHasOwnDeviationAngle;
891   Standard_Real                 myPreviousDeviationAngle;
892   Standard_Real                 myHLRAngle;
893   Standard_Boolean              myHasOwnHLRDeviationAngle;
894   Standard_Real                 myPreviousHLRDeviationAngle;
895   Standard_Boolean              myIsoOnPlane;
896   Standard_Boolean              myHasOwnIsoOnPlane;
897   Standard_Boolean              myIsoOnTriangulation;
898   Standard_Boolean              myHasOwnIsoOnTriangulation;
899   Standard_Boolean              myIsAutoTriangulated;
900   Standard_Boolean              myHasOwnIsAutoTriangulated;
901
902   Handle(Prs3d_IsoAspect)       myUIsoAspect;
903   Standard_Boolean              myHasOwnUIsoAspect;
904   Handle(Prs3d_IsoAspect)       myVIsoAspect;
905   Standard_Boolean              myHasOwnVIsoAspect;
906   Handle(Prs3d_LineAspect)      myWireAspect;
907   Standard_Boolean              myHasOwnWireAspect;
908   Standard_Boolean              myWireDraw;
909   Standard_Boolean              myHasOwnWireDraw;
910   Handle(Prs3d_PointAspect)     myPointAspect;
911   Standard_Boolean              myHasOwnPointAspect;
912   Handle(Prs3d_LineAspect)      myLineAspect;
913   Standard_Boolean              myHasOwnLineAspect;
914   Handle(Prs3d_TextAspect)      myTextAspect;
915   Standard_Boolean              myHasOwnTextAspect;
916   Handle(Prs3d_ShadingAspect)   myShadingAspect;
917   Standard_Boolean              myHasOwnShadingAspect;
918   Handle(Prs3d_PlaneAspect)     myPlaneAspect;
919   Standard_Boolean              myHasOwnPlaneAspect;
920   Handle(Prs3d_LineAspect)      mySeenLineAspect;
921   Standard_Boolean              myHasOwnSeenLineAspect;
922   Handle(Prs3d_ArrowAspect)     myArrowAspect;
923   Standard_Boolean              myHasOwnArrowAspect;
924   Standard_Boolean              myLineArrowDraw;
925   Standard_Boolean              myHasOwnLineArrowDraw;
926   Handle(Prs3d_LineAspect)      myHiddenLineAspect;
927   Standard_Boolean              myHasOwnHiddenLineAspect;
928   Standard_Boolean              myDrawHiddenLine;
929   Standard_Boolean              myHasOwnDrawHiddenLine;
930   Handle(Prs3d_LineAspect)      myVectorAspect;
931   Standard_Boolean              myHasOwnVectorAspect;
932   Prs3d_VertexDrawMode          myVertexDrawMode;
933   Handle(Prs3d_DatumAspect)     myDatumAspect;
934   Standard_Boolean              myHasOwnDatumAspect;
935   Handle(Prs3d_LineAspect)      mySectionAspect;
936   Standard_Boolean              myHasOwnSectionAspect;
937
938   Handle(Prs3d_LineAspect)      myFreeBoundaryAspect;
939   Standard_Boolean              myHasOwnFreeBoundaryAspect;
940   Standard_Boolean              myFreeBoundaryDraw;
941   Standard_Boolean              myHasOwnFreeBoundaryDraw;
942   Handle(Prs3d_LineAspect)      myUnFreeBoundaryAspect;
943   Standard_Boolean              myHasOwnUnFreeBoundaryAspect;
944   Standard_Boolean              myUnFreeBoundaryDraw;
945   Standard_Boolean              myHasOwnUnFreeBoundaryDraw;
946   Handle(Prs3d_LineAspect)      myFaceBoundaryAspect;
947   Standard_Boolean              myHasOwnFaceBoundaryAspect;
948   Standard_Boolean              myFaceBoundaryDraw;
949   Standard_Boolean              myHasOwnFaceBoundaryDraw;
950
951   Handle(Prs3d_DimensionAspect) myDimensionAspect;
952   Standard_Boolean              myHasOwnDimensionAspect;
953   Prs3d_DimensionUnits          myDimensionModelUnits;
954   Standard_Boolean              myHasOwnDimLengthModelUnits;
955   Standard_Boolean              myHasOwnDimAngleModelUnits;
956   Prs3d_DimensionUnits          myDimensionDisplayUnits;
957   Standard_Boolean              myHasOwnDimLengthDisplayUnits;
958   Standard_Boolean              myHasOwnDimAngleDisplayUnits;
959
960 };
961
962 Standard_DEPRECATED("Class name is deprecated - use Prs3d_Drawer instead")
963 typedef Prs3d_Drawer Graphic3d_HighlightStyle;
964
965 #endif // _Prs3d_Drawer_HeaderFile