// SPDX-License-Identifier: BSD-3-Clause // Area.h // Copyright 2011, Dan Heeks // This program is released under the BSD license. See the file COPYING for details. // repository now moved to github #ifndef AREA_HEADER #define AREA_HEADER #include "Curve.h" #include "clipper.hpp" enum PocketMode { SpiralPocketMode, ZigZagPocketMode, SingleOffsetPocketMode, ZigZagThenSingleOffsetPocketMode, }; struct CAreaPocketParams { double tool_radius; double extra_offset; double stepover; bool from_center; PocketMode mode; double zig_angle; bool only_cut_first_offset; CAreaPocketParams( double Tool_radius, double Extra_offset, double Stepover, bool From_center, PocketMode Mode, double Zig_angle ) { tool_radius = Tool_radius; extra_offset = Extra_offset; stepover = Stepover; from_center = From_center; mode = Mode; zig_angle = Zig_angle; only_cut_first_offset = false; } }; class CArea { public: std::list m_curves; static double m_accuracy; static double m_units; // 1.0 for mm, 25.4 for inches. All points are multiplied by this before // going to the engine static bool m_clipper_simple; static double m_clipper_clean_distance; static bool m_fit_arcs; static int m_min_arc_points; static int m_max_arc_points; static double m_processing_done; // 0.0 to 100.0, set inside MakeOnePocketCurve static double m_single_area_processing_length; static double m_after_MakeOffsets_length; static double m_MakeOffsets_increment; static double m_split_processing_length; static bool m_set_processing_length_in_split; static bool m_please_abort; // the user sets this from another thread, to tell // MakeOnePocketCurve to finish with no result. static double m_clipper_scale; void append(const CCurve& curve); void move(CCurve&& curve); void Subtract(const CArea& a2); void Intersect(const CArea& a2); void Union(const CArea& a2); static CArea UniteCurves(std::list& curves); void Xor(const CArea& a2); void Offset(double inwards_value); void OffsetWithClipper( double offset, ClipperLib::JoinType joinType = ClipperLib::jtRound, ClipperLib::EndType endType = ClipperLib::etOpenRound, double miterLimit = 5.0, double roundPrecision = 0.0 ); void Thicken(double value); void FitArcs(); unsigned int num_curves() { return static_cast(m_curves.size()); } Point NearestPoint(const Point& p) const; void GetBox(CBox2D& box); void Reorder(); void MakePocketToolpath(std::list& toolpath, const CAreaPocketParams& params) const; void SplitAndMakePocketToolpath(std::list& toolpath, const CAreaPocketParams& params) const; void MakeOnePocketCurve(std::list& curve_list, const CAreaPocketParams& params) const; static bool HolesLinked(); void Split(std::list& m_areas) const; double GetArea(bool always_add = false) const; void SpanIntersections(const Span& span, std::list& pts) const; void CurveIntersections(const CCurve& curve, std::list& pts) const; void InsideCurves(const CCurve& curve, std::list& curves_inside) const; void ChangeStartToNearest(const Point* pstart = NULL, double min_dist = 1.0); // Avoid outside direct accessing static member variable because of Windows DLL issue #define CAREA_PARAM_DECLARE(_type, _name) \ static _type get_##_name(); \ static void set_##_name(_type _name); CAREA_PARAM_DECLARE(double, tolerance) CAREA_PARAM_DECLARE(bool, fit_arcs) CAREA_PARAM_DECLARE(bool, clipper_simple) CAREA_PARAM_DECLARE(double, clipper_clean_distance) CAREA_PARAM_DECLARE(double, accuracy) CAREA_PARAM_DECLARE(double, units) CAREA_PARAM_DECLARE(short, min_arc_points) CAREA_PARAM_DECLARE(short, max_arc_points) CAREA_PARAM_DECLARE(double, clipper_scale) // Following functions is add to operate on possible open curves void PopulateClipper(ClipperLib::Clipper& c, ClipperLib::PolyType type) const; void Clip( ClipperLib::ClipType op, const CArea* a, ClipperLib::PolyFillType subjFillType = ClipperLib::pftEvenOdd, ClipperLib::PolyFillType clipFillType = ClipperLib::pftEvenOdd ); }; enum eOverlapType { eOutside, eInside, eSiblings, eCrossing, }; eOverlapType GetOverlapType(const CCurve& c1, const CCurve& c2); eOverlapType GetOverlapType(const CArea& a1, const CArea& a2); bool IsInside(const Point& p, const CCurve& c); bool IsInside(const Point& p, const CArea& a); #endif // #define AREA_HEADER