All pastes #921552 Raw Copy code Copy link Edit

Stuff

public unlisted text v1 · immutable
#921552 ·published 2008-02-28 03:32 UTC
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;
}