1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2013 OPEN CASCADE SAS
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
19 #ifndef _AIS_Dimension_Headerfile
20 #define _AIS_Dimension_Headerfile
22 #include <AIS_DimensionDisplayMode.hxx>
23 #include <AIS_DimensionOwner.hxx>
24 #include <AIS_DisplaySpecialSymbol.hxx>
25 #include <AIS_InteractiveObject.hxx>
26 #include <AIS_KindOfInteractive.hxx>
27 #include <AIS_KindOfDimension.hxx>
28 #include <AIS_KindOfSurface.hxx>
29 #include <Bnd_Box.hxx>
30 #include <Geom_Curve.hxx>
32 #include <Prs3d_ArrowAspect.hxx>
33 #include <Prs3d_DimensionAspect.hxx>
34 #include <Prs3d_LineAspect.hxx>
35 #include <Prs3d_Presentation.hxx>
36 #include <Prs3d_TextAspect.hxx>
37 #include <Select3D_ListOfSensitive.hxx>
38 #include <SelectMgr_EntityOwner.hxx>
39 #include <Standard.hxx>
40 #include <TCollection_ExtendedString.hxx>
41 #include <TColgp_HArray1OfPnt.hxx>
42 #include <TopoDS_Face.hxx>
43 #include <TopoDS_Shape.hxx>
45 DEFINE_STANDARD_HANDLE(AIS_Dimension, AIS_InteractiveObject)
47 class AIS_Dimension : public AIS_InteractiveObject
51 // Specifies supported at base level horizontal and vertical
52 // label positions for drawing extension lines and centered text.
55 LabelPosition_None = 0x00,
57 LabelPosition_Left = 0x01,
58 LabelPosition_Right = 0x02,
59 LabelPosition_HCenter = 0x04,
60 LabelPosition_HMask = LabelPosition_Left | LabelPosition_Right | LabelPosition_HCenter,
62 LabelPosition_Above = 0x10,
63 LabelPosition_Below = 0x20,
64 LabelPosition_VCenter = 0x40,
65 LabelPosition_VMask = LabelPosition_Above | LabelPosition_Below | LabelPosition_VCenter
70 //! Constructor with default parameters values
71 Standard_EXPORT AIS_Dimension();
73 //! Gets dimension value
74 Standard_EXPORT Standard_Real GetValue() const;
76 //! Sets dimension value
77 //! Attention! This method is used ONLY to set custom value.
78 //! To set value internally, use <myValue>.
79 Standard_EXPORT void SetCustomValue (const Standard_Real theValue);
81 //! Gets working plane.
82 Standard_EXPORT const gp_Pln& GetWorkingPlane() const;
84 //! Sets working plane.
85 Standard_EXPORT void SetWorkingPlane (const gp_Pln& thePlane);
87 Standard_EXPORT void SetFirstPoint (const gp_Pnt& thePoint);
89 Standard_EXPORT void SetSecondPoint (const gp_Pnt& thePoint);
91 Standard_EXPORT void SetFirstShape (const TopoDS_Shape& theFirstShape);
93 Standard_EXPORT void SetSecondShape (const TopoDS_Shape& theSecondShape);
95 //! Gets the dimension aspect from AIS object drawer.
96 //! Dimension aspect contains aspects of line, text and arrows for dimension presentation.
97 Standard_EXPORT Handle(Prs3d_DimensionAspect) DimensionAspect() const;
99 //! Sets new length aspect in the interactive object drawer.
100 Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect);
102 //! Returns the kind of dimension
103 Standard_EXPORT AIS_KindOfDimension KindOfDimension() const;
105 //! Returns the kind of interactive
106 Standard_EXPORT virtual AIS_KindOfInteractive Type() const;
108 //! Sets the kind of dimension
109 Standard_EXPORT virtual void SetKindOfDimension (const AIS_KindOfDimension theKindOfDimension);
111 //! Returns true if the class of objects accepts the display mode theMode.
112 //! The interactive context can have a default mode of
113 //! representation for the set of Interactive Objects. This
114 //! mode may not be accepted by object
115 Standard_EXPORT virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const;
117 // Selection computing if it is needed here
118 Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
119 const Standard_Integer theMode);
121 //! Reset working plane to default.
122 Standard_EXPORT void ResetWorkingPlane();
124 //! specifies dimension special symbol display options
125 Standard_EXPORT void SetDisplaySpecialSymbol (const AIS_DisplaySpecialSymbol theDisplaySpecSymbol);
127 //! shows dimension special symbol display options
128 Standard_EXPORT AIS_DisplaySpecialSymbol DisplaySpecialSymbol() const;
130 //! specifies special symbol
131 Standard_EXPORT void SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol);
133 //! returns special symbol
134 Standard_EXPORT Standard_ExtCharacter SpecialSymbol() const;
136 //! shows if Units are to be displayed along with dimension value
137 Standard_EXPORT Standard_Boolean IsUnitsDisplayed() const;
139 //! sets to display units along with the dimansion value or no
140 Standard_EXPORT void MakeUnitsDisplayed (const Standard_Boolean toDisplayUnits);
142 //! returns the current type of units
143 Standard_EXPORT TCollection_AsciiString UnitsQuantity() const;
145 //! sets the current type of units
146 Standard_EXPORT void SetUnitsQuantity (const TCollection_AsciiString& theUnitsQuantity);
148 //! returns the current model units
149 Standard_EXPORT TCollection_AsciiString ModelUnits() const;
151 //! sets the current model units
152 Standard_EXPORT void SetModelUnits (const TCollection_AsciiString& theUnits);
154 //! returns the current display units
155 Standard_EXPORT TCollection_AsciiString DisplayUnits() const;
157 //! sets the current display units
158 Standard_EXPORT void SetDisplayUnits (const TCollection_AsciiString& theUnits);
160 //! Important! Only for 3d text </br>
161 //! 3d text is oriented relative to the attachment points order </br>
162 //! By default, text direction vector is oriented from the first attachment point </br>
163 //! to the second one. This method checks if text direction is to be default or </br>
164 //! should be reversed.
165 Standard_EXPORT Standard_Boolean IsTextReversed() const;
167 //! Important! Only for 3d text
168 //! 3d text is oriented relative to the attachment points order </br>
169 //! By default, text direction vector is oriented from the first attachment point </br>
170 //! to the second one. This method sets value that shows if text direction </br>
171 //! should be reversed or not.
172 Standard_EXPORT void MakeTextReversed (const Standard_Boolean isTextReversed);
174 //! Sets selection tolerance for text2d:
175 //! For 2d text selection detection sensitive point with tolerance is used
176 //! to change this tolerance use this method
177 //! Important! Only for 2d text
178 Standard_EXPORT void SetSelToleranceForText2d (const Standard_Real theTol);
180 //! Returns selection tolerance for text2d:
181 //! For 2d text selection detection sensitive point with tolerance is used
182 //! Important! Only for 2d text
183 Standard_EXPORT Standard_Real SelToleranceForText2d() const;
185 //! Sets flyout size for dimension.
186 Standard_EXPORT void SetFlyout (const Standard_Real theFlyout);
188 //! @return flyout size for dimension.
189 Standard_Real GetFlyout() const
196 DEFINE_STANDARD_RTTI(AIS_Dimension)
200 Standard_EXPORT void getTextWidthAndString (Quantity_Length& theWidth,
201 TCollection_ExtendedString& theString) const;
203 Standard_EXPORT Standard_Real valueToDisplayUnits();
205 //! Reset working plane to default.
206 Standard_EXPORT void resetWorkingPlane (const gp_Pln& theNewDefaultPlane);
208 //! Count default plane
209 Standard_EXPORT virtual void countDefaultPlane();
211 //! Computes dimension value in display units
212 Standard_EXPORT virtual void computeValue();
214 //! Performs drawing of 2d or 3d arrows on the working plane
215 Standard_EXPORT void drawArrow (const Handle(Prs3d_Presentation)& thePresentation,
216 const gp_Pnt& theLocation,
217 const gp_Dir& theDirection);
219 //! Performs drawing of 2d or 3d text on the working plane
220 //! @return text width relative to the dimension working plane. For 2d text this value will be zero.
221 Standard_EXPORT Standard_Real drawText (const Handle(Prs3d_Presentation)& thePresentation,
222 const gp_Dir& theTextDir,
223 const TCollection_ExtendedString theText,
224 const AIS_DimensionDisplayMode theMode,
225 const Standard_Integer theLabelPosition);
227 //! Performs computing of dimension linear extension with text
228 //! @param thePresentation [in] the presentation to fill with graphical primitives.
229 //! @param theExtensionSize [in] the size of extension line.
230 //! @param theExtensionStart [in] the point where extension line connects to dimension.
231 //! @param theExtensionDir [in] the direction of extension line.
232 //! @param theValueString [in] the string with value.
233 //! @param theMode [in] the display mode.
234 //! @param theLabelPosition [in] position flags for the text label.
235 Standard_EXPORT void drawExtension (const Handle(Prs3d_Presentation)& thePresentation,
236 const Standard_Real theExtensionSize,
237 const gp_Pnt& theExtensionStart,
238 const gp_Dir& theExtensionDir,
239 const TCollection_ExtendedString& theValueString,
240 const AIS_DimensionDisplayMode theMode,
241 const Standard_Integer theLabelPosition);
243 //! Performs computing of linear dimension (for length, diameter, radius and so on)
244 Standard_EXPORT void drawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation,
245 const AIS_DimensionDisplayMode theMode,
246 const Standard_Boolean isOneSideDimension = Standard_False);
248 //! If it's possible computes circle from planar face
249 Standard_EXPORT Standard_Boolean circleFromPlanarFace (const TopoDS_Face& theFace,
250 Handle(Geom_Curve)& theCurve,
251 gp_Pnt & theFirstPoint,
252 gp_Pnt & theLastPoint);
254 //! Performs initialization of circle and points from given shape
255 //! (for radius, diameter and so on)
256 Standard_EXPORT Standard_Boolean initCircularDimension (const TopoDS_Shape& theShape,
258 gp_Pnt& theMiddleArcPoint,
259 gp_Pnt& theOppositeDiameterPoint);
260 Standard_EXPORT Standard_Boolean isComputed() const;
262 Standard_EXPORT void setComputed (Standard_Boolean isComputed);
264 Standard_EXPORT gp_Pnt textPosition() const;
266 Standard_EXPORT void setTextPosition (const gp_Pnt thePosition);
268 Standard_EXPORT void resetGeom();
270 //! Fills sensitive entity for flyouts and adds it to the selection.
271 Standard_EXPORT virtual void computeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection,
272 const Handle(AIS_DimensionOwner)& theOwner);
274 protected: //! @name Working plane properties
276 //! Dimension default plane
277 gp_Pln myDefaultPlane;
279 //! Shows if working plane is set custom
280 Standard_Boolean myIsWorkingPlaneCustom;
282 protected: //! @name Value properties
284 //! Dimension value which is displayed with dimension lines
285 Standard_Real myValue;
287 //! Shows if the value is set by user and is no need to count it automatically
288 Standard_Boolean myIsValueCustom;
290 protected: // !@name Units properties
292 //! The quantity of units for the value computation
293 TCollection_AsciiString myUnitsQuantity;
295 //! Units of the model
296 TCollection_AsciiString myModelUnits;
298 //! Units in which the displayed value will be converted
299 TCollection_AsciiString myDisplayUnits;
301 //! Determines if units is to be displayed along with the value
302 Standard_Boolean myToDisplayUnits;
304 //! Special symbol for some kind of dimensions (for diameter, radius and so on)
305 Standard_ExtCharacter mySpecialSymbol;
307 //! Special symbol display options
308 AIS_DisplaySpecialSymbol myDisplaySpecialSymbol;
310 protected: //! @name Geometry properties
312 //! Geometry of dimensions, needs for advanced selection
313 //! Geometry is computed in Compute() method and is used
314 //! in ComputeSelection() method.
315 //! If it is computed successfully, myIsComputed = Standard_True.
316 //! to check computing result use IsComputed() method
320 gp_Pnt myTextPosition;
322 //! Text bounding box, stored for advanced selection
323 Bnd_Box myTextBndBox;
325 //! Sensitive point tolerance for 2d text selection
326 Standard_Real mySelToleranceForText2d;
328 //! For advanced dimension line selection
329 Select3D_ListOfSensitive mySensitiveSegments;
331 //! Shows if attachment points were computed
332 Standard_Boolean myIsComputed;
336 DimensionGeom () : myIsComputed (Standard_False) {}
339 //! Shows if text is inverted
340 Standard_Boolean myIsTextReversed;
342 //! Points that are base for dimension.
343 //! My first point of dimension attach (belongs to shape for which dimension is computed)
346 //! My second point of dimension attach (belongs to shape for which dimension is computed)
347 gp_Pnt mySecondPoint;
349 //! Shows if attach points are initialized correctly
350 Standard_Boolean myIsInitialized;
352 //! First shape (can be vertex, edge or face)
353 TopoDS_Shape myFirstShape;
355 //! Second shape (can be vertex, edge or face)
356 TopoDS_Shape mySecondShape;
359 Standard_Integer myShapesNumber;
361 //! Defines flyout lines and direction
362 //! Flyout direction in the working plane.
363 //! Can be negative, or positive and is defined by the sign of myFlyout value.
364 //! The direction vector is counting using the working plane.
365 //! myFlyout value defined the size of flyout.
366 Standard_Real myFlyout;
368 //! Geometry of dimensions, needs for advanced selection
369 //! Geometry is computed in Compute() method and is used
370 //! in ComputeSelection() method.
371 //! If it is computed successfully, myIsComputed = Standard_True.
372 //! to check computing result use IsComputed() method
373 DimensionGeom myGeom;
377 //! Type of dimension
378 AIS_KindOfDimension myKindOfDimension;
380 //! Dimension working plane, is equal to <myDefaultPlane> if it can be computed automatically.
381 gp_Pln myWorkingPlane;