/* $Id$ * * Copyright (c) 2010 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 OP_H #define OP_H #include #include #include #include "point.hpp" #include "fiber.hpp" #include "kdtree.hpp" namespace ocl { class STLSurf; class Triangle; class MillingCutter; /// \brief base-class for low-level cam algorithms /// /// base-class for cam algorithms class Operation { public: Operation() {} virtual ~Operation() { //std::cout << "~Operation()\n"; } /// set the STL-surface and build kd-tree virtual void setSTL(const STLSurf& s) { surf = &s; BOOST_FOREACH(Operation* op, subOp) { op->setSTL(s); } } /// set the MillingCutter to use virtual void setCutter(const MillingCutter* c) { cutter = c; BOOST_FOREACH(Operation* op, subOp) { op->setCutter(cutter); } } /// set number of OpenMP threads. Defaults to OpenMP::omp_get_num_procs() void setThreads(unsigned int n) { nthreads = n; BOOST_FOREACH(Operation* op, subOp) { op->setThreads(nthreads); } } /// return number of OpenMP threads int getThreads() const {return nthreads;} /// return the kd-tree bucket-size int getBucketSize() const {return bucketSize;} /// set the kd-tree bucket-size void setBucketSize(unsigned int s) { bucketSize = s; BOOST_FOREACH(Operation* op, subOp) { op->setBucketSize(bucketSize); } } /// return number of low-level calls int getCalls() const {return nCalls;} /// set the sampling interval for this Operation and all sub-operations virtual void setSampling(double s) { sampling=s; BOOST_FOREACH(Operation* op, subOp) { op->setSampling(sampling); } } /// return the sampling interval virtual double getSampling() {return sampling;} /// run the algorithm virtual void run() = 0; /// run algorithm on a single input CLPoint virtual void run(CLPoint& cl) {assert(0);} /// run push-cutter type algorithm on input Fiber virtual void run(Fiber& f) {assert(0);} virtual void reset() {} /// return CL-points virtual std::vector getCLPoints() { std::vector* clv = new std::vector(); return *clv; } virtual void clearCLPoints() {} /// add an input CLPoint to this Operation virtual void appendPoint(CLPoint& p) {} /// used by batchpushcutter virtual void setXDirection() {} /// used by batchpushcutter virtual void setYDirection() {} /// add a fiber input to a push-cutter type operation virtual void appendFiber( Fiber& f ) {} /// return the result of a push-cutter type operation virtual std::vector* getFibers() const {return 0;} protected: /// sampling interval double sampling; /// how many low-level calls were made int nCalls; /// size of bucket-node in KD-tree unsigned int bucketSize; /// the MillingCutter used const MillingCutter* cutter; /// the STLSurf which we test against. const STLSurf* surf; /// root of a kd-tree KDTree* root; /// number of threads to use unsigned int nthreads; /// sub-operations, if any, of this operation std::vector subOp; }; } // end namespace #endif // end operation.h