1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-21 10:55:33 +03:00
occt/src/AIS/AIS_MinRadiusDimension.cxx
abv 92efcf78a6 0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
Automatic restore of IMPLEMENT_STANDARD_RTTIEXT macro (upgrade -rtti)
2015-12-04 14:15:06 +03:00

342 lines
11 KiB
C++

// Created on: 1998-01-27
// Created by: Sergey ZARITCHNY
// Copyright (c) 1998-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <AIS.hxx>
#include <AIS_EllipseRadiusDimension.hxx>
#include <AIS_MinRadiusDimension.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <DsgPrs_EllipseRadiusPresentation.hxx>
#include <ElCLib.hxx>
#include <ElSLib.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <Geom_Ellipse.hxx>
#include <Geom_OffsetCurve.hxx>
#include <Geom_Plane.hxx>
#include <Geom_Surface.hxx>
#include <Geom_SurfaceOfLinearExtrusion.hxx>
#include <Geom_SurfaceOfRevolution.hxx>
#include <Geom_Transformation.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <gp_Ax1.hxx>
#include <gp_Dir.hxx>
#include <gp_Lin.hxx>
#include <gp_Pln.hxx>
#include <gp_Pnt.hxx>
#include <gp_Vec.hxx>
#include <Precision.hxx>
#include <Prs3d_ArrowAspect.hxx>
#include <Prs3d_DimensionAspect.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_Presentation.hxx>
#include <Prs3d_Projector.hxx>
#include <Prs3d_Text.hxx>
#include <Prs3d_TextAspect.hxx>
#include <Select3D_SensitiveBox.hxx>
#include <Select3D_SensitiveCurve.hxx>
#include <Select3D_SensitiveSegment.hxx>
#include <SelectMgr_EntityOwner.hxx>
#include <SelectMgr_Selection.hxx>
#include <Standard_ConstructionError.hxx>
#include <Standard_NotImplemented.hxx>
#include <Standard_Type.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_MinRadiusDimension,AIS_EllipseRadiusDimension)
//=======================================================================
//function : AIS_MinRadiusDimension
//purpose :
//=======================================================================
AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape,
const Standard_Real aVal,
const TCollection_ExtendedString& aText)
:AIS_EllipseRadiusDimension(aShape, aText)
{
myVal = aVal;
mySymbolPrs = DsgPrs_AS_LASTAR;
myAutomaticPosition = Standard_True;
myArrowSize = myVal / 100.;
}
//=======================================================================
//function : AIS_MinRadiusDimension
//purpose :
//=======================================================================
AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape,
const Standard_Real aVal,
const TCollection_ExtendedString& aText,
const gp_Pnt& aPosition,
const DsgPrs_ArrowSide aSymbolPrs,
const Standard_Real anArrowSize)
:AIS_EllipseRadiusDimension(aShape, aText)
{
myVal = aVal;
mySymbolPrs = aSymbolPrs;
myPosition = aPosition;
myAutomaticPosition = Standard_False;
SetArrowSize( anArrowSize );
}
//=======================================================================
//function : Compute
//purpose :
//=======================================================================
void AIS_MinRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
const Handle(Prs3d_Presentation)& aPresentation,
const Standard_Integer /*aMode*/)
{
aPresentation->Clear();
// if( myAutomaticPosition )
//{ //ota : recompute ellipse always
ComputeGeometry();
myEllipse.SetMinorRadius(myVal);
gp_Vec v1(myEllipse.YAxis().Direction());
v1 *=myVal;
myApexP = myEllipse.Location().Translated(v1);
myApexN = myEllipse.Location().Translated(-v1);
// }
if(myIsAnArc) ComputeArcOfEllipse(aPresentation);
else
ComputeEllipse(aPresentation);
}
//=======================================================================
//function : Compute
//purpose : to avoid warning
//=======================================================================
void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector,
const Handle(Prs3d_Presentation)& aPresentation)
{
// Standard_NotImplemented::Raise("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)");
PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ;
}
//=======================================================================
//function : Compute
//purpose :
//=======================================================================
void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector,
const Handle(Geom_Transformation)& aTransformation,
const Handle(Prs3d_Presentation)& aPresentation)
{
// Standard_NotImplemented::Raise("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)");
PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ;
}
//=======================================================================
//function : ComputeEllipse
//purpose :
//=======================================================================
void AIS_MinRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation)
{
Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect();
Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect();
// size
if( !myArrowSizeIsDefined ) {
myArrowSize = Min(myArrowSize,myVal/5.);
}
arr->SetLength(myArrowSize);
Standard_Real U;//,V;
gp_Pnt curPos, Center;
Center = myEllipse.Location();
if( myAutomaticPosition )
{
myPosition = Center;
myEndOfArrow = myApexP;
myAutomaticPosition = Standard_True;
if ( myIsSetBndBox )
myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )),
myBndBox );
curPos = myPosition;
}
else //!AutomaticPosition
{
curPos = myPosition;
gp_Lin L1(myEllipse.YAxis());
U = ElCLib::Parameter ( L1, curPos );
curPos = ElCLib::Value (U, L1);
if (curPos.Distance(myApexP) < curPos.Distance(myApexN))
myEndOfArrow = myApexP ;
else
myEndOfArrow = myApexN ;
myPosition = curPos;
}
// Presenatation
DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos,
myEndOfArrow, Center, Standard_False, mySymbolPrs);
}
//=======================================================================
//function : ComputeArcOfEllipse
//purpose :
//=======================================================================
void AIS_MinRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation)
{
Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect();
Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect();
// size
if( !myArrowSizeIsDefined ) {
myArrowSize = Min(myArrowSize,myVal/5.);
}
arr->SetLength(myArrowSize);
Standard_Real par;
gp_Pnt curPos, Center;
Center = myEllipse.Location();
Standard_Boolean IsInDomain = Standard_True;
if( myAutomaticPosition )
{
myEndOfArrow = AIS::NearestApex(myEllipse, myApexP, myApexN,
myFirstPar, myLastPar, IsInDomain);
myPosition = Center;
myAutomaticPosition = Standard_True;
if ( myIsSetBndBox )
myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )),
myBndBox );
curPos = myPosition;
}
else //!AutomaticPosition
{
curPos = myPosition;
gp_Lin L1(myEllipse.YAxis());
par = ElCLib::Parameter ( L1, curPos );
curPos = ElCLib::Value (par, L1);
if (curPos.Distance(myApexP) < curPos.Distance(myApexN))
myEndOfArrow = myApexP ;
else
myEndOfArrow = myApexN ;
par = ElCLib::Parameter ( myEllipse, myEndOfArrow );
IsInDomain = AIS::InDomain(myFirstPar, myLastPar, par);
myPosition = curPos;
}
Standard_Real parStart =0.;
if( !IsInDomain )
{
if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) <
AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar))
parStart = myFirstPar;
else
parStart = myLastPar;
}
if(!myIsOffset)
DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse,
curPos, myEndOfArrow, Center, parStart, IsInDomain,
Standard_True, mySymbolPrs);
else
DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve,
curPos, myEndOfArrow, Center, parStart, IsInDomain,
Standard_True, mySymbolPrs);
}
//=======================================================================
//function : ComputeSelection
//purpose :
//=======================================================================
void AIS_MinRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
const Standard_Integer /*aMode*/)
{
gp_Pnt center = myEllipse.Location();
gp_Pnt AttachmentPoint = myPosition;
Standard_Real dist = center.Distance(AttachmentPoint);
Standard_Real aRadius = myVal;
//Standard_Real inside = Standard_False;
gp_Pnt pt1;
if (dist > aRadius) pt1 = AttachmentPoint;
else
pt1 = myEndOfArrow;
Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
Handle(Select3D_SensitiveSegment)
seg = new Select3D_SensitiveSegment(own, center , pt1);
aSelection->Add(seg);
// Text
Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6));
Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own,
AttachmentPoint.X(),
AttachmentPoint.Y(),
AttachmentPoint.Z(),
AttachmentPoint.X()+size,
AttachmentPoint.Y()+size,
AttachmentPoint.Z()+size);
aSelection->Add(box);
// Arc of Ellipse
if(myIsAnArc)
{
Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow );
if(!AIS::InDomain(myFirstPar, myLastPar, parEnd))
{
Standard_Real parStart, par;
if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) <
AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar))
par = myFirstPar;
else
par = myLastPar;
gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ;
gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ;
gp_Dir dir(Vpnt ^ Vapex);
if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) {
parStart = parEnd;
parEnd = par;
}
else
parStart = par;
Handle(Geom_Curve)TrimCurve;
if(myIsOffset)
{
Handle(Geom_Curve) aCurve = myOffsetCurve;
TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd );
}
else
{
Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse );
TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd );
}
Handle( Select3D_SensitiveCurve ) SensArc;
SensArc = new Select3D_SensitiveCurve( own, TrimCurve );
aSelection->Add( SensArc );
}
}
}