/* $Id$ * * Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com). * * This file is part of OpenCAMlib * (see https://github.com/aewallin/opencamlib). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef COMPOSITE_CUTTER_H #define COMPOSITE_CUTTER_H #include #include #include #include "millingcutter.hpp" namespace ocl { /// \brief a CompositeCutter is composed one or more MillingCutters /// the cutters are stored in a vector *cutter* and their axial offsets /// from eachother in *zoffset*. The different cutters apply in different /// radial regions. cutter[0] from r=0 to r=radius[0] after that /// cutter[1] from r=radius[0] to r=radius[1] and so on. class CompositeCutter : public MillingCutter { public: /// create an empty CompositeCutter CompositeCutter(); /// add a MillingCutter to this CompositeCutter /// the cutter is valid from the previous radius out to the given radius /// and its axial offset is given by zoffset void addCutter(MillingCutter& c, double radius, double height, double zoff); MillingCutter* offsetCutter(double d) const; /// CompositeCutter can not use the base-class facetDrop, instead we here /// call facetDrop() on each cutter in turn, and pick the valid CC/CL point /// as the result for the CompositeCutter bool facetDrop(CLPoint &cl, const Triangle &t) const; /// call edgeDrop on each cutter and pick the correct (highest valid CL-point) result bool edgeDrop(CLPoint &cl, const Triangle &t) const; std::string str() const; protected: bool vertexPush(const Fiber& f, Interval& i, const Triangle& t) const; bool facetPush(const Fiber& f, Interval& i, const Triangle& t) const; bool edgePush(const Fiber& f, Interval& i, const Triangle& t) const; /// convert input radius r to cutter index unsigned int radius_to_index(double r) const; unsigned int height_to_index(double h) const; /// return true if radius=r belongs to cutter n bool validRadius(unsigned int n, double r) const; bool validHeight(unsigned int n, double h) const; double height(double r) const; double width(double h) const; /// return true if cl.cc is within the radial range of cutter n /// for cutter n the valid radial distance from cl is /// between radiusvec[n-1] and radiusvec[n] bool ccValidRadius(unsigned int n, CLPoint& cl) const; bool ccValidHeight(unsigned int n, CCPoint& cc, const Fiber& f) const; /// vector that holds the radiuses of the different cutters. /// cutter[0] is valid from r=0 to r=radiusvec[0] /// cutter[1] is valid from r=radiusvec[0] to r=radiusvec[1] /// etc std::vector radiusvec; // vector of radiuses /// vector for cutter heights /// cutter[0] is valid in h = [0, heihgtvec[0] ] /// cutter[1] is valid in h = [ heightvec[0], heihgtvec[1] ] std::vector heightvec; // vector of heights /// vector of the axial offsets std::vector zoffset; // vector of z-offset values for the cutters /// vector of cutters in this CompositeCutter std::vector cutter; // vector of pointers to cutters }; /// a composite cutter for testing, consisting only of a cylindrical cutter class CompCylCutter : public CompositeCutter { public: CompCylCutter() {} CompCylCutter(double diam, double length); }; /// for testing, a single ballcutter class CompBallCutter : public CompositeCutter { public: CompBallCutter() {} CompBallCutter(double diam, double length); }; /// \brief CompositeCutter with a cylindrical/flat central part of diameter diam1 /// and a conical outer part sloping at angle, with a max diameter diam2 class CylConeCutter : public CompositeCutter { public: CylConeCutter() {}; // dummy, required(?) by python wrapper /// create cylconecutter CylConeCutter(double diam1, double diam2, double angle); }; /// \brief CompositeCutter with a spherical central part of diameter diam1 /// and a conical outer part sloping at angle, with a max diameter diam2 /// the cone is positioned so that the tangent of the cone matches the tangent of the sphere class BallConeCutter : public CompositeCutter { public: BallConeCutter() {}; // dummy, required(?) by python wrapper /// create ballconecutter BallConeCutter(double diam1, double diam2, double angle); }; /// \brief CompositeCutter with a toroidal central part of diameter diam1 /// and corner radius radius1 /// The outer part is conical sloping at angle, with a max diameter diam2 /// the cone is positioned so that the tangent of the cone matches the tangent of the torus class BullConeCutter : public CompositeCutter { public: BullConeCutter() {}; // dummy, required(?) by python wrapper /// create bullconecutter BullConeCutter(double diam1, double radius1, double diam2, double angle); }; /// \brief CompositeCutter with a conical central part with diam1/angle1 /// and a conical outer part with diam2/angle2 /// we assume angle2 < angle1 and diam2 > diam1. class ConeConeCutter : public CompositeCutter { public: ConeConeCutter() {}; // dummy, required(?) by python wrapper /// create cone-cone cutter with lower cone (diam1,angle1) and upper cone (diam2,angle2) /// we assume angle2 < angle1 and diam2 > diam1. ConeConeCutter(double diam1, double angle1, double diam2, double angle2); }; } // end namespace #endif