1 // Created on: 1996-12-05
2 // Created by: Jean-Pierre COMBE/Odile Olivier/Serguei Zaritchny
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <PrsDim_RadiusDimension.hxx>
20 #include <BRepLib_MakeEdge.hxx>
22 #include <gce_MakeDir.hxx>
24 IMPLEMENT_STANDARD_RTTIEXT(PrsDim_RadiusDimension, PrsDim_Dimension)
28 static const Standard_ExtCharacter THE_RADIUS_SYMBOL ('R');
31 //=======================================================================
32 //function : Constructor
34 //=======================================================================
35 PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle)
36 : PrsDim_Dimension (PrsDim_KOD_RADIUS)
38 SetMeasuredGeometry (theCircle);
39 SetSpecialSymbol (THE_RADIUS_SYMBOL);
40 SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before);
44 //=======================================================================
45 //function : Constructor
47 //=======================================================================
48 PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle,
49 const gp_Pnt& theAttachPoint)
50 : PrsDim_Dimension (PrsDim_KOD_RADIUS)
52 SetMeasuredGeometry (theCircle, theAttachPoint);
53 SetSpecialSymbol (THE_RADIUS_SYMBOL);
54 SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before);
58 //=======================================================================
59 //function : Constructor
61 //=======================================================================
62 PrsDim_RadiusDimension::PrsDim_RadiusDimension (const TopoDS_Shape& theShape)
63 : PrsDim_Dimension (PrsDim_KOD_RADIUS)
65 SetMeasuredGeometry (theShape);
66 SetSpecialSymbol (THE_RADIUS_SYMBOL);
67 SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before);
71 //=======================================================================
72 //function : SetMeasuredGeometry
74 //=======================================================================
75 void PrsDim_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle,
76 const gp_Pnt& theAnchorPoint,
77 const Standard_Boolean theHasAnchor)
80 myGeometryType = GeometryType_Edge;
81 myShape = BRepLib_MakeEdge (theCircle);
82 myAnchorPoint = theHasAnchor ? theAnchorPoint : ElCLib::Value (0, myCircle);
83 myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, myAnchorPoint);
85 if (myIsGeometryValid)
93 //=======================================================================
94 //function : SetMeasuredGeometry
96 //=======================================================================
97 void PrsDim_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape,
98 const gp_Pnt& theAnchorPoint,
99 const Standard_Boolean theHasAnchor)
101 Standard_Boolean isClosed = Standard_False;
103 myGeometryType = GeometryType_UndefShapes;
104 myIsGeometryValid = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed)
105 && IsValidCircle (myCircle);
108 myAnchorPoint = theAnchorPoint;
109 myIsGeometryValid = myIsGeometryValid && IsValidAnchor (myCircle, myAnchorPoint);
112 if (myIsGeometryValid)
120 //=======================================================================
121 //function : CheckPlane
123 //=======================================================================
124 Standard_Boolean PrsDim_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const
126 // Check if anchor point and circle center point belong to plane.
127 if (!thePlane.Contains (myAnchorPoint, Precision::Confusion()) &&
128 !thePlane.Contains (myCircle.Location(), Precision::Confusion()))
130 return Standard_False;
133 return Standard_True;
136 //=======================================================================
137 //function : ComputePlane
139 //=======================================================================
140 void PrsDim_RadiusDimension::ComputePlane()
142 if (!myIsGeometryValid)
147 gp_Dir aDimensionX = gce_MakeDir (myAnchorPoint, myCircle.Location());
149 myPlane = gp_Pln (gp_Ax3 (myCircle.Location(),
150 myCircle.Axis().Direction(),
154 //=======================================================================
155 //function : GetModelUnits
157 //=======================================================================
158 const TCollection_AsciiString& PrsDim_RadiusDimension::GetModelUnits() const
160 return myDrawer->DimLengthModelUnits();
163 //=======================================================================
164 //function : GetDisplayUnits
166 //=======================================================================
167 const TCollection_AsciiString& PrsDim_RadiusDimension::GetDisplayUnits() const
169 return myDrawer->DimLengthDisplayUnits();
172 //=======================================================================
173 //function : SetModelUnits
175 //=======================================================================
176 void PrsDim_RadiusDimension::SetModelUnits (const TCollection_AsciiString& theUnits)
178 myDrawer->SetDimLengthModelUnits (theUnits);
181 //=======================================================================
182 //function : SetDisplayUnits
184 //=======================================================================
185 void PrsDim_RadiusDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits)
187 myDrawer->SetDimLengthDisplayUnits(theUnits);
190 //=======================================================================
191 //function : ComputeValue
193 //=======================================================================
194 Standard_Real PrsDim_RadiusDimension::ComputeValue() const
201 return myCircle.Radius();
204 //=======================================================================
207 //=======================================================================
208 void PrsDim_RadiusDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/,
209 const Handle(Prs3d_Presentation)& thePresentation,
210 const Standard_Integer theMode)
212 mySelectionGeom.Clear (theMode);
219 DrawLinearDimension (thePresentation, theMode, myAnchorPoint, myCircle.Location(), Standard_True);
222 //=======================================================================
223 //function : IsValidCircle
225 //=======================================================================
226 Standard_Boolean PrsDim_RadiusDimension::IsValidCircle (const gp_Circ& theCircle) const
228 return theCircle.Radius() > Precision::Confusion();
231 //=======================================================================
232 //function : IsValidAnchor
234 //=======================================================================
235 Standard_Boolean PrsDim_RadiusDimension::IsValidAnchor (const gp_Circ& theCircle,
236 const gp_Pnt& theAnchor) const
238 gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction());
239 Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location());
241 return anAnchorDist > Precision::Confusion()
242 && aCirclePlane.Contains (theAnchor, Precision::Confusion());
245 //=======================================================================
246 //function : GetTextPosition
248 //=======================================================================
249 gp_Pnt PrsDim_RadiusDimension::GetTextPosition() const
251 if (IsTextPositionCustom())
253 return myFixedTextPosition;
256 // Counts text position according to the dimension parameters
257 return GetTextPositionForLinear (myAnchorPoint, myCircle.Location(), Standard_True);
260 //=======================================================================
261 //function : GetTextPosition
263 //=======================================================================
264 void PrsDim_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos)
266 if (!myIsGeometryValid)
271 myIsTextPositionFixed = Standard_True;
272 myFixedTextPosition = theTextPos;