#usage "Export a SCH/BRD to IMAGE

" "Usage: RUN exp2image monochrome resolution image type layer [layer layer]" "

" "Tip: Assign a funktion key with
" "ASSIGN Shift+Ctrl+Alt+I 'run exp2image monochrome 150 .tif 1 17 18 20;';
" "or
" "ASSIGN Shift+Ctrl+Alt+I 'run exp2image color 150 .bmp 91 92 94 95 96;';" "

" "Author: support@cadsoft.de" // THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED // 2005-02-17 alf@cadsoft.de empty layers are not selectable // 2008-06-23 alf@cadsoft.de do it also in deviceset, symbol and package string file_name; string brd_suffix; int ratsnest = 0; // start Ratsnest befor export image int sheetprint_from; int sheetprint_to; int lastsheet = 0; string actualsheet; int sheetprint = 0; // 0 = All, 1 = From To, 2 = Actual string exp_Layers; string sec_usedlayer[]; int absolutUsedLayer = 0; int lVisible[]; int useLayer[]; string lNames[] = { " " }; int Resolution = 150; // DPI string monochrome = ""; int sel_monochrome = 0; string filetype[] = { ".bmp", // Windows-Bitmap-Datei ".png", // Portable-Network-Graphics-Datei ".pbm", // Portable-Bitmap-Datei ".pgm", // Portable-Grayscale-Bitmap-Datei ".ppm", // Portable-Pixelmap-Datei ".xbm", // X-Bitmap-Datei ".xpm", // X-Pixmap-Datei ".tif" // Tiff-Datei }; int select_type = 0; string cmd = ""; int Result = 0; string s; string help = usage; // *** functions *** void commandPrint(string name_suffix) { string h; sprintf(h, "EXPORT IMAGE '%s%s%s' %s %d;\n", file_name, name_suffix, filetype[select_type], monochrome, Resolution); cmd += h; return; } // main int nt = 0; do { if(strlwr(argv[3]) == filetype[nt]) { select_type = nt; break; } nt++; } while(filetype[nt]); if (argv[2]) Resolution = strtol(argv[2]); if (argv[1]) { string mono = strupr(argv[1]); if (mono == "MONOCHROME") sel_monochrome = 1; else if (mono == "COLOR") sel_monochrome = 0; else { dlgMessageBox("Use MONOCHROME or COLOR", "Ok"); exit(0); } } int an = 0; do { if (argv[4+an]) { exp_Layers += " " + argv[4+an]; an++; } else break; } while (an); if (schematic) { schematic(S) { file_name = filesetext(S.name, ""); if (sheet) sheet(SH) sprintf(actualsheet, "%d", SH.number); S.sheets(SH) { lastsheet = SH.number; } S.layers(L) { lNames[L.number] = L.name; lVisible[L.number] = L.visible; useLayer[L.number] = L.used; } } sheetprint_to = lastsheet; } else if (board) { board(B) { file_name = filesetext(B.name, ""); B.layers(L) { lNames[L.number] = L.name; lVisible[L.number] = L.visible; useLayer[L.number] = L.used; } } } else if (package || symbol || deviceset) { library(LBR) { if (package) package(P) file_name = P.name; else if(symbol) symbol(SYM) file_name = SYM.name; else if (deviceset) deviceset(DEV) file_name = DEV.name; LBR.layers(L) { lNames[L.number] = L.name; lVisible[L.number] = L.visible; useLayer[L.number] = L.used; } } } else { dlgMessageBox("Start this ULP in a SCH, BRD, DEV, PAC or SYM:", "OK"); exit(-1); } // *** tabs menue *** Result = dlgDialog("Export Image") { // Define a container for tab pages dlgLabel(file_name); dlgTabWidget { dlgTabPage("&Export to Image") { dlgHBoxLayout { dlgStretch(0); if (board) { string Example = "Example: _top --> " + filename(file_name) + "_top" + filetype[select_type] + ""; dlgVBoxLayout { dlgSpacing(4); dlgHBoxLayout { dlgSpacing(8); dlgCheckBox("Start &RATSNEST befor export ", ratsnest); dlgStretch(1); } dlgStretch(1); dlgHBoxLayout { dlgSpacing(8); dlgLabel("&File suffix "); dlgStringEdit(brd_suffix); dlgStretch(1); } dlgHBoxLayout { dlgSpacing(8); dlgLabel(Example); dlgStretch(1); } } } // end if board if (package) { } // end if package if (schematic) { dlgSpacing(8); dlgGroup("Sheet") { dlgVBoxLayout { dlgHBoxLayout { dlgRadioButton("&All sheets", sheetprint); dlgLabel(" "); dlgStretch(1); } dlgHBoxLayout { dlgRadioButton("&Select ", sheetprint); dlgLabel(" &from "); dlgIntEdit(sheetprint_from, 1, lastsheet); dlgLabel(" &to "); dlgIntEdit(sheetprint_to, sheetprint_from, lastsheet); dlgStretch(1); } dlgHBoxLayout { dlgRadioButton("A&ctual sheet #", sheetprint); dlgLabel(actualsheet); dlgStretch(1); } } dlgStretch(1); } } // end if schematic if (deviceset || symbol) { } // end if deviceset/symbol // *** Layer list to print *** int Seleclayer; string layer[] ; int n = 0; int ln = strsplit(layer, exp_Layers, ' '); for (int x = 0; x < ln; x++) { int num = strtod(layer[x]); if (useLayer[num]) { if(schematic || deviceset || symbol) { // 2008-06-23 if (num >= 90) { sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]); n++; } } if(board || package) { // 2008-06-23 if (num < 90 || num > 100) { sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]); n++; } } } } sec_usedlayer[n] = ""; // clear last+1 absolutUsedLayer = n; dlgSpacing(10); dlgVBoxLayout { if (absolutUsedLayer) { dlgHBoxLayout { dlgSpacing(100); } dlgLabel("Printed layers"); dlgListBox(sec_usedlayer, Seleclayer); } else { dlgLabel(""); dlgLabel("No Layers selected."); } dlgStretch(0); } dlgStretch(1); } dlgStretch(1); } // ************ End of TAB | SHEET *********** dlgTabPage("&Help") { dlgHBoxLayout { dlgSpacing(10); dlgVBoxLayout { dlgLabel(help); dlgStretch(1); } } } } // ************ End of all TABs *********** dlgHBoxLayout { dlgLabel("&Image type"); dlgComboBox(filetype, select_type); dlgSpacing(15); dlgCheckBox("&Monochrome", sel_monochrome); dlgSpacing(15); dlgLabel("Resolution &DPI"); dlgIntEdit(Resolution, 50, 600); dlgStretch(1); } dlgHBoxLayout { dlgStretch(0); dlgPushButton("+OK") dlgAccept(); dlgStretch(0); dlgPushButton("-Cancel") dlgReject(); dlgStretch(1); } }; if (Result == 0) exit (0); if (!absolutUsedLayer) exit(0); if (sel_monochrome) monochrome = "MONOCHROME"; else monochrome = ""; string layer[] ; int n = 0; int ln = strsplit(layer, exp_Layers, ' '); if(board || package) { // 2008-06-23 cmd += "SET DISPLAY_MODE REAL;\n"; if (ratsnest) cmd += "RATSNEST;\n"; cmd += "DISPLAY NONE "; for (int x = 0; x < ln; x++) { int num = strtod(layer[x]); if (num < 90 || num > 100) { if (useLayer[num]) { sprintf(s, " %3s", layer[x]); cmd += s; if(num == 21) cmd += " -23 -25 -27 -51"; if(num == 22) cmd += " -24 -26 -28 -52"; n++; } } } cmd += ";\n"; if (board) commandPrint(brd_suffix); else if (package) commandPrint("-PAC"); } if(schematic || deviceset || symbol) { cmd += "DISPLAY NONE "; for (int x = 0; x < ln; x++) { int num = strtod(layer[x]); if (useLayer[num]) { if (num >= 90) { sprintf(s, " %3s", layer[x]); cmd += s; n++; } } } cmd += ";\n"; string sh; string shn; if (schematic) { // 2008-06-23 switch (sheetprint) { case 0 : schematic(S) { S.sheets(SH) { sprintf(sh, "EDIT '.s%d';\n", SH.number); cmd += sh; sprintf(shn, "_s%d", SH.number); commandPrint(shn); } } break; case 1 : for (int prn = sheetprint_from; prn <= sheetprint_to; prn++) { sprintf(sh, "EDIT '.s%d';\n", prn); cmd += sh; sprintf(shn, "_s%d", prn); commandPrint(shn); } break; case 2 : sprintf(sh, "EDIT '.s%s';\n", actualsheet); cmd += sh; sprintf(shn, "_s%s", actualsheet); commandPrint(shn); break; } } else if (deviceset) commandPrint("-DEV"); else if (symbol) commandPrint("-SYM"); } cmd += "DISPLAY "; if(board || package) { for(int l = 1; l < 90; l++) { if (useLayer[l]) { if (lVisible[l]) { sprintf(s, " %d", l); cmd += s; } else { sprintf(s, " -%d", l); cmd += s; } } } for(l = 100; l < 256; l++) { if (useLayer[l]) { if (lVisible[l]) { sprintf(s, " %d", l); cmd += s; } else { sprintf(s, " -%d", l); cmd += s; } } } cmd += ";\n"; } if(schematic || deviceset || symbol) { // 2008-06-23 for(int l = 91; l < 256; l++) { if (useLayer[l]) { if (lVisible[l]) { sprintf(s, " %d", l); cmd += s; } else { sprintf(s, " -%d", l); cmd += s; } } } cmd += ";\n"; if(schematic) { // 2008-06-23 alf@cadsoft.de sprintf(s, "EDIT '.s%s';\n", actualsheet); cmd += s; } } exit (cmd);