1 // Created on: 1998-01-27
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 1998-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 #define BUC60915 //GG 05/06/01 Enable to compute the requested arrow size
18 // if any in all dimensions.
20 #include <Standard_NotImplemented.hxx>
22 #include <AIS_MinRadiusDimension.ixx>
24 #include <AIS_EllipseRadiusDimension.hxx>
25 #include <TCollection_ExtendedString.hxx>
27 #include <Prs3d_DimensionAspect.hxx>
28 #include <Prs3d_ArrowAspect.hxx>
29 #include <Prs3d_Drawer.hxx>
30 #include <Prs3d_TextAspect.hxx>
31 #include <Prs3d_Text.hxx>
33 #include <Select3D_SensitiveSegment.hxx>
34 #include <Select3D_SensitiveCurve.hxx>
35 #include <Select3D_SensitiveBox.hxx>
36 #include <SelectMgr_EntityOwner.hxx>
43 #include <BRepAdaptor_Surface.hxx>
44 #include <BRepAdaptor_Curve.hxx>
46 #include <Geom_Ellipse.hxx>
47 #include <Geom_TrimmedCurve.hxx>
48 #include <Geom_Plane.hxx>
49 #include <Geom_Surface.hxx>
50 #include <Geom_CylindricalSurface.hxx>
51 #include <Geom_SurfaceOfRevolution.hxx>
52 #include <Geom_CylindricalSurface.hxx>
53 #include <Geom_SurfaceOfLinearExtrusion.hxx>
63 #include <AIS_Drawer.hxx>
65 #include <Precision.hxx>
66 #include <DsgPrs_EllipseRadiusPresentation.hxx>
69 //=======================================================================
70 //function : AIS_MinRadiusDimension
72 //=======================================================================
74 AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape,
75 const Standard_Real aVal,
76 const TCollection_ExtendedString& aText)
77 :AIS_EllipseRadiusDimension(aShape, aText)
80 mySymbolPrs = DsgPrs_AS_LASTAR;
81 myAutomaticPosition = Standard_True;
82 myArrowSize = myVal / 100.;
85 //=======================================================================
86 //function : AIS_MinRadiusDimension
88 //=======================================================================
90 AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape,
91 const Standard_Real aVal,
92 const TCollection_ExtendedString& aText,
93 const gp_Pnt& aPosition,
94 const DsgPrs_ArrowSide aSymbolPrs,
95 const Standard_Real anArrowSize)
96 :AIS_EllipseRadiusDimension(aShape, aText)
99 mySymbolPrs = aSymbolPrs;
100 myPosition = aPosition;
101 myAutomaticPosition = Standard_False;
103 SetArrowSize( anArrowSize );
105 myArrowSize = anArrowSize;
109 //=======================================================================
112 //=======================================================================
114 void AIS_MinRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
115 const Handle(Prs3d_Presentation)& aPresentation,
116 const Standard_Integer /*aMode*/)
118 aPresentation->Clear();
120 // if( myAutomaticPosition )
121 //{ //ota : recompute ellipse always
123 myEllipse.SetMinorRadius(myVal);
124 gp_Vec v1(myEllipse.YAxis().Direction());
126 myApexP = myEllipse.Location().Translated(v1);
127 myApexN = myEllipse.Location().Translated(-v1);
129 if(myIsAnArc) ComputeArcOfEllipse(aPresentation);
131 ComputeEllipse(aPresentation);
134 //=======================================================================
136 //purpose : to avoid warning
137 //=======================================================================
139 void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector,
140 const Handle(Prs3d_Presentation)& aPresentation)
142 // Standard_NotImplemented::Raise("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)");
143 PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
146 //=======================================================================
149 //=======================================================================
151 void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector,
152 const Handle(Geom_Transformation)& aTransformation,
153 const Handle(Prs3d_Presentation)& aPresentation)
155 // Standard_NotImplemented::Raise("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)");
156 PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
159 //=======================================================================
160 //function : ComputeEllipse
162 //=======================================================================
164 void AIS_MinRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation)
167 Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect();
168 Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect();
172 if( !myArrowSizeIsDefined ) {
173 myArrowSize = Min(myArrowSize,myVal/5.);
175 arr->SetLength(myArrowSize);
177 if (myVal/5. > myArrowSize) {
178 arr->SetLength(myArrowSize);
181 arr->SetLength(myVal/5.);
185 Standard_Real U;//,V;
186 gp_Pnt curPos, Center;
187 Center = myEllipse.Location();
188 if( myAutomaticPosition )
191 myEndOfArrow = myApexP;
192 myAutomaticPosition = Standard_True;
195 myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )),
199 else //!AutomaticPosition
202 gp_Lin L1(myEllipse.YAxis());
203 U = ElCLib::Parameter ( L1, curPos );
204 curPos = ElCLib::Value (U, L1);
205 if (curPos.Distance(myApexP) < curPos.Distance(myApexN))
206 myEndOfArrow = myApexP ;
208 myEndOfArrow = myApexN ;
213 DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos,
214 myEndOfArrow, Center, Standard_False, mySymbolPrs);
218 //=======================================================================
219 //function : ComputeArcOfEllipse
221 //=======================================================================
223 void AIS_MinRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation)
226 Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect();
227 Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect();
231 if( !myArrowSizeIsDefined ) {
232 myArrowSize = Min(myArrowSize,myVal/5.);
234 arr->SetLength(myArrowSize);
236 if (myVal/5. > myArrowSize) {
237 arr->SetLength(myArrowSize);
240 arr->SetLength(myVal/5.);
245 gp_Pnt curPos, Center;
246 Center = myEllipse.Location();
247 Standard_Boolean IsInDomain = Standard_True;
248 if( myAutomaticPosition )
250 myEndOfArrow = AIS::NearestApex(myEllipse, myApexP, myApexN,
251 myFirstPar, myLastPar, IsInDomain);
253 myAutomaticPosition = Standard_True;
255 myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )),
260 else //!AutomaticPosition
263 gp_Lin L1(myEllipse.YAxis());
264 par = ElCLib::Parameter ( L1, curPos );
265 curPos = ElCLib::Value (par, L1);
266 if (curPos.Distance(myApexP) < curPos.Distance(myApexN))
267 myEndOfArrow = myApexP ;
269 myEndOfArrow = myApexN ;
270 par = ElCLib::Parameter ( myEllipse, myEndOfArrow );
271 IsInDomain = AIS::InDomain(myFirstPar, myLastPar, par);
275 Standard_Real parStart =0.;
278 if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) <
279 AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar))
280 parStart = myFirstPar;
282 parStart = myLastPar;
287 DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse,
288 curPos, myEndOfArrow, Center, parStart, IsInDomain,
289 Standard_True, mySymbolPrs);
291 DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve,
292 curPos, myEndOfArrow, Center, parStart, IsInDomain,
293 Standard_True, mySymbolPrs);
297 //=======================================================================
298 //function : ComputeSelection
300 //=======================================================================
302 void AIS_MinRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
303 const Standard_Integer /*aMode*/)
306 gp_Pnt center = myEllipse.Location();
307 gp_Pnt AttachmentPoint = myPosition;
308 Standard_Real dist = center.Distance(AttachmentPoint);
309 Standard_Real aRadius = myVal;
310 //Standard_Real inside = Standard_False;
312 if (dist > aRadius) pt1 = AttachmentPoint;
315 Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
316 Handle(Select3D_SensitiveSegment)
317 seg = new Select3D_SensitiveSegment(own, center , pt1);
318 aSelection->Add(seg);
321 Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6));
322 Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own,
326 AttachmentPoint.X()+size,
327 AttachmentPoint.Y()+size,
328 AttachmentPoint.Z()+size);
329 aSelection->Add(box);
335 Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow );
336 if(!AIS::InDomain(myFirstPar, myLastPar, parEnd))
338 Standard_Real parStart, par;
339 if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) <
340 AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar))
344 gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ;
345 gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ;
346 gp_Dir dir(Vpnt ^ Vapex);
347 if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) {
353 Handle(Geom_TrimmedCurve)TrimCurve;
356 Handle(Geom_Curve) aCurve = myOffsetCurve;
357 TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd );
361 Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse );
362 TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd );
364 Handle( Select3D_SensitiveCurve ) SensArc;
365 SensArc = new Select3D_SensitiveCurve( own, TrimCurve );
366 aSelection->Add( SensArc );