Files
SyncHome/trunk/ulp/pcb-gcode-3.6.0.4/source/pcb-file-utils.h

464 lines
8.6 KiB
C
Raw Normal View History

2023-03-09 10:24:21 +00:00
// -*- Mode: Eagle -*-
int m_line_number;
int LINE_NUMBER_INCREMENT = 10;
string g_preview;
void eol()
{
printf(EOL);
m_line_number += LINE_NUMBER_INCREMENT;
}
int out(string s)
{
int old_line_num;
string lines[];
int num;
int i;
string line;
old_line_num = m_line_number;
num = strsplit(lines, s, '\n');
for (i = 0; i < num; i++) {
line = lines[i];
if (strlen(line) > 0 && line != "\n" && line != "EOL") {
if (USE_LINE_NUMBERS) {
printf(LINE_NUMBER_FORMAT, m_line_number);
}
printf(line);
if (i < num - 1 || rightstr(s,1) == "\n") {
printf(EOL);
}
m_line_number = m_line_number + LINE_NUMBER_INCREMENT;
}
}
return old_line_num;
}
//
// Variables used to track the machine's current position and eliminate
// moves to the same coordinates.
//
real cur_x = -999.999;
real cur_y = -999.999;
real cur_z = -999.999;
void xy(real x, real y)
{
if (close(x, cur_x) && close(y, cur_y)) {
return;
}
if (COMPACT_GCODE == YES) {
if (! close(x, cur_x) && ! close(y, cur_y)) {
out(frr(MOVE_XY, x, y) + EOL);
cur_x = x;
cur_y = y;
return;
}
if (! close(x, cur_x)) {
out(fr(MOVE_X, x) + EOL);
cur_x = x;
cur_y = y;
return;
}
if (! close(y, cur_y)) {
out(fr(MOVE_Y, y) + EOL);
cur_y = y;
return;
}
}
if (! close(x, cur_x) || ! close(y, cur_y)) {
out(frr(MOVE_XY, x, y) + EOL);
cur_x = x;
cur_y = y;
}
}
//
// Output Feed commands.
//
void rate(real f)
{
out(fr(FR_FORMAT, f));
}
void fx(real x)
{
if (! close(x, cur_x)) {
out(fr(FEED_MOVE_X, x) + EOL);
cur_x = x;
}
}
void fy(real y)
{
if (! close(y, cur_y)) {
out(fr(FEED_MOVE_Y, y) + EOL);
cur_y = y;
}
}
void fz(real z)
{
if (! close(z, cur_z)) {
out(fr(FEED_MOVE_Z, z) + EOL);
cur_z = z;
}
}
// Since the next move may depend on the Z rate having been set
// in this routine, it just outputs the move as usual.
void fzr(real z, real f)
{
out( frr(FEED_MOVE_Z_WITH_RATE, z, f) + EOL);
cur_z = z;
}
void fxy(real x, real y)
{
if (! close(x, cur_x) || ! close(y, cur_y)) {
out( frr(FEED_MOVE_XY, x, y) + EOL);
cur_x = x;
cur_y = y;
}
}
// Since the next move may depend on the XY rate having been set
// in this routine, it just outputs the move as usual.
void fxyr(real x, real y, real f)
{
out( frrr(FEED_MOVE_XY_WITH_RATE, x, y, f) + EOL);
}
void fxyz(real x, real y, real z)
{
if (! close(x, cur_x) || ! close(y, cur_y) || ! close(z, cur_z)) {
out(frrr(FEED_MOVE_XYZ, x, y, z) + EOL);
cur_x = x;
cur_y = y;
cur_z = z;
}
}
//
// Output Rapid commands.
//
void rx(real x)
{
if (! close(x, cur_x)) {
out(fr(RAPID_MOVE_X, x) + EOL);
cur_x = x;
}
}
void ry(real y)
{
if (! close(y, cur_y)) {
out(fr(RAPID_MOVE_Y, y) + EOL);
cur_y = y;
}
}
void rz(real z)
{
if (! close(z, cur_z)) {
out(fr(RAPID_MOVE_Z, z) + EOL);
cur_z = z;
}
}
void rxy(real x, real y)
{
if (! close(x, cur_x) || ! close(y, cur_y)) {
out( frr(RAPID_MOVE_XY, x, y) + EOL);
cur_x = x;
cur_y = y;
}
}
void rxyz(real x, real y, real z)
{
if (! close(x, cur_x) || ! close(y, cur_y) || ! close(z, cur_z)) {
out(frrr(RAPID_MOVE_XYZ, x, y, z) + EOL);
cur_x = x;
cur_y = y;
cur_z = z;
}
}
void comm(string str)
{
if (strlen(str) > 0) {
out(COMMENT_BEGIN + str + COMMENT_END + EOL);
}
}
void output_file_heading()
{
if (NC_FILE_COMMENT_FROM_BOARD) {
comm(elided_path(argv[PROGRAM_NAME_ARG], 30));
comm("Copyright 2005 - 2012 by John Johnson");
comm("See readme.txt for licensing terms.");
board(B) {
comm("This file generated from the board:");
comm(elided_path(B.name, 30));
}
}
if (NC_FILE_COMMENT_FROM_BOARD || NC_FILE_COMMENT_DATE ||
NC_FILE_COMMENT_MACHINE_SETTINGS || NC_FILE_COMMENT_PCB_DEFAULTS_SETTINGS ||
g_debug_flag) {
comm("Current profile is " + elided_path(CURRENT_PROFILE[FILE_NAME], 30));
}
if (NC_FILE_COMMENT_DATE) {
comm("This file generated " + t2string(time()));
}
if (NC_FILE_COMMENT_MACHINE_SETTINGS) {
comm("Settings from pcb-machine.h");
comm(" Tool Size");
comm(fr(FORMAT, g_width));
comm("Z Axis Settings");
comm(" High Up Down Drill");
comm(fr(FORMAT, DEFAULT_Z_HIGH) + "\t" +
fr(FORMAT, DEFAULT_Z_UP) + "\t" +
fr(FORMAT, DEFAULT_Z_DOWN) + "\t" +
fr(FORMAT, DRILL_DEPTH));
comm(fr("spindle on time = %6.4f", SPINDLE_ON_TIME));
comm(fr("milling depth = %6.4f", MILLING_DEPTH));
comm(fr("text depth = %6.4f", TEXT_DEPTH));
comm(frrr("tool change at " + FORMAT + FORMAT + FORMAT,
TOOL_CHANGE_POS_X, TOOL_CHANGE_POS_Y, TOOL_CHANGE_POS_Z));
comm("feed rate xy = " + fr(FR_FORMAT, FEED_RATE));
comm("feed rate z = " + fr(FR_FORMAT, FEED_RATE_Z));
}
if (NC_FILE_COMMENT_PCB_DEFAULTS_SETTINGS) {
comm("Settings from pcb-defaults.h");
comm(fr("isolate min = %6.4f", ISO_MIN));
comm(fr("isolate max = %6.4f", ISO_MAX));
comm(fr("isolate step = %6.4f", ISO_STEP));
string tt;
sprintf(tt, "Generated %s%s%s%s%s%s",
(GENERATE_TOP_OUTLINES) ? "top outlines, " : "",
(GENERATE_TOP_DRILL) ? "top drill, " : "",
(GENERATE_TOP_FILL) ? "top fill, " : "",
(GENERATE_BOTTOM_OUTLINES) ? "bottom outlines, " : "",
(GENERATE_BOTTOM_DRILL) ? "bottom drill, " : "",
(GENERATE_BOTTOM_FILL) ? "bottom fill" : ""
);
comm(tt);
comm("Unit of measure: " + UNIT_OF_MEASURE);
}
}
//
// Writes the header for the output file.
//
// Params:
// none
// Returns:
// none
//
void begin_gcode(void)
{
out(get_mode());
out(ABSOLUTE_MODE);
rxy(X_HOME, Y_HOME);
out(fr(SPINDLE_ON, SPINDLE_ON_TIME));
}
//
// Write end of file commands.
//
// Params:
// none
// Return:
// none
//
void end_gcode(void)
{
rz(DEFAULT_Z_HIGH);
out(SPINDLE_OFF);
out(END_PROGRAM);
}
// Kinds (outline, drill, etc.)
void output_kind_begin()
{
if (USER_GCODE == NO)
return;
switch (g_phase) {
case PH_TOP_OUT_WRITE:
case PH_BOTTOM_OUT_WRITE:
out(OUTLINE_BEGIN[ALL]);
out(OUTLINE_BEGIN[g_side]);
break;
case PH_TOP_DRILL:
case PH_BOTTOM_DRILL:
out(DRILL_BEGIN[ALL]);
out(DRILL_BEGIN[g_side]);
break;
case PH_TOP_FILL_WRITE:
case PH_BOTTOM_FILL_WRITE:
out(FILL_BEGIN[ALL]);
out(FILL_BEGIN[g_side]);
break;
case PH_MILL:
out(MILL_BEGIN[ALL]);
out(MILL_BEGIN[g_side]);
break;
default:
dlgMessageBox("!Unknown g_phase " + int_to_string(g_phase)
+ " in output_kind_begin()");
}
}
void output_between_outline_passes()
{
if (USER_GCODE) {
out(OUTLINE_BETWEEN[ALL]);
out(OUTLINE_BETWEEN[g_side]);
}
}
void output_kind_end()
{
if (USER_GCODE == NO)
return;
switch (g_phase) {
case PH_TOP_OUT_WRITE:
case PH_BOTTOM_OUT_WRITE:
out(OUTLINE_END[g_side]);
out(OUTLINE_END[ALL]);
break;
case PH_TOP_DRILL:
case PH_BOTTOM_DRILL:
out(DRILL_END[g_side]);
out(DRILL_END[ALL]);
break;
case PH_TOP_FILL_WRITE:
case PH_BOTTOM_FILL_WRITE:
out(FILL_END[g_side]);
out(FILL_END[ALL]);
break;
case PH_MILL:
out(MILL_END[g_side]);
out(MILL_END[ALL]);
break;
default:
dlgMessageBox("!Unknown g_phase " + int_to_string(g_phase)
+ " in output_kind_end()");
}
}
// Tool changing
void output_tool_change_begin()
{
if (USER_GCODE) {
out(TOOL_CHANGE_BEGIN[ALL]);
out(TOOL_CHANGE_BEGIN[g_side]);
}
}
void output_tool_changed()
{
if (USER_GCODE) {
out(TOOL_CHANGED[g_side]);
out(TOOL_CHANGED[ALL]);
}
}
void output_tool_zero_begin()
{
if (USER_GCODE) {
out(TOOL_ZERO_BEGIN[ALL]);
out(TOOL_ZERO_BEGIN[g_side]);
}
}
void output_tool_zero_end()
{
if (USER_GCODE) {
out(TOOL_ZERO_END[g_side]);
out(TOOL_ZERO_END[ALL]);
}
}
void output_tool_change_end()
{
if (USER_GCODE) {
out(TOOL_CHANGE_END[g_side]);
out(TOOL_CHANGE_END[ALL]);
}
}
//
// Print file beginning headers and user-codes.
//
void output_file_preamble()
{
output_file_heading();
if (USER_GCODE) {
out(FILE_BEGIN[ALL]);
out(FILE_BEGIN[g_side]);
output_kind_begin();
}
}
//
// Print file closing text and user-codes.
//
void output_file_postamble()
{
if (USER_GCODE) {
output_kind_end();
out(FILE_END[g_side]);
out(FILE_END[ALL]);
}
}
void output_drill_first_hole(real drill_x, real drill_y, real depth)
{
string tt;
if (SIMPLE_DRILL_CODE) {
rxy(drill_x, drill_y);
fzr(depth, FEED_RATE_Z);
rz(DEFAULT_Z_UP);
}
else {
//"G82 X%fY%f Z%f F10.0 R0.1 #250\n",
sprintf(tt, DRILL_FIRST_HOLE, drill_x, drill_y,
depth, FEED_RATE_Z, DEFAULT_Z_UP,
DRILL_DWELL);
out(tt);
}
}
void output_drill_hole(real drill_x, real drill_y, real depth)
{
if (SIMPLE_DRILL_CODE) {
rxy(drill_x, drill_y);
fzr(depth, FEED_RATE_Z);
rz(DEFAULT_Z_UP);
}
else {
out(frr(DRILL_HOLE, drill_x, drill_y));
}
}