From: kgv Date: Sat, 21 Mar 2020 13:31:03 +0000 (+0300) Subject: 0031456: Visualization - move out Dimensions and Relations from package AIS to PrsDims X-Git-Tag: V7_5_0_beta~241 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=787ff2408c680462f82753ae698239cf5587fa98;p=occt-copy.git 0031456: Visualization - move out Dimensions and Relations from package AIS to PrsDims The following classes and their subclasses within AIS package have been moved to new package PrsDim and renamed: - AIS_Relation -> PrsDim_Relation; - AIS_Dimension -> PrsDim_Dimension, --- diff --git a/adm/UDLIST b/adm/UDLIST index f9645d7303..b81cd39c31 100644 --- a/adm/UDLIST +++ b/adm/UDLIST @@ -202,6 +202,7 @@ n InterfaceGraphic n AIS n Aspect n DsgPrs +n PrsDim n Graphic3d n Image n Media diff --git a/dox/dev_guides/upgrade/upgrade.md b/dox/dev_guides/upgrade/upgrade.md index 45c48ea1c6..9f70d21deb 100644 --- a/dox/dev_guides/upgrade/upgrade.md +++ b/dox/dev_guides/upgrade/upgrade.md @@ -1900,6 +1900,11 @@ The default value of Prs3d_Drawer::DeviationAngle() property has been changed fr Methods computing HLR presentation within *PrsMgr_PresentableObject::Compute()* have been renamed to *PrsMgr_PresentableObject::computeHLR()* and now accept *Graphic3d_Camera* object instead of removed *Prs3d_Projector*. +@subsection upgrade_750_dimensions Dimension and Relation presentations moved from AIS to PrsDim + +Presentation classes displaying Dimensions and Relations have been moved from *AIS* package to *PrsDim*. +Corresponding classes should be renamed in application code (like *AIS_LengthDimension* -> *PrsDim_LengthDimension*). + @subsection upgrade_750_sensitiveEntity Select3D_SensitiveEntity interface change The method Select3D_SensitiveEntity::NbSubElements() has been changed to be constant. Select3D_SensitiveEntity subclasses at application level should be updated accordingly. diff --git a/dox/user_guides/visualization/visualization.md b/dox/user_guides/visualization/visualization.md index 17735f363e..2fc8473f97 100644 --- a/dox/user_guides/visualization/visualization.md +++ b/dox/user_guides/visualization/visualization.md @@ -962,26 +962,26 @@ This command can also draw a sphere surface or a volume with a large amount of p The **Relation** is made up of constraints on one or more interactive shapes and the corresponding reference geometry. For example, you might want to constrain two edges in a parallel relation. This constraint is considered as an object in its own right, and is shown as a sensitive primitive. This takes the graphic form of a perpendicular arrow marked with the || symbol and lying between the two edges. -The following relations are provided by *AIS*: - * *AIS_ConcentricRelation* - * *AIS_FixRelation* - * *AIS_IdenticRelation* - * *AIS_ParallelRelation* - * *AIS_PerpendicularRelation* - * *AIS_Relation* - * *AIS_SymmetricRelation* - * *AIS_TangentRelation* +The following relations are provided by *PrsDim*: + * *PrsDim_ConcentricRelation* + * *PrsDim_FixRelation* + * *PrsDim_IdenticRelation* + * *PrsDim_ParallelRelation* + * *PrsDim_PerpendicularRelation* + * *PrsDim_Relation* + * *PrsDim_SymmetricRelation* + * *PrsDim_TangentRelation* The list of relations is not exhaustive. @subsubsection occt_visu_3_5_4 Dimensions - * *AIS_AngleDimension* - * *AIS_Chamf3dDimension* - * *AIS_DiameterDimension* - * *AIS_DimensionOwner* - * *AIS_LengthDimension* - * *AIS_OffsetDimension* - * *AIS_RadiusDimension* + * *PrsDim_AngleDimension* + * *PrsDim_Chamf3dDimension* + * *PrsDim_DiameterDimension* + * *PrsDim_DimensionOwner* + * *PrsDim_LengthDimension* + * *PrsDim_OffsetDimension* + * *PrsDim_RadiusDimension* @subsubsection occt_visu_3_5_5 MeshVS_Mesh diff --git a/samples/mfc/standard/Common/AngleParamsVerticesPage.cpp b/samples/mfc/standard/Common/AngleParamsVerticesPage.cpp index 7bc3364e59..cb39df9c7c 100644 --- a/samples/mfc/standard/Common/AngleParamsVerticesPage.cpp +++ b/samples/mfc/standard/Common/AngleParamsVerticesPage.cpp @@ -6,8 +6,7 @@ #include "DimensionDlg.h" #include -#include -#include +#include #include #include #include @@ -128,7 +127,7 @@ void CAngleParamsVerticesPage::OnBnClickedVertex3Btn() GC_MakePlane aPlaneBuilder (aP1,aP2,aP3); Handle(Geom_Plane) aPlane = aPlaneBuilder.Value(); - Handle(AIS_AngleDimension) anAngleDim = new AIS_AngleDimension (aP1,aP2,aP3); + Handle(PrsDim_AngleDimension) anAngleDim = new PrsDim_AngleDimension (aP1,aP2,aP3); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); anAspect->MakeArrows3d (Standard_False); anAspect->MakeText3d (aDimDlg->GetTextType()); @@ -146,7 +145,7 @@ void CAngleParamsVerticesPage::OnBnClickedVertex3Btn() } else // radians - no special symbol { - anAngleDim->SetDisplaySpecialSymbol (AIS_DSS_No); + anAngleDim->SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_No); } } anAngleDim->SetDimensionAspect (anAspect); diff --git a/samples/mfc/standard/Common/LengthParamsEdgePage.cpp b/samples/mfc/standard/Common/LengthParamsEdgePage.cpp index 02252f67df..89c90ce6eb 100644 --- a/samples/mfc/standard/Common/LengthParamsEdgePage.cpp +++ b/samples/mfc/standard/Common/LengthParamsEdgePage.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include @@ -91,7 +91,7 @@ void CLengthParamsEdgePage::OnBnClickedChooseEdgeBtn() CDimensionDlg *aDimDlg = (CDimensionDlg*)(GetParentOwner()); - Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (TopoDS::Edge (anEdge), aPlane->Pln()); + Handle(PrsDim_LengthDimension) aLenDim = new PrsDim_LengthDimension (TopoDS::Edge (anEdge), aPlane->Pln()); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); anAspect->MakeArrows3d (Standard_False); anAspect->MakeText3d (aDimDlg->GetTextType()); diff --git a/samples/mfc/standard/Common/LengthParamsEdgesPage.cpp b/samples/mfc/standard/Common/LengthParamsEdgesPage.cpp index f4042b1824..6a2814888f 100644 --- a/samples/mfc/standard/Common/LengthParamsEdgesPage.cpp +++ b/samples/mfc/standard/Common/LengthParamsEdgesPage.cpp @@ -5,8 +5,8 @@ #include "LengthParamsEdgesPage.h" #include "DimensionDlg.h" #include -#include -#include +#include +#include #include // CLengthParamsEdgesPage dialog @@ -119,7 +119,7 @@ void CLengthParamsEdgesPage::OnBnClickedEdge2Btn() if (myIsAngleDimension) { // Build an angle dimension between two non-parallel edges - Handle(AIS_AngleDimension) anAngleDim = new AIS_AngleDimension (myFirstEdge, mySecondEdge); + Handle(PrsDim_AngleDimension) anAngleDim = new PrsDim_AngleDimension (myFirstEdge, mySecondEdge); anAngleDim->SetDimensionAspect (anAspect); anAngleDim->DimensionAspect()->MakeUnitsDisplayed (aDimDlg->IsUnitsDisplayed()); if (aDimDlg->IsUnitsDisplayed()) @@ -131,7 +131,7 @@ void CLengthParamsEdgesPage::OnBnClickedEdge2Btn() } else { - anAngleDim->SetDisplaySpecialSymbol (AIS_DSS_No); + anAngleDim->SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_No); } } @@ -140,7 +140,7 @@ void CLengthParamsEdgesPage::OnBnClickedEdge2Btn() } else { - Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (myFirstEdge, mySecondEdge, aPlane->Pln()); + Handle(PrsDim_LengthDimension) aLenDim = new PrsDim_LengthDimension (myFirstEdge, mySecondEdge, aPlane->Pln()); aLenDim->SetDimensionAspect (anAspect); aLenDim->SetFlyout (aDimDlg->GetFlyout()); if (aDimDlg->IsUnitsDisplayed()) diff --git a/samples/mfc/standard/Common/LengthParamsVerticesPage.cpp b/samples/mfc/standard/Common/LengthParamsVerticesPage.cpp index ca61a5d129..6b00519e24 100644 --- a/samples/mfc/standard/Common/LengthParamsVerticesPage.cpp +++ b/samples/mfc/standard/Common/LengthParamsVerticesPage.cpp @@ -6,7 +6,7 @@ #include "DimensionDlg.h" #include #include -#include +#include #include @@ -103,7 +103,7 @@ void CLengthParamsVerticesPage::OnBnClickedVertex2Btn() CDimensionDlg *aDimDlg = (CDimensionDlg*)(this->GetParentOwner()); - Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (aP1, aP2, aPlane->Pln()); + Handle(PrsDim_LengthDimension) aLenDim = new PrsDim_LengthDimension (aP1, aP2, aPlane->Pln()); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); anAspect->MakeArrows3d (Standard_False); diff --git a/samples/mfc/standard/Common/ParamsFacesPage.cpp b/samples/mfc/standard/Common/ParamsFacesPage.cpp index 05c99d703c..99d17479e4 100644 --- a/samples/mfc/standard/Common/ParamsFacesPage.cpp +++ b/samples/mfc/standard/Common/ParamsFacesPage.cpp @@ -5,8 +5,8 @@ #include "ParamsFacesPage.h" #include "DimensionDlg.h" #include -#include -#include +#include +#include // CParamsFacesPage dialog @@ -87,7 +87,7 @@ void CParamsFacesPage::OnBnClickedFacesbtn2() if (myIsAngleDimension) { // Build an angle dimension between two non-parallel edges - Handle(AIS_AngleDimension) anAngleDim = new AIS_AngleDimension (myFirstFace, mySecondFace); + Handle(PrsDim_AngleDimension) anAngleDim = new PrsDim_AngleDimension (myFirstFace, mySecondFace); anAngleDim->SetDimensionAspect (anAspect); if (aDimDlg->IsUnitsDisplayed()) @@ -99,7 +99,7 @@ void CParamsFacesPage::OnBnClickedFacesbtn2() } else { - anAngleDim->SetDisplaySpecialSymbol (AIS_DSS_No); + anAngleDim->SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_No); } } @@ -108,7 +108,7 @@ void CParamsFacesPage::OnBnClickedFacesbtn2() } else { - Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (myFirstFace, mySecondFace); + Handle(PrsDim_LengthDimension) aLenDim = new PrsDim_LengthDimension (myFirstFace, mySecondFace); aLenDim->SetDimensionAspect (anAspect); if (aLenDim->DimensionAspect()->IsUnitsDisplayed()) diff --git a/samples/mfc/standard/Common/RadiusParamsPage.cpp b/samples/mfc/standard/Common/RadiusParamsPage.cpp index deadf5d5b6..f2275d1a04 100644 --- a/samples/mfc/standard/Common/RadiusParamsPage.cpp +++ b/samples/mfc/standard/Common/RadiusParamsPage.cpp @@ -4,8 +4,8 @@ #include "DimensionDlg.h" #include -#include -#include +#include +#include #include #include @@ -96,16 +96,16 @@ void CRadiusParamsPage::OnBnClickedObjectBtn() myAISContext->ClearSelected (Standard_False); CDimensionDlg *aDimDlg = (CDimensionDlg*)(this->GetParentOwner()); // Try to create dimension if it is possible - Handle(AIS_Dimension) aDim; + Handle(PrsDim_Dimension) aDim; if (myIsDiameterDimension) { - aDim = new AIS_DiameterDimension (aCircle); - Handle(AIS_DiameterDimension)::DownCast(aDim)->SetFlyout (aDimDlg->GetFlyout()); + aDim = new PrsDim_DiameterDimension (aCircle); + Handle(PrsDim_DiameterDimension)::DownCast(aDim)->SetFlyout (aDimDlg->GetFlyout()); } else { - aDim = new AIS_RadiusDimension (aCircle); - Handle(AIS_RadiusDimension)::DownCast(aDim)->SetFlyout (aDimDlg->GetFlyout()); + aDim = new PrsDim_RadiusDimension (aCircle); + Handle(PrsDim_RadiusDimension)::DownCast(aDim)->SetFlyout (aDimDlg->GetFlyout()); } Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); diff --git a/src/AIS/AIS.cxx b/src/AIS/AIS.cxx deleted file mode 100644 index d9129b05e4..0000000000 --- a/src/AIS/AIS.cxx +++ /dev/null @@ -1,1535 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const Standard_Real SquareTolerance = Precision::SquareConfusion(); - -//======================================================================= -//function : Nearest -//purpose : -//======================================================================= -gp_Pnt AIS::Nearest(const TopoDS_Shape& ashape, const gp_Pnt& apoint) -{ - Standard_Real dist2 = RealLast(); - Standard_Real curdist2; - gp_Pnt result(0.0,0.0,0.0); - gp_Pnt curpnt(0.0,0.0,0.0); - TopExp_Explorer explo(ashape,TopAbs_VERTEX); - while (explo.More()) - { - curpnt = BRep_Tool::Pnt(TopoDS::Vertex(explo.Current())); - curdist2 = apoint.SquareDistance(curpnt); - if (curdist2 < dist2) - { - result = curpnt; - dist2 = curdist2; - } - explo.Next(); - } - return result; -} - -//======================================================================= -//function : Nearest -//purpose : For finds the nearest point on . -//======================================================================= -gp_Pnt AIS::Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint) -{ - Handle(Geom_Line) aLine = new Geom_Line (theLine); - - GeomAPI_ProjectPointOnCurve aPointProj (thePoint, aLine); - return aPointProj.Point (1); -} - -//======================================================================= -//function : Nearest -//purpose : For the given point finds nearest point on the curve, -// return TRUE if found point is belongs to curve -// and FALSE otherwise. -//======================================================================= -Standard_Boolean AIS::Nearest (const Handle(Geom_Curve)& theCurve, - const gp_Pnt& thePoint, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theLastPoint, - gp_Pnt& theNearestPoint) -{ - GeomAPI_ProjectPointOnCurve aPointProj (thePoint, theCurve); - theNearestPoint = theCurve->Value (aPointProj.LowerDistanceParameter()); - - Standard_Real aLength = theFirstPoint.Distance (theLastPoint); - - if (theNearestPoint.Distance (theFirstPoint) > aLength - || theNearestPoint.Distance (theLastPoint) >aLength) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : Farest -//purpose : -//======================================================================= -gp_Pnt AIS::Farest( const TopoDS_Shape& aShape, const gp_Pnt& aPoint ) -{ - Standard_Real MaxDist2 = 0.0e0, curdist2; - gp_Pnt Result(0.0,0.0,0.0); - gp_Pnt curpnt(0.0,0.0,0.0); - TopExp_Explorer Explo( aShape, TopAbs_VERTEX ); - for (; Explo.More(); Explo.Next()) - { - curpnt = BRep_Tool::Pnt( TopoDS::Vertex( Explo.Current() ) ); - curdist2 = aPoint.SquareDistance( curpnt ); - if (curdist2 > MaxDist2) - { - MaxDist2 = curdist2; - Result = curpnt; - } - } - return Result; -} - - -//======================================================================= -//function : ComputeGeometry -//purpose : for line, circle, ellipse. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt) -{ - TopLoc_Location anEdgeLoc; - Standard_Real aFirst, aLast; - theCurve = BRep_Tool::Curve (theEdge, anEdgeLoc, aFirst, aLast); - if (theCurve.IsNull()) - { - return Standard_False; - } - - if (!anEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeometry = theCurve->Transformed (anEdgeLoc.Transformation()); - theCurve = Handle(Geom_Curve)::DownCast (aGeometry); - } - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); - } - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); - theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); - theLastPnt = ElCLib::Value (aLast, aLine->Lin()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); - theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) - { - Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); - theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); - theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : for line, circle, ellipse. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt, - Standard_Boolean& theIsInfinite) -{ - Standard_Real aFirst, aLast; - - BRepAdaptor_Curve anAdaptor (theEdge); - - theCurve = Handle(Geom_Curve)::DownCast - (anAdaptor.Curve().Curve()->Transformed (anAdaptor.Trsf())); - - if (theCurve.IsNull()) - { - return Standard_False; - } - - aFirst = anAdaptor.FirstParameter(); - aLast = anAdaptor.LastParameter(); - - theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); - } - - if (!theIsInfinite) - { - theFirstPnt = theCurve->Value (aFirst); - theLastPnt = theCurve->Value (aLast); - } - else - { - theFirstPnt = gp::Origin(); - theLastPnt = gp::Origin(); - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= - -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt, - Handle(Geom_Curve)& theExtCurve, - Standard_Boolean& theIsInfinite, - Standard_Boolean& theIsOnPlane, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - Standard_Real aFirst, aLast; - BRepAdaptor_Curve aCurveAdaptor (theEdge); - theCurve = Handle(Geom_Curve)::DownCast (aCurveAdaptor.Curve().Curve()->Transformed (aCurveAdaptor.Trsf())); - aFirst = aCurveAdaptor.FirstParameter(); - aLast = aCurveAdaptor.LastParameter(); - - if (theCurve.IsNull()) - { - return Standard_False; - } - - theExtCurve = theCurve; - theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - - // Checks that the projected curve is not in the plane. - theIsOnPlane = Standard_True; - if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theExtCurve = Handle(Geom_TrimmedCurve)::DownCast (theExtCurve)->BasisCurve(); - } - - if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theExtCurve); - theIsOnPlane = thePlane->Pln().Contains (aLine->Lin(), - Precision::Confusion(), - Precision::Angular()); - } - else if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast (theExtCurve); - - gp_Ax3 aCircPos (aCircle->Position()); - theIsOnPlane = aCircPos.IsCoplanar (thePlane->Pln().Position(), - Precision::Confusion(), - Precision::Angular()); - } - - if (theIsOnPlane) - { - theExtCurve.Nullify(); - } - - theCurve = GeomProjLib::ProjectOnPlane (theCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); - if (!theIsInfinite) - { - theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); - theLastPnt = ElCLib::Value (aLast, aLine->Lin()); - } - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); - theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) - { - Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); - theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - TopLoc_Location aFirstEdgeLoc, aSecondEdgeLoc; - Standard_Real aFirst1, aLast1, aFirst2, aLast2; - - theFirstCurve = BRep_Tool::Curve (theFirstEdge, aFirstEdgeLoc, aFirst1, aLast1); - theSecondCurve = BRep_Tool::Curve (theSecondEdge, aSecondEdgeLoc, aFirst2, aLast2); - - if (theFirstCurve.IsNull()) - { - return Standard_False; - } - - if (theSecondCurve.IsNull()) - { - return Standard_False; - } - - if (!aFirstEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeomGeometry = theFirstCurve->Transformed (aFirstEdgeLoc.Transformation()); - theFirstCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); - } - - if (!aSecondEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeomGeometry = theSecondCurve->Transformed (aSecondEdgeLoc.Transformation()); - theSecondCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); - } - - theFirstCurve = GeomProjLib::ProjectOnPlane (theFirstCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - - theSecondCurve = GeomProjLib::ProjectOnPlane (theSecondCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - - if (theFirstCurve->IsInstance (STANDARD_TYPE(Geom_TrimmedCurve))) - { - theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); - } - - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); - } - - if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theFirstCurve); - - theFirstPnt1 = ElCLib::Value (aFirst1, aLine->Lin()); - theLastPnt1 = ElCLib::Value (aLast1, aLine->Lin()); - } - else if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theFirstCurve); - - theFirstPnt1 = ElCLib::Value (aFirst1, aCirc->Circ()); - theLastPnt1 = ElCLib::Value (aLast1, aCirc->Circ()); - } - else - { - return Standard_False; - } - - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Line))) -{ - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theSecondCurve); - - theFirstPnt2 = ElCLib::Value (aFirst2, aLine->Lin()); - theLastPnt2 = ElCLib::Value (aLast2, aLine->Lin()); - } - else if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theSecondCurve); - - theFirstPnt2 = ElCLib::Value (aFirst2, aCirc->Circ()); - theLastPnt2 = ElCLib::Value (aLast2, aCirc->Circ()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : Computes the geometry of the 2 edges. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - Standard_Boolean& theIsInfinite1, - Standard_Boolean& theIsInfinite2) -{ - theIsInfinite1 = theIsInfinite2 = Standard_False; - - if (!AIS::ComputeGeometry (theFirstEdge, theFirstCurve,theFirstPnt1, theLastPnt1, theIsInfinite1)) - { - return Standard_False; - } - - if (!AIS::ComputeGeometry (theSecondEdge, theSecondCurve,theFirstPnt2, theLastPnt2, theIsInfinite2)) - { - return Standard_False; - } - - if (theIsInfinite1 || theIsInfinite2) - { - if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) - { - gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); - gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); - - if (theIsInfinite1) - { - theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); - theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); - } - else if (theIsInfinite2) - { - theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); - theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); - } - } - else - { - if (theIsInfinite1 && !theIsInfinite2) - { - GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt2, theFirstCurve); - theFirstPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); - - aProjector.Init (theLastPnt2, theFirstCurve); - theLastPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); - } - else if (!theIsInfinite1 && theIsInfinite2) - { - GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt1, theSecondCurve); - theFirstPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); - - aProjector.Init (theLastPnt1, theSecondCurve); - theLastPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); - } - else - { - return Standard_False; - } - } - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : Computes the geometry of the 2 edges in the current wp -// and the 'right' geometry of the edges if one doesn't -// belong to the current working plane. -// There may be only one curve that can't belong to the -// current working plane ( attachement constraint) -// if the 2 edges belong to the current WP, = 0 -// -// indexExt = 0 2 edges are in the current wp -// indexExt = 1 first edge is not in the current wp -// indexExt = 2 second edge is not in the current wp -// if none of the two edges is in the current wp , -// it returns Standard_False -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Standard_Integer& theExtIndex, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - Handle(Geom_Curve)& theExtCurve, - Standard_Boolean& theIsInfinite1, - Standard_Boolean& theIsInfinite2, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - theExtCurve.Nullify(); - theExtIndex = 0; - - Standard_Real aFirst1, aLast1, aFirst2, aLast2; - theIsInfinite1 = theIsInfinite2 = Standard_False; - - BRepAdaptor_Curve aFirstAdaptor (theFirstEdge); - BRepAdaptor_Curve aSecondAdaptor (theSecondEdge); - - theFirstCurve = Handle(Geom_Curve)::DownCast - (aFirstAdaptor.Curve().Curve()->Transformed (aFirstAdaptor.Trsf())); - theSecondCurve = Handle(Geom_Curve)::DownCast - (aSecondAdaptor.Curve().Curve()->Transformed (aSecondAdaptor.Trsf())); - - if (theFirstCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); - } - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); - } - - aFirst1 = aFirstAdaptor.FirstParameter(); - aLast1 = aFirstAdaptor.LastParameter(); - - aFirst2 = aSecondAdaptor.FirstParameter(); - aLast2 = aSecondAdaptor.LastParameter(); - - if (theFirstCurve.IsNull() || theSecondCurve.IsNull()) - { - return Standard_False; - } - - Handle(Geom_Curve) aFirstSaved = theFirstCurve; - Handle(Geom_Curve) aSecondSaved = theSecondCurve; - - // Checks that the projected curve is not in the plane - Standard_Boolean isFirstOnPlane,isSecondOnPlane; - - if ((!ComputeGeomCurve (theFirstCurve, aFirst1, aLast1, theFirstPnt1, theLastPnt1, thePlane, isFirstOnPlane)) - || (!ComputeGeomCurve( theSecondCurve, aFirst2, aLast2, theFirstPnt2, theLastPnt2, thePlane,isSecondOnPlane))) - { - return Standard_False; - } - - if (Precision::IsInfinite (aFirst1) || Precision::IsInfinite (aLast1)) - { - theIsInfinite1 = Standard_True; - theExtIndex = 1; - } - if (Precision::IsInfinite (aFirst2) || Precision::IsInfinite (aLast2)) - { - theIsInfinite2 = Standard_True; - theExtIndex = 2; - } - if (theIsInfinite1 && theIsInfinite2) - { - theExtIndex = 0; - } - - if (theIsInfinite1 || theIsInfinite2) - { - if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) - { - gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); - gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); - - if (theExtIndex == 1) - { - theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); - theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); - } - else if (theExtIndex == 2) - { - theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); - theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); - } - } - } - - if (isFirstOnPlane && isSecondOnPlane) - { - return Standard_True; - } - - if (!isFirstOnPlane && isSecondOnPlane) - {// curve 2 only in the plane - theExtIndex = 1; - theExtCurve = aFirstSaved; - } - else if (isFirstOnPlane && !isSecondOnPlane) - {// curve 1 only in the plane - theExtIndex = 2; - theExtCurve = aSecondSaved; - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeomCurve -//purpose : Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane -// and returns aCurveproj; -// Return TRUE if ok -//======================================================================= -Standard_Boolean AIS::ComputeGeomCurve (Handle(Geom_Curve)& aCurve, - const Standard_Real first1, - const Standard_Real last1, - gp_Pnt& FirstPnt1, - gp_Pnt& LastPnt1, - const Handle(Geom_Plane)& aPlane, - Standard_Boolean& isOnPlane) -{ - isOnPlane = Standard_True; - const Standard_Integer NodeNumber = 20; - Standard_Real Delta = (last1 - first1) / (NodeNumber - 1); - if (Delta <= Precision::PConfusion()) - { - Delta = last1 - first1; - } - - gp_Pnt CurPnt(0.0, 0.0, 0.0); - Standard_Real CurPar = first1; - for (Standard_Integer i = 1; i <= NodeNumber; i++) - { - CurPnt = aCurve->Value( CurPar ); - if (aPlane->Pln().SquareDistance( CurPnt ) > SquareTolerance) - { - isOnPlane = Standard_False; - break; - } - CurPar += Delta; - } - - if (!Precision::IsInfinite(first1) && !Precision::IsInfinite(last1)) - { - FirstPnt1 = aCurve->Value (first1); - LastPnt1 = aCurve->Value (last1); - } - - if (!isOnPlane) - { - Handle(Geom_Curve) aGeomCurve = GeomProjLib::ProjectOnPlane (aCurve, - aPlane, - aPlane->Pln().Axis().Direction(), - Standard_False); - aCurve = aGeomCurve; - if (aCurve->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) - { - aCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve)->BasisCurve(); - } - if (! Precision::IsInfinite(first1) && ! Precision::IsInfinite(last1)) - { - FirstPnt1 = AIS::ProjectPointOnPlane( FirstPnt1, aPlane->Pln() ); - LastPnt1 = AIS::ProjectPointOnPlane( LastPnt1, aPlane->Pln() ); - } - } - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : computes the point corresponding to the vertex -// in the plane . If the vertex is already in the plane -// , = true. -// is the projected vertex in the plane. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry(const TopoDS_Vertex& aVertex, - gp_Pnt& point, - const Handle(Geom_Plane)& aPlane, - Standard_Boolean& isOnPlane) -{ - point = BRep_Tool::Pnt(aVertex); - isOnPlane = aPlane->Pln().Contains(point, Precision::Confusion()); - if ( !isOnPlane) { - point = AIS::ProjectPointOnPlane( point, aPlane->Pln() ); - } - return Standard_True; -} - -//======================================================================= -//function : GetPlaneFromFace -//purpose : -// Returns type of surface which can be Plane or OtherSurface -//======================================================================= -Standard_Boolean AIS::GetPlaneFromFace(const TopoDS_Face& aFace, - gp_Pln & aPlane, - Handle( Geom_Surface )& aSurf, - AIS_KindOfSurface & aSurfType, - Standard_Real & Offset) - -{ - Standard_Boolean Result = Standard_False; - BRepAdaptor_Surface surf1( aFace ); - Handle( Adaptor3d_HSurface ) surf2; - Standard_Boolean isOffset = Standard_False; - Offset = 0.0; - - if (surf1.GetType() == GeomAbs_OffsetSurface) - { - // Extracting Basis Surface - surf2 = surf1.BasisSurface(); - isOffset = Standard_True; - } - else - surf2 = new BRepAdaptor_HSurface( surf1 ); - - aSurf = surf1.Surface().Surface(); - // aSurf->Transform(surf1.Trsf()) ; - aSurf = Handle( Geom_Surface )::DownCast( aSurf->Transformed( surf1.Trsf() ) ); - - if (surf2->GetType() == GeomAbs_Plane) - { - aPlane = surf2->Plane(); - aSurfType = AIS_KOS_Plane; - Result = Standard_True; - } - - else if (surf2->GetType() == GeomAbs_SurfaceOfExtrusion) - { - Handle( Adaptor3d_HCurve ) BasisCurve = surf2->BasisCurve(); - gp_Dir ExtrusionDir = surf2->Direction(); - if (BasisCurve->GetType() == GeomAbs_Line) - { - gp_Lin BasisLine = BasisCurve->Line(); - gp_Dir LineDir = BasisLine.Direction(); - gp_Pnt LinePos = BasisLine.Location(); - gp_Pln thePlane( LinePos, LineDir ^ ExtrusionDir); - aPlane = thePlane; - aSurfType = AIS_KOS_Plane; - Result = Standard_True; - } - } - - if (Result == Standard_True && isOffset) - { - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); - aPlane = (Handle( Geom_Plane )::DownCast( aSurf ))->Pln(); - } - if (Result == Standard_False) - { - if (isOffset) - { - Handle( Standard_Type ) TheType = aSurf->DynamicType(); - if (TheType == STANDARD_TYPE(Geom_CylindricalSurface) || - TheType == STANDARD_TYPE(Geom_ConicalSurface) || - TheType == STANDARD_TYPE(Geom_SphericalSurface) || - TheType == STANDARD_TYPE(Geom_ToroidalSurface)) - { - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); - } - else - { - Offset = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Offset(); - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->BasisSurface(); - } - } - Handle( Standard_Type ) TheType = aSurf->DynamicType(); - if (TheType == STANDARD_TYPE(Geom_CylindricalSurface)) - aSurfType = AIS_KOS_Cylinder; - else if (TheType == STANDARD_TYPE(Geom_ConicalSurface)) - aSurfType = AIS_KOS_Cone; - else if (TheType == STANDARD_TYPE(Geom_SphericalSurface)) - aSurfType = AIS_KOS_Sphere; - else if (TheType == STANDARD_TYPE(Geom_ToroidalSurface)) - aSurfType = AIS_KOS_Torus; - else if (TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution)) - aSurfType = AIS_KOS_Revolution; - else if (TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) - aSurfType = AIS_KOS_Extrusion; - else - aSurfType = AIS_KOS_OtherSurface; - } - return Result; -} - - -//======================================================================= -//function : ProjectPointOnPlane -//purpose : -//======================================================================= - -gp_Pnt AIS::ProjectPointOnPlane( const gp_Pnt & aPoint, const gp_Pln & aPlane ) -{ - gp_Vec aVec( aPlane.Location(), aPoint ); - gp_Vec Normal = aPlane.Axis().Direction(); - Normal = (aVec * Normal) * Normal; - - return ( aPoint.Translated( -Normal ) ); -} - -//======================================================================= -//function : ProjectPointOnLine -//purpose : -//======================================================================= - -gp_Pnt AIS::ProjectPointOnLine( const gp_Pnt & aPoint, const gp_Lin & aLine ) -{ - gp_XYZ LinLoc = aLine.Location().XYZ(); - gp_XYZ LinDir = aLine.Direction().XYZ(); - Standard_Real Parameter = (aPoint.XYZ() - LinLoc) * LinDir; - gp_Pnt Result( LinLoc + Parameter * LinDir ); - return Result; -} - -//======================================================================= -//function : InitFaceLength -//purpose : -//======================================================================= -void AIS::InitFaceLength (const TopoDS_Face& theFace, - gp_Pln& thePlane, - Handle(Geom_Surface)& theSurface, - AIS_KindOfSurface& theSurfaceType, - Standard_Real& theOffset) -{ - if (AIS::GetPlaneFromFace (theFace, thePlane, theSurface, theSurfaceType, theOffset) - && Abs (theOffset) > Precision::Confusion()) - { - theSurface = new Geom_OffsetSurface (theSurface, theOffset); - theOffset = 0.0e0; - } -} - -//======================================================================= -//function : InitAngleBetweenPlanarFaces -//purpose : -//======================================================================= -Standard_Boolean AIS::InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - gp_Pnt & theCenter, - gp_Pnt & theFirstAttach, - gp_Pnt & theSecondAttach, - const Standard_Boolean theIsFirstPointSet) -{ - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theFirstFace)); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theSecondFace)); - - GeomAPI_IntSS aPlaneIntersector (aFirstPlane, aSecondPlane, Precision::Confusion()); - - // Fails if two planes haven't only one intersection line. - if (!aPlaneIntersector.IsDone()) - { - return Standard_False; - } - - if (aPlaneIntersector.NbLines() != 1) - { - return Standard_False; - } - - // Get intersect line. - Handle(Geom_Curve) anIntersectCurve = aPlaneIntersector.Line (1); - - Handle(Geom_Line) anIntersectLine = Handle(Geom_Line)::DownCast (anIntersectCurve); - - if (anIntersectLine.IsNull()) - { - return Standard_False; - } - - gp_Lin anIntersectLin = anIntersectLine->Lin(); - - gp_Pnt aFirstCenter, aSecondCenter; - Standard_Real anU1Min, anU1Max, aV1Min, aV1Max; - Standard_Real anU2Min, anU2Max, aV2Min, aV2Max; - - BRepTools::UVBounds (theFirstFace, anU1Min, anU1Max, aV1Min, aV1Max); - BRepTools::UVBounds (theSecondFace, anU2Min, anU2Max, aV2Min, aV2Max); - - // Get first and second attach. - if (theIsFirstPointSet) - { - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstPlane); - if (!aProjector.IsDone()) - { - return Standard_False; - } - - aFirstCenter = aProjector.Point (1); - } - else - { - aFirstCenter = aFirstPlane->Value ((anU1Min + anU1Max) * 0.5, (aV1Min + aV1Max) * 0.5); - } - - aSecondCenter = aSecondPlane->Value ((anU2Min + anU2Max) * 0.5, (aV2Min + aV2Max) * 0.5); - - GeomAPI_ProjectPointOnCurve aProj (aFirstCenter, anIntersectCurve); - theCenter = aProj.NearestPoint(); - - gp_Vec aFirstNormal = anIntersectLin.Direction() ^ aFirstPlane->Pln().Axis().Direction(); - if (aFirstNormal * gp_Vec (theCenter, aFirstCenter) < 0.0) - { - aFirstNormal.Reverse(); - } - theFirstAttach = theCenter.Translated (aFirstNormal); - - gp_Vec aSecondNormal = anIntersectLin.Direction() ^ aSecondPlane->Pln().Axis().Direction(); - if (aSecondNormal * gp_Vec (theCenter, aSecondCenter) < 0.0) - { - aSecondNormal.Reverse(); - } - theSecondAttach = theCenter.Translated (aSecondNormal); - - return Standard_True; -} - -//======================================================================= -//function : InitAngleBetweenCurvilinearFaces -//purpose : -//======================================================================= -Standard_Boolean AIS::InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const AIS_KindOfSurface theFirstSurfType, - const AIS_KindOfSurface theSecondSurfType, - gp_Pnt& theCenter, - gp_Pnt& theFirstAttach, - gp_Pnt& theSecondAttach, - const Standard_Boolean theIsFirstPointSet) -{ - Handle(Geom_Surface) aFirstSurf = BRep_Tool::Surface (theFirstFace); - Handle(Geom_Surface) aSecondSurf = BRep_Tool::Surface (theSecondFace); - - // Find intersection curve between two surfaces. - GeomAPI_IntSS aSurfaceIntersector (aFirstSurf, aSecondSurf, Precision::Confusion()); - - // Fails if two planes haven't only one intersection line. - if (!aSurfaceIntersector.IsDone()) - { - return Standard_False; - } - - if (aSurfaceIntersector.NbLines() != 1) - { - return Standard_False; - } - - // Get intersect line. - Handle(Geom_Curve) anIntersectCurve = aSurfaceIntersector.Line (1); - - Handle(Geom_Line) aFirstLine, aSecondLine; - Standard_Real aFirstU = 0.0; - Standard_Real aFirstV = 0.0; - - if (theIsFirstPointSet) - { - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstSurf); - if (!aProjector.IsDone()) - { - return Standard_False; - } - - theFirstAttach = aProjector.Point (1); - } - else - { - theFirstAttach = aFirstSurf->Value (aFirstU, aFirstV); - } - - aFirstLine = Handle(Geom_Line)::DownCast (aFirstSurf->UIso (aFirstU)); - - if (theSecondSurfType == AIS_KOS_Cylinder) - { - Handle(Geom_CylindricalSurface) aCylinder = Handle(Geom_CylindricalSurface)::DownCast (aSecondSurf); - - Standard_Real aSecondU = aCylinder->Cylinder().XAxis().Direction().Angle( - gce_MakeDir (ProjectPointOnLine (theFirstAttach, - gp_Lin (aCylinder->Cylinder().Axis())), - theFirstAttach)); - - aSecondLine = Handle(Geom_Line)::DownCast (aCylinder->UIso (aSecondU)); - } - else if (theSecondSurfType == AIS_KOS_Cone) - { - Handle(Geom_ConicalSurface) aCone = Handle(Geom_ConicalSurface)::DownCast (aSecondSurf); - - gp_Dir anXdirection = aCone->Cone().XAxis().Direction(); - - gp_Dir aToFirstAttach = gce_MakeDir (ProjectPointOnLine (theFirstAttach, - gp_Lin (aCone->Cone().Axis())), - theFirstAttach); - - Standard_Real aSecondU = anXdirection.Angle (aToFirstAttach); - - // Check sign - if (!anXdirection.IsEqual (aToFirstAttach, Precision::Angular()) && - !anXdirection.IsOpposite (aToFirstAttach, Precision::Angular()) && - (anXdirection ^ aToFirstAttach) * aCone->Cone().Axis().Direction() < 0.0) - { - aSecondU = 2*M_PI - aSecondU; - } - aSecondLine = Handle( Geom_Line )::DownCast (aCone->UIso(aSecondU)); - } - else - { - return Standard_False; - } - - // If angle can be computed between two lines. - if (!(aFirstLine->Lin().Direction().IsEqual (aSecondLine->Lin().Direction(), Precision::Angular() )) && - !(aFirstLine->Lin().Direction().IsOpposite (aSecondLine->Lin().Direction(), Precision::Angular()))) - { - GeomAPI_ExtremaCurveCurve anIntersector (aFirstLine, aSecondLine); - anIntersector.Points (1, theCenter, theCenter); - - // Move theFirstAttach on aFirstLine if it is on theCenter. - if (theCenter.SquareDistance(theFirstAttach ) <= SquareTolerance) - { - gp_Vec aDir (aFirstLine->Lin().Direction()); - theFirstAttach = theCenter.Translated (aDir); - - // theFirstAttach should be on theFirstSurf. - Standard_Real anU, aV; - if (theFirstSurfType == AIS_KOS_Cylinder) - { - ElSLib::Parameters ((Handle(Geom_CylindricalSurface)::DownCast (aFirstSurf))->Cylinder(), - theFirstAttach, anU, aV); - - theFirstAttach = ElSLib::Value (aFirstU, aV, - (Handle( Geom_CylindricalSurface )::DownCast (aFirstSurf))->Cylinder() ); - } - else if (theFirstSurfType == AIS_KOS_Cone) - { - ElSLib::Parameters ((Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone(), - theFirstAttach, anU, aV); - theFirstAttach = ElSLib::Value (aFirstU, aV, - (Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone()); - } - else - { - return Standard_False; - } - } - - // Find theSecondAttach - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aSecondSurf); - if (!aProjector.IsDone()) - { - return Standard_False; - } - Standard_Real anU, aV; - aProjector.LowerDistanceParameters (anU, aV); - theSecondAttach = aSecondSurf->Value (anU, aV); - } - else // aFirstLine and aSecondLine are coincident - { - gp_Vec aDir (aFirstLine->Lin().Direction()); - theFirstAttach = theCenter.Translated (aDir); - theSecondAttach = theCenter.Translated (-aDir); - } - return Standard_True; -} - -//======================================================================= -//function : ComputeLengthBetweenCurvilinearFaces -//purpose : -//======================================================================= -void AIS::InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - Handle(Geom_Surface)& theFirstSurf, - Handle(Geom_Surface)& theSecondSurf, - gp_Pnt& theFirstAttach, - gp_Pnt& theSecondAttach, - gp_Dir& theDirOnPlane) -{ - GeomAPI_ProjectPointOnSurf aProjector; - Standard_Real aPU, aPV; - - TopExp_Explorer anExplorer (theFirstFace, TopAbs_VERTEX); - - theFirstAttach = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); - aProjector.Init (theFirstAttach, theFirstSurf); - - theFirstAttach = aProjector.NearestPoint(); - aProjector.LowerDistanceParameters (aPU, aPV); - - gp_Vec aD1U, aD1V; - theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); - - if (aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance) - { - theFirstAttach = AIS::Farest (theFirstFace, theFirstAttach); - aProjector.Init (theFirstAttach, theFirstSurf); - aProjector.LowerDistanceParameters (aPU, aPV); - theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); - } - - aD1U.Normalize(); - aD1V.Normalize(); - - theDirOnPlane = gp_Dir (aD1U); - - gp_Dir aFirstSurfN = gp_Dir (aD1U ^ aD1V); - - aProjector.Init (theFirstAttach, theSecondSurf); - - Standard_Integer aBestPointIndex = 0; - Standard_Real aMinDist = RealLast(); - gp_Dir aLocalDir; - - for (Standard_Integer aPointIt = 1; aPointIt <= aProjector.NbPoints(); aPointIt++) - { - aProjector.Parameters (aPointIt, aPU, aPV); - - theSecondSurf->D1 (aPU, aPV, theSecondAttach, aD1U, aD1V); - - aLocalDir = aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance - ? gp_Dir (gp_Vec (theFirstAttach, aProjector.Point (aPointIt))) - : gp_Dir (aD1U ^ aD1V); - - if (aFirstSurfN.IsParallel (aLocalDir, Precision::Angular()) && aProjector.Distance (aPointIt) < aMinDist) - { - aBestPointIndex = aPointIt; - aMinDist = aProjector.Distance (aPointIt); - } - } - - if (aBestPointIndex == 0) - { - theSecondAttach = theFirstAttach; - } - else - { - theSecondAttach = aProjector.Point (aBestPointIndex); - aProjector.Parameters (aBestPointIndex, aPU, aPV); - - // Now there is projection of FirstAttach onto SecondSurf in aProjector - BRepTopAdaptor_FClass2d aClassifier (theSecondFace, Precision::Confusion()); - - TopAbs_State aState = - aClassifier.Perform (gp_Pnt2d (aPU, aPV), theSecondSurf->IsUPeriodic() || theSecondSurf->IsVPeriodic()); - - if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) - { - theSecondAttach = AIS::Nearest (theSecondFace, theSecondAttach); - } - } -} - -gp_Pnt AIS::TranslatePointToBound( const gp_Pnt & aPoint, const gp_Dir & aDir, const Bnd_Box & aBndBox ) -{ - if (aBndBox.IsOut( aPoint )) - return aPoint; - else - { - gp_Pnt Result(0.0,0.0,0.0); - TColStd_Array2OfReal Bound( 1, 3, 1, 2 ); - TColStd_Array1OfReal Origin( 1, 3 ); - TColStd_Array1OfReal Dir( 1, 3 ); - Standard_Real t; - - aBndBox.Get( Bound(1,1), Bound(2,1), Bound(3,1), Bound(1,2), Bound(2,2), Bound(3,2) ); - aPoint.Coord( Origin(1), Origin(2), Origin(3) ); - aDir.Coord( Dir(1), Dir(2), Dir(3) ); - - Bnd_Box EnlargedBox = aBndBox; - EnlargedBox.Enlarge( aBndBox.GetGap() + Precision::Confusion() ); - - Standard_Boolean IsFound = Standard_False; - for (Standard_Integer i = 1; i <= 3; i++) - { - if (Abs( Dir( i ) ) <= gp::Resolution()) - continue; - for (Standard_Integer j = 1; j <= 2; j++) - { - t = (Bound( i, j ) - Origin( i )) / Dir( i ); - if (t < 0.0e0) - continue; - Result = aPoint.Translated( gp_Vec( aDir ) * t ); - if (! EnlargedBox.IsOut( Result )) - { - IsFound = Standard_True; - break; - } - } - if (IsFound) break; - } - return Result; - } -} - - -//======================================================================= -//function : InDomain -//purpose : -//======================================================================= - -Standard_Boolean AIS::InDomain(const Standard_Real fpar, - const Standard_Real lpar, - const Standard_Real para) -{ - if (fpar >= 0.) { - if(lpar > fpar) - return ((para >= fpar) && (para <= lpar)); - else { // fpar > lpar - Standard_Real delta = 2*M_PI-fpar; - Standard_Real lp, par, fp; - lp = lpar + delta; - par = para + delta; - while(lp > 2*M_PI) lp-=2*M_PI; - while(par > 2*M_PI) par-=2*M_PI; - fp = 0.; - return ((par >= fp) && (par <= lp)); - } - - } - if (para >= (fpar+2*M_PI)) return Standard_True; - if (para <= lpar) return Standard_True; - return Standard_False; -} - -//======================================================================= -//function : DistanceFromApex -//purpose : calculates parametric length arc of ellipse -//======================================================================= - -Standard_Real AIS::DistanceFromApex(const gp_Elips & elips, - const gp_Pnt & Apex, - const Standard_Real par) -{ - Standard_Real dist; - Standard_Real parApex = ElCLib::Parameter ( elips, Apex ); - if(parApex == 0.0 || parApex == M_PI) - {//Major case - if(parApex == 0.0) //pos Apex - dist = (par < M_PI) ? par : (2*M_PI - par); - else //neg Apex - dist = (par < M_PI) ? ( M_PI - par) : ( par - M_PI ); - } - else - {// Minor case - if(parApex == M_PI / 2) //pos Apex - { - if(par <= parApex + M_PI && par > parApex) // 3/2*M_PI < par < M_PI/2 - dist = par - parApex; - else - { - if(par > parApex + M_PI) // 3/2*M_PI < par < 2*M_PI - dist = 2*M_PI - par + parApex; - else - dist = parApex - par; - } - } - else //neg Apex == 3/2*M_PI - { - if(par <= parApex && par >= M_PI/2) // M_PI/2 < par < 3/2*M_PI - dist = parApex - par; - else - { - if(par > parApex) // 3/2*M_PI < par < 2*M_PI - dist = par - parApex; - else - dist = par + M_PI/2; // 0 < par < M_PI/2 - } - } - } - return dist; -} - -//======================================================================= -//function : NearestApex -//purpose : -//======================================================================= - -gp_Pnt AIS::NearestApex(const gp_Elips & elips, - const gp_Pnt & pApex, - const gp_Pnt & nApex, - const Standard_Real fpara, - const Standard_Real lpara, - Standard_Boolean & IsInDomain) -{ - Standard_Real parP, parN; - gp_Pnt EndOfArrow(0.0,0.0,0.0); - IsInDomain = Standard_True; - parP = ElCLib::Parameter ( elips, pApex ); - if(InDomain(fpara, lpara, parP)) EndOfArrow = pApex; - else - { - parN = ElCLib::Parameter ( elips, nApex ); - if(InDomain(fpara, lpara, parN)) EndOfArrow = nApex; - else { - IsInDomain = Standard_False; - Standard_Real posd = Min(DistanceFromApex (elips,pApex, fpara), - DistanceFromApex (elips,pApex, lpara)); - Standard_Real negd = Min(DistanceFromApex (elips,nApex, fpara), - DistanceFromApex (elips,nApex, lpara)); - if( posd < negd ) - EndOfArrow = pApex; - else - EndOfArrow = nApex; - } - } - return EndOfArrow; -} - -//======================================================================= -//function : ComputeProjEdgePresentation -//purpose : -//======================================================================= - -void AIS::ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPresentation, - const Handle(Prs3d_Drawer)& aDrawer, - const TopoDS_Edge& anEdge, - const Handle(Geom_Curve)& ProjCurve, - const gp_Pnt& FirstP, - const gp_Pnt& LastP, - const Quantity_NameOfColor aColor, - const Standard_Real aWidth, - const Aspect_TypeOfLine aProjTOL, - const Aspect_TypeOfLine aCallTOL) -{ - if (!aDrawer->HasOwnWireAspect()){ - aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} - else { - // CLE - // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); - Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); - // ENDCLE - li->SetColor(aColor); - li->SetTypeOfLine(aProjTOL); - li->SetWidth(aWidth); - } - - Standard_Real pf, pl; - TopLoc_Location loc; - Handle(Geom_Curve) curve; - Standard_Boolean isInfinite; - curve = BRep_Tool::Curve(anEdge,loc,pf,pl); - isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); - - TopoDS_Edge E; - - // Calculate presentation of the edge - if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - // CLE - // Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurve)); - Handle(Geom_Line) gl = Handle(Geom_Line)::DownCast (ProjCurve); - // ENDCLE - if ( !isInfinite) { - pf = ElCLib::Parameter(gl->Lin(),FirstP); - pl = ElCLib::Parameter(gl->Lin(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); - E = MakEd.Edge(); - } - else { - BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); - E = MakEd.Edge(); - } - } - else if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - // CLE - // Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurve)); - Handle(Geom_Circle) gc = Handle(Geom_Circle)::DownCast (ProjCurve); - // ENDCLE - pf = ElCLib::Parameter(gc->Circ(),FirstP); - pl = ElCLib::Parameter(gc->Circ(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); - E = MakEd.Edge(); - } - StdPrs_WFShape::Add (aPresentation, E, aDrawer); - - //Calculate the presentation of line connections - aDrawer->WireAspect()->SetTypeOfLine(aCallTOL); - if (!isInfinite) { - gp_Pnt ppf(0.0,0.0,0.0), ppl(0.0,0.0,0.0); - ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); - ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); - - // it is patch! - if (FirstP.SquareDistance (ppf) > SquareTolerance) - { - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert1 (FirstP); - StdPrs_WFShape::Add (aPresentation, MakVert1.Vertex(), aDrawer); - } - if (LastP.SquareDistance (ppl) > SquareTolerance) - { - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert2 (LastP); - StdPrs_WFShape::Add (aPresentation, MakVert2.Vertex(), aDrawer); - } -/* - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); -*/ - } -} - -//======================================================================= -//function : ComputeProjVertexPresentation -//purpose : -//======================================================================= - -void AIS::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const TopoDS_Vertex& aVertex, - const gp_Pnt& ProjPoint, - const Quantity_NameOfColor aColor, - const Standard_Real aWidth, - const Aspect_TypeOfMarker aProjTOM, - const Aspect_TypeOfLine aCallTOL) -{ - if (!aDrawer->HasOwnPointAspect()){ - aDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} - else { - // CLE - // const Handle(Prs3d_PointAspect)& pa = aDrawer->PointAspect(); - Handle(Prs3d_PointAspect) pa = aDrawer->PointAspect(); - // ENDCLE - pa->SetColor(aColor); - pa->SetTypeOfMarker(aProjTOM); - } - - // calculate the projection - StdPrs_Point::Add(aPresentation, new Geom_CartesianPoint(ProjPoint), aDrawer); - - if (!aDrawer->HasOwnWireAspect()){ - aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} - else { - // CLE - // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); - Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); - // ENDCLE - li->SetColor(aColor); - li->SetTypeOfLine(aCallTOL); - li->SetWidth(aWidth); - } - - // If the points are not mixed... - if (!ProjPoint.IsEqual (BRep_Tool::Pnt (aVertex), Precision::Confusion())) - { - // calculate the lines of recall - BRepBuilderAPI_MakeEdge MakEd (ProjPoint, BRep_Tool::Pnt (aVertex)); - StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer); - } -} diff --git a/src/AIS/AIS.hxx b/src/AIS/AIS.hxx index 70cc8ce6a3..579f156194 100644 --- a/src/AIS/AIS.hxx +++ b/src/AIS/AIS.hxx @@ -17,26 +17,9 @@ #ifndef _AIS_HeaderFile #define _AIS_HeaderFile -#include -#include -#include -#include -#include -#include -#include #include #include #include -#include - -class Bnd_Box; -class Geom_Curve; -class Geom_Plane; -class Geom_Surface; -class TopoDS_Edge; -class TopoDS_Face; -class TopoDS_Shape; -class TopoDS_Vertex; //! Application Interactive Services provide the means to create links between an application GUI viewer and //! the packages which are used to manage selection and presentation. @@ -90,119 +73,6 @@ public: DEFINE_STANDARD_ALLOC - - - //! Returns the nearest point in a shape. This is used by - //! several classes in calculation of dimensions. - Standard_EXPORT static gp_Pnt Nearest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); - - - //! @return the nearest point on the line. - Standard_EXPORT static gp_Pnt Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint); - - - //! For the given point finds nearest point on the curve, - //! @return TRUE if found point is belongs to the curve - //! and FALSE otherwise. - Standard_EXPORT static Standard_Boolean Nearest (const Handle(Geom_Curve)& theCurve, const gp_Pnt& thePoint, const gp_Pnt& theFirstPoint, const gp_Pnt& theLastPoint, gp_Pnt& theNearestPoint); - - Standard_EXPORT static gp_Pnt Farest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt); - - //! Used by dimensions only. - //! Computes the 3d geometry of . - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Standard_Boolean& theIsInfinite); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any. - //! If is not in the current plane, contains - //! the not projected curve associated to . - //! If is infinite, = true and the 2 - //! parameters and have no signification. - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsInfinite, Standard_Boolean& theIsOnPlane, const Handle(Geom_Plane)& thePlane); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, const Handle(Geom_Plane)& thePlane); - - //! Used by dimensions only.Computes the 3d geometry - //! of and and checks if they are infinite. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2); - - //! Used by 2d Relation only Computes the 3d geometry - //! of and in the current Plane and the - //! extremities if any. Return in ExtCurve the 3d curve - //! (not projected in the plane) of the first edge if - //! =1 or of the 2nd edge if = 2. If - //! = 0, ExtCurve is Null. if there is an edge - //! external to the plane, is true if this - //! edge is infinite. So, the extremities of it are not - //! significant. Return TRUE if ok - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Standard_Integer& theExtIndex, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2, const Handle(Geom_Plane)& thePlane); - - //! Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane - //! and returns aCurve; - //! Return TRUE if ok - Standard_EXPORT static Standard_Boolean ComputeGeomCurve (Handle(Geom_Curve)& aCurve, const Standard_Real first1, const Standard_Real last1, gp_Pnt& FirstPnt1, gp_Pnt& LastPnt1, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); - - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Vertex& aVertex, gp_Pnt& point, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); - - //! Tryes to get Plane from Face. Returns Surface of Face - //! in aSurf. Returns Standard_True and Plane of Face in - //! aPlane in following cases: - //! Face is Plane, Offset of Plane, - //! Extrusion of Line and Offset of Extrusion of Line - //! Returns pure type of Surface which can be: - //! Plane, Cylinder, Cone, Sphere, Torus, - //! SurfaceOfRevolution, SurfaceOfExtrusion - Standard_EXPORT static Standard_Boolean GetPlaneFromFace (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurf, AIS_KindOfSurface& aSurfType, Standard_Real& Offset); - - Standard_EXPORT static void InitFaceLength (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurface, AIS_KindOfSurface& aSurfaceType, Standard_Real& anOffset); - - //! Finds attachment points on two curvilinear faces for length dimension. - //! @param thePlaneDir [in] the direction on the dimension plane to - //! compute the plane automatically. It will not be taken into account if - //! plane is defined by user. - Standard_EXPORT static void InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, Handle(Geom_Surface)& theFirstSurf, Handle(Geom_Surface)& theSecondSurf, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, gp_Dir& theDirOnPlane); - - //! Finds three points for the angle dimension between - //! two planes. - Standard_EXPORT static Standard_Boolean InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); - - //! Finds three points for the angle dimension between - //! two curvilinear surfaces. - Standard_EXPORT static Standard_Boolean InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, const AIS_KindOfSurface theFirstSurfType, const AIS_KindOfSurface theSecondSurfType, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); - - Standard_EXPORT static gp_Pnt ProjectPointOnPlane (const gp_Pnt& aPoint, const gp_Pln& aPlane); - - Standard_EXPORT static gp_Pnt ProjectPointOnLine (const gp_Pnt& aPoint, const gp_Lin& aLine); - - Standard_EXPORT static gp_Pnt TranslatePointToBound (const gp_Pnt& aPoint, const gp_Dir& aDir, const Bnd_Box& aBndBox); - - //! returns True if point with anAttachPar is - //! in domain of arc - Standard_EXPORT static Standard_Boolean InDomain (const Standard_Real aFirstPar, const Standard_Real aLastPar, const Standard_Real anAttachPar); - - //! computes nearest to ellipse arc apex - Standard_EXPORT static gp_Pnt NearestApex (const gp_Elips& elips, const gp_Pnt& pApex, const gp_Pnt& nApex, const Standard_Real fpara, const Standard_Real lpara, Standard_Boolean& IsInDomain); - - //! computes length of ellipse arc in parametric units - Standard_EXPORT static Standard_Real DistanceFromApex (const gp_Elips& elips, const gp_Pnt& Apex, const Standard_Real par); - - Standard_EXPORT static void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); - - Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); - }; #endif // _AIS_HeaderFile diff --git a/src/AIS/AIS_AngleDimension.cxx b/src/AIS/AIS_AngleDimension.cxx deleted file mode 100644 index f55900bba9..0000000000 --- a/src/AIS/AIS_AngleDimension.cxx +++ /dev/null @@ -1,1478 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Arnaud BOUZY/Odile Olivier -// Copyright (c) 1996-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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_AngleDimension,AIS_Dimension) - -namespace -{ - static const TCollection_ExtendedString THE_EMPTY_LABEL_STRING; - static const Standard_Real THE_EMPTY_LABEL_WIDTH = 0.0; - static const Standard_ExtCharacter THE_DEGREE_SYMBOL (0x00B0); - static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; - - //! Returns true if the given points lie on a same line. - static Standard_Boolean isSameLine (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) - { - gp_Vec aVec1 (theFirstPoint, theCenterPoint); - gp_Vec aVec2 (theCenterPoint, theSecondPoint); - - return aVec1.IsParallel (aVec2, Precision::Angular()); - } -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstEdge, theSecondEdge); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstPoint, theSecondPoint, theThirdPoint); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstVertex, theSecondVertex, theThirdVertex); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theCone) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theCone); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstFace, theSecondFace); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstFace, theSecondFace, thePoint); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge) -{ - gp_Pln aComputedPlane; - - myFirstShape = theFirstEdge; - mySecondShape = theSecondEdge; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Edges; - myIsGeometryValid = InitTwoEdgesAngle (aComputedPlane); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - myPlane = aComputedPlane; - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint) -{ - myFirstPoint = theFirstPoint; - myCenterPoint = theSecondPoint; - mySecondPoint = theThirdPoint; - myFirstShape = BRepLib_MakeVertex (myFirstPoint); - mySecondShape = BRepLib_MakeVertex (myCenterPoint); - myThirdShape = BRepLib_MakeVertex (mySecondPoint); - myGeometryType = GeometryType_Points; - myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - - Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); - if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex) -{ - myFirstShape = theFirstVertex; - mySecondShape = theSecondVertex; - myThirdShape = theThirdVertex; - myFirstPoint = BRep_Tool::Pnt (theFirstVertex); - myCenterPoint = BRep_Tool::Pnt (theSecondVertex); - mySecondPoint = BRep_Tool::Pnt (theThirdVertex); - myGeometryType = GeometryType_Points; - myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - - Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); - if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone) -{ - myFirstShape = theCone; - mySecondShape = TopoDS_Shape(); - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Face; - myIsGeometryValid = InitConeAngle(); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -{ - myFirstShape = theFirstFace; - mySecondShape = theSecondFace; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Faces; - myIsGeometryValid = InitTwoFacesAngle(); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint) -{ - myFirstShape = theFirstFace; - mySecondShape = theSecondFace; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Faces; - myIsGeometryValid = InitTwoFacesAngle (thePoint); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : Init -//purpose : -//======================================================================= -void AIS_AngleDimension::Init() -{ - SetType (AIS_TOA_Interior); - SetArrowsVisibility (AIS_TOAV_Both); - SetSpecialSymbol (THE_DEGREE_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_After); - SetFlyout (15.0); -} - -//======================================================================= -//function: GetCenterOnArc -//purpose : -//======================================================================= -gp_Pnt AIS_AngleDimension::GetCenterOnArc (const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter) const -{ - // construct plane where the circle and the arc are located - gce_MakePln aConstructPlane (theFirstAttach, theSecondAttach, theCenter); - if (!aConstructPlane.IsDone()) - { - return gp::Origin(); - } - - gp_Pln aPlane = aConstructPlane.Value(); - // to have an exterior angle presentation, a plane for further constructed circle should be reversed - if (myType == AIS_TOA_Exterior) - { - gp_Ax1 anAxis = aPlane.Axis(); - gp_Dir aDir = anAxis.Direction(); - aDir.Reverse(); - aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); - } - - Standard_Real aRadius = theFirstAttach.Distance (theCenter); - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); - if (!aConstructCircle.IsDone()) - { - return gp::Origin(); - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // compute angle parameters of arc end-points on circle - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - return ElCLib::Value ((aParamBeg + aParamEnd) * 0.5, aCircle); -} - -//======================================================================= -//function : GetNormalForMinAngle -//purpose : -//======================================================================= -gp_Dir AIS_AngleDimension::GetNormalForMinAngle() const -{ - const gp_Dir& aNormal = myPlane.Axis().Direction(); - gp_Dir aFirst (gp_Vec (myCenterPoint, myFirstPoint) ); - gp_Dir aSecond (gp_Vec (myCenterPoint, mySecondPoint) ); - - return aFirst.AngleWithRef (aSecond, aNormal) < 0.0 - ? aNormal.Reversed() - : aNormal; -} - -//======================================================================= -//function : DrawArc -//purpose : draws the arc between two attach points -//======================================================================= -void AIS_AngleDimension::DrawArc (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const Standard_Real theRadius, - const Standard_Integer theMode) -{ - gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); - - // to have an exterior angle presentation, a plane for further constructed circle should be reversed - if (myType == AIS_TOA_Exterior) - { - gp_Ax1 anAxis = aPlane.Axis(); - gp_Dir aDir = anAxis.Direction(); - aDir.Reverse(); - aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); - } - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, theRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // construct the arc - GC_MakeArcOfCircle aConstructArc (aCircle, theFirstAttach, theSecondAttach, Standard_True); - if (!aConstructArc.IsDone()) - { - return; - } - - // generate points with specified deflection - const Handle(Geom_TrimmedCurve)& anArcCurve = aConstructArc.Value(); - - GeomAdaptor_Curve anArcAdaptor (anArcCurve, anArcCurve->FirstParameter(), anArcCurve->LastParameter()); - - // compute number of discretization elements in old-fanshioned way - gp_Vec aCenterToFirstVec (theCenter, theFirstAttach); - gp_Vec aCenterToSecondVec (theCenter, theSecondAttach); - Standard_Real anAngle = aCenterToFirstVec.Angle (aCenterToSecondVec); - if (myType == AIS_TOA_Exterior) - anAngle = 2.0 * M_PI - anAngle; - // it sets 50 points on PI, and a part of points if angle is less - const Standard_Integer aNbPoints = Max (4, Standard_Integer (50.0 * anAngle / M_PI)); - - GCPnts_UniformAbscissa aMakePnts (anArcAdaptor, aNbPoints); - if (!aMakePnts.IsDone()) - { - return; - } - - // init data arrays for graphical and selection primitives - Handle(Graphic3d_ArrayOfPolylines) aPrimSegments = new Graphic3d_ArrayOfPolylines (aNbPoints); - - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - - // load data into arrays - for (Standard_Integer aPntIt = 1; aPntIt <= aMakePnts.NbPoints(); ++aPntIt) - { - gp_Pnt aPnt = anArcAdaptor.Value (aMakePnts.Parameter (aPntIt)); - - aPrimSegments->AddVertex (aPnt); - - aSensitiveCurve.Append (aPnt); - } - - // add display presentation - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True); - } - Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionLineStyle); - Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False); - } -} - -//======================================================================= -//function: DrawArcWithText -//purpose : -//======================================================================= -void AIS_AngleDimension::DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const TCollection_ExtendedString& theText, - const Standard_Real theTextWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition) -{ - gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); - - Standard_Real aRadius = theFirstAttach.Distance (myCenterPoint); - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // compute angle parameters of arc end-points on circle - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - // middle point of arc parameter on circle - Standard_Real aParamMid = (aParamBeg + aParamEnd) * 0.5; - - // add text graphical primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - gp_Pnt aTextPos = ElCLib::Value (aParamMid, aCircle); - gp_Dir aTextDir = gce_MakeDir (theFirstAttach, theSecondAttach); - - // Drawing text - drawText (thePresentation, - aTextPos, - aTextDir, - theText, - theLabelPosition); - } - - if (theMode != ComputeMode_All && theMode != ComputeMode_Line) - { - return; - } - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - if (isLineBreak) - { - // compute gap for label as parameteric size of sector on circle segment - Standard_Real aSectorOfText = theTextWidth / aRadius; - Standard_Real aTextBegin = aParamMid - aSectorOfText * 0.5; - Standard_Real aTextEnd = aParamMid + aSectorOfText * 0.5; - gp_Pnt aTextPntBeg = ElCLib::Value (aTextBegin, aCircle); - gp_Pnt aTextPntEnd = ElCLib::Value (aTextEnd, aCircle); - - // Drawing arcs - if (aTextBegin > aParamBeg) - { - DrawArc (thePresentation, theFirstAttach, aTextPntBeg, theCenter, aRadius, theMode); - } - if (aTextEnd < aParamEnd) - { - DrawArc (thePresentation, aTextPntEnd, theSecondAttach, theCenter, aRadius, theMode); - } - } - else - { - DrawArc (thePresentation, theFirstAttach, theSecondAttach, theCenter, aRadius, theMode); - } -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::CheckPlane (const gp_Pln& thePlane)const -{ - if (!thePlane.Contains (myFirstPoint, Precision::Confusion()) && - !thePlane.Contains (mySecondPoint, Precision::Confusion()) && - !thePlane.Contains (myCenterPoint, Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_AngleDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - // Compute working plane so that Y axis is codirectional - // with Y axis of text coordinate system (necessary for text alignment) - gp_Vec aFirstVec = gp_Vec (myCenterPoint, myFirstPoint); - gp_Vec aSecondVec = gp_Vec (myCenterPoint, mySecondPoint); - gp_Vec aDirectionN = aSecondVec ^ aFirstVec; - gp_Vec aDirectionY = aFirstVec + aSecondVec; - gp_Vec aDirectionX = aDirectionY ^ aDirectionN; - - myPlane = gp_Pln (gp_Ax3 (myCenterPoint, gp_Dir (aDirectionN), gp_Dir (aDirectionX))); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_AngleDimension::GetModelUnits() const -{ - return myDrawer->DimAngleModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_AngleDimension::GetDisplayUnits() const -{ - return myDrawer->DimAngleDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_AngleDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimAngleModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_AngleDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimAngleDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_AngleDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - gp_Vec aVec1 (myCenterPoint, myFirstPoint); - gp_Vec aVec2 (myCenterPoint, mySecondPoint); - - Standard_Real anAngle = aVec1.AngleWithRef (aVec2, GetNormalForMinAngle()); - - return anAngle > 0.0 ? anAngle : (2.0 * M_PI + anAngle); -} - -//======================================================================= -//function : Compute -//purpose : Having three gp_Pnt points compute presentation -//======================================================================= -void AIS_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - // Parameters for presentation - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Prs3d_Root::CurrentGroup(thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to label width - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // Get parameters from aspect or adjust it according with custom text position - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); - - if (IsTextPositionCustom()) - { - AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos, myFlyout); - } - - // Handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - - FitTextAlignment (aHorisontalTextPos, aLabelPosition, isArrowsExternal); - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - //Arrows positions and directions - gp_Vec aWorkingPlaneDir (GetNormalForMinAngle()); - - gp_Dir aFirstExtensionDir = aWorkingPlaneDir.Reversed() ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir aSecondExtensionDir = aWorkingPlaneDir ^ gp_Vec (myCenterPoint, aSecondAttach); - - gp_Vec aFirstArrowVec = gp_Vec (aFirstExtensionDir) * anArrowLength; - gp_Vec aSecondArrowVec = gp_Vec (aSecondExtensionDir) * anArrowLength; - - if (isArrowsExternal) - { - aFirstArrowVec.Reverse(); - aSecondArrowVec.Reverse(); - } - - gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); - - aFirstArrowBegin = aFirstAttach; - aSecondArrowBegin = aSecondAttach; - aFirstArrowEnd = aFirstAttach.Translated (-aFirstArrowVec); - aSecondArrowEnd = aSecondAttach.Translated (-aSecondArrowVec); - - // Group1: stenciling text and the angle dimension arc - Prs3d_Root::NewGroup (thePresentation); - - Standard_Integer aHPosition = aLabelPosition & LabelPosition_HMask; - - // draw text label - switch (aHPosition) - { - case LabelPosition_HCenter : - { - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - if (isLineBreak) - { - DrawArcWithText (thePresentation, - aFirstAttach, - aSecondAttach, - myCenterPoint, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - break; - } - - // compute text primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - gp_Vec aDimensionDir (aFirstAttach, aSecondAttach); - gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition - : GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); - gp_Dir aTextDir = aDimensionDir; - - drawText (thePresentation, - aTextPos, - aTextDir, - aLabelString, - aLabelPosition); - } - - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - DrawArc (thePresentation, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_First)) ? aFirstAttach : aFirstArrowEnd, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_Second)) ? aSecondAttach : aSecondArrowEnd, - myCenterPoint, - Abs (GetFlyout()), - theMode); - } - } - break; - - case LabelPosition_Left : - { - DrawExtension (thePresentation, - anExtensionSize, - (isArrowsExternal && isArrowVisible(AIS_TOAV_First)) ? aFirstArrowEnd : aFirstAttach, - aFirstExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - break; - - case LabelPosition_Right : - { - DrawExtension (thePresentation, - anExtensionSize, - (isArrowsExternal && isArrowVisible(AIS_TOAV_Second)) ? aSecondArrowEnd : aSecondAttach, - aSecondExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - break; - } - - // dimension arc without text - if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && aHPosition != LabelPosition_HCenter) - { - Prs3d_Root::NewGroup (thePresentation); - - DrawArc (thePresentation, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_First)) ? aFirstAttach : aFirstArrowEnd, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_Second)) ? aSecondAttach : aSecondArrowEnd, - myCenterPoint, - Abs(GetFlyout ()), - theMode); - } - - // arrows and arrow extensions - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - Prs3d_Root::NewGroup (thePresentation); - - if (isArrowVisible(AIS_TOAV_First)) - DrawArrow (thePresentation, aFirstArrowBegin, gp_Dir (aFirstArrowVec)); - if (isArrowVisible(AIS_TOAV_Second)) - DrawArrow (thePresentation, aSecondArrowBegin, gp_Dir (aSecondArrowVec)); - } - - if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && isArrowsExternal) - { - Prs3d_Root::NewGroup (thePresentation); - - if (aHPosition != LabelPosition_Left && isArrowVisible(AIS_TOAV_First)) - { - DrawExtension (thePresentation, - aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, - aFirstExtensionDir, - THE_EMPTY_LABEL_STRING, - THE_EMPTY_LABEL_WIDTH, - theMode, - LabelPosition_None); - } - - if (aHPosition != LabelPosition_Right && isArrowVisible(AIS_TOAV_Second)) - { - DrawExtension (thePresentation, - aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, - aSecondExtensionDir, - THE_EMPTY_LABEL_STRING, - THE_EMPTY_LABEL_WIDTH, - theMode, - LabelPosition_None); - } - } - - // flyouts - if (theMode == ComputeMode_All) - { - Prs3d_Root::NewGroup (thePresentation); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (4); - aPrimSegments->AddVertex (myCenterPoint); - aPrimSegments->AddVertex (aFirstAttach); - aPrimSegments->AddVertex (myCenterPoint); - aPrimSegments->AddVertex (aSecondAttach); - - Handle(Graphic3d_AspectLine3d) aFlyoutStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aFlyoutStyle); - Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); - } - - mySelectionGeom.IsComputed = Standard_True; -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : computes selection for flyouts -//======================================================================= -void AIS_AngleDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner) -{ - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aFirstAttach)); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aSecondAttach)); - - theSelection->Add (aSensitiveEntity); -} - -//======================================================================= -//function : InitTwoEdgesAngle -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoEdgesAngle (gp_Pln& theComputedPlane) -{ - TopoDS_Edge aFirstEdge = TopoDS::Edge (myFirstShape); - TopoDS_Edge aSecondEdge = TopoDS::Edge (mySecondShape); - - BRepAdaptor_Curve aMakeFirstLine (aFirstEdge); - BRepAdaptor_Curve aMakeSecondLine (aSecondEdge); - - if (aMakeFirstLine.GetType() != GeomAbs_Line || aMakeSecondLine.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Handle(Geom_Line) aFirstLine = new Geom_Line (aMakeFirstLine.Line()); - Handle(Geom_Line) aSecondLine = new Geom_Line (aMakeSecondLine.Line()); - - gp_Lin aFirstLin = aFirstLine->Lin(); - gp_Lin aSecondLin = aSecondLine->Lin(); - - Standard_Boolean isParallelLines = aFirstLin.Direction().IsParallel (aSecondLin.Direction(), Precision::Angular()); - - theComputedPlane = isParallelLines ? gp_Pln(gp::XOY()) - : gp_Pln (aSecondLin.Location(), gp_Vec (aFirstLin.Direction()) ^ gp_Vec (aSecondLin.Direction())); - - // Compute geometry for this plane and edges - Standard_Boolean isInfinite1,isInfinite2; - gp_Pnt aFirstPoint1, aLastPoint1, aFirstPoint2, aLastPoint2; - Handle(Geom_Curve) aFirstCurve = aFirstLine, aSecondCurve = aSecondLine; - if (!AIS::ComputeGeometry (aFirstEdge, aSecondEdge, - aFirstCurve, aSecondCurve, - aFirstPoint1, aLastPoint1, - aFirstPoint2, aLastPoint2, - isInfinite1, isInfinite2)) - { - return Standard_False; - } - - Standard_Boolean isSameLines = aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) - && aFirstLin.Location().IsEqual (aSecondLin.Location(),Precision::Confusion()); - - // It can be the same gp_Lin geometry but the different begin and end parameters - Standard_Boolean isSameEdges = - (aFirstPoint1.IsEqual (aFirstPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aLastPoint2, Precision::Confusion())) - || (aFirstPoint1.IsEqual (aLastPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aFirstPoint2, Precision::Confusion())); - - if (isParallelLines) - { - // Zero angle, it could not handle this geometry - if (isSameLines && isSameEdges) - { - return Standard_False; - } - - // Handle the case of Pi angle - const Standard_Real aParam11 = ElCLib::Parameter (aFirstLin, aFirstPoint1); - const Standard_Real aParam12 = ElCLib::Parameter (aFirstLin, aLastPoint1); - const Standard_Real aParam21 = ElCLib::Parameter (aFirstLin, aFirstPoint2); - const Standard_Real aParam22 = ElCLib::Parameter (aFirstLin, aLastPoint2); - myCenterPoint = ElCLib::Value ( (Min (aParam11, aParam12) + Max (aParam21, aParam22)) * 0.5, aFirstLin); - myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); - mySecondPoint = myCenterPoint.XYZ() + (aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) - ? aFirstLin.Direction().Reversed().XYZ() * Abs (GetFlyout()) - : aSecondLin.Direction().XYZ() * Abs (GetFlyout())); - } - else - { - // Find intersection - gp_Lin2d aFirstLin2d = ProjLib::Project (theComputedPlane, aFirstLin); - gp_Lin2d aSecondLin2d = ProjLib::Project (theComputedPlane, aSecondLin); - - IntAna2d_AnaIntersection anInt2d (aFirstLin2d, aSecondLin2d); - gp_Pnt2d anIntersectPoint; - if (!anInt2d.IsDone() || anInt2d.IsEmpty()) - { - return Standard_False; - } - - anIntersectPoint = gp_Pnt2d (anInt2d.Point(1).Value()); - myCenterPoint = ElCLib::To3d (theComputedPlane.Position().Ax2(), anIntersectPoint); - - if (isInfinite1 || isInfinite2) - { - myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); - mySecondPoint = myCenterPoint.Translated (gp_Vec (aSecondLin.Direction()) * Abs (GetFlyout())); - - return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - } - - // | - // | <- dimension should be here - // *---- - myFirstPoint = myCenterPoint.Distance (aFirstPoint1) > myCenterPoint.Distance (aLastPoint1) - ? aFirstPoint1 - : aLastPoint1; - - mySecondPoint = myCenterPoint.Distance (aFirstPoint2) > myCenterPoint.Distance (aLastPoint2) - ? aFirstPoint2 - : aLastPoint2; - } - - return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); -} - -//======================================================================= -//function : InitTwoFacesAngle -//purpose : initialization of angle dimension between two faces -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoFacesAngle() -{ - TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); - TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); - - gp_Dir aFirstDir, aSecondDir; - gp_Pln aFirstPln, aSecondPln; - Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; - AIS_KindOfSurface aFirstSurfType, aSecondSurfType; - Standard_Real aFirstOffset, aSecondOffset; - - AIS::GetPlaneFromFace (aFirstFace, aFirstPln, - aFirstBasisSurf,aFirstSurfType,aFirstOffset); - - AIS::GetPlaneFromFace (aSecondFace, aSecondPln, - aSecondBasisSurf, aSecondSurfType, aSecondOffset); - - if (aFirstSurfType == AIS_KOS_Plane && aSecondSurfType == AIS_KOS_Plane) - { - //Planar faces angle - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); - return AIS::InitAngleBetweenPlanarFaces (aFirstFace, - aSecondFace, - myCenterPoint, - myFirstPoint, - mySecondPoint) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } - else - { - // Curvilinear faces angle - return AIS::InitAngleBetweenCurvilinearFaces (aFirstFace, - aSecondFace, - aFirstSurfType, - aSecondSurfType, - myCenterPoint, - myFirstPoint, - mySecondPoint) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } -} - -//======================================================================= -//function : InitTwoFacesAngle -//purpose : initialization of angle dimension between two faces -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace) -{ - TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); - TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); - - gp_Dir aFirstDir, aSecondDir; - gp_Pln aFirstPln, aSecondPln; - Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; - AIS_KindOfSurface aFirstSurfType, aSecondSurfType; - Standard_Real aFirstOffset, aSecondOffset; - - AIS::GetPlaneFromFace (aFirstFace, aFirstPln, - aFirstBasisSurf,aFirstSurfType,aFirstOffset); - - AIS::GetPlaneFromFace (aSecondFace, aSecondPln, - aSecondBasisSurf, aSecondSurfType, aSecondOffset); - - myFirstPoint = thePointOnFirstFace; - if (aFirstSurfType == AIS_KOS_Plane && aSecondSurfType == AIS_KOS_Plane) - { - //Planar faces angle - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); - return AIS::InitAngleBetweenPlanarFaces (aFirstFace, - aSecondFace, - myCenterPoint, - myFirstPoint, - mySecondPoint, - Standard_True) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } - else - { - // Curvilinear faces angle - return AIS::InitAngleBetweenCurvilinearFaces (aFirstFace, - aSecondFace, - aFirstSurfType, - aSecondSurfType, - myCenterPoint, - myFirstPoint, - mySecondPoint, - Standard_True) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } -} - -//======================================================================= -//function : InitConeAngle -//purpose : initialization of the cone angle -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitConeAngle() -{ - if (myFirstShape.IsNull()) - { - return Standard_False; - } - - TopoDS_Face aConeShape = TopoDS::Face (myFirstShape); - gp_Pln aPln; - gp_Cone aCone; - gp_Circ aCircle; - // A surface from the Face - Handle(Geom_Surface) aSurf; - Handle(Geom_OffsetSurface) aOffsetSurf; - Handle(Geom_ConicalSurface) aConicalSurf; - Handle(Geom_SurfaceOfRevolution) aRevSurf; - Handle(Geom_Line) aLine; - BRepAdaptor_Surface aConeAdaptor (aConeShape); - TopoDS_Face aFace; - AIS_KindOfSurface aSurfType; - Standard_Real anOffset = 0.; - Handle(Standard_Type) aType; - - Standard_Real aMaxV = aConeAdaptor.FirstVParameter(); - Standard_Real aMinV = aConeAdaptor.LastVParameter(); - - AIS::GetPlaneFromFace (aConeShape, aPln, aSurf, aSurfType, anOffset); - - if (aSurfType == AIS_KOS_Revolution) - { - // Surface of revolution - aRevSurf = Handle(Geom_SurfaceOfRevolution)::DownCast(aSurf); - gp_Lin aLin (aRevSurf->Axis()); - Handle(Geom_Curve) aBasisCurve = aRevSurf->BasisCurve(); - //Must be a part of line (basis curve should be linear) - if (aBasisCurve ->DynamicType() != STANDARD_TYPE(Geom_Line)) - return Standard_False; - - gp_Pnt aFirst1 = aConeAdaptor.Value (0., aMinV); - gp_Pnt aLast1 = aConeAdaptor.Value (0., aMaxV); - gp_Vec aVec1 (aFirst1, aLast1); - - //Projection on - gp_Pnt aFirst2 = ElCLib::Value (ElCLib::Parameter (aLin, aFirst1), aLin); - // Projection on - gp_Pnt aLast2 = ElCLib::Value (ElCLib::Parameter (aLin, aLast1), aLin); - - gp_Vec aVec2 (aFirst2, aLast2); - - // Check if two parts of revolution are parallel (it's a cylinder) or normal (it's a circle). - if (aVec1.IsParallel (aVec2, Precision::Angular()) - || aVec1.IsNormal (aVec2,Precision::Angular())) - return Standard_False; - - gce_MakeCone aMkCone (aRevSurf->Axis(), aFirst1, aLast1); - aCone = aMkCone.Value(); - myCenterPoint = aCone.Apex(); - } - else - { - aType = aSurf->DynamicType(); - if (aType == STANDARD_TYPE(Geom_OffsetSurface) || anOffset > 0.01) - { - // Offset surface - aOffsetSurf = new Geom_OffsetSurface (aSurf, anOffset); - aSurf = aOffsetSurf->Surface(); - BRepBuilderAPI_MakeFace aMkFace(aSurf, Precision::Confusion()); - aMkFace.Build(); - if (!aMkFace.IsDone()) - return Standard_False; - aConeAdaptor.Initialize (aMkFace.Face()); - } - aCone = aConeAdaptor.Cone(); - aConicalSurf = Handle(Geom_ConicalSurface)::DownCast (aSurf); - myCenterPoint = aConicalSurf->Apex(); - } - - // A circle where the angle is drawn - Handle(Geom_Curve) aCurve; - Standard_Real aMidV = ( aMinV + aMaxV ) / 2.5; - aCurve = aSurf->VIso (aMidV); - aCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - - aCurve = aSurf->VIso(aMaxV); - gp_Circ aCircVmax = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); - aCurve = aSurf->VIso(aMinV); - gp_Circ aCircVmin = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); - - if (aCircVmax.Radius() < aCircVmin.Radius()) - { - gp_Circ aTmpCirc = aCircVmax; - aCircVmax = aCircVmin; - aCircVmin = aTmpCirc; - } - - myFirstPoint = ElCLib::Value (0, aCircle); - mySecondPoint = ElCLib::Value (M_PI, aCircle); - return Standard_True; -} - -//======================================================================= -//function : IsValidPoints -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) const -{ - return theFirstPoint.Distance (theCenterPoint) > Precision::Confusion() - && theSecondPoint.Distance (theCenterPoint) > Precision::Confusion() - && gp_Vec (theCenterPoint, theFirstPoint).Angle ( - gp_Vec (theCenterPoint, theSecondPoint)) > Precision::Angular(); -} - -//======================================================================= -//function : isArrowVisible -//purpose : compares given and internal arrows types, returns true if the the type should be shown -//======================================================================= -Standard_Boolean AIS_AngleDimension::isArrowVisible(const AIS_TypeOfAngleArrowVisibility& theArrowType) const -{ - switch (theArrowType) - { - case AIS_TOAV_Both: - return myArrowsVisibility == AIS_TOAV_Both; - case AIS_TOAV_First: - return myArrowsVisibility == AIS_TOAV_Both || myArrowsVisibility == AIS_TOAV_First; - case AIS_TOAV_Second: - return myArrowsVisibility == AIS_TOAV_Both || myArrowsVisibility == AIS_TOAV_Second; - case AIS_TOAV_None: - return false; - } - return false; -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_AngleDimension::GetTextPosition() const -{ - if (!IsValid()) - { - return gp::Origin(); - } - - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - gp_Pnt aTextPosition (gp::Origin()); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // Prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - // Handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - FitTextAlignment (aDimensionAspect->TextHorizontalPosition(), - aLabelPosition, isArrowsExternal); - - // Get text position - switch (aLabelPosition & LabelPosition_HMask) - { - case LabelPosition_HCenter: - { - aTextPosition = GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); - } - break; - case LabelPosition_Left: - { - gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aFirstAttach); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * -anOffset; - aTextPosition = aFirstAttach.Translated (anExtensionVec); - } - break; - case LabelPosition_Right: - { - gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aSecondAttach); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * anOffset; - aTextPosition = aSecondAttach.Translated (anExtensionVec); - } - break; - } - - return aTextPosition; -} - -//======================================================================= -//function : SetTextPosition -//purpose : -//======================================================================= -void AIS_AngleDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - // The text position point for angle dimension should belong to the working plane. - if (!GetPlane().Contains (theTextPos, Precision::Confusion())) - { - throw Standard_ProgramError("The text position point for angle dimension doesn't belong to the working plane."); - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; -} - -//======================================================================= -//function : AdjustParameters -//purpose : -//======================================================================= -void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // Build circle with radius that is equal to distance from text position to the center point. - Standard_Real aRadius = gp_Vec (myCenterPoint, theTextPos).Magnitude(); - - // Set attach points in positive direction of the flyout. - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * aRadius); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * aRadius); - - gce_MakeCirc aConstructCircle (myCenterPoint, GetPlane(), aRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - gp_Circ aCircle = aConstructCircle.Value(); - - // Default values - theExtensionSize = aDimensionAspect->ArrowAspect()->Length(); - theAlignment = Prs3d_DTHP_Center; - - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, aFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, aSecondAttach); - if (aParamEnd < aParamBeg) - { - Standard_Real aParam = aParamEnd; - aParamEnd = aParamBeg; - aParamBeg = aParam; - } - - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - Standard_Real aTextPar = ElCLib::Parameter (aCircle , theTextPos); - - // Horizontal center - if (aTextPar > aParamBeg && aTextPar < aParamEnd) - { - theFlyout = aRadius; - return; - } - - aParamBeg += M_PI; - aParamEnd += M_PI; - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - if (aTextPar > aParamBeg && aTextPar < aParamEnd) - { - theFlyout = -aRadius; - return; - } - - // Text on the extensions - gp_Lin aFirstLine = gce_MakeLin (myCenterPoint, myFirstPoint); - gp_Lin aSecondLine = gce_MakeLin (myCenterPoint, mySecondPoint); - gp_Pnt aFirstTextProj = AIS::Nearest (aFirstLine, theTextPos); - gp_Pnt aSecondTextProj = AIS::Nearest (aSecondLine, theTextPos); - Standard_Real aFirstDist = aFirstTextProj.Distance (theTextPos); - Standard_Real aSecondDist = aSecondTextProj.Distance (theTextPos); - - if (aFirstDist <= aSecondDist) - { - aRadius = myCenterPoint.Distance (aFirstTextProj); - Standard_Real aNewExtensionSize = aFirstDist - anArrowLength; - theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; - - theAlignment = Prs3d_DTHP_Left; - - gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, myFirstPoint).Normalized().Scaled (aRadius); - - theFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() - ? -aRadius : aRadius; - } - else - { - aRadius = myCenterPoint.Distance (aSecondTextProj); - - Standard_Real aNewExtensionSize = aSecondDist - anArrowLength; - - theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; - - theAlignment = Prs3d_DTHP_Right; - - gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, mySecondPoint).Normalized().Scaled (aRadius); - - theFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() - ? -aRadius : aRadius; - } -} - -//======================================================================= -//function : FitTextAlignment -//purpose : -//======================================================================= -void AIS_AngleDimension::FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // Prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to label width - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - // Handle user-defined and automatic arrow placement - switch (aDimensionAspect->ArrowOrientation()) - { - case Prs3d_DAO_External: theIsArrowsExternal = true; break; - case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; - case Prs3d_DAO_Fit: - { - gp_Vec anAttachVector (aFirstAttach, aSecondAttach); - Standard_Real aDimensionWidth = anAttachVector.Magnitude(); - - // Add margin to ensure a small tail between text and arrow - Standard_Real anArrowMargin = aDimensionAspect->IsText3d() - ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN - : 0.0; - - Standard_Real anArrowsWidth = (anArrowLength + anArrowMargin) * 2.0; - - theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; - break; - } - } - - // Handle user-defined and automatic text placement - switch (theHorizontalTextPos) - { - case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; - case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; - case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; - case Prs3d_DTHP_Fit: - { - gp_Vec anAttachVector (aFirstAttach, aSecondAttach); - Standard_Real aDimensionWidth = anAttachVector.Magnitude(); - Standard_Real anArrowsWidth = anArrowLength * 2.0; - Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; - - theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; - break; - } - } - - switch (aDimensionAspect->TextVerticalPosition()) - { - case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; - case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; - case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; - } -} diff --git a/src/AIS/AIS_AngleDimension.hxx b/src/AIS/AIS_AngleDimension.hxx deleted file mode 100755 index 7c9c1ce09f..0000000000 --- a/src/AIS/AIS_AngleDimension.hxx +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2013 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. - -#ifndef _AIS_AngleDimension_HeaderFile -#define _AIS_AngleDimension_HeaderFile - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class AIS_AngleDimension; -DEFINE_STANDARD_HANDLE (AIS_AngleDimension, AIS_Dimension) - -//! Angle dimension. Can be constructed: -//! - on two intersected edges. -//! - on three points or vertices. -//! - on conical face. -//! - between two intersected faces. -//! -//! In case of three points or two intersected edges the dimension plane -//! (on which dimension presentation is built) can be computed uniquely -//! as through three defined points can be built only one plane. -//! Therefore, if user-defined plane differs from this one, the dimension can't be built. -//! -//! In cases of two planes automatic plane by default is built on point of the -//! origin of parametric space of the first face (the basis surface) so, that -//! the working plane and two faces intersection forms minimal angle between the faces. -//! User can define the other point which the dimension plane should pass through -//! using the appropriate constructor. This point can lay on the one of the faces or not. -//! Also user can define his own plane but it should pass through the three points -//! computed on the geometry initialization step (when the constructor or SetMeasuredGeometry() method -//! is called). -//! -//! In case of the conical face the center point of the angle is the apex of the conical surface. -//! The attachment points are points of the first and the last parameter of the basis circle of the cone. -//! -class AIS_AngleDimension : public AIS_Dimension -{ -public: - - //! Constructs minimum angle dimension between two linear edges (where possible). - //! These two edges should be intersected by each other. Otherwise the geometry is not valid. - //! @param theFirstEdge [in] the first edge. - //! @param theSecondEdge [in] the second edge. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge); - - //! Constructs the angle display object defined by three points. - //! @param theFirstPoint [in] the first point (point on first angle flyout). - //! @param theSecondPoint [in] the center point of angle dimension. - //! @param theThirdPoint [in] the second point (point on second angle flyout). - Standard_EXPORT AIS_AngleDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint); - - //! Constructs the angle display object defined by three vertices. - //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). - //! @param theSecondVertex [in] the center vertex of angle dimension. - //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). - Standard_EXPORT AIS_AngleDimension (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex); - - //! Constructs angle dimension for the cone face. - //! @param theCone [in] the conical face. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theCone); - - //! Constructs angle dimension between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Constructs angle dimension between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - //! @param thePoint [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint); - -public: - - //! @return first point forming the angle. - const gp_Pnt& FirstPoint() const - { - return myFirstPoint; - } - - //! @return second point forming the angle. - const gp_Pnt& SecondPoint() const - { - return mySecondPoint; - } - - //! @return center point forming the angle. - const gp_Pnt& CenterPoint() const - { - return myCenterPoint; - } - - //! @return first argument shape. - const TopoDS_Shape& FirstShape() const - { - return myFirstShape; - } - - //! @return second argument shape. - const TopoDS_Shape& SecondShape() const - { - return mySecondShape; - } - - //! @return third argument shape. - const TopoDS_Shape& ThirdShape() const - { - return myThirdShape; - } - -public: - - //! Measures minimum angle dimension between two linear edges. - //! These two edges should be intersected by each other. Otherwise the geometry is not valid. - //! @param theFirstEdge [in] the first edge. - //! @param theSecondEdge [in] the second edge. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge); - - //! Measures angle defined by three points. - //! @param theFirstPoint [in] the first point (point on first angle flyout). - //! @param theSecondPoint [in] the center point of angle dimension. - //! @param theThirdPoint [in] the second point (point on second angle flyout). - Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThridPoint); - - //! Measures angle defined by three vertices. - //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). - //! @param theSecondVertex [in] the center vertex of angle dimension. - //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex); - - //! Measures angle of conical face. - //! @param theCone [in] the shape to measure. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theCone); - - //! Measures angle between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face.. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Measures angle between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - //! @param thePoint [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - //! Principle of horizontal text alignment settings: - //! - divide circle into two halves according to attachment points - //! - if aTextPos is between attach points -> Center + positive flyout - //! - if aTextPos is not between attach points but in this half -> Left or Right + positive flyout - //! - if aTextPos is between reflections of attach points -> Center + negative flyout - //! - if aTextPos is not between reflections of attach points -> Left or Right + negative flyout - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition () const Standard_OVERRIDE; - - //! Sets angle type. - //! @param theType [in] the type value. - void SetType(const AIS_TypeOfAngle theType) - { - myType = theType; - } - - //! @return the current angle type. - AIS_TypeOfAngle GetType() const - { - return myType; - } - - //! Sets visible arrows type - //! @param theType [in] the type of visibility of arrows. - void SetArrowsVisibility(const AIS_TypeOfAngleArrowVisibility& theType) - { - myArrowsVisibility = theType; - } - - //! @return the type of visibility of arrows. - AIS_TypeOfAngleArrowVisibility GetArrowsVisibility() const - { - return myArrowsVisibility; - } - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_AngleDimension,AIS_Dimension) - -protected: - - //! Initialization of fields that is common to all constructors. - Standard_EXPORT void Init(); - - //! Gets plane normal for minimal angle. - //! Dimension computation is based on three attach points and plane normal. - //! Based on this normal angle arc, arrows and extensions are constructed. - gp_Dir GetNormalForMinAngle() const; - - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @return the center of the dimension arc (the main dimension line in case of angle). - Standard_EXPORT gp_Pnt GetCenterOnArc (const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter) const; - - //! Draws main dimension line (arc). - //! @param thePresentation [in] the dimension presentation. - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @param theRadius [in] the radius of the dimension arc. - //! @param theMode [in] the display mode. - Standard_EXPORT void DrawArc (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const Standard_Real theRadius, - const Standard_Integer theMode); - - //! Draws main dimension line (arc) with text. - //! @param thePresentation [in] the dimension presentation. - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @param theText [in] the text label string. - //! @param theTextWidth [in] the text label width. - //! @param theMode [in] the display mode. - //! @param theLabelPosition [in] the text label vertical and horizontal positioning option - //! respectively to the main dimension line. - Standard_EXPORT void DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const TCollection_ExtendedString& theText, - const Standard_Real theTextWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition); - - //! Fits text alignment relatively to the dimension line; - //! it computes the value of label position and arrow orientation - //! according set in the aspect and dimension properties. - //! @param theHorizontalTextPos [in] the horizontal alignment for text position. - //! @param theLabelPosition [out] the label position, contains bits that defines - //! vertical and horizontal alignment. (for internal usage in count text position). - //! @param theIsArrowExternal [out] is the arrows external, - //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow - //! orientation automatically. - Standard_EXPORT void FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const; - - //! Adjusts aspect parameters according the text position: - //! extension size, vertical text alignment and flyout. - //! @param theTextPos [in] the user defined 3d point of text position. - //! @param theExtensionSize [out] the adjusted extension size. - //! @param theAlignment [out] the horizontal label alignment. - //! @param theFlyout [out] the adjusted value of flyout. - Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout) const; - -protected: - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if the plane includes three angle points to build dimension. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner) Standard_OVERRIDE; - -protected: - - //! Init angular dimension to measure angle between two linear edges. - //! @return TRUE if the angular dimension can be constructured - //! for the passed edges. - Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane); - - //! Init angular dimension to measure angle between two planar faces. - //! there is no user-defined poisitoning. So attach points are set - //! according to faces geometry (in origin of the first face basis surface). - //! @return TRUE if the angular dimension can be constructed - //! for the passed faces. - Standard_EXPORT Standard_Boolean InitTwoFacesAngle(); - - //! Init angular dimension to measure angle between two planar faces. - //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - //! It will be projected on the first face and this point will be set - //! as the first point attach point. - //! It defines some kind of dimension positioning over the faces. - //! @return TRUE if the angular dimension can be constructed - //! for the passed faces. - Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace); - - //! Init angular dimension to measure cone face. - //! @return TRUE if the angular dimension can be constructed - //! for the passed cone. - Standard_EXPORT Standard_Boolean InitConeAngle(); - - //! Check that the points forming angle are valid. - //! @return TRUE if the points met the following requirements: - //! The (P1, Center), (P2, Center) can be built. - //! The angle between the vectors > Precision::Angular(). - Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) const; - - - //! Returns true if the arrow should be visible - //! @param theArrowType an arrow type - //! @return TRUE if the arrow should be visible - Standard_EXPORT Standard_Boolean isArrowVisible(const AIS_TypeOfAngleArrowVisibility& theArrowType) const; - -private: - AIS_TypeOfAngle myType; //!< type of angle - AIS_TypeOfAngleArrowVisibility myArrowsVisibility; //!< type of arrows visibility - - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - gp_Pnt myCenterPoint; - TopoDS_Shape myFirstShape; - TopoDS_Shape mySecondShape; - TopoDS_Shape myThirdShape; -}; - -#endif // _AIS_AngleDimension_HeaderFile diff --git a/src/AIS/AIS_Chamf2dDimension.cxx b/src/AIS/AIS_Chamf2dDimension.cxx deleted file mode 100644 index d9c59829af..0000000000 --- a/src/AIS/AIS_Chamf2dDimension.cxx +++ /dev/null @@ -1,229 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Chamf2dDimension,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf2dDimension::AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aFShape; - myPlane = aPlane; - myVal = aVal; - myText = aText; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - - myArrowSize = myVal / 100.; -} -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf2dDimension::AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs , - const Standard_Real anArrowSize) -:AIS_Relation() -{ - myFShape = aFShape; - myPlane = aPlane; - myVal = aVal; - myText = aText; - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Chamf2dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - Handle(Geom_Curve) gcurv; - gp_Pnt pfirst,plast; - const TopoDS_Edge& thechamfedge = TopoDS::Edge(myFShape); - if (!AIS::ComputeGeometry (thechamfedge, gcurv, pfirst, plast)) - return; - - Handle(Geom_Line) glin = Handle(Geom_Line)::DownCast (gcurv); - gp_Dir dir1 (glin->Position().Direction()); - gp_Dir norm1 = myPlane->Pln().Axis().Direction(); - myDir = norm1.Crossed(dir1); - - - //------------------------------------------------- - // calcul d'une direction orthogonale a l'edge du - // chanfrein et dirigee vers l'ext. du contour - //------------------------------------------------- - - - // recup. d'une edge adjacente a l'edge du chanfrein - /*TopoDS_Edge nextedge = TopoDS::Edge(mySShape); - - gp_Pnt pfirstnext,plastnext; - Handle(Geom_Line) glinnext; - if (!AIS::ComputeGeometry(nextedge,glinnext,pfirstnext,plastnext) ) - return; - - gp_Vec v1(pfirst,plast); - gp_Vec v2; - if (pfirst.IsEqual(plastnext, Precision::Confusion())) - v2.SetXYZ(pfirstnext.XYZ() - pfirst.XYZ()); - else - v2.SetXYZ(plastnext.XYZ() - pfirst.XYZ()); - gp_Vec crossvec = v1.Crossed(v2); - - myDir = dimserv.GetDirection().Crossed(glin->Position().Direction()); - if (crossvec.Dot(dimserv.GetDirection()) > 0 ) - myDir.Reverse();*/ // myDir => donne a la creation - - //-------------------------------------------- - //Calcul du point de positionnement du texte - //-------------------------------------------- - gp_Pnt curpos; - if (myAutomaticPosition) { - myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); - gp_Vec transVec(myDir); - transVec*=myVal; - curpos = myPntAttach.Translated(transVec); - - if (myIsSetBndBox) - curpos = AIS::TranslatePointToBound( curpos, myDir, myBndBox ); - - myPosition = curpos; - } - else { - - myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); - Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); - Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); - curpos = ElCLib::Value(parcurpos,dimLin->Lin()); - //static Standard_Real minlength = 0.005; - //taille minimale de la dimension - - if ( curpos.Distance(myPntAttach) < 5. ) { - gp_Vec transVec(myDir); - transVec*=5.; - curpos = myPntAttach.Translated(transVec); - } - myPosition = curpos; - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - //------------------------------------------------- - //Calcul de la boite englobante du component pour - //determiner la taille de la fleche - //------------------------------------------------- - - if( !myArrowSizeIsDefined ) { - Standard_Real arrsize = myArrowSize; - if ( (myVal/4) < arrsize) - arrsize = myVal/4; - if (arrsize > 30.) - arrsize = 30.; - else if (arrsize < 8.) - arrsize = 8.; - myArrowSize = arrsize; - } - arr->SetLength(myArrowSize); - - //Calcul de la presentation - DsgPrs_Chamf2dPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - myText, - mySymbolPrs); - - } - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_Chamf2dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); - 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, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X() + size, - myPosition.Y() + size, - myPosition.Z() + size); - aSelection->Add(box); -} - diff --git a/src/AIS/AIS_Chamf2dDimension.hxx b/src/AIS/AIS_Chamf2dDimension.hxx deleted file mode 100644 index 0b145aeba1..0000000000 --- a/src/AIS/AIS_Chamf2dDimension.hxx +++ /dev/null @@ -1,69 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_Chamf2dDimension_HeaderFile -#define _AIS_Chamf2dDimension_HeaderFile - -#include -#include -#include -#include - -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_Chamf2dDimension, AIS_Relation) - -//! A framework to define display of 2D chamfers. -//! A chamfer is displayed with arrows and text. The text -//! gives the length of the chamfer if it is a symmetrical -//! chamfer, or the angle if it is not. -class AIS_Chamf2dDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_Chamf2dDimension, AIS_Relation) -public: - - //! Constructs the display object for 2D chamfers. - //! This object is defined by the face aFShape, the - //! dimension aVal, the plane aPlane and the text aText. - Standard_EXPORT AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Constructs the display object for 2D chamfers. - //! This object is defined by the face aFShape, the plane - //! aPlane, the dimension aVal, the position aPosition, - //! the type of arrow aSymbolPrs with the size - //! anArrowSize, and the text aText. - Standard_EXPORT AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! Indicates that we are concerned with a 2d length. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the 2d chamfer dimension is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myPntAttach; - gp_Dir myDir; - -}; - -#include - -#endif // _AIS_Chamf2dDimension_HeaderFile diff --git a/src/AIS/AIS_Chamf2dDimension.lxx b/src/AIS/AIS_Chamf2dDimension.lxx deleted file mode 100644 index ff9fb7f3d9..0000000000 --- a/src/AIS/AIS_Chamf2dDimension.lxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_Chamf2dDimension::KindOfDimension() const -{ - return AIS_KOD_LENGTH; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_Chamf2dDimension::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_Chamf3dDimension.cxx b/src/AIS/AIS_Chamf3dDimension.cxx deleted file mode 100644 index c3edce7187..0000000000 --- a/src/AIS/AIS_Chamf3dDimension.cxx +++ /dev/null @@ -1,203 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Chamf3dDimension,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf3dDimension::AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aFShape; - myVal = aVal; - myText = aText; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - - myArrowSize = myVal / 100.; -} -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf3dDimension::AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs , - const Standard_Real anArrowSize) -:AIS_Relation() -{ - myFShape = aFShape; - myVal = aVal; - myText = aText; - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Chamf3dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - //---------------------------- - // Calcul du centre de la face - //---------------------------- - BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); - Standard_Real uFirst, uLast, vFirst, vLast; - uFirst = surfAlgo.FirstUParameter(); - uLast = surfAlgo.LastUParameter(); - vFirst = surfAlgo.FirstVParameter(); - vLast = surfAlgo.LastVParameter(); - Standard_Real uMoy = (uFirst + uLast)/2; - Standard_Real vMoy = (vFirst + vLast)/2; - gp_Pnt apos ; - gp_Vec d1u, d1v; - surfAlgo.D1(uMoy, vMoy, apos, d1u, d1v); - myPntAttach = apos; - - myDir = d1u ^ d1v; -// myDir = surfAlgo.Plane().Axis().Direction(); - - - - - //-------------------------------------------- - //Calcul du point de positionnement du texte - //-------------------------------------------- - gp_Pnt curpos; - if (myAutomaticPosition) { - gp_Vec transVec(myDir); - transVec*=myVal; - curpos = myPntAttach.Translated(transVec); - - if (myIsSetBndBox) - curpos = AIS::TranslatePointToBound( curpos, myDir, myBndBox ); - - myPosition = curpos; - } - else { - - Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); - Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); - curpos = ElCLib::Value(parcurpos,dimLin->Lin()); - - if ( curpos.Distance(myPntAttach) < 5. ) { - gp_Vec transVec(myDir); - transVec*=5.; - curpos = myPntAttach.Translated(transVec); - } - myPosition = curpos; - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - //------------------------------------------------- - //Calcul de la boite englobante du component pour - //determiner la taille de la fleche - //------------------------------------------------- - if( !myArrowSizeIsDefined ) { - Standard_Real arrsize = myArrowSize; - if ( (myVal/4) < arrsize) - arrsize = myVal/4; - if (arrsize > 30.) - arrsize = 30.; - else if (arrsize < 8.) - arrsize = 8.; - myArrowSize = arrsize; - } - arr->SetLength(myArrowSize); - - //Calcul de la presentation - DsgPrs_Chamf2dPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - myText, - mySymbolPrs); - -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_Chamf3dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); - 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, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X() + size, - myPosition.Y() + size, - myPosition.Z() + size); - aSelection->Add(box); -} - diff --git a/src/AIS/AIS_Chamf3dDimension.hxx b/src/AIS/AIS_Chamf3dDimension.hxx deleted file mode 100644 index d33117aa93..0000000000 --- a/src/AIS/AIS_Chamf3dDimension.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_Chamf3dDimension_HeaderFile -#define _AIS_Chamf3dDimension_HeaderFile - -#include -#include -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_Chamf3dDimension, AIS_Relation) - -//! A framework to define display of 3D chamfers. -//! A chamfer is displayed with arrows and text. The text -//! gives the length of the chamfer if it is a symmetrical -//! chamfer, or the angle if it is not. -class AIS_Chamf3dDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_Chamf3dDimension, AIS_Relation) -public: - - //! Constructs a display object for 3D chamfers. - //! This object is defined by the shape aFShape, the - //! dimension aVal and the text aText. - Standard_EXPORT AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Constructs a display object for 3D chamfers. - //! This object is defined by the shape aFShape, the - //! dimension aVal, the text aText, the point of origin of - //! the chamfer aPosition, the type of arrow aSymbolPrs - //! with the size anArrowSize. - Standard_EXPORT AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! Indicates that we are concerned with a 3d length. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the 3d chamfer dimension is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myPntAttach; - gp_Dir myDir; - -}; - -#include - -#endif // _AIS_Chamf3dDimension_HeaderFile diff --git a/src/AIS/AIS_Chamf3dDimension.lxx b/src/AIS/AIS_Chamf3dDimension.lxx deleted file mode 100644 index 4b1bcdc3db..0000000000 --- a/src/AIS/AIS_Chamf3dDimension.lxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_Chamf3dDimension::KindOfDimension() const -{ - return AIS_KOD_LENGTH; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_Chamf3dDimension::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_ConcentricRelation.cxx b/src/AIS/AIS_ConcentricRelation.cxx deleted file mode 100644 index bf03ae487d..0000000000 --- a/src/AIS/AIS_ConcentricRelation.cxx +++ /dev/null @@ -1,260 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_ConcentricRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ConcentricRelation::AIS_ConcentricRelation( - const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myDir = aPlane->Pln().Axis().Direction(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - TopAbs_ShapeEnum type2(mySShape.ShapeType()); - aPresentation->SetInfiniteState(Standard_True); - switch (myFShape.ShapeType()) { - case TopAbs_EDGE: - { - if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation); - else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation); - } - break; - - case TopAbs_VERTEX: - { - if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation); - else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation); - } - break; - default: {return;} - } -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Edge E; - TopoDS_Vertex V; - if (myFShape.ShapeType() == TopAbs_EDGE) { - E = TopoDS::Edge(myFShape); - V = TopoDS::Vertex(mySShape); - } - else { - E = TopoDS::Edge(mySShape); - V = TopoDS::Vertex(myFShape); - } - gp_Pnt p1,p2; - Handle(Geom_Curve) C; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - if (!AIS::ComputeGeometry(E,C,p1,p2,extCurv,isInfinite,isOnPlanEdge,myPlane)) return; - gp_Pnt P; - AIS::ComputeGeometry(V,P, myPlane, isOnPlanVertex); - - Handle(Geom_Circle) CIRCLE (Handle(Geom_Circle)::DownCast (C)); - myCenter = CIRCLE->Location(); - myRad = Min(CIRCLE->Radius()/5.,15.); - gp_Dir vec(p1.XYZ() - myCenter.XYZ() ); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); - if (!isOnPlanEdge) AIS::ComputeProjEdgePresentation(aPresentation,myDrawer,E,CIRCLE,p1,p2); - if (!isOnPlanVertex) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V,P); -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Vertex V1,V2; - V1 = TopoDS::Vertex(myFShape); - V2 = TopoDS::Vertex(myFShape); - Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True); - gp_Pnt P1,P2; - AIS::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1); - AIS::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2); - myCenter = P1; - myRad = 15.; - gp_Dir vec(myPlane->Pln().Position().XDirection()); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); - if (!isOnPlanVertex1) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V1,P1); - if (!isOnPlanVertex2) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V2,P2); -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape)); - BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape)); - - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - geom1, - geom2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) { - return; - } - - Handle(Geom_Circle) gcirc1 (Handle(Geom_Circle)::DownCast (geom1)); - Handle(Geom_Circle) gcirc2 (Handle(Geom_Circle)::DownCast (geom2)); - - myCenter = gcirc1->Location(); - - // choose the radius equal to 1/5 of the smallest radius of - // 2 circles. Limit is imposed ( 0.02 by chance) - Standard_Real aRad1 = gcirc1->Radius(); - Standard_Real aRad2 = gcirc2->Radius(); - myRad = (aRad1 > aRad2 ) ? aRad2 : aRad1; - myRad /= 5; - if (myRad > 15.) myRad =15.; - - - //Calculate a point of circle of radius myRad - gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() ); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - - DsgPrs_ConcentricPresentation::Add(aPresentation, - myDrawer, - myCenter, - myRad, - myDir, - myPnt); - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl); - } - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - //Creation of 2 sensitive circles - // the greater - gp_Ax2 ax(myCenter, myDir); - Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ; - Handle(Select3D_SensitiveCircle) - sensit = new Select3D_SensitiveCircle (own, - Circ); - aSelection->Add(sensit); - // the smaller - Circ->SetRadius(myRad/2); - sensit = new Select3D_SensitiveCircle (own, - Circ); - aSelection->Add(sensit); - - //Creation of 2 segments sensitive for the cross - Handle(Select3D_SensitiveSegment) seg; - gp_Pnt otherPnt = myPnt.Mirrored(myCenter); - seg = new Select3D_SensitiveSegment(own, - otherPnt, - myPnt); - aSelection->Add(seg); - - gp_Ax1 RotateAxis(myCenter, myDir); - gp_Pnt FPnt = myCenter.Rotated(RotateAxis, M_PI/2); - gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -M_PI/2); - seg = new Select3D_SensitiveSegment(own, - FPnt, - SPnt); - aSelection->Add(seg); - -} - diff --git a/src/AIS/AIS_ConcentricRelation.hxx b/src/AIS/AIS_ConcentricRelation.hxx deleted file mode 100644 index 8bcbccf309..0000000000 --- a/src/AIS/AIS_ConcentricRelation.hxx +++ /dev/null @@ -1,64 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_ConcentricRelation_HeaderFile -#define _AIS_ConcentricRelation_HeaderFile - -#include -#include - -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_ConcentricRelation, AIS_Relation) - -//! A framework to define a constraint by a relation of -//! concentricity between two or more interactive datums. -//! The display of this constraint is also defined. -//! A plane is used to create an axis along which the -//! relation of concentricity can be extended. -class AIS_ConcentricRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_ConcentricRelation, AIS_Relation) -public: - - //! Constructs the display object for concentric relations - //! between shapes. - //! This object is defined by the two shapes, aFShape - //! and aSShape and the plane aPlane. - //! aPlane is provided to create an axis along which the - //! relation of concentricity can be extended. - Standard_EXPORT AIS_ConcentricRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoEdgesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT void ComputeEdgeVertexConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT void ComputeTwoVerticesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myCenter; - Standard_Real myRad; - gp_Dir myDir; - gp_Pnt myPnt; - -}; - -#endif // _AIS_ConcentricRelation_HeaderFile diff --git a/src/AIS/AIS_DiameterDimension.cxx b/src/AIS/AIS_DiameterDimension.cxx deleted file mode 100644 index d9da0eac9c..0000000000 --- a/src/AIS/AIS_DiameterDimension.cxx +++ /dev/null @@ -1,386 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jacques MINOT/Odile Olivier/Sergey ZARITCHNY -// Copyright (c) 1996-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 - -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_DiameterDimension,AIS_Dimension) - -namespace -{ - static const Standard_ExtCharacter THE_DIAMETER_SYMBOL (0x00D8); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const gp_Circ& theCircle) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const gp_Circ& theCircle, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetCustomPlane (thePlane); - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const TopoDS_Shape& theShape) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const TopoDS_Shape& theShape, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetCustomPlane (thePlane); - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : AnchorPoint -//purpose : -//======================================================================= -gp_Pnt AIS_DiameterDimension::AnchorPoint() -{ - if (!IsValid()) - { - return gp::Origin(); - } - - return myAnchorPoint; -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle) -{ - myCircle = theCircle; - myGeometryType = GeometryType_Edge; - myShape = BRepLib_MakeEdge (theCircle); - myAnchorPoint = gp::Origin(); - myIsGeometryValid = IsValidCircle (myCircle); - - if (myIsGeometryValid && myIsPlaneCustom) - { - ComputeAnchorPoint(); - } - else if (!myIsPlaneCustom) - { - ComputePlane(); - myAnchorPoint = ElCLib::Value (0.0, myCircle); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape) -{ - gp_Pnt aDummyPnt (gp::Origin()); - Standard_Boolean isClosed = Standard_False; - - myGeometryType = GeometryType_UndefShapes; - myShape = theShape; - myAnchorPoint = gp::Origin(); - myIsGeometryValid = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed) - && IsValidCircle (myCircle) - && isClosed; - - if (myIsGeometryValid && myIsPlaneCustom) - { - ComputeAnchorPoint(); - } - else if (!myIsPlaneCustom) - { - ComputePlane(); - myAnchorPoint = ElCLib::Value (0.0, myCircle); - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::CheckPlane (const gp_Pln& thePlane) const -{ - // Check if the circle center point belongs to plane. - if (!thePlane.Contains (myCircle.Location(), Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - myPlane = gp_Pln (gp_Ax3 (myCircle.Position())); -} - -//======================================================================= -//function : ComputeAnchorPoint -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeAnchorPoint() -{ - // Anchor point is an intersection of dimension plane and circle. - Handle(Geom_Circle) aCircle = new Geom_Circle (myCircle); - Handle(Geom_Plane) aPlane = new Geom_Plane (myPlane); - GeomAPI_IntCS anIntersector (aCircle, aPlane); - if (!anIntersector.IsDone()) - { - myIsGeometryValid = Standard_False; - return; - } - - // The circle lays on the plane. - if (anIntersector.NbPoints() != 2) - { - myAnchorPoint = ElCLib::Value (0.0, myCircle); - myIsGeometryValid = Standard_True; - return; - } - - gp_Pnt aFirstPoint = anIntersector.Point (1); - gp_Pnt aSecondPoint = anIntersector.Point (2); - - // Choose one of two intersection points that stands with - // positive direction of flyout. - // An anchor point is supposed to be the left attachment point. - gp_Dir aFirstDir = gce_MakeDir (aFirstPoint, myCircle.Location()); - gp_Dir aDir = myPlane.Axis().Direction() ^ aFirstDir; - myAnchorPoint = (gp_Vec (aDir) * gp_Vec(myCircle.Position().Direction()) > 0.0) - ? aFirstPoint - : aSecondPoint; - -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_DiameterDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_DiameterDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_DiameterDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - return myCircle.Radius() * 2.0; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_DiameterDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - gp_Pnt aFirstPnt (gp::Origin()); - gp_Pnt aSecondPnt (gp::Origin()); - ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); - - DrawLinearDimension (thePresentation, theMode, aFirstPnt, aSecondPnt); -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) -{ - if (!IsValid()) - { - return; - } - - gp_Pnt aFirstPnt (gp::Origin()); - gp_Pnt aSecondPnt (gp::Origin()); - ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); - - ComputeLinearFlyouts (theSelection, theEntityOwner, aFirstPnt, aSecondPnt); -} - -//======================================================================= -//function : ComputeSidePoints -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeSidePoints (const gp_Circ& theCircle, - gp_Pnt& theFirstPnt, - gp_Pnt& theSecondPnt) -{ - theFirstPnt = AnchorPoint(); - - gp_Vec aRadiusVector (theCircle.Location(), theFirstPnt); - theSecondPnt = theCircle.Location().Translated (-aRadiusVector); -} - -//======================================================================= -//function : IsValidCircle -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::IsValidCircle (const gp_Circ& theCircle) const -{ - return (theCircle.Radius() * 2.0) > Precision::Confusion(); -} - -//======================================================================= -//function : IsValidAnchor -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& theAnchor) const -{ - gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); - Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); - Standard_Real aRadius = myCircle.Radius(); - - return Abs (anAnchorDist - aRadius) > Precision::Confusion() - && aCirclePlane.Contains (theAnchor, Precision::Confusion()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_DiameterDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myAnchorPoint, myCircle.Location()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} diff --git a/src/AIS/AIS_DiameterDimension.hxx b/src/AIS/AIS_DiameterDimension.hxx deleted file mode 100644 index 0217edb23b..0000000000 --- a/src/AIS/AIS_DiameterDimension.hxx +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (c) 1995-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. - - -#ifndef _AIS_DiameterDimension_HeaderFile -#define _AIS_DiameterDimension_HeaderFile - -#include -#include -#include -#include -#include -#include -#include - -class AIS_DiameterDimension; -DEFINE_STANDARD_HANDLE (AIS_DiameterDimension, AIS_Dimension) - -//! Diameter dimension. Can be constructued: -//! - On generic circle. -//! - On generic circle with user-defined anchor point on that circle -//! (dimension plane is oriented to follow the anchor point). -//! - On generic circle in the specified plane. -//! - On generic shape containing geometry that can be measured -//! by diameter dimension: circle wire, circular face, etc. -//! The anchor point is the location of the left attachement point of -//! dimension on the circle. -//! The anchor point computation is processed after dimension plane setting -//! so that positive flyout direction stands with normal of the circle and -//! the normal of the plane. -//! If the plane is user-defined the anchor point was computed as intersection -//! of the plane and the basis circle. Among two intersection points -//! the one is selected so that positive flyout direction vector and -//! the circle normal on the one side form the circle plane. -//! (corner between positive flyout directio nand the circle normal is acute.) -//! If the plane is computed automatically (by default it is the circle plane), -//! the anchor point is the zero parameter point of the circle. -//! -//! The dimension is considered as invalid if the user-defined plane -//! does not include th enachor point and th ecircle center, -//! if the diameter of the circle is less than Precision::Confusion(). -//! In case if the dimension is built on the arbitrary shape, it can be considered -//! as invalid if the shape does not contain circle geometry. -//! -class AIS_DiameterDimension : public AIS_Dimension -{ -public: - - //! Construct diameter dimension for the circle. - //! @param theCircle [in] the circle to measure. - Standard_EXPORT AIS_DiameterDimension (const gp_Circ& theCircle); - - //! Construct diameter dimension for the circle and orient it correspondingly - //! to the passed plane. - //! @param theCircle [in] the circle to measure. - //! @param thePlane [in] the plane defining preferred orientation - //! for dimension. - Standard_EXPORT AIS_DiameterDimension (const gp_Circ& theCircle, - const gp_Pln& thePlane); - - //! Construct diameter on the passed shape, if applicable. - //! @param theShape [in] the shape to measure. - Standard_EXPORT AIS_DiameterDimension (const TopoDS_Shape& theShape); - - //! Construct diameter on the passed shape, if applicable - and - //! define the preferred plane to orient the dimension. - //! @param theShape [in] the shape to measure. - //! @param thePlane [in] the plane defining preferred orientation - //! for dimension. - Standard_EXPORT AIS_DiameterDimension (const TopoDS_Shape& theShape, - const gp_Pln& thePlane); - -public: - - //! @return measured geometry circle. - const gp_Circ& Circle() const - { - return myCircle; - } - - //! @return anchor point on circle for diameter dimension. - Standard_EXPORT gp_Pnt AnchorPoint(); - - //! @return the measured shape. - const TopoDS_Shape& Shape() const - { - return myShape; - } - -public: - - //! Measure diameter of the circle. - //! The actual dimension plane is used for determining anchor points - //! on the circle to attach the dimension lines to. - //! The dimension will become invalid if the diameter of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle); - - //! Measure diameter on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_DiameterDimension,AIS_Dimension) - -protected: - - //! Override this method to change logic of anchor point computation. - //! Computes anchor point. Its computation is based on the current - //! dimension plane. Therfore, anchor point is an intersection of plane - //! and circle. - //! ATTENTION! - //! 1) The plane should be set or computed before. - //! 2) The plane should inclide th ecircle center to be valid. - Standard_EXPORT virtual void ComputeAnchorPoint(); - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if the center of the circle is on the plane. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; - -protected: - - //! Compute points on the circle sides for the dimension plane. - //! Program error exception is raised if the dimension plane "x" direction - //! is orthogonal to plane (the "impossible" case). The passed dimension plane - //! is the one specially computed to locate dimension presentation in circle. - //! @param theCircle [in] the circle. - //! @param theFirstPnt [out] the first point. - //! @param theSecondPnt [out] the second point. - Standard_EXPORT void ComputeSidePoints (const gp_Circ& theCircle, - gp_Pnt& theFirstPnt, - gp_Pnt& theSecondPnt); - - Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; - - Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& thePnt) const; - -private: - - gp_Circ myCircle; - gp_Pnt myAnchorPoint; - TopoDS_Shape myShape; -}; - -#endif // _AIS_DiameterDimension_HeaderFile diff --git a/src/AIS/AIS_Dimension.cxx b/src/AIS/AIS_Dimension.cxx deleted file mode 100755 index 4fcfd6fdd3..0000000000 --- a/src/AIS/AIS_Dimension.cxx +++ /dev/null @@ -1,1704 +0,0 @@ -// Created on: 2013-11-11 -// Created by: Anastasia BORISOVA -// Copyright (c) 2013-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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Dimension,AIS_InteractiveObject) - -namespace -{ - // default text strings - static const TCollection_ExtendedString THE_EMPTY_LABEL; - static const TCollection_AsciiString THE_UNDEFINED_UNITS; - - // default text margin and resolution - static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; - static const unsigned int THE_2D_TEXT_RESOLUTION = 72; - - // default selection priorities - static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5; - static const Standard_Integer THE_LOCAL_SEL_PRIORITY = 6; -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Dimension::AIS_Dimension (const AIS_KindOfDimension theType) -: AIS_InteractiveObject (), - mySelToleranceForText2d(0.0), - myValueType (ValueType_Computed), - myCustomValue (0.0), - myCustomStringValue (), - myIsTextPositionFixed (Standard_False), - mySpecialSymbol (' '), - myDisplaySpecialSymbol (AIS_DSS_No), - myGeometryType (GeometryType_UndefShapes), - myIsPlaneCustom (Standard_False), - myFlyout (0.0), - myIsGeometryValid (Standard_False), - myKindOfDimension (theType) -{ -} - -//======================================================================= -//function : SetCustomValue -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomValue (const Standard_Real theValue) -{ - if (myValueType == ValueType_CustomReal && myCustomValue == theValue) - { - return; - } - - myValueType = ValueType_CustomReal; - myCustomValue = theValue; - - SetToUpdate(); -} - -//======================================================================= -//function : SetCustomValue -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomValue (const TCollection_ExtendedString& theValue) -{ - if (myValueType == ValueType_CustomText && myCustomStringValue == theValue) - { - return; - } - - myValueType = ValueType_CustomText; - myCustomStringValue = theValue; - - SetToUpdate(); -} - -//======================================================================= -//function : GetCustomValue -//purpose : -//======================================================================= -const TCollection_ExtendedString& AIS_Dimension::GetCustomValue () const -{ - return myCustomStringValue; -} - -//======================================================================= -//function : GetPlane -//purpose : -//======================================================================= -const gp_Pln& AIS_Dimension::GetPlane() const -{ - return myPlane; -} - -//======================================================================= -//function : SetUserPlane -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomPlane (const gp_Pln& thePlane) -{ - myPlane = thePlane; - myIsPlaneCustom = Standard_True; - - // Disable fixed (custom) text position - UnsetFixedTextPosition(); - - // Check validity if geometry has been set already. - if (IsValid()) - { - SetToUpdate(); - } -} - -//======================================================================= -//function : SetDimensionAspect -//purpose : -//======================================================================= -void AIS_Dimension::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect) -{ - myDrawer->SetDimensionAspect (theDimensionAspect); - - SetToUpdate(); -} - -//======================================================================= -//function : SetDisplaySpecialSymbol -//purpose : -//======================================================================= -void AIS_Dimension::SetDisplaySpecialSymbol (const AIS_DisplaySpecialSymbol theDisplaySpecSymbol) -{ - if (myDisplaySpecialSymbol == theDisplaySpecSymbol) - { - return; - } - - myDisplaySpecialSymbol = theDisplaySpecSymbol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetSpecialSymbol -//purpose : -//======================================================================= -void AIS_Dimension::SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol) -{ - if (mySpecialSymbol == theSpecialSymbol) - { - return; - } - - mySpecialSymbol = theSpecialSymbol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetSelToleranceForText2d -//purpose : -//======================================================================= -void AIS_Dimension::SetSelToleranceForText2d (const Standard_Real theTol) -{ - if (mySelToleranceForText2d == theTol) - { - return; - } - - mySelToleranceForText2d = theTol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetFlyout -//purpose : -//======================================================================= -void AIS_Dimension::SetFlyout (const Standard_Real theFlyout) -{ - if (myFlyout == theFlyout) - { - return; - } - - myFlyout = theFlyout; - - // Disable fixed text position - UnsetFixedTextPosition(); - - SetToUpdate(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_Dimension::GetDisplayUnits() const -{ - return THE_UNDEFINED_UNITS; -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_Dimension::GetModelUnits() const -{ - return THE_UNDEFINED_UNITS; -} - -//======================================================================= -//function : ValueToDisplayUnits -//purpose : -//======================================================================= -Standard_Real AIS_Dimension::ValueToDisplayUnits() const -{ - return UnitsAPI::AnyToAny (GetValue(), - GetModelUnits().ToCString(), - GetDisplayUnits().ToCString()); -} - -//======================================================================= -//function : GetValueString -//purpose : -//======================================================================= -TCollection_ExtendedString AIS_Dimension::GetValueString (Standard_Real& theWidth) const -{ - TCollection_ExtendedString aValueStr; - if (myValueType == ValueType_CustomText) - { - aValueStr = myCustomStringValue; - } - else - { - // format value string using "sprintf" - TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat(); - - char aFmtBuffer[256]; - sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits()); - aValueStr = TCollection_ExtendedString (aFmtBuffer); - } - - // add units to values string - if (myDrawer->DimensionAspect()->IsUnitsDisplayed()) - { - aValueStr += " "; - aValueStr += TCollection_ExtendedString (GetDisplayUnits()); - } - - switch (myDisplaySpecialSymbol) - { - case AIS_DSS_Before : aValueStr.Insert (1, mySpecialSymbol); break; - case AIS_DSS_After : aValueStr.Insert (aValueStr.Length() + 1, mySpecialSymbol); break; - case AIS_DSS_No : break; - } - - // Get text style parameters - Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); - NCollection_Utf8String anUTFString (aValueStr.ToExtString()); - - theWidth = 0.0; - - if (myDrawer->DimensionAspect()->IsText3d()) - { - // text width produced by BRepFont - Font_BRepFont aFont; - if (aFont.FindAndInit (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aTextAspect->Height(), Font_StrictLevel_Any)) - { - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - theWidth += aFont.AdvanceX (aCurrChar, aNextChar); - } - } - } - else - { - // Text width for 1:1 scale 2D case - Font_FTFontParams aFontParams; - aFontParams.PointSize = (unsigned int )aTextAspect->Height(); - aFontParams.Resolution = THE_2D_TEXT_RESOLUTION; - if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aFontParams, Font_StrictLevel_Any)) - { - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - theWidth += (Standard_Real) aFont->AdvanceX (aCurrChar, aNextChar); - } - } - } - - return aValueStr; -} - -//======================================================================= -//function : DrawArrow -//purpose : -//======================================================================= -void AIS_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theLocation, - const gp_Dir& theDirection) -{ - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePresentation); - - Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); - Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); - - if (myDrawer->DimensionAspect()->IsArrows3d()) - { - Prs3d_Arrow::Draw (aGroup, - theLocation, - theDirection, - anAngle, - aLength); - aGroup->SetGroupPrimitivesAspect (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()); - } - else - { - gp_Pnt aLeftPoint (gp::Origin()); - gp_Pnt aRightPoint (gp::Origin()); - const gp_Dir& aPlane = GetPlane().Axis().Direction(); - - PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint); - - Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3); - - anArrow->AddVertex (aLeftPoint); - anArrow->AddVertex (theLocation); - anArrow->AddVertex (aRightPoint); - - // Set aspect for arrow triangles - Graphic3d_PolygonOffset aPolOffset; - aPolOffset.Mode = Aspect_POM_Off; - aPolOffset.Factor = 0.0f; - aPolOffset.Units = 0.0f; - Handle(Graphic3d_AspectFillArea3d) aShadingStyle = new Graphic3d_AspectFillArea3d(); - aShadingStyle->SetInteriorStyle (Aspect_IS_SOLID); - aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color()); - aShadingStyle->SetShadingModel (Graphic3d_TOSM_UNLIT); - aShadingStyle->SetPolygonOffset (aPolOffset); - - aGroup->SetPrimitivesAspect (aShadingStyle); - aGroup->AddPrimitiveArray (anArrow); - } - - SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow(); - aSensitiveArrow.Position = theLocation; - aSensitiveArrow.Direction = theDirection; -} - -//======================================================================= -//function : drawText -//purpose : -//======================================================================= -void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theTextPos, - const gp_Dir& theTextDir, - const TCollection_ExtendedString& theText, - const Standard_Integer theLabelPosition) -{ - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (myDrawer->DimensionAspect()->IsText3d()) - { - // getting font parameters - Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); - Quantity_Color aColor = aTextAspect->Aspect()->Color(); - Font_FontAspect aFontAspect = aTextAspect->Aspect()->GetTextFontAspect(); - Standard_Real aFontHeight = aTextAspect->Height(); - - // creating TopoDS_Shape for text - Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(), - aFontAspect, aFontHeight); - NCollection_Utf8String anUTFString (theText.ToExtString()); - - Font_BRepTextBuilder aBuilder; - TopoDS_Shape aTextShape = aBuilder.Perform (aFont, anUTFString); - - // compute text width with kerning - Standard_Real aTextWidth = 0.0; - Standard_Real aTextHeight = aFont.Ascender() + aFont.Descender(); - - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - aTextWidth += aFont.AdvanceX (aCurrChar, aNextChar); - } - - // formating text position in XOY plane - Standard_Integer aHLabelPos = theLabelPosition & LabelPosition_HMask; - Standard_Integer aVLabelPos = theLabelPosition & LabelPosition_VMask; - - gp_Dir aTextDir (aHLabelPos == LabelPosition_Left ? -theTextDir : theTextDir); - - // compute label offsets - Standard_Real aMarginSize = aFontHeight * THE_3D_TEXT_MARGIN; - Standard_Real aCenterHOffset = 0.0; - Standard_Real aCenterVOffset = 0.0; - switch (aHLabelPos) - { - case LabelPosition_HCenter : aCenterHOffset = 0.0; break; - case LabelPosition_Right : aCenterHOffset = aTextWidth / 2.0 + aMarginSize; break; - case LabelPosition_Left : aCenterHOffset = -aTextWidth / 2.0 - aMarginSize; break; - } - switch (aVLabelPos) - { - case LabelPosition_VCenter : aCenterVOffset = 0.0; break; - case LabelPosition_Above : aCenterVOffset = aTextHeight / 2.0 + aMarginSize; break; - case LabelPosition_Below : aCenterVOffset = -aTextHeight / 2.0 - aMarginSize; break; - } - - // compute shape offset transformation - Standard_Real aShapeHOffset = aCenterHOffset - aTextWidth / 2.0; - Standard_Real aShapeVOffset = aCenterVOffset - aTextHeight / 2.0; - - // center shape in its bounding box (suppress border spacing added by FT_Font) - Bnd_Box aShapeBnd; - BRepBndLib::AddClose (aTextShape, aShapeBnd); - - Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; - aShapeBnd.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); - - Standard_Real aXalign = aTextWidth * 0.5 - (aXmax + aXmin) * 0.5; - Standard_Real aYalign = aTextHeight * 0.5 - (aYmax + aYmin) * 0.5; - aShapeHOffset += aXalign; - aShapeVOffset += aYalign; - - gp_Trsf anOffsetTrsf; - anOffsetTrsf.SetTranslation (gp::Origin(), gp_Pnt (aShapeHOffset, aShapeVOffset, 0.0)); - aTextShape.Move (anOffsetTrsf); - - // transform text to myWorkingPlane coordinate system - gp_Ax3 aTextCoordSystem (theTextPos, GetPlane().Axis().Direction(), aTextDir); - gp_Trsf aTextPlaneTrsf; - aTextPlaneTrsf.SetTransformation (aTextCoordSystem, gp_Ax3 (gp::XOY())); - aTextShape.Move (aTextPlaneTrsf); - - // set text flipping anchors - gp_Trsf aCenterOffsetTrsf; - gp_Pnt aCenterOffset (aCenterHOffset, aCenterVOffset, 0.0); - aCenterOffsetTrsf.SetTranslation (gp::Origin(), aCenterOffset); - - gp_Pnt aCenterOfLabel (gp::Origin()); - aCenterOfLabel.Transform (aCenterOffsetTrsf); - aCenterOfLabel.Transform (aTextPlaneTrsf); - - gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir); - aGroup->SetFlippingOptions (Standard_True, aFlippingAxes); - - // draw text - if (myDrawer->DimensionAspect()->IsTextShaded()) - { - // Setting text shading and color parameters - if (!myDrawer->HasOwnShadingAspect()) - { - myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); - } - - Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT); - aShadeMat.SetAmbientColor (Quantity_NOC_BLACK); - aShadeMat.SetDiffuseColor (Quantity_NOC_BLACK); - aShadeMat.SetSpecularColor(Quantity_NOC_BLACK); - myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor); - myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor (aColor); - myDrawer->ShadingAspect()->SetMaterial (aShadeMat); - - // drawing text - StdPrs_ShadedShape::Add (thePresentation, aTextShape, myDrawer); - } - else - { - // Setting color for text - if (!myDrawer->HasOwnFreeBoundaryAspect()) - { - myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0)); - } - myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor); - - // drawing text - if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer)) - { - aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect()); - aGroup->AddPrimitiveArray (anEdges); - } - } - Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_False, gp_Ax2()); - - mySelectionGeom.TextPos = aCenterOfLabel; - mySelectionGeom.TextDir = aTextDir; - mySelectionGeom.TextWidth = aTextWidth + aMarginSize * 2.0; - mySelectionGeom.TextHeight = aTextHeight; - - return; - } - - // generate primitives for 2D text - myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION); - - Prs3d_Text::Draw (aGroup, - myDrawer->DimensionAspect()->TextAspect(), - theText, - theTextPos); - - mySelectionGeom.TextPos = theTextPos; - mySelectionGeom.TextDir = theTextDir; - mySelectionGeom.TextWidth = 0.0; - mySelectionGeom.TextHeight = 0.0; -} - -//======================================================================= -//function : DrawExtension -//purpose : -//======================================================================= -void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Real theExtensionSize, - const gp_Pnt& theExtensionStart, - const gp_Dir& theExtensionDir, - const TCollection_ExtendedString& theLabelString, - const Standard_Real theLabelWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition) -{ - // reference line for extension starting at its connection point - gp_Lin anExtensionLine (theExtensionStart, theExtensionDir); - - Standard_Boolean hasLabel = theLabelString.Length() > 0; - if (hasLabel && (theMode == ComputeMode_All || theMode == ComputeMode_Text)) - { - // compute text primitives; get its model width - gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine); - gp_Dir aTextDir = theExtensionDir; - - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - drawText (thePresentation, - aTextPos, - aTextDir, - theLabelString, - theLabelPosition); - } - - if (theMode != ComputeMode_All && theMode != ComputeMode_Line) - { - return; - } - - Standard_Boolean isShortLine = !myDrawer->DimensionAspect()->IsText3d() - || theLabelPosition & LabelPosition_VCenter; - - // compute graphical primitives and sensitives for extension line - gp_Pnt anExtStart = theExtensionStart; - gp_Pnt anExtEnd = !hasLabel || isShortLine - ? ElCLib::Value (theExtensionSize, anExtensionLine) - : ElCLib::Value (theExtensionSize + theLabelWidth, anExtensionLine); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) anExtPrimitive = new Graphic3d_ArrayOfSegments (2); - anExtPrimitive->AddVertex (anExtStart); - anExtPrimitive->AddVertex (anExtEnd); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (anExtStart); - aSensitiveCurve.Append (anExtEnd); - - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_True); - } - Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - aGroup->SetPrimitivesAspect (aDimensionLineStyle); - aGroup->AddPrimitiveArray (anExtPrimitive); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_False); - } -} - -//======================================================================= -//function : DrawLinearDimension -//purpose : -//======================================================================= -void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide) -{ - // do not build any dimension for equal points - if (theFirstPoint.IsEqual (theSecondPoint, Precision::Confusion())) - { - throw Standard_ProgramError("Can not build presentation for equal points."); - } - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // For extensions we need to know arrow size, text size and extension size: get it from aspect - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to cut dimension lines for 3d text - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - - Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); - if (IsTextPositionCustom()) - { - if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint, - anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom)) - { - throw Standard_ProgramError("Can not adjust plane to the custom label position."); - } - } - - FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos, - aLabelPosition, isArrowsExternal); - - // compute dimension line points - gp_Pnt aLineBegPoint, aLineEndPoint; - ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, aLineBegPoint, aLineEndPoint); - gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint); - - // compute arrows positions and directions - gp_Dir aFirstArrowDir = aDimensionLine.Direction().Reversed(); - gp_Dir aSecondArrowDir = aDimensionLine.Direction(); - gp_Dir aFirstExtensionDir = aDimensionLine.Direction().Reversed(); - gp_Dir aSecondExtensionDir = aDimensionLine.Direction(); - - gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); - - if (isArrowsExternal) - { - aFirstArrowDir.Reverse(); - aSecondArrowDir.Reverse(); - } - - aFirstArrowBegin = aLineBegPoint; - aSecondArrowBegin = aLineEndPoint; - aFirstArrowEnd = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength)); - aSecondArrowEnd = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength)); - - gp_Pnt aCenterLineBegin = isArrowsExternal - ? aLineBegPoint : aFirstArrowEnd; - - gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide - ? aLineEndPoint : aSecondArrowEnd; - - - switch (aLabelPosition & LabelPosition_HMask) - { - // ------------------------------------------------------------------------ // - // CENTER // - // -------------------------------------------------------------------------// - case LabelPosition_HCenter: - { - // add label on dimension or extension line to presentation - gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition - : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5; - gp_Dir aTextDir = aDimensionLine.Direction(); - - // add text primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - thePresentation->NewGroup(); - drawText (thePresentation, - aTextPos, - aTextDir, - aLabelString, - aLabelPosition); - } - - // add dimension line primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (isLineBreak ? 4 : 2); - - // compute continuous or sectioned main line segments - if (isLineBreak) - { - Standard_Real aPTextPosition = ElCLib::Parameter (aDimensionLine, aTextPos); - gp_Pnt aSection1Beg = aCenterLineBegin; - gp_Pnt aSection1End = ElCLib::Value (aPTextPosition - (aLabelWidth * 0.5), aDimensionLine); - gp_Pnt aSection2Beg = ElCLib::Value (aPTextPosition + (aLabelWidth * 0.5), aDimensionLine); - gp_Pnt aSection2End = aCenterLineEnd; - - aPrimSegments->AddVertex (aSection1Beg); - aPrimSegments->AddVertex (aSection1End); - aPrimSegments->AddVertex (aSection2Beg); - aPrimSegments->AddVertex (aSection2End); - - SelectionGeometry::Curve& aLeftSensitiveCurve = mySelectionGeom.NewCurve(); - SelectionGeometry::Curve& aRightSensitiveCurve = mySelectionGeom.NewCurve(); - aLeftSensitiveCurve.Append (aSection1Beg); - aLeftSensitiveCurve.Append (aSection1End); - aRightSensitiveCurve.Append (aSection2Beg); - aRightSensitiveCurve.Append (aSection2End); - } - else - { - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // set text label justification - Graphic3d_VerticalTextAlignment aTextJustificaton = Graphic3d_VTA_BOTTOM; - switch (aLabelPosition & LabelPosition_VMask) - { - case LabelPosition_Above : - case LabelPosition_VCenter : aTextJustificaton = Graphic3d_VTA_BOTTOM; break; - case LabelPosition_Below : aTextJustificaton = Graphic3d_VTA_TOP; break; - } - aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton); - - // main dimension line, short extension - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_True); - } - aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_False); - } - } - - // add arrows to presentation - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - } - } - - if (!isArrowsExternal) - { - break; - } - - // add arrow extension lines to presentation - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, aFirstExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - if (!theIsOneSide) - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, aSecondExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - } - break; - } - // ------------------------------------------------------------------------ // - // LEFT // - // -------------------------------------------------------------------------// - - case LabelPosition_Left: - { - // add label on dimension or extension line to presentation - { - // Left extension with the text - DrawExtension (thePresentation, anExtensionSize, - isArrowsExternal - ? aFirstArrowEnd - : aFirstArrowBegin, - aFirstExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - - // add dimension line primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - // add central dimension line - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - - aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // add arrows to presentation - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - } - } - - if (!isArrowsExternal || theIsOneSide) - { - break; - } - - // add extension lines for external arrows - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, aSecondExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - - break; - } - // ------------------------------------------------------------------------ // - // RIGHT // - // -------------------------------------------------------------------------// - - case LabelPosition_Right: - { - // add label on dimension or extension line to presentation - - // Right extension with text - DrawExtension (thePresentation, anExtensionSize, - isArrowsExternal - ? aSecondArrowEnd - : aSecondArrowBegin, - aSecondExtensionDir, - aLabelString, aLabelWidth, - theMode, - aLabelPosition); - - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - // add central dimension line - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // add arrows to presentation - { - thePresentation->NewGroup(); - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - } - } - - if (!isArrowsExternal || theIsOneSide) - { - break; - } - - // add extension lines for external arrows - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, aFirstExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - - break; - } - } - - // add flyout lines to presentation - if (theMode == ComputeMode_All) - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4); - aPrimSegments->AddVertex (theFirstPoint); - aPrimSegments->AddVertex (aLineBegPoint); - - aPrimSegments->AddVertex (theSecondPoint); - aPrimSegments->AddVertex (aLineEndPoint); - - aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - } - - mySelectionGeom.IsComputed = Standard_True; -} - -//======================================================================= -//function : ComputeFlyoutLinePoints -//purpose : -//======================================================================= -void AIS_Dimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) -{ - // compute dimension line points - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - // compute flyout direction vector - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); -} - -//======================================================================= -//function : ComputeLinearFlyouts -//purpose : -//======================================================================= -void AIS_Dimension::ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) -{ - // count flyout direction - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - - // count a flyout direction vector. - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // get flyout end points - gp_Pnt aFlyoutEnd1 = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aFlyoutEnd2 = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - // fill sensitive entity for flyouts - Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theFirstPoint, aFlyoutEnd1)); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theSecondPoint, aFlyoutEnd2)); - theSelection->Add (aSensitiveEntity); -} - -//======================================================================= -//function : CircleFromPlanarFace -//purpose : if possible computes circle from planar face -//======================================================================= -Standard_Boolean AIS_Dimension::CircleFromPlanarFace (const TopoDS_Face& theFace, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint) -{ - TopExp_Explorer anIt (theFace, TopAbs_EDGE); - for ( ; anIt.More(); anIt.Next()) - { - TopoDS_Edge aCurEdge = TopoDS::Edge (anIt.Current()); - if (AIS::ComputeGeometry (aCurEdge, theCurve, theFirstPoint, theLastPoint)) - { - if (theCurve->IsInstance (STANDARD_TYPE(Geom_Circle))) - { - return Standard_True; - } - } - } - return Standard_False; -} - -//======================================================================= -//function : CircleFromEdge -//purpose : if possible computes circle from edge -//======================================================================= -Standard_Boolean AIS_Dimension::CircleFromEdge (const TopoDS_Edge& theEdge, - gp_Circ& theCircle, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint) -{ - BRepAdaptor_Curve anAdaptedCurve (theEdge); - switch (anAdaptedCurve.GetType()) - { - case GeomAbs_Circle: - { - theCircle = anAdaptedCurve.Circle(); - break; - } - case GeomAbs_Ellipse: - { - gp_Elips anEll = anAdaptedCurve.Ellipse(); - if ((anEll.MinorRadius() - anEll.MajorRadius()) >= Precision::Confusion()) - { - return Standard_False; - } - theCircle = gp_Circ(anEll.Position(),anEll.MinorRadius()); - break; - } - case GeomAbs_Line: - case GeomAbs_Hyperbola: - case GeomAbs_Parabola: - case GeomAbs_BezierCurve: - case GeomAbs_BSplineCurve: - case GeomAbs_OtherCurve: - default: - return Standard_False; - } - - theFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter()); - theLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter()); - return Standard_True; -} - -//======================================================================= -//function : InitCircularDimension -//purpose : -//======================================================================= -Standard_Boolean AIS_Dimension::InitCircularDimension (const TopoDS_Shape& theShape, - gp_Circ& theCircle, - gp_Pnt& theMiddleArcPoint, - Standard_Boolean& theIsClosed) -{ - gp_Pln aPln; - Handle(Geom_Surface) aBasisSurf; - AIS_KindOfSurface aSurfType = AIS_KOS_OtherSurface; - gp_Pnt aFirstPoint, aLastPoint; - Standard_Real anOffset = 0.0; - Standard_Real aFirstParam = 0.0; - Standard_Real aLastParam = 0.0; - - // Discover circular geometry - switch (theShape.ShapeType()) - { - case TopAbs_FACE: - { - AIS::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset); - - if (aSurfType == AIS_KOS_Plane) - { - Handle(Geom_Curve) aCurve; - if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - - theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - } - else - { - gp_Pnt aCurPos; - BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape)); - Standard_Real aFirstU = aSurf1.FirstUParameter(); - Standard_Real aLastU = aSurf1.LastUParameter(); - Standard_Real aFirstV = aSurf1.FirstVParameter(); - Standard_Real aLastV = aSurf1.LastVParameter(); - Standard_Real aMidU = (aFirstU + aLastU) * 0.5; - Standard_Real aMidV = (aFirstV + aLastV) * 0.5; - aSurf1.D0 (aMidU, aMidV, aCurPos); - Handle (Adaptor3d_HCurve) aBasisCurve; - Standard_Boolean isExpectedType = Standard_False; - if (aSurfType == AIS_KOS_Cylinder) - { - isExpectedType = Standard_True; - } - else - { - if (aSurfType == AIS_KOS_Revolution) - { - aBasisCurve = aSurf1.BasisCurve(); - if (aBasisCurve->GetType() == GeomAbs_Line) - { - isExpectedType = Standard_True; - } - } - else if (aSurfType == AIS_KOS_Extrusion) - { - aBasisCurve = aSurf1.BasisCurve(); - if (aBasisCurve->GetType() == GeomAbs_Circle) - { - isExpectedType = Standard_True; - } - } - } - - if (!isExpectedType) - { - return Standard_False; - } - - Handle(Geom_Curve) aCurve = aBasisSurf->VIso(aMidV); - if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle)) - { - theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - } - else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve)) - { - Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve); - aFirstU = aTrimmedCurve->FirstParameter(); - aLastU = aTrimmedCurve->LastParameter(); - if (aTrimmedCurve->BasisCurve()->DynamicType() == STANDARD_TYPE (Geom_Circle)) - { - theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve->BasisCurve())->Circ(); - } - } - else - { - // Compute a circle from 3 points on "aCurve" - gp_Pnt aP1, aP2; - aSurf1.D0 (aFirstU, aMidV, aP1); - aSurf1.D0 (aLastU, aMidV, aP2); - GC_MakeCircle aMkCirc (aP1, aCurPos, aP2); - theCircle = aMkCirc.Value()->Circ(); - } - - aFirstPoint = ElCLib::Value (aFirstU, theCircle); - aLastPoint = ElCLib::Value (aLastU, theCircle); - } - break; - } - case TopAbs_WIRE: - { - TopoDS_Edge anEdge; - TopExp_Explorer anIt (theShape, TopAbs_EDGE); - if (anIt.More()) - { - anEdge = TopoDS::Edge (anIt.Current()); - } - if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - break; - } - case TopAbs_EDGE: - { - TopoDS_Edge anEdge = TopoDS::Edge (theShape); - if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - break; - } - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - case TopAbs_VERTEX: - case TopAbs_SHAPE: - default: - return Standard_False; - } - - theIsClosed = aFirstPoint.IsEqual (aLastPoint, Precision::Confusion()); - - gp_Pnt aCenter = theCircle.Location(); - - if (theIsClosed) // Circle - { - gp_Dir anXDir = theCircle.XAxis().Direction(); - theMiddleArcPoint = aCenter.Translated (gp_Vec (anXDir) * theCircle.Radius()); - } - else // Arc - { - aFirstParam = ElCLib::Parameter (theCircle, aFirstPoint); - aLastParam = ElCLib::Parameter (theCircle, aLastPoint); - if (aFirstParam > aLastParam) - { - aFirstParam -= 2.0 * M_PI; - } - - Standard_Real aParCurPos = (aFirstParam + aLastParam) * 0.5; - gp_Vec aVec = gp_Vec (aCenter, ElCLib::Value (aParCurPos, theCircle)).Normalized () * theCircle.Radius (); - theMiddleArcPoint = aCenter.Translated (aVec); - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, - const Standard_Integer theMode) -{ - if (!mySelectionGeom.IsComputed) - { - return; - } - - AIS_DimensionSelectionMode aSelectionMode = (AIS_DimensionSelectionMode)theMode; - - // init appropriate entity owner - Handle(SelectMgr_EntityOwner) aSensitiveOwner; - - switch (aSelectionMode) - { - // neutral selection owner - case AIS_DSM_All : - aSensitiveOwner = new SelectMgr_EntityOwner (this, THE_NEUTRAL_SEL_PRIORITY); - break; - - // local selection owners - case AIS_DSM_Line : - case AIS_DSM_Text : - aSensitiveOwner = new AIS_DimensionOwner (this, aSelectionMode, THE_LOCAL_SEL_PRIORITY); - break; - } - - if (aSelectionMode == AIS_DSM_All || aSelectionMode == AIS_DSM_Line) - { - // sensitives for dimension line segments - Handle(Select3D_SensitiveGroup) aGroupOfSensitives = new Select3D_SensitiveGroup (aSensitiveOwner); - - SelectionGeometry::SeqOfCurves::Iterator aCurveIt (mySelectionGeom.DimensionLine); - for (; aCurveIt.More(); aCurveIt.Next()) - { - const SelectionGeometry::HCurve& aCurveData = aCurveIt.Value(); - - TColgp_Array1OfPnt aSensitivePnts (1, aCurveData->Length()); - for (Standard_Integer aPntIt = 1; aPntIt <= aCurveData->Length(); ++aPntIt) - { - aSensitivePnts.ChangeValue (aPntIt) = aCurveData->Value (aPntIt); - } - - aGroupOfSensitives->Add (new Select3D_SensitiveCurve (aSensitiveOwner, aSensitivePnts)); - } - - Standard_Real anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); - Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); - - // sensitives for arrows - SelectionGeometry::SeqOfArrows::Iterator anArrowIt (mySelectionGeom.Arrows); - for (; anArrowIt.More(); anArrowIt.Next()) - { - const SelectionGeometry::HArrow& anArrow = anArrowIt.Value(); - - gp_Pnt aSidePnt1 (gp::Origin()); - gp_Pnt aSidePnt2 (gp::Origin()); - const gp_Dir& aPlane = GetPlane().Axis().Direction(); - const gp_Pnt& aPeak = anArrow->Position; - const gp_Dir& aDir = anArrow->Direction; - - // compute points for arrow in plane - PointsForArrow (aPeak, aDir, aPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); - - aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); - - if (!myDrawer->DimensionAspect()->IsArrows3d()) - { - continue; - } - - // compute points for orthogonal sensitive plane - gp_Dir anOrthoPlane = anArrow->Direction.Crossed (aPlane); - - PointsForArrow (aPeak, aDir, anOrthoPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); - - aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); - } - - theSelection->Add (aGroupOfSensitives); - } - - // sensitives for text element - if (aSelectionMode == AIS_DSM_All || aSelectionMode == AIS_DSM_Text) - { - Handle(Select3D_SensitiveEntity) aTextSensitive; - - gp_Ax2 aTextAxes (mySelectionGeom.TextPos, - GetPlane().Axis().Direction(), - mySelectionGeom.TextDir); - - if (myDrawer->DimensionAspect()->IsText3d()) - { - // sensitive planar rectangle for text - Standard_Real aDx = mySelectionGeom.TextWidth * 0.5; - Standard_Real aDy = mySelectionGeom.TextHeight * 0.5; - - gp_Trsf aLabelPlane; - aLabelPlane.SetTransformation (aTextAxes, gp::XOY()); - - TColgp_Array1OfPnt aRectanglePoints(1, 4); - aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); - - Poly_Array1OfTriangle aTriangles(1, 2); - aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3); - aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4); - - Handle(Poly_Triangulation) aRectanglePoly = - new Poly_Triangulation(aRectanglePoints, aTriangles); - - aTextSensitive = - new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True); - } - else - { - gp_Circ aTextGeom (aTextAxes, mySelToleranceForText2d != 0.0 - ? mySelToleranceForText2d : 1.0); - - Handle(Geom_Circle) aSensGeom = new Geom_Circle (aTextGeom); - - aTextSensitive = new Select3D_SensitiveCircle (aSensitiveOwner, aSensGeom, Standard_True); - } - - theSelection->Add (aTextSensitive); - } - - // callback for flyout sensitive calculation - if (aSelectionMode == AIS_DSM_All) - { - ComputeFlyoutSelection (theSelection, aSensitiveOwner); - } -} - -//======================================================================= -//function : PointsForArrow -//purpose : -//======================================================================= -void AIS_Dimension::PointsForArrow (const gp_Pnt& thePeakPnt, - const gp_Dir& theDirection, - const gp_Dir& thePlane, - const Standard_Real theArrowLength, - const Standard_Real theArrowAngle, - gp_Pnt& theSidePnt1, - gp_Pnt& theSidePnt2) -{ - gp_Lin anArrowLin (thePeakPnt, theDirection.Reversed()); - gp_Pnt anArrowEnd = ElCLib::Value (theArrowLength, anArrowLin); - gp_Lin anEdgeLin (anArrowEnd, theDirection.Crossed (thePlane)); - - Standard_Real anEdgeLength = Tan (theArrowAngle) * theArrowLength; - - theSidePnt1 = ElCLib::Value ( anEdgeLength, anEdgeLin); - theSidePnt2 = ElCLib::Value (-anEdgeLength, anEdgeLin); -} - -//======================================================================= -//function : GetTextPositionForLinear -//purpose : -//======================================================================= -gp_Pnt AIS_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide) const -{ - if (!IsValid()) - { - return gp::Origin(); - } - - gp_Pnt aTextPosition (gp::Origin()); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // Get label alignment and arrow orientation. - Standard_Integer aLabelPosition = 0; - Standard_Boolean isArrowsExternal = Standard_False; - FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, - aDimensionAspect->TextHorizontalPosition(), - aLabelPosition, isArrowsExternal); - - // Compute dimension line points. - gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); - gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); - - // Compute flyout direction vector - gp_Dir aFlyoutVector = aPlaneNormal ^ gp_Dir (aTargetPointsVec); - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - // Get flyout end points - gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - // Get text position. - switch (aLabelPosition & LabelPosition_HMask) - { - case LabelPosition_Left: - { - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * -anOffset; - aTextPosition = aLineEndPoint.Translated (anExtensionVec); - } - break; - case LabelPosition_Right: - { - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * anOffset; - aTextPosition = aLineBegPoint.Translated (anExtensionVec); - } - break; - case LabelPosition_HCenter: - { - aTextPosition = (aLineBegPoint.XYZ() + aLineEndPoint.XYZ()) * 0.5; - } - break; - } - - return aTextPosition; -} - -//======================================================================= -//function : AdjustParametersForLinear -//purpose : -//======================================================================= -Standard_Boolean AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout, - gp_Pln& thePlane, - Standard_Boolean& theIsPlaneOld) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); - - // Don't set new plane if the text position lies on the attachment points line. - gp_Lin aTargetPointsLin (theFirstPoint, aTargetPointsDir); - if (!aTargetPointsLin.Contains (theTextPos, Precision::Confusion())) - { - //Set new automatic plane. - thePlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint); - theIsPlaneOld = Standard_False; - } - - // Compute flyout direction vector. - gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); - gp_Dir aPositiveFlyout = aPlaneNormal ^ aTargetPointsDir; - - // Additional check of collinearity of the plane normal and attachment points vector. - if (aPlaneNormal.IsParallel (aTargetPointsDir, Precision::Angular())) - { - return Standard_False; - } - - // Set flyout. - gp_Vec aFirstToTextVec (theFirstPoint, theTextPos); - - Standard_Real aCos = aFirstToTextVec.Normalized() * gp_Vec (aTargetPointsDir); - - gp_Pnt aTextPosProj = theFirstPoint.Translated - (gp_Vec (aTargetPointsDir) * aFirstToTextVec.Magnitude() * aCos); - - // Compute flyout value and direction. - gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos); - - theFlyout = 0.0; - if (aFlyoutVector.Magnitude() > Precision::Confusion()) - { - theFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular()) - ? -aFlyoutVector.Magnitude() - : aFlyoutVector.Magnitude(); - } - - // Compute attach points (through which main dimension line passes). - gp_Pnt aFirstAttach = theFirstPoint.Translated (aFlyoutVector); - gp_Pnt aSecondAttach = theSecondPoint.Translated (aFlyoutVector); - - // Set horizontal text alignment. - if (aCos < 0.0) - { - theAlignment = Prs3d_DTHP_Left; - - Standard_Real aNewExtSize = theTextPos.Distance (aFirstAttach) - anArrowLength; - theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; - } - else if (aTextPosProj.Distance (theFirstPoint) > theFirstPoint.Distance (theSecondPoint)) - { - theAlignment = Prs3d_DTHP_Right; - - Standard_Real aNewExtSize = theTextPos.Distance (aSecondAttach) - anArrowLength; - theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; - } - else - { - theAlignment = Prs3d_DTHP_Center; - } - return Standard_True; -} - -//======================================================================= -//function : FitTextAlignmentForLinear -//purpose : -//======================================================================= -void AIS_Dimension::FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide, - const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const -{ - theLabelPosition = LabelPosition_None; - theIsArrowsExternal = Standard_False; - - // Compute dimension line points - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - - // compute flyout direction vector - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // For extensions we need to know arrow size, text size and extension size: get it from aspect - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // Add margins to cut dimension lines for 3d text - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // Handle user-defined and automatic arrow placement - switch (aDimensionAspect->ArrowOrientation()) - { - case Prs3d_DAO_External: theIsArrowsExternal = true; break; - case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; - case Prs3d_DAO_Fit: - { - // Add margin to ensure a small tail between text and arrow - Standard_Real anArrowMargin = aDimensionAspect->IsText3d() - ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN - : 0.0; - - Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); - Standard_Real anArrowsWidth = theIsOneSide - ? anArrowLength + anArrowMargin - : (anArrowLength + anArrowMargin) * 2.0; - - theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; - break; - } - } - - // Handle user-defined and automatic text placement - switch (theHorizontalTextPos) - { - case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; - case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; - case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; - case Prs3d_DTHP_Fit: - { - Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); - Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength; - Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; - - theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; - break; - } - } - - // Handle vertical text placement options - switch (aDimensionAspect->TextVerticalPosition()) - { - case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; - case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; - case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; - } -} - -//======================================================================= -//function : UnsetFixedTextPosition -//purpose : -//======================================================================= -void AIS_Dimension::UnsetFixedTextPosition() -{ - myIsTextPositionFixed = Standard_False; - myFixedTextPosition = gp::Origin(); -} diff --git a/src/AIS/AIS_Dimension.hxx b/src/AIS/AIS_Dimension.hxx deleted file mode 100755 index 6e923db2f8..0000000000 --- a/src/AIS/AIS_Dimension.hxx +++ /dev/null @@ -1,711 +0,0 @@ -// Created on: 2013-11-11 -// Created by: Anastasia BORISOVA -// Copyright (c) 2013-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. - -#ifndef _AIS_Dimension_HeaderFile -#define _AIS_Dimension_HeaderFile - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class AIS_Dimension; -DEFINE_STANDARD_HANDLE(AIS_Dimension, AIS_InteractiveObject) - -//! AIS_Dimension is a base class for 2D presentations of linear (length, diameter, radius) -//! and angular dimensions. -//! -//! The dimensions provide measurement of quantities, such as lengths or plane angles. -//! The measurement of dimension "value" is done in model space "as is". -//! These "value" are said to be represented in "model units", which can be specified by user. -//! During the display the measured value converted from "model units" to "display units". -//! The display and model units are stored in common Prs3d_Drawer (drawer of the context) -//! to share it between all dimensions. -//! The specified by user units are stored in the dimension's drawer. -//! -//! As a drawing, the dimension is composed from the following components: -//! - Attachment (binding) points. The points where the dimension lines attaches to, for -//! length dimensions the distances are measured between these points. -//! - Main dimension line. The which extends from the attachment points in "up" direction, -//! and which contains text label on it with value string. -//! - Flyouts. The lines connecting the attachment points with main dimension line. -//! - Extension. The lines used to extend the main dimension line in the cases when text -//! or arrows do not fit into the main dimension line due to their size. -//! - Arrows. -//! -//!
-//!  Linear dimensions:
-//!
-//!  extension
-//!   line                                     arrow
-//!       -->|------- main dimension line -------|<--
-//!          |                                   |
-//!          |flyout                       flyout|
-//!          |                                   |
-//!          +-----------------------------------+
-//! attachment                                attachment
-//!  point                                       point
-//!
-//!  Angular dimensions:
-//!
-//!                  extension
-//!                     line
-//!                        -->|+++++
-//!                     arrow |     +++
-//!                           |        90(deg) - main dimension line
-//!                    flyout |         +++
-//!                           |           +
-//!                           o---flyout---
-//!                         center         ^ 
-//!                         point          | extension
-//!                                          line
-//! 
-//! -//! Being a 2D drawings, the dimensions are created on imaginary plane, called "dimension plane", -//! which can be thought of as reference system of axes (X,Y,N) for constructing the presentation. -//! -//! The role of axes of the dimension plane is to guide you through the encapsualted automations -//! of presentation building to help you understand how is the presentation will look and how it -//! will be oriented in model space during construction. -//! -//! Orientation of dimension line in model space relatively to the base shapes is defined -//! with the flyouts. Flyouts specify length of flyout lines and their orientation relatively -//! to the attachment points on the working plane. -//! For linear dimensions: -//! Direction of flyouts is specified with direction of main dimension line -//! (vector from the first attachment to the second attachment) and the normal of the dimension plane. -//! Positive direction of flyouts is defined by vector multiplication: AttachVector * PlaneNormal. -//! For angular dimensions: -//! Flyouts are defined by vectors from the center point to the attachment points. -//! These vectors directions are supposed to be the positive directions of flyouts. -//! Negative flyouts directions means that these vectors should be reversed -//! (and dimension will be built out of the angle constructed with center and two attach points). -//! -//! The dimension plane can be constructed automatically by application (where possible, -//! it depends on the measured geometry). -//! It can be also set by user. However, if the user-defined plane does not fit the -//! geometry of the dimension (attach points do not belong to it), the dimension could not -//! be built. -//! If it is not possible to compute automatic plane (for example, in case of length between -//! two points) the user is supposed to specify the custom plane. -//! -//! Since the dimensions feature automated construction procedures from an arbitrary shapes, -//! the interfaces to check the validness are also implemented. Once the measured geometry is -//! specified, the one can inquire the validness status by calling "IsValid()" method. If the result -//! is TRUE, then all of public parameters should be pre-computed and ready. The presentation -//! should be also computable. Otherwise, the parameters may return invalid values. In this case, -//! the presentation will not be computed and displayed. -//! -//! The dimension support two local selection modes: main dimension line selection and text label -//! selection. These modes can be used to develop interactive modification of dimension presentations. -//! The component highlighting in these selection modes is provided by AIS_DimensionOwner class. -//! Please note that selection is unavailable until the presentation is computed. -//! -//! The specific drawing attributes are controlled through Prs3d_DimensionAspect. The one can change -//! color, arrows, text and arrow style and specify positioning of value label by setting corresponding -//! values to the aspect. -//! -//! Such set of parameters that consists of: -//! - flyout size and direction, -//! - user-defined dimension plane, -//! - horizontal and vertical text alignment -//! can be uniquely replaced with text position in 3d space. Therefore, there are methods to convert -//! this set of parameters to the text position and vice versa: -//! -//! - If the fixed text position is defined by user, called SetTextPosition (theTextPos) method converts -//! this 3d point to the set of parameters including adjusting of the dimension plane (this plane will be -//! automatic plane, NOT user-defined one). -//! If the fixed text position is set, the flag myIsFixedTextPosition is set to TRUE. -//! ATTENSION! myIsFixedTextPosition fixes all parameters of the set from recomputing inside -//! SetMeasureGeometry() methods. Parameters in dimension aspect (they are horizontal text position -//! and extension size) are adjusted on presentation computing step, user-defined values in -//! dimension aspect are not changed. -//! But plane and flyout as dimension position parameters are changed by SetTextPosition() method -//! according with user-defined text position. -//! If parameters from the set are changed by user with calls of setters, it leads to disabling of -//! fixed text position (myIsFixedTextPosition is set to FALSE). -//! If the fixed text position is set and geometry is changed by user (SetMeasureGeometry() method -//! is called) and the geometry doesn't satisfy computed dimension plane, the dimension is not valid. -//! -//! - If the set of parameters was set by user (may be without the user-defined plane or with it), -//! it can be converted to the text position by calling the method GetTextPosition(). In this case -//! the text position is NOT fixed, and SetMeasureGeometry() without user-defined plane adjusts -//! the automatic plane according input geometry (if it is possible). -//! -class AIS_Dimension : public AIS_InteractiveObject -{ -protected: - - //! Geometry type defines type of shapes on which the dimension is to be built. - //! Some type of geometry allows automatic plane computing and - //! can be built without user-defined plane - //! Another types can't be built without user-defined plane. - enum GeometryType - { - GeometryType_UndefShapes, - GeometryType_Edge, - GeometryType_Face, - GeometryType_Points, - GeometryType_Edges, - GeometryType_Faces, - GeometryType_EdgeFace, - GeometryType_EdgeVertex - }; - - //! Specifies supported at base level horizontal and vertical - //! label positions for drawing extension lines and centered text. - enum LabelPosition - { - LabelPosition_None = 0x00, - - LabelPosition_Left = 0x01, - LabelPosition_Right = 0x02, - LabelPosition_HCenter = 0x04, - LabelPosition_HMask = LabelPosition_Left | LabelPosition_Right | LabelPosition_HCenter, - - LabelPosition_Above = 0x10, - LabelPosition_Below = 0x20, - LabelPosition_VCenter = 0x40, - LabelPosition_VMask = LabelPosition_Above | LabelPosition_Below | LabelPosition_VCenter - }; - - enum ValueType - { - ValueType_Computed, - ValueType_CustomReal, - ValueType_CustomText - }; - -public: - - //! Specifies supported presentation compute modes. - //! Used to compute only parts of presentation for - //! advanced highlighting. - enum ComputeMode - { - ComputeMode_All = 0, //!< "0" is reserved as neutral mode - ComputeMode_Line = 1, //!< corresponds to selection mode - ComputeMode_Text = 2 //!< corresponds to selection mode - }; - -public: - - //! Constructor with default parameters values. - //! @param theType [in] the type of dimension. - Standard_EXPORT AIS_Dimension (const AIS_KindOfDimension theType); - - //! Gets dimension measurement value. If the value to display is not - //! specified by user, then the dimension object is responsible to - //! compute it on its own in model space coordinates. - //! @return the dimension value (in model units) which is used - //! during display of the presentation. - Standard_Real GetValue() const - { - return myValueType == ValueType_CustomReal ? myCustomValue : ComputeValue(); - } - - //! Sets computed dimension value. Resets custom value mode if it was set. - void SetComputedValue () - { - myValueType = ValueType_Computed; - } - - //! Sets user-defined dimension value. - //! The user-defined dimension value is specified in model space, - //! and affect by unit conversion during the display. - //! @param theValue [in] the user-defined value to display. - Standard_EXPORT void SetCustomValue (const Standard_Real theValue); - - //! Sets user-defined dimension value. - //! Unit conversion during the display is not applyed. - //! @param theValue [in] the user-defined value to display. - Standard_EXPORT void SetCustomValue (const TCollection_ExtendedString& theValue); - - //! Gets user-defined dimension value. - //! @return dimension value string. - Standard_EXPORT const TCollection_ExtendedString& GetCustomValue () const; - - //! Get the dimension plane in which the 2D dimension presentation is computed. - //! By default, if plane is not defined by user, it is computed automatically - //! after dimension geometry is computed. - //! If computed dimension geometry (points) can't be placed on the user-defined - //! plane, dimension geometry was set as invalid (validity flag is set to false) - //! and dimension presentation will not be computed. - //! If user-defined plane allow geometry placement on it, it will be used for - //! computing of the dimension presentation. - //! @return dimension plane used for presentation computing. - Standard_EXPORT const gp_Pln& GetPlane() const; - - //! Geometry type defines type of shapes on which the dimension is to be built. - //! @return type of geometry on which the dimension will be built. - Standard_Integer GetGeometryType () const { return myGeometryType; } - - //! Sets user-defined plane where the 2D dimension presentation will be placed. - //! Checks validity of this plane if geometry has been set already. - //! Validity of the plane is checked according to the geometry set - //! and has different criteria for different kinds of dimensions. - Standard_EXPORT virtual void SetCustomPlane (const gp_Pln& thePlane); - - //! Unsets user-defined plane. Therefore the plane for dimension will be - //! computed automatically. - void UnsetCustomPlane() { myIsPlaneCustom = Standard_False; } - - //! @return TRUE if text position is set by user with method SetTextPosition(). - Standard_Boolean IsTextPositionCustom() const - { - return myIsTextPositionFixed; - } - - //! Fixes the absolute text position and adjusts flyout, plane and text alignment - //! according to it. Updates presentation if the text position is valid. - //! ATTENTION! It does not change vertical text alignment. - //! @param theTextPos [in] the point of text position. - virtual void SetTextPosition (const gp_Pnt& /*theTextPos*/) { } - - //! Computes absolute text position from dimension parameters - //! (flyout, plane and text alignment). - virtual const gp_Pnt GetTextPosition () const { return gp_Pnt(); } - -public: - - //! Gets the dimension aspect from AIS object drawer. - //! Dimension aspect contains aspects of line, text and arrows for dimension presentation. - Handle(Prs3d_DimensionAspect) DimensionAspect() const - { - return myDrawer->DimensionAspect(); - } - - //! Sets new dimension aspect for the interactive object drawer. - //! The dimension aspect provides dynamic properties which are generally - //! used during computation of dimension presentations. - Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect); - - //! @return the kind of dimension. - AIS_KindOfDimension KindOfDimension() const - { - return myKindOfDimension; - } - - //! @return the kind of interactive. - virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE - { - return AIS_KOI_Dimension; - } - - //! Returns true if the class of objects accepts the display mode theMode. - //! The interactive context can have a default mode of representation for - //! the set of Interactive Objects. This mode may not be accepted by object. - virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE - { - return theMode == ComputeMode_All; - } - -public: - - //! @return dimension special symbol display options. - AIS_DisplaySpecialSymbol DisplaySpecialSymbol() const - { - return myDisplaySpecialSymbol; - } - - //! Specifies whether to display special symbol or not. - Standard_EXPORT void SetDisplaySpecialSymbol (const AIS_DisplaySpecialSymbol theDisplaySpecSymbol); - - //! @return special symbol. - Standard_ExtCharacter SpecialSymbol() const - { - return mySpecialSymbol; - } - - //! Specifies special symbol. - Standard_EXPORT void SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol); - - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const; - - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const; - - virtual void SetDisplayUnits (const TCollection_AsciiString& /*theUnits*/) { } - - virtual void SetModelUnits (const TCollection_AsciiString& /*theUnits*/) { } - - //! Unsets user defined text positioning and enables text positioning - //! by other parameters: text alignment, extension size, flyout and custom plane. - Standard_EXPORT void UnsetFixedTextPosition(); - -public: - - //! Returns selection tolerance for text2d: - //! For 2d text selection detection sensitive point with tolerance is used - //! Important! Only for 2d text. - Standard_Real SelToleranceForText2d() const - { - return mySelToleranceForText2d; - } - - //! Sets selection tolerance for text2d: - //! For 2d text selection detection sensitive point with tolerance is used - //! to change this tolerance use this method - //! Important! Only for 2d text. - Standard_EXPORT void SetSelToleranceForText2d (const Standard_Real theTol); - - //! @return flyout value for dimension. - Standard_Real GetFlyout() const - { - return myFlyout; - } - - //! Sets flyout value for dimension. - Standard_EXPORT void SetFlyout (const Standard_Real theFlyout); - - //! Check that the input geometry for dimension is valid and the - //! presentation can be successfully computed. - //! @return TRUE if dimension geometry is ok. - virtual Standard_Boolean IsValid() const - { - return myIsGeometryValid && CheckPlane (GetPlane()); - } - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_Dimension,AIS_InteractiveObject) - -protected: - - Standard_EXPORT Standard_Real ValueToDisplayUnits() const; - - //! Get formatted value string and its model space width. - //! @param theWidth [out] the model space with of the string. - //! @return formatted dimension value string. - Standard_EXPORT TCollection_ExtendedString GetValueString (Standard_Real& theWidth) const; - - //! Performs drawing of 2d or 3d arrows on the working plane - //! @param theLocation [in] the location of the arrow tip. - //! @param theDirection [in] the direction from the tip to the bottom of the arrow. - Standard_EXPORT void DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theLocation, - const gp_Dir& theDirection); - - //! Performs drawing of 2d or 3d text on the working plane - //! @param theTextPos [in] the position of the text label. - //! @param theTestDir [in] the direction of the text label. - //! @param theText [in] the text label string. - //! @param theLabelPosition [in] the text label vertical and horizontal positioning option - //! respectively to the main dimension line. - //! @return text width relative to the dimension working plane. For 2d text this value will be zero. - Standard_EXPORT void drawText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theTextPos, - const gp_Dir& theTextDir, - const TCollection_ExtendedString& theText, - const Standard_Integer theLabelPosition); - - //! Performs computing of dimension linear extension with text - //! @param thePresentation [in] the presentation to fill with graphical primitives. - //! @param theExtensionSize [in] the size of extension line. - //! @param theExtensionStart [in] the point where extension line connects to dimension. - //! @param theExtensionDir [in] the direction of extension line. - //! @param theLabelString [in] the string with value. - //! @param theLabelWidth [in] the geometrical width computed for value string. - //! @param theMode [in] the display mode. - //! @param theLabelPosition [in] position flags for the text label. - Standard_EXPORT void DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Real theExtensionSize, - const gp_Pnt& theExtensionStart, - const gp_Dir& theExtensionDir, - const TCollection_ExtendedString& theLabelString, - const Standard_Real theLabelWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition); - - //! Performs computing of linear dimension (for length, diameter, radius and so on). - //! Please note that this method uses base dimension properties, like working plane - //! flyout length, drawer attributes. - //! @param thePresentation [in] the presentation to fill with primitives. - //! @param theMode [in] the presentation compute mode. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theIsOneSide [in] specifies whether the dimension has only one flyout line. - Standard_EXPORT void DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide = Standard_False); - - //! Computes points bounded the flyout line for linear dimension. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theLineBegPoint [out] the first attach point of linear dimension. - //! @param theLineEndPoint [out] the second attach point of linear dimension. - Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint); - - //! Compute selection sensitives for linear dimension flyout lines (length, diameter, radius). - //! Please note that this method uses base dimension properties: working plane and flyout length. - //! @param theSelection [in] the selection structure to fill with selection primitives. - //! @param theOwner [in] the selection entity owner. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - Standard_EXPORT void ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint); - - - //! Performs initialization of circle and middle arc point from the passed - //! shape which is assumed to contain circular geometry. - //! @param theShape [in] the shape to explore. - //! @param theCircle [out] the circle geometry. - //! @param theMiddleArcPoint [out] the middle point of the arc. - //! @param theIsClosed [out] returns TRUE if the geometry is closed circle. - //! @return TRUE if the the circle is successfully got from the input shape. - Standard_EXPORT Standard_Boolean InitCircularDimension (const TopoDS_Shape& theShape, - gp_Circ& theCircle, - gp_Pnt& theMiddleArcPoint, - Standard_Boolean& theIsClosed); - - //! Produce points for triangular arrow face. - //! @param thePeakPnt [in] the arrow peak position. - //! @param theDirection [in] the arrow direction. - //! @param thePlane [in] the face plane. - //! @param theArrowLength [in] the length of arrow. - //! @param theArrowAngle [in] the angle of arrow. - //! @param theSidePnt1 [out] the first side point. - //! @param theSidePnt2 [out] the second side point. - Standard_EXPORT void PointsForArrow (const gp_Pnt& thePeakPnt, - const gp_Dir& theDirection, - const gp_Dir& thePlane, - const Standard_Real theArrowLength, - const Standard_Real theArrowAngle, - gp_Pnt& theSidePnt1, - gp_Pnt& theSidePnt2); - - //! Compute point of text position for dimension parameters - //! for linear kinds of dimensions (length, radius, diameter). - Standard_EXPORT gp_Pnt GetTextPositionForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide = Standard_False) const; - - //! Fits text alignment relatively to the dimension line. - //! @param theFirstPoint [in] the first attachment point. - //! @param theSecondPoint [in] the second attachment point. - //! @param theIsOneSide [in] is the arrow displayed only on the one side of the dimension. - //! @param theHorizontalTextPos [in] the text horizontal position (alignment). - //! @param theLabelPosition [out] the label position, contains bits that defines - //! vertical and horizontal alignment. (for internal usage in count text position) - //! @param theIsArrowExternal [out] is the arrows external, - //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow - //! orientation automatically. - Standard_EXPORT void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide, - const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const; - - //! Adjusts aspect parameters according the text position: - //! extension size, vertical text alignment and flyout. - //! @param theTextPos [in] the user defined 3d point of text position - //! @param theFirstPoint [in] the first point of linear measurement. - //! @param theSecondPoint [in] the second point of linear measurement. - //! @param theExtensionSize [out] the adjusted extension size - //! @param theAlignment [out] the horizontal label alignment. - //! @param theFlyout [out] the adjusted value of flyout. - //! @param thePlane [out] the new plane that contains theTextPos and attachment points. - //! @param theIsPlaneOld [out] shows if new plane is computed. - Standard_EXPORT Standard_Boolean AdjustParametersForLinear (const gp_Pnt& theTextPos, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout, - gp_Pln& thePlane, - Standard_Boolean& theIsPlaneOld) const; - -protected: //! @name Static auxilliary methods for geometry extraction - - //! If it is possible extracts circle from planar face. - //! @param theFace [in] the planar face - //! @param theCurve [out] the circular curve - //! @param theFirstPoint [out] the point of the first parameter of the circlular curve - //! @param theSecondPoint [out] the point of the last parameter of the circlular curve - //! @return TRUE in case of successful circle extraction - static Standard_Boolean CircleFromPlanarFace (const TopoDS_Face& theFace, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint); - - //! If it is possible extracts circle from the edge. - //! @param theEdge [in] input edge to extract circle from - //! @param theCircle [out] circle - //! @param theFirstPoint [out] the point of the first parameter of the circlular curve - //! @param theSecondPoint [out] the point of the last parameter of the circlular curve - //! @return TRUE in case of successful circle extraction. - static Standard_Boolean CircleFromEdge (const TopoDS_Edge& theEdge, - gp_Circ& theCircle, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint); - -protected: //! @name Behavior to implement - - //! Override this method to check if user-defined plane - //! is valid for the dimension geometry. - //! @param thePlane [in] the working plane for positioning every - //! dimension in the application. - //! @return true is the plane is suitable for building dimension - //! with computed dimension geometry. - virtual Standard_Boolean CheckPlane (const gp_Pln& /*thePlane*/) const { return Standard_True; } - - //! Override this method to computed value of dimension. - //! @return value from the measured geometry. - virtual Standard_Real ComputeValue() const - { - return 0.0; - } - - //! Override this method to compute selection primitives for - //! flyout lines (if the dimension provides it). - //! This callback is a only a part of base selection - //! computation routine. - virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)&, - const Handle(SelectMgr_EntityOwner)&) {} - - - //! Base procedure of computing selection (based on selection geometry data). - //! @param theSelection [in] the selection structure to will with primitives. - //! @param theMode [in] the selection mode. - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, - const Standard_Integer theMode) Standard_OVERRIDE; - -protected: //! @name Selection geometry - - //! Selection geometry of dimension presentation. The structure is filled with data - //! during compute of presentation, then this data is used to generate selection - //! sensitives when computing selection. - struct SelectionGeometry - { - //! Arrows are represented by directed triangles. - struct Arrow - { - gp_Pnt Position; - gp_Dir Direction; - }; - typedef NCollection_Sequence Curve; - typedef NCollection_Handle HCurve; - typedef NCollection_Handle HArrow; - typedef NCollection_Sequence SeqOfCurves; - typedef NCollection_Sequence SeqOfArrows; - - gp_Pnt TextPos; //!< Center of text label. - gp_Dir TextDir; //!< Direction of text label. - Standard_Real TextWidth; //!< Width of text label. - Standard_Real TextHeight; //!< Height of text label. - SeqOfCurves DimensionLine; //!< Sequence of points for composing the segments of dimension line. - SeqOfArrows Arrows; //!< Sequence of arrow geometries. - Standard_Boolean IsComputed; //!< Shows if the selection geometry was filled. - - public: - - //! Clear geometry of sensitives for the specified compute mode. - //! @param theMode [in] the compute mode to clear. - void Clear (const Standard_Integer theMode) - { - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - DimensionLine.Clear(); - Arrows.Clear(); - } - - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - TextPos = gp::Origin(); - TextDir = gp::DX(); - TextWidth = 0.0; - TextHeight = 0.0; - } - - IsComputed = Standard_False; - } - - //! Add new curve entry and return the reference to populate it. - Curve& NewCurve() - { - DimensionLine.Append( new Curve ); - HCurve& aLastCurve = DimensionLine.ChangeLast(); - return *aLastCurve; - } - - //! Add new arrow entry and return the reference to populate it. - Arrow& NewArrow() - { - Arrows.Append( new Arrow ); - HArrow& aLastArrow = Arrows.ChangeLast(); - return *aLastArrow; - } - } mySelectionGeom; - - Standard_Real mySelToleranceForText2d; //!< Sensitive point tolerance for 2d text selection. - -protected: //! @name Value properties - - ValueType myValueType; //! type of value (computed or user-defined) - Standard_Real myCustomValue; //!< Value of the dimension (computed or user-defined). - - TCollection_ExtendedString myCustomStringValue; //!< Value of the dimension (computed or user-defined). - -protected: //! @name Fixed text position properties - - gp_Pnt myFixedTextPosition; //!< Stores text position fixed by user. - Standard_Boolean myIsTextPositionFixed; //!< Is the text label position fixed by user. - -protected: //! @name Units properties - - Standard_ExtCharacter mySpecialSymbol; //!< Special symbol. - AIS_DisplaySpecialSymbol myDisplaySpecialSymbol; //!< Special symbol display options. - -protected: //! @name Geometrical properties - - GeometryType myGeometryType; //!< defines type of shapes on which the dimension is to be built. - - gp_Pln myPlane; //!< Plane where dimension will be built (computed or user defined). - Standard_Boolean myIsPlaneCustom; //!< Is plane defined by user (otherwise it will be computed automatically). - Standard_Real myFlyout; //!< Flyout distance. - Standard_Boolean myIsGeometryValid; //!< Is dimension geometry properly defined. - -private: - - AIS_KindOfDimension myKindOfDimension; -}; - -#endif // _AIS_Dimension_HeaderFile diff --git a/src/AIS/AIS_DimensionOwner.cxx b/src/AIS/AIS_DimensionOwner.cxx deleted file mode 100755 index d0ae5acc0c..0000000000 --- a/src/AIS/AIS_DimensionOwner.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-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 - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_DimensionOwner,SelectMgr_EntityOwner) - -namespace -{ - //======================================================================= - //function : HighlightMode - //purpose : Return corresponding compute mode for selection type. - //======================================================================= - static AIS_Dimension::ComputeMode HighlightMode (const Standard_Integer theSelMode) - { - switch (theSelMode) - { - case AIS_DSM_Line : return AIS_Dimension::ComputeMode_Line; - case AIS_DSM_Text : return AIS_Dimension::ComputeMode_Text; - default: - return AIS_Dimension::ComputeMode_All; - } - } -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DimensionOwner::AIS_DimensionOwner (const Handle(SelectMgr_SelectableObject)& theSelObject, - const AIS_DimensionSelectionMode theMode, - const Standard_Integer thePriority) -: SelectMgr_EntityOwner(theSelObject, thePriority), - mySelectionMode (theMode) -{ -} - -//======================================================================= -//function : AIS_DimensionSelectionMode -//purpose : -//======================================================================= -AIS_DimensionSelectionMode AIS_DimensionOwner::SelectionMode () const -{ - return mySelectionMode; -} - -//======================================================================= -//function : IsHilighted -//purpose : -//======================================================================= -Standard_Boolean AIS_DimensionOwner::IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, - const Standard_Integer /*theMode*/) const -{ - if (!HasSelectable()) - { - return Standard_False; - } - - return thePM->IsHighlighted (Selectable(), HighlightMode (mySelectionMode)); -} - -//======================================================================= -//function : Unhilight -//purpose : -//======================================================================= -void AIS_DimensionOwner::Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, - const Standard_Integer /*theMode*/) -{ - if (!HasSelectable()) - { - return; - } - - thePM->Unhighlight (Selectable()); -} - -//======================================================================= -//function : HilightWithColor -//purpose : -//======================================================================= -void AIS_DimensionOwner::HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Drawer)& theStyle, - const Standard_Integer /*theMode*/) -{ - thePM->Color (Selectable(), theStyle, HighlightMode (mySelectionMode)); -} diff --git a/src/AIS/AIS_DimensionOwner.hxx b/src/AIS/AIS_DimensionOwner.hxx deleted file mode 100644 index 1049791c7f..0000000000 --- a/src/AIS/AIS_DimensionOwner.hxx +++ /dev/null @@ -1,74 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_DimensionOwner_HeaderFile -#define _AIS_DimensionOwner_HeaderFile - -#include -#include - -#include -#include -#include -#include -#include -#include - -class SelectMgr_SelectableObject; -class PrsMgr_PresentationManager; - -DEFINE_STANDARD_HANDLE(AIS_DimensionOwner, SelectMgr_EntityOwner) - -//! The owner is the entity which makes it possible to link -//! the sensitive primitives and the reference shapes that -//! you want to detect. It stocks the various pieces of -//! information which make it possible to find objects. An -//! owner has a priority which you can modulate, so as to -//! make one entity more selectable than another. You -//! might want to make edges more selectable than -//! faces, for example. In that case, you could attribute sa -//! higher priority to the one compared to the other. An -//! edge, could have priority 5, for example, and a face, -//! priority 4. The default priority is 5. -class AIS_DimensionOwner : public SelectMgr_EntityOwner -{ - DEFINE_STANDARD_RTTIEXT(AIS_DimensionOwner, SelectMgr_EntityOwner) -public: - - //! Initializes the dimension owner, theSO, and attributes it - //! the priority, thePriority. - Standard_EXPORT AIS_DimensionOwner(const Handle(SelectMgr_SelectableObject)& theSelObject, const AIS_DimensionSelectionMode theSelMode, const Standard_Integer thePriority = 0); - - Standard_EXPORT AIS_DimensionSelectionMode SelectionMode() const; - - Standard_EXPORT virtual void HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Drawer)& theStyle, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - //! Returns true if an object with the selection mode - //! aMode is highlighted in the presentation manager aPM. - Standard_EXPORT virtual Standard_Boolean IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) const Standard_OVERRIDE; - - //! Removes highlighting from the selected part of dimension. - Standard_EXPORT virtual void Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) Standard_OVERRIDE; - -private: - - AIS_DimensionSelectionMode mySelectionMode; - -}; - -#endif // _AIS_DimensionOwner_HeaderFile diff --git a/src/AIS/AIS_DimensionSelectionMode.hxx b/src/AIS/AIS_DimensionSelectionMode.hxx deleted file mode 100644 index e8c088499f..0000000000 --- a/src/AIS/AIS_DimensionSelectionMode.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_DimensionSelectionMode_HeaderFile -#define _AIS_DimensionSelectionMode_HeaderFile - -//! Specifies dimension selection modes. -enum AIS_DimensionSelectionMode -{ -AIS_DSM_All, -AIS_DSM_Line, -AIS_DSM_Text -}; - -#endif // _AIS_DimensionSelectionMode_HeaderFile diff --git a/src/AIS/AIS_DisplaySpecialSymbol.hxx b/src/AIS/AIS_DisplaySpecialSymbol.hxx deleted file mode 100644 index 6ba30a7422..0000000000 --- a/src/AIS/AIS_DisplaySpecialSymbol.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_DisplaySpecialSymbol_HeaderFile -#define _AIS_DisplaySpecialSymbol_HeaderFile - -//! Specifies dimension special symbol display options -enum AIS_DisplaySpecialSymbol -{ -AIS_DSS_No, -AIS_DSS_Before, -AIS_DSS_After -}; - -#endif // _AIS_DisplaySpecialSymbol_HeaderFile diff --git a/src/AIS/AIS_EllipseRadiusDimension.cxx b/src/AIS/AIS_EllipseRadiusDimension.cxx deleted file mode 100644 index a5ed32f77d..0000000000 --- a/src/AIS/AIS_EllipseRadiusDimension.cxx +++ /dev/null @@ -1,293 +0,0 @@ -// Created on: 1998-01-22 -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EllipseRadiusDimension,AIS_Relation) - -//======================================================================= -//function : AIS_EllipseRadiusDimension -//purpose : -//======================================================================= -AIS_EllipseRadiusDimension::AIS_EllipseRadiusDimension(const TopoDS_Shape& aShape, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aShape; - myText = aText; -// ComputeGeometry( ); -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeGeometry() -{ - - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // compute one face case - ComputeFaceGeometry (); - break; - } - case TopAbs_EDGE: - { - ComputeEdgeGeometry (); - break; - } - default: - break; - } - while (myFirstPar > 2*M_PI) myFirstPar -= 2*M_PI; - while (myLastPar > 2*M_PI) myLastPar -= 2*M_PI; - while (myFirstPar < 0.0) myFirstPar += 2*M_PI; - while (myLastPar < 0.0) myLastPar += 2*M_PI; -} - -//======================================================================= -//function : ComputeFaceGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeFaceGeometry() -{ - - gp_Pln aPln; - Handle( Geom_Surface ) aBasisSurf; - AIS_KindOfSurface aSurfType; - Standard_Real Offset; - AIS::GetPlaneFromFace( TopoDS::Face( myFShape), - aPln, - aBasisSurf, - aSurfType, - Offset ) ; - - if ( aSurfType == AIS_KOS_Plane ) - ComputePlanarFaceGeometry( ); - else - ComputeCylFaceGeometry( aSurfType, aBasisSurf, Offset ); - -} - -//======================================================================= -//function : ComputeCylFaceGeometry -//purpose : defines Ellipse and plane of dimension -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeCylFaceGeometry(const AIS_KindOfSurface aSurfType, - const Handle( Geom_Surface )& aBasisSurf, - const Standard_Real Offset) -{ - - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - Standard_Real vFirst, vLast; - vFirst = surf1.FirstVParameter(); - vLast = surf1.LastVParameter(); - Standard_Real vMid = (vFirst + vLast)*0.5; - gp_Pln aPlane; - gp_Ax1 Axis; -// Standard_Real Param; - if (aSurfType == AIS_KOS_Extrusion) - { - Axis.SetDirection((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) - ->Direction() ); - Axis.SetLocation( gp_Pnt((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) - ->Direction().XYZ() ) ); - - aPlane.SetAxis(Axis); - aPlane.SetLocation(myEllipse.Location()); - myPlane = new Geom_Plane(aPlane); - - Handle(Geom_Curve) aCurve; - aCurve = aBasisSurf->VIso(vMid); - if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)-> Elips();//gp_Elips - myIsAnArc = Standard_False; - } - else if (aCurve->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve)) { - Handle(Geom_TrimmedCurve) tCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve); - aCurve = tCurve->BasisCurve(); - myFirstPar = tCurve->FirstParameter(); - myLastPar = tCurve->LastParameter(); - myIsAnArc = Standard_True; - if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)->Elips();//gp_Elips - } - } - else - { - throw Standard_ConstructionError("AIS:: Not expected type of surface") ; - return; - } - -// Offset - - if(surf1.GetType() == GeomAbs_OffsetSurface) - { - if(Offset <0.0 && Abs(Offset) > myEllipse.MinorRadius ()) - { - throw Standard_ConstructionError("AIS:: Absolute value of negative offset is larger than MinorRadius"); - return; - } - - myOffsetCurve = new Geom_OffsetCurve(new Geom_Ellipse(myEllipse), Offset, - myPlane->Pln().Axis().Direction()); - myOffset = Offset; - myIsOffset = Standard_True; - gp_Elips elips = myEllipse; - Standard_Real Val = Offset + elips.MajorRadius ();//simulation - myEllipse.SetMajorRadius (Val); - Val = Offset + elips.MinorRadius (); - myEllipse.SetMinorRadius (Val); - } - else - myIsOffset = Standard_False; - } -} - - -//======================================================================= -//function : ComputePlanarFaceGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputePlanarFaceGeometry() -{ - - Standard_Boolean find = Standard_False; - gp_Pnt ptfirst,ptend; - TopExp_Explorer ExploEd( TopoDS::Face(myFShape), TopAbs_EDGE ); - for ( ; ExploEd.More(); ExploEd.Next()) - { - TopoDS_Edge curedge = TopoDS::Edge( ExploEd.Current() ); - Handle(Geom_Curve) curv; - Handle(Geom_Ellipse) ellips; - if (AIS::ComputeGeometry(curedge,curv,ptfirst,ptend)) - { - if (curv->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - ellips = Handle(Geom_Ellipse)::DownCast(curv); - if ( !ellips.IsNull() ) { - myEllipse = ellips->Elips(); - find = Standard_True; - break; - } - } - } - } - if( !find ) - { - throw Standard_ConstructionError("AIS:: Curve is not an ellipsee or is Null") ; - return; - } - - if ( !ptfirst.IsEqual(ptend, Precision::Confusion()) ) - { - myIsAnArc = Standard_True; - myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); - myLastPar = ElCLib::Parameter(myEllipse, ptend); - } - else - myIsAnArc = Standard_False; - - BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); - myPlane = new Geom_Plane( surfAlgo.Plane() ); - -} - - - -//======================================================================= -//function : ComputeEdgeGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeEdgeGeometry() -{ - gp_Pnt ptfirst,ptend; - Handle(Geom_Curve) curv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape),curv,ptfirst,ptend)) return; - - Handle(Geom_Ellipse) elips = Handle(Geom_Ellipse)::DownCast(curv); - if ( elips.IsNull()) return; - - myEllipse = elips->Elips(); - gp_Pln aPlane; - aPlane.SetPosition(gp_Ax3(myEllipse.Position())); - myPlane = new Geom_Plane(aPlane); - - - if ( ptfirst.IsEqual(ptend, Precision::Confusion()) ) { - myIsAnArc = Standard_False; - } - else { - myIsAnArc = Standard_True; - myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); - myLastPar = ElCLib::Parameter(myEllipse, ptend); - } -} -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= - AIS_KindOfDimension AIS_EllipseRadiusDimension::KindOfDimension() const -{ - return AIS_KOD_ELLIPSERADIUS; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= - Standard_Boolean AIS_EllipseRadiusDimension::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_EllipseRadiusDimension.hxx b/src/AIS/AIS_EllipseRadiusDimension.hxx deleted file mode 100644 index cb04856c3b..0000000000 --- a/src/AIS/AIS_EllipseRadiusDimension.hxx +++ /dev/null @@ -1,94 +0,0 @@ -// Created on: 1998-01-22 -// 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. - -#ifndef _AIS_EllipseRadiusDimension_HeaderFile -#define _AIS_EllipseRadiusDimension_HeaderFile - -#include -#include - -#include -#include -#include -#include -#include -#include -class Geom_OffsetCurve; -class TopoDS_Shape; -class TCollection_ExtendedString; -class Geom_Surface; - - -class AIS_EllipseRadiusDimension; -DEFINE_STANDARD_HANDLE(AIS_EllipseRadiusDimension, AIS_Relation) - - -//! Computes geometry ( basis curve and plane of dimension) -//! for input shape aShape from TopoDS -//! Root class for MinRadiusDimension and MaxRadiusDimension -class AIS_EllipseRadiusDimension : public AIS_Relation -{ - -public: - - - Standard_EXPORT virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - Standard_EXPORT void ComputeGeometry(); - - - - - DEFINE_STANDARD_RTTIEXT(AIS_EllipseRadiusDimension,AIS_Relation) - -protected: - - - Standard_EXPORT AIS_EllipseRadiusDimension(const TopoDS_Shape& aShape, const TCollection_ExtendedString& aText); - - gp_Elips myEllipse; - Standard_Real myFirstPar; - Standard_Real myLastPar; - Standard_Boolean myIsAnArc; - Handle(Geom_OffsetCurve) myOffsetCurve; - Standard_Real myOffset; - Standard_Boolean myIsOffset; - - -private: - - - Standard_EXPORT void ComputeFaceGeometry(); - - Standard_EXPORT void ComputeCylFaceGeometry (const AIS_KindOfSurface aSurfType, const Handle(Geom_Surface)& aSurf, const Standard_Real Offset); - - Standard_EXPORT void ComputePlanarFaceGeometry(); - - Standard_EXPORT void ComputeEdgeGeometry(); - - - -}; - - - - - - - -#endif // _AIS_EllipseRadiusDimension_HeaderFile diff --git a/src/AIS/AIS_EqualDistanceRelation.cxx b/src/AIS/AIS_EqualDistanceRelation.cxx deleted file mode 100644 index 39fbb700ca..0000000000 --- a/src/AIS/AIS_EqualDistanceRelation.cxx +++ /dev/null @@ -1,803 +0,0 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EqualDistanceRelation,AIS_Relation) - -//======================================================================= -//function : AIS_EqualDistanceRelation -//purpose : -//======================================================================= -AIS_EqualDistanceRelation::AIS_EqualDistanceRelation( const TopoDS_Shape& aShape1, - const TopoDS_Shape& aShape2, - const TopoDS_Shape& aShape3, - const TopoDS_Shape& aShape4, - const Handle( Geom_Plane )& aPlane ) - :AIS_Relation() -{ - myFShape = aShape1; - mySShape = aShape2; - myShape3 = aShape3; - myShape4 = aShape4; - myPlane = aPlane; - - //Temporary - myArrowSize = 3.0; //set the concrete value - mySymbolPrs = DsgPrs_AS_BOTHAR; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, - const Handle( Prs3d_Presentation )& aPresentation, - const Standard_Integer ) -{ - gp_Pnt Position12 = myPosition, Position34 = myPosition; - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); -// -- ota -- begin - if (!myAutomaticPosition ){ - gp_Pnt aMiddle12 ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); - gp_Pnt aMiddle34 ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); - - if (myPosition.Distance(aMiddle12) > myPosition.Distance(aMiddle34)) - Position12.SetXYZ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); - else - Position34.SetXYZ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); - - } - - if (myFShape.ShapeType() == TopAbs_EDGE && mySShape.ShapeType() == TopAbs_EDGE) - AIS_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, - myDrawer, - myArrowSize, - TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - - - else if (myFShape.ShapeType() == TopAbs_VERTEX && mySShape.ShapeType() == TopAbs_VERTEX) - AIS_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, - myDrawer, - myArrowSize, - TopoDS::Vertex(myFShape), - TopoDS::Vertex(mySShape), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - AIS_TOD_Unknown, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - else - AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, - myDrawer, - myArrowSize, - myFShape, - mySShape, - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - - if (myShape3.ShapeType() == TopAbs_EDGE && myShape4.ShapeType() == TopAbs_EDGE) - AIS_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, - myDrawer, - myArrowSize, - TopoDS::Edge(myShape3), - TopoDS::Edge(myShape4), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - else if (myShape3.ShapeType() == TopAbs_VERTEX && myShape4.ShapeType() == TopAbs_VERTEX) - AIS_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, - myDrawer, - myArrowSize, - TopoDS::Vertex(myShape3), - TopoDS::Vertex(myShape4), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - AIS_TOD_Unknown, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - else - AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, - myDrawer, - myArrowSize, - myShape3, - myShape4, - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - DsgPrs_EqualDistancePresentation::Add( aPresentation, myDrawer, - myPoint1, myPoint2, myPoint3, myPoint4, myPlane ); -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, - const Standard_Integer ) -{ - Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); - Handle( Select3D_SensitiveSegment ) seg; - - seg = new Select3D_SensitiveSegment( own, myPoint1, myPoint2 ); - aSelection->Add( seg ); - - seg = new Select3D_SensitiveSegment( own, myPoint3, myPoint4 ); - aSelection->Add( seg ); - - // Line between two middles - gp_Pnt Middle12( (myPoint1.XYZ() + myPoint2.XYZ()) * 0.5 ), - Middle34( (myPoint3.XYZ() + myPoint4.XYZ()) *0.5 ); - seg = new Select3D_SensitiveSegment( own, Middle12, Middle34 ); - aSelection->Add( seg ); - - gp_Pnt Middle((Middle12.XYZ() + Middle34.XYZ())*0.5); - Standard_Real SmallDist = .001; - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - Middle.X() - SmallDist, - Middle.Y() - SmallDist, - Middle.Z() - SmallDist, - Middle.X() + SmallDist, - Middle.Y() + SmallDist, - Middle.Z() + SmallDist ); - aSelection->Add(box); - - if (myFShape.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myFShape)); - if (aCurve.GetType() == GeomAbs_Line){ - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint1), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint1); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); - aSelection->Add( seg ); - } - - if (mySShape.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(mySShape)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint2), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint2); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); - aSelection->Add( seg ); - } - - if (myShape3.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape3)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint3), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint3); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - - if (myShape4.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape4)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint4), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint4); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); - aSelection->Add( seg ); - } -} - -//======================================================================= -//function : ComputeTwoEdgesLength -//purpose : -//======================================================================= -void AIS_EqualDistanceRelation::ComputeTwoEdgesLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Edge & FirstEdge, - const TopoDS_Edge & SecondEdge, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box & BndBox, - gp_Pnt& Position, - gp_Pnt& FirstAttach, - gp_Pnt& SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide & SymbolPrs ) -{ - gp_Dir DirAttach; - BRepAdaptor_Curve cu1( FirstEdge ); - BRepAdaptor_Curve cu2( SecondEdge ); - - // 3d lines - Handle(Geom_Curve) geom1,geom2; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - - Standard_Boolean isInfinite1(Standard_False),isInfinite2(Standard_False); - Handle(Geom_Curve) extCurv; - Standard_Real arrsize = ArrowSize;// size - Standard_Real Val=0.; - Standard_Boolean isInPlane1, isInPlane2; - - if(!AIS::ComputeGeometry(FirstEdge,geom1, ptat11, ptat12,extCurv,isInfinite1,isInPlane1, Plane )) - return; - if(!AIS::ComputeGeometry(SecondEdge, geom2, ptat21, ptat22, extCurv, isInfinite2,isInPlane2, Plane)) - return; - - aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); - - if (cu1.GetType() == GeomAbs_Line && cu2.GetType() == GeomAbs_Line) - { - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - const gp_Lin& l1 = geom_lin1->Lin(); - const gp_Lin& l2 = geom_lin2->Lin(); - - //Get Val value - Val = l1.Distance( l2 ); - - DirAttach = l1.Direction(); - - if (AutomaticPos) { - // compute position of offset point - gp_Pnt curpos; - Standard_Real par1=0., par2=0.; - if(!(isInfinite1 || isInfinite2)) - { - par1 = ElCLib::Parameter(l1,ptat11); - par2 = ElCLib::Parameter(l1,ptat21); - if (par1 Pln() ); - } - - // find attach points - if (!isInfinite1) { - if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12; - else FirstAttach = ptat11; - } - else { - FirstAttach = ElCLib::Value(ElCLib::Parameter(l1,Position),l1); - } - - if (!isInfinite2) { - if (Position.Distance(ptat21) > Position.Distance(ptat22)) SecondAttach = ptat22; - else SecondAttach = ptat21; - } - else { - SecondAttach = ElCLib::Value(ElCLib::Parameter(l2,Position),l2); - } - - Standard_Real confusion(Precision::Confusion()); - if (arrsize < confusion) arrsize = Val*0.1; - if (Abs(Val) <= confusion) {arrsize = 0.;} - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(arrsize); - arr = la->ArrowAspect(); - arr->SetLength(arrsize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, - SecondExtreme); - - -} - if (cu1.GetType() == GeomAbs_Circle && cu2.GetType() == GeomAbs_Circle){ - //Get first and last points of circles - Handle(Geom_Circle) aCir1 (Handle(Geom_Circle)::DownCast(geom1)); - Handle(Geom_Circle) aCir2 (Handle(Geom_Circle)::DownCast(geom2)); - gp_Circ aCirc1 = aCir1->Circ(); - gp_Circ aCirc2 = aCir2->Circ(); - - //To avoid circles with different orientaion - Standard_Real aTol = Precision::Confusion(); - if(aCirc2.Axis().IsOpposite(aCirc1.Axis(), aTol) || - aCirc2.XAxis().IsOpposite(aCirc1.XAxis(), aTol) || - aCirc2.YAxis().IsOpposite(aCirc1.YAxis(), aTol) ) - { - aCirc2.SetPosition(aCirc1.Position()); - aCirc2.SetAxis(aCirc1.Axis()); - } - - if (AutomaticPos){ - Standard_Real par1 = 0, par2 = 0; - gp_Pln aPln = Plane->Pln(); - //Project ptat12 and ptat22 on constraint plane - gp_Pnt PrPnt12 = AIS::ProjectPointOnPlane(ptat12, aPln); - gp_Pnt PrPnt22 = AIS::ProjectPointOnPlane(ptat22, aPln); - //Project circles center on constraint plane - gp_Pnt PrCenter = AIS::ProjectPointOnPlane(aCirc1.Location(), aPln); - - gp_Dir XDir = aPln.XAxis().Direction(); - gp_Dir YDir = aPln.YAxis().Direction(); - - - if (PrPnt12.Distance(PrCenter) >Precision::Confusion()) - { - gp_Dir aDir1(PrPnt12.XYZ() - PrCenter.XYZ()); - Standard_Real anAngle = aDir1.Angle(XDir); //Get the angle in range [0, M_PI] - if (aDir1.Dot(YDir) < 0) - anAngle = 2 * M_PI - anAngle; - par1 = anAngle; - } - - if (PrPnt22.Distance(PrCenter) >Precision::Confusion()) - { - gp_Dir aDir2(PrPnt22.XYZ() - PrCenter.XYZ()); - Standard_Real anAngle = aDir2.Angle(XDir); //Get the angle in range [0, M_PI] - if (aDir2.Dot(YDir) < 0) - anAngle = 2 * M_PI - anAngle; - par2 = anAngle; - } - - - if(par1 > par2 ){ - FirstExtreme = ptat12; - Standard_Real aPar1 = ElCLib::Parameter(aCirc2, ptat12); - SecondExtreme = ElCLib::Value(aPar1, aCirc2); - } - else { - Standard_Real aPar2 = ElCLib::Parameter(aCirc1, ptat22); - FirstExtreme = ElCLib::Value(aPar2, aCirc1); - SecondExtreme = ptat22; - } - } - else { - Standard_Real pospar = ElCLib::Parameter(aCirc1, Position); - FirstExtreme = ElCLib::Value(pospar, aCirc1); - pospar = ElCLib::Parameter(aCirc2, Position); - SecondExtreme = ElCLib::Value(pospar, aCirc2); - } - - DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, - aDrawer, - aCirc1, - aCirc2, - ptat12, - FirstExtreme, - ptat22, - SecondExtreme, - SymbolPrs); - - FirstAttach = ptat12; SecondAttach = ptat22; //assign attach points - Position.SetXYZ( (FirstAttach.XYZ() + SecondAttach.XYZ())*0.5); - } - - if (arrsize < Precision::Confusion()) arrsize = Val*0.1; - if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} - -// gp_Pnt pf, pl; - if (!isInPlane1) { - AIS::ComputeProjEdgePresentation( aPresentation, aDrawer, FirstEdge, geom1, ptat11, ptat12); - } - if(!isInPlane2) { - AIS::ComputeProjEdgePresentation( aPresentation, aDrawer, SecondEdge, geom2, ptat21, ptat22); - } -} - -//======================================================================= -//function : ComputeTwoVerticesLength -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeTwoVerticesLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Vertex& FirstVertex, - const TopoDS_Vertex& SecondVertex, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box& BndBox, - const AIS_TypeOfDist TypeDist, - gp_Pnt& Position, - gp_Pnt& FirstAttach, - gp_Pnt& SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide& SymbolPrs ) -{ - Standard_Boolean isOnPlane1, isOnPlane2; - gp_Dir DirAttach; - AIS::ComputeGeometry( FirstVertex, FirstAttach, Plane, isOnPlane1); - AIS::ComputeGeometry( SecondVertex, SecondAttach, Plane, isOnPlane2); - - Standard_Real confusion(Precision::Confusion()); - Standard_Boolean samePoint(FirstAttach.IsEqual(SecondAttach,confusion)); - - if (TypeDist == AIS_TOD_Vertical) DirAttach = Plane->Pln().XAxis().Direction(); - else if (TypeDist == AIS_TOD_Horizontal) DirAttach = Plane->Pln().YAxis().Direction(); - else { - if (!samePoint) { - DirAttach.SetXYZ(SecondAttach.XYZ() - FirstAttach.XYZ()); - DirAttach.Rotate(Plane->Pln().Axis(),M_PI/2.); - } - } - - // size - if (AutomaticPos) { - if (!samePoint) { - gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())*0.5); - // make offset of curpos - gp_Vec offset(DirAttach); - offset = offset*ArrowSize*(-10.); - curpos.Translate(offset); - Position = curpos; - } - else { - gp_Dir aDir = Plane->Pln().Axis().Direction(); - gp_Vec aVec (aDir.XYZ()*10*ArrowSize); - //Position = gp_Pnt(FirstAttach.XYZ()+gp_XYZ(1.,1.,1.)); // not correct - Position = FirstAttach.Translated(aVec); - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );//not needed really - DirAttach.SetXYZ(Position.XYZ() - FirstAttach.XYZ()); - } - } - else { - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() ); - } - - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(ArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(ArrowSize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, //returned - SecondExtreme); //returned - - // Compute projection - if ( !isOnPlane1) - AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach); - if ( !isOnPlane2) - AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, SecondVertex, SecondAttach); - -} - - -//======================================================================= -//function : ComputeOneEdgeOneVertexLength -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Shape & FirstShape, - const TopoDS_Shape & SecondShape, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box & BndBox, - gp_Pnt & Position, - gp_Pnt & FirstAttach, - gp_Pnt & SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide & SymbolPrs ) -{ - TopoDS_Vertex thevertex; - TopoDS_Edge theedge; - - gp_Pnt ptonedge1,ptonedge2; - Handle(Geom_Curve) aCurve; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Real Val; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - Standard_Integer edgenum ; - - if (FirstShape.ShapeType() == TopAbs_VERTEX) { - thevertex = TopoDS::Vertex(FirstShape); - theedge = TopoDS::Edge(SecondShape); - edgenum = 2; //edge is the second shape - } - else { - thevertex = TopoDS::Vertex(SecondShape); - theedge = TopoDS::Edge(FirstShape); - edgenum = 1;//edge is the first shape - } - if (!AIS::ComputeGeometry(theedge,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,Plane)) - return; - aPresentation->SetInfiniteState(isInfinite); - AIS::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex); - - if ( aCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - Handle(Geom_Line) geom_lin (Handle(Geom_Line)::DownCast (aCurve)); - const gp_Lin& l = geom_lin->Lin(); - - // computation of Val - Val = l.Distance( FirstAttach ); - - gp_Dir DirAttach = l.Direction(); - // size - Standard_Real arrsize = ArrowSize; - if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} - - if (AutomaticPos) { - gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l); - gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())*0.5); - // make offset - gp_Vec offset(DirAttach); - offset = offset*ArrowSize*(-10.); - curpos.Translate(offset); - Position = curpos; - } - else { // project point on the plane - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() ); - } - - if (!isInfinite) { - if (Position.Distance(ptonedge1) > Position.Distance(ptonedge2)) SecondAttach = ptonedge2; - else SecondAttach = ptonedge1; - } - else { - SecondAttach = ElCLib::Value(ElCLib::Parameter(l,Position),l); - } - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(arrsize); - arr = la->ArrowAspect(); - arr->SetLength(arrsize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, - SecondExtreme); - -} - if (aCurve->IsInstance(STANDARD_TYPE(Geom_Circle))){ - gp_Circ aCirc1 = (Handle(Geom_Circle)::DownCast(aCurve))->Circ(); - gp_Circ aCirc2(aCirc1); aCirc2.SetRadius(0); //create the second formal circle - if(AutomaticPos) - { - SecondAttach = ptonedge2; //a vertex - Position.SetXYZ((SecondAttach.XYZ() + aCirc1.Location().XYZ())*0.5); - } - else { - Standard_Real aPar = ElCLib::Parameter(aCirc1, Position); - SecondAttach = ElCLib::Value(aPar, aCirc1); - } - - Handle(Geom_Circle) aCurve2 = new Geom_Circle(aCirc2); - DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, - aDrawer, - aCirc1, //circle or arc - aCirc2, //really vertex - ptonedge2, //last point of aCirc1 - SecondAttach, - FirstAttach, //vertex really - FirstAttach, - SymbolPrs); - - //Assign arc points - if (edgenum == 1){ - FirstExtreme = SecondAttach; SecondExtreme = FirstAttach; - SecondAttach = FirstAttach; FirstAttach = ptonedge2; - } else { //vertex is the first shape, circle is sthe last. - FirstExtreme = FirstAttach; SecondExtreme = SecondAttach; - SecondAttach = ptonedge2; - } - } - - // computation of Val - Val = FirstAttach.Distance(SecondAttach); - - //Display the pieces of attached to the curve if it is not - // in the WP - if (!isOnPlanEdge) { // add presentation of projection of the edge in WP - AIS::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2); - } - if (!isOnPlanVertex) { // add presentation of projection of the vertex in WP - AIS::ComputeProjVertexPresentation(aPresentation,aDrawer,thevertex,FirstAttach); - } - -} -// -- ota -- end diff --git a/src/AIS/AIS_EqualDistanceRelation.hxx b/src/AIS/AIS_EqualDistanceRelation.hxx deleted file mode 100644 index 644afd1b0f..0000000000 --- a/src/AIS/AIS_EqualDistanceRelation.hxx +++ /dev/null @@ -1,99 +0,0 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// 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. - -#ifndef _AIS_EqualDistanceRelation_HeaderFile -#define _AIS_EqualDistanceRelation_HeaderFile - -#include -#include -#include - -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_EqualDistanceRelation, AIS_Relation) - -//! A framework to display equivalent distances between -//! shapes and a given plane. -//! The distance is the length of a projection from the -//! shape to the plane. -//! These distances are used to compare shapes by this vector alone. -class AIS_EqualDistanceRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_EqualDistanceRelation,AIS_Relation) -public: - - //! Constructs a framework to display equivalent - //! distances between the shapes aShape1, aShape2, - //! aShape3, aShape4 and the plane aPlane. - //! The distance is the length of a projection from the - //! shape to the plane. - Standard_EXPORT AIS_EqualDistanceRelation(const TopoDS_Shape& aShape1, const TopoDS_Shape& aShape2, const TopoDS_Shape& aShape3, const TopoDS_Shape& aShape4, const Handle(Geom_Plane)& aPlane); - - - //! Sets the shape aShape to be used as the shape - //! aShape3 in the framework created at construction time. - void SetShape3 (const TopoDS_Shape& aShape); - - - //! Returns the shape aShape3 from the framework - //! created at construction time. - const TopoDS_Shape& Shape3() const; - - - //! Sets the shape aShape to be used as the shape - //! aShape4 in the framework created at construction time. - void SetShape4 (const TopoDS_Shape& aShape); - - - //! Returns the shape aShape4 from the framework - //! created at construction time. - const TopoDS_Shape& Shape4() const; - - //! Computes the location of an intreval between - //! between two edges. FirstAttach , SecondAttach - //! are the returned extreme points of the interval. - Standard_EXPORT static void ComputeTwoEdgesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Edge& FirstEdge, const TopoDS_Edge& SecondEdge, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - - //! Computes the interval position between two vertexs. FirstAttach, - //! SecondAttach are the returned extreme points of the interval. - Standard_EXPORT static void ComputeTwoVerticesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Vertex& FirstVertex, const TopoDS_Vertex& SecondVertex, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, const AIS_TypeOfDist TypeDist, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - - //! Compute the interval location between a vertex and an edge. Edge may be - //! a line or a circle. - Standard_EXPORT static void ComputeOneEdgeOneVertexLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - TopoDS_Shape myShape3; - TopoDS_Shape myShape4; - gp_Pnt myAttachPoint1; - gp_Pnt myAttachPoint2; - gp_Pnt myAttachPoint3; - gp_Pnt myAttachPoint4; - gp_Pnt myPoint1; - gp_Pnt myPoint2; - gp_Pnt myPoint3; - gp_Pnt myPoint4; - -}; - -#include - -#endif // _AIS_EqualDistanceRelation_HeaderFile diff --git a/src/AIS/AIS_EqualDistanceRelation.lxx b/src/AIS/AIS_EqualDistanceRelation.lxx deleted file mode 100644 index 3d06e6843e..0000000000 --- a/src/AIS/AIS_EqualDistanceRelation.lxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// 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. - -//======================================================================= -//function : SetShape3 -//purpose : -//======================================================================= - -inline void AIS_EqualDistanceRelation::SetShape3( const TopoDS_Shape& aShape ) -{ - myShape3 = aShape; -} - -//======================================================================= -//function : Shape3 -//purpose : -//======================================================================= - -inline const TopoDS_Shape& AIS_EqualDistanceRelation::Shape3() const -{ - return myShape3; -} - - -//======================================================================= -//function : SetShape4 -//purpose : -//======================================================================= - -inline void AIS_EqualDistanceRelation::SetShape4( const TopoDS_Shape& aShape ) -{ - myShape4 = aShape; -} - -//======================================================================= -//function : Shape4 -//purpose : -//======================================================================= - -inline const TopoDS_Shape& AIS_EqualDistanceRelation::Shape4() const -{ - return myShape4; -} - diff --git a/src/AIS/AIS_EqualRadiusRelation.cxx b/src/AIS/AIS_EqualRadiusRelation.cxx deleted file mode 100644 index 4a1dfea6a0..0000000000 --- a/src/AIS/AIS_EqualRadiusRelation.cxx +++ /dev/null @@ -1,223 +0,0 @@ -// Created on: 1998-01-20 -// Created by: Julia GERASIMOVA -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EqualRadiusRelation,AIS_Relation) - -//======================================================================= -//function : AIS_EqualRadiusRelation -//purpose : -//======================================================================= -AIS_EqualRadiusRelation::AIS_EqualRadiusRelation( const TopoDS_Edge& aFirstEdge, - const TopoDS_Edge& aSecondEdge, - const Handle( Geom_Plane )& aPlane ) - :AIS_Relation() -{ - myFShape = aFirstEdge; - mySShape = aSecondEdge; - myPlane = aPlane; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_EqualRadiusRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, - const Handle( Prs3d_Presentation )& aPresentation, - const Standard_Integer ) -{ - BRepAdaptor_Curve FirstCurve( TopoDS::Edge( myFShape ) ), SecondCurve( TopoDS::Edge( mySShape ) ); - - Standard_Real FirstPar1 = FirstCurve.FirstParameter(), LastPar1 = FirstCurve.LastParameter(), - FirstPar2 = SecondCurve.FirstParameter(), LastPar2 = SecondCurve.LastParameter(); - - Handle( Geom_Curve ) FirstProjCurve = FirstCurve.Curve().Curve(), - SecondProjCurve = SecondCurve.Curve().Curve(); - gp_Pnt FirstPoint1, LastPoint1, FirstPoint2, LastPoint2; - Standard_Boolean isFirstOnPlane, isSecondOnPlane; - - AIS::ComputeGeomCurve( FirstProjCurve, FirstPar1, LastPar1, FirstPoint1, LastPoint1, myPlane, isFirstOnPlane ); - AIS::ComputeGeomCurve( SecondProjCurve, FirstPar2, LastPar2, FirstPoint2, LastPoint2, myPlane, isSecondOnPlane ); - - if (!isFirstOnPlane) - ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( myFShape ), FirstProjCurve, FirstPoint1, LastPoint1 ); - if (! isSecondOnPlane) - ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( mySShape ), SecondProjCurve, FirstPoint2, LastPoint2 ); - - gp_Circ FirstCirc = (Handle( Geom_Circle )::DownCast( FirstProjCurve ))->Circ(); - gp_Circ SecondCirc = (Handle( Geom_Circle )::DownCast( SecondProjCurve ))->Circ(); - - myFirstCenter = FirstCirc.Location(); - mySecondCenter = SecondCirc.Location(); - - //ota -- begin -- - if (myAutomaticPosition) - { - myFirstPoint = ElCLib::Value( (FirstPar1 + LastPar1)*0.5, FirstCirc ); - mySecondPoint = ElCLib::Value( (FirstPar2 + LastPar2)*0.5, SecondCirc ); - } - else { - Standard_Real aPar = ElCLib::Parameter(FirstCirc, myFirstPoint); - if (IntegerPart(0.5*LastPar1/M_PI) != 0 && aPar < FirstPar1 ) - aPar +=2*M_PI*IntegerPart(0.5*LastPar1/M_PI); - Standard_Real aRadius = FirstCirc.Radius(); - - if (Abs(myFirstPoint.Distance(myFirstCenter) - aRadius) >= Precision::Confusion()) - myFirstPoint = ElCLib::Value(aPar, FirstCirc); - if ( FirstPoint1.Distance(LastPoint1) > Precision::Confusion()){ - //check where is myFirstPoint - if (aPar > LastPar1 || aPar < FirstPar1) - { - //myFirstPoint is out of Arc of FirstCircle - if (FirstPoint1.Distance(myFirstPoint)< LastPoint1.Distance(myFirstPoint)) - myFirstPoint = FirstPoint1; - else - myFirstPoint = LastPoint1; - } - } - - - aPar = ElCLib::Parameter(SecondCirc, mySecondPoint); - if (IntegerPart(0.5*LastPar2/M_PI) != 0 && aPar < FirstPar2 ) - aPar +=2*M_PI*IntegerPart(0.5*LastPar2/M_PI); - - aRadius = SecondCirc.Radius(); - if (Abs(mySecondPoint.Distance(mySecondCenter) - aRadius) >= Precision::Confusion()) - mySecondPoint = ElCLib::Value(aPar, SecondCirc); - if (FirstPoint2.Distance(LastPoint2) > Precision::Confusion()){ - if (aPar > LastPar2 || aPar < FirstPar2) - { //mySecondPoint is out of Arc of mySecondCircle - if (FirstPoint2.Distance(mySecondPoint)< LastPoint2.Distance(mySecondPoint)) - mySecondPoint = FirstPoint2; - else - mySecondPoint = LastPoint2; - } - } - } - if( !myArrowSizeIsDefined ) - myArrowSize = (Min(myFirstCenter.Distance(myFirstPoint), - mySecondCenter.Distance(mySecondPoint)))*0.05; - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - //ota -- end -- - - DsgPrs_EqualRadiusPresentation::Add(aPresentation, myDrawer, - myFirstCenter, mySecondCenter, myFirstPoint, mySecondPoint, myPlane ); -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_EqualRadiusRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, - const Standard_Integer ) -{ - Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); - Handle( Select3D_SensitiveSegment ) seg; - - seg = new Select3D_SensitiveSegment( own, myFirstCenter, myFirstPoint ); - aSelection->Add( seg ); - - if(!myAutomaticPosition) - ComputeRadiusPosition(); - - seg = new Select3D_SensitiveSegment( own, mySecondCenter, mySecondPoint ); - aSelection->Add( seg ); - - seg = new Select3D_SensitiveSegment( own, myFirstCenter, mySecondCenter ); - aSelection->Add( seg ); - - - // Two small lines - gp_Pnt Middle( (myFirstCenter.XYZ() + mySecondCenter.XYZ())*0.5 ); - - Standard_Real SmallDist = .001; - //Should be changed as the domain of small lines could be changed. - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox(own, - Middle.X() - SmallDist, - Middle.Y() - SmallDist, - Middle.Z() - SmallDist, - Middle.X() + SmallDist, - Middle.Y() + SmallDist, - Middle.Z() + SmallDist ); - aSelection->Add(box); -} - -//================================================================= -//function : ComputeRadiusPosition -//purpose : -//================================================================= -void AIS_EqualRadiusRelation::ComputeRadiusPosition() -{ - if (myAutomaticPosition || - myFirstCenter.Distance(myPosition) < Precision::Confusion() || - mySecondCenter.Distance(myPosition) < Precision::Confusion()) - return; - - gp_Pnt aPosition; - - //project myPosition to the plane of constraint - GeomAPI_ProjectPointOnSurf aProj(myPosition, myPlane); - aPosition = aProj.NearestPoint(); - - Standard_Real aDist1 = myFirstPoint.Distance(aPosition); - Standard_Real aDist2 = mySecondPoint.Distance(aPosition); - - if(aDist1 - -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_EqualRadiusRelation, AIS_Relation) - -class AIS_EqualRadiusRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_EqualRadiusRelation, AIS_Relation) -public: - - //! Creates equal relation of two arc's radiuses. - //! If one of edges is not in the given plane, - //! the presentation method projects it onto the plane. - Standard_EXPORT AIS_EqualRadiusRelation(const TopoDS_Edge& aFirstEdge, const TopoDS_Edge& aSecondEdge, const Handle(Geom_Plane)& aPlane); - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeRadiusPosition(); - - gp_Pnt myFirstCenter; - gp_Pnt mySecondCenter; - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - -}; - -#endif // _AIS_EqualRadiusRelation_HeaderFile diff --git a/src/AIS/AIS_FixRelation.cxx b/src/AIS/AIS_FixRelation.cxx deleted file mode 100644 index e4ea9b585a..0000000000 --- a/src/AIS/AIS_FixRelation.cxx +++ /dev/null @@ -1,578 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_FixRelation,AIS_Relation) - -static Standard_Boolean InDomain(const Standard_Real fpar, - const Standard_Real lpar, - const Standard_Real para) -{ - if (fpar >= 0.) { - return ((para >= fpar) && (para <= lpar)); - } - if (para >= (fpar+2*M_PI)) return Standard_True; - if (para <= lpar) return Standard_True; - return Standard_False; -} - -//======================================================================= -//function : Constructor -//purpose : vertex Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const TopoDS_Wire& aWire) -:AIS_Relation(), - myWire(aWire) -{ - myFShape = aShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 5.; -} - -//======================================================================= -//function : Constructor -//purpose : vertex Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const TopoDS_Wire& aWire, - const gp_Pnt& aPosition, - const Standard_Real anArrowSize) -:AIS_Relation(), - myWire(aWire) -{ - myFShape = aShape; - myPlane = aPlane; - myPosition = aPosition; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Constructor -//purpose : edge (line or circle) Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 5.; -} - -//======================================================================= -//function : Constructor -//purpose : edge (line or circle) Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation( - const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const gp_Pnt& aPosition, - const Standard_Real anArrowSize) -{ - myFShape = aShape; - myPlane = aPlane; - myPosition = aPosition; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - -//======================================================================= -//function : Wire -//purpose : -//======================================================================= - -TopoDS_Wire AIS_FixRelation::Wire() -{ - return myWire; -} - -//======================================================================= -//function : SetWire -//purpose : -//======================================================================= - -void AIS_FixRelation::SetWire(const TopoDS_Wire& aWire) -{ - myWire = aWire; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_FixRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - // Calculate position of the symbol and - // point of attach of the segment on the shape - gp_Pnt curpos; - if (myFShape.ShapeType() == TopAbs_VERTEX) - ComputeVertex(TopoDS::Vertex(myFShape), curpos); - else if (myFShape.ShapeType() == TopAbs_EDGE) - ComputeEdge(TopoDS::Edge(myFShape), curpos); - - const gp_Dir& nor = myPlane->Axis().Direction(); - - - // calculate presentation - // definition of the symbol size - if( !myArrowSizeIsDefined ) - myArrowSize = 5.; - - //creation of the presentation - DsgPrs_FixPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - nor, - myArrowSize); -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_FixRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - // creation of segment sensible for the linked segment - // of the shape fixed to symbol 'Fix' - Handle(Select3D_SensitiveSegment) seg; - seg = new Select3D_SensitiveSegment(own, - myPntAttach, - myPosition); - aSelection->Add(seg); - - // Creation of the sensible zone of symbol 'Fix' - gp_Dir norm = myPlane->Axis().Direction(); - - gp_Vec dirac(myPntAttach,myPosition); - dirac.Normalize(); - gp_Vec norac = dirac.Crossed(gp_Vec(norm)); - gp_Ax1 ax(myPosition, norm); - norac.Rotate(ax, M_PI/8); - - norac*=(myArrowSize/2); - gp_Pnt P1 = myPosition.Translated(norac); - gp_Pnt P2 = myPosition.Translated(-norac); - seg = new Select3D_SensitiveSegment(own, - P1, - P2); - aSelection->Add(seg); - - norac*=0.8; - P1 = myPosition.Translated(norac); - P2 = myPosition.Translated(-norac); - dirac*=(myArrowSize/2); - gp_Pnt PF(P1.XYZ()); - gp_Pnt PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); - aSelection->Add(seg); - - - PF.SetXYZ(P2.XYZ()); - PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); - aSelection->Add(seg); - - PF.SetXYZ( (P1.XYZ() + P2.XYZ()) /2 ); - PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); -} - -//======================================================================= -//function : ComputeVertex -//purpose : computes myPntAttach and the position of the presentation -// when you fix a vertex -//======================================================================= - -void AIS_FixRelation::ComputeVertex(const TopoDS_Vertex& /*FixVertex*/, - gp_Pnt& curpos) -{ - myPntAttach = BRep_Tool::Pnt(TopoDS::Vertex(myFShape)); - curpos = myPosition; - if (myAutomaticPosition) { - gp_Pln pln(myPlane->Pln()); - gp_Dir dir(pln.XAxis().Direction()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - myPosition = curpos; - myAutomaticPosition = Standard_True; - } -} - -//======================================================================= -//function : ComputePosition -//purpose : -//======================================================================= - -gp_Pnt AIS_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv1, - const Handle(Geom_Curve)& curv2, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) const -{ - //--------------------------------------------------------- - // calculate the point of attach - //--------------------------------------------------------- - gp_Pnt curpos; - - if (curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) || curv2->IsInstance(STANDARD_TYPE(Geom_Circle))) { - Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv1); - if (gcirc.IsNull()) gcirc = Handle(Geom_Circle)::DownCast(curv2); - gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - } - - else { - gp_Vec vec1(firstp1,lastp1); - gp_Vec vec2(firstp2,lastp2); - - if (!vec1.IsParallel(vec2, Precision::Angular()) ) { - gp_Dir dir; - Standard_Real conf =Precision::Confusion(); - if (lastp1.IsEqual(firstp2,conf) || firstp1.IsEqual(lastp2,conf)) dir.SetXYZ(vec1.XYZ() - vec2.XYZ()); - else dir.SetXYZ(vec1.XYZ() + vec2.XYZ()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - } - else { - gp_Vec crossvec = vec1.Crossed(vec2); - vec1.Cross(crossvec); - gp_Dir dir(vec1); - curpos = myPntAttach.Translated(gp_Vec(dir)*myArrowSize); - } - } - - return curpos; -} - -//======================================================================= -//function : ComputePosition -//purpose : Computes the position of the "fix dimension" when the -// fixed object is a vertex which is set at the intersection -// of two curves. -// The "dimension" is in the "middle" of the two edges. -//======================================================================= - -gp_Pnt AIS_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv, - const gp_Pnt& firstp, - const gp_Pnt& lastp) const -{ - //--------------------------------------------------------- - // calculate the point of attach - //--------------------------------------------------------- - gp_Pnt curpos; - - if (curv->IsKind(STANDARD_TYPE(Geom_Circle))) { - - Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv); - gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - - } //if (curv->IsKind(STANDARD_TYPE(Geom_Circle)) - - else { -// gp_Pln pln(Component()->WorkingPlane()->Plane()->GetValue()->Pln()); - gp_Pln pln(myPlane->Pln()); - gp_Dir NormPln = pln.Axis().Direction(); - gp_Vec vec(firstp,lastp); - vec.Cross( gp_Vec(NormPln)); - vec.Normalize(); - gp_Vec transvec = vec*myArrowSize; - curpos = myPntAttach.Translated(transvec); - gp_Ax1 RotAx( myPntAttach, NormPln); - curpos.Rotate(RotAx, M_PI/10); - } - - return curpos; - } - -//======================================================================= -//function : ComputeEdge -//purpose : computes myPntAttach and the position of the presentation -// when you fix an edge -//======================================================================= - -void AIS_FixRelation::ComputeEdge(const TopoDS_Edge& FixEdge, gp_Pnt& curpos) -{ - Handle(Geom_Curve) curEdge; - gp_Pnt ptbeg,ptend; - if (!AIS::ComputeGeometry(FixEdge,curEdge,ptbeg,ptend)) return; - - //--------------------------------------------------------- - // calcul du point de positionnement du symbole 'fix' - //--------------------------------------------------------- - //--> In case of a straight line - if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){ - gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin(); - Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg)); - Standard_Real plast(ElCLib::Parameter(glin,ptend)); - ComputeLinePosition(glin, curpos, pfirst, plast); - } - - //--> In case of a circle - else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) { - gp_Circ gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ(); - Standard_Real pfirst, plast; - BRepAdaptor_Curve cu(FixEdge); - pfirst = cu.FirstParameter(); - plast = cu.LastParameter(); - ComputeCirclePosition(gcirc, curpos, pfirst, plast); - } - - else - return; - -} - -//======================================================================= -//function : ComputeLinePosition -//purpose : compute the values of myPntAttach and the position of -// the symbol when the fixed edge has a geometric support equal -// to a line. -//======================================================================= - -void AIS_FixRelation::ComputeLinePosition(const gp_Lin& glin, - gp_Pnt& pos, - Standard_Real& pfirst, - Standard_Real& plast) -{ - if (myAutomaticPosition) { - // point of attach is chosen as middle of the segment - myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin); - - gp_Dir norm = myPlane ->Axis().Direction(); - - norm.Cross(glin.Position().Direction()); - pos = myPntAttach.Translated(gp_Vec(norm)*myArrowSize); - myAutomaticPosition = Standard_True; - } // if (myAutomaticPosition) - - else { - pos = myPosition; - Standard_Real linparam = ElCLib::Parameter(glin, pos); - - // case if the projection of position is located between 2 vertices - // de l'edge - if ( (linparam >= pfirst) && (linparam <= plast) ) - myPntAttach = ElCLib::Value(linparam,glin); - - // case if the projection of Position is outside of the limits - // of the edge : the point closest to the projection is chosen - // as the attach point - else { - Standard_Real pOnLin; - if (linparam > plast) - pOnLin = plast; - else - pOnLin = pfirst; - myPntAttach = ElCLib::Value(pOnLin,glin); - gp_Dir norm = myPlane->Axis().Direction(); - - norm.Cross(glin.Position().Direction()); - gp_Lin lsup(myPntAttach, norm); - Standard_Real parpos = ElCLib::Parameter(lsup,myPosition); - pos = ElCLib::Value(parpos,lsup); - } - - } - myPosition = pos; -} - -//======================================================================= -//function : ComputeCirclePosition -//purpose : compute the values of myPntAttach and the position of -// the symbol when the fixed edge has a geometric support equal -// to a circle. -//======================================================================= - -void AIS_FixRelation::ComputeCirclePosition( - const gp_Circ& gcirc, - gp_Pnt& pos, - Standard_Real& pfirst, - Standard_Real& plast) -{ - // readjust parametres on the circle - if (plast > 2*M_PI ) { - Standard_Real nbtours = Floor(plast / (2*M_PI)); - plast -= nbtours*2*M_PI; - pfirst -= nbtours*2*M_PI; - } - - if (myAutomaticPosition) { - // the point attach is the "middle" of the segment (relatively - // to the parametres of start and end vertices of the edge - - Standard_Real circparam = (pfirst + plast)/2.; - - if ( !InDomain(pfirst,plast,circparam)) { - Standard_Real otherpar = circparam + M_PI; - if (otherpar > 2*M_PI) otherpar -= 2*M_PI; - circparam = otherpar; - } - - myPntAttach = ElCLib::Value(circparam, gcirc ); - - gp_Vec dir( gcirc.Location().XYZ(), myPntAttach.XYZ() ); - dir.Normalize(); - gp_Vec transvec = dir*myArrowSize; - pos = myPntAttach.Translated(transvec); - myPosition = pos; - myAutomaticPosition = Standard_True; - } // if (myAutomaticPosition) - - else { - // case if the projection of myPosition is outside of 2 - // vertices of the edge. In this case the parameter is readjusted - // in the valid part of the circle - pos = myPosition; - - Standard_Real circparam = ElCLib::Parameter(gcirc, pos); - - if ( !InDomain(pfirst,plast,circparam)) { - Standard_Real otherpar = circparam + M_PI; - if (otherpar > 2*M_PI) otherpar -= 2*M_PI; - circparam = otherpar; - } - - myPntAttach = ElCLib::Value(circparam,gcirc); - } -} - -//======================================================================= -//function : ConnectedEdges -//purpose : -//======================================================================= -Standard_Boolean AIS_FixRelation::ConnectedEdges(const TopoDS_Wire& WIRE, - const TopoDS_Vertex& V, - TopoDS_Edge& E1, - TopoDS_Edge& E2) -{ - TopTools_IndexedDataMapOfShapeListOfShape vertexMap; - TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); - - Standard_Boolean found(Standard_False); - TopoDS_Vertex theVertex; - for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { - if (vertexMap.FindKey(i).IsSame(V)) { - theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); - found = Standard_True; - } - } - if (!found) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - - TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); - if (iterator.More()) { - E1 = TopoDS::Edge(iterator.Value()); - BRepAdaptor_Curve curv(E1); - iterator.Next(); - } - else { - E1.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E2 = TopoDS::Edge(iterator.Value()); - BRepAdaptor_Curve curv(E2); - iterator.Next(); - } - else { - E2.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - return Standard_True; -} diff --git a/src/AIS/AIS_FixRelation.hxx b/src/AIS/AIS_FixRelation.hxx deleted file mode 100644 index 5c904c05e3..0000000000 --- a/src/AIS/AIS_FixRelation.hxx +++ /dev/null @@ -1,101 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_FixRelation_HeaderFile -#define _AIS_FixRelation_HeaderFile - -#include -#include - -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_FixRelation, AIS_Relation) - -//! Constructs and manages a constraint by a fixed -//! relation between two or more interactive datums. This -//! constraint is represented by a wire from a shape - -//! point, vertex, or edge - in the first datum and a -//! corresponding shape in the second. -//! Warning: This relation is not bound with any kind of parametric -//! constraint : it represents the "status" of an parametric -//! object. -class AIS_FixRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_FixRelation, AIS_Relation) -public: - - //! initializes the vertex aShape, the - //! plane aPlane and the wire aWire, which connects - //! the two vertices in a fixed relation. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire); - - //! initializes the vertex aShape, the - //! plane aPlane and the wire aWire, the position - //! aPosition, the arrow size anArrowSize and the - //! wire aWire, which connects the two vertices in a fixed relation. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); - - //! initializes the edge aShape and the plane aPlane. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane); - - //! initializes the edge aShape, the - //! plane aPlane, the position aPosition and the arrow - //! size anArrowSize. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); - - //! Returns the wire which connects vertices in a fixed relation. - Standard_EXPORT TopoDS_Wire Wire(); - - //! Constructs the wire aWire. This connects vertices - //! which are in a fixed relation. - Standard_EXPORT void SetWire (const TopoDS_Wire& aWire); - - //! Returns true if the Interactive Objects in the relation - //! are movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } - -private: - - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - //! computes the presentation for if it's a - //! vertex. - Standard_EXPORT void ComputeVertex (const TopoDS_Vertex& FixVertex, gp_Pnt& curpos); - - Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv1, const Handle(Geom_Curve)& curv2, const gp_Pnt& firstp1, const gp_Pnt& lastp1, const gp_Pnt& firstp2, const gp_Pnt& lastp2) const; - - Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv, const gp_Pnt& firstp, const gp_Pnt& lastp) const; - - //! computes the presentation for if it's a - //! edge. - Standard_EXPORT void ComputeEdge (const TopoDS_Edge& FixEdge, gp_Pnt& curpos); - - Standard_EXPORT void ComputeLinePosition (const gp_Lin& glin, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); - - Standard_EXPORT void ComputeCirclePosition (const gp_Circ& gcirc, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); - - Standard_EXPORT static Standard_Boolean ConnectedEdges (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, TopoDS_Edge& Edge1, TopoDS_Edge& Edge2); - - TopoDS_Wire myWire; - gp_Pnt myPntAttach; - - -}; - -#endif // _AIS_FixRelation_HeaderFile diff --git a/src/AIS/AIS_IdenticRelation.cxx b/src/AIS/AIS_IdenticRelation.cxx deleted file mode 100644 index fe394d4de6..0000000000 --- a/src/AIS/AIS_IdenticRelation.cxx +++ /dev/null @@ -1,1713 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_IdenticRelation,AIS_Relation) - -// jfa 15/10/2000 -static Standard_Real Modulo2PI(const Standard_Real ANGLE) -{ - if ( ANGLE < 0 ) return Modulo2PI(ANGLE + 2*M_PI); - else if ( ANGLE >= 2*M_PI ) return Modulo2PI(ANGLE - 2*M_PI); - return ANGLE; -} - -static Standard_Boolean IsEqual2PI(const Standard_Real angle1, - const Standard_Real angle2, const Standard_Real precision) -{ - Standard_Real diff = Abs(angle1-angle2); - if ( diff < precision ) return Standard_True; - else if ( Abs(diff-2*M_PI) < precision ) return Standard_True; - return Standard_False; -} -// jfa 15/10/2000 end - -//======================================================================= -//function : AIS_Sort -//purpose : sort an array of parameters in increasing order -// updates and according to -//======================================================================= -static void AIS_Sort(Standard_Real tab1[4], - gp_Pnt tab2[4], - Standard_Integer tab3[4]) -{ - Standard_Boolean found = Standard_True; - Standard_Real cur; gp_Pnt cur1; Standard_Integer cur2; - - while (found) { - found = Standard_False; - for (Standard_Integer i=0; i< 3; i++) { - if (tab1[i+1] < tab1[i]) { - found = Standard_True; - cur = tab1[i]; cur1 = tab2[i]; cur2 = tab3[i]; - tab1[i] = tab1[i+1]; tab2[i] = tab2[i+1]; tab3[i] = tab3[i+1]; - tab1[i+1] = cur; tab2[i+1] = cur1; tab3[i+1] = cur2; - } - } - } -} - -//======================================================================= -//function : ConnectedEdges -//purpose : -//======================================================================= -static Standard_Boolean ConnectedEdges(const TopoDS_Wire& WIRE, - const TopoDS_Vertex& V, - TopoDS_Edge& E1, - TopoDS_Edge& E2) -{ - TopTools_IndexedDataMapOfShapeListOfShape vertexMap; - TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); - - Standard_Boolean found(Standard_False); - TopoDS_Vertex theVertex; - for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { - if (vertexMap.FindKey(i).IsSame(V)) { - theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); - found = Standard_True; - } - } - if (!found) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - - TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); - if (iterator.More()) { - E1 = TopoDS::Edge(iterator.Value()); - iterator.Next(); - } - else { - E1.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E2 = TopoDS::Edge(iterator.Value()); - iterator.Next(); - } - else { - E2.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - return Standard_True; -} - -// jfa 16/10/2000 -//======================================================================= -//function : ComputeAttach -//purpose : Compute a point on the arc of -// between and -// corresponding to -// Returns result into -// Note : This function is to be used only in the case of circles. -// The parameter is in/out. -//======================================================================= -static Standard_Boolean ComputeAttach(const gp_Circ& thecirc, - const gp_Pnt& aFAttach, - const gp_Pnt& aSAttach, - gp_Pnt& aPosition) -{ - gp_Pnt curpos = aPosition; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = thecirc.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, aFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(thecirc,curpos); - Standard_Real pFAttach = ElCLib::Parameter(thecirc,aFAttach); - Standard_Real pSAttach = ElCLib::Parameter(thecirc,aSAttach); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - - aPosition = ElCLib::Value(pcurpos,thecirc); - return Standard_True; -} - -//======================================================================= -//function : ComputeAttach -//purpose : Compute a point on the arc of ellipse -// between and -// corresponding to -// Returns result into -// Note : This function is to be used only in the case of ellipses. -// The parameter is in/out. -//======================================================================= -static Standard_Boolean ComputeAttach(const gp_Elips& theEll, - const gp_Pnt& aFAttach, - const gp_Pnt& aSAttach, - gp_Pnt& aPosition) -{ - gp_Pnt curpos = aPosition; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = theEll.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, aFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - -// for ellipses it's not good Standard_Real pcurpos = ElCLib::Parameter(theEll,curpos); - Handle(Geom_Ellipse) theEllg = new Geom_Ellipse(theEll); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEllg); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - Standard_Real pFAttach = ElCLib::Parameter(theEll,aFAttach); - Standard_Real pSAttach = ElCLib::Parameter(theEll,aSAttach); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - - aPosition = ElCLib::Value(pcurpos,theEll); - return Standard_True; -} -// jfa 16/10/2000 end - -//======================================================================= -//function : AIS_IdenticRelation -//purpose : -//======================================================================= -AIS_IdenticRelation::AIS_IdenticRelation(const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) - :isCircle(Standard_False) -{ - myFShape = FirstShape; - mySShape = SecondShape; - myPlane = aPlane; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_IdenticRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - switch ( myFShape.ShapeType() ) { - - case TopAbs_VERTEX: - { - switch ( mySShape.ShapeType() ) { - case TopAbs_VERTEX: - { - ComputeTwoVerticesPresentation(aprs); - } - break; - case TopAbs_EDGE: - { - ComputeOneEdgeOVertexPresentation(aprs); - } - break; - default: - break; - } - } - break; - - case TopAbs_EDGE: - { - switch ( mySShape.ShapeType() ) { - case TopAbs_VERTEX: - { - ComputeOneEdgeOVertexPresentation(aprs); - } - break; - case TopAbs_EDGE: - { - ComputeTwoEdgesPresentation(aprs); - } - break; - default: - break; - } - } - break; - default: break; - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : function used to compute the selection associated to the -// "identic" presentation -// note : if we are in the case of lines, we create a segment between -// myFAttach and mySAttach. In the case of Circles, we create -// an arc of circle between the sames points. We Add a segment -// to link Position to its projection on the curve described -// before. -//======================================================================= - -void AIS_IdenticRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - Handle(Select3D_SensitiveSegment) seg; - // attachement point of the segment linking position to the curve - gp_Pnt attach; - Standard_Real confusion (Precision::Confusion()); - - if ( myFAttach.IsEqual(mySAttach, confusion) ) - { - attach = myFAttach; - } - else - { -// jfa 24/10/2000 - if ( myFShape.ShapeType() == TopAbs_EDGE ) - { - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if ( !AIS::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), - myExtShape,curv1,curv2, - firstp1,lastp1,firstp2,lastp2, - extCurv,isInfinite1,isInfinite2,myPlane) ) return; - - if ( isCircle ) // case of Circles - { - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv1); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFAttach); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySAttach); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); - aSelection->Add(scurv); - - attach = myPosition; - ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); - } - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipses - { - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv1); - - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFAttach); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySAttach); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); - aSelection->Add(scurv); - - attach = myPosition; - ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); - } - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of Lines - { - seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach); - aSelection->Add(seg); - - //attach = projection of Position() on the curve; - gp_Vec v1 (myFAttach, mySAttach); - gp_Vec v2 (myFAttach, myPosition); - if ( v1.IsParallel(v2, Precision::Angular()) ) - { - attach = mySAttach; - } - else - { - gp_Lin ll (myFAttach, gp_Dir(v1)); - attach = ElCLib::Value(ElCLib::Parameter(ll,myPosition), ll); - } - } - else return; - } -// else if ( myFShape.ShapeType() == TopAbs_VERTEX ) -// { -// } -// jfa 24/10/2000 end - } - - // Creation of the segment linking the attachement point with the - // position - if ( !attach.IsEqual(myPosition, confusion) ) - { - seg = new Select3D_SensitiveSegment(own, attach, myPosition); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoEdgesPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeTwoEdgesPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - Standard_Boolean isInfinite1,isInfinite2; - - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - curv1, - curv2, - firstp1, - lastp1, - firstp2, - lastp2, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - return; - aPrs->SetInfiniteState((isInfinite1 || isInfinite2) && myExtShape != 0); - - // Treatement of the case of lines - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) && curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - // we take the line curv1 like support - Handle(Geom_Line) thelin; - if (isInfinite1 && !isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv2); - else if (!isInfinite1 && isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv1); - else thelin = Handle(Geom_Line)::DownCast (curv1); - ComputeTwoLinesPresentation(aPrs, thelin, firstp1, lastp1, firstp2, lastp2, isInfinite1, isInfinite2); - } - - // Treatement of the case of circles - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - //gp_Pnt curpos; - isCircle = Standard_True; // useful for ComputeSelection - Handle(Geom_Circle) thecirc (Handle(Geom_Circle)::DownCast (curv1)); - ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2); - } - - // jfa 10/10/2000 - // Treatement of the case of ellipses - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) && curv2->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) theEll (Handle(Geom_Ellipse)::DownCast (curv1)); - ComputeTwoEllipsesPresentation(aPrs, theEll, firstp1, lastp1, firstp2, lastp2); - } - // jfa 10/10/2000 end - else - return; - - // Calculate presentation of projected edges - if ( (myExtShape != 0) && !extCurv.IsNull()) { - if (myExtShape == 1 ) - ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1); - else - ComputeProjEdgePresentation(aPrs, TopoDS::Edge(mySShape), curv2, firstp2, lastp2); - } -} - -//======================================================================= -//function : ComputeTwoLinesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two lines ( which are equal) -//input : : the -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoLinesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Line)& thelin, - gp_Pnt& firstp1, - gp_Pnt& lastp1, - gp_Pnt& firstp2, - gp_Pnt& lastp2, - const Standard_Boolean isInfinite1, - const Standard_Boolean isInfinite2) -{ - if (isInfinite1 && isInfinite2) { - if ( myAutomaticPosition ) { - myFAttach = mySAttach = thelin->Lin().Location(); - gp_Pnt curpos; - gp_Pln pln(myPlane->Pln()); - gp_Dir dir(pln.XAxis().Direction()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myFAttach.Translated(transvec); - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - else { - myFAttach = mySAttach = ElCLib::Value(ElCLib::Parameter(thelin->Lin(),myPosition),thelin->Lin()); - } - TCollection_ExtendedString vals(" =="); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - myPosition); - } - else { - // Computation of the parameters of the 4 points on the line - Standard_Real pf1, pf2, pl1, pl2; - - pf1 = ElCLib::Parameter(thelin->Lin(), firstp1); - pl1 = ElCLib::Parameter(thelin->Lin(), lastp1); - - pf2 = ElCLib::Parameter(thelin->Lin(), firstp2); - pl2 = ElCLib::Parameter(thelin->Lin(), lastp2); - - if (isInfinite1) { - pf1 = pf2; - pl1 = pl2; - firstp1 = firstp2; - lastp1 = lastp2; - } - else if (isInfinite2) { - pf2 = pf1; - pl2 = pl1; - firstp2 = firstp1; - lastp2 = lastp1; - } - - Standard_Real tabRang1[4]; // array taht contains the parameters of the 4 points - // ordered by increasing abscisses. - - gp_Pnt tabRang2[4]; // array containing the points corresponding to the - // parameters in tabRang1 - - Standard_Integer tabRang3[4]; // array containing the number of the curve( 1 or 2) - // of which belongs each point of tabRang2 - - // Filling of the arrays - tabRang1[0] = pf1; tabRang2[0] = firstp1; tabRang3[0] = 1; - tabRang1[1] = pf2; tabRang2[1] = firstp2; tabRang3[1] = 2; - tabRang1[2] = pl1; tabRang2[2] = lastp1; tabRang3[2] = 1; - tabRang1[3] = pl2; tabRang2[3] = lastp2; tabRang3[3] = 2; - - // Sort of the array of parameters (tabRang1) - AIS_Sort(tabRang1, tabRang2, tabRang3); - - // Computation of myFAttach and mySAttach according to the - // position of the 2 linear edges - gp_Pnt curpos; - gp_Pnt middle; - - if ( (tabRang1[0] == tabRang1[1]) && (tabRang1[2] == tabRang1[3]) ) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - Standard_Real pmiddle = (tabRang1[1] + tabRang1[2]) / 2.; - Standard_Real delta = (tabRang1[3] - tabRang1[0])/ 5.; - myFAttach = ElCLib::Value(pmiddle-delta, thelin->Lin()); - mySAttach = ElCLib::Value(pmiddle+delta, thelin->Lin()); - } - - else if ( tabRang1[1] == tabRang1[2] ) { - middle = tabRang2[1]; - Standard_Real delta1 = tabRang1[1] - tabRang1[0]; - Standard_Real delta2 = tabRang1[3] - tabRang1[2]; - if ( delta1 > delta2 ) delta1 = delta2; - myFAttach = ElCLib::Value(tabRang1[1]-delta1/2., thelin->Lin()); - mySAttach = ElCLib::Value(tabRang1[1]+delta1/2., thelin->Lin()); - } - - // Case of 2 disconnected segments -> the symbol completes the gap - // between the 2 edges - //-------------------------------- - else if ( (tabRang3[0] == tabRang3[1]) && (tabRang1[1] != tabRang1[2])) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - myFAttach = tabRang2[1]; - mySAttach = tabRang2[2]; - } - else if ( (tabRang3[0] != tabRang3[1]) - && (tabRang3[1] != tabRang3[2]) // Intersection - && (tabRang1[1] != tabRang1[2]) ) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - myFAttach = tabRang2[1]; - mySAttach = tabRang2[2]; - } - else { // Inclusion - myFAttach.SetXYZ((tabRang2[0].XYZ() + tabRang2[1].XYZ())/2. ); - mySAttach.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - middle.SetXYZ( (myFAttach.XYZ() + mySAttach.XYZ() )/2.); - } - - - if ( myAutomaticPosition ) { - - gp_Vec vtrans(myFAttach, mySAttach); - vtrans.Normalize(); - vtrans.Cross(gp_Vec(myPlane->Pln().Axis().Direction())); - vtrans *= ComputeSegSize(); - curpos = middle.Translated(vtrans); - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - - else { - - curpos = myPosition; - Standard_Real pcurpos = ElCLib::Parameter(thelin->Lin() ,curpos); - Standard_Real dist = thelin->Lin().Distance(curpos); - gp_Pnt proj = ElCLib::Value( pcurpos, thelin->Lin()); - gp_Vec trans; - Standard_Real confusion(Precision::Confusion()); - if ( dist >= confusion ) { - trans = gp_Vec(proj, curpos); - trans.Normalize(); - } - Standard_Real pf = ElCLib::Parameter(thelin->Lin() ,myFAttach); - Standard_Real pl = ElCLib::Parameter(thelin->Lin() ,mySAttach); - if ( pcurpos <= pf ) { - pcurpos = pf + 1e-5; - curpos = ElCLib::Value( pcurpos, thelin->Lin()); - if ( dist >= confusion ) curpos.Translate(trans*dist); - } - else if ( pcurpos >= pl ) { - pcurpos = pl - 1e-5; - curpos = ElCLib::Value( pcurpos, thelin->Lin()); - if ( dist >= confusion ) curpos.Translate(trans*dist); - } - SetPosition(curpos); - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - mySAttach, - curpos); - } -} - -// jfa 17/10/2000 -//======================================================================= -//function : ComputeTwoCirclesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two circles ( which are equal) -//input : : the circle -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoCirclesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Circle)& thecirc, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) -{ - Standard_Real confusion (Precision::Confusion()); - - // Searching of complete circles - Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); - Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); - - myCenter = thecirc->Location(); - Standard_Real aSegSize = thecirc->Radius()/5.0; - Standard_Real rad = M_PI / 5.0; - - // I. Case of 2 complete circles - if ( circ1complete && circ2complete ) - { - if (myAutomaticPosition) - { - Standard_Real pfirst1 = ElCLib::Parameter(thecirc->Circ(), firstp1); - myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), thecirc->Circ()); - mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), thecirc->Circ()); - - gp_Pnt curpos = ElCLib::Value(pfirst1,thecirc->Circ()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - else ComputeNotAutoCircPresentation(thecirc); - } - - // II. Case of one complete circle and one arc - else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) - { - gp_Pnt firstp, lastp; - if ( circ1complete && !circ2complete) - { - firstp = firstp2; - lastp = lastp2; - } - else - { - firstp = firstp1; - lastp = lastp1; - } - - if (myAutomaticPosition) - { - ComputeAutoArcPresentation(thecirc, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - - // III and IV. Case of two arcs - else if ( !circ1complete && !circ2complete ) - { - // We project all the points on the circle - Standard_Real pf1, pf2, pl1, pl2; - pf1 = ElCLib::Parameter(thecirc->Circ(), firstp1); - pf2 = ElCLib::Parameter(thecirc->Circ(), firstp2); - pl1 = ElCLib::Parameter(thecirc->Circ(), lastp1); - pl2 = ElCLib::Parameter(thecirc->Circ(), lastp2); - - // III. Arcs with common ends - // III.1. First of one and last of another - if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) - { - gp_Pnt curpos(0.,0.,0.); - Standard_Real att=0.; - if ( IsEqual2PI(pl1,pf2,confusion) ) - { - att = pl1; - curpos = lastp1; - } - else if ( IsEqual2PI(pf1,pl2,confusion) ) - { - att = pf1; - curpos = firstp1; - } - Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; - if ( rad > maxrad ) rad = maxrad; - Standard_Real pFAttach = Modulo2PI(att - rad); - Standard_Real pSAttach = Modulo2PI(att + rad); - myFAttach = ElCLib::Value(pFAttach, thecirc->Circ()); - mySAttach = ElCLib::Value(pSAttach, thecirc->Circ()); - if ( myAutomaticPosition ) - { - gp_Vec vtrans(myCenter,curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - } - // III.2. Two first or two last - else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) - { - Standard_Real l1 = Modulo2PI(pl1 - pf1); - Standard_Real l2 = Modulo2PI(pl2 - pf2); - gp_Pnt firstp,lastp; - if ( l1 < l2 ) - { - firstp = firstp1; - lastp = lastp1; - } - else - { - firstp = firstp2; - lastp = lastp2; - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(thecirc, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - // IV. All others arcs (without common ends) - else - { - // order the parameters; first will be pf1 - Standard_Real pl1m = Modulo2PI(pl1 - pf1); - Standard_Real pf2m = Modulo2PI(pf2 - pf1); - Standard_Real pl2m = Modulo2PI(pl2 - pf1); - - Standard_Boolean case1 = Standard_False; - // 1 - not intersecting arcs - // 2 - intersecting arcs, but one doesn't contain another - // 3a - first arc contains the second one - // 3b - second arc contains the first one - // 4 - two intersections - - gp_Pnt firstp, lastp; - - if ( pl1m < pf2m ) // 1 or 2b or 3b - { - if ( pl1m < pl2m ) // 1 or 3b - { - if ( pl2m < pf2m ) // 3b - { - firstp = firstp1; - lastp = lastp1; - } - else // 1 - { - case1 = Standard_True; - Standard_Real deltap1 = Modulo2PI(pf1 - pl2); - Standard_Real deltap2 = Modulo2PI(pf2 - pl1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = lastp1; - lastp = firstp2; - } - else // deltap1 - { - firstp = lastp2; - lastp = firstp1; - } - } - } - else // 2b - { - firstp = firstp1; - lastp = lastp2; - } - } - else // 2a or 3a or 4 - { - if ( pl1m < pl2m ) // 2a - { - firstp = firstp2; - lastp = lastp1; - } - else // 3a or 4 - { - if ( pl2m > pf2m ) // 3a - { - firstp = firstp2; - lastp = lastp2; - } - else // 4 - { - Standard_Real deltap1 = Modulo2PI(pl1 - pf2); - Standard_Real deltap2 = Modulo2PI(pl2 - pf1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = firstp1; - lastp = lastp2; - } - else // deltap1 - { - firstp = firstp2; - lastp = lastp1; - } - } - } - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(thecirc,firstp,lastp,case1); - } - else - { - if ( case1 ) - { - myFAttach = firstp; - mySAttach = lastp; - } - else ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - gp_Pnt attach = myPosition; - ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myPlane->Pln().Position().Ax2(), - myCenter, - myFAttach, - mySAttach, - myPosition, - attach); -} - -//======================================================================= -//function : ComputeAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// not in the case of dragging. -//======================================================================= -void AIS_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Circle)& thecirc, - const gp_Pnt& firstp, - const gp_Pnt& lastp, - const Standard_Boolean isstatic) -{ - Standard_Real aSegSize = thecirc->Radius()/5.0; - Standard_Real rad = M_PI / 5.0; - - Standard_Real pFA = ElCLib::Parameter(thecirc->Circ(),firstp); - Standard_Real pSA = ElCLib::Parameter(thecirc->Circ(),lastp); - Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; - - if ( (rad > maxrad) || isstatic ) rad = maxrad; - Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); - - myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),thecirc->Circ()); - mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),thecirc->Circ()); - - gp_Pnt curpos = ElCLib::Value(pmiddle,thecirc->Circ()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - myPosition = curpos.Translated(vtrans); -} - -//======================================================================= -//function : ComputeNotAutoCircPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of full circles. -// The symbol of the constraint moves together with arc -// representing the constraint around all the circle. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoCircPresentation(const Handle(Geom_Circle)& thecirc) -{ - gp_Pnt curpos = myPosition; - - Handle(Geom_Circle) cirNotAuto = new Geom_Circle(thecirc->Circ()); - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - if ( myCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(myCenter, myFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real rad = M_PI / 5.0; - Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto->Circ(),curpos); - Standard_Real pFAttach = pcurpos - rad; - Standard_Real pSAttach = pcurpos + rad; - myFAttach = ElCLib::Value(pFAttach,cirNotAuto->Circ()); - mySAttach = ElCLib::Value(pSAttach,cirNotAuto->Circ()); -} - -//======================================================================= -//function : ComputeNotAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of circles. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Circle)& thecirc, - const gp_Pnt& pntfirst, - const gp_Pnt& pntlast) -{ - gp_Pnt curpos = myPosition; - - gp_Circ cirNotAuto = thecirc->Circ(); - - Standard_Real pFPnt = ElCLib::Parameter(cirNotAuto, pntfirst); - Standard_Real pSPnt = ElCLib::Parameter(cirNotAuto, pntlast); - Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; - - Standard_Real rad = M_PI / 5; - if ( deltap < rad ) - { - myFAttach = pntfirst; - mySAttach = pntlast; - } - else - { - gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), cirNotAuto); - gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), cirNotAuto); - - ComputeAttach(cirNotAuto,aFPnt,aSPnt,curpos); - - Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto,curpos); - myFAttach = ElCLib::Value(pcurpos - rad, cirNotAuto); - mySAttach = ElCLib::Value(pcurpos + rad, cirNotAuto); - } -} -// jfa 17/10/2000 end - -// jfa 18/10/2000 -//======================================================================= -//function : ComputeTwoEllipsesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two ellipses (which are equal) -//input : : the ellipse -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoEllipsesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) -{ - Standard_Real confusion (Precision::Confusion()); - - // Searching of complete ellipses - Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); - Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); - - myCenter = theEll->Location(); - Standard_Real aSegSize = theEll->MajorRadius()/5.0; - Standard_Real rad = M_PI / 5.0; - - // I. Case of 2 complete ellipses - if ( circ1complete && circ2complete ) - { - if (myAutomaticPosition) - { - Standard_Real pfirst1 = ElCLib::Parameter(theEll->Elips(), firstp1); - myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), theEll->Elips()); - mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), theEll->Elips()); - - gp_Pnt curpos = ElCLib::Value(pfirst1,theEll->Elips()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - else ComputeNotAutoElipsPresentation(theEll); - } - - // II. Case of one complete circle and one arc - else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) - { - gp_Pnt firstp, lastp; - if ( circ1complete && !circ2complete) - { - firstp = firstp2; - lastp = lastp2; - } - else - { - firstp = firstp1; - lastp = lastp1; - } - - if (myAutomaticPosition) - { - ComputeAutoArcPresentation(theEll, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - - // III and IV. Case of two arcs - else if ( !circ1complete && !circ2complete ) - { - // We project all the points on the circle - Standard_Real pf1, pf2, pl1, pl2; - pf1 = ElCLib::Parameter(theEll->Elips(), firstp1); - pf2 = ElCLib::Parameter(theEll->Elips(), firstp2); - pl1 = ElCLib::Parameter(theEll->Elips(), lastp1); - pl2 = ElCLib::Parameter(theEll->Elips(), lastp2); - - // III. Arcs with common ends - // III.1. First of one and last of another - if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) - { - gp_Pnt curpos; - Standard_Real att=0.; - if ( IsEqual2PI(pl1,pf2,confusion) ) - { - att = pl1; - curpos = lastp1; - } - else if ( IsEqual2PI(pf1,pl2,confusion) ) - { - att = pf1; - curpos = firstp1; - } - Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; - if ( rad > maxrad ) rad = maxrad; - Standard_Real pFAttach = Modulo2PI(att - rad); - Standard_Real pSAttach = Modulo2PI(att + rad); - myFAttach = ElCLib::Value(pFAttach, theEll->Elips()); - mySAttach = ElCLib::Value(pSAttach, theEll->Elips()); - if ( myAutomaticPosition ) - { - gp_Vec vtrans(myCenter,curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - } - // III.2. Two first or two last - else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) - { - Standard_Real l1 = Modulo2PI(pl1 - pf1); - Standard_Real l2 = Modulo2PI(pl2 - pf2); - gp_Pnt firstp,lastp; - if ( l1 < l2 ) - { - firstp = firstp1; - lastp = lastp1; - } - else - { - firstp = firstp2; - lastp = lastp2; - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(theEll, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - // IV. All others arcs (without common ends) - else - { - // order the parameters; first will be pf1 - Standard_Real pl1m = Modulo2PI(pl1 - pf1); - Standard_Real pf2m = Modulo2PI(pf2 - pf1); - Standard_Real pl2m = Modulo2PI(pl2 - pf1); - - Standard_Boolean case1 = Standard_False; - // 1 - not intersecting arcs - // 2 - intersecting arcs, but one doesn't contain another - // 3a - first arc contains the second one - // 3b - second arc contains the first one - // 4 - two intersections - - gp_Pnt firstp, lastp; - - if ( pl1m < pf2m ) // 1 or 2b or 3b - { - if ( pl1m < pl2m ) // 1 or 3b - { - if ( pl2m < pf2m ) // 3b - { - firstp = firstp1; - lastp = lastp1; - } - else // 1 - { - case1 = Standard_True; - Standard_Real deltap1 = Modulo2PI(pf1 - pl2); - Standard_Real deltap2 = Modulo2PI(pf2 - pl1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = lastp1; - lastp = firstp2; - } - else // deltap1 - { - firstp = lastp2; - lastp = firstp1; - } - } - } - else // 2b - { - firstp = firstp1; - lastp = lastp2; - } - } - else // 2a or 3a or 4 - { - if ( pl1m < pl2m ) // 2a - { - firstp = firstp2; - lastp = lastp1; - } - else // 3a or 4 - { - if ( pl2m > pf2m ) // 3a - { - firstp = firstp2; - lastp = lastp2; - } - else // 4 - { - Standard_Real deltap1 = Modulo2PI(pl1 - pf2); - Standard_Real deltap2 = Modulo2PI(pl2 - pf1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = firstp1; - lastp = lastp2; - } - else // deltap1 - { - firstp = firstp2; - lastp = lastp1; - } - } - } - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(theEll,firstp,lastp,case1); - } - else - { - if ( case1 ) - { - myFAttach = firstp; - mySAttach = lastp; - } - else ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - gp_Pnt attach = myPosition; - ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - theEll->Elips(), - myFAttach, - mySAttach, - myPosition, - attach); -} - -//======================================================================= -//function : ComputeAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// not in the case of dragging. -//======================================================================= -void AIS_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& firstp, - const gp_Pnt& lastp, - const Standard_Boolean isstatic) -{ - Standard_Real aSegSize = theEll->MajorRadius()/5.0; - Standard_Real rad = M_PI / 5.0; - - gp_Elips anEll = theEll->Elips(); - - Standard_Real pFA = ElCLib::Parameter(anEll,firstp); - Standard_Real pSA = ElCLib::Parameter(anEll,lastp); - Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; - - if ( (rad > maxrad) || isstatic ) rad = maxrad; - Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); - - myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),anEll); - mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),anEll); - - gp_Pnt curpos = ElCLib::Value(pmiddle,anEll); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - myPosition = curpos.Translated(vtrans); -} - -//======================================================================= -//function : ComputeNotAutoElipsPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of ellipses. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoElipsPresentation(const Handle(Geom_Ellipse)& theEll) -{ - gp_Pnt curpos = myPosition; - - gp_Elips anEll = theEll->Elips(); - - // Case of confusion between the current position and the center - // of the ellipse -> we move the current position - Standard_Real confusion (Precision::Confusion()); - if ( myCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(myCenter, myFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real rad = M_PI / 5.0; -// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - Standard_Real pFAttach = pcurpos - rad; - Standard_Real pSAttach = pcurpos + rad; - myFAttach = ElCLib::Value(pFAttach,anEll); - mySAttach = ElCLib::Value(pSAttach,anEll); -} - -//======================================================================= -//function : ComputeNotAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of ellipses. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& pntfirst, - const gp_Pnt& pntlast) -{ - gp_Pnt curpos = myPosition; - - gp_Elips anEll = theEll->Elips(); - - Standard_Real pFPnt = ElCLib::Parameter(anEll, pntfirst); - Standard_Real pSPnt = ElCLib::Parameter(anEll, pntlast); - Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; - - Standard_Real rad = M_PI / 5; - if ( deltap < rad ) - { - myFAttach = pntfirst; - mySAttach = pntlast; - } - else - { - gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), anEll); - gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), anEll); - - ComputeAttach(anEll,aFPnt,aSPnt,curpos); - -// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - myFAttach = ElCLib::Value(pcurpos - rad, anEll); - mySAttach = ElCLib::Value(pcurpos + rad, anEll); - } -} -// jfa 18/10/2000 end - -//======================================================================= -//function : ComputeTwoVerticesPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeTwoVerticesPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - Standard_Boolean isOnPlane1, isOnPlane2; - const TopoDS_Vertex& FVertex = TopoDS::Vertex(myFShape); - const TopoDS_Vertex& SVertex = TopoDS::Vertex(mySShape); - - AIS::ComputeGeometry(FVertex, myFAttach, myPlane, isOnPlane1); - AIS::ComputeGeometry(SVertex, mySAttach, myPlane, isOnPlane2); - - if (isOnPlane1 && isOnPlane2) - myExtShape = 0; - else if ( isOnPlane1 && !isOnPlane2) - myExtShape = 2; - else if (!isOnPlane1 && isOnPlane2) - myExtShape = 1; - else - return ; - - - // The attachement points are the points themselves that must be - //identical - myFAttach = BRep_Tool::Pnt(FVertex); - mySAttach = myFAttach; - - gp_Pnt curpos; - if (myAutomaticPosition) - { - //Computation of the size of the symbol - Standard_Real symbsize = ComputeSegSize(); - if (symbsize <= Precision::Confusion()) symbsize = 1.; - symbsize*=5; - // Computation of the direction of the segment of the presentation - // we take the median of the edges connected to vertices - gp_Dir dF, dS; - gp_Dir myDir; - TColStd_ListIteratorOfListOfTransient it(Users()); - if (it.More()) - { - Handle(AIS_Shape) USER (Handle(AIS_Shape)::DownCast(it.Value())); - if (!USER.IsNull()) - { - const TopoDS_Shape& SH =USER->Shape(); - if ( (!SH.IsNull()) && (SH.ShapeType() == TopAbs_WIRE) ) - { - const TopoDS_Wire& WIRE = TopoDS::Wire(USER->Shape()); - Standard_Boolean done = ComputeDirection(WIRE,FVertex,dF); - if (!done) return; - done = ComputeDirection(WIRE,SVertex,dS); - if (!done) return; - } - else return; - } - else return; - - // computation of the segment direction like average - // of the 2 computed directions. - if ( dF.IsParallel(dS, Precision::Angular()) ) - { - myDir = dF.Crossed(myPlane->Pln().Axis().Direction()); - } - else - { - myDir.SetXYZ(dF.XYZ() + dS.XYZ()); - } - curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; - } -// jfa 11/10/2000 - else - { - curpos = myFAttach; - } -// jfa 11/10/2000 end - - myPosition = curpos; - myAutomaticPosition = Standard_False; - } - else - { - curpos = myPosition; - } - - // Presentation computation - TCollection_ExtendedString vals(" ++"); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - curpos); - // Calculate the projection of vertex - if ( myExtShape == 1) - ComputeProjVertexPresentation(aPrs,FVertex,myFAttach); - else if ( myExtShape == 2) - ComputeProjVertexPresentation(aPrs,SVertex,mySAttach); -} - - - -//======================================================================= -//function : ComputeSegSize -//purpose : -//======================================================================= -Standard_Real AIS_IdenticRelation::ComputeSegSize() const -{ - return 1.; -} - -//======================================================================= -//function : ComputeDirection -//purpose : Compute a direction according to the different geometric -// elements connected to the vertex , in way to not have -// overlap between the symbol and them. -//======================================================================= -Standard_Boolean AIS_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire, - const TopoDS_Vertex& VERT, - gp_Dir& dF) const -{ - // we take the median of the edges connected to vertices - TopoDS_Edge edg1,edg2; - ConnectedEdges(aWire,VERT,edg1,edg2); - - if ( edg1.IsNull() && edg2.IsNull() ) { - return Standard_False; - } - - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - - // Case with 2 edges connected to the vertex - if ( !edg1.IsNull() && !edg2.IsNull() ) { - if ( !AIS::ComputeGeometry(edg1,edg2, - curv1,curv2, - firstp1, lastp1, - firstp2, lastp2,myPlane)) - return Standard_False; - - gp_Dir d1, d2; - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - d1 = ComputeCircleDirection(Handle(Geom_Circle)::DownCast (curv1), VERT); - } - else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - d1 = ComputeLineDirection(Handle(Geom_Line)::DownCast (curv1), firstp1); - } - else - return Standard_False; - - if ( curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - d2 = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv2), VERT); - } - else if (curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - d2 =ComputeLineDirection( Handle(Geom_Line)::DownCast (curv2), firstp2); - } - else - return Standard_False; - - if ( !d1.IsParallel(d2, Precision::Angular() )) - dF.SetXYZ( (d1.XYZ() + d2.XYZ())/2 ); - else { - dF= d1.Crossed(myPlane->Pln().Axis().Direction()); - } - } - - // Case where is at an extremity of a wire. - else { - TopoDS_Edge VEdge; - if ( !edg1.IsNull() ) - VEdge = edg1; - else if (!edg2.IsNull() ) - VEdge = edg2; - else - return Standard_False; - - if ( !AIS::ComputeGeometry(VEdge, curv1, firstp1, lastp1) ) - return Standard_False; - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - dF = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv1), VERT); - } - else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - dF = ComputeLineDirection( Handle(Geom_Line)::DownCast (curv1), firstp1); - } - else - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeLineDirection -//purpose : -//======================================================================= -gp_Dir AIS_IdenticRelation::ComputeLineDirection(const Handle(Geom_Line)& lin, - const gp_Pnt& firstP) const -{ - gp_Dir dir; - dir = lin->Lin().Direction(); - if ( !myFAttach.IsEqual(firstP, Precision::Confusion()) ) - dir.Reverse(); - return dir; -} - -//======================================================================= -//function : ComputeCircleDirection -//purpose : -//======================================================================= -gp_Dir AIS_IdenticRelation::ComputeCircleDirection(const Handle(Geom_Circle)& circ, - const TopoDS_Vertex& VERT) const -{ - gp_Vec V(circ->Location(),BRep_Tool::Pnt(VERT)); - return gp_Dir(V); -} - -//======================================================================= -//function : ComputeOneEdgeOVertexPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeOneEdgeOVertexPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - TopoDS_Vertex V; - TopoDS_Edge E; - Standard_Integer numedge; - - if (myFShape.ShapeType() == TopAbs_VERTEX) { - V = TopoDS::Vertex(myFShape); - E = TopoDS::Edge(mySShape); - numedge = 2;// edge = 2nd shape - } - else { - V = TopoDS::Vertex(mySShape); - E = TopoDS::Edge(myFShape); - numedge = 1; // edge = 1st shape - } - gp_Pnt ptonedge1,ptonedge2; - Handle(Geom_Curve) aCurve; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - if (!AIS::ComputeGeometry(E,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,myPlane)) - return; - aPrs->SetInfiniteState(isInfinite); - AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex); - - // only the curve can be projected - if (!isOnPlanEdge && !isOnPlanVertex) return; - - if (!isOnPlanEdge) { - if (numedge == 1) myExtShape = 1; - else myExtShape = 2; - } - else if (!isOnPlanVertex) { - if (numedge == 1) myExtShape = 2; - else myExtShape = 1; - } - // The attachement points are the point - myFAttach = BRep_Tool::Pnt(V); - mySAttach = myFAttach; - - gp_Pnt curpos; - if (myAutomaticPosition) { - //Computation of the size of the symbol - Standard_Real symbsize = ComputeSegSize(); - symbsize*=5; - // Computation of the direction of the segment of the presentation - // we take the median of the edges connected to vertices - gp_Dir myDir; - if ( aCurve->IsKind(STANDARD_TYPE(Geom_Line))) { - myDir = Handle(Geom_Line)::DownCast (aCurve)->Lin().Direction(); - myDir.Cross(myPlane->Pln().Axis().Direction()); - } - else if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle))) { - Handle(Geom_Circle) CIR = Handle(Geom_Circle)::DownCast (aCurve); - myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); - } - // jfa 10/10/2000 - else if (aCurve->IsKind(STANDARD_TYPE(Geom_Ellipse))) { - Handle(Geom_Ellipse) CIR = Handle(Geom_Ellipse)::DownCast (aCurve); - myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); - } - // jfa 10/10/2000 end - - curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - else { - curpos = myPosition; - } - - // Presentation computation - TCollection_ExtendedString vals(" -+-"); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - curpos); - if (myExtShape != 0) { - if (!extCurv.IsNull()) { // the edge is not in the WP - ComputeProjEdgePresentation(aPrs,E,Handle(Geom_Line)::DownCast (aCurve),ptonedge1,ptonedge2); - } - } -} diff --git a/src/AIS/AIS_IdenticRelation.hxx b/src/AIS/AIS_IdenticRelation.hxx deleted file mode 100644 index ef729100d9..0000000000 --- a/src/AIS/AIS_IdenticRelation.hxx +++ /dev/null @@ -1,126 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -#ifndef _AIS_IdenticRelation_HeaderFile -#define _AIS_IdenticRelation_HeaderFile - -#include -#include -#include -#include -#include - -class TopoDS_Shape; -class Geom_Plane; -class Geom_Line; -class gp_Pnt; -class Geom_Circle; -class Geom_Ellipse; -class TopoDS_Wire; -class TopoDS_Vertex; -class gp_Dir; - -DEFINE_STANDARD_HANDLE(AIS_IdenticRelation, AIS_Relation) - -//! Constructs a constraint by a relation of identity -//! between two or more datums figuring in shape -//! Interactive Objects. -class AIS_IdenticRelation : public AIS_Relation -{ - -public: - - //! Initializes the relation of identity between the two - //! entities, FirstShape and SecondShape. The plane - //! aPlane is initialized in case a visual reference is - //! needed to show identity. - Standard_EXPORT AIS_IdenticRelation(const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - Standard_Boolean HasUsers() const { return !myUsers.IsEmpty(); } - - const TColStd_ListOfTransient& Users() const { return myUsers; } - - void AddUser (const Handle(Standard_Transient)& theUser) { myUsers.Append (theUser); } - - void ClearUsers() { myUsers.Clear(); } - - //! Returns true if the interactive object is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } - - DEFINE_STANDARD_RTTIEXT(AIS_IdenticRelation,AIS_Relation) - -private: - - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeOneEdgeOVertexPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoLinesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Line)& aLin, gp_Pnt& Pnt1On1, gp_Pnt& Pnt2On1, gp_Pnt& Pnt1On2, gp_Pnt& Pnt2On2, const Standard_Boolean isInf1, const Standard_Boolean isInf2); - - Standard_EXPORT void ComputeTwoCirclesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Circle)& aCircle, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of automatic presentation - Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); - - //! Computes the presentation of the identic constraint - //! between 2 circles in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoCircPresentation (const Handle(Geom_Circle)& aCircle); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); - - Standard_EXPORT void ComputeTwoEllipsesPresentation (const Handle(Prs3d_Presentation)& aPrs, const Handle(Geom_Ellipse)& anEll, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of automatic presentation - Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); - - //! Computes the presentation of the identic constraint - //! between 2 ellipses in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoElipsPresentation (const Handle(Geom_Ellipse)& theEll); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); - - Standard_EXPORT void ComputeTwoVerticesPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT Standard_Real ComputeSegSize() const; - - Standard_EXPORT Standard_Boolean ComputeDirection (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, gp_Dir& aDir) const; - - Standard_EXPORT gp_Dir ComputeLineDirection (const Handle(Geom_Line)& aLin, const gp_Pnt& anExtremity) const; - - Standard_EXPORT gp_Dir ComputeCircleDirection (const Handle(Geom_Circle)& aCirc, const TopoDS_Vertex& ConnectedVertex) const; - -private: - - TColStd_ListOfTransient myUsers; - Standard_Boolean isCircle; - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Pnt myCenter; - -}; - -#endif // _AIS_IdenticRelation_HeaderFile diff --git a/src/AIS/AIS_KindOfDimension.hxx b/src/AIS/AIS_KindOfDimension.hxx deleted file mode 100644 index a4e910cddb..0000000000 --- a/src/AIS/AIS_KindOfDimension.hxx +++ /dev/null @@ -1,40 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_KindOfDimension_HeaderFile -#define _AIS_KindOfDimension_HeaderFile - -//! Declares the kinds of dimensions needed in the -//! display of Interactive Objects. -enum AIS_KindOfDimension -{ -AIS_KOD_NONE, -AIS_KOD_LENGTH, -AIS_KOD_PLANEANGLE, -AIS_KOD_SOLIDANGLE, -AIS_KOD_AREA, -AIS_KOD_VOLUME, -AIS_KOD_MASS, -AIS_KOD_TIME, -AIS_KOD_RADIUS, -AIS_KOD_DIAMETER, -AIS_KOD_CHAMF2D, -AIS_KOD_CHAMF3D, -AIS_KOD_OFFSET, -AIS_KOD_ELLIPSERADIUS -}; - -#endif // _AIS_KindOfDimension_HeaderFile diff --git a/src/AIS/AIS_KindOfRelation.hxx b/src/AIS/AIS_KindOfRelation.hxx deleted file mode 100644 index d503082d0f..0000000000 --- a/src/AIS/AIS_KindOfRelation.hxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 2016-11-25 -// Copyright (c) 2016 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. - -#ifndef _AIS_KindOfRelation_HeaderFile -#define _AIS_KindOfRelation_HeaderFile - -enum AIS_KindOfRelation -{ - AIS_KOR_NONE = 0, - AIS_KOR_CONCENTRIC, - AIS_KOR_EQUALDISTANCE, - AIS_KOR_EQUALRADIUS, - AIS_KOR_FIX, - AIS_KOR_IDENTIC, - AIS_KOR_OFFSET, - AIS_KOR_PARALLEL, - AIS_KOR_PERPENDICULAR, - AIS_KOR_TANGENT, - AIS_KOR_SYMMETRIC -}; - -#endif diff --git a/src/AIS/AIS_KindOfSurface.hxx b/src/AIS/AIS_KindOfSurface.hxx deleted file mode 100644 index b20773d724..0000000000 --- a/src/AIS/AIS_KindOfSurface.hxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_KindOfSurface_HeaderFile -#define _AIS_KindOfSurface_HeaderFile - - -enum AIS_KindOfSurface -{ -AIS_KOS_Plane, -AIS_KOS_Cylinder, -AIS_KOS_Cone, -AIS_KOS_Sphere, -AIS_KOS_Torus, -AIS_KOS_Revolution, -AIS_KOS_Extrusion, -AIS_KOS_OtherSurface -}; - -#endif // _AIS_KindOfSurface_HeaderFile diff --git a/src/AIS/AIS_KindOfUnit.hxx b/src/AIS/AIS_KindOfUnit.hxx deleted file mode 100644 index 835bfa24de..0000000000 --- a/src/AIS/AIS_KindOfUnit.hxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_KindOfUnit_HeaderFile -#define _AIS_KindOfUnit_HeaderFile - -//! Declares the type of Interactive Object unit. -enum AIS_KindOfUnit -{ -AIS_TOU_LENGTH, -AIS_TOU_SURFACE, -AIS_TOU_VOLUME, -AIS_TOU_PLANE_ANGLE, -AIS_TOU_SOLID_ANGLE, -AIS_TOU_MASS, -AIS_TOU_FORCE, -AIS_TOU_TIME -}; - -#endif // _AIS_KindOfUnit_HeaderFile diff --git a/src/AIS/AIS_LengthDimension.cxx b/src/AIS/AIS_LengthDimension.cxx deleted file mode 100755 index 6b919881b6..0000000000 --- a/src/AIS/AIS_LengthDimension.cxx +++ /dev/null @@ -1,826 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Arnaud BOUZY/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2013 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_LengthDimension,AIS_Dimension) - -//======================================================================= -//function : Constructor -//purpose : Dimension between two faces -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFirstFace, theSecondFace); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two shape -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFace, theEdge); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two points -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFirstPoint, theSecondPoint, thePlane); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two shape -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetCustomPlane (thePlane); - SetMeasuredShapes (theFirstShape, theSecondShape); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension of one edge -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theEdge, thePlane); - SetFlyout (15.0); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane) -{ - myFirstPoint = theFirstPoint; - mySecondPoint = theSecondPoint; - myFirstShape = BRepLib_MakeVertex (myFirstPoint); - mySecondShape = BRepLib_MakeVertex (mySecondPoint); - myGeometryType = GeometryType_Points; - SetCustomPlane (thePlane); - myIsGeometryValid = IsValidPoints (theFirstPoint, theSecondPoint); - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane) -{ - myFirstShape = theEdge; - mySecondShape = TopoDS_Shape(); - myGeometryType = GeometryType_Edge; - SetCustomPlane (thePlane); - myIsGeometryValid = InitOneShapePoints (myFirstShape); - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -{ - SetMeasuredShapes (theFirstFace, theSecondFace); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge) -{ - SetMeasuredShapes (theFace, theEdge); -} - -//======================================================================= -//function : SetMeasuredShapes -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape) -{ - gp_Pln aComputedPlane; - Standard_Boolean isPlaneReturned = Standard_False; - - myFirstShape = theFirstShape; - mySecondShape = theSecondShape; - myIsGeometryValid = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - if (isPlaneReturned) - { - myPlane = aComputedPlane; - } - else - { - myIsGeometryValid = Standard_False; - } - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::CheckPlane (const gp_Pln& thePlane) const -{ - Standard_Boolean anIsFaultyNormal = - thePlane.Axis().Direction().IsParallel(gce_MakeDir (myFirstPoint, mySecondPoint), Precision::Angular()); - - if ((!thePlane.Contains (myFirstPoint, Precision::Confusion()) && !thePlane.Contains (mySecondPoint, Precision::Confusion())) - || anIsFaultyNormal) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -gp_Pln AIS_LengthDimension::ComputePlane (const gp_Dir& theAttachDir) const -{ - if (!IsValidPoints (myFirstPoint, mySecondPoint)) - { - return gp_Pln(); - } - - gp_Pnt aThirdPoint (myFirstPoint.Translated (gp_Vec(theAttachDir))); - gce_MakePln aPlaneConstrustor (myFirstPoint, mySecondPoint, aThirdPoint); - return aPlaneConstrustor.Value(); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_LengthDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_LengthDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_LengthDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_LengthDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_LengthDimension::ComputeValue() const -{ - if (!IsValid()) - return 0.0; - - if (!myHasCustomDirection) - return myFirstPoint.Distance (mySecondPoint); - - return fabs (gp_Vec(myFirstPoint, mySecondPoint).Dot (myDirection)); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_LengthDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - DrawLinearDimension (thePresentation, theMode, myFirstPoint, mySecondPoint); -} - - //======================================================================= -//function : ComputeFlyoutLinePoints -//purpose : -//======================================================================= -void AIS_LengthDimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) -{ - if (!myHasCustomDirection) - { - AIS_Dimension::ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, theLineBegPoint, theLineEndPoint); - return; - } - - // find scalar of projection target vector (from start to second point) to flyout vector - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Vec aFlyoutNormalizedDir(aPlaneNormal.Direction() ^ myDirection); - aFlyoutNormalizedDir.Normalize(); - Standard_Real aTargetProjectedToFlyout = gp_Vec(theFirstPoint, theSecondPoint).Dot (aFlyoutNormalizedDir); - - gp_Dir aFlyoutVector = aFlyoutNormalizedDir; - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout() + aTargetProjectedToFlyout, aLine1); - theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : -//======================================================================= -void AIS_LengthDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) -{ - if (!IsValid()) - { - return; - } - - ComputeLinearFlyouts (theSelection, theEntityOwner, myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : IsValidPoints -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) const -{ - return theFirstPoint.Distance (theSecondPoint) > Precision::Confusion(); -} - -//======================================================================= -//function : InitTwoEdgesLength -//purpose : Initialization of dimension between two linear edges -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitTwoEdgesLength (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - gp_Dir& theDirAttach) -{ - BRepAdaptor_Curve aFirstCurveAdapt (theFirstEdge); - if (aFirstCurveAdapt.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - BRepAdaptor_Curve aSecondCurveAdapt (theSecondEdge); - if (aSecondCurveAdapt.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Handle(Geom_Curve) aFirstCurve; - Handle(Geom_Curve) aSecondCurve; - - gp_Pnt aPoint11 (gp::Origin()); - gp_Pnt aPoint12 (gp::Origin()); - gp_Pnt aPoint21 (gp::Origin()); - gp_Pnt aPoint22 (gp::Origin()); - Standard_Boolean isFirstInfinite = Standard_False; - Standard_Boolean isSecondInfinite = Standard_False; - - if (!AIS::ComputeGeometry (theFirstEdge, theSecondEdge, - aFirstCurve, aSecondCurve, - aPoint11, aPoint12, - aPoint21, aPoint22, - isFirstInfinite, - isSecondInfinite)) - { - return Standard_False; - } - - const Handle(Geom_Line) aFirstLine = Handle(Geom_Line)::DownCast (aFirstCurve); - const Handle(Geom_Line) aSecondLine = Handle(Geom_Line)::DownCast (aSecondCurve); - - if (!aFirstLine->Lin().Direction().IsParallel (aSecondLine->Lin().Direction(),Precision::Angular())) - { - return Standard_False; - } - - theDirAttach = aFirstLine->Lin().Direction(); - - gp_Pnt aPoint; - - if (!isFirstInfinite) - { - if (AIS::Nearest (aSecondCurve, aPoint11, aPoint21, aPoint22, aPoint)) - { - myFirstPoint = aPoint11; - mySecondPoint = aPoint; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (AIS::Nearest (aSecondCurve, aPoint12, aPoint21, aPoint22, aPoint)) - { - myFirstPoint = aPoint12; - mySecondPoint = aPoint; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - } - - if (!isSecondInfinite) - { - if (AIS::Nearest (aFirstCurve, aPoint21, aPoint11, aPoint12, aPoint)) - { - myFirstPoint = aPoint; - mySecondPoint = aPoint21; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - if (AIS::Nearest (aFirstCurve, aPoint22, aPoint11, aPoint12, aPoint)) - { - myFirstPoint = aPoint; - mySecondPoint = aPoint22; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - } - - GeomAPI_ExtremaCurveCurve anExtrema (aFirstCurve, aSecondCurve); - anExtrema.NearestPoints (myFirstPoint, mySecondPoint); - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitEdgeVertexLength -//purpose : for first edge and second vertex shapes -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitEdgeVertexLength (const TopoDS_Edge& theEdge, - const TopoDS_Vertex& theVertex, - gp_Dir& theEdgeDir, - Standard_Boolean isInfinite) -{ - gp_Pnt anEdgePoint1 (gp::Origin()); - gp_Pnt anEdgePoint2 (gp::Origin()); - Handle(Geom_Curve) aCurve; - - if (!AIS::ComputeGeometry (theEdge, aCurve, anEdgePoint1, anEdgePoint2, isInfinite)) - { - return Standard_False; - } - - myFirstPoint = BRep_Tool::Pnt (theVertex); - - Handle(Geom_Line) aGeomLine (Handle(Geom_Line)::DownCast (aCurve)); - const gp_Lin& aLin = aGeomLine->Lin(); - - // Get direction of edge to build plane automatically. - theEdgeDir = aLin.Direction(); - - mySecondPoint = AIS::Nearest (aLin, myFirstPoint); - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitEdgeFaceLength -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitEdgeFaceLength (const TopoDS_Edge& theEdge, - const TopoDS_Face& theFace, - gp_Dir& theEdgeDir) -{ - theEdgeDir = gp::DX(); - - // Find attachment points (closest distance between the edge and the face) - BRepExtrema_DistShapeShape aDistAdaptor (theEdge, theFace, Extrema_ExtFlag_MIN); - if (!aDistAdaptor.IsDone() || aDistAdaptor.NbSolution() <1) - { - return Standard_False; - } - myFirstPoint = aDistAdaptor.PointOnShape1 (1); - mySecondPoint = aDistAdaptor.PointOnShape2 (1); - - // Take direction for dimension line (will be orthogonalized later) parallel to edge - BRepAdaptor_Curve aCurveAdaptor (theEdge); - Standard_Real aParam; - if (aDistAdaptor.SupportOnShape1 (1).ShapeType() == TopAbs_EDGE) - { - aDistAdaptor.ParOnEdgeS1 (1, aParam); - } - else - { - Standard_Real aD1 = aCurveAdaptor.Value(aCurveAdaptor.FirstParameter()).SquareDistance (myFirstPoint); - Standard_Real aD2 = aCurveAdaptor.Value(aCurveAdaptor.LastParameter()).SquareDistance (myFirstPoint); - aParam = (aD1 < aD2 ? aCurveAdaptor.FirstParameter() : aCurveAdaptor.LastParameter()); - } - gp_Pnt aP; - gp_Vec aV; - aCurveAdaptor.D1 (aParam, aP, aV); - if (aV.SquareMagnitude() > gp::Resolution()) - { - theEdgeDir = aV; - } - - // reverse direction if parameter is close to the end of the curve, - // to reduce chances to have overlapping between dimension line and edge - if (Abs (aParam - aCurveAdaptor.FirstParameter()) < Abs (aParam - aCurveAdaptor.LastParameter())) - { - theEdgeDir.Reverse(); - } - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitTwoShapesPoints -//purpose : Initialization of two points where dimension layouts -// will be attached -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - gp_Pln& theComputedPlane, - Standard_Boolean& theIsPlaneComputed) -{ - theIsPlaneComputed = Standard_False; - gp_Dir aDirAttach; - Standard_Boolean isInfinite = Standard_False; - Standard_Boolean isSuccess = Standard_False; - switch (theFirstShape.ShapeType()) - { - case TopAbs_FACE: - { - // Initialization for face - gp_Pln aFirstPlane; - Handle(Geom_Surface) aFirstSurface; - AIS_KindOfSurface aFirstSurfKind; - Standard_Real aFirstOffset; - - TopoDS_Face aFirstFace = TopoDS::Face (theFirstShape); - - AIS::InitFaceLength (TopoDS::Face (theFirstShape), - aFirstPlane, - aFirstSurface, - aFirstSurfKind, - aFirstOffset); - - if (theSecondShape.ShapeType() == TopAbs_FACE) - { - // Initialization for face - myGeometryType = GeometryType_Faces; - gp_Pln aSecondPlane; - Handle(Geom_Surface) aSecondSurface; - AIS_KindOfSurface aSecondSurfKind; - Standard_Real aSecondOffset; - - TopoDS_Face aSecondFace = TopoDS::Face (theSecondShape); - - AIS::InitFaceLength (aSecondFace, - aSecondPlane, - aSecondSurface, - aSecondSurfKind, - aSecondOffset); - - if (aFirstSurfKind == AIS_KOS_Plane) - { - if (!aFirstPlane.Axis().Direction().IsParallel (aSecondPlane.Axis().Direction(), Precision::Angular())) - { - return Standard_False; - } - - TopExp_Explorer anExplorer (theFirstShape, TopAbs_VERTEX); - - // In case of infinite planes - if (!anExplorer.More()) - { - myFirstPoint = aFirstPlane.Location(); - } - else - { - myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); - } - - mySecondPoint = AIS::ProjectPointOnPlane (myFirstPoint, aSecondPlane); - - Standard_Real anU, aV; - ElSLib::Parameters (aSecondPlane, mySecondPoint, anU, aV); - - BRepTopAdaptor_FClass2d aClassifier (aSecondFace, Precision::Confusion()); - TopAbs_State aState = aClassifier.Perform (gp_Pnt2d (anU, aV), Standard_False); - - if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) - { - mySecondPoint = AIS::Nearest (aSecondFace, myFirstPoint); - } - - isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); - if (isSuccess) - { - theComputedPlane = ComputePlane (aFirstPlane.Position().XDirection()); - theIsPlaneComputed = Standard_True; - } - } - else // curvilinear faces - { - Standard_Real aU1Min, aV1Min, aU1Max, aV1Max; - Standard_Real aU2Min, aV2Min, aU2Max, aV2Max; - BRepTools::UVBounds (aFirstFace, aU1Min, aU1Max, aV1Min, aV1Max); - BRepTools::UVBounds (aSecondFace, aU2Min, aU2Max, aV2Min, aV2Max); - - GeomAPI_ExtremaSurfaceSurface anExtrema (aFirstSurface, aSecondSurface, - aU1Min, aU1Max, aV1Min, aV1Max, - aU2Min, aU2Max, aV2Min, aV2Max); - - Standard_Real aU1, aV1, aU2, aV2; - anExtrema.LowerDistanceParameters (aU1, aV1, aU2, aV2); - myFirstPoint = BRep_Tool::Surface (aFirstFace)->Value (aU1, aV1); - mySecondPoint = BRep_Tool::Surface (aSecondFace)->Value (aU2, aV2); - - // Adjust automatic plane - gp_Ax2 aLocalAxes (myFirstPoint, gce_MakeDir (myFirstPoint, mySecondPoint)); - aDirAttach = gce_MakeDir (aLocalAxes.XDirection ()); - - // Check points - isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - } - - return isSuccess && IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_EdgeFace; - isSuccess = InitEdgeFaceLength (TopoDS::Edge (theSecondShape), - TopoDS::Face (theFirstShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_EDGE: - { - if (theSecondShape.ShapeType() == TopAbs_VERTEX) - { - myGeometryType = GeometryType_EdgeVertex; - isSuccess = InitEdgeVertexLength (TopoDS::Edge (theFirstShape), - TopoDS::Vertex (theSecondShape), - aDirAttach, - isInfinite); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_Edges; - isSuccess = InitTwoEdgesLength (TopoDS::Edge (theFirstShape), - TopoDS::Edge (theSecondShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - else if (theSecondShape.ShapeType() == TopAbs_FACE) - { - myGeometryType = GeometryType_EdgeFace; - isSuccess = InitEdgeFaceLength (TopoDS::Edge (theFirstShape), - TopoDS::Face (theSecondShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_VERTEX: - { - if (theSecondShape.ShapeType() == TopAbs_VERTEX) - { - myGeometryType = GeometryType_Points; - myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (theFirstShape)); - mySecondPoint = BRep_Tool::Pnt (TopoDS::Vertex (theSecondShape)); - - return IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_EdgeVertex; - isSuccess = InitEdgeVertexLength (TopoDS::Edge(theSecondShape), - TopoDS::Vertex(theFirstShape), - aDirAttach, - isInfinite); - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - case TopAbs_WIRE: - case TopAbs_SHAPE: - break; - } - - return Standard_False; -} - -//======================================================================= -//function : InitOneShapePoints -//purpose : Initialization of two points where dimension layouts -// will be attached -// Attention: 1) can be only the edge in currect implementation -// 2) No length for infinite edge -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitOneShapePoints (const TopoDS_Shape& theShape) -{ - if (theShape.ShapeType() != TopAbs_EDGE) - { - return Standard_False; - } - - TopoDS_Edge anEdge = TopoDS::Edge (theShape); - - BRepAdaptor_Curve aBrepCurve(anEdge); - Standard_Real aFirst = aBrepCurve.FirstParameter(); - Standard_Real aLast = aBrepCurve.LastParameter(); - - if (aBrepCurve.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Standard_Boolean isInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - if (isInfinite) - { - return Standard_False; - } - - myFirstPoint = aBrepCurve.Value (aBrepCurve.FirstParameter()); - mySecondPoint = aBrepCurve.Value (aBrepCurve.LastParameter()); - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_LengthDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : SetTextPosition -//purpose : -//======================================================================= -void AIS_LengthDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} - -//======================================================================= -//function : SetDirection -//purpose : -//======================================================================= -void AIS_LengthDimension::SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection) -{ - myHasCustomDirection = theUseDirection; - if (myHasCustomDirection) - myDirection = theDirection; -} diff --git a/src/AIS/AIS_LengthDimension.hxx b/src/AIS/AIS_LengthDimension.hxx deleted file mode 100755 index 44eef508e6..0000000000 --- a/src/AIS/AIS_LengthDimension.hxx +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (c) 1999-2013 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. - -#ifndef _AIS_LengthDimension_HeaderFile -#define _AIS_LengthDimension_HeaderFile - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DEFINE_STANDARD_HANDLE (AIS_LengthDimension, AIS_Dimension) - -//! Length dimension. Can be constructued: -//! - Between two generic points. -//! - Between two vertices. -//! - Between two faces. -//! - Between two parallel edges. -//! - Between face and edge. -//! -//! In case of two points (vertices) or one linear edge the user-defined plane -//! that includes this geometry is necessary to be set. -//! -//! In case of face-edge, edge-vertex or face-face lengthes the automatic plane -//! computing is allowed. For this plane the third point is found on the -//! edge or on the face. -//! -//! Please note that if the inappropriate geometry is defined -//! or the distance between measured points is less than -//! Precision::Confusion(), the dimension is invalid and its -//! presentation can not be computed. -class AIS_LengthDimension : public AIS_Dimension -{ -public: - - //! Construct length dimension between face and edge. - //! Here dimension can be built without user-defined plane. - //! @param theFace [in] the face (first shape). - //! @param theEdge [in] the edge (second shape). - Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge); - - //! Construct length dimension between two faces. - //! @param theFirstFace [in] the first face (first shape). - //! @param theSecondFace [in] the second face (second shape). - Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Construct length dimension between two points in - //! the specified plane. - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane); - - //! Construct length dimension between two arbitrary shapes in - //! the specified plane. - //! @param theFirstShape [in] the first shape. - //! @param theSecondShape [in] the second shape. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - const gp_Pln& thePlane); - - //! Construct length dimension of linear edge. - //! @param theEdge [in] the edge to measure. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane); - -public: - - //! @return first attachement point. - const gp_Pnt& FirstPoint() const - { - return myFirstPoint; - } - - //! @return second attachement point. - const gp_Pnt& SecondPoint() const - { - return mySecondPoint; - } - - //! @return first attachement shape. - const TopoDS_Shape& FirstShape() const - { - return myFirstShape; - } - - //! @return second attachement shape. - const TopoDS_Shape& SecondShape() const - { - return mySecondShape; - } - -public: - - //! Measure distance between two points. - //! The dimension will become invalid if the new distance between - //! attachement points is less than Precision::Confusion(). - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - //! @param thePlane [in] the user-defined plane - Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane); - - //! Measure length of edge. - //! The dimension will become invalid if the new length of edge - //! is less than Precision::Confusion(). - //! @param theEdge [in] the edge to measure. - //! @param thePlane [in] the user-defined plane - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane); - - //! Measure distance between two faces. - //! The dimension will become invalid if the distance can not - //! be measured or it is less than Precision::Confusion(). - //! @param theFirstFace [in] the first face (first shape). - //! @param theSecondFace [in] the second face (second shape). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Measure distance between face and edge. - //! The dimension will become invalid if the distance can not - //! be measured or it is less than Precision::Confusion(). - //! @param theFace [in] the face (first shape). - //! @param theEdge [in] the edge (second shape). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge); - - //! Measure distance between generic pair of shapes (edges, vertices, length), - //! where measuring is applicable. - //! @param theFirstShape [in] the first shape. - //! @param theSecondShape [in] the second shape. - Standard_EXPORT void SetMeasuredShapes (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - - //! Set custom direction for dimension. If it is not set, the direction is obtained - //! from the measured geometry (e.g. line between points of dimension) - //! The direction does not change flyout direction of dimension. - //! @param theDirection [in] the dimension direction. - //! @param theUseDirection [in] boolean value if custom direction should be used. - Standard_EXPORT void SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection = Standard_True); - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_LengthDimension,AIS_Dimension) - -protected: - - //! Checks if the plane includes first and second points to build dimension. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual gp_Pln ComputePlane(const gp_Dir& theAttachDir) const; - - //! Computes distance between dimension points. If custom direction is defined, the distance - //! is a projection value of the distance between points to this direction - //! @return dimension value - Standard_EXPORT Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - //! Computes points bounded the flyout line for linear dimension. - //! Direction of flyout line equal to the custom direction of dimension if defined or - //! parallel to the main direction line - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theLineBegPoint [out] the first attach point of linear dimension. - //! @param theLineEndPoint [out] the second attach point of linear dimension. - Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; - -protected: - - //! Checks that distance between two points is valid. - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) const; - - Standard_EXPORT Standard_Boolean InitTwoEdgesLength (const TopoDS_Edge & theFirstEdge, - const TopoDS_Edge& theSecondEdge, - gp_Dir& theEdgeDir); - - //! Auxiliary method for InitTwoShapesPoints() - //! in case of the distance between edge and vertex. - //! Finds the point on the edge that is the closest one to . - //! @param theEdgeDir [out] is the direction on the edge to build - //! automatical plane. - Standard_EXPORT Standard_Boolean InitEdgeVertexLength (const TopoDS_Edge& theEdge, - const TopoDS_Vertex& theVertex, - gp_Dir& theEdgeDir, - Standard_Boolean isInfinite); - - //! Auxiliary method for InitTwoShapesPoints() - //! in case of the distance between face and edge. - //! The first attachment point is first parameter point from . - //! Find the second attachment point which belongs to - //! Iterate over the edges of the face and find the closest point according - //! to finded point on edge. - //! @param theEdgeDir [out] is the direction on the edge to build - //! automatical plane. - Standard_EXPORT Standard_Boolean InitEdgeFaceLength (const TopoDS_Edge& theEdge, - const TopoDS_Face& theFace, - gp_Dir& theEdgeDir); - - //! Initialization of two attach points in case of two owner shapes. - Standard_EXPORT Standard_Boolean InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - gp_Pln& theComputedPlane, - Standard_Boolean& theIsPlaneComputed); - - //! Initialization of two attach points in case of one owner shape. - Standard_EXPORT Standard_Boolean InitOneShapePoints (const TopoDS_Shape& theShape); - -private: - - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - TopoDS_Shape myFirstShape; - TopoDS_Shape mySecondShape; - gp_Dir myDirection; - Standard_Boolean myHasCustomDirection; -}; - -#endif // _AIS_LengthDimension_HeaderFile diff --git a/src/AIS/AIS_MaxRadiusDimension.cxx b/src/AIS/AIS_MaxRadiusDimension.cxx deleted file mode 100644 index 0efd40848b..0000000000 --- a/src/AIS/AIS_MaxRadiusDimension.cxx +++ /dev/null @@ -1,312 +0,0 @@ -// Created on: 1998-01-23 -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_MaxRadiusDimension,AIS_EllipseRadiusDimension) - -//======================================================================= -//function : AIS_MaxRadiusDimension -//purpose : -//======================================================================= -AIS_MaxRadiusDimension::AIS_MaxRadiusDimension(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_MaxRadiusDimension -//purpose : -//======================================================================= - -AIS_MaxRadiusDimension::AIS_MaxRadiusDimension(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_MaxRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer /*aMode*/) -{ -// if( myAutomaticPosition ) - {//ota : recompute in any case - ComputeGeometry(); - myEllipse.SetMajorRadius(myVal); - gp_Vec v1(myEllipse.XAxis().Direction()); - v1 *=myVal; - myApexP = myEllipse.Location().Translated(v1); - myApexN = myEllipse.Location().Translated(-v1); - } - if(myIsAnArc) ComputeArcOfEllipse(aPresentation); - else - ComputeEllipse(aPresentation); -} - -//======================================================================= -//function : ComputeEllipse -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::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.XAxis()); - U = ElCLib::Parameter ( L1, curPos ); - curPos = ElCLib::Value (U, L1); - if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) - myEndOfArrow = myApexP ; - else - myEndOfArrow = myApexN ; - } - - // Presenatation - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, - myEndOfArrow, Center, Standard_True, mySymbolPrs); - -} - -//======================================================================= -//function : ComputeArcOfEllipse -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::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; -// ElSLib::Parameters ( myPlane->Pln(), curPos, U, V ); -// curPos = ElSLib::Value (U, V, myPlane->Pln()); - gp_Lin L1(myEllipse.XAxis()); - 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 parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - 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_MaxRadiusDimension::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 ); - } - } - -} diff --git a/src/AIS/AIS_MaxRadiusDimension.hxx b/src/AIS/AIS_MaxRadiusDimension.hxx deleted file mode 100644 index a952ceb601..0000000000 --- a/src/AIS/AIS_MaxRadiusDimension.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 1998-01-22 -// 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. - -#ifndef _AIS_MaxRadiusDimension_HeaderFile -#define _AIS_MaxRadiusDimension_HeaderFile - -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_MaxRadiusDimension, AIS_EllipseRadiusDimension) - -//! Ellipse Max radius dimension of a Shape which can be Edge -//! or Face (planar or cylindrical(surface of extrusion or -//! surface of offset)) -class AIS_MaxRadiusDimension : public AIS_EllipseRadiusDimension -{ - DEFINE_STANDARD_RTTIEXT(AIS_MaxRadiusDimension, AIS_EllipseRadiusDimension) -public: - - //! Max Ellipse radius dimension - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Max Ellipse radius dimension with position - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myApexP; - gp_Pnt myApexN; - gp_Pnt myEndOfArrow; - -}; - -#endif // _AIS_MaxRadiusDimension_HeaderFile diff --git a/src/AIS/AIS_MidPointRelation.cxx b/src/AIS/AIS_MidPointRelation.cxx deleted file mode 100644 index 13e8dee989..0000000000 --- a/src/AIS/AIS_MidPointRelation.cxx +++ /dev/null @@ -1,695 +0,0 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_MidPointRelation,AIS_Relation) - -//======================================================================= -//function : AIS_MidPointRelation -//purpose : -//======================================================================= -AIS_MidPointRelation::AIS_MidPointRelation(const TopoDS_Shape& aMidPointTool, - const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation(), - myTool(aMidPointTool) -{ - SetFirstShape(FirstShape); - SetSecondShape(SecondShape); - SetPlane(aPlane); - myPosition = aPlane->Pln().Location(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_MidPointRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - if (myTool.ShapeType() == TopAbs_VERTEX) - { - gp_Pnt pp; - Standard_Boolean isonplane; - if ( AIS::ComputeGeometry(TopoDS::Vertex(myTool),pp,myPlane,isonplane) ) - { - if ( !isonplane ) ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myTool),pp); - } - myMidPoint = pp; - } - else return; - - if ( myAutomaticPosition ) myPosition = myMidPoint; - - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeFaceFromPnt(aprs, Standard_True); - } - break; - case TopAbs_EDGE : - { - ComputeEdgeFromPnt(aprs, Standard_True); - } - break; - case TopAbs_VERTEX : - { - ComputeVertexFromPnt(aprs, Standard_True); - } - break; - default: - break; - } - - switch (mySShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeFaceFromPnt(aprs, Standard_False); - } - break; - case TopAbs_EDGE : - { - ComputeEdgeFromPnt(aprs, Standard_False); - } - break; - case TopAbs_VERTEX : - { - ComputeVertexFromPnt(aprs, Standard_False); - } - break; - default: - break; - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, - const Standard_Integer) -{ - Handle(Select3D_SensitiveSegment) seg; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - if ( !myMidPoint.IsEqual(myFAttach,Precision::Confusion()) ) - { - // segment from mid point to the first geometry - seg = new Select3D_SensitiveSegment(own,myFAttach,myMidPoint); - aSel->Add(seg); - // segment from mid point to the second geometry - seg = new Select3D_SensitiveSegment(own,mySAttach,myMidPoint); - aSel->Add(seg); - } - if ( !myMidPoint.IsEqual(myPosition,Precision::Confusion()) ) - { - // segment from mid point to the text position - seg = new Select3D_SensitiveSegment(own,myMidPoint,myPosition); - aSel->Add(seg); - } - - // center of the symmetry - circle around the MidPoint - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - ax.SetLocation(myMidPoint); - Standard_Real rad = myFAttach.Distance(myMidPoint)/20.0; - gp_Circ aCircleM (ax,rad); - Handle(Geom_Curve) thecir = new Geom_Circle(aCircleM); - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecir); - aSel->Add(scurv); - - Handle(Geom_Curve) curv; - gp_Pnt firstp,lastp; - Standard_Boolean isInfinite,isOnPlane; - Handle(Geom_Curve) extCurv; - - // segment on first curve - if ( myFShape.ShapeType() == TopAbs_EDGE ) - { - TopoDS_Edge E = TopoDS::Edge(myFShape); - if ( !AIS::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; - if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line - { - // segment on line - seg = new Select3D_SensitiveSegment(own,myFirstPnt1,myFirstPnt2); - aSel->Add(seg); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle - { - // segment on circle - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFirstPnt1); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),myFirstPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse - { - // segment on ellipse - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFirstPnt1); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),myFirstPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - } - - // segment on second curve - if ( mySShape.ShapeType() == TopAbs_EDGE ) - { - TopoDS_Edge E = TopoDS::Edge(mySShape); - if ( !AIS::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; - if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line - { - // segment on line - seg = new Select3D_SensitiveSegment(own,mySecondPnt1,mySecondPnt2); - aSel->Add(seg); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle - { - // segment on circle - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),mySecondPnt1); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySecondPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse - { - // segment on ellipse - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),mySecondPnt1); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySecondPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - } -} - -//======================================================================= -//function : ComputeFaceFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeFaceFromPnt(const Handle(Prs3d_Presentation)&, - const Standard_Boolean /*first*/) -{ -} - -//======================================================================= -//function : ComputeEdgeFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeEdgeFromPnt(const Handle(Prs3d_Presentation)& aprs, - const Standard_Boolean first) -{ - TopoDS_Edge E; - if ( first ) E = TopoDS::Edge(myFShape); - else E = TopoDS::Edge(mySShape); - - Handle(Geom_Curve) geom; - gp_Pnt ptat1,ptat2; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite,isOnPlane; - if ( !AIS::ComputeGeometry(E, geom, ptat1, ptat2, extCurv, isInfinite, isOnPlane, myPlane) ) return; - - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - - if ( geom->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - if ( !isInfinite ) ComputePointsOnLine(ptat1,ptat2,first); - else - { - const gp_Lin& line = Handle(Geom_Line)::DownCast (geom)->Lin(); - ComputePointsOnLine(line,first); - } - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else if ( geom->IsInstance(STANDARD_TYPE(Geom_Circle)) ) - { - Handle(Geom_Circle) geom_cir (Handle(Geom_Circle)::DownCast (geom)); - gp_Circ circ (geom_cir->Circ()); - ComputePointsOnCirc(circ,ptat1,ptat2,first); - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else if ( geom->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) geom_ell (Handle(Geom_Ellipse)::DownCast (geom)); - gp_Elips elips (geom_ell->Elips()); - ComputePointsOnElips(elips,ptat1,ptat2,first); - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else return; - - // projection on myPlane - if ( !isOnPlane ) ComputeProjEdgePresentation(aprs,E,geom,ptat1,ptat2); -} - -//======================================================================= -//function : ComputeVertexFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeVertexFromPnt(const Handle(Prs3d_Presentation)& aprs, - const Standard_Boolean first) -{ - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - if ( first ) - { - Standard_Boolean isOnPlane; - TopoDS_Vertex V = TopoDS::Vertex(myFShape); - AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlane); - DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,myFAttach,first); - if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,myFAttach); - } - else - { - Standard_Boolean isOnPlane; - TopoDS_Vertex V = TopoDS::Vertex(mySShape); - AIS::ComputeGeometry(V, mySAttach, myPlane, isOnPlane); - DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,mySAttach,first); - if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,mySAttach); - } -} - -//======================================================================= -//function : ComputePointsOnLine -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnLine(const gp_Lin& aLin, - const Standard_Boolean first) -{ - Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); - gp_Pnt anAttach = ElCLib::Value(ppar,aLin); - - Standard_Real dist = anAttach.Distance(myMidPoint)/10.0; - if ( dist < Precision::Confusion() ) dist = 10.0; - - Standard_Real fpar = ppar + dist; - Standard_Real spar = ppar - dist; - - gp_Pnt aPnt1 = ElCLib::Value(fpar,aLin); - gp_Pnt aPnt2 = ElCLib::Value(spar,aLin); - - if ( first ) - { - myFAttach = anAttach; - myFirstPnt1 = aPnt1; - myFirstPnt2 = aPnt2; - } - else - { - mySAttach = anAttach; - mySecondPnt1 = aPnt1; - mySecondPnt2 = aPnt2; - } -} - -//======================================================================= -//function : ComputePointsOnLine -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnLine(const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Vec aVec (pnt1,pnt2); - gp_Lin aLin (pnt1,gp_Dir(aVec)); - - Standard_Real fpar = ElCLib::Parameter(aLin,pnt1); - Standard_Real spar = ElCLib::Parameter(aLin,pnt2); - Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); - - gp_Pnt aProjPnt = ElCLib::Value(ppar,aLin); - Standard_Real dist = myMidPoint.Distance(aProjPnt); - Standard_Real ll = pnt1.Distance(pnt2); - Standard_Real segm = Min(dist,ll)*0.75; - if ( dist < Precision::Confusion() ) segm = ll*0.75; - - gp_Pnt anAttach,aPnt1,aPnt2; - anAttach = aProjPnt; - gp_Vec aVecTr; - if ( ppar <= fpar ) - { - aPnt2 = pnt1; - aVecTr = gp_Vec(pnt2,pnt1); - aVecTr.Normalize(); - aPnt1 = aProjPnt.Translated(aVecTr*segm); - } - else if ( ppar >= spar ) - { - aPnt1 = pnt2; - aVecTr = gp_Vec(pnt1,pnt2); - aVecTr.Normalize(); - aPnt2 = aProjPnt.Translated(aVecTr*segm); - } - else - { - Standard_Real dp1 = aProjPnt.Distance(pnt1); - Standard_Real dp2 = aProjPnt.Distance(pnt2); - - segm = Min(dist,dp1)*0.75; - aVecTr = gp_Vec(aProjPnt,pnt1); - aVecTr.Normalize(); - aPnt1 = aProjPnt.Translated(aVecTr*segm); - - segm = Min(dist,dp2)*0.75; - aVecTr = gp_Vec(aProjPnt,pnt2); - aVecTr.Normalize(); - aPnt2 = aProjPnt.Translated(aVecTr*segm); - } - - if ( first ) - { - myFAttach = anAttach; - myFirstPnt1 = aPnt1; - myFirstPnt2 = aPnt2; - } - else - { - mySAttach = anAttach; - mySecondPnt1 = aPnt1; - mySecondPnt2 = aPnt2; - } -} - -//======================================================================= -//function : ComputePointsOnCirc -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnCirc(const gp_Circ& aCirc, - const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Pnt curpos = myMidPoint; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = aCirc.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, pnt1); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(aCirc,curpos); - - Standard_Real rad = M_PI / 5.0; - Standard_Real segm; - - Standard_Real pFPnt; - Standard_Real pSPnt; - - if ( pnt1.IsEqual(pnt2,confusion) ) // full circle - { - pFPnt = pcurpos - rad; - pSPnt = pcurpos + rad; - } - else - { - Standard_Real pFAttach = ElCLib::Parameter(aCirc,pnt1); - Standard_Real pSAttach = ElCLib::Parameter(aCirc,pnt2); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttachM - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttach - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - - if ( first ) - { - myFAttach = ElCLib::Value(pcurpos,aCirc); - myFirstPnt1 = ElCLib::Value(pFPnt,aCirc); - myFirstPnt2 = ElCLib::Value(pSPnt,aCirc); - } - else - { - mySAttach = ElCLib::Value(pcurpos,aCirc); - mySecondPnt1 = ElCLib::Value(pFPnt,aCirc); - mySecondPnt2 = ElCLib::Value(pSPnt,aCirc); - } -} - -//======================================================================= -//function : ComputePointsOnElips -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnElips(const gp_Elips& anEll, - const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Pnt curpos = myMidPoint; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = anEll.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, pnt1); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - - Standard_Real rad = M_PI / 5.0; - Standard_Real segm; - - Standard_Real pFPnt; - Standard_Real pSPnt; - - if ( pnt1.IsEqual(pnt2,confusion) ) // full circle - { - pFPnt = pcurpos - rad; - pSPnt = pcurpos + rad; - } - else - { - Standard_Real pFAttach = ElCLib::Parameter(anEll,pnt1); - Standard_Real pSAttach = ElCLib::Parameter(anEll,pnt2); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM / 2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttachM - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttach - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - - if ( first ) - { - myFAttach = ElCLib::Value(pcurpos,anEll); - myFirstPnt1 = ElCLib::Value(pFPnt,anEll); - myFirstPnt2 = ElCLib::Value(pSPnt,anEll); - } - else - { - mySAttach = ElCLib::Value(pcurpos,anEll); - mySecondPnt1 = ElCLib::Value(pFPnt,anEll); - mySecondPnt2 = ElCLib::Value(pSPnt,anEll); - } -} diff --git a/src/AIS/AIS_MidPointRelation.hxx b/src/AIS/AIS_MidPointRelation.hxx deleted file mode 100644 index ca13b551b9..0000000000 --- a/src/AIS/AIS_MidPointRelation.hxx +++ /dev/null @@ -1,88 +0,0 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-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. - -#ifndef _AIS_MidPointRelation_HeaderFile -#define _AIS_MidPointRelation_HeaderFile - -#include - -class Geom_Plane; -class gp_Lin; -class gp_Pnt; -class gp_Circ; -class gp_Elips; - -DEFINE_STANDARD_HANDLE(AIS_MidPointRelation, AIS_Relation) - -//! presentation of equal distance to point myMidPoint -class AIS_MidPointRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_MidPointRelation, AIS_Relation) -public: - - Standard_EXPORT AIS_MidPointRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - void SetTool (const TopoDS_Shape& aMidPointTool); - - const TopoDS_Shape& GetTool() const; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeFaceFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputeEdgeFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputeVertexFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnLine (const gp_Lin& aLin, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnLine (const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnCirc (const gp_Circ& aCirc, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - //! ComputePointsOn... methods set myFAttach, myFirstPnt and myLastPnt - //! from the following initial data: curve, end points, myMidPoint. - //! End points (pnt1 & pnt2) and curve define the trimmed curve. - //! If end points are equal, curve is not trimmed (line - special case). - //! - //! .------. pnt2 - //! / - //! . circle . myLastPnt - //! | | - //! . pnt1 . myFAttach - //! \ arc / . myMidPoint - //! .______. myFirstPnt - Standard_EXPORT void ComputePointsOnElips (const gp_Elips& anEll, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - TopoDS_Shape myTool; - gp_Pnt myMidPoint; - gp_Pnt myFAttach; - gp_Pnt myFirstPnt1; - gp_Pnt myFirstPnt2; - gp_Pnt mySAttach; - gp_Pnt mySecondPnt1; - gp_Pnt mySecondPnt2; - -}; - -#include - -#endif // _AIS_MidPointRelation_HeaderFile diff --git a/src/AIS/AIS_MidPointRelation.lxx b/src/AIS/AIS_MidPointRelation.lxx deleted file mode 100644 index 3cae1f0c4a..0000000000 --- a/src/AIS/AIS_MidPointRelation.lxx +++ /dev/null @@ -1,42 +0,0 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-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. - -//======================================================================= -//function : SetTool -//purpose : -//======================================================================= -inline void AIS_MidPointRelation::SetTool(const TopoDS_Shape& aMidPointTool) -{ - myTool = aMidPointTool; -} - -//======================================================================= -//function : GetTool -//purpose : -//======================================================================= -inline const TopoDS_Shape& AIS_MidPointRelation::GetTool() const -{ - return myTool; -} - - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_MidPointRelation::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_MinRadiusDimension.cxx b/src/AIS/AIS_MinRadiusDimension.cxx deleted file mode 100644 index d49da7f06c..0000000000 --- a/src/AIS/AIS_MinRadiusDimension.cxx +++ /dev/null @@ -1,313 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -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*/) -{ -// 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 : 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 ); - } - } - -} diff --git a/src/AIS/AIS_MinRadiusDimension.hxx b/src/AIS/AIS_MinRadiusDimension.hxx deleted file mode 100644 index 7eda655a6d..0000000000 --- a/src/AIS/AIS_MinRadiusDimension.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// Created on: 1998-01-22 -// 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. - -#ifndef _AIS_MinRadiusDimension_HeaderFile -#define _AIS_MinRadiusDimension_HeaderFile - -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_MinRadiusDimension, AIS_EllipseRadiusDimension) - -//! -- Ellipse Min radius dimension of a Shape which -//! can be Edge or Face (planar or cylindrical(surface of -//! extrusion or surface of offset)) -class AIS_MinRadiusDimension : public AIS_EllipseRadiusDimension -{ - DEFINE_STANDARD_RTTIEXT(AIS_MinRadiusDimension, AIS_EllipseRadiusDimension) -public: - - //! Max Ellipse radius dimension - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Max Ellipse radius dimension with position - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT 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 = 0.0); - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myApexP; - gp_Pnt myApexN; - gp_Pnt myEndOfArrow; - -}; - -#endif // _AIS_MinRadiusDimension_HeaderFile diff --git a/src/AIS/AIS_OffsetDimension.cxx b/src/AIS/AIS_OffsetDimension.cxx deleted file mode 100644 index eaf8623f13..0000000000 --- a/src/AIS/AIS_OffsetDimension.cxx +++ /dev/null @@ -1,465 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_OffsetDimension,AIS_Relation) - -//======================================================================= -//function : AIS_OffsetDimension -//purpose : -//======================================================================= -AIS_OffsetDimension::AIS_OffsetDimension(const TopoDS_Shape& FistShape, - const TopoDS_Shape& SecondShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation(), -myFAttach(0.,0.,0.), -mySAttach(0.,0.,0.) -{ - myFShape = FistShape; - mySShape = SecondShape; - mySymbolPrs = DsgPrs_AS_BOTHAR; - myVal = aVal; - myText = aText; - //myArrowSize = fabs (myVal/5.); - myArrowSize = fabs (myVal/10.0); - if (myArrowSize > 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<Add(box); - } - - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,Proj1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,Proj2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,Tcurpos); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - Handle(Select3D_SensitiveSegment) seg; - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - - if (!myTFAttach.IsEqual(Proj1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myTFAttach, - Proj1); - aSel->Add(seg); - } - if (!myTSAttach.IsEqual(Proj2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myTSAttach, - Proj2); - aSel->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoAxesOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeTwoAxesOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - BRepAdaptor_Surface surf2(TopoDS::Face(mySShape)); - - gp_Ax1 Ax1Surf1, Ax1Surf2; - - if (surf1.GetType() == GeomAbs_Cylinder) { - gp_Cylinder aCyl= surf1.Cylinder(); - Ax1Surf1 = aCyl.Axis(); - } else if (surf1.GetType() == GeomAbs_Cone) { - gp_Cone aCone= surf1.Cone(); - Ax1Surf1 = aCone.Axis(); - } else if (surf1.GetType() == GeomAbs_Torus) { - gp_Torus aTore= surf1.Torus(); - Ax1Surf1 = aTore.Axis(); - } - Standard_Real FirstUParam = surf1.FirstUParameter(); - Standard_Real FirstVParam = surf1.FirstVParameter(); - Standard_Real LastVParam = surf1.LastVParameter(); - gp_Pnt P1First = surf1.Value(FirstUParam,FirstVParam); - gp_Pnt P1Last = surf1.Value(FirstUParam,LastVParam); - - - if (surf2.GetType() == GeomAbs_Cylinder) { - gp_Cylinder aCyl= surf2.Cylinder(); - Ax1Surf2 = aCyl.Axis(); - } else if (surf2.GetType() == GeomAbs_Cone) { - gp_Cone aCone= surf2.Cone(); - Ax1Surf2 = aCone.Axis(); - } else if (surf2.GetType() == GeomAbs_Torus) { - gp_Torus aTore= surf2.Torus(); - Ax1Surf2 = aTore.Axis(); - } - FirstUParam = surf2.FirstUParameter(); - FirstVParam = surf2.FirstVParameter(); - LastVParam = surf2.LastVParameter(); - gp_Pnt P2First = surf2.Value(FirstUParam,FirstVParam); - gp_Pnt P2Last = surf2.Value(FirstUParam,LastVParam); - - - - myFAttach = Ax1Surf1.Location(); - mySAttach = Ax1Surf2.Location(); - myDirAttach = Ax1Surf1.Direction(); - myDirAttach2 = myDirAttach; - gp_Pnt curpos; - gp_Lin aProjLine = gce_MakeLin(myFAttach,myDirAttach); - - if (myAutomaticPosition) { - curpos.SetX ( (myFAttach.X() + mySAttach.X()) /2. + 0.01); - curpos.SetY ( (myFAttach.Y() + mySAttach.Y()) /2. + 0.01); - curpos.SetZ ( (myFAttach.Z() + mySAttach.Z()) /2. + 0.01); - // + 0.01 pour eviter un raise de ComputeSelection... - - myPosition = curpos; - } - else { - curpos = myPosition; - } - - curpos = ElCLib::Value(ElCLib::Parameter(aProjLine,curpos),aProjLine); - // on projette pour la presentation - - gp_Pnt P1FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1First),aProjLine); - gp_Pnt P1LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1Last),aProjLine); - if (P1FirstProj.Distance(curpos) > P1LastProj.Distance(curpos)) - myFAttach = P1FirstProj; - else - myFAttach = P1LastProj; - - gp_Pnt P2FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2First),aProjLine); - gp_Pnt P2LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2Last),aProjLine); - if (P2FirstProj.Distance(curpos) > P2LastProj.Distance(curpos)) - mySAttach = P2FirstProj; - else - mySAttach = P2LastProj; - - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); - gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); - gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); - gp_Dir myTDirAttach2 = myTDirAttach; - gp_Pnt Tcurpos = curpos.Transformed (aTrsf); - - if (myIsSetBndBox) - Tcurpos = AIS::TranslatePointToBound( Tcurpos, myDirAttach, myBndBox ); - - DsgPrs_OffsetPresentation::AddAxes(aprs, - myDrawer, - myText, - myTFAttach, - myTSAttach, - myTDirAttach, - myTDirAttach2, - Tcurpos); - - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - -//======================================================================= -//function : ComputeTwoFacesOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeTwoFacesOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - gp_Dir norm1 = myDirAttach; - gp_Pnt curpos; - gp_Ax2 myax2; - if (myAutomaticPosition && ! myIsSetBndBox) { - TopExp_Explorer explo(myFShape,TopAbs_VERTEX); - if (explo.More()) { - TopoDS_Vertex vertref = TopoDS::Vertex(explo.Current()); - myFAttach = BRep_Tool::Pnt(vertref); - gp_Vec trans = norm1.XYZ()*fabs(myVal/2); - gp_Ax2 ax2(myFAttach,norm1); - myDirAttach = ax2.XDirection(); - curpos = myFAttach.Translated(trans); - if (myVal <= Precision::Confusion()) { - gp_Vec vecnorm1 = norm1.XYZ()*.001; - curpos.Translate(vecnorm1); - } - myPosition = curpos; - myax2 = ax2; - } - } - else { - if (myAutomaticPosition && myIsSetBndBox) - { - Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; - myBndBox.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax ); - myPosition.SetCoord( aXmax, aYmax, aZmax ); - } - - curpos = myPosition; - myFAttach = AIS::Nearest(myFShape,curpos); - if (myFAttach.Distance(curpos) <= Precision::Confusion()) { - gp_Ax2 ax2(myFAttach,norm1); - myDirAttach = ax2.XDirection(); - myax2 = ax2; - } - else { - gp_Dir orient(myFAttach.XYZ()-curpos.XYZ()); - gp_Ax2 ax2(myFAttach,norm1); - if (orient.Angle(norm1) <= Precision::Angular()) { - myDirAttach = ax2.XDirection(); - } - else { - gp_Dir adir = norm1 ^ orient; - myDirAttach = adir ^ norm1; - } - myax2 = ax2; - } - } - // en attendant mieux - mySAttach = AIS::Nearest(mySShape,curpos); - gp_Ax3 anax3 (myax2); - gp_Pln apln (anax3); - - //gp_Pnt proj2; - Standard_Real u2,v2, uatt, vatt; - ElSLib::Parameters (apln , mySAttach, uatt,vatt); - ElSLib::Parameters (apln , curpos , u2,v2); - - if (uatt== u2 && vatt == v2) { - myDirAttach2 = myDirAttach; - } else { - gp_Vec avec (ElSLib::Value (uatt,vatt, apln) , ElSLib::Value (u2,v2, apln)); - myDirAttach2.SetCoord (avec.X(),avec.Y(),avec.Z()); - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); - gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); - gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); - gp_Dir myTDirAttach2 = myDirAttach2.Transformed (aTrsf); - gp_Pnt Tcurpos = curpos.Transformed (aTrsf); - -/* - if (myIsSetBndBox) - { - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - Tcurpos = AIS::TranslatePointToBound( Tcurpos, surf1.Plane().XAxis().Direction(), myBndBox ); - } -*/ - DsgPrs_OffsetPresentation::Add(aprs, - myDrawer, - myText, - myTFAttach, - myTSAttach, - myTDirAttach, - myTDirAttach2, - Tcurpos); - - - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - -//======================================================================= -//function : ComputeAxeFaceOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeAxeFaceOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - diff --git a/src/AIS/AIS_OffsetDimension.hxx b/src/AIS/AIS_OffsetDimension.hxx deleted file mode 100644 index d0d254f327..0000000000 --- a/src/AIS/AIS_OffsetDimension.hxx +++ /dev/null @@ -1,72 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -#ifndef _AIS_OffsetDimension_HeaderFile -#define _AIS_OffsetDimension_HeaderFile - -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_OffsetDimension, AIS_Relation) - -//! A framework to display dimensions of offsets. -//! The relation between the offset and the basis shape -//! is indicated. This relation is displayed with arrows and -//! text. The text gives the dsitance between the offset -//! and the basis shape. -class AIS_OffsetDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_OffsetDimension, AIS_Relation) -public: - - //! Constructs the offset display object defined by the - //! first shape aFShape, the second shape aSShape, the - //! dimension aVal, and the text aText. - Standard_EXPORT AIS_OffsetDimension(const TopoDS_Shape& FistShape, const TopoDS_Shape& SecondShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Indicates that the dimension we are concerned with is an offset. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the offset datum is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! Sets a transformation aTrsf for presentation and - //! selection to a relative position. - void SetRelativePos (const gp_Trsf& aTrsf); - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - Standard_EXPORT void ComputeTwoAxesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - Standard_EXPORT void ComputeAxeFaceOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myDirAttach; - gp_Dir myDirAttach2; - gp_Trsf myRelativePos; - -}; - -#include - -#endif // _AIS_OffsetDimension_HeaderFile diff --git a/src/AIS/AIS_OffsetDimension.lxx b/src/AIS/AIS_OffsetDimension.lxx deleted file mode 100644 index 7585db9e71..0000000000 --- a/src/AIS/AIS_OffsetDimension.lxx +++ /dev/null @@ -1,42 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_OffsetDimension::KindOfDimension() const -{ - return AIS_KOD_OFFSET; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_OffsetDimension::IsMovable() const -{ - return Standard_True; -} - -//======================================================================= -//function : SetRelativePos -//purpose : -//======================================================================= -inline void AIS_OffsetDimension::SetRelativePos(const gp_Trsf& aTrsf) -{ - myRelativePos = aTrsf; -} diff --git a/src/AIS/AIS_ParallelRelation.cxx b/src/AIS/AIS_ParallelRelation.cxx deleted file mode 100644 index ed515f7cce..0000000000 --- a/src/AIS/AIS_ParallelRelation.cxx +++ /dev/null @@ -1,382 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_ParallelRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ParallelRelation::AIS_ParallelRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 0.01; - mySymbolPrs = DsgPrs_AS_BOTHAR; -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ParallelRelation::AIS_ParallelRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs, - const Standard_Real anArrowSize) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_False; - SetArrowSize( anArrowSize ); - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ParallelRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - // cas longueur entre deux faces - ComputeTwoFacesParallel(aPresentation); - } - break; - case TopAbs_EDGE : - { - // cas longueur entre deux edges - ComputeTwoEdgesParallel(aPresentation); - } - break; - default: - break; - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - gp_Lin L1 (myFAttach,myDirAttach); - gp_Lin L2 (mySAttach,myDirAttach); - gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,myPosition),L1); - gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,myPosition),L2); - - gp_Lin L3; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - if (!Proj1.IsEqual(Proj2,Precision::Confusion())) - { - L3 = gce_MakeLin(Proj1,Proj2); - } - else - { - L3 = gce_MakeLin(Proj1,myDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSelection->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,Proj1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,Proj2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - Handle(Select3D_SensitiveSegment) seg; - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSelection->Add(seg); - } - if (!myFAttach.IsEqual(Proj1,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, myFAttach, Proj1); - aSelection->Add(seg); - } - if (!mySAttach.IsEqual(Proj2,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, mySAttach, Proj2); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoFacesParallel -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeTwoFacesParallel(const Handle(Prs3d_Presentation)&) -{ - throw Standard_NotImplemented("AIS_ParallelRelation::ComputeTwoFacesParallel not implemented"); -} - -//======================================================================= -//function : ComputeTwoEdgesParallel -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeTwoEdgesParallel(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Edge E1 = TopoDS::Edge(myFShape); - TopoDS_Edge E2 = TopoDS::Edge(mySShape); - - gp_Pnt ptat11,ptat12,ptat21,ptat22;//,pint3d; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(E1,E2,myExtShape, - geom1,geom2, - ptat11,ptat12,ptat21,ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - { - return; - } - - aPresentation->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape != 0)); - - gp_Lin l1; - gp_Lin l2; - Standard_Boolean isEl1 = Standard_False, isEl2 = Standard_False; - - if (geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el1 (Handle(Geom_Ellipse)::DownCast (geom1)); - // construct lines through focuses - gp_Ax1 elAx = geom_el1->XAxis(); - l1 = gp_Lin(elAx); - Standard_Real focex = geom_el1->MajorRadius() - geom_el1->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat11 = geom_el1->Focus1().Translated(transvec); - ptat12 = geom_el1->Focus2().Translated(-transvec); - isEl1 = Standard_True; - } - else if (geom1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - l1 = geom_lin1->Lin(); - } - else return; - - if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el2 (Handle(Geom_Ellipse)::DownCast (geom2)); - // construct lines through focuses - gp_Ax1 elAx = geom_el2->XAxis(); - l2 = gp_Lin(elAx); - Standard_Real focex = geom_el2->MajorRadius() - geom_el2->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat21 = geom_el2->Focus1().Translated(transvec); - ptat22 = geom_el2->Focus2().Translated(-transvec); - isEl2 = Standard_True; - } - else if (geom2->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - l2 = geom_lin2->Lin(); - } - else return; - - const Handle(Geom_Line)& geom_lin1 = new Geom_Line(l1); - const Handle(Geom_Line)& geom_lin2 = new Geom_Line(l2); - - myDirAttach = l1.Direction(); - // size - if( !myArrowSizeIsDefined ) { - Standard_Real arrSize1 (myArrowSize), arrSize2 (myArrowSize); - if (!isInfinite1) arrSize1 = ptat11.Distance(ptat12)/50.; - if (!isInfinite2) arrSize2 = ptat21.Distance(ptat22)/50.; - myArrowSize = Max(myArrowSize,Max(arrSize1,arrSize2)); -// myArrowSize = Min(myArrowSize,Min(arrSize1,arrSize2)); - } - - if ( myAutomaticPosition ) - { - gp_Pnt curpos; - if ( !isInfinite1 ) - { - gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l2,ptat11),l2); - curpos.SetXYZ((ptat11.XYZ() + p2.XYZ())/2.); - } - else if ( !isInfinite2 ) - { - gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l1,ptat21),l1); - curpos.SetXYZ((ptat21.XYZ()+p2.XYZ())/2.); - } - else - { - curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.); - } - // offset pour eviter confusion Edge et Dimension - gp_Vec offset (myDirAttach); - offset = offset*myArrowSize*(-10.); - curpos.Translate(offset); - myPosition = curpos; - } - - // recherche points attache - if (!isInfinite1) - { - if ( isEl1 ) - { - if (myPosition.Distance(ptat11) < myPosition.Distance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - } - else - { - if (myPosition.Distance(ptat11) > myPosition.Distance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - } - } - else - { - myFAttach = ElCLib::Value(ElCLib::Parameter(l1,myPosition),l1); - } - - if (!isInfinite2) - { - if ( isEl2 ) - { - if (myPosition.Distance(ptat21) < myPosition.Distance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - else - { - if (myPosition.Distance(ptat21) > myPosition.Distance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - } - else - { - mySAttach = ElCLib::Value(ElCLib::Parameter(l2,myPosition),l2); - } - TCollection_ExtendedString aText (" //"); - - if (l1.Distance(l2) <= Precision::Confusion()) - { - myArrowSize = 0.; - } - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - if ( myExtShape == 1) - mySymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR; - else if ( myExtShape == 2) - mySymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT; - - DsgPrs_LengthPresentation::Add(aPresentation, - myDrawer, - aText, - myFAttach, - mySAttach, - myDirAttach, - myPosition, - mySymbolPrs); - if ( (myExtShape != 0) && !extCurv.IsNull()) - { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) - { - if (!isInfinite1) - { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,E1,geom_lin1,pf,pl); - } - else - { - if (!isInfinite2) - { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,E2,geom_lin2,pf,pl); - } - } -} diff --git a/src/AIS/AIS_ParallelRelation.hxx b/src/AIS/AIS_ParallelRelation.hxx deleted file mode 100644 index 7fb1708548..0000000000 --- a/src/AIS/AIS_ParallelRelation.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_ParallelRelation_HeaderFile -#define _AIS_ParallelRelation_HeaderFile - -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_ParallelRelation, AIS_Relation) - -//! A framework to display constraints of parallelism -//! between two or more Interactive Objects. These -//! entities can be faces or edges. -class AIS_ParallelRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_ParallelRelation, AIS_Relation) -public: - - - //! Constructs an object to display parallel constraints. - //! This object is defined by the first shape aFShape and - //! the second shape aSShape and the plane aPlane. - Standard_EXPORT AIS_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - - //! Constructs an object to display parallel constraints. - //! This object is defined by the first shape aFShape and - //! the second shape aSShape the plane aPlane, the - //! position aPosition, the type of arrow, aSymbolPrs and - //! its size anArrowSize. - Standard_EXPORT AIS_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.01); - - //! Returns true if the parallelism is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesParallel (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesParallel (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myDirAttach; - -}; - -#include - -#endif // _AIS_ParallelRelation_HeaderFile diff --git a/src/AIS/AIS_ParallelRelation.lxx b/src/AIS/AIS_ParallelRelation.lxx deleted file mode 100644 index d6720fe414..0000000000 --- a/src/AIS/AIS_ParallelRelation.lxx +++ /dev/null @@ -1,24 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_ParallelRelation::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_PerpendicularRelation.cxx b/src/AIS/AIS_PerpendicularRelation.cxx deleted file mode 100644 index 34091cd258..0000000000 --- a/src/AIS/AIS_PerpendicularRelation.cxx +++ /dev/null @@ -1,348 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_PerpendicularRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : TwoEdgesPerpendicular -//======================================================================= -AIS_PerpendicularRelation::AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation() -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; -} - -//======================================================================= -//function : Constructor -//purpose : TwoFacesPerpendicular -//======================================================================= -AIS_PerpendicularRelation::AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape) -:AIS_Relation() -{ - myFShape = aFShape; - mySShape = aSShape; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - if (myFShape.ShapeType() == mySShape.ShapeType()) { - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // cas perpendiculaire entre deux faces - ComputeTwoFacesPerpendicular(aPresentation); - } - break; - case TopAbs_EDGE : - { - // cas perpendiculaire entre deux edges - ComputeTwoEdgesPerpendicular(aPresentation); - } - break; - default: - break; - } - } - // Cas pas traite - Edge/Face -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - const gp_Pnt& pos = myPosition; - Handle(Select3D_SensitiveSegment) seg; - Standard_Boolean ok1(Standard_False),ok2(Standard_False); - - if (!myFAttach.IsEqual(pos,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myFAttach, - pos); - aSelection->Add(seg); - ok1 = Standard_True; - } - if (!mySAttach.IsEqual(myPosition,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - mySAttach, - pos); - aSelection->Add(seg); - ok2 = Standard_True; - } - - if (ok1 && ok2) { - gp_Vec vec1(gce_MakeDir(pos,myFAttach)); - gp_Vec vec2(gce_MakeDir(pos,mySAttach)); - Standard_Real dist1(pos.Distance(myFAttach)); - Standard_Real dist2(pos.Distance(mySAttach)); - vec1 *= dist1; - vec1 *= .2; - vec2 *= dist2; - vec2 *= .2; - - gp_Pnt pAx11 = pos.Translated(vec1); - gp_Pnt pAx22 = pos.Translated(vec2); - gp_Pnt p_symb = pAx22.Translated(vec1); - seg = new Select3D_SensitiveSegment(own,pAx11,p_symb); - aSelection->Add(seg); - seg = new Select3D_SensitiveSegment(own,p_symb,pAx22); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoFacesPerpendicular -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeTwoFacesPerpendicular - (const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -} - -//======================================================================= -//function : ComputeTwoEdgesPerpendicular -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeTwoEdgesPerpendicular(const Handle(Prs3d_Presentation)& aPresentation) -{ - // 3d lines - Handle(Geom_Curve) geom1,geom2; - gp_Pnt pint3d,p1,p2,pAx1,pAx2,ptat11,ptat12,ptat21,ptat22; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if ( !AIS::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), - myExtShape, - geom1,geom2, - ptat11,ptat12,ptat21,ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane) ) return; - - Standard_Boolean interOut1(Standard_False),interOut2(Standard_False); - - Handle(Geom_Line) geom_lin1; - Handle(Geom_Line) geom_lin2; - if ( geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom1)); - // construct lines through focuses - gp_Ax1 elAx = geom_el->XAxis(); - gp_Lin ll (elAx); - geom_lin1 = new Geom_Line(ll); - Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat11 = geom_el->Focus1().Translated(transvec); - ptat12 = geom_el->Focus2().Translated(-transvec); - interOut1 = Standard_True; - } - else if ( geom1->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - geom_lin1 = Handle(Geom_Line)::DownCast (geom1); - } - else return; - - if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom2)); - // construct lines through focuses - gp_Ax1 elAx = geom_el->XAxis(); - gp_Lin ll (elAx); - geom_lin2 = new Geom_Line(ll); - Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat21 = geom_el->Focus1().Translated(transvec); - ptat22 = geom_el->Focus2().Translated(-transvec); - interOut2 = Standard_True; - } - else if ( geom2->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - geom_lin2 = Handle(Geom_Line)::DownCast (geom2); - } - else return; - - // current face - BRepBuilderAPI_MakeFace makeface (myPlane->Pln()); - TopoDS_Face face (makeface.Face()); - BRepAdaptor_Surface adp (makeface.Face()); - - // 2d lines => projection of 3d on current plane - Handle(Geom2d_Curve) aGeom2dCurve = GeomAPI::To2d(geom_lin1,myPlane->Pln()); - Handle(Geom2d_Line) lin1_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; - aGeom2dCurve = GeomAPI::To2d(geom_lin2,myPlane->Pln()); - Handle(Geom2d_Line) lin2_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; - IntAna2d_AnaIntersection inter(lin1_2d->Lin2d(),lin2_2d->Lin2d()); - if (!inter.IsDone()) return; - if (!inter.NbPoints()) return; - - gp_Pnt2d pint(inter.Point(1).Value()); - pint3d = adp.Value(pint.X(),pint.Y()); - - myPosition = pint3d; - // recherche points attache - Standard_Real par1,par2,curpar,pmin,pmax;//,dist,sign; - Standard_Real length(0.); - - if ( isInfinite1 && isInfinite2 ) - { - Standard_Real curpar1 = ElCLib::Parameter(geom_lin1->Lin(),pint3d); - Standard_Real curpar2 = ElCLib::Parameter(geom_lin2->Lin(),pint3d); - par1 = par2 = 50.; - p1 = p2 = pint3d; - myFAttach = ElCLib::Value(curpar1+par1,geom_lin1->Lin()); - mySAttach = ElCLib::Value(curpar2+par2,geom_lin2->Lin()); - } - else - { - Standard_Boolean lengthComputed (Standard_False); - if ( !isInfinite1 ) - { - curpar = ElCLib::Parameter(geom_lin1->Lin(),pint3d); - par1 = ElCLib::Parameter(geom_lin1->Lin(),ptat11); - par2 = ElCLib::Parameter(geom_lin1->Lin(),ptat12); - pmin = Min(par1,par2); - pmax = Max(par1,par2); - - if ( myPosition.SquareDistance(ptat11) > myPosition.SquareDistance(ptat12) ) - p1 = ptat11; - else - p1 = ptat12; - if ( (curpar < pmin) || (curpar > pmax) ) - { - interOut1 = Standard_True; - } - if ( !isInfinite2 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; - else length = 2.*ptat11.Distance(ptat12)/5.; - lengthComputed = Standard_True; - gp_Vec vec1 (gce_MakeDir(myPosition,p1)); - vec1.Multiply(length); - pAx1 = myPosition.Translated(vec1); - myFAttach = pAx1; - } - if ( !isInfinite2 ) - { - curpar = ElCLib::Parameter(geom_lin2->Lin(),pint3d); - par1 = ElCLib::Parameter(geom_lin2->Lin(),ptat21); - par2 = ElCLib::Parameter(geom_lin2->Lin(),ptat22); - pmin = Min(par1,par2); - pmax = Max(par1,par2); - - if ( myPosition.SquareDistance(ptat21) > myPosition.SquareDistance(ptat22) ) p2 = ptat21; - else p2 = ptat22; - if ( (curpar < pmin) || (curpar > pmax) ) - { - interOut2 = Standard_True; - } - gp_Vec vec2 (gce_MakeDir(myPosition,p2)); - if ( !lengthComputed ) - { - if ( !isInfinite1 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; - else length = 2.*ptat21.Distance(ptat22)/5.; - } - vec2.Multiply(length); - pAx2 = myPosition.Translated(vec2); - mySAttach = pAx2; - } - if ( isInfinite1 ) - { - p1 = myPosition; - gp_Vec vec1(geom_lin1->Lin().Direction()); - vec1.Multiply(length); - myFAttach = myPosition.Translated(vec1); - } - if ( isInfinite2 ) - { - p2 = myPosition; - gp_Vec vec2(geom_lin2->Lin().Direction()); - vec2.Multiply(length); - mySAttach = myPosition.Translated(vec2); - } - } - DsgPrs_PerpenPresentation::Add(aPresentation,myDrawer, - myFAttach,mySAttach, - p1,p2, - myPosition, - interOut1,interOut2); - - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf,pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - aPresentation->SetInfiniteState(isInfinite1); - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),geom_lin1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - aPresentation->SetInfiniteState(isInfinite2); - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),geom_lin2,pf,pl); - } - } -} diff --git a/src/AIS/AIS_PerpendicularRelation.hxx b/src/AIS/AIS_PerpendicularRelation.hxx deleted file mode 100644 index d27baeaa5a..0000000000 --- a/src/AIS/AIS_PerpendicularRelation.hxx +++ /dev/null @@ -1,63 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_PerpendicularRelation_HeaderFile -#define _AIS_PerpendicularRelation_HeaderFile - -#include - -DEFINE_STANDARD_HANDLE(AIS_PerpendicularRelation, AIS_Relation) - -//! A framework to display constraints of perpendicularity -//! between two or more interactive datums. These -//! datums can be edges or faces. -class AIS_PerpendicularRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_PerpendicularRelation, AIS_Relation) -public: - - //! Constructs an object to display constraints of - //! perpendicularity on shapes. - //! This object is defined by a first shape aFShape, a - //! second shape aSShape, and a plane aPlane. - //! aPlane is the plane of reference to show and test the - //! perpendicular relation between two shapes, at least - //! one of which has a revolved surface. - Standard_EXPORT AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - - //! Constructs an object to display constraints of - //! perpendicularity on shapes. - //! This object is defined by a first shape aFShape and a - //! second shape aSShape. - Standard_EXPORT AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape); - -private: - - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - -}; - -#endif // _AIS_PerpendicularRelation_HeaderFile diff --git a/src/AIS/AIS_RadiusDimension.cxx b/src/AIS/AIS_RadiusDimension.cxx deleted file mode 100644 index 435448d492..0000000000 --- a/src/AIS/AIS_RadiusDimension.cxx +++ /dev/null @@ -1,276 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier/Serguei Zaritchny -// Copyright (c) 1996-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 - -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_RadiusDimension,AIS_Dimension) - -namespace -{ - static const Standard_ExtCharacter THE_RADIUS_SYMBOL ('R'); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const gp_Circ& theCircle) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const gp_Circ& theCircle, - const gp_Pnt& theAttachPoint) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theCircle, theAttachPoint); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const TopoDS_Shape& theShape) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor) -{ - myCircle = theCircle; - myGeometryType = GeometryType_Edge; - myShape = BRepLib_MakeEdge (theCircle); - myAnchorPoint = theHasAnchor ? theAnchorPoint : ElCLib::Value (0, myCircle); - myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, myAnchorPoint); - - if (myIsGeometryValid) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor) -{ - Standard_Boolean isClosed = Standard_False; - myShape = theShape; - myGeometryType = GeometryType_UndefShapes; - myIsGeometryValid = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) - && IsValidCircle (myCircle); - if (theHasAnchor) - { - myAnchorPoint = theAnchorPoint; - myIsGeometryValid = myIsGeometryValid && IsValidAnchor (myCircle, myAnchorPoint); - } - - if (myIsGeometryValid) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const -{ - // Check if anchor point and circle center point belong to plane. - if (!thePlane.Contains (myAnchorPoint, Precision::Confusion()) && - !thePlane.Contains (myCircle.Location(), Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_RadiusDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - gp_Dir aDimensionX = gce_MakeDir (myAnchorPoint, myCircle.Location()); - - myPlane = gp_Pln (gp_Ax3 (myCircle.Location(), - myCircle.Axis().Direction(), - aDimensionX)); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_RadiusDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_RadiusDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits(theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_RadiusDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - return myCircle.Radius(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_RadiusDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - DrawLinearDimension (thePresentation, theMode, myAnchorPoint, myCircle.Location(), Standard_True); -} - -//======================================================================= -//function : IsValidCircle -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::IsValidCircle (const gp_Circ& theCircle) const -{ - return theCircle.Radius() > Precision::Confusion(); -} - -//======================================================================= -//function : IsValidAnchor -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& theAnchor) const -{ - gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); - Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); - - return anAnchorDist > Precision::Confusion() - && aCirclePlane.Contains (theAnchor, Precision::Confusion()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_RadiusDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myAnchorPoint, myCircle.Location(), Standard_True); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!myIsGeometryValid) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} diff --git a/src/AIS/AIS_RadiusDimension.hxx b/src/AIS/AIS_RadiusDimension.hxx deleted file mode 100644 index 8376927bbf..0000000000 --- a/src/AIS/AIS_RadiusDimension.hxx +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 1995-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. - -#ifndef _AIS_RadiusDimension_HeaderFile -#define _AIS_RadiusDimension_HeaderFile - -#include -#include -#include -#include -#include -#include - -class AIS_RadiusDimension; -DEFINE_STANDARD_HANDLE (AIS_RadiusDimension,AIS_Dimension) - -//! Radius dimension. Can be constructued: -//! - On generic circle. -//! - On generic circle with user-defined anchor point on that circle. -//! - On generic shape containing geometry that can be measured -//! by diameter dimension: circle wire, arc, circular face, etc. -//! The anchor point is the location of left attachement point of -//! dimension on the circle. It can be user-specified, or computed as -//! middle point on the arc. The radius dimension always lies in the -//! plane of the measured circle. The dimension is considered as -//! invalid if the user-specified anchor point is not lying on the circle, -//! if the radius of the circle is less than Precision::Confusion(). -//! In case if the dimension is built on the arbitrary shape, -//! it can be considered as invalid if the shape does not contain -//! circle geometry. -class AIS_RadiusDimension : public AIS_Dimension -{ -public: - - //! Create radius dimension for the circle geometry. - //! @param theCircle [in] the circle to measure. - Standard_EXPORT AIS_RadiusDimension (const gp_Circ& theCircle); - - //! Create radius dimension for the circle geometry and define its - //! orientation by location of the first point on that circle. - //! @param theCircle [in] the circle to measure. - //! @param theAnchorPoint [in] the point to define the position - //! of the dimension attachment on the circle. - Standard_EXPORT AIS_RadiusDimension (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint); - - //! Create radius dimension for the arbitrary shape (if possible). - //! @param theShape [in] the shape to measure. - Standard_EXPORT AIS_RadiusDimension (const TopoDS_Shape& theShape); - -public: - - //! @return measured geometry circle. - const gp_Circ& Circle() const - { - return myCircle; - } - - //! @return anchor point on circle for radius dimension. - const gp_Pnt& AnchorPoint() const - { - return myAnchorPoint; - } - - //! @return the measured shape. - const TopoDS_Shape& Shape() const - { - return myShape; - } - -public: - - //! Measure radius of the circle. - //! The dimension will become invalid if the radius of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - void SetMeasuredGeometry (const gp_Circ& theCircle) { SetMeasuredGeometry (theCircle, gp_Pnt(), Standard_False); } - - //! Measure radius of the circle and orient the dimension so - //! the dimension lines attaches to anchor point on the circle. - //! The dimension will become invalid if the radius of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle - //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used - Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor = Standard_True); - - //! Measure radius on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - void SetMeasuredGeometry (const TopoDS_Shape& theShape) { SetMeasuredGeometry (theShape, gp_Pnt(), Standard_False); } - - //! Measure radius on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle - //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor = Standard_True); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_RadiusDimension,AIS_Dimension) - -protected: - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if anchor point and the center of the circle are on the plane. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - -protected: - - Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; - - Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& thePnt) const; - -private: - - gp_Circ myCircle; - gp_Pnt myAnchorPoint; - TopoDS_Shape myShape; -}; - -#endif // _AIS_RadiusDimension_HeaderFile diff --git a/src/AIS/AIS_Relation.cxx b/src/AIS/AIS_Relation.cxx deleted file mode 100644 index 12cbc9ef0a..0000000000 --- a/src/AIS/AIS_Relation.cxx +++ /dev/null @@ -1,312 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Relation,AIS_InteractiveObject) - -//======================================================================= -//function : AIS_Relation -//purpose : -//======================================================================= -AIS_Relation::AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) -:AIS_InteractiveObject(aTypeOfPresentation3d), - myVal(1.), - myPosition(0.,0.,0.), - myArrowSize( myVal / 10. ), - myAutomaticPosition(Standard_True), - myExtShape(0), - myFirstOffset(0.),mySecondOffset(0.), - myIsSetBndBox( Standard_False ), - myArrowSizeIsDefined( Standard_False) -{ -} - - - -//======================================================================= -//function : ComputeProjEdgePresentation -//purpose : -//======================================================================= - -void AIS_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs, - const TopoDS_Edge& anEdge, - const Handle(Geom_Curve)& ProjCurv, - const gp_Pnt& FirstP, - const gp_Pnt& LastP, - const Quantity_NameOfColor aColor, - const Standard_Real width, - const Aspect_TypeOfLine aProjTOL, - const Aspect_TypeOfLine aCallTOL) const -{ - if (!myDrawer->HasOwnWireAspect()){ - myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} - else { - const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); - li->SetColor(aColor); - li->SetTypeOfLine(aProjTOL); - li->SetWidth(width); - } - - Standard_Real pf, pl; - TopLoc_Location loc; - Handle(Geom_Curve) curve; - Standard_Boolean isInfinite; - curve = BRep_Tool::Curve(anEdge,loc,pf,pl); - isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); - - TopoDS_Edge E; - - // Calcul de la presentation de l'edge - if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv)); - if ( !isInfinite) { - pf = ElCLib::Parameter(gl->Lin(),FirstP); - pl = ElCLib::Parameter(gl->Lin(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); - E = MakEd.Edge(); - } - else { - BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); - E = MakEd.Edge(); - } - } - else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv)); - pf = ElCLib::Parameter(gc->Circ(),FirstP); - pl = ElCLib::Parameter(gc->Circ(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); - E = MakEd.Edge(); - } - StdPrs_WFShape::Add (aPrs, E, myDrawer); - - //Calcul de la presentation des lignes de raccord - myDrawer->WireAspect()->SetTypeOfLine(aCallTOL); - if (!isInfinite) { - gp_Pnt ppf, ppl; - ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); - ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); - if (FirstP.Distance (ppf) > gp::Resolution()) - { - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert1 (FirstP); - StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer); - } - if (LastP.Distance (ppl) > gp::Resolution()) - { - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert2 (LastP); - StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer); - } -/* - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); -*/ - } -} - - -//======================================================================= -//function : ComputeProjVertexPresentation -//purpose : -//======================================================================= - -void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs, - const TopoDS_Vertex& aVertex, - const gp_Pnt& ProjPoint, - const Quantity_NameOfColor aColor, - const Standard_Real width, - const Aspect_TypeOfMarker aProjTOM, - const Aspect_TypeOfLine aCallTOL) const -{ - if (!myDrawer->HasOwnPointAspect()){ - myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} - else { - const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect(); - pa->SetColor(aColor); - pa->SetTypeOfMarker(aProjTOM); - } - - { - Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); - Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); - anArrayOfPoints->AddVertex (ProjPoint); - aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect()); - aGroup->AddPrimitiveArray (anArrayOfPoints); - } - - if (!myDrawer->HasOwnWireAspect()){ - myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} - else { - const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); - li->SetColor(aColor); - li->SetTypeOfLine(aCallTOL); - li->SetWidth(width); - } - - // Si les points ne sont pas confondus... - if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) - { - Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); - Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2); - anArrayOfLines->AddVertex (ProjPoint); - anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex)); - aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect()); - aGroup->AddPrimitiveArray (anArrayOfLines); - } -} - -//======================================================================= -//function : SetColor -//purpose : -//======================================================================= -void AIS_Relation::SetColor(const Quantity_Color &aCol) -{ - if(hasOwnColor && myDrawer->Color() == aCol) return; - - if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect()); - hasOwnColor=Standard_True; - myDrawer->SetColor (aCol); - myDrawer->TextAspect()->SetColor(aCol); - - Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ? - AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.; - if (!myDrawer->HasOwnLineAspect()) { - myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW)); - } - if (!myDrawer->HasOwnDimensionAspect()) { - myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect); - } - - myDrawer->LineAspect()->SetColor(aCol); - const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect(); - const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect(); - const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect(); - - DIMENSION->SetLineAspect(LINE); - DIMENSION->SetTextAspect(TEXT); -} - -//======================================================================= -//function : UnsetColor -//purpose : -//======================================================================= -void AIS_Relation::UnsetColor() -{ - if (!hasOwnColor) return; - hasOwnColor = Standard_False; - const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect(); - Quantity_Color CC = Quantity_NOC_YELLOW; - if (myDrawer->HasLink()) - { - AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC); - myDrawer->SetTextAspect(myDrawer->Link()->TextAspect()); - } - LA->SetColor(CC); - myDrawer->DimensionAspect()->SetLineAspect(LA); -} - -//======================================================================= -//function : AcceptDisplayMode -//purpose : -//======================================================================= - - Standard_Boolean AIS_Relation:: -AcceptDisplayMode(const Standard_Integer aMode) const -{return aMode == 0;} - - -//======================================================================= -//function : SetFirstShape -//purpose : -//======================================================================= - -void AIS_Relation::SetFirstShape(const TopoDS_Shape& aFShape) -{ - myFShape = aFShape; -} - - -//======================================================================= -//function : SetSecondShape -//purpose : -//======================================================================= - -void AIS_Relation::SetSecondShape(const TopoDS_Shape& aSShape) -{ - mySShape = aSShape; -} - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -AIS_KindOfDimension AIS_Relation::KindOfDimension() const -{return AIS_KOD_NONE;} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -Standard_Boolean AIS_Relation::IsMovable() const -{return Standard_False;} - - diff --git a/src/AIS/AIS_Relation.hxx b/src/AIS/AIS_Relation.hxx deleted file mode 100644 index 4246abf454..0000000000 --- a/src/AIS/AIS_Relation.hxx +++ /dev/null @@ -1,222 +0,0 @@ -// Created on: 1997-02-27 -// Created by: Odile Olivier -// Copyright (c) 1997-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. - -#ifndef _AIS_Relation_HeaderFile -#define _AIS_Relation_HeaderFile - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class Geom_Curve; -class Geom_Plane; -class Geom_Surface; -class TopoDS_Edge; -class TopoDS_Vertex; - -//! One of the four types of interactive object in -//! AIS,comprising dimensions and constraints. Serves -//! as the abstract class for the seven relation classes as -//! well as the seven dimension classes. -//! The statuses available for relations between shapes are as follows: -//! - 0 - there is no connection to a shape; -//! - 1 - there is a connection to the first shape; -//! - 2 - there is a connection to the second shape. -//! The connection takes the form of an edge between the two shapes. -class AIS_Relation : public AIS_InteractiveObject -{ - DEFINE_STANDARD_RTTIEXT(AIS_Relation, AIS_InteractiveObject) -public: - - //! Allows you to provide settings for the color theColor - //! of the lines representing the relation between the two shapes. - Standard_EXPORT void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; - - //! Allows you to remove settings for the color of the - //! lines representing the relation between the two shapes. - Standard_EXPORT void UnsetColor() Standard_OVERRIDE; - - virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Relation; } - - //! Indicates that the type of dimension is unknown. - Standard_EXPORT virtual AIS_KindOfDimension KindOfDimension() const; - - //! Returns true if the interactive object is movable. - Standard_EXPORT virtual Standard_Boolean IsMovable() const; - - const TopoDS_Shape& FirstShape() const { return myFShape; } - - Standard_EXPORT virtual void SetFirstShape (const TopoDS_Shape& aFShape); - - //! Returns the second shape. - const TopoDS_Shape& SecondShape() const { return mySShape; } - - //! Allows you to identify the second shape aSShape - //! relative to the first. - Standard_EXPORT virtual void SetSecondShape (const TopoDS_Shape& aSShape); - - void SetBndBox (const Standard_Real theXmin, const Standard_Real theYmin, const Standard_Real theZmin, - const Standard_Real theXmax, const Standard_Real theYmax, const Standard_Real theZmax) - { - myBndBox.Update (theXmin, theYmin, theZmin, theXmax, theYmax, theZmax); - myIsSetBndBox = Standard_True; - } - - void UnsetBndBox() { myIsSetBndBox = Standard_False; } - - //! Returns the plane. - const Handle(Geom_Plane)& Plane() const { return myPlane; } - - //! Allows you to set the plane thePlane. This is used to - //! define relations and dimensions in several daughter classes. - void SetPlane (const Handle(Geom_Plane)& thePlane) { myPlane = thePlane; } - - //! Returns the value of each object in the relation. - Standard_Real Value() const { return myVal; } - - //! Allows you to provide settings for the value theVal for each object in the relation. - void SetValue (const Standard_Real theVal) { myVal = theVal; } - - //! Returns the position set using SetPosition. - const gp_Pnt& Position() const { return myPosition; } - - //! Allows you to provide the objects in the relation with - //! settings for a non-default position. - void SetPosition (const gp_Pnt& thePosition) - { - myPosition = thePosition; - myAutomaticPosition = Standard_False; - } - - //! Returns settings for text aspect. - const TCollection_ExtendedString& Text() const { return myText; } - - //! Allows you to provide the settings theText for text aspect. - void SetText (const TCollection_ExtendedString& theText) { myText = theText; } - - //! Returns the value for the size of the arrow identifying - //! the relation between the two shapes. - Standard_Real ArrowSize() const { return myArrowSize; } - - //! Allows you to provide settings for the size of the - //! arrow theArrowSize identifying the relation between the two shapes. - void SetArrowSize (const Standard_Real theArrowSize) - { - myArrowSize = theArrowSize; - myArrowSizeIsDefined = Standard_True; - } - - //! Returns the value of the symbol presentation. This will be one of: - //! - AS_NONE - none - //! - AS_FIRSTAR - first arrow - //! - AS_LASTAR - last arrow - //! - AS_BOTHAR - both arrows - //! - AS_FIRSTPT - first point - //! - AS_LASTPT - last point - //! - AS_BOTHPT - both points - //! - AS_FIRSTAR_LASTPT - first arrow, last point - //! - AS_FIRSTPT_LASTAR - first point, last arrow - DsgPrs_ArrowSide SymbolPrs() const { return mySymbolPrs; } - - //! Allows you to provide settings for the symbol presentation. - void SetSymbolPrs (const DsgPrs_ArrowSide theSymbolPrs) { mySymbolPrs = theSymbolPrs; } - - //! Allows you to set the status of the extension shape by - //! the index aIndex. - //! The status will be one of the following: - //! - 0 - there is no connection to a shape; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - void SetExtShape (const Standard_Integer theIndex) { myExtShape = theIndex; } - - //! Returns the status index of the extension shape. - Standard_Integer ExtShape() const { return myExtShape; } - - //! Returns true if the display mode aMode is accepted - //! for the Interactive Objects in the relation. - //! ComputeProjPresentation(me; - //! aPres : Presentation from Prs3d; - //! Curve1 : Curve from Geom; - //! Curve2 : Curve from Geom; - //! FirstP1 : Pnt from gp; - //! LastP1 : Pnt from gp; - //! FirstP2 : Pnt from gp; - //! LastP2 : Pnt from gp; - //! aColor : NameOfColor from Quantity = Quantity_NOC_PURPLE; - //! aWidth : Real from Standard = 2; - //! aProjTOL : TypeOfLine from Aspect = Aspect_TOL_DASH; - //! aCallTOL : TypeOfLine from Aspect = Aspect_TOL_DOT) - Standard_EXPORT virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer aMode) const Standard_OVERRIDE; - - void SetAutomaticPosition (const Standard_Boolean theStatus) { myAutomaticPosition = theStatus; } - - Standard_Boolean AutomaticPosition() const { return myAutomaticPosition; } - -protected: - - Standard_EXPORT AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView); - - //! Calculates the presentation aPres of the the edge - //! anEdge and the curve it defines, ProjCurve. The later - //! is also specified by the first point FirstP and the last point LastP. - //! The presentation includes settings for color aColor, - //! type - aProjTOL and aCallTOL - and width of line, aWidth. - Standard_EXPORT void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; - - //! Calculates the presentation aPres of the the vertex - //! aVertex and the point it defines, ProjPoint. - //! The presentation includes settings for color aColor, - //! type - aProjTOM and aCallTOL - and width of line, aWidth. - Standard_EXPORT void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; - -protected: - - TopoDS_Shape myFShape; - TopoDS_Shape mySShape; - Handle(Geom_Plane) myPlane; - Standard_Real myVal; - gp_Pnt myPosition; - TCollection_ExtendedString myText; - Standard_Real myArrowSize; - Standard_Boolean myAutomaticPosition; - DsgPrs_ArrowSide mySymbolPrs; - Standard_Integer myExtShape; - gp_Pln myFirstPlane; - gp_Pln mySecondPlane; - Handle(Geom_Surface) myFirstBasisSurf; - Handle(Geom_Surface) mySecondBasisSurf; - AIS_KindOfSurface myFirstSurfType; - AIS_KindOfSurface mySecondSurfType; - Standard_Real myFirstOffset; - Standard_Real mySecondOffset; - Bnd_Box myBndBox; - Standard_Boolean myIsSetBndBox; - Standard_Boolean myArrowSizeIsDefined; - -}; - -DEFINE_STANDARD_HANDLE(AIS_Relation, AIS_InteractiveObject) - -#endif // _AIS_Relation_HeaderFile diff --git a/src/AIS/AIS_SequenceOfDimension.hxx b/src/AIS/AIS_SequenceOfDimension.hxx deleted file mode 100644 index d887ea0394..0000000000 --- a/src/AIS/AIS_SequenceOfDimension.hxx +++ /dev/null @@ -1,26 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef AIS_SequenceOfDimension_HeaderFile -#define AIS_SequenceOfDimension_HeaderFile - -#include -#include - -typedef NCollection_Sequence AIS_SequenceOfDimension; - - -#endif diff --git a/src/AIS/AIS_StandardDatum.hxx b/src/AIS/AIS_StandardDatum.hxx deleted file mode 100644 index 39dab81dce..0000000000 --- a/src/AIS/AIS_StandardDatum.hxx +++ /dev/null @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_StandardDatum_HeaderFile -#define _AIS_StandardDatum_HeaderFile - -//! Declares the type of standard datum of an Interactive Object. -enum AIS_StandardDatum -{ -AIS_SD_None, -AIS_SD_Point, -AIS_SD_Axis, -AIS_SD_Trihedron, -AIS_SD_PlaneTrihedron, -AIS_SD_Line, -AIS_SD_Circle, -AIS_SD_Plane -}; - -#endif // _AIS_StandardDatum_HeaderFile diff --git a/src/AIS/AIS_SymmetricRelation.cxx b/src/AIS/AIS_SymmetricRelation.cxx deleted file mode 100644 index 336480c56d..0000000000 --- a/src/AIS/AIS_SymmetricRelation.cxx +++ /dev/null @@ -1,624 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_SymmetricRelation,AIS_Relation) - -//======================================================================= -//function : AIS_SymmetricRelation -//purpose : -//======================================================================= -AIS_SymmetricRelation::AIS_SymmetricRelation(const TopoDS_Shape& aSymmTool, - const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation(), - myTool(aSymmTool) -{ - SetFirstShape(FirstShape); - SetSecondShape(SecondShape); - SetPlane(aPlane); - myPosition = aPlane->Pln().Location(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_SymmetricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // cas symetrie entre deux faces - ComputeTwoFacesSymmetric(aprs); - } - break; - case TopAbs_EDGE : - { - // cas symetrie entre deux edges - ComputeTwoEdgesSymmetric(aprs); - } - break; - case TopAbs_VERTEX : - { - // cas symetrie entre deux vertexs - ComputeTwoVerticesSymmetric(aprs); - } - break; - default: - break; - } - if (myTool.ShapeType() == TopAbs_EDGE) { - Handle(Geom_Curve) aCurve,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (AIS::ComputeGeometry(TopoDS::Edge(myTool), - aCurve,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) { - if (!extcurve.IsNull()) { - gp_Pnt pf, pl; - if (!isinfinite) { - pf = p1; - pl = p2; - } - if (isinfinite) aprs->SetInfiniteState(Standard_True); - ComputeProjEdgePresentation(aprs,TopoDS::Edge(myTool),aCurve,pf,pl); - } - } - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, - const Standard_Integer) -{ - Handle(Select3D_SensitiveSegment) seg; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Standard_Real F,L; - - Handle(Geom_Curve) geom_axis, extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - - if(myFShape.ShapeType() != TopAbs_VERTEX){ - BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); - - if(cu1.GetType() == GeomAbs_Line) { -// gp_Lin L1 (myFAttach,myFDirAttach); - gp_Pnt PjAttachPnt1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Pnt PjOffSetPnt = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - Standard_Real h = fabs(PjOffSetPnt.Distance(PjAttachPnt1)/cos(myAxisDirAttach.Angle(myFDirAttach))); - gp_Vec VL1(myFDirAttach); - gp_Vec VLa(PjAttachPnt1,PjOffSetPnt); - Standard_Real scal = VL1.Dot(VLa); - if(scal < 0) VL1.Reverse(); - VL1.Multiply(h); - gp_Pnt P1 = myFAttach.Translated(VL1); - gp_Pnt ProjAxis = ElCLib::Value(ElCLib::Parameter(laxis,P1),laxis); - gp_Vec v(P1,ProjAxis); - gp_Pnt P2 = ProjAxis.Translated(v); - - gp_Lin L3; - - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,myFDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - if (!myFAttach.IsEqual(P1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myFAttach, - P1); - aSel->Add(seg); - } - if (!mySAttach.IsEqual(P2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - mySAttach, - P2); - aSel->Add(seg); - } - } - - //=======================Pour les arcs====================== - if(cu1.GetType() == GeomAbs_Circle) { - Handle(Geom_Curve) aGeomCurve = BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); - Handle(Geom_Circle) geom_circ1 = Handle(Geom_Circle)::DownCast (aGeomCurve) ; -// Handle(Geom_Circle) geom_circ1 = (const Handle(Geom_Circle)&) BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); - gp_Circ circ1(geom_circ1->Circ()); - gp_Pnt OffsetPnt(myPosition.X(),myPosition.Y(),myPosition.Z()); - gp_Pnt Center1 = circ1.Location(); - gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,OffsetPnt),laxis); - gp_Pnt ProjCenter1 = ElCLib::Value(ElCLib::Parameter(laxis,Center1),laxis); - gp_Vec Vp(ProjCenter1,Center1); - if (Vp.Magnitude() <= Precision::Confusion()) Vp = gp_Vec(laxis.Direction())^myPlane->Pln().Position().Direction(); - Standard_Real Dt,R,h; - Dt = ProjCenter1.Distance(ProjOffsetPoint); - R = circ1.Radius(); - if (Dt > .999*R) { - Dt = .999*R; - gp_Vec Vout(ProjCenter1,ProjOffsetPoint); - ProjOffsetPoint = ProjCenter1.Translated(Vout.Divided(Vout.Magnitude()).Multiplied(Dt)); - OffsetPnt = ProjOffsetPoint; - } - h = Sqrt(R*R - Dt*Dt); - gp_Pnt P1 = ProjOffsetPoint.Translated(Vp.Added(Vp.Divided(Vp.Magnitude()).Multiplied(h))); - gp_Vec v(P1,ProjOffsetPoint); - gp_Pnt P2 = ProjOffsetPoint.Translated(v); - - gp_Lin L3; - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,laxis.Direction()); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - } - } - //=======================Pour les points====================== - else { - if (myFAttach.IsEqual(mySAttach,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,myPosition,myFAttach); - aSel->Add(seg); - } - else{ - gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - gp_Pnt ProjAttachmentPoint1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Vec PjAtt1_Att1(ProjAttachmentPoint1,myFAttach); - gp_Pnt P1 = ProjOffsetPoint.Translated(PjAtt1_Att1); - gp_Pnt P2 = ProjOffsetPoint.Translated(PjAtt1_Att1.Reversed()); - gp_Lin L3; - - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,myFDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,PointMin,PointMax); - aSel->Add(seg); - } - if (!myFAttach.IsEqual(P1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,myFAttach,P1); - aSel->Add(seg); - } - if (!mySAttach.IsEqual(P2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,mySAttach,P2); - aSel->Add(seg); - } - } - } -} - -//======================================================================= -//function : ComputeTwoFacesSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoFacesSymmetric(const Handle(Prs3d_Presentation)&) -{ -} - -//======================================================================= -//function : ComputeTwoEdgesSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoEdgesSymmetric(const Handle(Prs3d_Presentation)& aprs) -{ - BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); - if (cu1.GetType() != GeomAbs_Line && cu1.GetType() != GeomAbs_Circle) return; - BRepAdaptor_Curve cu2(TopoDS::Edge(mySShape)); - if (cu2.GetType() != GeomAbs_Line && cu2.GetType() != GeomAbs_Circle) return; -// gp_Pnt pint3d,ptat11,ptat12,ptat21,ptat22; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - geom1, - geom2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) { - return; - } - aprs->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape !=0)); - Handle(Geom_Curve) geom_axis,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - myAxisDirAttach = laxis.Direction(); - - if(cu1.GetType() == GeomAbs_Line){ - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - gp_Lin l1(geom_lin1->Lin()); - myFDirAttach = l1.Direction(); - } - gp_Circ circ; - if(cu1.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) geom_cir1 (Handle(Geom_Circle)::DownCast (geom1)); - gp_Circ c(geom_cir1->Circ()); - circ = c; - } - - // recherche points attache - gp_Pnt ProjOffset = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - -/*//---------------------------------------------------- - //Quand on fait la symetrie de 2 edges consecutifs: - // - // :<-- Axe - // : - // /:\ - // Edge n --->/ : \ - // / : \<-- Edge n+1 - // : - //---------------------------------------------------- -*/ - Standard_Boolean idem = Standard_False; - if (isInfinite1 && isInfinite2) { // geom1 et geom2 sont des lignes - const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); - if (myAutomaticPosition) { - myFAttach = Handle(Geom_Line)::DownCast (geom1)->Lin().Location(); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - else { - const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); - myFAttach = ElCLib::Value(ElCLib::Parameter(line1,myPosition),line1); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - } - else if (!isInfinite1 && !isInfinite2) { - if (ptat11.IsEqual(ptat21,Precision::Confusion())) { - myFAttach = ptat12; - mySAttach = ptat22; - idem = Standard_True; - } - if (ptat11.IsEqual(ptat22,Precision::Confusion())) { - myFAttach = ptat12; - mySAttach = ptat21; - idem = Standard_True; - } - if (ptat12.IsEqual(ptat21,Precision::Confusion())) { - myFAttach = ptat11; - mySAttach = ptat22; - idem = Standard_True; - } - if (ptat12.IsEqual(ptat22,Precision::Confusion())) { - myFAttach = ptat11; - mySAttach = ptat21; - idem = Standard_True; - } - if(!idem){ - if( ProjOffset.SquareDistance(ptat11) > ProjOffset.SquareDistance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - - if (ProjOffset.SquareDistance(ptat21) > ProjOffset.SquareDistance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - } - else if (isInfinite1) {// geom1 et geom2 sont des lignes - mySAttach = ptat21; - const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); - myFAttach = ElCLib::Value(ElCLib::Parameter(line1,mySAttach),line1); - } - else if (isInfinite2) {// geom1 et geom2 sont des lignes - myFAttach = ptat11; - const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - - if( !myArrowSizeIsDefined ) - myArrowSize = myFAttach.Distance(mySAttach)/50.; - //---------------------------------------------------- - - //---------------------------------------------------- - // Si myFAttach <> mySAttach et PjFAttach = myFAttach - //---------------------------------------------------- - gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - - if (PjFAttach.IsEqual(myFAttach,Precision::Confusion())){ - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - gp_Lin l2(geom_lin2->Lin()); - myFDirAttach = l2.Direction(); - gp_Pnt PntTempo; - PntTempo = myFAttach; - myFAttach = mySAttach; - mySAttach = PntTempo; - PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - } - - //---------------------------------------------------- -// gp_Pnt curpos; - - if (myAutomaticPosition) { - //gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - // offset pour eviter confusion Edge et Dimension - gp_Vec offset(myAxisDirAttach); - offset = offset * myArrowSize * (-5); - gp_Vec Vt(myFAttach, PjFAttach); - gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); - myPosition = curpos; - } - - gp_Pnt Pj1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Pnt Pj2 = ElCLib::Value(ElCLib::Parameter(laxis,mySAttach),laxis); - if ((myFAttach.SquareDistance(Pj1)+mySAttach.SquareDistance(Pj2)) <= Precision::Confusion()) myArrowSize = 0.; - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - if(cu1.GetType() == GeomAbs_Line) - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - myFDirAttach, - laxis, - myPosition); - - if(cu1.GetType() == GeomAbs_Circle) - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - circ, - laxis, - myPosition); - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aprs,TopoDS::Edge(myFShape),geom1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aprs,TopoDS::Edge(mySShape),geom2,pf,pl); - } - } -} - -//======================================================================= -//function : ComputeTwoVertexsSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoVerticesSymmetric(const Handle(Prs3d_Presentation)& aprs) -{ - if(myFShape.ShapeType() != TopAbs_VERTEX || mySShape.ShapeType() != TopAbs_VERTEX) return; - Handle(Geom_Curve) geom_axis,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Standard_Boolean isOnPlane1, isOnPlane2; - - AIS::ComputeGeometry(TopoDS::Vertex(myFShape), myFAttach, myPlane, isOnPlane1); - AIS::ComputeGeometry(TopoDS::Vertex(mySShape), mySAttach, myPlane, isOnPlane2); - - if( !myArrowSizeIsDefined ) - myArrowSize = myFAttach.Distance(mySAttach)/50.; - - if (isOnPlane1 && isOnPlane2) - myExtShape = 0; - else if ( isOnPlane1 && !isOnPlane2) - myExtShape = 2; - else if (!isOnPlane1 && isOnPlane2) - myExtShape = 1; - else - return ; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - myAxisDirAttach = laxis.Direction(); - - // recherche points attache -// gp_Pnt curpos; - if (myAutomaticPosition) { - gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - // offset pour eviter confusion Edge et Dimension - gp_Vec offset(myAxisDirAttach); - offset = offset * myArrowSize * (-5); - gp_Vec Vt(myFAttach, PjFAttach); - gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); - myPosition = curpos; - } - if (2*(myFAttach.Distance(mySAttach)) <= Precision::Confusion()) myArrowSize = 0.; - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - laxis, - myPosition); - if ( myExtShape == 1) - ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myFShape),myFAttach); - else if ( myExtShape == 2) - ComputeProjVertexPresentation(aprs,TopoDS::Vertex(mySShape),mySAttach); -} - - - - - - diff --git a/src/AIS/AIS_SymmetricRelation.hxx b/src/AIS/AIS_SymmetricRelation.hxx deleted file mode 100644 index 1f3ce3c6d1..0000000000 --- a/src/AIS/AIS_SymmetricRelation.hxx +++ /dev/null @@ -1,80 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -#ifndef _AIS_SymmetricRelation_HeaderFile -#define _AIS_SymmetricRelation_HeaderFile - -#include -#include -#include -#include - -DEFINE_STANDARD_HANDLE(AIS_SymmetricRelation, AIS_Relation) - -//! A framework to display constraints of symmetricity -//! between two or more datum Interactive Objects. -//! A plane serves as the axis of symmetry between the -//! shapes of which the datums are parts. -class AIS_SymmetricRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_SymmetricRelation, AIS_Relation) -public: - - //! Constructs an object to display constraints of symmetricity. - //! This object is defined by a tool aSymmTool, a first - //! shape FirstShape, a second shape SecondShape, and a plane aPlane. - //! aPlane serves as the axis of symmetry. - //! aSymmTool is the shape composed of FirstShape - //! SecondShape and aPlane. It may be queried and - //! edited using the functions GetTool and SetTool. - //! The two shapes are typically two edges, two vertices or two points. - Standard_EXPORT AIS_SymmetricRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - //! Returns true if the symmetric constraint display is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! Sets the tool aSymmetricTool composed of a first - //! shape, a second shape, and a plane. - //! This tool is initially created at construction time. - void SetTool (const TopoDS_Shape& aSymmetricTool); - - //! Returns the tool composed of a first shape, a second - //! shape, and a plane. This tool is created at construction time. - const TopoDS_Shape& GetTool() const; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - Standard_EXPORT void ComputeTwoEdgesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - Standard_EXPORT void ComputeTwoVerticesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - TopoDS_Shape myTool; - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myFDirAttach; - gp_Dir myAxisDirAttach; - -}; - -#include - -#endif // _AIS_SymmetricRelation_HeaderFile diff --git a/src/AIS/AIS_SymmetricRelation.lxx b/src/AIS/AIS_SymmetricRelation.lxx deleted file mode 100644 index 8feca7b2df..0000000000 --- a/src/AIS/AIS_SymmetricRelation.lxx +++ /dev/null @@ -1,43 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-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. - -//======================================================================= -//function : SetTool -//purpose : -//======================================================================= -inline void AIS_SymmetricRelation::SetTool(const TopoDS_Shape& aSymmetricTool) -{ - myTool = aSymmetricTool; -} - -//======================================================================= -//function : GetTool -//purpose : -//======================================================================= -inline const TopoDS_Shape& AIS_SymmetricRelation::GetTool() const -{ - return myTool; -} - - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_SymmetricRelation::IsMovable() const -{ - return Standard_True; -} diff --git a/src/AIS/AIS_TangentRelation.cxx b/src/AIS/AIS_TangentRelation.cxx deleted file mode 100644 index c5b6eac123..0000000000 --- a/src/AIS/AIS_TangentRelation.cxx +++ /dev/null @@ -1,565 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_TangentRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_TangentRelation::AIS_TangentRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Integer anExternRef) - :myExternRef(anExternRef) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_False; -} - -//======================================================================= -//function : ExternRef -//purpose : -//======================================================================= -Standard_Integer AIS_TangentRelation::ExternRef() -{ - return myExternRef; -} - -//======================================================================= -//function : SetExternRef -//purpose : -//======================================================================= -void AIS_TangentRelation::SetExternRef(const Standard_Integer aRef) -{ - myExternRef = aRef; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_TangentRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeTwoFacesTangent(aPresentation); - } - break; - case TopAbs_EDGE : - { - ComputeTwoEdgesTangent(aPresentation); - } - break; - default: - break; - } -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - gp_Vec vec(myDir); - gp_Vec vec1 = vec.Multiplied(myLength); - gp_Vec vec2 = vec.Multiplied(-myLength); - gp_Pnt p1 = myPosition.Translated(vec1); - gp_Pnt p2 = myPosition.Translated(vec2); - - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,p1,p2); - aSelection->Add(seg); -} - -//======================================================================= -//function : ComputeTwoFacesTangent -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeTwoFacesTangent - (const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -} - -// jfa 19/10/2000 begin -//======================================================================= -//function : ComputeTangencyPoint -//purpose : -//======================================================================= -static Standard_Boolean ComputeTangencyPoint(const Handle(Geom_Curve)& GC1, - const Handle(Geom_Curve)& GC2, - gp_Pnt& aPoint) -{ - Standard_Real U1f = GC1->FirstParameter(); - Standard_Real U1l = GC1->LastParameter(); - Standard_Real U2f = GC2->FirstParameter(); - Standard_Real U2l = GC2->LastParameter(); - - gp_Pnt PC1; - Standard_Real mindist=0; - GeomAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l); - for ( Standard_Integer i = 1; i <= Ex.NbExtrema(); i++) - { - gp_Pnt P1,P2; - Ex.Points(i,P1,P2); - Standard_Real dist = P1.Distance(P2); - if ( i == 1 ) - { - mindist = dist; - PC1 = P1; - } - else - { - if ( (dist < mindist) || (dist < Precision::Confusion()) ) - { - mindist = dist; - PC1 = P1; - } - } - if ( dist < Precision::Confusion() ) - { - if (GC1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - continue; // tangent line and conic can have only one point with zero distance - } - gp_Vec aVector1,aVector2; - if (GC1->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC1)); - Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P1); - ElCLib::D1(par_inter,circle->Circ(),P1,aVector1); - } - else if (GC1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC1)); - Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P1); - ElCLib::D1(par_inter,ellipse->Elips(),P1,aVector1); - } - if (GC2->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC2)); - Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P2); - ElCLib::D1(par_inter,circle->Circ(),P2,aVector2); - } - else if (GC2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC2)); - Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P2); - ElCLib::D1(par_inter,ellipse->Elips(),P2,aVector2); - } -// if ( aVector1.IsParallel(aVector2, 100*Precision::Angular()) ) break; - if ( aVector1.IsParallel(aVector2, M_PI / 360.0) ) break; // 0.5 graduce - } - } - aPoint = PC1; - return Standard_True; -} -// jfa 19/10/2000 end - -//======================================================================= -//function : ComputeTwoEdgesTangent -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeTwoEdgesTangent(const Handle(Prs3d_Presentation)& aPresentation) -{ - Handle(Geom_Curve) copy1,copy2; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - copy1, - copy2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - { - return; - } - - aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); - // current face - BRepBuilderAPI_MakeFace makeface(myPlane->Pln()); - TopoDS_Face face(makeface.Face()); - BRepAdaptor_Surface adp(makeface.Face()); - - Standard_Integer typArg(0); - - if (copy1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - typArg = 10; - } - else if (copy1->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - typArg = 20; - } - else if (copy1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - typArg = 30; - } - else return; - - if (copy2->IsInstance(STANDARD_TYPE(Geom_Line))) - { - typArg += 1; - } - else if (copy2->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - typArg += 2; - } - else if (copy2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - typArg += 3; - } - else return; - - //First find the tangengy vector if exists - TopoDS_Vertex VCom; - TopExp_Explorer expF(TopoDS::Edge(myFShape),TopAbs_VERTEX); - TopExp_Explorer expS(TopoDS::Edge(mySShape),TopAbs_VERTEX); - TopoDS_Shape tab[2]; - Standard_Integer p ; - for (p = 0; expF.More(); expF.Next(),p++) - { - tab[p] = TopoDS::Vertex(expF.Current()); - } - Standard_Boolean found(Standard_False); - for ( ; expS.More() && !found; expS.Next()) - { - for ( Standard_Integer l = 0; l<=p && !found; l++) - { - found = ( expS.Current().IsSame(tab[l])); - if (found) VCom = TopoDS::Vertex(expS.Current()); - } - } - - gp_Vec theVector; - gp_Pnt pint3d; // tangency point - gp_Dir theDir; // tangency direction - Standard_Real par_inter = 0.0; // parameter of tangency point - - if (found) - { - pint3d = BRep_Tool::Pnt(VCom); - } - - // Otherwise it is found as if it was known that 2 curves - // are tangents (which must be the cases) - switch (typArg) - { - case 12: // circle line - { - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); - - if ( !found ) - { - // it is enough to project the circus center on the straight line - par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); - pint3d = ElCLib::Value(par_inter, line->Lin()); - } - - theDir = line->Lin().Direction(); - myLength = circle->Radius()/5.; - if ( !isInfinite1 ) - { - Standard_Real copy1Length = ptat12.Distance(ptat11); - if ( copy1Length < myLength ) - myLength = copy1Length/3.; - } - } - break; - case 21: // circle line - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); - - if (!found) - { - // it is enough to project the circus center on the straight line - par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); - pint3d = ElCLib::Value(par_inter, line->Lin()); - } - - theDir = line->Lin().Direction(); - myLength = circle->Radius()/5.; - if (!isInfinite2) - { - Standard_Real copy2Length = ptat21.Distance(ptat22); - if ( copy2Length < myLength ) - myLength = copy2Length/3.; - } - } - break; - // jfa 19/10/2000 begin - case 13: // line ellipse - { - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); - - if (!found) - { - ComputeTangencyPoint(line,ellipse,pint3d); - } - - theDir = line->Lin().Direction(); - myLength = ellipse->MajorRadius()/5.; - - if (!isInfinite1) - { - Standard_Real copy1Length = ptat12.Distance(ptat11); - if ( copy1Length < myLength ) - myLength = copy1Length/3.; - } - } - break; - case 31: // ellipse line - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); - - if (!found) - { - ComputeTangencyPoint(line,ellipse,pint3d); - } - - theDir = line->Lin().Direction(); - myLength = ellipse->MajorRadius()/5.; - - if (!isInfinite2) - { - Standard_Real copy2Length = ptat21.Distance(ptat22); - if ( copy2Length < myLength ) - myLength = copy2Length/3.; - } - } - break; - case 22: // circle circle - { - Handle(Geom_Circle) circle1 (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Circle) circle2 (Handle(Geom_Circle)::DownCast (copy2)); - Standard_Real R1 = circle1->Radius(); - Standard_Real R2 = circle2->Radius(); - myLength = Max(R1,R2)/5.0; - if ( !found ) - { - if ( (circle1->Location()).IsEqual(circle2->Location(),Precision::Confusion()) ) - { - if ( R1 >= R2 ) - { - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - else - { - ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); - } - } - else - { - if ( R1 >= R2 ) - { - par_inter = ElCLib::Parameter(circle1->Circ(), circle2->Location()); - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - else - { - par_inter = ElCLib::Parameter(circle2->Circ(), circle1->Location()); - ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); - } - } - } - else - { - par_inter = ElCLib::Parameter(circle1->Circ(), pint3d); - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 23: // circle ellipse - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); - Standard_Real R1 = circle->Radius(); - Standard_Real R2 = ellipse->MajorRadius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 >= R2 ) - { - ComputeTangencyPoint(circle,ellipse,pint3d); - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(ellipse,circle,pint3d); - par_inter = ElCLib::Parameter(ellipse->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 32: // ellipse circle - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); - Standard_Real R1 = ellipse->MajorRadius(); - Standard_Real R2 = circle->Radius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 >= R2 ) - { - ComputeTangencyPoint(ellipse,circle,pint3d); - par_inter = ElCLib::Parameter( ellipse->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(circle,ellipse,pint3d); - par_inter = ElCLib::Parameter( circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 33: // ellipse ellipse - { - Handle(Geom_Ellipse) ellipse1 (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse2 (Handle(Geom_Ellipse)::DownCast (copy2)); - Standard_Real R1 = ellipse1->MajorRadius(); - Standard_Real R2 = ellipse2->MajorRadius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 > R2 ) - { - ComputeTangencyPoint(ellipse1,ellipse2,pint3d); - par_inter = ElCLib::Parameter( ellipse1->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(ellipse2,ellipse1,pint3d); - par_inter = ElCLib::Parameter( ellipse2->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse2->Elips(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(ellipse1->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - // jfa 19/10/2000 end - default: - return; - } - - myAttach = pint3d; - myDir = theDir; - myPosition = pint3d; - myLength = Min(myLength,myArrowSize); - - DsgPrs_TangentPresentation::Add(aPresentation,myDrawer,myAttach,myDir,myLength); - if ( (myExtShape != 0) && !extCurv.IsNull()) - { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) - { - if (!isInfinite1) - { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),copy1,pf,pl); - } - else - { - if (!isInfinite2) - { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),copy2,pf,pl); - } - } -} diff --git a/src/AIS/AIS_TangentRelation.hxx b/src/AIS/AIS_TangentRelation.hxx deleted file mode 100644 index a9da68daf4..0000000000 --- a/src/AIS/AIS_TangentRelation.hxx +++ /dev/null @@ -1,73 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-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. - -#ifndef _AIS_TangentRelation_HeaderFile -#define _AIS_TangentRelation_HeaderFile - -#include - -DEFINE_STANDARD_HANDLE(AIS_TangentRelation, AIS_Relation) - -//! A framework to display tangency constraints between -//! two or more Interactive Objects of the datum type. -//! The datums are normally faces or edges. -class AIS_TangentRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_TangentRelation, AIS_Relation) -public: - - //! TwoFacesTangent or TwoEdgesTangent relation - //! Constructs an object to display tangency constraints. - //! This object is defined by the first shape aFShape, the - //! second shape aSShape, the plane aPlane and the index anExternRef. - //! aPlane serves as an optional axis. - //! anExternRef set to 0 indicates that there is no relation. - Standard_EXPORT AIS_TangentRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const Standard_Integer anExternRef = 0); - - //! Returns the external reference for tangency. - //! The values are as follows: - //! - 0 - there is no connection; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - //! This reference is defined at construction time. - Standard_EXPORT Standard_Integer ExternRef(); - - //! Sets the external reference for tangency, aRef. - //! The values are as follows: - //! - 0 - there is no connection; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - //! This reference is initially defined at construction time. - Standard_EXPORT void SetExternRef (const Standard_Integer aRef); - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesTangent (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesTangent (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myAttach; - gp_Dir myDir; - Standard_Real myLength; - Standard_Integer myExternRef; - -}; - -#endif // _AIS_TangentRelation_HeaderFile diff --git a/src/AIS/AIS_TypeOfAngle.hxx b/src/AIS/AIS_TypeOfAngle.hxx deleted file mode 100644 index 2d28c32578..0000000000 --- a/src/AIS/AIS_TypeOfAngle.hxx +++ /dev/null @@ -1,27 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_TypeOfAngle_HeaderFile -#define _AIS_TypeOfAngle_HeaderFile - -//! Declares the type of angle. -enum AIS_TypeOfAngle -{ -AIS_TOA_Interior, //!< the angle between two lines built on geometry parameters -AIS_TOA_Exterior //!< the angle equal 2 PI minus the interior angle -}; - -#endif // _AIS_TypeOfAngle_HeaderFile diff --git a/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx b/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx deleted file mode 100644 index 8915bced09..0000000000 --- a/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx +++ /dev/null @@ -1,29 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_TypeOfAngleArrowVisibility_HeaderFile -#define _AIS_TypeOfAngleArrowVisibility_HeaderFile - -//! Declares what arrows are visible on angle presentation -enum AIS_TypeOfAngleArrowVisibility -{ -AIS_TOAV_Both, //!< both arrows of the first and the second angle tips -AIS_TOAV_First, //!< only first point arrow -AIS_TOAV_Second, //!< only second point arrow -AIS_TOAV_None //!< arrows are not visible -}; - -#endif // _AIS_TypeOfAngleArrowVisibility_HeaderFile diff --git a/src/AIS/AIS_TypeOfDist.hxx b/src/AIS/AIS_TypeOfDist.hxx deleted file mode 100644 index 38cbb3087e..0000000000 --- a/src/AIS/AIS_TypeOfDist.hxx +++ /dev/null @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-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. - -#ifndef _AIS_TypeOfDist_HeaderFile -#define _AIS_TypeOfDist_HeaderFile - -//! To declare the type of distance. -enum AIS_TypeOfDist -{ -AIS_TOD_Unknown, -AIS_TOD_Horizontal, -AIS_TOD_Vertical -}; - -#endif // _AIS_TypeOfDist_HeaderFile diff --git a/src/AIS/FILES b/src/AIS/FILES index 7b21d4f4bb..0343a90f69 100644 --- a/src/AIS/FILES +++ b/src/AIS/FILES @@ -1,4 +1,3 @@ -AIS.cxx AIS.hxx AIS_Animation.cxx AIS_Animation.hxx @@ -7,8 +6,6 @@ AIS_AnimationCamera.cxx AIS_AnimationCamera.hxx AIS_AnimationObject.cxx AIS_AnimationObject.hxx -AIS_AngleDimension.cxx -AIS_AngleDimension.hxx AIS_AttributeFilter.cxx AIS_AttributeFilter.hxx AIS_AttributeFilter.lxx @@ -20,12 +17,6 @@ AIS_C0RegularityFilter.cxx AIS_C0RegularityFilter.hxx AIS_CameraFrustum.cxx AIS_CameraFrustum.hxx -AIS_Chamf2dDimension.cxx -AIS_Chamf2dDimension.hxx -AIS_Chamf2dDimension.lxx -AIS_Chamf3dDimension.cxx -AIS_Chamf3dDimension.hxx -AIS_Chamf3dDimension.lxx AIS_Circle.cxx AIS_Circle.hxx AIS_ClearMode.hxx @@ -35,8 +26,6 @@ AIS_ColoredShape.hxx AIS_DataMapOfShapeDrawer.hxx AIS_ColorScale.cxx AIS_ColorScale.hxx -AIS_ConcentricRelation.cxx -AIS_ConcentricRelation.hxx AIS_ConnectedInteractive.cxx AIS_ConnectedInteractive.hxx AIS_ConnectStatus.hxx @@ -46,35 +35,16 @@ AIS_DataMapIteratorOfDataMapOfSelStat.hxx AIS_DataMapofIntegerListOfinteractive.hxx AIS_DataMapOfIOStatus.hxx AIS_DataMapOfSelStat.hxx -AIS_DiameterDimension.cxx -AIS_DiameterDimension.hxx -AIS_Dimension.cxx -AIS_Dimension.hxx -AIS_DimensionOwner.cxx -AIS_DimensionOwner.hxx -AIS_DimensionSelectionMode.hxx AIS_DisplayMode.hxx -AIS_DisplaySpecialSymbol.hxx AIS_DisplayStatus.hxx AIS_DragAction.hxx -AIS_EllipseRadiusDimension.cxx -AIS_EllipseRadiusDimension.hxx -AIS_EqualDistanceRelation.cxx -AIS_EqualDistanceRelation.hxx -AIS_EqualDistanceRelation.lxx -AIS_EqualRadiusRelation.cxx -AIS_EqualRadiusRelation.hxx AIS_ExclusionFilter.cxx AIS_ExclusionFilter.hxx AIS_ExclusionFilter.lxx -AIS_FixRelation.cxx -AIS_FixRelation.hxx AIS_GlobalStatus.cxx AIS_GlobalStatus.hxx AIS_GraphicTool.cxx AIS_GraphicTool.hxx -AIS_IdenticRelation.cxx -AIS_IdenticRelation.hxx AIS_IndexedDataMapOfOwnerPrs.hxx AIS_InteractiveContext.cxx AIS_InteractiveContext.hxx @@ -83,13 +53,7 @@ AIS_InteractiveContext_2.cxx AIS_InteractiveContext_3.cxx AIS_InteractiveObject.cxx AIS_InteractiveObject.hxx -AIS_KindOfDimension.hxx AIS_KindOfInteractive.hxx -AIS_KindOfRelation.hxx -AIS_KindOfSurface.hxx -AIS_KindOfUnit.hxx -AIS_LengthDimension.cxx -AIS_LengthDimension.hxx AIS_Line.cxx AIS_Line.hxx AIS_ListIteratorOfListOfInteractive.hxx @@ -101,29 +65,14 @@ AIS_ManipulatorOwner.hxx AIS_ManipulatorOwner.cxx AIS_MapIteratorOfMapOfInteractive.hxx AIS_MapOfInteractive.hxx -AIS_MaxRadiusDimension.cxx -AIS_MaxRadiusDimension.hxx AIS_MediaPlayer.cxx AIS_MediaPlayer.hxx AIS_MouseGesture.hxx -AIS_MidPointRelation.cxx -AIS_MidPointRelation.hxx -AIS_MidPointRelation.lxx -AIS_MinRadiusDimension.cxx -AIS_MinRadiusDimension.hxx AIS_MultipleConnectedInteractive.cxx AIS_MultipleConnectedInteractive.hxx AIS_MultipleConnectedInteractive.lxx AIS_NavigationMode.hxx AIS_NListOfEntityOwner.hxx -AIS_OffsetDimension.cxx -AIS_OffsetDimension.hxx -AIS_OffsetDimension.lxx -AIS_ParallelRelation.cxx -AIS_ParallelRelation.hxx -AIS_ParallelRelation.lxx -AIS_PerpendicularRelation.cxx -AIS_PerpendicularRelation.hxx AIS_Plane.cxx AIS_Plane.hxx AIS_PlaneTrihedron.cxx @@ -132,10 +81,6 @@ AIS_Point.cxx AIS_Point.hxx AIS_PointCloud.cxx AIS_PointCloud.hxx -AIS_RadiusDimension.cxx -AIS_RadiusDimension.hxx -AIS_Relation.cxx -AIS_Relation.hxx AIS_RotationMode.hxx AIS_RubberBand.hxx AIS_RubberBand.cxx @@ -143,20 +88,13 @@ AIS_Selection.cxx AIS_Selection.hxx AIS_SelectStatus.hxx AIS_SelectionModesConcurrency.hxx -AIS_SequenceOfDimension.hxx AIS_SequenceOfInteractive.hxx AIS_Shape.cxx AIS_Shape.hxx AIS_SignatureFilter.cxx AIS_SignatureFilter.hxx -AIS_StandardDatum.hxx AIS_StatusOfDetection.hxx AIS_StatusOfPick.hxx -AIS_SymmetricRelation.cxx -AIS_SymmetricRelation.hxx -AIS_SymmetricRelation.lxx -AIS_TangentRelation.cxx -AIS_TangentRelation.hxx AIS_TextLabel.cxx AIS_TextLabel.hxx AIS_TexturedShape.cxx @@ -170,11 +108,8 @@ AIS_TrihedronOwner.hxx AIS_TrihedronSelectionMode.hxx AIS_TypeFilter.cxx AIS_TypeFilter.hxx -AIS_TypeOfAngle.hxx -AIS_TypeOfAngleArrowVisibility.hxx AIS_TypeOfAttribute.hxx AIS_TypeOfAxis.hxx -AIS_TypeOfDist.hxx AIS_TypeOfIso.hxx AIS_TypeOfPlane.hxx AIS_ViewController.cxx diff --git a/src/PrsDim/AIS_AngleDimension.hxx b/src/PrsDim/AIS_AngleDimension.hxx new file mode 100644 index 0000000000..5e99810f7c --- /dev/null +++ b/src/PrsDim/AIS_AngleDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_AngleDimension_HeaderFile +#define _AIS_AngleDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_AngleDimension AIS_AngleDimension; + +#endif // _AIS_AngleDimension_HeaderFile diff --git a/src/PrsDim/AIS_Chamf2dDimension.hxx b/src/PrsDim/AIS_Chamf2dDimension.hxx new file mode 100644 index 0000000000..4ebb17eb20 --- /dev/null +++ b/src/PrsDim/AIS_Chamf2dDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_Chamf2dDimension_HeaderFile +#define _AIS_Chamf2dDimension_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Chamf2dDimension AIS_Chamf2dDimension; + +#endif // _AIS_Chamf2dDimension_HeaderFile diff --git a/src/PrsDim/AIS_Chamf3dDimension.hxx b/src/PrsDim/AIS_Chamf3dDimension.hxx new file mode 100644 index 0000000000..92446f7ce4 --- /dev/null +++ b/src/PrsDim/AIS_Chamf3dDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_Chamf3dDimension_HeaderFile +#define _AIS_Chamf3dDimension_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Chamf3dDimension AIS_Chamf3dDimension; + +#endif // _AIS_Chamf3dDimension_HeaderFile diff --git a/src/PrsDim/AIS_ConcentricRelation.hxx b/src/PrsDim/AIS_ConcentricRelation.hxx new file mode 100644 index 0000000000..46d570f9e6 --- /dev/null +++ b/src/PrsDim/AIS_ConcentricRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_ConcentricRelation_HeaderFile +#define _AIS_ConcentricRelation_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_ConcentricRelation AIS_ConcentricRelation; + +#endif // _AIS_ConcentricRelation_HeaderFile diff --git a/src/PrsDim/AIS_DiameterDimension.hxx b/src/PrsDim/AIS_DiameterDimension.hxx new file mode 100644 index 0000000000..bc13501993 --- /dev/null +++ b/src/PrsDim/AIS_DiameterDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_DiameterDimension_HeaderFile +#define _AIS_DiameterDimension_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_DiameterDimension AIS_DiameterDimension; + +#endif // _AIS_DiameterDimension_HeaderFile diff --git a/src/PrsDim/AIS_Dimension.hxx b/src/PrsDim/AIS_Dimension.hxx new file mode 100644 index 0000000000..0892585945 --- /dev/null +++ b/src/PrsDim/AIS_Dimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_Dimension_HeaderFile +#define _AIS_Dimension_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Dimension AIS_Dimension; + +#endif // _AIS_Dimension_HeaderFile diff --git a/src/PrsDim/AIS_DimensionOwner.hxx b/src/PrsDim/AIS_DimensionOwner.hxx new file mode 100644 index 0000000000..e0c714d8ca --- /dev/null +++ b/src/PrsDim/AIS_DimensionOwner.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_DimensionOwner_HeaderFile +#define _AIS_DimensionOwner_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_DimensionOwner AIS_DimensionOwner; + +#endif // _AIS_DimensionOwner_HeaderFile diff --git a/src/PrsDim/AIS_EllipseRadiusDimension.hxx b/src/PrsDim/AIS_EllipseRadiusDimension.hxx new file mode 100644 index 0000000000..5d20c5f2d3 --- /dev/null +++ b/src/PrsDim/AIS_EllipseRadiusDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_EllipseRadiusDimension_HeaderFile +#define _AIS_EllipseRadiusDimension_HeaderFile + +#include + +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_EllipseRadiusDimension AIS_EllipseRadiusDimension; + +#endif // _AIS_EllipseRadiusDimension_HeaderFile diff --git a/src/PrsDim/AIS_EqualDistanceRelation.hxx b/src/PrsDim/AIS_EqualDistanceRelation.hxx new file mode 100644 index 0000000000..10102cbb5e --- /dev/null +++ b/src/PrsDim/AIS_EqualDistanceRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_EqualDistanceRelation_HeaderFile +#define _AIS_EqualDistanceRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_EqualDistanceRelation AIS_EqualDistanceRelation; + +#endif // _AIS_EqualDistanceRelation_HeaderFile diff --git a/src/PrsDim/AIS_EqualRadiusRelation.hxx b/src/PrsDim/AIS_EqualRadiusRelation.hxx new file mode 100644 index 0000000000..3f924301f7 --- /dev/null +++ b/src/PrsDim/AIS_EqualRadiusRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_EqualRadiusRelation_HeaderFile +#define _AIS_EqualRadiusRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_EqualRadiusRelation AIS_EqualRadiusRelation; + +#endif // _AIS_EqualRadiusRelation_HeaderFile diff --git a/src/PrsDim/AIS_FixRelation.hxx b/src/PrsDim/AIS_FixRelation.hxx new file mode 100644 index 0000000000..1adedde858 --- /dev/null +++ b/src/PrsDim/AIS_FixRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_FixRelation_HeaderFile +#define _AIS_FixRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_FixRelation AIS_FixRelation; + +#endif // _AIS_FixRelation_HeaderFile diff --git a/src/PrsDim/AIS_IdenticRelation.hxx b/src/PrsDim/AIS_IdenticRelation.hxx new file mode 100644 index 0000000000..02eb6e406b --- /dev/null +++ b/src/PrsDim/AIS_IdenticRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_IdenticRelation_HeaderFile +#define _AIS_IdenticRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_IdenticRelation AIS_IdenticRelation; + +#endif // _AIS_IdenticRelation_HeaderFile diff --git a/src/PrsDim/AIS_LengthDimension.hxx b/src/PrsDim/AIS_LengthDimension.hxx new file mode 100644 index 0000000000..a79cf351a0 --- /dev/null +++ b/src/PrsDim/AIS_LengthDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_LengthDimension_HeaderFile +#define _AIS_LengthDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_LengthDimension AIS_LengthDimension; + +#endif // _AIS_LengthDimension_HeaderFile diff --git a/src/PrsDim/AIS_MaxRadiusDimension.hxx b/src/PrsDim/AIS_MaxRadiusDimension.hxx new file mode 100644 index 0000000000..e8614a4ce3 --- /dev/null +++ b/src/PrsDim/AIS_MaxRadiusDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_MaxRadiusDimension_HeaderFile +#define _AIS_MaxRadiusDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MaxRadiusDimension AIS_MaxRadiusDimension; + +#endif // _AIS_MaxRadiusDimension_HeaderFile diff --git a/src/PrsDim/AIS_MidPointRelation.hxx b/src/PrsDim/AIS_MidPointRelation.hxx new file mode 100644 index 0000000000..a58e049005 --- /dev/null +++ b/src/PrsDim/AIS_MidPointRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_MidPointRelation_HeaderFile +#define _AIS_MidPointRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MidPointRelation AIS_MidPointRelation; + +#endif // _AIS_MidPointRelation_HeaderFile diff --git a/src/PrsDim/AIS_MinRadiusDimension.hxx b/src/PrsDim/AIS_MinRadiusDimension.hxx new file mode 100644 index 0000000000..dce761bb13 --- /dev/null +++ b/src/PrsDim/AIS_MinRadiusDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_MinRadiusDimension_HeaderFile +#define _AIS_MinRadiusDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MinRadiusDimension AIS_MinRadiusDimension; + +#endif // _AIS_MinRadiusDimension_HeaderFile diff --git a/src/PrsDim/AIS_OffsetDimension.hxx b/src/PrsDim/AIS_OffsetDimension.hxx new file mode 100644 index 0000000000..cb9b27f2cf --- /dev/null +++ b/src/PrsDim/AIS_OffsetDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_OffsetDimension_HeaderFile +#define _AIS_OffsetDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_OffsetDimension AIS_OffsetDimension; + +#endif // _AIS_OffsetDimension_HeaderFile diff --git a/src/PrsDim/AIS_ParallelRelation.hxx b/src/PrsDim/AIS_ParallelRelation.hxx new file mode 100644 index 0000000000..c4b0d78f48 --- /dev/null +++ b/src/PrsDim/AIS_ParallelRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_ParallelRelation_HeaderFile +#define _AIS_ParallelRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_ParallelRelation AIS_ParallelRelation; + +#endif // _AIS_ParallelRelation_HeaderFile diff --git a/src/PrsDim/AIS_PerpendicularRelation.hxx b/src/PrsDim/AIS_PerpendicularRelation.hxx new file mode 100644 index 0000000000..1e1a08933e --- /dev/null +++ b/src/PrsDim/AIS_PerpendicularRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_PerpendicularRelation_HeaderFile +#define _AIS_PerpendicularRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_PerpendicularRelation AIS_PerpendicularRelation; + +#endif // _AIS_PerpendicularRelation_HeaderFile diff --git a/src/PrsDim/AIS_RadiusDimension.hxx b/src/PrsDim/AIS_RadiusDimension.hxx new file mode 100644 index 0000000000..c48e4ebdc0 --- /dev/null +++ b/src/PrsDim/AIS_RadiusDimension.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_RadiusDimension_HeaderFile +#define _AIS_RadiusDimension_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_RadiusDimension AIS_RadiusDimension; + +#endif // _AIS_RadiusDimension_HeaderFile diff --git a/src/PrsDim/AIS_Relation.hxx b/src/PrsDim/AIS_Relation.hxx new file mode 100644 index 0000000000..45dfe3f843 --- /dev/null +++ b/src/PrsDim/AIS_Relation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_Relation_HeaderFile +#define _AIS_Relation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_Relation AIS_Relation; + +#endif // _AIS_Relation_HeaderFile diff --git a/src/PrsDim/AIS_SymmetricRelation.hxx b/src/PrsDim/AIS_SymmetricRelation.hxx new file mode 100644 index 0000000000..d452b8b364 --- /dev/null +++ b/src/PrsDim/AIS_SymmetricRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_SymmetricRelation_HeaderFile +#define _AIS_SymmetricRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_SymmetricRelation AIS_SymmetricRelation; + +#endif // _AIS_SymmetricRelation_HeaderFile diff --git a/src/PrsDim/AIS_TangentRelation.hxx b/src/PrsDim/AIS_TangentRelation.hxx new file mode 100644 index 0000000000..ea7159f050 --- /dev/null +++ b/src/PrsDim/AIS_TangentRelation.hxx @@ -0,0 +1,22 @@ +// Copyright (c) 2020 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. + +#ifndef _AIS_TangentRelation_HeaderFile +#define _AIS_TangentRelation_HeaderFile + +#include + +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_TangentRelation AIS_TangentRelation; + +#endif // _AIS_TangentRelation_HeaderFile diff --git a/src/PrsDim/FILES b/src/PrsDim/FILES new file mode 100644 index 0000000000..d0efcd91cb --- /dev/null +++ b/src/PrsDim/FILES @@ -0,0 +1,79 @@ +PrsDim.cxx +PrsDim.hxx +PrsDim_AngleDimension.cxx +PrsDim_AngleDimension.hxx +PrsDim_Chamf2dDimension.cxx +PrsDim_Chamf2dDimension.hxx +PrsDim_Chamf3dDimension.cxx +PrsDim_Chamf3dDimension.hxx +PrsDim_ConcentricRelation.cxx +PrsDim_ConcentricRelation.hxx +PrsDim_DiameterDimension.cxx +PrsDim_DiameterDimension.hxx +PrsDim_Dimension.cxx +PrsDim_Dimension.hxx +PrsDim_DimensionOwner.cxx +PrsDim_DimensionOwner.hxx +PrsDim_EllipseRadiusDimension.cxx +PrsDim_EllipseRadiusDimension.hxx +PrsDim_EqualDistanceRelation.cxx +PrsDim_EqualDistanceRelation.hxx +PrsDim_EqualRadiusRelation.cxx +PrsDim_EqualRadiusRelation.hxx +PrsDim_FixRelation.cxx +PrsDim_FixRelation.hxx +PrsDim_IdenticRelation.cxx +PrsDim_IdenticRelation.hxx +PrsDim_LengthDimension.cxx +PrsDim_LengthDimension.hxx +PrsDim_MaxRadiusDimension.cxx +PrsDim_MaxRadiusDimension.hxx +PrsDim_MidPointRelation.cxx +PrsDim_MidPointRelation.hxx +PrsDim_MinRadiusDimension.cxx +PrsDim_MinRadiusDimension.hxx +PrsDim_OffsetDimension.cxx +PrsDim_OffsetDimension.hxx +PrsDim_ParallelRelation.cxx +PrsDim_ParallelRelation.hxx +PrsDim_PerpendicularRelation.cxx +PrsDim_PerpendicularRelation.hxx +PrsDim_RadiusDimension.cxx +PrsDim_RadiusDimension.hxx +PrsDim_Relation.cxx +PrsDim_Relation.hxx +PrsDim_SymmetricRelation.cxx +PrsDim_SymmetricRelation.hxx +PrsDim_TangentRelation.cxx +PrsDim_TangentRelation.hxx +PrsDim_DimensionSelectionMode.hxx +PrsDim_DisplaySpecialSymbol.hxx +PrsDim_KindOfDimension.hxx +PrsDim_KindOfRelation.hxx +PrsDim_KindOfSurface.hxx +PrsDim_TypeOfAngle.hxx +PrsDim_TypeOfAngleArrowVisibility.hxx +PrsDim_TypeOfDist.hxx +AIS_AngleDimension.hxx +AIS_Chamf2dDimension.hxx +AIS_Chamf3dDimension.hxx +AIS_ConcentricRelation.hxx +AIS_DiameterDimension.hxx +AIS_Dimension.hxx +AIS_DimensionOwner.hxx +AIS_EllipseRadiusDimension.hxx +AIS_EqualDistanceRelation.hxx +AIS_EqualRadiusRelation.hxx +AIS_FixRelation.hxx +AIS_IdenticRelation.hxx +AIS_LengthDimension.hxx +AIS_MaxRadiusDimension.hxx +AIS_MidPointRelation.hxx +AIS_MinRadiusDimension.hxx +AIS_OffsetDimension.hxx +AIS_ParallelRelation.hxx +AIS_PerpendicularRelation.hxx +AIS_RadiusDimension.hxx +AIS_Relation.hxx +AIS_SymmetricRelation.hxx +AIS_TangentRelation.hxx diff --git a/src/PrsDim/PrsDim.cxx b/src/PrsDim/PrsDim.cxx new file mode 100644 index 0000000000..169bd59453 --- /dev/null +++ b/src/PrsDim/PrsDim.cxx @@ -0,0 +1,1533 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const Standard_Real SquareTolerance = Precision::SquareConfusion(); + +//======================================================================= +//function : Nearest +//purpose : +//======================================================================= +gp_Pnt PrsDim::Nearest(const TopoDS_Shape& ashape, const gp_Pnt& apoint) +{ + Standard_Real dist2 = RealLast(); + Standard_Real curdist2; + gp_Pnt result(0.0,0.0,0.0); + gp_Pnt curpnt(0.0,0.0,0.0); + TopExp_Explorer explo(ashape,TopAbs_VERTEX); + while (explo.More()) + { + curpnt = BRep_Tool::Pnt(TopoDS::Vertex(explo.Current())); + curdist2 = apoint.SquareDistance(curpnt); + if (curdist2 < dist2) + { + result = curpnt; + dist2 = curdist2; + } + explo.Next(); + } + return result; +} + +//======================================================================= +//function : Nearest +//purpose : For finds the nearest point on . +//======================================================================= +gp_Pnt PrsDim::Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint) +{ + Handle(Geom_Line) aLine = new Geom_Line (theLine); + + GeomAPI_ProjectPointOnCurve aPointProj (thePoint, aLine); + return aPointProj.Point (1); +} + +//======================================================================= +//function : Nearest +//purpose : For the given point finds nearest point on the curve, +// return TRUE if found point is belongs to curve +// and FALSE otherwise. +//======================================================================= +Standard_Boolean PrsDim::Nearest (const Handle(Geom_Curve)& theCurve, + const gp_Pnt& thePoint, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theLastPoint, + gp_Pnt& theNearestPoint) +{ + GeomAPI_ProjectPointOnCurve aPointProj (thePoint, theCurve); + theNearestPoint = theCurve->Value (aPointProj.LowerDistanceParameter()); + + Standard_Real aLength = theFirstPoint.Distance (theLastPoint); + if (theNearestPoint.Distance (theFirstPoint) > aLength + || theNearestPoint.Distance (theLastPoint) > aLength) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : Farest +//purpose : +//======================================================================= +gp_Pnt PrsDim::Farest( const TopoDS_Shape& aShape, const gp_Pnt& aPoint ) +{ + Standard_Real MaxDist2 = 0.0e0, curdist2; + gp_Pnt Result(0.0,0.0,0.0); + gp_Pnt curpnt(0.0,0.0,0.0); + TopExp_Explorer Explo( aShape, TopAbs_VERTEX ); + for (; Explo.More(); Explo.Next()) + { + curpnt = BRep_Tool::Pnt( TopoDS::Vertex( Explo.Current() ) ); + curdist2 = aPoint.SquareDistance( curpnt ); + if (curdist2 > MaxDist2) + { + MaxDist2 = curdist2; + Result = curpnt; + } + } + return Result; +} + + +//======================================================================= +//function : ComputeGeometry +//purpose : for line, circle, ellipse. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt) +{ + TopLoc_Location anEdgeLoc; + Standard_Real aFirst, aLast; + theCurve = BRep_Tool::Curve (theEdge, anEdgeLoc, aFirst, aLast); + if (theCurve.IsNull()) + { + return Standard_False; + } + + if (!anEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeometry = theCurve->Transformed (anEdgeLoc.Transformation()); + theCurve = Handle(Geom_Curve)::DownCast (aGeometry); + } + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); + } + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); + theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); + theLastPnt = ElCLib::Value (aLast, aLine->Lin()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); + theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) + { + Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); + theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); + theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : for line, circle, ellipse. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt, + Standard_Boolean& theIsInfinite) +{ + Standard_Real aFirst, aLast; + + BRepAdaptor_Curve anAdaptor (theEdge); + + theCurve = Handle(Geom_Curve)::DownCast + (anAdaptor.Curve().Curve()->Transformed (anAdaptor.Trsf())); + + if (theCurve.IsNull()) + { + return Standard_False; + } + + aFirst = anAdaptor.FirstParameter(); + aLast = anAdaptor.LastParameter(); + + theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); + } + + if (!theIsInfinite) + { + theFirstPnt = theCurve->Value (aFirst); + theLastPnt = theCurve->Value (aLast); + } + else + { + theFirstPnt = gp::Origin(); + theLastPnt = gp::Origin(); + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= + +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt, + Handle(Geom_Curve)& theExtCurve, + Standard_Boolean& theIsInfinite, + Standard_Boolean& theIsOnPlane, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + Standard_Real aFirst, aLast; + BRepAdaptor_Curve aCurveAdaptor (theEdge); + theCurve = Handle(Geom_Curve)::DownCast (aCurveAdaptor.Curve().Curve()->Transformed (aCurveAdaptor.Trsf())); + aFirst = aCurveAdaptor.FirstParameter(); + aLast = aCurveAdaptor.LastParameter(); + + if (theCurve.IsNull()) + { + return Standard_False; + } + + theExtCurve = theCurve; + theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + + // Checks that the projected curve is not in the plane. + theIsOnPlane = Standard_True; + if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theExtCurve = Handle(Geom_TrimmedCurve)::DownCast (theExtCurve)->BasisCurve(); + } + + if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theExtCurve); + theIsOnPlane = thePlane->Pln().Contains (aLine->Lin(), + Precision::Confusion(), + Precision::Angular()); + } + else if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast (theExtCurve); + + gp_Ax3 aCircPos (aCircle->Position()); + theIsOnPlane = aCircPos.IsCoplanar (thePlane->Pln().Position(), + Precision::Confusion(), + Precision::Angular()); + } + + if (theIsOnPlane) + { + theExtCurve.Nullify(); + } + + theCurve = GeomProjLib::ProjectOnPlane (theCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); + if (!theIsInfinite) + { + theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); + theLastPnt = ElCLib::Value (aLast, aLine->Lin()); + } + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); + theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) + { + Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); + theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + TopLoc_Location aFirstEdgeLoc, aSecondEdgeLoc; + Standard_Real aFirst1, aLast1, aFirst2, aLast2; + + theFirstCurve = BRep_Tool::Curve (theFirstEdge, aFirstEdgeLoc, aFirst1, aLast1); + theSecondCurve = BRep_Tool::Curve (theSecondEdge, aSecondEdgeLoc, aFirst2, aLast2); + + if (theFirstCurve.IsNull()) + { + return Standard_False; + } + + if (theSecondCurve.IsNull()) + { + return Standard_False; + } + + if (!aFirstEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeomGeometry = theFirstCurve->Transformed (aFirstEdgeLoc.Transformation()); + theFirstCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); + } + + if (!aSecondEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeomGeometry = theSecondCurve->Transformed (aSecondEdgeLoc.Transformation()); + theSecondCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); + } + + theFirstCurve = GeomProjLib::ProjectOnPlane (theFirstCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + + theSecondCurve = GeomProjLib::ProjectOnPlane (theSecondCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + + if (theFirstCurve->IsInstance (STANDARD_TYPE(Geom_TrimmedCurve))) + { + theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); + } + + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); + } + + if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theFirstCurve); + + theFirstPnt1 = ElCLib::Value (aFirst1, aLine->Lin()); + theLastPnt1 = ElCLib::Value (aLast1, aLine->Lin()); + } + else if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theFirstCurve); + + theFirstPnt1 = ElCLib::Value (aFirst1, aCirc->Circ()); + theLastPnt1 = ElCLib::Value (aLast1, aCirc->Circ()); + } + else + { + return Standard_False; + } + + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Line))) +{ + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theSecondCurve); + + theFirstPnt2 = ElCLib::Value (aFirst2, aLine->Lin()); + theLastPnt2 = ElCLib::Value (aLast2, aLine->Lin()); + } + else if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theSecondCurve); + + theFirstPnt2 = ElCLib::Value (aFirst2, aCirc->Circ()); + theLastPnt2 = ElCLib::Value (aLast2, aCirc->Circ()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : Computes the geometry of the 2 edges. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + Standard_Boolean& theIsInfinite1, + Standard_Boolean& theIsInfinite2) +{ + theIsInfinite1 = theIsInfinite2 = Standard_False; + + if (!PrsDim::ComputeGeometry (theFirstEdge, theFirstCurve,theFirstPnt1, theLastPnt1, theIsInfinite1)) + { + return Standard_False; + } + + if (!PrsDim::ComputeGeometry (theSecondEdge, theSecondCurve,theFirstPnt2, theLastPnt2, theIsInfinite2)) + { + return Standard_False; + } + + if (theIsInfinite1 || theIsInfinite2) + { + if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) + { + gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); + gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); + + if (theIsInfinite1) + { + theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); + theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); + } + else if (theIsInfinite2) + { + theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); + theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); + } + } + else + { + if (theIsInfinite1 && !theIsInfinite2) + { + GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt2, theFirstCurve); + theFirstPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); + + aProjector.Init (theLastPnt2, theFirstCurve); + theLastPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); + } + else if (!theIsInfinite1 && theIsInfinite2) + { + GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt1, theSecondCurve); + theFirstPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); + + aProjector.Init (theLastPnt1, theSecondCurve); + theLastPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); + } + else + { + return Standard_False; + } + } + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : Computes the geometry of the 2 edges in the current wp +// and the 'right' geometry of the edges if one doesn't +// belong to the current working plane. +// There may be only one curve that can't belong to the +// current working plane ( attachement constraint) +// if the 2 edges belong to the current WP, = 0 +// +// indexExt = 0 2 edges are in the current wp +// indexExt = 1 first edge is not in the current wp +// indexExt = 2 second edge is not in the current wp +// if none of the two edges is in the current wp , +// it returns Standard_False +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Standard_Integer& theExtIndex, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + Handle(Geom_Curve)& theExtCurve, + Standard_Boolean& theIsInfinite1, + Standard_Boolean& theIsInfinite2, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + theExtCurve.Nullify(); + theExtIndex = 0; + + Standard_Real aFirst1, aLast1, aFirst2, aLast2; + theIsInfinite1 = theIsInfinite2 = Standard_False; + + BRepAdaptor_Curve aFirstAdaptor (theFirstEdge); + BRepAdaptor_Curve aSecondAdaptor (theSecondEdge); + + theFirstCurve = Handle(Geom_Curve)::DownCast + (aFirstAdaptor.Curve().Curve()->Transformed (aFirstAdaptor.Trsf())); + theSecondCurve = Handle(Geom_Curve)::DownCast + (aSecondAdaptor.Curve().Curve()->Transformed (aSecondAdaptor.Trsf())); + + if (theFirstCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); + } + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); + } + + aFirst1 = aFirstAdaptor.FirstParameter(); + aLast1 = aFirstAdaptor.LastParameter(); + + aFirst2 = aSecondAdaptor.FirstParameter(); + aLast2 = aSecondAdaptor.LastParameter(); + + if (theFirstCurve.IsNull() || theSecondCurve.IsNull()) + { + return Standard_False; + } + + Handle(Geom_Curve) aFirstSaved = theFirstCurve; + Handle(Geom_Curve) aSecondSaved = theSecondCurve; + + // Checks that the projected curve is not in the plane + Standard_Boolean isFirstOnPlane,isSecondOnPlane; + + if ((!ComputeGeomCurve (theFirstCurve, aFirst1, aLast1, theFirstPnt1, theLastPnt1, thePlane, isFirstOnPlane)) + || (!ComputeGeomCurve( theSecondCurve, aFirst2, aLast2, theFirstPnt2, theLastPnt2, thePlane,isSecondOnPlane))) + { + return Standard_False; + } + + if (Precision::IsInfinite (aFirst1) || Precision::IsInfinite (aLast1)) + { + theIsInfinite1 = Standard_True; + theExtIndex = 1; + } + if (Precision::IsInfinite (aFirst2) || Precision::IsInfinite (aLast2)) + { + theIsInfinite2 = Standard_True; + theExtIndex = 2; + } + if (theIsInfinite1 && theIsInfinite2) + { + theExtIndex = 0; + } + + if (theIsInfinite1 || theIsInfinite2) + { + if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) + { + gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); + gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); + + if (theExtIndex == 1) + { + theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); + theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); + } + else if (theExtIndex == 2) + { + theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); + theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); + } + } + } + + if (isFirstOnPlane && isSecondOnPlane) + { + return Standard_True; + } + + if (!isFirstOnPlane && isSecondOnPlane) + {// curve 2 only in the plane + theExtIndex = 1; + theExtCurve = aFirstSaved; + } + else if (isFirstOnPlane && !isSecondOnPlane) + {// curve 1 only in the plane + theExtIndex = 2; + theExtCurve = aSecondSaved; + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeomCurve +//purpose : Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane +// and returns aCurveproj; +// Return TRUE if ok +//======================================================================= +Standard_Boolean PrsDim::ComputeGeomCurve (Handle(Geom_Curve)& aCurve, + const Standard_Real first1, + const Standard_Real last1, + gp_Pnt& FirstPnt1, + gp_Pnt& LastPnt1, + const Handle(Geom_Plane)& aPlane, + Standard_Boolean& isOnPlane) +{ + isOnPlane = Standard_True; + const Standard_Integer NodeNumber = 20; + Standard_Real Delta = (last1 - first1) / (NodeNumber - 1); + if (Delta <= Precision::PConfusion()) + { + Delta = last1 - first1; + } + + gp_Pnt CurPnt(0.0, 0.0, 0.0); + Standard_Real CurPar = first1; + for (Standard_Integer i = 1; i <= NodeNumber; i++) + { + CurPnt = aCurve->Value( CurPar ); + if (aPlane->Pln().SquareDistance( CurPnt ) > SquareTolerance) + { + isOnPlane = Standard_False; + break; + } + CurPar += Delta; + } + + if (!Precision::IsInfinite(first1) && !Precision::IsInfinite(last1)) + { + FirstPnt1 = aCurve->Value (first1); + LastPnt1 = aCurve->Value (last1); + } + + if (!isOnPlane) + { + Handle(Geom_Curve) aGeomCurve = GeomProjLib::ProjectOnPlane (aCurve, + aPlane, + aPlane->Pln().Axis().Direction(), + Standard_False); + aCurve = aGeomCurve; + if (aCurve->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) + { + aCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve)->BasisCurve(); + } + if (! Precision::IsInfinite(first1) && ! Precision::IsInfinite(last1)) + { + FirstPnt1 = PrsDim::ProjectPointOnPlane( FirstPnt1, aPlane->Pln() ); + LastPnt1 = PrsDim::ProjectPointOnPlane( LastPnt1, aPlane->Pln() ); + } + } + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : computes the point corresponding to the vertex +// in the plane . If the vertex is already in the plane +// , = true. +// is the projected vertex in the plane. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Vertex& aVertex, + gp_Pnt& point, + const Handle(Geom_Plane)& aPlane, + Standard_Boolean& isOnPlane) +{ + point = BRep_Tool::Pnt(aVertex); + isOnPlane = aPlane->Pln().Contains(point, Precision::Confusion()); + if ( !isOnPlane) { + point = PrsDim::ProjectPointOnPlane( point, aPlane->Pln() ); + } + return Standard_True; +} + +//======================================================================= +//function : GetPlaneFromFace +//purpose : +// Returns type of surface which can be Plane or OtherSurface +//======================================================================= +Standard_Boolean PrsDim::GetPlaneFromFace (const TopoDS_Face& aFace, + gp_Pln& aPlane, + Handle(Geom_Surface)& aSurf, + PrsDim_KindOfSurface& aSurfType, + Standard_Real& Offset) + +{ + Standard_Boolean Result = Standard_False; + BRepAdaptor_Surface surf1( aFace ); + Handle( Adaptor3d_HSurface ) surf2; + Standard_Boolean isOffset = Standard_False; + Offset = 0.0; + + if (surf1.GetType() == GeomAbs_OffsetSurface) + { + // Extracting Basis Surface + surf2 = surf1.BasisSurface(); + isOffset = Standard_True; + } + else + surf2 = new BRepAdaptor_HSurface( surf1 ); + + aSurf = surf1.Surface().Surface(); + // aSurf->Transform(surf1.Trsf()) ; + aSurf = Handle( Geom_Surface )::DownCast( aSurf->Transformed( surf1.Trsf() ) ); + + if (surf2->GetType() == GeomAbs_Plane) + { + aPlane = surf2->Plane(); + aSurfType = PrsDim_KOS_Plane; + Result = Standard_True; + } + else if (surf2->GetType() == GeomAbs_SurfaceOfExtrusion) + { + Handle( Adaptor3d_HCurve ) BasisCurve = surf2->BasisCurve(); + gp_Dir ExtrusionDir = surf2->Direction(); + if (BasisCurve->GetType() == GeomAbs_Line) + { + gp_Lin BasisLine = BasisCurve->Line(); + gp_Dir LineDir = BasisLine.Direction(); + gp_Pnt LinePos = BasisLine.Location(); + gp_Pln thePlane( LinePos, LineDir ^ ExtrusionDir); + aPlane = thePlane; + aSurfType = PrsDim_KOS_Plane; + Result = Standard_True; + } + } + + if (Result == Standard_True && isOffset) + { + aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); + aPlane = (Handle( Geom_Plane )::DownCast( aSurf ))->Pln(); + } + if (Result == Standard_False) + { + if (isOffset) + { + Handle( Standard_Type ) TheType = aSurf->DynamicType(); + if (TheType == STANDARD_TYPE(Geom_CylindricalSurface) || + TheType == STANDARD_TYPE(Geom_ConicalSurface) || + TheType == STANDARD_TYPE(Geom_SphericalSurface) || + TheType == STANDARD_TYPE(Geom_ToroidalSurface)) + { + aSurf = Handle(Geom_OffsetSurface)::DownCast(aSurf)->Surface(); + } + else + { + Offset = Handle(Geom_OffsetSurface)::DownCast(aSurf)->Offset(); + aSurf = Handle(Geom_OffsetSurface)::DownCast(aSurf)->BasisSurface(); + } + } + Handle( Standard_Type ) TheType = aSurf->DynamicType(); + if (TheType == STANDARD_TYPE(Geom_CylindricalSurface)) + aSurfType = PrsDim_KOS_Cylinder; + else if (TheType == STANDARD_TYPE(Geom_ConicalSurface)) + aSurfType = PrsDim_KOS_Cone; + else if (TheType == STANDARD_TYPE(Geom_SphericalSurface)) + aSurfType = PrsDim_KOS_Sphere; + else if (TheType == STANDARD_TYPE(Geom_ToroidalSurface)) + aSurfType = PrsDim_KOS_Torus; + else if (TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution)) + aSurfType = PrsDim_KOS_Revolution; + else if (TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) + aSurfType = PrsDim_KOS_Extrusion; + else + aSurfType = PrsDim_KOS_OtherSurface; + } + return Result; +} + + +//======================================================================= +//function : ProjectPointOnPlane +//purpose : +//======================================================================= + +gp_Pnt PrsDim::ProjectPointOnPlane( const gp_Pnt & aPoint, const gp_Pln & aPlane ) +{ + gp_Vec aVec( aPlane.Location(), aPoint ); + gp_Vec Normal = aPlane.Axis().Direction(); + Normal = (aVec * Normal) * Normal; + + return ( aPoint.Translated( -Normal ) ); +} + +//======================================================================= +//function : ProjectPointOnLine +//purpose : +//======================================================================= + +gp_Pnt PrsDim::ProjectPointOnLine( const gp_Pnt & aPoint, const gp_Lin & aLine ) +{ + gp_XYZ LinLoc = aLine.Location().XYZ(); + gp_XYZ LinDir = aLine.Direction().XYZ(); + Standard_Real Parameter = (aPoint.XYZ() - LinLoc) * LinDir; + gp_Pnt Result( LinLoc + Parameter * LinDir ); + return Result; +} + +//======================================================================= +//function : InitFaceLength +//purpose : +//======================================================================= +void PrsDim::InitFaceLength (const TopoDS_Face& theFace, + gp_Pln& thePlane, + Handle(Geom_Surface)& theSurface, + PrsDim_KindOfSurface& theSurfaceType, + Standard_Real& theOffset) +{ + if (PrsDim::GetPlaneFromFace (theFace, thePlane, theSurface, theSurfaceType, theOffset) + && Abs (theOffset) > Precision::Confusion()) + { + theSurface = new Geom_OffsetSurface (theSurface, theOffset); + theOffset = 0.0e0; + } +} + +//======================================================================= +//function : InitAngleBetweenPlanarFaces +//purpose : +//======================================================================= +Standard_Boolean PrsDim::InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + gp_Pnt& theCenter, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + const Standard_Boolean theIsFirstPointSet) +{ + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theFirstFace)); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theSecondFace)); + + GeomAPI_IntSS aPlaneIntersector (aFirstPlane, aSecondPlane, Precision::Confusion()); + + // Fails if two planes haven't only one intersection line. + if (!aPlaneIntersector.IsDone()) + { + return Standard_False; + } + + if (aPlaneIntersector.NbLines() != 1) + { + return Standard_False; + } + + // Get intersect line. + Handle(Geom_Curve) anIntersectCurve = aPlaneIntersector.Line (1); + + Handle(Geom_Line) anIntersectLine = Handle(Geom_Line)::DownCast (anIntersectCurve); + + if (anIntersectLine.IsNull()) + { + return Standard_False; + } + + gp_Lin anIntersectLin = anIntersectLine->Lin(); + + gp_Pnt aFirstCenter, aSecondCenter; + Standard_Real anU1Min, anU1Max, aV1Min, aV1Max; + Standard_Real anU2Min, anU2Max, aV2Min, aV2Max; + + BRepTools::UVBounds (theFirstFace, anU1Min, anU1Max, aV1Min, aV1Max); + BRepTools::UVBounds (theSecondFace, anU2Min, anU2Max, aV2Min, aV2Max); + + // Get first and second attach. + if (theIsFirstPointSet) + { + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstPlane); + if (!aProjector.IsDone()) + { + return Standard_False; + } + + aFirstCenter = aProjector.Point (1); + } + else + { + aFirstCenter = aFirstPlane->Value ((anU1Min + anU1Max) * 0.5, (aV1Min + aV1Max) * 0.5); + } + + aSecondCenter = aSecondPlane->Value ((anU2Min + anU2Max) * 0.5, (aV2Min + aV2Max) * 0.5); + + GeomAPI_ProjectPointOnCurve aProj (aFirstCenter, anIntersectCurve); + theCenter = aProj.NearestPoint(); + + gp_Vec aFirstNormal = anIntersectLin.Direction() ^ aFirstPlane->Pln().Axis().Direction(); + if (aFirstNormal * gp_Vec (theCenter, aFirstCenter) < 0.0) + { + aFirstNormal.Reverse(); + } + theFirstAttach = theCenter.Translated (aFirstNormal); + + gp_Vec aSecondNormal = anIntersectLin.Direction() ^ aSecondPlane->Pln().Axis().Direction(); + if (aSecondNormal * gp_Vec (theCenter, aSecondCenter) < 0.0) + { + aSecondNormal.Reverse(); + } + theSecondAttach = theCenter.Translated (aSecondNormal); + + return Standard_True; +} + +//======================================================================= +//function : InitAngleBetweenCurvilinearFaces +//purpose : +//======================================================================= +Standard_Boolean PrsDim::InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const PrsDim_KindOfSurface theFirstSurfType, + const PrsDim_KindOfSurface theSecondSurfType, + gp_Pnt& theCenter, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + const Standard_Boolean theIsFirstPointSet) +{ + Handle(Geom_Surface) aFirstSurf = BRep_Tool::Surface (theFirstFace); + Handle(Geom_Surface) aSecondSurf = BRep_Tool::Surface (theSecondFace); + + // Find intersection curve between two surfaces. + GeomAPI_IntSS aSurfaceIntersector (aFirstSurf, aSecondSurf, Precision::Confusion()); + + // Fails if two planes haven't only one intersection line. + if (!aSurfaceIntersector.IsDone()) + { + return Standard_False; + } + + if (aSurfaceIntersector.NbLines() != 1) + { + return Standard_False; + } + + // Get intersect line. + Handle(Geom_Curve) anIntersectCurve = aSurfaceIntersector.Line (1); + + Handle(Geom_Line) aFirstLine, aSecondLine; + Standard_Real aFirstU = 0.0; + Standard_Real aFirstV = 0.0; + + if (theIsFirstPointSet) + { + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstSurf); + if (!aProjector.IsDone()) + { + return Standard_False; + } + + theFirstAttach = aProjector.Point (1); + } + else + { + theFirstAttach = aFirstSurf->Value (aFirstU, aFirstV); + } + + aFirstLine = Handle(Geom_Line)::DownCast (aFirstSurf->UIso (aFirstU)); + + if (theSecondSurfType == PrsDim_KOS_Cylinder) + { + Handle(Geom_CylindricalSurface) aCylinder = Handle(Geom_CylindricalSurface)::DownCast (aSecondSurf); + + Standard_Real aSecondU = aCylinder->Cylinder().XAxis().Direction().Angle( + gce_MakeDir (ProjectPointOnLine (theFirstAttach, + gp_Lin (aCylinder->Cylinder().Axis())), + theFirstAttach)); + + aSecondLine = Handle(Geom_Line)::DownCast (aCylinder->UIso (aSecondU)); + } + else if (theSecondSurfType == PrsDim_KOS_Cone) + { + Handle(Geom_ConicalSurface) aCone = Handle(Geom_ConicalSurface)::DownCast (aSecondSurf); + + gp_Dir anXdirection = aCone->Cone().XAxis().Direction(); + + gp_Dir aToFirstAttach = gce_MakeDir (ProjectPointOnLine (theFirstAttach, + gp_Lin (aCone->Cone().Axis())), + theFirstAttach); + + Standard_Real aSecondU = anXdirection.Angle (aToFirstAttach); + + // Check sign + if (!anXdirection.IsEqual (aToFirstAttach, Precision::Angular()) && + !anXdirection.IsOpposite (aToFirstAttach, Precision::Angular()) && + (anXdirection ^ aToFirstAttach) * aCone->Cone().Axis().Direction() < 0.0) + { + aSecondU = 2*M_PI - aSecondU; + } + aSecondLine = Handle( Geom_Line )::DownCast (aCone->UIso(aSecondU)); + } + else + { + return Standard_False; + } + + // If angle can be computed between two lines. + if (!(aFirstLine->Lin().Direction().IsEqual (aSecondLine->Lin().Direction(), Precision::Angular() )) && + !(aFirstLine->Lin().Direction().IsOpposite (aSecondLine->Lin().Direction(), Precision::Angular()))) + { + GeomAPI_ExtremaCurveCurve anIntersector (aFirstLine, aSecondLine); + anIntersector.Points (1, theCenter, theCenter); + + // Move theFirstAttach on aFirstLine if it is on theCenter. + if (theCenter.SquareDistance(theFirstAttach ) <= SquareTolerance) + { + gp_Vec aDir (aFirstLine->Lin().Direction()); + theFirstAttach = theCenter.Translated (aDir); + + // theFirstAttach should be on theFirstSurf. + Standard_Real anU, aV; + if (theFirstSurfType == PrsDim_KOS_Cylinder) + { + ElSLib::Parameters ((Handle(Geom_CylindricalSurface)::DownCast (aFirstSurf))->Cylinder(), + theFirstAttach, anU, aV); + + theFirstAttach = ElSLib::Value (aFirstU, aV, + (Handle( Geom_CylindricalSurface )::DownCast (aFirstSurf))->Cylinder() ); + } + else if (theFirstSurfType == PrsDim_KOS_Cone) + { + ElSLib::Parameters ((Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone(), + theFirstAttach, anU, aV); + theFirstAttach = ElSLib::Value (aFirstU, aV, + (Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone()); + } + else + { + return Standard_False; + } + } + + // Find theSecondAttach + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aSecondSurf); + if (!aProjector.IsDone()) + { + return Standard_False; + } + Standard_Real anU, aV; + aProjector.LowerDistanceParameters (anU, aV); + theSecondAttach = aSecondSurf->Value (anU, aV); + } + else // aFirstLine and aSecondLine are coincident + { + gp_Vec aDir (aFirstLine->Lin().Direction()); + theFirstAttach = theCenter.Translated (aDir); + theSecondAttach = theCenter.Translated (-aDir); + } + return Standard_True; +} + +//======================================================================= +//function : ComputeLengthBetweenCurvilinearFaces +//purpose : +//======================================================================= +void PrsDim::InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + Handle(Geom_Surface)& theFirstSurf, + Handle(Geom_Surface)& theSecondSurf, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + gp_Dir& theDirOnPlane) +{ + GeomAPI_ProjectPointOnSurf aProjector; + Standard_Real aPU, aPV; + + TopExp_Explorer anExplorer (theFirstFace, TopAbs_VERTEX); + + theFirstAttach = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); + aProjector.Init (theFirstAttach, theFirstSurf); + + theFirstAttach = aProjector.NearestPoint(); + aProjector.LowerDistanceParameters (aPU, aPV); + + gp_Vec aD1U, aD1V; + theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); + + if (aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance) + { + theFirstAttach = PrsDim::Farest (theFirstFace, theFirstAttach); + aProjector.Init (theFirstAttach, theFirstSurf); + aProjector.LowerDistanceParameters (aPU, aPV); + theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); + } + + aD1U.Normalize(); + aD1V.Normalize(); + + theDirOnPlane = gp_Dir (aD1U); + + gp_Dir aFirstSurfN = gp_Dir (aD1U ^ aD1V); + + aProjector.Init (theFirstAttach, theSecondSurf); + + Standard_Integer aBestPointIndex = 0; + Standard_Real aMinDist = RealLast(); + gp_Dir aLocalDir; + + for (Standard_Integer aPointIt = 1; aPointIt <= aProjector.NbPoints(); aPointIt++) + { + aProjector.Parameters (aPointIt, aPU, aPV); + + theSecondSurf->D1 (aPU, aPV, theSecondAttach, aD1U, aD1V); + + aLocalDir = aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance + ? gp_Dir (gp_Vec (theFirstAttach, aProjector.Point (aPointIt))) + : gp_Dir (aD1U ^ aD1V); + + if (aFirstSurfN.IsParallel (aLocalDir, Precision::Angular()) && aProjector.Distance (aPointIt) < aMinDist) + { + aBestPointIndex = aPointIt; + aMinDist = aProjector.Distance (aPointIt); + } + } + + if (aBestPointIndex == 0) + { + theSecondAttach = theFirstAttach; + } + else + { + theSecondAttach = aProjector.Point (aBestPointIndex); + aProjector.Parameters (aBestPointIndex, aPU, aPV); + + // Now there is projection of FirstAttach onto SecondSurf in aProjector + BRepTopAdaptor_FClass2d aClassifier (theSecondFace, Precision::Confusion()); + + TopAbs_State aState = + aClassifier.Perform (gp_Pnt2d (aPU, aPV), theSecondSurf->IsUPeriodic() || theSecondSurf->IsVPeriodic()); + + if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) + { + theSecondAttach = PrsDim::Nearest (theSecondFace, theSecondAttach); + } + } +} + +gp_Pnt PrsDim::TranslatePointToBound( const gp_Pnt & aPoint, const gp_Dir & aDir, const Bnd_Box & aBndBox ) +{ + if (aBndBox.IsOut( aPoint )) + return aPoint; + else + { + gp_Pnt Result(0.0,0.0,0.0); + TColStd_Array2OfReal Bound( 1, 3, 1, 2 ); + TColStd_Array1OfReal Origin( 1, 3 ); + TColStd_Array1OfReal Dir( 1, 3 ); + Standard_Real t; + + aBndBox.Get( Bound(1,1), Bound(2,1), Bound(3,1), Bound(1,2), Bound(2,2), Bound(3,2) ); + aPoint.Coord( Origin(1), Origin(2), Origin(3) ); + aDir.Coord( Dir(1), Dir(2), Dir(3) ); + + Bnd_Box EnlargedBox = aBndBox; + EnlargedBox.Enlarge( aBndBox.GetGap() + Precision::Confusion() ); + + Standard_Boolean IsFound = Standard_False; + for (Standard_Integer i = 1; i <= 3; i++) + { + if (Abs( Dir( i ) ) <= gp::Resolution()) + continue; + for (Standard_Integer j = 1; j <= 2; j++) + { + t = (Bound( i, j ) - Origin( i )) / Dir( i ); + if (t < 0.0e0) + continue; + Result = aPoint.Translated( gp_Vec( aDir ) * t ); + if (! EnlargedBox.IsOut( Result )) + { + IsFound = Standard_True; + break; + } + } + if (IsFound) break; + } + return Result; + } +} + + +//======================================================================= +//function : InDomain +//purpose : +//======================================================================= + +Standard_Boolean PrsDim::InDomain(const Standard_Real fpar, + const Standard_Real lpar, + const Standard_Real para) +{ + if (fpar >= 0.) { + if(lpar > fpar) + return ((para >= fpar) && (para <= lpar)); + else { // fpar > lpar + Standard_Real delta = 2*M_PI-fpar; + Standard_Real lp, par, fp; + lp = lpar + delta; + par = para + delta; + while(lp > 2*M_PI) lp-=2*M_PI; + while(par > 2*M_PI) par-=2*M_PI; + fp = 0.; + return ((par >= fp) && (par <= lp)); + } + + } + if (para >= (fpar+2*M_PI)) return Standard_True; + if (para <= lpar) return Standard_True; + return Standard_False; +} + +//======================================================================= +//function : DistanceFromApex +//purpose : calculates parametric length arc of ellipse +//======================================================================= + +Standard_Real PrsDim::DistanceFromApex(const gp_Elips & elips, + const gp_Pnt & Apex, + const Standard_Real par) +{ + Standard_Real dist; + Standard_Real parApex = ElCLib::Parameter ( elips, Apex ); + if(parApex == 0.0 || parApex == M_PI) + {//Major case + if(parApex == 0.0) //pos Apex + dist = (par < M_PI) ? par : (2*M_PI - par); + else //neg Apex + dist = (par < M_PI) ? ( M_PI - par) : ( par - M_PI ); + } + else + {// Minor case + if(parApex == M_PI / 2) //pos Apex + { + if(par <= parApex + M_PI && par > parApex) // 3/2*M_PI < par < M_PI/2 + dist = par - parApex; + else + { + if(par > parApex + M_PI) // 3/2*M_PI < par < 2*M_PI + dist = 2*M_PI - par + parApex; + else + dist = parApex - par; + } + } + else //neg Apex == 3/2*M_PI + { + if(par <= parApex && par >= M_PI/2) // M_PI/2 < par < 3/2*M_PI + dist = parApex - par; + else + { + if(par > parApex) // 3/2*M_PI < par < 2*M_PI + dist = par - parApex; + else + dist = par + M_PI/2; // 0 < par < M_PI/2 + } + } + } + return dist; +} + +//======================================================================= +//function : NearestApex +//purpose : +//======================================================================= + +gp_Pnt PrsDim::NearestApex(const gp_Elips & elips, + const gp_Pnt & pApex, + const gp_Pnt & nApex, + const Standard_Real fpara, + const Standard_Real lpara, + Standard_Boolean & IsInDomain) +{ + Standard_Real parP, parN; + gp_Pnt EndOfArrow(0.0,0.0,0.0); + IsInDomain = Standard_True; + parP = ElCLib::Parameter ( elips, pApex ); + if(InDomain(fpara, lpara, parP)) EndOfArrow = pApex; + else + { + parN = ElCLib::Parameter ( elips, nApex ); + if(InDomain(fpara, lpara, parN)) EndOfArrow = nApex; + else { + IsInDomain = Standard_False; + Standard_Real posd = Min(DistanceFromApex (elips,pApex, fpara), + DistanceFromApex (elips,pApex, lpara)); + Standard_Real negd = Min(DistanceFromApex (elips,nApex, fpara), + DistanceFromApex (elips,nApex, lpara)); + if( posd < negd ) + EndOfArrow = pApex; + else + EndOfArrow = nApex; + } + } + return EndOfArrow; +} + +//======================================================================= +//function : ComputeProjEdgePresentation +//purpose : +//======================================================================= + +void PrsDim::ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPresentation, + const Handle(Prs3d_Drawer)& aDrawer, + const TopoDS_Edge& anEdge, + const Handle(Geom_Curve)& ProjCurve, + const gp_Pnt& FirstP, + const gp_Pnt& LastP, + const Quantity_NameOfColor aColor, + const Standard_Real aWidth, + const Aspect_TypeOfLine aProjTOL, + const Aspect_TypeOfLine aCallTOL) +{ + if (!aDrawer->HasOwnWireAspect()){ + aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} + else { + // CLE + // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); + Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); + // ENDCLE + li->SetColor(aColor); + li->SetTypeOfLine(aProjTOL); + li->SetWidth(aWidth); + } + + Standard_Real pf, pl; + TopLoc_Location loc; + Handle(Geom_Curve) curve; + Standard_Boolean isInfinite; + curve = BRep_Tool::Curve(anEdge,loc,pf,pl); + isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); + + TopoDS_Edge E; + + // Calculate presentation of the edge + if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + // CLE + // Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurve)); + Handle(Geom_Line) gl = Handle(Geom_Line)::DownCast (ProjCurve); + // ENDCLE + if ( !isInfinite) { + pf = ElCLib::Parameter(gl->Lin(),FirstP); + pl = ElCLib::Parameter(gl->Lin(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); + E = MakEd.Edge(); + } + else { + BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); + E = MakEd.Edge(); + } + } + else if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + // CLE + // Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurve)); + Handle(Geom_Circle) gc = Handle(Geom_Circle)::DownCast (ProjCurve); + // ENDCLE + pf = ElCLib::Parameter(gc->Circ(),FirstP); + pl = ElCLib::Parameter(gc->Circ(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); + E = MakEd.Edge(); + } + StdPrs_WFShape::Add (aPresentation, E, aDrawer); + + //Calculate the presentation of line connections + aDrawer->WireAspect()->SetTypeOfLine(aCallTOL); + if (!isInfinite) { + gp_Pnt ppf(0.0,0.0,0.0), ppl(0.0,0.0,0.0); + ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); + ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); + + // it is patch! + if (FirstP.SquareDistance (ppf) > SquareTolerance) + { + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert1 (FirstP); + StdPrs_WFShape::Add (aPresentation, MakVert1.Vertex(), aDrawer); + } + if (LastP.SquareDistance (ppl) > SquareTolerance) + { + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert2 (LastP); + StdPrs_WFShape::Add (aPresentation, MakVert2.Vertex(), aDrawer); + } +/* + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); +*/ + } +} + +//======================================================================= +//function : ComputeProjVertexPresentation +//purpose : +//======================================================================= + +void PrsDim::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const TopoDS_Vertex& aVertex, + const gp_Pnt& ProjPoint, + const Quantity_NameOfColor aColor, + const Standard_Real aWidth, + const Aspect_TypeOfMarker aProjTOM, + const Aspect_TypeOfLine aCallTOL) +{ + if (!aDrawer->HasOwnPointAspect()){ + aDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} + else { + // CLE + // const Handle(Prs3d_PointAspect)& pa = aDrawer->PointAspect(); + Handle(Prs3d_PointAspect) pa = aDrawer->PointAspect(); + // ENDCLE + pa->SetColor(aColor); + pa->SetTypeOfMarker(aProjTOM); + } + + // calculate the projection + StdPrs_Point::Add(aPresentation, new Geom_CartesianPoint(ProjPoint), aDrawer); + + if (!aDrawer->HasOwnWireAspect()){ + aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} + else { + // CLE + // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); + Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); + // ENDCLE + li->SetColor(aColor); + li->SetTypeOfLine(aCallTOL); + li->SetWidth(aWidth); + } + + // If the points are not mixed... + if (!ProjPoint.IsEqual (BRep_Tool::Pnt (aVertex), Precision::Confusion())) + { + // calculate the lines of recall + BRepBuilderAPI_MakeEdge MakEd (ProjPoint, BRep_Tool::Pnt (aVertex)); + StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer); + } +} diff --git a/src/PrsDim/PrsDim.hxx b/src/PrsDim/PrsDim.hxx new file mode 100644 index 0000000000..c865cb71af --- /dev/null +++ b/src/PrsDim/PrsDim.hxx @@ -0,0 +1,159 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_HeaderFile +#define _PrsDim_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Bnd_Box; +class Geom_Curve; +class Geom_Plane; +class Geom_Surface; +class TopoDS_Edge; +class TopoDS_Face; +class TopoDS_Shape; +class TopoDS_Vertex; + +//! Auxiliary methods for computing dimensions. +class PrsDim +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the nearest point in a shape. This is used by + //! several classes in calculation of dimensions. + Standard_EXPORT static gp_Pnt Nearest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); + + //! @return the nearest point on the line. + Standard_EXPORT static gp_Pnt Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint); + + //! For the given point finds nearest point on the curve, + //! @return TRUE if found point is belongs to the curve + //! and FALSE otherwise. + Standard_EXPORT static Standard_Boolean Nearest (const Handle(Geom_Curve)& theCurve, const gp_Pnt& thePoint, const gp_Pnt& theFirstPoint, const gp_Pnt& theLastPoint, gp_Pnt& theNearestPoint); + + Standard_EXPORT static gp_Pnt Farest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt); + + //! Used by dimensions only. + //! Computes the 3d geometry of . + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Standard_Boolean& theIsInfinite); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any. + //! If is not in the current plane, contains + //! the not projected curve associated to . + //! If is infinite, = true and the 2 + //! parameters and have no signification. + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsInfinite, Standard_Boolean& theIsOnPlane, const Handle(Geom_Plane)& thePlane); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, const Handle(Geom_Plane)& thePlane); + + //! Used by dimensions only.Computes the 3d geometry + //! of and and checks if they are infinite. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2); + + //! Used by 2d Relation only Computes the 3d geometry + //! of and in the current Plane and the + //! extremities if any. Return in ExtCurve the 3d curve + //! (not projected in the plane) of the first edge if + //! =1 or of the 2nd edge if = 2. If + //! = 0, ExtCurve is Null. if there is an edge + //! external to the plane, is true if this + //! edge is infinite. So, the extremities of it are not + //! significant. Return TRUE if ok + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Standard_Integer& theExtIndex, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2, const Handle(Geom_Plane)& thePlane); + + //! Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane + //! and returns aCurve; + //! Return TRUE if ok + Standard_EXPORT static Standard_Boolean ComputeGeomCurve (Handle(Geom_Curve)& aCurve, const Standard_Real first1, const Standard_Real last1, gp_Pnt& FirstPnt1, gp_Pnt& LastPnt1, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); + + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Vertex& aVertex, gp_Pnt& point, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); + + //! Tryes to get Plane from Face. Returns Surface of Face + //! in aSurf. Returns Standard_True and Plane of Face in + //! aPlane in following cases: + //! Face is Plane, Offset of Plane, + //! Extrusion of Line and Offset of Extrusion of Line + //! Returns pure type of Surface which can be: + //! Plane, Cylinder, Cone, Sphere, Torus, + //! SurfaceOfRevolution, SurfaceOfExtrusion + Standard_EXPORT static Standard_Boolean GetPlaneFromFace (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurf, PrsDim_KindOfSurface& aSurfType, Standard_Real& Offset); + + Standard_EXPORT static void InitFaceLength (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurface, PrsDim_KindOfSurface& aSurfaceType, Standard_Real& anOffset); + + //! Finds attachment points on two curvilinear faces for length dimension. + //! @param thePlaneDir [in] the direction on the dimension plane to + //! compute the plane automatically. It will not be taken into account if + //! plane is defined by user. + Standard_EXPORT static void InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, Handle(Geom_Surface)& theFirstSurf, Handle(Geom_Surface)& theSecondSurf, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, gp_Dir& theDirOnPlane); + + //! Finds three points for the angle dimension between + //! two planes. + Standard_EXPORT static Standard_Boolean InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); + + //! Finds three points for the angle dimension between + //! two curvilinear surfaces. + Standard_EXPORT static Standard_Boolean InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, const PrsDim_KindOfSurface theFirstSurfType, const PrsDim_KindOfSurface theSecondSurfType, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); + + Standard_EXPORT static gp_Pnt ProjectPointOnPlane (const gp_Pnt& aPoint, const gp_Pln& aPlane); + + Standard_EXPORT static gp_Pnt ProjectPointOnLine (const gp_Pnt& aPoint, const gp_Lin& aLine); + + Standard_EXPORT static gp_Pnt TranslatePointToBound (const gp_Pnt& aPoint, const gp_Dir& aDir, const Bnd_Box& aBndBox); + + //! returns True if point with anAttachPar is + //! in domain of arc + Standard_EXPORT static Standard_Boolean InDomain (const Standard_Real aFirstPar, const Standard_Real aLastPar, const Standard_Real anAttachPar); + + //! computes nearest to ellipse arc apex + Standard_EXPORT static gp_Pnt NearestApex (const gp_Elips& elips, const gp_Pnt& pApex, const gp_Pnt& nApex, const Standard_Real fpara, const Standard_Real lpara, Standard_Boolean& IsInDomain); + + //! computes length of ellipse arc in parametric units + Standard_EXPORT static Standard_Real DistanceFromApex (const gp_Elips& elips, const gp_Pnt& Apex, const Standard_Real par); + + Standard_EXPORT static void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); + + Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); + +}; + +#endif // _PrsDim_HeaderFile diff --git a/src/PrsDim/PrsDim_AngleDimension.cxx b/src/PrsDim/PrsDim_AngleDimension.cxx new file mode 100644 index 0000000000..41702f5268 --- /dev/null +++ b/src/PrsDim/PrsDim_AngleDimension.cxx @@ -0,0 +1,1453 @@ +// Created on: 1996-12-05 +// Created by: Arnaud BOUZY/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_AngleDimension, PrsDim_Dimension) + +namespace +{ + static const TCollection_ExtendedString THE_EMPTY_LABEL_STRING; + static const Standard_Real THE_EMPTY_LABEL_WIDTH = 0.0; + static const Standard_ExtCharacter THE_DEGREE_SYMBOL (0x00B0); + static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; + + //! Returns true if the given points lie on a same line. + static Standard_Boolean isSameLine (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) + { + gp_Vec aVec1 (theFirstPoint, theCenterPoint); + gp_Vec aVec2 (theCenterPoint, theSecondPoint); + + return aVec1.IsParallel (aVec2, Precision::Angular()); + } +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstEdge, theSecondEdge); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstPoint, theSecondPoint, theThirdPoint); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstVertex, theSecondVertex, theThirdVertex); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theCone) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theCone); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstFace, theSecondFace); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstFace, theSecondFace, thePoint); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge) +{ + gp_Pln aComputedPlane; + + myFirstShape = theFirstEdge; + mySecondShape = theSecondEdge; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Edges; + myIsGeometryValid = InitTwoEdgesAngle (aComputedPlane); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + myPlane = aComputedPlane; + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint) +{ + myFirstPoint = theFirstPoint; + myCenterPoint = theSecondPoint; + mySecondPoint = theThirdPoint; + myFirstShape = BRepLib_MakeVertex (myFirstPoint); + mySecondShape = BRepLib_MakeVertex (myCenterPoint); + myThirdShape = BRepLib_MakeVertex (mySecondPoint); + myGeometryType = GeometryType_Points; + myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + + Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); + if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex) +{ + myFirstShape = theFirstVertex; + mySecondShape = theSecondVertex; + myThirdShape = theThirdVertex; + myFirstPoint = BRep_Tool::Pnt (theFirstVertex); + myCenterPoint = BRep_Tool::Pnt (theSecondVertex); + mySecondPoint = BRep_Tool::Pnt (theThirdVertex); + myGeometryType = GeometryType_Points; + myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + + Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); + if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone) +{ + myFirstShape = theCone; + mySecondShape = TopoDS_Shape(); + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Face; + myIsGeometryValid = InitConeAngle(); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +{ + myFirstShape = theFirstFace; + mySecondShape = theSecondFace; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Faces; + myIsGeometryValid = InitTwoFacesAngle(); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint) +{ + myFirstShape = theFirstFace; + mySecondShape = theSecondFace; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Faces; + myIsGeometryValid = InitTwoFacesAngle (thePoint); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void PrsDim_AngleDimension::Init() +{ + SetType (PrsDim_TypeOfAngle_Interior); + SetArrowsVisibility (PrsDim_TypeOfAngleArrowVisibility_Both); + SetSpecialSymbol (THE_DEGREE_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_After); + SetFlyout (15.0); +} + +//======================================================================= +//function: GetCenterOnArc +//purpose : +//======================================================================= +gp_Pnt PrsDim_AngleDimension::GetCenterOnArc (const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter) const +{ + // construct plane where the circle and the arc are located + gce_MakePln aConstructPlane (theFirstAttach, theSecondAttach, theCenter); + if (!aConstructPlane.IsDone()) + { + return gp::Origin(); + } + + gp_Pln aPlane = aConstructPlane.Value(); + // to have an exterior angle presentation, a plane for further constructed circle should be reversed + if (myType == PrsDim_TypeOfAngle_Exterior) + { + gp_Ax1 anAxis = aPlane.Axis(); + gp_Dir aDir = anAxis.Direction(); + aDir.Reverse(); + aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); + } + + Standard_Real aRadius = theFirstAttach.Distance (theCenter); + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); + if (!aConstructCircle.IsDone()) + { + return gp::Origin(); + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // compute angle parameters of arc end-points on circle + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + return ElCLib::Value ((aParamBeg + aParamEnd) * 0.5, aCircle); +} + +//======================================================================= +//function : GetNormalForMinAngle +//purpose : +//======================================================================= +gp_Dir PrsDim_AngleDimension::GetNormalForMinAngle() const +{ + const gp_Dir& aNormal = myPlane.Axis().Direction(); + gp_Dir aFirst (gp_Vec (myCenterPoint, myFirstPoint) ); + gp_Dir aSecond (gp_Vec (myCenterPoint, mySecondPoint) ); + + return aFirst.AngleWithRef (aSecond, aNormal) < 0.0 + ? aNormal.Reversed() + : aNormal; +} + +//======================================================================= +//function : DrawArc +//purpose : draws the arc between two attach points +//======================================================================= +void PrsDim_AngleDimension::DrawArc (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const Standard_Real theRadius, + const Standard_Integer theMode) +{ + gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); + + // to have an exterior angle presentation, a plane for further constructed circle should be reversed + if (myType == PrsDim_TypeOfAngle_Exterior) + { + gp_Ax1 anAxis = aPlane.Axis(); + gp_Dir aDir = anAxis.Direction(); + aDir.Reverse(); + aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); + } + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, theRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // construct the arc + GC_MakeArcOfCircle aConstructArc (aCircle, theFirstAttach, theSecondAttach, Standard_True); + if (!aConstructArc.IsDone()) + { + return; + } + + // generate points with specified deflection + const Handle(Geom_TrimmedCurve)& anArcCurve = aConstructArc.Value(); + + GeomAdaptor_Curve anArcAdaptor (anArcCurve, anArcCurve->FirstParameter(), anArcCurve->LastParameter()); + + // compute number of discretization elements in old-fanshioned way + gp_Vec aCenterToFirstVec (theCenter, theFirstAttach); + gp_Vec aCenterToSecondVec (theCenter, theSecondAttach); + Standard_Real anAngle = aCenterToFirstVec.Angle (aCenterToSecondVec); + if (myType == PrsDim_TypeOfAngle_Exterior) + anAngle = 2.0 * M_PI - anAngle; + // it sets 50 points on PI, and a part of points if angle is less + const Standard_Integer aNbPoints = Max (4, Standard_Integer (50.0 * anAngle / M_PI)); + + GCPnts_UniformAbscissa aMakePnts (anArcAdaptor, aNbPoints); + if (!aMakePnts.IsDone()) + { + return; + } + + // init data arrays for graphical and selection primitives + Handle(Graphic3d_ArrayOfPolylines) aPrimSegments = new Graphic3d_ArrayOfPolylines (aNbPoints); + + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + + // load data into arrays + for (Standard_Integer aPntIt = 1; aPntIt <= aMakePnts.NbPoints(); ++aPntIt) + { + gp_Pnt aPnt = anArcAdaptor.Value (aMakePnts.Parameter (aPntIt)); + + aPrimSegments->AddVertex (aPnt); + + aSensitiveCurve.Append (aPnt); + } + + // add display presentation + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True); + } + Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionLineStyle); + Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False); + } +} + +//======================================================================= +//function: DrawArcWithText +//purpose : +//======================================================================= +void PrsDim_AngleDimension::DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const TCollection_ExtendedString& theText, + const Standard_Real theTextWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition) +{ + gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); + + Standard_Real aRadius = theFirstAttach.Distance (myCenterPoint); + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // compute angle parameters of arc end-points on circle + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + // middle point of arc parameter on circle + Standard_Real aParamMid = (aParamBeg + aParamEnd) * 0.5; + + // add text graphical primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + gp_Pnt aTextPos = ElCLib::Value (aParamMid, aCircle); + gp_Dir aTextDir = gce_MakeDir (theFirstAttach, theSecondAttach); + + // Drawing text + drawText (thePresentation, + aTextPos, + aTextDir, + theText, + theLabelPosition); + } + + if (theMode != ComputeMode_All && theMode != ComputeMode_Line) + { + return; + } + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + if (isLineBreak) + { + // compute gap for label as parameteric size of sector on circle segment + Standard_Real aSectorOfText = theTextWidth / aRadius; + Standard_Real aTextBegin = aParamMid - aSectorOfText * 0.5; + Standard_Real aTextEnd = aParamMid + aSectorOfText * 0.5; + gp_Pnt aTextPntBeg = ElCLib::Value (aTextBegin, aCircle); + gp_Pnt aTextPntEnd = ElCLib::Value (aTextEnd, aCircle); + + // Drawing arcs + if (aTextBegin > aParamBeg) + { + DrawArc (thePresentation, theFirstAttach, aTextPntBeg, theCenter, aRadius, theMode); + } + if (aTextEnd < aParamEnd) + { + DrawArc (thePresentation, aTextPntEnd, theSecondAttach, theCenter, aRadius, theMode); + } + } + else + { + DrawArc (thePresentation, theFirstAttach, theSecondAttach, theCenter, aRadius, theMode); + } +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::CheckPlane (const gp_Pln& thePlane)const +{ + if (!thePlane.Contains (myFirstPoint, Precision::Confusion()) && + !thePlane.Contains (mySecondPoint, Precision::Confusion()) && + !thePlane.Contains (myCenterPoint, Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_AngleDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + // Compute working plane so that Y axis is codirectional + // with Y axis of text coordinate system (necessary for text alignment) + gp_Vec aFirstVec = gp_Vec (myCenterPoint, myFirstPoint); + gp_Vec aSecondVec = gp_Vec (myCenterPoint, mySecondPoint); + gp_Vec aDirectionN = aSecondVec ^ aFirstVec; + gp_Vec aDirectionY = aFirstVec + aSecondVec; + gp_Vec aDirectionX = aDirectionY ^ aDirectionN; + + myPlane = gp_Pln (gp_Ax3 (myCenterPoint, gp_Dir (aDirectionN), gp_Dir (aDirectionX))); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_AngleDimension::GetModelUnits() const +{ + return myDrawer->DimAngleModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_AngleDimension::GetDisplayUnits() const +{ + return myDrawer->DimAngleDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimAngleModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimAngleDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_AngleDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + gp_Vec aVec1 (myCenterPoint, myFirstPoint); + gp_Vec aVec2 (myCenterPoint, mySecondPoint); + + Standard_Real anAngle = aVec1.AngleWithRef (aVec2, GetNormalForMinAngle()); + + return anAngle > 0.0 ? anAngle : (2.0 * M_PI + anAngle); +} + +//======================================================================= +//function : Compute +//purpose : Having three gp_Pnt points compute presentation +//======================================================================= +void PrsDim_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + // Parameters for presentation + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + Prs3d_Root::CurrentGroup(thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to label width + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // Get parameters from aspect or adjust it according with custom text position + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); + + if (IsTextPositionCustom()) + { + AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos, myFlyout); + } + + // Handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + + FitTextAlignment (aHorisontalTextPos, aLabelPosition, isArrowsExternal); + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + //Arrows positions and directions + gp_Vec aWorkingPlaneDir (GetNormalForMinAngle()); + + gp_Dir aFirstExtensionDir = aWorkingPlaneDir.Reversed() ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir aSecondExtensionDir = aWorkingPlaneDir ^ gp_Vec (myCenterPoint, aSecondAttach); + + gp_Vec aFirstArrowVec = gp_Vec (aFirstExtensionDir) * anArrowLength; + gp_Vec aSecondArrowVec = gp_Vec (aSecondExtensionDir) * anArrowLength; + + if (isArrowsExternal) + { + aFirstArrowVec.Reverse(); + aSecondArrowVec.Reverse(); + } + + gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); + + aFirstArrowBegin = aFirstAttach; + aSecondArrowBegin = aSecondAttach; + aFirstArrowEnd = aFirstAttach.Translated (-aFirstArrowVec); + aSecondArrowEnd = aSecondAttach.Translated (-aSecondArrowVec); + + // Group1: stenciling text and the angle dimension arc + Prs3d_Root::NewGroup (thePresentation); + + Standard_Integer aHPosition = aLabelPosition & LabelPosition_HMask; + + // draw text label + switch (aHPosition) + { + case LabelPosition_HCenter : + { + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + if (isLineBreak) + { + DrawArcWithText (thePresentation, + aFirstAttach, + aSecondAttach, + myCenterPoint, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + break; + } + + // compute text primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + gp_Vec aDimensionDir (aFirstAttach, aSecondAttach); + gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition + : GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); + gp_Dir aTextDir = aDimensionDir; + + drawText (thePresentation, + aTextPos, + aTextDir, + aLabelString, + aLabelPosition); + } + + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + DrawArc (thePresentation, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstAttach : aFirstArrowEnd, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondAttach : aSecondArrowEnd, + myCenterPoint, + Abs (GetFlyout()), + theMode); + } + } + break; + + case LabelPosition_Left : + { + DrawExtension (thePresentation, + anExtensionSize, + (isArrowsExternal && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstArrowEnd : aFirstAttach, + aFirstExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + break; + + case LabelPosition_Right : + { + DrawExtension (thePresentation, + anExtensionSize, + (isArrowsExternal && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondArrowEnd : aSecondAttach, + aSecondExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + break; + } + + // dimension arc without text + if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && aHPosition != LabelPosition_HCenter) + { + Prs3d_Root::NewGroup (thePresentation); + + DrawArc (thePresentation, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstAttach : aFirstArrowEnd, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondAttach : aSecondArrowEnd, + myCenterPoint, + Abs(GetFlyout ()), + theMode); + } + + // arrows and arrow extensions + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + Prs3d_Root::NewGroup (thePresentation); + + if (isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) + DrawArrow (thePresentation, aFirstArrowBegin, gp_Dir (aFirstArrowVec)); + if (isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) + DrawArrow (thePresentation, aSecondArrowBegin, gp_Dir (aSecondArrowVec)); + } + + if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && isArrowsExternal) + { + Prs3d_Root::NewGroup (thePresentation); + + if (aHPosition != LabelPosition_Left && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) + { + DrawExtension (thePresentation, + aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, + aFirstExtensionDir, + THE_EMPTY_LABEL_STRING, + THE_EMPTY_LABEL_WIDTH, + theMode, + LabelPosition_None); + } + + if (aHPosition != LabelPosition_Right && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) + { + DrawExtension (thePresentation, + aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, + aSecondExtensionDir, + THE_EMPTY_LABEL_STRING, + THE_EMPTY_LABEL_WIDTH, + theMode, + LabelPosition_None); + } + } + + // flyouts + if (theMode == ComputeMode_All) + { + Prs3d_Root::NewGroup (thePresentation); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (4); + aPrimSegments->AddVertex (myCenterPoint); + aPrimSegments->AddVertex (aFirstAttach); + aPrimSegments->AddVertex (myCenterPoint); + aPrimSegments->AddVertex (aSecondAttach); + + Handle(Graphic3d_AspectLine3d) aFlyoutStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aFlyoutStyle); + Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); + } + + mySelectionGeom.IsComputed = Standard_True; +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : computes selection for flyouts +//======================================================================= +void PrsDim_AngleDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner) +{ + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aFirstAttach)); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aSecondAttach)); + + theSelection->Add (aSensitiveEntity); +} + +//======================================================================= +//function : InitTwoEdgesAngle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoEdgesAngle (gp_Pln& theComputedPlane) +{ + TopoDS_Edge aFirstEdge = TopoDS::Edge (myFirstShape); + TopoDS_Edge aSecondEdge = TopoDS::Edge (mySecondShape); + + BRepAdaptor_Curve aMakeFirstLine (aFirstEdge); + BRepAdaptor_Curve aMakeSecondLine (aSecondEdge); + + if (aMakeFirstLine.GetType() != GeomAbs_Line || aMakeSecondLine.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Handle(Geom_Line) aFirstLine = new Geom_Line (aMakeFirstLine.Line()); + Handle(Geom_Line) aSecondLine = new Geom_Line (aMakeSecondLine.Line()); + + gp_Lin aFirstLin = aFirstLine->Lin(); + gp_Lin aSecondLin = aSecondLine->Lin(); + + Standard_Boolean isParallelLines = aFirstLin.Direction().IsParallel (aSecondLin.Direction(), Precision::Angular()); + + theComputedPlane = isParallelLines ? gp_Pln(gp::XOY()) + : gp_Pln (aSecondLin.Location(), gp_Vec (aFirstLin.Direction()) ^ gp_Vec (aSecondLin.Direction())); + + // Compute geometry for this plane and edges + Standard_Boolean isInfinite1,isInfinite2; + gp_Pnt aFirstPoint1, aLastPoint1, aFirstPoint2, aLastPoint2; + Handle(Geom_Curve) aFirstCurve = aFirstLine, aSecondCurve = aSecondLine; + if (!PrsDim::ComputeGeometry (aFirstEdge, aSecondEdge, + aFirstCurve, aSecondCurve, + aFirstPoint1, aLastPoint1, + aFirstPoint2, aLastPoint2, + isInfinite1, isInfinite2)) + { + return Standard_False; + } + + Standard_Boolean isSameLines = aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) + && aFirstLin.Location().IsEqual (aSecondLin.Location(),Precision::Confusion()); + + // It can be the same gp_Lin geometry but the different begin and end parameters + Standard_Boolean isSameEdges = + (aFirstPoint1.IsEqual (aFirstPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aLastPoint2, Precision::Confusion())) + || (aFirstPoint1.IsEqual (aLastPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aFirstPoint2, Precision::Confusion())); + + if (isParallelLines) + { + // Zero angle, it could not handle this geometry + if (isSameLines && isSameEdges) + { + return Standard_False; + } + + // Handle the case of Pi angle + const Standard_Real aParam11 = ElCLib::Parameter (aFirstLin, aFirstPoint1); + const Standard_Real aParam12 = ElCLib::Parameter (aFirstLin, aLastPoint1); + const Standard_Real aParam21 = ElCLib::Parameter (aFirstLin, aFirstPoint2); + const Standard_Real aParam22 = ElCLib::Parameter (aFirstLin, aLastPoint2); + myCenterPoint = ElCLib::Value ( (Min (aParam11, aParam12) + Max (aParam21, aParam22)) * 0.5, aFirstLin); + myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); + mySecondPoint = myCenterPoint.XYZ() + (aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) + ? aFirstLin.Direction().Reversed().XYZ() * Abs (GetFlyout()) + : aSecondLin.Direction().XYZ() * Abs (GetFlyout())); + } + else + { + // Find intersection + gp_Lin2d aFirstLin2d = ProjLib::Project (theComputedPlane, aFirstLin); + gp_Lin2d aSecondLin2d = ProjLib::Project (theComputedPlane, aSecondLin); + + IntAna2d_AnaIntersection anInt2d (aFirstLin2d, aSecondLin2d); + gp_Pnt2d anIntersectPoint; + if (!anInt2d.IsDone() || anInt2d.IsEmpty()) + { + return Standard_False; + } + + anIntersectPoint = gp_Pnt2d (anInt2d.Point(1).Value()); + myCenterPoint = ElCLib::To3d (theComputedPlane.Position().Ax2(), anIntersectPoint); + + if (isInfinite1 || isInfinite2) + { + myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); + mySecondPoint = myCenterPoint.Translated (gp_Vec (aSecondLin.Direction()) * Abs (GetFlyout())); + + return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + + // | + // | <- dimension should be here + // *---- + myFirstPoint = myCenterPoint.Distance (aFirstPoint1) > myCenterPoint.Distance (aLastPoint1) + ? aFirstPoint1 + : aLastPoint1; + + mySecondPoint = myCenterPoint.Distance (aFirstPoint2) > myCenterPoint.Distance (aLastPoint2) + ? aFirstPoint2 + : aLastPoint2; + } + + return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); +} + +//======================================================================= +//function : InitTwoFacesAngle +//purpose : initialization of angle dimension between two faces +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoFacesAngle() +{ + TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); + TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); + + gp_Dir aFirstDir, aSecondDir; + gp_Pln aFirstPln, aSecondPln; + Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; + PrsDim_KindOfSurface aFirstSurfType, aSecondSurfType; + Standard_Real aFirstOffset, aSecondOffset; + + PrsDim::GetPlaneFromFace (aFirstFace, aFirstPln, + aFirstBasisSurf,aFirstSurfType,aFirstOffset); + + PrsDim::GetPlaneFromFace (aSecondFace, aSecondPln, + aSecondBasisSurf, aSecondSurfType, aSecondOffset); + + if (aFirstSurfType == PrsDim_KOS_Plane && aSecondSurfType == PrsDim_KOS_Plane) + { + //Planar faces angle + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); + return PrsDim::InitAngleBetweenPlanarFaces (aFirstFace, aSecondFace, + myCenterPoint, myFirstPoint, mySecondPoint) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + else + { + // Curvilinear faces angle + return PrsDim::InitAngleBetweenCurvilinearFaces (aFirstFace, aSecondFace, + aFirstSurfType, aSecondSurfType, + myCenterPoint, myFirstPoint, mySecondPoint) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } +} + +//======================================================================= +//function : InitTwoFacesAngle +//purpose : initialization of angle dimension between two faces +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoFacesAngle (const gp_Pnt& thePointOnFirstFace) +{ + TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); + TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); + + gp_Dir aFirstDir, aSecondDir; + gp_Pln aFirstPln, aSecondPln; + Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; + PrsDim_KindOfSurface aFirstSurfType, aSecondSurfType; + Standard_Real aFirstOffset, aSecondOffset; + + PrsDim::GetPlaneFromFace (aFirstFace, aFirstPln, + aFirstBasisSurf,aFirstSurfType,aFirstOffset); + + PrsDim::GetPlaneFromFace (aSecondFace, aSecondPln, + aSecondBasisSurf, aSecondSurfType, aSecondOffset); + + myFirstPoint = thePointOnFirstFace; + if (aFirstSurfType == PrsDim_KOS_Plane && aSecondSurfType == PrsDim_KOS_Plane) + { + //Planar faces angle + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); + return PrsDim::InitAngleBetweenPlanarFaces (aFirstFace, aSecondFace, + myCenterPoint, myFirstPoint, mySecondPoint, + Standard_True) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + else + { + // Curvilinear faces angle + return PrsDim::InitAngleBetweenCurvilinearFaces (aFirstFace, aSecondFace, + aFirstSurfType, aSecondSurfType, + myCenterPoint, myFirstPoint, mySecondPoint, + Standard_True) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } +} + +//======================================================================= +//function : InitConeAngle +//purpose : initialization of the cone angle +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitConeAngle() +{ + if (myFirstShape.IsNull()) + { + return Standard_False; + } + + TopoDS_Face aConeShape = TopoDS::Face (myFirstShape); + gp_Pln aPln; + gp_Cone aCone; + gp_Circ aCircle; + // A surface from the Face + Handle(Geom_Surface) aSurf; + Handle(Geom_OffsetSurface) aOffsetSurf; + Handle(Geom_ConicalSurface) aConicalSurf; + Handle(Geom_SurfaceOfRevolution) aRevSurf; + Handle(Geom_Line) aLine; + BRepAdaptor_Surface aConeAdaptor (aConeShape); + TopoDS_Face aFace; + PrsDim_KindOfSurface aSurfType; + Standard_Real anOffset = 0.; + Handle(Standard_Type) aType; + + const Standard_Real aMaxV = aConeAdaptor.FirstVParameter(); + const Standard_Real aMinV = aConeAdaptor.LastVParameter(); + PrsDim::GetPlaneFromFace (aConeShape, aPln, aSurf, aSurfType, anOffset); + if (aSurfType == PrsDim_KOS_Revolution) + { + // Surface of revolution + aRevSurf = Handle(Geom_SurfaceOfRevolution)::DownCast(aSurf); + gp_Lin aLin (aRevSurf->Axis()); + Handle(Geom_Curve) aBasisCurve = aRevSurf->BasisCurve(); + //Must be a part of line (basis curve should be linear) + if (aBasisCurve ->DynamicType() != STANDARD_TYPE(Geom_Line)) + return Standard_False; + + gp_Pnt aFirst1 = aConeAdaptor.Value (0., aMinV); + gp_Pnt aLast1 = aConeAdaptor.Value (0., aMaxV); + gp_Vec aVec1 (aFirst1, aLast1); + + //Projection on + gp_Pnt aFirst2 = ElCLib::Value (ElCLib::Parameter (aLin, aFirst1), aLin); + // Projection on + gp_Pnt aLast2 = ElCLib::Value (ElCLib::Parameter (aLin, aLast1), aLin); + + gp_Vec aVec2 (aFirst2, aLast2); + + // Check if two parts of revolution are parallel (it's a cylinder) or normal (it's a circle). + if (aVec1.IsParallel (aVec2, Precision::Angular()) + || aVec1.IsNormal (aVec2,Precision::Angular())) + return Standard_False; + + gce_MakeCone aMkCone (aRevSurf->Axis(), aFirst1, aLast1); + aCone = aMkCone.Value(); + myCenterPoint = aCone.Apex(); + } + else + { + aType = aSurf->DynamicType(); + if (aType == STANDARD_TYPE(Geom_OffsetSurface) || anOffset > 0.01) + { + // Offset surface + aOffsetSurf = new Geom_OffsetSurface (aSurf, anOffset); + aSurf = aOffsetSurf->Surface(); + BRepBuilderAPI_MakeFace aMkFace(aSurf, Precision::Confusion()); + aMkFace.Build(); + if (!aMkFace.IsDone()) + return Standard_False; + aConeAdaptor.Initialize (aMkFace.Face()); + } + aCone = aConeAdaptor.Cone(); + aConicalSurf = Handle(Geom_ConicalSurface)::DownCast (aSurf); + myCenterPoint = aConicalSurf->Apex(); + } + + // A circle where the angle is drawn + Handle(Geom_Curve) aCurve; + Standard_Real aMidV = ( aMinV + aMaxV ) / 2.5; + aCurve = aSurf->VIso (aMidV); + aCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + + aCurve = aSurf->VIso(aMaxV); + gp_Circ aCircVmax = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); + aCurve = aSurf->VIso(aMinV); + gp_Circ aCircVmin = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); + + if (aCircVmax.Radius() < aCircVmin.Radius()) + { + gp_Circ aTmpCirc = aCircVmax; + aCircVmax = aCircVmin; + aCircVmin = aTmpCirc; + } + + myFirstPoint = ElCLib::Value (0, aCircle); + mySecondPoint = ElCLib::Value (M_PI, aCircle); + return Standard_True; +} + +//======================================================================= +//function : IsValidPoints +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) const +{ + return theFirstPoint.Distance (theCenterPoint) > Precision::Confusion() + && theSecondPoint.Distance (theCenterPoint) > Precision::Confusion() + && gp_Vec (theCenterPoint, theFirstPoint).Angle ( + gp_Vec (theCenterPoint, theSecondPoint)) > Precision::Angular(); +} + +//======================================================================= +//function : isArrowVisible +//purpose : compares given and internal arrows types, returns true if the the type should be shown +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::isArrowVisible(const PrsDim_TypeOfAngleArrowVisibility theArrowType) const +{ + switch (theArrowType) + { + case PrsDim_TypeOfAngleArrowVisibility_Both: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both; + case PrsDim_TypeOfAngleArrowVisibility_First: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both || myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_First; + case PrsDim_TypeOfAngleArrowVisibility_Second: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both || myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Second; + case PrsDim_TypeOfAngleArrowVisibility_None: + return false; + } + return false; +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_AngleDimension::GetTextPosition() const +{ + if (!IsValid()) + { + return gp::Origin(); + } + + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + gp_Pnt aTextPosition (gp::Origin()); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // Prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + // Handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + FitTextAlignment (aDimensionAspect->TextHorizontalPosition(), + aLabelPosition, isArrowsExternal); + + // Get text position + switch (aLabelPosition & LabelPosition_HMask) + { + case LabelPosition_HCenter: + { + aTextPosition = GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); + } + break; + case LabelPosition_Left: + { + gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aFirstAttach); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * -anOffset; + aTextPosition = aFirstAttach.Translated (anExtensionVec); + } + break; + case LabelPosition_Right: + { + gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aSecondAttach); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * anOffset; + aTextPosition = aSecondAttach.Translated (anExtensionVec); + } + break; + } + + return aTextPosition; +} + +//======================================================================= +//function : SetTextPosition +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + // The text position point for angle dimension should belong to the working plane. + if (!GetPlane().Contains (theTextPos, Precision::Confusion())) + { + throw Standard_ProgramError("The text position point for angle dimension doesn't belong to the working plane."); + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; +} + +//======================================================================= +//function : AdjustParameters +//purpose : +//======================================================================= +void PrsDim_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // Build circle with radius that is equal to distance from text position to the center point. + Standard_Real aRadius = gp_Vec (myCenterPoint, theTextPos).Magnitude(); + + // Set attach points in positive direction of the flyout. + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * aRadius); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * aRadius); + + gce_MakeCirc aConstructCircle (myCenterPoint, GetPlane(), aRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + gp_Circ aCircle = aConstructCircle.Value(); + + // Default values + theExtensionSize = aDimensionAspect->ArrowAspect()->Length(); + theAlignment = Prs3d_DTHP_Center; + + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, aFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, aSecondAttach); + if (aParamEnd < aParamBeg) + { + Standard_Real aParam = aParamEnd; + aParamEnd = aParamBeg; + aParamBeg = aParam; + } + + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + Standard_Real aTextPar = ElCLib::Parameter (aCircle , theTextPos); + + // Horizontal center + if (aTextPar > aParamBeg && aTextPar < aParamEnd) + { + theFlyout = aRadius; + return; + } + + aParamBeg += M_PI; + aParamEnd += M_PI; + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + if (aTextPar > aParamBeg && aTextPar < aParamEnd) + { + theFlyout = -aRadius; + return; + } + + // Text on the extensions + gp_Lin aFirstLine = gce_MakeLin (myCenterPoint, myFirstPoint); + gp_Lin aSecondLine = gce_MakeLin (myCenterPoint, mySecondPoint); + gp_Pnt aFirstTextProj = PrsDim::Nearest (aFirstLine, theTextPos); + gp_Pnt aSecondTextProj = PrsDim::Nearest (aSecondLine, theTextPos); + Standard_Real aFirstDist = aFirstTextProj.Distance (theTextPos); + Standard_Real aSecondDist = aSecondTextProj.Distance (theTextPos); + + if (aFirstDist <= aSecondDist) + { + aRadius = myCenterPoint.Distance (aFirstTextProj); + Standard_Real aNewExtensionSize = aFirstDist - anArrowLength; + theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; + + theAlignment = Prs3d_DTHP_Left; + + gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, myFirstPoint).Normalized().Scaled (aRadius); + + theFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() + ? -aRadius : aRadius; + } + else + { + aRadius = myCenterPoint.Distance (aSecondTextProj); + + Standard_Real aNewExtensionSize = aSecondDist - anArrowLength; + + theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; + + theAlignment = Prs3d_DTHP_Right; + + gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, mySecondPoint).Normalized().Scaled (aRadius); + + theFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() + ? -aRadius : aRadius; + } +} + +//======================================================================= +//function : FitTextAlignment +//purpose : +//======================================================================= +void PrsDim_AngleDimension::FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // Prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to label width + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + // Handle user-defined and automatic arrow placement + switch (aDimensionAspect->ArrowOrientation()) + { + case Prs3d_DAO_External: theIsArrowsExternal = true; break; + case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; + case Prs3d_DAO_Fit: + { + gp_Vec anAttachVector (aFirstAttach, aSecondAttach); + Standard_Real aDimensionWidth = anAttachVector.Magnitude(); + + // Add margin to ensure a small tail between text and arrow + Standard_Real anArrowMargin = aDimensionAspect->IsText3d() + ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN + : 0.0; + + Standard_Real anArrowsWidth = (anArrowLength + anArrowMargin) * 2.0; + + theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; + break; + } + } + + // Handle user-defined and automatic text placement + switch (theHorizontalTextPos) + { + case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; + case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; + case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; + case Prs3d_DTHP_Fit: + { + gp_Vec anAttachVector (aFirstAttach, aSecondAttach); + Standard_Real aDimensionWidth = anAttachVector.Magnitude(); + Standard_Real anArrowsWidth = anArrowLength * 2.0; + Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; + + theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; + break; + } + } + + switch (aDimensionAspect->TextVerticalPosition()) + { + case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; + case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; + case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; + } +} diff --git a/src/PrsDim/PrsDim_AngleDimension.hxx b/src/PrsDim/PrsDim_AngleDimension.hxx new file mode 100644 index 0000000000..b46ea7ab8f --- /dev/null +++ b/src/PrsDim/PrsDim_AngleDimension.hxx @@ -0,0 +1,353 @@ +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2013 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. + +#ifndef _PrsDim_AngleDimension_HeaderFile +#define _PrsDim_AngleDimension_HeaderFile + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_AngleDimension, PrsDim_Dimension) + +//! Angle dimension. Can be constructed: +//! - on two intersected edges. +//! - on three points or vertices. +//! - on conical face. +//! - between two intersected faces. +//! +//! In case of three points or two intersected edges the dimension plane +//! (on which dimension presentation is built) can be computed uniquely +//! as through three defined points can be built only one plane. +//! Therefore, if user-defined plane differs from this one, the dimension can't be built. +//! +//! In cases of two planes automatic plane by default is built on point of the +//! origin of parametric space of the first face (the basis surface) so, that +//! the working plane and two faces intersection forms minimal angle between the faces. +//! User can define the other point which the dimension plane should pass through +//! using the appropriate constructor. This point can lay on the one of the faces or not. +//! Also user can define his own plane but it should pass through the three points +//! computed on the geometry initialization step (when the constructor or SetMeasuredGeometry() method +//! is called). +//! +//! In case of the conical face the center point of the angle is the apex of the conical surface. +//! The attachment points are points of the first and the last parameter of the basis circle of the cone. +class PrsDim_AngleDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_AngleDimension, PrsDim_Dimension) +public: + + //! Constructs minimum angle dimension between two linear edges (where possible). + //! These two edges should be intersected by each other. Otherwise the geometry is not valid. + //! @param theFirstEdge [in] the first edge. + //! @param theSecondEdge [in] the second edge. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge); + + //! Constructs the angle display object defined by three points. + //! @param theFirstPoint [in] the first point (point on first angle flyout). + //! @param theSecondPoint [in] the center point of angle dimension. + //! @param theThirdPoint [in] the second point (point on second angle flyout). + Standard_EXPORT PrsDim_AngleDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint); + + //! Constructs the angle display object defined by three vertices. + //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). + //! @param theSecondVertex [in] the center vertex of angle dimension. + //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex); + + //! Constructs angle dimension for the cone face. + //! @param theCone [in] the conical face. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theCone); + + //! Constructs angle dimension between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Constructs angle dimension between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + //! @param thePoint [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint); + +public: + + //! @return first point forming the angle. + const gp_Pnt& FirstPoint() const { return myFirstPoint; } + + //! @return second point forming the angle. + const gp_Pnt& SecondPoint() const { return mySecondPoint; } + + //! @return center point forming the angle. + const gp_Pnt& CenterPoint() const { return myCenterPoint; } + + //! @return first argument shape. + const TopoDS_Shape& FirstShape() const { return myFirstShape; } + + //! @return second argument shape. + const TopoDS_Shape& SecondShape() const { return mySecondShape; } + + //! @return third argument shape. + const TopoDS_Shape& ThirdShape() const { return myThirdShape; } + +public: + + //! Measures minimum angle dimension between two linear edges. + //! These two edges should be intersected by each other. Otherwise the geometry is not valid. + //! @param theFirstEdge [in] the first edge. + //! @param theSecondEdge [in] the second edge. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge); + + //! Measures angle defined by three points. + //! @param theFirstPoint [in] the first point (point on first angle flyout). + //! @param theSecondPoint [in] the center point of angle dimension. + //! @param theThirdPoint [in] the second point (point on second angle flyout). + Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThridPoint); + + //! Measures angle defined by three vertices. + //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). + //! @param theSecondVertex [in] the center vertex of angle dimension. + //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex); + + //! Measures angle of conical face. + //! @param theCone [in] the shape to measure. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theCone); + + //! Measures angle between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face.. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Measures angle between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + //! @param thePoint [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + //! Principle of horizontal text alignment settings: + //! - divide circle into two halves according to attachment points + //! - if aTextPos is between attach points -> Center + positive flyout + //! - if aTextPos is not between attach points but in this half -> Left or Right + positive flyout + //! - if aTextPos is between reflections of attach points -> Center + negative flyout + //! - if aTextPos is not between reflections of attach points -> Left or Right + negative flyout + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition () const Standard_OVERRIDE; + + //! Sets angle type. + //! @param theType [in] the type value. + void SetType (const PrsDim_TypeOfAngle theType) { myType = theType; } + + //! @return the current angle type. + PrsDim_TypeOfAngle GetType() const { return myType; } + + //! Sets visible arrows type + //! @param theType [in] the type of visibility of arrows. + void SetArrowsVisibility (const PrsDim_TypeOfAngleArrowVisibility& theType) { myArrowsVisibility = theType; } + + //! @return the type of visibility of arrows. + PrsDim_TypeOfAngleArrowVisibility GetArrowsVisibility() const { return myArrowsVisibility; } + +protected: + + //! Initialization of fields that is common to all constructors. + Standard_EXPORT void Init(); + + //! Gets plane normal for minimal angle. + //! Dimension computation is based on three attach points and plane normal. + //! Based on this normal angle arc, arrows and extensions are constructed. + gp_Dir GetNormalForMinAngle() const; + + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @return the center of the dimension arc (the main dimension line in case of angle). + Standard_EXPORT gp_Pnt GetCenterOnArc (const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter) const; + + //! Draws main dimension line (arc). + //! @param thePresentation [in] the dimension presentation. + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @param theRadius [in] the radius of the dimension arc. + //! @param theMode [in] the display mode. + Standard_EXPORT void DrawArc (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const Standard_Real theRadius, + const Standard_Integer theMode); + + //! Draws main dimension line (arc) with text. + //! @param thePresentation [in] the dimension presentation. + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @param theText [in] the text label string. + //! @param theTextWidth [in] the text label width. + //! @param theMode [in] the display mode. + //! @param theLabelPosition [in] the text label vertical and horizontal positioning option + //! respectively to the main dimension line. + Standard_EXPORT void DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const TCollection_ExtendedString& theText, + const Standard_Real theTextWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition); + + //! Fits text alignment relatively to the dimension line; + //! it computes the value of label position and arrow orientation + //! according set in the aspect and dimension properties. + //! @param theHorizontalTextPos [in] the horizontal alignment for text position. + //! @param theLabelPosition [out] the label position, contains bits that defines + //! vertical and horizontal alignment. (for internal usage in count text position). + //! @param theIsArrowExternal [out] is the arrows external, + //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow + //! orientation automatically. + Standard_EXPORT void FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const; + + //! Adjusts aspect parameters according the text position: + //! extension size, vertical text alignment and flyout. + //! @param theTextPos [in] the user defined 3d point of text position. + //! @param theExtensionSize [out] the adjusted extension size. + //! @param theAlignment [out] the horizontal label alignment. + //! @param theFlyout [out] the adjusted value of flyout. + Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout) const; + +protected: + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if the plane includes three angle points to build dimension. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner) Standard_OVERRIDE; + +protected: + + //! Init angular dimension to measure angle between two linear edges. + //! @return TRUE if the angular dimension can be constructured + //! for the passed edges. + Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane); + + //! Init angular dimension to measure angle between two planar faces. + //! there is no user-defined poisitoning. So attach points are set + //! according to faces geometry (in origin of the first face basis surface). + //! @return TRUE if the angular dimension can be constructed + //! for the passed faces. + Standard_EXPORT Standard_Boolean InitTwoFacesAngle(); + + //! Init angular dimension to measure angle between two planar faces. + //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + //! It will be projected on the first face and this point will be set + //! as the first point attach point. + //! It defines some kind of dimension positioning over the faces. + //! @return TRUE if the angular dimension can be constructed + //! for the passed faces. + Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt& thePointOnFirstFace); + + //! Init angular dimension to measure cone face. + //! @return TRUE if the angular dimension can be constructed + //! for the passed cone. + Standard_EXPORT Standard_Boolean InitConeAngle(); + + //! Check that the points forming angle are valid. + //! @return TRUE if the points met the following requirements: + //! The (P1, Center), (P2, Center) can be built. + //! The angle between the vectors > Precision::Angular(). + Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) const; + + + //! Returns true if the arrow should be visible + //! @param theArrowType an arrow type + //! @return TRUE if the arrow should be visible + Standard_EXPORT Standard_Boolean isArrowVisible (const PrsDim_TypeOfAngleArrowVisibility theArrowType) const; + +private: + PrsDim_TypeOfAngle myType; //!< type of angle + PrsDim_TypeOfAngleArrowVisibility myArrowsVisibility; //!< type of arrows visibility + + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + gp_Pnt myCenterPoint; + TopoDS_Shape myFirstShape; + TopoDS_Shape mySecondShape; + TopoDS_Shape myThirdShape; +}; + +#endif // _PrsDim_AngleDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_Chamf2dDimension.cxx b/src/PrsDim/PrsDim_Chamf2dDimension.cxx new file mode 100644 index 0000000000..854b41720c --- /dev/null +++ b/src/PrsDim/PrsDim_Chamf2dDimension.cxx @@ -0,0 +1,228 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Chamf2dDimension, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf2dDimension::PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aFShape; + myPlane = aPlane; + myVal = aVal; + myText = aText; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + + myArrowSize = myVal / 100.; +} +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf2dDimension::PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs , + const Standard_Real anArrowSize) +:PrsDim_Relation() +{ + myFShape = aFShape; + myPlane = aPlane; + myVal = aVal; + myText = aText; + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_Chamf2dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + Handle(Geom_Curve) gcurv; + gp_Pnt pfirst,plast; + const TopoDS_Edge& thechamfedge = TopoDS::Edge(myFShape); + if (!PrsDim::ComputeGeometry (thechamfedge, gcurv, pfirst, plast)) + return; + + Handle(Geom_Line) glin = Handle(Geom_Line)::DownCast (gcurv); + gp_Dir dir1 (glin->Position().Direction()); + gp_Dir norm1 = myPlane->Pln().Axis().Direction(); + myDir = norm1.Crossed(dir1); + + + //------------------------------------------------- + // calcul d'une direction orthogonale a l'edge du + // chanfrein et dirigee vers l'ext. du contour + //------------------------------------------------- + + + // recup. d'une edge adjacente a l'edge du chanfrein + /*TopoDS_Edge nextedge = TopoDS::Edge(mySShape); + + gp_Pnt pfirstnext,plastnext; + Handle(Geom_Line) glinnext; + if (!PrsDim::ComputeGeometry(nextedge,glinnext,pfirstnext,plastnext) ) + return; + + gp_Vec v1(pfirst,plast); + gp_Vec v2; + if (pfirst.IsEqual(plastnext, Precision::Confusion())) + v2.SetXYZ(pfirstnext.XYZ() - pfirst.XYZ()); + else + v2.SetXYZ(plastnext.XYZ() - pfirst.XYZ()); + gp_Vec crossvec = v1.Crossed(v2); + + myDir = dimserv.GetDirection().Crossed(glin->Position().Direction()); + if (crossvec.Dot(dimserv.GetDirection()) > 0 ) + myDir.Reverse();*/ // myDir => donne a la creation + + //-------------------------------------------- + //Calcul du point de positionnement du texte + //-------------------------------------------- + gp_Pnt curpos; + if (myAutomaticPosition) { + myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); + gp_Vec transVec(myDir); + transVec*=myVal; + curpos = myPntAttach.Translated(transVec); + + if (myIsSetBndBox) + curpos = PrsDim::TranslatePointToBound( curpos, myDir, myBndBox ); + + myPosition = curpos; + } + else { + + myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); + Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); + Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); + curpos = ElCLib::Value(parcurpos,dimLin->Lin()); + //static Standard_Real minlength = 0.005; + //taille minimale de la dimension + + if ( curpos.Distance(myPntAttach) < 5. ) { + gp_Vec transVec(myDir); + transVec*=5.; + curpos = myPntAttach.Translated(transVec); + } + myPosition = curpos; + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + //------------------------------------------------- + //Calcul de la boite englobante du component pour + //determiner la taille de la fleche + //------------------------------------------------- + + if( !myArrowSizeIsDefined ) { + Standard_Real arrsize = myArrowSize; + if ( (myVal/4) < arrsize) + arrsize = myVal/4; + if (arrsize > 30.) + arrsize = 30.; + else if (arrsize < 8.) + arrsize = 8.; + myArrowSize = arrsize; + } + arr->SetLength(myArrowSize); + + //Calcul de la presentation + DsgPrs_Chamf2dPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + myText, + mySymbolPrs); + + } + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_Chamf2dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); + 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, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X() + size, + myPosition.Y() + size, + myPosition.Z() + size); + aSelection->Add(box); +} + diff --git a/src/PrsDim/PrsDim_Chamf2dDimension.hxx b/src/PrsDim/PrsDim_Chamf2dDimension.hxx new file mode 100644 index 0000000000..3678d01773 --- /dev/null +++ b/src/PrsDim/PrsDim_Chamf2dDimension.hxx @@ -0,0 +1,69 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_Chamf2dDimension_HeaderFile +#define _PrsDim_Chamf2dDimension_HeaderFile + +#include +#include +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_Chamf2dDimension, PrsDim_Relation) + +//! A framework to define display of 2D chamfers. +//! A chamfer is displayed with arrows and text. The text +//! gives the length of the chamfer if it is a symmetrical +//! chamfer, or the angle if it is not. +class PrsDim_Chamf2dDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Chamf2dDimension, PrsDim_Relation) +public: + + //! Constructs the display object for 2D chamfers. + //! This object is defined by the face aFShape, the + //! dimension aVal, the plane aPlane and the text aText. + Standard_EXPORT PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Constructs the display object for 2D chamfers. + //! This object is defined by the face aFShape, the plane + //! aPlane, the dimension aVal, the position aPosition, + //! the type of arrow aSymbolPrs with the size + //! anArrowSize, and the text aText. + Standard_EXPORT PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + + //! Indicates that we are concerned with a 2d length. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_LENGTH; } + + //! Returns true if the 2d chamfer dimension is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myPntAttach; + gp_Dir myDir; + +}; + +#endif // _PrsDim_Chamf2dDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_Chamf3dDimension.cxx b/src/PrsDim/PrsDim_Chamf3dDimension.cxx new file mode 100644 index 0000000000..d48146592e --- /dev/null +++ b/src/PrsDim/PrsDim_Chamf3dDimension.cxx @@ -0,0 +1,201 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Chamf3dDimension, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf3dDimension::PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aFShape; + myVal = aVal; + myText = aText; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + + myArrowSize = myVal / 100.; +} +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf3dDimension::PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs , + const Standard_Real anArrowSize) +:PrsDim_Relation() +{ + myFShape = aFShape; + myVal = aVal; + myText = aText; + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_Chamf3dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + //---------------------------- + // Calcul du centre de la face + //---------------------------- + BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); + Standard_Real uFirst, uLast, vFirst, vLast; + uFirst = surfAlgo.FirstUParameter(); + uLast = surfAlgo.LastUParameter(); + vFirst = surfAlgo.FirstVParameter(); + vLast = surfAlgo.LastVParameter(); + Standard_Real uMoy = (uFirst + uLast)/2; + Standard_Real vMoy = (vFirst + vLast)/2; + gp_Pnt apos ; + gp_Vec d1u, d1v; + surfAlgo.D1(uMoy, vMoy, apos, d1u, d1v); + myPntAttach = apos; + + myDir = d1u ^ d1v; +// myDir = surfAlgo.Plane().Axis().Direction(); + + + + + //-------------------------------------------- + //Calcul du point de positionnement du texte + //-------------------------------------------- + gp_Pnt curpos; + if (myAutomaticPosition) { + gp_Vec transVec(myDir); + transVec*=myVal; + curpos = myPntAttach.Translated(transVec); + + if (myIsSetBndBox) + curpos = PrsDim::TranslatePointToBound( curpos, myDir, myBndBox ); + + myPosition = curpos; + } + else { + + Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); + Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); + curpos = ElCLib::Value(parcurpos,dimLin->Lin()); + + if ( curpos.Distance(myPntAttach) < 5. ) { + gp_Vec transVec(myDir); + transVec*=5.; + curpos = myPntAttach.Translated(transVec); + } + myPosition = curpos; + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + //------------------------------------------------- + //Calcul de la boite englobante du component pour + //determiner la taille de la fleche + //------------------------------------------------- + if( !myArrowSizeIsDefined ) { + Standard_Real arrsize = myArrowSize; + if ( (myVal/4) < arrsize) + arrsize = myVal/4; + if (arrsize > 30.) + arrsize = 30.; + else if (arrsize < 8.) + arrsize = 8.; + myArrowSize = arrsize; + } + arr->SetLength(myArrowSize); + + //Calcul de la presentation + DsgPrs_Chamf2dPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + myText, + mySymbolPrs); + +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_Chamf3dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); + 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, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X() + size, + myPosition.Y() + size, + myPosition.Z() + size); + aSelection->Add(box); +} + diff --git a/src/PrsDim/PrsDim_Chamf3dDimension.hxx b/src/PrsDim/PrsDim_Chamf3dDimension.hxx new file mode 100644 index 0000000000..c23d9e13ce --- /dev/null +++ b/src/PrsDim/PrsDim_Chamf3dDimension.hxx @@ -0,0 +1,67 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_Chamf3dDimension_HeaderFile +#define _PrsDim_Chamf3dDimension_HeaderFile + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_Chamf3dDimension, PrsDim_Relation) + +//! A framework to define display of 3D chamfers. +//! A chamfer is displayed with arrows and text. The text +//! gives the length of the chamfer if it is a symmetrical +//! chamfer, or the angle if it is not. +class PrsDim_Chamf3dDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Chamf3dDimension, PrsDim_Relation) +public: + + //! Constructs a display object for 3D chamfers. + //! This object is defined by the shape aFShape, the + //! dimension aVal and the text aText. + Standard_EXPORT PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Constructs a display object for 3D chamfers. + //! This object is defined by the shape aFShape, the + //! dimension aVal, the text aText, the point of origin of + //! the chamfer aPosition, the type of arrow aSymbolPrs + //! with the size anArrowSize. + Standard_EXPORT PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + + //! Indicates that we are concerned with a 3d length. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_LENGTH; } + + //! Returns true if the 3d chamfer dimension is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myPntAttach; + gp_Dir myDir; + +}; + +#endif // _PrsDim_Chamf3dDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_ConcentricRelation.cxx b/src/PrsDim/PrsDim_ConcentricRelation.cxx new file mode 100644 index 0000000000..e759fab084 --- /dev/null +++ b/src/PrsDim/PrsDim_ConcentricRelation.cxx @@ -0,0 +1,254 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_ConcentricRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ConcentricRelation::PrsDim_ConcentricRelation( + const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myDir = aPlane->Pln().Axis().Direction(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + TopAbs_ShapeEnum type2(mySShape.ShapeType()); + aPresentation->SetInfiniteState(Standard_True); + switch (myFShape.ShapeType()) { + case TopAbs_EDGE: + { + if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation); + else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation); + } + break; + + case TopAbs_VERTEX: + { + if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation); + else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation); + } + break; + default: {return;} + } +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Edge E; + TopoDS_Vertex V; + if (myFShape.ShapeType() == TopAbs_EDGE) { + E = TopoDS::Edge(myFShape); + V = TopoDS::Vertex(mySShape); + } + else { + E = TopoDS::Edge(mySShape); + V = TopoDS::Vertex(myFShape); + } + gp_Pnt p1,p2; + Handle(Geom_Curve) C; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + if (!PrsDim::ComputeGeometry(E,C,p1,p2,extCurv,isInfinite,isOnPlanEdge,myPlane)) return; + gp_Pnt P; + PrsDim::ComputeGeometry(V,P, myPlane, isOnPlanVertex); + + Handle(Geom_Circle) CIRCLE (Handle(Geom_Circle)::DownCast (C)); + myCenter = CIRCLE->Location(); + myRad = Min(CIRCLE->Radius()/5.,15.); + gp_Dir vec(p1.XYZ() - myCenter.XYZ() ); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); + if (!isOnPlanEdge) PrsDim::ComputeProjEdgePresentation(aPresentation,myDrawer,E,CIRCLE,p1,p2); + if (!isOnPlanVertex) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V,P); +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Vertex V1,V2; + V1 = TopoDS::Vertex(myFShape); + V2 = TopoDS::Vertex(myFShape); + Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True); + gp_Pnt P1,P2; + PrsDim::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1); + PrsDim::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2); + myCenter = P1; + myRad = 15.; + gp_Dir vec(myPlane->Pln().Position().XDirection()); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); + if (!isOnPlanVertex1) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V1,P1); + if (!isOnPlanVertex2) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V2,P2); +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape)); + BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape)); + + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), TopoDS::Edge(mySShape), + myExtShape, + geom1, geom2, + ptat11, ptat12, + ptat21, ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) { + return; + } + + Handle(Geom_Circle) gcirc1 (Handle(Geom_Circle)::DownCast (geom1)); + Handle(Geom_Circle) gcirc2 (Handle(Geom_Circle)::DownCast (geom2)); + + myCenter = gcirc1->Location(); + + // choose the radius equal to 1/5 of the smallest radius of + // 2 circles. Limit is imposed ( 0.02 by chance) + Standard_Real aRad1 = gcirc1->Radius(); + Standard_Real aRad2 = gcirc2->Radius(); + myRad = (aRad1 > aRad2 ) ? aRad2 : aRad1; + myRad /= 5; + if (myRad > 15.) myRad =15.; + + + //Calculate a point of circle of radius myRad + gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() ); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + + DsgPrs_ConcentricPresentation::Add(aPresentation, + myDrawer, + myCenter, + myRad, + myDir, + myPnt); + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl); + } + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + //Creation of 2 sensitive circles + // the greater + gp_Ax2 ax(myCenter, myDir); + Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ; + Handle(Select3D_SensitiveCircle) + sensit = new Select3D_SensitiveCircle (own, + Circ); + aSelection->Add(sensit); + // the smaller + Circ->SetRadius(myRad/2); + sensit = new Select3D_SensitiveCircle (own, + Circ); + aSelection->Add(sensit); + + //Creation of 2 segments sensitive for the cross + Handle(Select3D_SensitiveSegment) seg; + gp_Pnt otherPnt = myPnt.Mirrored(myCenter); + seg = new Select3D_SensitiveSegment(own, + otherPnt, + myPnt); + aSelection->Add(seg); + + gp_Ax1 RotateAxis(myCenter, myDir); + gp_Pnt FPnt = myCenter.Rotated(RotateAxis, M_PI/2); + gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -M_PI/2); + seg = new Select3D_SensitiveSegment(own, + FPnt, + SPnt); + aSelection->Add(seg); + +} + diff --git a/src/PrsDim/PrsDim_ConcentricRelation.hxx b/src/PrsDim/PrsDim_ConcentricRelation.hxx new file mode 100644 index 0000000000..f9c67126df --- /dev/null +++ b/src/PrsDim/PrsDim_ConcentricRelation.hxx @@ -0,0 +1,66 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_ConcentricRelation_HeaderFile +#define _PrsDim_ConcentricRelation_HeaderFile + +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_ConcentricRelation, PrsDim_Relation) + +//! A framework to define a constraint by a relation of +//! concentricity between two or more interactive datums. +//! The display of this constraint is also defined. +//! A plane is used to create an axis along which the +//! relation of concentricity can be extended. +class PrsDim_ConcentricRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_ConcentricRelation, PrsDim_Relation) +public: + + //! Constructs the display object for concentric relations + //! between shapes. + //! This object is defined by the two shapes, aFShape + //! and aSShape and the plane aPlane. + //! aPlane is provided to create an axis along which the + //! relation of concentricity can be extended. + Standard_EXPORT PrsDim_ConcentricRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoEdgesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT void ComputeEdgeVertexConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT void ComputeTwoVerticesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myCenter; + Standard_Real myRad; + gp_Dir myDir; + gp_Pnt myPnt; + +}; + +#endif // _PrsDim_ConcentricRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_DiameterDimension.cxx b/src/PrsDim/PrsDim_DiameterDimension.cxx new file mode 100644 index 0000000000..c86a4474ec --- /dev/null +++ b/src/PrsDim/PrsDim_DiameterDimension.cxx @@ -0,0 +1,385 @@ +// Created on: 1996-12-05 +// Created by: Jacques MINOT/Odile Olivier/Sergey ZARITCHNY +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_DiameterDimension, PrsDim_Dimension) + +namespace +{ + static const Standard_ExtCharacter THE_DIAMETER_SYMBOL (0x00D8); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const gp_Circ& theCircle) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const gp_Circ& theCircle, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetCustomPlane (thePlane); + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const TopoDS_Shape& theShape) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const TopoDS_Shape& theShape, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetCustomPlane (thePlane); + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : AnchorPoint +//purpose : +//======================================================================= +gp_Pnt PrsDim_DiameterDimension::AnchorPoint() +{ + if (!IsValid()) + { + return gp::Origin(); + } + + return myAnchorPoint; +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle) +{ + myCircle = theCircle; + myGeometryType = GeometryType_Edge; + myShape = BRepLib_MakeEdge (theCircle); + myAnchorPoint = gp::Origin(); + myIsGeometryValid = IsValidCircle (myCircle); + + if (myIsGeometryValid && myIsPlaneCustom) + { + ComputeAnchorPoint(); + } + else if (!myIsPlaneCustom) + { + ComputePlane(); + myAnchorPoint = ElCLib::Value (0.0, myCircle); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape) +{ + gp_Pnt aDummyPnt (gp::Origin()); + Standard_Boolean isClosed = Standard_False; + + myGeometryType = GeometryType_UndefShapes; + myShape = theShape; + myAnchorPoint = gp::Origin(); + myIsGeometryValid = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed) + && IsValidCircle (myCircle) + && isClosed; + + if (myIsGeometryValid && myIsPlaneCustom) + { + ComputeAnchorPoint(); + } + else if (!myIsPlaneCustom) + { + ComputePlane(); + myAnchorPoint = ElCLib::Value (0.0, myCircle); + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::CheckPlane (const gp_Pln& thePlane) const +{ + // Check if the circle center point belongs to plane. + if (!thePlane.Contains (myCircle.Location(), Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + myPlane = gp_Pln (gp_Ax3 (myCircle.Position())); +} + +//======================================================================= +//function : ComputeAnchorPoint +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeAnchorPoint() +{ + // Anchor point is an intersection of dimension plane and circle. + Handle(Geom_Circle) aCircle = new Geom_Circle (myCircle); + Handle(Geom_Plane) aPlane = new Geom_Plane (myPlane); + GeomAPI_IntCS anIntersector (aCircle, aPlane); + if (!anIntersector.IsDone()) + { + myIsGeometryValid = Standard_False; + return; + } + + // The circle lays on the plane. + if (anIntersector.NbPoints() != 2) + { + myAnchorPoint = ElCLib::Value (0.0, myCircle); + myIsGeometryValid = Standard_True; + return; + } + + gp_Pnt aFirstPoint = anIntersector.Point (1); + gp_Pnt aSecondPoint = anIntersector.Point (2); + + // Choose one of two intersection points that stands with + // positive direction of flyout. + // An anchor point is supposed to be the left attachment point. + gp_Dir aFirstDir = gce_MakeDir (aFirstPoint, myCircle.Location()); + gp_Dir aDir = myPlane.Axis().Direction() ^ aFirstDir; + myAnchorPoint = (gp_Vec (aDir) * gp_Vec(myCircle.Position().Direction()) > 0.0) + ? aFirstPoint + : aSecondPoint; + +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_DiameterDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_DiameterDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_DiameterDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + return myCircle.Radius() * 2.0; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + gp_Pnt aFirstPnt (gp::Origin()); + gp_Pnt aSecondPnt (gp::Origin()); + ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); + + DrawLinearDimension (thePresentation, theMode, aFirstPnt, aSecondPnt); +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) +{ + if (!IsValid()) + { + return; + } + + gp_Pnt aFirstPnt (gp::Origin()); + gp_Pnt aSecondPnt (gp::Origin()); + ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); + + ComputeLinearFlyouts (theSelection, theEntityOwner, aFirstPnt, aSecondPnt); +} + +//======================================================================= +//function : ComputeSidePoints +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeSidePoints (const gp_Circ& theCircle, + gp_Pnt& theFirstPnt, + gp_Pnt& theSecondPnt) +{ + theFirstPnt = AnchorPoint(); + + gp_Vec aRadiusVector (theCircle.Location(), theFirstPnt); + theSecondPnt = theCircle.Location().Translated (-aRadiusVector); +} + +//======================================================================= +//function : IsValidCircle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::IsValidCircle (const gp_Circ& theCircle) const +{ + return (theCircle.Radius() * 2.0) > Precision::Confusion(); +} + +//======================================================================= +//function : IsValidAnchor +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& theAnchor) const +{ + gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); + Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); + Standard_Real aRadius = myCircle.Radius(); + + return Abs (anAnchorDist - aRadius) > Precision::Confusion() + && aCirclePlane.Contains (theAnchor, Precision::Confusion()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_DiameterDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myAnchorPoint, myCircle.Location()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} diff --git a/src/PrsDim/PrsDim_DiameterDimension.hxx b/src/PrsDim/PrsDim_DiameterDimension.hxx new file mode 100644 index 0000000000..7fb2e1beb7 --- /dev/null +++ b/src/PrsDim/PrsDim_DiameterDimension.hxx @@ -0,0 +1,172 @@ +// Copyright (c) 1995-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. + +#ifndef _PrsDim_DiameterDimension_HeaderFile +#define _PrsDim_DiameterDimension_HeaderFile + +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_DiameterDimension, PrsDim_Dimension) + +//! Diameter dimension. Can be constructued: +//! - On generic circle. +//! - On generic circle with user-defined anchor point on that circle +//! (dimension plane is oriented to follow the anchor point). +//! - On generic circle in the specified plane. +//! - On generic shape containing geometry that can be measured +//! by diameter dimension: circle wire, circular face, etc. +//! The anchor point is the location of the left attachement point of +//! dimension on the circle. +//! The anchor point computation is processed after dimension plane setting +//! so that positive flyout direction stands with normal of the circle and +//! the normal of the plane. +//! If the plane is user-defined the anchor point was computed as intersection +//! of the plane and the basis circle. Among two intersection points +//! the one is selected so that positive flyout direction vector and +//! the circle normal on the one side form the circle plane. +//! (corner between positive flyout directio nand the circle normal is acute.) +//! If the plane is computed automatically (by default it is the circle plane), +//! the anchor point is the zero parameter point of the circle. +//! +//! The dimension is considered as invalid if the user-defined plane +//! does not include th enachor point and th ecircle center, +//! if the diameter of the circle is less than Precision::Confusion(). +//! In case if the dimension is built on the arbitrary shape, it can be considered +//! as invalid if the shape does not contain circle geometry. +class PrsDim_DiameterDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_DiameterDimension, PrsDim_Dimension) +public: + + //! Construct diameter dimension for the circle. + //! @param theCircle [in] the circle to measure. + Standard_EXPORT PrsDim_DiameterDimension (const gp_Circ& theCircle); + + //! Construct diameter dimension for the circle and orient it correspondingly + //! to the passed plane. + //! @param theCircle [in] the circle to measure. + //! @param thePlane [in] the plane defining preferred orientation + //! for dimension. + Standard_EXPORT PrsDim_DiameterDimension (const gp_Circ& theCircle, + const gp_Pln& thePlane); + + //! Construct diameter on the passed shape, if applicable. + //! @param theShape [in] the shape to measure. + Standard_EXPORT PrsDim_DiameterDimension (const TopoDS_Shape& theShape); + + //! Construct diameter on the passed shape, if applicable - and + //! define the preferred plane to orient the dimension. + //! @param theShape [in] the shape to measure. + //! @param thePlane [in] the plane defining preferred orientation + //! for dimension. + Standard_EXPORT PrsDim_DiameterDimension (const TopoDS_Shape& theShape, + const gp_Pln& thePlane); + +public: + + //! @return measured geometry circle. + const gp_Circ& Circle() const { return myCircle; } + + //! @return anchor point on circle for diameter dimension. + Standard_EXPORT gp_Pnt AnchorPoint(); + + //! @return the measured shape. + const TopoDS_Shape& Shape() const { return myShape; } + +public: + + //! Measure diameter of the circle. + //! The actual dimension plane is used for determining anchor points + //! on the circle to attach the dimension lines to. + //! The dimension will become invalid if the diameter of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle); + + //! Measure diameter on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + +protected: + + //! Override this method to change logic of anchor point computation. + //! Computes anchor point. Its computation is based on the current + //! dimension plane. Therfore, anchor point is an intersection of plane + //! and circle. + //! ATTENTION! + //! 1) The plane should be set or computed before. + //! 2) The plane should inclide th ecircle center to be valid. + Standard_EXPORT virtual void ComputeAnchorPoint(); + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if the center of the circle is on the plane. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; + +protected: + + //! Compute points on the circle sides for the dimension plane. + //! Program error exception is raised if the dimension plane "x" direction + //! is orthogonal to plane (the "impossible" case). The passed dimension plane + //! is the one specially computed to locate dimension presentation in circle. + //! @param theCircle [in] the circle. + //! @param theFirstPnt [out] the first point. + //! @param theSecondPnt [out] the second point. + Standard_EXPORT void ComputeSidePoints (const gp_Circ& theCircle, + gp_Pnt& theFirstPnt, + gp_Pnt& theSecondPnt); + + Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; + + Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& thePnt) const; + +private: + + gp_Circ myCircle; + gp_Pnt myAnchorPoint; + TopoDS_Shape myShape; +}; + +#endif // _PrsDim_DiameterDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_Dimension.cxx b/src/PrsDim/PrsDim_Dimension.cxx new file mode 100644 index 0000000000..17e989097f --- /dev/null +++ b/src/PrsDim/PrsDim_Dimension.cxx @@ -0,0 +1,1685 @@ +// Created on: 2013-11-11 +// Created by: Anastasia BORISOVA +// Copyright (c) 2013-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Dimension, AIS_InteractiveObject) + +namespace +{ + // default text strings + static const TCollection_ExtendedString THE_EMPTY_LABEL; + static const TCollection_AsciiString THE_UNDEFINED_UNITS; + + // default text margin and resolution + static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; + static const unsigned int THE_2D_TEXT_RESOLUTION = 72; + + // default selection priorities + static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5; + static const Standard_Integer THE_LOCAL_SEL_PRIORITY = 6; +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Dimension::PrsDim_Dimension (const PrsDim_KindOfDimension theType) +: AIS_InteractiveObject (), + mySelToleranceForText2d(0.0), + myValueType (ValueType_Computed), + myCustomValue (0.0), + myCustomStringValue (), + myIsTextPositionFixed (Standard_False), + mySpecialSymbol (' '), + myDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_No), + myGeometryType (GeometryType_UndefShapes), + myIsPlaneCustom (Standard_False), + myFlyout (0.0), + myIsGeometryValid (Standard_False), + myKindOfDimension (theType) +{ +} + +//======================================================================= +//function : SetCustomValue +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomValue (const Standard_Real theValue) +{ + if (myValueType == ValueType_CustomReal && myCustomValue == theValue) + { + return; + } + + myValueType = ValueType_CustomReal; + myCustomValue = theValue; + + SetToUpdate(); +} + +//======================================================================= +//function : SetCustomValue +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomValue (const TCollection_ExtendedString& theValue) +{ + if (myValueType == ValueType_CustomText && myCustomStringValue == theValue) + { + return; + } + + myValueType = ValueType_CustomText; + myCustomStringValue = theValue; + + SetToUpdate(); +} + +//======================================================================= +//function : SetUserPlane +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomPlane (const gp_Pln& thePlane) +{ + myPlane = thePlane; + myIsPlaneCustom = Standard_True; + + // Disable fixed (custom) text position + UnsetFixedTextPosition(); + + // Check validity if geometry has been set already. + if (IsValid()) + { + SetToUpdate(); + } +} + +//======================================================================= +//function : SetDimensionAspect +//purpose : +//======================================================================= +void PrsDim_Dimension::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect) +{ + myDrawer->SetDimensionAspect (theDimensionAspect); + + SetToUpdate(); +} + +//======================================================================= +//function : SetDisplaySpecialSymbol +//purpose : +//======================================================================= +void PrsDim_Dimension::SetDisplaySpecialSymbol (const PrsDim_DisplaySpecialSymbol theDisplaySpecSymbol) +{ + if (myDisplaySpecialSymbol == theDisplaySpecSymbol) + { + return; + } + + myDisplaySpecialSymbol = theDisplaySpecSymbol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetSpecialSymbol +//purpose : +//======================================================================= +void PrsDim_Dimension::SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol) +{ + if (mySpecialSymbol == theSpecialSymbol) + { + return; + } + + mySpecialSymbol = theSpecialSymbol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetSelToleranceForText2d +//purpose : +//======================================================================= +void PrsDim_Dimension::SetSelToleranceForText2d (const Standard_Real theTol) +{ + if (mySelToleranceForText2d == theTol) + { + return; + } + + mySelToleranceForText2d = theTol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetFlyout +//purpose : +//======================================================================= +void PrsDim_Dimension::SetFlyout (const Standard_Real theFlyout) +{ + if (myFlyout == theFlyout) + { + return; + } + + myFlyout = theFlyout; + + // Disable fixed text position + UnsetFixedTextPosition(); + + SetToUpdate(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_Dimension::GetDisplayUnits() const +{ + return THE_UNDEFINED_UNITS; +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_Dimension::GetModelUnits() const +{ + return THE_UNDEFINED_UNITS; +} + +//======================================================================= +//function : ValueToDisplayUnits +//purpose : +//======================================================================= +Standard_Real PrsDim_Dimension::ValueToDisplayUnits() const +{ + return UnitsAPI::AnyToAny (GetValue(), + GetModelUnits().ToCString(), + GetDisplayUnits().ToCString()); +} + +//======================================================================= +//function : GetValueString +//purpose : +//======================================================================= +TCollection_ExtendedString PrsDim_Dimension::GetValueString (Standard_Real& theWidth) const +{ + TCollection_ExtendedString aValueStr; + if (myValueType == ValueType_CustomText) + { + aValueStr = myCustomStringValue; + } + else + { + // format value string using "sprintf" + TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat(); + + char aFmtBuffer[256]; + sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits()); + aValueStr = TCollection_ExtendedString (aFmtBuffer); + } + + // add units to values string + if (myDrawer->DimensionAspect()->IsUnitsDisplayed()) + { + aValueStr += " "; + aValueStr += TCollection_ExtendedString (GetDisplayUnits()); + } + + switch (myDisplaySpecialSymbol) + { + case PrsDim_DisplaySpecialSymbol_Before: aValueStr.Insert (1, mySpecialSymbol); break; + case PrsDim_DisplaySpecialSymbol_After: aValueStr.Insert (aValueStr.Length() + 1, mySpecialSymbol); break; + case PrsDim_DisplaySpecialSymbol_No: break; + } + + // Get text style parameters + Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); + NCollection_Utf8String anUTFString (aValueStr.ToExtString()); + + theWidth = 0.0; + + if (myDrawer->DimensionAspect()->IsText3d()) + { + // text width produced by BRepFont + Font_BRepFont aFont; + if (aFont.FindAndInit (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aTextAspect->Height(), Font_StrictLevel_Any)) + { + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + theWidth += aFont.AdvanceX (aCurrChar, aNextChar); + } + } + } + else + { + // Text width for 1:1 scale 2D case + Font_FTFontParams aFontParams; + aFontParams.PointSize = (unsigned int )aTextAspect->Height(); + aFontParams.Resolution = THE_2D_TEXT_RESOLUTION; + if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aFontParams, Font_StrictLevel_Any)) + { + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + theWidth += (Standard_Real) aFont->AdvanceX (aCurrChar, aNextChar); + } + } + } + + return aValueStr; +} + +//======================================================================= +//function : DrawArrow +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theLocation, + const gp_Dir& theDirection) +{ + Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePresentation); + + Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); + Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); + + if (myDrawer->DimensionAspect()->IsArrows3d()) + { + Prs3d_Arrow::Draw (aGroup, + theLocation, + theDirection, + anAngle, + aLength); + aGroup->SetGroupPrimitivesAspect (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()); + } + else + { + gp_Pnt aLeftPoint (gp::Origin()); + gp_Pnt aRightPoint (gp::Origin()); + const gp_Dir& aPlane = GetPlane().Axis().Direction(); + + PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint); + + Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3); + + anArrow->AddVertex (aLeftPoint); + anArrow->AddVertex (theLocation); + anArrow->AddVertex (aRightPoint); + + // Set aspect for arrow triangles + Graphic3d_PolygonOffset aPolOffset; + aPolOffset.Mode = Aspect_POM_Off; + aPolOffset.Factor = 0.0f; + aPolOffset.Units = 0.0f; + Handle(Graphic3d_AspectFillArea3d) aShadingStyle = new Graphic3d_AspectFillArea3d(); + aShadingStyle->SetInteriorStyle (Aspect_IS_SOLID); + aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color()); + aShadingStyle->SetShadingModel (Graphic3d_TOSM_UNLIT); + aShadingStyle->SetPolygonOffset (aPolOffset); + + aGroup->SetPrimitivesAspect (aShadingStyle); + aGroup->AddPrimitiveArray (anArrow); + } + + SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow(); + aSensitiveArrow.Position = theLocation; + aSensitiveArrow.Direction = theDirection; +} + +//======================================================================= +//function : drawText +//purpose : +//======================================================================= +void PrsDim_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theTextPos, + const gp_Dir& theTextDir, + const TCollection_ExtendedString& theText, + const Standard_Integer theLabelPosition) +{ + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (myDrawer->DimensionAspect()->IsText3d()) + { + // getting font parameters + Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); + Quantity_Color aColor = aTextAspect->Aspect()->Color(); + Font_FontAspect aFontAspect = aTextAspect->Aspect()->GetTextFontAspect(); + Standard_Real aFontHeight = aTextAspect->Height(); + + // creating TopoDS_Shape for text + Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(), + aFontAspect, aFontHeight); + NCollection_Utf8String anUTFString (theText.ToExtString()); + + Font_BRepTextBuilder aBuilder; + TopoDS_Shape aTextShape = aBuilder.Perform (aFont, anUTFString); + + // compute text width with kerning + Standard_Real aTextWidth = 0.0; + Standard_Real aTextHeight = aFont.Ascender() + aFont.Descender(); + + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + aTextWidth += aFont.AdvanceX (aCurrChar, aNextChar); + } + + // formating text position in XOY plane + Standard_Integer aHLabelPos = theLabelPosition & LabelPosition_HMask; + Standard_Integer aVLabelPos = theLabelPosition & LabelPosition_VMask; + + gp_Dir aTextDir (aHLabelPos == LabelPosition_Left ? -theTextDir : theTextDir); + + // compute label offsets + Standard_Real aMarginSize = aFontHeight * THE_3D_TEXT_MARGIN; + Standard_Real aCenterHOffset = 0.0; + Standard_Real aCenterVOffset = 0.0; + switch (aHLabelPos) + { + case LabelPosition_HCenter : aCenterHOffset = 0.0; break; + case LabelPosition_Right : aCenterHOffset = aTextWidth / 2.0 + aMarginSize; break; + case LabelPosition_Left : aCenterHOffset = -aTextWidth / 2.0 - aMarginSize; break; + } + switch (aVLabelPos) + { + case LabelPosition_VCenter : aCenterVOffset = 0.0; break; + case LabelPosition_Above : aCenterVOffset = aTextHeight / 2.0 + aMarginSize; break; + case LabelPosition_Below : aCenterVOffset = -aTextHeight / 2.0 - aMarginSize; break; + } + + // compute shape offset transformation + Standard_Real aShapeHOffset = aCenterHOffset - aTextWidth / 2.0; + Standard_Real aShapeVOffset = aCenterVOffset - aTextHeight / 2.0; + + // center shape in its bounding box (suppress border spacing added by FT_Font) + Bnd_Box aShapeBnd; + BRepBndLib::AddClose (aTextShape, aShapeBnd); + + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + aShapeBnd.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + Standard_Real aXalign = aTextWidth * 0.5 - (aXmax + aXmin) * 0.5; + Standard_Real aYalign = aTextHeight * 0.5 - (aYmax + aYmin) * 0.5; + aShapeHOffset += aXalign; + aShapeVOffset += aYalign; + + gp_Trsf anOffsetTrsf; + anOffsetTrsf.SetTranslation (gp::Origin(), gp_Pnt (aShapeHOffset, aShapeVOffset, 0.0)); + aTextShape.Move (anOffsetTrsf); + + // transform text to myWorkingPlane coordinate system + gp_Ax3 aTextCoordSystem (theTextPos, GetPlane().Axis().Direction(), aTextDir); + gp_Trsf aTextPlaneTrsf; + aTextPlaneTrsf.SetTransformation (aTextCoordSystem, gp_Ax3 (gp::XOY())); + aTextShape.Move (aTextPlaneTrsf); + + // set text flipping anchors + gp_Trsf aCenterOffsetTrsf; + gp_Pnt aCenterOffset (aCenterHOffset, aCenterVOffset, 0.0); + aCenterOffsetTrsf.SetTranslation (gp::Origin(), aCenterOffset); + + gp_Pnt aCenterOfLabel (gp::Origin()); + aCenterOfLabel.Transform (aCenterOffsetTrsf); + aCenterOfLabel.Transform (aTextPlaneTrsf); + + gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir); + aGroup->SetFlippingOptions (Standard_True, aFlippingAxes); + + // draw text + if (myDrawer->DimensionAspect()->IsTextShaded()) + { + // Setting text shading and color parameters + if (!myDrawer->HasOwnShadingAspect()) + { + myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); + } + + Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT); + aShadeMat.SetAmbientColor (Quantity_NOC_BLACK); + aShadeMat.SetDiffuseColor (Quantity_NOC_BLACK); + aShadeMat.SetSpecularColor(Quantity_NOC_BLACK); + myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor); + myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor (aColor); + myDrawer->ShadingAspect()->SetMaterial (aShadeMat); + + // drawing text + StdPrs_ShadedShape::Add (thePresentation, aTextShape, myDrawer); + } + else + { + // Setting color for text + if (!myDrawer->HasOwnFreeBoundaryAspect()) + { + myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0)); + } + myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor); + + // drawing text + if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer)) + { + aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect()); + aGroup->AddPrimitiveArray (anEdges); + } + } + Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_False, gp_Ax2()); + + mySelectionGeom.TextPos = aCenterOfLabel; + mySelectionGeom.TextDir = aTextDir; + mySelectionGeom.TextWidth = aTextWidth + aMarginSize * 2.0; + mySelectionGeom.TextHeight = aTextHeight; + + return; + } + + // generate primitives for 2D text + myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION); + + Prs3d_Text::Draw (aGroup, + myDrawer->DimensionAspect()->TextAspect(), + theText, + theTextPos); + + mySelectionGeom.TextPos = theTextPos; + mySelectionGeom.TextDir = theTextDir; + mySelectionGeom.TextWidth = 0.0; + mySelectionGeom.TextHeight = 0.0; +} + +//======================================================================= +//function : DrawExtension +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Real theExtensionSize, + const gp_Pnt& theExtensionStart, + const gp_Dir& theExtensionDir, + const TCollection_ExtendedString& theLabelString, + const Standard_Real theLabelWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition) +{ + // reference line for extension starting at its connection point + gp_Lin anExtensionLine (theExtensionStart, theExtensionDir); + + Standard_Boolean hasLabel = theLabelString.Length() > 0; + if (hasLabel && (theMode == ComputeMode_All || theMode == ComputeMode_Text)) + { + // compute text primitives; get its model width + gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine); + gp_Dir aTextDir = theExtensionDir; + + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + drawText (thePresentation, + aTextPos, + aTextDir, + theLabelString, + theLabelPosition); + } + + if (theMode != ComputeMode_All && theMode != ComputeMode_Line) + { + return; + } + + Standard_Boolean isShortLine = !myDrawer->DimensionAspect()->IsText3d() + || theLabelPosition & LabelPosition_VCenter; + + // compute graphical primitives and sensitives for extension line + gp_Pnt anExtStart = theExtensionStart; + gp_Pnt anExtEnd = !hasLabel || isShortLine + ? ElCLib::Value (theExtensionSize, anExtensionLine) + : ElCLib::Value (theExtensionSize + theLabelWidth, anExtensionLine); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) anExtPrimitive = new Graphic3d_ArrayOfSegments (2); + anExtPrimitive->AddVertex (anExtStart); + anExtPrimitive->AddVertex (anExtEnd); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (anExtStart); + aSensitiveCurve.Append (anExtEnd); + + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_True); + } + Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + aGroup->SetPrimitivesAspect (aDimensionLineStyle); + aGroup->AddPrimitiveArray (anExtPrimitive); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_False); + } +} + +//======================================================================= +//function : DrawLinearDimension +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide) +{ + // do not build any dimension for equal points + if (theFirstPoint.IsEqual (theSecondPoint, Precision::Confusion())) + { + throw Standard_ProgramError("Can not build presentation for equal points."); + } + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // For extensions we need to know arrow size, text size and extension size: get it from aspect + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to cut dimension lines for 3d text + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + + Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); + if (IsTextPositionCustom()) + { + if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint, + anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom)) + { + throw Standard_ProgramError("Can not adjust plane to the custom label position."); + } + } + + FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos, + aLabelPosition, isArrowsExternal); + + // compute dimension line points + gp_Pnt aLineBegPoint, aLineEndPoint; + ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, aLineBegPoint, aLineEndPoint); + gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint); + + // compute arrows positions and directions + gp_Dir aFirstArrowDir = aDimensionLine.Direction().Reversed(); + gp_Dir aSecondArrowDir = aDimensionLine.Direction(); + gp_Dir aFirstExtensionDir = aDimensionLine.Direction().Reversed(); + gp_Dir aSecondExtensionDir = aDimensionLine.Direction(); + + gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); + + if (isArrowsExternal) + { + aFirstArrowDir.Reverse(); + aSecondArrowDir.Reverse(); + } + + aFirstArrowBegin = aLineBegPoint; + aSecondArrowBegin = aLineEndPoint; + aFirstArrowEnd = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength)); + aSecondArrowEnd = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength)); + + gp_Pnt aCenterLineBegin = isArrowsExternal + ? aLineBegPoint : aFirstArrowEnd; + + gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide + ? aLineEndPoint : aSecondArrowEnd; + + + switch (aLabelPosition & LabelPosition_HMask) + { + // ------------------------------------------------------------------------ // + // CENTER // + // -------------------------------------------------------------------------// + case LabelPosition_HCenter: + { + // add label on dimension or extension line to presentation + gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition + : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5; + gp_Dir aTextDir = aDimensionLine.Direction(); + + // add text primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + thePresentation->NewGroup(); + drawText (thePresentation, + aTextPos, + aTextDir, + aLabelString, + aLabelPosition); + } + + // add dimension line primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (isLineBreak ? 4 : 2); + + // compute continuous or sectioned main line segments + if (isLineBreak) + { + Standard_Real aPTextPosition = ElCLib::Parameter (aDimensionLine, aTextPos); + gp_Pnt aSection1Beg = aCenterLineBegin; + gp_Pnt aSection1End = ElCLib::Value (aPTextPosition - (aLabelWidth * 0.5), aDimensionLine); + gp_Pnt aSection2Beg = ElCLib::Value (aPTextPosition + (aLabelWidth * 0.5), aDimensionLine); + gp_Pnt aSection2End = aCenterLineEnd; + + aPrimSegments->AddVertex (aSection1Beg); + aPrimSegments->AddVertex (aSection1End); + aPrimSegments->AddVertex (aSection2Beg); + aPrimSegments->AddVertex (aSection2End); + + SelectionGeometry::Curve& aLeftSensitiveCurve = mySelectionGeom.NewCurve(); + SelectionGeometry::Curve& aRightSensitiveCurve = mySelectionGeom.NewCurve(); + aLeftSensitiveCurve.Append (aSection1Beg); + aLeftSensitiveCurve.Append (aSection1End); + aRightSensitiveCurve.Append (aSection2Beg); + aRightSensitiveCurve.Append (aSection2End); + } + else + { + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // set text label justification + Graphic3d_VerticalTextAlignment aTextJustificaton = Graphic3d_VTA_BOTTOM; + switch (aLabelPosition & LabelPosition_VMask) + { + case LabelPosition_Above : + case LabelPosition_VCenter : aTextJustificaton = Graphic3d_VTA_BOTTOM; break; + case LabelPosition_Below : aTextJustificaton = Graphic3d_VTA_TOP; break; + } + aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton); + + // main dimension line, short extension + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_True); + } + aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_False); + } + } + + // add arrows to presentation + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + } + } + + if (!isArrowsExternal) + { + break; + } + + // add arrow extension lines to presentation + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, aFirstExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + if (!theIsOneSide) + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, aSecondExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + } + break; + } + // ------------------------------------------------------------------------ // + // LEFT // + // -------------------------------------------------------------------------// + + case LabelPosition_Left: + { + // add label on dimension or extension line to presentation + { + // Left extension with the text + DrawExtension (thePresentation, anExtensionSize, + isArrowsExternal + ? aFirstArrowEnd + : aFirstArrowBegin, + aFirstExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + + // add dimension line primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + // add central dimension line + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + + aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // add arrows to presentation + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + } + } + + if (!isArrowsExternal || theIsOneSide) + { + break; + } + + // add extension lines for external arrows + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, aSecondExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + + break; + } + // ------------------------------------------------------------------------ // + // RIGHT // + // -------------------------------------------------------------------------// + + case LabelPosition_Right: + { + // add label on dimension or extension line to presentation + + // Right extension with text + DrawExtension (thePresentation, anExtensionSize, + isArrowsExternal + ? aSecondArrowEnd + : aSecondArrowBegin, + aSecondExtensionDir, + aLabelString, aLabelWidth, + theMode, + aLabelPosition); + + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + // add central dimension line + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // add arrows to presentation + { + thePresentation->NewGroup(); + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + } + } + + if (!isArrowsExternal || theIsOneSide) + { + break; + } + + // add extension lines for external arrows + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, aFirstExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + + break; + } + } + + // add flyout lines to presentation + if (theMode == ComputeMode_All) + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4); + aPrimSegments->AddVertex (theFirstPoint); + aPrimSegments->AddVertex (aLineBegPoint); + + aPrimSegments->AddVertex (theSecondPoint); + aPrimSegments->AddVertex (aLineEndPoint); + + aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + } + + mySelectionGeom.IsComputed = Standard_True; +} + +//======================================================================= +//function : ComputeFlyoutLinePoints +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) +{ + // compute dimension line points + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + // compute flyout direction vector + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); +} + +//======================================================================= +//function : ComputeLinearFlyouts +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) +{ + // count flyout direction + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + + // count a flyout direction vector. + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // get flyout end points + gp_Pnt aFlyoutEnd1 = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aFlyoutEnd2 = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + // fill sensitive entity for flyouts + Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theFirstPoint, aFlyoutEnd1)); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theSecondPoint, aFlyoutEnd2)); + theSelection->Add (aSensitiveEntity); +} + +//======================================================================= +//function : CircleFromPlanarFace +//purpose : if possible computes circle from planar face +//======================================================================= +Standard_Boolean PrsDim_Dimension::CircleFromPlanarFace (const TopoDS_Face& theFace, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint) +{ + TopExp_Explorer anIt (theFace, TopAbs_EDGE); + for ( ; anIt.More(); anIt.Next()) + { + TopoDS_Edge aCurEdge = TopoDS::Edge (anIt.Current()); + if (PrsDim::ComputeGeometry (aCurEdge, theCurve, theFirstPoint, theLastPoint)) + { + if (theCurve->IsInstance (STANDARD_TYPE(Geom_Circle))) + { + return Standard_True; + } + } + } + return Standard_False; +} + +//======================================================================= +//function : CircleFromEdge +//purpose : if possible computes circle from edge +//======================================================================= +Standard_Boolean PrsDim_Dimension::CircleFromEdge (const TopoDS_Edge& theEdge, + gp_Circ& theCircle, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint) +{ + BRepAdaptor_Curve anAdaptedCurve (theEdge); + switch (anAdaptedCurve.GetType()) + { + case GeomAbs_Circle: + { + theCircle = anAdaptedCurve.Circle(); + break; + } + case GeomAbs_Ellipse: + { + gp_Elips anEll = anAdaptedCurve.Ellipse(); + if ((anEll.MinorRadius() - anEll.MajorRadius()) >= Precision::Confusion()) + { + return Standard_False; + } + theCircle = gp_Circ(anEll.Position(),anEll.MinorRadius()); + break; + } + case GeomAbs_Line: + case GeomAbs_Hyperbola: + case GeomAbs_Parabola: + case GeomAbs_BezierCurve: + case GeomAbs_BSplineCurve: + case GeomAbs_OtherCurve: + default: + return Standard_False; + } + + theFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter()); + theLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter()); + return Standard_True; +} + +//======================================================================= +//function : InitCircularDimension +//purpose : +//======================================================================= +Standard_Boolean PrsDim_Dimension::InitCircularDimension (const TopoDS_Shape& theShape, + gp_Circ& theCircle, + gp_Pnt& theMiddleArcPoint, + Standard_Boolean& theIsClosed) +{ + gp_Pln aPln; + Handle(Geom_Surface) aBasisSurf; + PrsDim_KindOfSurface aSurfType = PrsDim_KOS_OtherSurface; + gp_Pnt aFirstPoint, aLastPoint; + Standard_Real anOffset = 0.0; + Standard_Real aFirstParam = 0.0; + Standard_Real aLastParam = 0.0; + + // Discover circular geometry + switch (theShape.ShapeType()) + { + case TopAbs_FACE: + { + PrsDim::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset); + + if (aSurfType == PrsDim_KOS_Plane) + { + Handle(Geom_Curve) aCurve; + if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + + theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + } + else + { + gp_Pnt aCurPos; + BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape)); + Standard_Real aFirstU = aSurf1.FirstUParameter(); + Standard_Real aLastU = aSurf1.LastUParameter(); + Standard_Real aFirstV = aSurf1.FirstVParameter(); + Standard_Real aLastV = aSurf1.LastVParameter(); + Standard_Real aMidU = (aFirstU + aLastU) * 0.5; + Standard_Real aMidV = (aFirstV + aLastV) * 0.5; + aSurf1.D0 (aMidU, aMidV, aCurPos); + Handle (Adaptor3d_HCurve) aBasisCurve; + Standard_Boolean isExpectedType = Standard_False; + if (aSurfType == PrsDim_KOS_Cylinder) + { + isExpectedType = Standard_True; + } + else + { + if (aSurfType == PrsDim_KOS_Revolution) + { + aBasisCurve = aSurf1.BasisCurve(); + if (aBasisCurve->GetType() == GeomAbs_Line) + { + isExpectedType = Standard_True; + } + } + else if (aSurfType == PrsDim_KOS_Extrusion) + { + aBasisCurve = aSurf1.BasisCurve(); + if (aBasisCurve->GetType() == GeomAbs_Circle) + { + isExpectedType = Standard_True; + } + } + } + + if (!isExpectedType) + { + return Standard_False; + } + + Handle(Geom_Curve) aCurve = aBasisSurf->VIso(aMidV); + if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle)) + { + theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + } + else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve)) + { + Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve); + aFirstU = aTrimmedCurve->FirstParameter(); + aLastU = aTrimmedCurve->LastParameter(); + if (aTrimmedCurve->BasisCurve()->DynamicType() == STANDARD_TYPE (Geom_Circle)) + { + theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve->BasisCurve())->Circ(); + } + } + else + { + // Compute a circle from 3 points on "aCurve" + gp_Pnt aP1, aP2; + aSurf1.D0 (aFirstU, aMidV, aP1); + aSurf1.D0 (aLastU, aMidV, aP2); + GC_MakeCircle aMkCirc (aP1, aCurPos, aP2); + theCircle = aMkCirc.Value()->Circ(); + } + + aFirstPoint = ElCLib::Value (aFirstU, theCircle); + aLastPoint = ElCLib::Value (aLastU, theCircle); + } + break; + } + case TopAbs_WIRE: + { + TopoDS_Edge anEdge; + TopExp_Explorer anIt (theShape, TopAbs_EDGE); + if (anIt.More()) + { + anEdge = TopoDS::Edge (anIt.Current()); + } + if (!PrsDim_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + break; + } + case TopAbs_EDGE: + { + TopoDS_Edge anEdge = TopoDS::Edge (theShape); + if (!PrsDim_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + break; + } + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + case TopAbs_SOLID: + case TopAbs_SHELL: + case TopAbs_VERTEX: + case TopAbs_SHAPE: + default: + return Standard_False; + } + + theIsClosed = aFirstPoint.IsEqual (aLastPoint, Precision::Confusion()); + + gp_Pnt aCenter = theCircle.Location(); + + if (theIsClosed) // Circle + { + gp_Dir anXDir = theCircle.XAxis().Direction(); + theMiddleArcPoint = aCenter.Translated (gp_Vec (anXDir) * theCircle.Radius()); + } + else // Arc + { + aFirstParam = ElCLib::Parameter (theCircle, aFirstPoint); + aLastParam = ElCLib::Parameter (theCircle, aLastPoint); + if (aFirstParam > aLastParam) + { + aFirstParam -= 2.0 * M_PI; + } + + Standard_Real aParCurPos = (aFirstParam + aLastParam) * 0.5; + gp_Vec aVec = gp_Vec (aCenter, ElCLib::Value (aParCurPos, theCircle)).Normalized () * theCircle.Radius (); + theMiddleArcPoint = aCenter.Translated (aVec); + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) +{ + if (!mySelectionGeom.IsComputed) + { + return; + } + + PrsDim_DimensionSelectionMode aSelectionMode = (PrsDim_DimensionSelectionMode)theMode; + + // init appropriate entity owner + Handle(SelectMgr_EntityOwner) aSensitiveOwner; + + switch (aSelectionMode) + { + // neutral selection owner + case PrsDim_DimensionSelectionMode_All: + aSensitiveOwner = new SelectMgr_EntityOwner (this, THE_NEUTRAL_SEL_PRIORITY); + break; + + // local selection owners + case PrsDim_DimensionSelectionMode_Line: + case PrsDim_DimensionSelectionMode_Text: + aSensitiveOwner = new PrsDim_DimensionOwner (this, aSelectionMode, THE_LOCAL_SEL_PRIORITY); + break; + } + + if (aSelectionMode == PrsDim_DimensionSelectionMode_All || aSelectionMode == PrsDim_DimensionSelectionMode_Line) + { + // sensitives for dimension line segments + Handle(Select3D_SensitiveGroup) aGroupOfSensitives = new Select3D_SensitiveGroup (aSensitiveOwner); + + SelectionGeometry::SeqOfCurves::Iterator aCurveIt (mySelectionGeom.DimensionLine); + for (; aCurveIt.More(); aCurveIt.Next()) + { + const SelectionGeometry::HCurve& aCurveData = aCurveIt.Value(); + + TColgp_Array1OfPnt aSensitivePnts (1, aCurveData->Length()); + for (Standard_Integer aPntIt = 1; aPntIt <= aCurveData->Length(); ++aPntIt) + { + aSensitivePnts.ChangeValue (aPntIt) = aCurveData->Value (aPntIt); + } + + aGroupOfSensitives->Add (new Select3D_SensitiveCurve (aSensitiveOwner, aSensitivePnts)); + } + + Standard_Real anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); + Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); + + // sensitives for arrows + SelectionGeometry::SeqOfArrows::Iterator anArrowIt (mySelectionGeom.Arrows); + for (; anArrowIt.More(); anArrowIt.Next()) + { + const SelectionGeometry::HArrow& anArrow = anArrowIt.Value(); + + gp_Pnt aSidePnt1 (gp::Origin()); + gp_Pnt aSidePnt2 (gp::Origin()); + const gp_Dir& aPlane = GetPlane().Axis().Direction(); + const gp_Pnt& aPeak = anArrow->Position; + const gp_Dir& aDir = anArrow->Direction; + + // compute points for arrow in plane + PointsForArrow (aPeak, aDir, aPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); + + aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); + + if (!myDrawer->DimensionAspect()->IsArrows3d()) + { + continue; + } + + // compute points for orthogonal sensitive plane + gp_Dir anOrthoPlane = anArrow->Direction.Crossed (aPlane); + + PointsForArrow (aPeak, aDir, anOrthoPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); + + aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); + } + + theSelection->Add (aGroupOfSensitives); + } + + // sensitives for text element + if (aSelectionMode == PrsDim_DimensionSelectionMode_All || aSelectionMode == PrsDim_DimensionSelectionMode_Text) + { + Handle(Select3D_SensitiveEntity) aTextSensitive; + + gp_Ax2 aTextAxes (mySelectionGeom.TextPos, + GetPlane().Axis().Direction(), + mySelectionGeom.TextDir); + + if (myDrawer->DimensionAspect()->IsText3d()) + { + // sensitive planar rectangle for text + Standard_Real aDx = mySelectionGeom.TextWidth * 0.5; + Standard_Real aDy = mySelectionGeom.TextHeight * 0.5; + + gp_Trsf aLabelPlane; + aLabelPlane.SetTransformation (aTextAxes, gp::XOY()); + + TColgp_Array1OfPnt aRectanglePoints(1, 4); + aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); + + Poly_Array1OfTriangle aTriangles(1, 2); + aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3); + aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4); + + Handle(Poly_Triangulation) aRectanglePoly = + new Poly_Triangulation(aRectanglePoints, aTriangles); + + aTextSensitive = + new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True); + } + else + { + gp_Circ aTextGeom (aTextAxes, mySelToleranceForText2d != 0.0 + ? mySelToleranceForText2d : 1.0); + + Handle(Geom_Circle) aSensGeom = new Geom_Circle (aTextGeom); + + aTextSensitive = new Select3D_SensitiveCircle (aSensitiveOwner, aSensGeom, Standard_True); + } + + theSelection->Add (aTextSensitive); + } + + // callback for flyout sensitive calculation + if (aSelectionMode == PrsDim_DimensionSelectionMode_All) + { + ComputeFlyoutSelection (theSelection, aSensitiveOwner); + } +} + +//======================================================================= +//function : PointsForArrow +//purpose : +//======================================================================= +void PrsDim_Dimension::PointsForArrow (const gp_Pnt& thePeakPnt, + const gp_Dir& theDirection, + const gp_Dir& thePlane, + const Standard_Real theArrowLength, + const Standard_Real theArrowAngle, + gp_Pnt& theSidePnt1, + gp_Pnt& theSidePnt2) +{ + gp_Lin anArrowLin (thePeakPnt, theDirection.Reversed()); + gp_Pnt anArrowEnd = ElCLib::Value (theArrowLength, anArrowLin); + gp_Lin anEdgeLin (anArrowEnd, theDirection.Crossed (thePlane)); + + Standard_Real anEdgeLength = Tan (theArrowAngle) * theArrowLength; + + theSidePnt1 = ElCLib::Value ( anEdgeLength, anEdgeLin); + theSidePnt2 = ElCLib::Value (-anEdgeLength, anEdgeLin); +} + +//======================================================================= +//function : GetTextPositionForLinear +//purpose : +//======================================================================= +gp_Pnt PrsDim_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide) const +{ + if (!IsValid()) + { + return gp::Origin(); + } + + gp_Pnt aTextPosition (gp::Origin()); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // Get label alignment and arrow orientation. + Standard_Integer aLabelPosition = 0; + Standard_Boolean isArrowsExternal = Standard_False; + FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, + aDimensionAspect->TextHorizontalPosition(), + aLabelPosition, isArrowsExternal); + + // Compute dimension line points. + gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); + gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); + + // Compute flyout direction vector + gp_Dir aFlyoutVector = aPlaneNormal ^ gp_Dir (aTargetPointsVec); + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + // Get flyout end points + gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + // Get text position. + switch (aLabelPosition & LabelPosition_HMask) + { + case LabelPosition_Left: + { + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * -anOffset; + aTextPosition = aLineEndPoint.Translated (anExtensionVec); + } + break; + case LabelPosition_Right: + { + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * anOffset; + aTextPosition = aLineBegPoint.Translated (anExtensionVec); + } + break; + case LabelPosition_HCenter: + { + aTextPosition = (aLineBegPoint.XYZ() + aLineEndPoint.XYZ()) * 0.5; + } + break; + } + + return aTextPosition; +} + +//======================================================================= +//function : AdjustParametersForLinear +//purpose : +//======================================================================= +Standard_Boolean PrsDim_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout, + gp_Pln& thePlane, + Standard_Boolean& theIsPlaneOld) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); + + // Don't set new plane if the text position lies on the attachment points line. + gp_Lin aTargetPointsLin (theFirstPoint, aTargetPointsDir); + if (!aTargetPointsLin.Contains (theTextPos, Precision::Confusion())) + { + //Set new automatic plane. + thePlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint); + theIsPlaneOld = Standard_False; + } + + // Compute flyout direction vector. + gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); + gp_Dir aPositiveFlyout = aPlaneNormal ^ aTargetPointsDir; + + // Additional check of collinearity of the plane normal and attachment points vector. + if (aPlaneNormal.IsParallel (aTargetPointsDir, Precision::Angular())) + { + return Standard_False; + } + + // Set flyout. + gp_Vec aFirstToTextVec (theFirstPoint, theTextPos); + + Standard_Real aCos = aFirstToTextVec.Normalized() * gp_Vec (aTargetPointsDir); + + gp_Pnt aTextPosProj = theFirstPoint.Translated + (gp_Vec (aTargetPointsDir) * aFirstToTextVec.Magnitude() * aCos); + + // Compute flyout value and direction. + gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos); + + theFlyout = 0.0; + if (aFlyoutVector.Magnitude() > Precision::Confusion()) + { + theFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular()) + ? -aFlyoutVector.Magnitude() + : aFlyoutVector.Magnitude(); + } + + // Compute attach points (through which main dimension line passes). + gp_Pnt aFirstAttach = theFirstPoint.Translated (aFlyoutVector); + gp_Pnt aSecondAttach = theSecondPoint.Translated (aFlyoutVector); + + // Set horizontal text alignment. + if (aCos < 0.0) + { + theAlignment = Prs3d_DTHP_Left; + + Standard_Real aNewExtSize = theTextPos.Distance (aFirstAttach) - anArrowLength; + theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; + } + else if (aTextPosProj.Distance (theFirstPoint) > theFirstPoint.Distance (theSecondPoint)) + { + theAlignment = Prs3d_DTHP_Right; + + Standard_Real aNewExtSize = theTextPos.Distance (aSecondAttach) - anArrowLength; + theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; + } + else + { + theAlignment = Prs3d_DTHP_Center; + } + return Standard_True; +} + +//======================================================================= +//function : FitTextAlignmentForLinear +//purpose : +//======================================================================= +void PrsDim_Dimension::FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide, + const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const +{ + theLabelPosition = LabelPosition_None; + theIsArrowsExternal = Standard_False; + + // Compute dimension line points + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + + // compute flyout direction vector + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // For extensions we need to know arrow size, text size and extension size: get it from aspect + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // Add margins to cut dimension lines for 3d text + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // Handle user-defined and automatic arrow placement + switch (aDimensionAspect->ArrowOrientation()) + { + case Prs3d_DAO_External: theIsArrowsExternal = true; break; + case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; + case Prs3d_DAO_Fit: + { + // Add margin to ensure a small tail between text and arrow + Standard_Real anArrowMargin = aDimensionAspect->IsText3d() + ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN + : 0.0; + + Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); + Standard_Real anArrowsWidth = theIsOneSide + ? anArrowLength + anArrowMargin + : (anArrowLength + anArrowMargin) * 2.0; + + theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; + break; + } + } + + // Handle user-defined and automatic text placement + switch (theHorizontalTextPos) + { + case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; + case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; + case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; + case Prs3d_DTHP_Fit: + { + Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); + Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength; + Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; + + theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; + break; + } + } + + // Handle vertical text placement options + switch (aDimensionAspect->TextVerticalPosition()) + { + case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; + case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; + case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; + } +} + +//======================================================================= +//function : UnsetFixedTextPosition +//purpose : +//======================================================================= +void PrsDim_Dimension::UnsetFixedTextPosition() +{ + myIsTextPositionFixed = Standard_False; + myFixedTextPosition = gp::Origin(); +} diff --git a/src/PrsDim/PrsDim_Dimension.hxx b/src/PrsDim/PrsDim_Dimension.hxx new file mode 100644 index 0000000000..769d015f59 --- /dev/null +++ b/src/PrsDim/PrsDim_Dimension.hxx @@ -0,0 +1,697 @@ +// Created on: 2013-11-11 +// Created by: Anastasia BORISOVA +// Copyright (c) 2013-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. + +#ifndef _PrsDim_Dimension_HeaderFile +#define _PrsDim_Dimension_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_Dimension, AIS_InteractiveObject) + +//! PrsDim_Dimension is a base class for 2D presentations of linear (length, diameter, radius) +//! and angular dimensions. +//! +//! The dimensions provide measurement of quantities, such as lengths or plane angles. +//! The measurement of dimension "value" is done in model space "as is". +//! These "value" are said to be represented in "model units", which can be specified by user. +//! During the display the measured value converted from "model units" to "display units". +//! The display and model units are stored in common Prs3d_Drawer (drawer of the context) +//! to share it between all dimensions. +//! The specified by user units are stored in the dimension's drawer. +//! +//! As a drawing, the dimension is composed from the following components: +//! - Attachment (binding) points. The points where the dimension lines attaches to, for +//! length dimensions the distances are measured between these points. +//! - Main dimension line. The which extends from the attachment points in "up" direction, +//! and which contains text label on it with value string. +//! - Flyouts. The lines connecting the attachment points with main dimension line. +//! - Extension. The lines used to extend the main dimension line in the cases when text +//! or arrows do not fit into the main dimension line due to their size. +//! - Arrows. +//! +//!
+//!  Linear dimensions:
+//!
+//!  extension
+//!   line                                     arrow
+//!       -->|------- main dimension line -------|<--
+//!          |                                   |
+//!          |flyout                       flyout|
+//!          |                                   |
+//!          +-----------------------------------+
+//! attachment                                attachment
+//!  point                                       point
+//!
+//!  Angular dimensions:
+//!
+//!                  extension
+//!                     line
+//!                        -->|+++++
+//!                     arrow |     +++
+//!                           |        90(deg) - main dimension line
+//!                    flyout |         +++
+//!                           |           +
+//!                           o---flyout---
+//!                         center         ^ 
+//!                         point          | extension
+//!                                          line
+//! 
+//! +//! Being a 2D drawings, the dimensions are created on imaginary plane, called "dimension plane", +//! which can be thought of as reference system of axes (X,Y,N) for constructing the presentation. +//! +//! The role of axes of the dimension plane is to guide you through the encapsualted automations +//! of presentation building to help you understand how is the presentation will look and how it +//! will be oriented in model space during construction. +//! +//! Orientation of dimension line in model space relatively to the base shapes is defined +//! with the flyouts. Flyouts specify length of flyout lines and their orientation relatively +//! to the attachment points on the working plane. +//! For linear dimensions: +//! Direction of flyouts is specified with direction of main dimension line +//! (vector from the first attachment to the second attachment) and the normal of the dimension plane. +//! Positive direction of flyouts is defined by vector multiplication: AttachVector * PlaneNormal. +//! For angular dimensions: +//! Flyouts are defined by vectors from the center point to the attachment points. +//! These vectors directions are supposed to be the positive directions of flyouts. +//! Negative flyouts directions means that these vectors should be reversed +//! (and dimension will be built out of the angle constructed with center and two attach points). +//! +//! The dimension plane can be constructed automatically by application (where possible, +//! it depends on the measured geometry). +//! It can be also set by user. However, if the user-defined plane does not fit the +//! geometry of the dimension (attach points do not belong to it), the dimension could not +//! be built. +//! If it is not possible to compute automatic plane (for example, in case of length between +//! two points) the user is supposed to specify the custom plane. +//! +//! Since the dimensions feature automated construction procedures from an arbitrary shapes, +//! the interfaces to check the validness are also implemented. Once the measured geometry is +//! specified, the one can inquire the validness status by calling "IsValid()" method. If the result +//! is TRUE, then all of public parameters should be pre-computed and ready. The presentation +//! should be also computable. Otherwise, the parameters may return invalid values. In this case, +//! the presentation will not be computed and displayed. +//! +//! The dimension support two local selection modes: main dimension line selection and text label +//! selection. These modes can be used to develop interactive modification of dimension presentations. +//! The component highlighting in these selection modes is provided by PrsDim_DimensionOwner class. +//! Please note that selection is unavailable until the presentation is computed. +//! +//! The specific drawing attributes are controlled through Prs3d_DimensionAspect. The one can change +//! color, arrows, text and arrow style and specify positioning of value label by setting corresponding +//! values to the aspect. +//! +//! Such set of parameters that consists of: +//! - flyout size and direction, +//! - user-defined dimension plane, +//! - horizontal and vertical text alignment +//! can be uniquely replaced with text position in 3d space. Therefore, there are methods to convert +//! this set of parameters to the text position and vice versa: +//! +//! - If the fixed text position is defined by user, called SetTextPosition (theTextPos) method converts +//! this 3d point to the set of parameters including adjusting of the dimension plane (this plane will be +//! automatic plane, NOT user-defined one). +//! If the fixed text position is set, the flag myIsFixedTextPosition is set to TRUE. +//! ATTENSION! myIsFixedTextPosition fixes all parameters of the set from recomputing inside +//! SetMeasureGeometry() methods. Parameters in dimension aspect (they are horizontal text position +//! and extension size) are adjusted on presentation computing step, user-defined values in +//! dimension aspect are not changed. +//! But plane and flyout as dimension position parameters are changed by SetTextPosition() method +//! according with user-defined text position. +//! If parameters from the set are changed by user with calls of setters, it leads to disabling of +//! fixed text position (myIsFixedTextPosition is set to FALSE). +//! If the fixed text position is set and geometry is changed by user (SetMeasureGeometry() method +//! is called) and the geometry doesn't satisfy computed dimension plane, the dimension is not valid. +//! +//! - If the set of parameters was set by user (may be without the user-defined plane or with it), +//! it can be converted to the text position by calling the method GetTextPosition(). In this case +//! the text position is NOT fixed, and SetMeasureGeometry() without user-defined plane adjusts +//! the automatic plane according input geometry (if it is possible). +class PrsDim_Dimension : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Dimension, AIS_InteractiveObject) +protected: + + //! Geometry type defines type of shapes on which the dimension is to be built. + //! Some type of geometry allows automatic plane computing and + //! can be built without user-defined plane + //! Another types can't be built without user-defined plane. + enum GeometryType + { + GeometryType_UndefShapes, + GeometryType_Edge, + GeometryType_Face, + GeometryType_Points, + GeometryType_Edges, + GeometryType_Faces, + GeometryType_EdgeFace, + GeometryType_EdgeVertex + }; + + //! Specifies supported at base level horizontal and vertical + //! label positions for drawing extension lines and centered text. + enum LabelPosition + { + LabelPosition_None = 0x00, + + LabelPosition_Left = 0x01, + LabelPosition_Right = 0x02, + LabelPosition_HCenter = 0x04, + LabelPosition_HMask = LabelPosition_Left | LabelPosition_Right | LabelPosition_HCenter, + + LabelPosition_Above = 0x10, + LabelPosition_Below = 0x20, + LabelPosition_VCenter = 0x40, + LabelPosition_VMask = LabelPosition_Above | LabelPosition_Below | LabelPosition_VCenter + }; + + enum ValueType + { + ValueType_Computed, + ValueType_CustomReal, + ValueType_CustomText + }; + +public: + + //! Specifies supported presentation compute modes. + //! Used to compute only parts of presentation for + //! advanced highlighting. + enum ComputeMode + { + ComputeMode_All = 0, //!< "0" is reserved as neutral mode + ComputeMode_Line = 1, //!< corresponds to selection mode + ComputeMode_Text = 2 //!< corresponds to selection mode + }; + +public: + + //! Constructor with default parameters values. + //! @param theType [in] the type of dimension. + Standard_EXPORT PrsDim_Dimension (const PrsDim_KindOfDimension theType); + + //! Gets dimension measurement value. If the value to display is not + //! specified by user, then the dimension object is responsible to + //! compute it on its own in model space coordinates. + //! @return the dimension value (in model units) which is used + //! during display of the presentation. + Standard_Real GetValue() const + { + return myValueType == ValueType_CustomReal ? myCustomValue : ComputeValue(); + } + + //! Sets computed dimension value. Resets custom value mode if it was set. + void SetComputedValue () + { + myValueType = ValueType_Computed; + } + + //! Sets user-defined dimension value. + //! The user-defined dimension value is specified in model space, + //! and affect by unit conversion during the display. + //! @param theValue [in] the user-defined value to display. + Standard_EXPORT void SetCustomValue (const Standard_Real theValue); + + //! Sets user-defined dimension value. + //! Unit conversion during the display is not applyed. + //! @param theValue [in] the user-defined value to display. + Standard_EXPORT void SetCustomValue (const TCollection_ExtendedString& theValue); + + //! Gets user-defined dimension value. + //! @return dimension value string. + const TCollection_ExtendedString& GetCustomValue() const { return myCustomStringValue; } + + //! Get the dimension plane in which the 2D dimension presentation is computed. + //! By default, if plane is not defined by user, it is computed automatically + //! after dimension geometry is computed. + //! If computed dimension geometry (points) can't be placed on the user-defined + //! plane, dimension geometry was set as invalid (validity flag is set to false) + //! and dimension presentation will not be computed. + //! If user-defined plane allow geometry placement on it, it will be used for + //! computing of the dimension presentation. + //! @return dimension plane used for presentation computing. + const gp_Pln& GetPlane() const { return myPlane; } + + //! Geometry type defines type of shapes on which the dimension is to be built. + //! @return type of geometry on which the dimension will be built. + Standard_Integer GetGeometryType () const { return myGeometryType; } + + //! Sets user-defined plane where the 2D dimension presentation will be placed. + //! Checks validity of this plane if geometry has been set already. + //! Validity of the plane is checked according to the geometry set + //! and has different criteria for different kinds of dimensions. + Standard_EXPORT virtual void SetCustomPlane (const gp_Pln& thePlane); + + //! Unsets user-defined plane. Therefore the plane for dimension will be + //! computed automatically. + void UnsetCustomPlane() { myIsPlaneCustom = Standard_False; } + + //! @return TRUE if text position is set by user with method SetTextPosition(). + Standard_Boolean IsTextPositionCustom() const + { + return myIsTextPositionFixed; + } + + //! Fixes the absolute text position and adjusts flyout, plane and text alignment + //! according to it. Updates presentation if the text position is valid. + //! ATTENTION! It does not change vertical text alignment. + //! @param theTextPos [in] the point of text position. + virtual void SetTextPosition (const gp_Pnt& /*theTextPos*/) { } + + //! Computes absolute text position from dimension parameters + //! (flyout, plane and text alignment). + virtual gp_Pnt GetTextPosition () const { return gp_Pnt(); } + +public: + + //! Gets the dimension aspect from AIS object drawer. + //! Dimension aspect contains aspects of line, text and arrows for dimension presentation. + Handle(Prs3d_DimensionAspect) DimensionAspect() const + { + return myDrawer->DimensionAspect(); + } + + //! Sets new dimension aspect for the interactive object drawer. + //! The dimension aspect provides dynamic properties which are generally + //! used during computation of dimension presentations. + Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect); + + //! @return the kind of dimension. + PrsDim_KindOfDimension KindOfDimension() const { return myKindOfDimension; } + + //! @return the kind of interactive. + virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Dimension; } + + //! Returns true if the class of objects accepts the display mode theMode. + //! The interactive context can have a default mode of representation for + //! the set of Interactive Objects. This mode may not be accepted by object. + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE + { + return theMode == ComputeMode_All; + } + +public: + + //! @return dimension special symbol display options. + PrsDim_DisplaySpecialSymbol DisplaySpecialSymbol() const { return myDisplaySpecialSymbol; } + + //! Specifies whether to display special symbol or not. + Standard_EXPORT void SetDisplaySpecialSymbol (const PrsDim_DisplaySpecialSymbol theDisplaySpecSymbol); + + //! @return special symbol. + Standard_ExtCharacter SpecialSymbol() const + { + return mySpecialSymbol; + } + + //! Specifies special symbol. + Standard_EXPORT void SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol); + + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const; + + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const; + + virtual void SetDisplayUnits (const TCollection_AsciiString& /*theUnits*/) { } + + virtual void SetModelUnits (const TCollection_AsciiString& /*theUnits*/) { } + + //! Unsets user defined text positioning and enables text positioning + //! by other parameters: text alignment, extension size, flyout and custom plane. + Standard_EXPORT void UnsetFixedTextPosition(); + +public: + + //! Returns selection tolerance for text2d: + //! For 2d text selection detection sensitive point with tolerance is used + //! Important! Only for 2d text. + Standard_Real SelToleranceForText2d() const + { + return mySelToleranceForText2d; + } + + //! Sets selection tolerance for text2d: + //! For 2d text selection detection sensitive point with tolerance is used + //! to change this tolerance use this method + //! Important! Only for 2d text. + Standard_EXPORT void SetSelToleranceForText2d (const Standard_Real theTol); + + //! @return flyout value for dimension. + Standard_Real GetFlyout() const + { + return myFlyout; + } + + //! Sets flyout value for dimension. + Standard_EXPORT void SetFlyout (const Standard_Real theFlyout); + + //! Check that the input geometry for dimension is valid and the + //! presentation can be successfully computed. + //! @return TRUE if dimension geometry is ok. + virtual Standard_Boolean IsValid() const + { + return myIsGeometryValid && CheckPlane (GetPlane()); + } + +protected: + + Standard_EXPORT Standard_Real ValueToDisplayUnits() const; + + //! Get formatted value string and its model space width. + //! @param theWidth [out] the model space with of the string. + //! @return formatted dimension value string. + Standard_EXPORT TCollection_ExtendedString GetValueString (Standard_Real& theWidth) const; + + //! Performs drawing of 2d or 3d arrows on the working plane + //! @param theLocation [in] the location of the arrow tip. + //! @param theDirection [in] the direction from the tip to the bottom of the arrow. + Standard_EXPORT void DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theLocation, + const gp_Dir& theDirection); + + //! Performs drawing of 2d or 3d text on the working plane + //! @param theTextPos [in] the position of the text label. + //! @param theTestDir [in] the direction of the text label. + //! @param theText [in] the text label string. + //! @param theLabelPosition [in] the text label vertical and horizontal positioning option + //! respectively to the main dimension line. + //! @return text width relative to the dimension working plane. For 2d text this value will be zero. + Standard_EXPORT void drawText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theTextPos, + const gp_Dir& theTextDir, + const TCollection_ExtendedString& theText, + const Standard_Integer theLabelPosition); + + //! Performs computing of dimension linear extension with text + //! @param thePresentation [in] the presentation to fill with graphical primitives. + //! @param theExtensionSize [in] the size of extension line. + //! @param theExtensionStart [in] the point where extension line connects to dimension. + //! @param theExtensionDir [in] the direction of extension line. + //! @param theLabelString [in] the string with value. + //! @param theLabelWidth [in] the geometrical width computed for value string. + //! @param theMode [in] the display mode. + //! @param theLabelPosition [in] position flags for the text label. + Standard_EXPORT void DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Real theExtensionSize, + const gp_Pnt& theExtensionStart, + const gp_Dir& theExtensionDir, + const TCollection_ExtendedString& theLabelString, + const Standard_Real theLabelWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition); + + //! Performs computing of linear dimension (for length, diameter, radius and so on). + //! Please note that this method uses base dimension properties, like working plane + //! flyout length, drawer attributes. + //! @param thePresentation [in] the presentation to fill with primitives. + //! @param theMode [in] the presentation compute mode. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theIsOneSide [in] specifies whether the dimension has only one flyout line. + Standard_EXPORT void DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide = Standard_False); + + //! Computes points bounded the flyout line for linear dimension. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theLineBegPoint [out] the first attach point of linear dimension. + //! @param theLineEndPoint [out] the second attach point of linear dimension. + Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint); + + //! Compute selection sensitives for linear dimension flyout lines (length, diameter, radius). + //! Please note that this method uses base dimension properties: working plane and flyout length. + //! @param theSelection [in] the selection structure to fill with selection primitives. + //! @param theOwner [in] the selection entity owner. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + Standard_EXPORT void ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint); + + + //! Performs initialization of circle and middle arc point from the passed + //! shape which is assumed to contain circular geometry. + //! @param theShape [in] the shape to explore. + //! @param theCircle [out] the circle geometry. + //! @param theMiddleArcPoint [out] the middle point of the arc. + //! @param theIsClosed [out] returns TRUE if the geometry is closed circle. + //! @return TRUE if the the circle is successfully got from the input shape. + Standard_EXPORT Standard_Boolean InitCircularDimension (const TopoDS_Shape& theShape, + gp_Circ& theCircle, + gp_Pnt& theMiddleArcPoint, + Standard_Boolean& theIsClosed); + + //! Produce points for triangular arrow face. + //! @param thePeakPnt [in] the arrow peak position. + //! @param theDirection [in] the arrow direction. + //! @param thePlane [in] the face plane. + //! @param theArrowLength [in] the length of arrow. + //! @param theArrowAngle [in] the angle of arrow. + //! @param theSidePnt1 [out] the first side point. + //! @param theSidePnt2 [out] the second side point. + Standard_EXPORT void PointsForArrow (const gp_Pnt& thePeakPnt, + const gp_Dir& theDirection, + const gp_Dir& thePlane, + const Standard_Real theArrowLength, + const Standard_Real theArrowAngle, + gp_Pnt& theSidePnt1, + gp_Pnt& theSidePnt2); + + //! Compute point of text position for dimension parameters + //! for linear kinds of dimensions (length, radius, diameter). + Standard_EXPORT gp_Pnt GetTextPositionForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide = Standard_False) const; + + //! Fits text alignment relatively to the dimension line. + //! @param theFirstPoint [in] the first attachment point. + //! @param theSecondPoint [in] the second attachment point. + //! @param theIsOneSide [in] is the arrow displayed only on the one side of the dimension. + //! @param theHorizontalTextPos [in] the text horizontal position (alignment). + //! @param theLabelPosition [out] the label position, contains bits that defines + //! vertical and horizontal alignment. (for internal usage in count text position) + //! @param theIsArrowExternal [out] is the arrows external, + //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow + //! orientation automatically. + Standard_EXPORT void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide, + const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const; + + //! Adjusts aspect parameters according the text position: + //! extension size, vertical text alignment and flyout. + //! @param theTextPos [in] the user defined 3d point of text position + //! @param theFirstPoint [in] the first point of linear measurement. + //! @param theSecondPoint [in] the second point of linear measurement. + //! @param theExtensionSize [out] the adjusted extension size + //! @param theAlignment [out] the horizontal label alignment. + //! @param theFlyout [out] the adjusted value of flyout. + //! @param thePlane [out] the new plane that contains theTextPos and attachment points. + //! @param theIsPlaneOld [out] shows if new plane is computed. + Standard_EXPORT Standard_Boolean AdjustParametersForLinear (const gp_Pnt& theTextPos, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout, + gp_Pln& thePlane, + Standard_Boolean& theIsPlaneOld) const; + +protected: //! @name Static auxilliary methods for geometry extraction + + //! If it is possible extracts circle from planar face. + //! @param theFace [in] the planar face + //! @param theCurve [out] the circular curve + //! @param theFirstPoint [out] the point of the first parameter of the circlular curve + //! @param theSecondPoint [out] the point of the last parameter of the circlular curve + //! @return TRUE in case of successful circle extraction + static Standard_Boolean CircleFromPlanarFace (const TopoDS_Face& theFace, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint); + + //! If it is possible extracts circle from the edge. + //! @param theEdge [in] input edge to extract circle from + //! @param theCircle [out] circle + //! @param theFirstPoint [out] the point of the first parameter of the circlular curve + //! @param theSecondPoint [out] the point of the last parameter of the circlular curve + //! @return TRUE in case of successful circle extraction. + static Standard_Boolean CircleFromEdge (const TopoDS_Edge& theEdge, + gp_Circ& theCircle, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint); + +protected: //! @name Behavior to implement + + //! Override this method to check if user-defined plane + //! is valid for the dimension geometry. + //! @param thePlane [in] the working plane for positioning every + //! dimension in the application. + //! @return true is the plane is suitable for building dimension + //! with computed dimension geometry. + virtual Standard_Boolean CheckPlane (const gp_Pln& /*thePlane*/) const { return Standard_True; } + + //! Override this method to computed value of dimension. + //! @return value from the measured geometry. + virtual Standard_Real ComputeValue() const + { + return 0.0; + } + + //! Override this method to compute selection primitives for + //! flyout lines (if the dimension provides it). + //! This callback is a only a part of base selection + //! computation routine. + virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)&, + const Handle(SelectMgr_EntityOwner)&) {} + + + //! Base procedure of computing selection (based on selection geometry data). + //! @param theSelection [in] the selection structure to will with primitives. + //! @param theMode [in] the selection mode. + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) Standard_OVERRIDE; + +protected: //! @name Selection geometry + + //! Selection geometry of dimension presentation. The structure is filled with data + //! during compute of presentation, then this data is used to generate selection + //! sensitives when computing selection. + struct SelectionGeometry + { + //! Arrows are represented by directed triangles. + struct Arrow + { + gp_Pnt Position; + gp_Dir Direction; + }; + typedef NCollection_Sequence Curve; + typedef NCollection_Handle HCurve; + typedef NCollection_Handle HArrow; + typedef NCollection_Sequence SeqOfCurves; + typedef NCollection_Sequence SeqOfArrows; + + gp_Pnt TextPos; //!< Center of text label. + gp_Dir TextDir; //!< Direction of text label. + Standard_Real TextWidth; //!< Width of text label. + Standard_Real TextHeight; //!< Height of text label. + SeqOfCurves DimensionLine; //!< Sequence of points for composing the segments of dimension line. + SeqOfArrows Arrows; //!< Sequence of arrow geometries. + Standard_Boolean IsComputed; //!< Shows if the selection geometry was filled. + + public: + + //! Clear geometry of sensitives for the specified compute mode. + //! @param theMode [in] the compute mode to clear. + void Clear (const Standard_Integer theMode) + { + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + DimensionLine.Clear(); + Arrows.Clear(); + } + + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + TextPos = gp::Origin(); + TextDir = gp::DX(); + TextWidth = 0.0; + TextHeight = 0.0; + } + + IsComputed = Standard_False; + } + + //! Add new curve entry and return the reference to populate it. + Curve& NewCurve() + { + DimensionLine.Append( new Curve ); + HCurve& aLastCurve = DimensionLine.ChangeLast(); + return *aLastCurve; + } + + //! Add new arrow entry and return the reference to populate it. + Arrow& NewArrow() + { + Arrows.Append( new Arrow ); + HArrow& aLastArrow = Arrows.ChangeLast(); + return *aLastArrow; + } + } mySelectionGeom; + + Standard_Real mySelToleranceForText2d; //!< Sensitive point tolerance for 2d text selection. + +protected: //! @name Value properties + + ValueType myValueType; //! type of value (computed or user-defined) + Standard_Real myCustomValue; //!< Value of the dimension (computed or user-defined). + + TCollection_ExtendedString myCustomStringValue; //!< Value of the dimension (computed or user-defined). + +protected: //! @name Fixed text position properties + + gp_Pnt myFixedTextPosition; //!< Stores text position fixed by user. + Standard_Boolean myIsTextPositionFixed; //!< Is the text label position fixed by user. + +protected: //! @name Units properties + + Standard_ExtCharacter mySpecialSymbol; //!< Special symbol. + PrsDim_DisplaySpecialSymbol myDisplaySpecialSymbol; //!< Special symbol display options. + +protected: //! @name Geometrical properties + + GeometryType myGeometryType; //!< defines type of shapes on which the dimension is to be built. + + gp_Pln myPlane; //!< Plane where dimension will be built (computed or user defined). + Standard_Boolean myIsPlaneCustom; //!< Is plane defined by user (otherwise it will be computed automatically). + Standard_Real myFlyout; //!< Flyout distance. + Standard_Boolean myIsGeometryValid; //!< Is dimension geometry properly defined. + +private: + + PrsDim_KindOfDimension myKindOfDimension; +}; + +#endif // _PrsDim_Dimension_HeaderFile diff --git a/src/PrsDim/PrsDim_DimensionOwner.cxx b/src/PrsDim/PrsDim_DimensionOwner.cxx new file mode 100644 index 0000000000..1a3f83103c --- /dev/null +++ b/src/PrsDim/PrsDim_DimensionOwner.cxx @@ -0,0 +1,97 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_DimensionOwner, SelectMgr_EntityOwner) + +namespace +{ + //======================================================================= + //function : HighlightMode + //purpose : Return corresponding compute mode for selection type. + //======================================================================= + static PrsDim_Dimension::ComputeMode HighlightMode (const Standard_Integer theSelMode) + { + switch (theSelMode) + { + case PrsDim_DimensionSelectionMode_Line: return PrsDim_Dimension::ComputeMode_Line; + case PrsDim_DimensionSelectionMode_Text: return PrsDim_Dimension::ComputeMode_Text; + default: + return PrsDim_Dimension::ComputeMode_All; + } + } +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DimensionOwner::PrsDim_DimensionOwner (const Handle(SelectMgr_SelectableObject)& theSelObject, + const PrsDim_DimensionSelectionMode theMode, + const Standard_Integer thePriority) +: SelectMgr_EntityOwner(theSelObject, thePriority), + mySelectionMode (theMode) +{ +} + +//======================================================================= +//function : IsHilighted +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DimensionOwner::IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, + const Standard_Integer /*theMode*/) const +{ + if (!HasSelectable()) + { + return Standard_False; + } + + return thePM->IsHighlighted (Selectable(), HighlightMode (mySelectionMode)); +} + +//======================================================================= +//function : Unhilight +//purpose : +//======================================================================= +void PrsDim_DimensionOwner::Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, + const Standard_Integer /*theMode*/) +{ + if (!HasSelectable()) + { + return; + } + + thePM->Unhighlight (Selectable()); +} + +//======================================================================= +//function : HilightWithColor +//purpose : +//======================================================================= +void PrsDim_DimensionOwner::HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Standard_Integer /*theMode*/) +{ + thePM->Color (Selectable(), theStyle, HighlightMode (mySelectionMode)); +} diff --git a/src/PrsDim/PrsDim_DimensionOwner.hxx b/src/PrsDim/PrsDim_DimensionOwner.hxx new file mode 100644 index 0000000000..5ce4a42cea --- /dev/null +++ b/src/PrsDim/PrsDim_DimensionOwner.hxx @@ -0,0 +1,74 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_DimensionOwner_HeaderFile +#define _PrsDim_DimensionOwner_HeaderFile + +#include +#include + +#include +#include +#include +#include +#include +#include + +class SelectMgr_SelectableObject; +class PrsMgr_PresentationManager; + +DEFINE_STANDARD_HANDLE(PrsDim_DimensionOwner, SelectMgr_EntityOwner) + +//! The owner is the entity which makes it possible to link +//! the sensitive primitives and the reference shapes that +//! you want to detect. It stocks the various pieces of +//! information which make it possible to find objects. An +//! owner has a priority which you can modulate, so as to +//! make one entity more selectable than another. You +//! might want to make edges more selectable than +//! faces, for example. In that case, you could attribute sa +//! higher priority to the one compared to the other. An +//! edge, could have priority 5, for example, and a face, +//! priority 4. The default priority is 5. +class PrsDim_DimensionOwner : public SelectMgr_EntityOwner +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_DimensionOwner, SelectMgr_EntityOwner) +public: + + //! Initializes the dimension owner, theSO, and attributes it + //! the priority, thePriority. + Standard_EXPORT PrsDim_DimensionOwner(const Handle(SelectMgr_SelectableObject)& theSelObject, const PrsDim_DimensionSelectionMode theSelMode, const Standard_Integer thePriority = 0); + + PrsDim_DimensionSelectionMode SelectionMode() const { return mySelectionMode; } + + Standard_EXPORT virtual void HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + //! Returns true if an object with the selection mode + //! aMode is highlighted in the presentation manager aPM. + Standard_EXPORT virtual Standard_Boolean IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) const Standard_OVERRIDE; + + //! Removes highlighting from the selected part of dimension. + Standard_EXPORT virtual void Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) Standard_OVERRIDE; + +private: + + PrsDim_DimensionSelectionMode mySelectionMode; + +}; + +#endif // _AIS_DimensionOwner_HeaderFile diff --git a/src/PrsDim/PrsDim_DimensionSelectionMode.hxx b/src/PrsDim/PrsDim_DimensionSelectionMode.hxx new file mode 100644 index 0000000000..e519facce6 --- /dev/null +++ b/src/PrsDim/PrsDim_DimensionSelectionMode.hxx @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_DimensionSelectionMode_HeaderFile +#define _PrsDim_DimensionSelectionMode_HeaderFile + +//! Specifies dimension selection modes. +enum PrsDim_DimensionSelectionMode +{ + PrsDim_DimensionSelectionMode_All, + PrsDim_DimensionSelectionMode_Line, + PrsDim_DimensionSelectionMode_Text +}; + +#endif // _PrsDim_DimensionSelectionMode_HeaderFile diff --git a/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx b/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx new file mode 100644 index 0000000000..edef53ae58 --- /dev/null +++ b/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_DisplaySpecialSymbol_HeaderFile +#define _PrsDim_DisplaySpecialSymbol_HeaderFile + +//! Specifies dimension special symbol display options +enum PrsDim_DisplaySpecialSymbol +{ + PrsDim_DisplaySpecialSymbol_No, + PrsDim_DisplaySpecialSymbol_Before, + PrsDim_DisplaySpecialSymbol_After +}; + +#endif // _PrsDim_DisplaySpecialSymbol_HeaderFile diff --git a/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx b/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx new file mode 100644 index 0000000000..59262acf5e --- /dev/null +++ b/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx @@ -0,0 +1,273 @@ +// Created on: 1998-01-22 +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EllipseRadiusDimension, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EllipseRadiusDimension +//purpose : +//======================================================================= +PrsDim_EllipseRadiusDimension::PrsDim_EllipseRadiusDimension(const TopoDS_Shape& aShape, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aShape; + myText = aText; +// ComputeGeometry( ); +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeGeometry() +{ + + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // compute one face case + ComputeFaceGeometry (); + break; + } + case TopAbs_EDGE: + { + ComputeEdgeGeometry (); + break; + } + default: + break; + } + while (myFirstPar > 2*M_PI) myFirstPar -= 2*M_PI; + while (myLastPar > 2*M_PI) myLastPar -= 2*M_PI; + while (myFirstPar < 0.0) myFirstPar += 2*M_PI; + while (myLastPar < 0.0) myLastPar += 2*M_PI; +} + +//======================================================================= +//function : ComputeFaceGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeFaceGeometry() +{ + + gp_Pln aPln; + Handle( Geom_Surface ) aBasisSurf; + PrsDim_KindOfSurface aSurfType; + Standard_Real Offset; + PrsDim::GetPlaneFromFace( TopoDS::Face( myFShape), + aPln, + aBasisSurf, + aSurfType, + Offset ) ; + + if ( aSurfType == PrsDim_KOS_Plane ) + ComputePlanarFaceGeometry( ); + else + ComputeCylFaceGeometry( aSurfType, aBasisSurf, Offset ); + +} + +//======================================================================= +//function : ComputeCylFaceGeometry +//purpose : defines Ellipse and plane of dimension +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeCylFaceGeometry(const PrsDim_KindOfSurface aSurfType, + const Handle( Geom_Surface )& aBasisSurf, + const Standard_Real Offset) +{ + + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + Standard_Real vFirst, vLast; + vFirst = surf1.FirstVParameter(); + vLast = surf1.LastVParameter(); + Standard_Real vMid = (vFirst + vLast)*0.5; + gp_Pln aPlane; + gp_Ax1 Axis; +// Standard_Real Param; + if (aSurfType == PrsDim_KOS_Extrusion) + { + Axis.SetDirection((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) + ->Direction() ); + Axis.SetLocation( gp_Pnt((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) + ->Direction().XYZ() ) ); + + aPlane.SetAxis(Axis); + aPlane.SetLocation(myEllipse.Location()); + myPlane = new Geom_Plane(aPlane); + + Handle(Geom_Curve) aCurve; + aCurve = aBasisSurf->VIso(vMid); + if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)-> Elips();//gp_Elips + myIsAnArc = Standard_False; + } + else if (aCurve->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve)) { + Handle(Geom_TrimmedCurve) tCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve); + aCurve = tCurve->BasisCurve(); + myFirstPar = tCurve->FirstParameter(); + myLastPar = tCurve->LastParameter(); + myIsAnArc = Standard_True; + if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)->Elips();//gp_Elips + } + } + else + { + throw Standard_ConstructionError("PrsDim:: Not expected type of surface") ; + return; + } + +// Offset + + if(surf1.GetType() == GeomAbs_OffsetSurface) + { + if(Offset <0.0 && Abs(Offset) > myEllipse.MinorRadius ()) + { + throw Standard_ConstructionError("PrsDim:: Absolute value of negative offset is larger than MinorRadius"); + return; + } + + myOffsetCurve = new Geom_OffsetCurve(new Geom_Ellipse(myEllipse), Offset, + myPlane->Pln().Axis().Direction()); + myOffset = Offset; + myIsOffset = Standard_True; + gp_Elips elips = myEllipse; + Standard_Real Val = Offset + elips.MajorRadius ();//simulation + myEllipse.SetMajorRadius (Val); + Val = Offset + elips.MinorRadius (); + myEllipse.SetMinorRadius (Val); + } + else + myIsOffset = Standard_False; + } +} + + +//======================================================================= +//function : ComputePlanarFaceGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputePlanarFaceGeometry() +{ + + Standard_Boolean find = Standard_False; + gp_Pnt ptfirst,ptend; + TopExp_Explorer ExploEd( TopoDS::Face(myFShape), TopAbs_EDGE ); + for ( ; ExploEd.More(); ExploEd.Next()) + { + TopoDS_Edge curedge = TopoDS::Edge( ExploEd.Current() ); + Handle(Geom_Curve) curv; + Handle(Geom_Ellipse) ellips; + if (PrsDim::ComputeGeometry(curedge,curv,ptfirst,ptend)) + { + if (curv->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + ellips = Handle(Geom_Ellipse)::DownCast(curv); + if ( !ellips.IsNull() ) { + myEllipse = ellips->Elips(); + find = Standard_True; + break; + } + } + } + } + if( !find ) + { + throw Standard_ConstructionError("PrsDim:: Curve is not an ellipsee or is Null") ; + return; + } + + if ( !ptfirst.IsEqual(ptend, Precision::Confusion()) ) + { + myIsAnArc = Standard_True; + myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); + myLastPar = ElCLib::Parameter(myEllipse, ptend); + } + else + myIsAnArc = Standard_False; + + BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); + myPlane = new Geom_Plane( surfAlgo.Plane() ); + +} + +//======================================================================= +//function : ComputeEdgeGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeEdgeGeometry() +{ + gp_Pnt ptfirst,ptend; + Handle(Geom_Curve) curv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),curv,ptfirst,ptend)) return; + + Handle(Geom_Ellipse) elips = Handle(Geom_Ellipse)::DownCast(curv); + if ( elips.IsNull()) return; + + myEllipse = elips->Elips(); + gp_Pln aPlane; + aPlane.SetPosition(gp_Ax3(myEllipse.Position())); + myPlane = new Geom_Plane(aPlane); + + + if ( ptfirst.IsEqual(ptend, Precision::Confusion()) ) { + myIsAnArc = Standard_False; + } + else { + myIsAnArc = Standard_True; + myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); + myLastPar = ElCLib::Parameter(myEllipse, ptend); + } +} diff --git a/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx b/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx new file mode 100644 index 0000000000..d7f0eee586 --- /dev/null +++ b/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx @@ -0,0 +1,71 @@ +// Created on: 1998-01-22 +// 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. + +#ifndef _PrsDim_EllipseRadiusDimension_HeaderFile +#define _PrsDim_EllipseRadiusDimension_HeaderFile + +#include +#include +#include + +class Geom_OffsetCurve; +class TopoDS_Shape; +class TCollection_ExtendedString; +class Geom_Surface; + +DEFINE_STANDARD_HANDLE(PrsDim_EllipseRadiusDimension, PrsDim_Relation) + +//! Computes geometry ( basis curve and plane of dimension) +//! for input shape aShape from TopoDS +//! Root class for MinRadiusDimension and MaxRadiusDimension +class PrsDim_EllipseRadiusDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EllipseRadiusDimension, PrsDim_Relation) +public: + + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_ELLIPSERADIUS; } + + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + Standard_EXPORT void ComputeGeometry(); + +protected: + + Standard_EXPORT PrsDim_EllipseRadiusDimension(const TopoDS_Shape& aShape, const TCollection_ExtendedString& aText); + +protected: + + gp_Elips myEllipse; + Standard_Real myFirstPar; + Standard_Real myLastPar; + Standard_Boolean myIsAnArc; + Handle(Geom_OffsetCurve) myOffsetCurve; + Standard_Real myOffset; + Standard_Boolean myIsOffset; + +private: + + Standard_EXPORT void ComputeFaceGeometry(); + + Standard_EXPORT void ComputeCylFaceGeometry (const PrsDim_KindOfSurface aSurfType, const Handle(Geom_Surface)& aSurf, const Standard_Real Offset); + + Standard_EXPORT void ComputePlanarFaceGeometry(); + + Standard_EXPORT void ComputeEdgeGeometry(); + +}; + +#endif // _PrsDim_EllipseRadiusDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_EqualDistanceRelation.cxx b/src/PrsDim/PrsDim_EqualDistanceRelation.cxx new file mode 100644 index 0000000000..72c2868c3b --- /dev/null +++ b/src/PrsDim/PrsDim_EqualDistanceRelation.cxx @@ -0,0 +1,802 @@ +// Created on: 1998-01-24 +// Created by: Julia GERASIMOVA +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EqualDistanceRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EqualDistanceRelation +//purpose : +//======================================================================= +PrsDim_EqualDistanceRelation::PrsDim_EqualDistanceRelation( const TopoDS_Shape& aShape1, + const TopoDS_Shape& aShape2, + const TopoDS_Shape& aShape3, + const TopoDS_Shape& aShape4, + const Handle( Geom_Plane )& aPlane ) +: PrsDim_Relation() +{ + myFShape = aShape1; + mySShape = aShape2; + myShape3 = aShape3; + myShape4 = aShape4; + myPlane = aPlane; + + //Temporary + myArrowSize = 3.0; //set the concrete value + mySymbolPrs = DsgPrs_AS_BOTHAR; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, + const Handle( Prs3d_Presentation )& aPresentation, + const Standard_Integer ) +{ + gp_Pnt Position12 = myPosition, Position34 = myPosition; + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); +// -- ota -- begin + if (!myAutomaticPosition ){ + gp_Pnt aMiddle12 ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); + gp_Pnt aMiddle34 ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); + + if (myPosition.Distance(aMiddle12) > myPosition.Distance(aMiddle34)) + Position12.SetXYZ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); + else + Position34.SetXYZ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); + + } + + if (myFShape.ShapeType() == TopAbs_EDGE && mySShape.ShapeType() == TopAbs_EDGE) + PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, + myDrawer, + myArrowSize, + TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + + + else if (myFShape.ShapeType() == TopAbs_VERTEX && mySShape.ShapeType() == TopAbs_VERTEX) + PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, + myDrawer, + myArrowSize, + TopoDS::Vertex(myFShape), + TopoDS::Vertex(mySShape), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + PrsDim_TypeOfDist_Unknown, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + else + PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, + myDrawer, + myArrowSize, + myFShape, + mySShape, + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + + if (myShape3.ShapeType() == TopAbs_EDGE && myShape4.ShapeType() == TopAbs_EDGE) + PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, + myDrawer, + myArrowSize, + TopoDS::Edge(myShape3), + TopoDS::Edge(myShape4), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + else if (myShape3.ShapeType() == TopAbs_VERTEX && myShape4.ShapeType() == TopAbs_VERTEX) + PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, + myDrawer, + myArrowSize, + TopoDS::Vertex(myShape3), + TopoDS::Vertex(myShape4), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + PrsDim_TypeOfDist_Unknown, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + else + PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, + myDrawer, + myArrowSize, + myShape3, + myShape4, + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + DsgPrs_EqualDistancePresentation::Add( aPresentation, myDrawer, + myPoint1, myPoint2, myPoint3, myPoint4, myPlane ); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, + const Standard_Integer ) +{ + Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); + Handle( Select3D_SensitiveSegment ) seg; + + seg = new Select3D_SensitiveSegment( own, myPoint1, myPoint2 ); + aSelection->Add( seg ); + + seg = new Select3D_SensitiveSegment( own, myPoint3, myPoint4 ); + aSelection->Add( seg ); + + // Line between two middles + gp_Pnt Middle12( (myPoint1.XYZ() + myPoint2.XYZ()) * 0.5 ), + Middle34( (myPoint3.XYZ() + myPoint4.XYZ()) *0.5 ); + seg = new Select3D_SensitiveSegment( own, Middle12, Middle34 ); + aSelection->Add( seg ); + + gp_Pnt Middle((Middle12.XYZ() + Middle34.XYZ())*0.5); + Standard_Real SmallDist = .001; + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + Middle.X() - SmallDist, + Middle.Y() - SmallDist, + Middle.Z() - SmallDist, + Middle.X() + SmallDist, + Middle.Y() + SmallDist, + Middle.Z() + SmallDist ); + aSelection->Add(box); + + if (myFShape.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myFShape)); + if (aCurve.GetType() == GeomAbs_Line){ + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint1), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint1); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + //add sensetive arc + Handle(Select3D_SensitiveCircle) circ = + new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); + aSelection->Add( seg ); + } + + if (mySShape.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(mySShape)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint2), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint2); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + //add sensetive arc + Handle(Select3D_SensitiveCircle) circ = + new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); + aSelection->Add( seg ); + } + + if (myShape3.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape3)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint3), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint3); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + Handle(Select3D_SensitiveCircle) circ = + new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); + aSelection->Add( circ ); + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + + if (myShape4.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape4)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint4), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint4); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + //add sensetive arc + Handle(Select3D_SensitiveCircle) circ = + new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); + aSelection->Add( seg ); + } +} + +//======================================================================= +//function : ComputeTwoEdgesLength +//purpose : +//======================================================================= +void PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Edge & FirstEdge, + const TopoDS_Edge & SecondEdge, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box & BndBox, + gp_Pnt& Position, + gp_Pnt& FirstAttach, + gp_Pnt& SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide & SymbolPrs ) +{ + gp_Dir DirAttach; + BRepAdaptor_Curve cu1( FirstEdge ); + BRepAdaptor_Curve cu2( SecondEdge ); + + // 3d lines + Handle(Geom_Curve) geom1,geom2; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + + Standard_Boolean isInfinite1(Standard_False),isInfinite2(Standard_False); + Handle(Geom_Curve) extCurv; + Standard_Real arrsize = ArrowSize;// size + Standard_Real Val=0.; + Standard_Boolean isInPlane1, isInPlane2; + + if(!PrsDim::ComputeGeometry(FirstEdge,geom1, ptat11, ptat12,extCurv,isInfinite1,isInPlane1, Plane )) + return; + if(!PrsDim::ComputeGeometry(SecondEdge, geom2, ptat21, ptat22, extCurv, isInfinite2,isInPlane2, Plane)) + return; + + aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); + + if (cu1.GetType() == GeomAbs_Line && cu2.GetType() == GeomAbs_Line) + { + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + const gp_Lin& l1 = geom_lin1->Lin(); + const gp_Lin& l2 = geom_lin2->Lin(); + + //Get Val value + Val = l1.Distance( l2 ); + + DirAttach = l1.Direction(); + + if (AutomaticPos) { + // compute position of offset point + gp_Pnt curpos; + Standard_Real par1=0., par2=0.; + if(!(isInfinite1 || isInfinite2)) + { + par1 = ElCLib::Parameter(l1,ptat11); + par2 = ElCLib::Parameter(l1,ptat21); + if (par1 Pln() ); + } + + // find attach points + if (!isInfinite1) { + if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12; + else FirstAttach = ptat11; + } + else { + FirstAttach = ElCLib::Value(ElCLib::Parameter(l1,Position),l1); + } + + if (!isInfinite2) { + if (Position.Distance(ptat21) > Position.Distance(ptat22)) SecondAttach = ptat22; + else SecondAttach = ptat21; + } + else { + SecondAttach = ElCLib::Value(ElCLib::Parameter(l2,Position),l2); + } + + Standard_Real confusion(Precision::Confusion()); + if (arrsize < confusion) arrsize = Val*0.1; + if (Abs(Val) <= confusion) {arrsize = 0.;} + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(arrsize); + arr = la->ArrowAspect(); + arr->SetLength(arrsize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, + SecondExtreme); + + +} + if (cu1.GetType() == GeomAbs_Circle && cu2.GetType() == GeomAbs_Circle){ + //Get first and last points of circles + Handle(Geom_Circle) aCir1 (Handle(Geom_Circle)::DownCast(geom1)); + Handle(Geom_Circle) aCir2 (Handle(Geom_Circle)::DownCast(geom2)); + gp_Circ aCirc1 = aCir1->Circ(); + gp_Circ aCirc2 = aCir2->Circ(); + + //To avoid circles with different orientaion + Standard_Real aTol = Precision::Confusion(); + if(aCirc2.Axis().IsOpposite(aCirc1.Axis(), aTol) || + aCirc2.XAxis().IsOpposite(aCirc1.XAxis(), aTol) || + aCirc2.YAxis().IsOpposite(aCirc1.YAxis(), aTol) ) + { + aCirc2.SetPosition(aCirc1.Position()); + aCirc2.SetAxis(aCirc1.Axis()); + } + + if (AutomaticPos){ + Standard_Real par1 = 0, par2 = 0; + gp_Pln aPln = Plane->Pln(); + //Project ptat12 and ptat22 on constraint plane + gp_Pnt PrPnt12 = PrsDim::ProjectPointOnPlane(ptat12, aPln); + gp_Pnt PrPnt22 = PrsDim::ProjectPointOnPlane(ptat22, aPln); + //Project circles center on constraint plane + gp_Pnt PrCenter = PrsDim::ProjectPointOnPlane(aCirc1.Location(), aPln); + + gp_Dir XDir = aPln.XAxis().Direction(); + gp_Dir YDir = aPln.YAxis().Direction(); + + + if (PrPnt12.Distance(PrCenter) >Precision::Confusion()) + { + gp_Dir aDir1(PrPnt12.XYZ() - PrCenter.XYZ()); + Standard_Real anAngle = aDir1.Angle(XDir); //Get the angle in range [0, M_PI] + if (aDir1.Dot(YDir) < 0) + anAngle = 2 * M_PI - anAngle; + par1 = anAngle; + } + + if (PrPnt22.Distance(PrCenter) >Precision::Confusion()) + { + gp_Dir aDir2(PrPnt22.XYZ() - PrCenter.XYZ()); + Standard_Real anAngle = aDir2.Angle(XDir); //Get the angle in range [0, M_PI] + if (aDir2.Dot(YDir) < 0) + anAngle = 2 * M_PI - anAngle; + par2 = anAngle; + } + + + if(par1 > par2 ){ + FirstExtreme = ptat12; + Standard_Real aPar1 = ElCLib::Parameter(aCirc2, ptat12); + SecondExtreme = ElCLib::Value(aPar1, aCirc2); + } + else { + Standard_Real aPar2 = ElCLib::Parameter(aCirc1, ptat22); + FirstExtreme = ElCLib::Value(aPar2, aCirc1); + SecondExtreme = ptat22; + } + } + else { + Standard_Real pospar = ElCLib::Parameter(aCirc1, Position); + FirstExtreme = ElCLib::Value(pospar, aCirc1); + pospar = ElCLib::Parameter(aCirc2, Position); + SecondExtreme = ElCLib::Value(pospar, aCirc2); + } + + DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, + aDrawer, + aCirc1, + aCirc2, + ptat12, + FirstExtreme, + ptat22, + SecondExtreme, + SymbolPrs); + + FirstAttach = ptat12; SecondAttach = ptat22; //assign attach points + Position.SetXYZ( (FirstAttach.XYZ() + SecondAttach.XYZ())*0.5); + } + + if (arrsize < Precision::Confusion()) arrsize = Val*0.1; + if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} + +// gp_Pnt pf, pl; + if (!isInPlane1) { + PrsDim::ComputeProjEdgePresentation( aPresentation, aDrawer, FirstEdge, geom1, ptat11, ptat12); + } + if(!isInPlane2) { + PrsDim::ComputeProjEdgePresentation( aPresentation, aDrawer, SecondEdge, geom2, ptat21, ptat22); + } +} + +//======================================================================= +//function : ComputeTwoVerticesLength +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Vertex& FirstVertex, + const TopoDS_Vertex& SecondVertex, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box& BndBox, + const PrsDim_TypeOfDist TypeDist, + gp_Pnt& Position, + gp_Pnt& FirstAttach, + gp_Pnt& SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide& SymbolPrs ) +{ + Standard_Boolean isOnPlane1, isOnPlane2; + gp_Dir DirAttach; + PrsDim::ComputeGeometry( FirstVertex, FirstAttach, Plane, isOnPlane1); + PrsDim::ComputeGeometry( SecondVertex, SecondAttach, Plane, isOnPlane2); + + Standard_Real confusion(Precision::Confusion()); + Standard_Boolean samePoint(FirstAttach.IsEqual(SecondAttach,confusion)); + + if (TypeDist == PrsDim_TypeOfDist_Vertical) DirAttach = Plane->Pln().XAxis().Direction(); + else if (TypeDist == PrsDim_TypeOfDist_Horizontal) DirAttach = Plane->Pln().YAxis().Direction(); + else { + if (!samePoint) { + DirAttach.SetXYZ(SecondAttach.XYZ() - FirstAttach.XYZ()); + DirAttach.Rotate(Plane->Pln().Axis(),M_PI/2.); + } + } + + // size + if (AutomaticPos) { + if (!samePoint) { + gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())*0.5); + // make offset of curpos + gp_Vec offset(DirAttach); + offset = offset*ArrowSize*(-10.); + curpos.Translate(offset); + Position = curpos; + } + else { + gp_Dir aDir = Plane->Pln().Axis().Direction(); + gp_Vec aVec (aDir.XYZ()*10*ArrowSize); + //Position = gp_Pnt(FirstAttach.XYZ()+gp_XYZ(1.,1.,1.)); // not correct + Position = FirstAttach.Translated(aVec); + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() );//not needed really + DirAttach.SetXYZ(Position.XYZ() - FirstAttach.XYZ()); + } + } + else { + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() ); + } + + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(ArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(ArrowSize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, //returned + SecondExtreme); //returned + + // Compute projection + if ( !isOnPlane1) + PrsDim::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach); + if ( !isOnPlane2) + PrsDim::ComputeProjVertexPresentation(aPresentation, aDrawer, SecondVertex, SecondAttach); + +} + + +//======================================================================= +//function : ComputeOneEdgeOneVertexLength +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Shape & FirstShape, + const TopoDS_Shape & SecondShape, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box & BndBox, + gp_Pnt & Position, + gp_Pnt & FirstAttach, + gp_Pnt & SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide & SymbolPrs ) +{ + TopoDS_Vertex thevertex; + TopoDS_Edge theedge; + + gp_Pnt ptonedge1,ptonedge2; + Handle(Geom_Curve) aCurve; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Real Val; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + Standard_Integer edgenum ; + + if (FirstShape.ShapeType() == TopAbs_VERTEX) { + thevertex = TopoDS::Vertex(FirstShape); + theedge = TopoDS::Edge(SecondShape); + edgenum = 2; //edge is the second shape + } + else { + thevertex = TopoDS::Vertex(SecondShape); + theedge = TopoDS::Edge(FirstShape); + edgenum = 1;//edge is the first shape + } + if (!PrsDim::ComputeGeometry(theedge,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,Plane)) + return; + aPresentation->SetInfiniteState(isInfinite); + PrsDim::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex); + + if ( aCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + Handle(Geom_Line) geom_lin (Handle(Geom_Line)::DownCast (aCurve)); + const gp_Lin& l = geom_lin->Lin(); + + // computation of Val + Val = l.Distance( FirstAttach ); + + gp_Dir DirAttach = l.Direction(); + // size + Standard_Real arrsize = ArrowSize; + if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} + + if (AutomaticPos) { + gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l); + gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())*0.5); + // make offset + gp_Vec offset(DirAttach); + offset = offset*ArrowSize*(-10.); + curpos.Translate(offset); + Position = curpos; + } + else { // project point on the plane + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() ); + } + + if (!isInfinite) { + if (Position.Distance(ptonedge1) > Position.Distance(ptonedge2)) SecondAttach = ptonedge2; + else SecondAttach = ptonedge1; + } + else { + SecondAttach = ElCLib::Value(ElCLib::Parameter(l,Position),l); + } + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(arrsize); + arr = la->ArrowAspect(); + arr->SetLength(arrsize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, + SecondExtreme); + +} + if (aCurve->IsInstance(STANDARD_TYPE(Geom_Circle))){ + gp_Circ aCirc1 = (Handle(Geom_Circle)::DownCast(aCurve))->Circ(); + gp_Circ aCirc2(aCirc1); aCirc2.SetRadius(0); //create the second formal circle + if(AutomaticPos) + { + SecondAttach = ptonedge2; //a vertex + Position.SetXYZ((SecondAttach.XYZ() + aCirc1.Location().XYZ())*0.5); + } + else { + Standard_Real aPar = ElCLib::Parameter(aCirc1, Position); + SecondAttach = ElCLib::Value(aPar, aCirc1); + } + + Handle(Geom_Circle) aCurve2 = new Geom_Circle(aCirc2); + DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, + aDrawer, + aCirc1, //circle or arc + aCirc2, //really vertex + ptonedge2, //last point of aCirc1 + SecondAttach, + FirstAttach, //vertex really + FirstAttach, + SymbolPrs); + + //Assign arc points + if (edgenum == 1){ + FirstExtreme = SecondAttach; SecondExtreme = FirstAttach; + SecondAttach = FirstAttach; FirstAttach = ptonedge2; + } else { //vertex is the first shape, circle is sthe last. + FirstExtreme = FirstAttach; SecondExtreme = SecondAttach; + SecondAttach = ptonedge2; + } + } + + // computation of Val + Val = FirstAttach.Distance(SecondAttach); + + //Display the pieces of attached to the curve if it is not + // in the WP + if (!isOnPlanEdge) { // add presentation of projection of the edge in WP + PrsDim::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2); + } + if (!isOnPlanVertex) { // add presentation of projection of the vertex in WP + PrsDim::ComputeProjVertexPresentation(aPresentation,aDrawer,thevertex,FirstAttach); + } + +} +// -- ota -- end diff --git a/src/PrsDim/PrsDim_EqualDistanceRelation.hxx b/src/PrsDim/PrsDim_EqualDistanceRelation.hxx new file mode 100644 index 0000000000..8c07112c17 --- /dev/null +++ b/src/PrsDim/PrsDim_EqualDistanceRelation.hxx @@ -0,0 +1,97 @@ +// Created on: 1998-01-24 +// Created by: Julia GERASIMOVA +// 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. + +#ifndef _PrsDim_EqualDistanceRelation_HeaderFile +#define _PrsDim_EqualDistanceRelation_HeaderFile + +#include +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_EqualDistanceRelation, PrsDim_Relation) + +//! A framework to display equivalent distances between +//! shapes and a given plane. +//! The distance is the length of a projection from the +//! shape to the plane. +//! These distances are used to compare shapes by this vector alone. +class PrsDim_EqualDistanceRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EqualDistanceRelation, PrsDim_Relation) +public: + + //! Constructs a framework to display equivalent + //! distances between the shapes aShape1, aShape2, + //! aShape3, aShape4 and the plane aPlane. + //! The distance is the length of a projection from the + //! shape to the plane. + Standard_EXPORT PrsDim_EqualDistanceRelation(const TopoDS_Shape& aShape1, const TopoDS_Shape& aShape2, const TopoDS_Shape& aShape3, const TopoDS_Shape& aShape4, const Handle(Geom_Plane)& aPlane); + + //! Sets the shape aShape to be used as the shape + //! aShape3 in the framework created at construction time. + void SetShape3 (const TopoDS_Shape& aShape) { myShape3 = aShape; } + + //! Returns the shape aShape3 from the framework + //! created at construction time. + const TopoDS_Shape& Shape3() const { return myShape3; } + + //! Sets the shape aShape to be used as the shape + //! aShape4 in the framework created at construction time. + void SetShape4 (const TopoDS_Shape& aShape) { myShape4 = aShape; } + + //! Returns the shape aShape4 from the framework + //! created at construction time. + const TopoDS_Shape& Shape4() const { return myShape4; } + +public: + + //! Computes the location of an intreval between + //! between two edges. FirstAttach , SecondAttach + //! are the returned extreme points of the interval. + Standard_EXPORT static void ComputeTwoEdgesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Edge& FirstEdge, const TopoDS_Edge& SecondEdge, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + + //! Computes the interval position between two vertexs. FirstAttach, + //! SecondAttach are the returned extreme points of the interval. + Standard_EXPORT static void ComputeTwoVerticesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Vertex& FirstVertex, const TopoDS_Vertex& SecondVertex, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, const PrsDim_TypeOfDist TypeDist, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + + //! Compute the interval location between a vertex and an edge. Edge may be + //! a line or a circle. + Standard_EXPORT static void ComputeOneEdgeOneVertexLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + TopoDS_Shape myShape3; + TopoDS_Shape myShape4; + gp_Pnt myAttachPoint1; + gp_Pnt myAttachPoint2; + gp_Pnt myAttachPoint3; + gp_Pnt myAttachPoint4; + gp_Pnt myPoint1; + gp_Pnt myPoint2; + gp_Pnt myPoint3; + gp_Pnt myPoint4; + +}; + +#endif // _PrsDim_EqualDistanceRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_EqualRadiusRelation.cxx b/src/PrsDim/PrsDim_EqualRadiusRelation.cxx new file mode 100644 index 0000000000..28578317a3 --- /dev/null +++ b/src/PrsDim/PrsDim_EqualRadiusRelation.cxx @@ -0,0 +1,222 @@ +// Created on: 1998-01-20 +// Created by: Julia GERASIMOVA +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EqualRadiusRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EqualRadiusRelation +//purpose : +//======================================================================= +PrsDim_EqualRadiusRelation::PrsDim_EqualRadiusRelation( const TopoDS_Edge& aFirstEdge, + const TopoDS_Edge& aSecondEdge, + const Handle( Geom_Plane )& aPlane ) +: PrsDim_Relation() +{ + myFShape = aFirstEdge; + mySShape = aSecondEdge; + myPlane = aPlane; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_EqualRadiusRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, + const Handle( Prs3d_Presentation )& aPresentation, + const Standard_Integer ) +{ + BRepAdaptor_Curve FirstCurve( TopoDS::Edge( myFShape ) ), SecondCurve( TopoDS::Edge( mySShape ) ); + + Standard_Real FirstPar1 = FirstCurve.FirstParameter(), LastPar1 = FirstCurve.LastParameter(), + FirstPar2 = SecondCurve.FirstParameter(), LastPar2 = SecondCurve.LastParameter(); + + Handle( Geom_Curve ) FirstProjCurve = FirstCurve.Curve().Curve(), + SecondProjCurve = SecondCurve.Curve().Curve(); + gp_Pnt FirstPoint1, LastPoint1, FirstPoint2, LastPoint2; + Standard_Boolean isFirstOnPlane, isSecondOnPlane; + + PrsDim::ComputeGeomCurve (FirstProjCurve, FirstPar1, LastPar1, FirstPoint1, LastPoint1, myPlane, isFirstOnPlane); + PrsDim::ComputeGeomCurve (SecondProjCurve, FirstPar2, LastPar2, FirstPoint2, LastPoint2, myPlane, isSecondOnPlane); + + if (!isFirstOnPlane) + ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( myFShape ), FirstProjCurve, FirstPoint1, LastPoint1 ); + if (! isSecondOnPlane) + ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( mySShape ), SecondProjCurve, FirstPoint2, LastPoint2 ); + + gp_Circ FirstCirc = (Handle( Geom_Circle )::DownCast( FirstProjCurve ))->Circ(); + gp_Circ SecondCirc = (Handle( Geom_Circle )::DownCast( SecondProjCurve ))->Circ(); + + myFirstCenter = FirstCirc.Location(); + mySecondCenter = SecondCirc.Location(); + + //ota -- begin -- + if (myAutomaticPosition) + { + myFirstPoint = ElCLib::Value( (FirstPar1 + LastPar1)*0.5, FirstCirc ); + mySecondPoint = ElCLib::Value( (FirstPar2 + LastPar2)*0.5, SecondCirc ); + } + else { + Standard_Real aPar = ElCLib::Parameter(FirstCirc, myFirstPoint); + if (IntegerPart(0.5*LastPar1/M_PI) != 0 && aPar < FirstPar1 ) + aPar +=2*M_PI*IntegerPart(0.5*LastPar1/M_PI); + Standard_Real aRadius = FirstCirc.Radius(); + + if (Abs(myFirstPoint.Distance(myFirstCenter) - aRadius) >= Precision::Confusion()) + myFirstPoint = ElCLib::Value(aPar, FirstCirc); + if ( FirstPoint1.Distance(LastPoint1) > Precision::Confusion()){ + //check where is myFirstPoint + if (aPar > LastPar1 || aPar < FirstPar1) + { + //myFirstPoint is out of Arc of FirstCircle + if (FirstPoint1.Distance(myFirstPoint)< LastPoint1.Distance(myFirstPoint)) + myFirstPoint = FirstPoint1; + else + myFirstPoint = LastPoint1; + } + } + + + aPar = ElCLib::Parameter(SecondCirc, mySecondPoint); + if (IntegerPart(0.5*LastPar2/M_PI) != 0 && aPar < FirstPar2 ) + aPar +=2*M_PI*IntegerPart(0.5*LastPar2/M_PI); + + aRadius = SecondCirc.Radius(); + if (Abs(mySecondPoint.Distance(mySecondCenter) - aRadius) >= Precision::Confusion()) + mySecondPoint = ElCLib::Value(aPar, SecondCirc); + if (FirstPoint2.Distance(LastPoint2) > Precision::Confusion()){ + if (aPar > LastPar2 || aPar < FirstPar2) + { //mySecondPoint is out of Arc of mySecondCircle + if (FirstPoint2.Distance(mySecondPoint)< LastPoint2.Distance(mySecondPoint)) + mySecondPoint = FirstPoint2; + else + mySecondPoint = LastPoint2; + } + } + } + if( !myArrowSizeIsDefined ) + myArrowSize = (Min(myFirstCenter.Distance(myFirstPoint), + mySecondCenter.Distance(mySecondPoint)))*0.05; + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + //ota -- end -- + + DsgPrs_EqualRadiusPresentation::Add(aPresentation, myDrawer, + myFirstCenter, mySecondCenter, myFirstPoint, mySecondPoint, myPlane ); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_EqualRadiusRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, + const Standard_Integer ) +{ + Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); + Handle( Select3D_SensitiveSegment ) seg; + + seg = new Select3D_SensitiveSegment( own, myFirstCenter, myFirstPoint ); + aSelection->Add( seg ); + + if(!myAutomaticPosition) + ComputeRadiusPosition(); + + seg = new Select3D_SensitiveSegment( own, mySecondCenter, mySecondPoint ); + aSelection->Add( seg ); + + seg = new Select3D_SensitiveSegment( own, myFirstCenter, mySecondCenter ); + aSelection->Add( seg ); + + + // Two small lines + gp_Pnt Middle( (myFirstCenter.XYZ() + mySecondCenter.XYZ())*0.5 ); + + Standard_Real SmallDist = .001; + //Should be changed as the domain of small lines could be changed. + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox(own, + Middle.X() - SmallDist, + Middle.Y() - SmallDist, + Middle.Z() - SmallDist, + Middle.X() + SmallDist, + Middle.Y() + SmallDist, + Middle.Z() + SmallDist ); + aSelection->Add(box); +} + +//================================================================= +//function : ComputeRadiusPosition +//purpose : +//================================================================= +void PrsDim_EqualRadiusRelation::ComputeRadiusPosition() +{ + if (myAutomaticPosition || + myFirstCenter.Distance(myPosition) < Precision::Confusion() || + mySecondCenter.Distance(myPosition) < Precision::Confusion()) + return; + + gp_Pnt aPosition; + + //project myPosition to the plane of constraint + GeomAPI_ProjectPointOnSurf aProj(myPosition, myPlane); + aPosition = aProj.NearestPoint(); + + Standard_Real aDist1 = myFirstPoint.Distance(aPosition); + Standard_Real aDist2 = mySecondPoint.Distance(aPosition); + + if(aDist1 + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_EqualRadiusRelation, PrsDim_Relation) + +class PrsDim_EqualRadiusRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EqualRadiusRelation, PrsDim_Relation) +public: + + //! Creates equal relation of two arc's radiuses. + //! If one of edges is not in the given plane, + //! the presentation method projects it onto the plane. + Standard_EXPORT PrsDim_EqualRadiusRelation(const TopoDS_Edge& aFirstEdge, const TopoDS_Edge& aSecondEdge, const Handle(Geom_Plane)& aPlane); + +private: + + Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeRadiusPosition(); + +private: + + gp_Pnt myFirstCenter; + gp_Pnt mySecondCenter; + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + +}; + +#endif // _PrsDim_EqualRadiusRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_FixRelation.cxx b/src/PrsDim/PrsDim_FixRelation.cxx new file mode 100644 index 0000000000..cf31fd563d --- /dev/null +++ b/src/PrsDim/PrsDim_FixRelation.cxx @@ -0,0 +1,554 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_FixRelation, PrsDim_Relation) + +static Standard_Boolean InDomain(const Standard_Real fpar, + const Standard_Real lpar, + const Standard_Real para) +{ + if (fpar >= 0.) { + return ((para >= fpar) && (para <= lpar)); + } + if (para >= (fpar+2*M_PI)) return Standard_True; + if (para <= lpar) return Standard_True; + return Standard_False; +} + +//======================================================================= +//function : Constructor +//purpose : vertex Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation(const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const TopoDS_Wire& aWire) +: PrsDim_Relation(), + myWire(aWire) +{ + myFShape = aShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 5.; +} + +//======================================================================= +//function : Constructor +//purpose : vertex Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation(const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const TopoDS_Wire& aWire, + const gp_Pnt& aPosition, + const Standard_Real anArrowSize) +: PrsDim_Relation(), + myWire(aWire) +{ + myFShape = aShape; + myPlane = aPlane; + myPosition = aPosition; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Constructor +//purpose : edge (line or circle) Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation (const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 5.; +} + +//======================================================================= +//function : Constructor +//purpose : edge (line or circle) Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation( + const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const gp_Pnt& aPosition, + const Standard_Real anArrowSize) +{ + myFShape = aShape; + myPlane = aPlane; + myPosition = aPosition; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_FixRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + // Calculate position of the symbol and + // point of attach of the segment on the shape + gp_Pnt curpos; + if (myFShape.ShapeType() == TopAbs_VERTEX) + ComputeVertex(TopoDS::Vertex(myFShape), curpos); + else if (myFShape.ShapeType() == TopAbs_EDGE) + ComputeEdge(TopoDS::Edge(myFShape), curpos); + + const gp_Dir& nor = myPlane->Axis().Direction(); + + + // calculate presentation + // definition of the symbol size + if( !myArrowSizeIsDefined ) + myArrowSize = 5.; + + //creation of the presentation + DsgPrs_FixPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + nor, + myArrowSize); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_FixRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + // creation of segment sensible for the linked segment + // of the shape fixed to symbol 'Fix' + Handle(Select3D_SensitiveSegment) seg; + seg = new Select3D_SensitiveSegment(own, + myPntAttach, + myPosition); + aSelection->Add(seg); + + // Creation of the sensible zone of symbol 'Fix' + gp_Dir norm = myPlane->Axis().Direction(); + + gp_Vec dirac(myPntAttach,myPosition); + dirac.Normalize(); + gp_Vec norac = dirac.Crossed(gp_Vec(norm)); + gp_Ax1 ax(myPosition, norm); + norac.Rotate(ax, M_PI/8); + + norac*=(myArrowSize/2); + gp_Pnt P1 = myPosition.Translated(norac); + gp_Pnt P2 = myPosition.Translated(-norac); + seg = new Select3D_SensitiveSegment(own, + P1, + P2); + aSelection->Add(seg); + + norac*=0.8; + P1 = myPosition.Translated(norac); + P2 = myPosition.Translated(-norac); + dirac*=(myArrowSize/2); + gp_Pnt PF(P1.XYZ()); + gp_Pnt PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); + aSelection->Add(seg); + + + PF.SetXYZ(P2.XYZ()); + PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); + aSelection->Add(seg); + + PF.SetXYZ( (P1.XYZ() + P2.XYZ()) /2 ); + PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); +} + +//======================================================================= +//function : ComputeVertex +//purpose : computes myPntAttach and the position of the presentation +// when you fix a vertex +//======================================================================= + +void PrsDim_FixRelation::ComputeVertex(const TopoDS_Vertex& /*FixVertex*/, + gp_Pnt& curpos) +{ + myPntAttach = BRep_Tool::Pnt(TopoDS::Vertex(myFShape)); + curpos = myPosition; + if (myAutomaticPosition) { + gp_Pln pln(myPlane->Pln()); + gp_Dir dir(pln.XAxis().Direction()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } +} + +//======================================================================= +//function : ComputePosition +//purpose : +//======================================================================= + +gp_Pnt PrsDim_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv1, + const Handle(Geom_Curve)& curv2, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) const +{ + //--------------------------------------------------------- + // calculate the point of attach + //--------------------------------------------------------- + gp_Pnt curpos; + + if (curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) || curv2->IsInstance(STANDARD_TYPE(Geom_Circle))) { + Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv1); + if (gcirc.IsNull()) gcirc = Handle(Geom_Circle)::DownCast(curv2); + gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + } + + else { + gp_Vec vec1(firstp1,lastp1); + gp_Vec vec2(firstp2,lastp2); + + if (!vec1.IsParallel(vec2, Precision::Angular()) ) { + gp_Dir dir; + Standard_Real conf =Precision::Confusion(); + if (lastp1.IsEqual(firstp2,conf) || firstp1.IsEqual(lastp2,conf)) dir.SetXYZ(vec1.XYZ() - vec2.XYZ()); + else dir.SetXYZ(vec1.XYZ() + vec2.XYZ()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + } + else { + gp_Vec crossvec = vec1.Crossed(vec2); + vec1.Cross(crossvec); + gp_Dir dir(vec1); + curpos = myPntAttach.Translated(gp_Vec(dir)*myArrowSize); + } + } + + return curpos; +} + +//======================================================================= +//function : ComputePosition +//purpose : Computes the position of the "fix dimension" when the +// fixed object is a vertex which is set at the intersection +// of two curves. +// The "dimension" is in the "middle" of the two edges. +//======================================================================= + +gp_Pnt PrsDim_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv, + const gp_Pnt& firstp, + const gp_Pnt& lastp) const +{ + //--------------------------------------------------------- + // calculate the point of attach + //--------------------------------------------------------- + gp_Pnt curpos; + + if (curv->IsKind(STANDARD_TYPE(Geom_Circle))) { + + Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv); + gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + + } //if (curv->IsKind(STANDARD_TYPE(Geom_Circle)) + + else { +// gp_Pln pln(Component()->WorkingPlane()->Plane()->GetValue()->Pln()); + gp_Pln pln(myPlane->Pln()); + gp_Dir NormPln = pln.Axis().Direction(); + gp_Vec vec(firstp,lastp); + vec.Cross( gp_Vec(NormPln)); + vec.Normalize(); + gp_Vec transvec = vec*myArrowSize; + curpos = myPntAttach.Translated(transvec); + gp_Ax1 RotAx( myPntAttach, NormPln); + curpos.Rotate(RotAx, M_PI/10); + } + + return curpos; + } + +//======================================================================= +//function : ComputeEdge +//purpose : computes myPntAttach and the position of the presentation +// when you fix an edge +//======================================================================= + +void PrsDim_FixRelation::ComputeEdge(const TopoDS_Edge& FixEdge, gp_Pnt& curpos) +{ + Handle(Geom_Curve) curEdge; + gp_Pnt ptbeg,ptend; + if (!PrsDim::ComputeGeometry(FixEdge,curEdge,ptbeg,ptend)) return; + + //--------------------------------------------------------- + // calcul du point de positionnement du symbole 'fix' + //--------------------------------------------------------- + //--> In case of a straight line + if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){ + gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin(); + Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg)); + Standard_Real plast(ElCLib::Parameter(glin,ptend)); + ComputeLinePosition(glin, curpos, pfirst, plast); + } + + //--> In case of a circle + else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) { + gp_Circ gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ(); + Standard_Real pfirst, plast; + BRepAdaptor_Curve cu(FixEdge); + pfirst = cu.FirstParameter(); + plast = cu.LastParameter(); + ComputeCirclePosition(gcirc, curpos, pfirst, plast); + } + + else + return; + +} + +//======================================================================= +//function : ComputeLinePosition +//purpose : compute the values of myPntAttach and the position of +// the symbol when the fixed edge has a geometric support equal +// to a line. +//======================================================================= + +void PrsDim_FixRelation::ComputeLinePosition(const gp_Lin& glin, + gp_Pnt& pos, + Standard_Real& pfirst, + Standard_Real& plast) +{ + if (myAutomaticPosition) { + // point of attach is chosen as middle of the segment + myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin); + + gp_Dir norm = myPlane ->Axis().Direction(); + + norm.Cross(glin.Position().Direction()); + pos = myPntAttach.Translated(gp_Vec(norm)*myArrowSize); + myAutomaticPosition = Standard_True; + } // if (myAutomaticPosition) + + else { + pos = myPosition; + Standard_Real linparam = ElCLib::Parameter(glin, pos); + + // case if the projection of position is located between 2 vertices + // de l'edge + if ( (linparam >= pfirst) && (linparam <= plast) ) + myPntAttach = ElCLib::Value(linparam,glin); + + // case if the projection of Position is outside of the limits + // of the edge : the point closest to the projection is chosen + // as the attach point + else { + Standard_Real pOnLin; + if (linparam > plast) + pOnLin = plast; + else + pOnLin = pfirst; + myPntAttach = ElCLib::Value(pOnLin,glin); + gp_Dir norm = myPlane->Axis().Direction(); + + norm.Cross(glin.Position().Direction()); + gp_Lin lsup(myPntAttach, norm); + Standard_Real parpos = ElCLib::Parameter(lsup,myPosition); + pos = ElCLib::Value(parpos,lsup); + } + + } + myPosition = pos; +} + +//======================================================================= +//function : ComputeCirclePosition +//purpose : compute the values of myPntAttach and the position of +// the symbol when the fixed edge has a geometric support equal +// to a circle. +//======================================================================= + +void PrsDim_FixRelation::ComputeCirclePosition( + const gp_Circ& gcirc, + gp_Pnt& pos, + Standard_Real& pfirst, + Standard_Real& plast) +{ + // readjust parametres on the circle + if (plast > 2*M_PI ) { + Standard_Real nbtours = Floor(plast / (2*M_PI)); + plast -= nbtours*2*M_PI; + pfirst -= nbtours*2*M_PI; + } + + if (myAutomaticPosition) { + // the point attach is the "middle" of the segment (relatively + // to the parametres of start and end vertices of the edge + + Standard_Real circparam = (pfirst + plast)/2.; + + if ( !InDomain(pfirst,plast,circparam)) { + Standard_Real otherpar = circparam + M_PI; + if (otherpar > 2*M_PI) otherpar -= 2*M_PI; + circparam = otherpar; + } + + myPntAttach = ElCLib::Value(circparam, gcirc ); + + gp_Vec dir( gcirc.Location().XYZ(), myPntAttach.XYZ() ); + dir.Normalize(); + gp_Vec transvec = dir*myArrowSize; + pos = myPntAttach.Translated(transvec); + myPosition = pos; + myAutomaticPosition = Standard_True; + } // if (myAutomaticPosition) + + else { + // case if the projection of myPosition is outside of 2 + // vertices of the edge. In this case the parameter is readjusted + // in the valid part of the circle + pos = myPosition; + + Standard_Real circparam = ElCLib::Parameter(gcirc, pos); + + if ( !InDomain(pfirst,plast,circparam)) { + Standard_Real otherpar = circparam + M_PI; + if (otherpar > 2*M_PI) otherpar -= 2*M_PI; + circparam = otherpar; + } + + myPntAttach = ElCLib::Value(circparam,gcirc); + } +} + +//======================================================================= +//function : ConnectedEdges +//purpose : +//======================================================================= +Standard_Boolean PrsDim_FixRelation::ConnectedEdges(const TopoDS_Wire& WIRE, + const TopoDS_Vertex& V, + TopoDS_Edge& E1, + TopoDS_Edge& E2) +{ + TopTools_IndexedDataMapOfShapeListOfShape vertexMap; + TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); + + Standard_Boolean found(Standard_False); + TopoDS_Vertex theVertex; + for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { + if (vertexMap.FindKey(i).IsSame(V)) { + theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); + found = Standard_True; + } + } + if (!found) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + + TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); + if (iterator.More()) { + E1 = TopoDS::Edge(iterator.Value()); + BRepAdaptor_Curve curv(E1); + iterator.Next(); + } + else { + E1.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E2 = TopoDS::Edge(iterator.Value()); + BRepAdaptor_Curve curv(E2); + iterator.Next(); + } + else { + E2.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + return Standard_True; +} diff --git a/src/PrsDim/PrsDim_FixRelation.hxx b/src/PrsDim/PrsDim_FixRelation.hxx new file mode 100644 index 0000000000..fbea2fd471 --- /dev/null +++ b/src/PrsDim/PrsDim_FixRelation.hxx @@ -0,0 +1,101 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_FixRelation_HeaderFile +#define _PrsDim_FixRelation_HeaderFile + +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_FixRelation, PrsDim_Relation) + +//! Constructs and manages a constraint by a fixed +//! relation between two or more interactive datums. This +//! constraint is represented by a wire from a shape - +//! point, vertex, or edge - in the first datum and a +//! corresponding shape in the second. +//! Warning: This relation is not bound with any kind of parametric +//! constraint : it represents the "status" of an parametric +//! object. +class PrsDim_FixRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_FixRelation, PrsDim_Relation) +public: + + //! initializes the vertex aShape, the + //! plane aPlane and the wire aWire, which connects + //! the two vertices in a fixed relation. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire); + + //! initializes the vertex aShape, the + //! plane aPlane and the wire aWire, the position + //! aPosition, the arrow size anArrowSize and the + //! wire aWire, which connects the two vertices in a fixed relation. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); + + //! initializes the edge aShape and the plane aPlane. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane); + + //! initializes the edge aShape, the + //! plane aPlane, the position aPosition and the arrow + //! size anArrowSize. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); + + //! Returns the wire which connects vertices in a fixed relation. + const TopoDS_Wire& Wire() { return myWire; } + + //! Constructs the wire aWire. This connects vertices + //! which are in a fixed relation. + void SetWire (const TopoDS_Wire& aWire) { myWire = aWire; } + + //! Returns true if the Interactive Objects in the relation + //! are movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + //! computes the presentation for if it's a + //! vertex. + Standard_EXPORT void ComputeVertex (const TopoDS_Vertex& FixVertex, gp_Pnt& curpos); + + Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv1, const Handle(Geom_Curve)& curv2, const gp_Pnt& firstp1, const gp_Pnt& lastp1, const gp_Pnt& firstp2, const gp_Pnt& lastp2) const; + + Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv, const gp_Pnt& firstp, const gp_Pnt& lastp) const; + + //! computes the presentation for if it's a + //! edge. + Standard_EXPORT void ComputeEdge (const TopoDS_Edge& FixEdge, gp_Pnt& curpos); + + Standard_EXPORT void ComputeLinePosition (const gp_Lin& glin, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); + + Standard_EXPORT void ComputeCirclePosition (const gp_Circ& gcirc, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); + + Standard_EXPORT static Standard_Boolean ConnectedEdges (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, TopoDS_Edge& Edge1, TopoDS_Edge& Edge2); + +private: + + TopoDS_Wire myWire; + gp_Pnt myPntAttach; + +}; + +#endif // _PrsDim_FixRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_IdenticRelation.cxx b/src/PrsDim/PrsDim_IdenticRelation.cxx new file mode 100644 index 0000000000..127c65a81c --- /dev/null +++ b/src/PrsDim/PrsDim_IdenticRelation.cxx @@ -0,0 +1,1711 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_IdenticRelation, PrsDim_Relation) + +// jfa 15/10/2000 +static Standard_Real Modulo2PI(const Standard_Real ANGLE) +{ + if ( ANGLE < 0 ) return Modulo2PI(ANGLE + 2*M_PI); + else if ( ANGLE >= 2*M_PI ) return Modulo2PI(ANGLE - 2*M_PI); + return ANGLE; +} + +static Standard_Boolean IsEqual2PI(const Standard_Real angle1, + const Standard_Real angle2, const Standard_Real precision) +{ + Standard_Real diff = Abs(angle1-angle2); + if ( diff < precision ) return Standard_True; + else if ( Abs(diff-2*M_PI) < precision ) return Standard_True; + return Standard_False; +} +// jfa 15/10/2000 end + +//======================================================================= +//function : PrsDim_Sort +//purpose : sort an array of parameters in increasing order +// updates and according to +//======================================================================= +static void PrsDim_Sort(Standard_Real tab1[4], + gp_Pnt tab2[4], + Standard_Integer tab3[4]) +{ + Standard_Boolean found = Standard_True; + Standard_Real cur; gp_Pnt cur1; Standard_Integer cur2; + + while (found) { + found = Standard_False; + for (Standard_Integer i=0; i< 3; i++) { + if (tab1[i+1] < tab1[i]) { + found = Standard_True; + cur = tab1[i]; cur1 = tab2[i]; cur2 = tab3[i]; + tab1[i] = tab1[i+1]; tab2[i] = tab2[i+1]; tab3[i] = tab3[i+1]; + tab1[i+1] = cur; tab2[i+1] = cur1; tab3[i+1] = cur2; + } + } + } +} + +//======================================================================= +//function : ConnectedEdges +//purpose : +//======================================================================= +static Standard_Boolean ConnectedEdges(const TopoDS_Wire& WIRE, + const TopoDS_Vertex& V, + TopoDS_Edge& E1, + TopoDS_Edge& E2) +{ + TopTools_IndexedDataMapOfShapeListOfShape vertexMap; + TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); + + Standard_Boolean found(Standard_False); + TopoDS_Vertex theVertex; + for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { + if (vertexMap.FindKey(i).IsSame(V)) { + theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); + found = Standard_True; + } + } + if (!found) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + + TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); + if (iterator.More()) { + E1 = TopoDS::Edge(iterator.Value()); + iterator.Next(); + } + else { + E1.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E2 = TopoDS::Edge(iterator.Value()); + iterator.Next(); + } + else { + E2.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + return Standard_True; +} + +// jfa 16/10/2000 +//======================================================================= +//function : ComputeAttach +//purpose : Compute a point on the arc of +// between and +// corresponding to +// Returns result into +// Note : This function is to be used only in the case of circles. +// The parameter is in/out. +//======================================================================= +static Standard_Boolean ComputeAttach(const gp_Circ& thecirc, + const gp_Pnt& aFAttach, + const gp_Pnt& aSAttach, + gp_Pnt& aPosition) +{ + gp_Pnt curpos = aPosition; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = thecirc.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, aFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(thecirc,curpos); + Standard_Real pFAttach = ElCLib::Parameter(thecirc,aFAttach); + Standard_Real pSAttach = ElCLib::Parameter(thecirc,aSAttach); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + + aPosition = ElCLib::Value(pcurpos,thecirc); + return Standard_True; +} + +//======================================================================= +//function : ComputeAttach +//purpose : Compute a point on the arc of ellipse +// between and +// corresponding to +// Returns result into +// Note : This function is to be used only in the case of ellipses. +// The parameter is in/out. +//======================================================================= +static Standard_Boolean ComputeAttach(const gp_Elips& theEll, + const gp_Pnt& aFAttach, + const gp_Pnt& aSAttach, + gp_Pnt& aPosition) +{ + gp_Pnt curpos = aPosition; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = theEll.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, aFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + +// for ellipses it's not good Standard_Real pcurpos = ElCLib::Parameter(theEll,curpos); + Handle(Geom_Ellipse) theEllg = new Geom_Ellipse(theEll); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEllg); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + Standard_Real pFAttach = ElCLib::Parameter(theEll,aFAttach); + Standard_Real pSAttach = ElCLib::Parameter(theEll,aSAttach); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + + aPosition = ElCLib::Value(pcurpos,theEll); + return Standard_True; +} +// jfa 16/10/2000 end + +//======================================================================= +//function : PrsDim_IdenticRelation +//purpose : +//======================================================================= +PrsDim_IdenticRelation::PrsDim_IdenticRelation(const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) + :isCircle(Standard_False) +{ + myFShape = FirstShape; + mySShape = SecondShape; + myPlane = aPlane; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + switch ( myFShape.ShapeType() ) { + + case TopAbs_VERTEX: + { + switch ( mySShape.ShapeType() ) { + case TopAbs_VERTEX: + { + ComputeTwoVerticesPresentation(aprs); + } + break; + case TopAbs_EDGE: + { + ComputeOneEdgeOVertexPresentation(aprs); + } + break; + default: + break; + } + } + break; + + case TopAbs_EDGE: + { + switch ( mySShape.ShapeType() ) { + case TopAbs_VERTEX: + { + ComputeOneEdgeOVertexPresentation(aprs); + } + break; + case TopAbs_EDGE: + { + ComputeTwoEdgesPresentation(aprs); + } + break; + default: + break; + } + } + break; + default: break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : function used to compute the selection associated to the +// "identic" presentation +// note : if we are in the case of lines, we create a segment between +// myFAttach and mySAttach. In the case of Circles, we create +// an arc of circle between the sames points. We Add a segment +// to link Position to its projection on the curve described +// before. +//======================================================================= + +void PrsDim_IdenticRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + Handle(Select3D_SensitiveSegment) seg; + // attachement point of the segment linking position to the curve + gp_Pnt attach; + Standard_Real confusion (Precision::Confusion()); + + if ( myFAttach.IsEqual(mySAttach, confusion) ) + { + attach = myFAttach; + } + else + { +// jfa 24/10/2000 + if ( myFShape.ShapeType() == TopAbs_EDGE ) + { + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if ( !PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), + myExtShape,curv1,curv2, + firstp1,lastp1,firstp2,lastp2, + extCurv,isInfinite1,isInfinite2,myPlane) ) return; + + if ( isCircle ) // case of Circles + { + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv1); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFAttach); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySAttach); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); + aSelection->Add(scurv); + + attach = myPosition; + ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); + } + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipses + { + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv1); + + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFAttach); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySAttach); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); + aSelection->Add(scurv); + + attach = myPosition; + ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); + } + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of Lines + { + seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach); + aSelection->Add(seg); + + //attach = projection of Position() on the curve; + gp_Vec v1 (myFAttach, mySAttach); + gp_Vec v2 (myFAttach, myPosition); + if ( v1.IsParallel(v2, Precision::Angular()) ) + { + attach = mySAttach; + } + else + { + gp_Lin ll (myFAttach, gp_Dir(v1)); + attach = ElCLib::Value(ElCLib::Parameter(ll,myPosition), ll); + } + } + else return; + } +// else if ( myFShape.ShapeType() == TopAbs_VERTEX ) +// { +// } +// jfa 24/10/2000 end + } + + // Creation of the segment linking the attachement point with the + // position + if ( !attach.IsEqual(myPosition, confusion) ) + { + seg = new Select3D_SensitiveSegment(own, attach, myPosition); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoEdgesPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoEdgesPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + Standard_Boolean isInfinite1,isInfinite2; + + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + curv1, + curv2, + firstp1, + lastp1, + firstp2, + lastp2, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + return; + aPrs->SetInfiniteState((isInfinite1 || isInfinite2) && myExtShape != 0); + + // Treatement of the case of lines + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) && curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + // we take the line curv1 like support + Handle(Geom_Line) thelin; + if (isInfinite1 && !isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv2); + else if (!isInfinite1 && isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv1); + else thelin = Handle(Geom_Line)::DownCast (curv1); + ComputeTwoLinesPresentation(aPrs, thelin, firstp1, lastp1, firstp2, lastp2, isInfinite1, isInfinite2); + } + + // Treatement of the case of circles + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + //gp_Pnt curpos; + isCircle = Standard_True; // useful for ComputeSelection + Handle(Geom_Circle) thecirc (Handle(Geom_Circle)::DownCast (curv1)); + ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2); + } + + // jfa 10/10/2000 + // Treatement of the case of ellipses + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) && curv2->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) theEll (Handle(Geom_Ellipse)::DownCast (curv1)); + ComputeTwoEllipsesPresentation(aPrs, theEll, firstp1, lastp1, firstp2, lastp2); + } + // jfa 10/10/2000 end + else + return; + + // Calculate presentation of projected edges + if ( (myExtShape != 0) && !extCurv.IsNull()) { + if (myExtShape == 1 ) + ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1); + else + ComputeProjEdgePresentation(aPrs, TopoDS::Edge(mySShape), curv2, firstp2, lastp2); + } +} + +//======================================================================= +//function : ComputeTwoLinesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two lines ( which are equal) +//input : : the +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoLinesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Line)& thelin, + gp_Pnt& firstp1, + gp_Pnt& lastp1, + gp_Pnt& firstp2, + gp_Pnt& lastp2, + const Standard_Boolean isInfinite1, + const Standard_Boolean isInfinite2) +{ + if (isInfinite1 && isInfinite2) { + if ( myAutomaticPosition ) { + myFAttach = mySAttach = thelin->Lin().Location(); + gp_Pnt curpos; + gp_Pln pln(myPlane->Pln()); + gp_Dir dir(pln.XAxis().Direction()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myFAttach.Translated(transvec); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + else { + myFAttach = mySAttach = ElCLib::Value(ElCLib::Parameter(thelin->Lin(),myPosition),thelin->Lin()); + } + TCollection_ExtendedString vals(" =="); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + myPosition); + } + else { + // Computation of the parameters of the 4 points on the line + Standard_Real pf1, pf2, pl1, pl2; + + pf1 = ElCLib::Parameter(thelin->Lin(), firstp1); + pl1 = ElCLib::Parameter(thelin->Lin(), lastp1); + + pf2 = ElCLib::Parameter(thelin->Lin(), firstp2); + pl2 = ElCLib::Parameter(thelin->Lin(), lastp2); + + if (isInfinite1) { + pf1 = pf2; + pl1 = pl2; + firstp1 = firstp2; + lastp1 = lastp2; + } + else if (isInfinite2) { + pf2 = pf1; + pl2 = pl1; + firstp2 = firstp1; + lastp2 = lastp1; + } + + Standard_Real tabRang1[4]; // array taht contains the parameters of the 4 points + // ordered by increasing abscisses. + + gp_Pnt tabRang2[4]; // array containing the points corresponding to the + // parameters in tabRang1 + + Standard_Integer tabRang3[4]; // array containing the number of the curve( 1 or 2) + // of which belongs each point of tabRang2 + + // Filling of the arrays + tabRang1[0] = pf1; tabRang2[0] = firstp1; tabRang3[0] = 1; + tabRang1[1] = pf2; tabRang2[1] = firstp2; tabRang3[1] = 2; + tabRang1[2] = pl1; tabRang2[2] = lastp1; tabRang3[2] = 1; + tabRang1[3] = pl2; tabRang2[3] = lastp2; tabRang3[3] = 2; + + // Sort of the array of parameters (tabRang1) + PrsDim_Sort(tabRang1, tabRang2, tabRang3); + + // Computation of myFAttach and mySAttach according to the + // position of the 2 linear edges + gp_Pnt curpos; + gp_Pnt middle; + + if ( (tabRang1[0] == tabRang1[1]) && (tabRang1[2] == tabRang1[3]) ) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + Standard_Real pmiddle = (tabRang1[1] + tabRang1[2]) / 2.; + Standard_Real delta = (tabRang1[3] - tabRang1[0])/ 5.; + myFAttach = ElCLib::Value(pmiddle-delta, thelin->Lin()); + mySAttach = ElCLib::Value(pmiddle+delta, thelin->Lin()); + } + + else if ( tabRang1[1] == tabRang1[2] ) { + middle = tabRang2[1]; + Standard_Real delta1 = tabRang1[1] - tabRang1[0]; + Standard_Real delta2 = tabRang1[3] - tabRang1[2]; + if ( delta1 > delta2 ) delta1 = delta2; + myFAttach = ElCLib::Value(tabRang1[1]-delta1/2., thelin->Lin()); + mySAttach = ElCLib::Value(tabRang1[1]+delta1/2., thelin->Lin()); + } + + // Case of 2 disconnected segments -> the symbol completes the gap + // between the 2 edges + //-------------------------------- + else if ( (tabRang3[0] == tabRang3[1]) && (tabRang1[1] != tabRang1[2])) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + myFAttach = tabRang2[1]; + mySAttach = tabRang2[2]; + } + else if ( (tabRang3[0] != tabRang3[1]) + && (tabRang3[1] != tabRang3[2]) // Intersection + && (tabRang1[1] != tabRang1[2]) ) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + myFAttach = tabRang2[1]; + mySAttach = tabRang2[2]; + } + else { // Inclusion + myFAttach.SetXYZ((tabRang2[0].XYZ() + tabRang2[1].XYZ())/2. ); + mySAttach.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + middle.SetXYZ( (myFAttach.XYZ() + mySAttach.XYZ() )/2.); + } + + + if ( myAutomaticPosition ) { + + gp_Vec vtrans(myFAttach, mySAttach); + vtrans.Normalize(); + vtrans.Cross(gp_Vec(myPlane->Pln().Axis().Direction())); + vtrans *= ComputeSegSize(); + curpos = middle.Translated(vtrans); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + + else { + + curpos = myPosition; + Standard_Real pcurpos = ElCLib::Parameter(thelin->Lin() ,curpos); + Standard_Real dist = thelin->Lin().Distance(curpos); + gp_Pnt proj = ElCLib::Value( pcurpos, thelin->Lin()); + gp_Vec trans; + Standard_Real confusion(Precision::Confusion()); + if ( dist >= confusion ) { + trans = gp_Vec(proj, curpos); + trans.Normalize(); + } + Standard_Real pf = ElCLib::Parameter(thelin->Lin() ,myFAttach); + Standard_Real pl = ElCLib::Parameter(thelin->Lin() ,mySAttach); + if ( pcurpos <= pf ) { + pcurpos = pf + 1e-5; + curpos = ElCLib::Value( pcurpos, thelin->Lin()); + if ( dist >= confusion ) curpos.Translate(trans*dist); + } + else if ( pcurpos >= pl ) { + pcurpos = pl - 1e-5; + curpos = ElCLib::Value( pcurpos, thelin->Lin()); + if ( dist >= confusion ) curpos.Translate(trans*dist); + } + SetPosition(curpos); + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + mySAttach, + curpos); + } +} + +// jfa 17/10/2000 +//======================================================================= +//function : ComputeTwoCirclesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two circles ( which are equal) +//input : : the circle +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoCirclesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Circle)& thecirc, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) +{ + Standard_Real confusion (Precision::Confusion()); + + // Searching of complete circles + Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); + Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); + + myCenter = thecirc->Location(); + Standard_Real aSegSize = thecirc->Radius()/5.0; + Standard_Real rad = M_PI / 5.0; + + // I. Case of 2 complete circles + if ( circ1complete && circ2complete ) + { + if (myAutomaticPosition) + { + Standard_Real pfirst1 = ElCLib::Parameter(thecirc->Circ(), firstp1); + myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), thecirc->Circ()); + mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), thecirc->Circ()); + + gp_Pnt curpos = ElCLib::Value(pfirst1,thecirc->Circ()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + else ComputeNotAutoCircPresentation(thecirc); + } + + // II. Case of one complete circle and one arc + else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) + { + gp_Pnt firstp, lastp; + if ( circ1complete && !circ2complete) + { + firstp = firstp2; + lastp = lastp2; + } + else + { + firstp = firstp1; + lastp = lastp1; + } + + if (myAutomaticPosition) + { + ComputeAutoArcPresentation(thecirc, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + + // III and IV. Case of two arcs + else if ( !circ1complete && !circ2complete ) + { + // We project all the points on the circle + Standard_Real pf1, pf2, pl1, pl2; + pf1 = ElCLib::Parameter(thecirc->Circ(), firstp1); + pf2 = ElCLib::Parameter(thecirc->Circ(), firstp2); + pl1 = ElCLib::Parameter(thecirc->Circ(), lastp1); + pl2 = ElCLib::Parameter(thecirc->Circ(), lastp2); + + // III. Arcs with common ends + // III.1. First of one and last of another + if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) + { + gp_Pnt curpos(0.,0.,0.); + Standard_Real att=0.; + if ( IsEqual2PI(pl1,pf2,confusion) ) + { + att = pl1; + curpos = lastp1; + } + else if ( IsEqual2PI(pf1,pl2,confusion) ) + { + att = pf1; + curpos = firstp1; + } + Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; + if ( rad > maxrad ) rad = maxrad; + Standard_Real pFAttach = Modulo2PI(att - rad); + Standard_Real pSAttach = Modulo2PI(att + rad); + myFAttach = ElCLib::Value(pFAttach, thecirc->Circ()); + mySAttach = ElCLib::Value(pSAttach, thecirc->Circ()); + if ( myAutomaticPosition ) + { + gp_Vec vtrans(myCenter,curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + } + // III.2. Two first or two last + else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) + { + Standard_Real l1 = Modulo2PI(pl1 - pf1); + Standard_Real l2 = Modulo2PI(pl2 - pf2); + gp_Pnt firstp,lastp; + if ( l1 < l2 ) + { + firstp = firstp1; + lastp = lastp1; + } + else + { + firstp = firstp2; + lastp = lastp2; + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(thecirc, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + // IV. All others arcs (without common ends) + else + { + // order the parameters; first will be pf1 + Standard_Real pl1m = Modulo2PI(pl1 - pf1); + Standard_Real pf2m = Modulo2PI(pf2 - pf1); + Standard_Real pl2m = Modulo2PI(pl2 - pf1); + + Standard_Boolean case1 = Standard_False; + // 1 - not intersecting arcs + // 2 - intersecting arcs, but one doesn't contain another + // 3a - first arc contains the second one + // 3b - second arc contains the first one + // 4 - two intersections + + gp_Pnt firstp, lastp; + + if ( pl1m < pf2m ) // 1 or 2b or 3b + { + if ( pl1m < pl2m ) // 1 or 3b + { + if ( pl2m < pf2m ) // 3b + { + firstp = firstp1; + lastp = lastp1; + } + else // 1 + { + case1 = Standard_True; + Standard_Real deltap1 = Modulo2PI(pf1 - pl2); + Standard_Real deltap2 = Modulo2PI(pf2 - pl1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = lastp1; + lastp = firstp2; + } + else // deltap1 + { + firstp = lastp2; + lastp = firstp1; + } + } + } + else // 2b + { + firstp = firstp1; + lastp = lastp2; + } + } + else // 2a or 3a or 4 + { + if ( pl1m < pl2m ) // 2a + { + firstp = firstp2; + lastp = lastp1; + } + else // 3a or 4 + { + if ( pl2m > pf2m ) // 3a + { + firstp = firstp2; + lastp = lastp2; + } + else // 4 + { + Standard_Real deltap1 = Modulo2PI(pl1 - pf2); + Standard_Real deltap2 = Modulo2PI(pl2 - pf1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = firstp1; + lastp = lastp2; + } + else // deltap1 + { + firstp = firstp2; + lastp = lastp1; + } + } + } + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(thecirc,firstp,lastp,case1); + } + else + { + if ( case1 ) + { + myFAttach = firstp; + mySAttach = lastp; + } + else ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + gp_Pnt attach = myPosition; + ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myPlane->Pln().Position().Ax2(), + myCenter, + myFAttach, + mySAttach, + myPosition, + attach); +} + +//======================================================================= +//function : ComputeAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// not in the case of dragging. +//======================================================================= +void PrsDim_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Circle)& thecirc, + const gp_Pnt& firstp, + const gp_Pnt& lastp, + const Standard_Boolean isstatic) +{ + Standard_Real aSegSize = thecirc->Radius()/5.0; + Standard_Real rad = M_PI / 5.0; + + Standard_Real pFA = ElCLib::Parameter(thecirc->Circ(),firstp); + Standard_Real pSA = ElCLib::Parameter(thecirc->Circ(),lastp); + Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; + + if ( (rad > maxrad) || isstatic ) rad = maxrad; + Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); + + myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),thecirc->Circ()); + mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),thecirc->Circ()); + + gp_Pnt curpos = ElCLib::Value(pmiddle,thecirc->Circ()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + myPosition = curpos.Translated(vtrans); +} + +//======================================================================= +//function : ComputeNotAutoCircPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of full circles. +// The symbol of the constraint moves together with arc +// representing the constraint around all the circle. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoCircPresentation(const Handle(Geom_Circle)& thecirc) +{ + gp_Pnt curpos = myPosition; + + Handle(Geom_Circle) cirNotAuto = new Geom_Circle(thecirc->Circ()); + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + if ( myCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(myCenter, myFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real rad = M_PI / 5.0; + Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto->Circ(),curpos); + Standard_Real pFAttach = pcurpos - rad; + Standard_Real pSAttach = pcurpos + rad; + myFAttach = ElCLib::Value(pFAttach,cirNotAuto->Circ()); + mySAttach = ElCLib::Value(pSAttach,cirNotAuto->Circ()); +} + +//======================================================================= +//function : ComputeNotAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of circles. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Circle)& thecirc, + const gp_Pnt& pntfirst, + const gp_Pnt& pntlast) +{ + gp_Pnt curpos = myPosition; + + gp_Circ cirNotAuto = thecirc->Circ(); + + Standard_Real pFPnt = ElCLib::Parameter(cirNotAuto, pntfirst); + Standard_Real pSPnt = ElCLib::Parameter(cirNotAuto, pntlast); + Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; + + Standard_Real rad = M_PI / 5; + if ( deltap < rad ) + { + myFAttach = pntfirst; + mySAttach = pntlast; + } + else + { + gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), cirNotAuto); + gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), cirNotAuto); + + ComputeAttach(cirNotAuto,aFPnt,aSPnt,curpos); + + Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto,curpos); + myFAttach = ElCLib::Value(pcurpos - rad, cirNotAuto); + mySAttach = ElCLib::Value(pcurpos + rad, cirNotAuto); + } +} +// jfa 17/10/2000 end + +// jfa 18/10/2000 +//======================================================================= +//function : ComputeTwoEllipsesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two ellipses (which are equal) +//input : : the ellipse +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoEllipsesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) +{ + Standard_Real confusion (Precision::Confusion()); + + // Searching of complete ellipses + Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); + Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); + + myCenter = theEll->Location(); + Standard_Real aSegSize = theEll->MajorRadius()/5.0; + Standard_Real rad = M_PI / 5.0; + + // I. Case of 2 complete ellipses + if ( circ1complete && circ2complete ) + { + if (myAutomaticPosition) + { + Standard_Real pfirst1 = ElCLib::Parameter(theEll->Elips(), firstp1); + myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), theEll->Elips()); + mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), theEll->Elips()); + + gp_Pnt curpos = ElCLib::Value(pfirst1,theEll->Elips()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + else ComputeNotAutoElipsPresentation(theEll); + } + + // II. Case of one complete circle and one arc + else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) + { + gp_Pnt firstp, lastp; + if ( circ1complete && !circ2complete) + { + firstp = firstp2; + lastp = lastp2; + } + else + { + firstp = firstp1; + lastp = lastp1; + } + + if (myAutomaticPosition) + { + ComputeAutoArcPresentation(theEll, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + + // III and IV. Case of two arcs + else if ( !circ1complete && !circ2complete ) + { + // We project all the points on the circle + Standard_Real pf1, pf2, pl1, pl2; + pf1 = ElCLib::Parameter(theEll->Elips(), firstp1); + pf2 = ElCLib::Parameter(theEll->Elips(), firstp2); + pl1 = ElCLib::Parameter(theEll->Elips(), lastp1); + pl2 = ElCLib::Parameter(theEll->Elips(), lastp2); + + // III. Arcs with common ends + // III.1. First of one and last of another + if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) + { + gp_Pnt curpos; + Standard_Real att=0.; + if ( IsEqual2PI(pl1,pf2,confusion) ) + { + att = pl1; + curpos = lastp1; + } + else if ( IsEqual2PI(pf1,pl2,confusion) ) + { + att = pf1; + curpos = firstp1; + } + Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; + if ( rad > maxrad ) rad = maxrad; + Standard_Real pFAttach = Modulo2PI(att - rad); + Standard_Real pSAttach = Modulo2PI(att + rad); + myFAttach = ElCLib::Value(pFAttach, theEll->Elips()); + mySAttach = ElCLib::Value(pSAttach, theEll->Elips()); + if ( myAutomaticPosition ) + { + gp_Vec vtrans(myCenter,curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + } + // III.2. Two first or two last + else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) + { + Standard_Real l1 = Modulo2PI(pl1 - pf1); + Standard_Real l2 = Modulo2PI(pl2 - pf2); + gp_Pnt firstp,lastp; + if ( l1 < l2 ) + { + firstp = firstp1; + lastp = lastp1; + } + else + { + firstp = firstp2; + lastp = lastp2; + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(theEll, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + // IV. All others arcs (without common ends) + else + { + // order the parameters; first will be pf1 + Standard_Real pl1m = Modulo2PI(pl1 - pf1); + Standard_Real pf2m = Modulo2PI(pf2 - pf1); + Standard_Real pl2m = Modulo2PI(pl2 - pf1); + + Standard_Boolean case1 = Standard_False; + // 1 - not intersecting arcs + // 2 - intersecting arcs, but one doesn't contain another + // 3a - first arc contains the second one + // 3b - second arc contains the first one + // 4 - two intersections + + gp_Pnt firstp, lastp; + + if ( pl1m < pf2m ) // 1 or 2b or 3b + { + if ( pl1m < pl2m ) // 1 or 3b + { + if ( pl2m < pf2m ) // 3b + { + firstp = firstp1; + lastp = lastp1; + } + else // 1 + { + case1 = Standard_True; + Standard_Real deltap1 = Modulo2PI(pf1 - pl2); + Standard_Real deltap2 = Modulo2PI(pf2 - pl1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = lastp1; + lastp = firstp2; + } + else // deltap1 + { + firstp = lastp2; + lastp = firstp1; + } + } + } + else // 2b + { + firstp = firstp1; + lastp = lastp2; + } + } + else // 2a or 3a or 4 + { + if ( pl1m < pl2m ) // 2a + { + firstp = firstp2; + lastp = lastp1; + } + else // 3a or 4 + { + if ( pl2m > pf2m ) // 3a + { + firstp = firstp2; + lastp = lastp2; + } + else // 4 + { + Standard_Real deltap1 = Modulo2PI(pl1 - pf2); + Standard_Real deltap2 = Modulo2PI(pl2 - pf1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = firstp1; + lastp = lastp2; + } + else // deltap1 + { + firstp = firstp2; + lastp = lastp1; + } + } + } + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(theEll,firstp,lastp,case1); + } + else + { + if ( case1 ) + { + myFAttach = firstp; + mySAttach = lastp; + } + else ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + gp_Pnt attach = myPosition; + ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + theEll->Elips(), + myFAttach, + mySAttach, + myPosition, + attach); +} + +//======================================================================= +//function : ComputeAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// not in the case of dragging. +//======================================================================= +void PrsDim_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& firstp, + const gp_Pnt& lastp, + const Standard_Boolean isstatic) +{ + Standard_Real aSegSize = theEll->MajorRadius()/5.0; + Standard_Real rad = M_PI / 5.0; + + gp_Elips anEll = theEll->Elips(); + + Standard_Real pFA = ElCLib::Parameter(anEll,firstp); + Standard_Real pSA = ElCLib::Parameter(anEll,lastp); + Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; + + if ( (rad > maxrad) || isstatic ) rad = maxrad; + Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); + + myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),anEll); + mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),anEll); + + gp_Pnt curpos = ElCLib::Value(pmiddle,anEll); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + myPosition = curpos.Translated(vtrans); +} + +//======================================================================= +//function : ComputeNotAutoElipsPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of ellipses. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoElipsPresentation(const Handle(Geom_Ellipse)& theEll) +{ + gp_Pnt curpos = myPosition; + + gp_Elips anEll = theEll->Elips(); + + // Case of confusion between the current position and the center + // of the ellipse -> we move the current position + Standard_Real confusion (Precision::Confusion()); + if ( myCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(myCenter, myFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real rad = M_PI / 5.0; +// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + Standard_Real pFAttach = pcurpos - rad; + Standard_Real pSAttach = pcurpos + rad; + myFAttach = ElCLib::Value(pFAttach,anEll); + mySAttach = ElCLib::Value(pSAttach,anEll); +} + +//======================================================================= +//function : ComputeNotAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of ellipses. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& pntfirst, + const gp_Pnt& pntlast) +{ + gp_Pnt curpos = myPosition; + + gp_Elips anEll = theEll->Elips(); + + Standard_Real pFPnt = ElCLib::Parameter(anEll, pntfirst); + Standard_Real pSPnt = ElCLib::Parameter(anEll, pntlast); + Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; + + Standard_Real rad = M_PI / 5; + if ( deltap < rad ) + { + myFAttach = pntfirst; + mySAttach = pntlast; + } + else + { + gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), anEll); + gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), anEll); + + ComputeAttach(anEll,aFPnt,aSPnt,curpos); + +// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + myFAttach = ElCLib::Value(pcurpos - rad, anEll); + mySAttach = ElCLib::Value(pcurpos + rad, anEll); + } +} +// jfa 18/10/2000 end + +//======================================================================= +//function : ComputeTwoVerticesPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoVerticesPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + Standard_Boolean isOnPlane1, isOnPlane2; + const TopoDS_Vertex& FVertex = TopoDS::Vertex(myFShape); + const TopoDS_Vertex& SVertex = TopoDS::Vertex(mySShape); + + PrsDim::ComputeGeometry(FVertex, myFAttach, myPlane, isOnPlane1); + PrsDim::ComputeGeometry(SVertex, mySAttach, myPlane, isOnPlane2); + + if (isOnPlane1 && isOnPlane2) + myExtShape = 0; + else if ( isOnPlane1 && !isOnPlane2) + myExtShape = 2; + else if (!isOnPlane1 && isOnPlane2) + myExtShape = 1; + else + return ; + + + // The attachement points are the points themselves that must be + //identical + myFAttach = BRep_Tool::Pnt(FVertex); + mySAttach = myFAttach; + + gp_Pnt curpos; + if (myAutomaticPosition) + { + //Computation of the size of the symbol + Standard_Real symbsize = ComputeSegSize(); + if (symbsize <= Precision::Confusion()) symbsize = 1.; + symbsize*=5; + // Computation of the direction of the segment of the presentation + // we take the median of the edges connected to vertices + gp_Dir dF, dS; + gp_Dir myDir; + TColStd_ListIteratorOfListOfTransient it(Users()); + if (it.More()) + { + Handle(AIS_Shape) USER (Handle(AIS_Shape)::DownCast(it.Value())); + if (!USER.IsNull()) + { + const TopoDS_Shape& SH =USER->Shape(); + if ( (!SH.IsNull()) && (SH.ShapeType() == TopAbs_WIRE) ) + { + const TopoDS_Wire& WIRE = TopoDS::Wire(USER->Shape()); + Standard_Boolean done = ComputeDirection(WIRE,FVertex,dF); + if (!done) return; + done = ComputeDirection(WIRE,SVertex,dS); + if (!done) return; + } + else return; + } + else return; + + // computation of the segment direction like average + // of the 2 computed directions. + if ( dF.IsParallel(dS, Precision::Angular()) ) + { + myDir = dF.Crossed(myPlane->Pln().Axis().Direction()); + } + else + { + myDir.SetXYZ(dF.XYZ() + dS.XYZ()); + } + curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; + } +// jfa 11/10/2000 + else + { + curpos = myFAttach; + } +// jfa 11/10/2000 end + + myPosition = curpos; + myAutomaticPosition = Standard_False; + } + else + { + curpos = myPosition; + } + + // Presentation computation + TCollection_ExtendedString vals(" ++"); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + curpos); + // Calculate the projection of vertex + if ( myExtShape == 1) + ComputeProjVertexPresentation(aPrs,FVertex,myFAttach); + else if ( myExtShape == 2) + ComputeProjVertexPresentation(aPrs,SVertex,mySAttach); +} + + + +//======================================================================= +//function : ComputeSegSize +//purpose : +//======================================================================= +Standard_Real PrsDim_IdenticRelation::ComputeSegSize() const +{ + return 1.; +} + +//======================================================================= +//function : ComputeDirection +//purpose : Compute a direction according to the different geometric +// elements connected to the vertex , in way to not have +// overlap between the symbol and them. +//======================================================================= +Standard_Boolean PrsDim_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire, + const TopoDS_Vertex& VERT, + gp_Dir& dF) const +{ + // we take the median of the edges connected to vertices + TopoDS_Edge edg1,edg2; + ConnectedEdges(aWire,VERT,edg1,edg2); + + if ( edg1.IsNull() && edg2.IsNull() ) { + return Standard_False; + } + + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + + // Case with 2 edges connected to the vertex + if ( !edg1.IsNull() && !edg2.IsNull() ) { + if ( !PrsDim::ComputeGeometry(edg1,edg2, + curv1,curv2, + firstp1, lastp1, + firstp2, lastp2,myPlane)) + return Standard_False; + + gp_Dir d1, d2; + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + d1 = ComputeCircleDirection(Handle(Geom_Circle)::DownCast (curv1), VERT); + } + else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + d1 = ComputeLineDirection(Handle(Geom_Line)::DownCast (curv1), firstp1); + } + else + return Standard_False; + + if ( curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + d2 = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv2), VERT); + } + else if (curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + d2 =ComputeLineDirection( Handle(Geom_Line)::DownCast (curv2), firstp2); + } + else + return Standard_False; + + if ( !d1.IsParallel(d2, Precision::Angular() )) + dF.SetXYZ( (d1.XYZ() + d2.XYZ())/2 ); + else { + dF= d1.Crossed(myPlane->Pln().Axis().Direction()); + } + } + + // Case where is at an extremity of a wire. + else { + TopoDS_Edge VEdge; + if ( !edg1.IsNull() ) + VEdge = edg1; + else if (!edg2.IsNull() ) + VEdge = edg2; + else + return Standard_False; + + if ( !PrsDim::ComputeGeometry(VEdge, curv1, firstp1, lastp1) ) + return Standard_False; + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + dF = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv1), VERT); + } + else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + dF = ComputeLineDirection( Handle(Geom_Line)::DownCast (curv1), firstp1); + } + else + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeLineDirection +//purpose : +//======================================================================= +gp_Dir PrsDim_IdenticRelation::ComputeLineDirection(const Handle(Geom_Line)& lin, + const gp_Pnt& firstP) const +{ + gp_Dir dir; + dir = lin->Lin().Direction(); + if ( !myFAttach.IsEqual(firstP, Precision::Confusion()) ) + dir.Reverse(); + return dir; +} + +//======================================================================= +//function : ComputeCircleDirection +//purpose : +//======================================================================= +gp_Dir PrsDim_IdenticRelation::ComputeCircleDirection(const Handle(Geom_Circle)& circ, + const TopoDS_Vertex& VERT) const +{ + gp_Vec V(circ->Location(),BRep_Tool::Pnt(VERT)); + return gp_Dir(V); +} + +//======================================================================= +//function : ComputeOneEdgeOVertexPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeOneEdgeOVertexPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + TopoDS_Vertex V; + TopoDS_Edge E; + Standard_Integer numedge; + + if (myFShape.ShapeType() == TopAbs_VERTEX) { + V = TopoDS::Vertex(myFShape); + E = TopoDS::Edge(mySShape); + numedge = 2;// edge = 2nd shape + } + else { + V = TopoDS::Vertex(mySShape); + E = TopoDS::Edge(myFShape); + numedge = 1; // edge = 1st shape + } + gp_Pnt ptonedge1,ptonedge2; + Handle(Geom_Curve) aCurve; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + if (!PrsDim::ComputeGeometry(E,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,myPlane)) + return; + aPrs->SetInfiniteState(isInfinite); + PrsDim::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex); + + // only the curve can be projected + if (!isOnPlanEdge && !isOnPlanVertex) return; + + if (!isOnPlanEdge) { + if (numedge == 1) myExtShape = 1; + else myExtShape = 2; + } + else if (!isOnPlanVertex) { + if (numedge == 1) myExtShape = 2; + else myExtShape = 1; + } + // The attachement points are the point + myFAttach = BRep_Tool::Pnt(V); + mySAttach = myFAttach; + + gp_Pnt curpos; + if (myAutomaticPosition) { + //Computation of the size of the symbol + Standard_Real symbsize = ComputeSegSize(); + symbsize*=5; + // Computation of the direction of the segment of the presentation + // we take the median of the edges connected to vertices + gp_Dir myDir; + if ( aCurve->IsKind(STANDARD_TYPE(Geom_Line))) { + myDir = Handle(Geom_Line)::DownCast (aCurve)->Lin().Direction(); + myDir.Cross(myPlane->Pln().Axis().Direction()); + } + else if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle))) { + Handle(Geom_Circle) CIR = Handle(Geom_Circle)::DownCast (aCurve); + myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); + } + // jfa 10/10/2000 + else if (aCurve->IsKind(STANDARD_TYPE(Geom_Ellipse))) { + Handle(Geom_Ellipse) CIR = Handle(Geom_Ellipse)::DownCast (aCurve); + myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); + } + // jfa 10/10/2000 end + + curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + else { + curpos = myPosition; + } + + // Presentation computation + TCollection_ExtendedString vals(" -+-"); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + curpos); + if (myExtShape != 0) { + if (!extCurv.IsNull()) { // the edge is not in the WP + ComputeProjEdgePresentation(aPrs,E,Handle(Geom_Line)::DownCast (aCurve),ptonedge1,ptonedge2); + } + } +} diff --git a/src/PrsDim/PrsDim_IdenticRelation.hxx b/src/PrsDim/PrsDim_IdenticRelation.hxx new file mode 100644 index 0000000000..2cc184f45d --- /dev/null +++ b/src/PrsDim/PrsDim_IdenticRelation.hxx @@ -0,0 +1,124 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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. + +#ifndef _PrsDim_IdenticRelation_HeaderFile +#define _PrsDim_IdenticRelation_HeaderFile + +#include +#include +#include +#include +#include + +class TopoDS_Shape; +class Geom_Plane; +class Geom_Line; +class gp_Pnt; +class Geom_Circle; +class Geom_Ellipse; +class TopoDS_Wire; +class TopoDS_Vertex; +class gp_Dir; + +DEFINE_STANDARD_HANDLE(PrsDim_IdenticRelation, PrsDim_Relation) + +//! Constructs a constraint by a relation of identity +//! between two or more datums figuring in shape +//! Interactive Objects. +class PrsDim_IdenticRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_IdenticRelation, PrsDim_Relation) +public: + + //! Initializes the relation of identity between the two + //! entities, FirstShape and SecondShape. The plane + //! aPlane is initialized in case a visual reference is + //! needed to show identity. + Standard_EXPORT PrsDim_IdenticRelation(const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + Standard_Boolean HasUsers() const { return !myUsers.IsEmpty(); } + + const TColStd_ListOfTransient& Users() const { return myUsers; } + + void AddUser (const Handle(Standard_Transient)& theUser) { myUsers.Append (theUser); } + + void ClearUsers() { myUsers.Clear(); } + + //! Returns true if the interactive object is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeOneEdgeOVertexPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoLinesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Line)& aLin, gp_Pnt& Pnt1On1, gp_Pnt& Pnt2On1, gp_Pnt& Pnt1On2, gp_Pnt& Pnt2On2, const Standard_Boolean isInf1, const Standard_Boolean isInf2); + + Standard_EXPORT void ComputeTwoCirclesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Circle)& aCircle, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of automatic presentation + Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); + + //! Computes the presentation of the identic constraint + //! between 2 circles in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoCircPresentation (const Handle(Geom_Circle)& aCircle); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); + + Standard_EXPORT void ComputeTwoEllipsesPresentation (const Handle(Prs3d_Presentation)& aPrs, const Handle(Geom_Ellipse)& anEll, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of automatic presentation + Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); + + //! Computes the presentation of the identic constraint + //! between 2 ellipses in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoElipsPresentation (const Handle(Geom_Ellipse)& theEll); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); + + Standard_EXPORT void ComputeTwoVerticesPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT Standard_Real ComputeSegSize() const; + + Standard_EXPORT Standard_Boolean ComputeDirection (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, gp_Dir& aDir) const; + + Standard_EXPORT gp_Dir ComputeLineDirection (const Handle(Geom_Line)& aLin, const gp_Pnt& anExtremity) const; + + Standard_EXPORT gp_Dir ComputeCircleDirection (const Handle(Geom_Circle)& aCirc, const TopoDS_Vertex& ConnectedVertex) const; + +private: + + TColStd_ListOfTransient myUsers; + Standard_Boolean isCircle; + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Pnt myCenter; + +}; + +#endif // _PrsDim_IdenticRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_KindOfDimension.hxx b/src/PrsDim/PrsDim_KindOfDimension.hxx new file mode 100644 index 0000000000..b42a0b97ad --- /dev/null +++ b/src/PrsDim/PrsDim_KindOfDimension.hxx @@ -0,0 +1,40 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_KindOfDimension_HeaderFile +#define _PrsDim_KindOfDimension_HeaderFile + +//! Declares the kinds of dimensions needed in the +//! display of Interactive Objects. +enum PrsDim_KindOfDimension +{ + PrsDim_KOD_NONE, + PrsDim_KOD_LENGTH, + PrsDim_KOD_PLANEANGLE, + PrsDim_KOD_SOLIDANGLE, + PrsDim_KOD_AREA, + PrsDim_KOD_VOLUME, + PrsDim_KOD_MASS, + PrsDim_KOD_TIME, + PrsDim_KOD_RADIUS, + PrsDim_KOD_DIAMETER, + PrsDim_KOD_CHAMF2D, + PrsDim_KOD_CHAMF3D, + PrsDim_KOD_OFFSET, + PrsDim_KOD_ELLIPSERADIUS +}; + +#endif // _PrsDim_KindOfDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_KindOfRelation.hxx b/src/PrsDim/PrsDim_KindOfRelation.hxx new file mode 100644 index 0000000000..2d7cbb540e --- /dev/null +++ b/src/PrsDim/PrsDim_KindOfRelation.hxx @@ -0,0 +1,33 @@ +// Created on: 2016-11-25 +// Copyright (c) 2016 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. + +#ifndef _PrsDim_KindOfRelation_HeaderFile +#define _PrsDim_KindOfRelation_HeaderFile + +enum PrsDim_KindOfRelation +{ + PrsDim_KOR_NONE = 0, + PrsDim_KOR_CONCENTRIC, + PrsDim_KOR_EQUALDISTANCE, + PrsDim_KOR_EQUALRADIUS, + PrsDim_KOR_FIX, + PrsDim_KOR_IDENTIC, + PrsDim_KOR_OFFSET, + PrsDim_KOR_PARALLEL, + PrsDim_KOR_PERPENDICULAR, + PrsDim_KOR_TANGENT, + PrsDim_KOR_SYMMETRIC +}; + +#endif diff --git a/src/PrsDim/PrsDim_KindOfSurface.hxx b/src/PrsDim/PrsDim_KindOfSurface.hxx new file mode 100644 index 0000000000..06f423e627 --- /dev/null +++ b/src/PrsDim/PrsDim_KindOfSurface.hxx @@ -0,0 +1,32 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_KindOfSurface_HeaderFile +#define _PrsDim_KindOfSurface_HeaderFile + +enum PrsDim_KindOfSurface +{ + PrsDim_KOS_Plane, + PrsDim_KOS_Cylinder, + PrsDim_KOS_Cone, + PrsDim_KOS_Sphere, + PrsDim_KOS_Torus, + PrsDim_KOS_Revolution, + PrsDim_KOS_Extrusion, + PrsDim_KOS_OtherSurface +}; + +#endif // _PrsDim_KindOfSurface_HeaderFile diff --git a/src/PrsDim/PrsDim_LengthDimension.cxx b/src/PrsDim/PrsDim_LengthDimension.cxx new file mode 100644 index 0000000000..60f536adb6 --- /dev/null +++ b/src/PrsDim/PrsDim_LengthDimension.cxx @@ -0,0 +1,825 @@ +// Created on: 1996-12-05 +// Created by: Arnaud BOUZY/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2013 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_LengthDimension, PrsDim_Dimension) + +//======================================================================= +//function : Constructor +//purpose : Dimension between two faces +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFirstFace, theSecondFace); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two shape +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFace, theEdge); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two points +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFirstPoint, theSecondPoint, thePlane); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two shape +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetCustomPlane (thePlane); + SetMeasuredShapes (theFirstShape, theSecondShape); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension of one edge +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theEdge, thePlane); + SetFlyout (15.0); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane) +{ + myFirstPoint = theFirstPoint; + mySecondPoint = theSecondPoint; + myFirstShape = BRepLib_MakeVertex (myFirstPoint); + mySecondShape = BRepLib_MakeVertex (mySecondPoint); + myGeometryType = GeometryType_Points; + SetCustomPlane (thePlane); + myIsGeometryValid = IsValidPoints (theFirstPoint, theSecondPoint); + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane) +{ + myFirstShape = theEdge; + mySecondShape = TopoDS_Shape(); + myGeometryType = GeometryType_Edge; + SetCustomPlane (thePlane); + myIsGeometryValid = InitOneShapePoints (myFirstShape); + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +{ + SetMeasuredShapes (theFirstFace, theSecondFace); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge) +{ + SetMeasuredShapes (theFace, theEdge); +} + +//======================================================================= +//function : SetMeasuredShapes +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape) +{ + gp_Pln aComputedPlane; + Standard_Boolean isPlaneReturned = Standard_False; + + myFirstShape = theFirstShape; + mySecondShape = theSecondShape; + myIsGeometryValid = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + if (isPlaneReturned) + { + myPlane = aComputedPlane; + } + else + { + myIsGeometryValid = Standard_False; + } + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::CheckPlane (const gp_Pln& thePlane) const +{ + Standard_Boolean anIsFaultyNormal = + thePlane.Axis().Direction().IsParallel(gce_MakeDir (myFirstPoint, mySecondPoint), Precision::Angular()); + + if ((!thePlane.Contains (myFirstPoint, Precision::Confusion()) && !thePlane.Contains (mySecondPoint, Precision::Confusion())) + || anIsFaultyNormal) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +gp_Pln PrsDim_LengthDimension::ComputePlane (const gp_Dir& theAttachDir) const +{ + if (!IsValidPoints (myFirstPoint, mySecondPoint)) + { + return gp_Pln(); + } + + gp_Pnt aThirdPoint (myFirstPoint.Translated (gp_Vec(theAttachDir))); + gce_MakePln aPlaneConstrustor (myFirstPoint, mySecondPoint, aThirdPoint); + return aPlaneConstrustor.Value(); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_LengthDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_LengthDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_LengthDimension::ComputeValue() const +{ + if (!IsValid()) + return 0.0; + + if (!myHasCustomDirection) + return myFirstPoint.Distance (mySecondPoint); + + return fabs (gp_Vec(myFirstPoint, mySecondPoint).Dot (myDirection)); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_LengthDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + DrawLinearDimension (thePresentation, theMode, myFirstPoint, mySecondPoint); +} + + //======================================================================= +//function : ComputeFlyoutLinePoints +//purpose : +//======================================================================= +void PrsDim_LengthDimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) +{ + if (!myHasCustomDirection) + { + PrsDim_Dimension::ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, theLineBegPoint, theLineEndPoint); + return; + } + + // find scalar of projection target vector (from start to second point) to flyout vector + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Vec aFlyoutNormalizedDir(aPlaneNormal.Direction() ^ myDirection); + aFlyoutNormalizedDir.Normalize(); + Standard_Real aTargetProjectedToFlyout = gp_Vec(theFirstPoint, theSecondPoint).Dot (aFlyoutNormalizedDir); + + gp_Dir aFlyoutVector = aFlyoutNormalizedDir; + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout() + aTargetProjectedToFlyout, aLine1); + theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : +//======================================================================= +void PrsDim_LengthDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) +{ + if (!IsValid()) + { + return; + } + + ComputeLinearFlyouts (theSelection, theEntityOwner, myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : IsValidPoints +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) const +{ + return theFirstPoint.Distance (theSecondPoint) > Precision::Confusion(); +} + +//======================================================================= +//function : InitTwoEdgesLength +//purpose : Initialization of dimension between two linear edges +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitTwoEdgesLength (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + gp_Dir& theDirAttach) +{ + BRepAdaptor_Curve aFirstCurveAdapt (theFirstEdge); + if (aFirstCurveAdapt.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + BRepAdaptor_Curve aSecondCurveAdapt (theSecondEdge); + if (aSecondCurveAdapt.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Handle(Geom_Curve) aFirstCurve; + Handle(Geom_Curve) aSecondCurve; + + gp_Pnt aPoint11 (gp::Origin()); + gp_Pnt aPoint12 (gp::Origin()); + gp_Pnt aPoint21 (gp::Origin()); + gp_Pnt aPoint22 (gp::Origin()); + Standard_Boolean isFirstInfinite = Standard_False; + Standard_Boolean isSecondInfinite = Standard_False; + + if (!PrsDim::ComputeGeometry (theFirstEdge, theSecondEdge, + aFirstCurve, aSecondCurve, + aPoint11, aPoint12, + aPoint21, aPoint22, + isFirstInfinite, + isSecondInfinite)) + { + return Standard_False; + } + + const Handle(Geom_Line) aFirstLine = Handle(Geom_Line)::DownCast (aFirstCurve); + const Handle(Geom_Line) aSecondLine = Handle(Geom_Line)::DownCast (aSecondCurve); + + if (!aFirstLine->Lin().Direction().IsParallel (aSecondLine->Lin().Direction(),Precision::Angular())) + { + return Standard_False; + } + + theDirAttach = aFirstLine->Lin().Direction(); + + gp_Pnt aPoint; + + if (!isFirstInfinite) + { + if (PrsDim::Nearest (aSecondCurve, aPoint11, aPoint21, aPoint22, aPoint)) + { + myFirstPoint = aPoint11; + mySecondPoint = aPoint; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (PrsDim::Nearest (aSecondCurve, aPoint12, aPoint21, aPoint22, aPoint)) + { + myFirstPoint = aPoint12; + mySecondPoint = aPoint; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + } + + if (!isSecondInfinite) + { + if (PrsDim::Nearest (aFirstCurve, aPoint21, aPoint11, aPoint12, aPoint)) + { + myFirstPoint = aPoint; + mySecondPoint = aPoint21; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + if (PrsDim::Nearest (aFirstCurve, aPoint22, aPoint11, aPoint12, aPoint)) + { + myFirstPoint = aPoint; + mySecondPoint = aPoint22; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + } + + GeomAPI_ExtremaCurveCurve anExtrema (aFirstCurve, aSecondCurve); + anExtrema.NearestPoints (myFirstPoint, mySecondPoint); + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitEdgeVertexLength +//purpose : for first edge and second vertex shapes +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitEdgeVertexLength (const TopoDS_Edge& theEdge, + const TopoDS_Vertex& theVertex, + gp_Dir& theEdgeDir, + Standard_Boolean isInfinite) +{ + gp_Pnt anEdgePoint1 (gp::Origin()); + gp_Pnt anEdgePoint2 (gp::Origin()); + Handle(Geom_Curve) aCurve; + + if (!PrsDim::ComputeGeometry (theEdge, aCurve, anEdgePoint1, anEdgePoint2, isInfinite)) + { + return Standard_False; + } + + myFirstPoint = BRep_Tool::Pnt (theVertex); + + Handle(Geom_Line) aGeomLine (Handle(Geom_Line)::DownCast (aCurve)); + const gp_Lin& aLin = aGeomLine->Lin(); + + // Get direction of edge to build plane automatically. + theEdgeDir = aLin.Direction(); + + mySecondPoint = PrsDim::Nearest (aLin, myFirstPoint); + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitEdgeFaceLength +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitEdgeFaceLength (const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace, + gp_Dir& theEdgeDir) +{ + theEdgeDir = gp::DX(); + + // Find attachment points (closest distance between the edge and the face) + BRepExtrema_DistShapeShape aDistAdaptor (theEdge, theFace, Extrema_ExtFlag_MIN); + if (!aDistAdaptor.IsDone() || aDistAdaptor.NbSolution() <1) + { + return Standard_False; + } + myFirstPoint = aDistAdaptor.PointOnShape1 (1); + mySecondPoint = aDistAdaptor.PointOnShape2 (1); + + // Take direction for dimension line (will be orthogonalized later) parallel to edge + BRepAdaptor_Curve aCurveAdaptor (theEdge); + Standard_Real aParam; + if (aDistAdaptor.SupportOnShape1 (1).ShapeType() == TopAbs_EDGE) + { + aDistAdaptor.ParOnEdgeS1 (1, aParam); + } + else + { + Standard_Real aD1 = aCurveAdaptor.Value(aCurveAdaptor.FirstParameter()).SquareDistance (myFirstPoint); + Standard_Real aD2 = aCurveAdaptor.Value(aCurveAdaptor.LastParameter()).SquareDistance (myFirstPoint); + aParam = (aD1 < aD2 ? aCurveAdaptor.FirstParameter() : aCurveAdaptor.LastParameter()); + } + gp_Pnt aP; + gp_Vec aV; + aCurveAdaptor.D1 (aParam, aP, aV); + if (aV.SquareMagnitude() > gp::Resolution()) + { + theEdgeDir = aV; + } + + // reverse direction if parameter is close to the end of the curve, + // to reduce chances to have overlapping between dimension line and edge + if (Abs (aParam - aCurveAdaptor.FirstParameter()) < Abs (aParam - aCurveAdaptor.LastParameter())) + { + theEdgeDir.Reverse(); + } + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitTwoShapesPoints +//purpose : Initialization of two points where dimension layouts +// will be attached +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + gp_Pln& theComputedPlane, + Standard_Boolean& theIsPlaneComputed) +{ + theIsPlaneComputed = Standard_False; + gp_Dir aDirAttach; + Standard_Boolean isInfinite = Standard_False; + Standard_Boolean isSuccess = Standard_False; + switch (theFirstShape.ShapeType()) + { + case TopAbs_FACE: + { + // Initialization for face + gp_Pln aFirstPlane; + Handle(Geom_Surface) aFirstSurface; + PrsDim_KindOfSurface aFirstSurfKind; + Standard_Real aFirstOffset; + + TopoDS_Face aFirstFace = TopoDS::Face (theFirstShape); + + PrsDim::InitFaceLength (TopoDS::Face (theFirstShape), + aFirstPlane, + aFirstSurface, + aFirstSurfKind, + aFirstOffset); + + if (theSecondShape.ShapeType() == TopAbs_FACE) + { + // Initialization for face + myGeometryType = GeometryType_Faces; + gp_Pln aSecondPlane; + Handle(Geom_Surface) aSecondSurface; + PrsDim_KindOfSurface aSecondSurfKind; + Standard_Real aSecondOffset; + + TopoDS_Face aSecondFace = TopoDS::Face (theSecondShape); + + PrsDim::InitFaceLength (aSecondFace, + aSecondPlane, + aSecondSurface, + aSecondSurfKind, + aSecondOffset); + + if (aFirstSurfKind == PrsDim_KOS_Plane) + { + if (!aFirstPlane.Axis().Direction().IsParallel (aSecondPlane.Axis().Direction(), Precision::Angular())) + { + return Standard_False; + } + + TopExp_Explorer anExplorer (theFirstShape, TopAbs_VERTEX); + + // In case of infinite planes + if (!anExplorer.More()) + { + myFirstPoint = aFirstPlane.Location(); + } + else + { + myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); + } + + mySecondPoint = PrsDim::ProjectPointOnPlane (myFirstPoint, aSecondPlane); + + Standard_Real anU, aV; + ElSLib::Parameters (aSecondPlane, mySecondPoint, anU, aV); + + BRepTopAdaptor_FClass2d aClassifier (aSecondFace, Precision::Confusion()); + TopAbs_State aState = aClassifier.Perform (gp_Pnt2d (anU, aV), Standard_False); + + if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) + { + mySecondPoint = PrsDim::Nearest (aSecondFace, myFirstPoint); + } + + isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); + if (isSuccess) + { + theComputedPlane = ComputePlane (aFirstPlane.Position().XDirection()); + theIsPlaneComputed = Standard_True; + } + } + else // curvilinear faces + { + Standard_Real aU1Min, aV1Min, aU1Max, aV1Max; + Standard_Real aU2Min, aV2Min, aU2Max, aV2Max; + BRepTools::UVBounds (aFirstFace, aU1Min, aU1Max, aV1Min, aV1Max); + BRepTools::UVBounds (aSecondFace, aU2Min, aU2Max, aV2Min, aV2Max); + + GeomAPI_ExtremaSurfaceSurface anExtrema (aFirstSurface, aSecondSurface, + aU1Min, aU1Max, aV1Min, aV1Max, + aU2Min, aU2Max, aV2Min, aV2Max); + + Standard_Real aU1, aV1, aU2, aV2; + anExtrema.LowerDistanceParameters (aU1, aV1, aU2, aV2); + myFirstPoint = BRep_Tool::Surface (aFirstFace)->Value (aU1, aV1); + mySecondPoint = BRep_Tool::Surface (aSecondFace)->Value (aU2, aV2); + + // Adjust automatic plane + gp_Ax2 aLocalAxes (myFirstPoint, gce_MakeDir (myFirstPoint, mySecondPoint)); + aDirAttach = gce_MakeDir (aLocalAxes.XDirection ()); + + // Check points + isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + } + + return isSuccess && IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_EdgeFace; + isSuccess = InitEdgeFaceLength (TopoDS::Edge (theSecondShape), + TopoDS::Face (theFirstShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_EDGE: + { + if (theSecondShape.ShapeType() == TopAbs_VERTEX) + { + myGeometryType = GeometryType_EdgeVertex; + isSuccess = InitEdgeVertexLength (TopoDS::Edge (theFirstShape), + TopoDS::Vertex (theSecondShape), + aDirAttach, + isInfinite); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_Edges; + isSuccess = InitTwoEdgesLength (TopoDS::Edge (theFirstShape), + TopoDS::Edge (theSecondShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + else if (theSecondShape.ShapeType() == TopAbs_FACE) + { + myGeometryType = GeometryType_EdgeFace; + isSuccess = InitEdgeFaceLength (TopoDS::Edge (theFirstShape), + TopoDS::Face (theSecondShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_VERTEX: + { + if (theSecondShape.ShapeType() == TopAbs_VERTEX) + { + myGeometryType = GeometryType_Points; + myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (theFirstShape)); + mySecondPoint = BRep_Tool::Pnt (TopoDS::Vertex (theSecondShape)); + + return IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_EdgeVertex; + isSuccess = InitEdgeVertexLength (TopoDS::Edge(theSecondShape), + TopoDS::Vertex(theFirstShape), + aDirAttach, + isInfinite); + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + case TopAbs_SOLID: + case TopAbs_SHELL: + case TopAbs_WIRE: + case TopAbs_SHAPE: + break; + } + + return Standard_False; +} + +//======================================================================= +//function : InitOneShapePoints +//purpose : Initialization of two points where dimension layouts +// will be attached +// Attention: 1) can be only the edge in currect implementation +// 2) No length for infinite edge +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitOneShapePoints (const TopoDS_Shape& theShape) +{ + if (theShape.ShapeType() != TopAbs_EDGE) + { + return Standard_False; + } + + TopoDS_Edge anEdge = TopoDS::Edge (theShape); + + BRepAdaptor_Curve aBrepCurve(anEdge); + Standard_Real aFirst = aBrepCurve.FirstParameter(); + Standard_Real aLast = aBrepCurve.LastParameter(); + + if (aBrepCurve.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Standard_Boolean isInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + if (isInfinite) + { + return Standard_False; + } + + myFirstPoint = aBrepCurve.Value (aBrepCurve.FirstParameter()); + mySecondPoint = aBrepCurve.Value (aBrepCurve.LastParameter()); + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_LengthDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : SetTextPosition +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} + +//======================================================================= +//function : SetDirection +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection) +{ + myHasCustomDirection = theUseDirection; + if (myHasCustomDirection) + myDirection = theDirection; +} diff --git a/src/PrsDim/PrsDim_LengthDimension.hxx b/src/PrsDim/PrsDim_LengthDimension.hxx new file mode 100644 index 0000000000..e2d989ca5c --- /dev/null +++ b/src/PrsDim/PrsDim_LengthDimension.hxx @@ -0,0 +1,249 @@ +// Copyright (c) 1999-2013 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. + +#ifndef _PrsDim_LengthDimension_HeaderFile +#define _PrsDim_LengthDimension_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE (PrsDim_LengthDimension, PrsDim_Dimension) + +//! Length dimension. Can be constructued: +//! - Between two generic points. +//! - Between two vertices. +//! - Between two faces. +//! - Between two parallel edges. +//! - Between face and edge. +//! +//! In case of two points (vertices) or one linear edge the user-defined plane +//! that includes this geometry is necessary to be set. +//! +//! In case of face-edge, edge-vertex or face-face lengthes the automatic plane +//! computing is allowed. For this plane the third point is found on the +//! edge or on the face. +//! +//! Please note that if the inappropriate geometry is defined +//! or the distance between measured points is less than +//! Precision::Confusion(), the dimension is invalid and its +//! presentation can not be computed. +class PrsDim_LengthDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_LengthDimension, PrsDim_Dimension) +public: + + //! Construct length dimension between face and edge. + //! Here dimension can be built without user-defined plane. + //! @param theFace [in] the face (first shape). + //! @param theEdge [in] the edge (second shape). + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge); + + //! Construct length dimension between two faces. + //! @param theFirstFace [in] the first face (first shape). + //! @param theSecondFace [in] the second face (second shape). + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Construct length dimension between two points in + //! the specified plane. + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane); + + //! Construct length dimension between two arbitrary shapes in + //! the specified plane. + //! @param theFirstShape [in] the first shape. + //! @param theSecondShape [in] the second shape. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + const gp_Pln& thePlane); + + //! Construct length dimension of linear edge. + //! @param theEdge [in] the edge to measure. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane); + +public: + + //! @return first attachement point. + const gp_Pnt& FirstPoint() const { return myFirstPoint; } + + //! @return second attachement point. + const gp_Pnt& SecondPoint() const { return mySecondPoint; } + + //! @return first attachement shape. + const TopoDS_Shape& FirstShape() const { return myFirstShape; } + + //! @return second attachement shape. + const TopoDS_Shape& SecondShape() const { return mySecondShape; } + +public: + + //! Measure distance between two points. + //! The dimension will become invalid if the new distance between + //! attachement points is less than Precision::Confusion(). + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + //! @param thePlane [in] the user-defined plane + Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane); + + //! Measure length of edge. + //! The dimension will become invalid if the new length of edge + //! is less than Precision::Confusion(). + //! @param theEdge [in] the edge to measure. + //! @param thePlane [in] the user-defined plane + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane); + + //! Measure distance between two faces. + //! The dimension will become invalid if the distance can not + //! be measured or it is less than Precision::Confusion(). + //! @param theFirstFace [in] the first face (first shape). + //! @param theSecondFace [in] the second face (second shape). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Measure distance between face and edge. + //! The dimension will become invalid if the distance can not + //! be measured or it is less than Precision::Confusion(). + //! @param theFace [in] the face (first shape). + //! @param theEdge [in] the edge (second shape). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge); + + //! Measure distance between generic pair of shapes (edges, vertices, length), + //! where measuring is applicable. + //! @param theFirstShape [in] the first shape. + //! @param theSecondShape [in] the second shape. + Standard_EXPORT void SetMeasuredShapes (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + + //! Set custom direction for dimension. If it is not set, the direction is obtained + //! from the measured geometry (e.g. line between points of dimension) + //! The direction does not change flyout direction of dimension. + //! @param theDirection [in] the dimension direction. + //! @param theUseDirection [in] boolean value if custom direction should be used. + Standard_EXPORT void SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection = Standard_True); + +protected: + + //! Checks if the plane includes first and second points to build dimension. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pln ComputePlane(const gp_Dir& theAttachDir) const; + + //! Computes distance between dimension points. If custom direction is defined, the distance + //! is a projection value of the distance between points to this direction + //! @return dimension value + Standard_EXPORT Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + //! Computes points bounded the flyout line for linear dimension. + //! Direction of flyout line equal to the custom direction of dimension if defined or + //! parallel to the main direction line + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theLineBegPoint [out] the first attach point of linear dimension. + //! @param theLineEndPoint [out] the second attach point of linear dimension. + Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; + +protected: + + //! Checks that distance between two points is valid. + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) const; + + Standard_EXPORT Standard_Boolean InitTwoEdgesLength (const TopoDS_Edge & theFirstEdge, + const TopoDS_Edge& theSecondEdge, + gp_Dir& theEdgeDir); + + //! Auxiliary method for InitTwoShapesPoints() + //! in case of the distance between edge and vertex. + //! Finds the point on the edge that is the closest one to . + //! @param theEdgeDir [out] is the direction on the edge to build + //! automatical plane. + Standard_EXPORT Standard_Boolean InitEdgeVertexLength (const TopoDS_Edge& theEdge, + const TopoDS_Vertex& theVertex, + gp_Dir& theEdgeDir, + Standard_Boolean isInfinite); + + //! Auxiliary method for InitTwoShapesPoints() + //! in case of the distance between face and edge. + //! The first attachment point is first parameter point from . + //! Find the second attachment point which belongs to + //! Iterate over the edges of the face and find the closest point according + //! to finded point on edge. + //! @param theEdgeDir [out] is the direction on the edge to build + //! automatical plane. + Standard_EXPORT Standard_Boolean InitEdgeFaceLength (const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace, + gp_Dir& theEdgeDir); + + //! Initialization of two attach points in case of two owner shapes. + Standard_EXPORT Standard_Boolean InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + gp_Pln& theComputedPlane, + Standard_Boolean& theIsPlaneComputed); + + //! Initialization of two attach points in case of one owner shape. + Standard_EXPORT Standard_Boolean InitOneShapePoints (const TopoDS_Shape& theShape); + +private: + + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + TopoDS_Shape myFirstShape; + TopoDS_Shape mySecondShape; + gp_Dir myDirection; + Standard_Boolean myHasCustomDirection; +}; + +#endif // _PrsDim_LengthDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_MaxRadiusDimension.cxx b/src/PrsDim/PrsDim_MaxRadiusDimension.cxx new file mode 100644 index 0000000000..271304c896 --- /dev/null +++ b/src/PrsDim/PrsDim_MaxRadiusDimension.cxx @@ -0,0 +1,310 @@ +// Created on: 1998-01-23 +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) + +//======================================================================= +//function : PrsDim_MaxRadiusDimension +//purpose : +//======================================================================= +PrsDim_MaxRadiusDimension::PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + myArrowSize = myVal / 100.; +} + +//======================================================================= +//function : PrsDim_MaxRadiusDimension +//purpose : +//======================================================================= + +PrsDim_MaxRadiusDimension::PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs, + const Standard_Real anArrowSize) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = aSymbolPrs; + myPosition = aPosition; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer /*aMode*/) +{ +// if( myAutomaticPosition ) + {//ota : recompute in any case + ComputeGeometry(); + myEllipse.SetMajorRadius(myVal); + gp_Vec v1(myEllipse.XAxis().Direction()); + v1 *=myVal; + myApexP = myEllipse.Location().Translated(v1); + myApexN = myEllipse.Location().Translated(-v1); + } + if(myIsAnArc) ComputeArcOfEllipse(aPresentation); + else + ComputeEllipse(aPresentation); +} + +//======================================================================= +//function : ComputeEllipse +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::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 = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + } + else //!AutomaticPosition + { + curPos = myPosition; + gp_Lin L1(myEllipse.XAxis()); + U = ElCLib::Parameter ( L1, curPos ); + curPos = ElCLib::Value (U, L1); + if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) + myEndOfArrow = myApexP ; + else + myEndOfArrow = myApexN ; + } + + // Presenatation + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, + myEndOfArrow, Center, Standard_True, mySymbolPrs); + +} + +//======================================================================= +//function : ComputeArcOfEllipse +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::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 = PrsDim::NearestApex(myEllipse, myApexP, myApexN, + myFirstPar, myLastPar, IsInDomain); + myPosition = Center; + myAutomaticPosition = Standard_True; + if ( myIsSetBndBox ) + myPosition = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + } + else //!AutomaticPosition + { + curPos = myPosition; +// ElSLib::Parameters ( myPlane->Pln(), curPos, U, V ); +// curPos = ElSLib::Value (U, V, myPlane->Pln()); + gp_Lin L1(myEllipse.XAxis()); + 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 = PrsDim::InDomain( myFirstPar, myLastPar, par ); + myPosition = curPos; + } + +// Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + Standard_Real parStart = 0.; + if( !IsInDomain ) + { + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::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 PrsDim_MaxRadiusDimension::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(!PrsDim::InDomain(myFirstPar, myLastPar, parEnd)) + { + Standard_Real parStart, par; + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::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 ); + } + } + +} diff --git a/src/PrsDim/PrsDim_MaxRadiusDimension.hxx b/src/PrsDim/PrsDim_MaxRadiusDimension.hxx new file mode 100644 index 0000000000..73bf38cba0 --- /dev/null +++ b/src/PrsDim/PrsDim_MaxRadiusDimension.hxx @@ -0,0 +1,59 @@ +// Created on: 1998-01-22 +// 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. + +#ifndef _PrsDim_MaxRadiusDimension_HeaderFile +#define _PrsDim_MaxRadiusDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) + +//! Ellipse Max radius dimension of a Shape which can be Edge +//! or Face (planar or cylindrical(surface of extrusion or +//! surface of offset)) +class PrsDim_MaxRadiusDimension : public PrsDim_EllipseRadiusDimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) +public: + + //! Max Ellipse radius dimension + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Max Ellipse radius dimension with position + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myApexP; + gp_Pnt myApexN; + gp_Pnt myEndOfArrow; + +}; + +#endif // _PrsDim_MaxRadiusDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_MidPointRelation.cxx b/src/PrsDim/PrsDim_MidPointRelation.cxx new file mode 100644 index 0000000000..b2eb17892b --- /dev/null +++ b/src/PrsDim/PrsDim_MidPointRelation.cxx @@ -0,0 +1,693 @@ +// Created on: 2000-10-20 +// Created by: Julia DOROVSKIKH +// Copyright (c) 2000-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MidPointRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_MidPointRelation +//purpose : +//======================================================================= +PrsDim_MidPointRelation::PrsDim_MidPointRelation(const TopoDS_Shape& aMidPointTool, + const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation(), + myTool(aMidPointTool) +{ + SetFirstShape(FirstShape); + SetSecondShape(SecondShape); + SetPlane(aPlane); + myPosition = aPlane->Pln().Location(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + if (myTool.ShapeType() == TopAbs_VERTEX) + { + gp_Pnt pp; + Standard_Boolean isonplane; + if ( PrsDim::ComputeGeometry(TopoDS::Vertex(myTool),pp,myPlane,isonplane) ) + { + if ( !isonplane ) ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myTool),pp); + } + myMidPoint = pp; + } + else return; + + if ( myAutomaticPosition ) myPosition = myMidPoint; + + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeFaceFromPnt(aprs, Standard_True); + } + break; + case TopAbs_EDGE : + { + ComputeEdgeFromPnt(aprs, Standard_True); + } + break; + case TopAbs_VERTEX : + { + ComputeVertexFromPnt(aprs, Standard_True); + } + break; + default: + break; + } + + switch (mySShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeFaceFromPnt(aprs, Standard_False); + } + break; + case TopAbs_EDGE : + { + ComputeEdgeFromPnt(aprs, Standard_False); + } + break; + case TopAbs_VERTEX : + { + ComputeVertexFromPnt(aprs, Standard_False); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, + const Standard_Integer) +{ + Handle(Select3D_SensitiveSegment) seg; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + if ( !myMidPoint.IsEqual(myFAttach,Precision::Confusion()) ) + { + // segment from mid point to the first geometry + seg = new Select3D_SensitiveSegment(own,myFAttach,myMidPoint); + aSel->Add(seg); + // segment from mid point to the second geometry + seg = new Select3D_SensitiveSegment(own,mySAttach,myMidPoint); + aSel->Add(seg); + } + if ( !myMidPoint.IsEqual(myPosition,Precision::Confusion()) ) + { + // segment from mid point to the text position + seg = new Select3D_SensitiveSegment(own,myMidPoint,myPosition); + aSel->Add(seg); + } + + // center of the symmetry - circle around the MidPoint + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + ax.SetLocation(myMidPoint); + Standard_Real rad = myFAttach.Distance(myMidPoint)/20.0; + gp_Circ aCircleM (ax,rad); + Handle(Geom_Curve) thecir = new Geom_Circle(aCircleM); + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecir); + aSel->Add(scurv); + + Handle(Geom_Curve) curv; + gp_Pnt firstp,lastp; + Standard_Boolean isInfinite,isOnPlane; + Handle(Geom_Curve) extCurv; + + // segment on first curve + if ( myFShape.ShapeType() == TopAbs_EDGE ) + { + TopoDS_Edge E = TopoDS::Edge(myFShape); + if ( !PrsDim::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; + if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line + { + // segment on line + seg = new Select3D_SensitiveSegment(own,myFirstPnt1,myFirstPnt2); + aSel->Add(seg); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle + { + // segment on circle + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFirstPnt1); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),myFirstPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse + { + // segment on ellipse + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFirstPnt1); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),myFirstPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + } + + // segment on second curve + if ( mySShape.ShapeType() == TopAbs_EDGE ) + { + TopoDS_Edge E = TopoDS::Edge(mySShape); + if ( !PrsDim::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; + if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line + { + // segment on line + seg = new Select3D_SensitiveSegment(own,mySecondPnt1,mySecondPnt2); + aSel->Add(seg); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle + { + // segment on circle + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),mySecondPnt1); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySecondPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse + { + // segment on ellipse + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),mySecondPnt1); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySecondPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + } +} + +//======================================================================= +//function : ComputeFaceFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeFaceFromPnt(const Handle(Prs3d_Presentation)&, + const Standard_Boolean /*first*/) +{ +} + +//======================================================================= +//function : ComputeEdgeFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeEdgeFromPnt(const Handle(Prs3d_Presentation)& aprs, + const Standard_Boolean first) +{ + TopoDS_Edge E; + if ( first ) E = TopoDS::Edge(myFShape); + else E = TopoDS::Edge(mySShape); + + Handle(Geom_Curve) geom; + gp_Pnt ptat1,ptat2; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite,isOnPlane; + if ( !PrsDim::ComputeGeometry(E, geom, ptat1, ptat2, extCurv, isInfinite, isOnPlane, myPlane) ) return; + + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + + if ( geom->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + if ( !isInfinite ) ComputePointsOnLine(ptat1,ptat2,first); + else + { + const gp_Lin& line = Handle(Geom_Line)::DownCast (geom)->Lin(); + ComputePointsOnLine(line,first); + } + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else if ( geom->IsInstance(STANDARD_TYPE(Geom_Circle)) ) + { + Handle(Geom_Circle) geom_cir (Handle(Geom_Circle)::DownCast (geom)); + gp_Circ circ (geom_cir->Circ()); + ComputePointsOnCirc(circ,ptat1,ptat2,first); + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else if ( geom->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) geom_ell (Handle(Geom_Ellipse)::DownCast (geom)); + gp_Elips elips (geom_ell->Elips()); + ComputePointsOnElips(elips,ptat1,ptat2,first); + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else return; + + // projection on myPlane + if ( !isOnPlane ) ComputeProjEdgePresentation(aprs,E,geom,ptat1,ptat2); +} + +//======================================================================= +//function : ComputeVertexFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeVertexFromPnt(const Handle(Prs3d_Presentation)& aprs, + const Standard_Boolean first) +{ + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + if ( first ) + { + Standard_Boolean isOnPlane; + TopoDS_Vertex V = TopoDS::Vertex(myFShape); + PrsDim::ComputeGeometry(V, myFAttach, myPlane, isOnPlane); + DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,myFAttach,first); + if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,myFAttach); + } + else + { + Standard_Boolean isOnPlane; + TopoDS_Vertex V = TopoDS::Vertex(mySShape); + PrsDim::ComputeGeometry(V, mySAttach, myPlane, isOnPlane); + DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,mySAttach,first); + if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,mySAttach); + } +} + +//======================================================================= +//function : ComputePointsOnLine +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnLine(const gp_Lin& aLin, + const Standard_Boolean first) +{ + Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); + gp_Pnt anAttach = ElCLib::Value(ppar,aLin); + + Standard_Real dist = anAttach.Distance(myMidPoint)/10.0; + if ( dist < Precision::Confusion() ) dist = 10.0; + + Standard_Real fpar = ppar + dist; + Standard_Real spar = ppar - dist; + + gp_Pnt aPnt1 = ElCLib::Value(fpar,aLin); + gp_Pnt aPnt2 = ElCLib::Value(spar,aLin); + + if ( first ) + { + myFAttach = anAttach; + myFirstPnt1 = aPnt1; + myFirstPnt2 = aPnt2; + } + else + { + mySAttach = anAttach; + mySecondPnt1 = aPnt1; + mySecondPnt2 = aPnt2; + } +} + +//======================================================================= +//function : ComputePointsOnLine +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnLine(const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Vec aVec (pnt1,pnt2); + gp_Lin aLin (pnt1,gp_Dir(aVec)); + + Standard_Real fpar = ElCLib::Parameter(aLin,pnt1); + Standard_Real spar = ElCLib::Parameter(aLin,pnt2); + Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); + + gp_Pnt aProjPnt = ElCLib::Value(ppar,aLin); + Standard_Real dist = myMidPoint.Distance(aProjPnt); + Standard_Real ll = pnt1.Distance(pnt2); + Standard_Real segm = Min(dist,ll)*0.75; + if ( dist < Precision::Confusion() ) segm = ll*0.75; + + gp_Pnt anAttach,aPnt1,aPnt2; + anAttach = aProjPnt; + gp_Vec aVecTr; + if ( ppar <= fpar ) + { + aPnt2 = pnt1; + aVecTr = gp_Vec(pnt2,pnt1); + aVecTr.Normalize(); + aPnt1 = aProjPnt.Translated(aVecTr*segm); + } + else if ( ppar >= spar ) + { + aPnt1 = pnt2; + aVecTr = gp_Vec(pnt1,pnt2); + aVecTr.Normalize(); + aPnt2 = aProjPnt.Translated(aVecTr*segm); + } + else + { + Standard_Real dp1 = aProjPnt.Distance(pnt1); + Standard_Real dp2 = aProjPnt.Distance(pnt2); + + segm = Min(dist,dp1)*0.75; + aVecTr = gp_Vec(aProjPnt,pnt1); + aVecTr.Normalize(); + aPnt1 = aProjPnt.Translated(aVecTr*segm); + + segm = Min(dist,dp2)*0.75; + aVecTr = gp_Vec(aProjPnt,pnt2); + aVecTr.Normalize(); + aPnt2 = aProjPnt.Translated(aVecTr*segm); + } + + if ( first ) + { + myFAttach = anAttach; + myFirstPnt1 = aPnt1; + myFirstPnt2 = aPnt2; + } + else + { + mySAttach = anAttach; + mySecondPnt1 = aPnt1; + mySecondPnt2 = aPnt2; + } +} + +//======================================================================= +//function : ComputePointsOnCirc +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnCirc(const gp_Circ& aCirc, + const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Pnt curpos = myMidPoint; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = aCirc.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, pnt1); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(aCirc,curpos); + + Standard_Real rad = M_PI / 5.0; + Standard_Real segm; + + Standard_Real pFPnt; + Standard_Real pSPnt; + + if ( pnt1.IsEqual(pnt2,confusion) ) // full circle + { + pFPnt = pcurpos - rad; + pSPnt = pcurpos + rad; + } + else + { + Standard_Real pFAttach = ElCLib::Parameter(aCirc,pnt1); + Standard_Real pSAttach = ElCLib::Parameter(aCirc,pnt2); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttachM - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttach - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + + if ( first ) + { + myFAttach = ElCLib::Value(pcurpos,aCirc); + myFirstPnt1 = ElCLib::Value(pFPnt,aCirc); + myFirstPnt2 = ElCLib::Value(pSPnt,aCirc); + } + else + { + mySAttach = ElCLib::Value(pcurpos,aCirc); + mySecondPnt1 = ElCLib::Value(pFPnt,aCirc); + mySecondPnt2 = ElCLib::Value(pSPnt,aCirc); + } +} + +//======================================================================= +//function : ComputePointsOnElips +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnElips(const gp_Elips& anEll, + const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Pnt curpos = myMidPoint; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = anEll.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, pnt1); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + + Standard_Real rad = M_PI / 5.0; + Standard_Real segm; + + Standard_Real pFPnt; + Standard_Real pSPnt; + + if ( pnt1.IsEqual(pnt2,confusion) ) // full circle + { + pFPnt = pcurpos - rad; + pSPnt = pcurpos + rad; + } + else + { + Standard_Real pFAttach = ElCLib::Parameter(anEll,pnt1); + Standard_Real pSAttach = ElCLib::Parameter(anEll,pnt2); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM / 2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttachM - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttach - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + + if ( first ) + { + myFAttach = ElCLib::Value(pcurpos,anEll); + myFirstPnt1 = ElCLib::Value(pFPnt,anEll); + myFirstPnt2 = ElCLib::Value(pSPnt,anEll); + } + else + { + mySAttach = ElCLib::Value(pcurpos,anEll); + mySecondPnt1 = ElCLib::Value(pFPnt,anEll); + mySecondPnt2 = ElCLib::Value(pSPnt,anEll); + } +} diff --git a/src/PrsDim/PrsDim_MidPointRelation.hxx b/src/PrsDim/PrsDim_MidPointRelation.hxx new file mode 100644 index 0000000000..a34a441675 --- /dev/null +++ b/src/PrsDim/PrsDim_MidPointRelation.hxx @@ -0,0 +1,88 @@ +// Created on: 2000-10-20 +// Created by: Julia DOROVSKIKH +// Copyright (c) 2000-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. + +#ifndef _PrsDim_MidPointRelation_HeaderFile +#define _PrsDim_MidPointRelation_HeaderFile + +#include + +class Geom_Plane; +class gp_Lin; +class gp_Pnt; +class gp_Circ; +class gp_Elips; + +DEFINE_STANDARD_HANDLE(PrsDim_MidPointRelation, PrsDim_Relation) + +//! presentation of equal distance to point myMidPoint +class PrsDim_MidPointRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MidPointRelation, PrsDim_Relation) +public: + + Standard_EXPORT PrsDim_MidPointRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + void SetTool (const TopoDS_Shape& aMidPointTool) { myTool = aMidPointTool; } + + const TopoDS_Shape& GetTool() const { return myTool; } + +private: + + Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeFaceFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputeEdgeFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputeVertexFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnLine (const gp_Lin& aLin, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnLine (const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnCirc (const gp_Circ& aCirc, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + + //! ComputePointsOn... methods set myFAttach, myFirstPnt and myLastPnt + //! from the following initial data: curve, end points, myMidPoint. + //! End points (pnt1 & pnt2) and curve define the trimmed curve. + //! If end points are equal, curve is not trimmed (line - special case). + //! + //! .------. pnt2 + //! / + //! . circle . myLastPnt + //! | | + //! . pnt1 . myFAttach + //! \ arc / . myMidPoint + //! .______. myFirstPnt + Standard_EXPORT void ComputePointsOnElips (const gp_Elips& anEll, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + +private: + + TopoDS_Shape myTool; + gp_Pnt myMidPoint; + gp_Pnt myFAttach; + gp_Pnt myFirstPnt1; + gp_Pnt myFirstPnt2; + gp_Pnt mySAttach; + gp_Pnt mySecondPnt1; + gp_Pnt mySecondPnt2; + +}; + +#endif // _AIS_MidPointRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_MinRadiusDimension.cxx b/src/PrsDim/PrsDim_MinRadiusDimension.cxx new file mode 100644 index 0000000000..4281d20015 --- /dev/null +++ b/src/PrsDim/PrsDim_MinRadiusDimension.cxx @@ -0,0 +1,311 @@ +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) + +//======================================================================= +//function : PrsDim_MinRadiusDimension +//purpose : +//======================================================================= +PrsDim_MinRadiusDimension::PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + myArrowSize = myVal / 100.; +} + +//======================================================================= +//function : PrsDim_MinRadiusDimension +//purpose : +//======================================================================= + +PrsDim_MinRadiusDimension::PrsDim_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) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = aSymbolPrs; + myPosition = aPosition; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_MinRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer /*aMode*/) +{ +// 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 : ComputeEllipse +//purpose : +//======================================================================= + +void PrsDim_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 = PrsDim::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 PrsDim_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 = PrsDim::NearestApex(myEllipse, myApexP, myApexN, + myFirstPar, myLastPar, IsInDomain); + myPosition = Center; + myAutomaticPosition = Standard_True; + if ( myIsSetBndBox ) + myPosition = PrsDim::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 = PrsDim::InDomain(myFirstPar, myLastPar, par); + myPosition = curPos; + } + + Standard_Real parStart =0.; + if( !IsInDomain ) + { + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::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 PrsDim_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(!PrsDim::InDomain(myFirstPar, myLastPar, parEnd)) + { + Standard_Real parStart, par; + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::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 ); + } + } + +} diff --git a/src/PrsDim/PrsDim_MinRadiusDimension.hxx b/src/PrsDim/PrsDim_MinRadiusDimension.hxx new file mode 100644 index 0000000000..89a14185fe --- /dev/null +++ b/src/PrsDim/PrsDim_MinRadiusDimension.hxx @@ -0,0 +1,59 @@ +// Created on: 1998-01-22 +// 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. + +#ifndef _PrsDim_MinRadiusDimension_HeaderFile +#define _PrsDim_MinRadiusDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) + +//! -- Ellipse Min radius dimension of a Shape which +//! can be Edge or Face (planar or cylindrical(surface of +//! extrusion or surface of offset)) +class PrsDim_MinRadiusDimension : public PrsDim_EllipseRadiusDimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) +public: + + //! Max Ellipse radius dimension + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Max Ellipse radius dimension with position + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_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 = 0.0); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myApexP; + gp_Pnt myApexN; + gp_Pnt myEndOfArrow; + +}; + +#endif // _PrsDim_MinRadiusDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_OffsetDimension.cxx b/src/PrsDim/PrsDim_OffsetDimension.cxx new file mode 100644 index 0000000000..9dfed5f9e0 --- /dev/null +++ b/src/PrsDim/PrsDim_OffsetDimension.cxx @@ -0,0 +1,463 @@ +// Created on: 1997-03-04 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_OffsetDimension, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_OffsetDimension +//purpose : +//======================================================================= +PrsDim_OffsetDimension::PrsDim_OffsetDimension(const TopoDS_Shape& FistShape, + const TopoDS_Shape& SecondShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation(), +myFAttach(0.,0.,0.), +mySAttach(0.,0.,0.) +{ + myFShape = FistShape; + mySShape = SecondShape; + mySymbolPrs = DsgPrs_AS_BOTHAR; + myVal = aVal; + myText = aText; + //myArrowSize = fabs (myVal/5.); + myArrowSize = fabs (myVal/10.0); + if (myArrowSize > 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<Add(box); + } + + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,Proj1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,Proj2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,Tcurpos); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + Handle(Select3D_SensitiveSegment) seg; + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + + if (!myTFAttach.IsEqual(Proj1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myTFAttach, + Proj1); + aSel->Add(seg); + } + if (!myTSAttach.IsEqual(Proj2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myTSAttach, + Proj2); + aSel->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoAxesOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeTwoAxesOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + BRepAdaptor_Surface surf2(TopoDS::Face(mySShape)); + + gp_Ax1 Ax1Surf1, Ax1Surf2; + + if (surf1.GetType() == GeomAbs_Cylinder) { + gp_Cylinder aCyl= surf1.Cylinder(); + Ax1Surf1 = aCyl.Axis(); + } else if (surf1.GetType() == GeomAbs_Cone) { + gp_Cone aCone= surf1.Cone(); + Ax1Surf1 = aCone.Axis(); + } else if (surf1.GetType() == GeomAbs_Torus) { + gp_Torus aTore= surf1.Torus(); + Ax1Surf1 = aTore.Axis(); + } + Standard_Real FirstUParam = surf1.FirstUParameter(); + Standard_Real FirstVParam = surf1.FirstVParameter(); + Standard_Real LastVParam = surf1.LastVParameter(); + gp_Pnt P1First = surf1.Value(FirstUParam,FirstVParam); + gp_Pnt P1Last = surf1.Value(FirstUParam,LastVParam); + + + if (surf2.GetType() == GeomAbs_Cylinder) { + gp_Cylinder aCyl= surf2.Cylinder(); + Ax1Surf2 = aCyl.Axis(); + } else if (surf2.GetType() == GeomAbs_Cone) { + gp_Cone aCone= surf2.Cone(); + Ax1Surf2 = aCone.Axis(); + } else if (surf2.GetType() == GeomAbs_Torus) { + gp_Torus aTore= surf2.Torus(); + Ax1Surf2 = aTore.Axis(); + } + FirstUParam = surf2.FirstUParameter(); + FirstVParam = surf2.FirstVParameter(); + LastVParam = surf2.LastVParameter(); + gp_Pnt P2First = surf2.Value(FirstUParam,FirstVParam); + gp_Pnt P2Last = surf2.Value(FirstUParam,LastVParam); + + + + myFAttach = Ax1Surf1.Location(); + mySAttach = Ax1Surf2.Location(); + myDirAttach = Ax1Surf1.Direction(); + myDirAttach2 = myDirAttach; + gp_Pnt curpos; + gp_Lin aProjLine = gce_MakeLin(myFAttach,myDirAttach); + + if (myAutomaticPosition) { + curpos.SetX ( (myFAttach.X() + mySAttach.X()) /2. + 0.01); + curpos.SetY ( (myFAttach.Y() + mySAttach.Y()) /2. + 0.01); + curpos.SetZ ( (myFAttach.Z() + mySAttach.Z()) /2. + 0.01); + // + 0.01 pour eviter un raise de ComputeSelection... + + myPosition = curpos; + } + else { + curpos = myPosition; + } + + curpos = ElCLib::Value(ElCLib::Parameter(aProjLine,curpos),aProjLine); + // on projette pour la presentation + + gp_Pnt P1FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1First),aProjLine); + gp_Pnt P1LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1Last),aProjLine); + if (P1FirstProj.Distance(curpos) > P1LastProj.Distance(curpos)) + myFAttach = P1FirstProj; + else + myFAttach = P1LastProj; + + gp_Pnt P2FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2First),aProjLine); + gp_Pnt P2LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2Last),aProjLine); + if (P2FirstProj.Distance(curpos) > P2LastProj.Distance(curpos)) + mySAttach = P2FirstProj; + else + mySAttach = P2LastProj; + + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); + gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); + gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); + gp_Dir myTDirAttach2 = myTDirAttach; + gp_Pnt Tcurpos = curpos.Transformed (aTrsf); + + if (myIsSetBndBox) + Tcurpos = PrsDim::TranslatePointToBound( Tcurpos, myDirAttach, myBndBox ); + + DsgPrs_OffsetPresentation::AddAxes(aprs, + myDrawer, + myText, + myTFAttach, + myTSAttach, + myTDirAttach, + myTDirAttach2, + Tcurpos); + + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + +//======================================================================= +//function : ComputeTwoFacesOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeTwoFacesOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + gp_Dir norm1 = myDirAttach; + gp_Pnt curpos; + gp_Ax2 myax2; + if (myAutomaticPosition && ! myIsSetBndBox) { + TopExp_Explorer explo(myFShape,TopAbs_VERTEX); + if (explo.More()) { + TopoDS_Vertex vertref = TopoDS::Vertex(explo.Current()); + myFAttach = BRep_Tool::Pnt(vertref); + gp_Vec trans = norm1.XYZ()*fabs(myVal/2); + gp_Ax2 ax2(myFAttach,norm1); + myDirAttach = ax2.XDirection(); + curpos = myFAttach.Translated(trans); + if (myVal <= Precision::Confusion()) { + gp_Vec vecnorm1 = norm1.XYZ()*.001; + curpos.Translate(vecnorm1); + } + myPosition = curpos; + myax2 = ax2; + } + } + else { + if (myAutomaticPosition && myIsSetBndBox) + { + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + myBndBox.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax ); + myPosition.SetCoord( aXmax, aYmax, aZmax ); + } + + curpos = myPosition; + myFAttach = PrsDim::Nearest(myFShape,curpos); + if (myFAttach.Distance(curpos) <= Precision::Confusion()) { + gp_Ax2 ax2(myFAttach,norm1); + myDirAttach = ax2.XDirection(); + myax2 = ax2; + } + else { + gp_Dir orient(myFAttach.XYZ()-curpos.XYZ()); + gp_Ax2 ax2(myFAttach,norm1); + if (orient.Angle(norm1) <= Precision::Angular()) { + myDirAttach = ax2.XDirection(); + } + else { + gp_Dir adir = norm1 ^ orient; + myDirAttach = adir ^ norm1; + } + myax2 = ax2; + } + } + // en attendant mieux + mySAttach = PrsDim::Nearest(mySShape,curpos); + gp_Ax3 anax3 (myax2); + gp_Pln apln (anax3); + + //gp_Pnt proj2; + Standard_Real u2,v2, uatt, vatt; + ElSLib::Parameters (apln , mySAttach, uatt,vatt); + ElSLib::Parameters (apln , curpos , u2,v2); + + if (uatt== u2 && vatt == v2) { + myDirAttach2 = myDirAttach; + } else { + gp_Vec avec (ElSLib::Value (uatt,vatt, apln) , ElSLib::Value (u2,v2, apln)); + myDirAttach2.SetCoord (avec.X(),avec.Y(),avec.Z()); + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); + gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); + gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); + gp_Dir myTDirAttach2 = myDirAttach2.Transformed (aTrsf); + gp_Pnt Tcurpos = curpos.Transformed (aTrsf); + +/* + if (myIsSetBndBox) + { + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + Tcurpos = PrsDim::TranslatePointToBound( Tcurpos, surf1.Plane().XAxis().Direction(), myBndBox ); + } +*/ + DsgPrs_OffsetPresentation::Add(aprs, + myDrawer, + myText, + myTFAttach, + myTSAttach, + myTDirAttach, + myTDirAttach2, + Tcurpos); + + + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + +//======================================================================= +//function : ComputeAxeFaceOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeAxeFaceOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + diff --git a/src/PrsDim/PrsDim_OffsetDimension.hxx b/src/PrsDim/PrsDim_OffsetDimension.hxx new file mode 100644 index 0000000000..784f1da699 --- /dev/null +++ b/src/PrsDim/PrsDim_OffsetDimension.hxx @@ -0,0 +1,72 @@ +// Created on: 1997-03-04 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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. + +#ifndef _PrsDim_OffsetDimension_HeaderFile +#define _PrsDim_OffsetDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_OffsetDimension, PrsDim_Relation) + +//! A framework to display dimensions of offsets. +//! The relation between the offset and the basis shape +//! is indicated. This relation is displayed with arrows and +//! text. The text gives the dsitance between the offset +//! and the basis shape. +class PrsDim_OffsetDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_OffsetDimension, PrsDim_Relation) +public: + + //! Constructs the offset display object defined by the + //! first shape aFShape, the second shape aSShape, the + //! dimension aVal, and the text aText. + Standard_EXPORT PrsDim_OffsetDimension(const TopoDS_Shape& FistShape, const TopoDS_Shape& SecondShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Indicates that the dimension we are concerned with is an offset. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_OFFSET; } + + //! Returns true if the offset datum is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + //! Sets a transformation aTrsf for presentation and + //! selection to a relative position. + void SetRelativePos (const gp_Trsf& aTrsf) { myRelativePos = aTrsf; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + + Standard_EXPORT void ComputeTwoAxesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + + Standard_EXPORT void ComputeAxeFaceOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myDirAttach; + gp_Dir myDirAttach2; + gp_Trsf myRelativePos; + +}; + +#endif // _PrsDim_OffsetDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_ParallelRelation.cxx b/src/PrsDim/PrsDim_ParallelRelation.cxx new file mode 100644 index 0000000000..bf8ebf42f5 --- /dev/null +++ b/src/PrsDim/PrsDim_ParallelRelation.cxx @@ -0,0 +1,380 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_ParallelRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ParallelRelation::PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 0.01; + mySymbolPrs = DsgPrs_AS_BOTHAR; +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ParallelRelation::PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs, + const Standard_Real anArrowSize) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + // cas longueur entre deux faces + ComputeTwoFacesParallel(aPresentation); + } + break; + case TopAbs_EDGE : + { + // cas longueur entre deux edges + ComputeTwoEdgesParallel(aPresentation); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + gp_Lin L1 (myFAttach,myDirAttach); + gp_Lin L2 (mySAttach,myDirAttach); + gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,myPosition),L1); + gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,myPosition),L2); + + gp_Lin L3; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + if (!Proj1.IsEqual(Proj2,Precision::Confusion())) + { + L3 = gce_MakeLin(Proj1,Proj2); + } + else + { + L3 = gce_MakeLin(Proj1,myDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSelection->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,Proj1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,Proj2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + Handle(Select3D_SensitiveSegment) seg; + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSelection->Add(seg); + } + if (!myFAttach.IsEqual(Proj1,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, myFAttach, Proj1); + aSelection->Add(seg); + } + if (!mySAttach.IsEqual(Proj2,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, mySAttach, Proj2); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoFacesParallel +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeTwoFacesParallel(const Handle(Prs3d_Presentation)&) +{ + throw Standard_NotImplemented("PrsDim_ParallelRelation::ComputeTwoFacesParallel not implemented"); +} + +//======================================================================= +//function : ComputeTwoEdgesParallel +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeTwoEdgesParallel(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Edge E1 = TopoDS::Edge(myFShape); + TopoDS_Edge E2 = TopoDS::Edge(mySShape); + + gp_Pnt ptat11,ptat12,ptat21,ptat22;//,pint3d; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(E1,E2,myExtShape, + geom1,geom2, + ptat11,ptat12,ptat21,ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + { + return; + } + + aPresentation->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape != 0)); + + gp_Lin l1; + gp_Lin l2; + Standard_Boolean isEl1 = Standard_False, isEl2 = Standard_False; + + if (geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el1 (Handle(Geom_Ellipse)::DownCast (geom1)); + // construct lines through focuses + gp_Ax1 elAx = geom_el1->XAxis(); + l1 = gp_Lin(elAx); + Standard_Real focex = geom_el1->MajorRadius() - geom_el1->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat11 = geom_el1->Focus1().Translated(transvec); + ptat12 = geom_el1->Focus2().Translated(-transvec); + isEl1 = Standard_True; + } + else if (geom1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + l1 = geom_lin1->Lin(); + } + else return; + + if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el2 (Handle(Geom_Ellipse)::DownCast (geom2)); + // construct lines through focuses + gp_Ax1 elAx = geom_el2->XAxis(); + l2 = gp_Lin(elAx); + Standard_Real focex = geom_el2->MajorRadius() - geom_el2->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat21 = geom_el2->Focus1().Translated(transvec); + ptat22 = geom_el2->Focus2().Translated(-transvec); + isEl2 = Standard_True; + } + else if (geom2->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + l2 = geom_lin2->Lin(); + } + else return; + + const Handle(Geom_Line)& geom_lin1 = new Geom_Line(l1); + const Handle(Geom_Line)& geom_lin2 = new Geom_Line(l2); + + myDirAttach = l1.Direction(); + // size + if( !myArrowSizeIsDefined ) { + Standard_Real arrSize1 (myArrowSize), arrSize2 (myArrowSize); + if (!isInfinite1) arrSize1 = ptat11.Distance(ptat12)/50.; + if (!isInfinite2) arrSize2 = ptat21.Distance(ptat22)/50.; + myArrowSize = Max(myArrowSize,Max(arrSize1,arrSize2)); +// myArrowSize = Min(myArrowSize,Min(arrSize1,arrSize2)); + } + + if ( myAutomaticPosition ) + { + gp_Pnt curpos; + if ( !isInfinite1 ) + { + gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l2,ptat11),l2); + curpos.SetXYZ((ptat11.XYZ() + p2.XYZ())/2.); + } + else if ( !isInfinite2 ) + { + gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l1,ptat21),l1); + curpos.SetXYZ((ptat21.XYZ()+p2.XYZ())/2.); + } + else + { + curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.); + } + // offset pour eviter confusion Edge et Dimension + gp_Vec offset (myDirAttach); + offset = offset*myArrowSize*(-10.); + curpos.Translate(offset); + myPosition = curpos; + } + + // recherche points attache + if (!isInfinite1) + { + if ( isEl1 ) + { + if (myPosition.Distance(ptat11) < myPosition.Distance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + } + else + { + if (myPosition.Distance(ptat11) > myPosition.Distance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + } + } + else + { + myFAttach = ElCLib::Value(ElCLib::Parameter(l1,myPosition),l1); + } + + if (!isInfinite2) + { + if ( isEl2 ) + { + if (myPosition.Distance(ptat21) < myPosition.Distance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + else + { + if (myPosition.Distance(ptat21) > myPosition.Distance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + } + else + { + mySAttach = ElCLib::Value(ElCLib::Parameter(l2,myPosition),l2); + } + TCollection_ExtendedString aText (" //"); + + if (l1.Distance(l2) <= Precision::Confusion()) + { + myArrowSize = 0.; + } + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + if ( myExtShape == 1) + mySymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR; + else if ( myExtShape == 2) + mySymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT; + + DsgPrs_LengthPresentation::Add(aPresentation, + myDrawer, + aText, + myFAttach, + mySAttach, + myDirAttach, + myPosition, + mySymbolPrs); + if ( (myExtShape != 0) && !extCurv.IsNull()) + { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) + { + if (!isInfinite1) + { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,E1,geom_lin1,pf,pl); + } + else + { + if (!isInfinite2) + { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,E2,geom_lin2,pf,pl); + } + } +} diff --git a/src/PrsDim/PrsDim_ParallelRelation.hxx b/src/PrsDim/PrsDim_ParallelRelation.hxx new file mode 100644 index 0000000000..a85f0e2f76 --- /dev/null +++ b/src/PrsDim/PrsDim_ParallelRelation.hxx @@ -0,0 +1,67 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_ParallelRelation_HeaderFile +#define _PrsDim_ParallelRelation_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_ParallelRelation, PrsDim_Relation) + +//! A framework to display constraints of parallelism +//! between two or more Interactive Objects. These +//! entities can be faces or edges. +class PrsDim_ParallelRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_ParallelRelation, PrsDim_Relation) +public: + + + //! Constructs an object to display parallel constraints. + //! This object is defined by the first shape aFShape and + //! the second shape aSShape and the plane aPlane. + Standard_EXPORT PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + + //! Constructs an object to display parallel constraints. + //! This object is defined by the first shape aFShape and + //! the second shape aSShape the plane aPlane, the + //! position aPosition, the type of arrow, aSymbolPrs and + //! its size anArrowSize. + Standard_EXPORT PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.01); + + //! Returns true if the parallelism is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesParallel (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesParallel (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myDirAttach; + +}; + +#endif // _PrsDim_ParallelRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_PerpendicularRelation.cxx b/src/PrsDim/PrsDim_PerpendicularRelation.cxx new file mode 100644 index 0000000000..4ddea4ecd2 --- /dev/null +++ b/src/PrsDim/PrsDim_PerpendicularRelation.cxx @@ -0,0 +1,346 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_PerpendicularRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : TwoEdgesPerpendicular +//======================================================================= +PrsDim_PerpendicularRelation::PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation() +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; +} + +//======================================================================= +//function : Constructor +//purpose : TwoFacesPerpendicular +//======================================================================= +PrsDim_PerpendicularRelation::PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape) +:PrsDim_Relation() +{ + myFShape = aFShape; + mySShape = aSShape; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + if (myFShape.ShapeType() == mySShape.ShapeType()) { + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // cas perpendiculaire entre deux faces + ComputeTwoFacesPerpendicular(aPresentation); + } + break; + case TopAbs_EDGE : + { + // cas perpendiculaire entre deux edges + ComputeTwoEdgesPerpendicular(aPresentation); + } + break; + default: + break; + } + } + // Cas pas traite - Edge/Face +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + const gp_Pnt& pos = myPosition; + Handle(Select3D_SensitiveSegment) seg; + Standard_Boolean ok1(Standard_False),ok2(Standard_False); + + if (!myFAttach.IsEqual(pos,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myFAttach, + pos); + aSelection->Add(seg); + ok1 = Standard_True; + } + if (!mySAttach.IsEqual(myPosition,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + mySAttach, + pos); + aSelection->Add(seg); + ok2 = Standard_True; + } + + if (ok1 && ok2) { + gp_Vec vec1(gce_MakeDir(pos,myFAttach)); + gp_Vec vec2(gce_MakeDir(pos,mySAttach)); + Standard_Real dist1(pos.Distance(myFAttach)); + Standard_Real dist2(pos.Distance(mySAttach)); + vec1 *= dist1; + vec1 *= .2; + vec2 *= dist2; + vec2 *= .2; + + gp_Pnt pAx11 = pos.Translated(vec1); + gp_Pnt pAx22 = pos.Translated(vec2); + gp_Pnt p_symb = pAx22.Translated(vec1); + seg = new Select3D_SensitiveSegment(own,pAx11,p_symb); + aSelection->Add(seg); + seg = new Select3D_SensitiveSegment(own,p_symb,pAx22); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoFacesPerpendicular +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeTwoFacesPerpendicular + (const Handle(Prs3d_Presentation)& /*aPresentation*/) +{ +} + +//======================================================================= +//function : ComputeTwoEdgesPerpendicular +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeTwoEdgesPerpendicular(const Handle(Prs3d_Presentation)& aPresentation) +{ + // 3d lines + Handle(Geom_Curve) geom1,geom2; + gp_Pnt pint3d,p1,p2,pAx1,pAx2,ptat11,ptat12,ptat21,ptat22; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if ( !PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), + myExtShape, + geom1,geom2, + ptat11,ptat12,ptat21,ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane) ) return; + + Standard_Boolean interOut1(Standard_False),interOut2(Standard_False); + + Handle(Geom_Line) geom_lin1; + Handle(Geom_Line) geom_lin2; + if ( geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom1)); + // construct lines through focuses + gp_Ax1 elAx = geom_el->XAxis(); + gp_Lin ll (elAx); + geom_lin1 = new Geom_Line(ll); + Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat11 = geom_el->Focus1().Translated(transvec); + ptat12 = geom_el->Focus2().Translated(-transvec); + interOut1 = Standard_True; + } + else if ( geom1->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + geom_lin1 = Handle(Geom_Line)::DownCast (geom1); + } + else return; + + if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom2)); + // construct lines through focuses + gp_Ax1 elAx = geom_el->XAxis(); + gp_Lin ll (elAx); + geom_lin2 = new Geom_Line(ll); + Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat21 = geom_el->Focus1().Translated(transvec); + ptat22 = geom_el->Focus2().Translated(-transvec); + interOut2 = Standard_True; + } + else if ( geom2->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + geom_lin2 = Handle(Geom_Line)::DownCast (geom2); + } + else return; + + // current face + BRepBuilderAPI_MakeFace makeface (myPlane->Pln()); + TopoDS_Face face (makeface.Face()); + BRepAdaptor_Surface adp (makeface.Face()); + + // 2d lines => projection of 3d on current plane + Handle(Geom2d_Curve) aGeom2dCurve = GeomAPI::To2d(geom_lin1,myPlane->Pln()); + Handle(Geom2d_Line) lin1_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; + aGeom2dCurve = GeomAPI::To2d(geom_lin2,myPlane->Pln()); + Handle(Geom2d_Line) lin2_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; + IntAna2d_AnaIntersection inter(lin1_2d->Lin2d(),lin2_2d->Lin2d()); + if (!inter.IsDone()) return; + if (!inter.NbPoints()) return; + + gp_Pnt2d pint(inter.Point(1).Value()); + pint3d = adp.Value(pint.X(),pint.Y()); + + myPosition = pint3d; + // recherche points attache + Standard_Real par1,par2,curpar,pmin,pmax;//,dist,sign; + Standard_Real length(0.); + + if ( isInfinite1 && isInfinite2 ) + { + Standard_Real curpar1 = ElCLib::Parameter(geom_lin1->Lin(),pint3d); + Standard_Real curpar2 = ElCLib::Parameter(geom_lin2->Lin(),pint3d); + par1 = par2 = 50.; + p1 = p2 = pint3d; + myFAttach = ElCLib::Value(curpar1+par1,geom_lin1->Lin()); + mySAttach = ElCLib::Value(curpar2+par2,geom_lin2->Lin()); + } + else + { + Standard_Boolean lengthComputed (Standard_False); + if ( !isInfinite1 ) + { + curpar = ElCLib::Parameter(geom_lin1->Lin(),pint3d); + par1 = ElCLib::Parameter(geom_lin1->Lin(),ptat11); + par2 = ElCLib::Parameter(geom_lin1->Lin(),ptat12); + pmin = Min(par1,par2); + pmax = Max(par1,par2); + + if ( myPosition.SquareDistance(ptat11) > myPosition.SquareDistance(ptat12) ) + p1 = ptat11; + else + p1 = ptat12; + if ( (curpar < pmin) || (curpar > pmax) ) + { + interOut1 = Standard_True; + } + if ( !isInfinite2 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; + else length = 2.*ptat11.Distance(ptat12)/5.; + lengthComputed = Standard_True; + gp_Vec vec1 (gce_MakeDir(myPosition,p1)); + vec1.Multiply(length); + pAx1 = myPosition.Translated(vec1); + myFAttach = pAx1; + } + if ( !isInfinite2 ) + { + curpar = ElCLib::Parameter(geom_lin2->Lin(),pint3d); + par1 = ElCLib::Parameter(geom_lin2->Lin(),ptat21); + par2 = ElCLib::Parameter(geom_lin2->Lin(),ptat22); + pmin = Min(par1,par2); + pmax = Max(par1,par2); + + if ( myPosition.SquareDistance(ptat21) > myPosition.SquareDistance(ptat22) ) p2 = ptat21; + else p2 = ptat22; + if ( (curpar < pmin) || (curpar > pmax) ) + { + interOut2 = Standard_True; + } + gp_Vec vec2 (gce_MakeDir(myPosition,p2)); + if ( !lengthComputed ) + { + if ( !isInfinite1 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; + else length = 2.*ptat21.Distance(ptat22)/5.; + } + vec2.Multiply(length); + pAx2 = myPosition.Translated(vec2); + mySAttach = pAx2; + } + if ( isInfinite1 ) + { + p1 = myPosition; + gp_Vec vec1(geom_lin1->Lin().Direction()); + vec1.Multiply(length); + myFAttach = myPosition.Translated(vec1); + } + if ( isInfinite2 ) + { + p2 = myPosition; + gp_Vec vec2(geom_lin2->Lin().Direction()); + vec2.Multiply(length); + mySAttach = myPosition.Translated(vec2); + } + } + DsgPrs_PerpenPresentation::Add(aPresentation,myDrawer, + myFAttach,mySAttach, + p1,p2, + myPosition, + interOut1,interOut2); + + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf,pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + aPresentation->SetInfiniteState(isInfinite1); + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),geom_lin1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + aPresentation->SetInfiniteState(isInfinite2); + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),geom_lin2,pf,pl); + } + } +} diff --git a/src/PrsDim/PrsDim_PerpendicularRelation.hxx b/src/PrsDim/PrsDim_PerpendicularRelation.hxx new file mode 100644 index 0000000000..7409038b0f --- /dev/null +++ b/src/PrsDim/PrsDim_PerpendicularRelation.hxx @@ -0,0 +1,64 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_PerpendicularRelation_HeaderFile +#define _PrsDim_PerpendicularRelation_HeaderFile + +#include + +DEFINE_STANDARD_HANDLE(PrsDim_PerpendicularRelation, PrsDim_Relation) + +//! A framework to display constraints of perpendicularity +//! between two or more interactive datums. These +//! datums can be edges or faces. +class PrsDim_PerpendicularRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_PerpendicularRelation, PrsDim_Relation) +public: + + //! Constructs an object to display constraints of + //! perpendicularity on shapes. + //! This object is defined by a first shape aFShape, a + //! second shape aSShape, and a plane aPlane. + //! aPlane is the plane of reference to show and test the + //! perpendicular relation between two shapes, at least + //! one of which has a revolved surface. + Standard_EXPORT PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + + //! Constructs an object to display constraints of + //! perpendicularity on shapes. + //! This object is defined by a first shape aFShape and a + //! second shape aSShape. + Standard_EXPORT PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + +}; + +#endif // _PrsDim_PerpendicularRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_RadiusDimension.cxx b/src/PrsDim/PrsDim_RadiusDimension.cxx new file mode 100644 index 0000000000..57a5f51d39 --- /dev/null +++ b/src/PrsDim/PrsDim_RadiusDimension.cxx @@ -0,0 +1,275 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier/Serguei Zaritchny +// Copyright (c) 1996-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 + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_RadiusDimension, PrsDim_Dimension) + +namespace +{ + static const Standard_ExtCharacter THE_RADIUS_SYMBOL ('R'); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle, + const gp_Pnt& theAttachPoint) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theCircle, theAttachPoint); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const TopoDS_Shape& theShape) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor) +{ + myCircle = theCircle; + myGeometryType = GeometryType_Edge; + myShape = BRepLib_MakeEdge (theCircle); + myAnchorPoint = theHasAnchor ? theAnchorPoint : ElCLib::Value (0, myCircle); + myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, myAnchorPoint); + + if (myIsGeometryValid) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor) +{ + Standard_Boolean isClosed = Standard_False; + myShape = theShape; + myGeometryType = GeometryType_UndefShapes; + myIsGeometryValid = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) + && IsValidCircle (myCircle); + if (theHasAnchor) + { + myAnchorPoint = theAnchorPoint; + myIsGeometryValid = myIsGeometryValid && IsValidAnchor (myCircle, myAnchorPoint); + } + + if (myIsGeometryValid) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const +{ + // Check if anchor point and circle center point belong to plane. + if (!thePlane.Contains (myAnchorPoint, Precision::Confusion()) && + !thePlane.Contains (myCircle.Location(), Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + gp_Dir aDimensionX = gce_MakeDir (myAnchorPoint, myCircle.Location()); + + myPlane = gp_Pln (gp_Ax3 (myCircle.Location(), + myCircle.Axis().Direction(), + aDimensionX)); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_RadiusDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_RadiusDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits(theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_RadiusDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + return myCircle.Radius(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + DrawLinearDimension (thePresentation, theMode, myAnchorPoint, myCircle.Location(), Standard_True); +} + +//======================================================================= +//function : IsValidCircle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::IsValidCircle (const gp_Circ& theCircle) const +{ + return theCircle.Radius() > Precision::Confusion(); +} + +//======================================================================= +//function : IsValidAnchor +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& theAnchor) const +{ + gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); + Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); + + return anAnchorDist > Precision::Confusion() + && aCirclePlane.Contains (theAnchor, Precision::Confusion()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_RadiusDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myAnchorPoint, myCircle.Location(), Standard_True); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!myIsGeometryValid) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} diff --git a/src/PrsDim/PrsDim_RadiusDimension.hxx b/src/PrsDim/PrsDim_RadiusDimension.hxx new file mode 100644 index 0000000000..4250190a2c --- /dev/null +++ b/src/PrsDim/PrsDim_RadiusDimension.hxx @@ -0,0 +1,148 @@ +// Copyright (c) 1995-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. + +#ifndef _PrsDim_RadiusDimension_HeaderFile +#define _PrsDim_RadiusDimension_HeaderFile + +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_RadiusDimension, PrsDim_Dimension) + +//! Radius dimension. Can be constructued: +//! - On generic circle. +//! - On generic circle with user-defined anchor point on that circle. +//! - On generic shape containing geometry that can be measured +//! by diameter dimension: circle wire, arc, circular face, etc. +//! The anchor point is the location of left attachement point of +//! dimension on the circle. It can be user-specified, or computed as +//! middle point on the arc. The radius dimension always lies in the +//! plane of the measured circle. The dimension is considered as +//! invalid if the user-specified anchor point is not lying on the circle, +//! if the radius of the circle is less than Precision::Confusion(). +//! In case if the dimension is built on the arbitrary shape, +//! it can be considered as invalid if the shape does not contain +//! circle geometry. +class PrsDim_RadiusDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_RadiusDimension, PrsDim_Dimension) +public: + + //! Create radius dimension for the circle geometry. + //! @param theCircle [in] the circle to measure. + Standard_EXPORT PrsDim_RadiusDimension (const gp_Circ& theCircle); + + //! Create radius dimension for the circle geometry and define its + //! orientation by location of the first point on that circle. + //! @param theCircle [in] the circle to measure. + //! @param theAnchorPoint [in] the point to define the position + //! of the dimension attachment on the circle. + Standard_EXPORT PrsDim_RadiusDimension (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint); + + //! Create radius dimension for the arbitrary shape (if possible). + //! @param theShape [in] the shape to measure. + Standard_EXPORT PrsDim_RadiusDimension (const TopoDS_Shape& theShape); + +public: + + //! @return measured geometry circle. + const gp_Circ& Circle() const { return myCircle; } + + //! @return anchor point on circle for radius dimension. + const gp_Pnt& AnchorPoint() const { return myAnchorPoint; } + + //! @return the measured shape. + const TopoDS_Shape& Shape() const { return myShape; } + +public: + + //! Measure radius of the circle. + //! The dimension will become invalid if the radius of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + void SetMeasuredGeometry (const gp_Circ& theCircle) { SetMeasuredGeometry (theCircle, gp_Pnt(), Standard_False); } + + //! Measure radius of the circle and orient the dimension so + //! the dimension lines attaches to anchor point on the circle. + //! The dimension will become invalid if the radius of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle + //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used + Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor = Standard_True); + + //! Measure radius on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + void SetMeasuredGeometry (const TopoDS_Shape& theShape) { SetMeasuredGeometry (theShape, gp_Pnt(), Standard_False); } + + //! Measure radius on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle + //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor = Standard_True); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + +protected: + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if anchor point and the center of the circle are on the plane. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + +protected: + + Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; + + Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& thePnt) const; + +private: + + gp_Circ myCircle; + gp_Pnt myAnchorPoint; + TopoDS_Shape myShape; +}; + +#endif // _PrsDim_RadiusDimension_HeaderFile diff --git a/src/PrsDim/PrsDim_Relation.cxx b/src/PrsDim/PrsDim_Relation.cxx new file mode 100644 index 0000000000..90117b459a --- /dev/null +++ b/src/PrsDim/PrsDim_Relation.cxx @@ -0,0 +1,262 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Relation, AIS_InteractiveObject) + +//======================================================================= +//function : PrsDim_Relation +//purpose : +//======================================================================= +PrsDim_Relation::PrsDim_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) +:AIS_InteractiveObject(aTypeOfPresentation3d), + myVal(1.), + myPosition(0.,0.,0.), + myArrowSize( myVal / 10. ), + myAutomaticPosition(Standard_True), + myExtShape(0), + myFirstOffset(0.),mySecondOffset(0.), + myIsSetBndBox( Standard_False ), + myArrowSizeIsDefined( Standard_False) +{ +} + +//======================================================================= +//function : ComputeProjEdgePresentation +//purpose : +//======================================================================= + +void PrsDim_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs, + const TopoDS_Edge& anEdge, + const Handle(Geom_Curve)& ProjCurv, + const gp_Pnt& FirstP, + const gp_Pnt& LastP, + const Quantity_NameOfColor aColor, + const Standard_Real width, + const Aspect_TypeOfLine aProjTOL, + const Aspect_TypeOfLine aCallTOL) const +{ + if (!myDrawer->HasOwnWireAspect()){ + myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} + else { + const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); + li->SetColor(aColor); + li->SetTypeOfLine(aProjTOL); + li->SetWidth(width); + } + + Standard_Real pf, pl; + TopLoc_Location loc; + Handle(Geom_Curve) curve; + Standard_Boolean isInfinite; + curve = BRep_Tool::Curve(anEdge,loc,pf,pl); + isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); + + TopoDS_Edge E; + + // Calcul de la presentation de l'edge + if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv)); + if ( !isInfinite) { + pf = ElCLib::Parameter(gl->Lin(),FirstP); + pl = ElCLib::Parameter(gl->Lin(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); + E = MakEd.Edge(); + } + else { + BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); + E = MakEd.Edge(); + } + } + else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv)); + pf = ElCLib::Parameter(gc->Circ(),FirstP); + pl = ElCLib::Parameter(gc->Circ(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); + E = MakEd.Edge(); + } + StdPrs_WFShape::Add (aPrs, E, myDrawer); + + //Calcul de la presentation des lignes de raccord + myDrawer->WireAspect()->SetTypeOfLine(aCallTOL); + if (!isInfinite) { + gp_Pnt ppf, ppl; + ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); + ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); + if (FirstP.Distance (ppf) > gp::Resolution()) + { + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert1 (FirstP); + StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer); + } + if (LastP.Distance (ppl) > gp::Resolution()) + { + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert2 (LastP); + StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer); + } +/* + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); +*/ + } +} + + +//======================================================================= +//function : ComputeProjVertexPresentation +//purpose : +//======================================================================= + +void PrsDim_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs, + const TopoDS_Vertex& aVertex, + const gp_Pnt& ProjPoint, + const Quantity_NameOfColor aColor, + const Standard_Real width, + const Aspect_TypeOfMarker aProjTOM, + const Aspect_TypeOfLine aCallTOL) const +{ + if (!myDrawer->HasOwnPointAspect()){ + myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} + else { + const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect(); + pa->SetColor(aColor); + pa->SetTypeOfMarker(aProjTOM); + } + + { + Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); + Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); + anArrayOfPoints->AddVertex (ProjPoint); + aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect()); + aGroup->AddPrimitiveArray (anArrayOfPoints); + } + + if (!myDrawer->HasOwnWireAspect()){ + myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} + else { + const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); + li->SetColor(aColor); + li->SetTypeOfLine(aCallTOL); + li->SetWidth(width); + } + + // Si les points ne sont pas confondus... + if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) + { + Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); + Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2); + anArrayOfLines->AddVertex (ProjPoint); + anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex)); + aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect()); + aGroup->AddPrimitiveArray (anArrayOfLines); + } +} + +//======================================================================= +//function : SetColor +//purpose : +//======================================================================= +void PrsDim_Relation::SetColor(const Quantity_Color &aCol) +{ + if(hasOwnColor && myDrawer->Color() == aCol) return; + + if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect()); + hasOwnColor=Standard_True; + myDrawer->SetColor (aCol); + myDrawer->TextAspect()->SetColor(aCol); + + Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ? + AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.; + if (!myDrawer->HasOwnLineAspect()) { + myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW)); + } + if (!myDrawer->HasOwnDimensionAspect()) { + myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect); + } + + myDrawer->LineAspect()->SetColor(aCol); + const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect(); + const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect(); + const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect(); + + DIMENSION->SetLineAspect(LINE); + DIMENSION->SetTextAspect(TEXT); +} + +//======================================================================= +//function : UnsetColor +//purpose : +//======================================================================= +void PrsDim_Relation::UnsetColor() +{ + if (!hasOwnColor) return; + hasOwnColor = Standard_False; + const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect(); + Quantity_Color CC = Quantity_NOC_YELLOW; + if (myDrawer->HasLink()) + { + AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC); + myDrawer->SetTextAspect(myDrawer->Link()->TextAspect()); + } + LA->SetColor(CC); + myDrawer->DimensionAspect()->SetLineAspect(LA); +} diff --git a/src/PrsDim/PrsDim_Relation.hxx b/src/PrsDim/PrsDim_Relation.hxx new file mode 100644 index 0000000000..2d99c13330 --- /dev/null +++ b/src/PrsDim/PrsDim_Relation.hxx @@ -0,0 +1,222 @@ +// Created on: 1997-02-27 +// Created by: Odile Olivier +// Copyright (c) 1997-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. + +#ifndef _PrsDim_Relation_HeaderFile +#define _PrsDim_Relation_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Geom_Curve; +class Geom_Plane; +class Geom_Surface; +class TopoDS_Edge; +class TopoDS_Vertex; + +//! One of the four types of interactive object in +//! AIS,comprising dimensions and constraints. Serves +//! as the abstract class for the seven relation classes as +//! well as the seven dimension classes. +//! The statuses available for relations between shapes are as follows: +//! - 0 - there is no connection to a shape; +//! - 1 - there is a connection to the first shape; +//! - 2 - there is a connection to the second shape. +//! The connection takes the form of an edge between the two shapes. +class PrsDim_Relation : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Relation, AIS_InteractiveObject) +public: + + //! Allows you to provide settings for the color theColor + //! of the lines representing the relation between the two shapes. + Standard_EXPORT void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; + + //! Allows you to remove settings for the color of the + //! lines representing the relation between the two shapes. + Standard_EXPORT void UnsetColor() Standard_OVERRIDE; + + virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Relation; } + + //! Indicates that the type of dimension is unknown. + virtual PrsDim_KindOfDimension KindOfDimension() const { return PrsDim_KOD_NONE; } + + //! Returns true if the interactive object is movable. + virtual Standard_Boolean IsMovable() const { return Standard_False; } + + const TopoDS_Shape& FirstShape() const { return myFShape; } + + virtual void SetFirstShape (const TopoDS_Shape& aFShape) { myFShape = aFShape; } + + //! Returns the second shape. + const TopoDS_Shape& SecondShape() const { return mySShape; } + + //! Allows you to identify the second shape aSShape + //! relative to the first. + virtual void SetSecondShape (const TopoDS_Shape& aSShape) { mySShape = aSShape; } + + void SetBndBox (const Standard_Real theXmin, const Standard_Real theYmin, const Standard_Real theZmin, + const Standard_Real theXmax, const Standard_Real theYmax, const Standard_Real theZmax) + { + myBndBox.Update (theXmin, theYmin, theZmin, theXmax, theYmax, theZmax); + myIsSetBndBox = Standard_True; + } + + void UnsetBndBox() { myIsSetBndBox = Standard_False; } + + //! Returns the plane. + const Handle(Geom_Plane)& Plane() const { return myPlane; } + + //! Allows you to set the plane thePlane. This is used to + //! define relations and dimensions in several daughter classes. + void SetPlane (const Handle(Geom_Plane)& thePlane) { myPlane = thePlane; } + + //! Returns the value of each object in the relation. + Standard_Real Value() const { return myVal; } + + //! Allows you to provide settings for the value theVal for each object in the relation. + void SetValue (const Standard_Real theVal) { myVal = theVal; } + + //! Returns the position set using SetPosition. + const gp_Pnt& Position() const { return myPosition; } + + //! Allows you to provide the objects in the relation with + //! settings for a non-default position. + void SetPosition (const gp_Pnt& thePosition) + { + myPosition = thePosition; + myAutomaticPosition = Standard_False; + } + + //! Returns settings for text aspect. + const TCollection_ExtendedString& Text() const { return myText; } + + //! Allows you to provide the settings theText for text aspect. + void SetText (const TCollection_ExtendedString& theText) { myText = theText; } + + //! Returns the value for the size of the arrow identifying + //! the relation between the two shapes. + Standard_Real ArrowSize() const { return myArrowSize; } + + //! Allows you to provide settings for the size of the + //! arrow theArrowSize identifying the relation between the two shapes. + void SetArrowSize (const Standard_Real theArrowSize) + { + myArrowSize = theArrowSize; + myArrowSizeIsDefined = Standard_True; + } + + //! Returns the value of the symbol presentation. This will be one of: + //! - AS_NONE - none + //! - AS_FIRSTAR - first arrow + //! - AS_LASTAR - last arrow + //! - AS_BOTHAR - both arrows + //! - AS_FIRSTPT - first point + //! - AS_LASTPT - last point + //! - AS_BOTHPT - both points + //! - AS_FIRSTAR_LASTPT - first arrow, last point + //! - AS_FIRSTPT_LASTAR - first point, last arrow + DsgPrs_ArrowSide SymbolPrs() const { return mySymbolPrs; } + + //! Allows you to provide settings for the symbol presentation. + void SetSymbolPrs (const DsgPrs_ArrowSide theSymbolPrs) { mySymbolPrs = theSymbolPrs; } + + //! Allows you to set the status of the extension shape by + //! the index aIndex. + //! The status will be one of the following: + //! - 0 - there is no connection to a shape; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + void SetExtShape (const Standard_Integer theIndex) { myExtShape = theIndex; } + + //! Returns the status index of the extension shape. + Standard_Integer ExtShape() const { return myExtShape; } + + //! Returns true if the display mode aMode is accepted + //! for the Interactive Objects in the relation. + //! ComputeProjPresentation(me; + //! aPres : Presentation from Prs3d; + //! Curve1 : Curve from Geom; + //! Curve2 : Curve from Geom; + //! FirstP1 : Pnt from gp; + //! LastP1 : Pnt from gp; + //! FirstP2 : Pnt from gp; + //! LastP2 : Pnt from gp; + //! aColor : NameOfColor from Quantity = Quantity_NOC_PURPLE; + //! aWidth : Real from Standard = 2; + //! aProjTOL : TypeOfLine from Aspect = Aspect_TOL_DASH; + //! aCallTOL : TypeOfLine from Aspect = Aspect_TOL_DOT) + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + void SetAutomaticPosition (const Standard_Boolean theStatus) { myAutomaticPosition = theStatus; } + + Standard_Boolean AutomaticPosition() const { return myAutomaticPosition; } + +protected: + + Standard_EXPORT PrsDim_Relation (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView); + + //! Calculates the presentation aPres of the the edge + //! anEdge and the curve it defines, ProjCurve. The later + //! is also specified by the first point FirstP and the last point LastP. + //! The presentation includes settings for color aColor, + //! type - aProjTOL and aCallTOL - and width of line, aWidth. + Standard_EXPORT void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; + + //! Calculates the presentation aPres of the the vertex + //! aVertex and the point it defines, ProjPoint. + //! The presentation includes settings for color aColor, + //! type - aProjTOM and aCallTOL - and width of line, aWidth. + Standard_EXPORT void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; + +protected: + + TopoDS_Shape myFShape; + TopoDS_Shape mySShape; + Handle(Geom_Plane) myPlane; + Standard_Real myVal; + gp_Pnt myPosition; + TCollection_ExtendedString myText; + Standard_Real myArrowSize; + Standard_Boolean myAutomaticPosition; + DsgPrs_ArrowSide mySymbolPrs; + Standard_Integer myExtShape; + gp_Pln myFirstPlane; + gp_Pln mySecondPlane; + Handle(Geom_Surface) myFirstBasisSurf; + Handle(Geom_Surface) mySecondBasisSurf; + PrsDim_KindOfSurface myFirstSurfType; + PrsDim_KindOfSurface mySecondSurfType; + Standard_Real myFirstOffset; + Standard_Real mySecondOffset; + Bnd_Box myBndBox; + Standard_Boolean myIsSetBndBox; + Standard_Boolean myArrowSizeIsDefined; + +}; + +DEFINE_STANDARD_HANDLE(PrsDim_Relation, AIS_InteractiveObject) + +#endif // _AIS_Relation_HeaderFile diff --git a/src/PrsDim/PrsDim_SymmetricRelation.cxx b/src/PrsDim/PrsDim_SymmetricRelation.cxx new file mode 100644 index 0000000000..e0e882cf48 --- /dev/null +++ b/src/PrsDim/PrsDim_SymmetricRelation.cxx @@ -0,0 +1,622 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_SymmetricRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_SymmetricRelation +//purpose : +//======================================================================= +PrsDim_SymmetricRelation::PrsDim_SymmetricRelation(const TopoDS_Shape& aSymmTool, + const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation(), + myTool(aSymmTool) +{ + SetFirstShape(FirstShape); + SetSecondShape(SecondShape); + SetPlane(aPlane); + myPosition = aPlane->Pln().Location(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // cas symetrie entre deux faces + ComputeTwoFacesSymmetric(aprs); + } + break; + case TopAbs_EDGE : + { + // cas symetrie entre deux edges + ComputeTwoEdgesSymmetric(aprs); + } + break; + case TopAbs_VERTEX : + { + // cas symetrie entre deux vertexs + ComputeTwoVerticesSymmetric(aprs); + } + break; + default: + break; + } + if (myTool.ShapeType() == TopAbs_EDGE) { + Handle(Geom_Curve) aCurve,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + aCurve,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) { + if (!extcurve.IsNull()) { + gp_Pnt pf, pl; + if (!isinfinite) { + pf = p1; + pl = p2; + } + if (isinfinite) aprs->SetInfiniteState(Standard_True); + ComputeProjEdgePresentation(aprs,TopoDS::Edge(myTool),aCurve,pf,pl); + } + } + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, + const Standard_Integer) +{ + Handle(Select3D_SensitiveSegment) seg; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Standard_Real F,L; + + Handle(Geom_Curve) geom_axis, extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + + if(myFShape.ShapeType() != TopAbs_VERTEX){ + BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); + + if(cu1.GetType() == GeomAbs_Line) { +// gp_Lin L1 (myFAttach,myFDirAttach); + gp_Pnt PjAttachPnt1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Pnt PjOffSetPnt = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + Standard_Real h = fabs(PjOffSetPnt.Distance(PjAttachPnt1)/cos(myAxisDirAttach.Angle(myFDirAttach))); + gp_Vec VL1(myFDirAttach); + gp_Vec VLa(PjAttachPnt1,PjOffSetPnt); + Standard_Real scal = VL1.Dot(VLa); + if(scal < 0) VL1.Reverse(); + VL1.Multiply(h); + gp_Pnt P1 = myFAttach.Translated(VL1); + gp_Pnt ProjAxis = ElCLib::Value(ElCLib::Parameter(laxis,P1),laxis); + gp_Vec v(P1,ProjAxis); + gp_Pnt P2 = ProjAxis.Translated(v); + + gp_Lin L3; + + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,myFDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + if (!myFAttach.IsEqual(P1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myFAttach, + P1); + aSel->Add(seg); + } + if (!mySAttach.IsEqual(P2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + mySAttach, + P2); + aSel->Add(seg); + } + } + + //=======================Pour les arcs====================== + if(cu1.GetType() == GeomAbs_Circle) { + Handle(Geom_Curve) aGeomCurve = BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); + Handle(Geom_Circle) geom_circ1 = Handle(Geom_Circle)::DownCast (aGeomCurve) ; +// Handle(Geom_Circle) geom_circ1 = (const Handle(Geom_Circle)&) BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); + gp_Circ circ1(geom_circ1->Circ()); + gp_Pnt OffsetPnt(myPosition.X(),myPosition.Y(),myPosition.Z()); + gp_Pnt Center1 = circ1.Location(); + gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,OffsetPnt),laxis); + gp_Pnt ProjCenter1 = ElCLib::Value(ElCLib::Parameter(laxis,Center1),laxis); + gp_Vec Vp(ProjCenter1,Center1); + if (Vp.Magnitude() <= Precision::Confusion()) Vp = gp_Vec(laxis.Direction())^myPlane->Pln().Position().Direction(); + Standard_Real Dt,R,h; + Dt = ProjCenter1.Distance(ProjOffsetPoint); + R = circ1.Radius(); + if (Dt > .999*R) { + Dt = .999*R; + gp_Vec Vout(ProjCenter1,ProjOffsetPoint); + ProjOffsetPoint = ProjCenter1.Translated(Vout.Divided(Vout.Magnitude()).Multiplied(Dt)); + OffsetPnt = ProjOffsetPoint; + } + h = Sqrt(R*R - Dt*Dt); + gp_Pnt P1 = ProjOffsetPoint.Translated(Vp.Added(Vp.Divided(Vp.Magnitude()).Multiplied(h))); + gp_Vec v(P1,ProjOffsetPoint); + gp_Pnt P2 = ProjOffsetPoint.Translated(v); + + gp_Lin L3; + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,laxis.Direction()); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + } + } + //=======================Pour les points====================== + else { + if (myFAttach.IsEqual(mySAttach,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,myPosition,myFAttach); + aSel->Add(seg); + } + else{ + gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + gp_Pnt ProjAttachmentPoint1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Vec PjAtt1_Att1(ProjAttachmentPoint1,myFAttach); + gp_Pnt P1 = ProjOffsetPoint.Translated(PjAtt1_Att1); + gp_Pnt P2 = ProjOffsetPoint.Translated(PjAtt1_Att1.Reversed()); + gp_Lin L3; + + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,myFDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,PointMin,PointMax); + aSel->Add(seg); + } + if (!myFAttach.IsEqual(P1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,myFAttach,P1); + aSel->Add(seg); + } + if (!mySAttach.IsEqual(P2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,mySAttach,P2); + aSel->Add(seg); + } + } + } +} + +//======================================================================= +//function : ComputeTwoFacesSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoFacesSymmetric(const Handle(Prs3d_Presentation)&) +{ +} + +//======================================================================= +//function : ComputeTwoEdgesSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoEdgesSymmetric(const Handle(Prs3d_Presentation)& aprs) +{ + BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); + if (cu1.GetType() != GeomAbs_Line && cu1.GetType() != GeomAbs_Circle) return; + BRepAdaptor_Curve cu2(TopoDS::Edge(mySShape)); + if (cu2.GetType() != GeomAbs_Line && cu2.GetType() != GeomAbs_Circle) return; +// gp_Pnt pint3d,ptat11,ptat12,ptat21,ptat22; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + geom1, + geom2, + ptat11, + ptat12, + ptat21, + ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) { + return; + } + aprs->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape !=0)); + Handle(Geom_Curve) geom_axis,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + myAxisDirAttach = laxis.Direction(); + + if(cu1.GetType() == GeomAbs_Line){ + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + gp_Lin l1(geom_lin1->Lin()); + myFDirAttach = l1.Direction(); + } + gp_Circ circ; + if(cu1.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) geom_cir1 (Handle(Geom_Circle)::DownCast (geom1)); + gp_Circ c(geom_cir1->Circ()); + circ = c; + } + + // recherche points attache + gp_Pnt ProjOffset = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + +/*//---------------------------------------------------- + //Quand on fait la symetrie de 2 edges consecutifs: + // + // :<-- Axe + // : + // /:\ + // Edge n --->/ : \ + // / : \<-- Edge n+1 + // : + //---------------------------------------------------- +*/ + Standard_Boolean idem = Standard_False; + if (isInfinite1 && isInfinite2) { // geom1 et geom2 sont des lignes + const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); + if (myAutomaticPosition) { + myFAttach = Handle(Geom_Line)::DownCast (geom1)->Lin().Location(); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + else { + const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); + myFAttach = ElCLib::Value(ElCLib::Parameter(line1,myPosition),line1); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + } + else if (!isInfinite1 && !isInfinite2) { + if (ptat11.IsEqual(ptat21,Precision::Confusion())) { + myFAttach = ptat12; + mySAttach = ptat22; + idem = Standard_True; + } + if (ptat11.IsEqual(ptat22,Precision::Confusion())) { + myFAttach = ptat12; + mySAttach = ptat21; + idem = Standard_True; + } + if (ptat12.IsEqual(ptat21,Precision::Confusion())) { + myFAttach = ptat11; + mySAttach = ptat22; + idem = Standard_True; + } + if (ptat12.IsEqual(ptat22,Precision::Confusion())) { + myFAttach = ptat11; + mySAttach = ptat21; + idem = Standard_True; + } + if(!idem){ + if( ProjOffset.SquareDistance(ptat11) > ProjOffset.SquareDistance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + + if (ProjOffset.SquareDistance(ptat21) > ProjOffset.SquareDistance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + } + else if (isInfinite1) {// geom1 et geom2 sont des lignes + mySAttach = ptat21; + const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); + myFAttach = ElCLib::Value(ElCLib::Parameter(line1,mySAttach),line1); + } + else if (isInfinite2) {// geom1 et geom2 sont des lignes + myFAttach = ptat11; + const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + + if( !myArrowSizeIsDefined ) + myArrowSize = myFAttach.Distance(mySAttach)/50.; + //---------------------------------------------------- + + //---------------------------------------------------- + // Si myFAttach <> mySAttach et PjFAttach = myFAttach + //---------------------------------------------------- + gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + + if (PjFAttach.IsEqual(myFAttach,Precision::Confusion())){ + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + gp_Lin l2(geom_lin2->Lin()); + myFDirAttach = l2.Direction(); + gp_Pnt PntTempo; + PntTempo = myFAttach; + myFAttach = mySAttach; + mySAttach = PntTempo; + PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + } + + //---------------------------------------------------- +// gp_Pnt curpos; + + if (myAutomaticPosition) { + //gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + // offset pour eviter confusion Edge et Dimension + gp_Vec offset(myAxisDirAttach); + offset = offset * myArrowSize * (-5); + gp_Vec Vt(myFAttach, PjFAttach); + gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); + myPosition = curpos; + } + + gp_Pnt Pj1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Pnt Pj2 = ElCLib::Value(ElCLib::Parameter(laxis,mySAttach),laxis); + if ((myFAttach.SquareDistance(Pj1)+mySAttach.SquareDistance(Pj2)) <= Precision::Confusion()) myArrowSize = 0.; + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + if(cu1.GetType() == GeomAbs_Line) + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + myFDirAttach, + laxis, + myPosition); + + if(cu1.GetType() == GeomAbs_Circle) + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + circ, + laxis, + myPosition); + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aprs,TopoDS::Edge(myFShape),geom1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aprs,TopoDS::Edge(mySShape),geom2,pf,pl); + } + } +} + +//======================================================================= +//function : ComputeTwoVertexsSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoVerticesSymmetric(const Handle(Prs3d_Presentation)& aprs) +{ + if(myFShape.ShapeType() != TopAbs_VERTEX || mySShape.ShapeType() != TopAbs_VERTEX) return; + Handle(Geom_Curve) geom_axis,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Standard_Boolean isOnPlane1, isOnPlane2; + + PrsDim::ComputeGeometry(TopoDS::Vertex(myFShape), myFAttach, myPlane, isOnPlane1); + PrsDim::ComputeGeometry(TopoDS::Vertex(mySShape), mySAttach, myPlane, isOnPlane2); + + if( !myArrowSizeIsDefined ) + myArrowSize = myFAttach.Distance(mySAttach)/50.; + + if (isOnPlane1 && isOnPlane2) + myExtShape = 0; + else if ( isOnPlane1 && !isOnPlane2) + myExtShape = 2; + else if (!isOnPlane1 && isOnPlane2) + myExtShape = 1; + else + return ; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + myAxisDirAttach = laxis.Direction(); + + // recherche points attache +// gp_Pnt curpos; + if (myAutomaticPosition) { + gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + // offset pour eviter confusion Edge et Dimension + gp_Vec offset(myAxisDirAttach); + offset = offset * myArrowSize * (-5); + gp_Vec Vt(myFAttach, PjFAttach); + gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); + myPosition = curpos; + } + if (2*(myFAttach.Distance(mySAttach)) <= Precision::Confusion()) myArrowSize = 0.; + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + laxis, + myPosition); + if ( myExtShape == 1) + ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myFShape),myFAttach); + else if ( myExtShape == 2) + ComputeProjVertexPresentation(aprs,TopoDS::Vertex(mySShape),mySAttach); +} + + + + + + diff --git a/src/PrsDim/PrsDim_SymmetricRelation.hxx b/src/PrsDim/PrsDim_SymmetricRelation.hxx new file mode 100644 index 0000000000..639d7ad456 --- /dev/null +++ b/src/PrsDim/PrsDim_SymmetricRelation.hxx @@ -0,0 +1,80 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-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. + +#ifndef _PrsDim_SymmetricRelation_HeaderFile +#define _PrsDim_SymmetricRelation_HeaderFile + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_SymmetricRelation, PrsDim_Relation) + +//! A framework to display constraints of symmetricity +//! between two or more datum Interactive Objects. +//! A plane serves as the axis of symmetry between the +//! shapes of which the datums are parts. +class PrsDim_SymmetricRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_SymmetricRelation, PrsDim_Relation) +public: + + //! Constructs an object to display constraints of symmetricity. + //! This object is defined by a tool aSymmTool, a first + //! shape FirstShape, a second shape SecondShape, and a plane aPlane. + //! aPlane serves as the axis of symmetry. + //! aSymmTool is the shape composed of FirstShape + //! SecondShape and aPlane. It may be queried and + //! edited using the functions GetTool and SetTool. + //! The two shapes are typically two edges, two vertices or two points. + Standard_EXPORT PrsDim_SymmetricRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + //! Returns true if the symmetric constraint display is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + //! Sets the tool aSymmetricTool composed of a first + //! shape, a second shape, and a plane. + //! This tool is initially created at construction time. + void SetTool (const TopoDS_Shape& aSymmetricTool) { myTool = aSymmetricTool; } + + //! Returns the tool composed of a first shape, a second + //! shape, and a plane. This tool is created at construction time. + const TopoDS_Shape& GetTool() const { return myTool; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesSymmetric (const Handle(Prs3d_Presentation)& aprs); + + Standard_EXPORT void ComputeTwoEdgesSymmetric (const Handle(Prs3d_Presentation)& aprs); + + Standard_EXPORT void ComputeTwoVerticesSymmetric (const Handle(Prs3d_Presentation)& aprs); + +private: + + TopoDS_Shape myTool; + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myFDirAttach; + gp_Dir myAxisDirAttach; + +}; + +#endif // _PrsDim_SymmetricRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_TangentRelation.cxx b/src/PrsDim/PrsDim_TangentRelation.cxx new file mode 100644 index 0000000000..149b3c3a96 --- /dev/null +++ b/src/PrsDim/PrsDim_TangentRelation.cxx @@ -0,0 +1,545 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_TangentRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_TangentRelation::PrsDim_TangentRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Integer anExternRef) + :myExternRef(anExternRef) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_False; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_TangentRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeTwoFacesTangent(aPresentation); + } + break; + case TopAbs_EDGE : + { + ComputeTwoEdgesTangent(aPresentation); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + gp_Vec vec(myDir); + gp_Vec vec1 = vec.Multiplied(myLength); + gp_Vec vec2 = vec.Multiplied(-myLength); + gp_Pnt p1 = myPosition.Translated(vec1); + gp_Pnt p2 = myPosition.Translated(vec2); + + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,p1,p2); + aSelection->Add(seg); +} + +//======================================================================= +//function : ComputeTwoFacesTangent +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeTwoFacesTangent + (const Handle(Prs3d_Presentation)& /*aPresentation*/) +{ +} + +// jfa 19/10/2000 begin +//======================================================================= +//function : ComputeTangencyPoint +//purpose : +//======================================================================= +static Standard_Boolean ComputeTangencyPoint(const Handle(Geom_Curve)& GC1, + const Handle(Geom_Curve)& GC2, + gp_Pnt& aPoint) +{ + Standard_Real U1f = GC1->FirstParameter(); + Standard_Real U1l = GC1->LastParameter(); + Standard_Real U2f = GC2->FirstParameter(); + Standard_Real U2l = GC2->LastParameter(); + + gp_Pnt PC1; + Standard_Real mindist=0; + GeomAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l); + for ( Standard_Integer i = 1; i <= Ex.NbExtrema(); i++) + { + gp_Pnt P1,P2; + Ex.Points(i,P1,P2); + Standard_Real dist = P1.Distance(P2); + if ( i == 1 ) + { + mindist = dist; + PC1 = P1; + } + else + { + if ( (dist < mindist) || (dist < Precision::Confusion()) ) + { + mindist = dist; + PC1 = P1; + } + } + if ( dist < Precision::Confusion() ) + { + if (GC1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + continue; // tangent line and conic can have only one point with zero distance + } + gp_Vec aVector1,aVector2; + if (GC1->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC1)); + Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P1); + ElCLib::D1(par_inter,circle->Circ(),P1,aVector1); + } + else if (GC1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC1)); + Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P1); + ElCLib::D1(par_inter,ellipse->Elips(),P1,aVector1); + } + if (GC2->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC2)); + Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P2); + ElCLib::D1(par_inter,circle->Circ(),P2,aVector2); + } + else if (GC2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC2)); + Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P2); + ElCLib::D1(par_inter,ellipse->Elips(),P2,aVector2); + } +// if ( aVector1.IsParallel(aVector2, 100*Precision::Angular()) ) break; + if ( aVector1.IsParallel(aVector2, M_PI / 360.0) ) break; // 0.5 graduce + } + } + aPoint = PC1; + return Standard_True; +} +// jfa 19/10/2000 end + +//======================================================================= +//function : ComputeTwoEdgesTangent +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeTwoEdgesTangent(const Handle(Prs3d_Presentation)& aPresentation) +{ + Handle(Geom_Curve) copy1,copy2; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + copy1, + copy2, + ptat11, + ptat12, + ptat21, + ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + { + return; + } + + aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); + // current face + BRepBuilderAPI_MakeFace makeface(myPlane->Pln()); + TopoDS_Face face(makeface.Face()); + BRepAdaptor_Surface adp(makeface.Face()); + + Standard_Integer typArg(0); + + if (copy1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + typArg = 10; + } + else if (copy1->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + typArg = 20; + } + else if (copy1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + typArg = 30; + } + else return; + + if (copy2->IsInstance(STANDARD_TYPE(Geom_Line))) + { + typArg += 1; + } + else if (copy2->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + typArg += 2; + } + else if (copy2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + typArg += 3; + } + else return; + + //First find the tangengy vector if exists + TopoDS_Vertex VCom; + TopExp_Explorer expF(TopoDS::Edge(myFShape),TopAbs_VERTEX); + TopExp_Explorer expS(TopoDS::Edge(mySShape),TopAbs_VERTEX); + TopoDS_Shape tab[2]; + Standard_Integer p ; + for (p = 0; expF.More(); expF.Next(),p++) + { + tab[p] = TopoDS::Vertex(expF.Current()); + } + Standard_Boolean found(Standard_False); + for ( ; expS.More() && !found; expS.Next()) + { + for ( Standard_Integer l = 0; l<=p && !found; l++) + { + found = ( expS.Current().IsSame(tab[l])); + if (found) VCom = TopoDS::Vertex(expS.Current()); + } + } + + gp_Vec theVector; + gp_Pnt pint3d; // tangency point + gp_Dir theDir; // tangency direction + Standard_Real par_inter = 0.0; // parameter of tangency point + + if (found) + { + pint3d = BRep_Tool::Pnt(VCom); + } + + // Otherwise it is found as if it was known that 2 curves + // are tangents (which must be the cases) + switch (typArg) + { + case 12: // circle line + { + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); + + if ( !found ) + { + // it is enough to project the circus center on the straight line + par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); + pint3d = ElCLib::Value(par_inter, line->Lin()); + } + + theDir = line->Lin().Direction(); + myLength = circle->Radius()/5.; + if ( !isInfinite1 ) + { + Standard_Real copy1Length = ptat12.Distance(ptat11); + if ( copy1Length < myLength ) + myLength = copy1Length/3.; + } + } + break; + case 21: // circle line + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); + + if (!found) + { + // it is enough to project the circus center on the straight line + par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); + pint3d = ElCLib::Value(par_inter, line->Lin()); + } + + theDir = line->Lin().Direction(); + myLength = circle->Radius()/5.; + if (!isInfinite2) + { + Standard_Real copy2Length = ptat21.Distance(ptat22); + if ( copy2Length < myLength ) + myLength = copy2Length/3.; + } + } + break; + // jfa 19/10/2000 begin + case 13: // line ellipse + { + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); + + if (!found) + { + ComputeTangencyPoint(line,ellipse,pint3d); + } + + theDir = line->Lin().Direction(); + myLength = ellipse->MajorRadius()/5.; + + if (!isInfinite1) + { + Standard_Real copy1Length = ptat12.Distance(ptat11); + if ( copy1Length < myLength ) + myLength = copy1Length/3.; + } + } + break; + case 31: // ellipse line + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); + + if (!found) + { + ComputeTangencyPoint(line,ellipse,pint3d); + } + + theDir = line->Lin().Direction(); + myLength = ellipse->MajorRadius()/5.; + + if (!isInfinite2) + { + Standard_Real copy2Length = ptat21.Distance(ptat22); + if ( copy2Length < myLength ) + myLength = copy2Length/3.; + } + } + break; + case 22: // circle circle + { + Handle(Geom_Circle) circle1 (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Circle) circle2 (Handle(Geom_Circle)::DownCast (copy2)); + Standard_Real R1 = circle1->Radius(); + Standard_Real R2 = circle2->Radius(); + myLength = Max(R1,R2)/5.0; + if ( !found ) + { + if ( (circle1->Location()).IsEqual(circle2->Location(),Precision::Confusion()) ) + { + if ( R1 >= R2 ) + { + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + else + { + ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); + } + } + else + { + if ( R1 >= R2 ) + { + par_inter = ElCLib::Parameter(circle1->Circ(), circle2->Location()); + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + else + { + par_inter = ElCLib::Parameter(circle2->Circ(), circle1->Location()); + ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); + } + } + } + else + { + par_inter = ElCLib::Parameter(circle1->Circ(), pint3d); + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 23: // circle ellipse + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); + Standard_Real R1 = circle->Radius(); + Standard_Real R2 = ellipse->MajorRadius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 >= R2 ) + { + ComputeTangencyPoint(circle,ellipse,pint3d); + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(ellipse,circle,pint3d); + par_inter = ElCLib::Parameter(ellipse->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 32: // ellipse circle + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); + Standard_Real R1 = ellipse->MajorRadius(); + Standard_Real R2 = circle->Radius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 >= R2 ) + { + ComputeTangencyPoint(ellipse,circle,pint3d); + par_inter = ElCLib::Parameter( ellipse->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(circle,ellipse,pint3d); + par_inter = ElCLib::Parameter( circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 33: // ellipse ellipse + { + Handle(Geom_Ellipse) ellipse1 (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse2 (Handle(Geom_Ellipse)::DownCast (copy2)); + Standard_Real R1 = ellipse1->MajorRadius(); + Standard_Real R2 = ellipse2->MajorRadius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 > R2 ) + { + ComputeTangencyPoint(ellipse1,ellipse2,pint3d); + par_inter = ElCLib::Parameter( ellipse1->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(ellipse2,ellipse1,pint3d); + par_inter = ElCLib::Parameter( ellipse2->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse2->Elips(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(ellipse1->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + // jfa 19/10/2000 end + default: + return; + } + + myAttach = pint3d; + myDir = theDir; + myPosition = pint3d; + myLength = Min(myLength,myArrowSize); + + DsgPrs_TangentPresentation::Add(aPresentation,myDrawer,myAttach,myDir,myLength); + if ( (myExtShape != 0) && !extCurv.IsNull()) + { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) + { + if (!isInfinite1) + { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),copy1,pf,pl); + } + else + { + if (!isInfinite2) + { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),copy2,pf,pl); + } + } +} diff --git a/src/PrsDim/PrsDim_TangentRelation.hxx b/src/PrsDim/PrsDim_TangentRelation.hxx new file mode 100644 index 0000000000..501366ff3b --- /dev/null +++ b/src/PrsDim/PrsDim_TangentRelation.hxx @@ -0,0 +1,75 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-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. + +#ifndef _PrsDim_TangentRelation_HeaderFile +#define _PrsDim_TangentRelation_HeaderFile + +#include + +DEFINE_STANDARD_HANDLE(PrsDim_TangentRelation, PrsDim_Relation) + +//! A framework to display tangency constraints between +//! two or more Interactive Objects of the datum type. +//! The datums are normally faces or edges. +class PrsDim_TangentRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_TangentRelation, PrsDim_Relation) +public: + + //! TwoFacesTangent or TwoEdgesTangent relation + //! Constructs an object to display tangency constraints. + //! This object is defined by the first shape aFShape, the + //! second shape aSShape, the plane aPlane and the index anExternRef. + //! aPlane serves as an optional axis. + //! anExternRef set to 0 indicates that there is no relation. + Standard_EXPORT PrsDim_TangentRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const Standard_Integer anExternRef = 0); + + //! Returns the external reference for tangency. + //! The values are as follows: + //! - 0 - there is no connection; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + //! This reference is defined at construction time. + Standard_Integer ExternRef() { return myExternRef; } + + //! Sets the external reference for tangency, aRef. + //! The values are as follows: + //! - 0 - there is no connection; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + //! This reference is initially defined at construction time. + void SetExternRef (const Standard_Integer aRef) { myExternRef = aRef; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesTangent (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesTangent (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myAttach; + gp_Dir myDir; + Standard_Real myLength; + Standard_Integer myExternRef; + +}; + +#endif // _PrsDim_TangentRelation_HeaderFile diff --git a/src/PrsDim/PrsDim_TypeOfAngle.hxx b/src/PrsDim/PrsDim_TypeOfAngle.hxx new file mode 100644 index 0000000000..82388b68f0 --- /dev/null +++ b/src/PrsDim/PrsDim_TypeOfAngle.hxx @@ -0,0 +1,27 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_TypeOfAngle_HeaderFile +#define _PrsDim_TypeOfAngle_HeaderFile + +//! Declares the type of angle. +enum PrsDim_TypeOfAngle +{ + PrsDim_TypeOfAngle_Interior, //!< the angle between two lines built on geometry parameters + PrsDim_TypeOfAngle_Exterior, //!< the angle equal 2 PI minus the interior angle +}; + +#endif // _PrsDim_TypeOfAngle_HeaderFile diff --git a/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx b/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx new file mode 100644 index 0000000000..29a3cc7d10 --- /dev/null +++ b/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx @@ -0,0 +1,29 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_TypeOfAngleArrowVisibility_HeaderFile +#define _PrsDim_TypeOfAngleArrowVisibility_HeaderFile + +//! Declares what arrows are visible on angle presentation +enum PrsDim_TypeOfAngleArrowVisibility +{ + PrsDim_TypeOfAngleArrowVisibility_Both, //!< both arrows of the first and the second angle tips + PrsDim_TypeOfAngleArrowVisibility_First, //!< only first point arrow + PrsDim_TypeOfAngleArrowVisibility_Second, //!< only second point arrow + PrsDim_TypeOfAngleArrowVisibility_None, //!< arrows are not visible +}; + +#endif // _PrsDim_TypeOfAngleArrowVisibility_HeaderFile diff --git a/src/PrsDim/PrsDim_TypeOfDist.hxx b/src/PrsDim/PrsDim_TypeOfDist.hxx new file mode 100644 index 0000000000..1a9c6f8ac0 --- /dev/null +++ b/src/PrsDim/PrsDim_TypeOfDist.hxx @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-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. + +#ifndef _PrsDim_TypeOfDist_HeaderFile +#define _PrsDim_TypeOfDist_HeaderFile + +//! To declare the type of distance. +enum PrsDim_TypeOfDist +{ + PrsDim_TypeOfDist_Unknown, + PrsDim_TypeOfDist_Horizontal, + PrsDim_TypeOfDist_Vertical +}; + +#endif // _PrsDim_TypeOfDist_HeaderFile diff --git a/src/QABugs/QABugs_16.cxx b/src/QABugs/QABugs_16.cxx index 6622ba1171..bdecc0cd74 100644 --- a/src/QABugs/QABugs_16.cxx +++ b/src/QABugs/QABugs_16.cxx @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include @@ -241,7 +241,7 @@ static Standard_Integer BUC60972 (Draw_Interpretor& di, Standard_Integer argc, c //di << ExtString_aText << " " << Draw::Atof(argv[4]) << "\n"; di << argv[5] << " " << Draw::Atof(argv[4]) << "\n"; - Handle(AIS_AngleDimension) aDim = new AIS_AngleDimension(aFirst, aSecond); + Handle(PrsDim_AngleDimension) aDim = new PrsDim_AngleDimension(aFirst, aSecond); aContext->Display (aDim, Standard_True); return 0; @@ -620,7 +620,7 @@ static Standard_Integer OCC301 (Draw_Interpretor& di, Standard_Integer argc, con gp_Dir plndir(0, 0, 1); Handle(Geom_Plane) pln = new Geom_Plane(plnpt,plndir); - Handle(AIS_AngleDimension) anAngleDimension = new AIS_AngleDimension (p1.Mirrored (p2), p2, p3); + Handle(PrsDim_AngleDimension) anAngleDimension = new PrsDim_AngleDimension (p1.Mirrored (p2), p2, p3); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect; anAspect->MakeArrows3d (Standard_True); diff --git a/src/QABugs/QABugs_17.cxx b/src/QABugs/QABugs_17.cxx index 60102a94f7..a4c7c94b3a 100644 --- a/src/QABugs/QABugs_17.cxx +++ b/src/QABugs/QABugs_17.cxx @@ -56,8 +56,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -286,14 +286,14 @@ static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, /***************************************/ //dimension "L 502.51" /***************************************/ - Handle(AIS_LengthDimension) len = new AIS_LengthDimension(V2, V3, pln->Pln()); + Handle(PrsDim_LengthDimension) len = new PrsDim_LengthDimension(V2, V3, pln->Pln()); anAspect->ArrowAspect()->SetLength (30.0); len->SetDimensionAspect (anAspect); context->Display (len, Standard_False); /***************************************/ //dimension "L 90" /***************************************/ - Handle(AIS_LengthDimension) len1 = new AIS_LengthDimension(V7, V4, pln->Pln()); + Handle(PrsDim_LengthDimension) len1 = new PrsDim_LengthDimension(V7, V4, pln->Pln()); len1->SetDimensionAspect (anAspect); len1->SetFlyout (30.0); anAspect->ArrowAspect()->SetLength (100.0); @@ -301,7 +301,7 @@ static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, /***************************************/ //dimension "L 150" /***************************************/ - Handle(AIS_LengthDimension) len2 = new AIS_LengthDimension(V1, V2, pln->Pln()); + Handle(PrsDim_LengthDimension) len2 = new PrsDim_LengthDimension(V1, V2, pln->Pln()); len2->SetDimensionAspect (anAspect); context->Display (len2, Standard_False); /***************************************/ @@ -309,7 +309,7 @@ static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, /***************************************/ gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 88.58); TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(cir,gp_Pnt(191.09,0,0.),gp_Pnt(191.09,-177.16,0.) ); - Handle(AIS_RadiusDimension) dim1 = new AIS_RadiusDimension(E1); + Handle(PrsDim_RadiusDimension) dim1 = new PrsDim_RadiusDimension(E1); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_False); /***************************************/ @@ -317,7 +317,7 @@ static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, /***************************************/ gp_Circ cir1 = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 43.80); TopoDS_Edge E_cir1 = BRepBuilderAPI_MakeEdge(cir1); - dim1 = new AIS_RadiusDimension(E_cir1); + dim1 = new PrsDim_RadiusDimension(E_cir1); anAspect->ArrowAspect()->SetLength (60.0); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_False); @@ -326,7 +326,7 @@ static Standard_Integer BUC60915_1(Draw_Interpretor& di, Standard_Integer argc, /***************************************/ gp_Circ cir2 = gp_Circ(gp_Ax2(gp_Pnt(566.11, -88.58, 0), gp_Dir(0, 0, -1)), 17.86); TopoDS_Edge E_cir2 = BRepBuilderAPI_MakeEdge(cir2); - dim1 = new AIS_RadiusDimension(E_cir2); + dim1 = new PrsDim_RadiusDimension(E_cir2); anAspect->ArrowAspect()->SetLength (40.0); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_True); diff --git a/src/QABugs/QABugs_3.cxx b/src/QABugs/QABugs_3.cxx index c3d6882024..4af05434f0 100644 --- a/src/QABugs/QABugs_3.cxx +++ b/src/QABugs/QABugs_3.cxx @@ -69,7 +69,7 @@ static int BUC60623(Draw_Interpretor& di, Standard_Integer argc, const char ** a #include #include #include -#include +#include static Standard_Integer BUC60632(Draw_Interpretor& di, Standard_Integer /*n*/, const char ** a) { @@ -92,7 +92,7 @@ static Standard_Integer BUC60632(Draw_Interpretor& di, Standard_Integer /*n*/, c Handle(Geom_Plane) Plane1 = new Geom_Plane(gp_Pnt(0,0,0),gp_Dir(0,0,1)); TCollection_ExtendedString Ext1("Dim1"); - Handle(AIS_LengthDimension) Dim1 = new AIS_LengthDimension(V1,V2,Plane1->Pln()); + Handle(PrsDim_LengthDimension) Dim1 = new PrsDim_LengthDimension(V1,V2,Plane1->Pln()); Dim1->SetCustomValue (Draw::Atof(a[2])); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); diff --git a/src/TKV3d/PACKAGES b/src/TKV3d/PACKAGES index c7f1082589..cf8000db28 100755 --- a/src/TKV3d/PACKAGES +++ b/src/TKV3d/PACKAGES @@ -7,5 +7,6 @@ SelectBasics SelectMgr PrsMgr AIS -DsgPrs StdSelect +DsgPrs +PrsDim diff --git a/src/TPrsStd/TPrsStd_ConstraintDriver.cxx b/src/TPrsStd/TPrsStd_ConstraintDriver.cxx index d51087b79e..60172ef493 100644 --- a/src/TPrsStd/TPrsStd_ConstraintDriver.cxx +++ b/src/TPrsStd/TPrsStd_ConstraintDriver.cxx @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include @@ -181,7 +181,7 @@ Standard_Boolean TPrsStd_ConstraintDriver::Update (const TDF_Label& aLabel, Handle(TDataXtd_Position) Position; if (aLabel.FindAttribute(TDataXtd_Position::GetID(),Position)) { - Handle(AIS_Relation)::DownCast(anAISObject)->SetPosition(Position->GetPosition()); + Handle(PrsDim_Relation)::DownCast(anAISObject)->SetPosition(Position->GetPosition()); } if (anAISObject->HasInteractiveContext()) { diff --git a/src/TPrsStd/TPrsStd_ConstraintTools.cxx b/src/TPrsStd/TPrsStd_ConstraintTools.cxx index 9e7cd95a4e..a67704eb27 100644 --- a/src/TPrsStd/TPrsStd_ConstraintTools.cxx +++ b/src/TPrsStd/TPrsStd_ConstraintTools.cxx @@ -16,26 +16,28 @@ // Purpose: Update AIS object from a TDataXtd_Constraint. // Modified Mon 30 10:15:43 1998 by SZY -#include -#include -#include -#include -#include -#include -#include +#include + #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -79,7 +81,6 @@ #include #include #include -#include #include #include @@ -220,7 +221,7 @@ void TPrsStd_ConstraintTools::UpdateOnlyValue(const Handle(TDataXtd_Constraint)& Standard_Real val; TCollection_ExtendedString txt; TPrsStd_ConstraintTools:: ComputeTextAndValue(aConst,val,txt,aConst->GetType() == TDataXtd_ANGLE); - Handle(AIS_Relation) rel = Handle(AIS_Relation)::DownCast(anAIS); + Handle(PrsDim_Relation) rel = Handle(PrsDim_Relation)::DownCast(anAIS); if (!rel.IsNull()) rel->SetText(txt); } @@ -305,11 +306,11 @@ void TPrsStd_ConstraintTools::ComputeDistance (const Handle(TDataXtd_Constraint) Standard_Boolean SaveDrw = Standard_False; Handle(Prs3d_Drawer) aDrawer; - Handle(AIS_LengthDimension) aDim; + Handle(PrsDim_LengthDimension) aDim; if (!theAIS.IsNull()) { - aDim = Handle(AIS_LengthDimension)::DownCast (theAIS); + aDim = Handle(PrsDim_LengthDimension)::DownCast (theAIS); } // Check shapes for AIS dimension @@ -417,15 +418,15 @@ void TPrsStd_ConstraintTools::ComputeDistance (const Handle(TDataXtd_Constraint) { if (isEdge) { - aDim = new AIS_LengthDimension (GetEdge (aShape1), aPlane->Pln()); + aDim = new PrsDim_LengthDimension (GetEdge (aShape1), aPlane->Pln()); } else if (isFaces) { - aDim = new AIS_LengthDimension (GetFace (aShape1), GetFace (aShape2)); + aDim = new PrsDim_LengthDimension (GetFace (aShape1), GetFace (aShape2)); } else { - aDim = new AIS_LengthDimension (aShape1, aShape2, aPlane->Pln()); + aDim = new PrsDim_LengthDimension (aShape1, aShape2, aPlane->Pln()); } if (SaveDrw) @@ -487,12 +488,12 @@ void TPrsStd_ConstraintTools::ComputePerpendicular(const Handle(TDataXtd_Constra GetGoodShape(shape1); GetGoodShape(shape2); // Update de l'AIS - Handle(AIS_PerpendicularRelation) ais; - if (anAIS.IsNull()) ais = new AIS_PerpendicularRelation(shape1,shape2); + Handle(PrsDim_PerpendicularRelation) ais; + if (anAIS.IsNull()) ais = new PrsDim_PerpendicularRelation(shape1,shape2); else { - ais = Handle(AIS_PerpendicularRelation)::DownCast(anAIS); + ais = Handle(PrsDim_PerpendicularRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_PerpendicularRelation(shape1,shape2); + ais = new PrsDim_PerpendicularRelation(shape1,shape2); } else { ais->SetFirstShape(shape1); @@ -560,12 +561,12 @@ void TPrsStd_ConstraintTools::ComputeParallel(const Handle(TDataXtd_Constraint)& // Update de l'AIS GetGoodShape(shape1); GetGoodShape(shape2); - Handle(AIS_ParallelRelation) ais; - if (anAIS.IsNull()) ais = new AIS_ParallelRelation(shape1,shape2,aplane); + Handle(PrsDim_ParallelRelation) ais; + if (anAIS.IsNull()) ais = new PrsDim_ParallelRelation(shape1,shape2,aplane); else { - ais = Handle(AIS_ParallelRelation)::DownCast(anAIS); + ais = Handle(PrsDim_ParallelRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_ParallelRelation(shape1,shape2,aplane); + ais = new PrsDim_ParallelRelation(shape1,shape2,aplane); } else { ais->SetFirstShape(shape1); @@ -623,12 +624,12 @@ void TPrsStd_ConstraintTools::ComputeSymmetry(const Handle(TDataXtd_Constraint)& return; } // Update de l'AIS - Handle(AIS_SymmetricRelation) ais; - if (anAIS.IsNull()) ais = new AIS_SymmetricRelation(shape3,shape1,shape2,aplane); + Handle(PrsDim_SymmetricRelation) ais; + if (anAIS.IsNull()) ais = new PrsDim_SymmetricRelation(shape3,shape1,shape2,aplane); else { - ais = Handle(AIS_SymmetricRelation)::DownCast(anAIS); + ais = Handle(PrsDim_SymmetricRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_SymmetricRelation(shape3,shape1,shape2,aplane); + ais = new PrsDim_SymmetricRelation(shape3,shape1,shape2,aplane); } else { ais->SetFirstShape(shape1); @@ -694,14 +695,14 @@ void TPrsStd_ConstraintTools::ComputeMidPoint(const Handle(TDataXtd_Constraint)& } // Update de l'AIS - Handle(AIS_MidPointRelation) ais; - if ( anAIS.IsNull() ) ais = new AIS_MidPointRelation(shape3,shape1,shape2,aplane); + Handle(PrsDim_MidPointRelation) ais; + if ( anAIS.IsNull() ) ais = new PrsDim_MidPointRelation(shape3,shape1,shape2,aplane); else { - ais = Handle(AIS_MidPointRelation)::DownCast(anAIS); + ais = Handle(PrsDim_MidPointRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_MidPointRelation(shape3,shape1,shape2,aplane); + ais = new PrsDim_MidPointRelation(shape3,shape1,shape2,aplane); } else { @@ -758,18 +759,18 @@ void TPrsStd_ConstraintTools::ComputeTangent (const Handle(TDataXtd_Constraint)& return; } // Update de l'AIS - Handle(AIS_TangentRelation) ais; + Handle(PrsDim_TangentRelation) ais; if (anAIS.IsNull()) { - ais = new AIS_TangentRelation(shape1,shape2,aplane); + ais = new PrsDim_TangentRelation(shape1,shape2,aplane); ais->SetArrowSize(10000000); // jfa 9/10/2000 } else { - ais = Handle(AIS_TangentRelation)::DownCast(anAIS); + ais = Handle(PrsDim_TangentRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_TangentRelation(shape1,shape2,aplane); + ais = new PrsDim_TangentRelation(shape1,shape2,aplane); ais->SetArrowSize(10000000); // jfa 9/10/2000 } else @@ -807,13 +808,13 @@ void TPrsStd_ConstraintTools::ComputeAngleForOneFace (const Handle(TDataXtd_Cons TCollection_ExtendedString txt; TPrsStd_ConstraintTools::ComputeTextAndValue (aConst,val1,txt,Standard_True); - Handle(AIS_AngleDimension) ais; + Handle(PrsDim_AngleDimension) ais; TopoDS_Face face; if (!anAIS.IsNull()) { - ais = Handle(AIS_AngleDimension)::DownCast(anAIS); + ais = Handle(PrsDim_AngleDimension)::DownCast(anAIS); if(ais.IsNull()) { face = TopoDS::Face( shape ); - ais = new AIS_AngleDimension (face); + ais = new PrsDim_AngleDimension (face); } else { ais->SetMeasuredGeometry(TopoDS::Face( shape )); @@ -821,7 +822,7 @@ void TPrsStd_ConstraintTools::ComputeAngleForOneFace (const Handle(TDataXtd_Cons } else { face = TopoDS::Face (shape); - ais = new AIS_AngleDimension (face); + ais = new PrsDim_AngleDimension (face); } anAIS = ais; @@ -1027,9 +1028,9 @@ void TPrsStd_ConstraintTools::ComputeAngle (const Handle(TDataXtd_Constraint)& a Standard_Boolean toCreate (Standard_True); Standard_Boolean isface(shape1.ShapeType()==TopAbs_FACE); - Handle(AIS_AngleDimension) ais; + Handle(PrsDim_AngleDimension) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_AngleDimension)::DownCast(anAIS); + ais = Handle(PrsDim_AngleDimension)::DownCast(anAIS); if( ais.IsNull() ) { toCreate = Standard_True; } @@ -1044,17 +1045,17 @@ void TPrsStd_ConstraintTools::ComputeAngle (const Handle(TDataXtd_Constraint)& a FindExternalShape(aConst,ExtShape); GetGoodShape(shape1); GetGoodShape(shape2); - ais = new AIS_AngleDimension (TopoDS::Edge(shape1), + ais = new PrsDim_AngleDimension (TopoDS::Edge(shape1), TopoDS::Edge(shape2)); } } else { if (isCurvilinear) { - ais = new AIS_AngleDimension (TopoDS::Face(shape1), + ais = new PrsDim_AngleDimension (TopoDS::Face(shape1), TopoDS::Face(shape2)); } else if (isface) { - ais = new AIS_AngleDimension (TopoDS::Face(shape1), + ais = new PrsDim_AngleDimension (TopoDS::Face(shape1), TopoDS::Face(shape2)); } } @@ -1130,11 +1131,11 @@ void TPrsStd_ConstraintTools::ComputeConcentric(const Handle(TDataXtd_Constraint return; } // Update de l'AIS - Handle(AIS_ConcentricRelation) ais; + Handle(PrsDim_ConcentricRelation) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_ConcentricRelation)::DownCast(anAIS); + ais = Handle(PrsDim_ConcentricRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_ConcentricRelation (shape1,shape2,aplane); + ais = new PrsDim_ConcentricRelation (shape1,shape2,aplane); } else { ais->SetFirstShape(shape1); @@ -1143,7 +1144,7 @@ void TPrsStd_ConstraintTools::ComputeConcentric(const Handle(TDataXtd_Constraint } } else { - ais = new AIS_ConcentricRelation (shape1,shape2,aplane); + ais = new PrsDim_ConcentricRelation (shape1,shape2,aplane); } anAIS = ais; @@ -1198,17 +1199,17 @@ void TPrsStd_ConstraintTools::ComputeRadius (const Handle(TDataXtd_Constraint)& Standard_Boolean isplanar(aConst->IsPlanar()); if (isplanar) GetGoodShape(shape1); - Handle(AIS_RadiusDimension) ais; + Handle(PrsDim_RadiusDimension) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_RadiusDimension)::DownCast(anAIS); + ais = Handle(PrsDim_RadiusDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_RadiusDimension (shape1); + ais = new PrsDim_RadiusDimension (shape1); } else { ais->SetMeasuredGeometry(shape1); } } - else ais = new AIS_RadiusDimension (shape1); + else ais = new PrsDim_RadiusDimension (shape1); if (isplanar) { Handle(Geom_Geometry) ageom2; @@ -1275,11 +1276,11 @@ void TPrsStd_ConstraintTools::ComputeMinRadius (const Handle(TDataXtd_Constraint Standard_Boolean isplanar(aConst->IsPlanar()); if (isplanar) GetGoodShape(shape1); - Handle(AIS_MinRadiusDimension) ais; + Handle(PrsDim_MinRadiusDimension) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_MinRadiusDimension)::DownCast(anAIS); + ais = Handle(PrsDim_MinRadiusDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_MinRadiusDimension (shape1,val1,txt); + ais = new PrsDim_MinRadiusDimension (shape1,val1,txt); } else { ais->SetValue(val1); @@ -1287,7 +1288,7 @@ void TPrsStd_ConstraintTools::ComputeMinRadius (const Handle(TDataXtd_Constraint ais->SetText(txt); } } - else ais = new AIS_MinRadiusDimension (shape1,val1,txt); + else ais = new PrsDim_MinRadiusDimension (shape1,val1,txt); if (isplanar) { Handle(Geom_Geometry) ageom2; @@ -1354,11 +1355,11 @@ void TPrsStd_ConstraintTools::ComputeMaxRadius (const Handle(TDataXtd_Constraint Standard_Boolean isplanar(aConst->IsPlanar()); if (isplanar) GetGoodShape(shape1); - Handle(AIS_MaxRadiusDimension) ais; + Handle(PrsDim_MaxRadiusDimension) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_MaxRadiusDimension)::DownCast(anAIS); + ais = Handle(PrsDim_MaxRadiusDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_MaxRadiusDimension (shape1,val1,txt); + ais = new PrsDim_MaxRadiusDimension (shape1,val1,txt); } else { ais->SetValue(val1); @@ -1366,7 +1367,7 @@ void TPrsStd_ConstraintTools::ComputeMaxRadius (const Handle(TDataXtd_Constraint ais->SetText(txt); } } - else ais = new AIS_MaxRadiusDimension (shape1,val1,txt); + else ais = new PrsDim_MaxRadiusDimension (shape1,val1,txt); if (isplanar) { Handle(Geom_Geometry) ageom2; @@ -1440,13 +1441,13 @@ void TPrsStd_ConstraintTools::ComputeEqualDistance(const Handle(TDataXtd_Constra } //Update AIS - Handle(AIS_EqualDistanceRelation) ais; + Handle(PrsDim_EqualDistanceRelation) ais; if (!anAIS.IsNull()) { { - ais = Handle(AIS_EqualDistanceRelation)::DownCast(anAIS); + ais = Handle(PrsDim_EqualDistanceRelation)::DownCast(anAIS); if (ais.IsNull()) - ais = new AIS_EqualDistanceRelation(aShape1, aShape2, aShape3, aShape4, aPlane); + ais = new PrsDim_EqualDistanceRelation(aShape1, aShape2, aShape3, aShape4, aPlane); else { ais->SetFirstShape(aShape1); @@ -1457,7 +1458,7 @@ void TPrsStd_ConstraintTools::ComputeEqualDistance(const Handle(TDataXtd_Constra } } } - else ais = new AIS_EqualDistanceRelation(aShape1, aShape2, aShape3, aShape4, aPlane); + else ais = new PrsDim_EqualDistanceRelation(aShape1, aShape2, aShape3, aShape4, aPlane); anAIS = ais; @@ -1608,12 +1609,12 @@ void TPrsStd_ConstraintTools::ComputeEqualRadius(const Handle(TDataXtd_Constrain return; } } - Handle(AIS_EqualRadiusRelation) ais; + Handle(PrsDim_EqualRadiusRelation) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_EqualRadiusRelation)::DownCast(anAIS); + ais = Handle(PrsDim_EqualRadiusRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_EqualRadiusRelation(edge1, edge2, aplane); + ais = new PrsDim_EqualRadiusRelation(edge1, edge2, aplane); } else { ais->SetFirstShape(shape1); @@ -1622,7 +1623,7 @@ void TPrsStd_ConstraintTools::ComputeEqualRadius(const Handle(TDataXtd_Constrain } } else { - ais = new AIS_EqualRadiusRelation(edge1, edge2, aplane); + ais = new PrsDim_EqualRadiusRelation(edge1, edge2, aplane); } anAIS = ais; @@ -1661,17 +1662,17 @@ void TPrsStd_ConstraintTools::ComputeDiameter(const Handle(TDataXtd_Constraint)& // Update de l'AIS Standard_Boolean IsPlanar(aConst->IsPlanar()); if (IsPlanar) GetGoodShape(shape1); - Handle(AIS_DiameterDimension) ais; + Handle(PrsDim_DiameterDimension) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_DiameterDimension)::DownCast(anAIS); + ais = Handle(PrsDim_DiameterDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_DiameterDimension (shape1); + ais = new PrsDim_DiameterDimension (shape1); } else { ais->SetMeasuredGeometry(shape1); } } - else ais = new AIS_DiameterDimension (shape1); + else ais = new PrsDim_DiameterDimension (shape1); if (IsPlanar) { Handle(Geom_Geometry) ageom2; @@ -1735,18 +1736,18 @@ void TPrsStd_ConstraintTools::ComputeFix(const Handle(TDataXtd_Constraint)& aCon return; } // Update de l'AIS - Handle(AIS_FixRelation) ais; + Handle(PrsDim_FixRelation) ais; if (!anAIS.IsNull()) { - ais = Handle(AIS_FixRelation)::DownCast(anAIS); + ais = Handle(PrsDim_FixRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_FixRelation (shape1,aplane); + ais = new PrsDim_FixRelation (shape1,aplane); } else { ais->SetFirstShape(shape1); ais->SetPlane(aplane); } } - else ais = new AIS_FixRelation (shape1,aplane); + else ais = new PrsDim_FixRelation (shape1,aplane); anAIS = ais; } @@ -1803,7 +1804,7 @@ void TPrsStd_ConstraintTools::ComputeOffset (const Handle(TDataXtd_Constraint)& Standard_Real val1; TCollection_ExtendedString txt; - Handle(AIS_LengthDimension) ais; + Handle(PrsDim_LengthDimension) ais; //Handle(Prs3d_Drawer) aDrawer; if (nbgeom == 1) @@ -1811,14 +1812,14 @@ void TPrsStd_ConstraintTools::ComputeOffset (const Handle(TDataXtd_Constraint)& ComputeTextAndValue (aConst,val1,txt,Standard_False); if (!anAIS.IsNull()) { - ais = Handle(AIS_LengthDimension)::DownCast(anAIS); + ais = Handle(PrsDim_LengthDimension)::DownCast(anAIS); } if (S1.ShapeType() == TopAbs_FACE && S2.ShapeType() == TopAbs_FACE) { if (ais.IsNull()) { - ais = new AIS_LengthDimension (TopoDS::Face(S1),TopoDS::Face(S2)); + ais = new PrsDim_LengthDimension (TopoDS::Face(S1),TopoDS::Face(S2)); } else { @@ -1851,7 +1852,7 @@ void TPrsStd_ConstraintTools::ComputeOffset (const Handle(TDataXtd_Constraint)& aplane = new Geom_Plane (NLin.Location(),NLin.Direction()^TDir); if (ais.IsNull()) { - ais = new AIS_LengthDimension (S1,S2,aplane->Pln()); + ais = new PrsDim_LengthDimension (S1,S2,aplane->Pln()); } else { ais->SetMeasuredShapes (S1, S2); @@ -1912,9 +1913,9 @@ void TPrsStd_ConstraintTools::ComputeOffset (const Handle(TDataXtd_Constraint)& } } S2 = nearest; - ais = Handle(AIS_LengthDimension)::DownCast(anAIS); + ais = Handle(PrsDim_LengthDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_LengthDimension (S1,S2,aplane->Pln()); + ais = new PrsDim_LengthDimension (S1,S2,aplane->Pln()); } else { ais->SetMeasuredShapes (S1, S2); @@ -1960,14 +1961,14 @@ void TPrsStd_ConstraintTools::ComputePlacement ComputeTextAndValue(aConst,val1,txt,Standard_False); } // Update de l'AIS - Handle(AIS_OffsetDimension) ais; + Handle(PrsDim_OffsetDimension) ais; if (anAIS.IsNull()) { - ais = new AIS_OffsetDimension(GetFace(shape1),GetFace(shape2),val1,txt); + ais = new PrsDim_OffsetDimension(GetFace(shape1),GetFace(shape2),val1,txt); ais->SetArrowSize(val1/20.); } else { - ais = Handle(AIS_OffsetDimension)::DownCast(anAIS); + ais = Handle(PrsDim_OffsetDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_OffsetDimension(GetFace(shape1),GetFace(shape2),val1,txt); + ais = new PrsDim_OffsetDimension(GetFace(shape1),GetFace(shape2),val1,txt); ais->SetArrowSize(val1/20.); } else { ais->SetFirstShape(GetFace(shape1)); @@ -2116,12 +2117,12 @@ void TPrsStd_ConstraintTools::ComputeCoincident(const Handle(TDataXtd_Constraint } // Update de l'AIS - Handle(AIS_IdenticRelation) ais; - if (anAIS.IsNull()) ais = new AIS_IdenticRelation(shape1,shape2,aplane); + Handle(PrsDim_IdenticRelation) ais; + if (anAIS.IsNull()) ais = new PrsDim_IdenticRelation(shape1,shape2,aplane); else { - ais = Handle(AIS_IdenticRelation)::DownCast(anAIS); + ais = Handle(PrsDim_IdenticRelation)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_IdenticRelation(shape1,shape2,aplane); + ais = new PrsDim_IdenticRelation(shape1,shape2,aplane); } else { ais->SetFirstShape(shape1); @@ -2162,17 +2163,17 @@ void TPrsStd_ConstraintTools::ComputeRound(const Handle(TDataXtd_Constraint)& aC ComputeTextAndValue(aConst,val1,txt,Standard_False); // Update de l'AIS - Handle(AIS_RadiusDimension) ais; + Handle(PrsDim_RadiusDimension) ais; { try { OCC_CATCH_SIGNALS if (anAIS.IsNull()) ais = - new AIS_RadiusDimension(shape1); + new PrsDim_RadiusDimension(shape1); else { - ais = Handle(AIS_RadiusDimension)::DownCast(anAIS); + ais = Handle(PrsDim_RadiusDimension)::DownCast(anAIS); if (ais.IsNull()) { - ais = new AIS_RadiusDimension(shape1); + ais = new PrsDim_RadiusDimension(shape1); } else { ais->SetMeasuredGeometry(shape1); diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index fad405c6f3..029a5c4de6 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -33,12 +33,12 @@ #include #include #include -#include #include #include #include #include -#include +#include +#include #include #include #include @@ -5441,17 +5441,17 @@ static void objInfo (const NCollection_Map& theDe } else if (theObj->Type() == AIS_KOI_Relation) { - // AIS_Dimention and AIS_Relation - Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (theObj); + // PrsDim_Dimention and AIS_Relation + Handle(PrsDim_Relation) aRelation = Handle(PrsDim_Relation)::DownCast (theObj); switch (aRelation->KindOfDimension()) { - case AIS_KOD_PLANEANGLE: theDI << " AIS_AngleDimension"; break; - case AIS_KOD_LENGTH: theDI << " AIS_Chamf2/3dDimension/AIS_LengthDimension"; break; - case AIS_KOD_DIAMETER: theDI << " AIS_DiameterDimension"; break; - case AIS_KOD_ELLIPSERADIUS: theDI << " AIS_EllipseRadiusDimension"; break; - //case AIS_KOD_FILLETRADIUS: theDI << " AIS_FilletRadiusDimension "; break; - case AIS_KOD_OFFSET: theDI << " AIS_OffsetDimension"; break; - case AIS_KOD_RADIUS: theDI << " AIS_RadiusDimension"; break; + case PrsDim_KOD_PLANEANGLE: theDI << " PrsDim_AngleDimension"; break; + case PrsDim_KOD_LENGTH: theDI << " PrsDim_Chamf2/3dDimension/PrsDim_LengthDimension"; break; + case PrsDim_KOD_DIAMETER: theDI << " PrsDim_DiameterDimension"; break; + case PrsDim_KOD_ELLIPSERADIUS: theDI << " PrsDim_EllipseRadiusDimension"; break; + //case PrsDim_KOD_FILLETRADIUS: theDI << " PrsDim_FilletRadiusDimension "; break; + case PrsDim_KOD_OFFSET: theDI << " PrsDim_OffsetDimension"; break; + case PrsDim_KOD_RADIUS: theDI << " PrsDim_RadiusDimension"; break; default: theDI << " UNKNOWN dimension"; break; } } @@ -6133,9 +6133,9 @@ static int VEraseType( Draw_Interpretor& , Standard_Integer argc, const char** a if(dimension_status == -1) TheAISContext()->Erase(curio,Standard_False); else { - AIS_KindOfDimension KOD = Handle(AIS_Relation)::DownCast (curio)->KindOfDimension(); - if ((dimension_status==0 && KOD == AIS_KOD_NONE)|| - (dimension_status==1 && KOD != AIS_KOD_NONE)) + PrsDim_KindOfDimension KOD = Handle(PrsDim_Relation)::DownCast (curio)->KindOfDimension(); + if ((dimension_status==0 && KOD == PrsDim_KOD_NONE)|| + (dimension_status==1 && KOD != PrsDim_KOD_NONE)) TheAISContext()->Erase(curio,Standard_False); } } @@ -6166,9 +6166,9 @@ static int VDisplayType(Draw_Interpretor& , Standard_Integer argc, const char** if(dimension_status == -1) TheAISContext()->Display(curio,Standard_False); else { - AIS_KindOfDimension KOD = Handle(AIS_Relation)::DownCast (curio)->KindOfDimension(); - if ((dimension_status==0 && KOD == AIS_KOD_NONE)|| - (dimension_status==1 && KOD != AIS_KOD_NONE)) + PrsDim_KindOfDimension KOD = Handle(PrsDim_Relation)::DownCast (curio)->KindOfDimension(); + if ((dimension_status==0 && KOD == PrsDim_KOD_NONE)|| + (dimension_status==1 && KOD != PrsDim_KOD_NONE)) TheAISContext()->Display(curio,Standard_False); } @@ -6928,17 +6928,11 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands) #include #include #include -#include #include #include #include #include #include -//#include -//#include - - - //======================================================================= //function : IsValid @@ -7000,7 +6994,7 @@ static Standard_Integer TDraft(Draw_Interpretor& di, Standard_Integer argc, cons anAngle = 2*M_PI * anAngle / 360.0; gp_Pln aPln; Handle( Geom_Surface )aSurf; - AIS_KindOfSurface aSurfType; + PrsDim_KindOfSurface aSurfType; Standard_Real Offset; gp_Dir aDir; if(argc > 4) { // == 5 @@ -7009,7 +7003,7 @@ static Standard_Integer TDraft(Draw_Interpretor& di, Standard_Integer argc, cons } TopoDS_Face face2 = TopoDS::Face(Plane); - if(!AIS::GetPlaneFromFace(face2, aPln, aSurf, aSurfType, Offset)) + if(!PrsDim::GetPlaneFromFace(face2, aPln, aSurf, aSurfType, Offset)) { di << "TEST : Can't find plane\n"; return 1; diff --git a/src/ViewerTest/ViewerTest_RelationCommands.cxx b/src/ViewerTest/ViewerTest_RelationCommands.cxx index 9fc8f1e8b7..9fe3682487 100644 --- a/src/ViewerTest/ViewerTest_RelationCommands.cxx +++ b/src/ViewerTest/ViewerTest_RelationCommands.cxx @@ -16,30 +16,30 @@ #include -#include #include -#include -#include #include -#include -#include -#include -#include #include -#include -#include #include #include #include -#include -#include -#include #include -#include -#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -89,8 +89,6 @@ #include #include #include -#include -#include extern Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName, const Handle(AIS_InteractiveObject)& theAISObj, @@ -491,7 +489,7 @@ static int ParseDimensionParams (Standard_Integer theArgNum, //function : SetDimensionParams //purpose : Sets parameters for dimension //======================================================================= -static void SetDimensionParams (const Handle(AIS_Dimension)& theDim, +static void SetDimensionParams (const Handle(PrsDim_Dimension)& theDim, const NCollection_DataMap& theRealParams, const NCollection_DataMap& theStringParams) { @@ -585,11 +583,11 @@ static int ParseAngleDimensionParams (Standard_Integer theArgNum, //function : SetAngleDimensionParams //purpose : Sets parameters for angle dimension //======================================================================= -static void SetAngleDimensionParams (const Handle(AIS_Dimension)& theDim, +static void SetAngleDimensionParams (const Handle(PrsDim_Dimension)& theDim, const NCollection_DataMap& theStringParams) { - Handle(AIS_AngleDimension) anAngleDim = Handle(AIS_AngleDimension)::DownCast (theDim); + Handle(PrsDim_AngleDimension) anAngleDim = Handle(PrsDim_AngleDimension)::DownCast (theDim); if (anAngleDim.IsNull()) { return; @@ -597,15 +595,15 @@ static void SetAngleDimensionParams (const Handle(AIS_Dimension)& theDim, if (theStringParams.IsBound ("type")) { - AIS_TypeOfAngle anAngleType = AIS_TOA_Interior; + PrsDim_TypeOfAngle anAngleType = PrsDim_TypeOfAngle_Interior; TCollection_AsciiString anAngleTypeStr = theStringParams.Find ("type"); if (anAngleTypeStr.IsEqual("interior")) { - anAngleType = AIS_TOA_Interior; + anAngleType = PrsDim_TypeOfAngle_Interior; } else if (anAngleTypeStr.IsEqual("exterior")) { - anAngleType = AIS_TOA_Exterior; + anAngleType = PrsDim_TypeOfAngle_Exterior; } else { @@ -616,23 +614,23 @@ static void SetAngleDimensionParams (const Handle(AIS_Dimension)& theDim, if (theStringParams.IsBound ("showarrow")) { - AIS_TypeOfAngleArrowVisibility anArrowType = AIS_TOAV_Both; + PrsDim_TypeOfAngleArrowVisibility anArrowType = PrsDim_TypeOfAngleArrowVisibility_Both; TCollection_AsciiString anArrowTypeStr = theStringParams.Find ("showarrow"); if (anArrowTypeStr.IsEqual("both")) { - anArrowType = AIS_TOAV_Both; + anArrowType = PrsDim_TypeOfAngleArrowVisibility_Both; } else if (anArrowTypeStr.IsEqual("first")) { - anArrowType = AIS_TOAV_First; + anArrowType = PrsDim_TypeOfAngleArrowVisibility_First; } else if (anArrowTypeStr.IsEqual("second")) { - anArrowType = AIS_TOAV_Second; + anArrowType = PrsDim_TypeOfAngleArrowVisibility_Second; } else if (anArrowTypeStr.IsEqual("none")) { - anArrowType = AIS_TOAV_None; + anArrowType = PrsDim_TypeOfAngleArrowVisibility_None; } else { @@ -670,22 +668,22 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, TCollection_AsciiString aDimType(theArgs[2]); aDimType.LowerCase(); - AIS_KindOfDimension aKindOfDimension; + PrsDim_KindOfDimension aKindOfDimension; if (aDimType == "-length") { - aKindOfDimension = AIS_KOD_LENGTH; + aKindOfDimension = PrsDim_KOD_LENGTH; } else if (aDimType == "-angle") { - aKindOfDimension = AIS_KOD_PLANEANGLE; + aKindOfDimension = PrsDim_KOD_PLANEANGLE; } else if (aDimType == "-radius") { - aKindOfDimension = AIS_KOD_RADIUS; + aKindOfDimension = PrsDim_KOD_RADIUS; } else if (aDimType == "-diameter" || aDimType == "-diam") { - aKindOfDimension = AIS_KOD_DIAMETER; + aKindOfDimension = PrsDim_KOD_DIAMETER; } else { @@ -702,10 +700,10 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, } // Build dimension - Handle(AIS_Dimension) aDim; + Handle(PrsDim_Dimension) aDim; switch (aKindOfDimension) { - case AIS_KOD_LENGTH: + case PrsDim_KOD_LENGTH: { if (aShapes.Extent() == 1) { @@ -725,10 +723,10 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, TopoDS_Edge anEdge = TopoDS::Edge ((Handle(AIS_Shape)::DownCast(aShapes.First()))->Shape()); TopoDS_Vertex aFirst, aSecond; TopExp::Vertices (anEdge, aFirst, aSecond); - aDim = new AIS_LengthDimension (anEdge, aWorkingPlane); + aDim = new PrsDim_LengthDimension (anEdge, aWorkingPlane); // Move standard plane (XOY, YOZ or ZOX) to the first point to make it working for dimension - aWorkingPlane.SetLocation (Handle(AIS_LengthDimension)::DownCast (aDim)->FirstPoint()); + aWorkingPlane.SetLocation (Handle(PrsDim_LengthDimension)::DownCast (aDim)->FirstPoint()); } else if (aShapes.Extent() == 2) { @@ -762,15 +760,15 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, // Face-Face case if (aShape1.ShapeType() == TopAbs_FACE && aShape2.ShapeType() == TopAbs_FACE) { - aDim = new AIS_LengthDimension (TopoDS::Face (aShape1), TopoDS::Face (aShape2)); + aDim = new PrsDim_LengthDimension (TopoDS::Face (aShape1), TopoDS::Face (aShape2)); } else if (aShape1.ShapeType() == TopAbs_FACE && aShape2.ShapeType() == TopAbs_EDGE) { - aDim = new AIS_LengthDimension (TopoDS::Face (aShape1), TopoDS::Edge (aShape2)); + aDim = new PrsDim_LengthDimension (TopoDS::Face (aShape1), TopoDS::Edge (aShape2)); } else if (aShape1.ShapeType() == TopAbs_EDGE && aShape2.ShapeType() == TopAbs_FACE) { - aDim = new AIS_LengthDimension (TopoDS::Face (aShape2), TopoDS::Edge (aShape1)); + aDim = new PrsDim_LengthDimension (TopoDS::Face (aShape2), TopoDS::Edge (aShape1)); } else { @@ -789,7 +787,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, aWorkingPlane.SetLocation (BRep_Tool::Pnt (TopoDS::Vertex (aShape2))); } - aDim = new AIS_LengthDimension (aShape1, aShape2, aWorkingPlane); + aDim = new PrsDim_LengthDimension (aShape1, aShape2, aWorkingPlane); } } else @@ -800,13 +798,13 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, break; } - case AIS_KOD_PLANEANGLE: + case PrsDim_KOD_PLANEANGLE: { if (aShapes.Extent() == 1 && aShapes.First()->Type()==AIS_KOI_Shape) { Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aShapes.First()); if (aShape->Shape().ShapeType() == TopAbs_FACE) - aDim = new AIS_AngleDimension (TopoDS::Face(aShape->Shape())); + aDim = new PrsDim_AngleDimension (TopoDS::Face(aShape->Shape())); } if (aShapes.Extent() == 2) { @@ -815,7 +813,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, if (!aShape1.IsNull() && !aShape2.IsNull() && aShape1->Shape().ShapeType() == TopAbs_EDGE && aShape2->Shape().ShapeType() == TopAbs_EDGE) - aDim = new AIS_AngleDimension (TopoDS::Edge(aShape1->Shape()),TopoDS::Edge(aShape2->Shape())); + aDim = new PrsDim_AngleDimension (TopoDS::Edge(aShape1->Shape()),TopoDS::Edge(aShape2->Shape())); else { std::cerr << theArgs[0] << ": wrong shapes for angle dimension.\n"; @@ -839,7 +837,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, if (aPoint.IsNull()) return 1; aP3 = aPoint->Component()->Pnt(); - aDim = new AIS_AngleDimension (aP1, aP2, aP3); + aDim = new PrsDim_AngleDimension (aP1, aP2, aP3); } else { @@ -849,7 +847,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, break; } - case AIS_KOD_RADIUS: // radius of the circle + case PrsDim_KOD_RADIUS: // radius of the circle { gp_Pnt anAnchor; bool hasAnchor = false; @@ -874,16 +872,16 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, gp_Circ aCircle = aShapeCirc->Circle()->Circ(); if (hasAnchor) { - aDim = new AIS_RadiusDimension (aCircle, anAnchor); + aDim = new PrsDim_RadiusDimension (aCircle, anAnchor); } else { - aDim = new AIS_RadiusDimension (aCircle); + aDim = new PrsDim_RadiusDimension (aCircle); } } else if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aShapes.First())) { - Handle(AIS_RadiusDimension) aRadDim = new AIS_RadiusDimension (aShape->Shape()); + Handle(PrsDim_RadiusDimension) aRadDim = new PrsDim_RadiusDimension (aShape->Shape()); if (hasAnchor) { aRadDim->SetMeasuredGeometry (aShape->Shape(), anAnchor); @@ -897,7 +895,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, } break; } - case AIS_KOD_DIAMETER: + case PrsDim_KOD_DIAMETER: { if (aShapes.Extent() == 1) { @@ -905,7 +903,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, { Handle(AIS_Circle) aShape = Handle(AIS_Circle)::DownCast (aShapes.First()); gp_Circ aCircle = aShape->Circle()->Circ(); - aDim = new AIS_DiameterDimension (aCircle); + aDim = new PrsDim_DiameterDimension (aCircle); } else { @@ -915,7 +913,7 @@ static int VDimBuilder (Draw_Interpretor& /*theDi*/, std::cerr << "Error: shape for radius is of wrong type.\n"; return 1; } - aDim = new AIS_DiameterDimension (aShape->Shape()); + aDim = new PrsDim_DiameterDimension (aShape->Shape()); } } else @@ -984,56 +982,56 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, TCollection_AsciiString aName (theArgs[1]); TCollection_AsciiString aType (theArgs[2]); - AIS_KindOfRelation aKindOfRelation = AIS_KOR_NONE; + PrsDim_KindOfRelation aKindOfRelation = PrsDim_KOR_NONE; if (aType == "-concentric") { - aKindOfRelation = AIS_KOR_CONCENTRIC; + aKindOfRelation = PrsDim_KOR_CONCENTRIC; } else if (aType == "-equaldistance") { - aKindOfRelation = AIS_KOR_EQUALDISTANCE; + aKindOfRelation = PrsDim_KOR_EQUALDISTANCE; } else if (aType == "-equalradius") { - aKindOfRelation = AIS_KOR_EQUALRADIUS; + aKindOfRelation = PrsDim_KOR_EQUALRADIUS; } else if (aType == "-fix") { - aKindOfRelation = AIS_KOR_FIX; + aKindOfRelation = PrsDim_KOR_FIX; } else if (aType == "-identic") { - aKindOfRelation = AIS_KOR_IDENTIC; + aKindOfRelation = PrsDim_KOR_IDENTIC; } else if (aType == "-offset") { - aKindOfRelation = AIS_KOR_OFFSET; + aKindOfRelation = PrsDim_KOR_OFFSET; } else if (aType == "-parallel") { - aKindOfRelation = AIS_KOR_PARALLEL; + aKindOfRelation = PrsDim_KOR_PARALLEL; } else if (aType == "-perpendicular") { - aKindOfRelation = AIS_KOR_PERPENDICULAR; + aKindOfRelation = PrsDim_KOR_PERPENDICULAR; } else if (aType == "-tangent") { - aKindOfRelation = AIS_KOR_TANGENT; + aKindOfRelation = PrsDim_KOR_TANGENT; } else if (aType == "-symmetric") { - aKindOfRelation = AIS_KOR_SYMMETRIC; + aKindOfRelation = PrsDim_KOR_SYMMETRIC; } TopTools_ListOfShape aShapes; ViewerTest::GetSelectedShapes (aShapes); // Build relation. - Handle(AIS_Relation) aRelation; + Handle(PrsDim_Relation) aRelation; switch (aKindOfRelation) { - case AIS_KOR_CONCENTRIC: + case PrsDim_KOR_CONCENTRIC: { if (aShapes.Extent() != 2) { @@ -1058,12 +1056,11 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, gp_Pnt C = aCurve1.Value (0.75); GC_MakePlane aMkPlane (aCenter1, B, C); - aRelation = new AIS_ConcentricRelation (aShape1, aShape2, aMkPlane.Value()); + aRelation = new PrsDim_ConcentricRelation (aShape1, aShape2, aMkPlane.Value()); break; } - - case AIS_KOR_EQUALDISTANCE: + case PrsDim_KOR_EQUALDISTANCE: { if (aShapes.Extent() != 4) { @@ -1129,16 +1126,11 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, } GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_EqualDistanceRelation (aSelectedShapes[0], - aSelectedShapes[1], - aSelectedShapes[2], - aSelectedShapes[3], - aMkPlane.Value()); + aRelation = new PrsDim_EqualDistanceRelation (aSelectedShapes[0], aSelectedShapes[1], aSelectedShapes[2], aSelectedShapes[3], aMkPlane.Value()); break; } - - case AIS_KOR_EQUALRADIUS: + case PrsDim_KOR_EQUALRADIUS: { if (aShapes.Extent() != 2 && aShapes.Extent() != 1) { @@ -1163,11 +1155,10 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, gp_Pnt C = aCurve1.Value (0.9); GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_EqualRadiusRelation (anEdge1, anEdge2, aMkPlane.Value()); + aRelation = new PrsDim_EqualRadiusRelation (anEdge1, anEdge2, aMkPlane.Value()); break; } - - case AIS_KOR_FIX: + case PrsDim_KOR_FIX: { if (aShapes.Extent() != 1) { @@ -1190,11 +1181,10 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, gp_Pnt C (B.X() + 5.0, B.Y() + 5.0, B.Z() + 5.0); GC_MakePlane aMkPlane (A, D, C); - aRelation = new AIS_FixRelation (anEdge, aMkPlane.Value()); + aRelation = new PrsDim_FixRelation (anEdge, aMkPlane.Value()); break; } - - case AIS_KOR_IDENTIC: + case PrsDim_KOR_IDENTIC: { if (aShapes.Extent() != 2) { @@ -1261,11 +1251,10 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, } GC_MakePlane aMkPlane (A ,B ,C); - aRelation = new AIS_IdenticRelation (aShapeA, aShapeB, aMkPlane.Value()); + aRelation = new PrsDim_IdenticRelation (aShapeA, aShapeB, aMkPlane.Value()); break; } - - case AIS_KOR_OFFSET: + case PrsDim_KOR_OFFSET: { if (aShapes.Extent() != 2) { @@ -1294,13 +1283,10 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, Standard_Real aDist = Round (sqrt (aDelta.SquareDistance (1)) * 10.0) / 10.0; TCollection_ExtendedString aMessage (TCollection_ExtendedString ("offset=") + TCollection_ExtendedString (aDist)); - - aRelation = new AIS_OffsetDimension (aFace1, aFace2, aDist, aMessage); - + aRelation = new PrsDim_OffsetDimension (aFace1, aFace2, aDist, aMessage); break; } - - case AIS_KOR_PARALLEL: + case PrsDim_KOR_PARALLEL: { if (aShapes.Extent() != 2) { @@ -1331,7 +1317,7 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_ParallelRelation (anEdgeA, anEdgeB, aMkPlane.Value()); + aRelation = new PrsDim_ParallelRelation (anEdgeA, anEdgeB, aMkPlane.Value()); } else { @@ -1359,12 +1345,11 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_ParallelRelation (aFaceA, aFaceB, aMkPlane.Value()); + aRelation = new PrsDim_ParallelRelation (aFaceA, aFaceB, aMkPlane.Value()); } break; } - - case AIS_KOR_PERPENDICULAR: + case PrsDim_KOR_PERPENDICULAR: { if (aShapes.Extent() != 2) { @@ -1389,7 +1374,7 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_PerpendicularRelation (anEdgeA, anEdgeB, aMkPlane.Value()); + aRelation = new PrsDim_PerpendicularRelation (anEdgeA, anEdgeB, aMkPlane.Value()); } else { @@ -1411,13 +1396,12 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_PerpendicularRelation (aFaceA, aFaceB); + aRelation = new PrsDim_PerpendicularRelation (aFaceA, aFaceB); } break; } - - case AIS_KOR_TANGENT: + case PrsDim_KOR_TANGENT: { if (aShapes.Extent() != 2) { @@ -1442,7 +1426,7 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A,B,C); - aRelation = new AIS_TangentRelation (anEdgeA, anEdgeB, aMkPlane.Value()); + aRelation = new PrsDim_TangentRelation (anEdgeA, anEdgeB, aMkPlane.Value()); } else { @@ -1464,12 +1448,11 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A,B,C); - aRelation = new AIS_TangentRelation (aFaceA, aFaceB, aMkPlane.Value()); + aRelation = new PrsDim_TangentRelation (aFaceA, aFaceB, aMkPlane.Value()); } break; } - - case AIS_KOR_SYMMETRIC: + case PrsDim_KOR_SYMMETRIC: { if (aShapes.Extent() != 3) { @@ -1515,7 +1498,7 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, GC_MakePlane aMkPlane (A, B, C); - aRelation = new AIS_SymmetricRelation (anEdgeA, anEdgeB, anEdgeC, aMkPlane.Value()); + aRelation = new PrsDim_SymmetricRelation (anEdgeA, anEdgeB, anEdgeC, aMkPlane.Value()); } else { @@ -1531,13 +1514,12 @@ static int VRelationBuilder (Draw_Interpretor& /*theDi*/, gp_Pnt A = BRep_Tool::Pnt (Va); GC_MakePlane aMkPlane(A, B, C); - aRelation = new AIS_SymmetricRelation (anEdgeA, aVertexB, aVertexC, aMkPlane.Value()); + aRelation = new PrsDim_SymmetricRelation (anEdgeA, aVertexB, aVertexC, aMkPlane.Value()); } break; } - - case AIS_KOR_NONE: + case PrsDim_KOR_NONE: { std::cerr << "Error: Unknown type of relation!\n"; return 1; @@ -1575,7 +1557,7 @@ static int VDimParam (Draw_Interpretor& theDi, Standard_Integer theArgNum, const theDi << theArgVec[0] << "error: no object with this name.\n"; return 1; } - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (anObject); + Handle(PrsDim_Dimension) aDim = Handle(PrsDim_Dimension)::DownCast (anObject); if (aDim.IsNull()) { theDi << theArgVec[0] << "error: no dimension with this name.\n"; @@ -1633,7 +1615,7 @@ static int VLengthParam (Draw_Interpretor&, Standard_Integer theArgNum, const ch return 1; } - Handle(AIS_LengthDimension) aLengthDim = Handle(AIS_LengthDimension)::DownCast (anObject); + Handle(PrsDim_LengthDimension) aLengthDim = Handle(PrsDim_LengthDimension)::DownCast (anObject); if (aLengthDim.IsNull()) { std::cout << theArgVec[0] << "error: no length dimension with this name.\n"; @@ -1735,7 +1717,7 @@ static int VAngleParam (Draw_Interpretor& theDi, Standard_Integer theArgNum, con return 1; } - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (anObject); + Handle(PrsDim_Dimension) aDim = Handle(PrsDim_Dimension)::DownCast (anObject); if (aDim.IsNull()) { theDi << theArgVec[0] << "error: no dimension with this name.\n"; @@ -1853,36 +1835,36 @@ static int VMoveDim (Draw_Interpretor& theDi, Standard_Integer theArgNum, const // Set text position, update relation or dimension. if (aPickedObj->Type() == AIS_KOI_Relation) { - Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (aPickedObj); + Handle(PrsDim_Relation) aRelation = Handle(PrsDim_Relation)::DownCast (aPickedObj); aPoint = Get3DPointAtMousePosition(); aRelation->SetPosition (aPoint); TheAISContext()->Redisplay (aRelation, Standard_True); } else { - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (aPickedObj); + Handle(PrsDim_Dimension) aDim = Handle(PrsDim_Dimension)::DownCast (aPickedObj); gp_Pnt aFirstPoint, aSecondPoint; - if (aDim->KindOfDimension() == AIS_KOD_PLANEANGLE) + if (aDim->KindOfDimension() == PrsDim_KOD_PLANEANGLE) { - Handle(AIS_AngleDimension) anAngleDim = Handle(AIS_AngleDimension)::DownCast (aDim); + Handle(PrsDim_AngleDimension) anAngleDim = Handle(PrsDim_AngleDimension)::DownCast (aDim); aFirstPoint = anAngleDim->FirstPoint(); aSecondPoint = anAngleDim->SecondPoint(); } - else if (aDim->KindOfDimension() == AIS_KOD_LENGTH) + else if (aDim->KindOfDimension() == PrsDim_KOD_LENGTH) { - Handle(AIS_LengthDimension) aLengthDim = Handle(AIS_LengthDimension)::DownCast (aDim); + Handle(PrsDim_LengthDimension) aLengthDim = Handle(PrsDim_LengthDimension)::DownCast (aDim); aFirstPoint = aLengthDim->FirstPoint(); aSecondPoint = aLengthDim->SecondPoint(); } - else if (aDim->KindOfDimension() == AIS_KOD_RADIUS) + else if (aDim->KindOfDimension() == PrsDim_KOD_RADIUS) { - Handle(AIS_RadiusDimension) aRadiusDim = Handle(AIS_RadiusDimension)::DownCast (aDim); + Handle(PrsDim_RadiusDimension) aRadiusDim = Handle(PrsDim_RadiusDimension)::DownCast (aDim); aFirstPoint = aRadiusDim->AnchorPoint(); aSecondPoint = aRadiusDim->Circle().Location(); } - else if (aDim->KindOfDimension() == AIS_KOD_DIAMETER) + else if (aDim->KindOfDimension() == PrsDim_KOD_DIAMETER) { - Handle(AIS_DiameterDimension) aDiameterDim = Handle(AIS_DiameterDimension)::DownCast (aDim); + Handle(PrsDim_DiameterDimension) aDiameterDim = Handle(PrsDim_DiameterDimension)::DownCast (aDim); aFirstPoint = aDiameterDim->AnchorPoint(); aSecondPoint = aDiameterDim->Circle().Location(); } @@ -1901,13 +1883,13 @@ static int VMoveDim (Draw_Interpretor& theDi, Standard_Integer theArgNum, const // Set text position, update relation or dimension. if (aPickedObj->Type() == AIS_KOI_Relation) { - Handle(AIS_Relation) aRelation = Handle(AIS_Relation)::DownCast (aPickedObj); + Handle(PrsDim_Relation) aRelation = Handle(PrsDim_Relation)::DownCast (aPickedObj); aRelation->SetPosition (aPoint); TheAISContext()->Redisplay (aRelation, Standard_True); } else { - Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast (aPickedObj); + Handle(PrsDim_Dimension) aDim = Handle(PrsDim_Dimension)::DownCast (aPickedObj); aDim->SetTextPosition (aPoint); TheAISContext()->Redisplay (aDim, Standard_True); }