rendered paste body/* Copyright 2008 Chris Radek
License GPL2 */
#include "realize.h"
Realize::Realize() {
printf("g20g90\n");
}
Realize::~Realize() {
printf("g0z%g\nm2\n", safety);
}
#define SQ(a) ((a)*(a))
#define hypot3(a,b,c) (sqrt(SQ(a)+SQ(b)+SQ(c)))
void Realize::addLayer(const DL_LayerData& d) {
printf(";layer %s flags 0x%02x\n", d.name.c_str(), d.flags);
}
void Realize::addPolyline(const DL_PolylineData& d) {
printf(";start polyline vertices %d flags 0x%02x\n",
d.number, d.flags);
// this makes a runtime error: *** glibc detected *** corrupted double-linked list: 0x08065038 *** Aborted
// closed = d.flags;
down = 0;
// save close point
}
void Realize::addVertex(const DL_VertexData& d) {
printf(";vertex %g,%g,%g bulge %g\n", d.x,d.y,d.z, d.bulge);
if(down)
cutto(d.x, d.y, d.bulge);
else
startcut(d.x, d.y, d.z);
down=1;
}
void Realize::endEntity(void) {
printf(";end entity\n");
// handle close point
}
void Realize::addArc(const DL_ArcData& d) {
printf(";arc center %g,%g,%g radius %g startangle %g endangle %g\n",
d.cx,d.cy,d.cz, d.radius, d.angle1, d.angle2);
}
void Realize::addCircle(const DL_CircleData& d) {
double y = d.cy + d.radius;
printf(";circle center %g,%g,%g radius %g\n", d.cx,d.cy,d.cz, d.radius);
printf("g0 z%g\ng0 x%g y%g\ng0 z%g\n", safety, d.cx, y, d.cz);
printf("g3 x%g y%g i0 j%g f%g\n", d.cx, y, d.radius, hfeed);
prev_x = d.cx;
prev_y = y;
}
void Realize::addLine(const DL_LineData& d) {
// double l = hypot3(d.x2-d.x1,d.y2-d.y1,d.z2-d.z1);
printf(";line %g,%g,%g to %g,%g,%g\n",
d.x1,d.y1,d.z1,
d.x2,d.y2,d.z2);
}
void Realize::addText(const DL_TextData& d) {
printf(";text \"%s\"\n", d.text.c_str());
}
void Realize::toolchange(string layer, string description) {
printf("m5\ng0 z1\nt%s m6 ;%s\ns1000 m3\n", layer.c_str(), description.c_str());
}
string Realize::getvalue(string layer, string key, string def) {
return "whatever";
}
double Realize::getvalue(string layer, string key, double def) {
return 13.0;
}
void Realize::startcut(double x, double y, double depth) {
printf("g0 z%g\n", safety);
printf("g0 x%g y%g\n", x, y);
printf("g1 z%g f%g\n", depth, vfeed);
}
void Realize::cutto(double x, double y, double bulge) {
if(bulge) {
double cot = 0.5 * ((1.0 / bulge) - bulge);
double cx = ((prev_x + x) - (cot * (y - prev_y))) / 2.0;
double cy = ((prev_y + y) + (cot * (x - prev_x))) / 2.0;
// double rad = hypot(cy - prev_y, cx - prev_y);
string arcdir = (bulge < 0.0) ? "g2" : "g3";
double i = cx - prev_x;
double j = cy - prev_y;
printf("%s x%g y%g i%g j%g f%g\n", arcdir.c_str(), x, y, i, j, hfeed);
} else {
printf("g1 x%g y%g f%g\n", x, y, hfeed);
}
prev_x = x;
prev_y = y;
}