// kate: syntax c; encoding utf-8 /* Copyright (c) 2008..2010, Sven Pauli All rights reserved. sven_pauli@gmx.de */ string fmt; /* Scale factor and parameters */ real mu_scale = 0.50; int mu_unit = 0; int mu_precision = 2; /* in mic, 0.05 inch */ real mu_length = 2540.0; real mu_text_size = 2540.0 / 2.0; real mu_text_offset = 2540.0 / 8.0; int result; string ulp = argv[0]; string commands = ""; string cmd; string scu(int x) { real dim; switch (mu_unit) { case 0: dim = u2mm(x); break; case 1: dim = u2mm(x) / 10.0; break; case 2: dim = u2inch(x); break; case 3: dim = u2mil(x); break; } string result; sprintf(result, "%.*f", mu_precision, dim / mu_scale); return result; } string str_replace(string s, char c, string r) { int pos; int start = 0; string result = ""; pos = strchr(s, c); if (pos == -1) { return s; } while (pos >= 0) { result += strsub(s, start, pos - start); result += r; start = pos + 1; pos = strchr(s, c, start); } result += strsub(s, start); return result; } string format_string(string s) { /* Possible traps: - apostrophes - a pair of brackets (= point) - newline */ return "'" + str_replace(str_replace(s, '\n', "\\n"), '\'', "''") + "'"; } string format_path(string s) { return s; } real arctan(int dy, int dx) { real angle; if (dy == 0) angle = 0; else if (dx == 0) angle = PI / 2.0; else angle = atan(real(dy) / real(dx)); if (dx < 0) angle += PI; return angle; } void measure_polygon(UL_POLYGON P) { } void measure_rectangle(UL_RECTANGLE R) { } void draw_end(int x, int y, real angle) { real l = mu_length * mu_scale / 2.0; printf("WIRE (%f %f) (%f %f);\n", u2mic(x) - sin(angle) * l, u2mic(y) + cos(angle) * l, u2mic(x) + sin(angle) * l, u2mic(y) - cos(angle) * l ); } void draw_arrow(int x, int y, real angle) { real w = mu_length * mu_scale / 2.0; real h = w / 4.0; printf("WIRE (%f %f) (%f %f) (%f %f) (%f %f);\n", u2mic(x), u2mic(y), u2mic(x) + cos(angle) * w - sin(angle) * h, u2mic(y) + sin(angle) * w + cos(angle) * h, u2mic(x) + cos(angle) * w + sin(angle) * h, u2mic(y) + sin(angle) * w - cos(angle) * h, u2mic(x), u2mic(y) ); } void measure_arc(UL_WIRE W) { int dx = W.x2 - W.x1; int dy = W.y2 - W.y1; real r = W.arc.radius; real len = 2.0 * r * abs(W.curve) / 360.0; real angle = arctan(dy, dx); real curve = W.curve / 180.0 * PI; /* Ends and arrows */ draw_end(W.x1, W.y1, angle - curve / 2.0); draw_end(W.x2, W.y2, angle + curve / 2.0 + PI); draw_arrow(W.x1, W.y1, angle - curve / 2.0); draw_arrow(W.x2, W.y2, angle + curve / 2.0 + PI); /* Label */ int x = (curve > 0.0) ? W.x2 : W.x1; int y = (curve > 0.0) ? W.y2 : W.y1; printf("TEXT %s(%.*f°) R%f (%f %f);\n", scu(len), mu_precision, abs(W.curve), (angle - curve / 2.0) / PI * 180.0, u2mic(x) - cos(angle) * mu_text_offset, u2mic(y) - sin(angle) * mu_text_offset ); } void measure_wire(UL_WIRE W) { int dx = W.x2 - W.x1; int dy = W.y2 - W.y1; real len = sqrt(real(dx) * real(dx) + real(dy) * real(dy)); real angle = arctan(dy, dx); /* Ends */ draw_end(W.x1, W.y1, angle); draw_end(W.x2, W.y2, angle + PI); /* Arrows and label */ if (u2mic(int(len)) < mu_length) { real d = mu_length * mu_scale / 2.0; printf("TEXT %s R%f (%f %f);\n", scu(len), (angle + PI / 2.0) / PI * 180.0, u2mic(int((W.x1 + W.x2) / 2.0)) + cos(angle) * d, u2mic(int((W.y1 + W.y2) / 2.0)) + sin(angle) * d ); /* Arrows outside for small measures */ angle += PI; } else { printf("TEXT %s R%f (%f %f);\n", scu(len), angle / PI * 180.0, u2mic(int((W.x1 + W.x2) / 2.0)) - sin(angle) * mu_text_offset, u2mic(int((W.y1 + W.y2) / 2.0)) + cos(angle) * mu_text_offset ); } draw_arrow(W.x1, W.y1, angle); draw_arrow(W.x2, W.y2, angle + PI); } if (!board) { dlgMessageBox(";Den Bemaßer bitte in einem Board ausführen."); exit(EXIT_FAILURE); } /* Convert to percent */ mu_scale *= 100.0; /* Convert to mm */ mu_length /= 1000.0; mu_text_offset /= 1000.0; mu_text_size /= 1000.0; result = dlgDialog("Super-Duper-Eagle-Bemaßung") { dlgHBoxLayout dlgSpacing(400); dlgTabWidget { dlgTabPage("Bemaßung") { dlgGroup("Skalierungsfaktor") { dlgHBoxLayout { dlgLabel("Board:"); dlgStretch(1); dlgRealEdit(mu_scale, 0.0, 100.0); dlgLabel("%"); } } dlgGroup("Vorgaben") { dlgHBoxLayout { dlgLabel("Länge der Maßenden:"); dlgStretch(1); dlgRealEdit(mu_length, 0.0, 25.4); dlgLabel("mm"); } dlgHBoxLayout { dlgLabel("Texthöhe:"); dlgStretch(1); dlgRealEdit(mu_text_size, 0.0, 25.4); dlgLabel("mm"); } dlgHBoxLayout { dlgLabel("Textversatz:"); dlgStretch(1); dlgRealEdit(mu_text_offset, 0.0, 25.4); dlgLabel("mm"); } } dlgGroup("Einheit") { dlgRadioButton("Millimeter", mu_unit); dlgRadioButton("Zentimeter", mu_unit); dlgRadioButton("Inch", mu_unit); dlgRadioButton("Mil", mu_unit); dlgHBoxLayout { dlgLabel("Anzeige:"); dlgStretch(1); dlgIntEdit(mu_precision, 0, 10); dlgLabel("Nachkommastellen"); } } } dlgTabPage("Hinweise") { dlgLabel("Hinweise zur Benutzung:"); dlgLabel(""); dlgStretch(1); } dlgTabPage("Info") { dlgHBoxLayout dlgSpacing(300); dlgLabel("Super-Duper-Eagle-Bemaßer v1a"); dlgLabel( "Copyright (c) 2008..2010, Sven Pauli
" "All rights reserved.
" "sven_pauli@gmx.de" ); dlgLabel("Frei für nicht-kommerzielle Verwendung."); dlgStretch(1); } } dlgHBoxLayout { dlgStretch(1); dlgPushButton("+Start") dlgAccept(); dlgPushButton("-Schließen") dlgReject(); } }; if (!result) /* Aborted */ exit(EXIT_SUCCESS); /* Convert from percent */ mu_scale /= 100.0; /* Convert to mic */ mu_length *= 1000.0; mu_text_offset *= 1000.0; mu_text_size *= 1000.0; /* Ask for script file */ string script = dlgFileSave("Ausgabeskript", "", "*.scr"); if (script == "") /* Aborted */ exit(EXIT_SUCCESS); /* Create or empty file */ fileerror(); output(script, "wtF") { /* Setup */ printf("SET SELECT_FACTOR 0;\n"); printf("SET WIRE_BEND 2;\n"); printf("GRID mic 1;\n"); printf("DISPLAY Measures;\n"); printf("LAYER Measures;\n"); printf("CHANGE Style LongDash;\n"); printf("CHANGE Width 0.0;\n"); printf("CHANGE Ratio 8;\n"); printf("CHANGE Font Vector;\n"); printf("CHANGE Size %f;\n", mu_text_size * mu_scale); /* Clear */ printf("DELETE (>@);\n"); board(B) { clrgroup(B); B.texts(T) { if (T.layer == LAYER_MEASURES) setgroup(T); } B.wires(W) { if (W.layer == LAYER_MEASURES) { if (W.style == WIRE_STYLE_CONTINUOUS) { if (W.arc) measure_arc(W); else measure_wire(W); } else if (W.style == WIRE_STYLE_LONGDASH) { setgroup(W); } } } } printf("GRID Last;\n"); } if (fileerror()) { dlgMessageBox("!Konnte Ausgabeskript nicht erzeugen."); exit(EXIT_FAILURE); } result = dlgMessageBox(";Skript erstellt.
Möchten Sie es nun ausführen?", "-Nein", "+Ja", "Lieber vorher nochmal reingucken"); if (result == 2) { /* Read script */ fileerror(); fileread(commands, script); if (fileerror()) { dlgMessageBox("!Konnte erzeugtes Ausgabeskript nicht mehr lesen."); exit(EXIT_FAILURE); } result = dlgDialog("Ausgabeskript") { dlgHBoxLayout dlgSpacing(400); dlgLabel("Erzeugtes Skript:"); dlgHBoxLayout { dlgVBoxLayout dlgSpacing(400); dlgTextView(commands); } dlgHBoxLayout { dlgStretch(1); dlgPushButton("+Jetzt ausführen") dlgAccept(); dlgPushButton("-Lieber doch nicht") dlgReject(); } }; } if (result) { sprintf(commands, "SCRIPT %s;\n", script); exit(commands); }