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