X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_Circ.cpp;h=facc1ec2a970ac4315c08bbc01f8fa8465e292f3;hb=2cb4458b35ae6c9561a35b3b18dbdb673d0c12c9;hp=566824e06007ddc6144f6f5127eed047de547f73;hpb=8dc74f82810d5f597b78633b457efb0ef4f89f9f;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_Circ.cpp b/src/GeomAPI/GeomAPI_Circ.cpp index 566824e06..facc1ec2a 100644 --- a/src/GeomAPI/GeomAPI_Circ.cpp +++ b/src/GeomAPI/GeomAPI_Circ.cpp @@ -1,8 +1,25 @@ -// File: GeomAPI_Circ2cpp -// Created: 24 Jun 2014 -// Author: Artem ZHIDKOV +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include + +#include #include #include @@ -13,24 +30,59 @@ #include #include +#include -#define MY_CIRC static_cast(myImpl) +#define MY_CIRC implPtr() static gp_Circ* newCirc(const gp_Pnt& theCenter, const gp_Dir& theDir, const double theRadius) { return new gp_Circ(gp_Ax2(theCenter, theDir), theRadius); } -GeomAPI_Circ::GeomAPI_Circ(const boost::shared_ptr& theCenter, - const boost::shared_ptr& theDir, double theRadius) +//================================================================================================= +GeomAPI_Circ::GeomAPI_Circ(const std::shared_ptr theAx2, + const double theRadius) +: GeomAPI_Interface(new gp_Circ(theAx2->impl(), theRadius)) +{ + +} + + +//================================================================================================= +GeomAPI_Circ::GeomAPI_Circ(const std::shared_ptr& theCenter, + const std::shared_ptr& theDir, double theRadius) : GeomAPI_Interface(newCirc(theCenter->impl(), theDir->impl(), theRadius)) { } -const boost::shared_ptr GeomAPI_Circ::project( - const boost::shared_ptr& thePoint) const +//================================================================================================= +GeomAPI_Circ::GeomAPI_Circ(const GeomCurvePtr& theCurve) { - boost::shared_ptr aResult; + Handle(Geom_Curve) aCurve = theCurve->impl(); + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(aCurve); + if (aCirc.IsNull()) + throw Standard_ConstructionError("GeomAPI_Circ: Curve is not a circle"); + setImpl(new gp_Circ(aCirc->Circ())); +} + +//================================================================================================= +const std::shared_ptr GeomAPI_Circ::center() const +{ + const gp_Pnt& aCenter = MY_CIRC->Location(); + return std::shared_ptr(new GeomAPI_Pnt(aCenter.X(), aCenter.Y(), aCenter.Z())); +} + +//================================================================================================= +double GeomAPI_Circ::radius() const +{ + return MY_CIRC->Radius(); +} + +//================================================================================================= +const std::shared_ptr GeomAPI_Circ::project( + const std::shared_ptr& thePoint) const +{ + std::shared_ptr aResult; if (!MY_CIRC) return aResult; @@ -41,13 +93,13 @@ const boost::shared_ptr GeomAPI_Circ::project( GeomAPI_ProjectPointOnCurve aProj(aPoint, aCircle); Standard_Integer aNbPoint = aProj.NbPoints(); if (aNbPoint > 0) { - double aMinDistance = 0, aDistance; + double aMinDistance = Precision::Infinite(), aDistance; for (Standard_Integer j = 1; j <= aNbPoint; j++) { gp_Pnt aNewPoint = aProj.Point(j); aDistance = aNewPoint.Distance(aPoint); - if (!aMinDistance || aDistance < aMinDistance) { + if (aDistance < aMinDistance) { aMinDistance = aDistance; - aResult = boost::shared_ptr( + aResult = std::shared_ptr( new GeomAPI_Pnt(aNewPoint.X(), aNewPoint.Y(), aNewPoint.Z())); } } @@ -55,13 +107,20 @@ const boost::shared_ptr GeomAPI_Circ::project( return aResult; } -const boost::shared_ptr GeomAPI_Circ::center() const +//================================================================================================= +const bool GeomAPI_Circ::parameter(const std::shared_ptr thePoint, + const double theTolerance, + double& theParameter) const { - const gp_Pnt& aCenter = MY_CIRC->Location(); - return boost::shared_ptr(new GeomAPI_Pnt(aCenter.X(), aCenter.Y(), aCenter.Z())); + Handle(Geom_Circle) aCurve = new Geom_Circle(*MY_CIRC); + return GeomLib_Tool::Parameter(aCurve, thePoint->impl(), + theTolerance, theParameter) == Standard_True; } -double GeomAPI_Circ::radius() const +//================================================================================================= +std::shared_ptr GeomAPI_Circ::normal() const { - return MY_CIRC->Radius(); + const gp_Ax1& anAxis = MY_CIRC->Axis(); + const gp_Dir& aDir = anAxis.Direction(); + return std::shared_ptr(new GeomAPI_Dir(aDir.X(), aDir.Y(), aDir.Z())); }