📄 cam2print.ulp
字号:
#usage "<b>Convert a CAM job to a PRINT command</b>\n"
"<p>"
"Usage: RUN cam2print [ <i>pagelimit</i> [ <i>filename</i> ]]"
"<p>"
"Tip: Assign a funktion key with"
"<p>"
"<tt>ASSIGN Shift+Ctrl+Alt+P 'run cam2print.ulp;';</tt>"
"<p>"
"or"
"<p>"
"<tt>ASSIGN Shift+Ctrl+Alt+P 'run cam2print.ulp 0 myjob.cam;';</tt>"
"<p>"
"<author>Author: support@cadsoft.de</author>"
// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED
/* 24.10.2003 add "SET DISPLAY_MODE REAL;\n" on script end : support@cadsoft.de (az) */
// CAM-Job token
string tok_job = "[CAM Processor Job]";
string tok_Descrition = "Description=";
string description;
string descriptionLine[];
int descrCnt;
string tok_Section = "Section=";
string tok_Sec_n = "[Sec_";
string section[];
string tok_Name = "Name=";
string sec_Name[];
string tok_Prompt = "Prompt=";
string sec_Prompt[];
string tok_Device = "Device=";
string sec_Device[];
string tok_Wheel = "Wheel=";
string sec_Wheel[];
string tok_Rack = "Rack=";
string sec_Rack[];
string tok_Scale = "Scale=";
real sec_Scale[];
string tok_Out_put = "Output=";
string sec_Out_put[];
string tok_Flags = "Flags=";
string sec_Flags[];
int mirror[];
int rotate[];
int upside[];
int poscoord[];
int quickplot[];
int optimize[];
int fillpads[];
int pageLimit[];
string tok_Emulate = "Emulate=";
string sec_Emulate[];
string tok_Offset = "Offset=";
string sec_Offset[];
real offset_x[];
real offset_y[];
string tok_Sheet = "Sheet=";
int sec_Sheet[];
int sheetprint = 3; // 0 = All, 1 = From To, 2 = This section defined, 3 = Actual
int sheetprint_from[];
int sheetprint_to[];
string tok_Tolerance = "Tolerance=";
string sec_Tolerance[];
string tolerance0[];
string tolerance1[];
string tolerance2[];
string tolerance3[];
string tolerance4[];
string tolerance5[];
string tok_Pen = "Pen";
string sec_Pen[];
string tok_Page = "Page=";
string sec_Page[];
real page_Height[];
real page_Width[];
string tok_Layers = "Layers=";
string sec_Layers[];
string sec_usedlayer[];
string tok_Colors = "Colors=";
string sec_Colors[];
int solid[];
int black[];
string actualsheet;
string lines[];
int nLines;
string s;
string nu;
int sx = 0;
int lVisible[];
int useLayer[];
string lNames[] = { " " };
int lastsheet = 0;
string lastSH;
/*
path_lbr[] Libraries
path_dru[] Design Rules
path_ulp[] User Language Programs
path_scr[] Scripts
path_cam[] CAM Jobs
path_epf[] Projects
*/
string help = usage+ "<qt><b>This ULP converts a CAM Job to a PRINT Script!</b><p>\n" +
"If the layer list is empty after starting this ULP,\n" +
"you did not start it from the proper editor window (SCH/BRD).<p>\n" +
"CAM jobs for the layout have to be started from the Layout Editor, " +
"jobs for a schematic from the Schematic Editor.<p>\n" +
"CAM Jobs can be edited and save only by the CAM processor.</qt>";
string ulp_path ;
char bkslash = '/';
int pos = strrchr(argv[0], bkslash);
if (pos >= 0) {
ulp_path = strsub(argv[0], 0, pos + 1);
}
string PageLimit_all = argv[1];
string cmd = "";
int test = 0;
int Result = 0;
// File handling
int n = 0;
string text;
string CAMfileName;
int nBytes;
int align;
string CAMfile;
string Eagle ="<img src=" + ulp_path + "eagle.bmp>";
// *** functions ***
void editsec(int sec) {
string num;
sprintf(num, "%d", sec);
dlgDialog("Section Editor") {
dlgLabel("Section " + num);
dlgHBoxLayout {
dlgPushButton("+&OK") dlgAccept();
dlgPushButton("-&Cancel") dlgReject();
dlgStretch(1);
}
};
return;
}
void commandPrint(int sectab) {
cmd += "PRINT ";
sprintf(s, " %.2f -%d", sec_Scale[sectab], pageLimit[sectab]);
cmd += s;
if(black[sectab]) cmd += " BLACK";
else cmd += " -BLACK";
if(solid[sectab]) cmd += " SOLID";
else cmd += " -SOLID";
if(mirror[sectab]) cmd += " MIRROR";
else cmd += " -MIRROR";
if(rotate[sectab]) cmd += " ROTATE";
else cmd += " -ROTATE";
if(upside[sectab]) cmd += " UPSIDEDOWN";
else cmd += " -UPSIDEDOWN";
/*
if(poscoord[sectab]) ; // not use to print
if(quickplot[sectab]); // not use to print
if(optimize[sectab]); // not use to print
*/
cmd += ";\n";
return;
}
void viewDescript(void) {
string ds;
for (int n = 1 ; n < descrCnt; n++ ) {
if (ds[0] = ' ') {
ds = descriptionLine[n];
ds[0] = ' ';
descriptionLine[n] = ds;
}
}
descriptionLine[0] = "<qt>" + descriptionLine[0] + "</qt>";
ds = strjoin(descriptionLine, '\n');
dlgMessageBox(ds, "OK");
return;
}
void readCam(void) {
sx = 0;
for (int sn = 0; sn < nLines; sn++) {
if( strstr(lines[sn], tok_Descrition) == 0) {
description = strsub(lines[sn], strlen(tok_Descrition) + 1, strlen(lines[sn]) - (strlen(tok_Descrition)+2) );
descrCnt = strsplit (descriptionLine, description, '\\');
}
if( strstr(lines[sn], tok_Sec_n) == 0) {
sx = strtol( strsub(lines[sn], strstr(lines[sn], "_") + 1) );
sprintf(nu, "%d", sx);
}
if( strstr(lines[sn], tok_Name ) == 0) {;
sec_Name[sx] = strsub(lines[sn], strlen(tok_Name) + 1, strlen(lines[sn]) - (strlen(tok_Name)+2) );
sheetprint_from[sx] = 1;
}
if( strstr(lines[sn], tok_Prompt ) == 0) {;
sec_Prompt[sx] = strsub(lines[sn], strlen(tok_Prompt) + 1, strlen(lines[sn]) - (strlen(tok_Prompt)+2) );
}
if( strstr(lines[sn], tok_Device ) == 0) {
sec_Device[sx] = strsub(lines[sn], strlen(tok_Device) + 1, strlen(lines[sn]) - (strlen(tok_Device)+2) );
}
if( strstr(lines[sn], tok_Wheel ) == 0) {
sec_Wheel[sx] = strsub(lines[sn], strlen(tok_Wheel) + 1, strlen(lines[sn]) - (strlen(tok_Wheel)+2) );
}
if( strstr(lines[sn], tok_Rack ) == 0) {
sec_Rack[sx] = strsub(lines[sn], strlen(tok_Rack) + 1, strlen(lines[sn]) - (strlen(tok_Rack)+2) );
}
if( strstr(lines[sn], tok_Scale ) == 0) {
sec_Scale[sx] = strtod(strsub(lines[sn], strlen(tok_Scale), strlen(lines[sn]) - (strlen(tok_Scale)+ 2) ) );
}
if( strstr(lines[sn], tok_Out_put ) == 0) {
sec_Out_put[sx] = strsub(lines[sn], strlen(tok_Out_put) + 1, strlen(lines[sn]) - (strlen(tok_Out_put)+2) );
}
if( strstr(lines[sn], tok_Flags ) == 0) {
sec_Flags[sx] = strsub(lines[sn], strlen(tok_Flags) + 1, strlen(lines[sn]) - (strlen(tok_Flags)+2) );
string fl[];
int fn = strsplit(fl, sec_Flags[sx], ' ');
mirror[sx] = strtol(fl[0]);
rotate[sx] = strtol(fl[1]);
upside[sx] = strtol(fl[2]);
poscoord[sx] = strtol(fl[3]);
quickplot[sx] = strtol(fl[4]);
optimize[sx] = strtol(fl[5]);
fillpads[sx] = strtol(fl[6]);
//Mirror Rotate Upside_down pos._Coord Quick_plot Optimize Fill_Pads
}
if( strstr(lines[sn], tok_Emulate ) == 0) {;
// 3 Flags not used by printer
}
// 2 real Values
if( strstr(lines[sn], tok_Offset ) == 0) {
sec_Offset[sx] = strsub(lines[sn], strlen(tok_Offset) + 1, strlen(lines[sn]) - (strlen(tok_Offset)+2) );
offset_x[sx] = strtol(sec_Offset[sx]);
int oy = strstr(lines[sn], " ");
sec_Flags[sx] = strsub(lines[sn], oy + 1, strlen(lines[sn]) - (oy+2) );
offset_y[sx] = strtol(sec_Offset[sx]);
}
if( strstr(lines[sn], tok_Sheet ) == 0) {
sec_Sheet[sx] = strtod( strsub(lines[sn], strlen(tok_Sheet) , strlen(lines[sn]) - (strlen(tok_Sheet) ) ) );
}
if( strstr(lines[sn], tok_Tolerance ) == 0) {
sec_Tolerance[sx] = strsub(lines[sn], strlen(tok_Tolerance) + 1, strlen(lines[sn]) - (strlen(tok_Tolerance)+2) );
string tol[] ;
int tn = strsplit(tol, sec_Tolerance[sx], ' ');
tolerance0[sx] = tol[0];
tolerance1[sx] = tol[1];
tolerance2[sx] = tol[2];
tolerance3[sx] = tol[3];
tolerance4[sx] = tol[4];
tolerance5[sx] = tol[5];
}
if( strstr(lines[sn], tok_Pen ) == 0) {
// n Pen diameters not used by printer
}
// x y Pages size
if( strstr(lines[sn], tok_Page ) == 0) {
page_Height[sx] = strtod( strsub(lines[sn], strlen(tok_Page) + 1, strlen(lines[sn]) - (strlen(tok_Page)+2) ) );
int oy = strstr(lines[sn], " ");
page_Width[sx] = strtod( strsub(lines[sn], strlen(tok_Page) + 1, strlen(lines[sn]) - (oy+2) ) );
}
// n Layers (max 255)
if( strstr(lines[sn], tok_Layers ) == 0) {
sec_Layers[sx] = strsub(lines[sn], strlen(tok_Layers) + 2, strlen(lines[sn]) - (strlen(tok_Layers)+3) );
// hier noch die Layer
}
// n Layers (max 255)
if( strstr(lines[sn], tok_Colors ) == 0) {
sec_Colors[sx] = strsub(lines[sn], strlen(tok_Colors) + 1, strlen(lines[sn]) - (strlen(tok_Colors)+2) );
string color[] ;
int cn = strsplit(color, sec_Colors[sx], ' ');
// not used by printer
}
solid[sx] = 1;
black[sx] = 1;
}
return;
}
// main
if (argv[2]) {
CAMfileName = argv[2];
}
else {
CAMfileName = dlgFileOpen("select File", path_cam[0]+"/*.cam", "*.*");
}
if (CAMfileName) {
nLines = fileread(lines, CAMfileName);
readCam();
}
else exit (0);
if(lines[0] != tok_job) {
dlgMessageBox(CAMfileName + "\nis not a EAGLE CAM-Job\n" + lines[0], "OK");
exit (0);
}
if (schematic) {
schematic(S) {
if (sheet) sheet(SH) sprintf(actualsheet, "%d", SH.number);
}
schematic(S) {
S.sheets(SH) {
if (lastsheet < SH.number) lastsheet = SH.number;
}
S.layers(L) {
lNames[L.number] = L.name;
lVisible[L.number] = L.visible;
useLayer[L.number] = L.used;
}
}
}
if (board) {
board(B) {
B.layers(L) {
lNames[L.number] = L.name;
lVisible[L.number] = L.visible;
useLayer[L.number] = L.used;
}
}
}
// tabs menue
Result = dlgDialog("CAM-Job to Print-Command") {
//Define a container for tab pages
dlgTabWidget { //---
int tpn=1;
sheetprint_to[tpn] = lastsheet;
while (sec_Name[tpn]) { //--- TabPages ---
pageLimit[tpn] = strtod(PageLimit_all);
dlgTabPage(sec_Name[tpn]) {
dlgHBoxLayout { dlgLabel("<b>JOB Name</b>: " + CAMfileName); }
dlgHBoxLayout {
dlgVBoxLayout {
dlgSpacing(10);
dlgHBoxLayout {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -