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

247 lines
4.8 KiB
C
Raw Normal View History

2023-03-09 10:24:21 +00:00
// -*- Mode: Eagle -*-
//
// Constants and enums for pcb-gcode.ulp.
//
// (Actually, they should be consts and typedefs,
// but Eagle doesn't support that.)
//
//
// No users options here.
//
#include "string.h"
string RELEASE = "NOT SET";
string REVISION = "000";
string g_path = ".";
string BOARD_NAME;
board(B) { BOARD_NAME = B.name; }
enum {
U_MICRONS = 0,
U_MILLIMETERS = 1,
U_MILS = 2,
U_INCHES = 3,
U_INTERNALS = 4
};
enum {
OUTPUT_MICRONS = 0,
OUTPUT_MILLIMETERS = 1,
OUTPUT_MILS = 2,
OUTPUT_INCHES = 3,
OUTPUT_INTERNALS = 4
};
enum { NO = 0, YES = 1 };
enum { false = 0, true = 1 };
enum { TASK_INVALID, TASK_OUTLINES, TASK_FILL };
enum { ST_INVALID,
ST_START_LINE, ST_CONTINUE_LINE, ST_END_LINE,
ST_DRILL,
ST_FILL,
ST_ARC_BEGIN,
ST_ARC_END};
enum { TOP = 0, BOTTOM = 1, MILL = 2, TEXT = 3, ALL = 4 };
int PROGRAM_NAME_ARG = 0;
int FILENAME_ARG = 1;
int WIDTH_ARG = 2;
int ISO_ARG = 3;
int PASS_ARG = 4;
int PHASE_ARG = 5;
real COORD_TOLERANCE = 0.0001;
string OUTLINES_SIGNAL_NAME = "_OUTLINES_";
int TOP_LAYER = 1;
int BOTTOM_LAYER = 16;
int MILL_LAYER = 46;
int TEXT_LAYER = 46; // same as MILL_LAYER
int OUTLINES = 1;
int FILL = 2;
int MILL_BOARD = 3;
int MILL_TEXT = 4;
enum {
PH_INVALID = 0,
PH_TOP_OUT_GEN = 1,
PH_TOP_OUT_WRITE = 2,
PH_TOP_FILL_GEN = 3,
PH_TOP_FILL_WRITE = 4,
PH_BOTTOM_OUT_GEN = 5,
PH_BOTTOM_OUT_WRITE = 6,
PH_BOTTOM_FILL_GEN = 7,
PH_BOTTOM_FILL_WRITE = 8,
PH_TOP_DRILL = 9,
PH_BOTTOM_DRILL = 10,
PH_MILL = 11,
PH_TEXT = 12,
PH_LAST_PHASE = 13
};
string PHASE_NAME[] = {
"invalid",
"Gen_Top_Outlines", "Write_Top_Outlines",
"Gen_Top_Fill", "Write_Top_Fill",
"Gen_Bottom_Outlines", "Write_Bottom_Outlines",
"Gen_Bottom_Fill", "Write_Bottom_Fill",
"Top_Drills", "Bottom_Drills",
"Milling",
"Text",
"Finished!"
};
string get_phase_name(int phase)
{
return PHASE_NAME[phase];
}
// Used to convert a numeric state into a text name for that state.
string state_text[] = {
"ST_START_LINE",
"ST_CONTINUE_LINE",
"ST_END_LINE",
"ST_DRILL",
"ST_FILL"
};
real ROUND_FACTOR = 1000;
real BORDER_SIZE = 0.001;
int DRILL_SIZE = 0;
int DRILL_X = 1;
int DRILL_Y = 2;
string UNIT_OF_MEASURE = "not set";
real g_width = 0.01;
int g_side = TOP;
// Which phase of the process we're working on.
int g_phase;
string IS_SETUP_FILE_NAME = "pcb_gcode_is_setup";
// Current profile array and indices for it.
string CURRENT_PROFILE[];
enum {
FILE_NAME = 0,
AUTHOR = 1,
DESCRIPTION = 2
}
string get_current_profile()
{
string files[];
int num_files = fileglob(files, g_path + "/" + IS_SETUP_FILE_NAME);
if (num_files > 0) {
fileread(CURRENT_PROFILE, g_path + "/" + IS_SETUP_FILE_NAME);
}
else {
CURRENT_PROFILE[FILE_NAME] = "NONE";
CURRENT_PROFILE[AUTHOR] = "NONE";
CURRENT_PROFILE[DESCRIPTION] = "NONE";
return "NONE";
}
return CURRENT_PROFILE[DESCRIPTION];
}
void set_current_profile(string profile_fields)
{
strsplit(CURRENT_PROFILE, profile_fields, '\t');
output(g_path + "/" + IS_SETUP_FILE_NAME) {
printf("%s\n", CURRENT_PROFILE[FILE_NAME]);
printf("%s\n", CURRENT_PROFILE[AUTHOR]);
printf("%s\n", CURRENT_PROFILE[DESCRIPTION]);
}
}
int program_is_setup()
{
if (get_current_profile() == "NONE")
return NO;
return YES;
}
// Find the path where all our files are located. It must be one of the directories in the
// Options | Directories | User Language Programs settings.
void get_path()
{
int index = 0;
string last_g_path;
board(B) g_path = filedir(B.name);
last_g_path = g_path;
while (g_path > "") {
g_path = remove_last_dir(g_path);
if (filetime(g_path + "/source/pcb-gcode.h")) {
return;
}
if (last_g_path == g_path) {
break;
}
last_g_path = g_path;
}
while (path_ulp[index] != "" && index < 10) {
if(filetime(path_ulp[index] + "/source/pcb-gcode.h")) {
g_path = path_ulp[index];
return;
}
index++;
}
}
get_path();
if (g_path == "") {
dlgMessageBox("There is a problem with your installation of pcb-gcode.\n" +
"You probably need to add the path to pcb-gcode's folder in " +
"EAGLE's Control Panel | Options | Directories | User Language Programs.\n"
"Please see docs/readme.html");
exit(-1);
}
else {
// dlgMessageBox("g_path = " + g_path);
}
// This reads the current profile into CURRENT_PROFILE, if available.
get_current_profile();
// I know, I know. No way around it that I see right now.
string g_real_to_string_string = "";
string real_to_string(real n)
{
sprintf(g_real_to_string_string, "%f", n);
return g_real_to_string_string;
}
string g_int_to_string_string = "";
string int_to_string(int n)
{
sprintf(g_int_to_string_string, "%d", n);
return g_int_to_string_string;
}
// Used to show debugging information.
string g_debug;