/* $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 . */ #include #ifdef _OPENMP #include #endif #include "millingcutter.hpp" #include "point.hpp" #include "triangle.hpp" #include "fiberpushcutter.hpp" namespace ocl { //******** ********************** */ FiberPushCutter::FiberPushCutter() { nCalls = 0; cutter = NULL; bucketSize = 1; root = new KDTree(); } FiberPushCutter::~FiberPushCutter() { delete root; } void FiberPushCutter::setSTL(const STLSurf &s) { surf = &s; // std::cout << "BPC::setSTL() Building kd-tree... bucketSize=" << bucketSize << ".."; root->setBucketSize( bucketSize ); if (x_direction) root->setYZDimensions(); else if (y_direction) root->setXZDimensions(); else { std::cout << " ERROR: setXDirection() or setYDirection() must be called before setSTL() \n"; assert(0); } // std::cout << "BPC::setSTL() root->build()"; root->build(s.tris); // std::cout << " done.\n"; } void FiberPushCutter::pushCutter1(Fiber& f) { nCalls = 0; BOOST_FOREACH( const Triangle& t, surf->tris) {// test against all triangles in s Interval i; cutter->pushCutter(f,i,t); f.addInterval(i); ++nCalls; } } void FiberPushCutter::pushCutter2(Fiber& f) { std::list::iterator it,it_end; // for looping over found triangles Interval* i; std::list* tris; CLPoint cl; if ( x_direction ) { cl.x=0; cl.y=f.p1.y; cl.z=f.p1.z; } else if (y_direction ) { cl.x=f.p1.x; cl.y=0; cl.z=f.p1.z; } tris = root->search_cutter_overlap(cutter, &cl); it_end = tris->end(); for ( it=tris->begin() ; it!=it_end ; ++it) { i = new Interval(); cutter->pushCutter(f,*i,*it); f.addInterval(*i); ++nCalls; delete i; } delete( tris ); } }// end namespace // end file fiberpushcutter.cpp