From fe9a0de8d0600d3a5c784acbc5e4b960bb62e76e Mon Sep 17 00:00:00 2001 From: Pasukhin Dmitry Date: Mon, 9 Mar 2026 23:29:52 +0000 Subject: [PATCH] Modeling Data - Modernize LProp .gxx templates into .pxx utilities (#1155) Replace legacy .gxx generic class templates (LProp_CLProps.gxx, LProp_SLProps.gxx) with modern C++ .pxx template utilities (LProp_CurveUtils.pxx, LProp_SurfaceUtils.pxx) using namespaced template functions and access policies. Remove obsolete CurveTool/SurfaceTool intermediary classes (GeomLProp_CurveTool, GeomLProp_SurfaceTool, LProp3d_CurveTool, LProp3d_SurfaceTool, BRepLProp_CurveTool) that are no longer needed with the new direct/tool access policy design. Replace per-instantiation _0.cxx files with standalone .cxx implementations that delegate to the shared .pxx utilities. Fix myCN field type from double to int in all CLProps headers to match SLProps convention and actual usage (values 0 or 4). Add default member initializers for uninitialized fields (myCurvature, mySignificantFirstDerivativeOrder, myMinCurv, myMaxCurv, myMeanCurv, myGausCurv) across all CLProps/SLProps classes. Fix theSigOrder pass-by-value bug in Tangent/Curvature wrappers. Fix typos: anUinfium/anVinfium -> anUinfimum/anVinfimum. --- .../TKHLR/HLRBRep/FILES.cmake | 4 +- .../TKHLR/HLRBRep/HLRBRep_CLProps.cxx | 173 ++++ .../TKHLR/HLRBRep/HLRBRep_CLProps.hxx | 6 +- .../TKHLR/HLRBRep/HLRBRep_CLProps_0.cxx | 40 - .../TKHLR/HLRBRep/HLRBRep_SLProps.cxx | 280 ++++++ .../TKHLR/HLRBRep/HLRBRep_SLProps.hxx | 12 +- .../TKHLR/HLRBRep/HLRBRep_SLProps_0.cxx | 34 - .../TKBRep/BRepLProp/BRepLProp_CLProps.cxx | 173 ++++ .../TKBRep/BRepLProp/BRepLProp_CLProps.hxx | 7 +- .../TKBRep/BRepLProp/BRepLProp_CLProps_0.cxx | 41 - .../TKBRep/BRepLProp/BRepLProp_CurveTool.cxx | 96 -- .../TKBRep/BRepLProp/BRepLProp_CurveTool.hxx | 72 -- .../TKBRep/BRepLProp/BRepLProp_SLProps.cxx | 281 ++++++ .../TKBRep/BRepLProp/BRepLProp_SLProps.hxx | 12 +- .../TKBRep/BRepLProp/BRepLProp_SLProps_0.cxx | 35 - src/ModelingData/TKBRep/BRepLProp/FILES.cmake | 6 +- .../TKG2d/Geom2dLProp/FILES.cmake | 2 +- .../Geom2dLProp/Geom2dLProp_CLProps2d.cxx | 173 ++++ .../Geom2dLProp/Geom2dLProp_CLProps2d.hxx | 6 +- .../Geom2dLProp/Geom2dLProp_CLProps2d_0.cxx | 41 - src/ModelingData/TKG2d/LProp/FILES.cmake | 5 +- .../TKG2d/LProp/LProp_CLProps.gxx | 285 ------ .../TKG2d/LProp/LProp_CurveUtils.pxx | 465 ++++++++++ .../TKG2d/LProp/LProp_SLProps.gxx | 542 ------------ .../TKG2d/LProp/LProp_SurfaceUtils.pxx | 823 ++++++++++++++++++ src/ModelingData/TKG3d/GeomLProp/FILES.cmake | 8 +- .../TKG3d/GeomLProp/GeomLProp_CLProps.cxx | 173 ++++ .../TKG3d/GeomLProp/GeomLProp_CLProps.hxx | 7 +- .../TKG3d/GeomLProp/GeomLProp_CLProps_0.cxx | 41 - .../TKG3d/GeomLProp/GeomLProp_CurveTool.cxx | 86 -- .../TKG3d/GeomLProp/GeomLProp_CurveTool.hxx | 76 -- .../TKG3d/GeomLProp/GeomLProp_SLProps.cxx | 281 ++++++ .../TKG3d/GeomLProp/GeomLProp_SLProps.hxx | 13 +- .../TKG3d/GeomLProp/GeomLProp_SLProps_0.cxx | 35 - .../TKG3d/GeomLProp/GeomLProp_SurfaceTool.cxx | 95 -- .../TKG3d/GeomLProp/GeomLProp_SurfaceTool.hxx | 81 -- src/ModelingData/TKG3d/LProp3d/FILES.cmake | 8 +- .../TKG3d/LProp3d/LProp3d_CLProps.cxx | 172 ++++ .../TKG3d/LProp3d/LProp3d_CLProps.hxx | 7 +- .../TKG3d/LProp3d/LProp3d_CLProps_0.cxx | 40 - .../TKG3d/LProp3d/LProp3d_CurveTool.cxx | 99 --- .../TKG3d/LProp3d/LProp3d_CurveTool.hxx | 78 -- .../TKG3d/LProp3d/LProp3d_SLProps.cxx | 280 ++++++ .../TKG3d/LProp3d/LProp3d_SLProps.hxx | 12 +- .../TKG3d/LProp3d/LProp3d_SLProps_0.cxx | 34 - .../TKG3d/LProp3d/LProp3d_SurfaceTool.cxx | 106 --- .../TKG3d/LProp3d/LProp3d_SurfaceTool.hxx | 73 -- 47 files changed, 3324 insertions(+), 2095 deletions(-) create mode 100644 src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.cxx delete mode 100644 src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps_0.cxx create mode 100644 src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.cxx delete mode 100644 src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps_0.cxx create mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.cxx delete mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps_0.cxx delete mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.cxx delete mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.hxx create mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.cxx delete mode 100644 src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps_0.cxx create mode 100644 src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.cxx delete mode 100644 src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d_0.cxx delete mode 100644 src/ModelingData/TKG2d/LProp/LProp_CLProps.gxx create mode 100644 src/ModelingData/TKG2d/LProp/LProp_CurveUtils.pxx delete mode 100644 src/ModelingData/TKG2d/LProp/LProp_SLProps.gxx create mode 100644 src/ModelingData/TKG2d/LProp/LProp_SurfaceUtils.pxx create mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps_0.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.hxx create mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps_0.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.cxx delete mode 100644 src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.hxx create mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps_0.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.hxx create mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps_0.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.cxx delete mode 100644 src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.hxx diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/FILES.cmake b/src/ModelingAlgorithms/TKHLR/HLRBRep/FILES.cmake index 284e692ae3..002829e444 100644 --- a/src/ModelingAlgorithms/TKHLR/HLRBRep/FILES.cmake +++ b/src/ModelingAlgorithms/TKHLR/HLRBRep/FILES.cmake @@ -20,7 +20,7 @@ set(OCCT_HLRBRep_FILES HLRBRep_CInter.hxx HLRBRep_CInter_0.cxx HLRBRep_CLProps.hxx - HLRBRep_CLProps_0.cxx + HLRBRep_CLProps.cxx HLRBRep_CLPropsATool.hxx HLRBRep_CLPropsATool.lxx HLRBRep_Curve.cxx @@ -83,7 +83,7 @@ set(OCCT_HLRBRep_FILES HLRBRep_ShapeToHLR.cxx HLRBRep_ShapeToHLR.hxx HLRBRep_SLProps.hxx - HLRBRep_SLProps_0.cxx + HLRBRep_SLProps.cxx HLRBRep_SLPropsATool.hxx HLRBRep_SLPropsATool.lxx HLRBRep_Surface.cxx diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.cxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.cxx new file mode 100644 index 0000000000..8818192ac5 --- /dev/null +++ b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.cxx @@ -0,0 +1,173 @@ +// Created on: 1992-10-14 +// Created by: Christophe MARION +// Copyright (c) 1992-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 + +using Access = LProp_CurveUtils::ToolAccess; + +//================================================================================================= + +HLRBRep_CLProps::HLRBRep_CLProps(const HLRBRep_Curve*& C, + const double U, + const int N, + const double Resolution) + : myCurve(C), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "HLRBRep_CLProps::HLRBRep_CLProps()"); + SetParameter(U); +} + +//================================================================================================= + +HLRBRep_CLProps::HLRBRep_CLProps(const HLRBRep_Curve*& C, const int N, const double Resolution) + : myCurve(C), + myU(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "HLRBRep_CLProps::HLRBRep_CLProps()"); +} + +//================================================================================================= + +HLRBRep_CLProps::HLRBRep_CLProps(const int N, const double Resolution) + : myCurve(nullptr), + myU(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "HLRBRep_CLProps() - invalid input"); +} + +//================================================================================================= + +void HLRBRep_CLProps::SetParameter(const double U) +{ + LProp_CurveUtils::SetParameter(myCurve, + U, + myU, + myDerOrder, + myPnt, + myDerivArr, + myTangentStatus); +} + +//================================================================================================= + +void HLRBRep_CLProps::SetCurve(const HLRBRep_Curve*& C) +{ + myCurve = C; + myCN = 4; +} + +//================================================================================================= + +const gp_Pnt2d& HLRBRep_CLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec2d& HLRBRep_CLProps::D1() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 1, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec2d& HLRBRep_CLProps::D2() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 2, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec2d& HLRBRep_CLProps::D3() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 3, myPnt, myDerivArr); +} + +//================================================================================================= + +bool HLRBRep_CLProps::IsTangentDefined() +{ + return LProp_CurveUtils::IsTangentDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrder, + myTangentStatus); +} + +//================================================================================================= + +void HLRBRep_CLProps::Tangent(gp_Dir2d& D) +{ + LProp_CurveUtils::Tangent(*this, + myCurve, + myU, + myDerivArr, + myPnt, + mySignificantFirstDerivativeOrder, + D); +} + +//================================================================================================= + +double HLRBRep_CLProps::Curvature() +{ + return LProp_CurveUtils::Curvature(*this, + myDerivArr[0], + myDerivArr[1], + myLinTol, + mySignificantFirstDerivativeOrder, + myCurvature); +} + +//================================================================================================= + +void HLRBRep_CLProps::Normal(gp_Dir2d& N) +{ + LProp_CurveUtils::Normal(*this, myDerivArr[0], myDerivArr[1], myLinTol, N); +} + +//================================================================================================= + +void HLRBRep_CLProps::CentreOfCurvature(gp_Pnt2d& P) +{ + LProp_CurveUtils::CentreOfCurvature(*this, + myPnt, + myDerivArr[0], + myDerivArr[1], + myLinTol, + myCurvature, + P); +} diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.hxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.hxx index fe8de602be..c5feda65f9 100644 --- a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.hxx +++ b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps.hxx @@ -111,14 +111,14 @@ private: const HLRBRep_Curve* myCurve; double myU; int myDerOrder; - double myCN; + int myCN; double myLinTol; gp_Pnt2d myPnt; gp_Vec2d myDerivArr[3]; gp_Dir2d myTangent; - double myCurvature; + double myCurvature = 0.0; LProp_Status myTangentStatus; - int mySignificantFirstDerivativeOrder; + int mySignificantFirstDerivativeOrder = 0; }; #endif // _HLRBRep_CLProps_HeaderFile diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps_0.cxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps_0.cxx deleted file mode 100644 index 692364e550..0000000000 --- a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_CLProps_0.cxx +++ /dev/null @@ -1,40 +0,0 @@ -// Created on: 1992-10-14 -// Created by: Christophe MARION -// Copyright (c) 1992-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 - -#define Curve HLRBRep_Curve* -#define Curve_hxx -#define Vec gp_Vec2d -#define Vec_hxx -#define Pnt gp_Pnt2d -#define Pnt_hxx -#define Dir gp_Dir2d -#define Dir_hxx -#define Tool HLRBRep_CLPropsATool -#define Tool_hxx -#define LProp_CLProps HLRBRep_CLProps -#define LProp_CLProps_hxx -#include diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.cxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.cxx new file mode 100644 index 0000000000..24cc478216 --- /dev/null +++ b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.cxx @@ -0,0 +1,280 @@ +// Created on: 1992-10-14 +// Created by: Christophe MARION +// Copyright (c) 1992-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 + +using Access = LProp_SurfaceUtils::ToolAccess; + +//================================================================================================= + +HLRBRep_SLProps::HLRBRep_SLProps(const HLRBRep_SurfacePtr& S, + const double U, + const double V, + const int N, + const double Resolution) + : mySurf(S), + myDerOrder(N), + myCN(4), + myLinTol(Resolution) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "HLRBRep_SLProps::HLRBRep_SLProps()"); + SetParameters(U, V); +} + +//================================================================================================= + +HLRBRep_SLProps::HLRBRep_SLProps(const HLRBRep_SurfacePtr& S, const int N, const double Resolution) + : mySurf(S), + myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "HLRBRep_SLProps::HLRBRep_SLProps()"); +} + +//================================================================================================= + +HLRBRep_SLProps::HLRBRep_SLProps(const int N, const double Resolution) + : mySurf(nullptr), + myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "HLRBRep_SLProps::HLRBRep_SLProps() bad level"); +} + +//================================================================================================= + +void HLRBRep_SLProps::SetSurface(const HLRBRep_SurfacePtr& S) +{ + mySurf = S; + myCN = 4; +} + +//================================================================================================= + +void HLRBRep_SLProps::SetParameters(const double U, const double V) +{ + LProp_SurfaceUtils::SetParameters(mySurf, + U, + V, + myU, + myV, + myDerOrder, + myPnt, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myUTangentStatus, + myVTangentStatus, + myNormalStatus, + myCurvatureStatus); +} + +//================================================================================================= + +const gp_Pnt& HLRBRep_SLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& HLRBRep_SLProps::D1U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1u); +} + +//================================================================================================= + +const gp_Vec& HLRBRep_SLProps::D1V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1v); +} + +//================================================================================================= + +const gp_Vec& HLRBRep_SLProps::D2U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2u); +} + +//================================================================================================= + +const gp_Vec& HLRBRep_SLProps::D2V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2v); +} + +//================================================================================================= + +const gp_Vec& HLRBRep_SLProps::DUV() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myDuv); +} + +//================================================================================================= + +bool HLRBRep_SLProps::IsTangentUDefined() +{ + return LProp_SurfaceUtils::IsTangentUDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderU, + myUTangentStatus); +} + +//================================================================================================= + +void HLRBRep_SLProps::TangentU(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentU(*this, + mySurf, + myU, + myV, + myD1u, + myD2u, + mySignificantFirstDerivativeOrderU, + D); +} + +//================================================================================================= + +bool HLRBRep_SLProps::IsTangentVDefined() +{ + return LProp_SurfaceUtils::IsTangentVDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderV, + myVTangentStatus); +} + +//================================================================================================= + +void HLRBRep_SLProps::TangentV(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentV(*this, + mySurf, + myU, + myV, + myD1v, + myD2v, + mySignificantFirstDerivativeOrderV, + D); +} + +//================================================================================================= + +bool HLRBRep_SLProps::IsNormalDefined() +{ + return LProp_SurfaceUtils::IsNormalDefined(myD1u, myD1v, myLinTol, myNormal, myNormalStatus); +} + +//================================================================================================= + +const gp_Dir& HLRBRep_SLProps::Normal() +{ + return LProp_SurfaceUtils::Normal(*this, myNormal); +} + +//================================================================================================= + +bool HLRBRep_SLProps::IsCurvatureDefined() +{ + return LProp_SurfaceUtils::IsCurvatureDefined(*this, + myCN, + myDerOrder, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myNormal, + myMinCurv, + myMaxCurv, + myDirMinCurv, + myDirMaxCurv, + myMeanCurv, + myGausCurv, + myCurvatureStatus); +} + +//================================================================================================= + +bool HLRBRep_SLProps::IsUmbilic() +{ + return LProp_SurfaceUtils::IsUmbilic(*this, myMaxCurv, myMinCurv); +} + +//================================================================================================= + +double HLRBRep_SLProps::MaxCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMaxCurv); +} + +//================================================================================================= + +double HLRBRep_SLProps::MinCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMinCurv); +} + +//================================================================================================= + +void HLRBRep_SLProps::CurvatureDirections(gp_Dir& Max, gp_Dir& Min) +{ + LProp_SurfaceUtils::CurvatureDirections(*this, myDirMaxCurv, myDirMinCurv, Max, Min); +} + +//================================================================================================= + +double HLRBRep_SLProps::MeanCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMeanCurv); +} + +//================================================================================================= + +double HLRBRep_SLProps::GaussianCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myGausCurv); +} diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.hxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.hxx index d0f1bd4f69..3c6999493a 100644 --- a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.hxx +++ b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps.hxx @@ -157,14 +157,14 @@ private: gp_Vec myD2v; gp_Vec myDuv; gp_Dir myNormal; - double myMinCurv; - double myMaxCurv; + double myMinCurv = 0.0; + double myMaxCurv = 0.0; gp_Dir myDirMinCurv; gp_Dir myDirMaxCurv; - double myMeanCurv; - double myGausCurv; - int mySignificantFirstDerivativeOrderU; - int mySignificantFirstDerivativeOrderV; + double myMeanCurv = 0.0; + double myGausCurv = 0.0; + int mySignificantFirstDerivativeOrderU = 0; + int mySignificantFirstDerivativeOrderV = 0; LProp_Status myUTangentStatus; LProp_Status myVTangentStatus; LProp_Status myNormalStatus; diff --git a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps_0.cxx b/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps_0.cxx deleted file mode 100644 index 58ec75f9cb..0000000000 --- a/src/ModelingAlgorithms/TKHLR/HLRBRep/HLRBRep_SLProps_0.cxx +++ /dev/null @@ -1,34 +0,0 @@ -// Created on: 1992-10-14 -// Created by: Christophe MARION -// Copyright (c) 1992-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 - -#define Surface HLRBRep_SurfacePtr -#define Surface_hxx -#define Tool HLRBRep_SLPropsATool -#define Tool_hxx -#define LProp_SLProps HLRBRep_SLProps -#define LProp_SLProps_hxx -#include diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.cxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.cxx new file mode 100644 index 0000000000..717a4fcd60 --- /dev/null +++ b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.cxx @@ -0,0 +1,173 @@ +// Created on: 1994-02-24 +// Created by: Laurent BOURESCHE +// Copyright (c) 1994-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 + +using Access = LProp_CurveUtils::DirectAccess; + +//================================================================================================= + +BRepLProp_CLProps::BRepLProp_CLProps(const BRepAdaptor_Curve& C, + const double U, + const int N, + const double Resolution) + : myCurve(C), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "BRepLProp_CLProps::BRepLProp_CLProps()"); + SetParameter(U); +} + +//================================================================================================= + +BRepLProp_CLProps::BRepLProp_CLProps(const BRepAdaptor_Curve& C, + const int N, + const double Resolution) + : myCurve(C), + myU(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "BRepLProp_CLProps::BRepLProp_CLProps()"); +} + +//================================================================================================= + +BRepLProp_CLProps::BRepLProp_CLProps(const int N, const double Resolution) + : myU(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "BRepLProp_CLProps() - invalid input"); +} + +//================================================================================================= + +void BRepLProp_CLProps::SetParameter(const double U) +{ + LProp_CurveUtils::SetParameter(myCurve, + U, + myU, + myDerOrder, + myPnt, + myDerivArr, + myTangentStatus); +} + +//================================================================================================= + +void BRepLProp_CLProps::SetCurve(const BRepAdaptor_Curve& C) +{ + myCurve = C; + myCN = 4; +} + +//================================================================================================= + +const gp_Pnt& BRepLProp_CLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& BRepLProp_CLProps::D1() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 1, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_CLProps::D2() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 2, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_CLProps::D3() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 3, myPnt, myDerivArr); +} + +//================================================================================================= + +bool BRepLProp_CLProps::IsTangentDefined() +{ + return LProp_CurveUtils::IsTangentDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrder, + myTangentStatus); +} + +//================================================================================================= + +void BRepLProp_CLProps::Tangent(gp_Dir& D) +{ + LProp_CurveUtils::Tangent(*this, + myCurve, + myU, + myDerivArr, + myPnt, + mySignificantFirstDerivativeOrder, + D); +} + +//================================================================================================= + +double BRepLProp_CLProps::Curvature() +{ + return LProp_CurveUtils::Curvature(*this, + myDerivArr[0], + myDerivArr[1], + myLinTol, + mySignificantFirstDerivativeOrder, + myCurvature); +} + +//================================================================================================= + +void BRepLProp_CLProps::Normal(gp_Dir& N) +{ + LProp_CurveUtils::Normal(*this, myDerivArr[0], myDerivArr[1], myLinTol, N); +} + +//================================================================================================= + +void BRepLProp_CLProps::CentreOfCurvature(gp_Pnt& P) +{ + LProp_CurveUtils::CentreOfCurvature(*this, + myPnt, + myDerivArr[0], + myDerivArr[1], + myLinTol, + myCurvature, + P); +} diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.hxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.hxx index 5aec8db175..ffd4ed9dce 100644 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.hxx +++ b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps.hxx @@ -33,7 +33,6 @@ class BRepAdaptor_Curve; class gp_Vec; class gp_Pnt; class gp_Dir; -class BRepLProp_CurveTool; class BRepLProp_CLProps { @@ -113,14 +112,14 @@ private: BRepAdaptor_Curve myCurve; double myU; int myDerOrder; - double myCN; + int myCN; double myLinTol; gp_Pnt myPnt; gp_Vec myDerivArr[3]; gp_Dir myTangent; - double myCurvature; + double myCurvature = 0.0; LProp_Status myTangentStatus; - int mySignificantFirstDerivativeOrder; + int mySignificantFirstDerivativeOrder = 0; }; #endif // _BRepLProp_CLProps_HeaderFile diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps_0.cxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps_0.cxx deleted file mode 100644 index a03d03e2fc..0000000000 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CLProps_0.cxx +++ /dev/null @@ -1,41 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 - -#define Curve BRepAdaptor_Curve -#define Curve_hxx -#define Vec gp_Vec -#define Vec_hxx -#define Pnt gp_Pnt -#define Pnt_hxx -#define Dir gp_Dir -#define Dir_hxx -#define Tool BRepLProp_CurveTool -#define Tool_hxx -#define LProp_CLProps BRepLProp_CLProps -#define LProp_CLProps_hxx -#include diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.cxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.cxx deleted file mode 100644 index 6cc8641981..0000000000 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.cxx +++ /dev/null @@ -1,96 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 - -//================================================================================================= - -void BRepLProp_CurveTool::Value(const BRepAdaptor_Curve& C, const double U, gp_Pnt& P) -{ - P = C.Value(U); -} - -//================================================================================================= - -void BRepLProp_CurveTool::D1(const BRepAdaptor_Curve& C, const double U, gp_Pnt& P, gp_Vec& V1) -{ - C.D1(U, P, V1); -} - -//================================================================================================= - -void BRepLProp_CurveTool::D2(const BRepAdaptor_Curve& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2) -{ - C.D2(U, P, V1, V2); -} - -//================================================================================================= - -void BRepLProp_CurveTool::D3(const BRepAdaptor_Curve& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3) -{ - C.D3(U, P, V1, V2, V3); -} - -//================================================================================================= - -int BRepLProp_CurveTool::Continuity(const BRepAdaptor_Curve& C) -{ - GeomAbs_Shape s = C.Continuity(); - switch (s) - { - case GeomAbs_C0: - return 0; - case GeomAbs_C1: - return 1; - case GeomAbs_C2: - return 2; - case GeomAbs_C3: - return 3; - case GeomAbs_G1: - return 0; - case GeomAbs_G2: - return 0; - case GeomAbs_CN: - return 3; - }; - return 0; -} - -//================================================================================================= - -double BRepLProp_CurveTool::FirstParameter(const BRepAdaptor_Curve& C) -{ - return C.FirstParameter(); -} - -//================================================================================================= - -double BRepLProp_CurveTool::LastParameter(const BRepAdaptor_Curve& C) -{ - return C.LastParameter(); -} diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.hxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.hxx deleted file mode 100644 index 53129fa24a..0000000000 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_CurveTool.hxx +++ /dev/null @@ -1,72 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 _BRepLProp_CurveTool_HeaderFile -#define _BRepLProp_CurveTool_HeaderFile - -#include -#include - -#include -class BRepAdaptor_Curve; -class gp_Pnt; -class gp_Vec; - -class BRepLProp_CurveTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Computes the point

of parameter on the curve . - Standard_EXPORT static void Value(const BRepAdaptor_Curve& C, const double U, gp_Pnt& P); - - //! Computes the point

and first derivative of - //! parameter on the curve . - Standard_EXPORT static void D1(const BRepAdaptor_Curve& C, const double U, gp_Pnt& P, gp_Vec& V1); - - //! Computes the point

, the first derivative and second - //! derivative of parameter on the curve . - Standard_EXPORT static void D2(const BRepAdaptor_Curve& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2); - - //! Computes the point

, the first derivative , the - //! second derivative and third derivative of - //! parameter on the curve . - Standard_EXPORT static void D3(const BRepAdaptor_Curve& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3); - - //! returns the order of continuity of the curve . - //! returns 1 : first derivative only is computable - //! returns 2 : first and second derivative only are computable. - //! returns 3 : first, second and third are computable. - Standard_EXPORT static int Continuity(const BRepAdaptor_Curve& C); - - //! returns the first parameter bound of the curve. - Standard_EXPORT static double FirstParameter(const BRepAdaptor_Curve& C); - - //! returns the last parameter bound of the curve. - //! FirstParameter must be less than LastParamenter. - Standard_EXPORT static double LastParameter(const BRepAdaptor_Curve& C); -}; - -#endif // _BRepLProp_CurveTool_HeaderFile diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.cxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.cxx new file mode 100644 index 0000000000..46761564e0 --- /dev/null +++ b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.cxx @@ -0,0 +1,281 @@ +// Created on: 1994-02-24 +// Created by: Laurent BOURESCHE +// Copyright (c) 1994-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 + +using Access = LProp_SurfaceUtils::DirectAccess; + +//================================================================================================= + +BRepLProp_SLProps::BRepLProp_SLProps(const BRepAdaptor_Surface& S, + const double U, + const double V, + const int N, + const double Resolution) + : mySurf(S), + myDerOrder(N), + myCN(4), + myLinTol(Resolution) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "BRepLProp_SLProps::BRepLProp_SLProps()"); + SetParameters(U, V); +} + +//================================================================================================= + +BRepLProp_SLProps::BRepLProp_SLProps(const BRepAdaptor_Surface& S, + const int N, + const double Resolution) + : mySurf(S), + myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "BRepLProp_SLProps::BRepLProp_SLProps()"); +} + +//================================================================================================= + +BRepLProp_SLProps::BRepLProp_SLProps(const int N, const double Resolution) + : myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "BRepLProp_SLProps::BRepLProp_SLProps() bad level"); +} + +//================================================================================================= + +void BRepLProp_SLProps::SetSurface(const BRepAdaptor_Surface& S) +{ + mySurf = S; + myCN = 4; +} + +//================================================================================================= + +void BRepLProp_SLProps::SetParameters(const double U, const double V) +{ + LProp_SurfaceUtils::SetParameters(mySurf, + U, + V, + myU, + myV, + myDerOrder, + myPnt, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myUTangentStatus, + myVTangentStatus, + myNormalStatus, + myCurvatureStatus); +} + +//================================================================================================= + +const gp_Pnt& BRepLProp_SLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& BRepLProp_SLProps::D1U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1u); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_SLProps::D1V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1v); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_SLProps::D2U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2u); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_SLProps::D2V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2v); +} + +//================================================================================================= + +const gp_Vec& BRepLProp_SLProps::DUV() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myDuv); +} + +//================================================================================================= + +bool BRepLProp_SLProps::IsTangentUDefined() +{ + return LProp_SurfaceUtils::IsTangentUDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderU, + myUTangentStatus); +} + +//================================================================================================= + +void BRepLProp_SLProps::TangentU(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentU(*this, + mySurf, + myU, + myV, + myD1u, + myD2u, + mySignificantFirstDerivativeOrderU, + D); +} + +//================================================================================================= + +bool BRepLProp_SLProps::IsTangentVDefined() +{ + return LProp_SurfaceUtils::IsTangentVDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderV, + myVTangentStatus); +} + +//================================================================================================= + +void BRepLProp_SLProps::TangentV(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentV(*this, + mySurf, + myU, + myV, + myD1v, + myD2v, + mySignificantFirstDerivativeOrderV, + D); +} + +//================================================================================================= + +bool BRepLProp_SLProps::IsNormalDefined() +{ + return LProp_SurfaceUtils::IsNormalDefined(myD1u, myD1v, myLinTol, myNormal, myNormalStatus); +} + +//================================================================================================= + +const gp_Dir& BRepLProp_SLProps::Normal() +{ + return LProp_SurfaceUtils::Normal(*this, myNormal); +} + +//================================================================================================= + +bool BRepLProp_SLProps::IsCurvatureDefined() +{ + return LProp_SurfaceUtils::IsCurvatureDefined(*this, + myCN, + myDerOrder, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myNormal, + myMinCurv, + myMaxCurv, + myDirMinCurv, + myDirMaxCurv, + myMeanCurv, + myGausCurv, + myCurvatureStatus); +} + +//================================================================================================= + +bool BRepLProp_SLProps::IsUmbilic() +{ + return LProp_SurfaceUtils::IsUmbilic(*this, myMaxCurv, myMinCurv); +} + +//================================================================================================= + +double BRepLProp_SLProps::MaxCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMaxCurv); +} + +//================================================================================================= + +double BRepLProp_SLProps::MinCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMinCurv); +} + +//================================================================================================= + +void BRepLProp_SLProps::CurvatureDirections(gp_Dir& Max, gp_Dir& Min) +{ + LProp_SurfaceUtils::CurvatureDirections(*this, myDirMaxCurv, myDirMinCurv, Max, Min); +} + +//================================================================================================= + +double BRepLProp_SLProps::MeanCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMeanCurv); +} + +//================================================================================================= + +double BRepLProp_SLProps::GaussianCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myGausCurv); +} diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.hxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.hxx index b6726694f9..28b12c6cce 100644 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.hxx +++ b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps.hxx @@ -158,14 +158,14 @@ private: gp_Vec myD2v; gp_Vec myDuv; gp_Dir myNormal; - double myMinCurv; - double myMaxCurv; + double myMinCurv = 0.0; + double myMaxCurv = 0.0; gp_Dir myDirMinCurv; gp_Dir myDirMaxCurv; - double myMeanCurv; - double myGausCurv; - int mySignificantFirstDerivativeOrderU; - int mySignificantFirstDerivativeOrderV; + double myMeanCurv = 0.0; + double myGausCurv = 0.0; + int mySignificantFirstDerivativeOrderU = 0; + int mySignificantFirstDerivativeOrderV = 0; LProp_Status myUTangentStatus; LProp_Status myVTangentStatus; LProp_Status myNormalStatus; diff --git a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps_0.cxx b/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps_0.cxx deleted file mode 100644 index d01d3762a7..0000000000 --- a/src/ModelingData/TKBRep/BRepLProp/BRepLProp_SLProps_0.cxx +++ /dev/null @@ -1,35 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 - -#define Surface BRepAdaptor_Surface -#define Surface_hxx -#define Tool BRepLProp_SurfaceTool -#define Tool_hxx -#define LProp_SLProps BRepLProp_SLProps -#define LProp_SLProps_hxx -#include diff --git a/src/ModelingData/TKBRep/BRepLProp/FILES.cmake b/src/ModelingData/TKBRep/BRepLProp/FILES.cmake index 5c812cf534..d5b4fbdc21 100644 --- a/src/ModelingData/TKBRep/BRepLProp/FILES.cmake +++ b/src/ModelingData/TKBRep/BRepLProp/FILES.cmake @@ -5,11 +5,9 @@ set(OCCT_BRepLProp_FILES BRepLProp.cxx BRepLProp.hxx BRepLProp_CLProps.hxx - BRepLProp_CLProps_0.cxx - BRepLProp_CurveTool.cxx - BRepLProp_CurveTool.hxx + BRepLProp_CLProps.cxx BRepLProp_SLProps.hxx - BRepLProp_SLProps_0.cxx + BRepLProp_SLProps.cxx BRepLProp_SurfaceTool.cxx BRepLProp_SurfaceTool.hxx ) diff --git a/src/ModelingData/TKG2d/Geom2dLProp/FILES.cmake b/src/ModelingData/TKG2d/Geom2dLProp/FILES.cmake index 46f3c64e61..3358016c5a 100644 --- a/src/ModelingData/TKG2d/Geom2dLProp/FILES.cmake +++ b/src/ModelingData/TKG2d/Geom2dLProp/FILES.cmake @@ -3,7 +3,7 @@ set(OCCT_Geom2dLProp_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") set(OCCT_Geom2dLProp_FILES Geom2dLProp_CLProps2d.hxx - Geom2dLProp_CLProps2d_0.cxx + Geom2dLProp_CLProps2d.cxx Geom2dLProp_CurAndInf2d.cxx Geom2dLProp_CurAndInf2d.hxx Geom2dLProp_Curve2dTool.cxx diff --git a/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.cxx b/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.cxx new file mode 100644 index 0000000000..ea5d7298f6 --- /dev/null +++ b/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.cxx @@ -0,0 +1,173 @@ +// Created on: 1992-03-26 +// Created by: Herve LEGRAND +// Copyright (c) 1992-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 + +using Access = LProp_CurveUtils::DirectAccess; + +//================================================================================================= + +Geom2dLProp_CLProps2d::Geom2dLProp_CLProps2d(const occ::handle& C, + const double U, + const int N, + const double Resolution) + : myCurve(C), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "Geom2dLProp_CLProps2d::Geom2dLProp_CLProps2d()"); + SetParameter(U); +} + +//================================================================================================= + +Geom2dLProp_CLProps2d::Geom2dLProp_CLProps2d(const occ::handle& C, + const int N, + const double Resolution) + : myCurve(C), + myU(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "Geom2dLProp_CLProps2d::Geom2dLProp_CLProps2d()"); +} + +//================================================================================================= + +Geom2dLProp_CLProps2d::Geom2dLProp_CLProps2d(const int N, const double Resolution) + : myU(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "Geom2dLProp_CLProps2d() - invalid input"); +} + +//================================================================================================= + +void Geom2dLProp_CLProps2d::SetParameter(const double U) +{ + LProp_CurveUtils::SetParameter(myCurve, + U, + myU, + myDerOrder, + myPnt, + myDerivArr, + myTangentStatus); +} + +//================================================================================================= + +void Geom2dLProp_CLProps2d::SetCurve(const occ::handle& C) +{ + myCurve = C; + myCN = 4; +} + +//================================================================================================= + +const gp_Pnt2d& Geom2dLProp_CLProps2d::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec2d& Geom2dLProp_CLProps2d::D1() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 1, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec2d& Geom2dLProp_CLProps2d::D2() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 2, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec2d& Geom2dLProp_CLProps2d::D3() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 3, myPnt, myDerivArr); +} + +//================================================================================================= + +bool Geom2dLProp_CLProps2d::IsTangentDefined() +{ + return LProp_CurveUtils::IsTangentDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrder, + myTangentStatus); +} + +//================================================================================================= + +void Geom2dLProp_CLProps2d::Tangent(gp_Dir2d& D) +{ + LProp_CurveUtils::Tangent(*this, + myCurve, + myU, + myDerivArr, + myPnt, + mySignificantFirstDerivativeOrder, + D); +} + +//================================================================================================= + +double Geom2dLProp_CLProps2d::Curvature() +{ + return LProp_CurveUtils::Curvature(*this, + myDerivArr[0], + myDerivArr[1], + myLinTol, + mySignificantFirstDerivativeOrder, + myCurvature); +} + +//================================================================================================= + +void Geom2dLProp_CLProps2d::Normal(gp_Dir2d& N) +{ + LProp_CurveUtils::Normal(*this, myDerivArr[0], myDerivArr[1], myLinTol, N); +} + +//================================================================================================= + +void Geom2dLProp_CLProps2d::CentreOfCurvature(gp_Pnt2d& P) +{ + LProp_CurveUtils::CentreOfCurvature(*this, + myPnt, + myDerivArr[0], + myDerivArr[1], + myLinTol, + myCurvature, + P); +} diff --git a/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.hxx b/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.hxx index 39edb49bdc..02e51f8d0d 100644 --- a/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.hxx +++ b/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d.hxx @@ -116,14 +116,14 @@ private: occ::handle myCurve; double myU; int myDerOrder; - double myCN; + int myCN; double myLinTol; gp_Pnt2d myPnt; gp_Vec2d myDerivArr[3]; gp_Dir2d myTangent; - double myCurvature; + double myCurvature = 0.0; LProp_Status myTangentStatus; - int mySignificantFirstDerivativeOrder; + int mySignificantFirstDerivativeOrder = 0; }; #endif // _Geom2dLProp_CLProps2d_HeaderFile diff --git a/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d_0.cxx b/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d_0.cxx deleted file mode 100644 index efd9b99a09..0000000000 --- a/src/ModelingData/TKG2d/Geom2dLProp/Geom2dLProp_CLProps2d_0.cxx +++ /dev/null @@ -1,41 +0,0 @@ -// Created on: 1992-03-26 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 - -#define Curve occ::handle -#define Curve_hxx -#define Vec gp_Vec2d -#define Vec_hxx -#define Pnt gp_Pnt2d -#define Pnt_hxx -#define Dir gp_Dir2d -#define Dir_hxx -#define Tool Geom2dLProp_Curve2dTool -#define Tool_hxx -#define LProp_CLProps Geom2dLProp_CLProps2d -#define LProp_CLProps_hxx -#include diff --git a/src/ModelingData/TKG2d/LProp/FILES.cmake b/src/ModelingData/TKG2d/LProp/FILES.cmake index 7ad82ebada..df446d75a0 100644 --- a/src/ModelingData/TKG2d/LProp/FILES.cmake +++ b/src/ModelingData/TKG2d/LProp/FILES.cmake @@ -6,11 +6,10 @@ set(OCCT_LProp_FILES LProp_AnalyticCurInf.hxx LProp_BadContinuity.hxx LProp_CIType.hxx - LProp_CLProps.gxx LProp_CurAndInf.cxx LProp_CurAndInf.hxx + LProp_CurveUtils.pxx LProp_NotDefined.hxx - - LProp_SLProps.gxx + LProp_SurfaceUtils.pxx LProp_Status.hxx ) diff --git a/src/ModelingData/TKG2d/LProp/LProp_CLProps.gxx b/src/ModelingData/TKG2d/LProp/LProp_CLProps.gxx deleted file mode 100644 index 833510d8be..0000000000 --- a/src/ModelingData/TKG2d/LProp/LProp_CLProps.gxx +++ /dev/null @@ -1,285 +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. - -#include -#include -#include - -static const double MinStep = 1.0e-7; - -LProp_CLProps::LProp_CLProps(const Curve& C, const double U, const int N, const double Resolution) - : myCurve(C), - myDerOrder(N), - myCN(4), - myLinTol(Resolution), - myTangentStatus(LProp_Undecided) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp_CLProps::LProp_CLProps()"); - - SetParameter(U); -} - -LProp_CLProps::LProp_CLProps(const Curve& C, const int N, const double Resolution) - : myCurve(C), - myU(RealLast()), - myDerOrder(N), - myCN(4), - myLinTol(Resolution), - myTangentStatus(LProp_Undecided) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp_CLProps::LProp_CLProps()"); -} - -LProp_CLProps::LProp_CLProps(const int N, const double Resolution) - : myU(RealLast()), - myDerOrder(N), - myCN(0), - myLinTol(Resolution), - myTangentStatus(LProp_Undecided) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp_CLProps() - invalid input"); -} - -void LProp_CLProps::SetParameter(const double U) -{ - myU = U; - switch (myDerOrder) - { - case 0: - Tool::Value(myCurve, myU, myPnt); - break; - case 1: - Tool::D1(myCurve, myU, myPnt, myDerivArr[0]); - break; - case 2: - Tool::D2(myCurve, myU, myPnt, myDerivArr[0], myDerivArr[1]); - break; - case 3: - Tool::D3(myCurve, myU, myPnt, myDerivArr[0], myDerivArr[1], myDerivArr[2]); - break; - } - - myTangentStatus = LProp_Undecided; -} - -void LProp_CLProps::SetCurve(const Curve& C) -{ - myCurve = C; - myCN = 4; // Tool::Continuity(C); RLE -} - -const Pnt& LProp_CLProps::Value() const -{ - return myPnt; -} - -const Vec& LProp_CLProps::D1() -{ - if (myDerOrder < 1) - { - myDerOrder = 1; - Tool::D1(myCurve, myU, myPnt, myDerivArr[0]); - } - - return myDerivArr[0]; -} - -const Vec& LProp_CLProps::D2() -{ - if (myDerOrder < 2) - { - myDerOrder = 2; - Tool::D2(myCurve, myU, myPnt, myDerivArr[0], myDerivArr[1]); - } - - return myDerivArr[1]; -} - -const Vec& LProp_CLProps::D3() -{ - if (myDerOrder < 3) - { - myDerOrder = 3; - Tool::D3(myCurve, myU, myPnt, myDerivArr[0], myDerivArr[1], myDerivArr[2]); - } - - return myDerivArr[2]; -} - -bool LProp_CLProps::IsTangentDefined() -{ - if (myTangentStatus == LProp_Undefined) - return false; - else if (myTangentStatus >= LProp_Defined) - return true; - - // tangentStatus == Lprop_Undecided - // we have to calculate the first non null derivative - const double Tol = myLinTol * myLinTol; - - Vec V; - - int Order = 0; - while (Order++ < 4) - { - if (myCN >= Order) - { - switch (Order) - { - case 1: - V = D1(); - break; - case 2: - V = D2(); - break; - case 3: - V = D3(); - break; - } // switch(Order) - - if (V.SquareMagnitude() > Tol) - { - mySignificantFirstDerivativeOrder = Order; - myTangentStatus = LProp_Defined; - return true; - } // if(V.SquareMagnitude() > Tol) - } // if(cn >= Order) - else - { - myTangentStatus = LProp_Undefined; - return false; - } // else of "if(cn >= Order)" condition - } // while (Order < 4) - - return false; -} - -void LProp_CLProps::Tangent(Dir& D) -{ - if (!IsTangentDefined()) - throw LProp_NotDefined(); - - if (mySignificantFirstDerivativeOrder == 1) - D = Dir(myDerivArr[0]); - else if (mySignificantFirstDerivativeOrder > 1) - { - const double DivisionFactor = 1.e-3; - const double anUsupremum = Tool::LastParameter(myCurve), - anUinfium = Tool::FirstParameter(myCurve); - - double du; - if ((anUsupremum >= RealLast()) || (anUinfium <= RealFirst())) - du = 0.0; - else - du = anUsupremum - anUinfium; - - const double aDelta = std::max(du * DivisionFactor, MinStep); - - Vec V = myDerivArr[mySignificantFirstDerivativeOrder - 1]; - - double u; - - if (myU - anUinfium < aDelta) - u = myU + aDelta; - else - u = myU - aDelta; - - Pnt P1, P2; - Tool::Value(myCurve, std::min(myU, u), P1); - Tool::Value(myCurve, std::max(myU, u), P2); - - Vec V1(P1, P2); - double aDirFactor = V.Dot(V1); - - if (aDirFactor < 0.0) - V = -V; - - D = Dir(V); - } // else if (mySignificantFirstDerivativeOrder > 1) -} - -double LProp_CLProps::Curvature() -{ - bool isDefined = IsTangentDefined(); - (void)isDefined; // trick to avoid compiler warning on variable unised in Release mode; note that - // IsTangentDefined() must be called always - LProp_NotDefined_Raise_if(!isDefined, "LProp_CLProps::CurvatureNotDefined()"); - - // if the first derivative is null the curvature is infinite. - if (mySignificantFirstDerivativeOrder > 1) - return RealLast(); - - double Tol = myLinTol * myLinTol; - double DD1 = myDerivArr[0].SquareMagnitude(); - double DD2 = myDerivArr[1].SquareMagnitude(); - - // if the second derivative is null the curvature is null. - if (DD2 <= Tol) - { - myCurvature = 0.0; - } - else - { - double N = myDerivArr[0].CrossSquareMagnitude(myDerivArr[1]); - // if d[0] and d[1] are colinear the curvature is null. - // double t = N/(DD1*DD2); - double t = N / DD1 / DD2; - if (t <= Tol) - { - myCurvature = 0.0; - } - else - { - myCurvature = sqrt(N) / DD1 / sqrt(DD1); - } - } - - return myCurvature; -} - -void LProp_CLProps::Normal(Dir& D) -{ - double c = Curvature(); - if (c == RealLast() || std::abs(c) <= myLinTol) - { - throw LProp_NotDefined("LProp_CLProps::Normal(...):" - "Curvature is null or infinity"); - } - - // we used here the following vector relation - // a ^ (b ^ c) = b(ac) - c(ab) - // Norm = d[0] ^ (d[1] ^ d[0]) - - Vec Norm = myDerivArr[1] * (myDerivArr[0] * myDerivArr[0]) - - myDerivArr[0] * (myDerivArr[0] * myDerivArr[1]); - D = Dir(Norm); -} - -void LProp_CLProps::CentreOfCurvature(Pnt& P) -{ - if (std::abs(Curvature()) <= myLinTol) - { - throw LProp_NotDefined(); - } - - // we used here the following vector relation - // a ^ (b ^ c) = b(ac) - c(ab) - // Norm = d[0] ^ (d[1] ^ d[0]) - - Vec Norm = myDerivArr[1] * (myDerivArr[0] * myDerivArr[0]) - - myDerivArr[0] * (myDerivArr[0] * myDerivArr[1]); - Norm.Normalize(); - Norm.Divide(myCurvature); - P = myPnt.Translated(Norm); -} diff --git a/src/ModelingData/TKG2d/LProp/LProp_CurveUtils.pxx b/src/ModelingData/TKG2d/LProp/LProp_CurveUtils.pxx new file mode 100644 index 0000000000..06e9729014 --- /dev/null +++ b/src/ModelingData/TKG2d/LProp/LProp_CurveUtils.pxx @@ -0,0 +1,465 @@ +// Copyright (c) 2025 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 _LProp_CurveUtils_HeaderFile +#define _LProp_CurveUtils_HeaderFile + +#include +#include +#include + +#include + +//! Template utility functions for CLProps curve local property computation. +//! Provides access policies (DirectAccess, ToolAccess) and shared algorithms +//! for evaluating derivatives, tangents, curvature, normals, and centres of curvature. +namespace LProp_CurveUtils +{ + +// ==================== Deref helpers ==================== + +//! Dereference by-value or reference types (identity). +template +T& Deref(T& theObj) +{ + return theObj; +} + +//! Dereference occ::handle types. +template +T& Deref(occ::handle& theHandle) +{ + return *theHandle; +} + +//! Dereference const occ::handle types. +template +const T& Deref(const occ::handle& theHandle) +{ + return *theHandle; +} + +// ==================== Access Policies ==================== + +//! Direct access policy: calls D0/D1/D2/D3 methods on the curve object. +//! Works with occ::handle and by-value curve types. +struct DirectAccess +{ + template + static void D0(C& theCurve, double theU, P& thePnt) + { + Deref(theCurve).D0(theU, thePnt); + } + + template + static void D1(C& theCurve, double theU, P& thePnt, V& theV1) + { + Deref(theCurve).D1(theU, thePnt, theV1); + } + + template + static void D2(C& theCurve, double theU, P& thePnt, V& theV1, V& theV2) + { + Deref(theCurve).D2(theU, thePnt, theV1, theV2); + } + + template + static void D3(C& theCurve, double theU, P& thePnt, V& theV1, V& theV2, V& theV3) + { + Deref(theCurve).D3(theU, thePnt, theV1, theV2, theV3); + } + + template + static double FirstParameter(C& theCurve) + { + return Deref(theCurve).FirstParameter(); + } + + template + static double LastParameter(C& theCurve) + { + return Deref(theCurve).LastParameter(); + } +}; + +//! Tool-based access policy: delegates to static Tool methods. +//! Used for HLRBRep types where Tool class provides the interface. +template +struct ToolAccess +{ + template + static void D0(C& theCurve, double theU, P& thePnt) + { + Tool::Value(theCurve, theU, thePnt); + } + + template + static void D1(C& theCurve, double theU, P& thePnt, V& theV1) + { + Tool::D1(theCurve, theU, thePnt, theV1); + } + + template + static void D2(C& theCurve, double theU, P& thePnt, V& theV1, V& theV2) + { + Tool::D2(theCurve, theU, thePnt, theV1, theV2); + } + + template + static void D3(C& theCurve, double theU, P& thePnt, V& theV1, V& theV2, V& theV3) + { + Tool::D3(theCurve, theU, thePnt, theV1, theV2, theV3); + } + + template + static double FirstParameter(C& theCurve) + { + return Tool::FirstParameter(theCurve); + } + + template + static double LastParameter(C& theCurve) + { + return Tool::LastParameter(theCurve); + } +}; + +// ==================== Algorithm Utilities ==================== + +//! Evaluate curve derivatives at parameter theU up to specified order. +//! @param[in,out] theCurve curve object +//! @param[in] theU parameter value +//! @param[in] theOrder maximum derivative order (0-3) +//! @param[out] thePnt evaluated point +//! @param[out] theDerivArr derivative array (size >= theOrder) +template +void EvalDerivatives(Curve& theCurve, double theU, int theOrder, Pnt& thePnt, Vec* theDerivArr) +{ + switch (theOrder) + { + case 0: + Access::D0(theCurve, theU, thePnt); + break; + case 1: + Access::D1(theCurve, theU, thePnt, theDerivArr[0]); + break; + case 2: + Access::D2(theCurve, theU, thePnt, theDerivArr[0], theDerivArr[1]); + break; + case 3: + Access::D3(theCurve, theU, thePnt, theDerivArr[0], theDerivArr[1], theDerivArr[2]); + break; + } +} + +//! Compute tangent direction with sign correction for higher-order derivatives. +//! When the first significant derivative has order > 1, the sign of the tangent +//! is determined by comparing with the chord direction near the point. +//! @param[in,out] theCurve curve object +//! @param[in] theU current parameter +//! @param[in] theDerivArr derivative array +//! @param[in] theRefPnt reference point (used only for type deduction) +//! @param[in] theSigOrder order of first significant derivative +//! @param[out] theDir computed tangent direction +template +void ComputeTangent(Curve& theCurve, + double theU, + const Vec* theDerivArr, + const Pnt& /*theRefPnt*/, + int theSigOrder, + Dir& theDir) +{ + if (theSigOrder == 1) + { + theDir = Dir(theDerivArr[0]); + return; + } + + constexpr double THE_DIVISION_FACTOR = 1.0e-3; + constexpr double THE_MIN_STEP = 1.0e-7; + + const double anUsupremum = Access::LastParameter(theCurve); + const double anUinfimum = Access::FirstParameter(theCurve); + + double aDu; + if ((anUsupremum >= RealLast()) || (anUinfimum <= RealFirst())) + aDu = 0.0; + else + aDu = anUsupremum - anUinfimum; + + const double aDelta = std::max(aDu * THE_DIVISION_FACTOR, THE_MIN_STEP); + + Vec aV = theDerivArr[theSigOrder - 1]; + + double anOtherU; + if (theU - anUinfimum < aDelta) + anOtherU = theU + aDelta; + else + anOtherU = theU - aDelta; + + Pnt aP1, aP2; + Access::D0(theCurve, std::min(theU, anOtherU), aP1); + Access::D0(theCurve, std::max(theU, anOtherU), aP2); + + Vec aChord(aP1, aP2); + if (aV.Dot(aChord) < 0.0) + aV = -aV; + + theDir = Dir(aV); +} + +//! Compute curvature from first and second derivatives. +//! Returns |D1 x D2| / |D1|^3, or 0 if derivatives are collinear or D2 is null. +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[in] theTolSq squared linear tolerance +//! @return curvature value +template +double ComputeCurvature(const Vec& theD1, const Vec& theD2, double theTolSq) +{ + const double aDD1 = theD1.SquareMagnitude(); + const double aDD2 = theD2.SquareMagnitude(); + + if (aDD2 <= theTolSq) + return 0.0; + + const double aN = theD1.CrossSquareMagnitude(theD2); + const double aT = aN / aDD1 / aDD2; + if (aT <= theTolSq) + return 0.0; + + return sqrt(aN) / aDD1 / sqrt(aDD1); +} + +//! Compute normal direction from first and second derivatives. +//! Normal = D2*(D1*D1) - D1*(D1*D2), using the vector triple product identity. +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[out] theDir computed normal direction +template +void ComputeNormal(const Vec& theD1, const Vec& theD2, Dir& theDir) +{ + Vec aNorm = theD2 * (theD1 * theD1) - theD1 * (theD1 * theD2); + theDir = Dir(aNorm); +} + +//! Compute centre of curvature from point, derivatives, and curvature. +//! Centre = Point + Normal / Curvature. +//! @param[in] thePnt current point +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[in] theCurvature curvature value (must be non-zero) +//! @param[out] theCentre computed centre of curvature +template +void ComputeCentreOfCurvature(const Pnt& thePnt, + const Vec& theD1, + const Vec& theD2, + double theCurvature, + Pnt& theCentre) +{ + Vec aNorm = theD2 * (theD1 * theD1) - theD1 * (theD1 * theD2); + aNorm.Normalize(); + aNorm.Divide(theCurvature); + theCentre = thePnt.Translated(aNorm); +} + +// ==================== Higher-Level Method Wrappers ==================== + +//! SetParameter wrapper: sets parameter, evaluates derivatives, resets tangent status. +//! @param[in,out] theCurve curve object +//! @param[in] theU parameter value +//! @param[out] theStoredU stored parameter field +//! @param[in] theDerOrder current derivative order +//! @param[out] thePnt evaluated point +//! @param[out] theDerivArr derivative array +//! @param[out] theTanStatus tangent status field +template +void SetParameter(Curve& theCurve, + double theU, + double& theStoredU, + int theDerOrder, + Pnt& thePnt, + Vec* theDerivArr, + LProp_Status& theTanStatus) +{ + theStoredU = theU; + EvalDerivatives(theCurve, theU, theDerOrder, thePnt, theDerivArr); + theTanStatus = LProp_Undecided; +} + +//! Ensure derivatives up to the required order are computed. +//! @param[in,out] theCurve curve object +//! @param[in] theU parameter value +//! @param[in,out] theDerOrder current derivative order (upgraded if needed) +//! @param[in] theRequired required derivative order +//! @param[out] thePnt evaluated point +//! @param[out] theDerivArr derivative array +//! @return reference to theDerivArr[theRequired-1] +template +const Vec& EnsureDeriv(Curve& theCurve, + double theU, + int& theDerOrder, + int theRequired, + Pnt& thePnt, + Vec* theDerivArr) +{ + if (theDerOrder < theRequired) + { + theDerOrder = theRequired; + EvalDerivatives(theCurve, theU, theDerOrder, thePnt, theDerivArr); + } + return theDerivArr[theRequired - 1]; +} + +//! IsTangentDefined: searches for first non-null derivative. +//! Calls theProps.D1(), theProps.D2(), theProps.D3() to upgrade derivatives as needed. +//! @param[in,out] theProps CLProps object +//! @param[in] theCN continuity order +//! @param[in] theLinTol linear tolerance +//! @param[out] theSigOrder order of first significant derivative +//! @param[in,out] theTanStatus tangent status field +//! @return true if tangent is defined +template +bool IsTangentDefined(Props& theProps, + int theCN, + double theLinTol, + int& theSigOrder, + LProp_Status& theTanStatus) +{ + if (theTanStatus == LProp_Undefined) + return false; + if (theTanStatus >= LProp_Defined) + return true; + + const double aTolSq = theLinTol * theLinTol; + int anOrder = 0; + while (anOrder++ < 4) + { + if (theCN >= anOrder) + { + Vec aV; + switch (anOrder) + { + case 1: + aV = theProps.D1(); + break; + case 2: + aV = theProps.D2(); + break; + case 3: + aV = theProps.D3(); + break; + } + if (aV.SquareMagnitude() > aTolSq) + { + theSigOrder = anOrder; + theTanStatus = LProp_Defined; + return true; + } + } + else + { + theTanStatus = LProp_Undefined; + return false; + } + } + return false; +} + +//! Tangent: checks IsTangentDefined, then computes tangent direction. +//! @param[in,out] theProps CLProps object +//! @param[in,out] theCurve curve object +//! @param[in] theU current parameter +//! @param[in] theDerivArr derivative array +//! @param[in] theRefPnt reference point (for type deduction) +//! @param[in] theSigOrder order of first significant derivative +//! @param[out] theDir computed tangent direction +template +void Tangent(Props& theProps, + Curve& theCurve, + double theU, + const Vec* theDerivArr, + const Pnt& theRefPnt, + const int& theSigOrder, + Dir& theDir) +{ + if (!theProps.IsTangentDefined()) + throw LProp_NotDefined(); + ComputeTangent(theCurve, theU, theDerivArr, theRefPnt, theSigOrder, theDir); +} + +//! Curvature: checks IsTangentDefined, returns RealLast if higher-order, else computes. +//! @param[in,out] theProps CLProps object +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[in] theLinTol linear tolerance +//! @param[in] theSigOrder order of first significant derivative +//! @param[out] theCurvature curvature value field +//! @return computed curvature +template +double Curvature(Props& theProps, + const Vec& theD1, + const Vec& theD2, + double theLinTol, + const int& theSigOrder, + double& theCurvature) +{ + const bool anIsDefined = theProps.IsTangentDefined(); + (void)anIsDefined; + LProp_NotDefined_Raise_if(!anIsDefined, "CLProps::Curvature()"); + if (theSigOrder > 1) + return RealLast(); + theCurvature = ComputeCurvature(theD1, theD2, theLinTol * theLinTol); + return theCurvature; +} + +//! Normal: checks curvature, then computes normal direction. +//! @param[in,out] theProps CLProps object +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[in] theLinTol linear tolerance +//! @param[out] theDir computed normal direction +template +void Normal(Props& theProps, const Vec& theD1, const Vec& theD2, double theLinTol, Dir& theDir) +{ + const double aCurvature = theProps.Curvature(); + if (aCurvature == RealLast() || std::abs(aCurvature) <= theLinTol) + throw LProp_NotDefined("CLProps::Normal(): Curvature is null or infinity"); + ComputeNormal(theD1, theD2, theDir); +} + +//! CentreOfCurvature: checks curvature, then computes centre. +//! @param[in,out] theProps CLProps object +//! @param[in] thePnt current point +//! @param[in] theD1 first derivative +//! @param[in] theD2 second derivative +//! @param[in] theLinTol linear tolerance +//! @param[in,out] theCurvature curvature value field +//! @param[out] theCentre computed centre of curvature +template +void CentreOfCurvature(Props& theProps, + const Pnt& thePnt, + const Vec& theD1, + const Vec& theD2, + double theLinTol, + double& theCurvature, + Pnt& theCentre) +{ + if (std::abs(theProps.Curvature()) <= theLinTol) + throw LProp_NotDefined(); + ComputeCentreOfCurvature(thePnt, theD1, theD2, theCurvature, theCentre); +} + +} // namespace LProp_CurveUtils + +#endif // _LProp_CurveUtils_HeaderFile diff --git a/src/ModelingData/TKG2d/LProp/LProp_SLProps.gxx b/src/ModelingData/TKG2d/LProp/LProp_SLProps.gxx deleted file mode 100644 index 7441b7e665..0000000000 --- a/src/ModelingData/TKG2d/LProp/LProp_SLProps.gxx +++ /dev/null @@ -1,542 +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. - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const double MinStep = 1.0e-7; - -static bool IsTangentDefined(LProp_SLProps& SProp, - const int cn, - const double linTol, - const int Derivative, - int& Order, - LProp_Status& theStatus) -{ - double Tol = linTol * linTol; - gp_Vec V[2]; - Order = 0; - - while (Order < 3) - { - Order++; - if (cn >= Order) - { - switch (Order) - { - case 1: - V[0] = SProp.D1U(); - V[1] = SProp.D1V(); - break; - case 2: - V[0] = SProp.D2U(); - V[1] = SProp.D2V(); - break; - } // switch(Order) - - if (V[Derivative].SquareMagnitude() > Tol) - { - theStatus = LProp_Defined; - return true; - } - } // if(cn >= Order) - else - { - theStatus = LProp_Undefined; - return false; - } - } - - return false; -} - -LProp_SLProps::LProp_SLProps(const Surface& S, - const double U, - const double V, - const int N, - const double Resolution) - : mySurf(S), - myDerOrder(N), - myCN(4), // (Tool::Continuity(S)), - myLinTol(Resolution) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp_SLProps::LProp_SLProps()"); - - SetParameters(U, V); -} - -LProp_SLProps::LProp_SLProps(const Surface& S, const int N, const double Resolution) - : mySurf(S), - myU(RealLast()), - myV(RealLast()), - myDerOrder(N), - myCN(4), // (Tool::Continuity(S)) - myLinTol(Resolution), - myUTangentStatus(LProp_Undecided), - myVTangentStatus(LProp_Undecided), - myNormalStatus(LProp_Undecided), - myCurvatureStatus(LProp_Undecided) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp_SLProps::LProp_SLProps()"); -} - -LProp_SLProps::LProp_SLProps(const int N, const double Resolution) - : myU(RealLast()), - myV(RealLast()), - myDerOrder(N), - myCN(0), - myLinTol(Resolution), - myUTangentStatus(LProp_Undecided), - myVTangentStatus(LProp_Undecided), - myNormalStatus(LProp_Undecided), - myCurvatureStatus(LProp_Undecided) -{ - Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp_SLProps::LProp_SLProps() bad level"); -} - -void LProp_SLProps::SetSurface(const Surface& S) -{ - mySurf = S; - myCN = 4; // =Tool::Continuity(S); -} - -void LProp_SLProps::SetParameters(const double U, const double V) -{ - myU = U; - myV = V; - switch (myDerOrder) - { - case 0: - Tool::Value(mySurf, myU, myV, myPnt); - break; - case 1: - Tool::D1(mySurf, myU, myV, myPnt, myD1u, myD1v); - break; - case 2: - Tool::D2(mySurf, myU, myV, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv); - break; - } - - myUTangentStatus = LProp_Undecided; - myVTangentStatus = LProp_Undecided; - myNormalStatus = LProp_Undecided; - myCurvatureStatus = LProp_Undecided; -} - -const gp_Pnt& LProp_SLProps::Value() const -{ - return myPnt; -} - -const gp_Vec& LProp_SLProps::D1U() -{ - if (myDerOrder < 1) - { - myDerOrder = 1; - Tool::D1(mySurf, myU, myV, myPnt, myD1u, myD1v); - } - - return myD1u; -} - -const gp_Vec& LProp_SLProps::D1V() -{ - if (myDerOrder < 1) - { - myDerOrder = 1; - Tool::D1(mySurf, myU, myV, myPnt, myD1u, myD1v); - } - - return myD1v; -} - -const gp_Vec& LProp_SLProps::D2U() -{ - if (myDerOrder < 2) - { - myDerOrder = 2; - Tool::D2(mySurf, myU, myV, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv); - } - - return myD2u; -} - -const gp_Vec& LProp_SLProps::D2V() -{ - if (myDerOrder < 2) - { - myDerOrder = 2; - Tool::D2(mySurf, myU, myV, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv); - } - - return myD2v; -} - -const gp_Vec& LProp_SLProps::DUV() -{ - if (myDerOrder < 2) - { - myDerOrder = 2; - Tool::D2(mySurf, myU, myV, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv); - } - - return myDuv; -} - -bool LProp_SLProps::IsTangentUDefined() -{ - if (myUTangentStatus == LProp_Undefined) - return false; - else if (myUTangentStatus >= LProp_Defined) - return true; - - // uTangentStatus == Lprop_Undecided - // we have to calculate the first non null U derivative - return IsTangentDefined(*this, - myCN, - myLinTol, - 0, - mySignificantFirstDerivativeOrderU, - myUTangentStatus); -} - -void LProp_SLProps::TangentU(gp_Dir& D) -{ - if (!IsTangentUDefined()) - throw LProp_NotDefined(); - - if (mySignificantFirstDerivativeOrderU == 1) - D = gp_Dir(myD1u); - else - { - const double DivisionFactor = 1.e-3; - double anUsupremum, anUinfium; - double anVsupremum, anVinfium; - Tool::Bounds(mySurf, anUinfium, anVinfium, anUsupremum, anVsupremum); - double du; - if ((anUsupremum >= RealLast()) || (anUinfium <= RealFirst())) - du = 0.0; - else - du = anUsupremum - anUinfium; - - const double aDeltaU = std::max(du * DivisionFactor, MinStep); - - gp_Vec V = myD2u; - - double u; - - if (myU - anUinfium < aDeltaU) - u = myU + aDeltaU; - else - u = myU - aDeltaU; - - gp_Pnt P1, P2; - Tool::Value(mySurf, std::min(myU, u), myV, P1); - Tool::Value(mySurf, std::max(myU, u), myV, P2); - - gp_Vec V1(P1, P2); - double aDirFactor = V.Dot(V1); - - if (aDirFactor < 0.0) - V = -V; - - D = gp_Dir(V); - } -} - -bool LProp_SLProps::IsTangentVDefined() -{ - if (myVTangentStatus == LProp_Undefined) - return false; - else if (myVTangentStatus >= LProp_Defined) - return true; - - // vTangentStatus == Lprop_Undecided - // we have to calculate the first non null V derivative - return IsTangentDefined(*this, - myCN, - myLinTol, - 1, - mySignificantFirstDerivativeOrderV, - myVTangentStatus); -} - -void LProp_SLProps::TangentV(gp_Dir& D) -{ - if (!IsTangentVDefined()) - throw LProp_NotDefined(); - - if (mySignificantFirstDerivativeOrderV == 1) - D = gp_Dir(myD1v); - else - { - const double DivisionFactor = 1.e-3; - double anUsupremum, anUinfium; - double anVsupremum, anVinfium; - Tool::Bounds(mySurf, anUinfium, anVinfium, anUsupremum, anVsupremum); - - double dv; - if ((anVsupremum >= RealLast()) || (anVinfium <= RealFirst())) - dv = 0.0; - else - dv = anVsupremum - anVinfium; - - const double aDeltaV = std::max(dv * DivisionFactor, MinStep); - - gp_Vec V = myD2v; - - double v; - - if (myV - anVinfium < aDeltaV) - v = myV + aDeltaV; - else - v = myV - aDeltaV; - - gp_Pnt P1, P2; - Tool::Value(mySurf, myU, std::min(myV, v), P1); - Tool::Value(mySurf, myU, std::max(myV, v), P2); - - gp_Vec V1(P1, P2); - double aDirFactor = V.Dot(V1); - - if (aDirFactor < 0.0) - V = -V; - - D = gp_Dir(V); - } -} - -bool LProp_SLProps::IsNormalDefined() -{ - if (myNormalStatus == LProp_Undefined) - return false; - else if (myNormalStatus >= LProp_Defined) - return true; - - // status = UnDecided - // first try the standard computation of the normal. - CSLib_DerivativeStatus aStatus = CSLib_Done; - CSLib::Normal(myD1u, myD1v, myLinTol, aStatus, myNormal); - if (aStatus == CSLib_Done) - { - myNormalStatus = LProp_Computed; - return true; - } - - // else solve the degenerated case only if continuity >= 2 - - myNormalStatus = LProp_Undefined; - return false; -} - -const gp_Dir& LProp_SLProps::Normal() -{ - if (!IsNormalDefined()) - { - throw LProp_NotDefined(); - } - - return myNormal; -} - -bool LProp_SLProps::IsCurvatureDefined() -{ - if (myCurvatureStatus == LProp_Undefined) - return false; - else if (myCurvatureStatus >= LProp_Defined) - return true; - - if (myCN < 2) - { - myCurvatureStatus = LProp_Undefined; - return false; - } - - // status = UnDecided - if (!IsNormalDefined()) - { - myCurvatureStatus = LProp_Undefined; - return false; - } - - // to avoid a crash in the case of a pointed patch - // in fact we should be able to compute the curvatures - // see - if (!IsTangentUDefined() || !IsTangentVDefined()) - { - myCurvatureStatus = LProp_Undefined; - return false; - } - - // here we compute the curvature features of the surface - - gp_Vec Norm(myNormal); - - double E = myD1u.SquareMagnitude(); - double F = myD1u.Dot(myD1v); - double G = myD1v.SquareMagnitude(); - - if (myDerOrder < 2) - this->D2U(); - - double L = Norm.Dot(myD2u); - double M = Norm.Dot(myDuv); - double N = Norm.Dot(myD2v); - - double A = E * M - F * L; - double B = E * N - G * L; - double C = F * N - G * M; - - double MaxABC = std::max(std::max(std::abs(A), std::abs(B)), std::abs(C)); - if (MaxABC < RealEpsilon()) // ombilic - { - myMinCurv = N / G; - myMaxCurv = myMinCurv; - myDirMinCurv = gp_Dir(myD1u); - myDirMaxCurv = gp_Dir(myD1u.Crossed(Norm)); - myMeanCurv = myMinCurv; // (Cmin + Cmax) / 2. - myGausCurv = myMinCurv * myMinCurv; // (Cmin * Cmax) - myCurvatureStatus = LProp_Computed; - return true; - } - - A = A / MaxABC; - B = B / MaxABC; - C = C / MaxABC; - double Curv1, Curv2, Root1, Root2; - gp_Vec VectCurv1, VectCurv2; - - if (std::abs(A) > RealEpsilon()) - { - math_DirectPolynomialRoots Root(A, B, C); - if (Root.NbSolutions() != 2) - { - myCurvatureStatus = LProp_Undefined; - return false; - } - else - { - Root1 = Root.Value(1); - Root2 = Root.Value(2); - Curv1 = ((L * Root1 + 2. * M) * Root1 + N) / ((E * Root1 + 2. * F) * Root1 + G); - Curv2 = ((L * Root2 + 2. * M) * Root2 + N) / ((E * Root2 + 2. * F) * Root2 + G); - VectCurv1 = Root1 * myD1u + myD1v; - VectCurv2 = Root2 * myD1u + myD1v; - } - } - else if (std::abs(C) > RealEpsilon()) - { - math_DirectPolynomialRoots Root(C, B, A); - - if ((Root.NbSolutions() != 2)) - { - myCurvatureStatus = LProp_Undefined; - return false; - } - else - { - Root1 = Root.Value(1); - Root2 = Root.Value(2); - Curv1 = ((N * Root1 + 2. * M) * Root1 + L) / ((G * Root1 + 2. * F) * Root1 + E); - Curv2 = ((N * Root2 + 2. * M) * Root2 + L) / ((G * Root2 + 2. * F) * Root2 + E); - VectCurv1 = myD1u + Root1 * myD1v; - VectCurv2 = myD1u + Root2 * myD1v; - } - } - else - { - Curv1 = L / E; - Curv2 = N / G; - VectCurv1 = myD1u; - VectCurv2 = myD1v; - } - - if (Curv1 < Curv2) - { - myMinCurv = Curv1; - myMaxCurv = Curv2; - myDirMinCurv = gp_Dir(VectCurv1); - myDirMaxCurv = gp_Dir(VectCurv2); - } - else - { - myMinCurv = Curv2; - myMaxCurv = Curv1; - myDirMinCurv = gp_Dir(VectCurv2); - myDirMaxCurv = gp_Dir(VectCurv1); - } - - myMeanCurv = ((N * E) - (2. * M * F) + (L * G)) // voir Farin p.282 - / (2. * ((E * G) - (F * F))); - myGausCurv = ((L * N) - (M * M)) / ((E * G) - (F * F)); - myCurvatureStatus = LProp_Computed; - return true; -} - -bool LProp_SLProps::IsUmbilic() -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - return std::abs(myMaxCurv - myMinCurv) < std::abs(Epsilon(myMaxCurv)); -} - -double LProp_SLProps::MaxCurvature() -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - return myMaxCurv; -} - -double LProp_SLProps::MinCurvature() -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - return myMinCurv; -} - -void LProp_SLProps::CurvatureDirections(gp_Dir& Max, gp_Dir& Min) -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - Max = myDirMaxCurv; - Min = myDirMinCurv; -} - -double LProp_SLProps::MeanCurvature() -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - return myMeanCurv; -} - -double LProp_SLProps::GaussianCurvature() -{ - if (!IsCurvatureDefined()) - throw LProp_NotDefined(); - - return myGausCurv; -} diff --git a/src/ModelingData/TKG2d/LProp/LProp_SurfaceUtils.pxx b/src/ModelingData/TKG2d/LProp/LProp_SurfaceUtils.pxx new file mode 100644 index 0000000000..11f3985071 --- /dev/null +++ b/src/ModelingData/TKG2d/LProp/LProp_SurfaceUtils.pxx @@ -0,0 +1,823 @@ +// Copyright (c) 2025 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 _LProp_SurfaceUtils_HeaderFile +#define _LProp_SurfaceUtils_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +//! Template utility functions for SLProps surface local property computation. +//! Provides access policies (DirectAccess, ToolAccess), surface bounds helpers, +//! and shared algorithms for evaluating derivatives, tangents, normals, and curvatures. +namespace LProp_SurfaceUtils +{ + +// ==================== Deref helpers ==================== + +//! Dereference by-value or reference types (identity). +template +T& Deref(T& theObj) +{ + return theObj; +} + +//! Dereference occ::handle types. +template +T& Deref(occ::handle& theHandle) +{ + return *theHandle; +} + +//! Dereference const occ::handle types. +template +const T& Deref(const occ::handle& theHandle) +{ + return *theHandle; +} + +// ==================== Surface Bounds Helpers ==================== + +//! Get bounds from Geom_Surface (uses Bounds method with U1, U2, V1, V2 order). +inline void GetSurfBounds(const Geom_Surface& theSurf, + double& theU1, + double& theV1, + double& theU2, + double& theV2) +{ + theSurf.Bounds(theU1, theU2, theV1, theV2); +} + +//! Get bounds from Adaptor3d_Surface (uses individual parameter methods). +//! Also works for BRepAdaptor_Surface which inherits from Adaptor3d_Surface. +inline void GetSurfBounds(const Adaptor3d_Surface& theSurf, + double& theU1, + double& theV1, + double& theU2, + double& theV2) +{ + theU1 = theSurf.FirstUParameter(); + theV1 = theSurf.FirstVParameter(); + theU2 = theSurf.LastUParameter(); + theV2 = theSurf.LastVParameter(); +} + +// ==================== Access Policies ==================== + +//! Direct access policy: calls D0/D1/D2 methods on the surface object. +//! Works with occ::handle and by-value surface types. +struct DirectAccess +{ + template + static void D0(S& theSurf, double theU, double theV, gp_Pnt& thePnt) + { + Deref(theSurf).D0(theU, theV, thePnt); + } + + template + static void D1(S& theSurf, + double theU, + double theV, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v) + { + Deref(theSurf).D1(theU, theV, thePnt, theD1u, theD1v); + } + + template + static void D2(S& theSurf, + double theU, + double theV, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v, + gp_Vec& theD2u, + gp_Vec& theD2v, + gp_Vec& theDuv) + { + Deref(theSurf).D2(theU, theV, thePnt, theD1u, theD1v, theD2u, theD2v, theDuv); + } + + template + static void Bounds(S& theSurf, double& theU1, double& theV1, double& theU2, double& theV2) + { + GetSurfBounds(Deref(theSurf), theU1, theV1, theU2, theV2); + } +}; + +//! Tool-based access policy: delegates to static Tool methods. +//! Used for HLRBRep types where Tool class provides the interface. +template +struct ToolAccess +{ + template + static void D0(S& theSurf, double theU, double theV, gp_Pnt& thePnt) + { + Tool::Value(theSurf, theU, theV, thePnt); + } + + template + static void D1(S& theSurf, + double theU, + double theV, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v) + { + Tool::D1(theSurf, theU, theV, thePnt, theD1u, theD1v); + } + + template + static void D2(S& theSurf, + double theU, + double theV, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v, + gp_Vec& theD2u, + gp_Vec& theD2v, + gp_Vec& theDuv) + { + Tool::D2(theSurf, theU, theV, thePnt, theD1u, theD1v, theD2u, theD2v, theDuv); + } + + template + static void Bounds(S& theSurf, double& theU1, double& theV1, double& theU2, double& theV2) + { + Tool::Bounds(theSurf, theU1, theV1, theU2, theV2); + } +}; + +// ==================== Algorithm Utilities ==================== + +//! Evaluate surface derivatives at parameters (theU, theV) up to specified order. +//! @param[in,out] theSurf surface object +//! @param[in] theU U parameter value +//! @param[in] theV V parameter value +//! @param[in] theOrder maximum derivative order (0-2) +//! @param[out] thePnt evaluated point +//! @param[out] theD1u first U derivative +//! @param[out] theD1v first V derivative +//! @param[out] theD2u second U derivative +//! @param[out] theD2v second V derivative +//! @param[out] theDuv mixed UV derivative +template +void EvalSurfDerivatives(Surface& theSurf, + double theU, + double theV, + int theOrder, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v, + gp_Vec& theD2u, + gp_Vec& theD2v, + gp_Vec& theDuv) +{ + switch (theOrder) + { + case 0: + Access::D0(theSurf, theU, theV, thePnt); + break; + case 1: + Access::D1(theSurf, theU, theV, thePnt, theD1u, theD1v); + break; + case 2: + Access::D2(theSurf, theU, theV, thePnt, theD1u, theD1v, theD2u, theD2v, theDuv); + break; + } +} + +//! Check if the surface tangent is defined for a given derivative direction. +//! Searches for the first non-null derivative in either U or V direction. +//! @param[in] theD1 first derivative (D1U for U direction, D1V for V direction) +//! @param[in] theD2 second derivative (D2U for U direction, D2V for V direction) +//! @param[in] theCN continuity order +//! @param[in] theTolSq squared linear tolerance +//! @param[out] theOrder order of first significant derivative +//! @param[out] theStatus resulting tangent status +//! @return true if tangent is defined +inline bool FindSurfTangentOrder(const gp_Vec& theD1, + const gp_Vec& theD2, + int theCN, + double theTolSq, + int& theOrder, + LProp_Status& theStatus) +{ + const gp_Vec* aDerivs[2] = {&theD1, &theD2}; + theOrder = 0; + + while (theOrder < 3) + { + theOrder++; + if (theCN >= theOrder) + { + if (theOrder <= 2 && aDerivs[theOrder - 1]->SquareMagnitude() > theTolSq) + { + theStatus = LProp_Defined; + return true; + } + } + else + { + theStatus = LProp_Undefined; + return false; + } + } + + return false; +} + +//! Compute surface tangent direction with sign correction for higher-order derivatives. +//! When the first significant derivative has order > 1, the sign is determined +//! by comparing with the chord direction near the point. +//! @param[in,out] theSurf surface object +//! @param[in] theU current U parameter +//! @param[in] theV current V parameter +//! @param[in] theFirstDeriv first derivative in this direction (D1U or D1V) +//! @param[in] theSecDeriv second derivative in this direction (D2U or D2V) +//! @param[in] theSigOrder order of first significant derivative +//! @param[in] theIsU true for U direction, false for V direction +//! @param[out] theDir computed tangent direction +template +void ComputeSurfTangent(Surface& theSurf, + double theU, + double theV, + const gp_Vec& theFirstDeriv, + const gp_Vec& theSecDeriv, + int theSigOrder, + bool theIsU, + gp_Dir& theDir) +{ + if (theSigOrder == 1) + { + theDir = gp_Dir(theFirstDeriv); + return; + } + + constexpr double THE_DIVISION_FACTOR = 1.0e-3; + constexpr double THE_MIN_STEP = 1.0e-7; + + double anUinfimum, anVinfimum, anUsupremum, anVsupremum; + Access::Bounds(theSurf, anUinfimum, anVinfimum, anUsupremum, anVsupremum); + + if (theIsU) + { + double aDu; + if ((anUsupremum >= RealLast()) || (anUinfimum <= RealFirst())) + aDu = 0.0; + else + aDu = anUsupremum - anUinfimum; + + const double aDelta = std::max(aDu * THE_DIVISION_FACTOR, THE_MIN_STEP); + + gp_Vec aV = theSecDeriv; + + double anOtherU; + if (theU - anUinfimum < aDelta) + anOtherU = theU + aDelta; + else + anOtherU = theU - aDelta; + + gp_Pnt aP1, aP2; + Access::D0(theSurf, std::min(theU, anOtherU), theV, aP1); + Access::D0(theSurf, std::max(theU, anOtherU), theV, aP2); + + gp_Vec aChord(aP1, aP2); + if (aV.Dot(aChord) < 0.0) + aV = -aV; + + theDir = gp_Dir(aV); + } + else + { + double aDv; + if ((anVsupremum >= RealLast()) || (anVinfimum <= RealFirst())) + aDv = 0.0; + else + aDv = anVsupremum - anVinfimum; + + const double aDelta = std::max(aDv * THE_DIVISION_FACTOR, THE_MIN_STEP); + + gp_Vec aV = theSecDeriv; + + double anOtherV; + if (theV - anVinfimum < aDelta) + anOtherV = theV + aDelta; + else + anOtherV = theV - aDelta; + + gp_Pnt aP1, aP2; + Access::D0(theSurf, theU, std::min(theV, anOtherV), aP1); + Access::D0(theSurf, theU, std::max(theV, anOtherV), aP2); + + gp_Vec aChord(aP1, aP2); + if (aV.Dot(aChord) < 0.0) + aV = -aV; + + theDir = gp_Dir(aV); + } +} + +//! Check if surface normal is defined, and compute it via CSLib::Normal. +//! @param[in] theD1u first U derivative +//! @param[in] theD1v first V derivative +//! @param[in] theLinTol linear tolerance +//! @param[out] theNormal computed normal direction (if defined) +//! @return true if normal is defined +inline bool ComputeSurfNormal(const gp_Vec& theD1u, + const gp_Vec& theD1v, + double theLinTol, + gp_Dir& theNormal) +{ + CSLib_DerivativeStatus aStatus = CSLib_Done; + CSLib::Normal(theD1u, theD1v, theLinTol, aStatus, theNormal); + return aStatus == CSLib_Done; +} + +//! Compute principal curvatures and directions via fundamental forms. +//! Solves the eigenvalue problem for the shape operator using +//! first and second fundamental form coefficients. +//! @param[in] theD1u first U derivative +//! @param[in] theD1v first V derivative +//! @param[in] theD2u second U derivative +//! @param[in] theD2v second V derivative +//! @param[in] theDuv mixed UV derivative +//! @param[in] theNormal surface normal direction +//! @param[out] theMinCurv minimum principal curvature +//! @param[out] theMaxCurv maximum principal curvature +//! @param[out] theDirMin direction of minimum curvature +//! @param[out] theDirMax direction of maximum curvature +//! @param[out] theMeanCurv mean curvature +//! @param[out] theGausCurv Gaussian curvature +//! @return true if curvatures are successfully computed +inline bool ComputeSurfCurvatures(const gp_Vec& theD1u, + const gp_Vec& theD1v, + const gp_Vec& theD2u, + const gp_Vec& theD2v, + const gp_Vec& theDuv, + const gp_Dir& theNormal, + double& theMinCurv, + double& theMaxCurv, + gp_Dir& theDirMin, + gp_Dir& theDirMax, + double& theMeanCurv, + double& theGausCurv) +{ + const gp_Vec aNorm(theNormal); + + const double anE = theD1u.SquareMagnitude(); + const double anF = theD1u.Dot(theD1v); + const double aG = theD1v.SquareMagnitude(); + + const double aL = aNorm.Dot(theD2u); + const double aM = aNorm.Dot(theDuv); + const double aN = aNorm.Dot(theD2v); + + const double anA0 = anE * aM - anF * aL; + const double aB0 = anE * aN - aG * aL; + const double aC0 = anF * aN - aG * aM; + + const double aMaxABC = std::max(std::max(std::abs(anA0), std::abs(aB0)), std::abs(aC0)); + if (aMaxABC < RealEpsilon()) + { + // Umbilic point + theMinCurv = aN / aG; + theMaxCurv = theMinCurv; + theDirMin = gp_Dir(theD1u); + theDirMax = gp_Dir(theD1u.Crossed(aNorm)); + theMeanCurv = theMinCurv; + theGausCurv = theMinCurv * theMinCurv; + return true; + } + + const double anA = anA0 / aMaxABC; + const double aB = aB0 / aMaxABC; + const double aC = aC0 / aMaxABC; + + double aCurv1, aCurv2; + gp_Vec aVectCurv1, aVectCurv2; + + if (std::abs(anA) > RealEpsilon()) + { + math_DirectPolynomialRoots aRoot(anA, aB, aC); + if (aRoot.NbSolutions() != 2) + return false; + + const double aRoot1 = aRoot.Value(1); + const double aRoot2 = aRoot.Value(2); + aCurv1 = ((aL * aRoot1 + 2.0 * aM) * aRoot1 + aN) / ((anE * aRoot1 + 2.0 * anF) * aRoot1 + aG); + aCurv2 = ((aL * aRoot2 + 2.0 * aM) * aRoot2 + aN) / ((anE * aRoot2 + 2.0 * anF) * aRoot2 + aG); + aVectCurv1 = aRoot1 * theD1u + theD1v; + aVectCurv2 = aRoot2 * theD1u + theD1v; + } + else if (std::abs(aC) > RealEpsilon()) + { + math_DirectPolynomialRoots aRoot(aC, aB, anA); + if (aRoot.NbSolutions() != 2) + return false; + + const double aRoot1 = aRoot.Value(1); + const double aRoot2 = aRoot.Value(2); + aCurv1 = ((aN * aRoot1 + 2.0 * aM) * aRoot1 + aL) / ((aG * aRoot1 + 2.0 * anF) * aRoot1 + anE); + aCurv2 = ((aN * aRoot2 + 2.0 * aM) * aRoot2 + aL) / ((aG * aRoot2 + 2.0 * anF) * aRoot2 + anE); + aVectCurv1 = theD1u + aRoot1 * theD1v; + aVectCurv2 = theD1u + aRoot2 * theD1v; + } + else + { + aCurv1 = aL / anE; + aCurv2 = aN / aG; + aVectCurv1 = theD1u; + aVectCurv2 = theD1v; + } + + if (aCurv1 < aCurv2) + { + theMinCurv = aCurv1; + theMaxCurv = aCurv2; + theDirMin = gp_Dir(aVectCurv1); + theDirMax = gp_Dir(aVectCurv2); + } + else + { + theMinCurv = aCurv2; + theMaxCurv = aCurv1; + theDirMin = gp_Dir(aVectCurv2); + theDirMax = gp_Dir(aVectCurv1); + } + + const double anEG_FF = (anE * aG) - (anF * anF); + theMeanCurv = ((aN * anE) - (2.0 * aM * anF) + (aL * aG)) / (2.0 * anEG_FF); + theGausCurv = ((aL * aN) - (aM * aM)) / anEG_FF; + return true; +} + +// ==================== Higher-Level Method Wrappers ==================== + +//! SetParameters: sets parameters, evaluates derivatives, resets all statuses. +//! @param[in,out] theSurf surface object +//! @param[in] theU U parameter value +//! @param[in] theV V parameter value +//! @param[out] theStoredU stored U parameter field +//! @param[out] theStoredV stored V parameter field +//! @param[in] theDerOrder current derivative order +//! @param[out] thePnt evaluated point +//! @param[out] theD1u first U derivative +//! @param[out] theD1v first V derivative +//! @param[out] theD2u second U derivative +//! @param[out] theD2v second V derivative +//! @param[out] theDuv mixed UV derivative +//! @param[out] theUTanSt U tangent status +//! @param[out] theVTanSt V tangent status +//! @param[out] theNormSt normal status +//! @param[out] theCurvSt curvature status +template +void SetParameters(Surface& theSurf, + double theU, + double theV, + double& theStoredU, + double& theStoredV, + int theDerOrder, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v, + gp_Vec& theD2u, + gp_Vec& theD2v, + gp_Vec& theDuv, + LProp_Status& theUTanSt, + LProp_Status& theVTanSt, + LProp_Status& theNormSt, + LProp_Status& theCurvSt) +{ + theStoredU = theU; + theStoredV = theV; + EvalSurfDerivatives< + Access>(theSurf, theU, theV, theDerOrder, thePnt, theD1u, theD1v, theD2u, theD2v, theDuv); + theUTanSt = LProp_Undecided; + theVTanSt = LProp_Undecided; + theNormSt = LProp_Undecided; + theCurvSt = LProp_Undecided; +} + +//! Ensure surface derivatives up to the required order. Returns the specified result field. +//! @param[in,out] theSurf surface object +//! @param[in] theU U parameter value +//! @param[in] theV V parameter value +//! @param[in,out] theDerOrder current derivative order (upgraded if needed) +//! @param[in] theRequired required derivative order +//! @param[out] thePnt evaluated point +//! @param[out] theD1u first U derivative +//! @param[out] theD1v first V derivative +//! @param[out] theD2u second U derivative +//! @param[out] theD2v second V derivative +//! @param[out] theDuv mixed UV derivative +//! @param[in] theResult reference to the specific derivative field to return +//! @return const reference to theResult +template +const gp_Vec& EnsureSurfDeriv(Surface& theSurf, + double theU, + double theV, + int& theDerOrder, + int theRequired, + gp_Pnt& thePnt, + gp_Vec& theD1u, + gp_Vec& theD1v, + gp_Vec& theD2u, + gp_Vec& theD2v, + gp_Vec& theDuv, + const gp_Vec& theResult) +{ + if (theDerOrder < theRequired) + { + theDerOrder = theRequired; + EvalSurfDerivatives< + Access>(theSurf, theU, theV, theDerOrder, thePnt, theD1u, theD1v, theD2u, theD2v, theDuv); + } + return theResult; +} + +//! IsTangentUDefined: checks U tangent status, then searches via D1U/D2U. +//! @param[in,out] theProps SLProps object +//! @param[in] theCN continuity order +//! @param[in] theLinTol linear tolerance +//! @param[out] theSigOrder order of first significant derivative +//! @param[in,out] theTanStatus U tangent status field +//! @return true if U tangent is defined +template +bool IsTangentUDefined(Props& theProps, + int theCN, + double theLinTol, + int& theSigOrder, + LProp_Status& theTanStatus) +{ + if (theTanStatus == LProp_Undefined) + return false; + if (theTanStatus >= LProp_Defined) + return true; + return FindSurfTangentOrder(theProps.D1U(), + theProps.D2U(), + theCN, + theLinTol * theLinTol, + theSigOrder, + theTanStatus); +} + +//! IsTangentVDefined: checks V tangent status, then searches via D1V/D2V. +//! @param[in,out] theProps SLProps object +//! @param[in] theCN continuity order +//! @param[in] theLinTol linear tolerance +//! @param[out] theSigOrder order of first significant derivative +//! @param[in,out] theTanStatus V tangent status field +//! @return true if V tangent is defined +template +bool IsTangentVDefined(Props& theProps, + int theCN, + double theLinTol, + int& theSigOrder, + LProp_Status& theTanStatus) +{ + if (theTanStatus == LProp_Undefined) + return false; + if (theTanStatus >= LProp_Defined) + return true; + return FindSurfTangentOrder(theProps.D1V(), + theProps.D2V(), + theCN, + theLinTol * theLinTol, + theSigOrder, + theTanStatus); +} + +//! TangentU: checks IsTangentUDefined, then computes U tangent direction. +//! @param[in,out] theProps SLProps object +//! @param[in,out] theSurf surface object +//! @param[in] theU current U parameter +//! @param[in] theV current V parameter +//! @param[in] theD1u first U derivative +//! @param[in] theD2u second U derivative +//! @param[in] theSigOrder order of first significant derivative +//! @param[out] theDir computed tangent direction +template +void TangentU(Props& theProps, + Surface& theSurf, + double theU, + double theV, + const gp_Vec& theD1u, + const gp_Vec& theD2u, + int theSigOrder, + gp_Dir& theDir) +{ + if (!theProps.IsTangentUDefined()) + throw LProp_NotDefined(); + ComputeSurfTangent(theSurf, theU, theV, theD1u, theD2u, theSigOrder, true, theDir); +} + +//! TangentV: checks IsTangentVDefined, then computes V tangent direction. +//! @param[in,out] theProps SLProps object +//! @param[in,out] theSurf surface object +//! @param[in] theU current U parameter +//! @param[in] theV current V parameter +//! @param[in] theD1v first V derivative +//! @param[in] theD2v second V derivative +//! @param[in] theSigOrder order of first significant derivative +//! @param[out] theDir computed tangent direction +template +void TangentV(Props& theProps, + Surface& theSurf, + double theU, + double theV, + const gp_Vec& theD1v, + const gp_Vec& theD2v, + int theSigOrder, + gp_Dir& theDir) +{ + if (!theProps.IsTangentVDefined()) + throw LProp_NotDefined(); + ComputeSurfTangent(theSurf, theU, theV, theD1v, theD2v, theSigOrder, false, theDir); +} + +//! IsNormalDefined: checks normal status, then computes via CSLib. +//! @param[in] theD1u first U derivative +//! @param[in] theD1v first V derivative +//! @param[in] theLinTol linear tolerance +//! @param[out] theNormal computed normal direction +//! @param[in,out] theNormStatus normal status field +//! @return true if normal is defined +inline bool IsNormalDefined(const gp_Vec& theD1u, + const gp_Vec& theD1v, + double theLinTol, + gp_Dir& theNormal, + LProp_Status& theNormStatus) +{ + if (theNormStatus == LProp_Undefined) + return false; + if (theNormStatus >= LProp_Defined) + return true; + if (ComputeSurfNormal(theD1u, theD1v, theLinTol, theNormal)) + { + theNormStatus = LProp_Computed; + return true; + } + theNormStatus = LProp_Undefined; + return false; +} + +//! Normal: checks IsNormalDefined (via theProps), then returns normal. +//! @param[in,out] theProps SLProps object +//! @param[in] theNormal normal direction field +//! @return const reference to theNormal +template +const gp_Dir& Normal(Props& theProps, const gp_Dir& theNormal) +{ + if (!theProps.IsNormalDefined()) + throw LProp_NotDefined(); + return theNormal; +} + +//! IsCurvatureDefined: full check including continuity, normal, tangents, and curvature +//! computation. +//! @param[in,out] theProps SLProps object +//! @param[in] theCN continuity order +//! @param[in,out] theDerOrder current derivative order +//! @param[in] theD1u first U derivative +//! @param[in] theD1v first V derivative +//! @param[in] theD2u second U derivative +//! @param[in] theD2v second V derivative +//! @param[in] theDuv mixed UV derivative +//! @param[in] theNormal surface normal +//! @param[out] theMinCurv minimum principal curvature +//! @param[out] theMaxCurv maximum principal curvature +//! @param[out] theDirMin direction of minimum curvature +//! @param[out] theDirMax direction of maximum curvature +//! @param[out] theMeanCurv mean curvature +//! @param[out] theGausCurv Gaussian curvature +//! @param[in,out] theCurvStatus curvature status field +//! @return true if curvature is defined +template +bool IsCurvatureDefined(Props& theProps, + int theCN, + int& theDerOrder, + const gp_Vec& theD1u, + const gp_Vec& theD1v, + const gp_Vec& theD2u, + const gp_Vec& theD2v, + const gp_Vec& theDuv, + const gp_Dir& theNormal, + double& theMinCurv, + double& theMaxCurv, + gp_Dir& theDirMin, + gp_Dir& theDirMax, + double& theMeanCurv, + double& theGausCurv, + LProp_Status& theCurvStatus) +{ + if (theCurvStatus == LProp_Undefined) + return false; + if (theCurvStatus >= LProp_Defined) + return true; + if (theCN < 2) + { + theCurvStatus = LProp_Undefined; + return false; + } + if (!theProps.IsNormalDefined()) + { + theCurvStatus = LProp_Undefined; + return false; + } + if (!theProps.IsTangentUDefined() || !theProps.IsTangentVDefined()) + { + theCurvStatus = LProp_Undefined; + return false; + } + if (theDerOrder < 2) + theProps.D2U(); + if (ComputeSurfCurvatures(theD1u, + theD1v, + theD2u, + theD2v, + theDuv, + theNormal, + theMinCurv, + theMaxCurv, + theDirMin, + theDirMax, + theMeanCurv, + theGausCurv)) + { + theCurvStatus = LProp_Computed; + return true; + } + theCurvStatus = LProp_Undefined; + return false; +} + +//! Require curvature to be defined, throw if not. Returns the given value. +//! @param[in,out] theProps SLProps object +//! @param[in] theValue curvature value to return +//! @return theValue if curvature is defined +template +double RequireCurvature(Props& theProps, double theValue) +{ + if (!theProps.IsCurvatureDefined()) + throw LProp_NotDefined(); + return theValue; +} + +//! IsUmbilic: checks curvature, then compares min/max. +//! @param[in,out] theProps SLProps object +//! @param[in] theMaxCurv maximum curvature value +//! @param[in] theMinCurv minimum curvature value +//! @return true if the point is umbilic +template +bool IsUmbilic(Props& theProps, double theMaxCurv, double theMinCurv) +{ + if (!theProps.IsCurvatureDefined()) + throw LProp_NotDefined(); + return std::abs(theMaxCurv - theMinCurv) < std::abs(Epsilon(theMaxCurv)); +} + +//! CurvatureDirections: checks curvature, then returns max/min directions. +//! @param[in,out] theProps SLProps object +//! @param[in] theDirMax direction of maximum curvature field +//! @param[in] theDirMin direction of minimum curvature field +//! @param[out] theMax output maximum curvature direction +//! @param[out] theMin output minimum curvature direction +template +void CurvatureDirections(Props& theProps, + const gp_Dir& theDirMax, + const gp_Dir& theDirMin, + gp_Dir& theMax, + gp_Dir& theMin) +{ + if (!theProps.IsCurvatureDefined()) + throw LProp_NotDefined(); + theMax = theDirMax; + theMin = theDirMin; +} + +} // namespace LProp_SurfaceUtils + +#endif // _LProp_SurfaceUtils_HeaderFile diff --git a/src/ModelingData/TKG3d/GeomLProp/FILES.cmake b/src/ModelingData/TKG3d/GeomLProp/FILES.cmake index 3fd07bc48e..8254367b36 100644 --- a/src/ModelingData/TKG3d/GeomLProp/FILES.cmake +++ b/src/ModelingData/TKG3d/GeomLProp/FILES.cmake @@ -5,11 +5,7 @@ set(OCCT_GeomLProp_FILES GeomLProp.cxx GeomLProp.hxx GeomLProp_CLProps.hxx - GeomLProp_CLProps_0.cxx - GeomLProp_CurveTool.cxx - GeomLProp_CurveTool.hxx + GeomLProp_CLProps.cxx GeomLProp_SLProps.hxx - GeomLProp_SLProps_0.cxx - GeomLProp_SurfaceTool.cxx - GeomLProp_SurfaceTool.hxx + GeomLProp_SLProps.cxx ) diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.cxx new file mode 100644 index 0000000000..fafdabe858 --- /dev/null +++ b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.cxx @@ -0,0 +1,173 @@ +// Created on: 1992-03-26 +// Created by: Herve LEGRAND +// Copyright (c) 1992-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 + +using Access = LProp_CurveUtils::DirectAccess; + +//================================================================================================= + +GeomLProp_CLProps::GeomLProp_CLProps(const occ::handle& C, + const double U, + const int N, + const double Resolution) + : myCurve(C), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "GeomLProp_CLProps::GeomLProp_CLProps()"); + SetParameter(U); +} + +//================================================================================================= + +GeomLProp_CLProps::GeomLProp_CLProps(const occ::handle& C, + const int N, + const double Resolution) + : myCurve(C), + myU(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "GeomLProp_CLProps::GeomLProp_CLProps()"); +} + +//================================================================================================= + +GeomLProp_CLProps::GeomLProp_CLProps(const int N, const double Resolution) + : myU(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "GeomLProp_CLProps() - invalid input"); +} + +//================================================================================================= + +void GeomLProp_CLProps::SetParameter(const double U) +{ + LProp_CurveUtils::SetParameter(myCurve, + U, + myU, + myDerOrder, + myPnt, + myDerivArr, + myTangentStatus); +} + +//================================================================================================= + +void GeomLProp_CLProps::SetCurve(const occ::handle& C) +{ + myCurve = C; + myCN = 4; +} + +//================================================================================================= + +const gp_Pnt& GeomLProp_CLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& GeomLProp_CLProps::D1() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 1, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_CLProps::D2() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 2, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_CLProps::D3() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 3, myPnt, myDerivArr); +} + +//================================================================================================= + +bool GeomLProp_CLProps::IsTangentDefined() +{ + return LProp_CurveUtils::IsTangentDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrder, + myTangentStatus); +} + +//================================================================================================= + +void GeomLProp_CLProps::Tangent(gp_Dir& D) +{ + LProp_CurveUtils::Tangent(*this, + myCurve, + myU, + myDerivArr, + myPnt, + mySignificantFirstDerivativeOrder, + D); +} + +//================================================================================================= + +double GeomLProp_CLProps::Curvature() +{ + return LProp_CurveUtils::Curvature(*this, + myDerivArr[0], + myDerivArr[1], + myLinTol, + mySignificantFirstDerivativeOrder, + myCurvature); +} + +//================================================================================================= + +void GeomLProp_CLProps::Normal(gp_Dir& N) +{ + LProp_CurveUtils::Normal(*this, myDerivArr[0], myDerivArr[1], myLinTol, N); +} + +//================================================================================================= + +void GeomLProp_CLProps::CentreOfCurvature(gp_Pnt& P) +{ + LProp_CurveUtils::CentreOfCurvature(*this, + myPnt, + myDerivArr[0], + myDerivArr[1], + myLinTol, + myCurvature, + P); +} diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.hxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.hxx index 10a000ce42..ea51cf790d 100644 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.hxx +++ b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps.hxx @@ -36,7 +36,6 @@ class LProp_NotDefined; class gp_Vec; class gp_Pnt; class gp_Dir; -class GeomLProp_CurveTool; class GeomLProp_CLProps { @@ -116,14 +115,14 @@ private: occ::handle myCurve; double myU; int myDerOrder; - double myCN; + int myCN; double myLinTol; gp_Pnt myPnt; gp_Vec myDerivArr[3]; gp_Dir myTangent; - double myCurvature; + double myCurvature = 0.0; LProp_Status myTangentStatus; - int mySignificantFirstDerivativeOrder; + int mySignificantFirstDerivativeOrder = 0; }; #endif // _GeomLProp_CLProps_HeaderFile diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps_0.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps_0.cxx deleted file mode 100644 index 1984958851..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CLProps_0.cxx +++ /dev/null @@ -1,41 +0,0 @@ -// Created on: 1992-03-26 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 - -#define Curve occ::handle -#define Curve_hxx -#define Vec gp_Vec -#define Vec_hxx -#define Pnt gp_Pnt -#define Pnt_hxx -#define Dir gp_Dir -#define Dir_hxx -#define Tool GeomLProp_CurveTool -#define Tool_hxx -#define LProp_CLProps GeomLProp_CLProps -#define LProp_CLProps_hxx -#include diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.cxx deleted file mode 100644 index bb15b499df..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.cxx +++ /dev/null @@ -1,86 +0,0 @@ -// Created on: 1992-08-18 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 - -void GeomLProp_CurveTool::Value(const occ::handle& C, const double U, gp_Pnt& P) -{ - P = C->Value(U); -} - -void GeomLProp_CurveTool::D1(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1) -{ - C->D1(U, P, V1); -} - -void GeomLProp_CurveTool::D2(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2) -{ - C->D2(U, P, V1, V2); -} - -void GeomLProp_CurveTool::D3(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3) -{ - C->D3(U, P, V1, V2, V3); -} - -int GeomLProp_CurveTool::Continuity(const occ::handle& C) -{ - GeomAbs_Shape s = C->Continuity(); - switch (s) - { - case GeomAbs_C0: - return 0; - case GeomAbs_C1: - return 1; - case GeomAbs_C2: - return 2; - case GeomAbs_C3: - return 3; - case GeomAbs_G1: - return 0; - case GeomAbs_G2: - return 0; - case GeomAbs_CN: - return 3; - }; - return 0; -} - -double GeomLProp_CurveTool::FirstParameter(const occ::handle& C) -{ - return C->FirstParameter(); -} - -double GeomLProp_CurveTool::LastParameter(const occ::handle& C) -{ - return C->LastParameter(); -} diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.hxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.hxx deleted file mode 100644 index 6c3cc3cd5e..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_CurveTool.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// Created on: 1992-03-26 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 _GeomLProp_CurveTool_HeaderFile -#define _GeomLProp_CurveTool_HeaderFile - -#include -#include -#include - -#include -class Geom_Curve; -class gp_Pnt; -class gp_Vec; - -class GeomLProp_CurveTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Computes the point

of parameter on the curve . - Standard_EXPORT static void Value(const occ::handle& C, const double U, gp_Pnt& P); - - //! Computes the point

and first derivative of - //! parameter on the curve . - Standard_EXPORT static void D1(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1); - - //! Computes the point

, the first derivative and second - //! derivative of parameter on the curve . - Standard_EXPORT static void D2(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2); - - //! Computes the point

, the first derivative , the - //! second derivative and third derivative of - //! parameter on the curve . - Standard_EXPORT static void D3(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3); - - //! returns the order of continuity of the curve . - //! returns 1 : first derivative only is computable - //! returns 2 : first and second derivative only are computable. - //! returns 3 : first, second and third are computable. - Standard_EXPORT static int Continuity(const occ::handle& C); - - //! returns the first parameter bound of the curve. - Standard_EXPORT static double FirstParameter(const occ::handle& C); - - //! returns the last parameter bound of the curve. - //! FirstParameter must be less than LastParamenter. - Standard_EXPORT static double LastParameter(const occ::handle& C); -}; - -#endif // _GeomLProp_CurveTool_HeaderFile diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.cxx new file mode 100644 index 0000000000..2887f39d9d --- /dev/null +++ b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.cxx @@ -0,0 +1,281 @@ +// Created on: 1992-03-26 +// Created by: Herve LEGRAND +// Copyright (c) 1992-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 + +using Access = LProp_SurfaceUtils::DirectAccess; + +//================================================================================================= + +GeomLProp_SLProps::GeomLProp_SLProps(const occ::handle& S, + const double U, + const double V, + const int N, + const double Resolution) + : mySurf(S), + myDerOrder(N), + myCN(4), + myLinTol(Resolution) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "GeomLProp_SLProps::GeomLProp_SLProps()"); + SetParameters(U, V); +} + +//================================================================================================= + +GeomLProp_SLProps::GeomLProp_SLProps(const occ::handle& S, + const int N, + const double Resolution) + : mySurf(S), + myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "GeomLProp_SLProps::GeomLProp_SLProps()"); +} + +//================================================================================================= + +GeomLProp_SLProps::GeomLProp_SLProps(const int N, const double Resolution) + : myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "GeomLProp_SLProps::GeomLProp_SLProps() bad level"); +} + +//================================================================================================= + +void GeomLProp_SLProps::SetSurface(const occ::handle& S) +{ + mySurf = S; + myCN = 4; +} + +//================================================================================================= + +void GeomLProp_SLProps::SetParameters(const double U, const double V) +{ + LProp_SurfaceUtils::SetParameters(mySurf, + U, + V, + myU, + myV, + myDerOrder, + myPnt, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myUTangentStatus, + myVTangentStatus, + myNormalStatus, + myCurvatureStatus); +} + +//================================================================================================= + +const gp_Pnt& GeomLProp_SLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& GeomLProp_SLProps::D1U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1u); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_SLProps::D1V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1v); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_SLProps::D2U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2u); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_SLProps::D2V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2v); +} + +//================================================================================================= + +const gp_Vec& GeomLProp_SLProps::DUV() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myDuv); +} + +//================================================================================================= + +bool GeomLProp_SLProps::IsTangentUDefined() +{ + return LProp_SurfaceUtils::IsTangentUDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderU, + myUTangentStatus); +} + +//================================================================================================= + +void GeomLProp_SLProps::TangentU(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentU(*this, + mySurf, + myU, + myV, + myD1u, + myD2u, + mySignificantFirstDerivativeOrderU, + D); +} + +//================================================================================================= + +bool GeomLProp_SLProps::IsTangentVDefined() +{ + return LProp_SurfaceUtils::IsTangentVDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderV, + myVTangentStatus); +} + +//================================================================================================= + +void GeomLProp_SLProps::TangentV(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentV(*this, + mySurf, + myU, + myV, + myD1v, + myD2v, + mySignificantFirstDerivativeOrderV, + D); +} + +//================================================================================================= + +bool GeomLProp_SLProps::IsNormalDefined() +{ + return LProp_SurfaceUtils::IsNormalDefined(myD1u, myD1v, myLinTol, myNormal, myNormalStatus); +} + +//================================================================================================= + +const gp_Dir& GeomLProp_SLProps::Normal() +{ + return LProp_SurfaceUtils::Normal(*this, myNormal); +} + +//================================================================================================= + +bool GeomLProp_SLProps::IsCurvatureDefined() +{ + return LProp_SurfaceUtils::IsCurvatureDefined(*this, + myCN, + myDerOrder, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myNormal, + myMinCurv, + myMaxCurv, + myDirMinCurv, + myDirMaxCurv, + myMeanCurv, + myGausCurv, + myCurvatureStatus); +} + +//================================================================================================= + +bool GeomLProp_SLProps::IsUmbilic() +{ + return LProp_SurfaceUtils::IsUmbilic(*this, myMaxCurv, myMinCurv); +} + +//================================================================================================= + +double GeomLProp_SLProps::MaxCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMaxCurv); +} + +//================================================================================================= + +double GeomLProp_SLProps::MinCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMinCurv); +} + +//================================================================================================= + +void GeomLProp_SLProps::CurvatureDirections(gp_Dir& Max, gp_Dir& Min) +{ + LProp_SurfaceUtils::CurvatureDirections(*this, myDirMaxCurv, myDirMinCurv, Max, Min); +} + +//================================================================================================= + +double GeomLProp_SLProps::MeanCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMeanCurv); +} + +//================================================================================================= + +double GeomLProp_SLProps::GaussianCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myGausCurv); +} diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.hxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.hxx index 102bc21e1c..6c37f71b05 100644 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.hxx +++ b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps.hxx @@ -31,7 +31,6 @@ class LProp_BadContinuity; class Standard_DomainError; class Standard_OutOfRange; class LProp_NotDefined; -class GeomLProp_SurfaceTool; class gp_Pnt; class gp_Vec; class gp_Dir; @@ -158,14 +157,14 @@ private: gp_Vec myD2v; gp_Vec myDuv; gp_Dir myNormal; - double myMinCurv; - double myMaxCurv; + double myMinCurv = 0.0; + double myMaxCurv = 0.0; gp_Dir myDirMinCurv; gp_Dir myDirMaxCurv; - double myMeanCurv; - double myGausCurv; - int mySignificantFirstDerivativeOrderU; - int mySignificantFirstDerivativeOrderV; + double myMeanCurv = 0.0; + double myGausCurv = 0.0; + int mySignificantFirstDerivativeOrderU = 0; + int mySignificantFirstDerivativeOrderV = 0; LProp_Status myUTangentStatus; LProp_Status myVTangentStatus; LProp_Status myNormalStatus; diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps_0.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps_0.cxx deleted file mode 100644 index 974322eb44..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SLProps_0.cxx +++ /dev/null @@ -1,35 +0,0 @@ -// Created on: 1992-03-26 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 - -#define Surface occ::handle -#define Surface_hxx -#define Tool GeomLProp_SurfaceTool -#define Tool_hxx -#define LProp_SLProps GeomLProp_SLProps -#define LProp_SLProps_hxx -#include diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.cxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.cxx deleted file mode 100644 index 022cbeaa26..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.cxx +++ /dev/null @@ -1,95 +0,0 @@ -// Created on: 1992-08-18 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 - -void GeomLProp_SurfaceTool::Value(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P) -{ - P = S->Value(U, V); -} - -void GeomLProp_SurfaceTool::D1(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V) -{ - S->D1(U, V, P, D1U, D1V); -} - -void GeomLProp_SurfaceTool::D2(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V, - gp_Vec& D2U, - gp_Vec& D2V, - gp_Vec& DUV) -{ - S->D2(U, V, P, D1U, D1V, D2U, D2V, DUV); -} - -//================================================================================================= - -gp_Vec GeomLProp_SurfaceTool::DN(const occ::handle& S, - const double U, - const double V, - const int IU, - const int IV) -{ - return S->DN(U, V, IU, IV); -} - -int GeomLProp_SurfaceTool::Continuity(const occ::handle& S) -{ - GeomAbs_Shape s = S->Continuity(); - switch (s) - { - case GeomAbs_C0: - return 0; - case GeomAbs_C1: - return 1; - case GeomAbs_C2: - return 2; - case GeomAbs_C3: - return 3; - case GeomAbs_G1: - return 0; - case GeomAbs_G2: - return 0; - case GeomAbs_CN: - return 3; - }; - return 0; -} - -void GeomLProp_SurfaceTool::Bounds(const occ::handle& S, - double& U1, - double& V1, - double& U2, - double& V2) -{ - S->Bounds(U1, U2, V1, V2); -} diff --git a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.hxx b/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.hxx deleted file mode 100644 index dc135044b9..0000000000 --- a/src/ModelingData/TKG3d/GeomLProp/GeomLProp_SurfaceTool.hxx +++ /dev/null @@ -1,81 +0,0 @@ -// Created on: 1992-03-26 -// Created by: Herve LEGRAND -// Copyright (c) 1992-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 _GeomLProp_SurfaceTool_HeaderFile -#define _GeomLProp_SurfaceTool_HeaderFile - -#include -#include -#include - -#include -class Geom_Surface; -class gp_Pnt; -class gp_Vec; - -class GeomLProp_SurfaceTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Computes the point

of parameter and on the - //! Surface . - Standard_EXPORT static void Value(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P); - - //! Computes the point

and first derivative of - //! parameter and on the Surface . - Standard_EXPORT static void D1(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V); - - //! Computes the point

, the first derivative and second - //! derivative of parameter and on the Surface . - Standard_EXPORT static void D2(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V, - gp_Vec& D2U, - gp_Vec& D2V, - gp_Vec& DUV); - - Standard_EXPORT static gp_Vec DN(const occ::handle& S, - const double U, - const double V, - const int IU, - const int IV); - - //! returns the order of continuity of the Surface . - //! returns 1 : first derivative only is computable - //! returns 2 : first and second derivative only are computable. - Standard_EXPORT static int Continuity(const occ::handle& S); - - //! returns the bounds of the Surface. - Standard_EXPORT static void Bounds(const occ::handle& S, - double& U1, - double& V1, - double& U2, - double& V2); -}; - -#endif // _GeomLProp_SurfaceTool_HeaderFile diff --git a/src/ModelingData/TKG3d/LProp3d/FILES.cmake b/src/ModelingData/TKG3d/LProp3d/FILES.cmake index f470bf5785..48e4c2e971 100644 --- a/src/ModelingData/TKG3d/LProp3d/FILES.cmake +++ b/src/ModelingData/TKG3d/LProp3d/FILES.cmake @@ -3,11 +3,7 @@ set(OCCT_LProp3d_FILES_LOCATION "${CMAKE_CURRENT_LIST_DIR}") set(OCCT_LProp3d_FILES LProp3d_CLProps.hxx - LProp3d_CLProps_0.cxx - LProp3d_CurveTool.cxx - LProp3d_CurveTool.hxx + LProp3d_CLProps.cxx LProp3d_SLProps.hxx - LProp3d_SLProps_0.cxx - LProp3d_SurfaceTool.cxx - LProp3d_SurfaceTool.hxx + LProp3d_SLProps.cxx ) diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.cxx new file mode 100644 index 0000000000..9df1acbd50 --- /dev/null +++ b/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.cxx @@ -0,0 +1,172 @@ +// Created on: 2002-08-02 +// Created by: Alexander KARTOMIN (akm) +// Copyright (c) 2002-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 + +using Access = LProp_CurveUtils::DirectAccess; + +//================================================================================================= + +LProp3d_CLProps::LProp3d_CLProps(const occ::handle& C, + const double U, + const int N, + const double Resolution) + : myCurve(C), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp3d_CLProps::LProp3d_CLProps()"); + SetParameter(U); +} + +//================================================================================================= + +LProp3d_CLProps::LProp3d_CLProps(const occ::handle& C, + const int N, + const double Resolution) + : myCurve(C), + myU(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp3d_CLProps::LProp3d_CLProps()"); +} + +//================================================================================================= + +LProp3d_CLProps::LProp3d_CLProps(const int N, const double Resolution) + : myU(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myTangentStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 3, "LProp3d_CLProps() - invalid input"); +} + +//================================================================================================= + +void LProp3d_CLProps::SetParameter(const double U) +{ + LProp_CurveUtils::SetParameter(myCurve, + U, + myU, + myDerOrder, + myPnt, + myDerivArr, + myTangentStatus); +} + +//================================================================================================= + +void LProp3d_CLProps::SetCurve(const occ::handle& C) +{ + myCurve = C; + myCN = 4; +} + +//================================================================================================= + +const gp_Pnt& LProp3d_CLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& LProp3d_CLProps::D1() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 1, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& LProp3d_CLProps::D2() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 2, myPnt, myDerivArr); +} + +//================================================================================================= + +const gp_Vec& LProp3d_CLProps::D3() +{ + return LProp_CurveUtils::EnsureDeriv(myCurve, myU, myDerOrder, 3, myPnt, myDerivArr); +} + +//================================================================================================= + +bool LProp3d_CLProps::IsTangentDefined() +{ + return LProp_CurveUtils::IsTangentDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrder, + myTangentStatus); +} + +//================================================================================================= + +void LProp3d_CLProps::Tangent(gp_Dir& D) +{ + LProp_CurveUtils::Tangent(*this, + myCurve, + myU, + myDerivArr, + myPnt, + mySignificantFirstDerivativeOrder, + D); +} + +//================================================================================================= + +double LProp3d_CLProps::Curvature() +{ + return LProp_CurveUtils::Curvature(*this, + myDerivArr[0], + myDerivArr[1], + myLinTol, + mySignificantFirstDerivativeOrder, + myCurvature); +} + +//================================================================================================= + +void LProp3d_CLProps::Normal(gp_Dir& N) +{ + LProp_CurveUtils::Normal(*this, myDerivArr[0], myDerivArr[1], myLinTol, N); +} + +//================================================================================================= + +void LProp3d_CLProps::CentreOfCurvature(gp_Pnt& P) +{ + LProp_CurveUtils::CentreOfCurvature(*this, + myPnt, + myDerivArr[0], + myDerivArr[1], + myLinTol, + myCurvature, + P); +} diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.hxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.hxx index 709b42b177..a698feb868 100644 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.hxx +++ b/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps.hxx @@ -29,7 +29,6 @@ class LProp_NotDefined; class gp_Vec; class gp_Pnt; class gp_Dir; -class LProp3d_CurveTool; class LProp3d_CLProps { @@ -109,14 +108,14 @@ private: occ::handle myCurve; double myU; int myDerOrder; - double myCN; + int myCN; double myLinTol; gp_Pnt myPnt; gp_Vec myDerivArr[3]; gp_Dir myTangent; - double myCurvature; + double myCurvature = 0.0; LProp_Status myTangentStatus; - int mySignificantFirstDerivativeOrder; + int mySignificantFirstDerivativeOrder = 0; }; #endif // _LProp3d_CLProps_HeaderFile diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps_0.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps_0.cxx deleted file mode 100644 index a0257d4467..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_CLProps_0.cxx +++ /dev/null @@ -1,40 +0,0 @@ -// Created on: 2002-08-02 -// Created by: Alexander KARTOMIN (akm) -// Copyright (c) 2002-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 - -#define Curve occ::handle -#define Curve_hxx -#define Vec gp_Vec -#define Vec_hxx -#define Pnt gp_Pnt -#define Pnt_hxx -#define Dir gp_Dir -#define Dir_hxx -#define Tool LProp3d_CurveTool -#define Tool_hxx -#define LProp_CLProps LProp3d_CLProps -#define LProp_CLProps_hxx -#include diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.cxx deleted file mode 100644 index 3f630436b6..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.cxx +++ /dev/null @@ -1,99 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 - -//================================================================================================= - -void LProp3d_CurveTool::Value(const occ::handle& C, const double U, gp_Pnt& P) -{ - P = C->Value(U); -} - -//================================================================================================= - -void LProp3d_CurveTool::D1(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1) -{ - C->D1(U, P, V1); -} - -//================================================================================================= - -void LProp3d_CurveTool::D2(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2) -{ - C->D2(U, P, V1, V2); -} - -//================================================================================================= - -void LProp3d_CurveTool::D3(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3) -{ - C->D3(U, P, V1, V2, V3); -} - -//================================================================================================= - -int LProp3d_CurveTool::Continuity(const occ::handle& C) -{ - GeomAbs_Shape s = C->Continuity(); - switch (s) - { - case GeomAbs_C0: - return 0; - case GeomAbs_C1: - return 1; - case GeomAbs_C2: - return 2; - case GeomAbs_C3: - return 3; - case GeomAbs_G1: - return 0; - case GeomAbs_G2: - return 0; - case GeomAbs_CN: - return 3; - }; - return 0; -} - -//================================================================================================= - -double LProp3d_CurveTool::FirstParameter(const occ::handle& C) -{ - return C->FirstParameter(); -} - -//================================================================================================= - -double LProp3d_CurveTool::LastParameter(const occ::handle& C) -{ - return C->LastParameter(); -} diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.hxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.hxx deleted file mode 100644 index 18060c371c..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_CurveTool.hxx +++ /dev/null @@ -1,78 +0,0 @@ -// Created on: 2002-08-02 -// Created by: Alexander KARTOMIN (akm) -// Copyright (c) 2002-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 _LProp3d_CurveTool_HeaderFile -#define _LProp3d_CurveTool_HeaderFile - -#include -#include -#include - -#include -#include - -class gp_Pnt; -class gp_Vec; - -class LProp3d_CurveTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Computes the point

of parameter on the HCurve . - Standard_EXPORT static void Value(const occ::handle& C, - const double U, - gp_Pnt& P); - - //! Computes the point

and first derivative of - //! parameter on the HCurve . - Standard_EXPORT static void D1(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1); - - //! Computes the point

, the first derivative and second - //! derivative of parameter on the HCurve . - Standard_EXPORT static void D2(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2); - - //! Computes the point

, the first derivative , the - //! second derivative and third derivative of - //! parameter on the HCurve . - Standard_EXPORT static void D3(const occ::handle& C, - const double U, - gp_Pnt& P, - gp_Vec& V1, - gp_Vec& V2, - gp_Vec& V3); - - //! returns the order of continuity of the HCurve . - //! returns 1 : first derivative only is computable - //! returns 2 : first and second derivative only are computable. - //! returns 3 : first, second and third are computable. - Standard_EXPORT static int Continuity(const occ::handle& C); - - //! returns the first parameter bound of the HCurve. - Standard_EXPORT static double FirstParameter(const occ::handle& C); - - //! returns the last parameter bound of the HCurve. - //! FirstParameter must be less than LastParamenter. - Standard_EXPORT static double LastParameter(const occ::handle& C); -}; - -#endif // _LProp3d_CurveTool_HeaderFile diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.cxx new file mode 100644 index 0000000000..bb99b6d5d5 --- /dev/null +++ b/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.cxx @@ -0,0 +1,280 @@ +// Created on: 2002-08-02 +// Created by: Alexander KARTOMIN (akm) +// Copyright (c) 2002-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 + +using Access = LProp_SurfaceUtils::DirectAccess; + +//================================================================================================= + +LProp3d_SLProps::LProp3d_SLProps(const occ::handle& S, + const double U, + const double V, + const int N, + const double Resolution) + : mySurf(S), + myDerOrder(N), + myCN(4), + myLinTol(Resolution) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp3d_SLProps::LProp3d_SLProps()"); + SetParameters(U, V); +} + +//================================================================================================= + +LProp3d_SLProps::LProp3d_SLProps(const occ::handle& S, + const int N, + const double Resolution) + : mySurf(S), + myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(4), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp3d_SLProps::LProp3d_SLProps()"); +} + +//================================================================================================= + +LProp3d_SLProps::LProp3d_SLProps(const int N, const double Resolution) + : myU(RealLast()), + myV(RealLast()), + myDerOrder(N), + myCN(0), + myLinTol(Resolution), + myUTangentStatus(LProp_Undecided), + myVTangentStatus(LProp_Undecided), + myNormalStatus(LProp_Undecided), + myCurvatureStatus(LProp_Undecided) +{ + Standard_OutOfRange_Raise_if(N < 0 || N > 2, "LProp3d_SLProps::LProp3d_SLProps() bad level"); +} + +//================================================================================================= + +void LProp3d_SLProps::SetSurface(const occ::handle& S) +{ + mySurf = S; + myCN = 4; +} + +//================================================================================================= + +void LProp3d_SLProps::SetParameters(const double U, const double V) +{ + LProp_SurfaceUtils::SetParameters(mySurf, + U, + V, + myU, + myV, + myDerOrder, + myPnt, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myUTangentStatus, + myVTangentStatus, + myNormalStatus, + myCurvatureStatus); +} + +//================================================================================================= + +const gp_Pnt& LProp3d_SLProps::Value() const +{ + return myPnt; +} + +//================================================================================================= + +const gp_Vec& LProp3d_SLProps::D1U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1u); +} + +//================================================================================================= + +const gp_Vec& LProp3d_SLProps::D1V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 1, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD1v); +} + +//================================================================================================= + +const gp_Vec& LProp3d_SLProps::D2U() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2u); +} + +//================================================================================================= + +const gp_Vec& LProp3d_SLProps::D2V() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myD2v); +} + +//================================================================================================= + +const gp_Vec& LProp3d_SLProps::DUV() +{ + return LProp_SurfaceUtils::EnsureSurfDeriv< + Access>(mySurf, myU, myV, myDerOrder, 2, myPnt, myD1u, myD1v, myD2u, myD2v, myDuv, myDuv); +} + +//================================================================================================= + +bool LProp3d_SLProps::IsTangentUDefined() +{ + return LProp_SurfaceUtils::IsTangentUDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderU, + myUTangentStatus); +} + +//================================================================================================= + +void LProp3d_SLProps::TangentU(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentU(*this, + mySurf, + myU, + myV, + myD1u, + myD2u, + mySignificantFirstDerivativeOrderU, + D); +} + +//================================================================================================= + +bool LProp3d_SLProps::IsTangentVDefined() +{ + return LProp_SurfaceUtils::IsTangentVDefined(*this, + myCN, + myLinTol, + mySignificantFirstDerivativeOrderV, + myVTangentStatus); +} + +//================================================================================================= + +void LProp3d_SLProps::TangentV(gp_Dir& D) +{ + LProp_SurfaceUtils::TangentV(*this, + mySurf, + myU, + myV, + myD1v, + myD2v, + mySignificantFirstDerivativeOrderV, + D); +} + +//================================================================================================= + +bool LProp3d_SLProps::IsNormalDefined() +{ + return LProp_SurfaceUtils::IsNormalDefined(myD1u, myD1v, myLinTol, myNormal, myNormalStatus); +} + +//================================================================================================= + +const gp_Dir& LProp3d_SLProps::Normal() +{ + return LProp_SurfaceUtils::Normal(*this, myNormal); +} + +//================================================================================================= + +bool LProp3d_SLProps::IsCurvatureDefined() +{ + return LProp_SurfaceUtils::IsCurvatureDefined(*this, + myCN, + myDerOrder, + myD1u, + myD1v, + myD2u, + myD2v, + myDuv, + myNormal, + myMinCurv, + myMaxCurv, + myDirMinCurv, + myDirMaxCurv, + myMeanCurv, + myGausCurv, + myCurvatureStatus); +} + +//================================================================================================= + +bool LProp3d_SLProps::IsUmbilic() +{ + return LProp_SurfaceUtils::IsUmbilic(*this, myMaxCurv, myMinCurv); +} + +//================================================================================================= + +double LProp3d_SLProps::MaxCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMaxCurv); +} + +//================================================================================================= + +double LProp3d_SLProps::MinCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMinCurv); +} + +//================================================================================================= + +void LProp3d_SLProps::CurvatureDirections(gp_Dir& Max, gp_Dir& Min) +{ + LProp_SurfaceUtils::CurvatureDirections(*this, myDirMaxCurv, myDirMinCurv, Max, Min); +} + +//================================================================================================= + +double LProp3d_SLProps::MeanCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myMeanCurv); +} + +//================================================================================================= + +double LProp3d_SLProps::GaussianCurvature() +{ + return LProp_SurfaceUtils::RequireCurvature(*this, myGausCurv); +} diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.hxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.hxx index c2bd6ddf48..c6d1f3c845 100644 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.hxx +++ b/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps.hxx @@ -141,14 +141,14 @@ private: gp_Vec myD2v; gp_Vec myDuv; gp_Dir myNormal; - double myMinCurv; - double myMaxCurv; + double myMinCurv = 0.0; + double myMaxCurv = 0.0; gp_Dir myDirMinCurv; gp_Dir myDirMaxCurv; - double myMeanCurv; - double myGausCurv; - int mySignificantFirstDerivativeOrderU; - int mySignificantFirstDerivativeOrderV; + double myMeanCurv = 0.0; + double myGausCurv = 0.0; + int mySignificantFirstDerivativeOrderU = 0; + int mySignificantFirstDerivativeOrderV = 0; LProp_Status myUTangentStatus; LProp_Status myVTangentStatus; LProp_Status myNormalStatus; diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps_0.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps_0.cxx deleted file mode 100644 index fe47121c56..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_SLProps_0.cxx +++ /dev/null @@ -1,34 +0,0 @@ -// Created on: 2002-08-02 -// Created by: Alexander KARTOMIN (akm) -// Copyright (c) 2002-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 - -#define Surface occ::handle -#define Surface_hxx -#define Tool LProp3d_SurfaceTool -#define Tool_hxx -#define LProp_SLProps LProp3d_SLProps -#define LProp_SLProps_hxx -#include diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.cxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.cxx deleted file mode 100644 index 917c4e6dce..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// Created on: 1994-02-24 -// Created by: Laurent BOURESCHE -// Copyright (c) 1994-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 - -//================================================================================================= - -void LProp3d_SurfaceTool::Value(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P) -{ - P = S->Value(U, V); -} - -//================================================================================================= - -void LProp3d_SurfaceTool::D1(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V) -{ - S->D1(U, V, P, D1U, D1V); -} - -//================================================================================================= - -void LProp3d_SurfaceTool::D2(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V, - gp_Vec& D2U, - gp_Vec& D2V, - gp_Vec& DUV) -{ - S->D2(U, V, P, D1U, D1V, D2U, D2V, DUV); -} - -//================================================================================================= - -gp_Vec LProp3d_SurfaceTool::DN(const occ::handle& S, - const double U, - const double V, - const int IU, - const int IV) -{ - return S->DN(U, V, IU, IV); -} - -//================================================================================================= - -int LProp3d_SurfaceTool::Continuity(const occ::handle& S) -{ - GeomAbs_Shape s = (GeomAbs_Shape)std::min(S->UContinuity(), S->VContinuity()); - switch (s) - { - case GeomAbs_C0: - return 0; - case GeomAbs_C1: - return 1; - case GeomAbs_C2: - return 2; - case GeomAbs_C3: - return 3; - case GeomAbs_G1: - return 0; - case GeomAbs_G2: - return 0; - case GeomAbs_CN: - return 3; - }; - return 0; -} - -//================================================================================================= - -void LProp3d_SurfaceTool::Bounds(const occ::handle& S, - double& U1, - double& V1, - double& U2, - double& V2) -{ - U1 = S->FirstUParameter(); - V1 = S->FirstVParameter(); - U2 = S->LastUParameter(); - V2 = S->LastVParameter(); -} diff --git a/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.hxx b/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.hxx deleted file mode 100644 index 10e04e9ff7..0000000000 --- a/src/ModelingData/TKG3d/LProp3d/LProp3d_SurfaceTool.hxx +++ /dev/null @@ -1,73 +0,0 @@ -// Created on: 2002-08-02 -// Created by: Alexander KARTOMIN (akm) -// Copyright (c) 2002-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 _LProp3d_SurfaceTool_HeaderFile -#define _LProp3d_SurfaceTool_HeaderFile - -#include - -class LProp3d_SurfaceTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Computes the point

of parameter and on the - //! HSurface . - Standard_EXPORT static void Value(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P); - - //! Computes the point

and first derivative of - //! parameter and on the HSurface . - Standard_EXPORT static void D1(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V); - - //! Computes the point

, the first derivative and second - //! derivative of parameter and on the HSurface . - Standard_EXPORT static void D2(const occ::handle& S, - const double U, - const double V, - gp_Pnt& P, - gp_Vec& D1U, - gp_Vec& D1V, - gp_Vec& D2U, - gp_Vec& D2V, - gp_Vec& DUV); - - Standard_EXPORT static gp_Vec DN(const occ::handle& S, - const double U, - const double V, - const int IU, - const int IV); - - //! returns the order of continuity of the HSurface . - //! returns 1 : first derivative only is computable - //! returns 2 : first and second derivative only are computable. - Standard_EXPORT static int Continuity(const occ::handle& S); - - //! returns the bounds of the HSurface. - Standard_EXPORT static void Bounds(const occ::handle& S, - double& U1, - double& V1, - double& U2, - double& V2); -}; - -#endif // _LProp3d_SurfaceTool_HeaderFile