// -*- 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;