/* $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
#include
#include
#include
#include "cylcutter.hpp"
#include "bullcutter.hpp" // for offsetCutter()
#include "numeric.hpp"
namespace ocl
{
CylCutter::CylCutter() {
// std::cout << " usage: CylCutter( double diameter, double length ) \n";
}
CylCutter::CylCutter(double d, double l) {
diameter= d; assert( d > 0.0);
radius= d/2.0;
length = l; assert( l > 0.0 );
xy_normal_length = radius;
normal_length = 0.0;
center_height = 0.0;
}
// drop-cutter vertexDrop is handled by the base-class method in MillingCutter
// drop-cutter facetDrop is handled by the base-class method in MillingCutter
// we handle the edge-drop here.
CC_CLZ_Pair CylCutter::singleEdgeDropCanonical(const Point& u1, const Point& u2) const {
// along the x-axis the cc-point is at x-coord s or -s:
double s = sqrt( square( radius ) - square( u1.y ) );
Point cc1( s, u1.y, 0);
Point cc2( -s, u1.y, 0);
cc1.z_projectOntoEdge(u1,u2);
cc2.z_projectOntoEdge(u1,u2);
// pick the higher one
double cc_u;
double cl_z;
if (cc1.z > cc2.z) {
cc_u = cc1.x;
cl_z = cc1.z;
} else {
cc_u = cc2.x;
cl_z = cc2.z;
}
return CC_CLZ_Pair( cc_u, cl_z);
}
// general purpose vertexPush, delegates to this->width(h)
bool CylCutter::vertexPush(const Fiber& f, Interval& i, const Triangle& t) const {
bool result = false;
BOOST_FOREACH( const Point& p, t.p) {
if (this->singleVertexPush(f,i,p, VERTEX) )
result = true;
}
Point p1, p2;
if ( t.zslice_verts(p1, p2, f.p1.z) ) {
p1.z = f.p1.z; // z-coord should be very close to f.p1.z, but set it exactly anyway.
p2.z = f.p1.z;
if ( this->singleVertexPush(f,i,p1, VERTEX_CYL) )
result = true;
if (this->singleVertexPush(f,i,p2, VERTEX_CYL))
result = true;
}
return result;
}
std::string CylCutter::str() const {
std::ostringstream o;
o << *this;
return o.str();
}
std::ostream& operator<<(std::ostream &stream, CylCutter c) {
stream << "CylCutter (d=" << c.diameter << ", L=" << c.length << ")";
return stream;
}
} // end namespace
// end file cylcutter.cpp