void drvGCODE::show_path() { Point currentPoint(0.0f, 0.0f); const Point firstPoint = pathElement(0).getPoint(0); for (unsigned int n = 0; n < numberOfElementsInPath(); n++) { const basedrawingelement & elem = pathElement(n); switch (elem.getType()) { case moveto:{ const Point & p = elem.getPoint(0); outf << "\nG00 Z#1000\n"; outf << "G00 X[#1003*" << p.x_ << "] Y[#1004*" << p.y_ << "]\n"; outf << "G01 Z#1002\n"; currentPoint = p; } break; case lineto:{ const Point & p = elem.getPoint(0); outf << "G01 X[#1003*" << p.x_ << "] Y[#1004*" << p.y_ << "]\n"; currentPoint = p; } break; case closepath: outf << "G01 X[#1003*" << firstPoint.x_ << "] Y[#1004*" << firstPoint.y_ << "]\n"; break; case curveto:{ const Point & cp1 = elem.getPoint(0); const Point & cp2 = elem.getPoint(1); const Point & ep = elem.getPoint(2); // curve is approximated with a variable number or linear segments. // fitpoints should be somewhere between 5 and 50 for reasonable page size plots // we compute distance between current point and endpoint and use that to help // pick the number of segments to use. const float dist = (float) pythagoras((float)(ep.x_ - currentPoint.x_),(float)(ep.y_ - currentPoint.y_)); unsigned int fitpoints = (unsigned int)(dist / 10.0); if ( fitpoints < 5 ) fitpoints = 5; if ( fitpoints > 50 ) fitpoints = 50; for (unsigned int s = 1; s < fitpoints; s++) { const float t = 1.0f * s / (fitpoints - 1); const Point pt = PointOnBezier(t, currentPoint, cp1, cp2, ep); outf << " G01 X[#1003*" << pt.x_ << "] Y[#1004*" << pt.y_ << "]\n"; } currentPoint = ep; } break; default: errf << "\t\tFatal: unexpected case in drvgcode " << endl; abort(); break; } } }
// print edge points void drvFIG::print_spline_coords1() { // IJMP - need curr_point Point P1; int j = 0; unsigned int last = numberOfElementsInPath() - 1; for (unsigned int n = 0; n <= last; n++) { if (j == 0) { buffer << "\t"; } const basedrawingelement & elem = pathElement(n); switch (elem.getType()) { case moveto: case lineto: { const Point & p = elem.getPoint(0); prpoint(buffer, p, (n != last)); P1 = p; } j++; if (j == 5) { j = 0; buffer << "\n"; } break; case curveto: { // IJMP - change to quintic spline // put all points, middle points will have control value 1 // IJMP = do bezier fit const Point & P2 = elem.getPoint(0); const Point & P3 = elem.getPoint(1); const Point & P4 = elem.getPoint(2); for (int cp = 1; cp <= 5; cp++) { const Point p = PointOnBezier((cp * 0.2f), P1, P2, P3, P4); // p.x_ = bezpnt((cp * 0.2f), P1.x_, P2.x_, P3.x_, P4.x_); // p.y_ = bezpnt((cp * 0.2f), P1.y_, P2.y_, P3.y_, P4.y_); prpoint(buffer, p, !((n == last) && (cp == 5))); j++; if (j == 5) { j = 0; buffer << "\n"; } // if ((j == 0) && (cp != 5) && ( n+1 != (numberOfElementsInPath()))) { buffer << "\t"; } if ((j == 0) && (n != (numberOfElementsInPath()))) { buffer << "\t"; } } P1 = P4; } break; case closepath: { const Point & p = pathElement(0).getPoint(0); P1 = p; prpoint(buffer, p, (n != last)); } j++; if (j == 5) { j = 0; buffer << "\n"; } break; default: errf << "\t\tFatal: unexpected case in drvfig " << endl; abort(); break; } } if (j != 0) { buffer << "\n"; } buffer << "\t"; }