From 9a3258c9da4fdf4e7f8f2ab69d2b89c7145bcbe2 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 28 Jun 2022 12:42:15 +0200 Subject: [PATCH] Part: move BiArcs algorithm to its own class --- src/Mod/Part/App/BSplineCurveBiArcs.cpp | 25 ++++++--- src/Mod/Part/App/BSplineCurveBiArcs.h | 67 +++++++++++++++++++++++++ src/Mod/Part/App/CMakeLists.txt | 1 + src/Mod/Part/App/Geometry.cpp | 7 +++ src/Mod/Part/App/Geometry.h | 12 ----- 5 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 src/Mod/Part/App/BSplineCurveBiArcs.h diff --git a/src/Mod/Part/App/BSplineCurveBiArcs.cpp b/src/Mod/Part/App/BSplineCurveBiArcs.cpp index e699fff5fa..74f5ecdaaf 100644 --- a/src/Mod/Part/App/BSplineCurveBiArcs.cpp +++ b/src/Mod/Part/App/BSplineCurveBiArcs.cpp @@ -37,8 +37,10 @@ #endif #include "Geometry.h" +#include "BSplineCurveBiArcs.h" #include "Tools.h" +using Part::BSplineCurveBiArcs; using Part::GeomBSplineCurve; using Part::Geometry; @@ -115,9 +117,9 @@ public: } -void GeomBSplineCurve::createArcs(double tolerance, std::list& new_spans, - const gp_Pnt& p_start, const gp_Vec& v_start, - double t_start, double t_end, gp_Pnt& p_end, gp_Vec& v_end) const +void BSplineCurveBiArcs::createArcs(double tolerance, std::list& new_spans, + const gp_Pnt& p_start, const gp_Vec& v_start, + double t_start, double t_end, gp_Pnt& p_end, gp_Vec& v_end) const { this->myCurve->D1(t_end, p_end, v_end); @@ -161,15 +163,16 @@ void GeomBSplineCurve::createArcs(double tolerance, std::list& new_sp } else { // calculate_biarc_points failed, just add a line - GeomLineSegment* line = new GeomLineSegment(); + Part::GeomLineSegment* line = new Part::GeomLineSegment(); line->setPoints(Base::convertTo(p_start),Base::convertTo(p_end)); new_spans.push_back(line); } } -GeomBSplineCurve::Type GeomBSplineCurve::calculateBiArcPoints(double t_start, const gp_Pnt& p0, gp_Vec v_start, - double t_end, const gp_Pnt& p4, gp_Vec v_end, - gp_Pnt& p1, gp_Pnt& p2, gp_Pnt& p3) const +BSplineCurveBiArcs::Type +BSplineCurveBiArcs::calculateBiArcPoints(double t_start, const gp_Pnt& p0, gp_Vec v_start, + double t_end, const gp_Pnt& p4, gp_Vec v_end, + gp_Pnt& p1, gp_Pnt& p2, gp_Pnt& p3) const { if (v_start.Magnitude() < Precision::Intersection()) v_start = gp_Vec(p0, p1); @@ -225,7 +228,13 @@ GeomBSplineCurve::Type GeomBSplineCurve::calculateBiArcPoints(double t_start, co return Type::SingleArc; } -std::list GeomBSplineCurve::toBiArcs(double tolerance) const +BSplineCurveBiArcs::BSplineCurveBiArcs(const Handle(Geom_Curve)& c) + : myCurve(c) +{ + +} + +std::list BSplineCurveBiArcs::toBiArcs(double tolerance) const { gp_Pnt p_start; gp_Vec v_start; diff --git a/src/Mod/Part/App/BSplineCurveBiArcs.h b/src/Mod/Part/App/BSplineCurveBiArcs.h new file mode 100644 index 0000000000..1c3281f9fd --- /dev/null +++ b/src/Mod/Part/App/BSplineCurveBiArcs.h @@ -0,0 +1,67 @@ +// This file is released under the BSD license +// +// Copyright (c) 2009, Daniel Heeks +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, this +// list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// * Neither the name of Daniel Heeks nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#ifndef PART_BSPLINECURVEBIARCS_H +#define PART_BSPLINECURVEBIARCS_H + +#include +#include + +namespace Part { + +class Geometry; + +class PartExport BSplineCurveBiArcs +{ +public: + BSplineCurveBiArcs(const Handle(Geom_Curve)&); + std::list toBiArcs(double tolerance) const; + +private: + void createArcs(double tolerance, std::list& new_spans, + const gp_Pnt &p_start, const gp_Vec &v_start, + double t_start, double t_end, gp_Pnt &p_end, gp_Vec &v_end) const; + enum class Type { + SingleArc, + SplitCurve, + SingleLine + }; + + Type calculateBiArcPoints(double t_start, const gp_Pnt& p0, gp_Vec v_start, + double t_end, const gp_Pnt& p4, gp_Vec v_end, + gp_Pnt& p1, gp_Pnt& p2, gp_Pnt& p3) const; + +private: + Handle(Geom_Curve) myCurve; +}; + +} + +#endif // PART_BSPLINECURVEBIARCS_H diff --git a/src/Mod/Part/App/CMakeLists.txt b/src/Mod/Part/App/CMakeLists.txt index 0b7c7c327d..b496444af8 100644 --- a/src/Mod/Part/App/CMakeLists.txt +++ b/src/Mod/Part/App/CMakeLists.txt @@ -502,6 +502,7 @@ SET(Part_SRCS BRepOffsetAPI_MakeOffsetFix.cpp BRepOffsetAPI_MakeOffsetFix.h BSplineCurveBiArcs.cpp + BSplineCurveBiArcs.h CrossSection.cpp CrossSection.h ExtrusionHelper.cpp diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 1457e89205..1a7122e87e 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -124,6 +124,7 @@ #include #include #include +#include #include #include #include @@ -1205,6 +1206,12 @@ void GeomBSplineCurve::setPole(int index, const Base::Vector3d& pole, double wei } } +std::list GeomBSplineCurve::toBiArcs(double tolerance) const +{ + BSplineCurveBiArcs arcs(this->myCurve); + return arcs.toBiArcs(tolerance); +} + void GeomBSplineCurve::workAroundOCCTBug(const std::vector& weights) { // If during assignment of weights (during the for loop below) all weights diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index f34b186c36..965ceee123 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -329,18 +329,6 @@ public: const Handle(Geom_Geometry)& handle() const; private: - void createArcs(double tolerance, std::list& new_spans, - const gp_Pnt &p_start, const gp_Vec &v_start, - double t_start, double t_end, gp_Pnt &p_end, gp_Vec &v_end) const; - enum class Type { - SingleArc, - SplitCurve, - SingleLine - }; - Type calculateBiArcPoints(double t_start, const gp_Pnt& p0, gp_Vec v_start, - double t_end, const gp_Pnt& p4, gp_Vec v_end, - gp_Pnt& p1, gp_Pnt& p2, gp_Pnt& p3) const; - // If during assignment of weights (during the for loop iteratively setting the poles) all weights // become (temporarily) equal even though weights does not have equal values // OCCT will convert all the weights (the already assigned and those not yet assigned)