// Created: 1998-06-03 // // Copyright (c) 1999-2013 OPEN CASCADE SAS // // This file is part of commercial software by OPEN CASCADE SAS, // furnished in accordance with the terms and conditions of the contract // and with the inclusion of this copyright notice. // This file or any part thereof may not be provided or otherwise // made available to any third party. // // No ownership title to the software is transferred hereby. // // OPEN CASCADE SAS makes no representation or warranties with respect to the // performance of this software, and specifically disclaims any responsibility // for any damages, special or consequential, connected with its use. #ifndef _GeomConvert_SurfToAnaSurf_HeaderFile #define _GeomConvert_SurfToAnaSurf_HeaderFile #include "Standard.hxx" #include "Standard_DefineAlloc.hxx" #include "Standard_Handle.hxx" #include "Standard_Real.hxx" #include "Standard_Boolean.hxx" #include "GeomConvert_ConvType.hxx" #include "GeomAbs_SurfaceType.hxx" #include "gp_XYZ.hxx" #include "NCollection_Array1.hxx" #include "NCollection_HArray1.hxx" class Geom_Surface; class Geom_SurfaceOfRevolution; class Geom_Circle; //! Converts a surface to the analytical form with given //! precision. Conversion is done only the surface is bspline //! of bezier and this can be approximated by some analytical //! surface with that precision. class GeomConvert_SurfToAnaSurf { public: DEFINE_STANDARD_ALLOC Standard_EXPORT GeomConvert_SurfToAnaSurf(); Standard_EXPORT GeomConvert_SurfToAnaSurf(const occ::handle& S); Standard_EXPORT void Init(const occ::handle& S); void SetConvType(const GeomConvert_ConvType theConvType = GeomConvert_Simplest) { myConvType = theConvType; } void SetTarget(const GeomAbs_SurfaceType theSurfType = GeomAbs_Plane) { myTarget = theSurfType; } //! Returns maximal deviation of converted surface from the original //! one computed by last call to ConvertToAnalytical double Gap() const { return myGap; } //! Tries to convert the Surface to an Analytic form //! Returns the result //! In case of failure, returns a Null Handle //! Standard_EXPORT occ::handle ConvertToAnalytical(const double InitialToler); Standard_EXPORT occ::handle ConvertToAnalytical(const double InitialToler, const double Umin, const double Umax, const double Vmin, const double Vmax); //! Returns true if surfaces is same with the given tolerance Standard_EXPORT static bool IsSame(const occ::handle& S1, const occ::handle& S2, const double tol); //! Returns true, if surface is canonical Standard_EXPORT static bool IsCanonical(const occ::handle& S); private: //! static method for checking surface of revolution //! To avoid two-parts cone-like surface static void CheckVTrimForRevSurf(const occ::handle& aRevSurf, double& V1, double& V2); //! static method to try create cylindrical or conical surface static occ::handle TryCylinerCone(const occ::handle& theSurf, const bool theVCase, const occ::handle& theUmidiso, const occ::handle& theVmidiso, const double theU1, const double theU2, const double theV1, const double theV2, const double theToler); //! static method to try create cylinrical surface using least square method static bool GetCylByLS(const occ::handle>& thePoints, const double theTol, gp_Ax3& thePos, double& theR, double& theGap); //! static method to try create cylinrical surface based on its Gauss field static occ::handle TryCylinderByGaussField(const occ::handle& theSurf, const double theU1, const double theU2, const double theV1, const double theV2, const double theToler, const int theNbU = 20, const int theNbV = 20, const bool theLeastSquare = false); //! static method to try create toroidal surface. //! In case = true try to use V isoline radius as minor radaius. static occ::handle TryTorusSphere(const occ::handle& theSurf, const occ::handle& circle, const occ::handle& otherCircle, const double Param1, const double Param2, const double aParam1ToCrv, const double aParam2ToCrv, const double toler, const bool isTryUMajor); static double ComputeGap(const occ::handle& theSurf, const double theU1, const double theU2, const double theV1, const double theV2, const occ::handle& theNewSurf, const double theTol = RealLast()); private: occ::handle mySurf; double myGap; GeomConvert_ConvType myConvType; GeomAbs_SurfaceType myTarget; }; #endif // _GeomConvert_SurfToAnaSurf_HeaderFile