diff --git a/EAGLE b/EAGLE new file mode 120000 index 0000000..8a163a8 --- /dev/null +++ b/EAGLE @@ -0,0 +1 @@ +eagle-5.7.0/bin/eagle \ No newline at end of file diff --git a/eagle-5.7.0/bin/eagle b/eagle-5.7.0/bin/eagle new file mode 100755 index 0000000..488bb03 Binary files /dev/null and b/eagle-5.7.0/bin/eagle differ diff --git a/eagle-5.7.0/bin/eagle.def b/eagle-5.7.0/bin/eagle.def new file mode 100644 index 0000000..ddd186d --- /dev/null +++ b/eagle-5.7.0/bin/eagle.def @@ -0,0 +1,1262 @@ +; Device definitions for EAGLE version 5.7.0: +; +; [NAME] device name (as in command line option "-d" or menu) +; @NAME inherits data from [NAME] (max. nesting level is 10!) +; Type basic device type (must immediately follow [NAME]): +; +; PenPlotter pen plotter +; PhotoPlotter photoplotter +; DrillStation drill station +; Generic generic device (used for e.g. PostScript) +; Calcomp Calcomp pen plotter +; CalcompE CalComp electrostatic plotter +; +; Common parameters for all types of devices: +; +; Long long name (description) of device +; Init string to initialize device before printing +; Reset string to reset device after printing +; ResX/Y resolution in X/Y direction (dots or steps per inch, default = 1000) +; CorrectX/Y used to correct hardware tolerances (default = 1.0) +; OffsetX/Y defines an offset from the machine's origin (default = 0.0) +; Width page width (inch) (default = 8.0) +; Height page height (inch) (default = 12.0) +; Output name of the output file or port +; Color.NN color number to use for layer NN, e.g. +; Color.120 = 3 ; will use color '3' for layer '120' +; +; Parameters for drawing devices (PenPlotter, PhotoPlotter): +; +; Draw draw a line to (x, y) +; Move move the pen to (x, y) +; PenDown lower the pen +; PenUp lift the pen +; AreaBegin begin of a polygon area definition (edges are drawn with Move/Draw +; and are considered to have zero width) +; AreaEnd end of polygon area definition +; +; Parameters for pen plotters (PenPlotter): +; +; PenArcCxCyAd draw an arc from CP with center (Cx, Cy) and angle Ad +; PenCircleCxCyRxCxCyRx draw a circle at (Cx, Cy) with radius Rx +; PenCircleCxCyRxRy draw a circle at (Cx, Cy) with radius Rx and Ry +; PenCircleRxCxCy draw a circle at (Cx, Cy) with radius Rx +; PenCircleRxn draw a circle at CP with radius Rx (negtive!) +; PenCircleRxRx draw a circle ar CP with radius Rx +; PenSelect select pen +; PenSpeed string to set pen speed +; PenDiameter pen diameter (mm) +; PenVelocity pen velocity (device dependent value) +; +; Parameters for drill stations (DrillStation): +; +; DrillSize string for drill size definition in output file +; AutoDrill string for automatic drill generation +; FirstDrill number of the first drill to use with AutoDrill +; BeginData string to mark the beginning of the actual drill data +; Select string to select a tool +; Divide divides coordinates (default = 1.0) +; Drill string to drill a hole at (x, y) [with tool] +; Info string that is copied into the drill info file +; Rack name of the drill rack file +; +; Parameters for photo plotters (PhotoPlotter): +; +; AutoAperture string for automatic aperture generation +; Aperture string to select an aperture +; Flash string to flash an aperture +; Info string that is copied into the photo plotter info file +; Wheel name of the aperture wheel file name +; FirstAperture number of the first aperture to use with AutoAperture +; ToleranceDrawM negative draw tolerance +; ToleranceDrawP positive draw tolerance +; ToleranceFlashM negative flash tolerance +; ToleranceFlashP positive flash tolerance +; EmulateApertures turns aperture emulation on (YES) or off (NO) +; EmulateAnnulus turns annulus emulation on (YES) or off (NO) +; EmulateThermal turns thermal emulation on (YES) or off (NO) +; Circle defines embedded circle aperture +; Rectangle defines embedded rectangle aperture +; Octagon defines embedded octagon aperture +; Oval defines embedded oval aperture +; Annulus defines embedded annulus aperture +; Thermal defines embedded thermal aperture +; MaxApertureSize maximum physical aperture size (inch) +; +; Parameters for DrillStation and PhotoPlotter; +; +; Units the units used in *.GPI and *.DRI files +; valid units are Inch, MM and Auto[default] (automatically +; chooses the unit with the least decimal digits) +; Decimals the number of decimals to use when Units is set to Inch +; or MM (default = 4). Values are rounded to this number of +; decimals. +; +; Parameters for generic devices: +; +; Header1 header string used for PostScript +; Header2 header string used for PostScript +; Header3 header string used for PostScript +; StartPage string that starts a new page +; EndPage string that ends a page +; ArcCxCyRWSaEaC string that draws an arc at (Cx, Cy) with Radius, Width, Start angle, End angle and line Cap +; Bar string that draws a bar +; Circle string that draws a circle +; Line string that draws a line +; Octagon string that draws an octagon +; Pie string that draws a pie +; Hole string that draws a hole +; HwArcX1Y1CxCyA string that draws an arc with hardware coordinates +; HwArc string that draws an arc with hardware coordinates +; HwCircle string that draws a circle with hardware coordinates +; HwColor string that sets the color +; HwLine string that draws a line with hardware coordinates +; HwPie string that draws a pie with hardware coordinates +; HwPoly1 string that start a polygon with hardware coordinates +; HwPoly2 string that draws a polygon edge with hardware coordinates +; HwPoly3 string that ends a polygon with hardware coordinates +; HwStartPage string that starts a page +; HwWidth string that sets line width with hardware units +; MaxHwWidth maximum hardware line width +; +; Strings have to be enclosed in double quotes ("..."). +; If a double quote has to be part of the string, it must be escaped with +; a backslash, e.g. "abc\"def". +; If a backslash has to appear in the string, it has to be doubled, +; e.g. "abc\\def" would result in abc\def. +; Non-printable characters inside strings are written as "\xhh" with 2 +; hex digits, e.g. "\x1B" would mean ESCape; the digits may be upper- or +; lowercase, but it has to be exactly two of them! +; The following characters have special meanings when escaped with +; a backslash: +; +; \0 NUL integer 0 \x00 +; \a BEL alert \x07 +; \b BS backspace \x08 +; \f FF form feed \x0C +; \n NL (LF) newline \x0D\x0A +; \r CR carriage return \x0D +; \t HT horizontal tab \x09 +; \v VT vertical tab \x0B +; \xhh hh hex number \xhh +; +; If a string parameter is too long to fit into one line it can be continued +; on the next line by escaping the end of line with a backslash, e.g. +; Parameter = "A very long string " \ +; "which takes several " \ some comment +; "lines.\n" +; Note that the backslash terminates the line, so everything after the '\' +; character is discarded (this may be used for additional comments). + +[HPPJETXL300C] + +@HPGL2 +Long = "HP PaintJet XL300 (150 dpi, 16.8M colors)" +; The HP PaintJet XL300 can print up to 16.8M colors. However, these are +; always created by mixing the basic colors cyan, magenta, and yellow. +; Thus non-basic colors (especially light tones) will appear rastered when +; closely viewed. +; +; The default INIT string of the HPGL2 driver sets the printer up for +; +; 'NP14' 14 pens +; 'CR0,15,0,15,0,15' a color range from 0 to 15 for each bacic color, +; which results in a maximum of 4096 different colors +; 'MC1' transparent printing (overlapping colors mix!) +; 'PC 1,15, 0,15' pen 1: magenta +; 'PC 2, 0,15,15' pen 2: cyan +; 'PC 3, 0, 0,15' pen 3: blue +; 'PC 4,15,15, 0' pen 4: yellow +; 'PC 5,15, 0, 0' pen 5: red +; 'PC 6, 0,15, 0' pen 6: green +; 'PC 7, 0, 0, 0' pen 7: black +; 'PC 8,15,12,15' pen 8: light magenta +; 'PC 9,12,15,15' pen 9: light cyan +; 'PC10,12,12,15' pen 10: light blue +; 'PC11,15,15,12' pen 11: light yellow +; 'PC12,15,12, 0' pen 12: light red +; 'PC13,12,15, 0' pen 13: light green +; 'PC14,11,11,11' pen 14: grey +; +; You can modify the colors by changing the 'PCn,r,g,b' commands, where +; +; n = pen number +; r = red component +; g = green component +; b = blue component +; +; Note that although the printer has cyan, magenta and yellow as basic +; colors, the 'PC' commands use RGB (red-green-blue) values, according to +; the NTSC specification! + +[DESIGNJET220] + +@HPGL2 +Long = "HP DesignJet 220, HPGL2-Mode" +Init = "\x1B%%1BIN;IP0,0,100,100SC0,100,0,100"\ + "WU1MC1NP14CR0,15,0,15,0,15"\ + "PC1,15,0,15PC2,0,15,15PC3,0,0,15PC4,15,15,0"\ + "PC5,15,0,0PC6,0,15,0PC7,0,0,0PC8,15,12,15"\ + "PC9,12,15,15PC10,12,12,15PC11,15,15,12PC12,15,12,0"\ + "PC13,12,15,0PC14,11,11,11"\ + "PA;\n" +Reset = "PG;\x1B%%0A\f" +HwColor = "SP%u" ; (Pen-Number) precede this line with ';' for b/w + +;Use the following as first line of the Init string for A3 sized paper: +;Init = "\x1B&l27A\x1B%%-1BIN;IP0,0,100,100SC0,100,0,100"\ + +[DESIGNJET650] +Type = Generic +Long = "HP DesigJet 650C, HPGL2" +Init = "\x1B%%-12345X@@PJL ENTER LANGUAGE = HPGL2\n"\ + "\x1B%%-1BBIN;IP0,0,100,100SC0,100,0,100"\ + "WU1MC1NP14CR0,15,0,15,0,15"\ + "PC1,15,0,15PC2,0,15,15PC3,0,0,15PC4,15,15,0"\ + "PC5,15,0,0PC6,0,15,0PC7,0,0,0PC8,15,12,15"\ + "PC9,12,15,15PC10,12,12,15PC11,15,15,12PC12,15,12,0"\ + "PC13,12,15,0PC14,11,11,11"\ + "PA;\n" +Reset = "PUSP0PG;" +ResX = 1016 +ResY = 1016 +HwArcX1Y1CxCyA = "PU%d,%dPDAA%d,%d,%d\n" ; (x1, y1, xc, yc, ArcAngle) +HwColor = "SP%u" ; (Pen-Number) +HwLine = "PU%d,%dPD%d,%d\n" +HwPoly1 = "PU%d,%dPM0PA%d,%d" ; first edge +HwPoly2 = ",%d,%d" ; other points +HwPoly3 = "PM2FP;\n" ; end of polygon +HwWidth = "PW%u" ; (Pen-Width) +MaxHwWidth = 5 + +[HPGL] + +Type = PenPlotter +Long = "HP-GL plotter" +Init = "IN; IP 0,0,100,100; SC 0,100,0,100;\n" +Reset = "PU; SP 0; PA 0,0;\n" +Width = 16 +Height = 11 +ResX = 1016 +ResY = 1016 +PenSelect = "SP %u;\n" ;; Pens numbered 1..n +PenSpeed = "VS %1.0f;\n" +PenUp = "PU;\n" +PenDown = "PD;\n" +Move = "PA %d,%d;\n" +Draw = "PA %d,%d;\n" +PenCircleCxCyRxRy = "AA %d,%d,360;\n" ; (assumes CP is left?!) +PenArcCxCyAd = "AA %d,%d,%1.2f;\n" ; (assumes CP is at start of arc) +; Cx/y Center X/Y (long) +; Rx/y Radius X/Y (long) +; Ad Angle in degrees (double) + +[HPGLX] + +@HPGL +Long = "HP-GL plotter (serial, with Xon/Xoff handshake)" +Init = "\x1B.I;;17:\x1B.N;19:"\ + "IN; IP 0,0,100,100; SC 0,100,0,100;\n" + +[SPL10] + +@HPGL +Long = "Sekonic SPL 10 plotter" + +[CX6000] + +Type = PenPlotter +Long = "C.Itoh CX6000 plotter" +Init = "" +Reset = "M0,0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "C%u\n" ;; Pens numbered 0..n-1 +Move = "M%d,%d\n" +Draw = "D%d,%d\n" + +[DXY800] + +Type = PenPlotter +Long = "Roland DXY-800 plotter" +Init = "" +Reset = "J0\nH\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "J %u\n" +Move = "M %d,%d\n" +Draw = "D %d,%d\n" +PenCircleRxRx = "E %d,180,360\nE %d,0,180\n" + +[DPX2200] + +@HPGL +Long = "Roland DPX-2200 plotter" + +[ADCOMP] + +Type = PenPlotter +Long = "ADCOMP X 100 plotter" +Init = "" +Reset = "M0,0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "C%u\n" ;; Pens numbered 1..n +Move = "M%d,%d\n" +Draw = "D%d,%d\n" +PenCircleCxCyRxCxCyRx = "W%d,%d,%d,180,360,1\nW%d,%d,%d,0,180,1\n" + +[WX4671] + +Type = PenPlotter +Long = "Watanabe WX4671 plotter" +Init = "" +Reset = "M0,0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +Move = "M%d,%d\n" +Draw = "D%d,%d\n" + +[HPX84] + +Type = PenPlotter +Long = "HPX-84 plotter" +Init = "SH\n" +Reset = "SH\nAP 0 0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenUp = "SH\n" +PenDown = "SS\n" +Move = "AP %d %d\n" +Draw = "AP %d %d\n" +PenCircleCxCyRxRy = "SH\nAK %d %d %d\n" + +[YEWPL] + +Type = PenPlotter +Long = "Yokogawa PL 1000 plotter" +Init = "IP 0;IW 0,0,380,250; IP 1;\n" +Reset = "MA 0,0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "PS %u\n" +PenSpeed = "PV %1.0f\n" +Move = "MA %d,%d\n" +Draw = "DA %d,%d\n" +PenCircleRxCxCy = "AC %d,%d,%d,1800,5400\n" + +[ADCOMP300] + +Type = PenPlotter +Long = "ADCOMP X 300 plotter" +Init = "H\n" +Reset = "J0\nH\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "J%u\n" +PenSpeed = "T%1.0f\n" ;;max(min(sround(PenVelocity / 2), 10), 1) +Move = "M%d,%d\n" +Draw = "D%d,%d\n" +PenCircleCxCyRxRy = "W%d,%d,%d,%d,1800,5400\n" + +[MP1000] + +Type = PenPlotter +Long = "Watanabe MP1000 plotter" +Init = "" +Reset = "J0\nH\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "J%u\n" +PenSpeed = "T%1.0f\n" +Move = "M%d,%d\n" +Draw = "D%d,%d\n" + +[EPSONHI80] + +@MP1000 +Long = "EPSON HI-80 plotter (Plot-Mode 1)" + +[SWEET] + +Type = PenPlotter +Long = "SWEET-P 100 plotter" +Init = "RE;\n" +Reset = "HO;\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSpeed = "VS %1.0f;\n" ;;max(15, sround((PenVelocity * 15) / 75)) +Move = "MA %d,%d;\n" +Draw = "DA %d,%d;\n" + +[TEWIP281] + +Type = PenPlotter +Long = "tewidata P 281 plotter" +Init = "H\n" +Reset = "HF0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "F%u\n" +PenUp = "H" +PenDown = "I" +Move = "%d/%dK\n" +Draw = "%d/%dK\n" +PenCircleRxn = "O%d,180,540\n" ; Rxn = Radius X (long, negative) + +[SE281] + +@TEWIP281 +Long = "Goerz Servogor SE 281 plotter" + +[RY10MZ] + +Type = PenPlotter +Long = "Rikadenki RY-10 MZ plotter" +Init = "" +Reset = "H\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "K%u\n" +PenSpeed = "T%1.0f\n" +Move = "M%d,%d\n" +Draw = "D%d,%d\n" +PenCircleCxCyRxRy = "W%d,%d C%d,180,360\n" + +[HIDMP] + +Type = PenPlotter +Long = "Houston Instrument DMP plotter" +Init = ";:H A EC1 \n" +Reset = "P0 @\n" +Width = 16 +Height = 11 +ResX = 1000 +ResY = 1000 +PenSelect = "P%u\n" +PenSpeed = "V%1.0f\n" +Move = "U %d,%d\n" +Draw = "D %d,%d\n" +PenCircleCxCyRxRy = "CA %d,%d 360\n" + +[EPS] + +Type = Generic +Long = "Encapsulated PostScript" +ResX = 254000 ; this gives us editor coordinates! +ResY = 254000 +Width = 100.00 ; virtually infinite +Height = 100.00 +ArcCxCyRWSaEaC = "%d %d %d %d %1.2f %1.2f %d a\n" ; (CenterX, CenterY, Radius, Width, StartAngle, EndAngle, LineCap) +Bar = "%d %d %d %d %.1f b\n" ; (x1, y1, x2, y2, Angle) +Circle = "%d %d %d %d c\n" ; (x, y, Radius, Width) +Line = "%d %d %d %d %d l\n" ; (x1, y1, x2, y2, Width) +Octagon = "%d %d %d %d %.1f o\n" ; (x, y, dx, dy, Angle) +Pie = "%d %d %d p\n" ; (x, y, d) +Hole = "%d %d %d h\n" ; (x, y, d) + +Header1 = "%%!PS-Adobe-3.0 EPSF-3.0\n" \ + "%%%%Title: EAGLE Drawing %s\n" \ + "%%%%Creator: EAGLE\n" \ + "%%%%Pages: %d\n" \ + "%%%%BoundingBox: 0 0 %d %d\n" \ + "%%%%EndComments\n" \ + "\n"\ + "%% Coordinate transfer:\n"\ + "\n"\ + "/EU { 254 div 0.072 mul } def\n"\ + "/inch { 72 mul } def\n"\ + "\n"\ + "%% Linestyle:\n"\ + "\n"\ + "1 setlinecap\n"\ + "1 setlinejoin\n"\ + "\n"\ + "%% Drawing functions:\n"\ + "\n"\ + "/l { %% draw a line\n"\ + " /lw exch def\n"\ + " /y2 exch def\n"\ + " /x2 exch def\n"\ + " /y1 exch def\n"\ + " /x1 exch def\n"\ + " newpath\n"\ + " x1 EU y1 EU moveto\n"\ + " x2 EU y2 EU lineto\n"\ + " lw EU setlinewidth\n"\ + " stroke\n"\ + " } def\n"\ + "\n"\ + "/h { %% draw a hole\n"\ + " /d exch def\n"\ + " /y exch def\n"\ + " /x exch def\n"\ + " d 0 gt {\n"\ + " newpath\n"\ + " x EU y EU d 2 div EU 0 360 arc\n"\ + " currentgray dup\n"\ + " 1 exch sub setgray\n"\ + " fill\n"\ + " setgray\n"\ + " } if\n"\ + " } def\n"\ + "\n"\ + "/b { %% draw a bar\n"\ + " /an exch def\n"\ + " /y2 exch def\n"\ + " /x2 exch def\n"\ + " /y1 exch def\n"\ + " /x1 exch def\n"\ + " /w2 x2 x1 sub 2 div EU def\n"\ + " /h2 y2 y1 sub 2 div EU def\n"\ + " gsave\n"\ + " x1 x2 add 2 div EU y1 y2 add 2 div EU translate\n"\ + " an rotate\n"\ + " newpath\n"\ + " w2 h2 moveto\n"\ + " w2 neg h2 lineto\n"\ + " w2 neg h2 neg lineto\n"\ + " w2 h2 neg lineto\n"\ + " closepath\n"\ + " fill\n"\ + " grestore\n"\ + " } def\n"\ + "\n"\ + "/c { %% draw a circle\n"\ + " /lw exch def\n"\ + " /rd exch def\n"\ + " /y exch def\n"\ + " /x exch def\n"\ + " newpath\n"\ + " lw EU setlinewidth\n"\ + " x EU y EU rd EU 0 360 arc\n"\ + " stroke\n"\ + " } def\n"\ + "\n"\ + "/a { %% draw an arc\n"\ + " /lc exch def\n"\ + " /ae exch def\n"\ + " /as exch def\n"\ + " /lw exch def\n"\ + " /rd exch def\n"\ + " /y exch def\n"\ + " /x exch def\n"\ + " lw rd 2 mul gt {\n"\ + " /rd rd lw 2 div add 2 div def\n"\ + " /lw rd 2 mul def\n"\ + " } if\n"\ + " currentlinecap currentlinejoin\n"\ + " lc setlinecap 0 setlinejoin\n"\ + " newpath\n"\ + " lw EU setlinewidth\n"\ + " x EU y EU rd EU as ae arc\n"\ + " stroke\n"\ + " setlinejoin setlinecap\n"\ + " } def\n"\ + "\n"\ + "/p { %% draw a pie\n"\ + " /d exch def\n"\ + " /y exch def\n"\ + " /x exch def\n"\ + " newpath\n"\ + " x EU y EU d 2 div EU 0 360 arc\n"\ + " fill\n"\ + " } def\n"\ + "\n"\ + "/edge { 0.20710678119 mul } def\n"\ + "\n"\ + "/o { %% draw an octagon\n"\ + " /an exch def\n"\ + " /dy exch def\n"\ + " /dx exch def\n"\ + " /y exch def\n"\ + " /x exch def\n"\ + " gsave\n"\ + " x EU y EU translate\n"\ + " an dx dy lt { 90 add /dx dy /dy dx def def } if rotate\n"\ + " newpath\n"\ + " 0 dx 2 div sub EU 0 dy edge add EU moveto\n"\ + " 0 dx dy sub 2 div sub dy edge sub EU 0 dy 2 div add EU lineto\n"\ + " 0 dx dy sub 2 div add dy edge add EU 0 dy 2 div add EU lineto\n"\ + " 0 dx 2 div add EU 0 dy edge add EU lineto\n"\ + " 0 dx 2 div add EU 0 dy edge sub EU lineto\n"\ + " 0 dx dy sub 2 div add dy edge add EU 0 dy 2 div sub EU lineto\n"\ + " 0 dx dy sub 2 div sub dy edge sub EU 0 dy 2 div sub EU lineto\n"\ + " 0 dx 2 div sub EU 0 dy edge sub EU lineto\n"\ + " closepath\n"\ + " fill\n"\ + " grestore\n"\ + " } def\n"\ + "\n" + ;(Name, NrPages, (x2 - x1) * 0.072 * ScaleFactor, (y2 - y1) * 0.072 * ScaleFactor) + +[PS] + +@EPS +Long = "PostScript (printable)" +Width = 7.75 +Height = 11.00 + +Header2 = "%% the real drawing size:\n"\ + "\n"\ + "/MinDrawX %6d EU def\n"\ + "/MinDrawY %6d EU def\n"\ + "/MaxDrawX %6d EU def\n"\ + "/MaxDrawY %6d EU def\n"\ + "\n"\ + "%% the usable page size:\n"\ + "\n"\ + "/LeftMargin 0.25 inch def %% change these if drawing gets clipped!\n"\ + "/BotMargin 0.25 inch def\n"\ + "/PageWidth %7.4f inch def\n"\ + "/PageHeight %7.4f inch def\n"\ + "\n"\ + "%% are we going to rotate?:\n"\ + "\n"\ + "/RotateDrawing %d 0 ne def\n"\ + "\n" + ;(x1, y1, x2, y2, Width, Height, DoRotate) + +Header3 = "%% Media size functions:\n"\ + "\n"\ + "/AbortMessage { %% Show a message in a box and stop printing\n"\ + " /h 100 def\n"\ + " /Courier findfont 12 scalefont setfont\n"\ + " mediawidth pagemargin sub h 1 setpage\n"\ + " newpath\n"\ + " 0 0 moveto\n"\ + " 0 h rlineto\n"\ + " mediawidth pagemargin sub 0 rlineto\n"\ + " 0 h neg rlineto\n"\ + " closepath\n"\ + " 5 setlinewidth\n"\ + " stroke\n"\ + " newpath 50 60 moveto (ERROR: Jobsize exceeds physical printing area!) show\n"\ + " newpath 50 40 moveto ( Job has been aborted!) show\n"\ + " showpage\n"\ + " stop\n"\ + " } def\n"\ + "\n"\ + "/SelectPage { %% Select the page identified by Row and Column\n"\ + " /Column exch def\n"\ + " /Row exch def\n"\ + "\n"\ + " %% the actually exposed area (if the machine knows these parameters!):\n"\ + "\n"\ + " /DrawX MaxDrawX MinDrawX sub def\n"\ + " /DrawY MaxDrawY MinDrawY sub def\n"\ + " statusdict /setpage known\n"\ + " statusdict /mediawidth known and\n"\ + " statusdict /medialength known and\n"\ + " statusdict /pagemargin known and {\n"\ + " %% this is for machines that can tell the media size:\n"\ + " statusdict begin\n"\ + " /MediaW mediawidth pagemargin sub def\n"\ + " DrawX DrawY ge {\n"\ + " DrawX MediaW le DrawY medialength le and {\n"\ + " MediaW DrawY 1 setpage\n"\ + " MediaW DrawX sub 2 div 0 translate\n"\ + " }{\n"\ + " DrawY MediaW le DrawX medialength le and {\n"\ + " MediaW DrawX 0 setpage\n"\ + " 0 MediaW DrawY sub 2 div translate\n"\ + " }{\n"\ + " AbortMessage\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " }{\n"\ + " DrawY MediaW le DrawX medialength le and {\n"\ + " MediaW DrawX 0 setpage\n"\ + " 0 MediaW DrawY sub 2 div translate\n"\ + " }{\n"\ + " DrawX MediaW le DrawY medialength le and {\n"\ + " MediaW DrawY 1 setpage\n"\ + " MediaW DrawX sub 2 div 0 translate\n"\ + " }{\n"\ + " AbortMessage\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " end\n"\ + " }{\n"\ + " %% this is for machines that can NOT tell the media size:\n"\ + " %% (Ghostscript doesn't like this!)\n"\ + " /Product product length string def\n"\ + " /i 0 def\n"\ + " product { dup 97 lt { 32 add } if Product exch i exch put /i i 1 add def } forall \n"\ + " Product (ghostscript) search dup /IsGhostscript exch def\n"\ + " { pop pop } if\n"\ + " pop\n"\ + " IsGhostscript not {\n"\ + " statusdict /setpage known {\n"\ + " statusdict begin\n"\ + " RotateDrawing {\n"\ + " LeftMargin PageHeight add BotMargin DrawY add\n"\ + " }{\n"\ + " BotMargin DrawY add LeftMargin DrawX add \n"\ + " } ifelse\n"\ + " 0 setpage\n"\ + " end\n"\ + " } if\n"\ + " } if\n"\ + " %% set clipping boundary:\n"\ + " newpath\n"\ + " LeftMargin BotMargin moveto\n"\ + " 0 PageHeight rlineto\n"\ + " PageWidth 0 rlineto\n"\ + " 0 PageHeight neg rlineto\n"\ + " closepath\n"\ + " clip\n"\ + " %% set the origin:\n"\ + " LeftMargin BotMargin translate\n"\ + " RotateDrawing {\n"\ + " 0 PageHeight translate\n"\ + " -90 rotate\n"\ + " PageHeight Column mul neg PageWidth Row mul neg translate\n"\ + " }{\n"\ + " PageWidth Column mul neg PageHeight Row mul neg translate\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " %% move the lower left corner of the drawing to the origin:\n"\ + " MinDrawX neg MinDrawY neg translate\n"\ + " \n"\ + " %% Linestyle:\n"\ + " \n"\ + " 1 setlinecap\n"\ + " 1 setlinejoin\n"\ + " \n"\ + " } def\n"\ + "\n"\ + "%% TheDrawing\n" + +StartPage= "\ngsave %d %d SelectPage\n" ;(Row, Column) +EndPage = "showpage grestore\n" + +[PS_INVERTED] + +@PS +Long = "PostScript (printable, inverted)" + +Header3 = "%% Media size functions:\n"\ + "\n"\ + "/AbortMessage { %% Show a message in a box and stop printing\n"\ + " /h 100 def\n"\ + " /Courier findfont 12 scalefont setfont\n"\ + " mediawidth pagemargin sub h 1 setpage\n"\ + " newpath\n"\ + " 0 0 moveto\n"\ + " 0 h rlineto\n"\ + " mediawidth pagemargin sub 0 rlineto\n"\ + " 0 h neg rlineto\n"\ + " closepath\n"\ + " 5 setlinewidth\n"\ + " stroke\n"\ + " newpath 50 60 moveto (ERROR: Jobsize exceeds physical printing area!) show\n"\ + " newpath 50 40 moveto ( Job has been aborted!) show\n"\ + " showpage\n"\ + " stop\n"\ + " } def\n"\ + "\n"\ + "/SelectPage { %% Select the page identified by Row and Column\n"\ + " /Column exch def\n"\ + " /Row exch def\n"\ + "\n"\ + " %% the actually exposed area (if the machine knows these parameters!):\n"\ + "\n"\ + " /DrawX MaxDrawX MinDrawX sub def\n"\ + " /DrawY MaxDrawY MinDrawY sub def\n"\ + " statusdict /setpage known\n"\ + " statusdict /mediawidth known and\n"\ + " statusdict /medialength known and\n"\ + " statusdict /pagemargin known and {\n"\ + " %% this is for machines that can tell the media size:\n"\ + " statusdict begin\n"\ + " /MediaW mediawidth pagemargin sub def\n"\ + " DrawX DrawY ge {\n"\ + " DrawX MediaW le DrawY medialength le and {\n"\ + " MediaW DrawY 1 setpage\n"\ + " MediaW DrawX sub 2 div 0 translate\n"\ + " }{\n"\ + " DrawY MediaW le DrawX medialength le and {\n"\ + " MediaW DrawX 0 setpage\n"\ + " 0 MediaW DrawY sub 2 div translate\n"\ + " }{\n"\ + " AbortMessage\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " }{\n"\ + " DrawY MediaW le DrawX medialength le and {\n"\ + " MediaW DrawX 0 setpage\n"\ + " 0 MediaW DrawY sub 2 div translate\n"\ + " }{\n"\ + " DrawX MediaW le DrawY medialength le and {\n"\ + " MediaW DrawY 1 setpage\n"\ + " MediaW DrawX sub 2 div 0 translate\n"\ + " }{\n"\ + " AbortMessage\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " end\n"\ + " }{\n"\ + " %% this is for machines that can NOT tell the media size:\n"\ + " %% (Ghostscript doesn't like this!)\n"\ + " /Product product length string def\n"\ + " /i 0 def\n"\ + " product { dup 97 lt { 32 add } if Product exch i exch put /i i 1 add def } forall \n"\ + " Product (ghostscript) search dup /IsGhostscript exch def\n"\ + " { pop pop } if\n"\ + " pop\n"\ + " IsGhostscript not {\n"\ + " statusdict /setpage known {\n"\ + " statusdict begin\n"\ + " RotateDrawing {\n"\ + " LeftMargin PageHeight add BotMargin DrawY add\n"\ + " }{\n"\ + " BotMargin DrawY add LeftMargin DrawX add \n"\ + " } ifelse\n"\ + " 0 setpage\n"\ + " end\n"\ + " } if\n"\ + " } if\n"\ + " %% set clipping boundary:\n"\ + " newpath\n"\ + " LeftMargin BotMargin moveto\n"\ + " 0 PageHeight rlineto\n"\ + " PageWidth 0 rlineto\n"\ + " 0 PageHeight neg rlineto\n"\ + " closepath\n"\ + " clip\n"\ + " %% set the origin:\n"\ + " LeftMargin BotMargin translate\n"\ + " RotateDrawing {\n"\ + " 0 PageHeight translate\n"\ + " -90 rotate\n"\ + " PageHeight Column mul neg PageWidth Row mul neg translate\n"\ + " }{\n"\ + " PageWidth Column mul neg PageHeight Row mul neg translate\n"\ + " } ifelse\n"\ + " } ifelse\n"\ + " %% move the lower left corner of the drawing to the origin:\n"\ + " MinDrawX neg MinDrawY neg translate\n"\ + " \n"\ + " %% Linestyle:\n"\ + " \n"\ + " 1 setlinecap\n"\ + " 1 setlinejoin\n"\ + " \n"\ + " %% invert drawing:\n"\ + " newpath\n"\ + " MinDrawX MinDrawY moveto\n"\ + " MaxDrawX MinDrawY lineto\n"\ + " MaxDrawX MaxDrawY lineto\n"\ + " MinDrawX MaxDrawY lineto\n"\ + " 0 setgray\n"\ + " closepath fill\n"\ + " 1 setgray\n"\ + " \n"\ + " } def\n"\ + "\n"\ + "%% TheDrawing\n" + +[PS_DINA3] + +@PS +Long = "Postscript (printable) DIN A3" +Width = 11.36 +Height = 16.00 + +[HPGL2] + +Type = Generic +Long = "HP-GL/2 printer" +Init = "\x1B%%1BIN;IP0,0,100,100SC0,100,0,100"\ + "WU1MC1NP14CR0,15,0,15,0,15"\ + "PC1,15,0,15PC2,0,15,15PC3,0,0,15PC4,15,15,0"\ + "PC5,15,0,0PC6,0,15,0PC7,0,0,0PC8,15,12,15"\ + "PC9,12,15,15PC10,12,12,15PC11,15,15,12PC12,15,12,0"\ + "PC13,12,15,0PC14,11,11,11"\ + "PA;\n" + +;Use the following as first line of the Init string for A3 sized paper: +;Init = "\x1B&l27A\x1B%%-1BIN;IP0,0,100,100SC0,100,0,100"\ + +Reset = "\x1B%%0A\f" +ResX = 1016 +ResY = 1016 +HwArcX1Y1CxCyA = "PU%d,%dPDAA%d,%d,%d\n" ; (x1, y1, xc, yc, ArcAngle) +HwColor = "SP%u" ; (Pen-Number) +HwLine = "PU%d,%dPD%d,%d\n" +HwPoly1 = "PU%d,%dPM0PA%d,%d" ; first edge +HwPoly2 = ",%d,%d" ; other points +HwPoly3 = "PM2FP;\n" ; end of polygon +HwWidth = "PW%u" ; (Pen-Width) +MaxHwWidth = 5 + +[GERBER] + +Type = PhotoPlotter +Long = "Gerber photoplotter" +Init = "G01*\nX000000Y000000D02*\n" +Reset = "X000000Y000000D02*\nM02*\n" +ResX = 10000 +ResY = 10000 +;Wheel = "" +Move = "X%0.6dY%0.6dD02*\n" ; (x, y) +Draw = "X%0.6dY%0.6dD01*\n" ; (x, y) +Flash = "X%0.6dY%0.6dD03*\n" ; (x, y) +Aperture = "%s*\n" ; (Aperture code) +Units = Inch +Info = "Plotfile Info:\n"\ + "\n"\ + " Coordinate Format : 2.4\n"\ + " Coordinate Units : Inch\n"\ + " Data Mode : Absolute\n"\ + " Zero Suppression : None\n"\ + " End Of Block : *\n"\ + "\n" + +[GERBERAUTO] + +@GERBER +Long = "Gerber photoplotter with automatic aperture wheel generation" +Wheel = "" ; avoids message! +AutoAperture = "D%d" ; (Aperture number) +FirstAperture = 10 +Units = Inch +;MaxApertureSize = 0.2 ; Inch + +[GERBER_RS274X] + +@GERBERAUTO +Long = "Gerber RS-274-X photoplotter, coordinate format 2.4 inch" +Units = Inch +Init = "G75*\n" \ allow positive and negative coordinates + "G70*\n" \ units are Inch (G71 for metric) + "%%OFA0B0*%%\n" \ horizonal and vertical OFfset is 0 + "%%FSLAX24Y24*%%\n"\ Format Statement is Absolute (I for incremental) 2.4 + "%%IPPOS*%%\n" \ Image Polarity is POSitive (NEG for negative) + "%%LPD*%%\n" \ Layer Polarity Dark (C for clear on negative planes) + "%%AMOC8*\n5,1,8,0,0,1.08239X$1,22.5*\n"\ Octagons are emulated with a circle (using 8 vertices) + "%%\n" ; and therefore the diameter must be enlarged with '1 / cos(pi / 8)' +Reset = "M02*\n" +Circle = "%%AD%sC,%6.4f*%%\n" ; (code, diameter) +Rectangle = "%%AD%sR,%6.4fX%6.4f*%%\n" ; (code, dx, dy) +Oval = "%%AD%sO,%6.4fX%6.4f*%%\n" ; (code, dx, dy) +; According to the RS-274-X specs there is an aperture macro +; primitive that allows us to specify an octagon (i.e. a polygon with +; 8 vertices). As some Gerber viewers seem to have problems with that, +; we would have to use a round shape for that. +; If your Gerber processor cannot handle the polygon primitive you may +; uncomment the following line and comment out the line after it: +;Octagon = "%%AD%sC,%6.4f*%%\n" ; (code, diameter) (looks like there is no octagon, so we take a circle) +Octagon = "%%AD%sOC8,%6.4f*%%\n" ; (code, diameter) +Annulus = "%%AMAN%s*\n1,1,%6.4f,0,0*\n1,0,%6.4f,0,0*\n"\ + "%%\n"\ + "%%AD%sAN%s*%%\n" ; (code, diameter, inner diameter, code, code) +Thermal = "%%AMTH%sX*\n1,1,%6.4f,0,0*\n1,0,%6.4f,0,0*\n"\ + "21,0,%6.4f,%6.4f,0,0,45*\n21,0,%6.4f,%6.4f,0,0,135*\n"\ + "%%\n"\ + "%%AD%sTH%sX*%%\n"; (code, diameter, inner diameter, diameter + 2mil, gap, diameter + 2mil, gap, code, code) +AreaBegin = "G36*\n" +AreaEnd = "G37*\n" + +[GERBER_RS274X_25] + +@GERBERAUTO +Long = "Gerber RS-274-X photoplotter, coordinate format 2.5 inch" +Units = Inch +Info = "Plotfile Info:\n"\ + "\n"\ + " Coordinate Format : 2.5\n"\ + " Coordinate Units : Inch\n"\ + " Data Mode : Absolute\n"\ + " Zero Suppression : None\n"\ + " End Of Block : *\n"\ + "\n" +Init = "G75*\n" \ allow positive and negative coordinates + "G70*\n" \ units are Inch (G71 for metric) + "%%OFA0B0*%%\n" \ horizonal and vertical OFfset is 0 + "%%FSLAX25Y25*%%\n"\ Format Statement is Absolute (I for incremental) 2.5 + "%%IPPOS*%%\n" \ Image Polarity is POSitive (NEG for negative) + "%%LPD*%%\n" \ Layer Polarity Dark (C for clear on negative planes) + "%%AMOC8*\n5,1,8,0,0,1.08239X$1,22.5*\n"\ Octagons are emulated with a circle (using 8 vertices) + "%%\n" ; and therefore the diameter must be enlarged with '1 / cos(pi / 8)' +Reset = "M02*\n" +ResX = 100000 +ResY = 100000 +Move = "X%0.7dY%0.7dD02*\n" ; (x, y) +Draw = "X%0.7dY%0.7dD01*\n" ; (x, y) +Flash = "X%0.7dY%0.7dD03*\n" ; (x, y) +Circle = "%%AD%sC,%7.5f*%%\n" ; (code, diameter) +Rectangle = "%%AD%sR,%7.5fX%7.5f*%%\n" ; (code, dx, dy) +Oval = "%%AD%sO,%7.5fX%7.5f*%%\n" ; (code, dx, dy) +; According to the RS-274-X specs there is an aperture macro +; primitive that allows us to specify an octagon (i.e. a polygon with +; 8 vertices). As some Gerber viewers seem to have problems with that, +; we would have to use a round shape for that. +; If your Gerber processor cannot handle the polygon primitive you may +; uncomment the following line and comment out the line after it: +;Octagon = "%%AD%sC,%7.5f*%%\n" ; (code, diameter) (looks like there is no octagon, so we take a circle) +Octagon = "%%AD%sOC8,%7.5f*%%\n" ; (code, diameter) +Annulus = "%%AMAN%s*\n1,1,%7.5f,0,0*\n1,0,%7.5f,0,0*\n"\ + "%%\n"\ + "%%AD%sAN%s*%%\n" ; (code, diameter, inner diameter, code, code) +Thermal = "%%AMTH%sX*\n1,1,%7.5f,0,0*\n1,0,%7.5f,0,0*\n"\ + "21,0,%7.5f,%7.5f,0,0,45*\n21,0,%7.5f,%7.5f,0,0,135*\n"\ + "%%\n"\ + "%%AD%sTH%sX*%%\n"; (code, diameter, inner diameter, diameter + 2mil, gap, diameter + 2mil, gap, code, code) +AreaBegin = "G36*\n" +AreaEnd = "G37*\n" + +[GERBER_23] + +Type = PhotoPlotter +Long = "Gerber photoplotter, coordinate format 2.3 inch" +Init = "G01*\nX00000Y00000D02*\n" +Reset = "X00000Y00000D02*\nM02*\n" +ResX = 1000 +ResY = 1000 +;Wheel = "" +Move = "X%0.5dY%0.5dD02*\n" ; (x, y) +Draw = "X%0.5dY%0.5dD01*\n" ; (x, y) +Flash = "X%0.5dY%0.5dD03*\n" ; (x, y) +Aperture = "%s*\n" ; (Aperture code) +Units = Inch +Info = "Plotfile Info:\n"\ + "\n"\ + " Coordinate Format : 2.3\n"\ + " Coordinate Units : Inch\n"\ + " Data Mode : Absolute\n"\ + " Zero Suppression : None\n"\ + " End Of Block : *\n"\ + "\n" + +[GERBERAUTO_23] + +@GERBER_23 +Long = "Gerber photoplotter with automatic aperture wheel generation" +Wheel = "" ; avoids message! +AutoAperture = "D%d" ; (Aperture number) +FirstAperture = 10 +Units = Inch + +[EMMA] + +Type = PhotoPlotter +Long = "EMMA 30/80 photoplotter" +Init = "%%\nS7X000000Y000000\n" +Reset = "S7X000000Y000000\n$\n" +ResX = 20000 +ResY = 20000 +;Wheel = "" +Move = "S7X%0.6dY%0.6d\n" ; (x, y) +Draw = "S2X%0.6dY%0.6d\n" ; (x, y) +Flash = "S1X%0.6dY%0.6d\n" ; (x, y) +Aperture = "%s\n" ; (Aperture code) +Info = "Plotfile Info:\n"\ + "\n"\ + " Coordinate Format : 6\n"\ + " Coordinate Units : 1/800 mm\n"\ + " Data Mode : Absolute\n"\ + " Zero Suppression : None\n"\ + "\n" + +[GLASER] + +Type = PhotoPlotter +Long = "GLASER DP-1504 photoplotter" +Init = "IN;FC0.0254;CS1,1,0;SI1,1;\n" +Reset = "PU;PA0,0;\n" +ResX = 1000 +ResY = 1000 +Wheel = "glaser.whl" +Move = "PA%d,%d;\n" ; (x, y) +Draw = "PA%d,%d;\n" ; (x, y) +PenDown = "PD;\n" +PenUp = "PU;\n" +Flash = "PA%d,%d;%s\n" ; (x, y, Aperture code) +Aperture = "%s\n" ; (Aperture code) +Info = "Plotfile Info:\n"\ + "\n"\ + " Coordinate Units : 1/1000 Inch\n"\ + " Data Mode : Absolute\n"\ + "\n" + +[EXCELLON] + +Type = DrillStation +Long = "Excellon drill station" +Init = "%%\nM48\nM72\n" +Reset = "M30\n" +ResX = 10000 +ResY = 10000 +;Rack = "" +DrillSize = "%sC%0.4f\n" ; (Tool code, tool size) +AutoDrill = "T%02d" ; (Tool number) +FirstDrill = 1 +BeginData = "%%\n" +Units = Inch +Select = "%s\n" ; (Drill code) +Drill = "X%1.0fY%1.0f\n" ; (x, y) +Info = "Drill File Info:\n"\ + "\n"\ + " Data Mode : Absolute\n"\ + " Units : 1/10000 Inch\n"\ + "\n" + +[EXCELLON_RACK] + +Type = DrillStation +Long = "Excellon drill station with user supplied rack file" +Init = "%%\n" +Reset = "M30\n" +ResX = 10000 +ResY = 10000 +;Rack = "" +Select = "%s\n" ; (Drill code) +Drill = "X%1.0fY%1.0f\n" ; (x, y) +Info = "Drill File Info:\n"\ + "\n"\ + " Data Mode : Absolute\n"\ + " Units : 1/10000 Inch\n"\ + "\n" + +[SM1000] + +Type = DrillStation +Long = "Sieb & Meyer 1000 drill station" +Init = "%%%%1000\n" +Reset = "M30\n" +ResX = 2540 +ResY = 2540 +;Rack = "" +Drill = "X%1.0fY%1.0f%s\n" ; (x, y, drill code) +Info = "Drill File Info:\n"\ + "\n"\ + " Data Mode : Absolute\n"\ + " Units : 1/100 mm\n"\ + "\n" + +[SM3000] + +Type = DrillStation +Long = "Sieb & Meyer 3000 drill station" +Init = "%%%%3000\n" +Reset = "M30\n" +ResX = 25400 +ResY = 25400 +Divide = 1000 ; makes coordinates MM +;Rack = "" +Drill = "X%1.3fY%1.3f%s\n" ; (x, y, drill code) +Info = "Drill File Info:\n"\ + "\n"\ + " Data Mode : Absolute\n"\ + " Units : mm\n"\ + "\n" + +[SMS68] + +Type = DrillStation +Long = "SMS68 drill station" +Init = ";\n" +Reset = "TO0;PA0,0;\n" +ResX = 25400 +ResY = 25400 +;Rack = "" +Select = "%s;\n" ; (Drill code) +Drill = "PA%1.0f,%1.0f;PD;PU;\n" ; (x, y) +Info = "Drill File Info:\n"\ + "\n"\ + " Data Mode : Absolute\n"\ + " Units : 1/1000 mm\n"\ + "\n" + +[GBRDRL] + +Type = DrillStation +Long = "Gerber Drill Code" +Init = "G01*\nX00000Y00000D02*\n" +Reset = "X00000Y00000D02*\nM02*\n" +ResX = 1000 +ResY = 1000 +;Rack = "" +Select = "%s*\n" ; (Drill code) +Drill = "X%05.0fY%05.0fD03*\n" ; (x, y) +Info = "Drill File Info:\n"\ + "\n"\ + " Coordinate Format : 2.3\n"\ + " Coordinate Units : Inch\n"\ + " Data Mode : Absolute\n"\ + " Zero Suppression : None\n"\ + " End Of Block : *\n"\ + "\n" + +[CALCOMP] + +Type = Calcomp +Long = "CalComp PCI pen plotter" +Init = "\x08\x0B" \ Init + "\x09\x01" ; Scaling 1 +Reset = "" +ResX = 2032 +ResY = 2032 +PenSelect = "\x04%c" ; Pens numbered 1..n +Sync = "\x02" +Bias = 0x20 +Radix = 0x40 +Buffer = 256 +Checksum = YES + +[CALCOMPE] + +Type = CalcompE +Long = "CalComp PCI electrostatic plotter" +Init = "\x08\x0B" \ Init + "\x09\x01" ; Scaling 1 +Reset = "" +ResX = 2032 +ResY = 2032 +Sync = "\x02" +Bias = 0x20 +Radix = 0x40 +Buffer = 256 +Checksum = YES + +[CALCOMP_M84] + +Type = PenPlotter +Long = "Calcomp M84 Plotter" +Init = "" +Reset = "F\nH\nR0\n" +Width = 16 +Height = 11 +ResX = 254 +ResY = 254 +PenSelect = "F%u\n" +Move = "C %d,%d HK\n" +Draw = "C %d,%d IK\n" +PenCircleCxCyRxCxCyRx = "C %d,%d HK \n O0 %d,0,360\n" +PenVelocity = "F10,%d\n" diff --git a/eagle-5.7.0/bin/eagle.key b/eagle-5.7.0/bin/eagle.key new file mode 100644 index 0000000..33b363b Binary files /dev/null and b/eagle-5.7.0/bin/eagle.key differ diff --git a/eagle-5.7.0/bin/eagle_de.htm b/eagle-5.7.0/bin/eagle_de.htm new file mode 100644 index 0000000..8bf64fc --- /dev/null +++ b/eagle-5.7.0/bin/eagle_de.htm @@ -0,0 +1,17353 @@ + +
+EAGLE Help Version 5.7.0 | ++Copyright © 2010 CadSoft Computer GmbH + |
+Die Erklärung eines Befehls kann auch durch die Eingabe von +
+HELP befehl ++aufgerufen werden. +
+Ersetzen Sie "befehl" beispielsweise durch MOVE, dann rufen Sie +die Hilfe-Seite für den MOVE-Befehl auf. +
+Von jeder anderen Stelle aus öffnet F1 eine "kontextsensitive" +Hilfe-Seite. +
+Folgende Hilfe-Seiten geben Auskunft für den Einstieg in das Programm. +
+ + + ++Für die Befehle ASSIGN und SET exisitieren auch Dialoge, die über das +Options-Menü der Editor-Fenster aufgerufen werden. +
Befehlsmenü | MENU-Befehl..; | |
Tastenbelegung | ASSIGN function_key-Befehl..; | |
Snap-Funktion | SET SNAP_LENGTH number; | |
SET CATCH_FACTOR value; | ||
SET SELECT_FACTOR value; | ||
Inhalt von Menüs | SET USED_LAYERS name | number; | |
SET WIDTH_MENU value..; | ||
SET DIAMETER_MENU value..; | ||
SET DRILL_MENU value..; | ||
SET SMD_MENU value..; | ||
SET SIZE_MENU value..; | ||
SET ISOLATE_MENU value..; | ||
SET SPACING_MENU value..; | ||
SET MITER_MENU value..; | ||
Wire Bend | SET WIRE_BEND bend_nr; | |
Beep ein/aus | SET BEEP OFF | ON; |
Farbe für Grid-Linien | SET COLOR_GRID color; | |
Farbe für Layer | SET COLOR_LAYER layer color; | |
Fill Style für Layer | SET FILL_LAYER layer fill; | |
Grid-Parameter | SET MIN_GRID_SIZE pixels; | |
min. dargest. Textgröße | SET MIN_TEXT_SIZE size; | |
Darst. der Netzlinien | SET NET_WIRE_WIDTH width; | |
Darst. der Pads | SET DISPLAY_MODE REAL | NODRILL; | |
SET PAD_NAMES OFF | ON; | ||
Darst. der Buslinien | SET BUS_WIRE_WIDTH width; | |
DRC-Füllmuster | SET DRC_FILL fill_name; | |
Polygon-Berechnung | SET POLYGON_RATSNEST OFF | ON; | |
Vector Font | SET VECTOR_FONT OFF | ON; |
Package-Check | SET CHECK_CONNECTS OFF | ON; | |
Grid-Parameter | GRID options; | |
Replace-Modus | SET REPLACE_SAME NAMES | COORDS; | |
UNDO-Buffer | SET UNDO_LOG OFF | ON; | |
Wire-Optimierung | SET OPTIMIZING OFF | ON; | |
Net-Wire beenden | SET AUTO_END_NET OFF | ON; | |
Automatische Junctions | SET AUTO_JUNCTION OFF | ON; |
Pad-Form | CHANGE SHAPE shape; | |
Wire-Breite | CHANGE WIDTH value; | |
Pad/Via-Durchmesser | CHANGE DIAMETER diameter; | |
Pad/Via/Hole-Bohrd. | CHANGE DRILL value; | |
Smd-Größe | CHANGE SMD width height; | |
Text-Höhe | CHANGE SIZE value; | |
Text-Linienbreite | CHANGE RATIO ratio; | |
Text-Font | CHANGE FONT font; | |
Polygon-Parameter | CHANGE THERMALS OFF | ON; | |
Polygon-Parameter | CHANGE ORPHANS OFF | ON; | |
Polygon-Parameter | CHANGE ISOLATE distance; | |
Polygon-Parameter | CHANGE POUR SOLID | HATCH; | |
Polygon-Parameter | CHANGE RANK value; | |
Polygon-Parameter | CHANGE SPACING distance; |
+eagle [ Optionen [ Dateiname [ Layer ] ] ] ++
-Cxxx | den angegebenen Befehl ausführen | |
-Dxxx | Draw-Toleranz (0.1 = 10%) | |
-Exxx | Drill-Toleranz (0.1 = 10%) | |
-Fxxx | Flash-Toleranz (0.1 = 10%) | |
-N- | keine Rückfragen in der Kommandozeile | |
-O+ | Stift-Bewegungen optimieren | |
-Pxxx | Plotter-Stift (Layer=Stift) | |
-Rxxx | Bohrer-Datei | |
-Sxxx | Script-Datei | |
-Wxxx | Blenden-Datei | |
-X- | CAM-Prozessor ausführen | |
-a- | Annulus-Blenden emulieren | |
-c+ | positive Koordinaten | |
-dxxx | Ausgabegerät (-d? für Liste) | |
-e- | Blenden emulieren | |
-f+ | Pads ausfüllen | |
-hxxx | Seitenhöhe (inch) | |
-m- | Ausgabe spiegeln | |
-oxxx | Ausgabedateiname | |
-pxxx | Stiftdurchmesser (mm) | |
-q- | Quick-Plot | |
-r- | Ausgabe um 90 Grad drehen | |
-sxxx | Skalierungsfaktor | |
-t- | Thermal-Blenden emulieren | |
-u- | Ausgabe auf dem Kopf stehend | |
-vxxx | Stiftgeschwindigkeit | |
-wxxx | Seitenbreite (inch) | |
-xxxx | X-Versatz (inch) | |
-yxxx | Y-Versatz (inch) |
+Hierbei bedeutet xxx, dass weitere Daten, z. B. ein Dateiname oder +eine Dezimalzahl an den Optionsbuchstaben angehängt werden müssen (ohne oder mit +Leerzeichen), wie zum Beispiel bei +
+-Wmywheel.whl +-W mywheel.whl +-e Blenden-Emulation ein +-e+ dto. +-e- Blenden-Emulation aus ++Bei Schalter-Optionen bedeutet ein '-', dass der Schalter standardmäßig +ausgeschaltet ist, während er bei '+' standardmäßig eingeschaltet ist. +
+Schalter-Optionen (z.B. -e) können ohne Wiederholung des '-'-Zeichens +verwendet werden: +
-eatm | Blenden-Emulation ein, Annulus- und Thermal-Emulation aus, Ausgabe spiegeln | |
-ea-t+ | Blenden-Emulation ein, Annulus-Emulation aus, Thermal-Emulation ein |
-D0.10 | stellt Draw-Toleranz auf ±10% ein | |
-D+0.1 -D-0.05 | stellt Draw-Toleranz auf +10% und -5% ein |
+eagle -C "window (1 1) (2 2);" myboard.brd ++so lädt EAGLE die angegebene Datei und führt den Befehl so aus, als wäre +er in der Kommandozeile des Editor-Fensters eingegeben worden. +
+Folgende Bedingungen gelten für die Option '-C': +
+eagle -C "" ++Beachten Sie bitte, dass in diesem speziellen Fall ein Leerzeichen zwischen dem +Options-Buchstaben und den Anführungszeichen sein muss, damit das Programm den +explizit leeren String sieht. Es muss dann auch kein Dateiname angegeben werden, +da ja kein Befehl ausgeführt werden soll. +
+Wann immer Koordinaten oder Abmessungen (z.B. Leiterbahnbreiten oder Pad-Durchmesser)
+angegeben werden können, können diese mit Einheiten versehen werden, wie etwa 50mil
+oder 0.8mm. Wird keine Einheit angegeben, so wird die aktuelle Grid-Einheit verwendet.
+
+
+
+Schaltplan entwerfen
+Schaltplan anlegen
+Neuen Schaltplan mit "Datei/Neu" anlegen und mit "Datei/Speichern unter..." unter neuem
+Namen abspeichern.
+Zeichnungsrahmen laden
+Bibliothek FRAMES mit USE laden und Rahmen mit ADD plazieren.
+
+Es entsteht eine Leerplatine, neben der die mit Luftlinien verbundenen +Bauelemente plaziert sind. Versorgungs-Pins werden mit den Signalen +verbunden, die ihrem Namen entsprechen, falls nicht explizit ein +anderes Netz mit ihnen verbunden wurde. +
+Die Platine ist über die Forward&Back-Annotation mit dem Schaltplan +verbunden. Damit ist gewährleistet, dass beide übereinstimmen. Um die +Forward&Back-Annotation aufrechtzuerhalten, sollten Sie immer beide +Dateien geladen haben, wenn Sie Änderungen am Schaltplan oder an +der Platine durchführen. +
+Öffnen Sie eine Bibliothek mit Öffnen oder Neu im Datei-Menü. +
+Klicken Sie das Edit-Package-Icon an, und tragen Sie den gewünschten +Namen in das New-Feld ein. +
+Legen Sie das Raster fest (GRID). +
+Plazieren Sie die Pads (PAD) und legen Sie deren Namen (NAME) und +Parameter fest (CHANGE). +
+Plazieren Sie mit dem TEXT-Befehl die Strings >NAME und >VALUE +(repräsentieren den aktuellen Namen und Wert in der Platine), und +zeichnen Sie das Gehäuse (WIRE-Befehl) in die entsprechenden Layer. +
+Klicken Sie das Edit-Symbol-Icon an, und tragen Sie den gewünschten +Namen in das New-Feld ein. +
+Plazieren Sie die Pins (PIN) und legen Sie deren Namen (NAME) und +Parameter fest (CHANGE). +
+Plazieren Sie mit dem TEXT-Befehl die Strings >NAME und >VALUE +(repräsentieren den aktuellen Namen und Wert im Schaltplan), und +zeichnen Sie das Symbol (WIRE-Befehl) in die entsprechenden Layer. +
+Klicken Sie das Edit-Device-Icon an, und tragen Sie den gewünschten +Namen in das New-Feld ein. +
+Weisen Sie dem Device ein Gehäuse zu (PACKAGE-Befehl). +
+Verwenden Sie den ADD-Befehl, um das Symbol oder die Symbole in das +Device zu holen. +
+Klicken Sie auf das CONNECT-Icon, um festzulegen, welche Pins mit +welchen Gehäuse-Pads verbunden sind. +
+Speichern Sie die Bibliothek, und sie kann anschließend vom
+Schaltplan- oder vom Board-Editor aus mit USE geladen werden.
+
+
+
+Control Panel
+Das Control Panel ist EAGLEs Steuerzentrale.
+Es enthält in der linken Fensterhälfte eine Baumstruktur und ein Informationsfenster
+in der rechten Hälfte.
+Verzeichnisse einstellen
+Die Haupteinträge in der Baumansicht repräsentieren die verschiedenen EAGLE-Dateitypen.
+Jeder der Einträge kann auf ein oder mehrere Verzeichnisse zeigen, die Dateien dieses
+Typs enthalten.
+Die Verzeichnisse werden im Directories-Dialog definiert.
+Wenn einer der Haupteinträge auf ein Verzeichnis zeigt, sehen Sie nach dem Aufklappen
+des Eintrags (entweder durch einen Klick auf das kleine Symbol links oder durch einen
+Doppelklick auf den Eintrag selbst) direkt den Inhalt des Verzeichnisses.
+Wenn ein Haupteintrag auf mehrere Verzeichnisse zeigt, werden nach dem Aufklappen alle
+Verzeichniseinträge aufgelistet.
+
+
Verzeichnisse | Die Datei mit dem Namen DESCRIPTION darin | |
Bibliotheken | DESCRIPTION-Befehl in der Bibliothek | |
Devices | DESCRIPTION-Befehl im Device-Editor | |
Packages | DESCRIPTION-Befehl im Package-Editor | |
Design-Regeln | Die Beschreibung der Design-Regel-Datei im DRC-Dialog | |
User-Language-Programme | Text, durch die #usage-Anweisung gekennzeichnet | |
Script-Dateien | Der Kommentar am Anfang der Script-Datei | |
CAM-Jobs | DESCRIPTION-Befehl im CAM-Prozessor-Job |
Neu | Erzeugt eine neue Datei | |
Öffnen | Öffnet eine existierende Datei | |
Zuletzt geöffnete Projekte | Öffnet eines der zuletzt bearbeiteten Projekte | |
Alles speichern | Speichert alle modifizierten Editor-Dateien | |
Projekt schließen | Schließt das aktuelle Projekt | |
Beenden | Beendet das Programm |
Aktualisieren | Aktualisiert den Inhalt der Baumansicht | |
Sortieren | Ändert die Sortierung der Baumansicht |
Verzeichnisse... | Öffnet den Verzeichnis-Dialog | |
Sicherung... | Öffnet den Sicherungs-Dialog | |
Benutzeroberfläche... | Öffnet den Benutzeroberfläche-Dialog | |
Fensterpositionen... | Öffnet den Fensterpositionen-Dialog |
Control Panel | Zum Control Panel wechseln | |
1 Schaltplan - ... | Zu Fenster 1 wechseln | |
2 Board - ... | Zu Fenster 2 wechseln |
Allgemein | Öffnet eine allgemeine Hilfe-Seite | |
Kontext | Öffnet die Hilfe-Seite für den momentanen Kontext | |
Control Panel | Öffnet diese Hilfe-Seite | |
EAGLE Lizenz | Öffnet den Lizenz-Dialog | |
Auf Update prüfen | Prüft ob eine neue Version von EAGLE verfügbar ist | |
Über EAGLE | Zeigt Details zu Ihrer EAGLE Version und Lizenz an |
+Wird eine Datei über dies Kontext-Menü Option ausgedruckt, so wird immer
+die Datei von der Platte gelesen, auch wenn Sie ein offenes Editor Fenster
+haben in dem Sie die Datei editieren! Benutzen Sie den
+PRINT-Befehl um eine Zeichnung aus einem offenen
+Editor Fenster heraus zu drucken.
+Bitte beachten Sie, dass Polygone in Platinen beim Ausdrucken über das
+Kontext-Menü nicht automatisch freigerechnet werden! Es werden lediglich die
+Umrisse dargestellt. Um die Polygone freigerechnet auszudrucken, laden Sie
+die Zeichnung in ein Editor-Fenster, geben Sie
+RATSNEST ein und dann
+PRINT.
+
+Alle Felder können ein oder mehrere, durch Doppelpunkt (':') getrennte +Verzeichnisse enthalten, in denen nach den verschiedenen Dateitypen gesucht wird. +
+Unter Windows werden die einzelnen Verzeichnisnamen durch Strichpunkte (';') getrennt. + |
+Die Variablen $HOME und $EAGLEDIR werden verwendet, um das +Home-Verzeichnis des Benutzers bzw. das EAGLE-Programm-Verzeichnis anzugeben. +
+Unter Windows gilt für $HOME entweder die Umgebungsvariable HOME (falls gesetzt), +oder der Wert des Schlüssels "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal" +in der Windows-Registry, der den gültigen Pfad des Verzeichnisses "Eigene Dateien" enthält. + |
Menüleiste | aktiviert das Pulldown-Menü am oberen Rand des Editor-Fensters | |
Aktionsleiste | aktiviert die Toolbar mit Buttons für "Datei", "Drucken" etc. | |
Parameterleiste | aktiviert die dynamische Parameter-Toolbar, die alle Parameter des gerade aktiven Befehls enthält | |
Befehlsmenü | aktiviert die Kommando-Toolbar | |
Textmenü | aktiviert das Text-Menü | |
Seitenvorschau | aktiviert die Vorschau für Schaltplanseiten |
Hintergrund | wählt die Hintergrundfarbe schwarz, weiß oder farbig im Layout-Editor | |
Mauszeiger | wählt einen kleines Kreuz oder ein großes Fadenkreuz als Mauszeiger im Layout-Editor |
Hintergrund | wählt die Hintergrundfarbe schwarz, weiß oder farbig im Schaltplan-Editor | |
Mauszeiger | wählt ein kleines Kreuz oder ein großes Fadenkreuz als Mauszeiger im Schaltplan-Editor |
Direkthilfe | aktiviert die "Direkthilfe" Funktion, die einen kurzen Hinweis über die Bedeutung der Buttons gibt, wenn man den Mauszeiger über einen solchen bewegt | |
Benutzerführung | aktiviert die "Benutzerführung", die einen Hilfetext anzeigt, der dem Benutzer bei aktivem Befehl jederzeit den nächsten sinnvollen Schritt angibt |
Immer Vektor-Schrift | Texte in Zeichnungen werden immer im EAGLE-eigenen +Vektor-Font dargestellt, unabhängig welche Schriftart für einen Text ursprünglich gewählt wurde. | |
Mausrad-Zoomfaktor | definiert den Zoom-Faktor für das Hinein- bzw. +Herauszoomen mit einer Rädchenmaus in einem Editor-Fenster ('0' schaltet diese +Funktion aus, das Vorzeichen bestimmt die Drehrichtung des Rädchens) |
+Sie können auch alle gespeicherten Fensterpositionen löschen, so dass es wieder
+dem Window-Manager überlassen ist, wo neu geöffnete Fenster platziert werden.
+
+
+
+
+Der Konfigurieren-Button öffnet einen Dialog, in dem Sie angeben können ob
+und wie häufig eine automatische Überprüfung auf eine neue Version beim
+Programmstart stattfinden soll (standardmäßig geschieht dies einmal am Tag).
+Falls Sie einen Proxy benützen müssen, um das Internet anzusprechen, so
+können Sie diesen auch im Konfigurationsdialog angeben. Geben Sie den Namen
+in der Form
+
+Falls Sie auch über Betaversionen von EAGLE informiert werden möchten, so
+können sie die Option "Auch auf Betaversionen prüfen" einschalten.
+
+
+
+
+Auf deutschen Tastaturen wird die Ctrl-Taste meist als Strg
+bezeichnet und die Shift-Taste als "Umschalt-Taste". Da EAGLE an einigen
+Stellen Code-Buchstaben für die Bezeichnung dieser Tasten verwendet (siehe
+ASSIGN und Befehlseingabe)
+verwenden wir durchgehend die Bezeichnungen Ctrl und Shift.
+Auf Update prüfen
+Die Option "Hilfe/Auf Update prüfen" im Pulldown-Menü des Control-Panels
+öffnet einen Dialog, der anzeigt, ob auf dem CadSoft-Server eine neue
+Version von EAGLE zur Verfügung steht.
+
+hostname:port
+
+ein, wobei hostname der volle Name des Proxy-Rechners ist, ohne etwaigen
+http://-Präfix, und port eine optionale Port-Nummer.
+Tastatur und Maus
+Die Steuertasten (Alt, Ctrl und Shift) werden benutzt
+um das Verhalten bestimmter Maus-Aktionen zu verändern.
+Beachten Sie bitte, dass abhänging vom verwendeten Betriebssystem bzw. Window-Manager
+manche dieser Tasten (in Kombination mit Maus-Aktionen) möglicherweise nicht an
+Applikationen weitergeleitet werden, was zur Folge hat, dass einige der hier beschriebenen
+Funktionen dann nicht verfügbar sind.
+Alt
+Ein Druck auf die Alt-Taste schaltet auf ein alternatives GRID
+um. Dies kann typischerweise ein feineres Raster als das normale sein, wodurch es
+zum Beispiel schnell und einfach möglich ist etwas in einem dicht belegten Gebiet
+fein zu positionieren, wofür das normal Raster zu grob wäre.
+Das alternative Grid bleibt so lange aktiv, wie die Alt-Taste gedrückt
+gehalten wird.
+Ctrl
+Wird die Ctrl-Taste zusammen mit der rechten Maustaste gedrückt so wird
+zwischen korrespondierenden Knickwinkeln hin und her geschaltet (dies betrifft nur
+Befehle die Wire-Knickwinkel unterstützen, wie etwa WIRE).
+
+Die Ctrl-Taste zusammen mit der linken Maustaste steuert spezielle Funktionen +der einzelnen Befehle, wie zum Beispiel das Aufnehmen eines Objektes an seinem +Aufhängepunkt beim MOVE-Befehl. +
+Falls ein Befehl eine Gruppe selektieren kann, so muss die Ctrl-Taste zusammen +mit der rechten Maustaste gedrückt werden, um die Gruppe zu selektieren (ansonsten +würde ein Kontext-Menü für das ausgewählte Objekt geöffnet). +
+
+Unter Mac OS X ist anstatt der Ctrl-Taste die Cmd-Taste +zu verwenden. + |
+Die Shift-Taste zusammen mit der linken Maustaste steuert spezielle Funktionen +der einzelnen Befehle, wie zum Beispiel das Löschen eines übergeordneten Objektes +beim DELETE-Befehl. +
+Folgende Befehle unterstützen die mittlere Maustaste: +
ADD | Bauteil spiegeln | |
ARC | aktiven Layer wechseln | |
CIRCLE | aktiven Layer wechseln | |
COPY | Objekt spiegeln | |
INVOKE | Gatter spiegeln | |
LABEL | aktiven Layer wechseln | |
MOVE | Objekt oder Gruppe spiegeln | |
PASTE | Gruppe spiegeln | |
POLYGON | aktiven Layer wechseln | |
RECT | aktiven Layer wechseln | |
ROUTE | aktiven Layer wechseln | |
SMD | aktiven Layer wechseln | |
TEXT | aktiven Layer wechseln | |
WIRE | aktiven Layer wechseln |
+Click&Drag mit der mittleren Maustaste verschiebt die Zeichnung innerhalb +des Editor-Fensters. +
+Wird ein Objekt mit der rechten Maustaste angeklickt, so wird ein kontextspezifisches +Popup-Menü angezeigt, aus dem Befehle, die für dieses Objekt anwendbar sind, ausgewählt +werden können. +Falls gerade ein Befehl aktiv ist, der auf eine Gruppe angewendet werden kann, +enthält das Popup-Menü einen entsprechenden Eintrag. +
+Folgende Befehle unterstützen die rechte Maustaste: +
ADD | Bauteil drehen | |
ARC | Drehsinn des Kreisbogens ändern | |
BUS | Wire-Knickwinkel ändern | |
CHANGE | Change auf Gruppe anwenden | |
DELETE | Gruppe löschen | |
GROUP | Polygon schließen | |
INVOKE | Gatter drehen | |
LABEL | Label drehen | |
MIRROR | Gruppe spiegeln | |
MOVE | Objekt drehen bzw. Gruppe selektieren | |
NET | Wire-Knickwinkel ändern | |
PAD | Pad drehen | |
PASTE | Gruppe drehen | |
PIN | Pin drehen | |
POLYGON | Wire-Knickwinkel ändern | |
RIPUP | Ripup auf Gruppe anwenden | |
ROTATE | Gruppe drehen | |
ROUTE | Wire-Knickwinkel ändern | |
SMD | Smd drehen | |
SPLIT | Wire-Knickwinkel ändern | |
TEXT | Text drehen | |
WIRE | Wire-Knickwinkel ändern |
+Hervorgehobenes Objekt auswählen? (links=ja, rechts=weiter, ESC=abbrechen) +
+Drücken Sie die rechte Maustaste, um zyklisch durch alle in Frage +kommenden Objekte "durchzutasten". +
+Mit der linken Maustaste wählen Sie das gewünschte Objekt aus. +
+Um die Auswahl ganz abzubrechen, drücken Sie die Esc-Taste. +
+Mit dem Befehl +
+SET Select_Factor select_radius; ++können Sie beeinflussen, wie groß der "Selektionsradius" sein soll. +
+Wurde die ursprüngliche Selektion mit der rechten Maustaste gemacht, so erscheint
+ein kontextspezifisches Popup-Menü für das erste ausgewählte Objekt, welches als
+ersten Eintrag "Weiterschalten" enthält. Durch Klicken auf diesen Eintrag wird
+zyklisch durch die Objekte im Selektionsradius geschaltet.
+
+
+
+Editor-Fenster
+EAGLE kennt unterschiedliche Typen von Daten-Dateien. Jeder davon wird in
+einem eigenen Editor-Fenster-Typ bearbeitet. Wenn Sie eines der Objekte
+durch Doppelklick selektieren oder vom Control Panel
+aus eine Datei mit Datei/Öffnen
+laden, dann öffnet sich ein Editor-Fenster für diesen Dateityp.
+
+Nachdem Sie ein neues Bibliotheks-Editor-Fenster geöffnet haben,
+erscheint eine leere Arbeitsfläche, und Sie müssen mit dem
+EDIT Befehl angeben, welches
+Gehäuse (Package), Symbol oder Device Sie laden oder neu anlegen wollen.
+
+
+
+
+Package: Die Gehäuse-Definition.
+
+Symbol: Schaltzeichen, wie es im Schaltplan erscheinen soll.
+
+Device: Definition des realen Bauteils. Enthält eine oder
+mehrere Package-Varianten und ein oder mehrere Symbole (Gates).
+Es dürfen unterschiedliche Symbole kombiniert werden.
+
+Klicken Sie den Button Dev, Pac
+oder Sym, um Devices, Packages oder Symbole zu
+selektieren.
+
+Wenn Sie ein neues Objekt anlegen wollen, schreiben Sie den Namen des
+neuen Objekts in das Feld New Sie können auch ein
+exitstierendes Objekt laden, indem Sie seinen Namen in dieses Feld
+eintippen. Wenn Sie die Extension des Datei-Namens nicht angeben, wird
+ein Objekt geladen, dessen Typ vom Choose... Prompt
+bestimmt wird. Andernfalls bestimmt die Extension den Typ.
+
+Falls Ihre Lizenz das
+Schaltplan-Modul nicht einschließt, erscheinen die Object-Type-Buttons
+(Dev...) nicht im Menü.
+
+
+
+
+Wenn im selben Verzeichnis eine Schaltplan-Datei (*.sch) mit
+demselben Namen existiert, wird beim Öffnen eines Layouts automatisch
+auch ein Schaltplan-Editor-Fenster
+mit dieser Datei als Icon auf den Desktop
+gelegt. Das ist notwendig, damit die Schaltplan-Datei geladen ist, wenn
+Änderungen an der Platine die Back-Annotation
+zum Schaltplan erforderlich machen.
+
+
+
+
+Wenn im selben Verzeichnis eine Layout-Datei (*.brd) mit
+demselben Namen existiert, wird beim Öffnen eines Layouts automatisch
+auch ein Layout-Editor-Fenster
+mit dieser Datei als Icon auf den Desktop
+gelegt. Das ist notwendig, damit die Layout-Datei geladen ist, wenn
+Änderungen an der Platine die
+Forward-Annotation
+zum Layout erforderlich machen.
+
+Mit Hilfe der Combo-Box in der Action-Toolbar des Schaltplan-Editor-Fensters
+können Sie zwischen den einzelnen Schaltplan-Seiten
+wechseln oder neue Seiten anlegen. Sie können dazu auch den
+EDIT-Befehl verwenden.
+
+
+
+
+Die Textdatei muss eine reine ASCII-Datei sein und darf keine
+Steuerzeichen enthalten. Als Anwendungen sind in erster Linie
+vorgesehen: das Schreiben von
+User-Language-Programmen und
+Script-Dateien.
+
+In diesem Befehl werden die folgenden Platzhalter durch aktuelle Werte ersetzt:
+
+Bibliotheks-Editier-Modus
+Im Bibliotheks-Editier-Modus können Sie Packages, Symbole und Devices
+editieren.
+Layout-Editor
+Der Layout-Editor dient dazu, Layouts (*.brd) zu editieren.
+Schaltplan-Editor
+Der Schaltplan-Editor dient dazu, Schaltpläne (*.sch)
+zu editieren.
+Text-Editor
+Der Text-Editor dient dazu, Textdateien zu editieren.
+Verwenden eines externen Text-Editors
+Falls Sie anstatt des in EAGLE eingebauten lieber einen externen Text-Editor
+verwenden wollen, so können Sie den zum Starten dieses Editors nötigen Befehl
+im Dialog "Optionen/Benutzeroberfläche" eintragen.
+
%C | die Spalte, in die der Cursor positioniert werden soll (zur Zeit immer 1) | |
%F | der Name der zu ladenden Datei | |
%L | die Zeile, in die der Cursor positioniert werden soll |
+Ist als Befehl lediglich ein Minuszeichen ('-') eingetragen, so wird +EAGLE niemals ein Text-Editor-Fenster öffnen. Dies ist hilfreich für Benutzer, +die ihren Text-Editor immer selbst starten wollen. +
+Folgende Einschränkungen gelten bei der Verwendung eines externen Text-Editors: +
CLOSE | Bibliothek nach Editieren schließen | |
EDIT | Zeichnung laden/anlegen | |
EXPORT | ASCII-Liste erzeugen (z.B. Netzliste) | |
OPEN | Bibliothek zum Editieren laden | |
QUIT | EAGLE verlassen | |
REMOVE | Dateien/Bibliotheks-Elemente löschen | |
SCRIPT | Befehlsdatei ausführen | |
USE | Bibliothek zum Plazieren von Elementen laden | |
WRITE | Zeichnung/Bibliothek speichern |
ADD | Element in Zeichnung / Symbol in Device einfügen | |
ARC | Kreisbogen zeichnen | |
ATTRIBUTE | Attribute definieren | |
CIRCLE | Kreis zeichnen | |
CLASS | Netzklassen definieren | |
COPY | Objekte/Elemente kopieren | |
CUT | Vorher definierte Gruppe in Paste-Buffer laden | |
DELETE | Objekt löschen | |
DESCRIPTION | Beschreibung eines Objektes ändern | |
GROUP | Gruppe für spätere Operation definieren | |
HOLE | Nichtleitende Bohrung definieren | |
LAYER | Layer definieren/wechseln | |
MIRROR | Objekt spiegeln | |
MITER | Wire-Verbindungsstellen abschrägen | |
MOVE | Objekt bewegen oder rotieren | |
NAME | Objekt mit Namen versehen | |
PASTE | Paste-Buffer in Zeichnung einfügen | |
POLYGON | Polygon zeichnen | |
RECT | Rechteck zeichnen | |
ROTATE | Objekt rotieren | |
SMASH | NAME/VALUE zum Bewegen vorbereiten | |
SPLIT | Wires/Linien (Netze etc.) knicken | |
TEXT | Text zu einer Zeichnung hinzufügen | |
VALUE | Wert für Element definieren/ändern | |
WIRE | Linie oder geroutete Verbindung zeichnen |
DRC | Design Rule Check durchführen | |
ERRORS | DRC-Fehler anzeigen | |
LOCK | Bauteilposition verriegeln | |
RATSNEST | Kürzeste Luftlinien anzeigen | |
REPLACE | Bauteil ersetzen | |
RIPUP | Signal auflösen | |
ROUTE | Signal routen | |
SIGNAL | Signal (Luftlinie) definieren | |
VIA | Durchkontaktierung (Via) plazieren |
BOARD | Platine aus einem Schaltplan erzeugen | |
BUS | Buslinie zeichnen | |
ERC | Electrical Rule Check ausführen | |
GATESWAP | Äquivalente 'Gates' tauschen | |
INVOKE | 'Gate' aus Device plazieren | |
JUNCTION | Verbindungspunkt plazieren | |
LABEL | Label für Bus oder Netz plazieren | |
NET | Netz definieren | |
PINSWAP | Äquivalente Pins tauschen |
CONNECT | Pin/Pad-Zuordnung festlegen | |
PACKAGE | Package für Device definieren | |
PAD | Pad in Package einfügen | |
PIN | Pin in Symbol einfügen | |
PREFIX | Default-Präfix für Device festlegen | |
REMOVE | Elemente aus Bibliothek löschen | |
RENAME | Symbol/Package/Device neu benennen | |
SMD | Smd-Pad in Package einfügen | |
TECHNOLOGY | Technologien für ein Device definieren | |
VALUE | Definieren, ob Value-Text änderbar |
ASSIGN | Tasten belegen | |
CHANGE | EAGLE-Parameter ändern | |
DISPLAY | Layer anzeigen/ausblenden | |
GRID | Raster/Einheit definieren | |
MENU | Befehls-Menü konfigurieren | |
SET | Programm-Parameter einstellen | |
WINDOW | Bildausschnitt verändern |
AUTO | Autorouter starten | |
HELP | Hilfe-Seite anzeigen | |
INFO | Information über Objekt zeigen | |
MARK | Messmarke setzen/entfernen | |
OPTIMIZE | Wire-Segmente zusammenfassen | |
Ausdrucken auf dem System-Drucker | ||
REDO | Zurückgenommene Befehle ausführen | |
RUN | User-Language-Programm ausführen | |
SHOW | Objekt hell darstellen | |
UNDO | Befehle zurücknehmen | |
UPDATE | Bibliotheks-Objekte aktualisieren |
+Für die Befehlsbeschreibungen gelten folgende Regeln: +
+Befehle und Parameter in GROSSBUCHSTABEN werden +direkt eingegeben (bzw. aus dem Befehlsmenü mit der Maus selektiert). +Bei der Eingabe werden Groß- und Kleinbuchstaben nicht unterschieden. +
+Parameter in Kleinbuchstaben werden durch Namen, Zahlenwerte oder +Schlüsselwörter ersetzt. Beispiel: +
+
Syntax: | GRID grid_size grid_multiple; | |
Input: | GRID 1 10; |
+
Syntax: | SET BEEP OFF | ON; | |
Input: | SET BEEP OFF; | |
oder | ||
SET BEEP ON; |
+
Syntax: | DISPLAY option layer_name.. | |
Input: | DISPLAY TOP PINS VIAS |
+
+
Syntax: | MOVE .. | |
Input: | MOVE | |
Mausklick auf erstes zu bewegendes Element | ||
Mausklick auf das Ziel | ||
Mausklick auf zweites zu bewegendes Element | ||
etc. |
+An diesem Beispiel sehen Sie auch, wie die Wiederholungspunkte bei +Befehlen mit Mausklicks zu verstehen sind. +
+Jeder Mausklick stellt eine Koordinatenangabe +dar. Will man den Befehl textuell eingeben, dann kann man anstelle +des Mausklicks die Koordinaten über die Tastatur in folgender +Form eingeben: +
+(x y) ++Dabei sind x und y Zahlen in der mit dem GRID-Befehl gewählten +Einheit. Die textuelle Eingabemöglichkeit ist insbesondere für +Script-Dateien erforderlich.
+(100mil 200mil) ++Erlaubte Einheiten sind mm, mic, mil und in. +Es können auch unterschiedliche Einheiten für x und y verwendet werden.
+(@) ++kann dazu benutzt werden, die aktuelle Position des Mauszeigers im +Zeichenfenster zu referenzieren. So würde zum Beispiel die Eingabe +
+MOVE R1 (@) ++das Bauteil mit dem Namen R1 an die Position verschieben, auf der +der Mauszeiger im Moment steht. +
+Nach der öffnenden Klammer darf eine beliebige Kombination der folgenden +Steuerzeichen folgen um einen bestimmten Tastendruck zusammen mit dem +"Mausklick" zu simulieren oder die Art der Koordinaten zu modifizieren: +
> | rechte Maustaste | |
A | Alt-Taste | |
C | Ctrl-Taste | |
P | Polar-Koordinaten (relativ zur Marke, x = Radius, y = Winkel in Grad, gegen den Uhrzeigersinn) | |
R | Relative Koordinaten (relativ zur Marke) | |
S | Shift-Taste |
+(CR> 1 2) ++würde zum Beispiel einem "Mausklick" mit der rechten Maustaste an den Koordinaten +(1 2) relativ zur Marke, mit gedrückter Ctrl-Taste entsprechen +(natürlich würde es vom konkreten Befehl abhängen was genau mit dieser Art von +Eingabe geschehen würde). Falls momentan keine Marke gesetzt ist, beziehen sich +Koordinaten mit R oder P auf den Ursprung der Zeichnung. +Die Steuerzeichen sind unabhängig von Groß-/Kleinschreibung, ihre Reihenfolge +spielt keine Rolle und es muss auch kein Leerzeichen zwischen ihnen und der +ersten Ziffer der Koordinaten stehen. Das obige Beispiel könnte also ebenso +als (r>c1 2) geschrieben werden. +Als "Polar-Koordinaten" eingegebene Werte werden intern als die entsprechenden +(x y) Koordinaten abgespeichert. +
+Als Beispiel für die Koordinateneingabe in Textform soll die Eingabe der +Platinenumrisse mit exakten Maßen dienen: +
+GRID 1 MM; +CHANGE LAYER DIMENSION; +WIRE 0 (0 0) (160 0) (160 100) (0 100) (0 0); +GRID LAST; ++
+WINDOW; ++frischt beispielsweise das Zeichenfenster auf, während +
+WINDOW FIT ++das Zeichenfenster so skaliert, dass die gesamte Zeichnung sichtbar ist. +Im zweiten Fall ist kein Strichpunkt erforderlich, weil bereits klar +ist, dass kein weiterer Parameter folgen kann. + + + +
+Der ADD-Befehl holt ein Schaltplan-Symbol (Gate) oder ein Package aus +der aktiven Bibliothek und plaziert es in der Zeichnung. +
+Bei der Device-Definition holt der ADD-Befehl ein Symbol in das Device. +
+Üblicherweise klickt man den ADD-Befehl an und selektiert das +Package/Symbol aus dem sich öffnenden Menü. Nun können die Parameter +(falls erforderlich) per Tastatur eingegeben werden. +
+Wenn device_name Platzhalter enthält ('*' oder '?') und mehr als ein +Device gefunden wird, öffnet sich der ADD-Dialog. Daraus kann dann das gewünschte +Device gewählt werden. +Beachten Sie, dass die Beschreibung Checkbox im ADD-Dialog ausgeschaltet wird, +sobald ein ADD-Befehl mit einem Device-Namen in der Kommandozeile angegeben wird, +egal ob der Name Platzhalter enthält oder nicht. Der Grund hierfür ist, dass ein +in der Kommandozeile angegebener Device-Name nur in den Namen der Devices gesucht +wird und nicht in deren Beschreibungen. +
+Plaziert wird das Package/Symbol mit der linken Maustaste, rotiert +wird es mit der rechten. Nachdem es plaziert wurde, hängt sofort eine +weitere Kopie am Mauszeiger. +
+Wenn bereits ein Device oder Package mit gleichem Namen (aus derselben Bibliothek) in der +Zeichnung existiert und die Bibliothek seit dem Plazieren des ursprünglichen Elements +modifiziert wurde, startet EAGLE automatisch einen Library-Update +bei dem Sie gefragt werden, ob die Bauteile durch die neuere Bibliotheksdefinition +ersetzt werden sollen. +Achtung: Nach einem Library-Update sollten Sie immer den Design Rule Check +(DRC) und den Electrical Rule Check (ERC) laufen lassen! +
+Um ein Element direkt zu plazieren, verwenden Sie die Syntax: +
+ADD devicename@libraryname ++devicename darf Platzhalter enthalten und libraryname darf entweder +direkt der Bibliotheksname (wie "ttl" oder "ttl.lbr") oder der volle Name mit Pfadangabe +(wie "/home/mydir/myproject/ttl.lbr" oder "../lbr/ttl") sein. +
+Beispiel: +
+ADD DIL14 IC1 ++holt das Package DIL14 in die Platine und gibt ihm den Namen IC1. +
+Wird im Schaltplan kein Name angegeben, erhält das Gate als Namen den bei der +Device-Definition mit PREFIX festgelegten Präfix, ergänzt +um eine fortlaufende Zahl (z.B. IC1). +
+Beispiel: +
+ADD 7400 ++Hier werden der Reihe nach fünf Gatter aus Bausteinen des Typs 7400 plaziert. +Sofern als Präfix "IC" definiert wurde und die Einzelgatter innerhalb eines 7400 +die Namen A...D haben, erhalten die Gatter im Schaltplan die Namen IC1A, IC1B, +IC1C, IC1D, IC2A (falls schon Elemente mit demselben Präfix plaziert wurden, +wird die Zählung mit der nächsten laufenden Nummer fortgesetzt. Siehe auch +INVOKE. +
+Während ein Objekt am Cursor hängt, können Sie den Namen, unter dem es in die +Zeichnung eingefügt wird, ändern. Damit können Sie mehrere Bauteile gleichen +Typs unter verschiedenen, explizit vergebenen Namen einfügen: +
+Beispiel: +
+ADD CAP C1 C5 C7 ++
+Beispiel: +
+ADD 7400 IC1 A ++Dies ist vor allem dafür gedacht, wenn ein Schaltplan über ein Script generiert werden soll. +Beachten Sie bitte, dass wenn ein bestimmtes Gatter geholt wird keine anderen Gatter mit +Add-Level MUST oder ALWAYS automatisch mit geholt werden, und Sie müssen zumindest die MUST-Gatter +mit dem INVOKE-Befehl aktivieren (ansonsten wird sie der +Electrical Rule Check als fehlend melden). +
+[S][M]Rnnn +
+
S | setzt das Spin-Flag, welches die Funktion abschaltet, die Texte von unten oder rechts lesbar hält (nur im Board-Kontext verfügbar) | |
M | setzt das Mirror-Flag, welches das Objekt an der Y-Achse spiegelt | |
Rnnn | setzt die Rotation auf den angegebenen Wert, der im Board-Kontext im Bereich 0.0...359.9 (mit einer Auflösung von 0.1 Grad) und im Schaltplan-Kontext einer der Werte 0, 90, 180 oder 270 sein darf (Winkel dürfen auch negativ angegeben werden, sie werden dann in den entsprechenden positiven Wert umgewandelt) |
+Die Schlüsselbuchstaben S, M und R +können als Groß- oder Kleinbuchstaben angegeben werden und es muss mindestens R +gefolgt von einer Zahl vorhanden sein. +
+Ist das Mirror-Flag sowohl in einem Bauteil als auch in einem in dessen +Package befindlichen Text gesetzt, so heben sich diese in ihrer Wirkung auf. +Das gleiche gilt für das Spin-Flag. +
+Beispiele: +
+
R0 | keine Rotation | |
R90 | um 90° gegen den Uhrzeigersinn gedreht | |
R-90 | um 90° im Uhrzeigersinn gedreht (wird in 270° umgerechnet) | |
MR0 | an der Y-Achse gespiegelt | |
SR0 | Texte werden mit "Spin" dargestellt | |
SMR33.3 | um 33.3° gegen den Uhrzeigersinn gedreht, gespiegelt und mit "Spin" |
+
+Default: R0 +
+
+ADD DIL16 R90 (0 0); ++plaziert ein 16poliges DIL-Gehäuse, das um 90 Grad gegen den Uhrzeigersinn gedreht ist, an den Koordinaten (0 0). +
+
0: | Das Symbol (Gate) kann im Schaltplan nicht mit einem anderen vertauscht werden. | |
1..255 | Das Symbol (Gate) kann im Schaltplan mit jedem anderen Symbol dieses Typs vertauscht werden, das denselben Swaplevel hat (auch zwischen verschiedenen Devices). |
+Default: 0 +
Next | Wenn ein Device mehr als ein Gate aufweist, werden in den Schaltplan der Reihe nach die Symbole mit Addlevel Next geholt. | |
Must | Wird ein beliebiges Symbol eines Device in den Schaltplan geholt, dann muss auch ein mit dem Addlevel Must definiertes Symbol im Schaltplan erscheinen. Dies geschieht automatisch. Es kann nicht gelöscht werden, bevor nicht alle anderen Symbole aus diesem Device gelöscht sind. Falls nur noch Must-Symbole aus einem Device vorhanden sind, löscht der DELETE-Befehl das ganze Device. | |
Always | Wie Must, allerdings kann ein Symbol mit Addlevel Always gelöscht und mit INVOKE wieder in den Schaltplan geholt werden. | |
Can | Gibt es in einem Device Next-Gates, dann werden Can-Gates nur geholt, wenn sie explizit mit INVOKE angefordert werden. Ein Symbol mit Addlevel Can wird mit ADD nur dann in den Schaltplan geholt, wenn das Device nur Can- und Request-Gates enthält. | |
Request | Diese Eigenschaft wird sinnvollerweise für Versorgungs-Symbole von Bausteinen verwendet. Request-Gates können nur explizit in den Schaltplan geholt werden (INVOKE) und werden intern nicht mitgezählt. Das hat zur Folge, dass in Bausteinen mit nur einem Gatter und einem Versorgungsspannungs-Symbol der Gatter-Name nicht zum Bauteil-Namen hinzugefügt wird. Im Falle eines 7400 mit vier Gattern (plus Versorgungsspannung) heißen die einzelnen Gatter im Schaltplan beispielsweise IC1A, IC1B, IC1C und IC1D. Ein 68000 mit nur einem Gate, dem Prozessor-Symbol, heisst dagegen im Schaltplan z. B. IC1, da sein separates Spannungsversorgungs-Symbol als Gate nicht mitzählt. |
+Beispiel: +
+ADD PWR 0 REQUEST ++holt das Symbol PWR (z. B. ein Versorgungssymbol) und definiert dafür den Swaplevel 0 +(nicht tauschbar) und den Addlevel Request. + + + +
+Mit dem ARC-Befehl zeichnet man Kreisbögen. Der erste und zweite +Mausklick (linke Maustaste) definieren zwei gegenüberliegende Punkte +auf dem Kreisumfang. Danach lässt sich mit der rechten Maustaste +festlegen, ob der Bogen im Uhrzeigersinn oder im Gegenuhrzeigersinn +dargestellt werden soll. Mit dem abschließenden Mausklick legt man den +Winkel des Bogens fest. +
+Mit den Parametern CW (Clockwise) und CCW (Counterclockwise) kann man +festlegen, ob der Bogen im Uhrzeigersinn oder gegen den Uhrzeigersinn dargestellt +werden soll. ROUND bzw. FLAT bestimmt ob die Enden des Kreisbogens rund oder flach sein sollen. +
+CHANGE WIDTH width; ++voreinstellen oder verändern und ist identisch mit der aktuellen +Strichstärke für Wires. +
+Kreisbögen mit einem Winkel von 0 oder 360 Grad oder einem Radius +von 0 werden nicht akzeptiert. +
+Beispiel für textuelle Eingabe: +
+GRID inch 1; +ARC CW (0 1) (0 -1) (1 0); ++erzeugt einen Viertelkreis im ersten Quadranten mit Mittelpunkt im Ursprung. + + + +
+function_key = modifier+key
+modifier = jede Kombination aus S (Shift), C (Ctrl), A (Alt) und M (Cmd, nur auf Mac OS X)
+key = F1..F12, A-Z, 0-9, BS (Backspace)
+
+Mit dem ASSIGN-Befehl kann man die Funktionstasten F1 bis F12, +die Buchstabentasten A bis Z, die (oberen) Zifferntasten +0 bis 9 und die Backspace-Taste (jeweils auch +in Kombination mit Zusatztasten) mit einzelnen oder mehreren +Befehlen belegen. +
+Der ASSIGN-Befehl ohne Parameter listet die aktuelle Tastenbelegung +in einem Dialog auf, in dem die Einstellungen auch verändert werden können. +
+Die beim Betätigen der Taste auszuführende Befehlssequenz sollte man der +Klarheit wegen in Hochkommas einschließen. +
+Soll als key eine der Tasten A-Z oder 0-9 verwendet +werden, so muss der modifier mindestens A, C oder M enthalten. +
+Der M modifier ist nur unter Mac OS X verfügbar. + |
+Bitte beachten Sie, dass eine eventuell auf einer Taste liegende
+Betriebssystem-Funktion durch den ASSIGN-Befehl überschrieben wird
+(je nach verwendetem Betriebssystem kann es sein, dass bestimmte Tastenkombinationen
+nicht mit dem ASSIGN-Befehl überschrieben werden können).
+Falls Sie eine Buchstabentaste zusammen mit dem Modifier A belegen (zum Beispiel
+A+F), so steht ein eventueller Hotkey im Pulldown-Menü nicht mehr
+zur Verfügung.
+
+Um eine Tastenbelegung wieder zu entfernen geben Sie ASSIGN +nur mit dem function_key Code (ohne Befehl) ein. +
+ASSIGN F7 'change layer top; route'; +ASS A+F7 'cha lay to; rou'; +ASSIGN C+F10 menu add mov rou ''';''' edit; +ASSIGN CA+R 'route'; ++Die beiden ersten Eingaben bewirken das gleiche, da EAGLE nicht nur +bei Befehlen, sondern auch bei den Parametern Abkürzungen zulässt, +solange sie eindeutig sind. +
+Beachten Sie, dass hier z. B. der Befehl "CHANGE layer top" +mit Strichpunkt abgeschlossen ist und der ROUTE-Befehl nicht. +Im ersten Fall enthält der Befehl nämlich alle Parameterangaben, +während im zweiten Fall noch Koordinatenangaben fehlen (die dann +sinnvollerweise mit der Maus eingegeben werden). Der ROUTE-Befehl +darf also nicht mit Strichpunkt abgeschlossen werden. +
F1 HELP | Hilfe-Funktion | |
Alt+F2 WINDOW FIT | Zeichnung formatfüllend darst. | |
F2 WINDOW; | Bildschirminhalt auffrischen | |
F3 WINDOW 2 | In das Bild hineinzoomen, Fakt. 2 | |
F4 WINDOW 0.5 | Herauszoomen um Faktor 2 | |
F5 WINDOW (@); | Neues Zentrum an der Position des Mauszeigers | |
F6 GRID; | Raster ein-/ausblenden | |
F7 MOVE | MOVE-Befehl | |
F8 SPLIT | SPLIT-Befehl | |
F9 UNDO | Befehl(e) zurücknehmen | |
F10 REDO | Befehl erneut ausführen | |
Alt+BS UNDO | Befehl(e) zurücknehmen | |
Shift+Alt+BS REDO | Befehl erneut ausführen |
+Siehe Beschreibung der orientation bei ADD. +
+Ein Attribut ist eine beliebige Kombination aus einem Namen und +einem Wert, welche dazu benutzt werden kann, einem bestimmten Bauteil +jede Art von Information zuzuordnen. +
+Attribute können in der Bibliothek definiert werden (für einzelne Devices), im +Schaltplan oder im Board (für konkrete Bauteile). Attribute, die auf der Device-Ebene +definiert wurden, werden für jedes Bauteil dieses Typs im Schaltplan verwendet. +Im Schaltplan können jedem Bauteil weitere Attribute hinzugefügt werden, und bestehende +Attribute von den Devices können mit anderen Werten überschrieben werden (falls die +Attribute als variabel definiert wurden). Ein Element im Board hat alle +Attribute des zugehörigen Bauteils im Schaltplan und kann weitere, eigene Attribute +haben. +
+ATTRIBUTE name [ 'value' ] [ options ] ++Der name darf aus beliebigen Buchstaben, Ziffern und den Zeichen +'_', '#' und '-' bestehen und beliebig lang sein; das erste Zeichen darf allerdings +nicht '-' sein. Die Groß-/Kleinschreibung spielt bei den Namen keine Rolle, so dass +PartNo und PARTNO der gleiche Name sind. Der value darf beliebige Zeichen +enthalten und muss in Hochkommas angegeben werden. +
+Gültige options sind: +
delete | Löscht das Attribut mit dem angegebenen Namen aus allen Technology-Varianten (in diesem Fall darf kein 'value' angegeben werden). | |
variable | Das Attribut wird als variabel markiert, so dass es im Schaltplan überschrieben werden kann (dies ist die Standardeinstellung). | |
constant | Attribute, die als konstant markiert sind, können nicht im Schaltplan überschrieben werden (es sei denn, der Anwender besteht darauf). Wird ein neues Attribut in einem Device als konstant definiert, so erhalten auch alle anderen Technologien diese Einstellung. |
+Ein bereits bestehendes Attribut kann zwischen variabel und konstant +umgeschaltet werden, ohne dass sein Wert erneut angegeben werden muss: +
ATTRIBUTE ABC '123' | (standardmäßig variabel) | |
ATTRIBUTE ABC constant | (ABC behält den Wert '123') |
+Die Attribut-Namen NAME, PART, GATE, DRAWING_NAME, LAST_DATE_TIME, +PLOT_DATE_TIME und SHEET sind nicht erlaubt, da sie mit den bereits existierenden +Text Variablen kollidieren würden. Ist ein Attribut +namens VALUE definiert, so wird dessen Wert zum Initialisieren des tatsächlichen +Wertes eines Bauteils beim Einsetzen in den Schaltplan verwendet (vorausgesetzt, +das Device-Set hat 'Value On'). +
+Wird nach dem Selektieren des ATTRIBUTE-Befehls auf ein Bauteil geklickt, so +erscheint ein Dialog in dem alle Attribute dieses Bauteils aufgelistet sind +und bearbeitet werden können. +
+Um ein Attribut vollständig textuell zu definieren kann folgende Syntax benutzt werden: +
+ATTRIBUTE part_name attribute_name 'attribute_value' orientation ++Beachten Sie bitte, dass im Falle eines Bauteils, das aus mehreren Gattern besteht, +tatsächlich eines dieser Gatter ausgewählt wird. Bei der Auswahl über einen Mausklick +ist bereits klar, welches Gatter gemeint ist, wohingegen bei der textuellen Auswahl der +vollständige Name bestehend aus Bauteil- und Gattername angegeben werden sollte. +Ein konkretes Bauteil kann nur ein Attribut mit einem bestimmten Namen haben, dieses +kann aber zu jedem (oder allen) seiner Gattern hinzugefügt werden. +Wird nur der Bauteilname angegeben, so wird implizit das erste sichtbare Gatter +ausgewählt. +
+Werden keine Koordinaten angegeben (und der Befehl mit ';' abgeschlossen), +so hängt das Verhalten davon ab, ob das gegebene Attribut für dieses Bauteil +bereits existiert (entweder im Device oder im Schaltplan). Existiert das Attribut +bereits, so wird lediglich sein Wert geändert. Falls es noch nicht existiert, so +wird ein neues Attribut mit dem gegebenen Namen und Wert angelegt und am +Aufhängepunkt des ausgewählten Gatters des Bauteils platziert. +
+Um ein Attribut von einem Bauteil zu entfernen kann der Befehl +
+ATTRIBUTE part_name attribute_name DELETE ++verwendet werden. +
+Bei der Definition von Attributen über die Kommandozeile oder ein Script +verwenden Sie bitte den CHANGE DISPLAY Befehl +um einzustellen, welche Teile des Attributs (Name, Wert, beides oder nichts davon) +sichtbar sein sollen. +
+Solch ein Attribut könnte zum Beispiel der Autor der Zeichnung sein, und kann +im Schriftfeld des Zeichnungsrahmens verwendet werden. Es wird dann auf jeder +Schaltplan-Seite angezeigt, die einen Zeichnungsrahmen enthält in dem sich +eine gleichnamige Text Variable befindet. +
+LAYER Layer; +WIRE (1 2) (3 4); ++hier nicht funktioniert. Der Layer muss gewählt werden, wenn der ATTRIBUTE-Befehl +bereits aktiv ist. Dies kann folgendermaßen geschehen: +
+ATTRIBUTE Parameter +LAYER Layer +weitere Parameter; ++Beachten Sie, dass die ATTRIBUTE-Zeile nicht mit einem ';' +abgeschlossen ist, und dass der LAYER-Befehl in einer neuen Zeile beginnt.
+ATTRIBUTE +LAYER Layer; ++setzen den Layer für nachfolgende ATTRIBUTE-Befehle. +
+PACKAGE N; +TECHNOLOGY LS; +ATTRIBUTE PartNo '12345-ABC'; +ATTRIBUTE Temp '100K' constant; +ATTRIBUTE Remark 'mount manually'; ++ + + +
+Der AUTO-Befehl aktiviert den integrierten Autorouter. Werden Signalnamen +angegeben oder Signale mit der Maus selektiert, werden nur diese Signale +verlegt. Ohne weitere Parameter verlegt der Autorouter alle Signale. +Das Zeichen "!" gibt an, dass alle Signale ausser den angegebenen zu +routen sind. Es muss vor allen Signalnamen stehen und darf nur einmal +vorkommen. +
+Die Optionen LOAD und SAVE können dazu verwendet werden die +Autorouter-Parameter aus der angegebenen Datei zu laden bzw. sie in diese zu speichern. +Falls filename nicht die Extension ".ctl" hat wird diese automatisch +angefügt. +
+Ohne Parameter (oder wenn das abschließende ';' nicht angegeben wird), +öffnet der AUTO-Befehl einen Dialog, in dem die Steuerparameter für den +Routing-Algorithmus eingestellt werden können. Die spezielle Option FOLLOWME +öffnet diesen Dialog in einem Modus, in dem nur die für den Follow-me-Router +maßgeblichen Parameter verändert werden können. +
+AUTO ! GND VCC; ++Der abschließende Strichpunkt ist in jedem Fall erforderlich, es sei +denn, der Autorouter wird vom Menü aus mit "Start" gestartet. +Die Aktivitäten des Autorouters können Sie am Bildschirm mitverfolgen. +
+Das Menü des Autorouter-Befehls erscheint nach Eingabe von AUTO ohne +abschließenden Strichpunkt. +
+
* | steht für eine beliebige Anzahl beliebiger Zeichen | |
? | steht für genau ein Zeichen | |
[...] | steht für irgend eines der Zeichen zwischen den Klammern |
+Soll eines dieser Zeichen genau so gesucht werden, wie es ist, so muss es in eckige Klammern +eingeschlossen werden. Zum Beispiel findet abc[*]ghi die Zeichenfolge abc*ghi, +aber nicht abcdefghi. +
+Ein Bereich von Zeichen kann als [a-z] angegeben werden, was für eines der Zeichen +aus dem Bereich 'a'...'z' steht. +
+Falls der Autorouter keine Signale in einem Layer verlegen soll, ist +in das Feld für die Vorzugsrichtung 0 einzutragen. +
+Der BOARD-Befehl erzeugt eine Layout-Datei aus einem Schaltplan. +
+Wenn die Platine bereits existiert, wird sie in ein Layout-Editor-Fenster +geladen. +
+Wenn die Platine nicht existiert, werden Sie gefragt, ob Sie eine +neue Datei anlegen wollen. +Wird der grid Parameter angegeben, so werden die Bauteile in dem +angegebenen Raster platziert, wie in +
+BOARD 5mm ++womit die Bauteile in einem 5mm Raster platziert würden (Default ist +50mil). Die Zahl muss mit Einheit angegeben werden und der Maximalwert +ist 10mm. +
+Der BOARD-Befehl überschreibt niemals eine existierende Platinen-Datei. +Wenn eine Datei mit diesem Namen existiert, muss sie erst mit +REMOVE gelöscht werden, bevor der +BOARD-Befehl sie neu anlegen kann. +
+edit .brd ++in die Kommandozeile des Editor-Fensters eintippen. +
+Alle relevanten Daten der Schaltplan-Datei (name.sch) werden dann in eine +Board-Datei (name.brd) konvertiert. Das neue Board wird automatisch mit +einer Größe von 160x100mm +(Light Edition: 100x80mm) +angelegt. +Alle Packages mit den im +Schaltplan definierten Verbindungen sind links neben der leeren Platine +plaziert. Power-Pins sind bereits verbunden +(siehe PIN-Befehl). +
+Falls Sie andere als die standardmäßig angelegten Platinenumrisse benötigen, +brauchen Sie einfach nur die entsprechenden Linien zu löschen und die +gewünschten Umrisse mit dem WIRE-Befehl in den +Layer Dimension zu zeichnen. Wählen Sie dazu bitte eine +Strichbreite von 0, da es sich hierbei nur um Hilfslinien handelt. +
+Eine Board-Datei kann nicht angelegt werden: +
+Mit dem Befehl BUS zeichnet man Busse in den Bus-Layer eines Schaltplans. +Der Busname hat die Form +
+SYNONYM:Teilbus,Teilbus,.. ++wobei SYNONYM ein beliebiger Name sein darf. +Teilbus ist entweder ein Netzname oder ein Busname mit Index in der Form: +
+Name[LowestIndex..HighestIndex] ++Folgende Bedingungen müssen erfüllt sein: +
+0 <= LowestIndex <= HighestIndex <= 511 +
+Wird ein Teilbus mit einem Index verwendet, darf der Name nicht mit einer +Zahl enden, da sonst nicht klar wäre, welche Zahl zum Namen und welche zum +Index gehörten. +
+Wenn der Bus auf einem anderen Bus abgesetzt wird, endet die Linie an dieser +Stelle. Dieses Verhalten kann über "SET AUTO_END_NET OFF;" oder +durch Deselektieren der Option "Netze und Busse automatisch beenden" unter "Optionen/Einstellungen/Verschiedenes" +abgeschaltet werden. +
+Wird der curve oder @radius Parameter angegeben, so kann ein Kreisbogen als Teil des Busses +gezeichnet werden (siehe die ausführliche Beschreibung beim WIRE-Befehl). +
+A[0..15] +RESET +DB[0..7],A[3..4] +ATBUS:A[0..31],B[0..31],RESET,CLOCK,IOSEL[0..1] ++Gibt man keinen Busnamen an, wird ein Name der Form B$1 automatisch +vergeben. Dieser Name lässt sich zu jeder Zeit mit dem NAME-Befehl +verändern. Die Breite der Linien, die einen Bus darstellen, lässt +sich z. B. mit +
+SET BUS_WIRE_WIDTH 40; ++auf 40 Mil einstellen (Default: 30 Mil). +
+ ATBUS:A[0..31],B[0..31],!RESET,CLOCK,IOSEL[0..1] ++was als +
+ _____ + ATBUS:A[0..31],B[0..31],RESET,CLOCK,IOSEL[0..1] ++dargestellt würde. +Einzelheiten hierzu finden Sie in der Beschreibung des TEXT-Befehls. + + + +
+Nachfolgend plazierte Objekte erhalten die mit CHANGE geänderten +Eigenschaften. Damit ist es möglich, mit diesem Befehl Parameter +voreinzustellen. +
+Alle Zahlenangaben beziehen sich auf die aktuelle Maßeinheit (siehe GRID). +
Layer wechseln | CHANGE LAYER name | number | |
Text ändern | CHANGE TEXT [ text ] | |
Texthöhe | CHANGE SIZE value | |
Textstärke | CHANGE RATIO ratio | |
Text Font | CHANGE FONT VECTOR | PROPORTIONAL | FIXED | |
Wire-Breite | CHANGE WIDTH value | |
Wire-Linientyp | CHANGE STYLE value | |
Arc-Ende | CHANGE CAP ROUND | FLAT | |
Pad-Form | CHANGE SHAPE SQUARE | ROUND | OCTAGON | LONG | OFFSET | |
Pad-/Via-/Smd-Flags | CHANGE STOP | CREAM | THERMALS | FIRST OFF | ON | |
Pad-/Via-Durchmesser | CHANGE DIAMETER diameter | |
Pad-/Via/Hole-Bohrd. | CHANGE DRILL value | |
Via Layer | CHANGE VIA from-to | |
Smd-Maße | CHANGE SMD width height | |
Pin-Parameter | CHANGE DIRECTION NC | IN | OUT | I/O | OC | HIZ | SUP | PAS | PWR | SUP | |
CHANGE FUNCTION NONE | DOT | CLK | DOTCLK | ||
CHANGE LENGTH POINT | SHORT | MIDDLE | LONG | ||
CHANGE VISIBLE BOTH | PAD | PIN | OFF | ||
CHANGE SWAPLEVEL number | ||
Polygon-Parameter | CHANGE THERMALS OFF | ON | |
CHANGE ORPHANS OFF | ON | ||
CHANGE ISOLATE distance | ||
CHANGE POUR SOLID | HATCH | ||
CHANGE RANK value | ||
CHANGE SPACING distance | ||
Gate-Parameter | CHANGE SWAPLEVEL number | |
CHANGE ADDLEVEL NEXT | MUST | ALWAYS | CAN | REQUEST | ||
Netzklasse | CHANGE CLASS number | name | |
Package-Variante | CHANGE PACKAGE part_name [device_name] | 'device_name' [part_name] | |
Technologie | CHANGE TECHNOLOGY part_name [device_name] | 'device_name' [part_name] | |
Attribute-Anzeige | CHANGE DISPLAY OFF | VALUE | NAME | BOTH | |
Frame-Parameter | CHANGE COLUMS value | |
CHANGE ROWS value | ||
CHANGE BORDER NONE | BOTTOM | RIGHT | TOP | LEFT | ALL | ||
Label | CHANGE XREF OFF | ON |
+Mit dem CIRCLE-Befehl zeichnet man Kreise in den aktiven Layer. +
+Der CIRCLE-Befehl in den Layern tRestrict, bRestrict +und vRestrict dient zum Anlegen von Sperrflächen. Dabei +sollte eine Linienstärke (width) von 0 gewählt werden. +
+Der Parameter "width" gibt die Strichstärke des Kreises an. +Er entspricht demselben Parameter des WIRE-Befehls und kann mit dem +Befehl +
+CHANGE WIDTH breite; ++geändert bzw. voreingestellt werden. Dabei ist breite der +gewünschte Wert in der gegenwärtigen Einheit. +
+Kreise mit Strichstärke 0 werden gefüllt dargestellt. +
+GRID inch 1; +CIRCLE (0 0) (1 0); ++erzeugt einen Kreis mit einem Radius von 1 Zoll um den Ursprung (0 0). + + + +
+Der CLASS-Befehl wird zur Definition von Netzklassen verwendet. +
+Ohne Angabe von Parametern, wird ein Dialog geöffnet, der es erlaubt Netzklassen festzulegen. +
+Wird nur number oder name angegeben, wählt man die Netzklasse mit der +entsprechenden Nummer bzw. dem Namen für die folgenden NET- und SIGNAL-Befehle vor. +
+Wird number und name angegeben, werden dieser Netzklasse +die folgenden Werte für die Parameter zugeordnet. Diese +Netzklasse ist gleichzeitig für die folgenden NET- und SIGNAL-Befehle vorgewählt. +Werden nach name nicht alle Parameter angegeben, gelten die Werte +der Reihe nach für width, clearance, drill bzw. interspace. Soll beispielsweise nur drill geändert +werden, müssen also auch die Parameter für width und clearance angegeben werden. +
+Wird number negativ gewählt, löscht man die Netzklasse mit dem Absolutwert +der angegebenen number. +Die Default-Netzklasse 0 kann man nicht löschen. +
+Bei den Namen der Netzklassen wird nicht zwischen Groß- und Kleinbuchstaben unterschieden. +SUPPLY hat z. B. dieselbe Bedeutung wie Supply oder SuPpLy. +
+Werden mehrere Netzklassen in einer Zeichnung verwendet, braucht +der Autorouter länger um seine Arbeit zu erledigen. Daher ist es sinnvoll nur soviele +Netzklassen wie unbedingt nötig zu verwenden (die Anzahl der tatsächlich benutzten Netzklassen +ist ausschlaggebend, nicht die Anzahl der definierten Netzklassen). +
+Um Probleme bei CUT-und-PASTE-Aktionen zwischen verschiedenen Zeichnungen zu +vermeiden, ist es sinnvoll den unterschiedlichen Netzklassen in verschiedenen +Zeichnungen dieselben Nummern zu geben. +
+Der Autorouter verlegt die Signal in der Reihenfolge der benötigten Breite (width + +clearance), beginnend mit denen, die am meisten Platz benötigen. Der Bus-Router +verlegt nur Signale mit Netzklasse 0. +
+Für bestehende Netze/Signale kann CLASS mit dem CHANGE-Befehl geändert werden. +Änderungen der Netzklassen mit dem CLASS-Befehl werden nicht im UNDO/REDO-Puffer gespeichert. +
+CLASS 3 1:0.6mm 2:0.8mm ++definiert einen Mindestabstand von 0.6mm zwischen Signalen in den Netzklassen 1 und 3, +sowie einen von 0.8mm zwischen Signalen in den Netzklassen 2 und 3. Beachten Sie bitte, +dass die Nummern in number:clearance kleiner oder gleich der Nummer der +Netzklasse selbst ('3' im obigen Beispiel) sein müssen. Demnach wäre +
+CLASS 3 1:0.6mm 2:0.8mm 3:0.2mm ++ebenfalls gültig, während +
+CLASS 3 1:0.6mm 2:0.8mm 3:0.2mm 4:0.5mm ++nicht erlaubt ist + + + +
+Der CLOSE-Befehl schließt ein Editor-Fenster. Wenn die geladene Datei +verändert worden ist, werden Sie gefragt, ob sie abgespeichert werden +soll. +
+Dieser Befehl ist in erster Linie für Script-Dateien erforderlich.
+
+
+
+CONNECT
+
+
+Siehe auch PREFIX,
+OPEN,
+CLOSE,
+SCRIPT
+
+CONNECT symbol_name.pin_name pad_name..
+CONNECT pin_name pad_name..
+
+Dieser Befehl wird im Device-Editier-Modus angewendet. Er dient dazu, +den Pins des Schaltplan-Symbols (Device), das gegenwärtig bearbeitet +wird, die entsprechenden Pads des zugehörigen Gehäuses zuzuweisen. +Zuvor muss mit dem PACKAGE-Befehl festgelegt worden sein, welches +Package für das Device verwendet werden soll. +
+Wird der CONNECT-Befehl ohne Parameter aufgerufen, so erscheint ein +Dialog in dem die Pad/Pin-Zuweisungen interaktiv definiert werden können. +
+CONNECT gnd 1 rdy 2 phi1 3 !irq 4 nc1 5 ... ++
+CONNECT A.I1 1 A.I2 2 A.O 3; +CONNECT B.I1 4 B.I2 5 B.O 6; +CONNECT C.I1 13 C.I2 12 C.O 11; +CONNECT D.I1 10 D.I2 9 D.O 8; +CONNECT PWR.GND 7; +CONNECT PWR.VCC 14; ++In diesem Fall werden die Anschlüsse der vier NAND-Gatter eines +7400 zugewiesen. Das Device enthält fünf Symbole mit den Bezeichnungen +A, B, C, D, PWR. Die Eingänge der Gatter heißen im Schaltplan +I1 und I2; der Ausgang heisst O. +
+Der CONNECT-Befehl kann beliebig oft ausgeführt werden. Er kann +alle Pin/Pad-Zuweisungen enthalten oder nur einen Teil davon. Jeder +neue CONNECT-Befehl überschreibt die bisherigen Definitionen. +
+ed 6502.dev; +prefix 'IC'; +package dil40; +connect gnd 1 rdy 2 phi1 3 !irq 4 nc1 5 !nmi 6 \ + sync 7 vcc 8 a0 9 a1 10 a2 11 a3 12 a4 \ + 13 a5 14 a6 15 a7 16 a8 17 a9 18 a10 19 \ + a11 20 p$0 21 a12 22 a13 23 a14 24 a15 \ + 25 d7 26 d6 27 d5 28 d4 29 d3 30 d2 31 \ + d1 32 d0 33 r/w 34 nc2 35 nc3 36 phi0 37 \ + so 38 phi2 39 !res 40; ++Hier sorgt das Zeichen "\" am Zeilenende dafür, dass +am Beginn der nächsten Zeile keine Zeichenfolge mit einem Befehl +verwechselt werden kann. Als Bestandteil eines Pin-Namens drückt +das Zeichen "!" aus, dass es sich um ein +invertiertes Signal handelt (z.B. "!irq"). +
+Eine Verwechslung mit Befehlen kann man auch vermeiden, indem man
+Parameter in Hochkommas einschließt.
+
+
+
+COPY
+
+
+Siehe auch GROUP,
+CUT,
+PASTE,
+ADD,
+INVOKE,
+POLYGON
+
+COPY deviceset@library [name]
+COPY package@library [name]
+
+
+
+
+
+Mit dem COPY-Befehl lassen sich Objekte selektieren und +anschließend an eine andere Stelle derselben Zeichnung kopieren. +Beim Kopieren von Bauteilen generiert EAGLE einen neuen Namen und +behält den Wert (Value) bei. Beim Kopieren von Signalen (Wires), +Bussen und Netzen wird der Name beibehalten. In allen anderen Fällen +wird ein neuer Name generiert. +
+Wenn Sie lediglich ein weiteres Gatter eines aus mehreren Gattern bestehenden +Bauteils verwenden wollen, sollten Sie stattdessen den +INVOKE-Befehl benutzen. +
+Beachten Sie bitte, dass etwaige existierende Bibliotheksobjekte (Device-Sets, +Symbole oder Packages), die von dem kopierten Bibliotheksobjekt verwendet werden, +automatisch upgedatet werden. +
+Teile einer Zeichnung (z. B. auch eine ganze Platine) lassen sich +mit Hilfe der Befehle GROUP, CUT und PASTE in andere Zeichnungen +übernehmen. +
+Zuerst definiert man eine Gruppe (GROUP). Dann aktiviert man den Befehl +CUT, gefolgt von einem Referenzpunkt (Mausklick oder Angabe einer +Koordinate (x y)) der den Paste-Puffer mit den selektierten Objekten lädt. +CUT; setzt den Referenzpunkt automatisch etwa in der Mitte der +selektierten Objekte (genauer: am nächstgelegenen Rasterpunkt). +Jetzt kann man die Platine oder die Bibliothek wechseln +und mit PASTE den Pufferinhalt in die neue Zeichnung kopieren. Falls +erforderlich, werden neue Namen generiert. Der Pufferinhalt bleibt +erhalten und kann mit weiteren PASTE-Befehlen erneut kopiert werden. +
+Der DELETE-Befehl löscht das selektierte Objekt aus der Zeichnung. +
+Bauteile, Pads, Smds, Pins und Gatter lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. Beim Selektieren eines aus mehreren Gattern bestehenden Bauteils +im Schaltplan muss der volle, aus dem Bauteil- und dem jeweiligen Gatternamen +bestehende Name angegeben werden. +
+Attribute von Bauteilen können dadurch selektiert werden, dass die Kombination +aus Bauteilname und Attributname angegeben wird, wie etwa R5>VALUE. +
+Mit der rechten Maustaste wird eine zuvor mit GROUP +definierte Gruppe gelöscht. +
+Nach dem Löschen einer Gruppe können Luftlinien, die durch das Entfernen +von Bauelementen neu entstanden sind, "übrigbleiben", da diese nicht in der +ursprünglich definierten Gruppe enthalten waren. In solchen Fällen sollte +mit RATSNEST eine Neuberechnung der Luftlinien +durchgeführt werden. +
+Bei aktiver Forward&Back-Annotation können +im Board keine Wires oder Vias aus Signalen gelöscht werden, die an +Bauelemente angeschlossen sind. Ebenso können keine Bauelemente gelöscht +werden, an die Signale angeschlossen sind. Änderungen dieser Art müssen +im Schaltplan vorgenommen werden. +
+Um eine bereits verlegte Verbindung im Board wieder in eine Luftlinie +zu verwandeln, verwenden Sie den RIPUP-Befehl. +
+Der DELETE-Befehl wirkt nur auf sichtbare Layer (siehe +DISPLAY-Befehl). +
+DELETE SIGNALS kann dazu verwendet werden, alle Signale aus einer +Platine zu entfernen, um z. B. eine neue oder geänderte Netzliste +einzulesen. Es werden nur solche Signale entfernt, die an Pads angeschlossen +sind. Andere (wie z.B. Eckwinkel im Top- und Bottom-Layer, die intern +auch als Signal behandelt werden) bleiben unberührt. +
+Falls ein Bauteil gelöscht werden soll, das den Namen SIGNALS trägt, +so muss dieser in einfache Hochkommas gesetzt werden. +
+
Gatter | Löscht das gesamte Bauteil, in dem sich dieses Gatter befindet (auch wenn die Gatter auf mehrere Schaltplan-Seiten verteilt sind). Bei aktiver Forward&Backannotation werden die Leiterbahnen, die an dem Bauteil im Board angeschlossen sind, nicht in Luftlinien umgewandelt (was beim Löschen einzelner Gatter geschehen würde), ausgenommen die Fälle wo ein Pin des gelöschten Bauteils nur direkt mit genau einem anderen Pin und keinem Net-Wire verbunden ist | |
Polygon Wire | Löscht das gesamte Polygon | |
Net/Bus Wire | Löscht das gesamte Netz- bzw. Bus-Segment |
+Der DRC erzeugt unter Umständen Fehlerpolygone, die man nicht mit DELETE
+löschen kann, sondern mit DRC Clear.
+
+
+
+DESCRIPTION
+
+
+Siehe auch CONNECT,
+PACKAGE,
+VALUE
+
+DESCRIPTION description_string;
+
+Mit diesem Befehl erzeugt oder editiert man die Beschreibungstexte eines Devices, +eines Packages oder einer Bibliothek im Bibliotheks-Editor. +
+Description_string kann HTML-Steuerzeichen enthalten. +
+Die erste nicht leere Zeile von description_string wird als Kurzbeschreibung +(headline) im Control Panel angezeigt. +
+Der DESCRIPTION-Befehl ohne Angabe von Parametern öffnet einen Dialog, der das +Editieren des Textes erlaubt. Der obere Teil des Dialogs zeigt den formatierten Text, +sofern er Steuerzeichen des HTML-Formats enthält, +während der untere Teil für die Eingabe des Textes genutzt wird. Ganz oben im Dialog +sehen Sie das Feld headline. In diesem wird die Kurzbeschreibung ohne +HTML-Steuerzeichen angezeigt. +
+Die Beschreibung der Bibliothek kann von der Kommandozeile aus nur editiert werden, wenn die Bibliothek neu
+geöffnet und bisher kein Device, Symbol oder Package editiert wurde. Sie kann aber jederzeit
+über das Pulldown-Menü "Bibliothek/Beschreibung..." verändert werden.
+Die Beschreibung eines Devices oder eines Packages kann immer über die Kommandozeile
+oder das Pulldown-Menü "Bearbeitung/Description..." verändert werden.
+
+DESCRIPTION '<b>Quad NAND</b><p>\nFour NAND gates with 2 inputs each.'; ++Das Resultat sieht so aus: +
+Quad NAND
+Four NAND gates with 2 inputs each.
+
+
+
+DISPLAY
+
+
+Siehe auch LAYER,
+PRINT
+
+DISPLAY [option] layer_number..
+DISPLAY [option] layer_name..
+
+Gültige options sind: ALL, NONE, LAST, ? und ?? +
+Mit dem DISPLAY-Befehl wählt man diejenigen Layer aus, die auf +dem Bildschirm sichtbar sein sollen. Dabei darf als Parameter die +Layer-Nummer oder der Layer-Name angegeben werden (auch gemischt). +Gibt man den Parameter ALL an, werden alle Layer sichtbar. Mit dem +Parameter NONE kann man alle Layer ausblenden. Beispiel: +
+DISPLAY NONE BOTTOM ++Nach diesem Befehl ist nur der Bottom-Layer sichtbar. +
+Wird der Parameter LAST angegeben, so werden die zuvor sichtbaren Layer dargestellt. +
+Bitte beachten Sie, dass von den Signal-Layern (1 bis 16) nur diejenigen +zur Verfügung stehen, die im Layer-Setup in den Design Rules +eingetragen sind. +
+Stellt man dem Layer-Namen oder der Layer-Nummer ein Minuszeichen +voran, wird er ausgeblendet. Beispiel: +
+DISPLAY BOTTOM -TOP -3 ++In diesem Fall wird Bottom eingeblendet, und Top sowie der Layer mit +der Nummer 3 werden ausgeblendet. +
+Manche Befehle (PAD, SMD, SIGNAL, ROUTE) aktivieren automatisch +bestimmte Layer. +
+Wird der DISPLAY-Befehl ohne Parameter aufgerufen, so erscheint ein +Dialog in dem alle Einstellungen vorgenommen werden können. +
+DISPLAY TOP BOTTOM ? MYLAYER1 MYLAYER2 ?? OTHER WHATEVER ++Im Beispiel oben müssen die Layer TOP und BOTTOM definiert sein. Ansonsten wird der +Befehl mit einer Fehlermeldung abgebrochen. Das Fehlen von MYLAYER1 und MYLAYER2 wird in einer +Warnung angezeigt. Die Aktion kann vom Benutzer abgebrochen werden. Die Layer OTHER und +WHATEVER werden angezeigt, wenn vorhanden, ansonsten werden sie einfach ignoriert. +
+Die Optionen '?' und '??' dürfen in einer Befehlssequenz beliebig oft verwendet werden. +
+Wählt man für den Layer 17 (Pads) bzw. 18 (Vias) die Farbe 0 (das entspricht +der Hintergrundfarbe), werden Pads und Vias in der Farbe +und dem Füllmuster des jeweiligen Signal-Layers gezeichnet. Ist kein +Signal-Layer eingeblendet, werden auch keine Pads oder Vias dargestellt. +
+Wählt man für den Layer 17 (Pads) bzw. 18 (Vias) eine andere Farbe und es ist +kein Signal-Layer sichtbar, werden Pads und Vias in der Form des obersten +und untersten Signal-Layers dargestellt. +
+Das gilt auch für Ausdrucke mit PRINT. +
+Vermeiden Sie die Layer-Namen ALL und NONE, sowie Namen, die mit einem +Minuszeichen beginnen. +
+Die Syntax zur Bearbeitung dieser Aliase ist: +
+DISPLAY = MyLayers None Top Bottom Pads Vias Unrouted +
+Definiert den Alias "MyLayers" der, wenn er wie in +
+DISPLAY myl +
+benutzt wird, genau die Layer Top, Bottom, Pads, Vias und Unrouted anzeigt
+(ohne den "None"-Parameter würden die angegebenen Layer zusätzlich zu den
+bereits sichbaren angezeigt).
+Beachten Sie bitte die abgekürzte Verwendung des Aliases,
+und dass die Groß-/Kleinschreibung keine Rolle spielt.
+
+
+
+DRC
+
+
+Siehe auch Design Rules,
+CLASS,
+SET,
+ERC,
+ERRORS
+
+DRC ;
+DRC LOAD|SAVE filename;
+
+Der DRC-Befehl prüft das Layout gegenüber einem gültigen Satz von Design Rules. +
+Beachten Sie bitte, dass elektrisch nicht relevante Objekte (Wires in Packages, Rechtecke, +Kreise und Texte) untereinander nicht auf Mindestabstandsverletzungen ("Clearance") +geprüft werden. +
+Die gefundenen Fehler werden als Fehlerpolygone in den zugehörigen Layern dargestellt +und können mit dem ERRORS-Befehl bearbeitet werden. +
+Geben Sie den DRC-Befehl ohne weitere Parameter an, öffnet sich der Design-Rules-Dialog. +Von hier aus kann man die Design Rules einstellen und die Prüfung starten. +
+Wird der DRC-Befehl mit zwei Koordinatenpaaren angegeben (oder im DRC-Dialog der +Button Select angeklickt), prüft der DRC nur innerhalb des angegebenen Rechtecks. +Es werden nur die Fehler angezeigt, die innerhalb des Rechteck liegen. +
+Falls Sie DRC-Fehler erhalten, die auch nach einer entsprechenden +Änderung der Design Rules nicht verschwinden, +überprüfen Sie bitte die Netzklasse des beanstandeten +Objektes. Möglicherweise wird der Fehler wegen eines der Parameter dieser Klasse +gemeldet. +
+Um alle Fehlerpolygone zu löschen verwenden Sie +
+ERRORS CLEAR ++
+Die Optionen LOAD und SAVE können dazu verwendet werden die +Design Rules aus der angegebenen Datei zu laden bzw. sie in diese zu speichern. +Falls filename nicht die Extension ".dru" hat wird diese automatisch +angefügt. +
+SET DRC_FILL fill_name; ++Legt das für die DRC-Fehlerpolygone verwendete Füllmuster +fest. Default: LtSlash. + + + +
+Der EDIT-Befehl wird verwendet, um eine Platine oder einen Schaltplan +zu editieren bzw. neu anzulegen. Ausserdem dient der Befehl dazu, +Symbole, Devices und Packages zu laden, wenn man eine Bibliothek bearbeitet. +
+
EDIT name.brd | lädt eine Platine | |
EDIT name.sch | lädt einen Schaltplan | |
EDIT name.pac | lädt ein Package | |
EDIT name.sym | lädt ein Symbol | |
EDIT name.dev | lädt ein Device | |
EDIT .s3 | lädt Seite 3 eines Schaltplans | |
EDIT .s5 .s2 | verschiebt Seite 5 vor Seite 2 und lädt sie (falls Seite 5 nicht existiert, wird eine neue Seite vor Seite 2 eingefügt) | |
EDIT .s2 .s5 | verschiebt Seite 2 vor Seite 5 und lädt sie (falls Seite 5 nicht existiert, wird Seite 2 zur letzten Seite) |
+Platzhalter in Namen sind erlaubt (z. B. edit *.brd). +
+Gibt man EDIT ohne weitere Parameter ein, können Sie die Datei oder +das Objekt mit Hilfe des sich öffnenden Menüs wählen. +
+Um von einem Schaltplan zu einer Platine mit dem gleichen Namen zu +wechseln, kann man den Befehl +
+EDIT .brd ++verwenden. Umgekehrt kommt man von der Platine in den entsprechenden +Schaltplan mit +
+EDIT .sch ++Eine andere Seite eines Schaltplans kann man mit +
+EDIT .sX ++(X ist die Seitennummer) oder mit Hilfe der Combo-Box in der Action-Toolbar laden. +Falls die angegebene Seitennummer nicht existiert, wird eine neue Seite angelegt. +
+Sie können auch zwischen Schaltplanseiten wechseln indem Sie auf ein Icon in +der Vorschau für Schaltplanseiten klicken. Drag&drop in der Vorschau +erlaubt es, Seiten umzusortieren. Bitte beachten Sie, dass das Hinzufügen, +Löschen oder Umsortieren von Schaltplanseiten den Undo-Puffer löscht, +während das bloße Umschalten zwischen existierenden Seiten dies nicht tut. +
+Will man Symbole, Devices oder Packages editieren, dann ist zuerst +eine Bibliothek mit OPEN zu öffnen und dann der entsprechende +EDIT-Befehl zu geben. +
+Dieser Befehl prüft Schaltpläne auf elektrische Fehler. Die +Ergebnisse werden im ERRORS Dialog angezeigt. +
+Bitte beachten Sie, dass der ERC Unterschiede zwischen impliziten Power-Pins und
+Supply-Pins im Schaltplan und den tatsächlichen Signalverbindungen im Layout
+feststellen kann. Solche Unstimmigkeiten können entstehen, wenn Sie die
+Supply-Pins im Schaltplan modifizieren, nachdem Sie mit dem BOARD-Befehl eine
+Platinen-Datei erzeugt haben. Wenn die Power-Pins nur "implizit" verbunden sind,
+können diese Änderungen nicht immer in das Layout übertragen werden.
+Werden solche Fehler festgestellt, bleibt die Forward&Back-Annotation
+weiterhin erhalten. Allerdings müssen die Supply-Pins überprüft werden!
+
+
+
+ERRORS
+
+
+Siehe auch ERC,
+DRC
+
+ERRORS CLEAR
+
+Zur Auswertung der vom ERC bzw. DRC gefundenen Fehler dient der Befehl ERRORS. +Wird er aktiviert, dann öffnet sich ein Fenster, in dem +alle gefundenen Fehler aufgelistet sind. +Wurde für die geladene Zeichnung noch kein ERC bzw. DRC durchgeführt, so wird +zunächst die entsprechende Prüfung automatisch gestartet. +
+Die Liste im ERRORS-Dialog besteht aus bis zu vier Abschnitten, die jeweils +Konsistenzfehler, Fehler, Warnungen bzw. Gebilligte +Meldungen enthalten. +
+Selektiert man einen Eintrag aus der Liste, +wird die jeweilige Meldung durch eine Bezugslinie im Zeichenfenster angezeigt. +
+Ein Doppelklick auf einen Fehlereintrag zentriert die Zeichenfläche auf die +Position des Fehlers. Aktivieren Sie die Option "Zentriert", geschieht dies +automatisch. +
+Die Liste kann auch durch Eingabe des Befehls +
+ERRORS CLEAR ++gelöscht werden. + + + +
+Der EXPORT-Befehl dient dazu, EAGLE-Daten in Form von Textdateien +(ASCII-Dateien) zur Verfügung zu stellen oder Grafikdaten aus der +aktuellen Zeichnung zu erzeugen. +
+Standardmäßig wird die erzeugte Datei in das Projekt-Verzeichnis +geschrieben. +
+Der EXPORT-Befehl erzeugt folgende Textdateien: +
+Wenn mit EXPORT eine Bibliothek in eine Script-Datei verwandelt und +dieses anschließend wieder eingelesen wird, so sollte dafür +eine NEUE (leere!) Bibliothek geöffnet werden, da es sonst vorkommen +kann, dass Objekte mehrfach definiert werden! Der Vorgang des Script-Einlesens +kann u. U. erheblich beschleunigt werden, wenn vorher +
+Set Undo_Log Off; ++eingegeben wird (nicht vergessen, es nachher wieder einzuschalten, +da sonst kein Undo möglich ist!). +
+
.bmp | Windows-Bitmap-Datei | |
.png | Portable-Network-Graphics-Datei | |
.pbm | Portable-Bitmap-Datei | |
.pgm | Portable-Grayscale-Bitmap-Datei | |
.ppm | Portable-Pixelmap-Datei | |
.tif | TIFF-Datei | |
.xbm | X-Bitmap-Datei | |
.xpm | X-Pixmap-Datei |
+Der resolution-Parameter definiert die Bildauflösung (in 'dpi'). +
+Ist filename der besondere Name CLIPBOARD (egal ob groß- oder klein geschrieben), +wird das Bild in die Zwischenablage des Systems kopiert. +
+Das optionale Schlüsselwort MONOCHROME erzeugt ein schwarz/weißes Bild. +
+Das optionale Schlüsselwort WINDOW erzeugt ein Bild des momentan im
+Editor-Fenster sichtbaren Ausschnitts. Ohne dieses Schlüsselwort enthält das
+Bild die gesamte Zeichnung.
+
+
+
+FRAME
+
+
+Siehe auch LABEL
+
+Der FRAME-Befehl erzeugt einen Rahmen mit nummerierten Spalten und Zeilen. +Die beiden Punkte definieren zwei gegenüberliegende Ecken des Rahmens. +Mit der mittleren Maustaste können Sie den Layer wählen, in den der +Rahmen gezeichnet wird. +
+Der columns-Parameter definiert die Zahl der Spalten des Rahmens. +Es können bis zu 127 Spalten verwendet werden. Standardmäßig werden die +Spalten von links nach rechts durchnummeriert. Falls der Wert für columns +negativ ist, läuft die Nummerierung von rechts nach links. +
+Der rows-Parameter definiert die Zahl der Zeilen des Rahmens. +Es können bis zu 26 Zeilen verwendet werden. Die Zeilen werden von oben nach +unten mit Buchstaben bezeichnet, beginnend mit 'A'. Falls der Wert für rows +negativ ist, läuft die Bezeichnung von unten nach oben. Wird rows +angegeben, so muss vorher auch columns angegeben werden. +
+Wird der borders-Parameter angegeben, so legt dieser fest auf welchen +Seiten des Rahmens ein Rand mit Zahlen bzw. Buchstaben angezeigt wird. Gültige +Werte hierfür sind Left, Top, Right und Bottom. +Standardmäßig wir der Rand an allen vier Seiten des Rahmens angezeigt. Sobald eine +dieser Optionen angegeben wird, wird der Rand nur an den gewünschten Seiten +dargestellt. Die speziellen Werte None und All können benutzt +werden um an keiner bzw. allen Seiten einen Rand darzustellen. +
+Eine Zeichnung kann zwar mehrere Rahmen enthalten, für die Ermittlung der Positionen +von Bauteilen und Netzen wird aber immer nur der erste benutzt. Diese Positionen +können zum Beispiel in einem User Language Programm +verwendet werden um eine Liste aller Bauteile mit Ihren Positionen im jeweiligen +Rahmen auszugeben. +Sie werden auch benutzt zur automatischen Berechnung von Querverweisen +bei Labels. +
+Aufgrund der speziellen Bedeutung des Rahmens hat dieser keine eigene Rotation +und reagiert auch nicht auf den ROTATE-Befehl +
+Ein Rahmen kann direkt in eine Board- oder Schaltplanzeichnung eingefügt werden. +Normalerweise werden Sie aber eher ein spezielles Symbol bzw. Package erzeugen, +welches eventuell auch noch ein Schriftfeld enthält, und das Sie dann in allen +Ihren Zeichnungen verwenden können. Die mitgelieferte Bibliothek "frames" enthält +bereits einige solcher Zeichnungsrahmen. +
+FRAME 10 5 TOP LEFT ++erzeugt einen Rahmen mit 10 Spalten (nummeriert von links nach rechts) und +5 Zeilen (markiert von oben nach unten mit 'A' bis 'E'), bei dem die Spalten- +und Zeilenmarkierungen nur am oberen und linken Rand dargestellt werden. + + + +
+Mit diesem Befehl kann man Gates in einem Schaltplan vertauschen. +Dabei müssen die beiden Gates identisch sein (dieselben Pins haben) +und in der Device-Definition denselben Swaplevel (größer +als 0) bekommen haben. Sind diese Bedingungen erfüllt, können +auch Gates aus unterschiedlichen Devices vertauscht werden. +
+Der als Parameter anzugebende Name ist der im Schaltplan sichtbare +Name (z. B. U1A für Gate A im Bauteil U1). +
+Wird ein Bauteil durch den GATESWAP-Befehl "unbenutzt", wird
+es automatisch aus dem Schaltplan entfernt.
+
+
+
+GRID
+
+
+Siehe auch SCRIPT
+
+GRID;
+
+Mit dem GRID-Befehl definiert man, ob und wie das Raster auf dem +Bildschirm dargestellt wird. Ausserdem legt dieser Befehl die +verwendete Rastereinheit fest. +
+GRID; ++schaltet das Raster ein bzw. aus. +
+Objekte lassen sich nur auf dem eingestellten Raster +plazieren. Für Platinen im Zollraster darf deshalb z. B. kein +mm-Raster verwendet werden. +
+Folgende options sind möglich: +
+
GRID ON; | Raster darstellen | |
GRID OFF; | Raster ausschalten | |
GRID DOTS; | Raster als Punkte darstellen | |
GRID LINES; | Raster als Linien darstellen | |
GRID MIC; | Rastereinheit ist Mikrometer | |
GRID MM; | Rastereinheit ist mm | |
GRID MIL; | Rastereinheit ist Mil (0.001 Inch) | |
GRID INCH; | Rastereinheit ist Inch (Zoll) | |
GRID FINEST; | Raster auf kleinstmöglichen Wert einstellen (1/10000 mm) | |
GRID grid_size; | Rasterabstand in der aktuellen Einheit | |
GRID LAST; | Setzt die Grid-Parameter auf die zuletzt | |
eingestellten Werte | ||
GRID DEFAULT; | Einstellung auf Standardwerte | |
GRID grid_size grid_multiple; | ||
grid_size = Rasterabstand | ||
grid_multiple = Rasterfaktor | ||
GRID ALT ...; | Definiert das alternative Grid |
+Grid mm; +Set Diameter_Menu 1.0 1.27 2.54 5.08; +Grid Last; ++In diesem Fall kann man zur zuletzt eingestellten Grid-Definition +zurückkehren, ohne sie zu kennen. +
+GRID mm 1 10; ++gibt an, dass ein Rasterabstand von 1 mm eingestellt und jede +zehnte Rasterlinie angezeigt werden soll. +
+Beim GRID-Befehl sind auch mehrere Parameter zulässig: +
+GRID inch 0.05 mm; ++Der erste Zahlenwert im GRID-Befehl entspricht dem +Rasterabstand, der zweite (falls vorhanden) dem Rasterfaktor. +
+Hier wird das Raster zunächst auf 0.05 Zoll eingestellt, dann +wird die Koordinatenanzeige auf mm umgestellt. +Die Koordinaten werden in diesem Fall zwar in mm angezeigt, +trotzdem ist das Raster nach wie vor auf 1/20 Zoll eingestellt! +
+GRID DEFAULT; ++Setzt das Raster auf den Standardwert für den aktuellen Zeichnungstyp. +
+GRID mil 50 2 lines on alt mm 1 mil; ++Definiert ein 50 mil Raster das als Linien dargestellt wird (wobei nur jede zweite Linie sichtbar ist) und setzt das +alternative Raster auf eine Größe von 1 mm, angezeigt in mil. +
+Ein Druck auf die Alt-Taste schaltet auf das alternative Grid um. +Dies kann typischerweise ein feineres Raster als das normale sein, wodurch es +zum Beispiel schnell und einfach möglich ist etwas in einem dicht belegten Gebiet +fein zu positionieren, wofür das normal Raster zu grob wäre. +Das alternative Grid bleibt so lange aktiv, wie die Alt-Taste gedrückt +gehalten wird. +
+Die Syntax zur Bearbeitung dieser Aliase ist: +
+GRID = MyGrid inch 0.1 lines on +
+Definiert den Alias "MyGrid" der, wenn er wie in +
+GRID myg +
+benutzt wird, das aktuelle Grid auf die angegebenen Parameter einstellt.
+Beachten Sie bitte die abgekürzte Verwendung des Aliases,
+und dass die Groß-/Kleinschreibung keine Rolle spielt.
+
+
+
+GROUP
+
+
+Siehe auch CHANGE,
+CUT,
+PASTE,
+MIRROR,
+DELETE
+
+GROUP ALL
+GROUP;
+
+
+
+
+
+Mit dem GROUP-Befehl definiert man eine Gruppe von Objekten, +auf die man anschließend bestimmte Befehle anwenden kann. Natürlich +kann auch eine ganze Zeichnung als Gruppe definiert werden. +
+Die Objekte selektiert man, indem man nach Aktivieren des +GROUP-Befehls mit der Maus ein Rechteck aufzieht oder ein Polygon zeichnet, das mit dem Betätigen +der rechten Maustaste geschlossen wird. In die Gruppe werden nur +Objekte aus den sichtbaren Layern übernommen. +
+Das Schlüsselwort ALL kann dazu benutzt werden eine Gruppe zu +definieren, die die gesamte Zeichnungsfläche einschließt. +
+Zur Gruppe gehören: +
+Die Gruppendefinition bleibt wirksam, bis eine neue Zeichnung geladen +wird oder bis der Befehl +
+GROUP; ++ausgeführt wird. +
+Wird im HELP-Befehl ein Befehlsname (command) angegeben, dann erhält +man die Beschreibung dieses Befehls. +
+HELP GRID; ++Es erscheint die Beschreibung des GRID-Befehls. + + + +
+Mit diesem Befehl definiert man Bohrungen ohne Durchkontaktierung +in Platinen oder Packages. Der Parameter drill gibt den Bohrdurchmesser +in der aktuellen Einheit an. Er darf maximal 0.51602 Zoll (ca. 13.1 +mm) betragen. +
+HOLE 0.20 ++Falls die eingestellte Maßeinheit "Inch" ist, hat das +Hole einen Durchmesser von 0.20 Zoll. +
+Der eingegebene Bohrdurchmesser (gilt auch für Pads und Vias) +bleibt für nachfolgende Operationen erhalten. Er kann mit dem +Befehl +
+CHANGE DRILL value ++verändert werden. +
+Ein Hole kann nur selektiert werden, wenn der Holes-Layer +eingeblendet ist (DISPLAY). +
+Eine Bohrung (Hole) erzeugt das zugehörige Bohrsymbol im Layer Holes +und einen Kreis mit dem entsprechenden Durchmesser im Layer Dimension. +Die Zuordnung von Symbolen zu bestimmten Bohrdurchmessern kann im +"Optionen/Einstellungen/Bohrsymbole" Dialog geändert werden. Der Kreis im Dimension-Layer ist +besonders für den Autorouter wichtig, der den eingestellten +Mindestabstand zwischen Vias/Wires und Dimension-Linien damit auch zum +Bohrloch einhält. +
+In Versorgungs-Layern erzeugen Holes Annulus-Symbole. +
+In den Layern tStop und bStop erzeugen Holes die Lötstopmaske, deren
+Durchmesser sich aus den Design Rules ergibt.
+
+
+
+INFO
+
+
+Siehe auch CHANGE,
+SHOW
+
+INFO name ..
+
+Der INFO-Befehl gibt zu einem Objekt umfassende Informationen, z.B. Wire-Breite, Layer und so weiter. +In diesem Dialog können die Objekt-Eigenschaften auch verändert werden. +
+Bauteile, Pads, Smds, Pins und Gatter lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. Beim Selektieren eines aus mehreren Gattern bestehenden Bauteils +im Schaltplan muss der volle, aus dem Bauteil- und dem jeweiligen Gatternamen +bestehende Name angegeben werden. +
+Attribute von Bauteilen können dadurch selektiert werden, dass die Kombination
+aus Bauteilname und Attributname angegeben wird, wie etwa R5>VALUE.
+
+
+
+INVOKE
+
+
+Siehe auch COPY,
+ADD
+
+INVOKE Part_Name Gate_Name orientation
+
+
+
+Addlevel und Orientation siehe ADD-Befehl. +
+Will man gezielt ein bestimmtes Gate eines Bauelements in den Schaltplan +holen (z.B. ein Power-Gate mit Addlevel Request), dann +benutzt man den INVOKE-Befehl. +
+Ein Gate kann man aktivieren, indem man +
+Wird im Dialog ein bereits aktiviertes Gate selektiert, so wechselt der Default-Button +zu "Anzeigen" und ein Klick darauf zoomt das Editor-Fenster auf das selektierte Gate, +wobei wenn nötig auch auf die entsprechende Seite gewechselt wird. +
+Löschen von Junctions, siehe DELETE-Befehl. +
+Mit diesem Befehl lassen sich die Kreuzungspunkte zusammengehöriger +Netze mit einem Punkt markieren. Ein Junction-Punkt lässt sich +nur auf einem Netz plazieren. Wird ein Junction-Punkt an einer Stelle +gesetzt, an der sich unterschiedliche Netze kreuzen, dann wird der +Benutzer gefragt, ob er die Netze verbinden will. +
+Wird eine Netzlinie auf einem Punkt abgesetzt auf dem schon mindestens zwei +weitere Netzlinien und/oder Pins liegen, wird automatisch ein Verbindungspunkt +(Junction) gesetzt. Diese Funktion kann über "SET AUTO_JUNCTION OFF;" oder +durch Deselektieren des Punkts "Junctions automatisch setzen" im Menü "Optionen/Einstellungen/Verschiedenes" abgeschaltet +werden. +
+Auf dem Bildschirm werden Junctions immer mit mindestens fünf
+Pixel Durchmesser dargestellt, damit sie auch in kleinen Zoom-Stufen
+noch sichtbar sind.
+
+
+
+LABEL
+
+
+Siehe auch NAME,
+BUS
+
+
+
+Mit diesem Befehl kann man den Namen eines Busses oder Netzes im Schaltplan an eine beliebige Stelle plazieren. Der erste Mausklick sorgt dafür, +dass der Name des selektierten Busses oder Netzes "am Mauszeiger +hängenbleibt". Der Text kann dann mit der rechten Maustaste +rotiert werden. Mit der mittleren Maustaste wählt man den Ziel-Layer +für den Label-Text aus. Der zweite Mausklick mit der linken Maustaste +plaziert den Text an eine beliebige Stelle. +
+Als Option kann die Schreibrichtung (orientation) +auch textuell angegeben werden. Das ist vor allem für Script-Dateien +sinnvoll. Die entsprechenden Schlüsselwörter sind im ADD-Befehl +aufgeführt (R0, R90 usw.). +
+Es können beliebig viele Labels je Bus/Signal plaziert werden. +
+Label-Texte lassen sich nicht mit CHANGE TEXT ändern. +
+Labels werden vom Programm wie Texte behandelt, aber ihr "Wert" +entspricht immer dem Namen des zugehörigen Busses oder Netzes. +Ändert man den Namen eines Busses/Netzes mit dem NAME-Befehl, +dann ändern sich automatisch alle zugehörigen Labels. +
+Selektiert man beim SHOW-Befehl einen Bus, ein Netz oder ein Label, +dann werden alle zugehörigen Busse, Netze bzw. Labels hell dargestellt. +
+Das Format, in welchem ein Querverweis-Label angezeigt wird, kann über die +"Format für Querverweis-Labels" Zeichenfolge im Dialog "Optionen/Einstellungen/Verschiedenes" +oder über den SET Befehl festgelegt werden. +Folgende Platzhalter sind definiert und können in beliebiger Reihenfolge verwendet werden: +
+
%F | aktiviert das Zeichnen eines Rahmens um das Label | |
%N | der Name des Netzes | |
%S | die nächste Seitennummer | |
%C | die Spalte auf der nächsten Seite | |
%R | die Zeile auf der nächsten Seite |
+Das Standard-Format ist "%F%N/%S.%C%R". Neben den definierten Platzhaltern +können Sie auch beliebige andere ASCII-Zeichen verwenden. +
+Die Werte für Spalte und Zeile sind nur verfügbar, wenn auf der nächsten Seite, +auf der das Netz vorkommt, ein Zeichnungsrahmen +platziert wurde. Wird %C oder %R benutzt und es befindet sich +kein Rahmen auf der Seite, zeigen sie ein Fragezeichen ('?') an. +
+Bei der Ermittlung der Spalte und Zeile eines Netzes auf einer Schaltplanseite +wird zunächst die Spalte und dann die Zeile innerhalb dieser Spalte betrachtet. +Hierbei haben XREF-Labels Vorrang vor normalen Labels, und diese wiederum Vorrang +vor Netz-Wires. +Für höhere Seitennummern werden die Rahmen-Koordinaten des am weitesten links oben +liegenden Feldes genommen, während für niedrigere Nummern die des am weitesten +rechts unten liegenden Feldes genommen werden. +
+Die Orientierung eines Querverweis-Labels bestimmt ob es auf eine "höhere" oder +"niedrigere" Seitennummer verweist. Labels mit einer Orientierung von R0 oder R270 +zeigen zum rechten bzw. unteren Rand der Zeichnung und beziehen sich daher auf +eine höhere Seitennummer. Entsprechend verweisen Labels mit einer Orientierung +von R90 oder R180 auf eine niedrigere Seitennummer. Hat ein Label eine Orientierung +von R0 oder R270, aber das Netz, an dem es hängt, kommt auf keiner höheren Seite +vor, so wird stattdessen ein Verweis auf die nächst niedrigere Seite angezeigt +(entsprechendes gilt für R90 und R180). +Kommt das Netz ausschließlich auf der aktuellen Seite vor, so wird keinerlei +Querverweis angezeigt, sondern nur der Netzname (mit Rahmen, falls das Format +den %F Platzhalter enthält). +
+Ein Querverweis-Label, welches auf das Ende eines Netz-Wires platziert wird, +verbindet sich mit dem Wire, so dass sich der Wire mit dem Label mitbewegt +und umgekehrt. +
+Das Format für Querverweis-Labels wird in der Schaltplan-Zeichnung gespeichert. +
+Ein Querverweis-Label kann entweder mit dem CHANGE-Befehl +oder über seinen Eigenschaften-Dialog in ein normales Label verwandelt werden. +
+LAYER Layer; +WIRE (1 2) (3 4); ++hier nicht funktioniert. Der Layer muss gewählt werden, wenn der LABEL-Befehl +bereits aktiv ist. Dies kann folgendermaßen geschehen: +
+LABEL Parameter +LAYER Layer +weitere Parameter; ++Beachten Sie, dass die LABEL-Zeile nicht mit einem ';' +abgeschlossen ist, und dass der LAYER-Befehl in einer neuen Zeile beginnt.
+LABEL +LAYER Layer; ++setzen den Layer für nachfolgende LABEL-Befehle. + + + +
+Der ROUTE-Befehl ändert den aktiven Layer automatisch. +
+Bestimmte Layer stehen nicht in allen Betriebsarten zur Verfügung, +da sie nicht überall einen Sinn haben. +
+Bitte beachten Sie, dass von den Signal-Layern (1 bis 16) nur diejenigen +zur Verfügung stehen, die im Layer-Setup in den Design Rules +eingetragen sind. +
+LAYER 101 BEISPIEL; ++erzeugt einen neuen Layer mit der Nummer 101 und dem Namen BEISPIEL. +
+Werden in einer Zeichnung Bibliothekselemente plaziert (mit ADD oder +REPLACE), die zusätzliche Layer enthalten, dann werden diese Layer +automatisch in der Zeichnung angelegt. +
+Die vordefinierten Layer haben spezielle Bedeutung. Man kann zwar +ihren Namen ändern, aber ihre besondere Funktion bleibt aufgrund +ihrer Nummer erhalten. +
+Wenn Sie eigene Layer definieren, sollten Sie nur die +Layer-Nummern ab 100 verwenden. Bei kleineren Nummern kann es sein, +dass Sie in späteren EAGLE-Versionen spezielle Bedeutung bekommen. +
+LAYER -103; ++löscht den Layer mit der Nummer 103. Voraussetzung ist, dass +der Layer leer ist. Ist das nicht der Fall, wird die Fehlermeldung +
+ "layer is not empty: #" +
+ausgegeben, wobei # die Layer-Nummer repräsentiert. +Falls Sie jegliche Fehlermeldungen beim Löschen eines Layers +vermeiden wollen, so können Sie die Option '??' angeben. Das kann +in Scripts nützlich sein, die bestimmte Layer zu löschen versuchen, +wo es aber keinen Fehler darstellt wenn ein Layer nicht leer oder +überhaupt nicht vorhanden ist. +
+Die vordefinierten Layer lassen sich nicht löschen. +
+Alle zu diesem Signal gehörenden Pads und Vias werden vom RATSNEST-Befehl +und dem Autorouter implizit als verbunden angenommen. +
+Versorgungs-Layer werden "invertiert" betrachtet, das heisst alle auf einem solchen Layer +sichtbaren Objekte resultieren in "kupferfreien" Zonen auf der Platine. Das Programm generiert +automatisch Thermal- und Annulus-Symbole um die Pads und Vias an diese Layer anzuschließen +bzw. sie davon zu isolieren. +
+Sie sollten keine zusätzlichen Objekte in einen Versorgungs-Layer zeichnen, ausser zum Beispiel +Wires entlang der Platinenumrisse, wodurch verhindert wird, dass das Kupfer bis zu den Kanten +der fertigen Platine reicht (was zu Kurzschlüssen durch metallene Gehäuse oder Befestigungsschrauben +führen könnte). +Beachten Sie bitte, dass keine Prüfungen stattfinden, ob ein Versorgungs-Layer auch wirklich alle +Pads und Vias verbindet. +Falls zum Beispiel ein vom Benutzer gezeichnetes Objekt ein Pad isoliert, das an diesen +Versorgungs-Layer angeschlossen werden sollte, wird nicht automatisch eine Luftlinie für diese +(fehlende) Verbindung erzeugt. Das gleiche gilt wenn mehrere Annulus-Symbole einen "Ring" um ein +Thermal-Symbol bilden (und dadurch das Pad von seinem Signal isolieren). +Ebenso ist zu beachten, dass sich die Abmessungen der Annulus-Symbole in einem Supply-Layer +ausschließlich nach dem in den Design Rules unter +"Supply" angegebenen Wert für "Annulus" richten, und dass hier weder die unter +"Clearance" noch die in den Netzklassen angegebenen Mindestabstände +eingehen. +
+Eine sicherere und flexiblere Methode um Versorgungs-Layer zu realisieren bietet der +POLYGON-Befehl. +
1 Top | Leiterbahnen oben | |
2 Route2 | Innenlage (Signal- oder Versorgungs-Layer) | |
3 Route3 | Innenlage (Signal- oder Versorgungs-Layer) | |
4 Route4 | Innenlage (Signal- oder Versorgungs-Layer) | |
5 Route5 | Innenlage (Signal- oder Versorgungs-Layer) | |
6 Route6 | Innenlage (Signal- oder Versorgungs-Layer) | |
7 Route7 | Innenlage (Signal- oder Versorgungs-Layer) | |
8 Route8 | Innenlage (Signal- oder Versorgungs-Layer) | |
9 Route9 | Innenlage (Signal- oder Versorgungs-Layer) | |
10 Route10 | Innenlage (Signal- oder Versorgungs-Layer) | |
11 Route11 | Innenlage (Signal- oder Versorgungs-Layer) | |
12 Route12 | Innenlage (Signal- oder Versorgungs-Layer) | |
13 Route13 | Innenlage (Signal- oder Versorgungs-Layer) | |
14 Route14 | Innenlage (Signal- oder Versorgungs-Layer) | |
15 Route15 | Innenlage (Signal- oder Versorgungs-Layer) | |
16 Bottom | Leiterbahnen unten | |
17 Pads | Pads (bedrahtete Bauteile) | |
18 Vias | Vias (durchgehend) | |
19 Unrouted | Luftlinien | |
20 Dimension | Platinen-Umrisse (und Kreise für Holes) | |
21 tPlace | Bestückungsdruck oben | |
22 bPlace | Bestückungsdruck unten | |
23 tOrigins | Aufhängepunkte oben (Kreuz automatisch generiert) | |
24 bOrigins | Aufhängepunkte unten (Kreuz automatisch generiert) | |
25 tNames | Servicedruck oben (Bauteile-Namen, NAME) | |
26 bNames | Servicedruck unten (Bauteile-Namen, NAME) | |
27 tValues | Bauteile-Werte oben (VALUE) | |
28 bValues | Bauteile-Werte unten (VALUE) | |
29 tStop | Lötstopmaske oben (automatisch generiert) | |
30 bStop | Lötstopmaske unten (automatisch generiert) | |
31 tCream | Lotpaste oben | |
32 bCream | Lotpaste unten | |
33 tFinish | Veredelung oben | |
34 bFinish | Veredelung unten | |
35 tGlue | Klebemaske oben | |
36 bGlue | Klebemaske unten | |
37 tTest | Test- und Abgleichinformationen oben | |
38 bTest | Test- und Abgleichinformationen unten | |
39 tKeepout | Sperrflächen für Bauteile oben | |
40 bKeepout | Sperrflächen für Bauteile unten | |
41 tRestrict | Sperrflächen für Leiterbahnen oben | |
42 bRestrict | Sperrflächen für Leiterbahnen unten | |
43 vRestrict | Sperrflächen für Vias | |
44 Drills | Bohrungen, durchkontaktiert | |
45 Holes | Bohrungen, nicht durchkontaktiert | |
46 Milling | CNC-Fräser-Daten zum Schneiden der Plat. | |
47 Measures | Bemaßungen | |
48 Document | allgemeine Dokumentation | |
49 Reference | Passermarken | |
51 tDocu | Bauteiledokumentation oben | |
52 bDocu | Bauteiledokumentation unten |
91 Nets | Netze | |
92 Busses | Busse | |
93 Pins | Anschlusspunkte für Schaltplansymbole | |
mit Zusatzinformationen | ||
94 Symbols | Umrisse der Schaltplansymbole | |
95 Names | Namen bei Schaltplansymbolen | |
96 Values | Werte/Typenbezeichnung bei Schaltplansymbolen | |
97 Info | Allgemeine Informationen | |
98 Guide | Hilfslinien |
+Layer können immer mit ihrem Namen oder Nummer angegeben werden.
+
+
+
+LOCK
+
+
+Siehe auch MIRROR,
+MOVE,
+ROTATE
+SMASH
+
+LOCK name ..
+
+
+
+Der LOCK-Befehl kann auf Bauteile in einem Board angewendet werden +und verhindert, dass diese bewegt, gedreht oder gespiegelt werden können. +Dies ist nützlich für Dinge wie Steckerleisten, die an einer genau festgelegten +Stelle montiert werden müssen und nicht unbeabsichtigt verschoben werden +dürfen. +
+Der Aufhängepunkt eines verriegelten Bauteils wird als 'x' dargestellt, +um anzuzeigen, dass das Bauteil verriegelt ist. +
+Wird eine Gruppe bewegt, die verriegelte Bauteile enthält, so bewegen +sich diese Bauteile (sowie die an ihren Pads endenden Wires) nicht mit der +Gruppe mit. +
+Losgelöste Texte eines verriegelten Bauteils können weiterhin einzeln +bewegt werden, bewegen sich aber nicht als Teil einer Gruppe mit. +
+Bauteile lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. +
+Ein "verriegeltes" Bauteil kann "entriegelt" werden, indem es bei gedrückter
+Shift-Taste (und natürlich aktiviertem LOCK-Befehl) angeklickt wird.
+
+
+
+MARK
+
+
+Siehe auch GRID
+
+MARK;
+
+Mit dem MARK-Befehl definiert man einen Punkt in der Zeichenfläche, +der als Bezugspunkt zum Ausmessen von Strecken dienen kann. Die +Koordinaten relativ zu diesem Punkt werden in der gegenwärtig +eingestellten Einheit (GRID) links oben auf dem Bildschirm mit +vorangestelltem 'R' angezeigt. Der Bezugspunkt wird als weißes +Kreuz dargestellt. Um genau messen zu können, sollten Sie vorher ein +Raster einstellen das fein genug ist. +
+Die Eingabe 'MARK;' schaltet die Marke ein oder aus.
+
+
+
+MENU
+
+
+Siehe auch ASSIGN,
+SCRIPT
+
+MENU;
+
+Mit dem MENU-Befehl kann man das Text-Menü nach eigenen Wünschen +ändern. +
+Die vollständige Spezifikation für den option-Parameter ist: +
+option := command | menu | delimiter +command := text [ ':' text ] +menu := text '{' option [ '|' option ] '}' +delimiter := '---' ++Eine Option des MENU-Befehls kann entweder ein einfacher Befehl sein, wie z. B. +
+MENU Display Grid; ++der die Befehle Display und Grid als Inhalt des Text-Menüs definiert; +ein selbstdefinierter Befehl sein, wie z. B. +
+MENU 'MyDisp : Display None Top Bottom Pads Vias;' 'MyGrid : Grid mil 100 lines on;'; ++Das Text-Menü enthält die beiden selbstdefinierten Befehle MyDisp und MyGrid. +Nach Anklicken eines Buttons im Menü wird die nach ':' definierte Befehlssequenz +der entsprechenden Option ausgeführt; +oder eine Schaltfläche erzeugen, die Untermenüs enthalten kann, wie z. B. +
+MENU 'Grid { Fine : Grid inch 0.001; | Coarse : Grid inch 0.1; }'; ++Es wird ein Button mit dem Namen Grid erzeugt, der nach dem Anklicken ein +Untermenü mit den beiden Optionen Fine und Coarse enthält. +
+Die besondere Option '---' kann man verwenden, um einen Trennstrich im Menü +zu erzeugen. Das fördert die Übersichtlichkeit im Menü. +
+Bitte beachten Sie, dass jede option, die mehr als ein Wort oder einen Text, +der als Befehl interpretiert werden kann, enthält, in einfache Hochkommas eingeschlossen +werden muss. +Wenn Sie den MENU-Befehl in einer Script-Datei verwenden, um ein komplexes Text-Menü +zu definieren und dabei die Menü-Definition zur besseren Lesbarkeit über mehrere Zeilen +verteilen wollen, ist es notwendig die Zeilen mit einem Backslash ('\') zu beenden, +wie z. B. +
+MENU 'Grid {\ + Fine : Grid inch 0.001; |\ + Coarse : Grid inch 0.1;\ + }'; ++
+MENU Move Delete Rotate Route ';' Edit; ++erzeugt ein Menü, das die Befehle Move bis Route, den Strichpunkt +als Befehlsabschlusszeichen und den Edit-Befehl enthält. +
+Der Befehl +
+MENU; ++stellt wieder das Standard-Menü ein. +
+Beachten Sie, dass der Eintrag ';' immer im Menü enthalten sein sollte.
+Er wird zum Beenden vieler Befehle benötigt.
+
+
+
+MIRROR
+
+
+Siehe auch ROTATE,
+LOCK,
+TEXT
+
+MIRROR name..
+
+Mit dem MIRROR-Befehl können Objekte an der y-Achse gespiegelt +und damit z.B. auf der Lötseite der Platine plaziert werden. +
+Bauteile, Pads, Smds und Pins lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. +
+Attribute von Bauteilen können dadurch selektiert werden, dass die Kombination +aus Bauteilname und Attributname angegeben wird, wie etwa R5>VALUE. +
+Das Spiegeln von Packages ist nur mit eingeblendetem tOrigins- bzw. +bOrigins-Layer möglich. +
+Beim Spiegeln von Elementen werden die angeschlossenen +Wires auf den Außenlagen mitgespiegelt (Achtung auf Kurzschlüsse!). Vias werden +dabei nicht automatisch gesetzt. +
+Beachten Sie bitte, dass Objekte auf Innenlagen (2...15) beim Spiegeln +ihren Layer nicht wechseln. Gleiches gilt auch für Vias. +
+Bauteile können nicht gespiegelt werden, wenn sie gelockt sind, +oder wenn eines ihrer angeschlossenen Pads aus der erlaubten Fläche hinausstehen würde +(falls sie eine eingeschränkte Version von EAGLE verwenden). +
+Wires, Circles, Pads und Polygone lassen sich +nicht explizit spiegeln (als Bestandteile von Gruppen werden sie +mitgespiegelt). +
+Im Schaltplan führt das Spiegeln eines Textes dazu, dass er auf der anderen
+Seite seines Aufhängepunktes dargestellt wird; er bleibt aber nach wie vor normal
+lesbar.
+
+
+
+MITER
+
+
+Siehe auch SPLIT,
+WIRE,
+ROUTE,
+POLYGON
+
+
+Der MITER-Befehl dient dazu die Verbindungsstelle zweier Wires abzuschrägen. +Die beiden existierenden Wires müssen dazu auf dem gleichen Layer liegen, die +gleiche Breite und den gleichen Wire-Style haben. +
+Der MOVE-Befehl bewegt das Objekt, das dem Mauszeiger bzw. dem angegebenen +Koordinatenpunkt am nächsten liegt. +
+Bauteile, Pads, Smds, Pins und Gatter lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. Beim Selektieren eines aus mehreren Gattern bestehenden Bauteils +im Schaltplan muss der volle, aus dem Bauteil- und dem jeweiligen Gatternamen +bestehende Name angegeben werden. +
+Attribute von Bauteilen können dadurch selektiert werden, dass die Kombination +aus Bauteilname und Attributname angegeben wird, wie etwa R5>VALUE. +
+Das Bewegen von Elementen ist nur mit eingeblendetem tOrigins- bzw. +bOrigins-Layer möglich. +
+Der MOVE-Befehl wirkt nur auf sichtbare Layer (siehe DISPLAY). +
+Wires, die an einem Element hängen, lassen sich an diesem Ende +nicht bewegen. Beim Bewegen von Elementen bewegen sich die angeschlossenen +Wires mit, sofern sie Bestandteil eines Signals sind, (Achtung +auf Kurzschlüsse!). +
+Wird ein Objekt mit der linken Maustaste angeklickt und die Taste danach +nicht wieder losgelassen, so kann das Objekt sofort bewegt werden ("Click&Drag"). +Gleiches gilt für Gruppen bei Verwendung der rechten Maustaste. +Es ist dann allerdings nicht möglich das Objekt während des Bewegens zu +drehen oder zu spiegeln. +
+Bauteile können nicht bewegt werden, wenn sie gelockt sind, +oder wenn eines ihrer angeschlossenen Pads aus der erlaubten Fläche hinausstehen würde +(falls sie eine eingeschränkte Version von EAGLE verwenden). +
+Wird ein Element bewegt, werden beim Absetzen offene Pins dieses Elements +an eventuell vorhandene Netze bzw. andere Pins angeschlossen. +
+Bewegt man ein Netz auf einen Pin, werden Netz und Pin nicht logisch +verbunden, obwohl sie optisch verbunden sind. +
+Wird ein Wire in der Mitte (nicht an einem seiner Endpunkte) mit gedrückter +Ctrl-Taste selektiert, so bleiben die Endpunkte fixiert und der Wire kann +gebogen werden, wodurch er zum Kreisbogen wird. Auf die gleiche Weise kann die Krümmung eines +Kreisbogens (der im Grunde nichts anderes als ein Wire ist) verändert werden. +
+Wird ein Rechteck an einer seiner Ecken mit gedrückter Ctrl-Taste +selektiert, so kann die Größe des Rechtecks sowohl in der Breite als auch in der Höhe +verändert werden. Beim Selektieren einer Kante mit gedrückter Ctrl-Taste +läßt sich nur die Breite bzw. die Höhe verändern. Selektiert man das Rechteck an +seinem Mittelpunkt mit gedrückter Ctrl-Taste, so wird dieser an den Mauszeiger +gezogen und in das aktuelle Raster geschnappt. +
+Wird ein Kreis mit gedrückter Ctrl-Taste an seinem Umfang selektiert, +so bleibt sein Mittelpunkt fix und der Durchmesser kann verändert werden. Wird +der Mittelpunkt auf diese Weise selektiert, so wird dieser an den Mauszeiger +gezogen und in das aktuelle Raster geschnappt. +
+Beachten Sie, das nur solche Wires verschoben werden, die beide Enden in der Gruppe +haben, und dass Bauteile, die verschoben werden, alle ihre elektrischen Verbindungen +mitnehmen, auch wenn ein an einem Pin angeschlossener Net-Wire nicht verschoben wird, +da sein anderes Ende nicht in der Gruppe liegt. +Falls ein Pin auf der neuen Seite eine elektrische Verbindung hat, aber kein anderer +Pin, Wire oder Junction daran angeschlossen ist um dies sichtbar zu machen, so +wird automatisch eine Junction an dieser Stelle generiert. +
+Dieser Vorgang kann sogar in einem Script ausgeführt werden. Zum Beispiel würde +
+edit .s1 +group (1 1) (1 2) (2 2) (2 1) (1 1) +move (> 0 0) +edit .s2 +(0 0) ++auf die erste Seite schalten, eine Gruppe definieren, diese mit MOVE selektieren, +auf die zweite Seite schalten und die Gruppe absetzen. Die Koordinaten (0 0) +am Schluss sind für den implizit gestarteten MOVE-Befehl. +
+Falls Sie lediglich die Reihenfolge der Seiten verändern wollen, so können Sie
+das mit dem EDIT-Befehl tun.
+
+
+
+NAME
+
+
+Siehe auch SHOW,
+SMASH,
+VALUE
+
+NAME new_name
+NAME old_name new_name
+
+Mit den NAME-Befehl kann man den Namen +des selektierten Objektes anzeigen und +(in einem Popup-Menü) ändern. +
+Bauteile, Pads, Smds, Pins und Gatter lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. +
+nur das selektierte Segment,
+alle Segmente auf dieser Seite,
+alle Segmente auf allen Seiten
+
+mit der Maus oder durch Eingabe des entsprechenden Hot-Keys +umbenannt werden sollen. Je nachdem ob das Netz bzw. der +Bus nur auf dieser Seite definiert ist oder aus einem oder mehreren +Segmenten besteht, entfallen einzelne Punkte des Menüs bzw. das +gesamte Menü. Existiert der neue Name bereits (auf dieser oder +einer anderen Seite), wird vorher noch abgefragt, ob die beiden Netze +bzw. Busse verbunden werden sollen. +
+Mit dem NET-Befehl zeichnet man Einzelverbindungen (Netze) in den +Net-Layer eines Schaltplans. Der erste Mausklick gibt den Startpunkt +des Netzes an, der zweite setzt die Linie ab. +Zwei Mausklicks am selben Punkt beenden das Netz. +
+Wird ein Netz an einem Punkt abgesetzt, an dem schon ein anderes Netz, +ein Bus oder ein Pin liegt, endet die Netzlinie hier. +Diese Funktion kann über "SET AUTO_END_NET OFF;" oder durch +Deselektieren der Option "Netze und Busse automatisch beenden" im Menü "Optionen/Einstellungen/Verschiedenes" +abgeschaltet werden. +
+Wird eine Netzlinie an einem Punkt abgesetzt an dem mindestens zwei +Netzlinien und/oder Pins liegen, wird automatisch ein Verknüpfungspunkt +(Junction) gesetzt. +Diese Funktion kann über "SET AUTO_JUNCTION OFF;" oder durch +Deselektieren der Option "Junctions automatisch setzen" im Menü "Optionen/Einstellungen/Verschiedenes" +abgeschaltet werden. +
+Wird der curve oder @radius Parameter angegeben, so kann ein Kreisbogen als Teil des Netzes +gezeichnet werden (siehe die ausführliche Beschreibung beim WIRE-Befehl). +
+Gibt man keinen Namen im NET-Befehl an und startet man auch nicht +auf einem Bus, dann wird ein Name der Form N$1 für das Netz automatisch +vergeben. +
+Netze oder Teile davon, die auf verschiedenen Seiten eines Schaltplans liegen und denselben +Namen haben, sind miteinander verbunden. +
+Netznamen sollten kein Komma (',') enthalten, da dieses das Trennzeichen +für Busse ist. +
+SET NET_WIRE_WIDTH width; ++voreinstellen (Default: 6 Mil). +
+ !RESET ++was als +
+ _____ + RESET ++dargestellt würde. +Einzelheiten hierzu finden Sie in der Beschreibung des TEXT-Befehls. + + + +
+Der OPEN-Befehl öffnet eine existierende Bibliothek oder legt +eine neue an, falls noch keine mit dem angegebenen Namen existiert. +Danach kann ein existierendes oder ein neues Symbol, Device oder Package +editiert werden. +
+Dieser Befehl ist in erster Linie für Script-Dateien erforderlich.
+
+
+
+OPTIMIZE
+
+
+Siehe auch SET,
+SPLIT,
+MOVE,
+ROUTE
+
+OPTIMIZE signal_name ..
+OPTIMIZE ..
+
+Der OPTIMIZE-Befehl fasst Wire-Segmente, die +in einer Linie liegen, zu einem Segment zusammen. Voraussetzung dafür +ist, dass sich die Segmente im selben Layer befinden und dass +Sie dieselbe Breite haben. +
+Werden Signalnamen angegeben oder wird ein Signal selektiert, so wirkt der +Befehl nur auf die entsprechenden Signale. +
+SET OPTIMIZING OFF; ++abgeschaltet, oder beim SPLIT-Befehl wurden zwei Mausklicks auf +denselben Punkt eines Wires gesetzt. +
+Der OPTIMIZE-Befehl arbeitet unabhängig von der Einstellung der +Set-Variablen Optimizing, d.h. er funktioniert auch, wenn +
+SET OPTIMIZING OFF; ++eingegeben wurde. + + + +
+Dieser Befehl wird im Device-Editor verwendet um eine Gehäuse-Variante +zu definieren, zu löschen oder umzubenennen. +Im Schaltplan- oder Board-Editor verhält sich der PACKAGE-Befehl genau so +wie "CHANGE PACKAGE". +
+Ohne Angabe von Parametern öffnet sich ein Dialog, der es erlaubt ein Gehäuse zu +wählen und dessen Varianten-Namen zu definieren. +
+Die Parameter pname vname verknüpfen das Gehäuse pname mit +der neuen Variante vname. +
+In der Schreibweise pname@lname vname wird das Package pname +aus der Bibliothek lname geholt und eine neue Gehäuse-Variante erzeugt. +Dies kann ebenso über das Kontext-Menü der +Bibliotheksobjekte oder über Drag&Drop aus der Baumansicht des Control +Panels erfolgen. +
+Der einzelne Parameter name ruft die schon vorhandene Package-Variante +auf. Wurde bisher noch keine Package-Variante definiert und existiert ein +Package mit dem angegebenen Namen in der Bibliothek, wird mit diesem Package eine neue +Package-Variante mit Namen '' (ein "leerer" Name) erzeugt (aus Kompatibilitätsgründen +zu Version 3.5 notwendig). +
+Gibt man -old_name new_name an, wird die Package-Variante old_name +umbenannt in new_name. +
+Der einzelne Parameter -name löscht die angegebene Package-Variante. +
+Der Name der Package-Variante wird dem Device-Set-Namen hinzugefügt, so dass ein +eindeutiger Device-Name entsteht. Enthält der Device-Set-Name das Zeichen '?', +wird dieser Platzhalter durch den Package-Varianten-Namen ersetzt. +Bitte beachten Sie, dass die Package-Variante erst nach der Technology-Funktion +bearbeitet wird. Wenn der Device-Set-Name weder '*' noch '?' enthält, +setzt sich der Device-Name aus Device-Set-Name+Technology+Package-Variante zusammen. +
+Anschließend ist der CONNECT-Befehl zu verwenden, damit festgelegt +werden kann, welcher Pin (im Schaltplan-Symbol) welchem Pad des Gehäuses +entspricht. +
+Die maximale Anzahl von Package-Varianten pro Device-Set ist 254. +
+Führt man im Schaltplan-Modus den BOARD-Befehl aus,
+so entsteht für jedes Device dasjenige Package, das mit dem
+PACKAGE-Befehl festgelegt wurde.
+
+
+
+PAD
+
+
+Siehe auch SMD,
+CHANGE,
+DISPLAY,
+SET,
+NAME,
+VIA,
+Design Rules
+
+
+Ein Pad ist ein Bauelemente-Anschluss mit Durchkontaktierung. +
+Der PAD-Befehl plaziert ein Pad in einem Package. Die Eingabe eines +Durchmessers vor dem Plazieren ändert die Größe des Pads. +Der Durchmesser wird in der aktuellen Maßeinheit angegeben. Er darf +maximal 0.51602 Zoll (ca. 13.1 mm) betragen. +
+Pads erzeugen Bohrsymbole im Layer Drills und die Lötstopmaske in den +Layern tStop/bStop. +
+Die orientation (siehe Beschreibung bei ADD) +darf jeder Winkel im Bereich R0...R359.9 sein. Das S- +bzw. M-Flag kann hier nicht benutzt werden. +
+PAD 0.06 ++Falls die eingestellte Maßeinheit "Inch" ist, hat das Pad einen +Durchmesser von 0.06 Zoll. Die eingegebene Größe bleibt für nachfolgende +Operationen erhalten. +
+
Square | quadratisch | |
Round | rund | |
Octagon | achteckig | |
Long | länglich | |
Offset | länglich mit Versatz |
+Diese Formen gelten nur für die Aussenlagen (Top bzw. Bottom). +In den Innenlagen ist die Form immer "rund". +
+Bei den länglichen Pads ist der kleinere der beiden Durchmesser +als Parameter anzugeben. Das Seitenverhältnis wird über den Parameter +Shapes/Elongation in den Design Rules des Boards +festgelegt (Default ist 100%, also ein Seitenverhältnis von 2:1). +
+Die Pad-Form kann entweder (wie der Durchmesser) eingegeben werden, +während der Pad-Befehl aktiv ist, oder sie kann mit dem CHANGE-Befehl +verändert werden, z. B.: +
+CHANGE SHAPE OCTAGON ++Die eingegebene Form bleibt für nachfolgende Operationen erhalten. +
+Da die Darstellung verschiedener Pad-Formen und der Bohrlöcher +den Bildaufbau etwas verlangsamt, kann mit dem Befehl +
+SET DISPLAY_MODE REAL | NODRILL; ++von realer auf schnelle Darstellung umgeschaltet werden. +
+Beachten Sie bitte, dass die tatsächlichen Werte für Pad-Form und -Durchmesser durch die +Design Rules des Boards bestimmt werden, in dem das Bauteil +verwendet wird. +
+Die Namen der Pads kann man mit dem Befehl +
+SET PAD_NAMES ON/OFF ++ein- bzw. ausblenden. Die Änderung wird erst nach dem nächsten +Bildaufbau sichtbar. +
+
NOSTOP | keine Lötstopmaske generieren | |
NOTHERMALS | keine Thermals generieren | |
FIRST | dies ist das "erste" Pad (und kann mit einer speziellen Form dargestellt werden) |
+Standardmäßig generieren Pads automatisch Lötstopmaske und Thermals.
+In speziellen Fällen kann es jedoch erwünscht sein, dass einzelne Pads dies nicht tun.
+Die objgen NO...-Flags können benutzt werden um diese Eigenschaften zu
+unterdrücken.
+Falls die Design Rules eines Boards definieren, dass
+das "erste Pad" eines Bauteils in einer speziellen Form dargestellt werden soll, so
+wird das mit FIRST markierte Pad auf diese Weise dargestellt.
+Ein neu gestarteter PAD-Befehl setzt alle Flags auf ihre Standardwerte zurück.
+Sobald ein Flag in der Kommandozeile angegeben wird, gilt es für alle nachfolgend
+in diesem PAD-Befehl plazierten Pads (ausgenommen FIRST, welches nur für
+das unmittelbar dieser Option folgende Pad gilt).
+
+Orientation siehe ADD-Befehl. +
+Mit CUT und PASTE lassen sich Teile einer Zeichnung/Bibliothek kopieren, +auch in eine andere Zeichnung/Bibliothek. +
+Dabei ist folgendes zu beachten: +
+Direction
+Function
+Length
+Orientation
+Visible
+Swaplevel
+
+
NC | not connected | |
In | Eingang | |
Out | Ausgang (totem-pole) | |
I/O | Ein-/Ausgang (bidirektional) | |
OC | Open Collector oder Open Drain | |
Hiz | High-Impedance(3-State)-Ausgang | |
Pas | passiv (für Widerstände, Kondensatoren etc.) | |
Pwr | Power-Pin (Vcc, Gnd, Vss ...), Stromversorgungs-Eingang | |
Sup | Stromversorgungs-Ausgang, z.B. Massesymbol. |
+Default: I/O +
+Wenn Pwr-Pins in einem Symbol vorhanden sind und im Schaltplan ein +entsprechender Sup-Pin existiert, werden die Netze automatisch +eingefügt. Sup-Pins werden nicht in Bauelementen verwendet. +
+
None | keine spezielle Funktion | |
Dot | Invertier-Symbol | |
Clk | Taktsymbol | |
DotClk | Invertiertes Taktsymbol |
+Default: None +
+
+
Point | Pin wird ohne Linie und Beschriftung dargestellt | |
Short | Linie ist 0.1 Zoll lang | |
Middle | Linie ist 0.2 Zoll lang | |
Long | Linie ist 0.3 Zoll lang |
+Default: Long +
+
R0 | Pin-Symbol rechts | |
R90 | Pin-Symbol oben | |
R180 | Pin-Symbol links | |
R270 | Pin-Symbol unten |
+Default: R0 +
+
Both | Pin- und Pad-Name sind im Schaltplan sichtbar | |
Pad | nur der Pad-Name ist im Schaltplan sichtbar | |
Pin | nur der Pin-Name ist im Schaltplan sichtbar | |
Off | weder Pin- noch Pad-Name im Schaltplan sichtbar |
+Default: Both +
+Default: 0 +
+Gibt man im PIN-Befehl einen Namen an, dann muss er in Hochkommas +eingeschlossen sein. Pin-Namen kann man im Symbol-Editier-Modus mit +dem NAME-Befehl ändern. +
+PIN 'D0' ++und alle weiteren nur noch mit je einem Mausklick ab. Der numerische +Teil des Namens wird dann automatisch weitergezählt. +
+Der SHOW-Befehl zeigt den Namen des Pins sowie Direction und +Swaplevel an. +
+Drei Pins sollen z.B. GND heißen. Sie geben den Pins bei der +Symbol-Definition die Namen GND@1, GND@2 und GND@3. Im Schaltplan sind +nur die Zeichen vor dem "@" sichtbar, und die Pins werden dort auch so +behandelt, als hießen Sie GND. +
+Es ist nicht möglich, in einem Symbol, das in einem Device verwendet +wird, nachträglich einen Pin hinzuzufügen oder zu löschen, +da dies die im Device definierten Pin-/Pad-Zuordnungen (CONNECT-Befehl) +verändern würde. +
+ !RESET ++was als +
+ _____ + RESET ++dargestellt würde. +Einzelheiten hierzu finden Sie in der Beschreibung des TEXT-Befehls. + + + +
+In einem Schaltplan kann man mit diesem Befehl Pins vertauschen, die +zum selben Device gehören und bei der Symbol-Definition denselben +Swaplevel erhalten haben (Swaplevel > 0). Swaplevel siehe PIN-Befehl. +Ist eine Platine über die +Back-Annotation +einem Schaltplan verbunden, +dann lassen sich Pads nur dann vertauschen, wenn die zugehörigen Pins +vertauscht werden können. +
+In einer Platine, zu der es keinen Schaltplan gibt, lassen sich mit +zwei Pads desselben Package vertauschen. Der Swaplevel +wird dabei nicht geprüft. +
+Die an den vertauschten Pads angeschlossenen Leitungen wandern
+mit, so dass es zu Kurzschlüssen kommen kann. Bitte DRC durchführen
+und, falls erforderlich, Fehler korrigieren.
+
+
+
+POLYGON
+
+
+Siehe auch CHANGE,
+DELETE,
+RATSNEST,
+RIPUP,
+WIRE,
+MITER
+
+
+
+
+
+Der POLYGON-Befehl dient zum Zeichnen von Polygonflächen. Polygone +in den Layern Top, Bottom und Route2..15 werden als Signale behandelt. +Polygone in den Layern t/b/vRestrict sind Sperrflächen für den Autorouter. +
+Wird der curve oder @radius Parameter angegeben, so kann ein Kreisbogen als Teil der Polygondefinition +gezeichnet werden (siehe die ausführliche Beschreibung beim WIRE-Befehl). +
+Falls Sie dem Polygon einen Namen geben wollen, der mit einer Ziffer beginnt +(zum Beispiel 0V), so müssen Sie diesen Namen in Hochkommas einschließen, +um ihn von einem width-Wert zu unterscheiden. +
+Die Parameter Isolate und Rank sind nur für Polygone in den Signallayern +Top...Bottom relevant. +
+
1. Outlines: | "Urzustand", also die Form in der sie vom Benutzer definiert worden sind (Umrisslinien) | |
2. Real mode: | "freigerechneter" Zustand, also die Form wie sie vom Programm berechnet wird. |
+Im "Urzustand" werden Polygone mit gepunkteten Wires dargestellt, um sie von +anderen Wires unterscheiden zu können. +In der Board-Datei (name.brd) ist nur der Urzustand abgespeichert. +
+Standardmäßig werden alle Polygone am Bildschirm im Urzustand +dargestellt, da das Freirechnen ein rechenintensiver und damit +zeitaufwendiger Vorgang ist. Es werden dabei nur die vom Benutzer +definierten Umrisslinien dargestellt. +
+Bei der Ausgabe mit dem CAM-Prozessor werden auf jeden Fall alle +Polygone freigerechnet. +
+Das Freirechnen der Polygone wird mit dem +RATSNEST-Befehl ausgelöst +(mit SET POLYGON_RATSNEST OFF; kann das +verhindert werden). +Ein Klick auf das Stop-Icon bricht das Freirechnen ab. +Alle bis dahin freigerechneten Polygone liegen dann im freigerechneten Zustand vor, +alle anderen (auch das gerade in der Berechnung befindliche!) liegen +im Urzustand vor. +
+Ein freigerechnetes Polygon kann durch Anklicken mit dem +RIPUP-Befehl +wieder in den Urzustand zurückversetzt werden. +
+Bei CHANGE-Operationen wird ein Polygon neu freigerechnet, wenn es vor +dem CHANGE bereits freigerechnet war. +
+SPLIT: fügt neue Polygonkanten ein. +
+DELETE: löscht eine Polygon-Ecke (falls nur noch drei Ecken vorhanden +sind, wird das ganze Polygon gelöscht). +
+CHANGE LAYER: ändert den Layer des gesamten Polygons. +
+CHANGE WIDTH: ändert den Parameter Width des gesamten Polygons. +
+MOVE: bewegt Polygonkante oder -ecke (wie bei normalen Wire-Zügen). +
+COPY: kopiert ganzes Polygon. +
+NAME: Falls das Polygon in einem Signal-Layer liegt, wird der Name +des Signals geändert. +
+Unter gewissen Umständen, insbesondere mit Orphans = Off, kann ein +Polygon vollständig verschwinden. +In diesem Fall werden auf dem Bildschirm die Linien im Urzustand +dargestellt um es dem Benutzer zu ermöglichen, das Polygon zu löschen +oder anderweitig zu verändern. +Mit dem Drucker oder dem CAM-Prozessor werden diese Linien nicht ausgegeben, +um keine Kurzschlüsse zu verursachen. +Ein Polygon wird auch dann in seinem Urzustand dargestellt, wenn das Signal +andere nicht-Polygon-Objekte enthält, von denen keines mit dem Polygon verbunden +ist. +
+Bei der Beurteilung, ob ein solches Objekt tatsächlich eine solide Verbindung +zum schraffierten Polygon hat, wird das Objekt auf einige "Kontrollpunkte" reduziert. +Für ein rundes Pad wären das zum Beispiel der nördliche, östliche, westliche +und südliche Punkt auf seinem Umfang. Für einen Wire wären es seine beiden +Endpunkte. Eine solide Verbindung besteht dann, wenn es im berechneten Polygon +mindestens eine Linie (Umriß- oder Schraffurlinie) gibt, deren Mittellinie durch +diese Punkte verläuft. +
+Thermal- und Annulus-Ringe innerhalb eines schraffierten Polygons, die
+keinen soliden Kontakt zu den Polygon-Linien haben, werden nicht erzeugt.
+
+
+
+PREFIX
+
+
+Siehe auch CONNECT,
+PACKAGE,
+VALUE
+
+Dieser Befehl wird im Device-Editier-Modus angewendet. Er legt fest, +mit welchem Zeichen oder welcher Zeichenfolge der automatisch +vergebene Name beginnen soll, wenn das Element mit dem ADD-Befehl +im Schaltplan plaziert wird. +
+PREFIX U; ++Wird dieser Befehl ausgeführt, während man das Device 7400 +editiert, dann bekommen später die mit ADD im Schaltplan plazierten +NAND-Gatter die Namen U1, U2, U3 und so weiter. Diese Namen lassen +sich mit dem NAME-Befehl ändern. + + + +
+Der PRINT-Befehl druckt die gerade editierte Zeichnung auf dem +System-Drucker aus. +
+Farben und Füllmuster werden aus dem Editor-Fenster übernommen, falls +nicht die Optionen SOLID oder BLACK angegeben werden. +Als Farbpalette wird beim Ausdruck immer diejenige für weißen Hintergrund verwendet. +
+Wenn Sie Pads und Vias "ausgefüllt" drucken wollen (ohne sichtbare Bohrlöcher), +benutzen Sie den Befehl +
+SET DISPLAY_MODE NODRILL; ++Bitte beachten Sie, dass Polygone in Platinen beim Ausdrucken mit dem +PRINT-Befehl nicht automatisch freigerechnet werden! Es werden lediglich die +Umrisse dargestellt. Um die Polygone freigerechnet auszudrucken führen Sie +bitte vorher den RATSNEST-Befehl aus. +
+Es kann ein factor angegeben werden um die Ausgabe zu skalieren. +
+Mit dem Parameter limit kann die maximale Anzahl von Blättern +angegeben werden, die für die Ausgabe verwendet werden soll. +Diese Zahl muss mit einem vorangestellten '-' angegeben werden, +um sie vom factor unterscheiden zu können. +Sollte die Zeichnung nicht auf die vorgegebene Anzahl von Blättern passen, +so wird der factor so lange verkleinert, bis sie gerade noch passt. +Setzen Sie diesen Parameter auf -0 um beliebig viele Blätter zuzulassen +(und damit sicherzustellen, dass der Ausdruck genau mit dem angegebenen Faktor +skaliert wird). +
+Wird der PRINT-Befehl nicht mit einem ';' abgeschlossen, so +erscheint ein Druck-Dialog in dem +alle Druck-Optionen eingestellt werden können. +Bitte beachten Sie, dass Optionen, die über die Kommandozeile eingegeben wurden, +nur dann dauerhaft in den Druckeinstellungen gespeichert werden, wenn sie über +den Druck-Dialog bestätigt wurden (d.h. wenn der +Befehl nicht mit einem ';' abgeschlossen wurde). +
+Folgende options stehen zur Verfügung: +
+
MIRROR | spiegelt die Ausgabe | |
ROTATE | dreht die Ausgabe um 90° | |
UPSIDEDOWN | dreht die Ausgabe um 180°. Zusammen mit ROTATE, wird die Zeichnung um insgesamt 270° gedreht | |
BLACK | ignoriert die Farbeinstellungen der Layer und zeichnet alles in Schwarz | |
SOLID | ignoriert die Füllmuster der Layer und zeichnet alles voll ausgefüllt | |
CAPTION | druckt eine Bildunterschrift | |
FILE | leitet die Ausgabe in eine Datei um; der Dateiname muss unmittelbar nach dieser Option folgen | |
PRINTER | druckt auf einen bestimmten Drucker; der Druckername muss unmittelbar nach dieser Option folgen | |
PAPER | druckt auf das angegebene Papierformat; das Papierformat muss unmittelbar nach dieser Option folgen | |
SHEETS | druckt den angegebenen Bereich von Schaltplanseiten; der Bereich (von-bis) muss unmittelbar nach dieser Option folgen | |
WINDOW | druckt den momentan sichtbaren Ausschnitt der Zeichnung | |
PORTRAIT | druckt in Hochformat | |
LANDSCAPE | druckt in Querformat |
+Wird einer der options MIRROR...CAPTION ein '-' vorangestellt, so wird diese Option ausgeschaltet, +falls sie zur Zeit eingeschaltet ist (von einem vorhergehenden PRINT). +Ein '-' allein schaltet alle options aus. +
+Hat der Dateiname die Extension ".pdf" (wobei die Groß-/Kleinschreibung keine Rolle spielt), +so wird eine PDF-Datei erzeugt. Eine PDF-Datei kann auch durch Auswahl von "In Datei drucken (PDF)" +aus der "Drucker" Combo-Box im Druck-Dialog erzeugt werden. +Texte in einer PDF-Datei können in einem PDF-Betrachter durchsucht werden, solange +sie nicht den Vektor-Font verwenden. +
+Hat der Dateiname die Extension ".ps" (wobei die Groß-/Kleinschreibung keine Rolle spielt), +so wird eine Postscript-Datei erzeugt. +
+Besteht der Dateiname nur aus einem "*" oder "*.ext" (ein Stern gefolgt von einer +Extension, wie etwa "*.pdf"), so wird ein Datei-Dialog geöffnet über den der Benutzer +den tatsächlichen Dateinamen auswählen oder eingeben kann. +
+Besteht der Dateiname nur aus einer Extension, wie etwa ".pdf", so wird der Name +der Ausgabedatei aus dem Namen der Zeichnungsdatei gebildet, indem dessen Extension durch +den angegebenen String ersetzt wird. +
+Der Dateiname kann einen oder mehrere der folgenden Platzhalter enthalten, die +durch den entsprechenden Text ersetzt werden: +
+
%E | die Extension der geladenen Datei (ohne den '.') | |
%N | der Name der geladenen Datei (ohne Pfad und Extension) | |
%P | Verzeichnis-Pfad der geladenen Datei (ohne Dateinamen) | |
%% | das Zeichen '%' |
+Zum Beispiel würde der Dateiname +
+%N.cmp.pdf +
+den Namen boardname.cmp.pdf erzeugen. +
+Wurde sowohl die FILE als auch die PRINTER Option angegeben, so wird +nur die zuletzt angegebene berücksichtigt. +
+Breite x Höhe Einheit ++(ohne Leerzeichen) angegeben werden, wie in +
+PRINT PAPER 200x300mm +PRINT PAPER 8.0x11.5inch ++Breite und Höhe können Dezimalzahlen sein, und die Einheit +ist entweder mm oder inch (letztere kann abgekürzt werden als in). +Papiernamen müssen vollständig angegeben werden, wobei die Groß-/Kleinschreibung keine Rolle spielt. +Wird sowohl die PRINTER- als auch die PAPER-Option benutzt, muss die PRINTER-Option +zuerst angegeben werden. +Benutzerdefinierte Papiergrößen funktionieren nicht unbedingt mit allen Druckern. Sie sind hauptsächlich +für die Ausgabe in Postscript- bzw. PDF-Dateien gedacht. +
öffnet den Print Dialog für die Eingabe der Druckeinstellungen | ||
PRINT; | druckt die Zeichnung ohne weiteren Dialog, mit default Einstellungen | |
PRINT - MIRROR BLACK SOLID; | druckt die Zeichnung gespiegelt, alles in Schwarz und voll ausgefüllt | |
PRINT 2.5 -1; | druckt die Zeichnung um den Faktor 2.5 vergrößert, wobei aber sichergestellt wird, dass nicht mehr als ein Blatt verwendet wird | |
PRINT FILE .pdf; | druckt die Zeichnung in eine PDF-Datei mit dem gleichen Namen wie die Zeichnungsdatei | |
PRINT SHEETS 2-15 FILE .pdf; | druckt die Seiten 2 bis 15 in eine PDF-Datei mit dem gleichen Namen wie die Zeichnungsdatei |
+Sie können das Programm von jeder Stelle aus mit Alt+X verlassen.
+
+
+
+RATSNEST
+
+
+Siehe auch SIGNAL,
+MOVE,
+POLYGON,
+RIPUP
+
+RATSNEST signal_name ..
+RATSNEST ! signal_name ..
+
+Der RATSNEST-Befehl berechnet die Luftlinien neu, damit man z. B. +nach einer Änderung der Bauelemente-Plazierung wieder die kürzesten +Verbindungen erhält. Auch nach dem Einlesen einer Netzliste (mit +dem SCRIPT-Befehl) ist es sinnvoll, den RATSNEST-Befehl aufzurufen, +da dabei im allgemeinen nicht die kürzesten Luftlinien entstehen. +
+Der RATSNEST-Befehl berechnet auch alle Polygone neu, die zu einem +Signal gehören. Dies ist notwendig, damit für bereits durch +Polygonflächen verbundene Pads keine Luftlinien mehr erzeugt werden. +Alle zugehörigen Polygonflächen sind dann in realer Darstellung zu sehen. +Auf Umriss-Darstellung kann mit +dem RIPUP-Befehl gewechselt werden. +Die automatische Berechnung der Polygone kann mit +
+SET POLYGON_RATSNEST OFF; ++ausgeschaltet werden.
+Beachten Sie bitte, dass RATSNEST die Board-Zeichnung nicht als verändert +kennzeichnet, da die berechneten Polygon-Daten (falls vorhanden) nicht +in der Datei abgespeichert werden, und die neuberechneten Luftlinien +keine wirkliche Veränderung der Zeichnung darstellen. +
+Solche Luftlinen der Länge Null können mit dem +ROUTE-Befehl wie andere Luftlinien +angeklickt werden. Top- und Bottom-Seite können an diesen Stellen auch +durch Plazieren eines +Vias verbunden werden. +
+Ratsnest: Nichts zu tun! ++aus. Andernfalls erscheint die Meldung +
+Ratsnest: Luftlinien: xx ++wobei xx die Zahl der ungerouteten Luftlinien repräsentiert. +
+
* | steht für eine beliebige Anzahl beliebiger Zeichen | |
? | steht für genau ein Zeichen | |
[...] | steht für irgend eines der Zeichen zwischen den Klammern |
+Soll eines dieser Zeichen genau so gesucht werden, wie es ist, so muss es in eckige Klammern +eingeschlossen werden. Zum Beispiel findet abc[*]ghi die Zeichenfolge abc*ghi, +aber nicht abcdefghi. +
+Ein Bereich von Zeichen kann als [a-z] angegeben werden, was für eines der Zeichen +aus dem Bereich 'a'...'z' steht. +
+Um Luftlinien auszublenden kann der RATSNEST-Befehl mit einem Ausrufezeichen +('!'), gefolgt von einer Liste von Signalnamen, aufgerufen werden: +
+RATSNEST ! GND VCC ++Hiermit würden die Luftlinien der Signale GND und VCC ausgeblendet.
+RATSNEST GND VCC ++Damit wird die Anzeige der Luftlinien der Signale GND und VCC +aktiviert und diese auch gleich neu berechnet. Auf diese Weise lassen sich auch die +Luftlinien und Polygone nur für bestimmte Signale neu berechnen. +
+Die Signalnamen können Platzhalter enthalten, und die beiden Varianten können +kombiniert werden, wie in +
+RATSNEST D* ! ?GND VCC ++womit die Luftlinien aller Signale, deren Namen mit 'D' beginnen, neu +berechnet und angezeigt werden, und die Luftlinien der verschiedenen GND-Signale +(wie AGND, DGND etc.) und des VCC-Signals ausgeblendet werden. Beachten Sie, dass +der Befehl von links nach rechts abgearbeitet wird, so dass für den Fall, dass es +ein DGND-Signal gibt, dieses im Beispiel zuerst für die Anzeige neu berechnet wird, +seine Luftlinien dann aber ausgeblendet werden. +
+Ausgeblendete Luftlinien werden mit SHOW nicht angezeigt +und können auch nicht selektiert werden. +
+Um sicherzustellen, dass alle Luftlinien eingeblendet sind, geben Sie ein +
+RATSNEST * ++Beachten Sie, das der SIGNAL-Befehl automatisch die +Luftlinien eines Signals einblendet, wenn eine neue Luftlinie für dieses Signal +erzeugt wird. Der RIPUP-Befehl hingegen ändert nichts +an der Sichtbarkeit von Luftlinien, wenn ein Wire eines Signals in eine Luftlinie +verwandelt wird. + + + +
+Mit diesem Befehl zeichnet man Rechtecke in den aktiven Layer. Die +beiden Punkte legen gegenüberliegende Ecken des Rechtecks fest. +Die mittlere Maustaste wechselt den aktiven Layer. +
+Die orientation (siehe Beschreibung bei ADD) +darf jeder Winkel im Bereich R0...R359.9 sein. Das S- +bzw. M-Flag kann hier nicht benutzt werden. +Beachten Sie bitte, dass die Koordinaten immer bezogen auf einen Winkel R0 +angegeben werden. Die Möglichkeit der Eingabe eines Winkels beim RECT-Befehl +ist hauptsächlich für die Benutzung in Scripts vorgesehen, wobei die Daten +des Rechtecks etwa durch ein User Language Programm aus dem +UL_RECTANGLE-Objekt ermittelt wurden. +Bei interaktiver Eingabe eines Winkels ungleich 0 kann es sein, dass die +Ecken des Rechtecks nicht an der aktuellen Position des Mauszeigers erscheinen. +Benutzen Sie den ROTATE-Befehl um ein Rechteck +interaktiv zu drehen. +
+Die mit UNDO rückgängig gemachten Befehle lassen sich mit +REDO erneut ausführen. Damit kann man ganze Abläufe rekonstruieren. +Die Befehle EDIT, OPEN, AUTO und REMOVE löschen die Vorgeschichte. +
+UNDO/REDO ist vollkommen in den Mechanismus der Forward&Back-Annotation
+integriert.
+
+
+
+REMOVE
+
+
+Siehe auch OPEN,
+RENAME
+
+REMOVE name.Sxx
+
+Symbole/Packages lassen sich nur löschen, wenn sie in keinem Device verwendet werden. +
+Ist ein Symbol, Device oder Package zum Editieren geladen, wirkt der +Befehl auf den entsprechenden Typ. Ansonsten werden die Namen als +Device-Namen interpretiert, falls das Schaltplan-Modul vorhanden ist, +und als Package-Namen, falls kein Schaltplan-Modul vorhanden ist. +
+REMOVE .S3 ++löscht Seite Nr. 3 aus dem gegenwärtig geladenen Schaltplan. +
+In der Syntax-Beschreibung entspricht xx der Nummer der zu +löschenden Seite. Falls xx gleich der Nummer +der gerade editierten Seite ist, wird Seite Nummer 1 geladen. Alle +Seiten mit Nummern, die größer sind als xx , erhalten +eine um 1 verminderte Nummer. Das Löschen einer Seite löscht +auch den Undo-Puffer und kann daher nicht rückgängig gemacht +werden! Da alle Seiten eines Schaltplans in einer Datei gespeichert +sind (name.sch), kann beim versehentlichen Löschen einer Seite +aber immer noch auf die alte Version zurückgegriffen werden - +falls die gerade editierte Version nach dem Löschen der Seite +nicht zurückgeschrieben wurde! +
+REMOVE löscht den Undo-Puffer.
+
+
+
+RENAME
+
+
+Siehe auch OPEN
+
+Mit RENAME kann der Name eines Symbols, Device oder Package geändert +werden. Die Bibliothek muss vorher mit OPEN geöffnet worden +sein. +
+Der Name darf mit der Namenserweiterung angegeben werden (zum Beispiel +RENAME name1.pac name2[.pac] - die Erweiterung im zweiten Parameter ist +optional). Wird der erste Parameter ohne Erweiterung angegeben, müssen Sie +sich im entsprechenden Editier-Modus (z. B. im Package-Modus um Packages +umzubenennen) befinden. +
+RENAME löscht den Undo-Puffer.
+
+
+
+REPLACE
+
+
+Siehe auch SET,
+UPDATE
+
+REPLACE device_name ..
+REPLACE part_name device_name ..
+REPLACE package_name ..
+REPLACE element_name package_name ..
+
+Der REPLACE-Befehl kann dazu benutzt werden, ein Bauteil gegen ein anderes +(auch aus einer anderen Bibliothek) auszutauschen. Altes und neues Bauteil +müssen kompatibel sein, das heisst ihre benutzten Gatter und angeschlossenen +Pins bzw. Pads müssen entweder über ihre Namen oder ihre Koordinaten +zusammenpassen. +
+Ohne Parameter öffnet der REPLACE-Befehl einen Dialog, über den ein Bauteil +aus allen momentan in Verwendung befindlichen +Bibliotheken ausgewählt werden kann. Nach dieser Auswahl führen weitere +Mausklicks auf Bauteile dazu, dass diese (soweit möglich) gegen das ausgewählte +Bauteil getauscht werden. +
+Wird ein device_name angegeben, so wird dieses Bibliothekselement für die +Austausch-Operation verwendet. +
+Wird sowohl ein part_name als auch ein device_name +angegeben, so wird das Bauteil part_name gegen das Bibliothekselement +device_name ausgetauscht (was nützlich ist, wenn mit Skripten +gearbeitet wird). +
+Falls nur ein Board (ohne Schaltplan) bearbeitet wird, oder falls Bauteile +im Board ersetzt werden sollen die kein entsprechendes Bauteil im Schaltplan +haben, so kennt REPLACE-Befehl zwei verschiedene Betriebsarten, die mit +dem SET-Befehl eingestellt werden. +
+SET REPLACE_SAME NAMES; ++aktiviert; sie ist beim Programmstart eingestellt. In dieser Betriebsart +kann man einem Element im Schaltplan ein anderes Package zuweisen, +bei dem dieselben Pad- und Smd-Namen vorhanden sind. +
+Das neue Package kann aus einer anderen Bibliothek stammen, und es darf +zusätzliche Pads und Smds enthalten. Die Lage der Anschlüsse ist +beliebig. +
+Anschlüsse des alten Package, die mit Signalen verbunden sind, müssen +entsprechend auch im neuen Package vorhanden sein. Das neue Package +darf auch weniger Anschlüsse haben, solange diese Bedingung erfüllt +ist. +
+SET REPLACE_SAME COORDS; ++aktiviert. Sie erlaubt es, einem Element in einem Schaltplan +ein anderes Package zuweisen, bei dem auf denselben Koordinaten +(relativ zum Ursprung des Package) Pads oder Smds liegen müssen. Die +Namen dürfen unterschiedlich sein. +
+Das neue Package kann aus einer anderen Bibliothek stammen, und es darf +zusätzliche Pads und Smds enthalten. Anschlüsse des alten Package, die +mit Signalen verbunden sind, müssen entsprechend auch im neuen Package +vorhanden sein. Das neue Package darf auch weniger Anschlüsse haben, +solange diese Bedingung erfüllt ist. +
+REPLACE funktioniert nur mit eingeblendetem tOrigins- bzw. +bOrigins-Layer. +
+Existiert bereits ein Package mit demselben Namen (aus derselben Bibliothek) in der Zeichnung, +und wurde die Bibliothek seit dem Plazieren des Bauteils modifiziert, wird automatisch ein +Library-Update gestartet. Dabei werden Sie gefragt, ob die +Objekte in der Zeichnung durch die neueren aus der Bibliothek ersetzt werden sollen. +
+Achtung: Eine REPLACE-Operation aktualisiert automatisch je nach Bedarf alle
+betroffenen Bibliotheksobjekte. Dies bedeutet, dass auch andere Bauteile (auf
+anderen Schaltplanseiten oder an anderen Stellen des Boards) verändert werden
+können.
+Starten Sie den Design Rule Check (DRC) und den
+Electrical Rule Check (ERC) nach jeder REPLACE-Operation!
+
+
+
+RIPUP
+
+
+Siehe auch DELETE,
+GROUP,
+POLYGON,
+RATSNEST
+
+Polygondarstellung auf "Umrisse".
+
+RIPUP [ @ ] [ ! ] ..
+RIPUP [ @ ] [ ! ] signal_name..
+
+
+Der Befehl RIPUP wird dazu verwendet, bereits verlegte Signale wieder +in Luftlinien zu verwandeln. Der Befehl kann verwendet werden für: +
+RIPUP signal_name.. ++Wirkt auf das gesamte Signal "signal_name" (mehrere Signale sind +möglich, z.B. Ripup D0 D1 D2;) +
+RIPUP .. ++Wirkt auf das durch den Mausklick selektierte Segment (bis zum nächsten +Pad/Smd). Bei +
+RIPUP; ++werden nur solche Signale berücksichtigt, die an Elementen angeschlossen +sind (z.B. die Eckwinkel zur Platinenbegrenzung bleiben erhalten). Das gleiche +gilt, wenn der RIPUP-Befehl auf eine Gruppe angewendet wird. +
+Achtung: in allen Fällen wirkt der RIPUP-Befehl nur auf Objekte in +Layern, die momentan eingeblendet sind! +
+
* | steht für eine beliebige Anzahl beliebiger Zeichen | |
? | steht für genau ein Zeichen | |
[...] | steht für irgend eines der Zeichen zwischen den Klammern |
+Soll eines dieser Zeichen genau so gesucht werden, wie es ist, so muss es in eckige Klammern +eingeschlossen werden. Zum Beispiel findet abc[*]ghi die Zeichenfolge abc*ghi, +aber nicht abcdefghi. +
+Ein Bereich von Zeichen kann als [a-z] angegeben werden, was für eines der Zeichen +aus dem Bereich 'a'...'z' steht. +
+Mit dem ROTATE-Befehl kann man die Orientierung von Objekten ändern. +
+Wird orientation (siehe Beschreibung bei ADD) +angegeben, so wird stattdessen die angegebene Orientation zu der Orientation des +selektierten Objektes hinzugefügt. +
+Wird der angegebenen orientation das Zeichen '=' vorangestellt, so +wird der Wert nicht hinzugefügt, sondern absolut eingestellt. +
+Bauteile, Pads, Smds und Pins lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. +
+Zum Beispiel würde +
+
+ROTATE =MR90 IC1 ++
+die Orientierung des Elements IC1 auf MR90 einstellen, unabhängig davon, welchen +Wert diese vorher hatte. +
+Attribute von Bauteilen können dadurch selektiert werden, dass die Kombination +aus Bauteilname und Attributname angegeben wird, wie etwa R5>VALUE. +
+Falls name mit einem Wert für die Orientierung verwechselt werden +könnte muss der Name in Hochkommas eingeschlossen werden, wie in +
+
+ROTATE R45 'R1' ++
+Mit Click&Drag können Sie ein Objekt um einen beliebigen Winkel drehen. +Klicken Sie dazu auf das Objekt und bewegen Sie die Maus (mit gedrückter Maustaste) +vom Objekt weg. Nachdem Sie die Maus eine kurze Strecke bewegt haben beginnt das +Objekt sich zu drehen. Bewegen Sie die Maus bis der gewünschte Winkel erreicht ist +und lassen Sie dann die Maustaste los. Sollten Sie es sich zwischenzeitlich anders +überlegt haben und das Objekt lieber doch nicht rotieren wollen, so können Sie (bei +immer noch gedrückter Maustaste) die Esc-Taste drücken um den Vorgang abzubrechen. +Die gleiche Operation kann auch auf eine Gruppe angewendet werden indem die rechte +Maustaste verwendet wird. Die Gruppe wird um den Punkt rotiert, an dem die +Maustaste gedrückt wurde. +
+Bauteile können nicht rotiert werden, wenn sie gelockt sind, +oder wenn eines ihrer angeschlossenen Pads aus der erlaubten Fläche hinausstehen würde +(falls sie eine eingeschränkte Version von EAGLE verwenden). +
+Elemente lassen sich nur drehen, wenn der tOrigins- bzw. der +bOrigins-Layer sichtbar ist. +
+Wenn Sie einen Text "auf dem Kopf stehend" darstellen wollen, so können
+Sie das "Spin"-Flag für diesen Text setzen.
+
+
+
+ROUTE
+
+
+Siehe auch AUTO,
+UNDO,
+WIRE,
+MITER,
+SIGNAL,
+SET,
+RATSNEST
+
+ROUTE name ..
+
+
+
+
+
+
+
+
+Der ROUTE-Befehl dient dazu, die unverdrahteten Signale (dargestellt +als Luftlinien im Unrouted-Layer) in verdrahtete (also Wires +in den Signal-Layern) umzuwandeln. +
+Ist der ROUTE-Befehl aktiviert, kann die Breite (width) des entstehenden Wires unmittelbar von der Tastatur aus eingegeben werden. +
+Nachdem man den ROUTE-Befehl aktiviert hat, setzt man +den ersten Punkt an einem Ende der Luftlinie an und bewegt den Mauszeiger +in die Richtung, in die man die Leitung legen will. EAGLE ersetzt +dann die Luftlinie durch einen Wire oder zwei Wire-Stücke +(je nach eingestelltem Knickwinkel) im gerade aktiven Signal-Layer. +
+Die linke Maustaste erneut betätigt, setzt das Leitungsstück ab. +Wird beim Absetzen die Shift-Taste gedrückt, so wird (falls möglich und die +Luftlinie nicht bereits ohnehin komplett geroutet ist) ein Via an der Absetzstelle +gesetzt (entweder mit passender Länge oder, falls sich eine solche nicht ermitteln +lässt, durchgehend von Layer 1 bis 16). +
+Mit der mittleren Maustaste wechselt man die Ebene. Durchkontaktierungen +(Vias) werden automatisch gesetzt. +Bitte beachten Sie, dass von den Signal-Layern (1 bis 16) nur diejenigen +zur Verfügung stehen, die im Layer-Setup in den Design Rules +eingetragen sind. +
+Es wird nur das minimal nötige Via (gemäß dem Layer-Setup in den Design Rules) gesetzt. +Dabei kann es vorkommen, dass ein bereits vorhandenes Via des selben Signals +entsprechend verlängert wird, oder dass vorhandene Vias zusammengefasst werden um ein +längeres Via zu bilden, falls dies nötig ist um den gewünschten Layer-Übergang zu +ermöglichen. +Wird ein Via am Anfangs- oder Endpunkt gesetzt und es befindet sich an dieser Stelle +ein SMD-Pad, so wird ein Micro-Via erzeugt falls der aktuelle Route-Layer +eine Ebene vom Layer des SMDs entfernt ist (dies trifft nur dann zu wenn in den +Design Rules Micro-Vias erlaubt sind). +
+Die rechte Maustaste ändert den Knickwinkel (siehe SET Wire_Bend). +
+Ist eine Luftlinie komplett verdrahtet, ertönt ein Piepston. +
+Wird der curve oder @radius Parameter angegeben, so kann ein Kreisbogen als Teil des Leiterbahnzugs +gezeichnet werden (siehe die ausführliche Beschreibung beim WIRE-Befehl). +
+Wird der Startpunkt mit gedrückter Ctrl-Taste angeklickt und befindet sich +dort keine Luftlinie, so wird automatisch eine neue Luftlinie erzeugt. Der Startpunkt +dieser Luftlinie ist derjenige Punkt auf dem selektierten Wire oder Via, der dem Mauszeiger +am nächsten liegt (möglicherweise auf den nächstgelegenen Rasterpunkt geschnappt). +Das ferne Ende der Luftlinie zeigt dynamisch auf ein Zielsegment, welches nicht das +ausgewählte Segment ist. Sollte das selektierte Signal bereits vollständig geroutet +sein, so zeigt das ferne Ende zum Startpunkt. +Ist der selektierte Wire ein Kreisbogen, so beginnt die Luftlinie am nächstgelegenen +Endpunkt des Wires. +
+Wird ein name angegeben, so wird die Luftlinie dieses Signals selektiert, +die dem Mauszeiger am nächsten liegt. Falls name als with, +curve oder @radius Parameter interpretiert werden könnte, so muss +er in Hochkommas eingeschlossen werden. +
+Wenn eine Luftlinie geroutet wird, die an einem bereits verlegten Wire +beginnt, so übernimmt der neu verlegte Wire die Breite des bereits +existierenden Wires, wenn beim Selektieren der Luftlinie die Shift-Taste +gedrückt wird. +
+SET SNAP_LENGTH number; ++kann der Grenzwert für die Fangfunktion eingestellt werden, wobei +number in der aktuellen Grid-Einheit anzugeben ist. +Default ist 20 Mil. +
+Knickwinkel 8 verlegt nur das kürzere Ende der selektierten Luftlinie, +während 9 beide Seiten verlegt. Sobald die automatische Wegesuche beendet +ist (was einige Zeit dauern kann, haben Sie also bitte Geduld), wird die Luftlinie +durch die konkreten Wires und Vias ersetzt. Konnte keine Verbindung gefunden werden +(etwa aufgrund von Beschränkungen durch die Design-Regeln), so wechselt der Cursor +in ein "Verbotszeichen". Mit Knickwinkel 9 kann es vorkommen, dass nur +eine Seite der Luftlinie verlegt werden kann und die andere nicht. +
+Bei jeder Mausbewegung wird das bisherige Ergebnis verworfen und eine neue +Berechnung gestartet. Sobald das Ergebnis akzeptabel ist, klicken Sie mit der +linken Maustaste um es abzulegen. +
+Der Follow-me-Router arbeitet so, dass er den Rasterpunkt an der aktuellen +Mausposition als Startpunkt nimmt und den Autorouter benutzt um eine Verbindung +von diesem Punkt zu einem Punkt auf dem Signal-Segment zu finden, an dem die +Luftlinie endet (was nicht unbedingt der genaue Endpunkt der Luftlinie sein muss). +Der Startpunkt berücksichtigt auch den momentan gewählten Layer, wundern Sie +sich also nicht, wenn der Router an dieser Stelle ein Via setzt. Durch Ändern +des aktuellen Layers kann das Routing-Ergebnis beeinflusst werden. +
+Als Routing-Raster wird das zum Zeitpunkt des Selektierens der Luftlinie +eingestellte Raster verwendet. +
+Die Routing-Parameter (wie etwa Kostenfaktoren, Vorzugsrichtungen etc.) werden +im Dialog des AUTO-Befehls definiert. +
+Folgende Besonderheiten gelten: +
+Der RUN-Befehl startet das User-Language-Programm mit dem Namen file_name.
+Das optionale Argument-Liste ist für das ULP über die
+Builtin-Variablen argc und argv verfügbar.
+
+Der SCRIPT-Befehl stellt eine Möglichkeit dar, Befehlssequenzen +auszuführen, die in einer Datei abgelegt sind. Gibt man den Befehl +über die Tastatur ein, so wird, falls keine Extension angegeben +wurde, ".scr" als Default verwendet. +
SCRIPT nofill | ruft nofill.scr auf | |
SCRIPT myscr. | ruft myscr (ohne Suffix!) auf | |
SCRIPT myscr.old | ruft myscr.old auf |
+Bitte beachten Sie die Möglichkeiten des EXPORT-Befehls im Zusammenhang mit Script-Dateien! +
+Wählt man den Befehl mit Hilfe der Maus, dann zeigt ein Popup-Menü +alle Dateien mit der Erweiterung .scr an. Man kann dann die +gewünschte Datei auswählen. +
+Der SCRIPT-Befehl bietet die Möglichkeit, das Programm +an individuelle Bedürfnisse anzupassen. Unter +anderem kann man damit: +
+Wird der SET-Befehl ohne Parameter aufgerufen, so erscheint ein Dialog +in dem alle Parameter eingestellt werden können. +
Fangfunktion | SET SNAP_LENGTH number; | |
Fangradius: Damit lässt sich der Grenzwert für die Fangfunktion des ROUTE-Befehls in der aktuellen Einheit einstellen. | ||
Default: 20 Mil | ||
Verlegt man mit dem ROUTE-Befehl Leitungen zu Pads, die nicht im Raster liegen, dann sorgt die Fangfunktion dafür, dass man innerhalb der Snap_length zu diesem Pad routen kann. | ||
SET CATCH_FACTOR value; | ||
Fangfaktor: Legt fest, bis zu welchem Abstand vom Mauszeiger Objekte beim Anklicken mit der Maus berücksichtigt werden. Der Wert wird relativ zur Höhe (bzw. Breite, falls diese kleiner ist) des gegenwärtigen Bildausschnitts angegeben. Er gilt bei einer Zoomstufe die mindestens einen Bereich von 100mm darstellt und steigt beim Hineinzoomen logarithmisch an. Der Wert 0 setzt diese Einschränkung ausser Kraft. Default: 0.05 (5%). | ||
SET SELECT_FACTOR value; | ||
Selektionsfaktor: Damit stellt man ein, bis zu welchem Abstand vom Mauszeiger benachbarte Objekte zur Auswahl vorgeschlagen werden. Der Wert wird relativ zur Höhe (bzw. Breite, falls diese kleiner ist) des gegenwärtigen Bildausschnitts angegeben. Default: 0.02 (2%). | ||
Inhalt von Menüs | SET USED_LAYERS name | number; | |
Legt die Layer fest, die in den entsprechenden EAGLE-Menüs angezeigt werden. Siehe Beispieldatei mylayers.scr. | ||
Die Layer Pads, Vias, Unrouted, Dimension, Drills und Holes sowie die Schaltplan-Layer bleiben auf jeden Fall im Menü. Auch alle benutzten Signal-Layer bleiben aktiv. SET Used_Layers All aktiviert alle Layer. | ||
SET WIDTH_MENU value..; | ||
SET DIAMETER_MENU value..; | ||
SET DRILL_MENU value..; | ||
SET SMD_MENU value..; | ||
SET SIZE_MENU value..; | ||
SET ISOLATE_MENU value..; | ||
SET SPACING_MENU value..; | ||
SET MITER_MENU value..; | ||
Für die Parameter width etc. kann der Inhalt der entsprechenden Popup-Menüs mit obigen Befehlen konfiguriert werden. Je Menü sind max. 16 Werte möglich (beim Smd-Menü max. 16 Wertepaare). Wird kein Wert angegeben (also z.B. SET WIDTH_MENU;), so werden die programminternen Standardwerte gesetzt. | ||
Beispiel: Grid Inch; Set Width_Menu 0.1 0.2 0.3; | ||
Knickwinkel für Wires | SET WIRE_BEND bend_nr; | |
bend_nr kann einer der folgenden Werte sein: | ||
0: Startpunkt - waagrecht - senkrecht - Endpunkt | ||
1: Startpunkt - waagrecht - 45° - Endpunkt | ||
2: Startpunkt - Endpunkt (direkte Verbindung) | ||
3: Startpunkt - 45° - waagrecht - Endpunkt | ||
4: Startpunkt - senkrecht - waagrecht - Endpunkt | ||
5: Startpunkt - Kreisbogen - waagrecht - Endpunkt | ||
6: Startpunkt - waagrecht - Kreisbogen - Endpunkt | ||
7: "Freihand" (Kreisbogen passend zum Wire am Startpunkt, ansonsten gerade) | ||
8: Kurzes Ende der Luftlinie im Follow-me-Router verlegen | ||
9: Beide Enden der Luftlinie im Follow-me-Router verlegen | ||
Beachten Sie bitte, dass 0, 1, 3 und 4 zusätzliche Wires zur Abschrägung enthalten können (siehe MITER). | ||
SET WIRE_BEND @ bend_nr ...; | ||
Legt fest welche Knickwinkel beim Weiterschalten mit der rechten Maustaste tatsächlich durchlaufen werden sollen. | ||
SET WIRE_BEND @; | ||
Schaltet zurück auf alle Knickwinkel. | ||
Piepston ein/aus | SET BEEP OFF | ON; |
Farbe für Grid-Linien | SET COLOR_GRID color; | |
Farbe für Layer | SET COLOR_LAYER layer color; | |
Füllmuster für Layer | SET FILL_LAYER layer fill; | |
Raster-Parameter | SET MIN_GRID_SIZE pixels; | |
Das Grid wird nur dann gezeichnet, wenn der Rasterabstand größer ist als die eingestellte Zahl von Pixeln. | ||
Min. darg. Textgröße | SET MIN_TEXT_SIZE size; | |
Texte, die weniger als size Bildpunkte hoch sind, werden auf dem Bildschirm als Rechtecke dargestellt. Einstellung 0 bedeutet: alle Texte werden lesbar dargestellt. | ||
Netz-Linien-Darstellung | SET NET_WIRE_WIDTH width; | |
Pad-Darstellung | SET DISPLAY_MODE REAL | NODRILL; | |
REAL: Pads werden dargestellt, wie sie geplottet werden. NODRILL: Pads werden ohne Bohrung dargestellt. | ||
SET PAD_NAMES OFF | ON; | ||
Pad-Namen werden ein-/ausgeblendet. | ||
Bus-Linien-Darstellung | SET BUS_WIRE_WIDTH width; | |
DRC-Parameter | SET DRC_FILL fill_name; | |
Polygon-Berechnung | SET POLYGON_RATSNEST OFF | ON; | |
Siehe POLYGON-Befehl. | ||
Vector Font | SET VECTOR_FONT OFF | ON; | |
Siehe TEXT-Befehl. | ||
Querverweis-Labels | SET XREF_LABEL_FORMAT string; | |
Siehe LABEL-Befehl. | ||
Bauteil-Querverweise | SET XREF_PART_FORMAT string; | |
Siehe TEXT-Befehl. |
Package-Check | SET CHECK_CONNECTS OFF | ON; | |
Der ADD-Befehl prüft, ob bei einem Device jedem Pad ein Pin (mit CONNECT) zugewiesen ist. Diese Prüfung lässt sich abschalten. Allerdings kann keine Platine aus einem Schaltplan erzeugt werden, falls ein Device ohne Gehäuse gefunden wird. | ||
REPLACE-Modus | SET REPLACE_SAME NAMES | COORDS; | |
UNDO-Puffer ein/aus | SET UNDO_LOG OFF | ON; | |
Wire-Optim. ein/aus | SET OPTIMIZING OFF | ON; | |
Wires, die nach MOVE, ROUTE oder SPLIT in einer Linie liegen, werden zu einem Wire zusammengefasst, falls On eingestellt ist. Siehe auch OPTIMIZE. |
+Die Farbpaletten können entweder über den Dialog unter +"Optionen/Einstellungen/Farben" verändert werden, oder mittels des Befehls +
+SET PALETTE index argb ++wobei index eine Zahl im Bereich 0..63 und argb ein hexadezimaler +Wert ist, der die Alpha-, Rot-, Grün- und Blau-Komponenten der Farbe definiert, +etwa 0xFFFFFF00 (was ein helles Gelb ergeben würde). Die Alpha-Komponente gibt an +wie "deckend" die Farbe ist. Ein Wert von 0x00 bedeutet, dass die Farbe vollkommen +transparent ist (d.h. unsichtbar), während 0xFF für eine vollkommen deckende Farbe steht. +Die Alpha-Komponente der Hintergrundfarbe ist immer 0xFF. +Beachten Sie bitte, dass der ARGB-Wert mit "0x" beginnen muss, ansonsten würde er als +dezimale Zahl interpretiert werden. Mit dem Befehl +
+SET PALETTE BLACK|WHITE|COLORED ++können Sie auf die Palette für schwarzen, weißen oder farbigen Hintergrund +umschalten. Beachten Sie bitte, dass nach diesem Befehl kein automatisches +Neuzeichnen des Zeichenfensters stattfindet; Sie sollten daher anschließend +den Befehl WINDOW; ausführen. +
+Standardmäßig werden nur die Paletten-Einträge 0..15 benutzt und diese +enthalten die unten aufgeführten Farben. +
+Die Paletten-Einträge sind unterteilt in "normale" und "hervorgehobene" +Farben. Es gibt immer 8 "normale" Farben, gefolgt von den 8 zugehörigen +"hervorgehobenen" Farben. Die Farben 0..7 sind somit "normale" Farben, +8..15 sind ihre "hervorgehobenen" Werte, 16..23 sind weitere 8 "normale" +Farben mit 24..31 als deren "hervorgehobene" Werte und so weiter. Die +"hervorgehobenen" Farben werden benutzt um Objekte hervorzuheben, wie zum +Beispiel im SHOW-Befehl. +
+Color, geordnet nach Farbnummern, die anstelle von +color verwendet werden können. Damit legt man die Farbe fest: +
+
0 | Black | |
1 | Blue | |
2 | Green | |
3 | Cyan | |
4 | Red | |
5 | Magenta | |
6 | Brown | |
7 | LGray | |
8 | DGray | |
9 | LBlue | |
10 | LGreen | |
11 | LCyan | |
12 | LRed | |
13 | LMagenta | |
14 | Yellow | |
15 | White |
+Fill legt die Art fest, wie Wires und Rectangles in einem +bestimmten Layer gefüllt werden sollen. Auch dieser Parameter kann +durch die am Anfang der Zeile stehende Zahl ersetzt werden: +
+
0 | Empty | |
1 | Solid | |
2 | Line | |
3 | LtSlash | |
4 | Slash | |
5 | BkSlash | |
6 | LtBkSlash | |
7 | Hatch | |
8 | XHatch | |
9 | Interleave | |
10 | WideDot | |
11 | CloseDot | |
12 | Stipple1 | |
13 | Stipple2 | |
14 | Stipple3 | |
15 | Stipple4 |
+Beispiel +
+SET Option.DrawUnprocessedPolygonEdgesContinuous 1; ++Folgende eaglerc-Parameter stehen zur Verfügung: +
+
123 | stellt Layer 123 dar | |
123t | stellt Layer 123 dar, wenn die Ausgabe "von oben gesehen" erfolgt (nicht gespiegelt) | |
123b | stellt Layer 123 dar, wenn die Ausgabe "von unten gesehen" erfolgt (gespiegelt) | |
123-140 | stellt die Layer 123 bis 140 in der angegeben Reihenfolge dar | |
140-123 | stellt die Layer 140 bis 123 in der angegeben Reihenfolge dar | |
* | fügt die Standard-Sequenz der internen Layer ein | |
123b * 123t | sorgt dafür, dass Layer 123 immer als erster dargestellt wird |
+Der SHOW-Befehl dient zum Hervorheben von Objekten. +Einzelheiten werden in der Statuszeile aufgelistet. +Mit SHOW kann man auch ganze Signale und Netze +hervorheben (auf dem Bildschirm heller dargestellt). +Wird ein Bus ausgewählt, so werden auch alle zu diesem Bus gehörenden +Netze hervorgehoben. +
+Werden mehrere Namen in einer Zeile eingegeben, so werden alle entsprechenden +Objekte gleichzeitig hell dargestellt. +
+
* | steht für eine beliebige Anzahl beliebiger Zeichen | |
? | steht für genau ein Zeichen | |
[...] | steht für irgend eines der Zeichen zwischen den Klammern |
+Soll eines dieser Zeichen genau so gesucht werden, wie es ist, so muss es in eckige Klammern +eingeschlossen werden. Zum Beispiel findet abc[*]ghi die Zeichenfolge abc*ghi, +aber nicht abcdefghi. +
+Ein Bereich von Zeichen kann als [a-z] angegeben werden, was für eines der Zeichen +aus dem Bereich 'a'...'z' steht. +
+Die spezielle Zeichenfolge [Zahl..Zahl] stellt einen Busnamen mit Index +dar und wird deshalb im Schaltplan nicht als Platzhalter behandelt. +
+SHOW IC1 ++IC1 wird hell und bleibt hell, bis der SHOW-Befehl beendet oder +ein anderer Name eingegeben wird. +
+SHOW IC* ++Zeigt alle Objekte an deren Namen mit "IC" beginnt. + + + +
+Mit dem SIGNAL-Befehl definiert man Signale, also die Verbindungen +zwischen den Anschlüssen der Packages. Es sind mindestens zwei +Stützstellen anzugeben, da sonst keine Luftlinie entstehen kann. +
+Gibt man signal_name mit ein, dann erhält das Signal den +angegebenen Namen. +
+SIG GND IC1 7 IC2 7 IC3 7; ++würde z.B. die Pads mit dem Namen '7' der ICs 1...3 miteinander +verbinden. Denken Sie an diese Möglichkeit im Zusammenhang mit +Script-Dateien. Sie können beispielsweise komplette Netzlisten +mit Hilfe von Script-Dateien eingeben. +
+Den SMASH-Befehl wendet man auf Bauteile an, damit man anschließend +die zugehörigen Texte, die den aktuellen Namen, Wert bzw. Attribute +repräsentieren, separat bewegen kann (MOVE). Das ist vor allem +für Schalt- und Bestückungspläne nützlich. +
+Bauteile lassen sich +auch mit ihrem Namen selektieren. Das ist vor allem dann nützlich, +wenn sich das Objekt ausserhalb des gerade dargestellten Bildausschnitts +befindet. Beim Selektieren eines aus mehreren Gattern bestehenden Bauteils +im Schaltplan muss der volle, aus dem Bauteil- und dem jeweiligen Gatternamen +bestehende Name angegeben werden. +
+Nach dem SMASH-Befehl kann man die >NAME- und >VALUE-Texte +behandeln wie alle anderen Texte. Allerdings lässt sich ihr +Inhalt nicht mit CHANGE TEXT ändern. +
+Ein "gesmashtes" Element kann in den "nicht gesmashten" Zustand zurückgeführt
+werden, indem es bei gedrückter Shift-Taste (und natürlich aktiviertem
+SMASH-Befehl) angeklickt wird.
+
+
+
+SMD
+
+
+Siehe auch PAD,
+CHANGE,
+NAME,
+ROUTE,
+Design Rules
+
+
+
+Smd: Anschlussfläche für SMD-Bauelemente. +
+Der SMD-Befehl plaziert einen SMD-Anschluss in einem Package. Die +Eingabe der Länge und Breite vor dem Plazieren ändert die +Größe des Smds. Die Parameter werden in der aktuellen Maßeinheit +angegeben. Sie dürfen maximal 0.51602 Zoll (ca. 13.1 mm) betragen. +
+Die orientation (siehe Beschreibung bei ADD) +darf jeder Winkel im Bereich R0...R359.9 sein. Das S- +bzw. M-Flag kann hier nicht benutzt werden. +
+Die eingegebene Smd-Größe bleibt für nachfolgende Operationen +erhalten. +
+SMD 50 50 -100 '1' ++erzeugt zum Beispiel ein rundes SMD mit dem Namen '1' an der Position des +Mausklicks. Dieses kann man für ein BGA-Gehäuse (Ball Grid Array) verwenden. +
+
NOSTOP | keine Lötstopmaske generieren | |
NOTHERMALS | keine Thermals generieren | |
NOCREAM | keine Lotpastenmaske generieren |
+Standardmäßig generieren Smds automatisch Lötstopmaske, Lotpastenmaske und Thermals.
+In speziellen Fällen kann es jedoch erwünscht sein, dass einzelne Smds dies nicht tun.
+Die obigen NO...-Flags können benutzt werden um diese Eigenschaften zu
+unterdrücken.
+Ein neu gestarteter SMD-Befehl setzt alle Flags auf ihre Standardwerte zurück.
+Sobald ein Flag in der Kommandozeile angegeben wird, gilt es für alle nachfolgend
+in diesem SMD-Befehl plazierten Smds.
+
+Den SPLIT-Befehl benötigt man, wenn nachträglich in Wires oder +Polygonen noch eine Abknickung erforderlich ist. SPLIT teilt Wires am +Anklickpunkt. Das kürzere Stück verläuft gemäß dem eingestellten +Knickwinkel (Wire_Bend), das längere verläuft in gerader Linie zum +nächsten Aufhängepunkt. +
+Wird der curve oder @radius Parameter angegeben, so kann ein Kreisbogen als Teil des Linienzuges +gezeichnet werden (siehe die ausführliche Beschreibung beim WIRE-Befehl). +
+Nach dem SPLIT-Befehl werden die betroffenen +Wire-Segmente wieder optimiert (entsprechend dem OPTIMIZE-Befehl), +sofern nicht zuvor der Befehl +
+SET OPTIMIZING OFF; ++eingegeben wurde. Hat man diesen Befehl eingegeben, bleiben die +Trennstellen in den Wires erhalten. Sie bleiben auch dann erhalten, +wenn man im SPLIT-Befehl dieselbe Stelle zweimal mit der Maus anklickt. +
+CHANGE WIDTH breite ++ein und klickt mit der Maus das gewünschte Segment an. + + + +
+Dieser Befehl wird im Device-Editor verwendet, um die verschiedenen Technologien +eines Bauteils im Device-Namen zu bestimmen. +Im Schaltplan- oder Board-Editor verhält sich der TECHNOLOGY-Befehl genau so +wie "CHANGE TECHNOLOGY". +
+Einer der Namen, die mit +dem TECHNOLOGY-Befehl definiert wurden, ersetzt den Platzhalter '*' im +Device-Set-Namen, sobald man das Device in einem Schaltplan plaziert. +Der Begriff Technology stammt von der hauptsächlichen Verwendung dieser Funktion +verschiedene Varianten eines Devices zu erzeugen, die alle dasselbe Schaltplan-Symbol, +dieselbe(n) Package-Variante(n) und dieselben Pin/Pad-Zuordnungen haben. Die +Devices unterscheiden sich nur im Namen, der sich beispielsweise für die +TTL-Bausteine im Bezug auf Ihre Technologie, wie "L", "LS", oder "HCT" unterscheiden. +
+Der TECHNOLOGY-Befehl kann nur angewendet werden, wenn schon vorher eine Package-Variante +über den PACKAGE-Befehl definiert wurde. +
+Ist kein '*'-Platzhalter im Device-Set-Namen angegeben, wird der Device-Set-Name +um die Technologie-Angabe zu einem vollständigen Device-Namen ergänzt. +Bitte beachten Sie, dass die Technologie vor der Package-Variante eingefügt wird. +Ist weder '*' noch '?' angegeben, setzt sich der Device-Name aus +Device-Set-Name+Technology+Package-Variante zusammen. +
+Die Namen (name), die mit dem TECHNOLOGY-Befehl angegeben sind, werden zu einer schon +vorhandenen Liste des aktuellen Devices hinzugefügt. +Geben Sie einen Namen mit '-' an, wird diese Bezeichnung aus der Liste entfernt. +Soll der Name mit einem '-' beginnen, muss dieser in einfachen Hochkommas +angegeben werden. +-* löscht alle Technologien. +
+Es sind nur die ASCII-Zeichen 33..126 als Technologie-Bezeichnung erlaubt (Kleinbuchstaben +werden in Großbuchstaben gewandelt). Die maximale Anzahl von Technologie-Varianten pro Device ist 254. +
+Die besondere "leere" Technologie kann in mit zwei Hochkommas angegeben werden, +also '' (ohne Namen). +
+Beachten Sie bitte, dass der "Technologien"-Dialog alle Technologien aller Devices +in der geladenen Bibliothek enthält, wobei diejenigen, die vom aktuellen Device +verwendet werden, markiert sind. +
+TECHNOLOGY -* '' L LS S HCT; ++zunächst alle bisherigen Technologien und erzeugt anschließend die folgenden +Technologie-Varianten: +
+7400 +74L00 +74LS00 +74S00 +74HCT00 ++ + + +
+Der TEXT-Befehl plaziert einen Text in einer Zeichnung, oder in einem +Bibliothekselement. Bei der Eingabe mehrerer Texte geht man sinnvollerweise +so vor, dass man zuerst den TEXT-Befehl aktiviert, dann tippt man +den ersten Begriff ein und setzt ihn mit der linken Maustaste ab, +dann den zweiten usw. +
+Als Option kann die Schreibrichtung (orientation) +auch textuell angegeben werden. Das ist vor allem für Script-Dateien +sinnvoll. Die entsprechenden Schlüsselwörter sind im ADD-Befehl +aufgeführt (R0, R90 usw.). +
+Text wird immer so dargestellt, dass er von vorne oder von rechts +zu lesen ist - auch wenn er rotiert wird. Nach zweimaligem Rotieren +erscheint er deshalb wieder gleich, aber der Aufhängepunkt liegt +nicht mehr links unten, sondern rechts oben. Denken Sie daran, wenn +sich ein Text scheinbar nicht mehr selektieren lässt. +
+Wenn Sie einen Text "auf dem Kopf stehend" darstellen wollen, so können +Sie das "Spin"-Flag für diesen Text setzen. +
+CHANGE SIZE text_size .. +CHANGE RATIO ratio .. ++Maximale Texthöhe: ca. 2 Zoll.
Vector | der programm-interne Vektor-Font | |
Proportional | ein Proportional-Pixel-Font (üblicherweise 'Helvetica') | |
Fixed | ein Monospaced-Pixel-Font (üblicherweise 'Courier') |
+Die Schriftart wird mit CHANGE verändert: +
+CHANGE FONT VECTOR|PROPORTIONAL|FIXED .. ++Das Programm versucht die Nicht-Vector-Schriftarten so gut wie möglich auszugeben. +Da diese jedoch vom Grafik-Interface Ihres Systems gezeichnet werden, können bei +Proportional- und Fixed-Schriftart Abweichungen in der Größe +bzw. Länge entstehen. +
+Setzen Sie die Option "Immer Vektor-Schrift" im User-Interface-Dialog,
+werden alle Texte mit dem programm-internen Vektor-Font dargestellt und ausgegeben.
+Diese Einstellung ist dann sinnvoll, wenn vom System die anderen Schriftarten nicht
+korrekt angezeigt werden.
+Beim Anlegen eines neuen Boards oder Schaltplans wird die aktuelle Einstellung
+in der Zeichnungsdatei gespeichert. So wird sicher gestellt (auch bei der Weitergabe
+an Dritte, die evtl. mit anderen Einstellungen arbeiten), dass die Datei mit
+Ihren Einstellungen ausgegeben wird.
+Verwenden Sie SET VECTOR_FONT OFF|ON, um die
+Einstellungen für ein bestehendes Layout oder einen Schaltplan zu ändern.
+
+Wenn Sie Daten mit dem CAM-Prozessor erzeugen, werden Texte immer mit +Vector-Font ausgegeben. Andere Fonts werden nicht unterstützt. +
+Soll ein Text in einem Nicht-Vector-Font von einem Signal-Polygon subtrahiert +werden, wird nur das umschließende Rechteck ausgespart. Aufgrund der oben angeführten +Probleme bzgl. Einhalten von Größe und Länge der Texte, kann es sein, dass der Text +über das umschließende Rechteck hinausgeht. Sollten Sie also Texte von Polygonen +subtrahieren wollen, ist es höchst empfehlenswert nur den Vector-Font zu +verwenden. +
+Der Parameter Ratio hat für Nicht-Vector-Fonts keine Bedeutung. +
+
>NAME | Bauteilname (ggf.+Gate-Name) 1) | |
>VALUE | Bauteilwert/-typ 1) | |
>PART | Bauteilname 2) | |
>GATE | Gate-Name 2) | |
>XREF | Bauteil-Querverweis 2) | |
>CONTACT_XREF | Kontaktspiegel 2) | |
>DRAWING_NAME | Zeichnungsname | |
>LAST_DATE_TIME | Datum/Zeit der letzten Änderung | |
>PLOT_DATE_TIME | Datum/Zeit der Plot-Erstellung | |
>SHEETNR | Seitennummer eines Schaltplans 3) | |
>SHEETS | Gesamtzahl der Seiten eines Schaltplans 3) | |
>SHEET | entspricht ">SHEETNR/>SHEETS" 3) |
+1) Nur im Package und Symbol
+2) Nur im Symbol
+3) Nur im Symbol oder Schaltplan
+
+Das Format, in welchem ein Bauteil-Querverweis angezeigt wird, kann über die +"Format für Bauteil-Querverweise" Zeichenfolge im Dialog "Optionen/Einstellungen/Verschiedenes" +oder über den SET Befehl festgelegt werden. +Folgende Platzhalter sind definiert und können in beliebiger Reihenfolge verwendet werden: +
+
%S | die Seitennummer | |
%C | die Spalte auf der Seite | |
%R | die Zeile auf der Seite |
+Das Standard-Format ist "/%S.%C%R". Neben den definierten Platzhaltern +können Sie auch beliebige andere ASCII-Zeichen verwenden. +
+
>ABC | 123 | |
>ABC= | ABC = 123 | |
>ABC~ | ABC | |
>ABC! | nothing |
+ !RESET ++was als +
+ _____ + RESET ++dargestellt würde. Diese Möglichkeit ist nicht auf Signalnamen beschränkt, +sondern kann in allen Texten benutzt werden. Man kann auch nur einen Teil +eines Textes überstreichen, wie in +
+ !RST!/NMI + R/!W ++was als +
+ ___ + RST/NMI + _ + R/W ++dargestellt würde. Beachten Sie das zweite Ausrufezeichen, welches das +Ende des Überstrichs markiert. Ein Text kann beliebig viele Überstriche +enthalten. Soll ein Text ein Ausrufezeichen enthalten, welches keinen +Überstrich erzeugt, so muss diesem ein Backslash vorangestellt werden. +Um die Notwendigkeit von Backslashes auf ein Minimum zu reduzieren startet +ein Ausrufezeichen einen Überstrich dann nicht, wenn es das letzte Zeichen +eines Textes ist, oder wenn es unmittelbar von einem Leerzeichen, einem +weiteren Ausrufezeichen, einem Apostroph, einem Anführungszeichen oder +einer schließenden runden, eckigen oder geschweiften Klammer gefolgt wird. +Ein Ausrufezeichen bzw. Komma ohne vorangestellten Backslash, das nach +einem Ausrufezeichen steht, welches einen Überstrich begonnen hat, beendet +den Überstrich (dass das Komma einen Überstrich beendet ist notwendig für +Busse). + + + +
+Mit dem Befehl UNDO kann man Befehle rückgängig machen. Das +ist insbesondere dann nützlich, wenn man z. B. versehentlich etwas +gelöscht hat. Die mehrmalige Eingabe von UNDO macht entsprechend +viele Befehle rückgängig. Das geht bis zum Zustand nach dem +letzen EDIT-, OPEN-, AUTO oder REMOVE-Befehl. Diese Befehle +löschen die Vorgeschichte. +
+Die UNDO-Funktion benötigt Platz auf der Platte und kann die Eingabe +von Script-Dateien erheblich verlangsamen. +Sie lässt sich bei Bedarf mit dem Befehl +
+SET UNDO_LOG OFF; ++abschalten. +
+UNDO/REDO ist vollkommen in den Mechanismus der Forward&Back-Annotation
+integriert.
+
+
+
+UPDATE
+
+
+Siehe auch ADD,
+REPLACE
+
+UPDATE;
+UPDATE library_name..;
+UPDATE package_name@library_name..;
+UPDATE +@ | -@ [library_name..];
+UPDATE old_library_name = new_library_name;
+
+Der UPDATE-Befehl vergleicht Bauteile in einem Layout oder Schaltplan +mit den zugehörigen Bibliothekselementen und aktualisiert diese, sofern +Unterschiede festgestellt werden. Wird UPDATE im Bibliotheks-Editor ausgeführt, +so werden die in der geladenen Bibliothek befindlichen Packages aus den angegebenen +Bibliotheken aktualisiert. +
+Wird der UPDATE-Befehl ohne Parameter aufgerufen, öffnet sich ein Datei-Dialog, +aus dem man die Bibliothek wählt, deren Bauteile mit den Definitionen in +der Zeichnung verglichen werden soll. +
+Werden eine oder mehrere Bibliotheken angegeben, überpüft das Programm alle +Bauteile aus diesen Bibliotheken. Der Bibliotheksname kann entweder als einfacher +Name (wie "ttl" oder "ttl.lbr") oder mit voller Pfadangabe +(wie "/home/mydir/myproject/ttl.lbr" oder "../lbr/ttl") angegeben werden. +
+Falls der erste Parameter '+@' ist, werden die Namen der angegebenen Bibliotheken +(oder aller Bibliotheken, falls keine angegeben wurden) um das '@'-Zeichen gefolgt +von einer Zahl erweitert. Dies kann dazu benutzt werden um sicherzustellen, dass die in einer +Zeichnung enthaltenen Bibliotheken nicht verändert werden wenn ein Bauteil aus einer neueren +Bibliothek gleichen Namens in die Zeichnung eingefügt wird. Bibliotheksnamen die bereits +mit dem '@'-Zeichen gefolgt von einer Zahl enden werden nicht verändert. +
+Falls der erste Parameter '-@' ist, wird das '@'-Zeichen (gefolgt von einer Zahl) +vom Ende der angegebenen Bibliotheksnamen (oder aller Bibliotheksnamen, falls keine angegeben +wurden) entfernt. Dies funktioniert natürlich nur dann, wenn sich noch keine Bibliothek mit diesem +neuen Namen in der Zeichnung befindet. +
+Bitte beachten Sie, dass "UPDATE +@;" gefolgt von "UPDATE -@;" (und umgekehrt) nicht unbedingt +die ursprüngliche Folge von Bibliotheksnamen ergeben muss, da die Reihenfolge, in der die Namen +bearbeitet werden, von der Reihenfolge der Bibliotheken in der Zeichnungsdatei abhängt. +
+Die Bibliotheksdefinitionen, die in einem Schaltplan oder Board gespeichert sind, +werden nur anhand des Bibliotheksnamens (z. B. "ttl") identifiziert. Bei der +Entscheidung ob das Bauteil überprüft werden soll oder nicht, wird nur dieser +Name berücksichtigt. +Die Bibliotheken werden in den unter "Libraries" im +Directories-Dialog angegebenen Verzeichnissen, +von links nach rechts, gesucht. +Die erste Bibliothek mit dem angegebenen Namen, die in den Verzeichnissen gefunden wird, +wird verwendet. Bitte beachten Sie, dass bei den Bibliotheksnamen nicht zwischen +Groß- und Kleinschreibung unterschieden wird. Es ist nicht relevant ob die +gesuchte Bibliothek zur Zeit "in use" ist oder nicht. Kann eine Bibliothek nicht +gefunden werden, findet auch kein Update statt. In diesem Fall wird keine +Fehlermeldung ausgegeben. +
+Wird der UPDATE-Befehl in einem Schaltplan oder Board gestartet, und sind diese +über die Forward&Back Annotation verbunden, +aktualisiert EAGLE die Bauteile in beiden Dateien. +
+In manchen Fällen wird es notwendig sein anzugeben, ob Gates, Pins oder Pads +aufgrund ihres Namens oder ihrer Koordinaten zugeordnet werden sollen. Das ist dann +der Fall, wenn die zugehörigen Bibliotheksobjekte verschoben oder umbenannt +wurden. Wenn zuviele Änderungen gemacht wurden (z. B. wurde ein Pin verschoben +und umbenannt), ist ein automatisches Aktualisieren nicht möglich. In diesem +Fall sollte man die Bibliotheksänderung entweder in mehreren Schritten machen +(erst Umbenennen, dann Verschieben) oder das ganze Element umbenennen, so dass es +nicht getauscht wird. +
+In der Notation old_library_name = new_library_name (beachten Sie, dass +vor und nach dem '=' Zeichen jeweils mindestens ein Leerzeichen stehen muss) +sucht der UPDATE-Befehl die Bibliothek old_library_name im aktuellen Board +oder Schaltplan und aktualisiert diese mit dem Inhalt von new_library_name. +Hierbei ist zu beachten, dass old_library_name ein reiner Bibliotheksname +sein muss, ohne Pfad, während new_library_name ein +vollständiger Pfadname sein kann. Wurde der Update erfolgreich ausgeführt, so +wird auch die Bibliothek im aktuellen Board oder Schaltplan entsprechend umbenannt - aus diesem Grund ist diese +ganze Operation natürlich nur dann möglich, wenn new_library_name bisher +im aktuellen Board oder Schaltplan noch nicht verwendet wurde. +
+Achtung: Nach jedem Library Update in einem Layout oder Schaltplan sollten Sie unbedingt einen +Design Rule Check (DRC) und einen +Electrical Rule Check (ERC) durchführen! +
+Durch die Angabe des Package-Namens (package_name@library_name) kann dafür gesorgt
+werden, dass nur ein ganz bestimmtes Package ersetzt wird.
+
+
+
+USE
+
+
+Siehe auch ADD,
+REPLACE
+
+USE -*;
+USE library_name..;
+
+Der USE-Befehl markiert eine Bibliothek so, dass sie für die Befehle +ADD oder REPLACE +verfügbar ist. +
+Rufen Sie den USE-Befehl ohne Parameter auf, öffnet sich ein Datei-Dialog +aus dem man eine Bibliotheksdatei auswählen kann. +Falls für Bibliotheken im +"Optionen/Verzeichnisse"-Dialog +ein Pfad definiert wurde, erscheinen im Datei-Dialog +die Bibliotheken aus diesem Verzeichnis. +
+Der spezielle Parameter -* bewirkt, dass alle bisher markierten +Bibliotheken aufgegeben werden. +
+library_name kann der volle Name einer Bibliothek oder ein +teilqualifizierter Name sein. +Falls library_name der Name eines Verzeichnisses ist, werden alle +Bibliotheken aus diesem Verzeichnis markiert. +
+Der Suffix .lbr braucht nicht angegeben zu werden. +
+EAGLE übernimmt die komplette Bibliotheksinformation in die Zeichnung, +deshalb ist die Bibliothek zum Bearbeiten fertiger Platinen nicht +mehr erforderlich. +
+Änderungen an einer Bibliothek wirken sich nicht auf Elemente +in den schon bestehenden Zeichnungen aus. +Siehe UPDATE-Befehl, um Bauteile durch +aktualisierte Bibliothekselemente zu ersetzen. +
USE | öffnet den Datei-Dialog zur Auswahl einer Bibliothek | |
USE -*; | gibt alle vorher mit USE markierten Bibliotheken auf | |
USE demo trans*; | markiert die Bibliothek demo.lbr und alle Bibliotheken mit Namen trans*.lbr | |
USE -* /eagle/lbr; | gibt zunächst alle bereits makierten Bibliotheken auf und markiert dann alle Bibliotheken aus dem Verzeichnis /eagle/lbr |
+Gibt man wert an, bevor man das Element mit der Maus selektiert, +dann erhalten alle nachfolgend selektierten Elemente diesen Wert. +Das ist sehr praktisch, wenn man z. B. eine ganze Reihe von ICs auf +denselben Wert setzen will. +
+Werden name und wert angegeben, so erhält das Element +name den angegebenen Wert. +
+VALUE R1 10k R2 100k ++Hier wurde mehreren Elementen in einem Befehl je ein Wert zugewiesen. +Diese Möglichkeit lässt sich auch in Script-Dateien nach +folgendem Muster ausnutzen: +
+VALUE R1 10k \ + R2 100k \ + R3 5.6k \ + C1 10uF \ + C2 22nF \ + ... ++Der Backslash ('\') verhindert, dass in der nächsten Zeile ein Parameter +mit einem Schlüsselwort verwechselt wird. +
+On: Anstelle des Platzhalters VALUE (im Symbol definiert) kann im +Schaltplan der aktuelle Wert eingegeben werden. +
+Off: Anstelle des Platzhalters VALUE erscheint im Schaltplan der Device-Name
+(z.B. 74LS00N). Er lässt sich im Schaltplan nur nach Rückfrage mit dem
+VALUE-Befehl verändern.
+
+
+
+VIA
+
+
+Siehe auch SMD,
+CHANGE,
+DISPLAY,
+SET,
+PAD,
+Design Rules
+
+Der VIA-Befehl plaziert ein Via in einer Platine. Dabei fügt er +das Via zu einem Signal hinzu (falls es auf einer Leitung plaziert +wird). Werden durch das Via zwei oder mehrere Signale verbunden, +so erfolgt eine Nachfrage, ob dies wirklich beabsichtgt ist. +
+Die eingegebene Größe bleibt für nachfolgende Operationen +erhalten. +
+Der Bohrdurchmesser entspricht dem Durchmesser, der für Pads eingestellt +ist. Er lässt sich mit +
+CHANGE DRILL durchmesser ++einstellen und verändern. +
+Vias erzeugen Bohrsymbole im Layer Drills und die Lötstopmaske in den +Layern tStop/bStop. +
+ Square quadratisch
+ Round rund
+ Octagon achteckig
+
+Diese Formen gelten nur für die Aussenlagen (Top bzw. Bottom). +In den Innenlagen ist die Form immer "rund". +
+Die Via-Form kann entweder (wie der Durchmesser) eingegeben werden, +während der VIA-Befehl aktiv ist, oder sie kann mit dem Befehl +
+CHANGE SHAPE shape ++verändert werden. +
+Die eingegebene Form bleibt für nachfolgende Operationen erhalten. +
+Beachten Sie bitte, dass die tatsächlichen Werte für Via-Form und -Durchmesser durch die +Design Rules des Boards bestimmt werden, in dem das Via +verwendet wird. +
+
STOP | Lötstopmaske immer generieren |
+Standardmäßig generiert ein Via mit einem Bohrdurchmesser kleiner oder gleich dem
+Wert des Design Rules Parameters "Masks/Limit" keine
+Lötstopmaske. Das obige STOP-Flag kann dazu benutzt werden, eine Lötstopmaske
+für ein Via zu forcieren.
+
+
+
+
+Wenn Sie sehr stark in eine Zeichnung hineinzoomen können folgende Dinge passieren:
+
+Die Syntax zur Bearbeitung dieser Aliase ist:
+
+WINDOW = MyWindow (0 0) (4 3);
+
+Definiert den Alias "MyWindow" der, wenn er wie in
+
+WINDOW myw
+
+benutzt wird, den angegebenen Bildausschnitt einstellt.
+Beachten Sie bitte die abgekürzte Verwendung des Aliases,
+und dass die Groß-/Kleinschreibung keine Rolle spielt.
+
+
+
+
+Der WIRE-Befehl plaziert Wires (Linien) in einer Zeichnung, und zwar
+zwischen erstem und zweitem Koordinatenpunkt. Jeder weitere Punkt
+(Mausklick) wird mit dem vorhergehenden verbunden. Dabei werden jeweils
+zwei Koordinatenpunkte mit einer geraden Linie verbunden oder mit
+zwei, die in einem bestimmten Winkel abknicken. Dieser Knickwinkel
+lässt sich mit der rechten Maustaste weiterschalten (wird dabei die Shift-Taste
+gedrückt gehalten kehrt sich die Richtung des Weiterschaltens um, bei gedrückter
+Ctrl-Taste wird zwischen korrespondierenden Knickwinkeln hin und her geschaltet).
+
+Zwei Mausklicks an derselben Stelle setzen das Leitungsstück ab.
+
+Die speziellen Schlüsselworte ROUND und FLAT, sowie der curve
+Parameter, können dazu benutzt werden, Kreisbögen zu zeichnen (siehe unten).
+
+Wird das Zeichnen eines Wires mit gedrückter Ctrl-Taste gestartet, so
+schnappt der Startpunkt des neuen Wires an die Koordinaten des
+nächstgelegenen existierenden Wires. Dies ist besonders nützlich, wenn
+der existierende Wire außerhalb des aktuellen Rasters liegt. Hierbei
+werden auch die Breite, der Layer und der Linientyp vom existierenden
+Wire übernommen. Falls der aktuelle Kickwinkel 7 ("Freihand") ist, so
+setzt der neue Wire den existierenden bündig fort.
+
+Die Breite lässt sich auch zu jeder Zeit mit dem Befehl
+
+Bitte verwenden Sie den WIRE-Befehl nicht für Netze und
+Busse sowie für Luftlinien. Siehe
+NET,
+BUS und
+SIGNAL.
+WINDOW
+
+
+Der WINDOW-Befehl legt den sichtbaren Ausschnitt der Zeichnung fest.
+Ohne weitere Parameter frischt der Befehl das Bild auf.
+
+WINDOW ;
+WINDOW ;
+WINDOW
+WINDOW scale_factor
+WINDOW FIT
+WINDOW LAST
+
+F2: WINDOW; Bild auffrischen
+F3: WINDOW 2 Hineinzoomen um Faktor 2
+F4: WINDOW 0.5 Herauszoomen um Faktor 2
+F5: WINDOW (@); Neues Zentrum an aktueller Position des Mauszeigers (falls Befehl aktiviert)
+Neues Zentrum
+Der WINDOW-Befehl mit einem Mausklick legt diesen Punkt in die
+Fenstermitte und lässt den Maßstab unverändert.
+Den Bildausschnitt können Sie auch mit den Slidern am Rand des
+Arbeitsbereichs verschieben. Mit F5 legen Sie die Position
+des Mauszeigers als neues Zentrum fest.
+Eckpunkte festlegen
+Der WINDOW-Befehl mit zwei Mausklicks legt einen Ausschnitt
+fest, bei dem beide Punkte gerade noch innerhalb des Fensters liegen
+- eine sehr bequeme Möglichkeit für Ausschnittvergrößerungen.
+Das Seitenverhältnis der Zeichnung wird nicht geändert.
+Neues Zentrum und zoomen
+Der WINDOW-Befehl mit drei Mausklicks legt einen Auschnitt fest, bei
+dem der erste Punkt im Zentrum liegt. Das Verhältnis des Abstandes von
+Punkt 1 zu Punkt 2 und von Punkt 1 zu Punkt 3 legt den
+Vergrößerungsfaktor fest. Dabei gilt: Liegt der dritte Punkt weiter
+entfernt vom ersten als der zweite, dann erscheinen die Objekte
+größer.
+Zoomen
+
+WINDOW 2
+
+vergrößert die Darstellung der Objekte um Faktor zwei.
+
+WINDOW 0.5
+
+verkleinert die Darstellung der Objekte um Faktor zwei.
+Zeichnung formatfüllend
+
+WINDOW FIT
+
+stellt die gesamte Zeichnung im Fenster dar.
+Zurück zum vorhergehenden Ausschnitt
+
+WINDOW LAST;
+
+schaltet zurück zum vorherigen Bildausschnitt. Ein Bildausschnitt wird bei jedem
+WINDOW-Befehl neu hinterlegt, jedoch nicht bei reinen Zoom-WINDOW-Befehlen und
+Veränderungen des Bildausschnitts mit der Maus.
+Sehr große Zoom-Faktoren
+Standardmäßig ist der maximale Zoom-Faktor auf einen Wert begrenzt, bei dem eine
+Fläche mit 1mm Durchmesser noch formatfüllend dargestellt wird. Falls Sie weiter
+hineinzoomen wollen, können Sie den Schalter "Optionen/Benutzeroberfläche/Zoomfaktor limitieren"
+ausschalten. Sie können dann so weit hineinzoomen, bis die feinste Auflösung des
+Rasters (0.1 micron) sichtbar ist.
+
+
+Parameter-Aliase
+Parameter-Aliase können dazu benutzt werden, bestimmte Parameter-Einstellungen des WINDOW-Befehls
+zu definieren, die später unter einem gegebenen Namen angesprochen werden können.
+Die Aliase können auch benutzt werden indem Sie auf den "WINDOW Select"-Button klicken
+und die Maustaste gedrückt halten bis die Liste erscheint.
+Ein Klick auf den Button mit der rechten Maustaste läßt die Liste ebenfalls erscheinen.
+
+
+Beispiel:
+WIRE
+
+
+Siehe auch MITER,
+SIGNAL,
+ROUTE,
+CHANGE,
+NET,
+BUS,
+DELETE,
+RIPUP,
+ARC
+
+WIRE ['signal_name'] [width] [ROUND | FLAT] [curve | @radius] ..
+
+
+
+
+
+Signalname
+Der Parameter signal_name ist in erster Linie für die
+Anwendung in Script-Dateien gedacht, die generierte Daten einlesen.
+Wenn ein Signalname angegeben ist, werden alle folgenden Wires mit
+diesem Signal verbunden, und es wird keine automatische Prüfung
+durchgeführt.
+Diese Möglichkeit ist mit großer Vorsicht
+einzusetzen, da es zu Kurzschlüssen kommen kann, wenn ein Wire so
+plaziert wird, dass er unterschiedliche Signale verbindet. Bitte führen
+Sie deshalb einen
+Design Rule Check durch, nachdem Sie
+den WIRE-Befehl mit dem Parameter
+signal_name benutzt haben!
+Strichstärke
+Gibt man den Befehl mit dem Parameter width (z. B. 0.1)
+ein, dann wird dadurch die Linienbreite in der aktuellen Maßeinheit
+festgelegt. Zulässig ist maximal 0.51602 Zoll (ca. 13.1 mm). Die
+Linienbreite bleibt für nachfolgende Operationen erhalten.
+
+CHANGE WIDTH breite
+
+ändern oder voreinstellen.
+Linienarten
+Linien können in folgenden Arten (styles) gezeichnet werden::
+
+
+Die Linienart kann mit dem CHANGE-Befehl verändert werden.
+
+DRC und Autorouter behandeln alle Linienarten als durchgezogen (Continuous). +Andere Linienarten werden hauptsächlich für elektrische oder mechanische +Zeichnungen verwendet und sollten nicht in Signallayern benutzt werden. +Der DRC meldet einen Fehler, wenn Sie eine Nicht-continuous-Linie +als Teil einer signalführenden Leiterbahn mit einem Pad verbinden. +
+Der gültige Bereich für curve ist -360..+360, wobei der Wert +angibt aus welchem Anteil eines Vollkreises der Kreisbogen besteht. Ein Wert von 90 +beispielsweise steht für einen Viertelkreis, während 180 einen Halbkreis +ergibt. Der maximale Wert von 360 kann nur theoretisch erreicht werden, da dies +bedeuten würde, dass der Kreisbogen aus einem vollen Kreis besteht, der, weil Anfangs- und +Endpunkt auf dem Kreis liegen müssen, einen unendlich großen Durchmesser haben müsste. +Positive Werte für curve bedeuten, dass der Kreisbogen im mathematisch positiven Sinne +(also gegen den Uhrzeigersinn) gezeichnet wird. Falls curve gleich 0 +ist, handelt es sich um eine gerade Linie ("keine Krümmung"), was letztlich einem +Wire entspricht. Beachten Sie bitte, dass, um den curve Parameter vom width +Parameter unterscheiden zu können, dieser immer mit Vorzeichen ('+' oder +'-') angegeben werden muss, auch wenn es eine positive Zahl ist. +
+Zum Beispiel würde der Befehl +
+WIRE (0 0) +180 (0 10); ++einen Halbkreis entgegen dem Uhrzeigersinn vom Punkt (0 0) nach (0 10) zeichnen. +
+Wird ein radius angegeben, so erhält der Kreisbogen diesen Radius. Genau wie der +curve-Parameter muss auch der radius mit Vorzeichen angegeben werden +um die Orientierung des Kreisbogens zu bestimmen. +Zum Beispiel zeichnet der Befehl +
+WIRE (0 0) @+100 (0 200); ++einen Halbkreis vom Punkt (0 0) nach (0 200) (mit Radius 100), entgegen dem +Uhrzeigersinn. Liegt der Endpunkt des Wires um mehr als den doppelten Radius vom +Startpunkt entfernt, so wird eine gerade Linie gezeichnet. +
+Der Kreisbogen-Radius kann auch dadurch definiert werden, dass der Wire-Endpunkt mit gedrückter +Ctrl-Taste gesetzt wird (typischerweise am Mittelpunkt des Kreises auf dem +der Kreisbogen liegen soll). In diesem Fall wird der Punkt nicht als eigentlicher +Endpunkt genommen, sondern dazu benutzt den Radius des Kreisbogens festzulegen. Sie können +dann den Mauszeiger bewegen und einen Kreisbogen mit dem gegebenen Radius plazieren (die +rechte Maustaste zusammen mit Ctrl schaltet die Orientierung des Kreisbogens um). +Falls Sie den Mauszeiger weiter als den doppelten Radius vom Startpunkt wegbewegen wird +eine gerade Linie gezeichnet. +
+Um jeden beliebigen Kreisbogen mit dem WIRE-Befehl zeichnen zu können (was insbesondere bei der
+Generierung von Script-Dateien wichtig ist) sind die Schlüsselworte ROUND und
+FLAT im WIRE-Befehl ebenfalls erlaubt. Beachten Sie aber, dass diese nur bei
+echten Kreisbögen Anwendung finden (geradlinige Wires haben immer runde Enden). Standardmäßig
+haben mit dem WIRE-Befehl erzeugte Kreisbögen runde Enden.
+
+
+
+WRITE
+
+
+Der WRITE-Befehl sichert eine Zeichnung oder eine Bibliothek im
+Projektverzeichnis.
+Man kann einen neuen Namen wählen oder denjenigen beibehalten,
+unter dem die Zeichnung/Bibliothek geladen wurde.
+
+WRITE drawing_name
+WRITE @drawing_name
+
+Dem Namen kann man auch einen Pfadnamen voranstellen, wenn die Datei +in ein bestimmtes Verzeichnis gesichert werden soll. +
+Wird dem neuen Namen ein @ vorangestellt, so wird auch der Name +der geladenen Zeichnung entsprechend geändert. Die zugehörige Platine/Schaltplan +wird dann automatisch ebenfalls unter diesem Namen abgespeichert, und der +Undo-Puffer wird gelöscht. +
+Um die Konsistenz der +Forward&Back-Annotation +zwischen Platine und Schaltplan zu gewährleisten, verhält sich der WRITE-Befehl +wie folgt: +
+Die restlichen Optionen dienen der Seiteneinrichtung.
+
+
+
+Drucken eines Textes
+Wenn Sie Print aus dem
+Kontext-Menü des Icons einer Textdatei im
+Control Panel oder aus dem Datei
+Menü des Text-Editors auswählen, erhalten Sie
+einen Dialog mit folgenden Optionen:
+
+Die restlichen Optionen dienen der Seiteneinrichtung.
+
+
+
+
+Die Standardwerte für die Ränder werden vom Druckertreiber übernommen
+und definieren die maximal bedruckbare Fläche.
+Sie können hier auch kleinere Werte angeben, wobei es von Ihrem Drucker
+abhängt, ob die angegebenen Ränder dann eingehalten werden können oder nicht.
+
+Nach der Auswahl eines anderen Druckers kann es sein, dass neue
+gerätespezifische Grenzen wirksam werden; die vorgegebenen Ränder
+werden dann automatisch vergößert, falls der neue Drucker dies erfordert.
+Beachten Sie bitte, dass die Werte nicht automatisch verkleinert werden,
+auch wenn der neue Drucker kleinere Werte zulassen würde. Um die
+kleinstmöglichen Werte für die Ränder zu ermitteln, geben Sie in jedes Feld
+0 ein. Dieser Wert wird dann durch das gerätespezifische Minimum
+ersetzt.
+
+Der Wert im X Feld gibt den Kalibrierungsfaktor in der Richtung
+an, in der sich der Druckkopf bewegt. Der Wert im Y Feld
+kalibriert die Koordinaten in Papiervorschubrichtung.
+
+ACHTUNG: Wenn Sie mit Ihrem Drucker Produktionsvorlagen erzeugen,
+prüfen Sie bitte immer das Druckergebnis auf Einhaltung der exakten Maße!
+
+Die Standardwerte von 1 gehen davon aus, dass der Drucker in beiden
+Richtungen exakt druckt.
+
+Bei gespiegelter Ausgabe enthält die Bildunterschrift das Wort
+"mirrored", und falls der Vergrößerungsfaktor nicht
+1.0 ist, wird er als f=... mit angegeben
+(der Vergrößerungsfaktor wird mit 4 Nachkommastellen ausgegeben, so dass
+auch eine Angabe von f=1.0000 nicht bedeutet, dass der Faktor
+exakt 1.0 ist).
+
+
+
+
+Die folgenden Hilfe-Themen führen Sie durch die erforderlichen
+Schritte, von der Auswahl der Daten-Datei bis zur Konfiguration des
+Ausgabegeräts (Device).
+
+Siehe auch Drucken auf dem System-Drucker
+
+
+
+Seiteneinrichtung
+Der Druck-Dialog enthält einige Optionen die bestimmen, wie eine Zeichnung oder ein Text
+auf dem Papier erscheinen soll.
+Rand
+Definiert den linken, oberen, rechten und unteren Rand. Die Werte werden
+entweder in Millimeter oder Inch angegeben, je nachdem, welche Einheit
+weniger Dezimalstellen ergibt.
+Kalibrieren
+Falls Sie mit Ihrem Drucker Produktionsvorlagen erstellen wollen,
+kann es nötig sein, den Drucker zu kalibrieren um exakte 1:1
+Ausdrucke Ihrer Layouts zu erhalten.
+Anordnung
+Definiert die vertikale und horizontale Anordnung der Zeichnung auf dem Papier.
+Bildunterschrift
+Aktiviert die Ausgabe einer Bildunterschrift mit Datum und Uhrzeit des
+Ausdrucks sowie dem Dateinamen.
+CAM-Prozessor
+Mit dem CAM-Prozessor können Sie jede Layer-Kombination an ein Peripheriegerät
+oder in eine Datei ausgeben.
+CAM-Prozessor-Hauptmenü
+Im CAM-Prozessor-Hauptmenü können Sie wählen, von welcher
+Datei die Ausgabe generiert werden soll, Sie können Blenden- und
+Bohrer-Konfigurationsdateien bearbeiten oder Job-Dateien laden und
+sichern.
+Datei
+
Öffnen | Board... Board-Datei für Ausgabe laden | |
Schaltplan... Schaltplan-Datei für Ausgabe laden | ||
Bohrertabelle... Bohrer-Konfigurationsdatei zum Editieren laden | ||
Blendentabelle... Blenden-Konfigurationsdatei zum Editieren laden | ||
Job... Anderen Job laden oder neuen erzeugen | ||
Zuletzt geöffnet | Lädt ein der zuletzt geöffneten Dateien | |
Job speichern... | Gegenwärtigen Job sichern | |
Schließen | CAM-Prozessor-Fenster schließen | |
Beenden | Programm beenden |
Alle abwählen | Alle Layer deselektieren | |
Ausgewählte zeigen | Nur die selektierten Layer anzeigen | |
Alle zeigen | Alle Layer anzeigen |
Control Panel | Zum Control Panel wechseln | |
1 Schaltplan - ... | Zu Fenster 1 wechseln | |
2 Board - ... | Zu Fenster 2 wechseln |
Allgemein | Allgemeine Hilfe-Seite öffnen | |
Kontext | Öffnet die Hilfe-Seite für den momentanen Kontext | |
CAM-Prozessor | CAM-Prozessor-Hilfe öffnen | |
Job-Hilfe | Hilfe zum Job-Mechanismus anzeigen | |
Device-Hilfe | Hilfe zu Ausgabe-Devices anzeigen |
+Ein typischer CAM-Prozessor-Job könnte zum Beispiel zwei Sections +enthalten: eine, die die Fotoplot-Dateien für die Bestückungsseite +erzeugt, und eine weitere, die die entsprechenden Daten für die Lötseite +erzeugt. +
+Sie können die Größe der Ausgabe auf eine bestimmte Anzahl von Seiten +beschränken, indem Sie einen negativen Wert im Scale-Feld eingeben. +In diesem Fall wird der Skalierungsfaktor auf 1.0 voreingestellt und so lange +verkleinert, bis die Zeichnung gerade noch auf die angegebene Anzahl von +Seiten passt. Wird zum Beispiel "-2" eingegeben, so entsteht eine Zeichnung +die nicht mehr als zwei Seiten benötigt. Beachten Sie bitte, dass die zur +Verfügung stehende Blattgröße (Width und Height Parameter) Ihres +Ausgabegeräts richtig eingestellt sein muss, damit dieser Mechanismus +funktioniert. Diese Größen können in den Width- und Height-Feldern oder +durch Editieren der Datei eagle.def eingestellt werden. +
+D010 annulus 0.004 x 0.000 +D010 round 0.004 +D040 square 0.004 +D054 thermal 0.090 x 0.060 +D100 rectangle 0.060 x 0.075 +D104 oval 0.030 x 0.090 +D110 draw 0.004 ++Die Datei darf mehrere Blenden enthalten, die den gleichen D-Code benutzen, so +lange alle von einem der Typen draw, round oder annulus sind und die gleiche +Größe haben (im Falle von annulus muss dann der zweite Größenparameter 0 sein). +Dies kann dazu benutzt werden um Blenden, die letztlich zum gleichen Zeichenergebnis +führen, auf einen gemeinsamen D-Code abzubilden. + + + +
+Die Optionen "Annulus" und "Thermal" werden gewählt, wenn bei +eingeschalteter Blendenemulation zusätzlich Annulus- und/oder +Thermal-Symbole emuliert werden sollen. +
+Achtung: Die Blendenemulation kann zu sehr langen Plot-Zeiten führen
+(hohe Kosten!).
+
+
+
+
+Toleranzen werden in Prozent angegeben.
+
+Bitte beachten Sie, dass dadurch Ihre "Design Rules" unter Umständen
+nicht mehr eingehalten werden!
+
+
+
+
+Die Datei kann mit Hilfe eines User-Language-Programms drillcfg.ulp, das sich im
+ULP-Verzeichnis Ihrer EAGLE-Installation befindet, erzeugt werden.
+Verwenden Sie dazu den Befehl RUN.
+
+Toleranzen werden in Prozent angegeben.
+
+
+
+
+Kann dazu verwendet werden den Nullpunkt von großformatigen Plottern in die linke
+untere Ecke zu verlegen.
+
+
+
+
+Bitte beachten Sie, dass der CAM-Prozessor die Zeichnung auf mehrere
+Teile aufteilt, falls das umschließende Rechteck um alle in der
+Datei enthaltenen Objekte (auch in Layern, die nicht ausgebeben
+werden) nicht auf die bedruckbare Fläche passt.
+
+
+
+
+Bitte verwenden Sie einen Text-Editor,
+der keine Steuerzeichen in die Datei schreibt.
+
+
+
+
+Folgende Dateinamen sind üblich:
+
+Blenden-Toleranzen
+Falls Sie Toleranzen für Draw- bzw. Blitz-Blenden (Flash) angeben,
+verwendet der CAM-Prozessor Blenden innerhalb dieser Toleranz, falls
+keine mit dem exakten Maß verfügbar ist.
+Bohrer-Konfigurationsdatei
+Falls der Treiber für die Bohrstation die Bohrerkonfiguration nicht automatisch
+generieren kann, muss bekannt sein, welche Bohrer den Codes in der Ausgabedatei
+entsprechen. Diese Zuordnung ist in der Bohrer-Konfigurationsdatei definiert.
+Beispiel
+
+T01 0.010
+T02 0.016
+T03 0.032
+T04 0.040
+T05 0.050
+T06 0.070
+
+
+
+
+Bohrer-Toleranzen
+Falls Sie eine Toleranz für Bohrer angeben, verwendet der
+CAM-Prozessor Bohrer innerhalb dieser Toleranz, falls keiner mit dem
+exakten Maß verfügbar ist.
+Offset
+Offset in x- und y-Richtung (Inch, Dezimalzahl)
+Bedruckbarer Bereich
+Height
+Bedruckbarer Bereich in y-Richtung (Inch).
+Width
+Bedruckbarer Bereich in x-Richtung (Inch).
+Stiftdaten
+Diameter
+Stift-Durchmesser in mm: Wird beim Füllen von Flächen zur
+Berechnung der notwendigen Anzahl von Linien benutzt.
+Velocity
+Stiftgeschwindigkeit in cm/s (bei Stift-Plottern, die
+unterschiedliche Geschwindigkeiten unterstützen). Die
+Plotter-Default-Geschwindigkeit wählt man mit dem Wert 0.
+
+
+
+Eigenen Device-Treiber definieren
+Die Ausgabetreiber sind in der Textdatei eagle.def definiert.
+Dort finden Sie Details, wie man einen eigenen Treiber definiert.
+Am besten kopieren Sie einen Block eines existierenden Treibers
+für denselben Gerätetyp und passen dann die Paramter an.
+Ausgabedatei
+Die Ausgabedatei enthält die Daten, die vom CAM-Prozessor
+erzeugt werden.
+
+=======================================================
+Datei- Selekt. Layer Bedeutung
+name
+=======================================================
+*.cmp Top, Via, Pad Bauteilseite
+*.ly2 Route2, Via, Pad Multilayer-Innenlage
+*.ly3 Route3, Via, Pad Multilayer-Innenlage,
+*.ly4 $User1 Multilayer-Versorgungslage
+... ...
+*.sol Bot, Via, Pad Lötseite
+*.plc tPl, Dim, tName, Bestückungsplan Bauteilseite
+*.pls bPl, Dim, bName, Bestückungsplan Lötseite
+*.stc tStop Lötstopmaske Bauteilseite
+*.sts bStop Lötstopmaske Lötseite
+*.drd Drills, Holes Bohrdaten für NC-Bohrmaschine
+=======================================================
+
+Platzhalter
+Der Ausgabedateiname kann entweder direkt eingegeben oder mittels Platzhaltern
+dynamisch zusammengesetzt werden. Ein Platzhalter besteht aus dem Prozentzeichen
+('%') gefolgt von einem Buchstaben. Folgende Platzhalter sind
+definitert:
+
%D{xxx} | ein String, der nur im Namen der Datendatei eingesetzt wird | |
%E | die Extension der geladenen Datei (ohne den '.') | |
%H | das Home-Verzeichnis des Benutzers | |
%I{xxx} | ein String, der nur im Namen der Info-Datei eingesetzt wird | |
%L | die Layer-Nummern für blind&buried Vias (siehe unten) | |
%N | der Name der geladenen Datei (ohne Pfad und Extension) | |
%P | Verzeichnis-Pfad der geladenen Datei (ohne Dateinamen) | |
%% | das Zeichen '%' |
+Zum Beispiel würde die folgende Definition +
+%N.cmp%I{.info} +
+den Namen boardname.cmp für die Datendatei und boardname.cmp.info +für die Info-Datei ergeben (falls das gewählte Device eine Info-Datei erzeugt). +
+boardname.drl.0104 ++welches die Bohrdatei für das Lagenpaket 1-4 wäre. Wenn Sie die Layer-Nummern +an anderer Stelle stehen haben wollen, so können Sie dafür den Platzhalter +%L verwenden: +
+%N.%L.drl ++ergäbe demnach +
+boardname.0104.drl ++Der Name der Drill-Info-Datei wird immer ohne Layer-Nummern erzeugt und +ein eventueller '.' vor dem %L wird entfernt. +Dateien aus früheren CAM-Prozessor-Aufrufen, die dem gegebenen Pattern für +den Namen der Bohrdateien entsprechen würden, werden gelöscht bevor neue +Dateien erzeugt werden. Es gibt eine Drill-Info-Datei pro Job, die (unter +anderem) eine Liste aller generierten Bohrdateien enthält. + + + +
+Bei Peripheriegeräten, die unterschiedliche Farben unterstützen, +geben Sie die Farbnummer für den jeweiligen Layer an. +
+Folgende Layer-Kombinationen und +Ausgabe-Dateinamen +sind üblich: +
+======================================================= +Datei- Selekt. Layer Bedeutung +name +======================================================= +*.cmp Top, Via, Pad Bauteilseite +*.ly2 Route2, Via, Pad Multilayer-Innenlage +*.ly3 Route3, Via, Pad Multilayer-Innenlage, +*.ly4 $User1 Multilayer-Versorgungslage +... ... +*.sol Bot, Via, Pad Lötseite +*.plc tPl, Dim, tName, Bestückungsplan Bauteilseite +*.pls bPl, Dim, bName, Bestückungsplan Lötseite +*.stc tStop Lötstopmaske Bauteilseite +*.sts bStop Lötstopmaske Lötseite +*.drd Drills, Holes Bohrdaten für NC-Bohrmaschine +======================================================= ++ + + +
+Das User-Language-Programm outlines.ulp enthält alle Schritte um diese +Daten zu erzeugen. Die folgende ausführliche Beschreibung zeigt was zu tun ist, um +Konturdaten zu generieren. +
+Werte ungleich 0 für den Isolate-Parameter können dafür verwendet werden, beim +sequentiellen Arbeiten mit unterschiedlichen Fräserdurchmessern bereits gefräste +Bereiche auszusparen. +
+Der Autorouter wird auch als "Follow-me"-Router im +ROUTE-Befehl verwendet. +
+Bitte überprüfen Sie Ihre Lizenz, um
+festzustellen, ob Sie Zugriff zum Autorouter haben.
+
+
+
+
+Der DRC wird in einem Platinen-Fenster ausgeführt. Er überprüft das
+Design auf Überlappung von unterschiedlichen Potentialen,
+Abstandsverletzungen etc.
+
+
+
+
+Der Design Rule Check prüft das Board gegenüber diesen Regeln
+und meldet Verstöße gegen sie.
+
+Die Design Rules eines Boards können mit Hilfe des Design-Rule-Dialogs modifiziert werden.
+Der Dialog öffnet sich, wenn man den DRC-Befehl ohne
+abschließendes ';' aufruft.
+
+Neu angelegte Boards übernehmen ihre Design Rules aus der Datei 'default.dru',
+die in dem ersten Verzeichnis, das im "Optionen/Verzeichnisse/Design-Regeln"-Pfad
+aufgeführt ist, gesucht wird.
+Ist keine solche Datei vorhanden, so gelten die programminternen Standardwerte.
+
+Hinweis zu den Werten für Clearance und Distance: da die interne
+Auflösung der Koordinaten 1/10000mm beträgt kann der DRC nur Fehler größer als 1/10000mm
+zuverlässig melden.
+
+Falls die Design Rules verändert wurden, wird an den Namen in der Titelzeile
+des Dialogs ein Stern ('*') angehängt, um die Veränderung anzuzeigen.
+Diese Markierung verschwindet wieder, sobald die Design Rules explizit abgespeichert
+werden, oder ein neuer Satz von Design Rules geladen wird.
+
+Das Layer-Setup wird durch den String im "Setup"-Feld definiert. Dieser String
+besteht aus einer Sequenz von Layer-Nummern, getrennt durch jeweils ein '*'
+oder '+', wobei '*' für Kern-Material (auch als FR4
+oder dergleichen bekannt) und '+' für Prepreg (oder sonstiges
+Isolationsmaterial) steht. Die tatsächliche Kern- und Prepreg-Sequenz
+hat keine weitergehende Bedeutung für EAGLE, ausser der unterschiedlichen farblichen
+Darstellung in der Anzeige oben links auf diesem Tab (das tatsächliche Multilayer-Setup
+muss auf jeden Fall mit dem Leiterplatten-Hersteller abgesprochen werden). Die Vias
+werden dadurch definiert, dass eine Sequenz von Layern in (...) eingeschlossen
+wird. Der Setup-String
+
+
+Bitte beachten Sie, dass ein Polygon mit dem besonderen Namen _OUTLINES_ dazu verwendet
+wird Kontur-Daten zu erzeugen und dieses die Design Rules
+nicht einhält.
+
+Aus Gründen der Kompatibilität zu Version 3.5x gilt:
+Wird der Parameter für den Mindestabstand zwischen Kupfer und Dimension auf 0
+gesetzt, so werden Objekte im Dimension-Layer beim Freirechnen der Polygone nicht
+mehr berücksichtigt (ausgenommen Holes, die immer berücksichtigt werden). Es findet
+dann auch keine Abstandsprüfung zwischen Kupfer und Dimension mehr statt.
+Überprüfen des Designs
+EAGLE hat zwei Befehle zur Überprüfung Ihres Designs:
+
+Der ERC wird in einem Schaltplan-Fenster ausgeführt. Er überprüft das
+Design auf elektrische Konsistenz.
+Design Rules
+Design Rules legen alle Parameter fest denen ein Platinen-Layout entsprechen muss.
+Datei
+Das Datei-Tab zeigt eine Beschreibung des aktuellen Satzes von Design Rules und erlaubt
+über Change diese Beschreibung zu verändern (das ist empfehlenswert, wenn Sie eigene
+Regeln definieren). Über Load kann man einen anderen Satz von Design Rules
+aus einer Datei laden, Save as.. speichert die aktuellen Einstellungen in eine
+Datei.
+Bitte beachten Sie, dass die Design Rules immer in der Board-Datei gespeichert werden,
+so dass diese Regeln auch für die Produktion der Platine bei Weitergabe der brd-Datei
+an den Leiterplatten-Hersteller gelten. Die "Load..." und "Save as..." Buttons dienen
+lediglich dazu die Design Rules einer Platine in eine externe Datei zu kopieren bzw.
+sie von dort zu laden.
+Layers
+Im Layers-Tab legt man fest welche Layer die Platine tatsächlich verwendet,
+wie dick die einzelnen Kupfer- bzw. Isolationslagen sind und welche Via-Übergänge
+möglich sind (bitte beachten Sie, dass sich dies nur auf echte Vias bezieht;
+selbst wenn kein Via von Layer 1 bis 16 im Layer-Setup definiert wurde sind Pads
+dennoch erlaubt).
+
+(1*16)
+
+würde demnach für eine zweilagige Platine bestehend aus den Layern 1 und 16 stehen,
+mit ganz durchgehenden Vias (dies ist auch der Standardwert).
+Für eine Multilayer-Platine könnte das Setup etwa so aussehen:
+
+((1*2)+(15*16))
+
+was eine vierlagige Platine darstellt deren Layer-Paare 1/2 und 15/16 auf Kern-Material
+gefertigt und durchgebohrt werden, und schließlich mit Prepreg verpresst und am Ende
+nochmals ganz durchgebohrt werden.
+Neben Vias die durch einen ganzen Lagenstapel gehen (gemeinhin als buried Vias bekannt
+wenn sie keine Verbindung zum Top- und Bottom-Layer haben) gibt es auch solche, die
+nicht ganz durch den Lagenstapel gebohrt werden, sondern an einem Layer im Inneren
+des Stapels enden. Solche Vias werden blind Vias genannt und werden im "Setup"-String
+dadurch festgelegt, dass eine Layer-Sequenz in [t:...:b] eingeschlossen wird,
+wobei t und b die Layer bezeichnen bis zu denen das Via von der Ober-
+bzw. Unterseite aus gesehen geht. Ein mögliches Setup mit blind Vias könnte so
+aussehen:
+
+[2:1+((2*3)+(14*15))+16:15]
+
+Dies ist im wesentlichen das vorherige Beispiel, erweitert um zwei zusätzliche
+Aussenlagen, die mit den nächstinneren Lagen durch blind Vias verbunden sind.
+Es ist auch möglich nur einen der Parameter t bzw. b zu benutzen, so dass
+
+[2:1+((2*3)+(15*16))]
+
+ebenfalls ein gültiges Setup wäre. blind Vias müssen nicht am Top oder Bottom
+Layer beginnen, sondern können auch in innenliegenden Lagenstapeln verwendet werden, etwa in
+
+[2:1+[3:2+(3*4)+5:4]+16:5]
+
+Ein blind Via von Layer a nach Layer b implementiert auch alle
+möglichen blind Vias von Layer a nach allen Layern zwischen a und b,
+so dass
+
+[3:1+2+(3*16)]
+
+blind Vias von Layer 1 nach 2 und von Layer 1 nach 3 erlauben würde.
+Clearance
+Im Clearance-Tab definiert man verschiedene Mindestabstände zwischen
+Objekten in den Signallayern. Das sind üblicherweise Mindestwerte, die vom
+Fertigungsprozess beim Leiterplatten-Hersteller vorgegeben werden. Sprechen
+Sie sich dazu mit dem Hersteller ab.
+Der aktuelle Mindestabstand zwischen Objekten, die zu unterschiedlichen Signalen
+gehören, werden auch von den Werten der unterschiedlichen Netzklassen beeinflusst.
+Distance
+Im Distance-Tab legt man die Mindestabstände zwischen Objekten in den Signallayern
+und dem Platinenrand (Dimension) und zwischen Bohrungen (Holes) fest.
+Achtung: Es werden nur Signale gegenüber Dimension geprüft, die auch tatsächlich
+an mindestens einem Pad oder Smd angeschlossen sind. So ist es erlaubt, Eckwinkel
+zur Markierung der Platinenbegrenzung in den Signallayern zu zeichnen ohne
+dass der DRC Fehler meldet.
+Sizes
+Unter Sizes legt man die Mindestbreite von Objekten in Signallayern und den
+Mindestbohrdurchmesser fest. Diese Werte sind absolute Minimalmaße, die vom
+Herstellungsprozess der Platine bestimmt werden. Sprechen Sie sich hierzu
+mit dem Leiterplatten-Hersteller ab.
+Die Mindestbreite von Leiterbahnen und der Mindestbohrdurchmesser von Durchkontaktierungen
+kann ausserdem für unterschiedliche Netzklassen festgelegt werden.
+Restring
+Im Restring-Tab definiert man die Mindestbreite des Kupferrings, die nach
+dem Bohren eines Pads oder Vias um die Bohrung herum stehen bleibt. Die Werte
+werden in Prozent des Bohrdurchmessers angegeben. Ausserdem kann ein Minimal- und
+ein Maximalwert festgelegt werden. Die Restringbreiten für Pads können im Top-,
+Bottom- und in den Innen-Layern unterschiedlich sein, während bei Durchkontaktierungen
+(Vias) nur zwischen Aussen- und Innenlagen unterschieden wird.
+Wenn für den tatsächlichen Durchmesser eines Pads (in der Bibliothek festgelegt) oder
+eines Vias ein größerer Wert vorgegeben wird, wird dieser in den Aussenlagen verwendet.
+Pads können beim Anlegen von Packages mit dem Durchmesser 0 gezeichnet werden, so
+dass der Restring vollständig in Abhängigkeit des Bohrdurchmessers berechnet werden
+kann.
+Shapes
+Unter Shapes definiert man die Formen der Smds und Pads.
+Smds werden üblicherweise als Rechtecke (mit "Roundness" = 0) in der Bibliothek
+definiert. Wenn Sie in Ihrem Design gerundete Smds verwenden wollen, kann man hier
+einen Rundungsfaktor (Roundness) angeben.
+Pads werden normalerweise als Octagon (längliche Octagons wo sinnvoll)
+in der Bibliothek festgelegt. In den Combo-Boxen können Sie festlegen,
+ob die Pads im Layout so verwendet werden wie sie auch in der Bibliothek
+definiert wurden, oder ob alle rechteckig, rund oder octagonal sein sollen.
+Das kann man für Top- und Bottom-Layer separat definieren.
+Wird das "erste" Pad in der Bibliothek als solches markiert, kann man in der
+dritten Combo-Box bestimmen, welche Form dieses Pad haben soll
+(entweder rund, rechteckig, octagonal oder keine spezielle Form).
+Die Elongation-Parameter legen das Aussehen von Pads mit der Form Long bzw. Offset fest.
+Supply
+Unter Supply legt man die Abmessungen für Thermal- und Annulus-Symbole fest, die
+in Versorgungslagen verwendet werden.
+Bitte beachten Sie, dass das tatsächliche Aussehen dieser Symbole von ihrer
+Definition abweichen kann, wenn man Daten mit Photoplottern erzeugt, die besondere
+Thermal/Annulus-Blenden verwenden. Siehe hierzu auch die Bemerkungen zum Thema
+"Versorgungs-Layer" beim LAYER-Befehl.
+
+
+
+
+
+Querverweis-Labels werden typischerweise am rechten oder linken Rand einer
+Schaltplanseite platziert und zeigen die nächste (bzw. vorherige) Seite an,
+auf der ein bestimmtes Netz vorkommt. Eine genaue Beschreibung der
+Funktionsweise finden Sie beim LABEL-Befehl.
+
+
+
+
+Bei der späteren Anzeige wird der '>XREF'-Platzhaltertext (gemäß
+dem Format für Bauteil-Querverweise) durch die
+Seitennummer und Zeichnungsrahmen-Koordinate des Must-Gatters dieses
+Bauteils ersetzt.
+
+Das Kapitel Kontaktspiegel erklärt,
+wie auf der Seite, die die Spule enthält, ein Querverweis auf die Kontakte
+dargestellt werden kann.
+
+
+
+
+Die Kontakt-Symbole müssen den Platzhaltertext '>XREF' enthalten,
+damit Bauteil-Querverweise erzeugt
+werden.
+
+Die Kontakt-Symbole sollten so gezeichnet werden, dass die Pins nach oben bzw.
+unten zeigen, und dass der Ursprung in der Mitte des Symbols liegt.
+
+Das erste Kontakt-Gatter in der Device-Set-Zeichnung sollte an der X-Koordinate
+0 platziert werden, und seine Y-Koordinate sollte so groß sein, dass sein unterer
+Pin sich im positiven Bereich befindet, typischerweise bei 100mil. Die restlichen
+Kontakt-Gatter sollten rechts davon platziert werden, mit ihrem Ursprung
+an der gleichen Y-Koordinate wie das erste. Das Spulen-Gatter kann an einer
+beliebigen Stelle platziert werden.
+
+Im Schaltplan wird der Kontaktspiegel an der selben X-Koordinate dargestellt wie
+die Spule, und direkt unterhalb der Y-Koordinate, die durch den Platzhaltertext
+'>CONTACT_XREF' definiert wird. Dieser Platzhaltertext kann entweder
+in einem Zeichnungsrahmen-Symbol oder direkt auf der Schaltplanseite platziert
+werden. Kommt er an beiden Stellen vor, so wird derjenige in der Schaltplanseite
+genommen. Der Text selber ist auf der Schaltplanseite nicht sichtbar.
+
+Die grafische Darstellung des Kontaktspiegels besteht aus allen Gattern, die einen
+'>XREF' Platzhaltertext haben (ausgenommen das erste Must-Gatter,
+welches die Spule ist und normalerweise keinen solchen Text hat). Die Gatter werden
+um 90 Grad gedreht und von oben nach unten in dem gleichen Abstand dargestellt,
+den sie im Device-Set von links nach rechts haben. Ihre Seitennummern und
+Zeichnungsrahmen-Koordinaten werden rechts neben jedem verwendeten Gatter angezeigt.
+Jegliche anderen Texte, die in den Symbolen definiert wurden, werden nicht
+dargestellt, wenn die Symbole zur Anzeige des Kontaktspiegels verwendet werden.
+
+Beachten Sie bitte, dass der Kontaktspiegel nicht mit der Maus selektiert werden kann.
+Falls Sie ihn verschieben wollen, so bewegen Sie die Spule und der Kontaktspiegel
+folgt ihr automatisch.
+Es kann vorkommen, dass der Kontaktspiegel nach dem Einfügen, Verschieben, Löschen
+oder Vertauschen von Kontakt-Gattern, bzw. einer Veränderung des '>CONTACT_XREF'
+Platzhaltertexts, nicht mehr aktuell ist. Ein neuer Bildaufbau aktualisiert ihn wieder.
+
+
+
+
+Um diese Eigenschaft zu Nutzen, müssen Sie ein
+User-Language-Programm (ULP) schreiben
+und anschließend ausführen.
+
+Die folgenden Abschnitte beschreiben die User Language im Detail:
+
+Querverweise
+Es gibt mehrere Möglichkeiten, Querverweise in EAGLE Schaltplänen zu
+erzeugen, die in den folgenden Abschnitten beschrieben werden.
+
+
+
+
+Querverweis-Labels
+Ein einfaches Label kann dazu benutzt werden, den Namen eines Netzes im Schaltplan
+sichtbar zu machen. Wird bei einem Label die xref-Eigenschaft aktiviert,
+so ändert sich sein Verhalten und es wird zum Querverweis-Label.
+Bauteil-Querverweise
+Elektro-Schaltpläne enthalten oft elektromechanische Relais ("Schütze"), die
+aus einem Spulensymbol und einem oder mehreren Kontaktsymbolen bestehen. Wenn Spule
+und Kontakte auf unterschiedliche Schaltplanseiten verteilt sind, ist es nützlich,
+wenn bei jedem Kontakt angegeben ist, auf welcher Seite seine Spule zu finden ist.
+Dies kann dadurch erreicht werden, dass dem Spulengatter im Device-Set der Add-Level
+Must gegeben wird (siehe ADD-Befehl) und der
+Platzhaltertext '>XREF' in den Kontaktsymbolen platziert wird
+(siehe TEXT-Befehl).
+Kontaktspiegel
+In einem aus mehreren Seiten bestehenden Elektro-Schaltplan mit
+elektro-mechanischen Relais, deren Spulen und Kontakte auf unterschiedliche
+Seiten verteilt sind, ist es nützlich sehen zu können, auf welchen Seiten
+sich die einzelnen Kontakte eines Relais befinden.
+EAGLE kann einen solchen Kontaktspiegel automatisch anzeigen, wenn
+folgende Voraussetzungen erfüllt sind.
+User Language
+Die EAGLE-User-Language gestattet den Zugriff auf die EAGLE-Datenstrukturen
+und kann beliebige Ausgabedateien erzeugen.
+
Syntax | Syntax-Regeln | |
Daten-Typen | Definiert die grundlegenden Datentypen (Data types) | |
Objekt-Typen | Definiert die EAGLE-Objekte (Objects) | |
Definitionen | Zeigt, wie man eine Definition schreibt | |
Operatoren | Liste der gültigen Operatoren (Operators) | |
Ausdrücke | Zeigt, wie man einen Ausdruck (Expression) schreibt | |
Statements | Definiert die gültigen Statements | |
Builtins | Liste der Builtin-Constants, -Functions etc. | |
Dialoge | zeigt wie man grafische Dialoge in ein ULP integriert |
+Ein User-Language-Programm besteht aus zwei wesentlichen Bestandteilen: +Definitionen und +Statements. +
+Definitionen werden verwendet, um Konstanten, +Variablen und Funktionen zu definieren, die wiederum in +Statements verwendet werden. +
+Ein einfaches ULP könnte so aussehen: +
+#usage "Add the characters in the word 'Hello'\n" + "Usage: RUN sample.ulp" +// Definitions: +string hello = "Hello"; +int count(string s) +{ + int c = 0; + for (int i = 0; s[i]; ++i) + c += s[i]; + return c; +} +// Statements: +output("sample") { + printf("Count is: %d\n", count(hello)); + } ++Der Wert der #usage-Directive zeigt im +Control Panel die Beschreibung des Programms an. +
+Soll das Ergebnis des ULPs ein Befehl sein, der im Editor-Fenster ausgeführt
+werden soll, kann man die Funktion exit()
+verwenden um den Befehl an das Editor-Fenster zu schicken.
+
+
+
+ULP ausführen
+User-Language-Programme werden mit Hilfe des
+RUN-Befehls von der Kommandozeile eines
+Editor-Fensters aus ausgeführt.
+
+Ein ULP kann die Information zurückgeben, ob es erfolgreich abgeschlossen +wurde oder nicht. Sie können die +exit()-Funktion verwenden, um das Programm +zu beenden und den Rückgabewert (return value) zu setzen. +
+Ein "return value" von 0 bedeutet, das ULP wurde normal beendet +(erfolgreich), während jeder andere Wert einen unnormalen Programmabbruch +anzeigt. +
+Der Default-Rückgabewert jedes ULP ist 0. +
+Wird der RUN-Befehl als Teil einer +Script-Datei, ausgeführt, dann wird die Script-Datei +abgebrochen, wenn das ULP mit einem "return value" ungleich 0 beendet +wurde. +
+Eine spezielle Variante der Funktion exit() kann
+verwendet werden, um einen Befehl als Ergebnis des ULPs an ein Editor-Fenster zu schicken.
+
+
+
+
+Leerzeichen (blanks), Tabulatoren, Newline-Zeichen und
+Kommentar werden als Whitespace
+behandelt und nicht berücksichtigt.
+
+Die einzige Stelle, an der ASCII-Zeichen, die Whitespace
+repräsentieren, berücksichtigt werden, ist innerhalb von
+Literal Strings,
+wie in
+
+Wenn dem abschließenden Newline-Zeichen einer Zeile ein Backslash
+(\), vorausgeht, werden Backslash und Newline nicht berücksichtigt.
+
+Es gibt zwei Möglichkeiten, Kommentare einzufügen. Die erste verwendet
+die Syntax
+
+Die zweite Möglichkeit, einen Kommentar einzufügen, verwendet die Syntax
+
+Die maximale "include-Tiefe" ist 10.
+
+Jede #include-Direktive wird nur einmal ausgeführt. So wird
+sichergestellt, dass keine Mehrfachdefinitionen von Variablen oder Funktionen entstehen,
+die Fehler verursachen könnten.
+Syntax
+Die Grundbausteine eines User-Language-Programms sind:
+
+Alle unterliegen bestimmten Regeln, die in den entsprechenden Abschnitten
+beschrieben werden.
+
+
+
+Whitespace
+Bevor ein User-Language-Programm ausgeführt werden kann, muss es von einer
+Datei eingelesen werden. Während dieses Vorgangs wird er Inhalt der Datei
+zerlegt (parsed) in Tokens und in Whitespace.
+
+string s = "Hello World";
+
+wo das Leerzeichen zwischen 'o' und 'W' ein Teil des Strings bleibt.
+
+"Hello \
+World"
+
+wird als "Hello World" interpretiert.
+
+
+
+Kommentare
+Wenn man ein ULP schreibt, sollte man möglichst erklärenden Text
+hinzufügen, der einen Eindruck davon vermittelt, was dieses Programm
+tut. Sie können auch Ihren Namen und, falls verfügbar, Ihre Email-Adresse
+hinzufügen, damit die Anwender Ihres Programms die Möglichkeit haben,
+mit Ihnen Kontakt aufzunehmen, wenn Sie Probleme oder
+Verbesserungsvorschläge haben.
+
+/* some comment text */
+
+bei der alle Zeichen zwischen (und einschließlich) den Zeichen
+/* und */ als Kommentar interpretiert wird.
+Solche Kommentare können über mehrere Zeilen gehen, wie in
+
+/* This is a
+ multi line comment
+*/
+
+aber sie lassen sich nicht verschachteln. Das erste */ das einem /*
+folgt, beendet den Kommentar.
+
+int i; // some comment text
+
+Dabei werden alle Zeichen nach (und einschließlich) dem //
+bis zum Newline-Zeichen (aber nicht einschließlich) am Ende der Zeile
+als Kommentar interpretiert.
+
+
+
+Direktiven
+Folgende Direktiven sind verfügbar:
+
+#include
+#require
+#usage
+
+
+
+
+#include
+Ein ULP kann Befehle aus einem anderen ULP durch die #include-Direktive
+ausführen. Die Syntax lautet
+
+#include "filename"
+
+Die Datei filename wird zuerst im selben Verzeichnis in dem sich auch die
+Source-Datei (das ist die Datei mit der #include-Directive) befindet, gesucht.
+Wird sie dort nicht gefunden, wird in den angegebenen ULP-Verzeichnissen gesucht.
+Hinweis zur Kompatibilität zwischen den Betriebssystemen
+
+Enthält filename eine Pfadangabe, ist es das Beste als Trennzeichen immer den +Forward-Slash (/)zu verwenden (auch unter Windows!). Laufwerksbuchstaben unter +Windows sollten vermieden werden. Wird das berücksichtigt, läuft das ULP unter +allen Betriebssystemen. + |
+#require version ++Die version muss als Real-Konstante +der Form +
+V.RRrr ++angegeben werden, wobei V die Versionsnummer ist, RR die Release-Nummer +und rr die (optionale) Revisions-Nummer (beide mit führenden Nullen +aufgefüllt, falls sie kleiner als 10 sind). Falls also zum Beispiel ein ULP +mindestens die EAGLE-Version 4.11r06 voraussetzt (welches die Betaversion war die +als erste die #require-Direktive implementierte), könnte es +
+#require 4.1106 ++benutzen. Entsprechend würde für Version 5.1.2 +
+#require 5.0102 ++gelten. + + + +
+#usage text [, text...] ++ist die übliche Methode diese Information verfügbar zu machen. +
+Wird die #usage-Direktive verwendet, +wird ihr Text (der eine String-Konstante sein muss) +im Control Panel verwendet, um die Beschreibung des Programms anzuzeigen. +
+Für den Fall, dass das ULP diese Information z. B. in einer +dlgMessageBox() benötigt, ist dieser Text durch die +Builtin-Konstante usage im ULP verfügbar. +
+Es wird nur die #usage-Direktive des Hauptprogramms (das ist die Datei, die mit +dem RUN-Befehl gestartet wurde) berücksichtigt. +Deshalb sollten reine include-Dateien auch eine +eigene #usage-Directive enthalten. +
+Am besten ist die #usage-Direktive an den Anfang der Datei zu stellen, +so muss das Control Panel nicht den ganzen Text der Datei durchsuchen, +um die Informationen, die angezeigt werden sollen, zu finden. +
+Soll die Usage-Information in mehreren Sprachen verfügbar gemacht werden, so +sind die Texte der verschiedenen Sprachen durch Kommas getrennt anzugeben. +Dabei muss jeder Text mit dem zweibuchstabigen Code der jeweiligen Sprache +(so wie er auch von der language()-Funktion geliefert wird), +gefolgt von einem Doppelpunkt und beliebig vielen Leerzeichen beginnen. +Falls für die auf dem aktuellen System verwendete Sprache kein passender +Text gefunden wird, so wird der erste angegebene Text verwendet (dieser +sollte generell Englisch sein um das Programm einer möglichst großen Zahl +von Benutzern zugänglich zu machen). +
+#usage "en: A sample ULP\n" + "Implements an example that shows how to use the EAGLE User Language\n" + "Usage: RUN sample.ulp\n" + "Author: john@home.org", + "de: Beispiel eines ULPs\n" + "Implementiert ein Beispiel das zeigt, wie man die EAGLE User Language benutzt\n" + "Aufruf: RUN sample.ulp\n" + "Autor: john@home.org" ++ + + +
+break +case +char +continue +default +do +else +enum +for +if +int +numeric +real +return +string +switch +void +while ++Zusätzlich sind die Namen von +Builtins und +Objekt-Typen +reserviert und dürfen nicht als Identifier-Namen verwendet werden. + + + +
+Identifier bestehen aus einer Sequenz von Buchstaben (a b c..., A B C...), +Ziffern (1 2 3...) und Unterstreichungszeichen (_). Das erste Zeichen +eines Identifiers muss ein Buchstabe oder ein Unterstreichungszeichen sein. +
+Identifier sind case-sensitive, das bedeutet, dass +
+int Number, number; ++zwei unterschiedliche Integer-Variablen definieren würde. +
+Die maximale Länge eines Identifiers ist 100 Zeichen, von denen alle signifikant sind.
+
+
+
+Konstanten
+Konstanten sind gleichbleibende Daten, die in ein User-Language-Programm
+geschrieben werden. Analog zu den verschiedenen
+Datentypen
+gibt es auch unterschiedliche Typen von Konstanten.
+
+'a' +'=' +'\n' ++Der Typ der Character-Konstante ist +char. + + + +
+
erstes | zweites | Konstante interpretiert als | ||
0 | 1-7 | oktal (Basis 8) | ||
0 | x,X | hexadezimal (Basis 16) | ||
1-9 | dezimal (Basis 10) |
+Der Typ einer Integer-Konstante ist +int. +
16 | dezimal | |
020 | oktal | |
0x10 | hexadezimal |
+[-]int.frac[e|E[±]exp] ++wobei die einzelnen Teile für +
+Sie können entweder Dezimal-Integer-Zahl oder Dezimalbruch weglassen +(aber nicht beides). Sie können entweder den Dezimalpunkt oder +den Buchstaben e oder E und den Integer-Exponenten mit +Vorzeichen weglassen (aber nicht beides). +
+Der Typ einer Real-Konstante ist +real. +
Konstante | Wert | |
23.45e6 | 23.45 x 10^6 | |
.0 | 0.0 | |
0. | 0.0 | |
1. | 1.0 | |
-1.23 | -1.23 | |
2e-5 | 2.0 x 10^-5 | |
3E+10 | 3.0 x 10^10 | |
.09E34 | 0.09 x 10^34 |
+"Hello world\n" ++Der Typ einer String-Konstante ist +string. +
+String-Konstanten können jede beliebige Länge haben, vorausgesetzt +es steht genügend Speicher zur Verfügung. +
+String-Konstanten können mit dem einfach aneinandergereiht werden +um längere Strings zu bilden: +
+string s = "Hello" " world\n"; ++Es ist auch möglich, eine String-Konstante über mehrere Zeilen zu schreiben, +indem man das Newline-Zeichen mit Hilfe des Backslash (\) "ausblendet": +
+string s = "Hello \ +world\n"; ++ + + +
+
Sequenz | Bedeutung | |
\a | audible bell | |
\b | backspace | |
\f | form feed | |
\n | new line | |
\r | carriage return | |
\t | horizontal tab | |
\v | vertical tab | |
\\ | backslash | |
\' | single quote | |
\" | double quote | |
\O | O = bis 3 octal digits | |
\xH | H = bis 2 hex digits |
+Jedes Zeichen nach dem Backslash, das nicht in der Liste aufgeführt ist, +wird als dieses Zeichen (ohne Backslash) behandelt. +
+Escape-Sequenzen können in +Character-Konstanten und +String-Konstanten verwendet werden. +
+'\n' +"A tab\tinside a text\n" +"Ring the bell\a\n" ++ + + +
+
[] | Eckige Klammern (Brackets) | |
() | Runde Klammern (Parentheses) | |
{} | Geschweifte Klammern (Braces) | |
, | Komma | |
; | Semikolon | |
: | Doppelpunkt (Colon) | |
= | Gleichheitszeichen |
+Andere Sonderzeichen werden als
+Operatoren
+verwendet.
+
+
+
+Eckige Klammern
+Eckige Klammern (Brackets) werden verwendet in Array-Definitionen:
+
+int ai[];
+
+in Array-Subscripts
+
+n = ai[2];
+
+und in String-Subscripts, um auf die einzelnen Zeichen eines Strings
+zuzugreifen
+
+string s = "Hello world";
+char c = s[2];
+
+
+
+
+Runde Klammern
+Runde Klammern (Parentheses) gruppieren
+Ausdrücke
+(ändern eventuell die Priorität der Operatoren),
+isolieren bedingte Ausdrücke und bezeichnen
+Funktionsaufrufe und Funktionsparameter:
+
+d = c * (a + b); +if (d == z) ++x; +func(); +void func2(int n) { ... } ++ + + +
+if (d == z) { + ++x; + func(); + } ++und werden auch verwendet, um die Werte für die Array-Initialisierung zu +gruppieren: +
+int ai[] = { 1, 2, 3 }; ++ + + +
+int func(int n, real r, string s) { ... } +int i = func(1, 3.14, "abc"); ++Es trennt auch die Wertangaben bei der Array-Initialisierung: +
+int ai[] = { 1, 2, 3 }; ++und es begrenzt die Elemente einer Variablen-Definition: +
+int i, j, k; ++ + + +
+i = a + b; ++und er begrenzt die Init-, Test- und Inkrement-Ausdrücke eines +for Statements: +
+for (int n = 0; n < 3; ++n) { + func(n); + } ++ + + +
+switch (c) { + case 'a': printf("It was an 'a'\n"); break; + case 'b': printf("It was a 'b'\n"); break; + default: printf("none of them\n"); + } ++ + + +
+int i = 10; +char c[] = { 'a', 'b', 'c' }; ++Es wird auch als +Zuweisungsoperator verwendet. + + + +
+Die vier grundlegenden Datentypen sind +
+
char | für Einzelzeichen | |
int | für Ganzzahlen | |
real | für Gleitkommazahlen | |
string | für Textinformation |
+Neben diesen grundlegenden Datentypen gibt es auch +High-level-Objekt-Typen, +die die Datenstrukturen repräsentieren, wie sie in den EAGLE-Dateien +gespeichert sind. +
+Der Datentyp void wird nur als Return-Typ einer
+Funktion verwendet. Er zeigt
+an, dass diese Funktion keinen Wert zurückgibt.
+
+
+
+
+Eine Variable des Typs char belegt 8 bit (1 Byte), und kann jeden Wert
+im Bereich 0..255 speichern.
+
+Siehe auch Operatoren,
+Character-Konstanten
+
+
+
+
+Eine Variable vom Typ int belegt 32 bit (4 Byte), und kann
+jeden Wert im Bereich -2147483648..2147483647 speichern.
+
+Siehe auch Integer-Konstanten
+
+
+
+
+Eine Variable vom Typ real belegt 64 bit (8 Byte), und kann jeden Wert
+im Bereich ±2.2e-308..±1.7e+308 mit einer Genauigkeit von 15 Digits
+speichern.
+
+Siehe auch Real-Konstanten
+
+
+
+
+Eine Variable des Typs string ist nicht auf eine bestimmte Länge beschränkt,
+vorausgesetzt, es steht genügend Speicher zur Verfügung.
+
+Variablen des Typs string sind ohne explizite Länge definiert. Sie
+"wachsen" automatisch, soweit erforderlich, während der Programmausführung.
+
+Die Elemente einer String-Variablen sind vom Typ
+char, und
+man kann auf sie individuell zugreifen, indem man
+[index] benutzt.
+
+Das erste Zeichen eines Strings hat den Index 0:
+
+Siehe auch Operatoren,
+Builtin-Functions,
+String-Konstanten
+
+Arithmetische Typen sind
+char,
+int und
+real
+(in dieser Reihenfolge). Ist zum Beispiel a vom Typ
+int
+und b vom Typ
+real, dann ist das Ergebnis
+a + b vom Typ
+real.
+
+Siehe auch Typecast
+
+
+
+
+Die allgemeine Syntax eines Typecast ist
+
+Wenn man mit Typecast einen Ausdruck vom Typ
+real in
+int umwandelt, wird der Dezimalbruch
+des Wertes abgeschnitten.
+
+Siehe auch Typ-Umwandlung
+
+
+
+
+Auf die "Properties" dieser Objekte kann mit Hilfe von Members
+zugegriffen werden.
+
+Es gibt zwei Arten von Members:
+
+Loop members werden verwendet, um auf Mehrfach-Objekte
+derselben Art zuzugreifen, die in einem Objekt einer höheren Hierarchiestufe
+enthalten sind:
+
+Loop members behandeln Objekte in alpha-numerisch sortierter Reihenfolge,
+falls die Objekte einen Namen haben.
+
+Eine Loop-member-Funktion erzeugt eine Variable vom erforderlichen Typ,
+um die Objekte zu speichern. Sie dürfen jeden gültigen Namen für eine
+derartige Variable verwenden, so dass das obige Beispiel auch so lauten könnte:
+
+Objekt-Hierarchie einer Bibliothek:
+char
+Der Datentyp char speichert Einzelzeichen, wie die Buchstaben des
+Alphabets oder kleine Zahlen ohne Vorzeichen.
+int
+Der Datentyp int speichert Ganzzahlen mit Vorzeichen, wie die Koordinaten
+eines Objekts.
+real
+Der Datentyp real speichert Gleitkommazahlen mit Vorzeichen, z.B.
+den Rasterabstand.
+string
+Der Datentyp string speichert Textinformation, z.B. den Namen eines Bauteils
+oder eines Netzes.
+
+string s = "Layout";
+printf("Third char is: %c\n", s[2]);
+
+Hier würde das Zeichen 'y' ausgedruckt.
+Beachten Sie, dass s[2] das dritte Zeichen des Strings
+s liefert!
+Implementierungs-Details
+Der Datentyp string ist implementiert wie von C her bekannte
+"Zero-terminated-Strings", (also mit char[]).
+Betrachtet man die folgende Variablen-Definition
+
+string s = "abcde";
+
+dann ist s[4] das Zeichen 'e', und s[5] ist das Zeichen
+'\0', oder der Integer-Wert 0x00.
+Diese Tatsache kann dazu ausgenutzt werden, das Ende eines Strings
+ohne die Funktion strlen() festzustellen, wie
+in
+
+for (int i = 0; s[i]; ++i) {
+ // do something with s[i]
+ }
+
+Es ist auch völlig in Ordnung, einen String "abzuschneiden", indem man
+den Wert "0" an der gewünschten Stelle einfügt:
+
+string s = "abcde";
+s[3] = 0;
+
+Als Ergebnis erhält man für den String s den Wert "abc".
+Beachten Sie bitte, dass alles, was auf den Wert "0" folgt, wirklich
+verschwunden ist, und auch nicht mehr zurückgeholt werden kann, indem
+der ursprüngliche Wert wieder eingesetzt wird. Das gleiche gilt auch
+für jede andere Operation, bei der ein Zeichen zu 0 wird, wie etwa --s[3].
+
+
+
+Typ-Umwandlung
+Der Typ des Ergebnisses eines arithmetischen
+Ausdrucks, wie z.B. a + b,
+wobei a und b unterschiedliche arithmetische Typen sind,
+ist gleich dem "größeren" der beiden Operanden-Typen.
+Typecast
+Der Ergebnis-Typ eines arithmetischen
+Ausdrucks
+kann explizit in einen anderen arithmetischen Typ umgewandelt werden,
+indem man einen
+Typecast darauf anwendet.
+
+type(expression)
+
+wobei type
+char,
+int oder
+real ist und
+expression jeder arithmetische
+Ausdruck sein kann.
+Objekt-Typen
+Die EAGLE-Datenstruktur ist in drei Binärdatei-Typen gespeichert:
+
+
+Diese Dateien enthalten Objekte, die hierarchisch gegliedert sind.
+In einem User-Language-Programm kann man auf die Hierarchiestufen mit
+Hilfe der entsprechenden Builtin-Zugriffs-Statements zugreifen:
+
+library(L) { ... }
+schematic(S) { ... }
+board(B) { ... }
+
+Diese Zugriffs-Statements schaffen einen Kontext, innerhalb dessen Sie
+auf alle Objekte in Bibliotheken, Schaltplänen oder Platinen zugreifen können.
+
+
+Data members liefern die Objektdaten unmittelbar.
+Zum Beispiel in
+
+board(B) {
+ printf("%s\n", B.name);
+ }
+
+liefert Data member name des Board-Objekts B
+den Board-Namen.
+Data members können auch andere Objekte zurückgeben, wie in
+
+board(B) {
+ printf("%f\n", B.grid.size);
+ }
+
+wo Data member grid des Boards ein Grid-Objekt zurückliefert,
+dessen Data member size dann Grid-Size (Rastergröße) zurückgibt.
+
+board(B) {
+ B.elements(E) {
+ printf("%-8s %-8s\n", E.name, E.value);
+ }
+ }
+
+Dieses Beispiel verwendet Loop member elements() des Boards,
+um eine Schleife durch alle Board-Elemente zu realisieren. Der Block nach
+dem B.elements(E)-Statement wird der Reihe nach für jedes Element
+ausgeführt, und das gegenwärtige Element kann innerhalb des Blocks unter
+dem Namen E angesprochen werden.
+
+board(MyBoard) {
+ MyBoard.elements(TheCurrentElement) {
+ printf("%-8s %-8s\n", TheCurrentElement.name, TheCurrentElement.value);
+ }
+ }
+
+Das Ergebnis wäre identisch mit dem vorhergehenden Beispiel. Der Gültigkeitsbereich
+einer Variablen, die von einer Loop-member-Funktion angelegt wird, ist
+auf das Statement oder den Block unmittelbar nach dem Loop-Funktionsaufruf
+beschränkt.
+
+LIBRARY
+ GRID
+ LAYER
+ DEVICESET
+ DEVICE
+ GATE
+ PACKAGE
+ CONTACT
+ PAD
+ SMD
+ CIRCLE
+ HOLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ SYMBOL
+ PIN
+ CIRCLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+
+Objekt-Hierarchie eines Schaltplans:
+
+SCHEMATIC
+ GRID
+ LAYER
+ LIBRARY
+ SHEET
+ CIRCLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ PART
+ INSTANCE
+ ATTRIBUTE
+ BUS
+ SEGMENT
+ LABEL
+ TEXT
+ WIRE
+ WIRE
+ NET
+ SEGMENT
+ JUNCTION
+ PINREF
+ TEXT
+ WIRE
+
+Objekt-Hierarchie einer Platine:
+
+BOARD
+ GRID
+ LAYER
+ LIBRARY
+ CIRCLE
+ HOLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ ELEMENT
+ ATTRIBUTE
+ SIGNAL
+ CONTACTREF
+ POLYGON
+ WIRE
+ VIA
+ WIRE
+
+
+
+
+UL_ARC
+
+Siehe auch UL_WIRE
+Konstanten
+
CAP_FLAT | flache Kreisbogen-Enden | |
CAP_ROUND | runde Kreisbogen-Enden |
+board(B) { + B.wires(W) { + if (W.arc) + printf("Arc: (%d %d), (%d %d), (%d %d)\n", + W.arc.x1, W.arc.y1, W.arc.x2, W.arc.y2, W.arc.xc, W.arc.yc); + } + } ++ + + +
+UL_AREA ist ein Pseudo-Objekt, das Informationen über die Fläche liefert, +die ein Objekt einnimmt. Für UL_DEVICE, UL_PACKAGE und UL_SYMBOL ist die +Fläche definiert als umschließendes Rechteck der Objekt-Definition +in der Bibliothek. +Deshalb geht der Offset in einem Board nicht in die Fläche ein, obwohl +UL_PACKAGE von UL_ELEMENT abgeleitet wird. +
+board(B) { + printf("Area: (%d %d), (%d %d)\n", + B.area.x1, B.area.y1, B.area.x2, B.area.y2); + } ++ + + +
constant | int (0=variabel, d.h. überschreiben erlaubt, 1=konstant - siehe Anmerkung) | |
defaultvalue | string (siehe Anmerkung) | |
display | int (ATTRIBUTE_DISPLAY_FLAG_...) | |
name | string | |
text | UL_TEXT (siehe Anmerkung) | |
value | string |
ATTRIBUTE_DISPLAY_FLAG_OFF | keine Anzeige | |
ATTRIBUTE_DISPLAY_FLAG_VALUE | Wert wird angezeigt | |
ATTRIBUTE_DISPLAY_FLAG_NAME | Name wird angezeigt |
+Ein UL_ATTRIBUTE kann dazu benutzt werden, die Attribute anzusprechen, +die für ein Device in der Bibliothek definiert wurden, bzw. einem Bauteil +im Schaltplan oder Board zugewiesen wurden. +
+In einem UL_ELEMENT-Kontext liefert constant nur bei aktiver F/B-Annotation +einen tatsächlichen Wert, ansonsten wird 0 geliefert. +
+Das defaultvalue-Member liefert den Wert, wie er in der Bibliothek definiert +wurde (falls sich dieser vom tatsächlichen Wert unterscheidet, ansonsten ist es +der selbe Wert wie bei value). +In einem UL_ELEMENT-Kontext liefert defaultvalue nur bei aktiver F/B-Annotation +einen tatsächlichen Wert, ansonsten wird ein leerer String geliefert. +
+Das text-Member ist nur in einem UL_INSTANCE- oder UL_ELEMENT-Kontext +verfügbar und liefert ein UL_TEXT-Objekt welches alle Text-Parameter enthält. +Der Wert dieses Text-Objekts ist der Text wie er gemäß dem 'display'-Parameter +des UL_ATTRIBUTE angezeigt wird. Wird diese Funktion aus einem anderen Kontext +heraus aufgerufen, so sind die Werte des zurückgegebenen UL_TEXT-Objekts +undefiniert. +
+Bei globalen Attributen sind nur name und value definiert. +
+schematic(SCH) { + SCH.parts(P) { + P.attributes(A) { + printf("%s = %s\n", A.name, A.value); + } + } + } +schematic(SCH) { + SCH.attributes(A) { // global attributes + printf("%s = %s\n", A.name, A.value); + } + } ++ + + +
area | UL_AREA | |
grid | UL_GRID | |
name | string (siehe Anmerkung) |
attributes() | UL_ATTRIBUTE (siehe Anmerkung) | |
circles() | UL_CIRCLE | |
classes() | UL_CLASS | |
elements() | UL_ELEMENT | |
frames() | UL_FRAME | |
holes() | UL_HOLE | |
layers() | UL_LAYER | |
libraries() | UL_LIBRARY | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
signals() | UL_SIGNAL | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
+Das Loop member attributes() geht durch die globalen Attribute. +
+board(B) { + B.elements(E) printf("Element: %s\n", E.name); + B.signals(S) printf("Signal: %s\n", S.name); + } ++ + + +
name | string (BUS_NAME_LENGTH) |
segments() | UL_SEGMENT |
BUS_NAME_LENGTH | max. Länge eines Busnamens (obsolet - ab Version 4 können Bus-Namen beliebig lang sein) |
+schematic(SCH) { + SCH.sheets(SH) { + SH.busses(B) printf("Bus: %s\n", B.name); + } + } ++ + + +
+board(B) { + B.circles(C) { + printf("Circle: (%d %d), r=%d, w=%d\n", + C.x, C.y, C.radius, C.width); + } + } ++ + + +
clearance[number] | int (siehe Anmerkung) | |
drill | int | |
name | string (siehe Anmerkung) | |
number | int | |
width | int |
+Wenn name einen leeren String liefert, ist die Netzklasse nicht definiert und wird somit +auch nicht von einem Signal oder Netz benutzt. +
+board(B) { + B.signals(S) { + printf("%-10s %d %s\n", S.name, S.class.number, S.class.name); + } + } ++ + + +
name | string (CONTACT_NAME_LENGTH) | |
pad | UL_PAD | |
signal | string | |
smd | UL_SMD | |
x, y | int (Mittelpunkt, siehe Anmerkung) |
CONTACT_NAME_LENGTH | max. empfohlene Länge eines "Contact"-Namens (wird nur für formatierte Ausgaben benutzt) |
+Die Koordinaten (x, y) des "Contacts" hängen vom Kontext ab aus dem sie aufgerufen werden: +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + printf("Contact: '%s', (%d %d)\n", + C.name, C.x, C.y); + } + } + } ++ + + +
contact | UL_CONTACT | |
element | UL_ELEMENT |
+board(B) { + B.signals(S) { + printf("Signal '%s'\n", S.name); + S.contactrefs(C) { + printf("\t%s, %s\n", C.element.name, C.contact.name); + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string | |
library | string | |
name | string (DEVICE_NAME_LENGTH) | |
package | UL_PACKAGE (siehe Anmerkung) | |
prefix | string (DEVICE_PREFIX_LENGTH) | |
technologies | string (siehe Anmerkung) | |
value | string ("On" oder "Off") |
attributes() | UL_ATTRIBUTE (siehe Anmerkung) | |
gates() | UL_GATE |
DEVICE_NAME_LENGTH | max. empfohlene Länge eines Device-Namens (wird nur für formatierte Ausgaben benutzt) | |
DEVICE_PREFIX_LENGTH | max. empfohlene Länge eines Device-Präfix (wird nur für formatierte Ausgaben benutzt) |
+Alle UL_DEVICE-Member, mit Ausnahme von name und technologies, liefern +dieselben Werte wie die zugehörigen UL_DEVICESET-Member in dem UL_DEVICE definiert wurde. +Das name-Member liefert den Namen der Package-Variante, für welche dieses +Device mit dem PACKAGE-Befehl erzeugt worden ist. +Bitte denken Sie daran: Der description-Text darf Newline-Zeichen ('\n') enthalten. +
+Der Wert des technologies-Member hängt vom Kontext ab aus dem es aufgerufen wurde: +
+Das Loop member attributes() erwartet einen zusätzlichen Parameter der +angibt, für welche Technology die Attribute geliefert werden sollen (siehe das +zweite Beispiel). +
+library(L) { + L.devicesets(S) { + S.devices(D) { + if (D.package) + printf("Device: %s, Package: %s\n", D.name, D.package.name); + D.gates(G) { + printf("\t%s\n", G.name); + } + } + } + } ++
+library(L) { + L.devicesets(DS) { + DS.devices(D) { + string t[]; + int n = strsplit(t, D.technologies, ' '); + for (int i = 0; i < n; i++) { + D.attributes(A, t[i]) { + printf("%s = %s\n", A.name, A.value); + } + } + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string (siehe Anmerkung) | |
library | string | |
name | string (DEVICE_NAME_LENGTH) | |
prefix | string (DEVICE_PREFIX_LENGTH) | |
value | string ("On" oder "Off") |
devices() | UL_DEVICE | |
gates() | UL_GATE |
DEVICE_NAME_LENGTH | max. empfohlene Länge des Device-Namen (wird nur bei formatierten Ausgaben benutzt) | |
DEVICE_PREFIX_LENGTH | max. empfohlene Länge des Prefix (wird nur bei formatierten Ausgaben benutzt) |
+library(L) { + L.devicesets(D) { + printf("Device set: %s, Description: %s\n", D.name, D.description); + D.gates(G) { + printf("\t%s\n", G.name); + } + } + } ++ + + +
angle | real (0.0...359.9) | |
attribute[] | string (siehe Anmerkung) | |
column | string (siehe Anmerkung) | |
locked | int | |
mirror | int | |
name | string (ELEMENT_NAME_LENGTH) | |
package | UL_PACKAGE | |
row | string (siehe Anmerkung) | |
smashed | int (siehe Anmerkung) | |
spin | int | |
value | string (ELEMENT_VALUE_LENGTH) | |
x, y | int (Ursprung, Aufhängepunkt) |
attributes() | UL_ATTRIBUTE | |
texts() | UL_TEXT (siehe Anmerkung) |
ELEMENT_NAME_LENGTH | max. empfohlene Länge eines Element-Namens (wird nur für formatierte Ausgaben benutzt) | |
ELEMENT_VALUE_LENGTH | max. empfohlene Länge eines Element-Values (wird nur für formatierte Ausgaben benutzt) |
+Das texts()-Member läuft nur durch die mittels SMASH vom +Element losgelösten Texte und durch die sichtbaren Texte der Attribute, die diesem Element zugewiesen wurden. +Um alle Texte eines Elements zu bearbeiten (zum Beispiel um es zu zeichnen), müssen Sie eine Schleife +durch das texts()-Member des Elements selbst und +durch das texts()-Member des zum Element gehörenden +Package +bilden. +
+angle gibt an um wieviel Grad das Element gegen den Uhrzeigersinn um seinen +Aufhängepunkt gedreht ist. +
+Die column()- und row()-Members liefern die Spalten- bzw. Zeilenposition +innerhalb des Rahmens in der Board-Zeichnung. +Falls es in der Zaichnung keinen Rahmen gibt, oder das Element außerhalb des Rahmens liegt, +wird ein '?' (Fragezeichen) zurückgegeben. +
+Das smashed-Member gibt Auskunft darüber, ob ein Element gesmasht ist. +Diese Funktion kann auch verwendet werden um herauszufinden, ob es einen losgelösten +Platzhaltertext gibt, indem der Name des Platzhalters in eckigen Klammern angegeben +wird, wie in smashed["VALUE"]. Dies ist nützlich falls Sie einen solchen Text +mit dem MOVE-Befehl etwa durch MOVE R5>VALUE +selektieren wollen. Gültige Platzhalternamen sind "NAME" und "VALUE", sowie die +Namen etwaiger benutzerdefinierter Attribute. +Groß-/Kleinschreibung spielt keine Rolle, und sie dürfen ein vorangestelltes +'>' Zeichen haben. +
+board(B) { + B.elements(E) { + printf("Element: %s, (%d %d), Package=%s\n", + E.name, E.x, E.y, E.package.name); + } + } ++
+board(B) { + B.elements(E) { + if (E.attribute["REMARK"]) + printf("%s: %s\n", E.name, E.attribute("REMARK")); + } + } ++ + + +
columns | int (-127...127) | |
rows | int (-26...26) | |
border | int (FRAME_BORDER_...) | |
layer | int | |
x1, y1 | int (lower left corner) | |
x2, y2 | int (upper right corner) |
texts() | UL_TEXT | |
wires() | UL_WIRE |
FRAME_BORDER_BOTTOM | unterer Rand wird dargestellt | |
FRAME_BORDER_RIGHT | rechter Rand wird dargestellt | |
FRAME_BORDER_TOP | oberer Rand wird dargestellt | |
FRAME_BORDER_LEFT | linker Rand wird dargestellt |
+Die Loop-Members texts() und wires() gehen durch alle Texte und +Linien, aus denen der Frame besteht. +
+board(B) { + B.frames(F) { + printf("Frame: (%d %d), (%d %d)\n", + F.x1, F.y1, F.x2, F.y2); + } + } ++ + + +
addlevel | int (GATE_ADDLEVEL_...) | |
name | string (GATE_NAME_LENGTH) | |
swaplevel | int | |
symbol | UL_SYMBOL | |
x, y | int (Aufhängepunkt, siehe Anmerkung) |
GATE_ADDLEVEL_MUST | must | |
GATE_ADDLEVEL_CAN | can | |
GATE_ADDLEVEL_NEXT | next | |
GATE_ADDLEVEL_REQUEST | request | |
GATE_ADDLEVEL_ALWAYS | always |
+
GATE_NAME_LENGTH | max. empfohlene Länge eines Gate-Namens (wird nur für formatierte Ausgaben benutzt) |
+library(L) { + L.devices(D) { + printf("Device: %s, Package: %s\n", D.name, D.package.name); + D.gates(G) { + printf("\t%s, swaplevel=%d, symbol=%s\n", + G.name, G.swaplevel, G.symbol.name); + } + } + } ++ + + +
distance | real | |
dots | int (0=lines, 1=dots) | |
multiple | int | |
on | int (0=off, 1=on) | |
unit | int (GRID_UNIT_...) | |
unitdist | int (GRID_UNIT_...) |
GRID_UNIT_MIC | Micron | |
GRID_UNIT_MM | Millimeter | |
GRID_UNIT_MIL | Mil | |
GRID_UNIT_INCH | Inch |
+board(B) { + printf("Gridsize=%f\n", B.grid.distance); + } ++ + + +
diameter[layer] | int (siehe Anmerkung) | |
drill | int | |
drillsymbol | int | |
x, y | int (Mittelpunkt) |
+drillsymbol liefert die Nummer des Bohrsymbols, welches diesem Bohrdurchmesser +zugeordnet worden ist (siehe die Liste der definierten Bohrsymbole im Handbuch). +Ein Wert von 0 bedeutet, dass diesem Bohrdurchmesser kein Bohrsymbol zugeordnet ist. +
+board(B) { + B.holes(H) { + printf("Hole: (%d %d), drill=%d\n", + H.x, H.y, H.drill); + } + } ++ + + +
angle | real (0, 90, 180 und 270) | |
column | string (siehe Anmerkung) | |
gate | UL_GATE | |
mirror | int | |
name | string (INSTANCE_NAME_LENGTH) | |
row | string (siehe Anmerkung) | |
sheet | int (0=unbenutzt, >0=Seitennummer) | |
smashed | int (siehe Anmerkung) | |
value | string (PART_VALUE_LENGTH) | |
x, y | int (Aufhängepunkt) |
attributes() | UL_ATTRIBUTE (siehe Anmerkung) | |
texts() | UL_TEXT (siehe Anmerkung) | |
xrefs() | UL_GATE (siehe Anmerkung) |
INSTANCE_NAME_LENGTH | max. empfohlene Länge eines Instance-Namen (wird nur für formatierte Ausgaben benutzt) | |
PART_VALUE_LENGTH | max. empfohlene Länge eines Bauteil-Values (Instances haben keinen eigenen Value!) |
+Das texts()-Member läuft nur durch die mittels SMASH +von der Instance losgelösten Texte, und durch die sichtbaren Texte der Attribute, die dieser Instance zugewiesen wurden. +Um alle Texte einer Instance zu bearbeiten, müssen Sie eine Schleife +durch das texts()-Member der Instance selbst und +durch das texts()-Member des zu dem Gate der Instance gehörenden +Symbols bilden. +Wurden einer Instance Attribute zugewiesen, so liefert texts() deren Texte +so, wie sie momentan dargestellt werden. +
+Die column()- und row()-Members liefern die Spalten- bzw. Zeilenposition +innerhalb des Rahmens auf der Schaltplanseite, auf der diese +Instance platziert ist. +Falls es auf dieser Seite keinen Rahmen gibt, oder die Instance außerhalb des Rahmens liegt, +wird ein '?' (Fragezeichen) zurückgegeben. +Diese Members können nur in einem UL_SHEET-Kontext verwendet werden. +
+Das smashed-Member gibt Auskunft darüber, ob eine Instance gesmasht ist. +Diese Funktion kann auch verwendet werden um herauszufinden, ob es einen losgelösten +Platzhaltertext gibt, indem der Name des Platzhalters in eckigen Klammern angegeben +wird, wie in smashed["VALUE"]. Dies ist nützlich falls Sie einen solchen Text +mit dem MOVE-Befehl etwa durch MOVE R5>VALUE +selektieren wollen. Gültige Platzhalternamen sind "NAME", "VALUE", "Part" und "GATE", sowie die +Namen etwaiger benutzerdefinierter Attribute. +Groß-/Kleinschreibung spielt keine Rolle, und sie dürfen ein vorangestelltes +'>' Zeichen haben. +
+Das xrefs()-Member läuft durch die Gatter des Kontaktspiegels +dieser Instance. Diese sind nur dann von Bedeutung, wenn das ULP eine zeichnerische +Darstellung des Schaltplans erzeugt (wie etwa eine DXF-Datei). +
+schematic(S) { + S.parts(P) { + printf("Part: %s\n", P.name); + P.instances(I) { + if (I.sheet != 0) + printf("\t%s used on sheet %d\n", I.name, I.sheet); + } + } + } ++ + + +
+schematic(SCH) { + SCH.sheets(SH) { + SH.nets(N) { + N.segments(SEG) { + SEG.junctions(J) { + printf("Junction: (%d %d)\n", J.x, J.y); + } + } + } + } + } ++ + + +
angle | real (0.0...359.9) | |
layer | int | |
mirror | int | |
spin | int | |
text | UL_TEXT | |
x, y | int (Aufhängepunkt) | |
xref | int (0=normal, 1=Querverweis) |
wires() | UL_WIRE (siehe Anmerkung) |
+Die angle, layer, mirror und spin Members liefern +immer den selben Wert wie diejenigen des UL_TEXT-Objekts, das vom text Member +geliefert wird. Die x und y Members des Textes liefern etwas versetzte +Werte für Querverweis-Labels xref ungleich 0), ansonsten liefern sie die +gleichen Werte wie das UL_LABEL. +
+xref hat nur für Netz-Labels eine Bedeutung. Für Bus-Labels liefert es immer 0. +
+sheet(SH) { + SH.nets(N) { + N.segments(S) { + S.labels(L) { + printf("Label: %d %d '%s'", L.x, L.y, L.text.value); + } + } + } + } ++ + + +
color | int | |
fill | int | |
name | string (LAYER_NAME_LENGTH) | |
number | int | |
used | int (0=unbenutzt, 1=benutzt) | |
visible | int (0=off, 1=on) |
LAYER_NAME_LENGTH | max. empfohlene Länge eines Layer-Namens (wird nur für formatierte Ausgaben benutzt) | |
LAYER_TOP | Layer-Nummern | |
LAYER_BOTTOM | ||
LAYER_PADS | ||
LAYER_VIAS | ||
LAYER_UNROUTED | ||
LAYER_DIMENSION | ||
LAYER_TPLACE | ||
LAYER_BPLACE | ||
LAYER_TORIGINS | ||
LAYER_BORIGINS | ||
LAYER_TNAMES | ||
LAYER_BNAMES | ||
LAYER_TVALUES | ||
LAYER_BVALUES | ||
LAYER_TSTOP | ||
LAYER_BSTOP | ||
LAYER_TCREAM | ||
LAYER_BCREAM | ||
LAYER_TFINISH | ||
LAYER_BFINISH | ||
LAYER_TGLUE | ||
LAYER_BGLUE | ||
LAYER_TTEST | ||
LAYER_BTEST | ||
LAYER_TKEEPOUT | ||
LAYER_BKEEPOUT | ||
LAYER_TRESTRICT | ||
LAYER_BRESTRICT | ||
LAYER_VRESTRICT | ||
LAYER_DRILLS | ||
LAYER_HOLES | ||
LAYER_MILLING | ||
LAYER_MEASURES | ||
LAYER_DOCUMENT | ||
LAYER_REFERENCE | ||
LAYER_TDOCU | ||
LAYER_BDOCU | ||
LAYER_NETS | ||
LAYER_BUSSES | ||
LAYER_PINS | ||
LAYER_SYMBOLS | ||
LAYER_NAMES | ||
LAYER_VALUES | ||
LAYER_INFO | ||
LAYER_GUIDE | ||
LAYER_USER | niedrigste Nummer für benutzerdefinierte Layer (100) |
+board(B) { + B.layers(L) printf("Layer %3d %s\n", L.number, L.name); + } ++ + + +
description | string (siehe Anmerkung) | |
grid | UL_GRID | |
headline | string | |
name | string (LIBRARY_NAME_LENGTH, siehe Anmerkung) |
devices() | UL_DEVICE | |
devicesets() | UL_DEVICESET | |
layers() | UL_LAYER | |
packages() | UL_PACKAGE | |
symbols() | UL_SYMBOL |
LIBRARY_NAME_LENGTH | max. empfohlene Länge eines Bibliotheksnamens (wird nur für formatierte Ausgaben benutzt) |
+Das devices()-Member geht durch alle Package-Varianten und Technologien von +UL_DEVICESET in der Bibliothek, so dass alle möglichen Device-Variationen verfügbar werden. +Das devicesets()-Member geht nur durch die UL_DEVICESETs, die wiederum nach deren +UL_DEVICE-Member abgefragt werden können. +
+Wird die Bibliothek aus einem UL_BOARD- oder UL_SCHEMATIC-Kontext heraus angesprochen, liefert name +den reinen Bibliotheksnamen (ohne Extension). Ansonsten wird der volle Dateiname ausgegeben. +
+library(L) { + L.devices(D) printf("Dev: %s\n", D.name); + L.devicesets(D) printf("Dev: %s\n", D.name); + L.packages(P) printf("Pac: %s\n", P.name); + L.symbols(S) printf("Sym: %s\n", S.name); + } +schematic(S) { + S.libraries(L) printf("Library: %s\n", L.name); + } ++ + + +
class | UL_CLASS | |
column | string (see note) | |
name | string (NET_NAME_LENGTH) | |
row | string (see note) |
pinrefs() | UL_PINREF (siehe Anmerkung) | |
segments() | UL_SEGMENT (siehe Anmerkung) |
NET_NAME_LENGTH | max. empfohlene Länge eines Netznamens (wird nur für formatierte Ausgaben benutzt) |
+Die column()- und row()-Members liefern die Spalten- bzw. Zeilenpositionen +innerhalb des Rahmens auf der Schaltplanseite, auf der dieses Netz +liegt. Da ein Netz sich über einen bestimmten Bereich erstrecken kann, liefert jede dieser +Funktionen zwei durch ein Leerzeichen getrennte Werte zurück. Im Falle von column() +sind die die am weitesten links bzw. rechts liegende Spalte, die von diesem Netz berührt wird, +und bei row() ist es die am weitesten oben bzw. unten liegende Zeile. +Falls es auf dieser Seite keinen Rahmen gibt, wird "? ?" (zwei Fragezeichen) zurückgegeben. +Liegt irgend ein Punkt des Netzes außerhalb des Rahmens, so kann jeder der Werte '?' +(Fragezeichen) sein. +Diese Members können nur in einem UL_SHEET-Kontext verwendet werden. +
+schematic(S) { + S.nets(N) { + printf("Net: %s\n", N.name); + // N.segments(SEG) will NOT work here! + } + } +schematic(S) { + S.sheets(SH) { + SH.nets(N) { + printf("Net: %s\n", N.name); + N.segments(SEG) { + SEG.wires(W) { + printf("\tWire: (%d %d) (%d %d)\n", + W.x1, W.y1, W.x2, W.y2); + } + } + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string | |
library | string | |
name | string (PACKAGE_NAME_LENGTH) |
circles() | UL_CIRCLE | |
contacts() | UL_CONTACT | |
frames() | UL_FRAME | |
holes() | UL_HOLE | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
texts() | UL_TEXT (siehe Anmerkung) | |
wires() | UL_WIRE |
PACKAGE_NAME_LENGTH | max. empfohlene Länge eines Package-Namens (wird nur für formatierte Ausgaben benutzt) |
+Stammt das UL_PACKAGE aus einem UL_ELEMENT-Kontext, so durchläuft das texts()-Member +nur die nicht losgelösten Texte dieses Elements. +
+library(L) { + L.packages(PAC) { + printf("Package: %s\n", PAC.name); + PAC.contacts(C) { + if (C.pad) + printf("\tPad: %s, (%d %d)\n", + C.name, C.pad.x, C.pad.y); + else if (C.smd) + printf("\tSmd: %s, (%d %d)\n", + C.name, C.smd.x, C.smd.y); + } + } + } +board(B) { + B.elements(E) { + printf("Element: %s, Package: %s\n", E.name, E.package.name); + } + } ++ + + +
angle | real (0.0...359.9) | |
diameter[layer] | int | |
drill | int | |
drillsymbol | int | |
elongation | int | |
flags | int (PAD_FLAG_...) | |
name | string (PAD_NAME_LENGTH) | |
shape[layer] | int (PAD_SHAPE_...) | |
signal | string | |
x, y | int (Mittelpunkt, siehe Anmerkung) |
PAD_FLAG_STOP | Lötstopmaske generieren | |
PAD_FLAG_THERMALS | Thermals generieren | |
PAD_FLAG_FIRST | spezielle Form für "erstes Pad" verwenden |
+
PAD_SHAPE_SQUARE | square | |
PAD_SHAPE_ROUND | round | |
PAD_SHAPE_OCTAGON | octagon | |
PAD_SHAPE_LONG | long | |
PAD_SHAPE_OFFSET | offset | |
PAD_SHAPE_ANNULUS | annulus (nur in Verbindung mit Supply-Layern) | |
PAD_SHAPE_THERMAL | thermal (nur in Verbindung mit Supply-Layern) |
+
PAD_NAME_LENGTH | max. empfohlene Länge eines Pad-Namens (identisch mit CONTACT_NAME_LENGTH) |
+Durchmesser und Form des Pads hängen vom Layer ab für den es erzeugt werden soll, da diese Werte, +abhängig von den Design Rules, unterschiedlich sein können. +Wird als Index für das Data Member "diameter" oder "shape" einer der Layer +LAYER_TOP...LAYER_BOTTOM, LAYER_TSTOP oder LAYER_BSTOP angegeben, berechnet sich der Wert nach den +Vorgaben der Design Rules. Gibt man LAYER_PADS an, wird der in der Bibliothek definierte Wert +verwendet. +
+drillsymbol liefert die Nummer des Bohrsymbols, welches diesem Bohrdurchmesser +zugeordnet worden ist (siehe die Liste der definierten Bohrsymbole im Handbuch). +Ein Wert von 0 bedeutet, dass diesem Bohrdurchmesser kein Bohrsymbol zugeordnet ist. +
+angle gibt an um wieviel Grad das Pad gegen den Uhrzeigersinn um seinen +Mittelpunkt gedreht ist. +
+elongation ist nur für die Pad-Formen PAD_SHAPE_LONG und PAD_SHAPE_OFFSET gültig +und bestimmt um wieviel Prozent die lange Seite eines solchen Pads länger ist als +seine schmale Seite. Für alle anderen Pad-Formen liefert dieses Member den Wert 0. +
+Der Wert, den flags liefert, muss mit den PAD_FLAG_... Konstanten +maskiert werden um die einzelnen Flag-Einstellungen zu ermitteln, wie zum Beispiel in +
+if (pad.flags & PAD_FLAG_STOP) { + ... + } ++Falls Ihr ULP lediglich die Objekte darstellen soll, brauchen Sie sich nicht +explizit um diese Flags zu kümmern. Die diameter[] und shape[] +Members liefern die richtigen Daten; ist zum Beispiel PAD_FLAG_STOP +gesetzt, so liefert diameter[LAYER_TSTOP] den Wert 0, was +zur Folge haben sollte, dass in diesem Layer nichts gezeichnet wird. +Das flags Member ist hauptsächlich für ULPs gedacht, die Script-Dateien +erzeugen mit denen Bibliotheksobjekte kreiert werden. +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + if (C.pad) + printf("Pad: '%s', (%d %d), d=%d\n", + C.name, C.pad.x, C.pad.y, C.pad.diameter[LAYER_BOTTOM]); + } + } + } ++ + + +
attribute[] | string (siehe Anmerkung) | |
device | UL_DEVICE | |
deviceset | UL_DEVICESET | |
name | string (PART_NAME_LENGTH) | |
value | string (PART_VALUE_LENGTH) |
attributes() | UL_ATTRIBUTE (siehe Anmerkung) | |
instances() | UL_INSTANCE (siehe Anmerkung) |
PART_NAME_LENGTH | max. empfohlene Länge eines Part-Namens (wird nur für formatierte Ausgaben benutzt) | |
PART_VALUE_LENGTH | max. empfohlene Länge eines Part-Values (wird nur für formatierte Ausgaben benutzt) |
+Beim Durchlaufen der attributes() eines UL_PART haben nur die +name, value, defaultvalue und constant +Members des resultierenden UL_ATTRIBUTE gültige Werte. +
+Wenn sich Part in einem UL_SHEET-Kontext befindet, bearbeitet +Loop member instances() nur solche Instances, die tatsächlich +auf dieser Seite benutzt werden. +Wenn sich Part in einem UL_SCHEMATIC-Kontext befindet, geht die Schleife +durch alle Instances. +
+schematic(S) { + S.parts(P) printf("Part: %s\n", P.name); + } ++
+schematic(SCH) { + SCH.parts(P) { + if (P.attribute["REMARK"]) + printf("%s: %s\n", P.name, P.attribute["REMARK"]); + } + } ++ + + +
angle | real (0, 90, 180 und 270) | |
contact | UL_CONTACT (siehe Anmerkung) | |
direction | int (PIN_DIRECTION_...) | |
function | int (PIN_FUNCTION_FLAG_...) | |
length | int (PIN_LENGTH_...) | |
name | string (PIN_NAME_LENGTH) | |
net | string (siehe Anmerkung) | |
swaplevel | int | |
visible | int (PIN_VISIBLE_FLAG_...) | |
x, y | int (Anschlusspunkt) |
circles() | UL_CIRCLE | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
PIN_DIRECTION_NC | Not connected | |
PIN_DIRECTION_IN | Input | |
PIN_DIRECTION_OUT | Output (totem-pole) | |
PIN_DIRECTION_IO | In/Output (bidirectional) | |
PIN_DIRECTION_OC | Open Collector | |
PIN_DIRECTION_PWR | Power-Input-Pin | |
PIN_DIRECTION_PAS | Passiv | |
PIN_DIRECTION_HIZ | High-Impedance-Output | |
PIN_DIRECTION_SUP | Supply-Pin |
+
PIN_FUNCTION_FLAG_NONE | kein Symbol | |
PIN_FUNCTION_FLAG_DOT | Inverter-Symbol | |
PIN_FUNCTION_FLAG_CLK | Taktsymbol |
+
PIN_LENGTH_POINT | kein Wire | |
PIN_LENGTH_SHORT | 0.1-Inch-Wire | |
PIN_LENGTH_MIDDLE | 0.2-Inch-Wire | |
PIN_LENGTH_LONG | 0.3-Inch-Wire |
+
PIN_NAME_LENGTH | max. empfohlene Länge eines Pin-Namens (wird nur für formatierte Ausgaben benutzt) |
+
PIN_VISIBLE_FLAG_OFF | kein Name sichtbar | |
PIN_VISIBLE_FLAG_PAD | Pad-Name sichtbar | |
PIN_VISIBLE_FLAG_PIN | Pin-Name sichtbar |
+Die Koordinaten (und der Layer, im Falle eines SMD) des durch das +contact Data Member gelieferten Contacts hängen vom Kontext ab, +in dem es aufgerufen wird: +
+Das net Data Member liefert den Namen des Netzes, an das der Pin angeschlossen ist +(nur in einem UL_SCHEMATIC-Kontext verfügbar). +
+library(L) { + L.symbols(S) { + printf("Symbol: %s\n", S.name); + S.pins(P) { + printf("\tPin: %s, (%d %d)", P.name, P.x, P.y); + if (P.direction == PIN_DIRECTION_IN) + printf(" input"); + if ((P.function & PIN_FUNCTION_FLAG_DOT) != 0) + printf(" inverted"); + printf("\n"); + } + } + L.devices(D) { + D.gates(G) { + G.symbol.pins(P) { + if (!P.contact) + printf("Unconnected pin: %s/%s/%s\n", D.name, G.name, P.name); + } + } + } + } ++ + + +
instance | UL_INSTANCE | |
part | UL_PART | |
pin | UL_PIN |
+schematic(SCH) { + SCH.sheets(SH) { + printf("Sheet: %d\n", SH.number); + SH.nets(N) { + printf("\tNet: %s\n", N.name); + N.segments(SEG) { + SEG.pinrefs(P) { + printf("connected to: %s, %s, %s\n", + P.part.name, P.instance.name, P.pin.name); + } + } + } + } + } ++ + + +
isolate | int | |
layer | int | |
orphans | int (0=off, 1=on) | |
pour | int (POLYGON_POUR_...) | |
rank | int | |
spacing | int | |
thermals | int (0=off, 1=on) | |
width | int |
contours() | UL_WIRE (siehe Anmerkung) | |
fillings() | UL_WIRE | |
wires() | UL_WIRE |
POLYGON_POUR_SOLID | solid | |
POLYGON_POUR_HATCH | hatch |
+Wird das contours() Loop-Member ohne einem zweiten Parameter aufgerufen, +so läuft es durch alle Umriss-Linien, egal ob sie zu einem positiven oder negativen +Polygon gehören. Falls Sie daran interessiert sind, die positiven und negativen +Umriss-Linien getrennt voneienander zu erhalten, können Sie contours() +mit einem zusätzlichen Integer-Parameter aufrufen (siehe zweites Beispiel unten). +Das Vorzeichen dieses Parameters bestimmt, ob ein positives oder negatives Polygon +behandelt wird, und der Wert gibt den Index dieses Polygons an. Falls es kein +Polygon mit dem gegebenen Index gibt, wird die Anweisung nicht ausgeführt. +Ein weiterer Vorteil dieser Methode ist, dass Sie Anfang und Ende eines bestimmten +Polygons nicht selber (durch Vergleich von Koordinaten) bestimmen müssen. Für jeden +Index wird die Anweisung für alle Wires dieses Polygons ausgeführt. +Mit 0 als zweitem Parameter ist das Verhalten genau so, als wäre kein +zweiter Parameter angegeben worden. +
+Die Wires, die mit contours() erreicht werden, beginnen immer in einem +positiven Polygon. Um herauszufinden wo ein Teilpolygon endet und das nächste beginnt, +speichern Sie einfach die Koordinate (x1,y1) des ersten Wires und prüfen diese +gegenüber (x2,y2) jedes folgenden Wires. Sobald die beiden Werte identisch sind, +ist der letzte Wire des Teilpolygons gefunden. Es gilt immer, dass +der zweite Punkt (x2,y2) identisch mit dem ersten Punkt (x1,y1) des nächsten Wires +in diesem Teilpolygon ist. +
+Um herauszufinden ob man innerhalb bzw. ausserhalb der Polygons ist, nehmen +Sie einen beliebigen Umriss-Wire und stellen sich Sie vor, von dessen Punkt (x1,y1) +zum Punkt (x2,y2) zu sehen. Rechts vom Wire ist immer innerhalb des Polygons. +Hinweis: Wenn Sie einfach ein Polygon zeichnen wollen, brauchen Sie all +diese Details nicht. +
+board(B) { + B.signals(S) { + S.polygons(P) { + int x0, y0, first = 1; + P.contours(W) { + if (first) { + // a new partial polygon is starting + x0 = W.x1; + y0 = W.y1; + } + // ... + // do something with the wire + // ... + if (first) + first = 0; + else if (W.x2 == x0 && W.y2 == y0) { + // this was the last wire of the partial polygon, + // so the next wire (if any) will be the first wire + // of the next partial polygon + first = 1; + } + } + } + } + } ++
+
+board(B) { + B.signals(S) { + S.polygons(P) { + // handle only the "positive" polygons: + int i = 1; + int active; + do { + active = 0; + P.contours(W, i) { + active = 1; + // do something with the wire + } + i++; + } while (active); + } + } + } ++ + + +
angle | real (0.0...359.9) | |
layer | int | |
x1, y1 | int (linke untere Ecke) | |
x2, y2 | int (rechte obere Ecke) |
+angle gibt an um wieviel Grad das Rechteck gegen den Uhrzeigersinn um seinen +Mittelpunkt gedreht ist. Der Mittelpunkt ergibt sich aus (x1+x2)/2 und (y1+y2)/2. +
+board(B) { + B.rectangles(R) { + printf("Rectangle: (%d %d), (%d %d)\n", + R.x1, R.y1, R.x2, R.y2); + } + } ++ + + +
grid | UL_GRID | |
name | string (siehe Anmerkung) | |
xreflabel | string |
attributes() | UL_ATTRIBUTE (siehe Anmerkung) | |
classes() | UL_CLASS | |
layers() | UL_LAYER | |
libraries() | UL_LIBRARY | |
nets() | UL_NET | |
parts() | UL_PART | |
sheets() | UL_SHEET |
+Das xreflabel Member liefert den Format-String der für die Darstellung von +Querverweis-Labels benutzt wird. +
+Das Loop member attributes() geht durch die globalen Attribute. +
+schematic(S) { + S.parts(P) printf("Part: %s\n", P.name); + } ++ + + +
junctions() | UL_JUNCTION (siehe Anmerkung) | |
labels() | UL_LABEL | |
pinrefs() | UL_PINREF (siehe Anmerkung) | |
texts() | UL_TEXT (veraltet, siehe Anmerkung) | |
wires() | UL_WIRE |
+Das Loop member texts() wurde in früheren EAGLE-Versionen benutzt um durch die +Labels eines Segments zu gehen und ist nur noch aus Kompatibilitätsgründen vorhanden. +Es liefert den Text von Querverweis-Labels nicht an der richtigen Position. Benutzen +Sie das labels() Loop member um die Labels eines Segments anzusprechen. +
+schematic(SCH) { + SCH.sheets(SH) { + printf("Sheet: %d\n", SH.number); + SH.nets(N) { + printf("\tNet: %s\n", N.name); + N.segments(SEG) { + SEG.pinrefs(P) { + printf("connected to: %s, %s, %s\n", + P.part.name, P.instance.name, P.pin.name); + } + } + } + } + } ++ + + +
area | UL_AREA | |
number | int |
busses() | UL_BUS | |
circles() | UL_CIRCLE | |
frames() | UL_FRAME | |
nets() | UL_NET | |
parts() | UL_PART | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
+schematic(SCH) { + SCH.sheets(S) { + printf("Sheet: %d\n", S.number); + } + } ++ + + +
airwireshidden | int | |
class | UL_CLASS | |
name | string (SIGNAL_NAME_LENGTH) |
contactrefs() | UL_CONTACTREF | |
polygons() | UL_POLYGON | |
vias() | UL_VIA | |
wires() | UL_WIRE |
SIGNAL_NAME_LENGTH | max. empfohlene Länge eines Signalnamens (wird nur für formatierte Ausgaben benutzt) |
+board(B) { + B.signals(S) printf("Signal: %s\n", S.name); + } ++ + + +
angle | real (0.0...359.9) | |
dx[layer], dy[layer] | int (size) | |
flags | int (SMD_FLAG_...) | |
layer | int (siehe Anmerkung) | |
name | string (SMD_NAME_LENGTH) | |
roundness | int (siehe Anmerkung) | |
signal | string | |
x, y | int (Mittelpunkt, siehe Anmerkung) |
SMD_FLAG_STOP | Lötstopmaske generieren | |
SMD_FLAG_THERMALS | Thermals generieren | |
SMD_FLAG_CREAM | Lotpastenmaske generieren |
+
SMD_NAME_LENGTH | max. empfohlenen Länge eines Smd-Namens (identisch mit CONTACT_NAME_LENGTH) |
+angle gibt an um wieviel Grad das Smd gegen den Uhrzeigersinn um seinen +Mittelpunkt gedreht ist. +
+Der Wert, den flags liefert, muss mit den SMD_FLAG_... Konstanten +maskiert werden um die einzelnen Flag-Einstellungen zu ermitteln, wie zum Beispiel in +
+if (smd.flags & SMD_FLAG_STOP) { + ... + } ++Falls Ihr ULP lediglich die Objekte darstellen soll, brauchen Sie sich nicht +explizit um diese Flags zu kümmern. Die dx[] und dy[] +Members liefern die richtigen Daten; ist zum Beispiel SMD_FLAG_STOP +gesetzt, so liefert dx[LAYER_TSTOP] den Wert 0, was +zur Folge haben sollte, dass in diesem Layer nichts gezeichnet wird. +Das flags Member ist hauptsächlich für ULPs gedacht, die Script-Dateien +erzeugen mit denen Bibliotheksobjekte kreiert werden. +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + if (C.smd) + printf("Smd: '%s', (%d %d), dx=%d, dy=%d\n", + C.name, C.smd.x, C.smd.y, C.smd.dx, C.smd.dy); + } + } + } ++ + + +
area | UL_AREA | |
library | string | |
name | string (SYMBOL_NAME_LENGTH) |
circles() | UL_CIRCLE | |
frames() | UL_FRAME | |
rectangles() | UL_RECTANGLE | |
pins() | UL_PIN | |
polygons() | UL_POLYGON | |
texts() | UL_TEXT (siehe Anmerkung) | |
wires() | UL_WIRE |
SYMBOL_NAME_LENGTH | max. empfohlene Länge eines Symbol-Namens (wird nur für formatierte Ausgaben benutzt) |
+library(L) { + L.symbols(S) printf("Sym: %s\n", S.name); + } ++ + + +
angle | real (0.0...359.9) | |
font | int (FONT_...) | |
layer | int | |
mirror | int | |
ratio | int | |
size | int | |
spin | int | |
value | string | |
x, y | int (Aufhängepunkt) |
wires() | UL_WIRE (siehe Anmerkung) |
FONT_VECTOR | Vector-Font | |
FONT_PROPORTIONAL | Proportional-Font | |
FONT_FIXED | Fixed-Font |
+Wurde der UL_TEXT aus einem UL_ELEMENT- oder UL_INSTANCE-Kontext angesprochen, so liefern +die Members die tatsächlichen Werte, so wie sie in der Board- oder Schaltplan-Zeichnung zu +finden sind. +
+board(B) { + B.texts(T) { + printf("Text: %s\n", T.value); + } + } ++ + + +
diameter[layer] | int | |
drill | int | |
drillsymbol | int | |
end | int | |
flags | int (VIA_FLAG_...) | |
shape[layer] | int (VIA_SHAPE_...) | |
start | int | |
x, y | int (Mittelpunkt) |
VIA_FLAG_STOP | Lötstopmaske immer generieren |
+
VIA_SHAPE_SQUARE | square | |
VIA_SHAPE_ROUND | round | |
VIA_SHAPE_OCTAGON | octagon | |
VIA_SHAPE_ANNULUS | annulus | |
VIA_SHAPE_THERMAL | thermal |
+Beachten Sie bitte, dass diameter und shape auf jeden Fall den +Durchmesser bzw. die Form zurückliefern, welche ein Via in dem gegebenen Layer hätte, +selbst wenn das konkrete Via diesen Layer gar nicht überdeckt (oder wenn dieser Layer +im Layer-Setup überhaupt nicht benutzt wird). +
+start und end liefern den Layer, in dem dieses Via beginnt bzw. endet. +Der Wert von start ist dabei immer kleiner als der von end. +
+drillsymbol liefert die Nummer des Bohrsymbols, welches diesem Bohrdurchmesser +zugeordnet worden ist (siehe die Liste der definierten Bohrsymbole im Handbuch). +Ein Wert von 0 bedeutet, dass diesem Bohrdurchmesser kein Bohrsymbol zugeordnet ist. +
+board(B) { + B.signals(S) { + S.vias(V) { + printf("Via: (%d %d)\n", V.x, V.y); + } + } + } ++ + + +
arc | UL_ARC | |
cap | int (CAP_...) | |
curve | real | |
layer | int | |
style | int (WIRE_STYLE_...) | |
width | int | |
x1, y1 | int (Anfangspunkt) | |
x2, y2 | int (Endpunkt) |
pieces() | UL_WIRE (siehe Anmerkung) |
CAP_FLAT | flache Kreisbogen-Enden | |
CAP_ROUND | runde Kreisbogen-Enden | |
WIRE_STYLE_CONTINUOUS | durchgezogen | |
WIRE_STYLE_LONGDASH | lang gestrichelt | |
WIRE_STYLE_SHORTDASH | kurz gestrichelt | |
WIRE_STYLE_DASHDOT | Strich-Punkt-Linie |
+Der cap Parameter ist nur für echte Kreisbögen von Bedeutung und liefert für gerade +Wires immer CAP_ROUND. +
+Ob ein UL_WIRE ein Kreisbogen ist oder nicht kann durch Abfragen des boolschen Rückgabewertes +des arc Data Members herausgefunden werden. Falls dieses 0 liefert, +liegt ein gerader Wire vor, ansonsten ein Kreisbogen. Liefert arc nicht 0 +so darf es weiter dereferenziert werden um die für einen UL_ARC +spezifischen Parameter Start- und Endwinkel, Radius und Mittelpunkt zu erfragen. +Diese zusätzlichen Parameter sind normalerweise nur von Bedeutung wenn der Kreisbogen +gezeichnet oder anderweitig verarbeitet werden soll, und dabei die tatsächliche Form +eine Rolle spielt. +
+board(B) { + B.wires(W) { + printf("Wire: (%d %d) (%d %d)\n", + W.x1, W.y1, W.x2, W.y2); + } + } ++ + + +
+Es gibt drei Arten von Definitionen: +
+Der Gültigkeitsbereich einer Konstanten- oder +Variablen-Definition reicht von der Zeile, in der sie definiert +wurde, bis zum Ende des gegenwärtigen +Blocks, oder bis zum Ende des +User-Language-Programms, wenn die Definition ausserhalb aller Blöcke steht. +
+Der Gültigkeitsbereich einer Funktions-Definition reicht
+von der schließenden geschweiften Klammer
+(}) des Funktionsrumpfes bis zum Ende des User-Language-Programms.
+
+
+
+
+Konstanten kann man auch mit bestimmten Werten initialisieren, wie in
+Konstanten-Definitionen
+Konstanten werden mit Hilfe des Schlüsselworts
+enum definiert, wie in
+
+enum { a, b, c };
+
+womit man den drei Konstanten a, b und c
+die Werte 0, 1 und 2 zuweisen würde.
+
+enum { a, b = 5, c };
+
+wo a den Wert 0, b den Wert 5 und
+c den Wert 6 erhält.
+
+
+
+Variablen-Definitionen
+Die allgemeine Syntax einer Variablen-Definition ist
+
+[numeric] type identifier [= initializer][, ...];
+
+wobei type ein
+Daten- oder
+Objekt-Typ ist,
+identifier ist der Name der Variablen, und initializer
+ist ein optionaler Initialisierungswert.
+
+Mehrfach-Variablen-Definitionen desselben Typs werden durch +Kommas (,) getrennt. +
+Wenn auf identifier ein Paar +eckiger Klammern ([]) folgt, +wird ein Array von Variablen des gegebenen Typs definiert. +Die Größe des Arrays wird zur Laufzeit automatisch bestimmt. +
+Das optionale Schlüsselwort numeric kann mit +String-Arrays verwendet werden, +um sie alphanumerisch mit der Funktion +sort() sortieren zu lassen. +
+Standardmäßig (wenn kein Initializer vorhanden ist), +werden +Daten-Variablen auf 0 gesetzt +(oder "", falls es sich um einen String handelt), und +Objekt -Variablen werden mit +"invalid" initialisiert. +
int i; | definiert eine int-Variable mit dem Namen i | |
string s = "Hello"; | definiert eine string-Variable mit dem Namen s und initialisiert sie mit "Hello" | |
real a, b = 1.0, c; | definiert drei real-Variablen mit den Namen a, b und c und initialisiert b mit dem Wert 1.0 | |
int n[] = { 1, 2, 3 }; | definiert ein Array of int und initialisiert die ersten drei Elemente mit 1, 2 und 3 | |
numeric string names[]; | definiert ein string-Array das alphanumerisch sortiert werden kann | |
UL_WIRE w; | definiert ein UL_WIRE-Objekt mit dem Namen w |
+UL_SIGNAL signals[]; +... +UL_SIGNAL s = signals[0]; +printf("%s", s.name); ++ + + +
+Die allgemeine Syntax einer Funktions-Definition lautet +
+type identifier(parameters) +{ + statements +} ++wobei type ein +Daten- oder +Objekt-Typ ist, +identifier der Name einer Funktion, +parameters eine durch Kommas getrennte Liste +von Parameter-Definitionen und +statements eine Reihe von Statements. +
+Funktionen die keinen Wert zurückgeben, haben den Typ void. +
+Eine Funktion muss definiert werden, bevor sie aufgerufen werden kann, +und Funktionsaufrufe können nicht rekursiv sein (eine Funktion kann sich nicht +selbst aufrufen). +
+Die Statements im Funktionsrumpf können die Werte der Parameter ändern, +das hat aber keinen Einfluss auf die Argumente des +Funktionsaufrufs. +
+Die Ausführung einer Funktion kann mit dem +return-Statement beendet werden. +Ohne return-Statement wird der Funktionsrumpf bis zu seiner +schließenden geschweiften Klammer +(}) ausgeführt. +
+Ein Aufruf der exit()-Funktion beendet +das gesamte User-Language-Programm. +
+Kommandozeilen-Argumente sind für das Programm über die globalen +Builtin-Variablen argc und argv +verfügbar. +
+int CountDots(string s) +{ + int dots = 0; + for (int i = 0; s[i]; ++i) + if (s[i] == '.') + ++dots; + return dots; +} +string dotted = "This.has.dots..."; +output("test") { + printf("Number of dots: %d\n", + CountDots(dotted)); + } ++ + + +
+
Unary | ! ~ + - ++ -- | |
Multiplicative | * / % | |
Additive | + - | |
Shift | << >> | |
Relational | < <= > >= | |
Equality | == != | |
Bitwise AND | & | |
Bitwise XOR | ^ | |
Bitwise OR | | | |
Logical AND | && | |
Logical OR | || | |
Conditional | ?: | |
Assignment | = *= /= %= += -= &= ^= |= <<= >>= | |
Comma | , |
+Die Assoziativität ist links nach rechts für alle Operatoren +ausser für +Unary, Conditional und Assignment, +die rechts-nach-links-assoziativ sind. +
+Die normale Operator-Priorität kann durch den Gebrauch von
+runden Klammern geändert werden.
+
+
+
+
+Bitweise Operatoren
+Bitweise Operatoren kann man nur auf die Datentypen
+char und
+int anwenden.
+
Unary | ||
~ | Bitwise (1's) complement | |
Binary | ||
<< | Shift left | |
>> | Shift right | |
& | Bitwise AND | |
^ | Bitwise XOR | |
| | Bitwise OR | |
Assignment | ||
&= | Assign bitwise AND | |
^= | Assign bitwise XOR | |
|= | Assign bitwise OR | |
<<= | Assign left shift | |
>>= | Assign right shift |
+
Unary | ||
! | Logical NOT | |
Binary | ||
&& | Logical AND | |
|| | Logical OR |
+Die Verwendung eines +String-Ausdrucks mit einem +logischen Operator prüft, ob ein String leer ist. +
+Die Verwendung eines
+Objekt-Typs mit einem logischen Operator
+prüft, ob dieses Objekt gültige Daten enthält.
+
+
+
+Vergleichs-Operatoren
+Vergleichs-Operatoren können mit
+Ausdrücken von jedem Datentyp angewendet
+werden, ausgenommen
+Objekt-Typen.
+
+
< | Kleiner als | |
<= | Kleiner gleich | |
> | Größer als | |
>= | Größer gleich | |
== | Gleich | |
!= | Ungleich |
+
?: | Conditional | |
, | Komma |
+Der Conditional-Operator wird verwendet, um eine Entscheidung +innerhalb eines Ausdrucks zu treffen, wie in +
+int a; +// ...code that calculates 'a' +string s = a ? "True" : "False"; ++was folgender Konstruktion entspricht +
+int a; +string s; +// ...code that calculates 'a' +if (a) + s = "True"; +else + s = "False"; ++aber der Vorteil des Conditional-Operators ist, dass er innerhalb des +Ausdrucks verwendet werden kann. +
+Der Komma-Operator wird verwendet, um eine Sequenz von +Ausdrücken von links nach rechts auszuwerten; Typ und Wert des rechten +Operanden werden als Ergebnis verwendet. +
+Beachten Sie, dass Argumente in einem Funktionsaufruf und
+Mehrfach-Variablen-Deklarationen ebenfalls Kommas als Trennzeichen verwenden.
+Dabei handelt es sich aber nicht um den Komma-Operator!
+
+
+
+
+Arithmetische Operatoren
+Arithmetische Operatoren lassen sich auf die Datentypen
+char,
+int und
+real
+anwenden (ausser ++, --, % und %=).
+
Unary | ||
+ | Unary plus | |
- | Unary minus | |
++ | Pre- oder postincrement | |
-- | Pre- oder postdecrement | |
Binary | ||
* | Multiply | |
/ | Divide | |
% | Remainder (modulus) | |
+ | Binary plus | |
- | Binary minus | |
Assignment | ||
= | Simple assignment | |
*= | Assign product | |
/= | Assign quotient | |
%= | Assign remainder (modulus) | |
+= | Assign sum | |
-= | Assign difference |
+Siehe auch String-Operatoren
+
+
+
+
+String-Operatoren
+String-Operatoren lassen sich mit den Datentypen
+char,
+int und
+string anwenden.
+Der linke Operand muss immer vom Typ
+string sein.
+
Binary | ||
+ | Concatenation | |
Assignment | ||
= | Simple assignment | |
+= | Append to string |
+Der +-Operator fasst zwei Strings zusammen oder +fügt ein Zeichen am Ende eines Strings hinzu und +gibt den resultierenden String zurück. +
+Der +=-Operator fügt einen String oder eine Zeichen an das Ende +eines gegebenen Stings an. +
+Siehe auch Arithmetische Operatoren
+
+
+
+Ausdrücke
+Es gibt folgende Ausdrücke:
+
+Ausdrücke können mit Hilfe von
+runden Klammern gruppiert werden
+und dürfen rekursiv aufgerufen werden, was bedeutet, dass
+ein Ausdruck aus Unterausdrücken bestehen darf.
+
+
+
+Arithmetischer Ausdruck
+Ein arithmetischer Ausdruck ist jede Kombination von
+numerischen Operanden und
+arithmetischem Operator oder
+bitweisem Operator.
+
+a + b +c++ +m << 1 ++ + + +
+a = x + 42 +b += c +s = "Hello" ++ + + +
+s + ".brd" +t + 'x' ++ + + +
+Komma-Ausdrücke werden von links nach rechts ausgewertet, und +das Ergebnis eines Komma-Ausdrucks ist der Typ und der Wert des +am weitesten rechts stehenden Ausdrucks. +
+i++, j++, k++ ++ + + +
+int a; +// ...code that calculates 'a' +string s = a ? "True" : "False"; ++ + + +
+int p = strchr(s, 'b'); ++ + + +
+Compound-Statements können beliebig verschachtelt werden.
+
+
+
+Expression-Statement (Ausdrucksanweisung)
+Ein Expression-Statement ist jeder beliebige
+Ausdruck, gefolgt von einem
+Semikolon.
+
+Ein Expression-Statement wird ausgeführt, indem der Ausdruck ausgewertet +wird. Alle Nebeneffekte dieser Auswertung sind vollständig abgearbeitet, bevor +das nächste +Statement ausgeführt wird. +Die meisten Expression-Statements sind +Zuweisungen oder +Funktionsaufrufe. +
+Ein Spezialfall ist das leere Statement, das nur aus einem
+Semikolon besteht.
+Ein leeres Statement tut nichts, aber es ist nützlich in den Fällen,
+in denen die ULP-Syntax ein Statement erwartet, aber Ihr Programm
+keines benötigt.
+
+
+
+
+Iteration-Statements sind
+Control-Statements (Steueranweisungen)
+Control-Statements werden verwendet, um den Programmfluss
+zu steuern.
+
+do...while
+for
+while
+
+Selection-Statements sind
+
+if...else
+switch
+
+Jump-Statements sind
+
+break
+continue
+return
+
+
+
+
+break
+Das break-Statement hat die allgemeine Syntax
+
+break;
+
+und bricht sofort das nächste einschließende
+do...while-,
+for-,
+switch- oder
+while-Statement ab.
+Dies gilt ebenso für loop members von Objekt-Typen.
+
+Da all diese Statements gemischt und verschachtelt werden können,
+stellen Sie bitte sicher, dass break vom korrekten Statement
+aus ausgeführt wird.
+
+
+
+continue
+Das continue-Statement hat die allgemeine Syntax
+
+continue;
+
+und transferiert die Steuerung direkt zur Testbedingung des
+nächsten einschließenden
+do...while-,
+while-, oder
+for-Statements oder zum Increment-Ausdruck
+des nächsten einschließenden
+for-Statements.
+
+Da all diese Statements gemischt und verschachtelt werden können,
+stellen Sie bitte sicher, dass continue das richtige Statement
+betrifft.
+
+
+
+
+condition wird nach der ersten Ausführung von
+statement getestet, was bedeutet, dass das Statement
+wenigstens einmal ausgeführt wird.
+
+Wenn kein
+break oder
+return
+im statement vorkommt, muss das statement
+den Wert der condition verändern, oder condition selbst
+muss sich während der Auswertung ändern, um eine Endlosschleife zu
+vermeiden.
+
+Der Initialisierungs-Ausdruck init initialsiert normalerweise
+einen oder mehrere Schleifenzähler. Er kann auch eine neue Variable
+als Schleifenzähler definieren. Eine solche Variable ist bis zum
+Ende des aktiven Blocks gültig.
+
+Der else-Teil bezieht sich immer auf das letzte if
+ohne else.
+Wenn Sie etwas anderes wollen, müssen Sie
+geschweifte Klammern verwenden, um
+die Statements zu gruppieren, wie in
+do...while
+Das do...while-Statement hat die allgemeine Syntax
+
+do statement while (condition);
+
+und führt das statement aus, bis der condition-Ausdruck
+null wird.
+Beispiel
+
+string s = "Trust no one!";
+int i = -1;
+do {
+ ++i;
+ } while (s[i]);
+
+
+
+
+for
+Das for-Statement hat die allgemeine Syntax
+
+for ([init]; [test]; [inc])-Statement
+
+und führt folgende Schritte aus:
+
+
+Wenn es kein
+break oder
+return
+im statement gibt, muss der inc-Ausdruck (oder das
+statement) den Wert des test-Ausdrucks beeinflussen,
+oder test selbst muss sich während der Auswertung ändern, um
+eine Endlosschleife zu vermeiden.
+Beispiel
+
+string s = "Trust no one!";
+int sum = 0;
+for (int i = 0; s[i]; ++i)
+ sum += s[i]; // sums up the characters in s
+
+
+
+
+if...else
+Das if...else-Statement hat die allgemeine Syntax
+
+if (expression)
+ t_statement
+[else
+ f_statement]
+
+Der bedingte Ausdruck wird ausgewertet und, wenn der Wert ungleich
+null ist, wird t_statement ausgeführt.
+Andernfalls wird f_statement ausgeführt, sofern der
+else-Teil vorhanden ist.
+
+if (a == 1) {
+ if (b == 1)
+ printf("a == 1 and b == 1\n");
+ }
+else
+ printf("a != 1\n");
+
+
+
+
+return
+Eine Funktion mit einem Return-Typ
+ungleich void muss mindestens ein return-Statement
+mit der Syntax
+
+return expression; ++enthalten, wobei +die Auswertung von expression einen Wert ergeben muss, +der kompatibel ist mit dem Return-Typ der Funktion. +
+Wenn die Funktion vom Typ void ist, kann ein return-Statement
+ohne expression verwendet werden, um vom Funktionsaufruf zurückzukehren.
+
+
+
+
+Jedes case_statement kann mit einem oder mehreren case-Labels
+versehen sein.
+Die Auswertung des Ausdrucks case_exp jedes case-Labels muss
+einen konstanten Integer-Wert ergeben, der innerhalb des umschließenden
+switch-Statements nur einmal vorkommt.
+
+Es darf höchstens ein default-Label vorkommen.
+
+Nach der Auswertung von sw_exp werden die case_exp-Ausdrücke
+auf Übereinstimmung geprüft. Wenn eine Übereinstimmung gefunden wurde,
+wird die Steuerung zum case_statement mit dem entsprechenden
+case-Label transferiert.
+
+Wird keine Übereinstimmung gefunden und gibt es ein default-Label,
+dann erhält def_statement die Steuerung.
+Andernfalls wird kein Statement innerhalb der
+switch-Anweisung ausgeführt.
+
+Die Programmausführung wird nicht beeinflusst, wenn case- und
+default-Labels auftauchen. Die Steuerung wird einfach an das
+folgende Statement übergeben.
+
+Um die Programmausführung am Ende einer Gruppe von Statements für
+ein bestimmtes
+case zu stoppen, verwenden Sie das break-Statement.
+
+condition wird vor der erstmöglichen Ausführung
+von statement getestet, was bedeutet, dass das Statement
+überhaupt nicht ausgeführt wird, wenn condition von Anfang an
+null ist.
+
+Wenn kein
+break oder
+return
+im statement vorkommt, muss das statement
+den Wert der condition verändern, oder condition selbst
+muss sich während der Auswertung ändern, um eine Endlosschleife zu
+vermeiden.
+
+Viele Objekt-Typen haben ihren
+eigenen Konstanten-Bereich, in dem die Builtin-Constants
+für das betreffende Objekt aufgelistet sind (siehe
+z.B. UL_PIN).
+
+Die folgenden Builtin-Constants sind zusätzlich zu denen definiert,
+die für die einzelnen Objekt-Typen aufgeführt sind:
+
+switch
+Das switch-Statement hat die allgemeine Syntax
+
+switch (sw_exp) {
+ case case_exp: case_statement
+ ...
+ [default: def_statement]
+ }
+
+und erlaubt die Übergabe der Steuerung an eines von mehreren
+case-Statements (mit "case" als Label), abhängig vom Wert des Ausdrucks
+sw_exp (der vom Integral-Typ sein muss).
+Beispiel
+
+string s = "Hello World";
+int vowels = 0, others = 0;
+for (int i = 0; s[i]; ++i)
+ switch (toupper(s[i])) {
+ case 'A':
+ case 'E':
+ case 'I':
+ case 'O':
+ case 'U': ++vowels;
+ break;
+ default: ++others;
+ }
+printf("There are %d vowels in '%s'\n", vowels, s);
+
+
+
+
+while
+Das while-Statement hat die allgemeine Syntax
+
+while (condition) statement
+
+und führt statement so lange aus, wie der condition-Ausdruck
+ungleich null ist.
+Beispiel
+
+string s = "Trust no one!";
+int i = 0;
+while (s[i])
+ ++i;
+
+
+
+
+Builtins
+Builtins sind Konstanten, Variablen, Funktionen und
+Statements, die zusätzliche Informationen liefern
+und die Manipulation der Daten erlauben.
+
+
+
+
+Builtin-Constants
+Builtin-Constants liefern Informationen über
+Objekt-Parameter, wie die maximale empfohlene Namenslänge, Flags und so weiter.
+
EAGLE_VERSION | EAGLE-Programm-Versionsnummer (int) | |
EAGLE_RELEASE | EAGLE-Programm-Release-Nummer (int) | |
EAGLE_SIGNATURE | ein String der EAGLE-Programmnamen, -Version und -Copyright-Information enthält | |
REAL_EPSILON | die minimale positive real Zahl, so dass 1.0 + REAL_EPSILON != 1.0 | |
REAL_MAX | der größte mögliche real Wert | |
REAL_MIN | der kleinste mögliche (positive!) real Wert die kleinste darstellbare Zahl ist -REAL_MAX | |
INT_MAX | der größte mögliche int Wert | |
INT_MIN | der kleinste mögliche int Wert | |
PI | der Wert von "pi" (3.14..., real) | |
usage | ein string der den Text der #usage-Direktive enthält |
+Diese Builtin-Constants enthalten die Directory-Pfade, die im +Directories-Dialog definiert wurden, wobei etwaige spezielle +Variablen ($HOME und $EAGLEDIR) durch ihre aktuellen Werte ersetzt wurden. +Da jeder Pfad aus mehreren Directories bestehen kann, sind diese Konstanten string-Arrays +mit jeweils einem einzelnen Directory in jedem Eintrag. Der erste leere Eintrag bedeutet das Ende +des Pfades: +
+
path_lbr[] | Libraries | |
path_dru[] | Design Rules | |
path_ulp[] | User Language Programs | |
path_scr[] | Scripts | |
path_cam[] | CAM Jobs | |
path_epf[] | Projects |
+Wenn Sie diese Konstanten dazu verwenden, einen vollständigen Dateinamen zu bilden, so +müssen Sie ein Directory-Trennzeichen benutzen, wie etwa in +
+string s = path_lbr[0] + '/' + "mylib.lbr"; ++
+Die im Moment durch den USE-Befehl benutzten Bibliotheken: +
+
used_libraries[] |
+
int argc | Anzahl der Argumente, die an den RUN Befehl übergeben wurden | |
string argv[] | Argumente, die an den RUN-Befehl übergeben wurden (argv[0] ist der volle ULP-Datei-Name) |
+Sie können auch eigene Funktionen +definieren und sie dazu verwenden, um Ihre User-Language-Programme zu +strukturieren. +
+Builtin-Functions sind in folgende Kategorien eingeteilt: +
+Die folgenden Character-Funktionen sind verfügbar: +
isalnum | Buchstaben (A bis Z oder a bis z) oder Digits (0 bis 9) | |
isalpha | Buchstaben (A bis Z oder a bis z) | |
iscntrl | Delete-Zeichen oder normale Steuerzeichen (0x7F oder 0x00 bis 0x1F) | |
isdigit | Digits (0 bis 9) | |
isgraph | Druckbare Zeichen (ausser Leerzeichen) | |
islower | Kleinbuchstaben (a bis z) | |
isprint | Druckbare Zeichen (0x20 bis 0x7E) | |
ispunct | Punctuation-Zeichen (iscntrl oder isspace) | |
isspace | Space, Tab, Carriage Return, New Line, Vertical Tab oder Formfeed (0x09 bis 0x0D, 0x20) | |
isupper | Großbuchstaben (A bis Z) | |
isxdigit | Hex-Digits (0 bis 9, A bis F, a bis f) |
+char c = 'A'; +if (isxdigit(c)) + printf("%c is hex\n", c); +else + printf("%c is not hex\n", c); ++ + + +
+Folgende Datei-Funktionen sind verfügbar: +
+fileerror prüft den Status beliebiger I/O-Operation, die seit +dem letzten Aufruf dieser Funktion ausgeführt wurden und gibt 0 zurück, +wenn alles in Ordnung war. Verursachte eine der I/O-Operationen einen Fehler, +wird ein Wert ungleich 0 ausgegeben. +
+Vor der Ausführung von I/O-Operationen sollten Sie mit fileerror den +Fehlerstatus zurücksetzten. Nach der Ausführung der I/O-Operationen rufen Sie +fileerrorerneut auf, um zu prüfen ob alles in Ordnung war. +
+Wenn fileerror einen Wert ungleich 0 ausgibt (und so einen Fehler anzeigt), +wird dem Benutzer eine Fehlermeldung angezeigt. +
+fileerror(); +output("file.txt", "wt") { + printf("Test\n"); + } +if (fileerror()) + exit(1); ++ + + +
+fileglob sucht in einem Verzeichnis nach pattern. +
+pattern kann '*' und '?' als Platzhalter enthalten. +Endet pattern mit einem '/', wird der Inhalt des angegebenen Verzeichnis zurückgegeben. +
+Namen die im resultierenden array mit einem '/' enden, sind Verzeichnisnamen. +
+Das array ist alphabetisch sortiert, die Verzeichnisse kommen zuerst. +
+Die Sondereinträge '.' und '..' (für das aktuelle und das übergeordnete Verzeichnis) +werden nie in array geschrieben. +
+Wenn pattern nicht gefunden wird, oder wenn Sie kein Recht haben, das angegebene Verzeichnis +zu durchsuchen, ist das array leer. +
+Das Pfad-Trennzeichen in array ist immer ein Forward-Slash (Schrägstrich).
+So ist sichergestellt, dass User-Language-Progamme betriebssystemunabhängig arbeiten.
+In pattern wird der backslash ('\') auch als Pfad-Trennzeichen behandelt.
+ +Die Sortierreihenfolge unter Windows unterscheidet nicht zwischen Groß- und Kleinschreibung. + |
+string a[]; +int n = fileglob(a, "*.brd"); ++ + + +
+if (board) board(B) { + output(filesetext(B.name, ".out")) { + ... + } + } ++ + + +
+board(B) + printf("Board: %s\nSize: %d\nTime: %s\n", + B.name, filesize(B.name), + t2string(filetime(B.name))); ++ + + +
+Folgendes Datei-Einlesen ist möglich: +
+Wenn dest ein Character-Array ist, werden Binär-Daten aus der Datei ausgelesen. +Der Rückgabewert entspricht dann der Anzahl der Bytes, die in das Character-Array +eingelesen wurden (das entspricht der Dateigröße). +
+Wenn dest ein String-Array ist, wird die Datei als Textdatei gelesen (eine Zeile +pro Array-Member). Der Rückgabewert zeigt die Anzahl der Zeilen, die in das Array +eingelesen wurden. Newline-Zeichen werden nicht berücksichtigt. +
+Wenn dest ein String ist, wird die ganze Datei in diesen String eingelesen. Der +Rückgabewert ist die Länge des Strings (die nicht unbedingt der Dateigröße entsprechen +muss, wenn das Betriebssystem Textdateien mit "cr/lf" anstatt "newline" am Zeilenende +speichert). +
+char b[]; +int nBytes = fileread(b, "data.bin"); +string lines[]; +int nLines = fileread(lines, "data.txt"); +string text; +int nChars = fileread(text, "data.txt"); ++ + + +
+Die folgenden mathematischen Funktionen sind verfügbar: +
+real x = -1.0; +real r = sqrt(2 * x); ++zur Fehlermeldung +
+Invalid argument in call to 'sqrt(-2)' ++ + + +
+Der Return-Typ dieser Funktionen ist identisch mit dem größeren Typ der Argumente. +type muss +char, +int oder +real sein. +
+real x = 2.567, y = 3.14; +printf("The maximum is %f\n", max(x, y)); ++ + + +
+real x = 2.567; +printf("The rounded value of %f is %f\n", x, round(x)); ++ + + +
PI | der Wert von "pi" (3.14...) |
+real x = PI / 2; +printf("The sine of %f is %f\n", x, sin(x)); ++ + + +
+real x = 2.1; +printf("The square root of %f is %f\n", x, sqrt(x)); ++ + + +
+Die folgenden sonstigen Funktionen sind verfügbar: +
+ + + +
+Die exit-Funktion beendet die Ausführung des User-Language-Programms.
+Wird result (integer) angegeben, wird es als Rückgabewert
+des Programms benutzt.
+Wird ein command-String angegeben, wird dieser Befehl genauso ausgeführt, als
+wäre über die Kommandozeile direkt nach dem RUN-Befehl eingegeben worden. In diesem
+Fall wird der Rückgabewert des ULPs auf EXIT_SUCCESS gesetzt.
+
EXIT_SUCCESS | Rückgabewert für erfolgreiche Programmausführung (Wert 0) | |
EXIT_FAILURE | Rückgabewert für fehlerhafte Programmausführung (Wert -1) |
+In dem folgenden Beispiel sind alle im ULP verwendeten Strings im Array I18N[] +aufgelistet, beginnend mit einem String der die verschiedenen Sprachcodes enthält +die dieses ULP unterstützt. Beachten Sie die vtab-Zeichen, die dazu +benutzt werden, die einzelnen Teile jedes Strings zu trennen (diese sind wichtig +für die lookup-Funktion) und die Benutzung der Kommas um die Strings +zu trennen. Die eigentliche Arbeit wird in der Funktion tr() gemacht, +welche die übersetzte Version des übergebenen Strings zurückliefert. +Sollte der ursprüngliche String im I18N-Array nicht gefunden werden, +oder es keine Übersetzung für die aktuelle Sprache geben, so wird der ursprüngliche +String unübersetzt verwendet. +
+Die erste im I18N-Array definierte Sprache muss diejenige sein, in der +die im restlichen ULP verwendeten Strings geschrieben sind, und sollte generell +Englisch sein um das Programm einer möglichst großen Zahl von Benutzern +zugänglich zu machen. +
+string I18N[] = { + "en\v" + "de\v" + "it\v" + , + "I18N Demo\v" + "Beispiel für Internationalisierung\v" + "Esempio per internazionalizzazione\v" + , + "Hello world!\v" + "Hallo Welt!\v" + "Ciao mondo!\v" + , + "+Ok\v" + "+Ok\v" + "+Approvazione\v" + , + "-Cancel\v" + "-Abbrechen\v" + "-Annullamento\v" + }; +int Language = strstr(I18N[0], language()) / 3; +string tr(string s) +{ + string t = lookup(I18N, s, Language, '\v'); + return t ? t : s; +} +dlgDialog(tr("I18N Demo")) { + dlgHBoxLayout dlgSpacing(350); + dlgLabel(tr("Hello world!")); + dlgHBoxLayout { + dlgPushButton(tr("+Ok")) dlgAccept(); + dlgPushButton(tr("-Cancel")) dlgReject(); + } + }; ++ + + +
+Ein array das mit lookup() benutzt werden kann, besteht aus Text-Strings, +wobei jeder String einen Daten-Record darstellt. +
+Jeder Daten-Record enthält eine beliebige Anzahl von Feldern, die durch das Zeichen +separator (default ist '\t', der Tabulator) getrennt sind. +Das erste Feld in einem Record wird als key benutzt und hat die Nummer 0. +
+Alle Records müssen eindeutige key-Felder haben. Keines der key-Felder +darf leer sein - ansonsten ist nicht definiert welcher Record gefunden wird. +
+Enthält der erste String in array einen "Header"-Record (der Record, in dem der
+Inhalt der Felder beschrieben wird), bestimmt lookup mit einem String
+field_name automatisch den Index des Feldes. Das erlaubt es, die lookup-Funktion
+zu benutzen, ohne genau zu wissen, welcher Feld-Index die gewünschten Daten enthält.
+Es bleibt dem Benutzer überlassen, sicherzustellen, dass der erste Record tatsächlich
+Header-Informationen enthält.
+
+Ist der key-Parameter beim Aufruf von lookup() ein leerer String, +wird der erste String von array verwendet. Das erlaubt dem Programm zu +bestimmen, ob ein Header-Record mit den gewünschten Feld-Namen existiert. +
+Enthält ein Feld das separator-Zeichen, muss es in Anführungszeichen
+eingeschlossen werden (wie in "abc;def", wobei hier das Semikolon (';')
+das Trennzeichen ist). Das gilt auch für Felder, die Anführungszeichen
+(") enthalten, wobei die Anführungszeichen im Feld verdoppelt werden müssen
+(wie hier: "abc;""def"";ghi" ergibt also abc;"def";ghi).
+Es wird empfohlen den "tab"-Separator (default) zu verwenden, der diese Probleme nicht
+kennt (kein Feld kann einen Tabulator enthalten).
+
+Hier folgt eine Beispiel-Daten-Datei (zur besseren Lesbarkeit wurde der Separator ';' verwendet): +
+Name;Manufacturer;Code;Price +7400;Intel;I-01-234-97;$0.10 +68HC12;Motorola;M68HC1201234;$3.50 ++
+string OrderCodes[]; +if (fileread(OrderCodes, "ordercodes") > 0) { + if (lookup(OrderCodes, "", "Code", ';')) { + schematic(SCH) { + SCH.parts(P) { + string OrderCode; + // both following statements do exactly the same: + OrderCode = lookup(OrderCodes, P.device.name, "Code", ';'); + OrderCode = lookup(OrderCodes, P.device.name, 2, ';'); + } + } + } + else + dlgMessageBox("Missing 'Code' field in file 'ordercodes'); + } ++ + + +
+Der spezielle Wert -1 für index bewirkt, dass die Funktion den +Typ der momentan vom Editor-Fenster verwendeten Palette liefert. +
+Falls index oder type ausserhalb des gültigen Wertebereichs liegen +wird eine Fehlermeldung ausgegeben und das ULP abgebrochen. +
PALETTE_TYPES | die Anzahl der Palette-Typen (3) | |
PALETTE_BLACK | die Palette für schwarzen Hintergrund (0) | |
PALETTE_WHITE | die Palette für weißen Hintergrund (1) | |
PALETTE_COLORED | die Palette für farbigen Hintergrund (2) | |
PALETTE_ENTRIES | die Anzahl der Farben pro Palette (64) |
+In jedem Fall definiert das Argument number die Zahl der +Einträge im Array oder in den Arrays. +
+string A[]; +int n = 0; +A[n++] = "World"; +A[n++] = "Hello"; +A[n++] = "The truth is out there..."; +sort(n, A); +for (int i = 0; i < n; ++i) + printf(A[i]); ++
+numeric string Nets[], Parts[], Instances[], Pins[]; +int n = 0; +int index[]; +schematic(S) { + S.nets(N) N.pinrefs(P) { + Nets[n] = N.name; + Parts[n] = P.part.name; + Instances[n] = P.instance.name; + Pins[n] = P.pin.name; + ++n; + } + sort(n, index, Nets, Parts, Instances, Pins); + for (int i = 0; i < n; ++i) + printf("%-8s %-8s %-8s %-8s\n", + Nets[index[i]], Parts[index[i]], + Instances[index[i]], Pins[index[i]]); + } ++Die Idee dahinter ist, dass an ein Netz mehrere Pins angeschlossen sein können. +In einer Netzliste wollen Sie unter Umständen die Netznamen sortieren und +innerhalb eines Netzes die Bauteilnamen, und so weiter. +
+Beachten Sie die Verwendung des Schlüsselworts numeric in den +String-Arrays. Das führt dazu, dass die String-Sortierung einen numerischen +Teil am Ende des Namens berücksichtigt (IC1, IC2,... IC9, IC10 anstelle von +IC1, IC10, IC2,...IC9). +
+Wenn man einen Satz von Arrays sortiert, muss das erste (Index-)Array
+vom Typ int sein und braucht nicht
+initialisiert zu werden. Jeder vor dem Aufruf der sort-Funktion
+vorhandene Inhalt wird mit den resultierenden Indexwerten überschrieben.
+
+
+
+status()
+
+
+Siehe auch dlgMessageBox()
+
+
+Die status-Funktion zeigt die angegebene message in der Statuszeile
+des Editor-Fensters an, in dem das ULP läuft.
+
+
+
+
+Zur Sicherheit werden Sie vor der Ausführung des Befehls gefragt, ob
+Sie dieses zulassen möchten, damit nicht ein "böses" ULP unerwünschte externe
+Befehle ausführen kann.
+Wird dieser Dialog abgebrochen, so liefert der system() Aufruf -1 zurück.
+Wird der Dialog bestätigt, so werden alle künftigen system() Aufrufe in der
+laufenden EAGLE-Sitzung mit genau der gleichen Befehlszeile ohne weiteren
+Bestätigungsdialog ausgeführt.
+
+system()
+
+
+Die system-Funktion führt das im command angegebene externe
+Programm aus und wartet, bis dieses beendet ist.
+Ein-/Ausgabe-Umleitung
+Soll ein externes Programm seine Eingaben von einer bestimmten Datei lesen
+(bzw. seine Ausgaben in eine bestimmte Datei schreiben), so muss die Ein- bzw.
+Ausgabe umgeleitet werden.
+
+Unter Linux und Mac OS X geschieht dies einfach durch Anhängen von '<'
+bzw. '>' an die Befehlszeile, jeweils gefolgt von der gewünschten Datei,
+wie in
++system("program < infile > outfile"); ++womit program gestartet wird und es von infile liest und +nach outfile schreibt. + |
+
+Unter Windows muss explizit ein Kommando-Prozessor gestartet werden um dies zu
+ermöglichen, wie in
++system("cmd.exe /c program < infile > outfile"); ++(auf DOS-basierten Windows-Systemen verwenden Sie command.com anstatt cmd.exe). + |
+
+Läuft ein externes Programm längere Zeit, und Sie wollen, dass der system()-Aufruf
+sofort zurückkehrt, ohne zu warten, bis das Programm beendet ist, so können Sie
+unter Linux und Mac OS X einfach ein '&' an die Befehlszeile anfügen,
+wie in
++system("program &"); ++ |
+
+Unter Windows muss explizit ein Kommando-Prozessor gestartet werden um dies zu
+ermöglichen, wie in
++system("cmd.exe /c start program"); ++(auf DOS-basierten Windows-Systemen verwenden Sie command.com anstatt cmd.exe). + |
+int result = system("simulate -f filename"); ++Hiermit würde ein Simulationsprogramm aufgerufen und diesem eine Datei übergeben +werden, die das ULP gerade erzeugt hat. +Beachten Sie bitte, dass simulate hier nur ein Beispiel und nicht Bestandteil +des EAGLE-Paketes ist! + + + +
+EAGLE speichert alle Koordinaten und Größen als +int-Werte mit einer Auflösung von 1/10000mm +(0.1µ). Die oben angegebenen Einheiten-Konvertier-Funktionen können dazu +verwendet werden, die internen Einheiten in die gewünschten Maßeinheiten +umzuwandeln. +
+board(B) { + B.elements(E) { + printf("%s at (%f, %f)\n", E.name, + u2mm(E.x), u2mm(E.y)); + } + } ++ + + +
+Die folgenden Print-Funktionen sind verfügbar: +
+ + + ++Wenn ein Fehler auftritt, liefert printf -1. +
+Der Format-String enthält zwei Objekt-Typen - einfache Zeichen +und Format-Specifier: +
+% [flags] [width] [.prec] type +
+Jede Format-Spezifizierung beginnt mit dem Prozentzeichen (%). +Nach dem % kommt folgendes, in dieser Reihenfolge: +
d | signed decimal int | |
o | unsigned octal int | |
u | unsigned decimal int | |
x | unsigned hexadecimal int (with a, b,...) | |
X | unsigned hexadecimal int (with A, B,...) | |
f | signed real value von der Form [-]dddd.dddd | |
e | signed real value von der Form [-]d.dddde[±]ddd | |
E | wie e, aber mit E für Exponent | |
g | signed real value entweder wie e oder f, abhängig vom gegebenen Wert und Präzision | |
G | wie g, aber mit E für Exponent, wenn e-Format verwendet wird | |
c | einzelnes Zeichen | |
s | Character-String | |
% | das %-Zeichen wird ausgegeben |
+
"-" | das formatierte Argument wird innerhalb des Feldes linksbündig ausgegeben; normalerweise ist die Ausgabe rechtsbündig | |
"+" | ein positiver Wert mit Vorzeichen wird mit Pluszeichen (+) ausgegeben; normalerweise werden nur negative Werte mit Vorzeichen ausgegeben | |
" " | ein positiver Wert mit Vorzeichen wird mit Leerzeichen am Anfang ausgegeben; wenn "+" und " " angegeben sind, überschreibt "+" die Angabe " " |
+Die Breite wird entweder direkt mit einem Dezimalstellen-String oder +indirekt mit einem Stern (*) gesetzt. +Wenn Sie * verwenden, legt das nächste Argument im Aufruf +(das vom Typ int sein muss) die minimale Feldbreite fest. +
+Auf keinen Fall führt ein nicht existierendes oder zu ein kleines Feld +dazu, dass ein Wert abgeschnitten wird. Wenn das Ergebnis der Konvertierung +breiter ist als das Feld, wird das Feld einfach so vergrößert, dass +das Ergebnis platz hat. +
+
n | Mindestens n Zeichen werden ausgegeben. Wenn der Ausgabewert weniger als n Zeichen hat, wird er mit Leerzeichen aufgefüllt (rechts wenn das "-"-Flag gesetzt ist, sonst links). | |
0n | Mindestens n Zeichen werden ausgegeben. Wenn der Ausgabewert weniger als n Zeichen hat, wird links mit Nullen aufgefüllt. | |
* | Die Argument-Liste liefert den Width-Specifier, der dem eigentlichen (zu formatierenden) Argument vorausgehen muss. |
+
keiner | Präzision auf Standardwert gesetzt. | |
.0 | Für int-Typen, Präzision wird auf Default gesetzt; für real-Typen, kein Dezimalpunkt wird ausgegeben. | |
.n | n Zeichen oder n Dezimalstellen werden ausgegeben. Wenn der Ausgabewert mehr als n Zeichen hat, kann er abgeschnitten oder gerundet werden (abhängig vom Typ-Zeichen). | |
* | Die Argument-Liste liefert den Präzisions-Specifier, der dem eigentlichen (zu formatierenden) Argument vorausgehen muss. |
douxX | 1 | |
eEf | 6 | |
gG | alle signifikanten Stellen | |
c | keine Auswirkung | |
s | gesamten String ausgeben |
douxX | .n spezifiziert dass mindestens n Zeichen ausgegeben werden. Wenn das Eingangs-Argument weniger als n Stellen hat, wird der Ausgangswert links mit Nullen aufgefüllt. Wenn das Eingangs-Argument mehr als n Stellen hat, wir die Ausgabe nicht abgeschnitten. | |
eEf | .n spezifiziert dass n Zeichen nach dem Dezimalpunkt ausgegeben werden, und die letzte ausgegebene Stelle wird gerundet. | |
gG | .n spezifiziert dass höchstens n signifikante Stellen ausgegeben werden. | |
c | .n hat keinen Einfluss auf die Ausgabe. | |
s | .n spezifiziert dass nicht mehr als n Zeichen gedruckt werden. |
+char c = 0x00; +printf("%c", c); ++
+int i = 42; +real r = 3.14; +char c = 'A'; +string s = "Hello"; +printf("Integer: %8d\n", i); +printf("Hex: %8X\n", i); +printf("Real: %8f\n", r); +printf("Char: %-8c\n", c); +printf("String: %-8s\n", s); ++ + + +
+Im Falle eines Fehlers liefert sprintf den Wert -1. +
+string result; +int number = 42; +sprintf(result, "The number is %d", number); ++ + + +
+Die folgenden String-Funktionen sind verfügbar: +
+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +
+string s = "This is a string"; +char c = 'a'; +int pos = strchr(s, c); +if (pos >= 0) + printf("The character %c is at position %d\n", c, pos); +else + printf("The character was not found\n"); ++ + + +
+strjoin fügt alle Einträge aus array, getrennt durch den angegebenen +separator zusammen, und liefert den Ergebnis-String. +
+Wenn separator ein Newline-Zeichen ("\n") ist, wird der Ergebnis-String +mit einem Newline-Zeichen abgeschlossen. +So erhält man eine Textdatei mit N Zeilen (jede davon ist mit einem Newline-Zeichen abgeschlossen). +Die Datei wird mit den Funktionen fileread() eingelesen und mit +split in ein Array mit N Strings aufgeteilt und zu dem ursprünglichen +String, der aus der Datei eingelesen wurde, hinzugefügt. +
+string a[] = { "Field 1", "Field 2", "Field 3" }; +string s = strjoin(a, ':'); ++ + + +
+string s = "This is a string"; +int l = strlen(s); +printf("The string is %d characters long\n", l); ++ + + +
+string s = "This Is A String"; +string r = strlwr(s); +printf("Prior to strlwr: %s - after strlwr: %s\n", s, r); ++ + + +
+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +
+string s = "This is a string"; +char c = 'a'; +int pos = strrchr(s, c); +if (pos >= 0) + printf("The character %c is at position %d\n", c, pos); +else + printf("The character was not found\n"); ++ + + +
+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +
+string s1 = "This is a string", s2 = "is a"; +int pos = strrstr(s1, s2); +if (pos >= 0) + printf("The substring starts at %d\n", pos); +else + printf("The substring was not found\n"); ++ + + +
+strsplit teilt den String s am angegebenen separator +und speichert die so erzeugten Felder in array. +
+Wenn separator ein Newline-Zeichen ist ("\n"), wird das letzte Feld +einfach ignoriert, sofern es leer ist. +So erhält man eine Textdatei, die aus N Zeilen besteht (jede durch Newline beendet). +Diese wird durch die Funktion fileread() eingelesen +und in ein Array von N Strings aufgeteilt. +Mit jedem anderen separator ist ein leeres Feld am Ende des Strings gültig. +So entstehen aus "a:b:c:" 4 Felder, das letzte davon ist leer. +
+string a[]; +int n = strsplit(a, "Field 1:Field 2:Field 3", ':'); ++ + + +
+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +
+string s1 = "This is a string", s2 = "is a"; +int pos = strstr(s1, s2); +if (pos >= 0) + printf("The substring starts at %d\n", pos); +else + printf("The substring was not found\n"); ++ + + +
+Der Wert für length muss positiv sein, andernfalls wird ein leerer +String zurückgegeben. Wenn length nicht angegeben ist, wird der +Reststring (beginnend bei start) zurückgegeben. +
+Wenn start auf eine Position ausserhalb des Strings deutet, wird +ein leerer String zurückgegeben. +
+string s = "This is a string"; +string t = strsub(s, 4, 7); +printf("The extracted substring is: %s\n", t); ++ + + +
+string s = "3.1415"; +real r = strtod(s); +printf("The value is %f\n", r); ++ + + +
+string s = "1234"; +int i = strtol(s); +printf("The value is %d\n", i); ++ + + +
+string s = "This Is A String"; +string r = strupr(s); +printf("Prior to strupr: %s - after strupr: %s\n", s, r); ++ + + +
+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +
+Falls length angegeben wird, wird die aktuelle Länge des gefundenen +Teilstrings in dieser Variablen zurückgegeben. +
+Reguläre Ausdrücke erlauben es Ihnen, ein Muster innerhalb eines Text-Strings
+zu finden. Zum Beispiel würde der reguläre Ausdruck "i.*a" eine Zeichenfolge finden,
+die mit 'i' beginnt, gefolgt von einem beliebigen Zeichen ('.') beliebig oft ('*'),
+und mit 'a' endet. Er würde auf "is a", "is this a" oder "ia" passen.
+Einzelheiten zu regulären Ausdrücken finden Sie zum Beispiel in dem Buch
+Reguläre Ausdrücke von Jeffrey E. F. Friedl.
+
+string s1 = "This is a string", s2 = "i.*a"; +int len = 0; +int pos = strxstr(s1, s2, 0, len); +if (pos >= 0) + printf("The substring starts at %d and is %d charcaters long\n", pos, len); +else + printf("The substring was not found\n"); ++ + + +
+Die folgenden Zeit-Funktionen sind verfügbar: +
+int CurrentTime = time(); ++ + + +
+Nach 86400000 Millisekunden (d.h. alle 24 Stunden) beginnt der Wert wieder bei 0. +
+int elapsed = timems(); ++ + + +
+int t = time(); +printf("It is now %02d:%02d:%02d\n", + t2hour(t), t2minute(t), t2second(t)); ++ + + +
+Die folgenden Objekt-Funktionen sind verfügbar: +
+ + + ++Die clrgroup()-Funktion löscht die Gruppen-Flags des gegebenen Objekts, +so dass es nicht mehr Bestandteil einer vorher definierten Gruppe ist. +
+Wird die Funktion auf ein Objekt angewendet, das andere Objekte enthält (wie +etwa ein UL_BOARD oder UL_NET), so werden die Gruppen-Flags aller enthaltenen +Objekte rekursiv gelöscht. +
+board(B) { + B.elements(E) + clrgroup(E); + } ++ + + +
+Wurde im Editor eine Gruppe definiert, so kann die ingroup()-Funktion +benutzt werden um zu prüfen, ob ein bestimmtes Objekt Bestandteil der Gruppe ist. +
+Objekte mit einem einzelnen Aufhängepunkt, die in der aktuellen Zeichnung gezielt +selektiert werden können (wie etwa UL_TEXT, UL_VIA, UL_CIRCLE etc.), liefern beim +Aufruf von ingroup() einen Wert ungleich 0 wenn dieser Aufhängepunkt +innerhalb der Gruppe liegt. +
+Ein UL_WIRE liefert 0, 1, 2 oder 3, je nachdem, ob keiner, der erste, der zweite +oder beide Endpunkte in der Gruppe liegen. +
+Ein UL_RECTANGLE bzw. UL_FRAME liefert einen Wert ungleich 0 wenn einer oder mehrere seiner +Eckpunkte in der Gruppe liegen. +Der Wert hat Bit 0 gesetzt für die rechte obere Ecke, Bit 1 für die linke obere, Bit 2 +für die linke untere und Bit 3 für die rechte untere Ecke. +
+Objekte ohne Aufhängepunkt (wie etwa UL_NET, UL_SEGMENT, UL_SIGNAL etc.) liefern +einen Wert ungleich 0 wenn eines oder mehrere der Objekte, die sie enthalten, +in der Gruppe liegen. +
+UL_CONTACTREF und UL_PINREF haben zwar selber keinen Aufhängepunkt, liefern aber +einen Wert ungleich 0 wenn der referenzierte UL_CONTACT bzw. UL_PIN innerhalb der +Gruppe liegt. +
+output("group.txt") { + board(B) { + B.elements(E) { + if (ingroup(E)) + printf("Element %s is in the group\n", E.name); + } + } + } ++ + + +
+Die setgroup()-Funktion setzt die Gruppen-Flags des gegebenen Objekts, +so dass es Bestandteil der Gruppe ist. +
+Werden keine flags angegeben, so wird das Objekt als Ganzes zur Gruppe +hinzugefügt (d.h. alle seine Aufhängepunkte, falls es mehrere hat). +
+Hat flags einen Wert ungleich Null, werden nur die Gruppen-Flags der +angegebenen Punkte gesetzt. Für einen UL_WIRE bedeutet dies, dass '1' +das Gruppen-Flag des ersten Punkts setzt, '2' das des zweiten und +'3' beide. Etwaige bereits gesetzte Gruppen-Flags werden durch den +Aufruf von setgroup() nicht verändert. +
+Wird die Funktion auf ein Objekt angewendet, das andere Objekte enthält (wie +etwa ein UL_BOARD oder UL_NET), so werden die Gruppen-Flags aller enthaltenen +Objekte rekursiv gesetzt. +
+board(B) { + B.elements(E) + setgroup(E); + } ++ + + +
+Die allgemeine Syntax von Builtin-Statements ist +
+name(parameters) statement ++wobei name der Name des Builtin-Statement ist, parameters +steht für einen oder mehrere Parameter, und statement ist der Code, +der innerhalb des vom Builtin-Statement geöffneten Kontexts ausgeführt wird. +
+Beachten Sie, dass es sich bei statement um eine Compound-Statement +handeln kann, wie in +
+board(B) { + B.elements(E) printf("Element: %s\n", E.name); + B.Signals(S) printf("Signal: %s\n", S.name); + } ++Die folgenden Builtin-Statements sind verfügbar: + + + + +
+Das board-Statement öffnet einen Board-Kontext wenn das gegenwärtige +Editor-Fenster ein Board enthält. Eine Variable vom Typ +UL_BOARD wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Board-Kontext erfolgreich geöffnet wurde und eine Board-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die Board-Variable +zugreifen, um weitere Daten aus dem Board zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster kein Board enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+project.board(B) { ... } ++Das öffnet einen Board-Kontext, unabhängig davon, ob das gegenwärtige +Editor-Fenster ein Board oder einen Schaltplan enthält. Allerdings muss +es auf dem Desktop ein Fenster geben, das dieses Board enthält! +
+if (board) + board(B) { + B.elements(E) + printf("Element: %s\n", E.name); + } ++ + + +
+Das deviceset-Statement öffnet einen Device-Set-Kontext wenn das gegenwärtige +Editor-Fenster ein Device-Set enthält. Eine Variable vom Typ +UL_DEVICESET wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Device-Set-Kontext erfolgreich geöffnet wurde und eine Device-Set-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die Device-Set-Variable +zugreifen, um weitere Daten aus dem Device-Set zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster kein Device-Set enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+if (deviceset) + deviceset(D) { + D.gates(G) + printf("Gate: %s\n", G.name); + } ++ + + +
+Das library-Statement öffnet einen Library-Kontext wenn das gegenwärtige +Editor-Fenster eine Library enthält. Eine Variable vom Typ +UL_LIBRARY wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Library-Kontext erfolgreich geöffnet wurde und eine Board-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die Library-Variable +zugreifen, um weitere Daten aus der Bibliothek zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster keine Bibliothek enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+if (library) + library(L) { + L.devices(D) + printf("Device: %s\n", D.name); + } ++ + + +
+Das output-Statement öffnet eine Datei mit dem Namen filename +und dem Parameter mode für die Ausgabe mit nachfolgenden +printf()-Aufrufen. Sobald die Datei erfolgreich geöffnet wurde, wird +statement ausgeführt, und danach wird die Datei geschlossen. +
+Wenn die Datei nicht geöffnet werden kann, wird eine Fehlermeldung ausgegeben, +und das ULP wird beendet. +
+Standardmäßig wird die erzeugte Datei in das Projekt Verzeichnis +geschrieben. +
+
a | an existierende Datei anhängen oder neue Datei anlegen, falls die Datei nicht existiert | |
w | neue Datei anlegen (existierende überschreiben) | |
t | Datei im Textmodus öffnen | |
b | Datei im Binärmodus öffnen | |
D | Datei am Ende der EAGLE-Sitzung löschen (funktioniert nur zusammen mit w) | |
F | diesen Dateinamen erzwingen (normalerweise werden *.brd, *.sch und *.lbr abgewiesen) |
+Mode-Parameter können in beliebiger Kombination und Reihenfolge +angegeben werden. Allerdings ist nur der letzte aus a und w +bzw. t und b signifikant. +Die Angabe "abtw" würde zum Beispiel eine Textdatei öffnen (entsprechend "wt"). +
+void PrintText(string s) +{ + printf("This also goes into the file: %s\n", s); +} +output("file.txt", "wt") { + printf("Directly printed\n"); + PrintText("via function call"); + } ++ + + +
+Das package-Statement öffnet einen Package-Kontext wenn das gegenwärtige +Editor-Fenster ein Package enthält. Eine Variable vom Typ +UL_PACKAGE wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Package-Kontext erfolgreich geöffnet wurde und eine Package-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die Package-Variable +zugreifen, um weitere Daten aus dem Package zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster kein Package enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+if (package) + package(P) { + P.contacts(C) + printf("Contact: %s\n", C.name); + } ++ + + +
+Das schematic-Statement öffnet einen Schaltplan-Kontext wenn das gegenwärtige +Editor-Fenster einen Schaltplan enthält. Eine Variable vom Typ +UL_SCHEMATIC wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Schaltplan-Kontext erfolgreich geöffnet wurde und eine UL_SCHEMATIC-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die UL_SCHEMATIC-Variable +zugreifen, um weitere Daten aus dem Schaltplan zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster keinen Schaltplan enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+project.schematic(S) { ... } ++Das öffnet einen UL_SCHEMATIC-Kontext, unabhängig davon, ob das gegenwärtige +Editor-Fenster ein Board oder einen Schaltplan enthält. Allerdings muss +es auf dem Desktop ein Fenster geben, das diesen Schaltplan enthält! +
+if (schematic) + schematic(S) { + S.parts(P) + printf("Part: %s\n", P.name); + } ++ + + +
+Das sheet-Statement öffnet einen UL_SHEET-Kontext, wenn das gegenwärtige +Editor-Fenster eine Schaltplanseite enthält. Eine Variable vom Typ +UL_SHEET wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der UL_SHEET-Kontext erfolgreich geöffnet wurde und eine UL_SHEET-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die UL_SHEET-Variable +zugreifen, um weitere Daten aus der Seite zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster keine Schaltplanseite enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+if (sheet) + sheet(S) { + S.parts(P) + printf("Part: %s\n", P.name); + } ++ + + +
+Das symbol-Statement öffnet einen Symbol-Kontext wenn das gegenwärtige +Editor-Fenster ein Symbol enthält. Eine Variable vom Typ +UL_SYMBOL wird angelegt und erhält den Namen, +den identifier angibt. +
+Sobald der Symbol-Kontext erfolgreich geöffnet wurde und eine Symbol-Variable +angelegt ist, wird statement ausgeführt. Innerhalb des +Gültigkeitsbereichs von statement kann man auf die Symbol-Variable +zugreifen, um weitere Daten aus dem Symbol zu erhalten. +
+Wenn das gegenwärtige Editor-Fenster kein Symbol enthält, wird eine +Fehlermeldung ausgegeben, und das ULP wird beendet. +
+if (symbol) + symbol(S) { + S.pins(P) + printf("Pin: %s\n", P.name); + } ++ + + +
+In den folgenden Abschnitten werden die User-Language-Dialoge detailliert beschrieben: +
+
Vordefinierte Dialoge | beschreibt vordefinierte Standard-Dialoge | |
Dialog-Objekte | beschreibt die Objekte aus denen ein Dialog bestehen kann | |
Layout-Information | erklärt wie man die Position von Objekten in einem Dialog bestimmt | |
Dialog-Funktionen | beschreibt besondere Funktionen, die mit Dialogen verwendet werden können | |
Ein vollständiges Beispiel | zeigt ein vollständiges ULP mit einem Dialog zur Daten-Eingabe |
+Es gibt folgende vordefinierte Dialoge: +
+Siehe Dialog-Objekte für Informationen über +das Definieren eigener, komplexer Benutzer-Dialoge. + + + ++Die dlgDirectory-Funktion zeigt einen Verzeichnis-Dialog in dem der Benutzer ein Verzeichnis +selektieren kann. +
+Title zeigt den Titel des Dialogs. +
+Wenn Start nicht leer ist, wird diese Angabe als Startpunkt für dlgDirectory verwendet. +
+string dirName; +dirName = dlgDirectory("Select a directory", ""); ++ + + +
+Die Funktionen dlgFileOpen und dlgFileSave zeigen einen Datei-Dialog, aus dem +der Benutzer eine Datei selektieren kann. +
+Title wird als Titel des Dialogs verwendet. +
+Ist Start nicht leer, wird diese Angabe als Startpunkt für den Dialog verwendet. +Ansonsten wird das aktuelle Verzeichnis verwendet. +
+Nur Dateien, die der Angabe von Filter entsprechen, werden angezeigt. Wird kein +Filter angegeben, werden alle Dateien angezeigt. +
+Filter kann entweder ein einfacher Pattern sein (wie in "*.brd"), eine Liste von +Patterns (wie in "*.bmp *.jpg") oder kann sogar beschreibenden Text enthalten, wie in +"Bitmap-Dateien (*.bmp)". Falls die "Dateityp" Combo-Box des Datei-Dialogs mehrere +Einträge haben soll, müssen diese durch zwei Semikolons voneinander getrennt werden, wie in +"Bitmap-Dateien (*.bmp);;Andere Bilddateien (*.jpg *.png)". +
+string fileName; +fileName = dlgFileOpen("Select a file", "", "*.brd"); ++ + + +
+Die dlgMessageBox-Funktion zeigt die angegebene Message in einem modalen Dialog-Fenster und +wartet darauf, dass der Benutzer eine der Schaltflächen, die über +button_list definiert wurden, selektiert. +
+Falls Message HTML-Tags enthält, so müssen die Zeichen '<', '>' und '&', +damit sie als solche angezeigt werden, als "<", ">" bzw. "&" angegeben +werden. +
+button_list ist eine optionale Liste durch Komma getrennter Strings, die einen Satz von
+Schaltflächen, die unten im Dialog-Fenster angezeigt werden, definiert.
+Es können maximal drei Schaltflächen definiert werden.
+Wird keine button_list angegeben, erscheint automatisch "OK".
+
+Die erste Schaltfläche in button_list wird die Default-Schaltfläche (sie wird gedrückt, wenn +der Benutzer ENTER drückt), und der letzte Eintrag in der Liste wird der "Cancel-Button", der gewählt +wird, wenn der Benutzer Esc drückt oder das Dialog-Fenster einfach schließt. +Sie können eine andere Schaltfläche als Default-Button definieren, indem Sie den String mit +einem '+' beginnen. Wollen Sie eine andere Schaltfläche als Cancel-Button definieren, stellen +Sie dem String ein '-' voran. +Um einen Schaltflächen-Text mit einem '+' oder '-' zu beginnen, muss das Zeichen mit einem +Escape-Zeichen markiert werden. +
+Enthält der Text ein '&', wird das folgende Zeichen zum Hotkey. Wenn der Benutzer +die entsprechende Taste drückt, wird diese Schaltfläche gewählt. +Um das Zeichen '&' im Schaltflächen-Text zu verwenden, muss es mit einem +Escape-Zeichen markiert werden. +
+Dem Dialog-Fenster kann ein Icon mitgegeben werden, indem das erste Zeichen in Message auf
+ ';' - für eine Information
+ '!' - für eine Warnung
+ ':' - für einen Fehler
+gesetzt wird.
+Soll die Message jedoch mit einem dieser Zeichen beginnen, so muss dieses mit einem
+Escape-Zeichen markiert werden.
+
+
+Unter Mac OS X führt nur das Zeichen ':' tatsächlich zur +Darstellung eines Icons. Alle anderen werden ignoriert. + |
+if (dlgMessageBox("Are you sure?", "&Yes", "&No") == 0) { + // let's do it! + } ++ + + +
+
dlgCell | ein Grid-Cell-Kontext | |
dlgCheckBox | eine Checkbox | |
dlgComboBox | ein Combo-Box-Auswahl-Feld | |
dlgDialog | die Grundlage eines jeden Dialogs | |
dlgGridLayout | ein Grid-basierter-Layout-Kontext | |
dlgGroup | ein Group-Feld | |
dlgHBoxLayout | ein Horizontal-Box-Layout-Kontext | |
dlgIntEdit | ein Integer-Eingabe-Feld | |
dlgLabel | ein Text-Label | |
dlgListBox | eine List-Box | |
dlgListView | eine List-View | |
dlgPushButton | ein Push-Button | |
dlgRadioButton | ein Radio-Button | |
dlgRealEdit | ein Real-Eingabe-Feld | |
dlgSpacing | ein Layout-Spacing-Objekt | |
dlgSpinBox | ein Spin-Box-Auswahl-Feld | |
dlgStretch | ein Layout-Stretch-Objekt | |
dlgStringEdit | ein String-Eingabe-Feld | |
dlgTabPage | eine Tab-Page | |
dlgTabWidget | ein Tab-Page-Container | |
dlgTextEdit | ein Text-Eingabe-Feld | |
dlgTextView | ein Text-Viewer-Feld | |
dlgVBoxLayout | ein Vertical-Box-Layout-Kontext |
+
+
+
+dlgCell
+
+
+Siehe auch dlgGridLayout,
+dlgHBoxLayout,
+dlgVBoxLayout,
+Layout-Information,
+Ein vollständiges Beispiel
+
+Das dlgCell-Statement definiert die Lage einer Cell in einem +Grid-Layout-Kontext. +
+Der Index für Reihe (row) und Spalte (column) beginnt mit 0, so das die obere linke Cell den Index (0, 0) hat. +
+Mit zwei Parametern wird das Dialog-Objekt, das in statement angegeben wurde, in einer Cell +an der Stelle row und column plaziert. +Mit vier Parametern erstreckt sich das Objekt über alle Cells von row/column +bis zu row2/column2. +
+Standardmäßig enthält dlgCell ein dlgHBoxLayout. +Enthält eine Cell mehr als ein Dialog-Objekt, werden diese nebeneinander horizontal angeordnet. +
+string Text; +dlgGridLayout { + dlgCell(0, 0) dlgLabel("Cell 0,0"); + dlgCell(1, 2, 4, 7) dlgTextEdit(Text); + } ++ + + +
+Das dlgCheckBox-Statement definiert eine Checkbox mit dem angegebenen Text. +
+Wenn Text ein '&' enthält, wird das folgende Zeichen als Hotkey markiert. +Wenn der Benutzer Alt+hotkey drückt, wird die Checkbox selektiert/deselektiert. +Um ein '&'-Zeichen im Text zu verwenden, muss er mit einem Escape-Zeichen markiert werden. +
+dlgCheckBox wird hauptsächlich in dlgGroup benutzt,
+kann aber auch anders verwendet werden.
+Alle Check-Boxen innerhalb eines gemeinsamen Dialogs müssen unterschiedliche Checked-Variablen haben!
+
+Wenn ein Benutzer eine dlgCheckBox wählt, wird die entsprechende Checked-Variable auf +1 gesetzt, andernfalls ist sie auf 0 gesetzt. +Der ursprüngliche Wert von Checked definiert, ob eine Checkbox anfänglich selektiert ist oder nicht. +Wenn Checked ungleich 0 ist, ist die Checkbox defaultmäßig selektiert. +
+Das optionale statement wird jedesmal ausgeführt, wenn Sie die dlgCheckBox selektieren/deselektieren. +
+int mirror = 0; +int rotate = 1; +int flip = 0; +dlgGroup("Orientation") { + dlgCheckBox("&Mirror", mirror); + dlgCheckBox("&Rotate", rotate); + dlgCheckBox("&Flip", flip); + } ++ + + +
+Das dlgComboBox-Statement definiert ein Combo-Box-Auswahlfeld mit dem Inhalt von array. +
+Selected reflektiert den Index des selektieren Combo-Box-Eintrags. Der erste Eintrag hat den Index 0. +
+Jedes Element von array legt den Inhalt eines Eintrags in der Combo-Box fest. +Keiner der Strings in array darf leer sein (sollte ein leerer String existieren, +werden alle folgenden, inklusive des leeren, ignoriert). +
+Das optionale statement wird jedesmal ausgeführt, wenn die Auswahl in der dlgComboBox verändert wird.
+Bevor statement ausgeführt wird, werden alle Variablen , die in den Dialog-Objekten verwendet werden
+neu eingelesen und jede Veränderung innerhalb von statement wird im Dialog angezeigt.
+
+Ist der Ausgangswert von Selected ausserhalb des Bereichs der Indices von array, +wird dieser auf 0 gesetzt. +
+string Colors[] = { "red", "green", "blue", "yellow" }; +int Selected = 2; // initially selects "blue" +dlgComboBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+Die dlgDialog-Funktion, die durch block definiert wird. +Das ist das einzige Dialog-Objekt das tatsächlich eine User-Language-Builtin-Funktion ist. +Sie kann überall wo ein Funktionsaufruf erlaubt ist, verwendet werden. +
+block enthält normalerweise andere Dialog-Objekte. +Man kann aber auch andere User-Language-Statements verwenden, zum Beispiel, um bedingungsabhängig +dem Dialog Objekte hinzuzufügen (siehe das zweite der folgenden Beispiele). +
+Standardmäßig enthält dlgDialog ein dlgVBoxLayout, +so dass man sich bei einem einfachen Dialog um das Layout kein Gedanken machen muss. +
+Ein dlgDialog sollte an einer Stelle den Aufruf der dlgAccept() +-Funktion enthalten, um dem Benutzer zu erlauben, den Dialog zu schließen und dessen Inhalt zu akzeptieren. +
+Wenn Sie nur eine einfache Message-Box oder einen einfachen Dialog brauchen, können Sie statt dessen +auch einen der Vordefinierten Dialoge verwenden. +
+int Result = dlgDialog("Hello") { + dlgLabel("Hello world"); + dlgPushButton("+OK") dlgAccept(); + }; +int haveButton = 1; +dlgDialog("Test") { + dlgLabel("Start"); + if (haveButton) + dlgPushButton("Here") dlgAccept(); + }; ++ + + +
+Das dlgGridLayout-Statement öffnet einen Grid-Layout-Kontext. +
+Das einzige Dialog-Objekt, das direkt in statement verwendet werden kann, ist +dlgCell, das die Position eines Dialog-Objekts +im Grid-Layout festlegt. +
+Die Indices für row und column beginnen mit 0, so dass die obere linke Cell den
+Index (0, 0) hat.
+Die Anzahl der Reihen und Spalten wird automatisch an die Position von Dialog-Objekten,
+die innerhalb des Grid-Layout-Kontexts definiert werden, angepasst. Die Anzahl der
+Reihen und Spalten muss nicht explizit definiert werden.
+
+dlgGridLayout { + dlgCell(0, 0) dlgLabel("Row 0/Col 0"); + dlgCell(1, 0) dlgLabel("Row 1/Col 0"); + dlgCell(0, 1) dlgLabel("Row 0/Col 1"); + dlgCell(1, 1) dlgLabel("Row 1/Col 1"); + } ++ + + +
+Das dlgGroup-Statement definiert eine Gruppe mit dem gegebenen Title. +
+Standardmäßig enthält dlgGroup ein dlgVBoxLayout, +so braucht man sich bei einer einfachen Group keine Gedanken zum Layout machen. +
+dlgGroup wird hauptsächlich für einen Satz von Radio-Buttons
+oder Check-Boxes verwendet, kann aber auch jedes andere beliebige
+Objekt in statement enthalten.
+Radio-Buttons in einer dlgGroup werden mit 0 beginnend numeriert.
+
+int align = 1; +dlgGroup("Alignment") { + dlgRadioButton("&Top", align); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + } ++ + + +
+Das dlgHBoxLayout-Statement öffnet einen Horizontal-Box-Layout-Kontext für das +angegebene statement. +
+dlgHBoxLayout { + dlgLabel("Box 1"); + dlgLabel("Box 2"); + dlgLabel("Box 3"); + } ++ + + +
+Das dlgIntEdit-Statement definiert ein Integer-Eingabe-Feld mit einem in Value +angegebenen Wert. +
+Ist Value ursprünglich ausserhalb des Bereichs Min und Max, +wird er auf diesen Bereich limitiert. +
+int Value = 42; +dlgHBoxLayout { + dlgLabel("Enter a &Number between 0 and 99"); + dlgIntEdit(Value, 0, 99); + } ++ + + +
+Das dlgLabel-Statement definiert ein Label mit dem angegebenen Text. +
+Text kann entweder ein fester String wie "Hello" sein, oder eine String-Variable. +
+Falls Text HTML-Tags enthält, so müssen die Zeichen '<', '>' und '&', +damit sie als solche angezeigt werden, als "<", ">" bzw. "&" angegeben +werden. +
+Wenn der Update-Parameter nicht 0 ist und Text eine String-Variable, +kann deren Inhalt im statement z. B. eines dlgPushButton modifiziert werden, +wodurch das Label automatisch aktualisiert wird. Das ist natürlich nur sinnvoll wenn Text eine +eindeutig bestimmte String-Variable ist (und beispielsweise keine Loop-Variable eines for-Statements). +
+Enthält Text ein '&'-Zeichen, und kann das Objekt, das auf das Label +folgt, den Keyboard-Fokus bekommen, wird das folgende Zeichen zum Hot-Key. +Drückt der Benutzer Alt+hotkey, wird das Objekt, das direkt nach dlgLabel definiert +wurde, aktiv. +Um ein '&'-Zeichen direkt im Text zu verwenden, muss man es mit einem +Escape-Zeichen markieren. +
+string OS = "Windows"; +dlgHBoxLayout { + dlgLabel(OS, 1); + dlgPushButton("&Change OS") { OS = "Linux"; } + } ++ + + +
+Das dlgListBox-Statement definiert ein List-Box-Auswahl-Feld mit dem Inhalt +von array. +
+Selected gibt den Index des selektierten List-Box-Eintrags wieder. +Der erste Eintrag hat den Index 0. +
+Jedes Element von array legt den Inhalt einer Zeile in der List-Box fest. +Keiner der Strings in array darf leer sein (sollte ein leerer String existieren, +werden alle folgenden, inklusive des leeren, ignoriert). +
+Das optionale statement wird immer dann ausgeführt, wenn der Benutzer einen Doppelklick
+auf einen Eintrag der dlgListBox ausführt.
+Bevor statement ausgeführt wird, werden alle Variablen, die von Dialog-Objekten benutzt
+werden, aktualisiert. Alle Änderungen, die in statement gemacht wurden, wirken sich auf
+den Dialog aus, sobald das Statement zurückgegeben wird.
+
+Ist der Ausgangswert von Selected ausserhalb des Index-Bereichs von array, +wird kein Eintrag selektiert. +
+string Colors[] = { "red", "green", "blue", "yellow" }; +int Selected = 2; // initially selects "blue" +dlgListBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+Das dlgListView-Statement definiert ein mehrspaltiges List-View-Auswahl-Feld mit dem Inhalt, +der in array angegeben ist. +
+Headers definiert die durch Tabulatoren getrennte Liste der Spalten-Überschriften. +
+Selected gibt den Index des selektierten List-View-Eintrags von array wieder
+(die Reihenfolge in der die Einträge tatsächlich angezeigt werden, kann unterschiedlich sein,
+da der Inhalt einer dlgListView in den verschiedenen Spalten sortiert werden kann).
+Der erste Eintrag hat den Index 0.
+Wenn kein spezieller Eintrag selektiert werden soll, wählt man für Selected den
+Wert -1.
+
+Sort gibt an, nach welcher Spalte der List-View sortiert werden soll. Die linke +Spalte hat die Nummer 1. Das Vorzeichen dieses Parameters legt die Richtung der +Sortierung fest (positive Werte sortieren in aufsteigender Reihenfolge). Falls Sort +den Wert 0 hat, oder außerhalb der gültigen Anzahl von Spalten liegt, wird nicht +sortiert. Der Rückgabewert von Sort spiegelt die vom Benutzer durch Anklicken +der Spalten-Header gewählte Sortierspalte und -richtung wieder. Standardmäßig wird +nach der ersten Spalte, in aufsteigender Richtung sortiert. +
+Jedes Element von array legt den Inhalt einer Zeile in der List-View fest und +muss durch Tabulatoren getrennte Werte enthalten. Sind weniger Werte eines Elements in +array definiert als im Headers-String vorgegeben, bleiben die restlichen +Felder leer. Sind mehr Werte eines Element in array angegeben als +im Headers-String, werden die überzählgen stillschweigend ignoriert. +Keiner der Strings in array darf leer sein (sollte ein leerer String +vorhanden sein, werden alle nachfolgenden, inklusive dem Leerstring ignoriert). +
+Enthält ein Listeneintrag Zeilenumbrüche ('\n'), so wird er entsprechend +mehrzeilig dargestellt. +
+Das optionale statement wird ausgeführt, wann immer der Benutzer auf einen Eintrag
+in dlgListView doppelklickt.
+Bevor statement ausgeführt wird, werden alle Variablen, die mit den Dialog-Objekten benutzt
+wurden, aktualisiert. Alle Änderungen, die in statement gemacht wurden, wirken sich auf
+den Dialog aus, sobald das Statement zurückgegeben wird.
+
+Ist der Ausgangswert von Selected ausserhalb des Index-Bereichs von array, +wird kein Eintrag selektiert. +
+Ist Headers ein leerer String, wird das erste Element von array als +Header-String benutzt. Folglich ist der Index des ersten Eintrags dann 1. +
+Der Inhalt von dlgListView kann in einer beliebigen Spalte sortiert werden, indem man +auf dessen Spalten-Header klickt. Die Spalten-Reihenfolge kann man durch Anklicken&Ziehen +des Spalten-Headers verändern. Beachten Sie, dass keine dieser Änderunen eine Auswirkung +auf den Inhalt von array hat. +Soll der Inhalt alphanumerisch sortiert werden, kann ein numeric string[]-Array +verwendet werden. +
+string Colors[] = { "red\tThe color RED", "green\tThe color GREEN", "blue\tThe color BLUE" }; +int Selected = 0; // initially selects "red" +dlgListView("Name\tDescription", Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+Das dlgPushButton-Statement definiert einen Push-Button mit dem angegebenen Text. +
+Enthält Text ein '&'-Zeichen, wird das folgende Zeichen zum Hot-Key. Wenn der +Benutzer dann Alt+hotkey drückt, wird dieser Button selektiert. +Soll ein '&'-Zeichen im Text verwendet werden, muss es mit einem +Escape-Zeichen markiert werden. +
+Beginnt Text mit einem '+'-Zeichen, wird dieser Button der Default-Button.
+Dieser wird betätigt, wenn der Benutzer ENTER drückt.
+Wenn Text mit einem '-'-Zeichen beginnt, wird dieser Button der Cancel-Button.
+Dieser wird gewählt wenn der Benutzer den Dialog schließt.
+Achtung: Stellen Sie sicher, dass das statement eines so markierten Buttons einen
+Aufruf von dlgReject() enthält! Ansonsten ist es dem Benutzer nicht
+möglich den Dialog überhaupt zu schließen!
+Um ein '+' oder '-'-Zeichen als erstes Zeichen des Textes zu verwenden,
+muss es mit einem Escape-Zeichen markiert werden.
+
+Wenn der Benutzer einen dlgPushButton selektiert, wird das angegebene statement
+ausgeführt.
+Bevor statement ausgeführt wird, werden alle Variablen, die mit den Dialog-Objekten
+benutzt wurden, aktualisiert. Alle Änderungen, die in statement gemacht wurden, wirken sich
+auf den Dialog aus, sobald das Statement zurückgegeben wird.
+
+int defaultWidth = 10; +int defaultHeight = 20; +int width = 5; +int height = 7; +dlgPushButton("&Reset defaults") { + width = defaultWidth; + height = defaultHeight; + } +dlgPushButton("+&Accept") dlgAccept(); +dlgPushButton("-Cancel") { if (dlgMessageBox("Are you sure?", "Yes", "No") == 0) dlgReject(); } ++ + + +
+Das dlgRadioButton-Statement definiert einen Radio-Button mit dem angegebenen Text. +
+Enthält Text ein '&'-Zeichen, wird das folgende Zeichen zum Hot-Key. Wenn der +Benutzer dann Alt+hotkey drückt, wird dieser Button selektiert. +Soll ein '&'-Zeichen im Text verwendet werden, muss es mit einem +Escape-Zeichen markiert werden. +
+dlgRadioButton kann nur innerhalb einer dlgGroup verwendet werden.
+Alle Radio-Buttons innerhalb derselben Group müssen dieselbe Selected-Variable haben!
+
+Wenn der Benutzer einen dlgRadioButton selektiert, wird der Index dieses Buttons innerhalb
+der dlgGroup in der Selected-Variablen gespeichert.
+Der Ausgangswert von Selected definiert, welcher Radio-button per default selektiert ist.
+Liegt Selected ausserhalb des gültigen Bereichs dieser Group, ist kein Radio-Button
+selektiert.
+Um die richtige Radio-Button-Selektion zu erhalten, muss Selected schon vor
+der Definition des ersten dlgRadioButton festgelegt werden, und darf nicht verändert
+werden, während man weitere Radio-Buttons hinzufügt. Ansonsten ist es ungewiss welcher
+Radio-Button (wenn überhaupt einer) selektiert wird.
+
+Das optionale statement wird ausgeführt, wenn ein dlgRadioButton selektiet wird. +
+int align = 1; +dlgGroup("Alignment") { + dlgRadioButton("&Top", align); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + } ++ + + +
+Das dlgRealEdit-Statement definiert ein Real-Eingabe-Feld mit dem angegebenen Value (Wert). +
+Wenn Value ursprünglich ausserhalb des Bereiches von Min und Max liegt, +wird dieser auf diese Werte begrenzt. +
+real Value = 1.4142; +dlgHBoxLayout { + dlgLabel("Enter a &Number between 0 and 99"); + dlgRealEdit(Value, 0.0, 99.0); + } ++ + + +
+Das dlgSpacing-Statement definiert zusätzlichen Abstand in einem Vertical- bzw. +Horizontal-Box-Layout-Kontext. +
+Size definiert die Anzahl der Pixel des zusätzlichen Abstands. +
+dlgVBoxLayout { + dlgLabel("Label 1"); + dlgSpacing(40); + dlgLabel("Label 2"); + } ++ + + +
+Das dlgSpinBox-Statement definiert ein Spin-Box-Auswahl-Feld mit dem angegebenen Value. +
+Wenn Value ursprünglich ausserhalb des Bereiches von Min und Max liegt, +wird dieser auf diese Werte begrenzt. +
+int Value = 42; +dlgHBoxLayout { + dlgLabel("&Select value"); + dlgSpinBox(Value, 0, 99); + } ++ + + +
+Das dlgStretch-Statement definiert einen leeren dehnbaren Abstand in einem Vertical- +oder einem Horizontal-Box-Layout-Kontext. +
+Factor definiert den Dehnungsfaktor des Abstands. +
+dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") { dlgAccept(); }; + dlgPushButton("Cancel") { dlgReject(); }; + } ++ + + +
+Das dlgStringEdit-Statement definiert ein Text-Eingabe-Feld mit dem angegebenen Text. +
+string Name = "Linus"; +dlgHBoxLayout { + dlgLabel("Enter &Name"); + dlgStringEdit(Name); + } ++ + + +
+Das dlgTabPage-Statement definiert eine Tab-Page mit dem angegebenen Title, die +statement enthält. +
+Enthält Title ein '&'-Zeichen, wird das folgende Zeichen zum Hot-Key. +Drückt der Benutzer Alt+hotkey, wird diese Tab-Page geöffnet. +Soll im Text ein '&'-Zeichen verwendet werden, muss es mit einem +Escape-Zeichen markiert werden. +
+Tab-Pages können nur innerhalb eines dlgTabWidget verwendet werden. +
+Standardmäßig enthält dlgTabPage ein dlgVBoxLayout, +so dass man sich bei einer einfachen Tab-Page nicht um das Layout kümmern muss. +
+dlgTabWidget { + dlgTabPage("Tab &1") { + dlgLabel("This is page 1"); + } + dlgTabPage("Tab &2") { + dlgLabel("This is page 2"); + } + } ++ + + +
+Das dlgTabWidget-Statement definiert einen Platzhalter für einen Satz von Tab-Pages. +
+statement ist eine Liste eines oder mehrerer dlgTabPage-Objekte. +Es dürfen keine anderen Dialog-Objekte in dieser Liste enthalten sein. +
+dlgTabWidget { + dlgTabPage("Tab &1") { + dlgLabel("This is page 1"); + } + dlgTabPage("Tab &2") { + dlgLabel("This is page 2"); + } + } ++ + + +
+Das dlgTextEdit-Statement definiert ein mehrzeiliges text-Eingabe-Feld mit dem angegebenen Text. +
+Die einzelnen Zeilen in Text müssen mit einem Newline-Zeichen ('\n') getrennt werden. +Beliebige Leerzeichen am Ende der Text-Zeilen werden gelöscht. +Leere Zeilen am Endes des Textes werden vollständig entfernt. +
+string Text = "This is some text.\nLine 2\nLine 3"; +dlgVBoxLayout { + dlgLabel("&Edit the text"); + dlgTextEdit(Text); + } ++ + + +
+Das dlgTextView-Statement definiert ein mehrzeiliges Text-Viewer-Feld mit dem angegebenen Text. +
+Der Text darf HTML-Tags enthalten. +
+Falls Link angegeben wird und der Text Hyperlinks enthält, wird statement +ausgeführt wenn der Benutzer auf einen Hyperlink klickt, wobei der Wert von Link +auf das gesetzt wird, was im <a href=...>-Tag als Wert für href angegeben wurde. +Ist die Link-Variable nach der Ausführung von statement nicht leer, so +findet die standardmäßige Behandlung von Hyperlinks statt. Dies ist auch der Fall, wenn +Link vor dem Öffnen von dlgTextView bereits Text enthält, was es ermöglicht, +zu Beginn an eine vorgegebene Textstelle zu positionieren. +
+string Text = "This is some text.\nLine 2\nLine 3"; +dlgVBoxLayout { + dlgLabel("&View the text"); + dlgTextView(Text); + } ++ + + +
+Das dlgVBoxLayout-Statement öffnet einen Vertical-Box-Layout-Kontext für das angegebene +statement. +
+Standardmäßig enthält dlgDialog ein dlgVBoxLayout, +so dass man sich bei einfachen Dialogen keine Gedanken zum Layout machen muss. +
+dlgVBoxLayout { + dlgLabel("Box 1"); + dlgLabel("Box 2"); + dlgLabel("Box 3"); + } ++ + + +
+Es gibt verschiedene Layout-Kontexte, wie grid, horizontal +oder vertical. +
+dlgGridLayout { + dlgCell(5, 2) dlgLabel("Text"); + } ++Soll das Objekt über mehr als eine Zelle gehen, müssen Sie die Koordinaten der Start-Zelle und +der End-Zelle angeben. Um eine Group zu plazieren, die sich von Reihe 1, Spalte 2 über Reihe 3, +Spalte 5 erstreckt, schreiben Sie +
+dlgGridLayout { + dlgCell(1, 2, 3, 5) dlgGroup("Title") { + //... + } + } ++
+Die Sonder-Objekte dlgStretch und dlgSpacing +können verwendet werden, um die Verteilung der Abstände zu verfeinern. +
+Um zwei Buttons zu definieren, die sich bis an den rechten Rand des Dialogs erstrecken, schreiben Sie +
+dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("Cancel") dlgReject(); + } ++
+
dlgAccept() | schließt den Dialog und akzeptiert dessen Inhalt | |
dlgRedisplay() | aktualisiert den Dialog nachdem beliebige Werte verändert wurden | |
dlgReset() | setzt alle Dialog-Objekte auf den Ursprungswert zurück | |
dlgReject() | schließt den Dialog und verwirft dessen Inhalt |
+Die dlgAccept-Funktion schließt dlgDialog, +und kehrt zurück nachdem das aktuelle Statement beendet wurde. +
+Jede Änderung, die der Benutzer im Dialog macht, wird übernommen und an die Variablen, +die bei der Definition der Dialog-Objekte angegeben +wurden, kopiert. +
+Die optionale Angabe von Result ist der Wert der vom Dialog geliefert wird. +Das sollte typischerweise ein positiver Integer-Wert sein. +Wird kein Wert angegeben, ist der Standardwert gleich 1. +
+Bitte beachten Sie, dass dlgAccept() wieder in die normale Programm- +Routine zurückkehrt, so wie in dieser Sequenz: +
+dlgPushButton("OK") { + dlgAccept(); + dlgMessageBox("Accepting!"); + } ++Das Statement nach dlgAccept() wird noch ausgeführt! +
+int Result = dlgDialog("Test") { + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + }; ++ + + +
+Die dlgRedisplay-Funktion wird aufgerufen, um den dlgDialog, +nach dem Verändern von Variablen, die in den Dialog-Objekten +definiert wurden, zu aktualisieren. +
+Sie brauchen nur dlgRedisplay() aufrufen, wenn der Dialog während der Ausführung +des Programmcodes aktualisiert werden soll. +Im folgenden Beispiel wird der Status auf "Running..." gesetzt und dlgRedisplay() +muss aufgerufen werden, um die Änderungen für die Ausführung des Programms wirksam +zu machen. Nach dem Ändern des Status auf "Finished.", braucht man dlgRedisplay() +nicht mehr aufrufen, da alle Dialog-Objekte nach dem Verlassen des Statements aktualisiert +werden. +
+string Status = "Idle"; +int Result = dlgDialog("Test") { + dlgLabel(Status, 1); // note the '1' to tell the label to be updated! + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + dlgPushButton("Run") { + Status = "Running..."; + dlgRedisplay(); + // some program action here... + Status = "Finished."; + } + }; ++ + + +
+Die dlgReset-Funktion kopiert die ursprünglichen Werte in alle +Dialog-Objekte des aktuellen +dlgDialog zurück. +
+Alle Änderungen, die der Benutzer im Dialog machte, werden verworfen. +
+Ein Aufruf von dlgReject() impliziert einen +Aufruf von dlgReset(). +
+int Number = 1; +int Result = dlgDialog("Test") { + dlgIntEdit(Number); + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + dlgPushButton("Reset") dlgReset(); + }; ++ + + +
+Die dlgReject-Funktion veranlasst, dass dlgDialog +geschlossen wird und nach dem Beenden der aktuellen Statement-Sequenz zurückkehrt. +
+Jede Änderung, die der Benutzer im Dialog machte, wird verworfen. +Die Variablen, die während der Definition der Dialog-Objekte +übergeben wurden, werden auf Ihren ursprünglichen Wert zurückgesetzt. +
+Der optionale Wert für Result wird vom Dialog zurückgegeben. +Typischerweise ist das 0 oder ein negativer Integer-Wert. +Wird kein Wert angegeben, ist er standardmäßig 0. +
+Beachten Sie, dass dlgReject() wieder in die normale Programm-Routine zurückkehrt, +wie in dieser Sequenz: +
+dlgPushButton("Cancel") { + dlgReject(); + dlgMessageBox("Rejecting!"); + } ++Das Statement nach dlgReject() wird auch noch ausgeführt! +
+Der Aufruf von dlgReject() impliziert den Aufruf von dlgReset(). +
+int Result = dlgDialog("Test") { + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + }; ++ + + +
+Dazu müssen Sie dem Zeichen einen Backslash voranstellen, so wie in +
+dlgLabel("Miller \\& Co."); ++Das Ergebnis wird im Dialog so aussehen: "Miller & Co." +
+Beachten Sie, dass hier in Wirklichkeit zwei Backslash-Zeichen verwendet wurden,
+da diese Zeile erst durch den User-Language-Parser geht, der den ersten Backslash
+abzieht.
+
+
+
+Ein vollständiges Beispiel
+Hier folgt ein vollständiges Beispiel eines User-Language-Dialogs:
+
+int hor = 1;
+int ver = 1;
+string fileName;
+int Result = dlgDialog("Enter Parameters") {
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel("This is a simple dialog");
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgGroup("Horizontal") {
+ dlgRadioButton("&Top", hor);
+ dlgRadioButton("&Center", hor);
+ dlgRadioButton("&Bottom", hor);
+ }
+ dlgGroup("Vertical") {
+ dlgRadioButton("&Left", ver);
+ dlgRadioButton("C&enter", ver);
+ dlgRadioButton("&Right", ver);
+ }
+ }
+ dlgHBoxLayout {
+ dlgLabel("File &name:");
+ dlgStringEdit(fileName);
+ dlgPushButton("Bro&wse") {
+ fileName = dlgFileOpen("Select a file", fileName);
+ }
+ }
+ dlgGridLayout {
+ dlgCell(0, 0) dlgLabel("Row 0/Col 0");
+ dlgCell(1, 0) dlgLabel("Row 1/Col 0");
+ dlgCell(0, 1) dlgLabel("Row 0/Col 1");
+ dlgCell(1, 1) dlgLabel("Row 1/Col 1");
+ }
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("Cancel") dlgReject();
+ }
+ };
+
+
+
+
+Unterstützte HTML-Tags
+EAGLE unterstützt eine Teilmenge von Tags (Steuerzeichen), die zum Formatieren von HTML-Seiten
+verwendet werden.
+Damit kann man Texte von einigen Objekten im User-Language-Dialog,
+in der #usage-Directive oder in der Description
+von Bibliotheks-Objekten formatieren.
+
+Text wird zu HTML-Text, wenn die erste Zeile ein Tag enthält. +Wenn das nicht der Fall ist und Sie den Text formatieren wollen, +schließen Sie den ganzen Text in das <html>...</html> Tag ein. +
+Die folgende Tabelle listet alle unterstützten HTML-Tags mit ihren verfügbaren Attributen auf: +
+
Tag | Beschreibung | |
<html>...</html> | Ein HTML-Dokument. Es versteht folgende Attribute
+
| |
<h1>...</h1> | Eine Haupt-Überschrift. | |
<h2>...</h2> | Eine untergeordnete Überschrift. | |
<h3>...</h3> | Eine weiter untergeordnete Überschrift. | |
<p>...</p> | Ein links-bündiger Abschnitt. Bestimmen Sie die Anordnung mit dem align Attribut. Mögliche Werte sind left, right und center. | |
<center>...</center> | Ein zentrierter Abschnitt. | |
<blockquote>...</blockquote> | Ein eingerückter Abschnitt, sinnvoll für Zitate. | |
<ul>...</ul> | Eine ungeordnete Liste. Sie können auch ein type-Argument angeben um einen Bullet-Style zu definieren. Default ist type=disc, andere Typen sind circle und square. | |
<ol>...</ol> | Eine geordnete Liste. Sie können auch ein type-Argument angeben um die Art der Nummerierung zu definieren. Default ist type="1", andere Typen sind "a" und "A". | |
<li>...</li> | Ein Punkt in einer Liste. Dieses Tag kann nur innerhalb eines ol oder ul Kontext verwendet werden. | |
<pre>...</pre> | Für größere Mengen von Code. Leerzeichen im Inhalt bleiben erhalten. Für kleinere Mengen Code, benutzen Sie den Inline-style code. | |
<a>...</a> | Ein Anker oder Link. Folgende Attribute sind erlaubt
+
| |
<em>...</em> | Emphasized (kursiv)(genauso wie <i>...</i>). | |
<strong>...</strong> | Stark (genauso wie <b>...</b>). | |
<i>...</i> | Kursiver Text. | |
<b>...</b> | Fetter Text. | |
<u>...</u> | Unterstrichener Text. | |
<big>...</big> | Eine größere Texthöhe. | |
<small>...</small> | Eine kleinere Texthöhe. | |
<code>...</code> | Kennzeichnet Code. (wie auch <tt>...</tt>. Für größere Mengen an Code, verwenden Sie das Block-Tag pre. | |
<tt>...</tt> | Typewriter Schriftart. | |
<font>...</font> | Zur Bestimmung von Texthöhe, Schrift-Familie und Textfarbe. Das Tag versteht folgende Attribute:
+
| |
<img...> | Ein Bild. Dieses Tag versteht die folgenden Attribute:
+
| |
<hr> | Eine waagrechte Linie. | |
<br> | Ein Zeilenumbruch. | |
<nobr>...</nobr> | Kein Zeilenumbruch.Erhält "Word Wrap". | |
<table>...</table> | Eine Tabellen-Definition.
+Die Standardtabelle ist ohne Rahmen. Geben Sie das boolsche Attribut
+border an um einen Rahmen zu erhalten. Andere Attribute sind:
+
| |
<tr>...</tr> | Eine Tabellen-Reihe. Kann nur mit table verwendet werden. Versteht die Attribute:
+
| |
<td>...</td> | Eine Zelle in einer Tabelle. Kann nur innerhalb tr verwendet werden.Versteht die Attribute:
+
| |
<th>...</th> | Eine "Header"-Zelle in der Tabelle. Wie td aber als default mit zentrierter Ausrichtung und fetter Schriftart. | |
<author>...</author> | Markiert den Autor des Texts. | |
<dl>...</dl> | Eine Definitions-Liste. | |
<dt>...</dt> | Ein Definitions-Tag. Kann nur innerhalb dl verwendet werden. | |
<dd>...</dd> | Definitions-Daten. Kann nur innerhalb dl verwendet werden. |
+
Tag | Bedeutung | |
< | < | |
> | > | |
& | & | |
| Leerzeichen ohne Umbruch | |
ä | ä | |
ö | ö | |
ü | ü | |
Ä | Ä | |
Ö | Ö | |
Ü | Ü | |
ß | ß | |
© | © | |
° | ° | |
µ | µ | |
± | ± |
+.x#n ++Dabei steht für 'x' der Buchstabe +
+b in Board-Dateien
+s in Schaltplan-Dateien
+l in Bibliotheks-Dateien
+
+n steht für eine einstellige Zahl von +1..9. Höhere Ziffern zeigen ältere Dateien an. +
+Die feste Position des Zeichens '#' ermöglicht das einfache Löschen +aller Backup-Dateien aus dem Betriebssystem heraus mit *.?#? +als "Wildcard". +
+Bitte beachten Sie, dass Backup-Dateien mit derselben Ziffer 'n' +nicht notwendigerweise konsistente Paare von Platinen- und +Schaltplan-Dateien repräsentieren. +
+Die maximale Zahl von Backup-Kopien kann im +Backup-Dialog +gesetzt werden. +
+Diese Sicherungskopie erhält den Namen nach folgendem Schema: +
+.x## ++Dabei steht für 'x' der Buchstabe +
+b in Board-Dateien
+s in Schaltplan-Dateien
+l in Bibliotheks-Dateien
+
+Die Sicherheits-Backup-Datei wird nach einem erfolgreichen Abspeichern +der Zeichnung wieder gelöscht. Kann die Zeichnung nicht mit dem WRITE-Befehl +gespeichert werden (z. B. aufgrund eines Stromausfalls), benennen Sie +die Datei einfach um. So kann sie als normale Schaltplan-, Board- bzw. +Bibliotheksdatei wieder geladen werden. +
+Die Sicherungsintervall kann im Backup-Dialog gesetzt werden.
+
+
+
+
+Unter normalen Umständen sind Platine und Schaltplan immer konsistent,
+sofern sie nicht separat editiert worden sind (in diesem Fall
+würden Sie mit der Meldung
+Die Forward&Back-Annotation ist nicht aktiv!
+gewarnt worden sein).
+
+Wenn ein Platinen/Schaltplan-Paar geladen wird, überprüft das Programm
+Konsistenzmarkierungen in den Dateien, um zu sehen, ob sie noch
+konsistent sind. Weisen diese Markierungen auf eine Inkonsistenz hin,
+dann bietet Ihnen das Programm an, einen
+Electrical Rule Check (ERC) auszuführen,
+der beide Dateien überprüft.
+
+Fällt die Prüfung positiv aus, werden die Dateien als konsistent markiert,
+und die Forward&Back-Annotation wird aktiviert.
+
+Werden die Dateien als inkonsistent erkannt, erscheint das ERC-Protokoll
+in einem Dialog und die Forward&Back-Annotation wird
+nicht aktiviert.
+
+Bitte erschrecken Sie nicht, wenn zahlreiche Fehlermeldungen
+erscheinen. In den meisten Fällen reduziert schon eine einzige Korrektur
+(wie die Umbenennung eines Netzes) die Zahl der Meldungen für den
+nächsten Durchlauf erheblich.
+
+CadSoft Computer GmbH
+Forward&Back-Annotation
+Eine Schaltplandatei und die zugehörigen Platinendatei sind durch
+automatische Forward&Back-Annotation logisch verknüpft. Der Benutzer muss
+sich darum normalerweise nicht kümmern. Dennoch wird in diesem Abschnitt
+beschrieben, was genau bei der Forward&Back-Annotation geschieht:
+
+
+
+
+
+Konsistenzprüfung
+Damit die Forward&Back-Annotation wirksam werden kann, müssen
+Platine und Schaltplan konsistent sein. Das heisst, sie müssen äquivalente
+Bauteile und Netze bzw. Signale enthalten.
+Platine und Schaltplan konsistent machen
+Um ein inkonsistentes Schaltplan-/Platinen-Paar konsistent zu machen,
+müssem Sie alle im ERC-Protokoll aufgeführten Inkonsistenzen manuell
+beseitigen.
+Das kann mit Hilfe der Editor-Befehle wie
+NAME,
+VALUE,
+PINSWAP,
+REPLACE etc. erreicht werden.
+Nach der Korrektur müssen Sie den
+ERC-Befehl nochmals verwenden,
+um die Dateien zu überprüfen und um die Forward&Back-Annotation aktivieren
+zu können.
+
+
+
+Einschränkungen
+Folgende Aktionen sind in einer Platine nicht erlaubt, wenn die
+Back-Annotation aktiv ist, wenn also der Schaltplan ebenfalls geladen ist:
+
+
+Sollten Sie eine dieser Operationen auszuführen versuchen, dann erhalten
+Sie eine Meldung, dass dies unter Kontrolle der Back-Annotation nicht
+möglich ist. Bitte führen Sie die Operation dann im Schaltplan aus, sie
+wird dann automatisch in die Platine übernommen. Sollten Sie die
+Operation dennoch im Board ausführen wollen, müssen Sie das
+Schaltplan-Fenster schließen. In diesem Fall sind Schaltplan und Board
+aber nicht mehr konsistent!
+
+
+
+Technische Unterstützung
+Als registrierter EAGLE-Benutzer erhalten Sie von CadSoft kostenlose
+technische Unterstützung. Es gibt folgende Möglichkeiten, uns zu
+erreichen oder die neuesten Programmversionen, Bibliotheken und Treiber
+zu erhalten:
+
+Pleidolfweg 15
+84568 Pleiskirchen
+Deutschland
+
Vertrieb | 08635-6989-10 | |
Hotline | 08635-6989-30 | |
Fax | 08635-6989-40 | |
support@cadsoft.de | ||
URL | www.cadsoft.de |
+Unter Mac OS X finden Sie diese Angaben unter "EAGLE/Über EAGLE". + |
+Es gibt verschiedene Lizenz-Typen, die sich darin unterscheiden, +wie viele Benutzer erlaubt sind und wo das Programm verwendet werden +darf. +
+Ein typischer Anwender einer Einzelplatz-Lizenz ist jemand, der +einen fest installierten PC und zusätzlich einen Notebook-Computer hat, +den er unterwegs benutzt. Da er immer nur einen Computer benutzt, reicht +die Einzelplatz-Lizenz aus. +
+Hierzu geben Sie im Dialog "EAGLE Lizenz" den Dateinamen Ihrer EAGLE-Lizenzdatei ein, +sowie den dazugehörigen Installations-Code, den Sie zusammen mit der Lizenzdatei +erhalten haben (dieser Code besteht aus zehn Kleinbuchstaben). +
+Nach dem Betätigen der Enter-Taste oder dem Anklicken des +OK-Buttons +ist EAGLE mit Ihren persönlichen Lizenzdaten installiert. +
+Wenn Sie Probleme mit der Installation haben oder über die +Gültigkeit Ihrer Lizenz im Zweifel sind, setzen Sie sich bitte mit +unserem +Technischen Support in Verbindung. +
+Falls Sie eine Fehlermeldung der Form +
+Die Light-Edition von EAGLE kann die gewünschte Aktion nicht ausführen! +
+erhalten, so bedeutet dies, dass Sie versucht haben, etwas zu tun, das +im Widerspruch zu den Einschränkungen der benutzten EAGLE-Edition steht, +wie etwa ein Bauteil ausserhalb der zulässigen Fläche zu plazieren. +
+Sowohl die Standard als auch die Light Edition von EAGLE +ist in der Lage, Dateien zu laden, die mit der Professional +Edition erzeugt wurden, selbst wenn diese Zeichnungen die Editier-Möglichkeiten +der verwendeten Edition übersteigen. +
+Um zu sehen, welcher Edition Ihre Lizenz entspricht, wählen Sie +Hilfe/Über EAGLE aus dem Menü des Control Panels. + + + diff --git a/eagle-5.7.0/bin/eagle_de.qm b/eagle-5.7.0/bin/eagle_de.qm new file mode 100644 index 0000000..02cab60 Binary files /dev/null and b/eagle-5.7.0/bin/eagle_de.qm differ diff --git a/eagle-5.7.0/bin/eagle_en.htm b/eagle-5.7.0/bin/eagle_en.htm new file mode 100644 index 0000000..7d242b9 --- /dev/null +++ b/eagle-5.7.0/bin/eagle_en.htm @@ -0,0 +1,16731 @@ + +
+EAGLE Help Version 5.7.0 | ++Copyright © 2010 CadSoft Computer GmbH + |
+You can also display an editor command's help page by entering +
+HELP command ++replacing "command" with, e.g., MOVE, which would display the help +page for the MOVE command. +
+Anywhere else, pressing the F1 key will bring up a context sensitive +help page for the menu, dialog or action that is currently active. +
+For detailed information on how to get started with EAGLE please read the +following help pages: +
+ + + ++The following editor commands can be used to customize the way EAGLE works. +They can be given either directly from an editor window's command line, +or in the eagle.scr file. +
Command menu | MENU command..; | |
Assign keys | ASSIGN function_key command..; | |
Snap function | SET SNAP_LENGTH number; | |
SET CATCH_FACTOR value; | ||
SET SELECT_FACTOR value; | ||
Content of menus | SET USED_LAYERS name | number; | |
SET WIDTH_MENU value..; | ||
SET DIAMETER_MENU value..; | ||
SET DRILL_MENU value..; | ||
SET SMD_MENU value..; | ||
SET SIZE_MENU value..; | ||
SET ISOLATE_MENU value..; | ||
SET SPACING_MENU value..; | ||
SET MITER_MENU value..; | ||
Wire bend | SET WIRE_BEND bend_nr; | |
Beep on/off | SET BEEP OFF | ON; |
Color for grid lines | SET COLOR_GRID color; | |
Color for layer | SET COLOR_LAYER layer color; | |
Fill style for layer | SET FILL_LAYER layer fill; | |
Grid parameter | SET MIN_GRID_SIZE pixels; | |
Min. text size displayed | SET MIN_TEXT_SIZE size; | |
Display of net lines | SET NET_WIRE_WIDTH width; | |
Display of pads | SET DISPLAY_MODE REAL | NODRILL; | |
SET PAD_NAMES OFF | ON; | ||
Display of bus lines | SET BUS_WIRE_WIDTH width; | |
DRC fill style | SET DRC_FILL fill_name; | |
Polygon processing | SET POLYGON_RATSNEST OFF | ON; | |
Vector font | SET VECTOR_FONT OFF | ON; |
Package check | SET CHECK_CONNECTS OFF | ON; | |
Grid parameters | GRID options; | |
Replace mode | SET REPLACE_SAME NAMES | COORDS; | |
UNDO Buffer | SET UNDO_LOG OFF | ON; | |
Wire Optimizing | SET OPTIMIZING OFF | ON; | |
Net wire termination | SET AUTO_END_NET OFF | ON; | |
Automatic junctions | SET AUTO_JUNCTION OFF | ON; |
Pad shape | CHANGE SHAPE shape; | |
Wire width | CHANGE WIDTH value; | |
Pad/via diameter | CHANGE DIAMETER diameter; | |
Pad/via/hole drill diam. | CHANGE DRILL value; | |
Smd size | CHANGE SMD width height; | |
Text height | CHANGE SIZE value; | |
Text line width | CHANGE RATIO ratio; | |
Text font | CHANGE FONT font; | |
Polygon parameter | CHANGE THERMALS OFF | ON; | |
Polygon parameter | CHANGE ORPHANS OFF | ON; | |
Polygon parameter | CHANGE ISOLATE distance; | |
Polygon parameter | CHANGE POUR SOLID | HATCH; | |
Polygon parameter | CHANGE RANK value; | |
Polygon parameter | CHANGE SPACING distance; |
+eagle [ options [ filename [ layer ] ] ] ++
-Cxxx | execute the given Command | |
-Dxxx | Draw tolerance (0.1 = 10%) | |
-Exxx | Drill tolerance (0.1 = 10%) | |
-Fxxx | Flash tolerance (0.1 = 10%) | |
-N- | no command line prompts | |
-O+ | Optimize pen movement | |
-Pxxx | plotter Pen (layer=pen) | |
-Rxxx | drill Rack file | |
-Sxxx | Scriptfile | |
-Wxxx | aperture Wheel file | |
-X- | eXecute CAM Processor | |
-a- | emulate Annulus | |
-c+ | positive Coordinates | |
-dxxx | Device (-d? for list) | |
-e- | Emulate apertures | |
-f+ | Fill pads | |
-hxxx | page Height (inch) | |
-m- | Mirror output | |
-oxxx | Output filename | |
-pxxx | Pen diameter (mm) | |
-q- | Quick plot | |
-r- | Rotate output 90 degrees | |
-sxxx | Scale factor | |
-t- | emulate Thermal | |
-u- | output Upside down | |
-vxxx | pen Velocity | |
-wxxx | page Width (inch) | |
-xxxx | offset X (inch) | |
-yxxx | offset Y (inch) |
+where xxx means that further data, e.g. a file name or a decimal number +needs to be appended to the option character (without space or separated by a space), +as in +
+-Wmywheel.whl +-W mywheel.whl +-e Aperture emulation on +-e+ dto. +-e- Aperture emulation off ++For flag options, a '-' means that the option is off by default, while +'+' means it is on by default. +
+Flag options (e.g. -e) can be used without repeating the '-' character: +
-eatm | Aperture emulation on, annulus and thermal emulation on, mirror output | |
-ea-t+ | Aperture emulation on, annulus emulation off, thermal emulation on |
-D0.10 | adjusts the draw tolerance to ±10% | |
-D+0.1 -D-0.05 | adjusts the draw toleranceto +10% and -5% |
+eagle -C "window (1 1) (2 2);" myboard.brd ++EAGLE will load the given file and execute the command as if it had been +typed into the editor window's command line. +
+The following conditions apply for the '-C' option: +
+eagle -C "" ++Note that in this special case there must be a blank between the option character +and the quotes, so that the program will see the explicitly empty string. There +also doesn't have to be a file name here, because no command will actually be +executed. +
+Wherever coordinates or sizes (like width, diameter etc.) can be entered, they may
+be given with units, as in 50mil or 0.8mm. If no unit is given, the current grid unit is used.
+
+
+
+Drawing a Schematic
+Create a Schematic File
+Use File/New and Save as to create a schematic with a name of your
+choice.
+Load a Drawing Frame
+Load library FRAMES with USE and place a frame of your choice with ADD.
+
+All the components, together with their connections drawn as airwires, +appear beside a blank board ready for placing. Power pins are +automatically connected to the appropriate supply (if not connected by +a net on the schematic). +
+The board is linked to the schematic via Forward&Back Annotation. +This mechanism makes sure that schematic and board are consistent. +When editing a drawing, board and schematic must be loaded to keep +Forward&Back Annotation active. +
+To start, open a library. Use the File menu Open or New command (not +the USE command). +
+Click the Edit Package icon and edit a new package by typing its +name in the New field of the dialog box. +
+Set the proper distance GRID. +
+NAME and place PADs properly. +
+Add texts >NAME and >VALUE with the TEXT command (show actual name and +value in the board) and draw package outlines (WIRE command) in the +proper layers. +
+Click the Edit Symbol icon and edit a new symbol by typing its +name in the New field of the dialog box. +
+Place and name pins with the commands PIN and NAME and provide pin +parameters (CHANGE). +
+Add texts >NAME and >VALUE with the TEXT command (show actual name and +value in the schematic) and draw symbol outlines (WIRE command) in the +proper layers. +
+Click the Edit Device icon and edit a new device by typing its +name in the New field of the dialog box. +
+Assign the package with the PACKAGE command. +
+Add the gate(s) with ADD, you can have as many gates as needed. +
+Use CONNECT to specify which of the packages pads are +connected to the pins of each gate. +
+Save the library and you can USE it from the schematic or board
+editor.
+
+
+
+Control Panel
+The Control Panel is the top level window of EAGLE.
+It contains a tree view on the left side, and an information window on the right side.
+Directories
+The top level items of the tree view represent the various types of EAGLE files.
+Each of these can point to one or more directories that contain files of that type.
+The location of these directories can be defined with the directories dialog.
+If a top level item points to a single directory, the contents of that directory will
+appear if the item is opened (either by clicking on the little symbol to the left, or by
+double clicking the item). If such an item points to more directories, all of these
+directories will be listed when the item is opened.
+
+
Directories | a file named DESCRIPTION in that directory | |
Libraries | the description of the library | |
Devices | the description of the device | |
Packages | the description of the package | |
Design Rules | the description of the design rules file | |
User Language Programs | the text defined with the #usage directive | |
Scripts | the comment at the beginning of the script file | |
CAM Jobs | the description of the CAM job |
New | create a new file | |
Open | open an existing file | |
Open recent projects | open a recently used project | |
Save all | save all modified editor files | |
Close project | close the current project | |
Exit | exit from the program |
Refresh | refresh the contents of the tree view | |
Sort | change the sorting of the tree view |
Directories... | opens the directories dialog | |
Backup... | opens the backup dialog | |
User interface... | opens the user interface dialog | |
Window positions... | opens the window positions dialog |
Control Panel | switch to the Control Panel | |
1 Schematic - ... | switch to window number 1 | |
2 Board - ... | switch to window number 2 |
General | opens a general help page | |
Context | opens the help page for the current context | |
Control Panel | opens the help page you are currently looking at | |
EAGLE License | opens the license dialog | |
Check for Update | checks if a new version of EAGLE is available | |
About EAGLE | displays details on your EAGLE version and license |
+Printing a file through this context menu option will always print the file
+as it is on disk, even if you have an open editor window in which you have
+modified the file! Use the PRINT command to
+print the drawing from an open editor window.
+Please note that polygons in boards will not be automatically calculated
+when printing via the context menu! Only the outlines will be drawn.
+To print polygons in their calculated shape you have to load the drawing
+into an editor window, enter RATSNEST
+and then PRINT.
+
+All entries may contain one or more directories, separated by a colon (':'), +in which to look for the various types of files. +
+On Windows the individual directory names are separated by a semicolon (';'). + |
+The special variables $HOME and $EAGLEDIR can be used to reference +the user's home directory and the EAGLE program directory, respectively. +
+On Windows the value of $HOME is either that of the environment variable +HOME (if set), or the value of the registry key "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal", +which contains the actual name of the "My Documents" directory. + |
Pulldown menu | activates the pulldown menu at the top of the editor window | |
Action toolbar | activates the action toolbar containing buttons for "File", "Print" etc. | |
Parameter toolbar | activates the dynamic parameter toolbar, which contains all the parameters that are available for the currently active command | |
Command buttons | activates the command buttons | |
Command texts | activates the textual command menu | |
Sheet thumbnails | aktivates the sheet thumbnail preview |
Background | selects a black, white or colored background for the layout mode | |
Cursor | selects a small or large cursor for the layout mode |
Background | selects a black, white or colored background for the schematic mode | |
Cursor | selects a small or large cursor for the schematic mode |
Bubble help | activates the "Bubble Help" function, which pops up a short hint about the meaning of several buttons when moving the cursor over them | |
User guidance | activates the "User Guidance" function, which displays a helping text telling the user what would be the next meaningful action when a command is active |
Always vector font | always displays texts in drawings with the builtin vector font, regardless of which font is actually set for a particular text | |
Mouse wheel zoom | defines the zoom factor that will be used to zoom in and out of an editor window when the mouse wheel is turned ('0' disables this feature, the sign of this value defines the direction of the zoom operation) |
+You can also delete all stored window positions, so that the window manager
+can decide again where to place newly opened windows.
+
+
+
+
+The Configure button opens a dialog in which you can specify if and
+how often a check for new versions should be done automatically upon program
+start (by default it checks once per day). If you need to use a proxy to access
+the Internet, this can also be specified in the configuration dialog. Enter
+the name in the form
+
+If you would like to be informed about beta versions of EAGLE, you can check
+the "Also check for beta versions" box.
+
+
+
+Check for Update
+The option "Help/Check for Update" in the Control Panel's pulldown menu opens
+a dialog that displays whether there is a new version of EAGLE available on
+the CadSoft server.
+
+hostname:port
+
+where hostname is the full name of the proxy host, without any
+http:// prefix, and port is an optional port number.
+Keyboard and Mouse
+The modifier keys (Alt, Ctrl and Shift) are used
+to modify the behaviour of certain mouse actions.
+Note that depending on which operating system or window manager you use, some of these
+keys (in combination with mouse events) may not be delivered to applications, which means
+that some of the functions described here may not be available.
+Alt
+Pressing the Alt key switches to an alternate GRID.
+This can typically be a finer grid than the normal one, which allows you to quickly
+do some fine positioning in a dense area, for instance, where the normal grid might
+be too coarse.
+The alternate grid remains active as long as the Alt key is held pressed down.
+Ctrl
+Pressing the Ctrl key while clicking on the right mouse button toggles
+between corresponding wire bend styles (only applies to commands that support wire
+bend styles, like, for instance, WIRE).
+
+The Ctrl key together with the left mouse button controls special functionality +of individual commands, like, for instance, selecting an object at its origin with the +MOVE command. +
+If a command can select a group, the Ctrl key must be pressed together with +the right mouse button when selecting the group (otherwise a context menu for the +selected object would be opened). +
+
+On Mac OS X the Cmd key has to be used instead of the Ctrl key. + |
+The Shift key together with the left mouse button controls special functionality +of individual commands, like, for instance, deleting a higher level object with the +DELETE command. +
+The following commands support the center mouse button: +
ADD | mirror part | |
ARC | change active layer | |
CIRCLE | change active layer | |
COPY | mirror object | |
INVOKE | mirror gate | |
LABEL | change active layer | |
MOVE | mirror object or group | |
PASTE | mirror group | |
POLYGON | change active layer | |
RECT | change active layer | |
ROUTE | change active layer | |
SMD | change active layer | |
TEXT | change active layer | |
WIRE | change active layer |
+Click&Drag with the center mouse button will pan the drawing within the editor +window. +
+When selecting an object with the right mouse button, a context specific popup menu is +displayed from which commands that apply to this object can be selected. +If there is currently a command active that can be applied to a group, the popup menu +will contain an entry for this. +
+The following commands support the right mouse button: +
ADD | rotate part | |
ARC | change direction of arc | |
BUS | change wire bend | |
CHANGE | apply change to group | |
DELETE | delete group | |
GROUP | close polygon | |
INVOKE | rotate gate | |
LABEL | rotate label | |
MIRROR | mirror group | |
MOVE | rotate object, select group | |
NET | change wire bend | |
PAD | rotate pad | |
PASTE | rotate group | |
PIN | rotate pin | |
POLYGON | change wire bend | |
RIPUP | ripup group | |
ROTATE | rotate group | |
ROUTE | change wire bend | |
SMD | rotate smd | |
SPLIT | change wire bend | |
TEXT | rotate text | |
WIRE | change wire bend |
+Select highlighted object? (left=yes, right=next, ESC=cancel) +
+indicates that you can now choose one of these objects. +
+Press the right mouse button to switch to the next object. +
+Press the left mouse button to select the highlighted object. +
+Press Esc to cancel the selection procedure. +
+The command +
+SET Select_Factor select_radius; ++defines the selection radius. +
+If the original selection was done with the right mouse button, a context specific
+popup menu will be displayed which applies to the first selected object, and which
+contains "Next" as the first entry. Clicking on this entry will cyclically switch
+through the objects within the selection radius.
+
+
+
+Editor Windows
+EAGLE knows different types of data files, each of which has its own
+type of editor window. By double clicking on one of the items in the
+Control Panel or by selecting a file from the
+File/Open menu, an editor
+window suitable for that file will be opened.
+
+After opening a new library editor window, the edit area will be empty and
+you will have to use the EDIT command to select
+which package, symbol or device you want to edit or create.
+
+
+
+
+Package: the package definition.
+
+Symbol: the symbol as it appears in the circuit diagram.
+
+Device: definition of the whole component. Contains one or more
+package variants and one or several symbols (e.g. gates).
+The symbols can be different from each other.
+
+Click on the Dev, Pac or
+Sym button to select Device, Packages or Symbols,
+respectively.
+
+If you want to create a new object, write the name of the new object into
+the New field. You can also edit an existing object
+by typing its name into this field. If you omit the extension, an object
+of the type indicated by the Choose... prompt will be
+loaded. Otherwise an object of the type indicated by the extension will
+be loaded.
+
+If your license does not include
+the Schematic Module, the object type buttons (Dev...)
+will not appear in the menu.
+
+
+
+
+When there is a schematic file (*.sch) with the same name as the
+board file (in the same directory), opening a board editor window will
+automatically open a Schematic Editor
+window containing that file and will put it on the desktop
+as an icon. This is necessary to have the schematic file loaded when editing
+the board causes modifications that have to be
+back-annotated
+to the schematic.
+
+
+
+
+When there is a board file (*.brd) with the same name as the
+schematic file (in the same directory), opening a schematic editor window will
+automatically open a Board Editor
+window containing that file and will put it on the desktop
+as an icon. This is necessary to have the board file loaded when editing
+the schematic causes modifications that have to be
+forward-annotated
+to the board.
+
+The combo box in the action toolbar of the schematic editor window allows
+you to switch between the various sheets of the schematic, or to add new
+sheets to the schematic (this can also be done using the
+EDIT command).
+
+
+
+
+The text must be a pure ASCII file and must not contain any control codes.
+The main area of use for the text editor is writing
+User Language Programs and
+Script files.
+
+Within that command the following placeholders will be replaced with
+actual values:
+
+Edit Library Object
+In library edit mode you can edit packages, symbols, and devices.
+Board Editor
+The Board Editor is used to edit a board (*.brd).
+Schematic Editor
+The Schematic Editor is used to edit a schematic (*.sch).
+Text Editor
+The Text Editor is used to edit any kind of text.
+Using an external text editor
+If you prefer to use an external text editor instead of EAGLE's builtin text
+editor, you can specify the command necessary to start that editor in the
+"Options/User interface" dialog.
+
%C | the column in which to place the cursor (currently always 1) | |
%F | the name of the file to load | |
%L | the line in which to place the cursor |
+If the command consists only of a hyphen ('-'), EAGLE will never open +a text editor window. This may be useful for people who always start their text +editor by themselves. +
+The following restrictions apply when using an external text editor: +
CLOSE | Close drawing after editing | |
EDIT | Load/create a drawing | |
EXPORT | Generate ASCII list (e.g. netlist) | |
OPEN | Open library for editing | |
QUIT | Quit EAGLE | |
REMOVE | Delete files/library elements | |
SCRIPT | Execute command file | |
USE | Load library for placing elements | |
WRITE | Save drawing/library |
ADD | Add element to drawing/symbol to device | |
ARC | Draw arc | |
ATTRIBUTE | Define attributes | |
CIRCLE | Draw circle | |
CLASS | Define net classes | |
COPY | Copy objects/elements | |
CUT | Cut previously defined group | |
DELETE | Delete objects | |
DESCRIPTION | Change an object's description | |
GROUP | Define group for upcoming operation | |
HOLE | Define non-conducting hole | |
LAYER | Create/change layer | |
MIRROR | Mirror objects | |
MITER | Miter wire joints | |
MOVE | Move or rotate objects | |
NAME | Name object | |
PASTE | Paste previously cut group to a drawing | |
POLYGON | Draw polygon | |
RECT | Draw rectangle | |
ROTATE | Rotate objects | |
SMASH | Prepare NAME/VALUE text for moving | |
SPLIT | Bend wires/lines (tracks, nets, etc.) | |
TEXT | Add text to a drawing | |
VALUE | Enter/change value for component | |
WIRE | Draw line or routed track |
DRC | Perform design rule check | |
ERRORS | Show DRC errors | |
LOCK | Lock component's position | |
RATSNEST | Show shortest air lines | |
REPLACE | Replace component | |
RIPUP | Ripup routed track | |
ROUTE | Route signal | |
SIGNAL | Define signal (air line) | |
VIA | Place via-hole |
BOARD | Create a board from a schematic | |
BUS | Draw bus line | |
ERC | Perform electrical rule check | |
GATESWAP | Swap equivalent 'gates' | |
INVOKE | Add certain 'gate' from a placed device | |
JUNCTION | Place connection point | |
LABEL | Provide label to bus or net | |
NET | Define net | |
PINSWAP | Swap equivalent pins |
CONNECT | Define pin/pad assignment | |
PACKAGE | Define package for device | |
PAD | Add pad to a package | |
PIN | Add pin to a symbol | |
PREFIX | Define default prefix for device | |
REMOVE | Delete library elements | |
RENAME | Rename symbol/package/device | |
SMD | Add smd pad to a package | |
TECHNOLOGY | Define technologies for a device | |
VALUE | Define if value text can be changed |
ASSIGN | Assign keys | |
CHANGE | Change parameters | |
DISPLAY | Display/hide layers | |
GRID | Define grid/unit | |
MENU | Configure command menu | |
SET | Set program parameters | |
WINDOW | Choose screen window |
AUTO | Start Autorouter | |
HELP | Show help page | |
INFO | Show information about object | |
MARK | Set/remove mark (for measuring) | |
OPTIMIZE | Optimize (join) wire segments | |
Print to the system printer | ||
REDO | Redo commands | |
RUN | Run User Language Program | |
SHOW | Highlight object | |
UNDO | Undo commands | |
UPDATE | Update library objects |
+Commands and parameters in CAPITAL LETTERS are entered directly (or +selected in the command menu with the mouse). For the input there is +no difference between small and capital letters. +
+Parameters in lowercase letters are replaced by names, number values or +key words. Example: +
+
Syntax: | GRID grid_size grid_multiple; | |
Input: | GRID 1 10; |
+
Syntax: | SET BEEP OFF | ON; | |
Input: | SET BEEP OFF; | |
or | ||
SET BEEP ON; |
+
Syntax: | DISPLAY option layer_name.. | |
Input: | DISPLAY TOP PINS VIAS |
+
Syntax: | MOVE .. | |
Input: | MOVE | |
Mouse click on the first element to be moved | ||
Mouse click on the target position | ||
Mouse click on the second element to be moved | ||
etc. |
+This example also explains the meaning of the repetition points for +commands with mouse clicks. +
+For the program each mouse click is the input of a coordinate. If +coordinates are to be entered as text, the input via the keyboard +must be as follows: +
+(x y) ++x and y are numbers in the unit which has been selected with the GRID +command. The input as text is mainly required for script files.
+(100mil 200mil) ++Allowed units are mm, mic, mil and in. +It is possible to use different units for x and y.
+(@) ++can be used to reference the current position of the mouse cursor within +the draw window. For example, the input +
+MOVE R1 (@) ++would move the part named R1 to the place currently pointed to with the mouse. +
+Any combination of the following modifiers may follow the opening brace +in order to simulate a particular key that is held pressed with the +"mouse click" or to change the type of coordinates: +
> | right mouse button click | |
A | Alt key | |
C | Ctrl key | |
P | Polar coordinates (relative to the mark, x = radius, y = angle in degrees, counterclockwise) | |
R | Relative coordinates (relative to the mark) | |
S | Shift key |
+(CR> 1 2) ++would result in a "right button mouse click" at (1 2) relative to the mark, +with the Ctrl key held down (of course what happens with this kind of input +will depend on the actual command). Note that if there is currently no mark +defined, coordinates with R or P will be relative to the +drawing's origin. Also, the modifier characters are not case sensitive, their +sequence doesn't matter and there doesn't have to be a blank between them and +the first coordinate digit. So the above example could also be written as +(r>c1 2). +Values entered as "polar coordinates" will be stored internally as the corresponding +pair of (x y) coordinates. +
+As an example for entering coordinates as text let's assume you wish to enter the exact +dimensions for board outlines: +
+GRID 1 MM; +CHANGE LAYER DIMENSION; +WIRE 0 (0 0) (160 0) (160 100) (0 100) (0 0); +GRID LAST; ++
+WINDOW; ++redraws the drawing window, whereas +
+WINDOW FIT ++scales the drawing to fit entirely into the drawing window. There is no semicolon necessary here because it is already clear that the command is complete. + + + +
+The ADD command fetches a circuit symbol (gate) or a package from the active library and places it into the drawing. +
+During device definition the ADD command fetches a symbol into the device. +
+Usually you click the ADD command and select the package or symbol from the menu which opens. If necessary, parameters can now be entered via the keyboard. +
+If device_name contains wildcard characters ('*' or '?') and more +than one device matches the pattern, the ADD dialog will be opened and the specific device +can be selected from the list. +Note that the Description checkbox in the ADD dialog will be unchecked after +any ADD command with a device_name has been given in the command line, no matter +if it contains wildcards or not. This is because a device_name entered in the +command line is only searched for in the device names, not in the descriptions. +
+The package or symbol is placed with the left button and rotated with the right button. After it has been placed another copy is immediately hanging from the cursor. +
+If there is already a device or package with the same name (from the same library) in the drawing, +and the library has been modified after the original object was added, an automatic +library update will be started and you will be asked whether +objects in the drawing shall be replaced with their new versions. +Note: You should always run a Design Rule Check (DRC) and an +Electrical Rule Check (ERC) after a library update has been performed! +
+To add directly from a specific library, the command syntax +
+ADD devicename@libraryname ++can be used. devicename may contain wildcards and libraryname can +be either a plain library name (like "ttl" or "ttl.lbr") or a full +file name (like "/home/mydir/myproject/ttl.lbr" or "../lbr/ttl"). +
+Example: +
+ADD DIL14 IC1 ++fetches the DIL14 package to the board and gives it the name IC1. +
+If no name is given in the schematic, the gate will receive the prefix that was specified in the device definition with PREFIX, expanded with a sequential number (e.g. IC1). +
+Example: +
+ADD 7400 ++This will place a sequence of five gates from 7400 type components. Assuming that the prefix is defined as "IC" and that the individual gates within a 7400 have the names A..D, the gates in the schematic will be named IC1A, IC1B, IC1C, IC1D, IC2A. (If elements with the same prefix have already been placed the counting will proceed from the next sequential number.) See also INVOKE. +
+While an object is attached to the cursor, you can change the name under which +it will be added to the drawing. This allows you to add several parts of the same +type, but with different, explicitly defined names: +
+Example: +
+ADD CAP C1 C5 C7 ++
+Example: +
+ADD 7400 IC1 A ++This is mainly useful if a schematic is to be generated through a script. Note that if a particular +gate is added, no other gates with add level MUST or ALWAYS will be fetched automatically, and you will have to +use the INVOKE command to invoke at least the MUST gates (otherwise +the Electrical Rule Check will report them as missing). +
+[S][M]Rnnn +
+
S | sets the Spin flag, which disable keeping texts readable from the bottom or right side of the drawing (only available in a board context) | |
M | sets the Mirror flag, which mirrors the object about the y-axis | |
Rnnn | sets the Rotation to the given value, which may be in the range 0.0...359.9 (at a resolution of 0.1 degrees) in a board context, or one of 0, 90, 180 or 270 in a schematic context (angles may be given as negative values, which will be converted to the corresponding positive value) |
+The key letters S, M and R may be given +in upper- or lowercase, and there must be at least R followed by a number. +
+If the Mirror flag is set in an element as well as in a text within the +element's package, they cancel each other out. +The same applies to the Spin flag. +
+Examples: +
+
R0 | no rotation | |
R90 | rotated 90° counterclockwise | |
R-90 | rotated 90° clockwise (will be converted to 270°) | |
MR0 | mirrored about the y-axis | |
SR0 | spin texts | |
SMR33.3 | rotated 33.3° counterclockwise, mirrored and spin texts |
+Default: R0 +
+
+ADD DIL16 R90 (0 0); ++places a 16-pin DIL package, rotated 90 degrees counterclockwise, at coordinates (0 0). +
+
0: | The symbol (gate) can not be swapped with any other in the schematic. | |
1..255 | The symbol (gate) can be swapped with any other symbol of the same type in the schematic that has the same swaplevel (including swapping between different devices). |
+Default: 0 +
+
Next | If a device has more than one gate, the symbols are fetched into the schematic with Addlevel Next. | |
Must | If any symbol from a device is fetched into the schematic, then a symbol defined with Addlevel Must must also appear. This happens automatically. It cannot be deleted until all the other symbols in the device have been deleted. If the only symbols remaining from a device are Must-symbols, the DELETE command will delete the entire device. | |
Always | Like Must, although a symbol with Addlevel Always can be deleted and brought back into the schematic with INVOKE. | |
Can | If a device contains Next-gates, then Can-gates are only fetched if explicitly called with INVOKE. A symbol with Addlevel Can is only then fetched into the schematic with ADD if the device only contains Can-gates and Request-gates. | |
Request | This property is usefully applied to devices' power-symbols. Request-gates can only be explicitly fetched into the schematic (INVOKE) and are not internally counted. The effect of this is that in devices with only one gate and one voltage supply symbol, the gate name is not added to the component name. In the case of a 7400 with four gates (plus power supply) the individual gates in the schematic are called, for example, IC1A, IC1B, IC1C and IC1D. A 68000 with only one Gate, the processor symbol, might on the other hand be called IC1, since its separate voltage supply symbol is not counted as a gate. |
+Example: +
+ADD PWR 0 REQUEST ++fetches the PWR symbol (e.g. a power pin symbol), and defines a Swaplevel of 0 (not swappable) and the Addlevel Request for it. + + + +
+The ARC command, followed by three mouse clicks on a drawing, draws +an arc of defined width. The first point defines a point on a circle, +the second its diameter. Entering the second coordinate reduces the +circle to a semi-circle, while the right button alters the direction +from first to second point. Entry of a third coordinate truncates +the semi-circle to an arc extending to a point defined by the intersection +of the circumference and a line between the third point and the arc +center. +
+The parameters CW and CCW enable you to define the direction of the +arc (clockwise or counterclockwise). ROUND and FLAT define whether the arc +endings are round or flat, respectively. +
+CHANGE WIDTH width; ++The adjusted width is identical to the line width for wires. +
+Arcs with angles of 0 or 360 degrees or a radius of 0 are +not accepted. +
+Example for text input: +
+GRID inch 1; +ARC CW (0 1) (0 -1) (1 0); ++generates a 90-degree arc with the center at the origin. + + + +
+function_key = modifier+key
+modifier = any combination of S (Shift), C (Control), A (Alt) and M (Cmd, Mac OS X only)
+key = F1..F12, A-Z, 0-9, BS (Backspace)
+
+The ASSIGN command can be used to define the meaning of the function keys +F1 thru F12, the letter keys A thru Z, +the (upper) digit keys 0 thru 9 and the backspace +key (each also in combination with modifier keys). +
+The ASSIGN command without parameters displays the present key +assignments in a dialog, which also allows you to modify these settings. +
+Keys can be assigned a single command or multiple commands. The command +sequence to be assigned should be enclosed in apostrophes. +
+If key is one of A-Z or 0-9, +the modifier must contain at least A, C or M. +
+The M modifier is only available on Mac OS X. + |
+Please note that any special operating system function assigned to a function
+key will be overwritten by the ASSIGN command
+(depending on the operating system, ASSIGN may not be able to overwrite
+certain function keys).
+If you assign to a letter key together with the modifier A,
+(e.g. A+F), a corresponding hotkey from the pulldown menu is
+no longer available.
+
+To remove an assignment from a key you can enter ASSIGN +with only the function_key code, but no command. +
+ASSIGN F7 'change layer top; route'; +ASS A+F7 'cha lay to; rou'; +ASSIGN C+F10 menu add mov rou ''';''' edit; +ASSIGN CA+R 'route'; ++The first two examples have the same effect, since EAGLE allows abbreviations +not only with commands but also with parameters (as long as they are +unmistakable). +
+Please note that here, for instance, the change layer top command +is terminated by a semicolon, but not the route command. The +reason is that in the first case the command already contains all +the necessary parameters, while in the second case coordinates still +have to be added (usually with the mouse). Therefore the ROUTE command +must not be deactivated by a semicolon. +
F1 HELP | Help function | |
Alt+F2 WINDOW FIT | The whole drawing is displayed | |
F2 WINDOW; | Screen redraw | |
F3 WINDOW 2 | Zoom in by a factor of 2 | |
F4 WINDOW 0.5 | Zoom out by a factor of 2 | |
F5 WINDOW (@); | Cursor pos. is new center | |
F6 GRID; | Grid on/off | |
F7 MOVE | MOVE command | |
F8 SPLIT | SPLIT command | |
F9 UNDO | UNDO command | |
F10 REDO | REDO command | |
Alt+BS UNDO | UNDO command | |
Shift+Alt+BS REDO | REDO command |
+See the description of orientation at ADD. +
+An attribute is an arbitrary combination of a name and a value, +that can be used to specify any kind of information for a given part. +
+Attributes can be defined in the library (for individual devices), in the schematic +(for an actual part) or in the board (for an actual element). Attributes defined +on the device level will be used for every part of that device type in the schematic. +In a schematic, additional attributes can be defined for each part, and existing +attributes from the devices can be overwritten with new values (if the attributes +have been defined as variable). An element in the board has all the attributes +of its corresponding part, and can have further attributes of its own. +
+ATTRIBUTE name [ 'value' ] [ options ] ++The name may consist of any letters, digits, '_', '#' and '-' and may have +any length; the first character must not be '-', though. Names are treated +case insensitive, so PartNo is the same as PARTNO. The value may +contain any characters and must be enclosed in single quotes. +
+The valid options are: +
delete | Delete the attribute with the given name from all technology variants (in this case there must be no 'value'). | |
variable | Mark this attribute as variable, so that it can be overwritten in the schematic (this is the default). | |
constant | Attributes marked as constant cannot be overwritten in the schematic (unless the user insists). If a new attribute is defined for a device and has constant set, this setting is copied to all other technologies as well. |
+An already existing attribute can be switched between variable and +constant without the need to repeat its value, as in +
ATTRIBUTE ABC '123' | (variable by default) | |
ATTRIBUTE ABC constant | (ABC retains its value '123') |
+The attribute names NAME, PART, GATE, DRAWING_NAME, LAST_DATE_TIME, +PLOT_DATE_TIME and SHEET are not allowed, since they would interfere with +the already existing text variables. If an attribute +named VALUE is defined, its value will be used to initialize the actual value when +placing a part in a schematic (in case the device set has 'Value On'). +
+Selecting the ATTRIBUTE command and clicking on a part shows a dialog in which all +attributes of that part are listed and can be edited. +
+For a fully textual definition of an attribute, the following syntax can be used: +
+ATTRIBUTE part_name attribute_name 'attribute_value' orientation ++Note that in case of a multi-gate part, actually one of the gates (i.e. +"instances") is selected. When selecting it via a mouse click it is already +clear which gate is meant, while when selecting it via part_name, the full +name consisting of the part and gate name should be given. +While a specific part can only have one attribute with a given name, the +attribute can be attached to any or all of its gates. +If only the part name is given, the first visible gate will be implicitly +selected. +
+If no coordinates are given (and the command is terminated with a ';'), +the behavior depends on whether the given attribute already exists for that +part (either in the device or in the schematic). If the attribute already exists, +only its value will be changed. If it doesn't exist yet, a new attribute with +the given name and value will be placed at the origin of the selected gate of the part. +
+To delete an attribute from a part, the command +
+ATTRIBUTE part_name attribute_name DELETE ++can be used. +
+When defining attributes via the command line or a script, use the +CHANGE DISPLAY command to define which parts of the +attribute (name, value, both or none of these) shall be visible. +
+Such an attribute could for instance be the author of a drawing, and can be used +in the title block of a drawing's frame. It will be shown on every schematic sheet +that has a drawing frame that contains a text variable +with the same name. +
+LAYER layer; +WIRE (1 2) (3 4); ++doesn't work here. The layer needs to be selected while the ATTRIBUTE command is +already active, which can be done like this +
+ATTRIBUTE parameters +LAYER layer +more parameters; ++Note that the ATTRIBUTE line is not terminated with a ';', and +that the LAYER command starts on a new line.
+ATTRIBUTE +LAYER layer; ++set the layer to use with subsequent ATTRIBUTE commands. +
+PACKAGE N; +TECHNOLOGY LS; +ATTRIBUTE PartNo '12345-ABC'; +ATTRIBUTE Temp '100K' constant; +ATTRIBUTE Remark 'mount manually'; ++ + + +
+The AUTO command activates the integrated +Autorouter. If signal names +are specified or signals are selected with the mouse, only these signals +are routed. Without parameters the command will try to route all signals. +If a "!" character is specified all signals are routed except the +signals following the "!" character. The "!" character must be the +first parameter and must show up only once. +
+The LOAD and SAVE options can be used to load the Autorouter parameters +from or save them to the given file. If filename doesn't have the extension +".ctl" it will be appended automatically. +
+Without any parameters (or if no terminating ';' is given), the AUTO command +opens a dialog in which the parameters that control the routing algorithm can +be configured. The special option FOLLOWME opens this dialog in a mode +where only the parameters controlling the Follow-me router +can be modified. +
+AUTO ! GND VCC; ++In every case the semicolon is necessary as a terminator. A menu for +adjusting the Autorouter control parameters opens if you select AUTO +from the command menu or type in AUTO from the keyboard (followed +by Return key). +
+
* | matches any number of any characters | |
? | matches exactly one character | |
[...] | matches any of the characters between the brackets |
+If any of these characters shall be matched exactly as such, it has to be enclosed +in brackets. For example, abc[*]ghi would match abc*ghi and not +abcdefghi. +
+A range of characters can be given as [a-z], which results in any character +in the range 'a'...'z'. +
+In practice you draw the board outlines into the Dimension layer with +the WIRE command and place the components within this area. +
+If you want the Autorouter not to use a layer, enter "0" into the +preferred direction field. +
+The command BOARD is used to convert a schematic drawing into a board. +
+If the board already exists, it will be loaded into a board window. +
+If the board does not exist, you will be asked whether to create that new +board. +If a grid is given, the parts on the board will be placed in +the given raster, as in +
+BOARD 5mm ++which would place the parts in a 5 millimeter raster (default is 50mil). +The number must be given with a unit, and the maximum allowed value +is 10mm. +
+The BOARD command will never overwrite an existing board file. To create +a new board file if there is already a file with that name, you have to +remove that file first. +
+edit .brd ++in the editor window's command line. +
+All relevant data from the schematic file (name.sch) will be converted to a +board file (name.brd). The new board is loaded automatically as an empty +card with a size of 160x100mm +(Light edition: 100x80mm). +All packages and connections are shown on the left side +of the board. Supply pins are already connected +(see PIN command). +
+If you need board outlines different to the ones that are generated +by default, simply delete the respective lines and use the +WIRE command to draw your own outlines into +the Dimension layer. The recommended width for these lines is 0. +
+A board file cannot be generated: +
+The command BUS is used to draw bus connections onto the Bus layer +of a schematic diagram. Bus_name has the following form: +
+SYNONYM:partbus,partbus,.. ++where SYNONYM can be any name. +Partbus is either a simple net name or a bus name range of the following form: +
+Name[LowestIndex..HighestIndex] ++where the following condition must be met: +
+0 <= LowestIndex <= HighestIndex <= 511 +
+If a name is used with a range, that name must not end with digits, because +it would become unclear which digits belong to the Name and which belong to +the range. +
+If a bus wire is placed at a point where there is already another bus +wire, the current bus wire will be ended at that point. +This function can be disabled with "SET AUTO_END_NET OFF;", +or by unchecking "Options/Set/Misc/Auto end net and bus". +
+If the curve or @radius parameter is given, an arc can be drawn as part of the bus +(see the detailed description in the WIRE command). +
+A[0..15] +RESET +DB[0..7],A[3..4] +ATBUS:A[0..31],B[0..31],RESET,CLOCK,IOSEL[0..1] ++If no bus name is used, a name of the form B$1 is automatically allocated. +This name can be changed with the NAME command at any time. +
+The line width used by the bus can be defined for example with +
+SET Bus_Wire_Width 40; ++to be 40 mil. (Default: 30 mil). +
+ ATBUS:A[0..31],B[0..31],!RESET,CLOCK,IOSEL[0..1] ++which would result in +
+ _____ + ATBUS:A[0..31],B[0..31],RESET,CLOCK,IOSEL[0..1] ++You can find further details about this in the description of the TEXT command. + + + +
+Parameters adjusted with the CHANGE command remain as preset +properties for objects added later. +
+All values in the CHANGE command are used according to the actual grid +unit. +
Layer | CHANGE LAYER name | number | |
Text | CHANGE TEXT [ text ] | |
Text height | CHANGE SIZE value | |
Text line width | CHANGE RATIO ratio | |
Text font | CHANGE FONT VECTOR | PROPORTIONAL | FIXED | |
Wire width | CHANGE WIDTH value | |
Wire style | CHANGE STYLE value | |
Arc cap | CHANGE CAP ROUND | FLAT | |
Pad shape | CHANGE SHAPE SQUARE | ROUND | OCTAGON | LONG | OFFSET | |
Pad/via/smd flags | CHANGE STOP | CREAM | THERMALS | FIRST OFF | ON | |
Pad/via diameter | CHANGE DIAMETER diameter | |
Pad/via/hole drill | CHANGE DRILL value | |
Via layers | CHANGE VIA from-to | |
Smd dimensions | CHANGE SMD width height | |
Pin parameters | CHANGE DIRECTION NC | IN | OUT | I/O | OC | HIZ | SUP | PAS | PWR | SUP | |
CHANGE FUNCTION NONE | DOT | CLK | DOTCLK | ||
CHANGE LENGTH POINT | SHORT | MIDDLE | LONG | ||
CHANGE VISIBLE BOTH | PAD | PIN | OFF | ||
CHANGE SWAPLEVEL number | ||
Polygon parameters | CHANGE THERMALS OFF | ON | |
CHANGE ORPHANS OFF | ON | ||
CHANGE ISOLATE distance | ||
CHANGE POUR SOLID | HATCH | ||
CHANGE RANK value | ||
CHANGE SPACING distance | ||
Gate parameters | CHANGE SWAPLEVEL number | |
CHANGE ADDLEVEL NEXT | MUST | ALWAYS | CAN | REQUEST | ||
Net class | CHANGE CLASS number | name | |
Package | CHANGE PACKAGE part_name [device_name] | 'device_name' [part_name] | |
Technology | CHANGE TECHNOLOGY part_name [device_name] | 'device_name' [part_name] | |
Attribute display | CHANGE DISPLAY OFF | VALUE | NAME | BOTH | |
Frame parameters | CHANGE COLUMS value | |
CHANGE ROWS value | ||
CHANGE BORDER NONE | BOTTOM | RIGHT | TOP | LEFT | ALL | ||
Label | CHANGE XREF OFF | ON |
+The CIRCLE command is used to create circles. Circles in the layers +tRestrict, bRestrict, and vRestrict define restricted +areas. They should be defined with a width of 0. +
+The width parameter defines the width of the circle's circumference +and is the same parameter as used in the WIRE command. The width can +be changed with the command: +
+CHANGE WIDTH width; ++where width is the desired value in the current unit. +
+A circle defined with a width of 0 will be filled. +
+GRID inch 1; +CIRCLE (0 0) (1 0); ++generates a circle with a radius of 1 inch and the center at the origin. + + + +
+The CLASS command is used to define or use net classes. +
+Without parameters, it offers a dialog in which the net classes can be defined. +
+If only a number or name is given, the net class with the given +number or name is selected and will be used for subsequent NET and SIGNAL commands. +
+If both a number and a name are given, the net class with the +given number will be assigned all the following values and will also be used for +subsequent NET and SIGNAL commands. If any of the parameters following name +are omitted, the net class will keep its respective value. +
+If number is negative, the net class with the absolute value of number +will be cleared. The default net class 0 can't be cleared. +
+Net class names are handled case insensitive, so SUPPLY would be the same as Supply +or SuPpLy. +
+Using several net classes in a drawing increases the time the +Autorouter needs to do its job. Therefore it makes sense to use only as few net +classes as necessary (only the number of net classes actually used by nets or +signals count here, not the number of defined net classes). +
+In order to avoid conflicts when CUT/PASTEing between drawings it makes sense +to define the same net classes under the same numbers in all drawings. +
+The Autorouter processes signals sorted by their total width requirements (Width +plus Clearance), starting with those that require the most space. The bus router +only routes signals with net class 0. +
+The net class of an existing net/signal can be changed with the CHANGE command. +Any changes made by the CLASS command will not be stored in the UNDO/REDO buffer. +
+CLASS 3 1:0.6mm 2:0.8mm ++defines a minimum clearance of 0.6mm between signals in net classes 1 and 3, +and one of 0.8mm between signals in net classes 2 and 3. Note that the numbers in +number:clearance must be less than or equal to the number of the net class +itself ('3' in the above example), so +
+CLASS 3 1:0.6mm 2:0.8mm 3:0.2mm ++would also be valid, whereas +
+CLASS 3 1:0.6mm 2:0.8mm 3:0.2mm 4:0.5mm ++would not be allowed. + + + +
+The CLOSE command is used to close an editor window. If the drawing you +are editing has been modified you will be prompted whether you wish to +save it. +
+This command is mainly used in script files.
+
+
+
+CONNECT
+
+
+See also PREFIX,
+OPEN,
+CLOSE,
+SCRIPT
+
+CONNECT symbol_name.pin_name pad_name..
+CONNECT pin_name pad_name..
+
+This command is used in the device editing mode in order to define +the relationship between the pins of a symbol and the pads of the +corresponding package in the library. First of all, it is necessary +to define which package is to be used by means of the PACKAGE command. +
+If the CONNECT command is invoked without parameters, a dialog is +presented which allows you to interactively assign the connections. +
+CONNECT gnd 1 rdy 2 phi1 3 !irq 4 nc1 5... ++(Note: "!" is used to indicate inverted data signals.) +
+CONNECT A.I1 1 A.I2 2 A.O 3; +CONNECT B.I1 4 B.I2 5 B.O 6; +CONNECT C.I1 13 C.I2 12 C.O 11; +CONNECT D.I1 10 D.I2 9 D.O 8; +CONNECT PWR.gnd 7; +CONNECT PWR.VCC 14; ++In this case, the connections for four NAND gates of a good old 7400 +are allocated. The device includes five symbols - A, B, C, D, +and PWR. The gate inputs are named I1 and I2 while the output is named O. +
+The CONNECT command can be repeated as often as required. It may be +used with all pin/pad connections or with only certain pins. Each +new CONNECT command overwrites the previous conditions for the relevant +pins. +
+ed 6502.dev; +prefix 'IC'; +package dil40; +connect gnd 1 rdy 2 phi1 3 !irq 4 nc1 5 !nmi 6 \ + sync 7 vcc 8 a0 9 a1 10 a2 11 a3 12 a4 \ + 13 a5 14 a6 15 a7 16 a8 17 a9 18 a10 19 \ + a11 20 p$0 21 a12 22 a13 23 a14 24 a15 \ + 25 d7 26 d6 27 d5 28 d4 29 d3 30 d2 31 \ + d1 32 d0 33 r/w 34 nc2 35 nc3 36 phi0 37 \ + so 38 phi2 39 !res 40; ++If a command is continued at the next line, it is advisable to +insert the character "\" at the end of the line to ensure +the following text cannot be confused with an EAGLE command. +
+Confusing parameters with commands can also be avoided
+by enclosing the parameters in apostrophes.
+
+
+
+COPY
+
+
+See also GROUP,
+CUT,
+PASTE,
+ADD,
+INVOKE,
+POLYGON
+
+COPY deviceset@library [name]
+COPY package@library [name]
+
+
+
+
+
+The COPY command is used to copy objects +within the same drawing. EAGLE will generate a new name for the +copy but will retain the old value. When copying signals (wires), +buses, and nets the names are retained, but in all other cases a new +name is assigned. +
+If you just want to use another gate of a multi-gate part, you should use +the INVOKE command instead. +
+Note that any existing library objects (device sets, symbols or packages) +used by the copied library object will be automatically updated. +
+Parts of a drawing (or even a whole board) can be copied onto other +drawings by means of the commands CUT and PASTE. +
+To do this you first define a group (GROUP command). Then use the +CUT command, followed by a reference point (mouse click or coordinates +(x y)) to put the selected objects into the buffer. +CUT; automatically puts the reference point at the center of +the selected objects (snapped to the grid). +Now you can change to another board or package library (EDIT) and +copy the contents of the buffer onto the new drawing by executing +the PASTE command. +
+The DELETE command is used to delete the selected object. +
+Parts, pads, smds, pins and gates can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. Note that when selecting a multi-gate part in a schematic by name, +you will need to enter the full instance name, consisting of part +and gate name. +
+Attributes of parts can be selected by entering the concatenation of +part name and attribute name, as in R5>VALUE. +
+Clicking the right mouse button deletes a previously defined +GROUP. +
+After deleting a group it is possible that airwires which have been newly +created due to the removal of a component may be "left over", because +they have not been part of the original group. In such a case you should +re-calculate the airwires with the RATSNEST +command. +
+With active Forward&Back Annotation, no wires +or vias can be deleted from a signal that is connected to components in a board. +Also, no components can be deleted that have signals connected to them. +Modifications like these have to be done in the schematic. +
+Use the RIPUP command to convert an already +routed connection back into an airwire. +
+The DELETE command has no effect on layers that are not visible (refer +to DISPLAY). +
+The DRC might generate error polygons which can only be deleted +with DRC CLEAR. +
+DELETE SIGNALS can be used to delete all signals on a board. This +is useful if you want to read in a new or changed netlist (see EXPORT). +Only those signals are deleted which are connected to pads. +
+If you want to delete a part that has the name SIGNALS, you need to +write the name in single quotes. +
+
Gate | Deletes the entire part containing this gate (even if the gates are spread over several sheets). If f/b annotation is active, the wires connected to the element in the board will not be ripped up (as opposed to deleting a single gate), except for those cases where a pin of the deleted part is only connected directly to one single other pin and no net wire | |
Polygon Wire | Deletes the entire polygon | |
Net/Bus Wire | Deletes the entire net or bus segment |
+Don't forget: Deleting can be reversed by the
+UNDO command!
+
+
+
+DESCRIPTION
+
+
+See also CONNECT,
+PACKAGE,
+VALUE
+
+DESCRIPTION description_string;
+
+This command is used in the library editor to define or edit the description +of a device, package or library. +
+The description_string may contain HTML tags. +
+The first non-blank line of description_string will be used as a short +descriptive text (headline) in the Control Panel. +
+The DESCRIPTION command without a parameter opens a dialog in which the text can +be edited. The upper pane of this dialog shows the formatted text, in case it +contains HTML tags, while the lower pane is used +to edit the raw text. At the very top of the dialog the headline is displayed +as it would result from the first non-blank line of the description. The headline +is stripped of any HTML tags. +
+The description of a library can be defined or modified via the command line only if the library is
+newly opened, and no device, symbol or package has been edited yet. It can always be
+defined via the pulldown menu "Library/Description...".
+The description of a device set or package can always be edited via the command line,
+or via the pulldown menu "Edit/Description...".
+
+DESCRIPTION '<b>Quad NAND</b><p>\nFour NAND gates with 2 inputs each.'; ++This would result in +
+Quad NAND
+Four NAND gates with 2 inputs each.
+
+
+
+DISPLAY
+
+
+See also LAYER,
+PRINT
+
+DISPLAY [option] layer_number..
+DISPLAY [option] layer_name..
+
+Valid options are: ALL, NONE, LAST, ? and ?? +
+The DISPLAY command is used to choose the visible layers. As parameters, +the layer number and the layer name are allowed (even mixed). If the +parameter ALL is chosen, all layers become visible. If the parameter +NONE is used, all layers are switched off. For example: +
+DISPLAY NONE BOTTOM; ++Following this command only the Bottom layer is displayed. +
+If the parameter LAST is given, the previously visible layers will be displayed. +
+Please note that only those signal layers (1 through 16) are available +that have been entered into the layer setup in the Design Rules. +
+If the layer name or the layer number includes a negative sign, it +will be filtered out. For example: +
+DISPLAY TOP -BOTTOM -3; ++In this case the Top layer is displayed while the Bottom layer and +the layer with the number 3 are not shown on the screen. +
+Avoid layer names ALL and NONE as well as names starting with a "-". +
+Some commands (PAD, SMD, SIGNAL, ROUTE) automatically activate certain +layers. +
+If t/bPlace is selected or deselected in the DISPLAY menu, the layers +t/bNames, t/bValues, and t/bOrigins are selected or deselected, too. +If Symbols is selected/deselected, the layers Names and Values are +selected/deselected, too. +
+If the DISPLAY command is invoked without parameters, a dialog is +presented which allows you to adjust all layer settings. +
+DISPLAY TOP BOTTOM ? MYLAYER1 MYLAYER2 ?? OTHER WHATEVER ++In the above example the two layers TOP and BOTTOM are required and will cause +an error if either of them is missing. MYLAYER1 and MYLAYER2 will just be reported +if missing, allowing the user to cancel the operation, and OTHER and WHATEVER will +be displayed if they are there, otherwise they will be ignored. +
+The '?' and '??' options may appear any number of times and in any sequence. +
+If the color selected for layer 17 (Pads) or 18 (Vias) is 0 (which represents +the current background color), the pads and vias are displayed +in the color and fill style of the respective signal layers. If no signal layer is +visible, pads and vias are not displayed. +
+If the color selected for layer 17 (Pads) or 18 (Vias) is not the background +color and no signal layers are visible, pads and vias are displayed in the +shape of the uppermost and undermost layer. +
+This also applies to printouts made with PRINT. +
+The syntax to handle these aliases is: +
+DISPLAY = MyLayers None Top Bottom Pads Vias Unrouted +
+Defines the alias "MyLayers" which, when used as in +
+DISPLAY myl +
+will display just the layers Top, Bottom, Pads, Vias and Unrouted
+(without the "None" parameter the given layers would be displayed in
+addition to the currently visible layers).
+Note the abbreviated use of the alias and the case insensitivity.
+
+
+
+DRC
+
+
+See also Design Rules,
+CLASS,
+SET,
+ERC,
+ERRORS
+
+DRC ;
+DRC LOAD|SAVE filename;
+
+The command DRC checks a board against the current set of Design Rules. +
+Please note that electrically irrelevant objects (wires in packages, rectangles, circles +and texts) are not checked against each other for clearance errors. +
+The errors found are displayed as error polygons in the respective layers, +and can be browsed through with the ERRORS command. +
+Without parameters the DRC command opens a Design Rules dialog in which the board's +Design Rules can be defined, and from which the actual check can be started. +
+If two coordinates are given in the DRC command (or if the Select button is +clicked in the Design Rules dialog) all checks will be performed solely in the +defined rectangle. Only errors that occur (at least partly) in this area will be reported. +
+If you get DRC errors that don't go away, even if you modify the +Design Rules, make sure you check the +Net class of the reported object to see whether +the error is caused by a specific parameter of that class. +
+To delete all error polygons use the command +
+ERRORS CLEAR ++
+The LOAD and SAVE options can be used to load the Design Rules +from or save them to the given file. If filename doesn't have the extension +".dru" it will be appended automatically. +
+SET DRC_FILL fill_name; ++Defines the fill style used for the DRC error polygons. +Default is LtSlash. + + + +
+The EDIT command is used to load a drawing or if a library has been +opened with the OPEN command, to load a package, symbol, or device for +editing. +
+
EDIT name.brd | loads a board | |
EDIT name.sch | loads a schematic | |
EDIT name.pac | loads a package | |
EDIT name.sym | loads a symbol | |
EDIT name.dev | loads a device | |
EDIT .s3 | loads sheet 3 of a schematic | |
EDIT .s5 .s2 | moves sheet 5 before sheet 2 and loads it (if sheet 5 doesn't exist, a new sheet is inserted before sheet 2) | |
EDIT .s2 .s5 | moves sheet 2 before sheet 5 and loads it (if sheet 5 doesn't exist, sheet 2 becomes the last sheet) |
+Wildcards in the name are allowed (e.g. *.brd). +
+The EDIT command without parameters will cause a +file dialog (in board or schematic mode) or a +popup menu (in library mode) to appear +from which you can select the file or object. +
+To change from schematic to a board with the same name the command +
+EDIT .brd ++can be used. In the same way to change from board to schematic use +the command +
+EDIT .sch ++To edit another sheet of a schematic the command +
+EDIT .sX ++(X is the sheet number) or the combo box in the action toolbar of the +editor window can be used. If the given sheet number doesn't exist, +a new sheet is created. +
+You can also switch between sheets by clicking on an icon of the sheet +thumbnail preview. Drag&drop in the thumbnail preview allows you to +reorder sheets. Note that adding, removing or reordering sheets clears +the undo buffer, while simply switching between existing sheets doesn't. +
+Symbols, devices or packages may only be edited if a library is first +opened with the OPEN command. +
+This command is used to test schematics for electrical errors. The +result of the check is presented in the ERRORS +dialog. +
+Please note that the ERC detects inconsistencies between the implicit power
+and supply pins in the schematic and the actual signal connections in the board.
+Such inconsistencies can occur if the supply pin configuration is modified
+after the board has been created with the BOARD command. Since the power
+pins are only connected "implicitly", these changes can't always be forward
+annotated.
+If such errors are detected, Forward&Back Annotation
+will still be performed, but the supply pin configuration should be checked!
+
+
+
+ERRORS
+
+
+See also ERC,
+DRC
+
+ERRORS CLEAR
+
+The command ERRORS is used to show the errors found by the Electrical Rule Check (ERC) +or the Design Rule Check (DRC). If selected, a window is opened in which +all errors are listed. If no ERC or DRC has been run for the loaded drawing, yet, +the respective check will be started first. +
+The list view in the ERRORS dialog has up to four sections that contain +Consistency errors, Errors, Warnings and Approved +messages, respectively. +
+Selecting an entry with the mouse causes the error to be marked in the editor +window with a rectangle and a line from the upper left corner of the screen. +
+Double clicking an entry centers the drawing to the area where the error is located. +Checking the "Centered" checkbox causes this to happen automatically. +
+The list can also be cleared by entering the command +
+ERRORS CLEAR ++ + + + +
+The EXPORT command is used to provide you with ASCII text files which +can be used e.g. to transfer data from EAGLE to other programs, or to +generate an image file from the current drawing. +
+By default the output file is written into the Project directory. +
+The command generates the following output files: +
+Set Undo_Log Off; ++is given before. +
+
.bmp | Windows Bitmap Files | |
.png | Portable Network Graphics Files | |
.pbm | Portable Bitmap Files | |
.pgm | Portable Grayscale Bitmap Files | |
.ppm | Portable Pixelmap Files | |
.tif | TIFF Files | |
.xbm | X Bitmap Files | |
.xpm | X Pixmap Files |
+The resolution parameter defines the image resolution (in 'dpi'). +
+If filename is the special name CLIPBOARD (upper or lowercase doesn't matter) +the image will be copied into the system's clipboard. +
+The optional keyword MONOCHROME creates a black&white image. +
+The optional keyword WINDOW creates an image of the currently visible
+area in the editor window. Without this keyword, the image will contain the
+entire drawing.
+
+
+
+FRAME
+
+
+See also LABEL
+
+The FRAME command draws a frame with numbered columns and rows. +The two points define two opposite corners of the frame. Pressing the center +mouse button changes the layer to which the frame is to be added. +
+The columns parameter defines the number of columns in the frame. +There can be up to 127 columns. By default the columns are numbered from +left to right. If the columns value is negative, they are numbered +from right to left. +
+The rows parameter defines the number of rows in the frame. +There can be up to 26 rows. Rows are marked from top to bottom with letters, +beginning with 'A'. If the rows value is negative, they are marked +from bottom to top. If rows is given, it must be preceeded by +columns. +
+The borders parameter, if given, defines which sides of the frame +will have a border with numbers or letters displayed. Valid options for this +parameter are Left, Top, Right and Bottom. +By default all four sides of the frame will have a border. If any of these +options is given, only the requested sides will have a border. The special +options None and All can be used to have no borders at all, +or all sides marked. +
+Even though you can draw several frames in the same drawing, only the first +one will be used for calculating the positions of parts and nets. These positions +can be used, for instance, in a User Language Program +to generate a list of parts with their locations in their respective frame. +They are also used internally to automatically generate cross references +for labels. +
+Due to the special nature of the frame object, it doesn't have a rotation of +its own, and it doesn't get rotated with the ROTATE +command. +
+A frame can be drawn directly into a board or schematic, but more typically you +will want to create a special symbol or package drawing that perhaps also +contains a title block, which you can then use in all your drawings. +The "frames" library that comes with EAGLE contains several drawing frames. +
+FRAME 10 5 TOP LEFT ++draws a frame with 10 columns (numbered from left to right) and 5 rows (marked +'A' to 'E' from top to bottom) that has the column and row indicators drawn only +at the top and left border. + + + +
+Using this command two gates may be swapped within a schematic. Both +gates must be identical with the same number of pins and must be allocated +the same Swaplevel in the device definition. They do not, however, +need to be in the same device. +
+The name used in the GATESWAP command is the displayed name on the +schematic (e.g. U1A for gate A in device U1). +
+If a device is not used anymore after the GATESWAP command, it is
+deleted automatically from the drawing.
+
+
+
+GRID
+
+
+See also SCRIPT
+
+GRID;
+
+The GRID command is used to specify the grid and the current unit. +Given without an option, this command switches between GRID ON +and GRID OFF. +
+The following options exist: +
+
GRID ON; | Displays the grid on the screen | |
GRID OFF; | Turns off displayed grid | |
GRID DOTS; | Displays the grid as dots | |
GRID LINES; | Displays the grid as solid lines | |
GRID MIC; | Sets the grid units to micron | |
GRID MM; | Sets the grid units to mm | |
GRID MIL; | Sets the grid units to mil | |
GRID INCH; | Sets the grid units to inch | |
GRID FINEST; | Sets the grid to 0.1 micron | |
GRID grid_size; | Defines the distance between | |
the grid points in the actual unit | ||
GRID LAST; | Sets grid to the most recently | |
used values | ||
GRID DEFAULT; | Sets grid to the standard values | |
GRID grid_size grid_multiple; | ||
grid_size = grid distance | ||
grid_multiple = grid factor | ||
GRID ALT ...; | Defines the alternate grid |
+Grid mm; +Set Diameter_Menu 1.0 1.27 2.54 5.08; +Grid Last; ++In this case you can change back to the last grid definition +although you don't know what the definition looked like. +
+GRID mm 1 10; ++for instance specifies that the distance between the grid points is +1 mm and that every 10th grid line will be displayed. +
+Note: The first number in the GRID command always represents the grid +distance, the second - if existing - represents the grid multiple. +
+The GRID command may contain multiple parameters: +
+GRID inch 0.05 mm; ++In this case the grid distance is first defined as 0.05 inch. Then +the coordinates of the cursor are chosen to be displayed in mm. +
+GRID DEFAULT; ++Sets grid to the standard value for the current drawing type. +
+GRID mil 50 2 lines on alt mm 1 mil; ++Defines a 50 mil grid displayed as lines (with only every other line visible), and sets the alternate grid size to 1 mm, +but displays it in mil. +
+Pressing the Alt key switches to the alternate Grid. +This can typically be a finer grid than the normal one, which allows you to quickly +do some fine positioning in a dense area, for instance, where the normal grid might +be too coarse. +The alternate grid remains active as long as the Alt key is held pressed down. +
+The syntax to handle these aliases is: +
+GRID = MyGrid inch 0.1 lines on +
+Defines the alias "MyGrid" which, when used as in +
+GRID myg +
+will change the current grid to the given settings.
+Note the abbreviated use of the alias and the case insensitivity.
+
+
+
+GROUP
+
+
+See also CHANGE,
+CUT,
+PASTE,
+MIRROR,
+DELETE
+
+GROUP ALL
+GROUP;
+
+
+
+
+
+The GROUP command is used to define a group of objects +for a successive command. Also a whole drawing or an element can be +defined as a group. Objects are selected - after activating the +GROUP command - by click&dragging a rectangle or by drawing a polygon with the mouse. The easiest +way to close the polygon is to use the right mouse button. Only objects +from displayed layers can become part of the group. +
+The keyword ALL can be used to define a group that includes +the entire drawing area. +
+The group includes: +
+For instance: In order to change several pad shapes, select +CHANGE and SHAPE with the left mouse button and select the group with +the right mouse button. +
+The group definition remains until a new drawing is loaded +or the command +
+GROUP; ++is executed. +
+A command name within the HELP command shows the help page of that +command. +
+HELP GRID; ++displays the help page for the GRID command. + + + +
+This command is used to define e.g. mounting holes (has no electrical +connection between the different layers) in a board or in a package. +The parameter drill defines the diameter of the hole in the +actual unit. It may be up to 0.51602 inch (13.1 mm). +
+HOLE 0.20 ++If the actual unit is "inch", the hole will have a diameter +of 0.20 inch. +
+The entered value for the diameter (also used for via-holes and pads) +remains as a presetting for successive operations. It may be changed +with the command: +
+CHANGE DRILL value ++A hole can only be selected if the Holes layer is displayed. +
+A hole generates a symbol in the Holes layer as well as a circle with +the diameter of the hole in the Dimension layer. The relation between +certain diameters and symbols is defined in the "Options/Set/Drill" dialog. +The circle in the Dimension layer is used by the Autorouter. As +it will keep a (user-defined) minimum distance between via-holes/wires +and dimension lines, it will automatically keep this distance to the +hole. +
+Holes generate Annulus symbols in supply layers. +
+In the layers tStop and bStop, holes generate the solder
+stop mask, whose diameter is determined by the Design Rules.
+
+
+
+INFO
+
+
+See also CHANGE,
+SHOW
+
+INFO name ..
+
+The INFO command displays further details about an object's properties +on screen, e.g. wire width, layer number, text size etc. +It is also possible to modify properties in this dialog. +
+Parts, pads, smds, pins and gates can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. Note that when selecting a multi-gate part in a schematic by name, +you will need to enter the full instance name, consisting of part +and gate name. +
+Attributes of parts can be selected by entering the concatenation of
+part name and attribute name, as in R5>VALUE.
+
+
+
+INVOKE
+
+
+See also COPY,
+ADD
+
+INVOKE part_name gate_name orientation
+
+
+
+See the ADD command for an explanation of Addlevel und Orientation. +
+The INVOKE command is used to select a particular gate from a device +which is already in use and place it in the schematic (e.g. a power +symbol with Addlevel = Request). +
+Gates are activated in the following way: +
+If an already invoked gate is selected in the dialog, the default button changes +to "Show", and a click on it zooms the editor window in on the selected gate, +switching to a different sheet if necessary. +
+This command is used to draw a connection dot at the intersection +of nets which are to be connected to each other. Junction points may +be placed only on a net. If placed on the intersection of different +nets, the user is given the option to connect the nets. +
+If a net wire is placed at a point where there are at least two other +net wires and/or pins, a junction will automatically be placed. +This function can be disabled with "SET AUTO_JUNCTION OFF;", +or by unchecking "Options/Set/Misc/Auto set junction". +
+On the screen junction points are displayed at least with a diameter
+of five pixels.
+
+
+
+LABEL
+
+
+See also NAME,
+BUS,
+FRAME
+
+
+
+Bus or net names may be placed on a schematic in any location by using +the label command. When the bus or net is clicked on with the mouse, +the relevant label attaches to the mouse cursor and may be rotated, +changed to another layer, or moved to a different location. The second +mouse click defines the location of the label. +
+The orientation of the label may be defined textually +using the usual definitions as listed in the ADD command (R0, R90 +etc.). +
+Buses and nets may have any number of labels. +
+Labels cannot be changed with "CHANGE TEXT". +
+Labels are handled by the program as text, but their value corresponds +to the name of the appropriate bus or net. If a bus or net is renamed +with the NAME command, all associated labels are renamed automatically. +
+If a bus, net, or label is selected with the SHOW command, all connected +buses, nets and labels are highlighted. +
+The format in which a cross-reference label is displayed can be controlled +through the "Xref label format" string, which is defined in the "Options/Set/Misc" +dialog, or with the SET command. +The following placeholders are defined, and can be used in any order: +
+
%F | enables drawing a flag border around the label | |
%N | the name of the net | |
%S | the next sheet number | |
%C | the column on the next sheet | |
%R | the row on the next sheet |
+The default format string is "%F%N/%S.%C%R". Apart from the defined +placeholders you can also use any other ASCII characters. +
+The column and row values only work if there is a frame +on the next sheet on which the net appears. If %C or %R is +used and there is no frame on that sheet, they will display a question mark ('?'). +
+When determining the column and row of a net on a sheet, first the column and then +the row within that column is taken into account. Here XREF labels take precedence +over normal labels, which again take precedence over net wires. +For a higher sheet number, the frame coordinates of the left- and topmost field +are taken, while for a lower sheet number those of the right- and bottommost field +are used. +
+The orientation of a cross-reference label defines whether it will point to +a "higher" or a "lower" sheet number. Labels with an orientation of R0 or R270 point +to the right or bottom border of the drawing, and will therefore refer to +a higher sheet number. Accordingly, labels with an orientation of R90 or R180 will +refer to a lower sheet number. If a label has an orientation of R0 or R270, but the +net it is attached to is not present on any higher sheet, a reference to the next +lower sheet is displayed instead (the same applies accordingly to R90 and R180). +If the net appears only on the current sheet, no cross-reference is shown at all, +and only the net name is displayed (surrounded by the flag border, if the format +string contains the %F placeholder). +
+A cross-reference label that is placed on the end of a net wire will connect to +the wire so that the wire is moved with the label, and vice versa. +
+The cross-reference label format string is stored within the schematic drawing file. +
+A cross-reference label can be changed to a normal label either through the +CHANGE command or the label's Properties dialog. +
+LAYER layer; +WIRE (1 2) (3 4); ++doesn't work here. The layer needs to be selected while the LABEL command is +already active, which can be done like this +
+LABEL parameters +LAYER layer +more parameters; ++Note that the LABEL line is not terminated with a ';', and +that the LAYER command starts on a new line.
+LABEL +LAYER layer; ++set the layer to use with subsequent LABEL commands. + + + +
+Certain layers are not available in all modes. +
+Please note that only those signal layers (1 through 16) are available +that have been entered into the layer setup in the Design Rules. +
+LAYER 101 SAMPLE; ++you define a new layer with layer number 101 and layer name SAMPLE. +
+If a package contains layers not yet specified in the board, these +layers are added to the board as soon as you place the package into +the board (ADD or REPLACE). +
+The predefined layers have a special function. +You can change their names, but their functions (related with their +number) remain the same. +
+If you define your own layers, you should use only numbers +greater than 100. Numbers below may be assigned for special purposes +in later EAGLE versions. +
+LAYER -103; ++deletes the layer number 103. Layers to be deleted must be empty. +If this is not the case, the program generates the error message +
+"layer is not empty: #" +
+where "#" represents the layer number. +If you want to avoid any error messages in a layer delete operation +you can use the '??' option. This may be +useful in scripts that try to delete certain layers, but don't consider +it an error if any of these layers is not empty or not present at all. +
+The predefined standard layers cannot be deleted. +
+Any pads or vias belonging to that signal are implicitly considered connected by the +RATSNEST command and the Autorouter. +
+Supply layers are viewed "inverted", which means that any objects visible on such a layer +will result in "copper free" areas on the board. The program automatically generates +Thermal and Annulus objects to connect and isolate pads and vias to/from these layers. +
+You should not draw any additional objects into a supply layer, except, for instance, wires +along the outlines of the board, which prevent the copper area from extending to the very +edges and thus possibly causing short circuits through a metal casing or mounting screw. +Note that there are no checks whether a supply layer really connects all pads and vias. +If e. g. a user drawn object isolates a pad that should be connected to the supply +layer, there will be no airwire generated for that (missing) connection. The same applies if several +Annulus symbols form a "ring" around a Thermal symbol (and would thus completely isolate +that pad from its signal). +Also note that the size of the annulus symbols used in a supply layer is only +derived from the value given under "Annulus" in the "Supply" tab of the +Design Rules, and that neither the minimum distances +under "Clearance" nor those in the net classes go +into this calculation. +
+For a safer and more flexible way of implementing supply layers you should use the +POLYGON command. +
1 Top | Tracks, top side | |
2 Route2 | Inner layer (signal or supply) | |
3 Route3 | Inner layer (signal or supply) | |
4 Route4 | Inner layer (signal or supply) | |
5 Route5 | Inner layer (signal or supply) | |
6 Route6 | Inner layer (signal or supply) | |
7 Route7 | Inner layer (signal or supply) | |
8 Route8 | Inner layer (signal or supply) | |
9 Route9 | Inner layer (signal or supply) | |
10 Route10 | Inner layer (signal or supply) | |
11 Route11 | Inner layer (signal or supply) | |
12 Route12 | Inner layer (signal or supply) | |
13 Route13 | Inner layer (signal or supply) | |
14 Route14 | Inner layer (signal or supply) | |
15 Route15 | Inner layer (signal or supply) | |
16 Bottom | Tracks, bottom side | |
17 Pads | Pads (through-hole) | |
18 Vias | Vias (through-hole) | |
19 Unrouted | Airwires (rubberbands) | |
20 Dimension | Board outlines (circles for holes) | |
21 tPlace | Silk screen, top side | |
22 bPlace | Silk screen, bottom side | |
23 tOrigins | Origins, top side | |
24 bOrigins | Origins, bottom side | |
25 tNames | Service print, top side | |
26 bNames | Service print, bottom side | |
27 tValues | Component VALUE, top side | |
28 bValues | Component VALUE, bottom side | |
29 tStop | Solder stop mask, top side | |
30 bStop | Solder stop mask, bottom side | |
31 tCream | Solder cream, top side | |
32 bCream | Solder cream, bottom side | |
33 tFinish | Finish, top side | |
34 bFinish | Finish, bottom side | |
35 tGlue | Glue mask, top side | |
36 bGlue | Glue mask, bottom side | |
37 tTest | Test and adjustment inf., top side | |
38 bTest | Test and adjustment inf. bottom side | |
39 tKeepout | Nogo areas for components, top side | |
40 bKeepout | Nogo areas for components, bottom side | |
41 tRestrict | Nogo areas for tracks, top side | |
42 bRestrict | Nogo areas for tracks, bottom side | |
43 vRestrict | Nogo areas for via-holes | |
44 Drills | Conducting through-holes | |
45 Holes | Non-conducting holes | |
46 Milling | Milling | |
47 Measures | Measures | |
48 Document | General documentation | |
49 Reference | Reference marks | |
51 tDocu | Part documentation, top side | |
52 bDocu | Part documentation, bottom side |
91 Nets | Nets | |
92 Busses | Buses | |
93 Pins | Connection points for component symbols | |
with additional information | ||
94 Symbols | Shapes of component symbols | |
95 Names | Names of component symbols | |
96 Values | Values/component types | |
97 Info | General information | |
98 Guide | Guide lines |
+The LOCK command can be applied to parts in a board, and prevents them +from being moved, rotated, or mirrored. This is useful for things like +connectors, which need to be mounted at a particular location and must +not be inadvertently moved. +
+The origin of a locked part is displayed as an 'x' to have a visual +indication that the part is locked. +
+If a group is moved and it contains locked parts, these parts (together +with any wires ending at their pads) will not move with the group. +
+Detached texts of a locked part can still be moved individually, but +they won't move with a group. +
+Parts can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. +
+A "locked" part can be made "unlocked" by clicking on it with the
+Shift key pressed (and of course the LOCK command activated).
+
+
+
+MARK
+
+
+See also GRID
+
+MARK;
+
+The MARK command allows you to define a point +on the drawing area and display the coordinates of the mouse cursor relative +to that point at the upper left corner of the screen (with a leading +'R' character). This command is useful especially when board dimensions +or cutouts are to be defined. Entering MARK; turns the mark +on or off. +
+Please choose a grid fine enough before using the MARK command.
+
+
+
+MENU
+
+
+See also ASSIGN,
+SCRIPT
+
+MENU;
+
+The MENU command can be used to create a user specific command menu. +
+The complete syntax specification for the option parameters is +
+option := command | menu | delimiter +command := text [ ':' text ] +menu := text '{' option [ '|' option ] '}' +delimiter := '---' ++A menu option can either be a simple command, as in +
+MENU Display Grid; ++which would set the menu to the commands Display and Grid; +an aliased command, as in +
+MENU 'MyDisp : Display None Top Bottom Pads Vias;' 'MyGrid : Grid mil 100 lines on;'; ++which would set the menu to show the command aliases MyDisp and MyGrid +and actually execute the command sequence behind the ':' of each option when +the respective button is clicked; +or a submenu button as in +
+MENU 'Grid { Fine : Grid inch 0.001; | Coarse : Grid inch 0.1; }'; ++which would define a button labelled Grid that, when clicked opens a +submenu with the two options Fine and Coarse. +
+The special option '---' can be used to insert a delimiter, which +may be useful for grouping buttons. +
+Note that any option that consists of more than a single word, or that +might be interpreted as a command, must be enclosed in single quotes. +If you want to use the MENU command in a script to define a complex menu, +and would like to spread the menu definitions over several lines to make +them more readable, you need to end the lines with a backslash character ('\') +as in +
+MENU 'Grid {\ + Fine : Grid inch 0.001; |\ + Coarse : Grid inch 0.1;\ + }'; ++
+MENU Move Delete Rotate Route ';' Edit; ++would create a command menu that contains the commands Move...Route, +the semicolon, and the Edit command. +
+The command +
+MENU; ++switches back to the default menu. +
+Note that the ';' entry should always be added
+to the menu. It is used to terminate many commands.
+
+
+
+MIRROR
+
+
+See also ROTATE,
+LOCK,
+TEXT
+
+MIRROR name..
+
+Using the MIRROR command, objects may be mirrored about the y axis. +One application for this command is to mirror components to be placed +on the reverse side of the board. +
+Parts, pads, smds and pins can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. +
+Attributes of parts can be selected by entering the concatenation of +part name and attribute name, as in R5>VALUE. +
+Components can be mirrored only if the appropriate tOrigins/bOrigins +layer is visible. +
+When packages are selected for use with the MIRROR +command, connected wires on the outer layers are mirrored, too (beware of short +circuits!). +
+Note that any objects on inner layers (2...15) don't change their layer +when they are mirrored. The same applies to vias. +
+Parts cannot be mirrored if they are locked, +or if any of their connected pads would extend outside the allowed area +(in case you are using a limited edition of EAGLE). +
+Wires, circles, pads and polygons may not be individually +mirrored unless included in a group. +
+Mirrored text in a schematic will be printed on the other side of its origin point,
+but it will still remain normally readable.
+
+
+
+MITER
+
+
+See also SPLIT,
+WIRE,
+ROUTE,
+POLYGON
+
+
+The MITER command can be used to take the edge off a point where two wires join. +The two existing wires need to be on the the same layer and must have the same +width and wire style. +
+The MOVE command is used to move objects. +
+Parts, pads, smds, pins and gates can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. Note that when selecting a multi-gate part in a schematic by name, +you will need to enter the full instance name, consisting of part +and gate name. +
+Attributes of parts can be selected by entering the concatenation of +part name and attribute name, as in R5>VALUE. +
+Elements can be moved only if the appropriate tOrigins/bOrigins +layer is visible. +
+The MOVE command has no effect on layers that are not +visible (refer to DISPLAY). +
+The ends of wires (tracks) that are connected to an element cannot +be moved at this point. +
+When moving elements, connected wires (tracks) that belong to a signal +are moved too (beware of short circuits!). +
+If an object is selected with the left mouse button and the button is +not released, the object can be moved immediately ("click&drag"). +The same applies to groups when using the right mouse button. +In this mode, however, it is not possible to rotate or mirror the object +while moving it. +
+Parts cannot be moved if they are locked, +or if any of their connected pads would extend outside the allowed area +(in case you are using a limited edition of EAGLE). +
+Pins placed on each other are connected together. +
+If unconnected pins of an element are placed on nets or pins then +they are connected with them. +
+If nets are moved over pins they are not connected with them. +
+If you select a wire somewhere in the middle (not at one of its end points) +with Ctrl pressed, the end points stay fixed and you can bend the wire, +which changes it into an arc. The same way the curvature of an arc (which is basically +a wire) can be modified. +
+If you select a rectangle at one of its corners with Ctrl pressed, +you can resize both the rectangle's width and height. Selecting an edge of the +rectangle with Ctrl pressed lets you resize the rectangle's width or height, +respectively. Selecting the rectangle at its center with Ctrl pressed +pulls it towards the cursor and snaps it into the current grid. +
+If you select a circle at its circumference with Ctrl pressed, the +center stays fixed and you can resize the circle's diameter. Selecting the center point +this way pulls it towards the cursor and snaps it into the current grid. +
+Note that only wires that have both ends in the group will be transferred, and +any part that is transferred takes all its electrical connections with it, even if +a net wire attached to one of its pins is not transferred because its other end +is not in the group. +In case a pin in the new sheet has an electrical connection, but no other pin, +wire or junction attached to it to make this visible, a junction will be +automatically generated at this point. +
+This process can even be scripted. For instance +
+edit .s1 +group (1 1) (1 2) (2 2) (2 1) (1 1) +move (> 0 0) +edit .s2 +(0 0) ++would switch to the first sheet, define a group, select that group with MOVE, +switch to the second sheet and place the group. Note the final (0 0), +which are coordinates to the implicitly invoked MOVE command. +
+See the EDIT command if you want to just reorder the
+sheets.
+
+
+
+NAME
+
+
+See also SHOW,
+SMASH,
+VALUE
+
+NAME new_name
+NAME old_name new_name
+
+The NAME command is used to display or edit the name of the selected object. +
+Parts, pads, smds, pins and gates can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. +
+This segment
+Every segment on this sheet
+All segments on all sheets
+
+These questions appear in a popup menu if necessary +and can be answered either by selecting the appropriate item with +the mouse or by pressing the appropriate hot key (T, E, A). +
+The net command is used to draw individual connections (nets) onto +the Net layer of a schematic drawing. The first mouse click marks +the starting point for the net, the second marks the end point of +a segment. Two mouse clicks on the same point end the net. +
+If a net wire is placed at a point where there is already another net +or bus wire or a pin, the current net wire will be ended at that point. +This function can be disabled with "SET AUTO_END_NET OFF;", +or by unchecking "Options/Set/Misc/Auto end net and bus". +
+If a net wire is placed at a point where there are at least two other +net wires and/or pins, a junction will automatically be placed. +This function can be disabled with "SET AUTO_JUNCTION OFF;", +or by unchecking "Options/Set/Misc/Auto set junction". +
+If the curve or @radius parameter is given, an arc can be drawn as part of the net +(see the detailed description in the WIRE command). +
+If no net name is included in the command line and the net is not +started on a bus, then a name in the form of N$1 is automatically +allocated to the net. +
+Nets or net segments that run over different sheets of a schematic and use +the same net name are connected. +
+Net names should not contain a comma (','), because this +is the delimiting character in busses. +
+SET NET_WIRE_WIDTH width; ++(Default: 6 mil). +
+ !RESET ++which would result in +
+ _____ + RESET ++You can find further details about this in the description of the TEXT command. + + + +
+The OPEN command is used to open an existing library or create a new +library. Once the library has been opened or created, an existing +or new symbol, device, or package may be edited. +
+This command is mainly used in script files.
+
+
+
+OPTIMIZE
+
+
+See also SET,
+SPLIT,
+MOVE,
+ROUTE
+
+OPTIMIZE signal_name ..
+OPTIMIZE ..
+
+The OPTIMIZE command joins wire segments which lie +in one straight line. The individual segments must be on the same +layer and have the same width. This command is useful to reduce the +number of objects in a drawing and to facilitate moving a complete +track instead of individual segments. +
+If signal names are given, or a signal is selected, the command affects +only the respective signals. +
+SET OPTIMIZING OFF; ++or you have clicked the same spot twice with the SPLIT command. +
+The OPTIMIZE command works in any case, no matter if Optimizing
+is enabled or disabled.
+
+
+
+PACKAGE
+
+
+See also CONNECT,
+TECHNOLOGY,
+PREFIX
+
+PACKAGE pname vname
+PACKAGE pname@lname vname
+PACKAGE name
+PACKAGE -old_name new_name
+PACKAGE -name
+
+This command is used in the device edit mode to define, delete or rename +a package variant. +In the schematic or board editor the PACKAGE command behaves exactly +like "CHANGE PACKAGE". +
+Without parameters a dialog is opened that allows you to select a package +and define this variant's name. +
+The parameters pname vname assign the package pname to +the new variant vname. +
+The notation pname@lname vname fetches the package pname +from library lname and creates a new package variant. +This can also be done through the library objects' +context menu or via Drag&Drop from +the Control Panel's tree view. +
+The single parameter name switches to the given existing package +variant. If no package variants have been defined yet, and a package of the +given name exists, a new package variant named '' (an "empty" name) with the +given package will be created (this is for compatibility with version 3.5). +
+If -old_name new_name is given, the package variant old_name +is renamed to new_name. +
+The single parameter -name deletes the given package variant. +
+The name of a package variant will be appended to the device set name to +form the full device name. If the device set name contains the character '?', +that character will be replaced by the package variant name. +Note that the package variant is processed after the technology, so if the device set +name contains neither a '*' nor a '?' character, the resulting device +name will consist of device_set_name+technology+package_variant. +
+Following the PACKAGE command, the CONNECT command is used to define +the correspondence of pins in the schematic device to pads on the +package. +
+The maximum number of technologies per device set is 254. +
+When the BOARD command is used in schematic
+editing mode to create a new board, each device is represented on a board
+layout with the appropriate package as already defined with the
+PACKAGE command.
+
+
+
+PAD
+
+
+See also SMD,
+CHANGE,
+DISPLAY,
+SET,
+NAME,
+VIA,
+Design Rules
+
+
+The PAD command is used to add pads to a package. When the PAD command +is active, a pad symbol is attached to the cursor and can be moved +around the screen. Pressing the left mouse button places a pad at +the current position. +Entering a number changes the diameter of the pad (in the actual unit). +Pad diameters can be up to 0.51602 inch (13.1 mm). +
+The orientation (see description in ADD) +may be any angle in the range R0...R359.9. The S +and M flags can't be used here. +
+PAD 0.06 ++The pad will have a diameter of 0.06 inch, provided the actual unit +is "inch". This diameter remains as a presetting for successive +operations. +
+
Square | ||
Round | ||
Octagon | octagonal | |
Long | elongated | |
Offset | elongated with offset |
+These shapes only apply to the outer layers (Top and Bottom). +In inner layers the shape is always "round". +
+With elongated pads, the given diameter defines the smaller side of the pad. +The ratio between the two sides of elongated pads is given by the +parameter Shapes/Elongation in the Design Rules +of the board (default is 100%, which results in a ratio of 2:1). +
+The pad shape or diameter can be selected while the PAD command is +active, or it can be changed with the CHANGE command, e.g.: +
+CHANGE SHAPE OCTAGON ++The drill size may also be changed using the CHANGE command. The existing +values then remain in use for successive pads. +
+Because displaying different pad shapes and drill holes in their real +size slows down the screen refresh, EAGLE lets you change between +real and fast display mode by the use of the SET commands: +
+SET DISPLAY_MODE REAL | NODRILL; ++Note that the actual shape and diameter of a pad will be determined by the +Design Rules of the board the part is used in. +
+SET PAD_NAMES OFF | ON; ++This change will be visible after the next screen refresh. +
+
NOSTOP | don't generate solder stop mask | |
NOTHERMALS | don't generate thermals | |
FIRST | this is the "first" pad (which may be drawn with a special shape) |
+By default a pad automatically generates solder stop mask and thermals as necessary.
+However, in special cases it may be desirable to have particular pads not do this.
+The above NO... flags can be used to suppress these features.
+If the Design Rules of a given board specify that the
+"first pad" of a package shall be drawn with a particular shape, the pad marked with
+the FIRST flag will be displayed that way.
+A newly started PAD command resets all flags to their defaults. Once a flag is given
+in the command line, it applies to all following pads placed within this PAD command
+(except for FIRST, which applies only to the pad immediately following this
+option).
+
+See the ADD command for an explanation of Orientation. +
+Using the commands GROUP, CUT, and PASTE, parts of a drawing/library +can be copied to the same or different drawings/libraries. When using +the PASTE command, the following points should be observed: +
+Direction
+Function
+Length
+Orientation
+Visible
+Swaplevel
+
+
NC | not connected | |
In | input | |
Out | output (totem-pole) | |
I/O | in/output (bidirectional) | |
OC | open collector or open drain | |
Hiz | high impedance output (e.g. 3-state) | |
Pas | passive (for resistors, capacitors etc.) | |
Pwr | power input pin (Vcc, Gnd, Vss, Vdd, etc.) | |
Sup | general supply pin (e.g. for ground symbol) |
+Default: I/O +
+If Pwr pins are used on a symbol and a corresponding Sup pin exists +on the schematic, nets are connected automatically. The Sup pin is +not used for components. +
+
None | no special function | |
Dot | inverter symbol | |
Clk | clock symbol | |
DotClk | inverted clock symbol |
+Default: None +
+
Point | pin with no connection or name | |
Short | 0.1 inch long connection | |
Middle | 0.2 inch long connection | |
Long | 0.3 inch long connection |
+Default: Long +
+
R0 | connection point on the right | |
R90 | connection point above | |
R180 | connection point on the left | |
R270 | connection point below |
+Default: R0 +
+
Off | pin and pad name not drawn | |
Pad | pad name drawn, pin name not drawn | |
Pin | pin name drawn, pad name not drawn | |
Both | pin and pad name drawn |
+Default: Both +
+Default: 0 +
+If a name is used in the PIN command, it must be enclosed in +apostrophes. Pin names can be changed in the symbol edit mode +using the NAME command. +
+PIN 'D0' * ++and the location for the other pins defined with a mouse click for each. +
+The SHOW command may be used to show pin options such as Direction +and Swaplevel. +
+For example, suppose that three pins are required for +GND. The pins are allocated the names GND@1, GND@2 and GND@3 during +the symbol definition. Then only the characters before the "@" +sign appear in the schematic. +
+It is not possible to add or delete pins in symbols +which are already used by a device because this would change the pin/pad +allocation defined with the CONNECT command. +
+ !RESET ++which would result in +
+ _____ + RESET ++You can find further details about this in the description of the TEXT command. + + + +
+The PINSWAP command is used to swap pins within the same symbol which +have been allocated the same swaplevel (> 0). Swaplevel, see PIN command. +If a board is tied to a schematic via +Back Annotation +two pads can only +be swapped if the related pins are swappable. +
+On a board without a schematic this command permits two pads in the +same package to be swapped. The Swaplevel is not checked in this case. +
+Wires attached to the swapped pins are moved with the pins so that
+short circuits may appear. Please perform the DRC and correct possible
+errors.
+
+
+
+POLYGON
+
+
+See also CHANGE,
+DELETE,
+RATSNEST,
+RIPUP,
+WIRE,
+MITER
+
+
+
+
+
+
+The POLYGON command is used to draw polygon areas. Polygons in the +layers Top, Bottom, and Route2..15 are treated as signals. Polygons +in the layers t/b/vRestrict are protected areas for the Autorouter. +
+If the curve or @radius parameter is given, an arc can be drawn as part of the polygon +definition (see the detailed description in the WIRE +command). +
+If you want to give the polygon a name that starts with a digit (as in 0V), +you must enclose the name in single quotes to distinguish it from a width value. +
+The parameters Isolate and Rank only have a meaning for polygons +in layers Top...Bottom. +
+
1. Outlines | only the outlines as defined by the user are displayed. | |
2. Real mode | all of the areas are visible as calculated by the program. |
+In "outlines" mode a polygon is drawn with dotted wires, so that it can be +distinguished from other wires. +The board file contains only the "outlines". +
+The default display mode is "outlines" as the calculation is a time +consuming operation. +
+When a drawing is generated with the CAM Processor all polygons are +calculated. +
+The RATSNEST +command starts the calculation of the polygons +(this can be turned off with +SET POLYGON_RATSNEST OFF;). +Clicking the STOP button terminates the calculation of the polygons. Already +calculated polygons are shown in "real mode", all others are shown in +"outline mode". +
+The +RIPUP +command changes the display mode of a polygon to "outline". +
+CHANGE operations re-calculate a polygon if it was shown in "real +mode" before. +
+SPLIT: Inserts a new polygon edge. +
+DELETE: Deletes a polygon corner (if only three corners are left the +whole polygon is deleted). +
+CHANGE LAYER: Changes the layer of the whole polygon. +
+CHANGE WIDTH: Changes the parameter width of the whole polygon. +
+MOVE: Moves a polygon edge or corner (like wire segments). +
+COPY: Copies the whole polygon. +
+NAME: If the polygon is located in a signal layer the name of the +signal is changed. +
+Under certain circumstances, especially with Orphans = Off, +a polygon can disappear completely. +In that case the polygon's original outlines will be displayed on the +screen, to make it possible to delete or otherwise modify it. +When going to the printer or CAM Processor these outlines will not +be drawn in order to avoid short circuits. +A polygon is also displayed with its original outlines if there are +other non-polygon objects in the signal, but none of them is connected +to the polygon. +
+When calculating whether such an object is actually solidly connected to the +hatched polygon, it is reduced to several "control points". For a round pad, for +instance, these would be the north, east, west and south point on the pad's +circumference, while for a wire it's the two end points. A solid connection is +considered to exist if there is at least one line in the calculated polygon (outline +or hatch line) that runs through these points with its center line. +
+Thermal and annulus rings inside a hatched polygon that do not have solid contact to
+any of the polygon lines are not generated.
+
+
+
+PREFIX
+
+
+See also CONNECT,
+PACKAGE,
+VALUE
+
+This command is used in the device editor mode to determine the initial +characters of automatically generated symbol names when a symbol is +placed in a schematic using the ADD command. +
+PREFIX U; ++If this command is used when editing, for example, a 7400 device, then +gates which are later placed in a schematic using the ADD command +will be allocated the names U1, U2, U3 in sequence. These names may +be changed later with the NAME command. + + + +
+The PRINT command prints the currently edited drawing to the system printer. +
+Colors and fill styles are used as set in the editor window. This can be +changed with the SOLID and BLACK options. +The color palette used for the printout is always that for white background. +
+If you want to print pads and vias "filled" (without the drill holes +being visible), use the command +
+SET DISPLAY_MODE NODRILL; ++Please note that polygons in boards will not be automatically calculated +when printing via the PRINT command! Only the outlines will be drawn. +To print polygons in their calculated shape you have to use the +RATSNEST command before printing. +
+You can enter a factor to scale the output. +
+The limit parameter is the maximum number of pages you want the +output to use. The number has to be preceded with a '-' to +distinguish it from the factor. +In case the drawing does not fit on the given number of pages, the factor +will be reduced until it fits. +Set this parameter to -0 to allow any number of pages (and thus making sure +the printout uses exactly the given scale factor). +
+If the PRINT command is not terminated with a ';', +a print dialog will allow you to set +print options. +Note that options entered via the command line will not be stored permanently in the print setup +unless they have been confirmed in the print dialog +(i.e. if the command has not been terminated with a ';'). +
+The following options exist: +
+
MIRROR | mirrors the output | |
ROTATE | rotates the output by 90° | |
UPSIDEDOWN | rotates the drawing by 180°. Together with ROTATE, the drawing is rotated by a total of 270° | |
BLACK | ignores the color settings of the layers and prints everything in black | |
SOLID | ignores the fill style settings of the layers and prints everything in solid | |
CAPTION | prints a caption at the bottom of the page | |
FILE | prints the output into a file; the file name must immediately follow this option | |
PRINTER | prints to a specific printer; the printer name must immediately follow this option | |
PAPER | prints on the given paper size; the paper size must immediately follow this option | |
SHEETS | prints the given range of sheets; the range (from-to) must immediately follow this option | |
WINDOW | prints the currently visible window selection of the drawing | |
PORTRAIT | prints in portrait orientation | |
LANDSCAPE | prints in landscape orientation |
+If any of the options MIRROR...CAPTION is preceeded with a '-', that option is turned off in case +it is currently on (from a previous PRINT). +A '-' by itself turns off all options. +
+If the output file name has an extension of ".pdf" (case insensitive), +a PDF file will be created. A PDF file can also be created by selecting "Print to File (PDF)" +from the "Printer" combo box in the print dialog. +Texts in a PDF file can be searched in a PDF viewer, as long as they are not +using the vector font. +
+If the output file name has an extension of ".ps" (case insensitive), +a Postscript file will be created. +
+If the file name is only an "*" or "*.ext" (an asterisk followed +by an extension, as in "*.pdf", for instance), a file dialog will be opened +that allows the user to select or enter the actual file name. +
+If the file name is only an extension, as in ".pdf", the output file name +will be the same as the drawing file name, with the extension changed to the given +string. +
+The file name may contain one or more of the following placeholders, which +will be replaced with the respective string: +
+
%E | the loaded file's extension (without the '.') | |
%N | the loaded file's name (without path and extension) | |
%P | the loaded file's directory path (without file name) | |
%% | the character '%' |
+For example, the file name +
+%N.cmp.pdf +
+would create boardname.cmp.pdf. +
+If both the FILE and the PRINTER option are present, only the last one +given will be taken into account +
+Width x Height Unit ++(without blanks), as in +
+PRINT PAPER 200x300mm +PRINT PAPER 8.0x11.5inch ++Width and Height can be floating point numbers, and the Unit +may be either mm or inch (the latter may be abbreviated as in). +Paper names must be given in full, and are case insensitive. +If both the PRINTER and PAPER option are used, the PRINTER +option must be given first. +Custom paper sizes may not work with all printers. They are mainly for use +with Postscript or PDF output. +
opens the print dialog in which you can set print options | ||
PRINT; | immediately prints the drawing with the default options | |
PRINT - MIRROR BLACK SOLID; | prints the drawing mirrored, with everything in black and solid | |
PRINT 2.5 -1; | prints the drawing enlarged by a factor of 2.5, but makes sure that it does not exceed one page | |
PRINT FILE .pdf; | prints the drawing into a PDF file with the same name as the drawing file | |
PRINT SHEETS 2-15 FILE .pdf; | prints the sheets 2 through 15 into a PDF file with the same name as the drawing file |
+You can also exit from EAGLE at any time by pressing Alt+X.
+
+
+
+RATSNEST
+
+
+See also SIGNAL,
+MOVE,
+POLYGON,
+RIPUP
+
+RATSNEST signal_name ..
+RATSNEST ! signal_name ..
+
+The RATSNEST command assesses the airwire connections in order +to achieve the shortest possible paths, for instance, after components +have been moved. After reading a netlist via the +SCRIPT +command, it is also useful to use the RATSNEST command to optimize the +length of airwires. +
+The RATSNEST command also calculates all polygons belonging to a
+signal. This is necessary in order to avoid the calculation of
+airwires for pads already connected through polygons. All of the calculated
+polygon areas are then being displayed in the "real mode".
+You can switch back to the faster
+"outline mode" with the RIPUP command.
+The automatic calculation of the polygons can be turned off with
+
+SET POLYGON_RATSNEST OFF; ++RATSNEST ignores airwires representing signals which have +their own layer in a multilayer board (e.g. layer $GND for signal +GND), apart from signals connecting smd pads to a supply layer with +a via-hole. +
+Note that RATSNEST doesn't mark the board drawing as modified, since the +calculated polygon data (if any) is not stored in the board, and the +recalculated airwires don't really constitute a modification of the drawing. +
+Such zero length airwires can be picked up with the +ROUTE command just like ordinary airwires. +They may also be handled by placing a VIA +at that point. +
+Ratsnest: Nothing to do! ++Otherwise, if there are still airwires that have not been routed, the +message +
+Ratsnest: xx airwires. ++will be displayed, where xx gives the number of unrouted airwires. +
+
* | matches any number of any characters | |
? | matches exactly one character | |
[...] | matches any of the characters between the brackets |
+If any of these characters shall be matched exactly as such, it has to be enclosed +in brackets. For example, abc[*]ghi would match abc*ghi and not +abcdefghi. +
+A range of characters can be given as [a-z], which results in any character +in the range 'a'...'z'. +
+To hide airwires the RATSNEST command can be given the exclamation mark ('!'), +followed by a list of signals, as in +
+RATSNEST ! GND VCC ++which would hide the airwires of the signals GND and VCC.
+RATSNEST GND VCC ++This will activate the display of the airwires of the signals GND and VCC +and also recalculates them. You can also recalculate the airwires (and polygons) of +particular signals this way. +
+The signal names may contain wildcards, and the two variants may be combined, as in +
+RATSNEST D* ! ?GND VCC ++which would recalculate and display the airwires of all signals with names beginning +with 'D', and hide the airwires of all the various GND signals (like AGND, DGND etc.) +and the VCC signal. Note that the command is processed from left to right, so in case +there is a DGND signal the example would first process it for display, but then +hide its airwires. +
+To make sure all airwires are displayed enter +
+RATSNEST * ++Note that the SIGNAL command will automatically +make the airwires of a signal visible if a new airwire is created for that signal. +The RIPUP command on the other hand will not change +the state of hiding airwires if a wire of a signal is changed into an airwire. + + + +
+The RECT command is used to add rectangles to a drawing. The two points +define two opposite corners of the rectangle. Pressing the center +mouse button changes the layer to which the rectangle is to be added. +
+The orientation (see description in ADD) +may be any angle in the range R0...R359.9. The S +and M flags can't be used here. +Note that the coordinates are always defined at an orientation of R0. +The possibility of entering an orientation in the RECT command is +mainly for use in scripts, where the rectangle data may have been derived +through a User Language Program from the UL_RECTANGLE +object. When entering a non-zero orientation interactively, the corners of +the rectangle may not appear at the actual cursor position. +Use the ROTATE command to interactively rotate +a rectangle. +
+In EAGLE it is possible to reverse previous actions with the UNDO +command. These actions can be executed again by the REDO command. +UNDO and REDO operate with a command memory which exists back to the +last EDIT, OPEN, AUTO or REMOVE command. +
+UNDO/REDO is completely integrated within Forward&Back Annotation.
+
+
+
+REMOVE
+
+
+See also OPEN,
+RENAME
+
+REMOVE name.Sxx
+
+Symbols and packages can be erased from a library only +if not used by a device. +
+REMOVE .S3 ++deletes sheet number 3 from the presently loaded schematic. +
+If you delete the currently loaded sheet, sheet number 1 will be loaded +after the command has been executed. All sheets with a higher number +than the one deleted will get a number reduced by one. +
+UNDO does not work with this command. If you have deleted a sheet +accidentally it will be present in the "old" schematic file +as long as the "new" file has not been saved. +
+REMOVE clears the UNDO buffer.
+
+
+
+RENAME
+
+
+See also OPEN
+
+The RENAME command is used to change the name of a symbol, device +or package. The appropriate library must have been opened by the OPEN +command before. +
+The names may include extensions (for example RENAME name1.pac name2[.pac] - note that the +extension is optional in the second parameter). If the first parameter +is given without extension, you have to be in the respective mode to +rename an object (i.e. editing a package if you want to rename packages). +
+RENAME clears the UNDO buffer.
+
+
+
+REPLACE
+
+
+See also SET,
+UPDATE
+
+REPLACE device_name ..
+REPLACE part_name device_name ..
+REPLACE package_name ..
+REPLACE element_name package_name ..
+
+The REPLACE command can be used to replace a part with a different +device (even from a different library). The old and new device must +be compatible, which means that their used gates and connected pins/pads must +match, either by their names or their coordinates. +
+Without parameters the REPLACE command opens a dialog from which a device +can be selected from all libraries that are currently in use. +After such a device has been selected, subsequent mouse clicks on parts +will replace those parts' devices with the selected one if possible. +
+If a device_name is given, that device will be used for the replace +operation. +
+With both a part_name and a device_name, the device of +the given part will be replaced (this is useful when working with scripts). +
+If only a board is being edited (without a schematic), or if elements in the +board are being replaced that have no matching part in the schematic, +the REPLACE command has two different modes that are chosen by the +SET command. +
+The first mode (default) is activated by the command: +
+SET REPLACE_SAME NAMES; ++In this mode the new package must have the same pad and smd names +as the old one. It may be taken from a different library and it may +contain additional pads and smds. The position of pads +and smds is irrelevant. +
+The second mode is activated by the command +
+SET REPLACE_SAME COORDS; ++In this mode, pads and smds of the new package must +be placed at the same coordinates as in the old one (relative to the +origin). Pad and smd names may be different. The new package may be +taken from a different library and may contain additional pads and +smds. +
+Pads of the old package connected with signals must be present in the +new package. If this condition is true the new package may have less +pads than the old one. +
+REPLACE functions only when the appropriate tOrigins/bOrigins +layer is displayed. +
+If there is already a package with the same name (from the same library) in the drawing, +and the library has been modified after the original object was added, an automatic +library update will be started and you will be asked whether +objects in the drawing shall be replaced with their new versions. +
+Note: A REPLACE operation automatically updates all involved library objects
+as necessary. This means that other parts (on other schematic sheets or in
+other locations on the board) may be changed, too.
+You should always run a Design Rule Check (DRC) and an
+Electrical Rule Check (ERC) after a REPLACE operation!
+
+
+
+RIPUP
+
+
+See also DELETE,
+GROUP,
+POLYGON,
+RATSNEST
+
+Changes the display of polygons to "outlines".
+
+RIPUP [ @ ] [ ! ] ..
+RIPUP [ @ ] [ ! ] signal_name..
+
+The RIPUP command changes routed wires (tracks) into airwires. That +can be done for: +
+RIPUP signal_name.. ++rips up the complete signal "signal_name" (several signals may be +listed, e.g. RIPUP D0 D1 D2;). +
+RIPUP .. ++rips up segments selected by the mouse click up to the next pad/smd. +
+RIPUP; ++removes only signals which are connected to elements +(e.g. board crop marks are not affected). The same applies if RIPUP +is used on a group. +
+Note: in all cases the RIPUP command only acts on objects that +are in layers that are currently visible! +
+
* | matches any number of any characters | |
? | matches exactly one character | |
[...] | matches any of the characters between the brackets |
+If any of these characters shall be matched exactly as such, it has to be enclosed +in brackets. For example, abc[*]ghi would match abc*ghi and not +abcdefghi. +
+A range of characters can be given as [a-z], which results in any character +in the range 'a'...'z'. +
+The ROTATE command is used to change the orientation of objects. +
+If orientation (see description in ADD) is given, +that value will be added to the orientation of the selected object instead. +
+Prepending orientation with the character '=' causes the value +not to be added, but instead to be set absolutely. +
+Parts, pads, smds and pins can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. +For example +
+
+ROTATE =MR90 IC1 ++
+would set the orientation of element IC1 to MR90, regardless of its previous setting. +
+Attributes of parts can be selected by entering the concatenation of +part name and attribute name, as in R5>VALUE. +
+If element_name could be mistaken as an orientation parameter +you need to quote that name, as in +
+
+ROTATE R45 'R1' ++
+You can use Click&Drag to rotate an object by any angle. +Just click on the object and move the mouse (with the mouse +button held down) away from the object. After having moved the mouse a +short distance, the object will start rotating. Move the mouse until the +desired angle has been reached and then release the mouse button. If, at +some point, you decide to rather not rotate the object, you can press the +ESCape key while still holding the mouse button pressed. +The same operation can be applied to a group by using the right mouse button. +The group will be rotated around the point where the right mouse button has +been pressed down. +
+Parts cannot be rotated if they are locked, +or if any of their connected pads would extend outside the allowed area +(in case you are using a limited edition of EAGLE). +
+Elements can only be rotated if the appropriate tOrigins/bOrigins +layer is visible. +
+If you want to have text that is printed "upside down", you can set the "Spin"
+flag for that text.
+
+
+
+ROUTE
+
+
+See also AUTO,
+UNDO,
+WIRE,
+MITER,
+SIGNAL,
+SET,
+RATSNEST
+
+ROUTE name ..
+
+
+
+
+
+
+
+
+The ROUTE command activates the manual router which allows you to +convert airwires (unrouted connections) into real wires. +
+The first point selects an unrouted connection (a wire +in the Unrouted layer) and replaces one end of it by a wire (track). +The end which is closer to the mouse cursor will be taken. Now the +wire can be moved around (see also WIRE). +The right mouse button will change the wire bend and the center mouse +button will change the layer. +Please note that only those signal layers (1 through 16) are available +that have been entered into the layer setup in the Design Rules. +
+When the final position of the wire +is reached, a further click of the left mouse button will place the +wire and a new wire segment will be attached to the cursor. +If the Shift key is held down in such a situation, a Via will +be generated at that point if this is possible and the airwire hasn't already +been completely routed. The generated Via will have either the appropriate +length or, if such a length can't be determined, will go from layer 1 through 16. +
+When the layer has been changed and a via-hole is thus necessary, +it will be added automatically as the wire is placed. When the complete +connection has been routed a 'beep' will be given and the next unrouted +connection can be selected for routing. +
+Only the minimum necessary vias will be set (according to the layer setup in the +Design Rules). It may happen that an already existing via of the same signal is +extended accordingly, or that existing vias are combined to form a longer via if +that's necessary to allow the desired layer change. +If a via is placed at the start or end point, and there is an SMD pad +at that location, the via will be a micro via if the current routing +layer is one layer away from the SMD's layer (this applies only if micro vias +have been enabled in the Design Rules). +
+While the ROUTE command is active the wire width can be entered +from the keyboard. +
+If the curve or @radius parameter is given, an arc can be drawn as part of the track +(see the detailed description in the WIRE command). +
+If the Ctrl key is pressed while selecting the starting point and there +is no airwire at that point, a new airwire will be created automatically. The starting +point of that airwire will be that point on the selected wire or via that is closest to +the mouse cursor (possibly snapped to the nearest grid point). The far end of the +airwire will dynamically point to a target segment that is different from the +selected one. If the selected signal is already completely routed, the far end will +point to the starting point instead. +If the selected wire is an arc, the airwire will start at the closest end point +of the wire. +
+If a name is given, the airwire of that signal that is closest +to the mouse cursor is selected. If name could be interpreted +as a with, curve or @radius it has to be written +in single quotes. +
+When routing an airwire that starts at an already routed wire, the new +wire's width is automatically adjusted to that of the existing wire +if the Shift key is pressed when selecting the airwire. +
+SET SNAP_LENGTH distance; ++where "distance" is the snap radius in the current grid unit. +
+Wire bend style 8 routes only the shorter side of the selected airwire, +while 9 routes both sides. Once the automatic routing process is complete +(which may take a while, so be patient), the airwire will be replaced by the +actual routed wires and vias. If the routing couldn't be completed (for instance +due to Design Rules restrictions), the cursor changes into a "forbidden" sign. +With bend style 9 it is possible that only one side of the airwire can +be routed, while the other side can't. +
+Whenever the mouse is moved, any previous result is discarded and a new calculation +is started. Once the result is acceptable, just click the left mouse button to +place it. +
+The Follow-me router works by marking the grid point at the current mouse position +as a starting point, and uses the Autorouter to find a path from that point to any +point along the signal segment at which the selected airwire ends (which is not +necessarily the exact end point of the airwire). The starting point also considers +the currently selected layer, so don't be surprised if the router places a via +at that point. By changing the current layer you can influence the routing result. +
+The routing grid is taken from the actual grid setting at the time the airwire +is selected. +
+The routing parameters (like cost factors, preferred directions etc.) are those defined +in the dialog of the AUTO command. +
+The following particularities apply: +
+The RUN command starts the User Language Program from the file file_name.
+The optional argument list is available to the ULP through the
+Builtin Variables argc and argv.
+
+The SCRIPT command is used to execute sequences of commands that are +stored in a script file. If SCRIPT is typed in at the keyboard and "file_name" +has no extension, the program automatically uses ".scr". +
SCRIPT nofill | executes nofill.scr | |
SCRIPT myscr. | executes myscr (no Suffix) | |
SCRIPT myscr.old | executes myscr.old |
+Please refer to the EXPORT command for different possibilities +of script files. +
+If the SCRIPT command is selected with the mouse, a popup menu will +show all of the files which have the extension ".scr" so that +they can be selected and executed. +
+The SCRIPT command provides the ability to customize +the program according to your own wishes. For instance: +
+A dialog in which all the parameters can be set appears if the SET command is entered without parameters. +
Snap function | SET SNAP_LENGTH number; | |
This sets the limiting value for the snap function in the ROUTE command (using the current unit). | ||
Default: 20 mil | ||
If tracks are being laid with the ROUTE command to pads that are not on the grid, the snap function will ensure that a route will be laid to the pad within the snap-length. | ||
SET CATCH_FACTOR value; | ||
Defines the distance from the cursor up to which objects are taken into account when clicking with the mouse. The value is entered relative to the height (or width, whichever is smaller) of the presently visible part of the drawing. It applies to a zoom level that displays at least a range of 4 inch and inrceases logarithmically when zooming further in. A value of 0 turns this limitation off. Default: 0.05 (5%). | ||
SET SELECT_FACTOR value; | ||
This setting controls the distance from the cursor within which nearby objects will be suggested for selection. The value is entered relative to the height (or width, whichever is smaller) of the presently visible part of the drawing. Default: 0.02 (2%). | ||
Menu contents | SET USED_LAYERS name | number; | |
Specifies the layers which will be shown in the associated EAGLE menus. See the example file mylayers.scr. | ||
The layers Pads, Vias, Unrouted, Dimension, Drills and Holes will in any case remain in the menu, as will the schematic layers. Any used signal layers also remain in the menus. SET Used_Layers All activates all layers. | ||
SET WIDTH_MENU value..; | ||
SET DIAMETER_MENU value..; | ||
SET DRILL_MENU value..; | ||
SET SMD_MENU value..; | ||
SET SIZE_MENU value..; | ||
SET ISOLATE_MENU value..; | ||
SET SPACING_MENU value..; | ||
SET MITER_MENU value..; | ||
The content of the associated popup menus can be configured with the above command for the parameters width etc.. A maximum of 16 values is possible for each menu (16 value-pairs in the SMD menu). Without any values (as in SET WIDTH_MENU;) the program default values will be restored. | ||
Example: Grid Inch; Set Width_Menu 0.1 0.2 0.3; | ||
Bend angle for wires | SET WIRE_BEND bend_nr; | |
bend_nr can be one of: | ||
0: Starting point - horizontal - vertical - end | ||
1: Starting point - horizontal - 45° - end | ||
2: Starting point - end (straight connection) | ||
3: Starting point - 45° - horizontal - end | ||
4: Starting point - vertical - horizontal - end | ||
5: Starting point - arc - horizontal - end | ||
6: Starting point - horizontal - arc - end | ||
7: "Freehand" (arc that fits to wire at start, straight otherwise) | ||
8: Route short end of airwire in Follow-me router | ||
9: Route both ends of airwire in Follow-me router | ||
Note that 0, 1, 3 and 4 may contain additional miter wires (see MITER). | ||
SET WIRE_BEND @ bend_nr ...; | ||
Defines the bend angles that shall be actually used when switching with the right mouse button. | ||
SET WIRE_BEND @; | ||
Switches back to using all bend angles. | ||
Beep on/off | SET BEEP OFF | ON; |
Color for grid lines | SET COLOR_GRID color; | |
Layer color | SET COLOR_LAYER layer color; | |
Fill pattern for layer | SET FILL_LAYER layer fill; | |
Grid parameters | SET MIN_GRID_SIZE pixels; | |
The grid is only displayed if the grid size is greater than the set number of pixels. | ||
Min. text size shown | SET MIN_TEXT_SIZE size; | |
Text less than size pixels high is shown as a rectangle on the screen. The setting 0 means that all text will be displayed readably. | ||
Net wire display | SET NET_WIRE_WIDTH width; | |
Pad display | SET DISPLAY_MODE REAL | NODRILL; | |
REAL: Pads are displayed as they will be plotted. NODRILL: Pads are shown without drill hole. | ||
SET PAD_NAMES OFF | ON; | ||
Pad names are displayed/not displayed. | ||
Bus line display | SET BUS_WIRE_WIDTH width; | |
DRC-Parameter | SET DRC_FILL fill_name; | |
Polygon calculation | SET POLYGON_RATSNEST OFF | ON; | |
See POLYGON command. | ||
Vector font | SET VECTOR_FONT OFF | ON; | |
See TEXT command. | ||
Cross-reference labels | SET XREF_LABEL_FORMAT string; | |
See LABEL command. | ||
Part cross-references | SET XREF_PART_FORMAT string; | |
See TEXT command. |
Package check | SET CHECK_CONNECTS OFF | ON; | |
The ADD command checks whether a pin has been connected to every pad (with CONNECT). This check can be switched off. Nevertheless, no board can be generated from a schematic if a device is found which does not have a package. | ||
REPLACE mode | SET REPLACE_SAME NAMES | COORDS; | |
UNDO buffer on/off | SET UNDO_LOG OFF | ON; | |
Wire optim. on/off | SET OPTIMIZING OFF | ON; | |
If set on, wires which lie in one line after a MOVE, ROUTE or SPLIT are subsumed into a single wire. See also OPTIMIZE. |
+The color palettes can be modified either through the dialog under +"Options/Set.../Colors" or by using the command +
+SET PALETTE index argb ++where index is a number in the range 0..63 and argb is a hexadecimal +value defining the Alpha, Red, Green and Blue components of the color, like 0xFFFFFF00 +(which would result in a bright yellow). The alpha component defines how "opaque" +the color is. A value of 0x00 means it is completely transparent (i.e. invisible), +while 0xFF means it is totally opaque. +The alpha component of the background color is always 0xFF. +Note that the ARGB value must begin with "0x", otherwise it would be taken as a +decimal number. You can use +
+SET PALETTE BLACK|WHITE|COLORED ++to switch to the black, white or colored background palette, respectively. +Note that there will be no automatic window refresh after this command, so +you should do a WINDOW; command after this. +
+By default only the palette entries 0..15 are used and they contain the +colors listed below. +
+The palette entries are grouped into "normal" and "highlight" colors. There +are always 8 "normal" colors, followed by the corresponding 8 "highlight" +colors. So colors 0..7 are "normal" colors, 8..15 are their "highlight" +values, 16..23 are another 8 "normal" colors with 24..31 being their +"highlight" values and so on. The "highlight" colors are used to visualize +objects, for instance in the SHOW command. +
+Color, listed according to color numbers, which can be used instead of the color names. Used to specify colors: +
+
0 | Black | |
1 | Blue | |
2 | Green | |
3 | Cyan | |
4 | Red | |
5 | Magenta | |
6 | Brown | |
7 | LGray | |
8 | DGray | |
9 | LBlue | |
10 | LGreen | |
11 | LCyan | |
12 | LRed | |
13 | LMagenta | |
14 | Yellow | |
15 | White |
+Fill specifies the style with which wires and rectangles in a particular layer are to be filled. This parameter can also be replaced with the number at the beginning of each line: +
+
0 | Empty | |
1 | Solid | |
2 | Line | |
3 | LtSlash | |
4 | Slash | |
5 | BkSlash | |
6 | LtBkSlash | |
7 | Hatch | |
8 | XHatch | |
9 | Interleave | |
10 | WideDot | |
11 | CloseDot | |
12 | Stipple1 | |
13 | Stipple2 | |
14 | Stipple3 | |
15 | Stipple4 |
+Example +
+SET Option.DrawUnprocessedPolygonEdgesContinuous 1; ++The following eaglerc parameters parameters are available: +
+
123 | renders layer 123 | |
123t | renders layer 123 if the output is "viewed from top" (not mirrored) | |
123b | renders layer 123 if the output is "viewed from bottom" (mirrored) | |
123-140 | renders layers 123 through 140 in the given sequence | |
140-123 | renders layers 140 through 123 in the given sequence | |
* | inserts the default sequence of the internal layers | |
123b * 123t | makes layer 123 always be rendered first |
+The SHOW command is used to highlight objects. +Details are listed in the status bar. +Complete signals and nets can be highlighted with the SHOW command. +If a bus is selected, all nets belonging to that bus will also be +highlighted. +
+If several names are entered in one line, all matching objects are +highlighted at the same time. +
+
* | matches any number of any characters | |
? | matches exactly one character | |
[...] | matches any of the characters between the brackets |
+If any of these characters shall be matched exactly as such, it has to be enclosed +in brackets. For example, abc[*]ghi would match abc*ghi and not +abcdefghi. +
+A range of characters can be given as [a-z], which results in any character +in the range 'a'...'z'. +
+The special pattern [number..number] forms a bus name range +and is therefore not treated as a wildcard pattern in a schematic. +
+SHOW IC1 ++IC1 is highlighted and remains highlighted until the SHOW command is ended +or a different name is entered. +
+SHOW IC* ++Highlights all objects with names starting with "IC". + + + +
+The SIGNAL command is used to define signals (connections between +the various packages). The user must define a minimum of two element_name/pad_name +pairs, as otherwise no airwire can be generated. +
+If input with signal_name the signal will be allocated the specified +name. +
+SIGNAL GND IC1 7 IC2 7 IC3 7; ++connects pad 7 of IC1...3. In order to enter a whole netlist, a script +file may be generated, with the extension *.scr. This file +should include all of the necessary SIGNAL commands in the format shown +above. +
+The SMASH command is used with parts or elements in order to separate the text +parameters indicating name, value or attributes. The text may +then be placed in a new and more convenient location with the MOVE +command. +
+Parts and elements can also be selected by their name, +which is especially useful if the object is outside the currently shown +window area. Note that when selecting a multi-gate part in a schematic by name, +you will need to enter the full instance name, consisting of part +and gate name. +
+Use of the SMASH command allows the text to be treated like any other +text, e.g. CHANGE SIZE, ROTATE, etc., but the actual text may not +be changed. +
+A "smashed" element can be made "unsmashed" by clicking on it with the
+Shift key pressed (and of course the SMASH command activated).
+
+
+
+SMD
+
+
+See also PAD,
+CHANGE,
+NAME,
+ROUTE,
+Design Rules
+
+
+
+The SMD command is used to add pads for surface mount devices to a +package. When the SMD command is active, an smd symbol is attached +to the cursor. Pressing the left mouse button places an smd pad at +the current position. +Entering numbers changes the x- and y-width of the smd pad, which +can be up to 0.51602 inch (13.1 mm). These parameters +remain as defaults for successive SMD commands and can be changed +with the CHANGE command. Pressing +the center mouse button changes the layer onto which the smd pad will be drawn. +
+The orientation (see description in ADD) +may be any angle in the range R0...R359.9. The S +and M flags can't be used here. +
+SMD 50 50 -100 '1' ++for example would create a completely round smd named '1' at the given +mouseclick position. This can be used to create BGA (Ball Grid Array) pads. +
+
NOSTOP | don't generate solder stop mask | |
NOTHERMALS | don't generate thermals | |
NOCREAM | don't generate cream mask |
+By default an smd automatically generates solder stop mask, cream mask and thermals as necessary.
+However, in special cases it may be desirable to have particular smds not do this.
+The above NO... flags can be used to suppress these features.
+A newly started SMD command resets all flags to their defaults. Once a flag is given
+in the command line, it applies to all following smds placed within this SMD command.
+
+The SPLIT command is used to split a wire (or segment) or a polygon +edge into two segments in order, for example, to introduce a bend. +This means you can split wires into parts that can be moved with the +mouse during the SPLIT command. A mouseclick defines the point at +which the wire is split. The shorter of the two new segments follows +the current wire bend rules and may therefore itself become two segments +(see SET Wire_Bend), the longer segment is a straight segment running +to the next end point. +
+If the curve or @radius parameter is given, an arc can be drawn as part of the wire segment +(see the detailed description in the WIRE command). +
+On completion of the SPLIT command, the segments are automatically +rejoined if they are in line unless the command +
+SET OPTIMIZING OFF; ++has previously been given, or the wire has been clicked at the same +spot twice. In this case the split points remain and can be used, +for example, to reduce the width of a segment. This is achieved by +selecting the SPLIT command, marking the part of the wire which is +to be reduced with two mouse clicks, and using the command +
+CHANGE WIDTH width ++The segment is then clicked on to complete the change. + + + +
+This command is used in the device editor mode to define the possible technology +parts of a device name. +In the schematic or board editor the TECHNOLOGY command behaves exactly +like "CHANGE TECHNOLOGY". +
+Exactly one of the names given in the TECHNOLOGY command will +be used to replace the '*' in the device set name when an actual device is added +to a schematic. +The term technology stems from the main usage of this feature in creating +different variations of the same basic device, which all have the same schematic +symbol(s), the same package and the same pin/pad connections. They only differ in +a part of their name, which for the classic TTL devices is related to their +different technologies, like "L", "LS" or "HCT". +
+The TECHNOLOGY command can only be used if a package variant has been selected with the PACKAGE command. +
+If no '*' character is present in the device set name, the technology will +be appended to the device set name to form the full device name. Note that the technology +is processed before the package variant, so if the device set name contains neither +a '*' nor a '?' character, the resulting device name will consist +of device_set_name+technology+package_variant. +
+The names listed in the TECHNOLOGY command will be added to an already existing list +of technologies for the current device. +Starting a name with '-' will remove that name from the list of technologies. +If a name shall begin with '-', it has to be enclosed in single quotes. +Using -* removes all technologies. +
+Only ASCII characters in the range 33..126 may be used in technologies (lowercase characters +will be converted to uppercase), and the maximum number of technologies per device is 254. +
+The special "empty" technology can be entered as two single quotes ('', an empty string). +
+Note that the Technologies dialog contains all technologies from all devices in +the loaded library, with the ones referenced by the current device checked. +
+TECHNOLOGY -* '' L LS S HCT; ++would first remove any existing technologies and then create the individual technology variants +
+7400 +74L00 +74LS00 +74S00 +74HCT00 ++ + + +
+The TEXT command is used to add text to a library element or drawing. +When entering several texts it is not necessary to invoke the +command each time, as the text command remains active after placing +text with the mouse. +
+Text is always displayed so that it can be read from in front or from +the right - even if rotated. Therefore after every two rotations it +appears the same way, but the origin has moved from the lower left +to the upper right corner. Remember this if a text appears to be unselectable. +
+If you want to have text that is printed "upside down", you can set the "Spin" +flag for that text. +
+CHANGE SIZE text_size .. +CHANGE RATIO ratio .. ++Maximum text height: 2 inches
Vector | the program's internal vector font | |
Proportional | a proportional pixel font (usually 'Helvetica') | |
Fixed | a monospaced pixel font (usually 'Courier') |
+The text font can be changed with the CHANGE command: +
+CHANGE FONT VECTOR|PROPORTIONAL|FIXED .. ++The program makes great efforts to output texts with fonts other than +Vector as good as possible. However, since the actual font is drawn +by the system's graphics interface, Proportional and Fixed fonts +may be output with different sizes and/or lengths. +
+If you set the option "Always vector font" in the user interface dialog,
+all texts will always be displayed and printed using the builtin vector font.
+This option is useful if the system doesn't display the other fonts correctly.
+When creating a new board or schematic, the current setting of this option is stored in the
+drawing file. This makes sure that the drawing will be printed with the correct
+setting if it is transferred to somebody else who has a different setting of
+this option.
+You can use the SET VECTOR_FONT OFF|ON command
+to change the setting in an existing board or schematic drawing.
+
+When creating output files with the CAM Processor, texts will always be drawn with +Vector font. Other fonts are not supported. +
+If a text with a font other than Vector is subtracted from a signal +polygon, only the surrounding rectangle is subtracted. Due to the +above mentioned possible size/length problems, the actually printed +font may exceed that rectangle. Therefore, if you need to subtract +a text from a signal polygon it is recommended that you use the Vector +font. +
+The Ratio parameter has no meaning for texts with fonts other than Vector. +
+
>NAME | Component name (ev.+gate name) 1) | |
>VALUE | Comp. value/type 1) | |
>PART | Component name 2) | |
>GATE | Gate name 2) | |
>XREF | Part cross-reference 2) | |
>CONTACT_XREF | Contact cross-reference 2) | |
>DRAWING_NAME | Drawing name | |
>LAST_DATE_TIME | Time of the last modification | |
>PLOT_DATE_TIME | Time of the plot creation | |
>SHEETNR | Sheet number of a schematic 3) | |
>SHEETS | Total number of sheets of a schematic 3) | |
>SHEET | equivalent to ">SHEETNR/>SHEETS" 3) |
+1) Only for package or symbol
+2) Only for symbol
+3) Only for symbol or schematic
+
+The format in which a part cross-reference is displayed can be controlled +through the "Xref part format" string, which is defined in the "Options/Set/Misc" +dialog, or with the SET command. +The following placeholders are defined, and can be used in any order: +
+
%S | the sheet number | |
%C | the column on the sheet | |
%R | the row on the sheet |
+The default format string is "/%S.%C%R". Apart from the defined +placeholders you can also use any other ASCII characters. +
+
>ABC | 123 | |
>ABC= | ABC = 123 | |
>ABC~ | ABC | |
>ABC! | nothing |
+ !RESET ++which would result in +
+ _____ + RESET ++This is not limited to signal names, but can be used in any text. It is +also possible to overline only part of a text, as in +
+ !RST!/NMI + R/!W ++which would result in +
+ ___ + RST/NMI + _ + R/W ++Note that the second exclamation mark indicates the end of the overline. +There can be any number of overlines in a text. If a text shall contain +an exclamation mark that doesn't generate an overline, it needs to be +escaped by a backslash. In order to keep the need for escaping exclamation +marks at a minimum, an exclamation mark doesn't start an overline if it +is the last character of a text, or if it is immediately followed by a +blank, another exclamation mark, a double or single quote, or by a right +parenthesis, bracket or brace. Any non-escaped exclamation mark or comma +that appears after an exclamation mark that started an overline will end +the overline (the comma as an overline terminator is necessary for busses). + + + +
+The UNDO command allows you to cancel previously executed commands. +This is especially useful if you have deleted things by accident. +Multiple UNDO commands cancel the corresponding number of commands +until the last EDIT, OPEN, AUTO, or REMOVE command is reached. It +is not possible to "undo" window operations. +
+The UNDO command uses up disk space. If you are short of +this you can switch off this function with the SET command +
+SET UNDO_LOG OFF; ++UNDO/REDO is completely integrated within Forward&Back Annotation. + + + +
+The UPDATE command checks the parts in a board or schematic against +their respective library objects and automatically updates them if +they are different. If UPDATE is invoked from the library editor, the +packages within the loaded library will be updated from the given +libraries. +
+If you activate the UPDATE command without a parameter, a file dialog will +be presented to select the library from which to update. +
+If one ore more libraries are given, only parts from those libraries will be checked. +The library names can be either a plain library name (like "ttl" or "ttl.lbr") or a full +file name (like "/home/mydir/myproject/ttl.lbr" or "../lbr/ttl"). +
+If the first parameter is '+@', the names of the given libraries (or all libraries, +if none are given) will get a '@' character appended, followed by a number. +This can be used to make sure the libraries contained in a drawing will not be modified when +a part from a newer library with the same name is added to the drawing. Library names that +already end with a '@' character followed by a number will not be changed. +
+If the first parameter is '-@', the '@' character (followed by a number) of the given +libraries (or all libraries, if none are given) will be stripped from the library name. +This of course only works if there is no library with that new name already in the drawing. +
+Please note that "UPDATE +@;" followed by "UPDATE -@;" (and vice versa) does not necessarily +result in the original set of library names, because the sequence in which the names are processed +depends on the sequence in which the libraries are stored in the drawing file. +
+The libraries stored in a board or schematic drawing are identified only by their +base name (e.g. "ttl"). When considering whether an update shall be performed, +only the base name of the library file name will be taken into account. +Libraries will be searched in the directories specified under "Libraries" in the +directories dialog, from left to right. +The first library of a given name that is found will be taken. Note that the library +names stored in a drawing are handled case insensitive. It does not matter whether +a specific library is currently "in use". If a library is not found, no update +will be performed for that library and there will be no error message. +
+Using the UPDATE command in a schematic or board that are connected via active +Forward&Back Annotation will act on both the +schematic and the board. +
+At some point you may need to specify whether gates, pins or pads shall +be mapped by their names or their coordinates. This is the case when the respective library +objects have been renamed or moved. If too many modifications have been made (for example, if +a pin has been both renamed and moved) the automatic update may not be possible. In that case +you can either do the library modification in two steps (one for renaming, another for moving), +or give the whole library object a different name. +
+When used with old_library_name = new_library_name (note that there has to be +at least one blank before and after the '=' character), the UPDATE command +locates the library named old_library_name in the current board or schematic, +and updates it with the contents of new_library_name. Note that old_library_name +must be the pure library name, without any path, while new_library_name +may be a full path name. If the update was performed successfully, the library in the current board/schematic file will +also be renamed accordingly - therefore this whole operation is, of course, only +possible if new_library_name has not yet been used in the current board or schematic. +
+Note: You should always run a Design Rule Check (DRC) and an +Electrical Rule Check (ERC) after a library update has been performed +in a board or a schematic! +
+By specifying the package name (package_name@library_name) you can have only a
+specific package be replaced.
+
+
+
+USE
+
+
+See also ADD,
+REPLACE
+
+USE -*;
+USE library_name..;
+
+The USE command marks a library for later use with the +ADD or REPLACE command. +
+If you activate the USE command without a parameter, a file dialog +will appear that lets you select a library file. +If a path for libraries has been defined in the +"Options/Directories" dialog, +the libraries from the first entry in this path are shown in the file dialog. +
+The special parameter -* causes all previously marked libraries +to be dropped. +
+library_name can be the full name of a library or it can contain +wildcards. +If library_name is the name of a directory, all libraries from +that directory will be marked. +
+The suffix .lbr can be omitted. +
+Note that when adding a device or package to a drawing, the complete library +information for that object is copied into the drawing file, so that +you don't need the library for changing the drawing later. +
+Changes in a library have no effect on existing drawings. +See the UPDATE command if you want to +update parts from modified libraries. +
USE | opens the file dialog to choose a library | |
USE -*; | drops all previously marked libraries | |
USE demo trans*; | marks the library demo.lbr and all libraries with names matching trans*.lbr | |
USE -* /eagle/lbr; | first drops all previously marked libraries and then marks all libraries from the directory /eagle/lbr |
+If you type in a value before you select an element, then all of the subsequently +selected elements receive this value. This is very useful if you want +for instance a number of resistors to have the same value. +
+If the parameters name and value are specified, the +element name gets the specified value. +
+VALUE R1 10k R2 100k ++In this case more than one element has been assigned a value. This +possibility can be used in script files: +
+VALUE R1 10k \ + R2 100k \ + R3 5.6k \ + C1 10uF \ + C2 22nF \ + ... ++The '\' prevents the following line from being mistaken for an EAGLE +key word. +
+On: Permits the actual value to be changed in the schematic. +
+Off: Automatically enters the actual device name into the schematic
+(e.g.74LS00N). The user can only modify this value after a confirmation.
+
+
+
+VIA
+
+
+See also SMD,
+CHANGE,
+DISPLAY,
+SET,
+PAD,
+Design Rules
+
+When the VIA command is active, a via symbol is attached to the cursor. +Pressing the left mouse button places a via at the current position. +The via is added to a signal if it is placed on an existing signal wire. +If you try to connect different signals, EAGLE will ask you if you really +want to connect them. +
+The drill diameter of the via is the same as the diameter set for +pads. It can be changed with +
+CHANGE DRILL diameter ++
+ Square
+ Round
+ Octagon
+
+These shapes only apply to the outer layers (Top and Bottom). +In inner layers the shape is always "round". +
+Vias generate drill symbols in the Drills layer and the solder +stop mask in the tStop/bStop layers. +
+Like the diameter, the via shape can be entered while +the VIA command is active, or it can be changed with the CHANGE command. +The shape then remains valid for the next vias and pads. +
+Note that the actual shape and diameter of a via will be determined by the +Design Rules of the board the via is used in. +
+
STOP | always generate solder stop mask |
+By default a via with a drill diameter that is less than or equal to the value of
+the Design Rules parameter "Masks/Limit" will not
+have a solder stop mask. The above STOP flag can be used to force a solder
+stop mask for a via.
+
+
+
+
+You can specify an integer or real number as the argument to the WINDOW
+command to scale the view of the drawing by the amount entered. The
+center of the window remains the same.
+
+When zooming very far into a drawing, the following things may happen:
+
+The syntax to handle these aliases is:
+
+WINDOW = MyWindow (0 0) (4 3);
+
+Defines the alias "MyWindow" which, when used as in
+
+WINDOW myw
+
+will zoom to the given window area.
+Note the abbreviated use of the alias and the case insensitivity.
+
+
+
+
+The WIRE command is used to add wires (tracks) to a drawing. The wire
+begins at the first point specified and runs to the second. Additional
+points draw additional wire segments. Two mouse clicks at the same
+position finish the wire and a new one can be started at the position
+of the next mouse click.
+
+Depending on the currently active wire bend, one or two wire segments will
+be drawn between every two points. The wire bend defines the angle
+between the segments and can be changed with the right mouse button (holding
+the Shift key down while clicking the right mouse button reverses the direction
+in which the bend styles are gone through, and the Ctrl key makes it toggle
+between corresponding bend styles).
+
+Pressing the center mouse button brings up a popup menu from which you
+may select the layer into which the wire will be drawn.
+
+The special keywords ROUND and FLAT, as well as the curve
+parameter, can be used to draw an arc (see below).
+
+Starting a WIRE with the Ctrl key pressed snaps the starting point
+of the new wire to the coordinates of the closest existing wire. This
+is especially useful if the existing wire is off grid. It also adjusts
+the current width, layer and style to those of the existing wire.
+If the current bend style is 7 ("Freehand"), the new wire will form a
+smooth continuation of the existing wire.
+
+The wire width can be changed with the command
+WINDOW
+
+
+The WINDOW command is used to zoom in and out of the drawing and to
+change the position of the drawing on the screen. The command can
+be used with up to three mouse clicks. If there are fewer, it must
+be terminated with a semicolon.
+
+WINDOW ;
+WINDOW ;
+WINDOW
+WINDOW scale_factor
+WINDOW FIT
+WINDOW LAST
+
+F2: WINDOW; Redraw screen
+F3: WINDOW 2 Zoom in by a factor of 2
+F4: WINDOW 0.5 Zoom out by a factor of 2
+F5: WINDOW (@); Cursor pos. is new center (if a command is active)
+Refresh screen
+If you use the WINDOW command followed by a semicolon, EAGLE redraws
+the screen without changing the center or the scale. This is useful
+if error messages cover part of the drawing.
+New center
+The WINDOW command with one point causes that point to become
+the center of a new screen display of the drawing. The scaling of
+the drawing remains the same. You can also use the sliders of the
+working area to move the visible area of the drawing. The function
+key F5 causes the current position of the cursor to be the new center.
+Corner points
+The WINDOW command with two points defines a rectangle with
+the specified points at opposite corners. The rectangle expands to
+fill the screen providing a close-up view of the specified portion
+of the drawing.
+New center and zoom
+You can use the WINDOW command with three points. The first
+point defines the new center of the drawing and the display becomes
+either larger or smaller, depending on the ratios of the spacing between
+the other points. In order to zoom in, the distance between point
+1 and point 3 should be greater than the distance between point 1
+and 2; to zoom out place point 3 between points 1 and 2.
+Zoom in and out
+
+WINDOW 2;
+
+Makes the elements appear twice as large.
+
+WINDOW 0.5;
+
+Reduces the size of the elements by a factor of two.
+The whole drawing
+
+WINDOW FIT;
+
+fits the entire drawing on the screen.
+Back to the previous window
+
+WINDOW LAST;
+
+switches back to the previous window selection. A window selection is stored by
+every WINDOW command, except for zoom-only WINDOW commands and modifications of
+the window selection with the mouse.
+Very large zoom factors
+By default the maximum zoom factor is limited in such a way that
+an area of 1mm (about 40mil) in diameter will be shown using the full editor window.
+If you need to zoom in further, you can uncheck "Options/User interface/Limit zoom factor"
+and will then be able to zoom in all the way until the finest editor grid (0.1 micron)
+can be seen.
+
+
+Parameter Aliases
+Parameter aliases can be used to define certain parameter settings to the
+WINDOW command, which can later be referenced by a given name.
+The aliases can also be accessed by clicking on the "WINDOW Select" button
+and holding the mouse button pressed until the list pops up.
+A right click on the button also pops up the list.
+
+
+Example:
+WIRE
+
+
+See also MITER,
+SIGNAL,
+ROUTE,
+CHANGE,
+NET,
+BUS,
+DELETE,
+RIPUP,
+ARC
+
+WIRE ['signal_name'] [width] [ROUND | FLAT] [curve | @radius] ..
+
+
+
+
+
+Signal name
+The signal_name parameter is intended mainly to be used in
+script files that read in generated data. If a signal_name
+is given, all subsequent wires will be added to that signal and no
+automatic checks will be performed.
+This feature should be used with great care because it could result
+in short circuits, if a wire is placed in a way that it would connect
+different signals. Please run a
+Design Rule Check after using the WIRE command
+with the signal_name parameter!
+Wire Width
+Entering a number after activating the WIRE command changes the width
+of the wire (in the present unit) which can be up to 0.51602 inch
+(13.1 mm).
+
+CHANGE WIDTH width
+
+at any time.
+Wire Style
+Wires can have one of the following styles:
+
+
+The wire style can be changed with the CHANGE command.
+
+Note that the DRC and Autorouter will always treat wires as "Continuous", +even if their style is different. Wire styles are mainly for electrical +and mechanical drawings and should not be used on signal layers. It is +an explicit DRC error to use a non-continuous wire as part of a signal +that is connected to any pad. +
+Note that EAGLE treats each wire segment as a single object +(e.g. when deleting a wire). +
+When the WIRE command is active the center mouse button +can be used to change the layer on which the wire is drawn. +
+Do not use the WIRE command for nets, buses, and airwires. +See NET, +BUS and +SIGNAL. +
+The valid range for curve is -360..+360, and its value means what
+part of a full circle the arc consists of. A value of 90, for instance,
+would result in a 90° arc, while 180 would give you a semicircle.
+The maximum value of 360 can only be reached theoretically, since this would
+mean that the arc consists of a full circle, which, because the start and end points
+have to lie on the circle, would have to have an infinitely large diameter. Positive
+values for curve mean that the arc is drawn in a mathematically positive sense
+(i.e. counterclockwise). If curve is 0, the arc is a straight line
+("no curvature"), which is actually a wire. Note that in order to distinguish the
+curve parameter from the width parameter, it always has to be given with
+a sign ('+' or '-'), even if it is a positive value.
+
+As an example, the command +
+WIRE (0 0) +180 (0 10); ++would draw a semicircle from the point (0 0) to (0 10), in counterclockwise +direction. +
+If a radius is given, the arc will have that radius. Just like the curve +parameter, radius also must have a sign in order to determine the arcs +orientation. +For example, the command +
+WIRE (0 0) @+100 (0 200); ++would draw a semicircle from the point (0 0) to (0 200) (with a radius of 100), +in counterclockwise direction. Note that if the end point is more than twice the +radius away from the start point, a straight line will be drawn. +
+The arc radius can also be defined by placing the wire end point with the Ctrl +key pressed (typically at the center of the circle on which the arc shall lie). +In that case the point is not taken as an actual end point, but is rather +used to set the radius of an arc. You can then move the cursor around and place an +arc with the given radius (the right mouse button together with Ctrl will +toggle the arc's orientation). If you move the cursor more than twice the radius +away from the start point, a straight line will be drawn. +
+In order to be able to draw any arc with the WIRE command (which is especially important
+for generated script files), the keywords ROUND and FLAT are also
+allowed in the WIRE command. Note, though, that these apply only to actual arcs
+(straight wires always have round endings). By default, arcs created with the WIRE
+command have round endings.
+
+
+
+
+The file name may also be entered with a pathname if it is to
+be saved in another directory. If no pathname is given, the file is
+saved in the
+project directory.
+
+If the new name is preceded with a @, the name of the loaded
+drawing will also be changed accordingly. The corresponding board/schematic
+will then also be saved automatically under this name and the UNDO buffer
+will be cleared.
+
+If WRITE is selected from the menu, a popup window will appear asking
+for the name to use (current drawing name is default). This name may
+be edited and accepted by clicking the OK button. Pressing the ESCAPE
+key or clicking the CANCEL button cancels the WRITE command.
+
+To assure consistency for
+Forward&Back Annotation
+between board and schematic drawings, the WRITE
+command has the following additional functionality:
+
+See also PRINT
+
+
+
+WRITE
+
+
+The WRITE command is used to save a drawing or library. If 'name'
+is entered, EAGLE will save the file under the new name.
+
+WRITE name
+WRITE @name
+
+
+
+
+
+Generating Output
+
+
+
+
+Printing
+The parameters for printing to the system printer can be modified through
+the following three dialogs:
+
+Printing a Drawing
+If you enter the PRINT command without a
+terminating ';', or select Print from the
+context menu of a drawing's icon in the
+Control Panel, you will be presented a dialog
+with the following options:
+Paper
+Selects which paper format to print on.
+Orientation
+Selects the paper orientation.
+Preview
+Turns the print preview on or off.
+Mirror
+Mirrors the output.
+Rotate
+Rotates the output by 90°.
+Upside down
+Rotates the drawing by 180°. Together with Rotate the drawing is rotated by a total of 270°.
+Black
+Ignores the color settings of the layers and prints everything in black.
+Solid
+Ignores the fill style settings of the layers and prints everything in solid.
+Scale factor
+Scales the drawing by the given value.
+Page limit
+Defines the maximum number of pages you want the output to use.
+In case the drawing does not fit on the given number of pages, the actual scale factor
+will be reduced until it fits.
+The default value of 0 means no limit.
+All
+All sheets of the schematic will be printed
+(this is the default when selecting Print from the
+context menu of a schematic drawing's icon).
+
+The remaining options are used for the page setup.
+
+
+
+Printing a Text
+If you select Print from the
+context menu of a text file's icon in the
+Control Panel, or from the File
+menu of the Text Editor, you will be presented
+a dialog with the following options:
+
+The remaining options are used for the page setup.
+
+
+
+
+The default border values are taken from the printer driver, and define
+the maximum drawing area your particular printer can handle. You can enter
+smaller values here, but your printer hardware may or may not be able to
+print arbitrarily close to the paper edges.
+
+After changing the printer new hardware minimums may apply and your
+border values may be automatically enlarged as necessary to comply with
+the new printer. Note that the values will not be decreased automatically
+if a new printer would allow smaller values. To get the smallest possible
+border values you can enter 0 in each field, which will then be
+limited to the hardware minimum.
+
+The value in the X field is the calibration factor to use
+in the print head direction, while the value in the Y field
+is used to calibrate the paper feed direction.
+
+IMPORTANT NOTE: When producing production layout drawings with
+your printer, always check the final print result for correct measurements!
+
+The default values of 1 assume that the printer produces exact
+measurements in both directions.
+
+If the drawing is mirrored, the word "mirrored" will appear in the caption,
+and if the scale factor is not 1.0 it will be added as f=...
+(the scale factor is given with 4 decimal digits, so even if f=1.0000
+appears in the caption the scale factor will not be exactly 1.0).
+
+
+
+
+The following help topics lead you through the necessary steps from
+selecting a data file to configuring the output device:
+
+See also printing to the system printer
+
+
+
+Printer Page Setup
+The Print dialog provides several options that are used to define how a drawing or text
+shall be placed on the paper.
+Border
+Defines the left, top, right and bottom borders. The values are either in
+millimeters or inches, depending on which unit results in fewer decimals.
+Calibrate
+If you want to use your printer to produce production layout drawings,
+you may have to calibrate your printer to achieve an exact 1:1
+reproduction of your layout.
+Aligment
+Defines the vertical and horizontal alignment of the drawing on the paper.
+Caption
+Activates the printing of a caption line, containing the time and date
+of the print as well as the file name.
+CAM Processor
+The CAM Processor allows you to output any combination of layers
+to a device or file.
+Main CAM Menu
+The Main CAM Menu is where you select which file to process,
+edit drill rack and aperture wheel files, and load or save job files.
+File
+
Open | Board... open a board file for processing | |
Drill rack... open a drill rack file for editing | ||
Wheel... open an aperture wheel file for editing | ||
Job... switch to an other job (or create a new one) | ||
Save job... | save the current job | |
Close | close the CAM Processor window | |
Exit | exit from the program |
Deselect all | deselect all layers | |
Show selected | show only the selected layers | |
Show all | show all layers |
Control Panel | switch to the Control Panel | |
1 Schematic - ... | switch to window number 1 | |
2 Board - ... | switch to window number 2 |
General help | opens a general help page | |
Contents | opens the help table of contents | |
CAM Processor | displays help for the CAM Processor | |
Job help | displays help about the Job mechanism | |
Device help | displays help about output devices |
+A typical CAM Processor job could for example have two sections, one +that produces photoplotter data for the Top layer, and another that +produces the data for the bottom layer. +
+You can limit the size of the output to a given number of pages by entering +a negative number in the Scale field. In that case the default scale +factor will be 1.0 and will be decreased until the drawing just fits on the +given number of pages. For example, entering "-2" into this field will +produce a drawing that does not exceed two pages. Please note that for this +mechanism to work you will have to make sure that the page width and height +is set according to your output device. This setting can be adjusted in the +Width and Height fields or by editing the file eagle.def. +
+D010 annulus 0.004 x 0.000 +D010 round 0.004 +D040 square 0.004 +D054 thermal 0.090 x 0.060 +D100 rectangle 0.060 x 0.075 +D104 oval 0.030 x 0.090 +D110 draw 0.004 ++Note that the file may contain several apertures that share the same D-code, +as long as all of these have a type from draw, round or annulus, and have +the same size (in case of annulus the second size parameter must be 0 in such +a case). This can be used to map apertures that effectively result in the +same drawing to a common D-code. + + + +
+"Annulus" and/or "Thermal" is to be selected if these aperture types +are to be emulated (only effective if "Apertures" is selected, too). +
+Please note that aperture emulation can cause very long plot times (costs!).
+
+
+
+
+Tolerances are entered in percent.
+
+Please be aware that your design rules might not be kept when allowing
+tolerances!
+
+
+
+
+This file can be generated with the help of a User Language Program called
+drillcfg.ulp, that is stored in your EAGLE's ULP directory.
+Use the RUN command to start it.
+
+Tolerances are entered in percent.
+
+
+
+
+Can be used to position the origin of plotters at the lower left corner.
+
+
+
+
+Please note that the CAM Processor divides a drawing into several
+parts if the rectangle which includes all objects of the file
+(even the ones not printed) doesn't fit into the printable area.
+
+
+
+
+The plotter default speed is selected with the value 0.
+
+
+
+
+Please use a text editor which doesn't
+place control characters into the file.
+
+
+
+
+The following file names are commonly used:
+
+Aperture Tolerances
+If you enter tolerances for draw and/or flash apertures the CAM
+Processor uses apertures within the tolerances, provided the aperture
+with the exact value is not available.
+Drill Rack File
+If a drill station driver can't automatically generate the necessary drill
+definitions, it needs to know which drill diameters
+are assigned to the codes used in the output file. These assignments
+are defined in a Drill Rack File.
+Example
+
+T01 0.010
+T02 0.016
+T03 0.032
+T04 0.040
+T05 0.050
+T06 0.070
+
+
+
+
+Drill Tolerances
+If you enter tolerances for drills the CAM Processor uses drill
+diameters within the tolerances, provided the drill with the exact
+value is not available.
+Offset
+Offset in x and y direction (inch, decimal number).
+Printable Area
+Height
+Printable area in Y direction (inch).
+Width
+Printable area in X direction (inch).
+Pen Data
+Diameter
+Pen diameter in mm. Is used for the calculation of lines
+when areas have to be filled.
+Velocity
+Pen velocity in cm/s for pen plotters which can be adjusted
+to different speeds.
+Defining Your Own Device Driver
+The drivers for output devices are defined in the text file eagle.def.
+There you find details on how to define your own driver. It is
+advisable to copy the whole section of an existing driver of the same
+device category and to edit the parameters which are different.
+Output File
+The Output File contains the data produced by the CAM Processor.
+
+-------------------------------------------------------
+File Layers Meaning
+-------------------------------------------------------
+*.cmp Top, Via, Pad Component side
+*.ly2 Route2, Via, Pad Inner signal layer
+*.ly3 Route3, Via, Pad Inner signal layer
+*.ly4 $User1 Inner supply layer
+... ...
+*.sol Bot, Via, Pad Solder side
+*.plc tPl, Dim, tName, Silkscreen comp. side
+*.pls bPl, Dim, bName, Silkscreen solder side
+*.stc tStop Solder stop mask comp. side
+*.sts bStop Solder stop mask sold. side
+*.drd Drills, Holes Drill data for NC drill st.
+-------------------------------------------------------
+
+Placeholders
+The output file name can either be entered directly, or can be dynamically
+composed using placeholders. A placeholder consists of a percentage
+character ('%') followed by a letter. The following
+placeholders are defined:
+
%D{xxx} | a string that is inserted only into the data file name | |
%E | the loaded file's extension (without the '.') | |
%H | the user's home directory | |
%I{xxx} | a string that is inserted only into the info file name | |
%L | the layer range for blind&buried vias (see below) | |
%N | the loaded file's name (without path and extension) | |
%P | the loaded file's directory path (without file name) | |
%% | the character '%' |
+For example, the output file definition +
+%N.cmp%I{.info} +
+would create boardname.cmp for the data file and boardname.cmp.info +for the info file (in case the selected output device generates an info file). +
+boardname.drl.0104 ++which would be the drill file for the layer stack 1-4. If you want to have +the layer numbers at a different position, you can use the placeholder %L, +as in +
+%N.%L.drl ++which would result in +
+boardname.0104.drl ++The drill info file name is always generated without layer numbers, and +any '.' before the %L will be dropped. +Any previously existing files that would match the given drill file name +pattern, but would not result from the current job, will be deleted before +generating any new files. There will be one drill info file per job, which +contains (amoung other information) a list of all generated drill data files. + + + +
+If you have selected an +output device +that supports colors, you can enter the color number +in the Color field of each layer. +
+The following layers and +output file names +are commonly used to create the output: +
+------------------------------------------------------- +File Layers Meaning +------------------------------------------------------- +*.cmp Top, Via, Pad Component side +*.ly2 Route2, Via, Pad Inner signal layer +*.ly3 Route3, Via, Pad Inner signal layer +*.ly4 $User1 Inner supply layer +... ... +*.sol Bot, Via, Pad Solder side +*.plc tPl, Dim, tName, Silkscreen comp. side +*.pls bPl, Dim, bName, Silkscreen solder side +*.stc tStop Solder stop mask comp. side +*.sts bStop Solder stop mask sold. side +*.drd Drills, Holes Drill data for NC drill st. +------------------------------------------------------- ++ + + +
+The User Language Program outlines.ulp implements the entire process +necessary to do this. The following is a detailed description of what exactly has to +be done to produce outlines data with EAGLE. +
+Non-zero values for the Isolate parameter can be used when working sequentially +with different milling tool diameters in order to avoid areas that have already +been milled. +
+The Autorouter is also used as "Follow-me" router in the +ROUTE command. +
+Please check your license
+to see whether you have access to the Autorouter module.
+
+
+
+
+The DRC is performed in a board window, and checks the design for overlaps,
+distance violations etc.
+
+
+
+
+The Design Rule Check checks the board against these rules
+and reports any violations.
+
+The Design Rules of a board can be modified through the Design Rules dialog, which
+appears if the DRC command is selected without a terminating
+';'.
+
+Newly created boards take their design rules from the file 'default.dru',
+which is searched for in the first directory listed in the "Options/Directories/Design rules" path.
+If no such file is present, the program's builtin default values apply.
+
+Note regarding the values for Clearance and Distance: since the internal
+resolution of the coordinates is 1/10000mm, the DRC can only reliably report errors that
+are larger than 1/10000mm.
+
+If the Design Rules have been modified, the name in the dialog's title will have
+trailing asterisk ('*') to mark the Design Rules as modified. This mark
+will be removed once the Design Rules are explicitly written to disk, or a new set
+of Design Rules is loaded.
+
+The layer setup is defined by the string in the "Setup" field. This string consists of
+a sequence of layer numbers, separated by one of the characters '*' or
+'+', where '*' stands for core material (also known as FR4
+or something similar) and '+' stands for prepreg (or any other kind of
+isolation material). The actual core and prepreg sequence has no meaning
+to EAGLE other than varying the color in the layer display at the top left corner
+of this tab (the actual multilayer setup always needs to be worked out with the
+board manufacturer). The vias are defined by enclosing a sequence of layers with (...).
+So the setup string
+
+Note that a polygon in the special signal named _OUTLINES_ will be used to generate
+outlines data and as such will not adhere to these
+clearance values.
+
+For compatibility with version 3.5x the following applies:
+If the minimum distance between copper and dimension is set to 0
+objects in the Dimension layer will not be taken into account when calculating
+polygons (except for Holes, which are always taken into account). This also disables
+the distance check between copper and dimension objects.
+Design Checks
+There are two integrated commands that allow you to check your design:
+
+The ERC is performed in a schematic window, and checks the design for
+electrical consistency.
+Design Rules
+Design Rules define all the parameters that the board layout has to follow.
+File
+The File tab shows a description of the current set of Design Rules and
+allows you to change that description (this is strongly recommended if you define
+your own Design Rules). There are also buttons to load a different set of Design
+Rules from a disk file and to save the current Design Rules to disk.
+Note that the Design Rules are stored within the board file, so they will be in effect
+if the board file is sent to a board house for production. The "Load..." and "Save as..."
+buttons are merely for copying a board's Design Rules to and from disk.
+Layers
+The Layers tab defines which signal layers the board actually uses, how thick
+the copper and isolation layers are, and what kinds of vias can be placed
+(note that this applies only to actual vias; so even if no via from layer 1 to
+16 has been defined in the layer setup, pads will always be allowed).
+
+(1*16)
+
+would mean a two layer board, using layers 1 and 16 and vias going through the
+entire board (this is also the default value).
+When building a multilayer board the setup could be something like
+
+((1*2)+(15*16))
+
+which is a four layer board with layer pairs 1/2 and 15/16 built on core material
+and vias drilled through them, and finally the two layer pairs pressed together
+with prepreg between them, and vias drilled all the way through the entire board.
+Besides vias that go trough an entire layer stack (which are commonly referred to
+as buried vias in case they have no connection to the Top and Bottom layer)
+there can also be vias that are not drilled all the way through a layer stack, but
+rather end at a layer inside that stack. Such vias are known as blind vias
+and are defined in the "Setup" string by enclosing a sequence of layers with
+[t:...:b], where t and b are the layers up to which that via
+will go from the top or bottom side, respectively. A possible setup with blind
+vias could be
+
+[2:1+((2*3)+(14*15))+16:15]
+
+which is basically the previous example, with two additional outer layers that are
+connected to the next inner layers by blind vias. It is also
+possible to have only one of the t or b parameters, so for instance
+
+[2:1+((2*3)+(15*16))]
+
+would also be a valid setup. Finally, blind vias are not limited to starting
+at the Top or Bottom layer, but may also be used in inner layer stacks, as in
+
+[2:1+[3:2+(3*4)+5:4]+16:5]
+
+A blind via from layer a to layer b also implements all possible
+blind vias from layer a to all layers between layers a and b, so
+
+[3:1+2+(3*16)]
+
+would allow blind vias from layer 1 to 2 as well as from 1 to 3.
+Clearance
+The Clearance tab defines the various minimum clearance values between objects
+in signal layers. These are usually absolute minimum values that are defined by the
+production process used and should be obtained from your board manufacturer.
+The actual minimum clearance between objects that belong to different signals will
+also be influenced by the net classes the two signals belong to.
+Distance
+The Distance tab defines the minimum distance between objects in signal layers
+and the board dimensions, as well as that between any two drill holes.
+Note that only signals that are actually connected to at least one pad or
+smd are checked against the board dimensions. This allows edge markers to be drawn
+in the signal layer without generating DRC errors.
+Sizes
+The Sizes tab defines the minimum width of any objects in signal layers and
+the minimum drill diameter. These are usually absolute minimum values that are defined by the
+production process used and should be obtained from your board manufacturer.
+The actual minimum width of signal wires and drill diameter of vias will
+also be influenced by the Net Class the signal belongs to.
+Restring
+The Restring tab defines the width of the copper ring that has to remain after the
+pad or via has been drilled. Values are defined in percent of the drill diameter and
+there can be an absolute minimum and maximum limit. Restrings for pads can be different
+for the top, bottom and inner layers, while for vias they can be different for the
+outer and inner layers.
+If the actual diameter of a pad (as defined in the library) or a via would result in a
+larger restring, that value will be used in the outer layers. Pads in library packages
+can have their diameter set to 0, so that the restring will be derived entirely
+from the drill diameter.
+Shapes
+The Shapes tab defines the actual shapes for smds and pads.
+Smds are normally defined as rectangles in the library (with a "roundness" of 0),
+but if your design requires rounded smds you can specify the roundness factor here.
+Pads are normally defined as octagons in the library (long octagons where this makes
+sense), and you can use the combo boxes to specify whether you want to have
+pads with the same shapes as defined in the library, or always square, round or
+octagonal. This can be set independently for the top and bottom layer.
+If the "first" pad of a package has been marked as such in the library
+it will get the shape as defined in the third combo box (either round, square or
+octagonal, or no special shape).
+The Elongation parameters define the appearance of pads with shape Long or Offset.
+Supply
+The Supply tab defines the dimensions of Thermal and Annulus symbols used in
+supply layers.
+Please note that the actual shape of supply symbols may be different when generating
+output for photoplotters that use specific thermal/annulus apertures!
+See also the notes about "Supply Layers" in the LAYER command.
+
+
+
+
+
+Cross-reference labels are typically placed at the right or left border of
+a schematic sheet, and indicate the next (or previous) sheet a particular net
+is used on. See the LABEL command for a detailed
+description of how this works.
+
+
+
+
+When actually displayed, the '>XREF' text variable will be replaced
+with the sheet number, frame column and row (according to the
+part cross-reference format) of the Must
+gate of this device.
+
+See Contact cross-references on how
+to display the contact locations on the coil's sheet.
+
+
+
+
+The contact symbols need to contain the '>XREF' text variable
+in order to generate part cross-references.
+
+The gate symbols shall be drawn in a way that the pins extend up and down,
+and that the origin is at the center of the symbol.
+
+The first contact gate in the device set drawing shall be placed at an x-coordinate
+of 0, and its y-coordinate shall be high enough to make sure its lower pin is in the
+positive area, typically at 100mil. The rest of the contact gates shall be placed
+to the right of the first one, with their origins at the same y-coordinate as the
+first one. The coil gate can be placed at an arbitrary location.
+
+In the schematic drawing the contact cross-reference will be shown at the same
+x-coordinate as the coil instance, and right below the y-coordinate defined
+by the text variable '>CONTACT_XREF'. This text variable can be
+defined either in a drawing frame symbol or directly on the sheet. If it is
+present in both, the one in the sheet is taken. The actual text will not be visible
+in the schematic sheet.
+
+The graphical representation of the contact cross-reference consists of all the
+gates that have an '>XREF' text variable (except for the first Must
+gate, which is the coil and typically doesn't have this variable). The gates are
+rotated by 90 degrees and are shown from top to bottom at the same offsets
+as they have been drawn from left to right in the device set. Their sheet numbers and
+frame locations are displayed to the right of each gate that is actually used.
+Any other texts that have been defined in the symbol drawings will not be
+displayed when using these symbols for generating the contact cross-reference.
+
+Note that the contact cross-reference can't be selected with the mouse. If you
+want to move it, move the coil instance and the contact cross-reference will
+automatically follow it.
+The contact cross-reference may get out of sync in case contact gates are
+invoked, moved, deleted or swapped, or if the '>CONTACT_XREF' text
+variable is modified. This will automatically be updated at the next window refresh.
+
+
+
+
+To use this feature you have to
+write a User Language Program (ULP),
+and then execute it.
+
+The following sections describe the EAGLE User Language in detail:
+
+Cross-references
+There are various methods that can be used to create cross-references
+in EAGLE schematic drawings. The following sections describe each of them.
+
+
+
+
+Cross-reference labels
+A plain label can be used to make the name of a net visible in a schematic.
+If a label has the xref property activated, its behavior is changed
+so that it becomes a cross-reference label.
+Part cross-references
+Electrical schematics often use electro-mechanical relays, consisting of a
+coil and one or more contact symbols. If the coil and contacts are distributed
+over various schematic sheets, it is useful to have each contact indicate
+which sheet its coil is on. This can be achieved by giving the coil gate in
+the device set an add level of Must (see the ADD
+command) and placing the text variable '>XREF' somewhere in the
+contacts' symbols (see the TEXT command).
+Contact cross-references
+On a multi-sheet electrical schematic with electro-mechanical relays that
+have their coils and contacts distributed over various sheets, it is useful
+to be able to see which sheets the individual contacts of a relay are on.
+EAGLE can automatically display this contact cross-reference for each
+relay coil if the following conditions are met.
+User Language
+The EAGLE User Language can be used to access the EAGLE data structures
+and to create a wide variety of output files.
+
Syntax | lists the rules a ULP file has to follow | |
Data Types | defines the basic data types | |
Object Types | defines the EAGLE objects | |
Definitions | shows how to write a definition | |
Operators | lists the valid operators | |
Expressions | shows how to write expressions | |
Statements | defines the valid statements | |
Builtins | lists the builtin constants, functions etc. | |
Dialogs | shows how to implement a graphical frontent to a ULP |
+A User Language Program consists of two major items, +definitions and +statements. +
+Definitions are used to define constants, +variables and functions to be used by statements. +
+A simple ULP could look like this: +
+#usage "Add the characters in the word 'Hello'\n" + "Usage: RUN sample.ulp" +// Definitions: +string hello = "Hello"; +int count(string s) +{ + int c = 0; + for (int i = 0; s[i]; ++i) + c += s[i]; + return c; +} +// Statements: +output("sample") { + printf("Count is: %d\n", count(hello)); + } ++If the #usage directive is present, +its value will be used in the Control Panel to display a description +of the program. +
+If the result of the ULP shall be a specific command that shall be executed in the
+editor window, the exit() function can be
+used to send that command to the editor window.
+
+
+
+Executing a ULP
+User Language Programs are executed by the
+RUN command from an editor window's command line.
+
+A ULP can return information on whether it has run successfully or not. +You can use the exit() function to terminate +the program and set the return value. +
+A return value of 0 means the ULP has ended "normally" (i.e. +successfully), while any other value is considered as an abnormal +program termination. +
+The default return value of any ULP is 0. +
+When the RUN command is executed as part of a +script file, the script is terminated if +the ULP has exited with a return value other than 0. +
+A special variant of the exit() function can be
+used to send a command to the editor window as a result of the ULP.
+
+
+
+
+Any spaces (blanks), tabs, newline characters and
+comments are considered whitespace
+and are discarded.
+
+The only place where ASCII characters representing whitespace
+are not discarded is within literal strings,
+like in
+
+If the final newline character of a line is preceded by a backslash
+(\), the backslash and newline character are both discarded,
+and the two lines are treated as one line:
+
+There are two ways to define a comment. The first one uses the syntax
+
+The second way to define a comment uses the syntax
+
+The maximum include depth is 10.
+
+Each #include directive is processed only once. This makes sure
+that there are no multiple definitions of the same variables or functions, which
+would cause errors.
+Syntax
+The basic building blocks of a User Language Program are
+
+All of these have to follow certain syntactical rules, which are
+described in their respective sections.
+
+
+
+Whitespace
+Before a User Language Program can be executed, it has to be read in from
+a file. During this read in process, the file contents is parsed
+into tokens and whitespace.
+
+string s = "Hello World";
+
+where the blank character between 'o' and 'W' remains part
+of the string.
+
+"Hello \
+World"
+
+is parsed as "Hello World"
+
+
+
+Comments
+When writing a User Language Program it is good practice to add some
+descriptive text, giving the reader an idea about what this particular
+ULP does. You might also want to add your name (and, if available, your
+email address) to the ULP file, so that other people who use your program
+could contact you in case they have a problem or would like to suggest
+an improvement.
+
+/* some comment text */
+
+which marks any characters between (and including) the opening
+/* and the closing */ as comment. Such comments may expand over
+more than one lines, as in
+
+/* This is a
+ multi line comment
+*/
+
+but they do not nest. The first */ that follows any /*
+will end the comment.
+
+int i; // some comment text
+
+which marks any characters after (and including) the // and up
+to (but not including) the newline character at the end of the line as
+comment.
+
+
+
+Directives
+The following directives are available:
+
+#include
+#require
+#usage
+
+
+
+
+#include
+A User Language Program can reuse code in other ULP files through the #include
+directive. The syntax is
+
+#include "filename"
+
+The file filename is first looked for in the same directory as
+the current source file (that is the file that contains the #include
+directive). If it is not found there, it is searched for in
+the directories contained in the ULP directory path.
+Portability note
+
+If filename contains a directory path, it is best to always use the +forward slash as directory separator (even under Windows!). Windows drive +letters should be avoided. This way a User Language Program will run on all +platforms. + |
+#require version ++The version must be given as a real constant +of the form +
+V.RRrr ++where V is the version number, RR is the release number +and rr is the (optional) revision number (both padded with leading +zeroes if they are less than 10). For example, if a ULP +requires at least EAGLE version 4.11r06 (which is the beta version that first +implemented the #require directive), it could use +
+#require 4.1106 ++The proper directive for version 5.1.2 would be +
+#require 5.0102 ++ + + +
+#usage text [, text...] ++implements a standard way to make this information available. +
+If the #usage directive is present, +its text (which has to be a string constant) +will be used in the Control Panel to display a description +of the program. +
+In case the ULP needs to use this information in, for example, a +dlgMessageBox(), the text is available +to the program through the builtin constant +usage. +
+Only the #usage directive of the main program file (that is the one +started with the RUN command) will take effect. +Therefore pure include files can (and should!) +also have #usage directives of their own. +
+It is best to have the #usage directive at the beginning of the file, +so that the Control Panel doesn't have to parse all the rest of the text when +looking for the information to display. +
+If the usage information shall be made available in several langauges, the +texts of the individual languages have to be separated by commas. +Each of these texts has to start with the two letter code of the respective +language (as delivered by the language() function), +followed by a colon and any number of blanks. If no suitable text is found for +the language used on the actual system, the first given text will be used (this +one should generally be English in order to make the program accessible to the +largest number of users). +
+#usage "en: A sample ULP\n" + "Implements an example that shows how to use the EAGLE User Language\n" + "Usage: RUN sample.ulp\n" + "Author: john@home.org", + "de: Beispiel eines ULPs\n" + "Implementiert ein Beispiel das zeigt, wie man die EAGLE User Language benutzt\n" + "Aufruf: RUN sample.ulp\n" + "Author: john@home.org" ++ + + +
+break +case +char +continue +default +do +else +enum +for +if +int +numeric +real +return +string +switch +void +while ++In addition, the names of +builtins and +object types +are also reserved and must not be used as identifier names. + + + +
+Identifiers consist of a sequence of letters (a b c..., A B C...), +digits (1 2 3...) and underscores (_). The first character +of an identifier must be a letter or an underscore. +
+Identifiers are case-sensitive, which means that +
+int Number, number; ++would define two different integer variables. +
+The maximum length of an identifier is 100 characters, and all of these
+are significant.
+
+
+
+Constants
+Constants are literal data items written into a User Language Program.
+According to the different data types,
+there are also different types of constants.
+
+'a' +'=' +'\n' ++The type of a character constant is +char. + + + +
+
first | second | constant interpreted as | ||
0 | 1-7 | octal (base 8) | ||
0 | x,X | hexadecimal (base 16) | ||
1-9 | decimal (base 10) |
+The type of an integer constant is +int. +
16 | decimal | |
020 | octal | |
0x10 | hexadecimal |
+[-]int.frac[e|E[±]exp] ++which stands for +
+The type of an real constant is +real. +
Constant | Value | |
23.45e6 | 23.45 x 10^6 | |
.0 | 0.0 | |
0. | 0.0 | |
1. | 1.0 | |
-1.23 | -1.23 | |
2e-5 | 2.0 x 10^-5 | |
3E+10 | 3.0 x 10^10 | |
.09E34 | 0.09 x 10^34 |
+"Hello world\n" ++The type of a string constant is +string. +
+String constants can be of any length (provided there is enough free memory +available). +
+String constants can be concatenated by simply writing them next to each other +to form larger strings: +
+string s = "Hello" " world\n"; ++It is also possible to extend a string constant over more than one line +by escaping the newline character with a backslash (\): +
+string s = "Hello \ +world\n"; ++ + + +
+
Sequence | Value | |
\a | audible bell | |
\b | backspace | |
\f | form feed | |
\n | new line | |
\r | carriage return | |
\t | horizontal tab | |
\v | vertical tab | |
\\ | backslash | |
\' | single quote | |
\" | double quote | |
\O | O = up to 3 octal digits | |
\xH | H = up to 2 hex digits |
+Any character following the initial backslash that is not mentioned in +this list will be treated as that character (without the backslash). +
+Escape sequences can be used in +character constants and +string constants. +
+'\n' +"A tab\tinside a text\n" +"Ring the bell\a\n" ++ + + +
+
[] | Brackets | |
() | Parentheses | |
{} | Braces | |
, | Comma | |
; | Semicolon | |
: | Colon | |
= | Equal sign |
+Other special characters are used as operators
+in a ULP.
+
+
+
+Brackets
+Brackets are used in array definitions
+
+int ai[];
+
+in array subscripts
+
+n = ai[2];
+
+and in string subscripts to access the individual characters of a string
+
+string s = "Hello world";
+char c = s[2];
+
+
+
+
+Parentheses
+Parentheses group expressions
+(possibly altering normal
+operator precedence), isolate conditional
+expressions, and indicate
+function calls and function parameters:
+
+d = c * (a + b); +if (d == z) ++x; +func(); +void func2(int n) { ... } ++ + + +
+if (d == z) { + ++x; + func(); + } ++and are also used to group the values of an array initializer: +
+int ai[] = { 1, 2, 3 }; ++ + + +
+int func(int n, real r, string s) { ... } +int i = func(1, 3.14, "abc"); ++It also delimits the values of an array initializer: +
+int ai[] = { 1, 2, 3 }; ++and it separates the elements of a variable definition: +
+int i, j, k; ++ + + +
+i = a + b; ++and it also delimits the init, test and increment expressions of a +for statement: +
+for (int n = 0; n < 3; ++n) { + func(n); + } ++ + + +
+switch (c) { + case 'a': printf("It was an 'a'\n"); break; + case 'b': printf("It was a 'b'\n"); break; + default: printf("none of them\n"); + } ++ + + +
+int i = 10; +char c[] = { 'a', 'b', 'c' }; ++It is also used as an assignment operator. + + + +
+The four basic data types are +
+
char | for single characters | |
int | for integral values | |
real | for floating point values | |
string | for textual information |
+Besides these basic data types there are also high level +Object Types, which +represent the data structures stored in the EAGLE data files. +
+The special data type void is used only as a return type of a
+function, indicating that this
+function does not return any value.
+
+
+
+
+A variable of type char has a size of 8 bit (one byte), and can
+store any value in the range 0..255.
+
+See also Operators,
+Character Constants
+
+
+
+
+A variable of type int has a size of 32 bit (four byte), and can
+store any value in the range -2147483648..2147483647.
+
+See also Integer Constants
+
+
+
+
+A variable of type real has a size of 64 bit (eight byte), and can
+store any value in the range ±2.2e-308..±1.7e+308 with a
+precision of 15 digits.
+
+See also Real Constants
+
+
+
+
+A variable of type string is not limited in it's size (provided
+there is enough memory available).
+
+Variables of type string are defined without an explicit
+size. They grow automatically as necessary during program
+execution.
+
+The elements of a string variable are of type
+char and
+can be accessed individually by using [index].
+The first character of a string has the index 0:
+
+See also Operators,
+Builtin Functions,
+String Constants
+
+Arithmetic types are
+char,
+int and
+real
+(in that order). So if, e.g. a is of type
+int
+and b is of type
+real,
+the result of the expression a + b would be
+real.
+
+See also Typecast
+
+
+
+
+The general syntax of a typecast is
+
+When typecasting a real expression to
+int, the fractional part of the value
+is truncated!
+
+See also Type Conversions
+
+
+
+
+The properties of these objects can be accessed through members.
+
+There are two kinds of members:
+
+Loop members are used to access multiple objects of the same
+kind, which are contained in a higher level object:
+
+Loop members process objects in alpha-numerical order, provided they
+have a name.
+
+A loop member function creates a variable of the type necessary to hold
+the requested objects. You are free to use any valid name for such a
+variable, so the above example might also be written as
+
+Object hierarchy of a Library:
+char
+The data type char is used to store single characters, like the
+letters of the alphabet, or small unsigned numbers.
+int
+The data type int is used to store signed integral values, like the
+coordinates of an object.
+real
+The data type real is used to store signed floating point values, like
+the grid distance.
+string
+The data type string is used to store textual information,
+like the name of a part or net.
+
+string s = "Layout";
+printf("Third char is: %c\n", s[2]);
+
+This would print the character 'y'. Note that s[2] returns
+the third character of s!
+Implementation details
+The data type string is actually implemented like native C-type
+zero terminated strings (i.e. char[]). Looking at the following
+variable definition
+
+string s = "abcde";
+
+s[4] is the character 'e', and s[5] is the character
+'\0', or the integer value 0x00.
+This fact may be used to determine the end of a string without using the
+strlen() function, as in
+
+for (int i = 0; s[i]; ++i) {
+ // do something with s[i]
+ }
+
+It is also perfectly ok to "cut off" part of a string by "punching" a zero
+character into it:
+
+string s = "abcde";
+s[3] = 0;
+
+This will result in s having the value "abc".
+Note that everything following the zero character will actually be gone,
+and it won't come back by restoring the original character. The same applies
+to any other operation that sets a character to 0, for instance --s[3].
+
+
+
+Type Conversions
+The result type of an arithmetic
+expression, such as a + b,
+where a and b are different arithmetic types,
+is equal to the "larger" of the two operand types.
+Typecast
+The result type of an arithmetic expression
+can be explicitly converted to a different arithmetic type by applying a
+typecast to it.
+
+type(expression)
+
+where type is one of
+char,
+int or
+real,
+and expression is any arithmetic
+expression.
+Object Types
+The EAGLE data structures are stored in three binary file types:
+
+
+These data files contain a hierarchy of objects.
+In a User Language Program you can access these hierarchies through their
+respective builtin access statements:
+
+library(L) { ... }
+schematic(S) { ... }
+board(B) { ... }
+
+These access statements set up a context within which you can access all of the
+objects contained in the library, schematic or board.
+
+
+Data members immediately return the requested data from an object.
+For example, in
+
+board(B) {
+ printf("%s\n", B.name);
+ }
+
+the data member name of the board object B returns
+the board's name.
+Data members can also return other objects, as in
+
+board(B) {
+ printf("%f\n", B.grid.size);
+ }
+
+where the board's grid data member returns a grid object,
+of which the size data member then returns the grid's size.
+
+board(B) {
+ B.elements(E) {
+ printf("%-8s %-8s\n", E.name, E.value);
+ }
+ }
+
+This example uses the board's elements() loop member function
+to set up a loop through all of the board's elements. The block following
+the B.elements(E) statement is executed in turn for each element,
+and the current element can be referenced inside the block through the name
+E.
+
+board(MyBoard) {
+ MyBoard.elements(TheCurrentElement) {
+ printf("%-8s %-8s\n", TheCurrentElement.name, TheCurrentElement.value);
+ }
+ }
+
+and would do the exact same thing. The scope of the variable created by a
+loop member function is limited to the statement (or block) immediately
+following the loop function call.
+
+LIBRARY
+ GRID
+ LAYER
+ DEVICESET
+ DEVICE
+ GATE
+ PACKAGE
+ CONTACT
+ PAD
+ SMD
+ CIRCLE
+ HOLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ SYMBOL
+ PIN
+ CIRCLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+
+Object hierarchy of a Schematic:
+
+SCHEMATIC
+ GRID
+ LAYER
+ LIBRARY
+ SHEET
+ CIRCLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ PART
+ INSTANCE
+ ATTRIBUTE
+ BUS
+ SEGMENT
+ LABEL
+ TEXT
+ WIRE
+ WIRE
+ NET
+ SEGMENT
+ JUNCTION
+ PINREF
+ TEXT
+ WIRE
+
+Object hierarchy of a Board:
+
+BOARD
+ GRID
+ LAYER
+ LIBRARY
+ CIRCLE
+ HOLE
+ RECTANGLE
+ FRAME
+ TEXT
+ WIRE
+ POLYGON
+ WIRE
+ ELEMENT
+ ATTRIBUTE
+ SIGNAL
+ CONTACTREF
+ POLYGON
+ WIRE
+ VIA
+ WIRE
+
+
+
+
+UL_ARC
+
+See also UL_WIRE
+Constants
+
CAP_FLAT | flat arc ends | |
CAP_ROUND | round arc ends |
+board(B) { + B.wires(W) { + if (W.arc) + printf("Arc: (%d %d), (%d %d), (%d %d)\n", + W.arc.x1, W.arc.y1, W.arc.x2, W.arc.y2, W.arc.xc, W.arc.yc); + } + } ++ + + +
+A UL_AREA is an abstract object which gives information about the area +covered by an object. For a UL_DEVICE, UL_PACKAGE and UL_SYMBOL the area +is defined as the surrounding rectangle of the object definition in the +library, so even if e.g. a UL_PACKAGE is derived from a UL_ELEMENT, the +package's area will not reflect the elements offset within the board. +
+board(B) { + printf("Area: (%d %d), (%d %d)\n", + B.area.x1, B.area.y1, B.area.x2, B.area.y2); + } ++ + + +
constant | int (0=variable, i.e. allows overwriting, 1=constant - see note) | |
defaultvalue | string (see note) | |
display | int (ATTRIBUTE_DISPLAY_FLAG_...) | |
name | string | |
text | UL_TEXT (see note) | |
value | string |
ATTRIBUTE_DISPLAY_FLAG_OFF | nothing is displayed | |
ATTRIBUTE_DISPLAY_FLAG_VALUE | value is displayed | |
ATTRIBUTE_DISPLAY_FLAG_NAME | name is displayed |
+A UL_ATTRIBUTE can be used to access the attributes that have been +defined in the library for a device, or assigned to a part in the schematic +or board. +
+In a UL_ELEMENT context constant only returns an actual value if +f/b annotation is active, otherwise it returns 0. +
+The defaultvalue member returns the value as defined in the library +(if different from the actual value, otherwise the same as value). +In a UL_ELEMENT context defaultvalue only returns an actual value if +f/b annotation is active, otherwise an empty string is returned. +
+The text member is only available in a UL_INSTANCE or UL_ELEMENT +context and returns a UL_TEXT object that contains all the text parameters. +The value of this text object is the string as it will be displayed according to +the UL_ATTRIBUTE's 'display' parameter. If called from a different context, +the data of the returned UL_TEXT object is undefined. +
+For global attributes only name and value are defined. +
+schematic(SCH) { + SCH.parts(P) { + P.attributes(A) { + printf("%s = %s\n", A.name, A.value); + } + } + } +schematic(SCH) { + SCH.attributes(A) { // global attributes + printf("%s = %s\n", A.name, A.value); + } + } ++ + + +
area | UL_AREA | |
grid | UL_GRID | |
name | string (see note) |
attributes() | UL_ATTRIBUTE (see note) | |
circles() | UL_CIRCLE | |
classes() | UL_CLASS | |
elements() | UL_ELEMENT | |
frames() | UL_FRAME | |
holes() | UL_HOLE | |
layers() | UL_LAYER | |
libraries() | UL_LIBRARY | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
signals() | UL_SIGNAL | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
+The attributes() loop member loops through the global attributes. +
+board(B) { + B.elements(E) printf("Element: %s\n", E.name); + B.signals(S) printf("Signal: %s\n", S.name); + } ++ + + +
name | string (BUS_NAME_LENGTH) |
segments() | UL_SEGMENT |
BUS_NAME_LENGTH | max. length of a bus name (obsolete - as from version 4 bus names can have any length) |
+schematic(SCH) { + SCH.sheets(SH) { + SH.busses(B) printf("Bus: %s\n", B.name); + } + } ++ + + +
+board(B) { + B.circles(C) { + printf("Circle: (%d %d), r=%d, w=%d\n", + C.x, C.y, C.radius, C.width); + } + } ++ + + +
clearance[number] | int (see note) | |
drill | int | |
name | string (see note) | |
number | int | |
width | int |
+If the name member returns an empty string, the net class is not defined +and therefore not in use by any signal or net. +
+board(B) { + B.signals(S) { + printf("%-10s %d %s\n", S.name, S.class.number, S.class.name); + } + } ++ + + +
name | string (CONTACT_NAME_LENGTH) | |
pad | UL_PAD | |
signal | string | |
smd | UL_SMD | |
x, y | int (center point, see note) |
CONTACT_NAME_LENGTH | max. recommended length of a contact name (used in formatted output only) |
+The coordinates (x, y) of the contact depend on the context in which it is called: +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + printf("Contact: '%s', (%d %d)\n", + C.name, C.x, C.y); + } + } + } ++ + + +
contact | UL_CONTACT | |
element | UL_ELEMENT |
+board(B) { + B.signals(S) { + printf("Signal '%s'\n", S.name); + S.contactrefs(C) { + printf("\t%s, %s\n", C.element.name, C.contact.name); + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string | |
library | string | |
name | string (DEVICE_NAME_LENGTH) | |
package | UL_PACKAGE (see note) | |
prefix | string (DEVICE_PREFIX_LENGTH) | |
technologies | string (see note) | |
value | string ("On" or "Off") |
attributes() | UL_ATTRIBUTE (see note) | |
gates() | UL_GATE |
DEVICE_NAME_LENGTH | max. recommended length of a device name (used in formatted output only) | |
DEVICE_PREFIX_LENGTH | max. recommended length of a device prefix (used in formatted output only) |
+All members of UL_DEVICE, except for name and technologies, return the +same values as the respective members of the UL_DEVICESET in which the UL_DEVICE has been +defined. +The name member returns the name of the package variant this device +has been created for using the PACKAGE command. +When using the description text keep in mind that it may contain newline characters ('\n'). +
+The value returned by the technologies member depends on the context in which it is called: +
+The attributes() loop member takes an additional parameter that specifies +for which technology the attributes shall be delivered (see the second example below). +
+library(L) { + L.devicesets(S) { + S.devices(D) { + if (D.package) + printf("Device: %s, Package: %s\n", D.name, D.package.name); + D.gates(G) { + printf("\t%s\n", G.name); + } + } + } + } ++
+library(L) { + L.devicesets(DS) { + DS.devices(D) { + string t[]; + int n = strsplit(t, D.technologies, ' '); + for (int i = 0; i < n; i++) { + D.attributes(A, t[i]) { + printf("%s = %s\n", A.name, A.value); + } + } + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string (see note) | |
library | string | |
name | string (DEVICE_NAME_LENGTH) | |
prefix | string (DEVICE_PREFIX_LENGTH) | |
value | string ("On" or "Off") |
devices() | UL_DEVICE | |
gates() | UL_GATE |
DEVICE_NAME_LENGTH | max. recommended length of a device name (used in formatted output only) | |
DEVICE_PREFIX_LENGTH | max. recommended length of a device prefix (used in formatted output only) |
+library(L) { + L.devicesets(D) { + printf("Device set: %s, Description: %s\n", D.name, D.description); + D.gates(G) { + printf("\t%s\n", G.name); + } + } + } ++ + + +
angle | real (0.0...359.9) | |
attribute[] | string (see note) | |
column | string (see note) | |
locked | int | |
mirror | int | |
name | string (ELEMENT_NAME_LENGTH) | |
package | UL_PACKAGE | |
row | string (see note) | |
smashed | int (see note) | |
spin | int | |
value | string (ELEMENT_VALUE_LENGTH) | |
x, y | int (origin point) |
attributes() | UL_ATTRIBUTE | |
texts() | UL_TEXT (see note) |
ELEMENT_NAME_LENGTH | max. recommended length of an element name (used in formatted output only) | |
ELEMENT_VALUE_LENGTH | max. recommended length of an element value (used in formatted output only) |
+The texts() member only loops through those texts of the element that have been +detached using SMASH, +and through the visible texts of any attributes assigned to this element. +To process all texts of an element (e.g. when drawing it), you have to loop through the element's +own texts() member as well as the texts() member of the +element's package. +
+angle defines how many degrees the element is rotated counterclockwise +around its origin. +
+The column() and row() members return the column and row location within +the frame in the board drawing. +If there is no frame in the drawing, or the element is placed outside the frame, a '?' +(question mark) is returned. +
+The smashed member tells whether the element is smashed. This function can also +be used to find out whether there is a detached text parameter by giving the name of +that parameter in square brackets, as in smashed["VALUE"]. This is useful +in case you want to select such a text with the MOVE command +by doing MOVE R5>VALUE. Valid parameter names are "NAME" and "VALUE", as +well as the names of any user defined attributes. +They are treated case insensitive, and they may be preceded by a '>' +character. +
+board(B) { + B.elements(E) { + printf("Element: %s, (%d %d), Package=%s\n", + E.name, E.x, E.y, E.package.name); + } + } ++
+board(B) { + B.elements(E) { + if (E.attribute["REMARK"]) + printf("%s: %s\n", E.name, E.attribute("REMARK")); + } + } ++ + + +
columns | int (-127...127) | |
rows | int (-26...26) | |
border | int (FRAME_BORDER_...) | |
layer | int | |
x1, y1 | int (lower left corner) | |
x2, y2 | int (upper right corner) |
texts() | UL_TEXT | |
wires() | UL_WIRE |
FRAME_BORDER_BOTTOM | bottom border is drawn | |
FRAME_BORDER_RIGHT | right border is drawn | |
FRAME_BORDER_TOP | top border is drawn | |
FRAME_BORDER_LEFT | left border is drawn |
+The texts() and wires() loop members loop through all the +texts and wires the frame consists of. +
+board(B) { + B.frames(F) { + printf("Frame: (%d %d), (%d %d)\n", + F.x1, F.y1, F.x2, F.y2); + } + } ++ + + +
addlevel | int (GATE_ADDLEVEL_...) | |
name | string (GATE_NAME_LENGTH) | |
swaplevel | int | |
symbol | UL_SYMBOL | |
x, y | int (origin point, see note) |
GATE_ADDLEVEL_MUST | must | |
GATE_ADDLEVEL_CAN | can | |
GATE_ADDLEVEL_NEXT | next | |
GATE_ADDLEVEL_REQUEST | request | |
GATE_ADDLEVEL_ALWAYS | always |
+
GATE_NAME_LENGTH | max. recommended length of a gate name (used in formatted output only) |
+library(L) { + L.devices(D) { + printf("Device: %s, Package: %s\n", D.name, D.package.name); + D.gates(G) { + printf("\t%s, swaplevel=%d, symbol=%s\n", + G.name, G.swaplevel, G.symbol.name); + } + } + } ++ + + +
distance | real | |
dots | int (0=lines, 1=dots) | |
multiple | int | |
on | int (0=off, 1=on) | |
unit | int (GRID_UNIT_...) | |
unitdist | int (GRID_UNIT_...) |
GRID_UNIT_MIC | microns | |
GRID_UNIT_MM | millimeter | |
GRID_UNIT_MIL | mil | |
GRID_UNIT_INCH | inch |
+board(B) { + printf("Gridsize=%f\n", B.grid.distance); + } ++ + + +
diameter[layer] | int (see note) | |
drill | int | |
drillsymbol | int | |
x, y | int (center point) |
+drillsymbol returns the number of the drill symbol that has been assigned +to this drill diameter (see the manual for a list of defined drill symbols). +A value of 0 means that no symbol has been assigned to this drill diameter. +
+board(B) { + B.holes(H) { + printf("Hole: (%d %d), drill=%d\n", + H.x, H.y, H.drill); + } + } ++ + + +
angle | real (0, 90, 180 and 270) | |
column | string (see note) | |
gate | UL_GATE | |
mirror | int | |
name | string (INSTANCE_NAME_LENGTH) | |
row | string (see note) | |
sheet | int (0=unused, >0=sheet number) | |
smashed | int (see note) | |
value | string (PART_VALUE_LENGTH) | |
x, y | int (origin point) |
attributes() | UL_ATTRIBUTE (see note) | |
texts() | UL_TEXT (see note) | |
xrefs() | UL_GATE (see note) |
INSTANCE_NAME_LENGTH | max. recommended length of an instance name (used in formatted output only) | |
PART_VALUE_LENGTH | max. recommended length of a part value (instances do not have a value of their own!) |
+The texts() member only loops through those texts of the instance that have been +detached using SMASH, +and through the visible texts of any attributes assigned to this instance. +To process all texts of an instance, you have to loop through the instance's +own texts() member as well as the texts() member of the +instance's gate's symbol. +If attributes have been assigned to an instance, texts() delivers their texts +in the form as they are currently visible. +
+The column() and row() members return the column and row location within +the frame on the sheet on which this instance is invoked. +If there is no frame on that sheet, or the instance is placed outside the frame, a '?' +(question mark) is returned. +These members can only be used in a sheet context. +
+The smashed member tells whether the instance is smashed. This function can also +be used to find out whether there is a detached text parameter by giving the name of +that parameter in square brackets, as in smashed["VALUE"]. This is useful +in case you want to select such a text with the MOVE command +by doing MOVE R5>VALUE. Valid parameter names are "NAME", "VALUE", +"PART" and "GATE", as well as the names of any user defined attributes. +They are treated case insensitive, and they may be preceded by a '>' +character. +
+The xrefs() member loops through the contact cross-reference +gates of this instance. These are only of importance if the ULP is going to create +a drawing of some sort (for instance a DXF file). +
+schematic(S) { + S.parts(P) { + printf("Part: %s\n", P.name); + P.instances(I) { + if (I.sheet != 0) + printf("\t%s used on sheet %d\n", I.name, I.sheet); + } + } + } ++ + + +
+schematic(SCH) { + SCH.sheets(SH) { + SH.nets(N) { + N.segments(SEG) { + SEG.junctions(J) { + printf("Junction: (%d %d)\n", J.x, J.y); + } + } + } + } + } ++ + + +
angle | real (0.0...359.9) | |
layer | int | |
mirror | int | |
spin | int | |
text | UL_TEXT | |
x, y | int (origin point) | |
xref | int (0=plain, 1=cross-reference) |
wires() | UL_WIRE (see note) |
+The angle, layer, mirror and spin members always +return the same values as those of the UL_TEXT object returned by the text +member. The x and y members of the text return slightly offset values for +cross-reference labels (non-zero xref), otherwise they also return the same values +as the UL_LABEL. +
+xref is only meaningful for net labels. For bus labels it always returns 0. +
+sheet(SH) { + SH.nets(N) { + N.segments(S) { + S.labels(L) { + printf("Label: %d %d '%s'\n", L.x, L.y, L.text.value); + } + } + } + } ++ + + +
color | int | |
fill | int | |
name | string (LAYER_NAME_LENGTH) | |
number | int | |
used | int (0=unused, 1=used) | |
visible | int (0=off, 1=on) |
LAYER_NAME_LENGTH | max. recommended length of a layer name (used in formatted output only) | |
LAYER_TOP | layer numbers | |
LAYER_BOTTOM | ||
LAYER_PADS | ||
LAYER_VIAS | ||
LAYER_UNROUTED | ||
LAYER_DIMENSION | ||
LAYER_TPLACE | ||
LAYER_BPLACE | ||
LAYER_TORIGINS | ||
LAYER_BORIGINS | ||
LAYER_TNAMES | ||
LAYER_BNAMES | ||
LAYER_TVALUES | ||
LAYER_BVALUES | ||
LAYER_TSTOP | ||
LAYER_BSTOP | ||
LAYER_TCREAM | ||
LAYER_BCREAM | ||
LAYER_TFINISH | ||
LAYER_BFINISH | ||
LAYER_TGLUE | ||
LAYER_BGLUE | ||
LAYER_TTEST | ||
LAYER_BTEST | ||
LAYER_TKEEPOUT | ||
LAYER_BKEEPOUT | ||
LAYER_TRESTRICT | ||
LAYER_BRESTRICT | ||
LAYER_VRESTRICT | ||
LAYER_DRILLS | ||
LAYER_HOLES | ||
LAYER_MILLING | ||
LAYER_MEASURES | ||
LAYER_DOCUMENT | ||
LAYER_REFERENCE | ||
LAYER_TDOCU | ||
LAYER_BDOCU | ||
LAYER_NETS | ||
LAYER_BUSSES | ||
LAYER_PINS | ||
LAYER_SYMBOLS | ||
LAYER_NAMES | ||
LAYER_VALUES | ||
LAYER_INFO | ||
LAYER_GUIDE | ||
LAYER_USER | lowest number for user defined layers (100) |
+board(B) { + B.layers(L) printf("Layer %3d %s\n", L.number, L.name); + } ++ + + +
description | string (see note) | |
grid | UL_GRID | |
headline | string | |
name | string (LIBRARY_NAME_LENGTH, see note) |
devices() | UL_DEVICE | |
devicesets() | UL_DEVICESET | |
layers() | UL_LAYER | |
packages() | UL_PACKAGE | |
symbols() | UL_SYMBOL |
LIBRARY_NAME_LENGTH | max. recommended length of a library name (used in formatted output only) |
+The devices() member loops through all the package variants and technologies +of all UL_DEVICESETs in the library, thus resulting in all the actual device variations +available. The devicesets() member only loops through the UL_DEVICESETs, +which in turn can be queried for their UL_DEVICE members. +
+If the library is derived form a UL_BOARD or UL_SCHEMATIC context, name returns +the pure library name (without path or extension). Otherwise it returns the full library file name. +
+library(L) { + L.devices(D) printf("Dev: %s\n", D.name); + L.devicesets(D) printf("Dev: %s\n", D.name); + L.packages(P) printf("Pac: %s\n", P.name); + L.symbols(S) printf("Sym: %s\n", S.name); + } +schematic(S) { + S.libraries(L) printf("Library: %s\n", L.name); + } ++ + + +
class | UL_CLASS | |
column | string (see note) | |
name | string (NET_NAME_LENGTH) | |
row | string (see note) |
pinrefs() | UL_PINREF (see note) | |
segments() | UL_SEGMENT (see note) |
NET_NAME_LENGTH | max. recommended length of a net name (used in formatted output only) |
+The column() and row() members return the column and row locations within +the frame on the sheet on which this net is drawn. Since a net +can extend over a certain area, each of these functions returns two values, separated by +a blank. In case of column() these are the left- and rightmost columns touched +by the net, and in case of row() it's the top- and bottommost row. +If there is no frame on that sheet, "? ?" (two question marks) is returned. +If any part of the net is placed outside the frame, either of the values may be '?' (question mark). +These members can only be used in a sheet context. +
+schematic(S) { + S.nets(N) { + printf("Net: %s\n", N.name); + // N.segments(SEG) will NOT work here! + } + } +schematic(S) { + S.sheets(SH) { + SH.nets(N) { + printf("Net: %s\n", N.name); + N.segments(SEG) { + SEG.wires(W) { + printf("\tWire: (%d %d) (%d %d)\n", + W.x1, W.y1, W.x2, W.y2); + } + } + } + } + } ++ + + +
area | UL_AREA | |
description | string | |
headline | string | |
library | string | |
name | string (PACKAGE_NAME_LENGTH) |
circles() | UL_CIRCLE | |
contacts() | UL_CONTACT | |
frames() | UL_FRAME | |
holes() | UL_HOLE | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
texts() | UL_TEXT (see note) | |
wires() | UL_WIRE |
PACKAGE_NAME_LENGTH | max. recommended length of a package name (used in formatted output only) |
+If the UL_PACKAGE is derived from a UL_ELEMENT, the texts() member only loops through the +non-detached texts of that element. +
+library(L) { + L.packages(PAC) { + printf("Package: %s\n", PAC.name); + PAC.contacts(C) { + if (C.pad) + printf("\tPad: %s, (%d %d)\n", + C.name, C.pad.x, C.pad.y); + else if (C.smd) + printf("\tSmd: %s, (%d %d)\n", + C.name, C.smd.x, C.smd.y); + } + } + } +board(B) { + B.elements(E) { + printf("Element: %s, Package: %s\n", E.name, E.package.name); + } + } ++ + + +
angle | real (0.0...359.9) | |
diameter[layer] | int | |
drill | int | |
drillsymbol | int | |
elongation | int | |
flags | int (PAD_FLAG_...) | |
name | string (PAD_NAME_LENGTH) | |
shape[layer] | int (PAD_SHAPE_...) | |
signal | string | |
x, y | int (center point, see note) |
PAD_FLAG_STOP | generate stop mask | |
PAD_FLAG_THERMALS | generate thermals | |
PAD_FLAG_FIRST | use special "first pad" shape |
+
PAD_SHAPE_SQUARE | square | |
PAD_SHAPE_ROUND | round | |
PAD_SHAPE_OCTAGON | octagon | |
PAD_SHAPE_LONG | long | |
PAD_SHAPE_OFFSET | offset | |
PAD_SHAPE_ANNULUS | annulus (only if supply layers are used) | |
PAD_SHAPE_THERMAL | thermal (only if supply layers are used) |
+
PAD_NAME_LENGTH | max. recommended length of a pad name (same as CONTACT_NAME_LENGTH) |
+The diameter and shape of the pad depend on the layer for which they shall be retrieved, +because they may be different in each layer depending on the Design Rules. +If one of the layers LAYER_TOP...LAYER_BOTTOM, LAYER_TSTOP or LAYER_BSTOP +is given as the index to the diameter or shape data member, the resulting value will be calculated +according to the Design Rules. If LAYER_PADS is given, the raw value as defined in the library will +be returned. +
+drillsymbol returns the number of the drill symbol that has been assigned +to this drill diameter (see the manual for a list of defined drill symbols). +A value of 0 means that no symbol has been assigned to this drill diameter. +
+angle defines how many degrees the pad is rotated counterclockwise +around its center. +
+elongation is only valid for shapes PAD_SHAPE_LONG and PAD_SHAPE_OFFSET and +defines how many percent the long side of such a pad is longer than its small side. +This member returns 0 for any other pad shapes. +
+The value returned by flags must be masked with the PAD_FLAG_... +constants to determine the individual flag settings, as in +
+if (pad.flags & PAD_FLAG_STOP) { + ... + } ++Note that if your ULP just wants to draw the objects, you don't need to check these +flags explicitly. The diameter[] and shape[] members will return +the proper data; for instance, if PAD_FLAG_STOP is set, diameter[LAYER_TSTOP] +will return 0, which should result in nothing being drawn in that layer. +The flags member is mainly for ULPs that want to create script files that +create library objects. +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + if (C.pad) + printf("Pad: '%s', (%d %d), d=%d\n", + C.name, C.pad.x, C.pad.y, C.pad.diameter[LAYER_BOTTOM]); + } + } + } ++ + + +
attribute[] | string (see note) | |
device | UL_DEVICE | |
deviceset | UL_DEVICESET | |
name | string (PART_NAME_LENGTH) | |
value | string (PART_VALUE_LENGTH) |
attributes() | UL_ATTRIBUTE (see note) | |
instances() | UL_INSTANCE (see note) |
PART_NAME_LENGTH | max. recommended length of a part name (used in formatted output only) | |
PART_VALUE_LENGTH | max. recommended length of a part value (used in formatted output only) |
+When looping through the attributes() of a UL_PART, only the name, +value, defaultvalue and constant members of the resulting +UL_ATTRIBUTE objects are valid. +
+If the part is in a sheet context, the instances() loop member +loops only through those instances that are actually used on that sheet. +If the part is in a schematic context, all instances are looped through. +
+schematic(S) { + S.parts(P) printf("Part: %s\n", P.name); + } ++
+schematic(SCH) { + SCH.parts(P) { + if (P.attribute["REMARK"]) + printf("%s: %s\n", P.name, P.attribute["REMARK"]); + } + } ++ + + +
angle | real (0, 90, 180 and 270) | |
contact | UL_CONTACT (see note) | |
direction | int (PIN_DIRECTION_...) | |
function | int (PIN_FUNCTION_FLAG_...) | |
length | int (PIN_LENGTH_...) | |
name | string (PIN_NAME_LENGTH) | |
net | string (see note) | |
swaplevel | int | |
visible | int (PIN_VISIBLE_FLAG_...) | |
x, y | int (connection point) |
circles() | UL_CIRCLE | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
PIN_DIRECTION_NC | not connected | |
PIN_DIRECTION_IN | input | |
PIN_DIRECTION_OUT | output (totem-pole) | |
PIN_DIRECTION_IO | in/output (bidirectional) | |
PIN_DIRECTION_OC | open collector | |
PIN_DIRECTION_PWR | power input pin | |
PIN_DIRECTION_PAS | passive | |
PIN_DIRECTION_HIZ | high impedance output | |
PIN_DIRECTION_SUP | supply pin |
+
PIN_FUNCTION_FLAG_NONE | no symbol | |
PIN_FUNCTION_FLAG_DOT | inverter symbol | |
PIN_FUNCTION_FLAG_CLK | clock symbol |
+
PIN_LENGTH_POINT | no wire | |
PIN_LENGTH_SHORT | 0.1 inch wire | |
PIN_LENGTH_MIDDLE | 0.2 inch wire | |
PIN_LENGTH_LONG | 0.3 inch wire |
+
PIN_NAME_LENGTH | max. recommended length of a pin name (used in formatted output only) |
+
PIN_VISIBLE_FLAG_OFF | no name drawn | |
PIN_VISIBLE_FLAG_PAD | pad name drawn | |
PIN_VISIBLE_FLAG_PIN | pin name drawn |
+The coordinates (and layer, in case of an SMD) of the contact returned by +the contact data member depend on the context in which it is called: +
+The net data member returns the name of the net to which this pin is connected +(only available in a schematic context). +
+library(L) { + L.symbols(S) { + printf("Symbol: %s\n", S.name); + S.pins(P) { + printf("\tPin: %s, (%d %d)", P.name, P.x, P.y); + if (P.direction == PIN_DIRECTION_IN) + printf(" input"); + if ((P.function & PIN_FUNCTION_FLAG_DOT) != 0) + printf(" inverted"); + printf("\n"); + } + } + L.devices(D) { + D.gates(G) { + G.symbol.pins(P) { + if (!P.contact) + printf("Unconnected pin: %s/%s/%s\n", D.name, G.name, P.name); + } + } + } + } ++ + + +
instance | UL_INSTANCE | |
part | UL_PART | |
pin | UL_PIN |
+schematic(SCH) { + SCH.sheets(SH) { + printf("Sheet: %d\n", SH.number); + SH.nets(N) { + printf("\tNet: %s\n", N.name); + N.segments(SEG) { + SEG.pinrefs(P) { + printf("connected to: %s, %s, %s\n", + P.part.name, P.instance.name, P.pin.name); + } + } + } + } + } ++ + + +
isolate | int | |
layer | int | |
orphans | int (0=off, 1=on) | |
pour | int (POLYGON_POUR_...) | |
rank | int | |
spacing | int | |
thermals | int (0=off, 1=on) | |
width | int |
contours() | UL_WIRE (see note) | |
fillings() | UL_WIRE | |
wires() | UL_WIRE |
POLYGON_POUR_SOLID | solid | |
POLYGON_POUR_HATCH | hatch |
+If the contours() loop member is called without a second parameter, +it loops through all of the contour wires, regardless whether they +belong to a positive or a negative polygon. If you are interested in getting +the positive and negative contour wires separately, you can call contours() +with an additional integer parameter (see the second example below). The sign of +that parameter determines whether a positive or a negative polygon will be handled, +and the value indicates the index of that polygon. If there is no polygon with the +given index, the statement will not be executed. Another advantage of this method +is that you don't need to determine the beginning and end of a particular polygon +yourself (by comparing coordinates). For any given index, the statement will be +executed for all the wires of that polygon. +With the second parameter 0 the behavior is the same +as without a second parameter. +
+The wires looped through by contours() always start with a positive +polygon. To find out where one partial polygon ends and the next one begins, simply +store the (x1,y1) coordinates of the first wire and check them against +(x2,y2) of every following wire. As soon as these are equal, the last wire +of a partial polygon has been found. It is also guaranteed that the second +point (x2,y2) of one wire is identical to the first point (x1,y1) of the +next wire in that partial polygon. +
+To find out where the "inside" and the "outside" of the polygon lays, +take any contour wire and imagine looking from its point (x1,y1) to (x2,y2). +The "inside" of the polygon is always on the right side of the wire. +Note that if you simply want to draw the polygon you won't need all these +details. +
+board(B) { + B.signals(S) { + S.polygons(P) { + int x0, y0, first = 1; + P.contours(W) { + if (first) { + // a new partial polygon is starting + x0 = W.x1; + y0 = W.y1; + } + // ... + // do something with the wire + // ... + if (first) + first = 0; + else if (W.x2 == x0 && W.y2 == y0) { + // this was the last wire of the partial polygon, + // so the next wire (if any) will be the first wire + // of the next partial polygon + first = 1; + } + } + } + } + } ++
+
+board(B) { + B.signals(S) { + S.polygons(P) { + // handle only the "positive" polygons: + int i = 1; + int active; + do { + active = 0; + P.contours(W, i) { + active = 1; + // do something with the wire + } + i++; + } while (active); + } + } + } ++ + + +
angle | real (0.0...359.9) | |
layer | int | |
x1, y1 | int (lower left corner) | |
x2, y2 | int (upper right corner) |
+angle defines how many degrees the rectangle is rotated counterclockwise +around its center. The center coordinates are given by (x1+x2)/2 and (y1+y2)/2. +
+board(B) { + B.rectangles(R) { + printf("Rectangle: (%d %d), (%d %d)\n", + R.x1, R.y1, R.x2, R.y2); + } + } ++ + + +
grid | UL_GRID | |
name | string (see note) | |
xreflabel | string |
attributes() | UL_ATTRIBUTE (see note) | |
classes() | UL_CLASS | |
layers() | UL_LAYER | |
libraries() | UL_LIBRARY | |
nets() | UL_NET | |
parts() | UL_PART | |
sheets() | UL_SHEET |
+The xreflabel member returns the format string used to display +cross-reference labels. +
+The attributes() loop member loops through the global attributes. +
+schematic(S) { + S.parts(P) printf("Part: %s\n", P.name); + } ++ + + +
junctions() | UL_JUNCTION (see note) | |
labels() | UL_LABEL | |
pinrefs() | UL_PINREF (see note) | |
texts() | UL_TEXT (deprecated, see note) | |
wires() | UL_WIRE |
+The texts() loop member was used in older EAGLE versions to loop through +the labels of a segment, and is only present for compatibility. It will not +deliver the text of cross-reference labels at the correct position. Use the +labels() loop member to access a segment's labels. +
+schematic(SCH) { + SCH.sheets(SH) { + printf("Sheet: %d\n", SH.number); + SH.nets(N) { + printf("\tNet: %s\n", N.name); + N.segments(SEG) { + SEG.pinrefs(P) { + printf("connected to: %s, %s, %s\n", + P.part.name, P.instance.name, P.pin.name); + } + } + } + } + } ++ + + +
area | UL_AREA | |
number | int |
busses() | UL_BUS | |
circles() | UL_CIRCLE | |
frames() | UL_FRAME | |
nets() | UL_NET | |
parts() | UL_PART | |
polygons() | UL_POLYGON | |
rectangles() | UL_RECTANGLE | |
texts() | UL_TEXT | |
wires() | UL_WIRE |
+schematic(SCH) { + SCH.sheets(S) { + printf("Sheet: %d\n", S.number); + } + } ++ + + +
airwireshidden | int | |
class | UL_CLASS | |
name | string (SIGNAL_NAME_LENGTH) |
contactrefs() | UL_CONTACTREF | |
polygons() | UL_POLYGON | |
vias() | UL_VIA | |
wires() | UL_WIRE |
SIGNAL_NAME_LENGTH | max. recommended length of a signal name (used in formatted output only) |
+board(B) { + B.signals(S) printf("Signal: %s\n", S.name); + } ++ + + +
angle | real (0.0...359.9) | |
dx[layer], dy[layer] | int (size) | |
flags | int (SMD_FLAG_...) | |
layer | int (see note) | |
name | string (SMD_NAME_LENGTH) | |
roundness | int (see note) | |
signal | string | |
x, y | int (center point, see note) |
SMD_FLAG_STOP | generate stop mask | |
SMD_FLAG_THERMALS | generate thermals | |
SMD_FLAG_CREAM | generate cream mask |
+
SMD_NAME_LENGTH | max. recommended length of an smd name (same as CONTACT_NAME_LENGTH) |
+angle defines how many degrees the smd is rotated counterclockwise +around its center. +
+The value returned by flags must be masked with the SMD_FLAG_... +constants to determine the individual flag settings, as in +
+if (smd.flags & SMD_FLAG_STOP) { + ... + } ++Note that if your ULP just wants to draw the objects, you don't need to check these +flags explicitly. The dx[] and dy[] members will return +the proper data; for instance, if SMD_FLAG_STOP is set, dx[LAYER_TSTOP] +will return 0, which should result in nothing being drawn in that layer. +The flags member is mainly for ULPs that want to create script files that +create library objects. +
+library(L) { + L.packages(PAC) { + PAC.contacts(C) { + if (C.smd) + printf("Smd: '%s', (%d %d), dx=%d, dy=%d\n", + C.name, C.smd.x, C.smd.y, C.smd.dx, C.smd.dy); + } + } + } ++ + + +
area | UL_AREA | |
library | string | |
name | string (SYMBOL_NAME_LENGTH) |
circles() | UL_CIRCLE | |
frames() | UL_FRAME | |
rectangles() | UL_RECTANGLE | |
pins() | UL_PIN | |
polygons() | UL_POLYGON | |
texts() | UL_TEXT (see note) | |
wires() | UL_WIRE |
SYMBOL_NAME_LENGTH | max. recommended length of a symbol name (used in formatted output only) |
+library(L) { + L.symbols(S) printf("Sym: %s\n", S.name); + } ++ + + +
angle | real (0.0...359.9) | |
font | int (FONT_...) | |
layer | int | |
mirror | int | |
ratio | int | |
size | int | |
spin | int | |
value | string | |
x, y | int (origin point) |
wires() | UL_WIRE (see note) |
FONT_VECTOR | vector font | |
FONT_PROPORTIONAL | proportional font | |
FONT_FIXED | fixed font |
+If the UL_TEXT is derived from a UL_ELEMENT or UL_INSTANCE context, the member +values will be those of the actual text as located in the board or sheet drawing. +
+board(B) { + B.texts(T) { + printf("Text: %s\n", T.value); + } + } ++ + + +
diameter[layer] | int | |
drill | int | |
drillsymbol | int | |
end | int | |
flags | int (VIA_FLAG_...) | |
shape[layer] | int (VIA_SHAPE_...) | |
start | int | |
x, y | int (center point) |
VIA_FLAG_STOP | always generate stop mask |
+
VIA_SHAPE_SQUARE | square | |
VIA_SHAPE_ROUND | round | |
VIA_SHAPE_OCTAGON | octagon | |
VIA_SHAPE_ANNULUS | annulus | |
VIA_SHAPE_THERMAL | thermal |
+Note that diameter and shape will always return the diameter or +shape that a via would have in the given layer, even if that particular via doesn't +cover that layer (or if that layer isn't used in the layer setup at all). +
+start and end return the layer numbers in which that via starts and +ends. The value of start will always be less than that of end. +
+drillsymbol returns the number of the drill symbol that has been assigned +to this drill diameter (see the manual for a list of defined drill symbols). +A value of 0 means that no symbol has been assigned to this drill diameter. +
+board(B) { + B.signals(S) { + S.vias(V) { + printf("Via: (%d %d)\n", V.x, V.y); + } + } + } ++ + + +
arc | UL_ARC | |
cap | int (CAP_...) | |
curve | real | |
layer | int | |
style | int (WIRE_STYLE_...) | |
width | int | |
x1, y1 | int (starting point) | |
x2, y2 | int (end point) |
pieces() | UL_WIRE (see note) |
CAP_FLAT | flat arc ends | |
CAP_ROUND | round arc ends | |
WIRE_STYLE_CONTINUOUS | continuous | |
WIRE_STYLE_LONGDASH | long dash | |
WIRE_STYLE_SHORTDASH | short dash | |
WIRE_STYLE_DASHDOT | dash dot |
+The cap parameter only has a meaning for actual arcs, and will always return +CAP_ROUND for a straight wire. +
+Whether or not an UL_WIRE is an arc can be determined by checking the boolean return +value of the arc data member. If it returns 0, we have a straight +wire, otherwise an arc. If arc returns a non-zero value it may be further +dereferenced to access the UL_ARC specific parameters start +and end angle, radius and center point. Note that you may only need these additional +parameters if you are going to draw the arc or process it in other ways where the +actual shape is important. +
+board(B) { + B.wires(W) { + printf("Wire: (%d %d) (%d %d)\n", + W.x1, W.y1, W.x2, W.y2); + } + } ++ + + +
+There are three kinds of definitions: +
+The scope of a constant or variable definition +goes from the line in which it has been defined to the end of the current +block, or to the end of the User +Language Program, if the definition appeared outside any block. +
+The scope of a function definition goes from the closing
+brace (}) of the function body to the end of the User Language
+Program.
+
+
+
+
+Constants may also be initialized to specific values, like
+Constant Definitions
+Constants are defined using the keyword enum, as in
+
+enum { a, b, c };
+
+which would define the three constants a, b and c,
+giving them the values 0, 1 and 2, respectively.
+
+enum { a, b = 5, c };
+
+where a would be 0, b would be 5 and
+c would be 6.
+
+
+
+Variable Definitions
+The general syntax of a variable definition is
+
+[numeric] type identifier [= initializer][, ...];
+
+where type is one of the
+data or
+object types,
+identifier is the name of the variable, and initializer
+is a optional initial value.
+
+Multiple variable definitions of the same type are separated +by commas (,). +
+If identifier is followed by a pair of +brackets ([]), this defines an array +of variables of the given type. The size of an array is +automatically adjusted at runtime. +
+The optional keyword numeric can be used with +string arrays to have them sorted +alphanumerically by the sort() function. +
+By default (if no initializer is present), +data variables are set to 0 +(or "", in case of a string), and +object variables are "invalid". +
int i; | defines an int variable named i | |
string s = "Hello"; | defines a string variable named s and initializes it to "Hello" | |
real a, b = 1.0, c; | defines three real variables named a, b and c, initializing b to the value 1.0 | |
int n[] = { 1, 2, 3 }; | defines an array of int, initializing the first three elements to 1, 2 and 3 | |
numeric string names[]; | defines a string array that can be sorted alphanumerically | |
UL_WIRE w; | defines a UL_WIRE object named w |
+UL_SIGNAL signals[]; +... +UL_SIGNAL s = signals[0]; +printf("%s", s.name); ++ + + +
+The general syntax of a function definition is +
+type identifier(parameters) +{ + statements +} ++where type is one of the +data or +object types, +identifier is the name of the function, +parameters is a list of comma separated parameter definitions, +and statements is a sequence of statements. +
+Functions that do not return a value have the type void. +
+A function must be defined before it can be called, and function +calls can not be recursive (a function cannot call itself). +
+The statements in the function body may modify the values of the parameters, +but this will not have any effect on the arguments of the +function call. +
+Execution of a function can be terminated by the +return statement. Without any +return statement the function body is executed until it's closing +brace (}). +
+A call to the exit() function will +terminate the entire User Language Program. +
+Command line arguments are available to the program through the global +Builtin Variables argc and argv. +
+int CountDots(string s) +{ + int dots = 0; + for (int i = 0; s[i]; ++i) + if (s[i] == '.') + ++dots; + return dots; +} +string dotted = "This.has.dots..."; +output("test") { + printf("Number of dots: %d\n", + CountDots(dotted)); + } ++ + + +
+
Unary | ! ~ + - ++ -- | |
Multiplicative | * / % | |
Additive | + - | |
Shift | << >> | |
Relational | < <= > >= | |
Equality | == != | |
Bitwise AND | & | |
Bitwise XOR | ^ | |
Bitwise OR | | | |
Logical AND | && | |
Logical OR | || | |
Conditional | ?: | |
Assignment | = *= /= %= += -= &= ^= |= <<= >>= | |
Comma | , |
+Associativity is left to right for all operators, except for +Unary, Conditional and Assignment, +which are right to left associative. +
+The normal operator precedence can be altered by the use of
+parentheses.
+
+
+
+
+Bitwise Operators
+Bitwise operators work only with data types
+char and
+int.
+
Unary | ||
~ | Bitwise (1's) complement | |
Binary | ||
<< | Shift left | |
>> | Shift right | |
& | Bitwise AND | |
^ | Bitwise XOR | |
| | Bitwise OR | |
Assignment | ||
&= | Assign bitwise AND | |
^= | Assign bitwise XOR | |
|= | Assign bitwise OR | |
<<= | Assign left shift | |
>>= | Assign right shift |
+
Unary | ||
! | Logical NOT | |
Binary | ||
&& | Logical AND | |
|| | Logical OR |
+Using a string expression with a +logical operator checks whether the string is empty. +
+Using an Object Type with a logical
+operator checks whether that object contains valid data.
+
+
+
+Comparison Operators
+Comparison operators work with expressions
+of any data type,
+except Object Types.
+
+
< | Less than | |
<= | Less than or equal to | |
> | Greater than | |
>= | Greater than or equal to | |
== | Equal to | |
!= | Not equal to |
+
?: | Conditional | |
, | Comma |
+The Conditional operator is used to make a decision within +an expression, as in +
+int a; +// ...code that calculates 'a' +string s = a ? "True" : "False"; ++which is basically the same as +
+int a; +string s; +// ...code that calculates 'a' +if (a) + s = "True"; +else + s = "False"; ++but the advantage of the conditional operator is that it can be used in +an expression. +
+The Comma operator is used to evaluate a sequence of expressions +from left to right, using the type and value of the right operand as +the result. +
+Note that arguments in a function call as well as multiple variable declarations
+also use commas as delimiters, but in that case this is not a
+comma operator!
+
+
+
+
+Arithmetic Operators
+Arithmetic operators work with data types
+char,
+int and
+real
+(except for ++, --, % and %=).
+
Unary | ||
+ | Unary plus | |
- | Unary minus | |
++ | Pre- or postincrement | |
-- | Pre- or postdecrement | |
Binary | ||
* | Multiply | |
/ | Divide | |
% | Remainder (modulus) | |
+ | Binary plus | |
- | Binary minus | |
Assignment | ||
= | Simple assignment | |
*= | Assign product | |
/= | Assign quotient | |
%= | Assign remainder (modulus) | |
+= | Assign sum | |
-= | Assign difference |
+See also String Operators
+
+
+
+
+String Operators
+String operators work with data types
+char,
+int and
+string.
+The left operand must always be of type
+string.
+
Binary | ||
+ | Concatenation | |
Assignment | ||
= | Simple assignment | |
+= | Append to string |
+The + operator concatenates two strings, or adds a character +to the end of a string and returns the resulting string. +
+The += operator appends a string or a character to the end of +a given string. +
+See also Arithmetic Operators
+
+
+
+Expressions
+An expression can be one of the following:
+
+Expressions can be grouped using parentheses,
+and may be recursive, meaning that an expression can consist of
+subexpressions.
+
+
+
+Arithmetic Expression
+An arithmetic expression is any combination of numeric
+operands and an arithmetic operator or a
+bitwise operator.
+
+a + b +c++ +m << 1 ++ + + +
+a = x + 42 +b += c +s = "Hello" ++ + + +
+s + ".brd" +t + 'x' ++ + + +
+Comma expressions are evaluated left to right, and the result of a comma +expression is the type and value of the rightmost expression. +
+i++, j++, k++ ++ + + +
+int a; +// ...code that calculates 'a' +string s = a ? "True" : "False"; ++ + + +
+int p = strchr(s, 'b'); ++ + + +
+Compound statements can be nested to any depth.
+
+
+
+Expression Statement
+An expression statement is any
+expression followed by a
+semicolon.
+
+An expression statement is executed by evaluating the expression. +All side effects of this evaluation are completed before the next +statement is executed. +Most expression statements are +assignments or +function calls. +
+A special case is the empty statement, consisting of only a
+semicolon.
+An empty statement does nothing, but it may be useful in situations
+where the ULP syntax expects a statement but your program does not
+need one.
+
+
+
+
+Iteration statements are
+Control Statements
+Control statements are used to control the program flow.
+
+do...while
+for
+while
+
+Selection statements are
+
+if...else
+switch
+
+Jump statements are
+
+break
+continue
+return
+
+
+
+
+break
+The break statement has the general syntax
+
+break;
+
+and immediately terminates the nearest enclosing
+do...while,
+for,
+switch or
+while
+statement.
+This also applies to loop members of object types.
+
+Since all of these statements can be intermixed and nested to any
+depth, take care to ensure that your break exits from the
+correct statement.
+
+
+
+continue
+The continue statement has the general syntax
+
+continue;
+
+and immediately transfers control to the test condition of the
+nearest enclosing
+do...while,
+while, or
+for statement, or to the increment expression
+of the nearest enclosing
+for
+statement.
+
+Since all of these statements can be intermixed and nested to any
+depth, take care to ensure that your continue affects the
+correct statement.
+
+
+
+
+The condition is tested after the first
+execution of statement, which means that the statement is
+always executed at least one time.
+
+If there is no
+break or
+return
+inside the statement, the statement must affect
+the value of the condition, or condition itself must
+change during evaluation in order to avoid an endless loop.
+
+The initializing expression init normally initializes one or more
+loop counters. It may also define a new variable as a loop counter.
+The scope of such a variable is valid until the end of the active block.
+
+An else clause is always matched to the last encountered if
+without an else. If this is not what you want, you need to use
+braces to group the statements, as in
+do...while
+The do...while statement has the general syntax
+
+do statement while (condition);
+
+and executes the statement until the condition
+expression becomes zero.
+Example
+
+string s = "Trust no one!";
+int i = -1;
+do {
+ ++i;
+ } while (s[i]);
+
+
+
+
+for
+The for statement has the general syntax
+
+for ([init]; [test]; [inc]) statement
+
+and performs the following steps:
+
+
+If there is no
+break or
+return
+inside the statement, the inc expression (or the
+statement) must affect
+the value of the test expression, or test itself must
+change during evaluation in order to avoid an endless loop.
+Example
+
+string s = "Trust no one!";
+int sum = 0;
+for (int i = 0; s[i]; ++i)
+ sum += s[i]; // sums up the characters in s
+
+
+
+
+if...else
+The if...else statement has the general syntax
+
+if (expression)
+ t_statement
+[else
+ f_statement]
+
+The conditional expression is evaluated, and if its value is nonzero
+the t_statement is executed. Otherwise the f_statement is
+executed in case there is an else clause.
+
+if (a == 1) {
+ if (b == 1)
+ printf("a == 1 and b == 1\n");
+ }
+else
+ printf("a != 1\n");
+
+
+
+
+return
+A function with a return type
+other than void must contain at least one return
+statement with the syntax
+
+return expression; ++where expression must evaluate to a type that is compatible with +the function's return type. The value of expression is the value +returned by the function. +
+If the function is of type void, a return statement
+without an expression can be used to return from the function
+call.
+
+
+
+
+Any case_statement can be labeled by one or more case
+labels. The case_exp of each case label must evaluate
+to a constant integer which is unique within it's enclosing switch
+statement.
+
+There can also be at most one default label.
+
+After evaluating sw_exp, the case_exp are checked for
+a match. If a match is found, control passes to the case_statement
+with the matching case label.
+
+If no match is found and there is a default label, control
+passes to def_statement. Otherwise none of the statements in the
+switch is executed.
+
+Program execution is not affected when case and default
+labels are encountered. Control simply passes through the labels to the
+following statement.
+
+To stop execution at the end of a group of statements for a particular
+case, use the break statement.
+
+The condition is tested before the first possible
+execution of statement, which means that the statement may never
+be executed if condition is initially zero.
+
+If there is no
+break or
+return
+inside the statement, the statement must affect
+the value of the condition, or condition itself must
+change during evaluation in order to avoid an endless loop.
+
+Many of the object types have their
+own Constants section which lists the builtin constants for that
+particular object (see e.g. UL_PIN).
+
+The following builtin constants are defined in addition to the ones
+listed for the various object types:
+
+switch
+The switch statement has the general syntax
+
+switch (sw_exp) {
+ case case_exp: case_statement
+ ...
+ [default: def_statement]
+ }
+
+and allows for the transfer of control to one of several
+case-labeled statements, depending on the value of
+sw_exp (which must be of integral type).
+Example
+
+string s = "Hello World";
+int vowels = 0, others = 0;
+for (int i = 0; s[i]; ++i)
+ switch (toupper(s[i])) {
+ case 'A':
+ case 'E':
+ case 'I':
+ case 'O':
+ case 'U': ++vowels;
+ break;
+ default: ++others;
+ }
+printf("There are %d vowels in '%s'\n", vowels, s);
+
+
+
+
+while
+The while statement has the general syntax
+
+while (condition) statement
+
+and executes the statement as long as the condition
+expression is not zero.
+Example
+
+string s = "Trust no one!";
+int i = 0;
+while (s[i])
+ ++i;
+
+
+
+
+Builtins
+Builtins are Constants, Variables, Functions and Statements
+that provide additional information and allow for data manipulations.
+
+
+
+
+Builtin Constants
+Builtin constants are used to provide information about
+object parameters, such as maximum recommended name length, flags etc.
+
EAGLE_VERSION | EAGLE program version number (int) | |
EAGLE_RELEASE | EAGLE program release number (int) | |
EAGLE_SIGNATURE | a string containing EAGLE program name, version and copyright information | |
REAL_EPSILON | the minimum positive real number such that 1.0 + REAL_EPSILON != 1.0 | |
REAL_MAX | the largest possible real value | |
REAL_MIN | the smallest possible (positive!) real value the smallest representable number is -REAL_MAX | |
INT_MAX | the largest possible int value | |
INT_MIN | the smallest possible int value | |
PI | the value of "pi" (3.14..., real) | |
usage | a string containing the text from the #usage directive |
+These builtin constants contain the directory paths defined in the +directories dialog, with any of the special +variables ($HOME and $EAGLEDIR) replaced by their actual values. +Since each path can consist of several directories, these constants are string +arrays with an individual directory in each member. The first empty member marks the end of the path: +
+
path_lbr[] | Libraries | |
path_dru[] | Design Rules | |
path_ulp[] | User Language Programs | |
path_scr[] | Scripts | |
path_cam[] | CAM Jobs | |
path_epf[] | Projects |
+When using these constants to build a full file name, you need to use a directory separator, +as in +
+string s = path_lbr[0] + '/' + "mylib.lbr"; ++
+The libraries that are currently in use through the USE command: +
+
used_libraries[] |
+
int argc | number of arguments given to the RUN command | |
string argv[] | arguments given to the RUN command (argv[0] is the full ULP file name) |
+You may also write your own functions +and use them to structure your User Language Program. +
+The builtin functions are grouped into the following categories: +
+The following character functions are available: +
isalnum | letters (A to Z or a to z) or digits (0 to 9) | |
isalpha | letters (A to Z or a to z) | |
iscntrl | delete characters or ordinary control characters (0x7F or 0x00 to 0x1F) | |
isdigit | digits (0 to 9) | |
isgraph | printing characters (except space) | |
islower | lowercase letters (a to z) | |
isprint | printing characters (0x20 to 0x7E) | |
ispunct | punctuation characters (iscntrl or isspace) | |
isspace | space, tab, carriage return, new line, vertical tab, or formfeed (0x09 to 0x0D, 0x20) | |
isupper | uppercase letters (A to Z) | |
isxdigit | hex digits (0 to 9, A to F, a to f) |
+char c = 'A'; +if (isxdigit(c)) + printf("%c is hex\n", c); +else + printf("%c is not hex\n", c); ++ + + +
+The following file handling functions are available: +
+fileerror checks the status of any I/O operations that have been performed +since the last call to this function and returns 0 if everything was ok. +If any of the I/O operations has caused an error, a value other than 0 +will be returned. +
+You should call fileerror before any I/O operations to reset any previous +error state, and call it again after the I/O operations to see if they were successful. +
+When fileerror returns a value other than 0 (thus indicating an error) +a proper error message has already been given to the user. +
+fileerror(); +output("file.txt", "wt") { + printf("Test\n"); + } +if (fileerror()) + exit(1); ++ + + +
+fileglob performs a directory search using pattern. +
+pattern may contain '*' and '?' as wildcard characters. +If pattern ends with a '/', the contents of the given directory will be returned. +
+Names in the resulting array that end with a '/' are directory names. +
+The array is sorted alphabetically, with the directories coming first. +
+The special entries '.' and '..' (for the current and parent directories) +are never returned in the array. +
+If pattern doesn't match, or if you don't have permission to search the given +directory, the resulting array will be empty. +
+The directory delimiter in the array is always a forward slash.
+This makes sure User Language Programs will work platform independently.
+In the pattern the backslash ('\') is also treated
+as a directory delimiter.
+ +Sorting filenames under Windows is done case insensitively. + |
+string a[]; +int n = fileglob(a, "*.brd"); ++ + + +
+if (board) board(B) { + output(filesetext(B.name, ".out")) { + ... + } + } ++ + + +
+board(B) + printf("Board: %s\nSize: %d\nTime: %s\n", + B.name, filesize(B.name), + t2string(filetime(B.name))); ++ + + +
+The following file input is available: +
+If dest is a character array, the file will be read as raw binary data +and the return value reflects the number of bytes read into the character array +(which is equal to the file size). +
+If dest is a string array, the file will be read as a text file (one line +per array member) and the return value will be the number of lines read into the +string array. Newline characters will be stripped. +
+If dest is a string, the entire file will be read into that string +and the return value will be the length of that string (which is not necessarily +equal to the file size, if the operating system stores text files with "cr/lf" +instead of a "newline" character). +
+char b[]; +int nBytes = fileread(b, "data.bin"); +string lines[]; +int nLines = fileread(lines, "data.txt"); +string text; +int nChars = fileread(text, "data.txt"); ++ + + +
+The following mathematical functions are available: +
+real x = -1.0; +real r = sqrt(2 * x); ++will lead to the error message +
+Invalid argument in call to 'sqrt(-2)' ++ + + +
+The return type of these functions is the same as the (larger) type +of the arguments. type must be one of +char, +int or +real. +
+real x = 2.567, y = 3.14; +printf("The maximum is %f\n", max(x, y)); ++ + + +
+real x = 2.567; +printf("The rounded value of %f is %f\n", x, round(x)); ++ + + +
PI | the value of "pi" (3.14...) |
+real x = PI / 2; +printf("The sine of %f is %f\n", x, sin(x)); ++ + + +
+real x = 2.1; +printf("The square root of %f is %f\n", x, sqrt(x)); ++ + + +
+The following miscellaneous functions are available: +
+ + + +
+The exit function terminates execution of a User Language Program.
+If an integer result is given it will be used as the
+return value of the program.
+If a string command is given, that command will be executed as if it
+were entered into the command line immediately after the RUN command. In that
+case the return value of the ULP is set to EXIT_SUCCESS.
+
EXIT_SUCCESS | return value for successful program execution (value 0) | |
EXIT_FAILURE | return value for failed program execution (value -1) |
+
+
+
+
+In the example below all the strings used in the ULP are listed in the
+string array I18N[], preceeded by a string containing the
+various language codes supported by this ULP. Note the vtab
+characters used to separate the individual parts of each string (they
+are important for the lookup function) and the use of the commas
+to separate the strings. The actual work is done in the function tr(),
+which returns the translated version of the given string.
+If the original string can't be found in the I18N array, or there
+is no translation for the current language, the original string will be used
+untranslated.
+
+The first language defined in the I18N array must be the one in which
+the strings used throughout the ULP are written, and should generally be
+English in order to make the program accessible to the largest number of users.
+language()
+
+
+The language function can be used to make a ULP use different
+message string, depending on which language the current system is using.
+Example
+
+string I18N[] = {
+ "en\v"
+ "de\v"
+ "it\v"
+ ,
+ "I18N Demo\v"
+ "Beispiel für Internationalisierung\v"
+ "Esempio per internazionalizzazione\v"
+ ,
+ "Hello world!\v"
+ "Hallo Welt!\v"
+ "Ciao mondo!\v"
+ ,
+ "+Ok\v"
+ "+Ok\v"
+ "+Approvazione\v"
+ ,
+ "-Cancel\v"
+ "-Abbrechen\v"
+ "-Annullamento\v"
+ };
+int Language = strstr(I18N[0], language()) / 3;
+string tr(string s)
+{
+ string t = lookup(I18N, s, Language, '\v');
+ return t ? t : s;
+}
+dlgDialog(tr("I18N Demo")) {
+ dlgHBoxLayout dlgSpacing(350);
+ dlgLabel(tr("Hello world!"));
+ dlgHBoxLayout {
+ dlgPushButton(tr("+Ok")) dlgAccept();
+ dlgPushButton(tr("-Cancel")) dlgReject();
+ }
+ };
+
+
+
+
+lookup()
+
+
+See also fileread,
+strsplit
+
+string lookup(string array[], string key, string field_name[, char separator]);
+
+If the field doesn't exist, or no string matching key is found,
+an empty string is returned.
+
+An array that can be used with lookup() consists of strings of text, +each string representing one data record. +
+Each data record contains an arbitrary number of fields, which are separated by +the character separator (default is '\t', the tabulator). +The first field in a record is used as the key and is numbered 0. +
+All records must have unique key fields and none of the key fields +may be empty - otherwise it is undefined which record will be found. +
+If the first string in the array contains a "Header" record (i.e. a record where
+each field describes its contents), using lookup with a field_name
+string automatically determines the index of that field. This allows using the
+lookup function without exactly knowing which field index contains
+the desired data.
+It is up to the user to make sure that the first record actually
+contains header information.
+
+If the key parameter in the call to lookup() is an empty +string, the first string of the array will be used. This allows a program to +determine whether there is a header record with the required field names. +
+If a field contains the separator character, that field must be enclosed
+in double quotes (as in "abc;def", assuming the semicolon (';')
+is used as separator). The same applies if the field contains double quotes
+("), in which case the double quotes inside the field have to be doubled
+(as in "abc;""def"";ghi", which would be abc;"def";ghi).
+It is best to use the default "tab" separator, which doesn't have these problems
+(no field can contain a tabulator).
+
+Here's an example data file (';' has been used as separator for better readability): +
+Name;Manufacturer;Code;Price +7400;Intel;I-01-234-97;$0.10 +68HC12;Motorola;M68HC1201234;$3.50 ++
+string OrderCodes[]; +if (fileread(OrderCodes, "ordercodes") > 0) { + if (lookup(OrderCodes, "", "Code", ';')) { + schematic(SCH) { + SCH.parts(P) { + string OrderCode; + // both following statements do exactly the same: + OrderCode = lookup(OrderCodes, P.device.name, "Code", ';'); + OrderCode = lookup(OrderCodes, P.device.name, 2, ';'); + } + } + } + else + dlgMessageBox("Missing 'Code' field in file 'ordercodes'); + } ++ + + +
+The special value -1 for index makes the function return the type +of the palette that is currently in use by the editor window. +
+If either index or type is out of range, an error message will be +given and the ULP will be terminated. +
PALETTE_TYPES | the number of palette types (3) | |
PALETTE_BLACK | the black background palette (0) | |
PALETTE_WHITE | the white background palette (1) | |
PALETTE_COLORED | the colored background palette (2) | |
PALETTE_ENTRIES | the number of colors per palette (64) |
+In any case, the number argument defines the number of items in the +array(s). +
+string A[]; +int n = 0; +A[n++] = "World"; +A[n++] = "Hello"; +A[n++] = "The truth is out there..."; +sort(n, A); +for (int i = 0; i < n; ++i) + printf(A[i]); ++
+numeric string Nets[], Parts[], Instances[], Pins[]; +int n = 0; +int index[]; +schematic(S) { + S.nets(N) N.pinrefs(P) { + Nets[n] = N.name; + Parts[n] = P.part.name; + Instances[n] = P.instance.name; + Pins[n] = P.pin.name; + ++n; + } + sort(n, index, Nets, Parts, Instances, Pins); + for (int i = 0; i < n; ++i) + printf("%-8s %-8s %-8s %-8s\n", + Nets[index[i]], Parts[index[i]], + Instances[index[i]], Pins[index[i]]); + } ++The idea behind this is that one net can have several pins connected to it, +and in a netlist you might want to have the net names sorted, and within +one net you also want the part names sorted and so on. +
+Note the use of the keyword numeric in the string arrays. This causes +the strings to be sorted in a way that takes into account a numeric part +at the end of the strings, which leads to IC1, IC2,... IC9, IC10 instead of +the alphabetical order IC1, IC10, IC2,...IC9. +
+When sorting a set of arrays, the first (index) array must be of type
+int and need not be initialized. Any
+contents the index array might have before calling the sort
+function will be overwritten by the resulting index values.
+
+
+
+status()
+
+
+See also dlgMessageBox()
+
+
+The status function displays the given message in the status bar of the
+editor window in which the ULP is running.
+
+
+
+
+
+As a security precaution, you will be prompted with the command
+string before the command is executed, in order to make sure there is no "evil"
+ULP that executes unwanted external commands.
+If this dialog is canceled, the system() call will return -1.
+If the dialog is confirmed, any future system() calls in the current
+EAGLE session with exactly the same command string will be executed without
+any further confirmation dialog.
+
+system()
+
+
+The system function executes the external program given by the command
+string, and waits until the program ends.
+Input/Output redirection
+If the external program shall read its standard input from (or write its standard
+output to) a particular file, input/output needs to be redirected.
+
+On Linux and Mac OS X this is done by simply adding a '<' or
+'>' to the command line, followed by the desired file name, as in
++system("program < infile > outfile"); ++which runs program and makes it read from infile and write +to outfile. + |
+
+On Windows you have to explicitly run a command processor to do this, as in
++system("cmd.exe /c program < infile > outfile"); ++(on DOS based Windows systems use command.com instead of cmd.exe). + |
+
+If an external program runs for a longer time, and you want the system
+call to return immediately, without waiting for the program to end, you
+can simply add an '&' to the command string under Linux and
+Mac OS X, as in
++system("program &"); ++ |
+
+Under Windows you need to explicitly run a command processor to do this, as in
++system("cmd.exe /c start program"); ++(on DOS based Windows systems use command.com instead of cmd.exe). + |
+int result = system("simulate -f filename"); ++This would call a simulation program, giving it a file which the ULP has +just created. +Note that simulate here is just an example, it is not part of the EAGLE package! + + + +
+EAGLE stores all coordinate and size values as int +values with a resolution of 1/10000mm (0.1µ). The above unit conversion +functions can be used to convert these internal units to the desired +measurement units. +
+board(B) { + B.elements(E) { + printf("%s at (%f, %f)\n", E.name, + u2mm(E.x), u2mm(E.y)); + } + } ++ + + +
+The following printing functions are available: +
+ + + ++In case of an error, printf returns -1. +
+The format string contains two types of objects - plain characters +and format specifiers: +
+% [flags] [width] [.prec] type +
+Each format specification begins with the percent character (%). +After the % comes the following, in this order: +
d | signed decimal int | |
o | unsigned octal int | |
u | unsigned decimal int | |
x | unsigned hexadecimal int (with a, b,...) | |
X | unsigned hexadecimal int (with A, B,...) | |
f | signed real value of the form [-]dddd.dddd | |
e | signed real value of the form [-]d.dddde[±]ddd | |
E | same as e, but with E for exponent | |
g | signed real value in either e or f form, based on given value and precision | |
G | same as g, but with E for exponent if e format used | |
c | single character | |
s | character string | |
% | the % character is printed |
+
"-" | the formatted item is left-justified within the field; normally, items are right-justified | |
"+" | a signed, positive item will always start with a plus character (+); normally, only negative items begin with a sign | |
" " | a signed, positive item will always start with a space character; if both "+" and " " are specified, "+" overrides " " |
+Width is specified either directly, through a decimal digit string, or +indirectly, through an asterisk (*). If you use an asterisk for the +width specifier, the next argument in the call (which must be an int) +specifies the minimum output field width. +
+In no case does a nonexistent or small field width cause truncation of +a field. If the result of a conversion is wider than the field width, +the field is simply expanded to contain the conversion result. +
+
n | At least n characters are printed. If the output value has less than n characters, the output is padded with blanks (right-padded if "-" flag given, left-padded otherwise). | |
0n | At least n characters are printed. If the output value has less than n characters, it is filled on the left with zeroes. | |
* | The argument list supplies the width specifier, which must precede the actual argument being formatted. |
+
none | Precision set to default. | |
.0 | For int types, precision is set to default; for real types, no decimal point is printed. | |
.n | n characters or n decimal places are printed. If the output value has more than n characters the output might be truncated or rounded (depending on the type character). | |
* | The argument list supplies the precision specifier, which must precede the actual argument being formatted. |
douxX | 1 | |
eEf | 6 | |
gG | all significant digits | |
c | no effect | |
s | print entire string |
douxX | .n specifies that at least n characters are printed. If the input argument has less than n digits, the output value is left-padded with zeros. If the input argument has more than n digits, the output value is not truncated. | |
eEf | .n specifies that n characters are printed after the decimal point, and the last digit printed is rounded. | |
gG | .n specifies that at most n significant digits are printed. | |
c | .n has no effect on the output. | |
s | .n specifies that no more than n characters are printed. |
+char c = 0x00; +printf("%c", c); ++
+int i = 42; +real r = 3.14; +char c = 'A'; +string s = "Hello"; +printf("Integer: %8d\n", i); +printf("Hex: %8X\n", i); +printf("Real: %8f\n", r); +printf("Char: %-8c\n", c); +printf("String: %-8s\n", s); ++ + + +
+In case of an error, sprintf returns -1. +
+string result; +int number = 42; +sprintf(result, "The number is %d", number); ++ + + +
+The following string functions are available: +
+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +
+string s = "This is a string"; +char c = 'a'; +int pos = strchr(s, c); +if (pos >= 0) + printf("The character %c is at position %d\n", c, pos); +else + printf("The character was not found\n"); ++ + + +
+strjoin joins all entries in array, delimited by the given +separator and returns the resulting string. +
+If separator is the newline character ("\n") the resulting +string will be terminated with a newline character. +This is done to have a text file that +consists of N lines (each of which is terminated with a newline) and is read +in with the fileread() function and +split into +an array of N strings to be joined to the original string as read from the file. +
+string a[] = { "Field 1", "Field 2", "Field 3" }; +string s = strjoin(a, ':'); ++ + + +
+string s = "This is a string"; +int l = strlen(s); +printf("The string is %d characters long\n", l); ++ + + +
+string s = "This Is A String"; +string r = strlwr(s); +printf("Prior to strlwr: %s - after strlwr: %s\n", s, r); ++ + + +
+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +
+string s = "This is a string"; +char c = 'a'; +int pos = strrchr(s, c); +if (pos >= 0) + printf("The character %c is at position %d\n", c, pos); +else + printf("The character was not found\n"); ++ + + +
+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +
+string s1 = "This is a string", s2 = "is a"; +int pos = strrstr(s1, s2); +if (pos >= 0) + printf("The substring starts at %d\n", pos); +else + printf("The substring was not found\n"); ++ + + +
+strsplit splits the string s at the given separator +and stores the resulting fields in the array. +
+If separator is the newline character ("\n") the last field +will be silently dropped if it is empty. This is done to have a text file that +consists of N lines (each of which is terminated with a newline) and is read +in with the fileread() function to be split into +an array of N strings. With any other separator an empty field at the +end of the string will count, so "a:b:c:" will result in 4 fields, +the last of which is empty. +
+string a[]; +int n = strsplit(a, "Field 1:Field 2:Field 3", ':'); ++ + + +
+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +
+string s1 = "This is a string", s2 = "is a"; +int pos = strstr(s1, s2); +if (pos >= 0) + printf("The substring starts at %d\n", pos); +else + printf("The substring was not found\n"); ++ + + +
+The value for length must be positive, otherwise an empty string +will be returned. If length is ommitted, the rest of the string +(beginning at start) is returned. +
+If start points to a position outside the string, an empty string +is returned. +
+string s = "This is a string"; +string t = strsub(s, 4, 7); +printf("The extracted substring is: %s\n", t); ++ + + +
+string s = "3.1415"; +real r = strtod(s); +printf("The value is %f\n", r); ++ + + +
+string s = "1234"; +int i = strtol(s); +printf("The value is %d\n", i); ++ + + +
+string s = "This Is A String"; +string r = strupr(s); +printf("Prior to strupr: %s - after strupr: %s\n", s, r); ++ + + +
+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +
+If length is given, the actual length of the matching substring +is returned in that variable. +
+Regular expressions allow you to find a pattern within a text string.
+For instance, the regular expression "i.*a" would find a sequence of characters
+that starts with an 'i', followed by any character ('.') any number of times ('*'),
+and ends with an 'a'. It would match on "is a" as well as "is this a" or "ia".
+Details on regular expressions can be found, for instance, in the book
+Mastering Regular Expressions by Jeffrey E. F. Friedl.
+
+string s1 = "This is a string", s2 = "i.*a"; +int len = 0; +int pos = strxstr(s1, s2, 0, len); +if (pos >= 0) + printf("The substring starts at %d and is %d charcaters long\n", pos, len); +else + printf("The substring was not found\n"); ++ + + +
+The following time functions are available: +
+int CurrentTime = time(); ++ + + +
+After 86400000 milliseconds (i.e. every 24 hours), the value starts at 0 again. +
+int elapsed = timems(); ++ + + +
+int t = time(); +printf("It is now %02d:%02d:%02d\n", + t2hour(t), t2minute(t), t2second(t)); ++ + + +
+The following object functions are available: +
+ + + ++The clrgroup() function clears the group flags of the given object, +so that it is no longer part of the previously defined group. +
+When applied to an object that contains other objects (like a UL_BOARD or +UL_NET) the group flags of all contained objects are cleared recursively. +
+board(B) { + B.elements(E) + clrgroup(E); + } ++ + + +
+If a group has been defined in the editor, the ingroup() function can +be used to check whether a particular object is part of the group. +
+Objects with a single coordinate that are individually selectable in the current +drawing (like UL_TEXT, UL_VIA, UL_CIRCLE etc.) return a non-zero value +in a call to ingroup() if that coordinate is within the defined group. +
+A UL_WIRE returns 0, 1, 2 or 3, depending on whether none, the first, the second +or both of its end points are in the group. +
+A UL_RECTANGLE and UL_FRAME returns a non-zero value if one or more of its corners are in the group. +The value has bit 0 set for the upper right corner, bit 1 for the upper left, bit 2 +for the bottom left, and bit 3 for the bottom right corner. +
+Objects that have no coordinates (like UL_NET, UL_SEGMENT, UL_SIGNAL etc.) return +a non-zero value if one or more of the objects within them are in the group. +
+UL_CONTACTREF and UL_PINREF, though not having coordinates of their own, return +a non-zero value if the referenced UL_CONTACT or UL_PIN, respectively, is within +the group. +
+output("group.txt") { + board(B) { + B.elements(E) { + if (ingroup(E)) + printf("Element %s is in the group\n", E.name); + } + } + } ++ + + +
+The setgroup() function sets the group flags of the given object, +so that it becomes part of the group. +
+If no flags are given, the object is added to the group as a whole +(i.e. all of its selection points, in case it has more than one). +
+If flags has a non-zero value, only the group flags of the given +points of the object are set. For a UL_WIRE this means that '1' +sets the group flag of the first point, '2' that of the second point, +and '3' sets both. Any previously set group flags remain unchanged +by a call to setgroup(). +
+When applied to an object that contains other objects (like a UL_BOARD or +UL_NET) the group flags of all contained objects are set recursively. +
+board(B) { + B.elements(E) + setgroup(E); + } ++ + + +
+The general syntax of a builtin statement is +
+name(parameters) statement ++where name is the name of the builtin statement, parameters +stands for one or more parameters, and statement is the code that +will be executed inside the context opened by the builtin statement. +
+Note that statement can be a compound statement, as in +
+board(B) { + B.elements(E) printf("Element: %s\n", E.name); + B.Signals(S) printf("Signal: %s\n", S.name); + } ++The following builtin statements are available: + + + + +
+The board statement opens a board context if the current editor +window contains a board drawing. A variable of type +UL_BOARD is created and is given +the name indicated by identifier. +
+Once the board context is successfully opened and a board variable has been +created, the statement is executed. Within the scope of the +statement the board variable can be accessed to retrieve further +data from the board. +
+If the current editor window does not contain a board drawing, an error +message is given and the ULP is terminated. +
+project.board(B) { ... } ++This will open a board context regardless whether the current editor window +contains a board or a schematic drawing. However, there must be an editor +window containing that board somewhere on the desktop! +
+if (board) + board(B) { + B.elements(E) + printf("Element: %s\n", E.name); + } ++ + + +
+The deviceset statement opens a device set context if the current editor +window contains a device drawing. A variable of type +UL_DEVICESET is created and is given +the name indicated by identifier. +
+Once the device set context is successfully opened and a device set variable has been +created, the statement is executed. Within the scope of the +statement the device set variable can be accessed to retrieve further +data from the device set. +
+If the current editor window does not contain a device drawing, an error +message is given and the ULP is terminated. +
+if (deviceset) + deviceset(D) { + D.gates(G) + printf("Gate: %s\n", G.name); + } ++ + + +
+The library statement opens a library context if the current editor +window contains a library drawing. A variable of type +UL_LIBRARY is created and is given +the name indicated by identifier. +
+Once the library context is successfully opened and a library variable has been +created, the statement is executed. Within the scope of the +statement the library variable can be accessed to retrieve further +data from the library. +
+If the current editor window does not contain a library drawing, an error +message is given and the ULP is terminated. +
+if (library) + library(L) { + L.devices(D) + printf("Device: %s\n", D.name); + } ++ + + +
+The output statement opens a file with the given filename +and mode for output through subsequent printf() calls. +If the file has been successfully opened, the statement is +executed, and after that the file is closed. +
+If the file cannot be opened, an error message is given and execution +of the ULP is terminated. +
+By default the output file is written into the Project directory. +
+
a | append to an existing file, or create a new file if it does not exist | |
w | create a new file (overwriting an existing file) | |
t | open file in text mode | |
b | open file in binary mode | |
D | delete this file when ending the EAGLE session (only works together with w) | |
F | force using this file name (normally *.brd, *.sch and *.lbr are rejected) |
+Mode characters may appear in any order and combination. However, only the +last one of a and w or t and b, respectively, +is significant. For example a mode of "abtw" would open a file for +textual write, which would be the same as "wt". +
+void PrintText(string s) +{ + printf("This also goes into the file: %s\n", s); +} +output("file.txt", "wt") { + printf("Directly printed\n"); + PrintText("via function call"); + } ++ + + +
+The package statement opens a package context if the current editor +window contains a package drawing. A variable of type +UL_PACKAGE is created and is given +the name indicated by identifier. +
+Once the package context is successfully opened and a package variable has been +created, the statement is executed. Within the scope of the +statement the package variable can be accessed to retrieve further +data from the package. +
+If the current editor window does not contain a package drawing, an error +message is given and the ULP is terminated. +
+if (package) + package(P) { + P.contacts(C) + printf("Contact: %s\n", C.name); + } ++ + + +
+The schematic statement opens a schematic context if the current editor +window contains a schematic drawing. A variable of type +UL_SCHEMATIC is created and is given +the name indicated by identifier. +
+Once the schematic context is successfully opened and a schematic variable has been +created, the statement is executed. Within the scope of the +statement the schematic variable can be accessed to retrieve further +data from the schematic. +
+If the current editor window does not contain a schematic drawing, an error +message is given and the ULP is terminated. +
+project.schematic(S) { ... } ++This will open a schematic context regardless whether the current editor window +contains a schematic or a board drawing. However, there must be an editor +window containing that schematic somewhere on the desktop! +
+if (schematic) + schematic(S) { + S.parts(P) + printf("Part: %s\n", P.name); + } ++ + + +
+The sheet statement opens a sheet context if the current editor +window contains a sheet drawing. A variable of type +UL_SHEET is created and is given +the name indicated by identifier. +
+Once the sheet context is successfully opened and a sheet variable has been +created, the statement is executed. Within the scope of the +statement the sheet variable can be accessed to retrieve further +data from the sheet. +
+If the current editor window does not contain a sheet drawing, an error +message is given and the ULP is terminated. +
+if (sheet) + sheet(S) { + S.parts(P) + printf("Part: %s\n", P.name); + } ++ + + +
+The symbol statement opens a symbol context if the current editor +window contains a symbol drawing. A variable of type +UL_SYMBOL is created and is given +the name indicated by identifier. +
+Once the symbol context is successfully opened and a symbol variable has been +created, the statement is executed. Within the scope of the +statement the symbol variable can be accessed to retrieve further +data from the symbol. +
+If the current editor window does not contain a symbol drawing, an error +message is given and the ULP is terminated. +
+if (symbol) + symbol(S) { + S.pins(P) + printf("Pin: %s\n", P.name); + } ++ + + +
+The following sections describe User Language Dialogs in detail: +
+
Predefined Dialogs | describes the ready to use standard dialogs | |
Dialog Objects | defines the objects that can be used in a dialog | |
Layout Information | explains how to define the location of objects within a dialog | |
Dialog Functions | describes special functions for use with dialogs | |
A Complete Example | shows a complete ULP with a data entry dialog |
+The following predefined dialogs are available: +
+See Dialog Objects for information on how to +define your own complex user dialogs. + + + ++The dlgDirectory function displays a directory dialog from which the user can +select a directory. +
+Title will be used as the dialog's title. +
+If Start is not empty, it will be used as the starting point for the dlgDirectory. +
+string dirName; +dirName = dlgDirectory("Select a directory", ""); ++ + + +
+The dlgFileOpen and dlgFileSave functions display a file dialog from which the user can +select a file. +
+Title will be used as the dialog's title. +
+If Start is not empty, it will be used as the starting point for the file dialog. +Otherwise the current directory will be used. +
+Only files matching Filter will be displayed. If Filter is empty, all files will +be displayed. +
+Filter can be either a simple wildcard (as in "*.brd"), a list of +wildcards (as in "*.bmp *.jpg") or may even contain descriptive text, as in +"Bitmap files (*.bmp)". If the "File type" combo box of the file dialog shall +contain several entries, they have to be separated by double semicolons, as in +"Bitmap files (*.bmp);;Other images (*.jpg *.png)". +
+string fileName; +fileName = dlgFileOpen("Select a file", "", "*.brd"); ++ + + +
+The dlgMessageBox function displays the given Message in a modal dialog and +waits until the user selects one of the buttons defined in button_list. +
+If Message contains any HTML tags, the characters '<', '>' and '&' +must be given as "<", ">" and "&", respectively, if they shall +be displayed as such. +
+button_list is an optional list of comma separated strings, which defines the
+set of buttons that will be displayed at the bottom of the message box.
+A maximum of three buttons can be defined.
+If no button_list is given, it defaults to "OK".
+
+The first button in button_list will become the default button (which will be selected +if the user hits ENTER), and the last button in the list will become the "cancel button", which +is selected if the user hits ESCape or closes the message box. You can make a different +button the default button by starting its name with a '+', and you can make +a different button the cancel button by starting its name with a '-'. +To start a button text with an actual '+' or '-' it has to be escaped. +
+If a button text contains an '&', the character following the ampersand +will become a hotkey, and when the user hits the corresponding key, that button will be selected. +To have an actual '&' character in the text it has to be escaped. +
+The message box can be given an icon by setting the first character of Message to
+ ';' - for an Information
+ '!' - for a Warning
+ ':' - for an Error
+If, however, the Message shall begin with one of these characters, it has to be escaped.
+
+
+On Mac OS X only the character ':' will actually result in +showing an icon. All others are ignored. + |
+if (dlgMessageBox("!Are you sure?", "&Yes", "&No") == 0) { + // let's do it! + } ++ + + +
+
dlgCell | a grid cell context | |
dlgCheckBox | a checkbox | |
dlgComboBox | a combo box selection field | |
dlgDialog | the basic container of any dialog | |
dlgGridLayout | a grid based layout context | |
dlgGroup | a group field | |
dlgHBoxLayout | a horizontal box layout context | |
dlgIntEdit | an integer entry field | |
dlgLabel | a text label | |
dlgListBox | a list box | |
dlgListView | a list view | |
dlgPushButton | a push button | |
dlgRadioButton | a radio button | |
dlgRealEdit | a real entry field | |
dlgSpacing | a layout spacing object | |
dlgSpinBox | a spin box selection field | |
dlgStretch | a layout stretch object | |
dlgStringEdit | a string entry field | |
dlgTabPage | a tab page | |
dlgTabWidget | a tab page container | |
dlgTextEdit | a text entry field | |
dlgTextView | a text viewer field | |
dlgVBoxLayout | a vertical box layout context |
+
+
+
+dlgCell
+
+
+See also dlgGridLayout,
+dlgHBoxLayout,
+dlgVBoxLayout,
+Layout Information,
+A Complete Example
+
+The dlgCell statement defines the location of a cell within a +grid layout context. +
+The row and column indexes start at 0, so the upper left cell has the index (0, 0). +
+With two parameters the dialog object defined by statement will be placed in +the single cell addresses by row and column. +With four parameters the dialog object will span over all cells from row/column +to row2/column2. +
+By default a dlgCell contains a dlgHBoxLayout, +so if the cell contains more than one dialog object, they will be placed next to +each other horizontally. +
+string Text; +dlgGridLayout { + dlgCell(0, 0) dlgLabel("Cell 0,0"); + dlgCell(1, 2, 4, 7) dlgTextEdit(Text); + } ++ + + +
+The dlgCheckBox statement defines a check box with the given Text. +
+If Text contains an '&', the character following the ampersand +will become a hotkey, and when the user hits Alt+hotkey, the checkbox will be toggled. +To have an actual '&' character in the text it has to be escaped. +
+dlgCheckBox is mainly used within a dlgGroup,
+but can also be used otherwise.
+All check boxes within the same dialog must have different Checked variables!
+
+If the user checks a dlgCheckBox, the associated Checked variable is set +to 1, otherwise it is set to 0. +The initial value of Checked defines whether a checkbox is initially checked. +If Checked is not equal to 0, the checkbox is initially checked. +
+The optional statement is executed every time the dlgCheckBox is toggled. +
+int mirror = 0; +int rotate = 1; +int flip = 0; +dlgGroup("Orientation") { + dlgCheckBox("&Mirror", mirror); + dlgCheckBox("&Rotate", rotate); + dlgCheckBox("&Flip", flip); + } ++ + + +
+The dlgComboBox statement defines a combo box selection field with the contents +of the given array. +
+Selected reflects the index of the selected combo box entry. The first entry has index 0. +
+Each element of array defines the contents of one entry in the combo box. +None of the strings in array may be empty (if there is an empty string, +all strings after and including that one will be dropped). +
+The optional statement is executed whenever the selection in the dlgComboBox changes.
+Before the statement is executed, all variables that have been used with dialog objects
+are updated to their current values, and any changes made to these variables inside the
+statement will be reflected in the dialog when the statement returns.
+
+If the initial value of Selected is outside the range of the array +indexes, it is set to 0. +
+string Colors[] = { "red", "green", "blue", "yellow" }; +int Selected = 2; // initially selects "blue" +dlgComboBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+The dlgDialog function executes the dialog defined by +block. +This is the only dialog object that actually is a User Language builtin +function. Therefore it can be used anywhere where a function call is allowed. +
+The block normally contains only other dialog objects, +but it is also possible to use other User Language statements, for example to conditionally add +objects to the dialog (see the second example below). +
+By default a dlgDialog contains a dlgVBoxLayout, +so a simple dialog doesn't have to worry about the layout. +
+A dlgDialog should at some point contain a call to the dlgAccept() +function in order to allow the user to close the dialog and accept its contents. +
+If all you need is a simple message box or file dialog you might want to use one of the +Predefined Dialogs instead. +
+int Result = dlgDialog("Hello") { + dlgLabel("Hello world"); + dlgPushButton("+OK") dlgAccept(); + }; +int haveButton = 1; +dlgDialog("Test") { + dlgLabel("Start"); + if (haveButton) + dlgPushButton("Here") dlgAccept(); + }; ++ + + +
+The dlgGridLayout statement opens a grid layout context. +
+The only dialog object that can be used directly in statement is +dlgCell, which defines the location of a particular +dialog object within the grid layout. +
+The row and column indexes start at 0, so the upper left cell has the index (0, 0).
+The number of rows and columns is automatically extended according to the location of
+dialog objects that are defined within the grid layout context, so you don't have
+to explicitly define the number of rows and columns.
+
+dlgGridLayout { + dlgCell(0, 0) dlgLabel("Row 0/Col 0"); + dlgCell(1, 0) dlgLabel("Row 1/Col 0"); + dlgCell(0, 1) dlgLabel("Row 0/Col 1"); + dlgCell(1, 1) dlgLabel("Row 1/Col 1"); + } ++ + + +
+The dlgGroup statement defines a group with the given Title. +
+By default a dlgGroup contains a dlgVBoxLayout, +so a simple group doesn't have to worry about the layout. +
+dlgGroup is mainly used to contain a set of radio buttons
+or check boxes, but may as well contain any other objects in its
+statement.
+Radio buttons within a dlgGroup are numbered starting with 0.
+
+int align = 1; +dlgGroup("Alignment") { + dlgRadioButton("&Top", align); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + } ++ + + +
+The dlgHBoxLayout statement opens a horizontal box layout context for the given +statement. +
+dlgHBoxLayout { + dlgLabel("Box 1"); + dlgLabel("Box 2"); + dlgLabel("Box 3"); + } ++ + + +
+The dlgIntEdit statement defines an integer entry field with the given Value. +
+If Value is initially outside the range defined by Min and Max +it will be limited to these values. +
+int Value = 42; +dlgHBoxLayout { + dlgLabel("Enter a &Number between 0 and 99"); + dlgIntEdit(Value, 0, 99); + } ++ + + +
+The dlgLabel statement defines a label with the given Text. +
+Text can be either a string literal, as in "Hello", or a string variable. +
+If Text contains any HTML tags, the characters '<', '>' and '&' +must be given as "<", ">" and "&", respectively, if they shall +be displayed as such. +
+If the Update parameter is not 0 and Text is a string variable, +its contents can be modified in the statement of, e.g., a dlgPushButton, +and the label will be automatically updated. This, of course, is only +useful if Text is a dedicated string variable (not, e.g., the loop variable of +a for statement). +
+If Text contains an '&', and the object following the label +can have the keyboard focus, the character following the ampersand +will become a hotkey, and when the user hits Alt+hotkey, the focus will go to the +object that was defined immediately following the dlgLabel. +To have an actual '&' character in the text it has to be escaped. +
+string OS = "Windows"; +dlgHBoxLayout { + dlgLabel(OS, 1); + dlgPushButton("&Change OS") { OS = "Linux"; } + } ++ + + +
+The dlgListBox statement defines a list box selection field with the contents +of the given array. +
+Selected reflects the index of the selected list box entry. The first entry has index 0. +
+Each element of array defines the contents of one line in the list box. +None of the strings in array may be empty (if there is an empty string, +all strings after and including that one will be dropped). +
+The optional statement is executed whenever the user double clicks on an entry
+of the dlgListBox.
+Before the statement is executed, all variables that have been used with dialog objects
+are updated to their current values, and any changes made to these variables inside the
+statement will be reflected in the dialog when the statement returns.
+
+If the initial value of Selected is outside the range of the array +indexes, no entry will be selected. +
+string Colors[] = { "red", "green", "blue", "yellow" }; +int Selected = 2; // initially selects "blue" +dlgListBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+The dlgListView statement defines a multi column list view selection field with the contents +of the given array. +
+Headers is the tab separated list of column headers. +
+Selected reflects the index of the selected list view entry in the array
+(the sequence in which the entries are actually displayed may be different, because the contents
+of a dlgListView can be sorted by the various columns).
+The first entry has index 0.
+If no particular entry shall be initially selected, Selected should be
+initialized to -1.
+
+Sort defines which column should be used to sort the list view. The leftmost +column is numbered 1. The sign of this parameter defines the direction in which +to sort (positive values sort in ascending order). If Sort is 0 or +outside the valid number of columns, no sorting will be done. The returned value of +Sort reflects the column and sort mode selected by the user by clicking +on the list column headers. By default dlgListView sorts by the first +column, in ascending order. +
+Each element of array defines the contents of one line in the list view, +and must contain tab separated values. If there are fewer values in an element of array +than there are entries in the Headers string the remaining fields will be empty. +If there are more values in an element of array than there are entries in the +Headers string the superfluous elements will be silently dropped. +None of the strings in array may be empty (if there is an empty string, +all strings after and including that one will be dropped). +
+A list entry that contains line feeds ('\n') will be displayed in several +lines accordingly. +
+The optional statement is executed whenever the user double clicks on an entry
+of the dlgListView.
+Before the statement is executed, all variables that have been used with dialog objects
+are updated to their current values, and any changes made to these variables inside the
+statement will be reflected in the dialog when the statement returns.
+
+If the initial value of Selected is outside the range of the array +indexes, no entry will be selected. +
+If Headers is an empty string, the first element of the array is used +as the header string. Consequently the index of the first entry is then 1. +
+The contents of a dlgListView can be sorted by any column by clicking on +that column's header. Columns can also be swapped by "click&dragging" a column +header. Note that none of these changes will have any effect on the contents of the +array. +If the contents shall be sorted alphanumerically a numeric string[] array +can be used. +
+string Colors[] = { "red\tThe color RED", "green\tThe color GREEN", "blue\tThe color BLUE" }; +int Selected = 0; // initially selects "red" +dlgListView("Name\tDescription", Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]); ++ + + +
+The dlgPushButton statement defines a push button with the given Text. +
+If Text contains an '&', the character following the ampersand +will become a hotkey, and when the user hits Alt+hotkey, the button will be selected. +To have an actual '&' character in the text it has to be escaped. +
+If Text starts with a '+' character, this button will become the default
+button, which will be selected if the user hits ENTER.
+If Text starts with a '-' character, this button will become the cancel
+button, which will be selected if the user closes the dialog.
+CAUTION: Make sure that the statement of such a marked cancel button contains
+a call to dlgReject()! Otherwise the user may be unable
+to close the dialog at all!
+To have an actual '+' or '-' character as the first character of the text
+it has to be escaped.
+
+If the user selects a dlgPushButton, the given statement is executed.
+Before the statement is executed, all variables that have been used with dialog objects
+are updated to their current values, and any changes made to these variables inside the
+statement will be reflected in the dialog when the statement returns.
+
+int defaultWidth = 10; +int defaultHeight = 20; +int width = 5; +int height = 7; +dlgPushButton("&Reset defaults") { + width = defaultWidth; + height = defaultHeight; + } +dlgPushButton("+&Accept") dlgAccept(); +dlgPushButton("-Cancel") { if (dlgMessageBox("Are you sure?", "Yes", "No") == 0) dlgReject(); } ++ + + +
+The dlgRadioButton statement defines a radio button with the given Text. +
+If Text contains an '&', the character following the ampersand +will become a hotkey, and when the user hits Alt+hotkey, the button will be selected. +To have an actual '&' character in the text it has to be escaped. +
+dlgRadioButton can only be used within a dlgGroup.
+All radio buttons within the same group must use the same Selected variable!
+
+If the user selects a dlgRadioButton, the index of that button within the dlgGroup
+is stored in the Selected variable.
+The initial value of Selected defines which radio button is initially selected.
+If Selected is outside the valid range for this group, no radio button will be selected.
+In order to get the correct radio button selection, Selected must be set before
+the first dlgRadioButton is defined, and must not be modified between adding subsequent
+radio buttons. Otherwise it is undefined which (if any) radio button will be selected.
+
+The optional statement is executed every time the dlgRadioButton is selected. +
+int align = 1; +dlgGroup("Alignment") { + dlgRadioButton("&Top", align); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + } ++ + + +
+The dlgRealEdit statement defines a real entry field with the given Value. +
+If Value is initially outside the range defined by Min and Max +it will be limited to these values. +
+real Value = 1.4142; +dlgHBoxLayout { + dlgLabel("Enter a &Number between 0 and 99"); + dlgRealEdit(Value, 0.0, 99.0); + } ++ + + +
+The dlgSpacing statement defines additional space in a vertical or horizontal box layout context. +
+Size defines the number of pixels of the additional space. +
+dlgVBoxLayout { + dlgLabel("Label 1"); + dlgSpacing(40); + dlgLabel("Label 2"); + } ++ + + +
+The dlgSpinBox statement defines a spin box entry field with the given Value. +
+If Value is initially outside the range defined by Min and Max +it will be limited to these values. +
+int Value = 42; +dlgHBoxLayout { + dlgLabel("&Select value"); + dlgSpinBox(Value, 0, 99); + } ++ + + +
+The dlgStretch statement defines an empty stretchable space in a vertical or horizontal box layout context. +
+Factor defines the stretch factor of the space. +
+dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") { dlgAccept(); }; + dlgPushButton("Cancel") { dlgReject(); }; + } ++ + + +
+The dlgStringEdit statement defines a text entry field with the given Text. +
+string Name = "Linus"; +dlgHBoxLayout { + dlgLabel("Enter &Name"); + dlgStringEdit(Name); + } ++ + + +
+The dlgTabPage statement defines a tab page with the given Title containing +the given statement. +
+If Title contains an '&', the character following the ampersand +will become a hotkey, and when the user hits Alt+hotkey, this tab page will be opened. +To have an actual '&' character in the text it has to be escaped. +
+Tab pages can only be used within a dlgTabWidget. +
+By default a dlgTabPage contains a dlgVBoxLayout, +so a simple tab page doesn't have to worry about the layout. +
+dlgTabWidget { + dlgTabPage("Tab &1") { + dlgLabel("This is page 1"); + } + dlgTabPage("Tab &2") { + dlgLabel("This is page 2"); + } + } ++ + + +
+The dlgTabWidget statement defines a container for a set of tab pages. +
+statement must be a sequence of one or more dlgTabPage objects. +There must be no other dialog objects in this sequence. +
+dlgTabWidget { + dlgTabPage("Tab &1") { + dlgLabel("This is page 1"); + } + dlgTabPage("Tab &2") { + dlgLabel("This is page 2"); + } + } ++ + + +
+The dlgTextEdit statement defines a multiline text entry field with the given Text. +
+The lines in the Text have to be delimited by a newline character ('\n'). +Any whitespace characters at the end of the lines contained in Text will be +removed, and upon return there will be no whitespace characters at the end of the lines. +Empty lines at the end of the text will be removed entirely. +
+string Text = "This is some text.\nLine 2\nLine 3"; +dlgVBoxLayout { + dlgLabel("&Edit the text"); + dlgTextEdit(Text); + } ++ + + +
+The dlgTextView statement defines a multiline text viewer field with the given Text. +
+The Text may contain HTML tags. +
+If Link is given and the Text contains hyperlinks, statement +will be executed every time the user clicks on a hyperlink, with the value of Link +set to whatever the <a href=...> tag defines as the value of href. +If, after the execution of statement, the Link variable is not empty, +the default handling of hyperlinks will take place. This is also the case if Link +contains some text before dlgTextView is opened, which allows for an initial +scrolling to a given position. +
+string Text = "This is some text.\nLine 2\nLine 3"; +dlgVBoxLayout { + dlgLabel("&View the text"); + dlgTextView(Text); + } ++ + + +
+The dlgVBoxLayout statement opens a vertical box layout context for the given +statement. +
+By default a dlgDialog contains a dlgVBoxLayout, +so a simple dialog doesn't have to worry about the layout. +
+dlgVBoxLayout { + dlgLabel("Box 1"); + dlgLabel("Box 2"); + dlgLabel("Box 3"); + } ++ + + +
+Layout contexts can be either grid, horizontal +or vertical. +
+dlgGridLayout { + dlgCell(5, 2) dlgLabel("Text"); + } ++If the object shall span over more than one cell you need to specify the coordinates of the +starting cell and the ending cell. To place a group that extends from row 1, column 2 up to row 3, +column 5, you would write +
+dlgGridLayout { + dlgCell(1, 2, 3, 5) dlgGroup("Title") { + //... + } + } ++
+The special objects dlgStretch and dlgSpacing +can be used to further refine the distribution of the available space. +
+To define two buttons that are pushed all the way to the right edge of the dialog, +you would write +
+dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("Cancel") dlgReject(); + } ++
+
dlgAccept() | closes the dialog and accepts its contents | |
dlgRedisplay() | immediately redisplays the dialog after changes to any values | |
dlgReset() | resets all dialog objects to their initial values | |
dlgReject() | closes the dialog and rejects its contents |
+The dlgAccept function causes the dlgDialog to be closed +and return after the current statement sequence has been completed. +
+Any changes the user has made to the dialog values will be accepted and are copied into +the variables that have been given when the dialog objects +were defined. +
+The optional Result is the value that will be returned by the dialog. +Typically this should be a positive integer value. +If no value is given, it defaults to 1. +
+Note that dlgAccept() does return to the normal program execution, +so in a sequence like +
+dlgPushButton("OK") { + dlgAccept(); + dlgMessageBox("Accepting!"); + } ++the statement after dlgAccept() will still be executed! +
+int Result = dlgDialog("Test") { + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + }; ++ + + +
+The dlgRedisplay function can be called to immediately refresh the +dlgDialog after changes have been made to the variables +used when defining the dialog objects. +
+You only need to call dlgRedisplay() if you want the dialog to be refreshed +while still executing program code. In the example below the status is changed +to "Running..." and dlgRedisplay() has to be called to make this change +take effect before the "program action" is performed. After the final status +change to "Finished." there is no need to call dlgRedisplay(), since +all dialog objects are automatically updated after leaving the statement. +
+string Status = "Idle"; +int Result = dlgDialog("Test") { + dlgLabel(Status, 1); // note the '1' to tell the label to be updated! + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + dlgPushButton("Run") { + Status = "Running..."; + dlgRedisplay(); + // some program action here... + Status = "Finished."; + } + }; ++ + + +
+The dlgReset function copies the initial values back into all +dialog objects of the current +dlgDialog. +
+Any changes the user has made to the dialog values will be discarded. +
+Calling dlgReject() implies a call +to dlgReset(). +
+int Number = 1; +int Result = dlgDialog("Test") { + dlgIntEdit(Number); + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + dlgPushButton("Reset") dlgReset(); + }; ++ + + +
+The dlgReject function causes the dlgDialog to be closed +and return after the current statement sequence has been completed. +
+Any changes the user has made to the dialog values will be discarded. +The variables that have been given when the dialog objects +were defined will be reset to their original values when the dialog returns. +
+The optional Result is the value that will be returned by the dialog. +Typically this should be 0 or a negative integer value. +If no value is given, it defaults to 0. +
+Note that dlgReject() does return to the normal program execution, +so in a sequence like +
+dlgPushButton("Cancel") { + dlgReject(); + dlgMessageBox("Rejecting!"); + } ++the statement after dlgReject() will still be executed! +
+Calling dlgReject() implies a call to dlgReset(). +
+int Result = dlgDialog("Test") { + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + }; ++ + + +
+To do this you need to prepend the character with a backslash, as in +
+dlgLabel("Miller \\& Co."); ++This will result in "Miller & Co." displayed in the dialog. +
+Note that there are actually two backslash characters here, since this line
+will first go through the User Language parser, which will strip the first backslash.
+
+
+
+A Complete Example
+Here's a complete example of a User Language Dialog.
+
+int hor = 1;
+int ver = 1;
+string fileName;
+int Result = dlgDialog("Enter Parameters") {
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel("This is a simple dialog");
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgGroup("Horizontal") {
+ dlgRadioButton("&Top", hor);
+ dlgRadioButton("&Center", hor);
+ dlgRadioButton("&Bottom", hor);
+ }
+ dlgGroup("Vertical") {
+ dlgRadioButton("&Left", ver);
+ dlgRadioButton("C&enter", ver);
+ dlgRadioButton("&Right", ver);
+ }
+ }
+ dlgHBoxLayout {
+ dlgLabel("File &name:");
+ dlgStringEdit(fileName);
+ dlgPushButton("Bro&wse") {
+ fileName = dlgFileOpen("Select a file", fileName);
+ }
+ }
+ dlgGridLayout {
+ dlgCell(0, 0) dlgLabel("Row 0/Col 0");
+ dlgCell(1, 0) dlgLabel("Row 1/Col 0");
+ dlgCell(0, 1) dlgLabel("Row 0/Col 1");
+ dlgCell(1, 1) dlgLabel("Row 1/Col 1");
+ }
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("Cancel") dlgReject();
+ }
+ };
+
+
+
+
+Supported HTML tags
+EAGLE supports a subset of the tags used to format HTML pages.
+This can be used to format the text of several User Language Dialog objects,
+in the #usage directive or in the description
+of library objects.
+
+Text is considered to be HTML if the first line contains a tag. +If this is not the case, and you want the text to be formatted, you need to +enclose the entire text in the <html>...</html> tag. +
+The following table lists all supported HTML tags and their available attributes: +
+
Tag | Description | |
<html>...</html> | An HTML document. It understands the following attributes
+
| |
<h1>...</h1> | A top-level heading. | |
<h2>...</h2> | A sub-level heading. | |
<h3>...</h3> | A sub-sub-level heading. | |
<p>...</p> | A left-aligned paragraph. Adjust the alignment with the align attribute. Possible values are left, right and center. | |
<center>...</center> | A centered paragraph. | |
<blockquote>...</blockquote> | An indented paragraph, useful for quotes. | |
<ul>...</ul> | An un-ordered list. You can also pass a type argument to define the bullet style. The default is type=disc, other types are circle and square. | |
<ol>...</ol> | An ordered list. You can also pass a type argument to define the enumeration label style. The default is type="1", other types are "a" and "A". | |
<li>...</li> | A list item. This tag can only be used within the context of ol or ul. | |
<pre>...</pre> | For larger chunks of code. Whitespaces in the contents are preserved. For small bits of code, use the inline-style code. | |
<a>...</a> | An anchor or link. It understands the following attributes:
+
| |
<em>...</em> | Emphasized (same as <i>...</i>). | |
<strong>...</strong> | Strong (same as <b>...</b>). | |
<i>...</i> | Italic font style. | |
<b>...</b> | Bold font style. | |
<u>...</u> | Underlined font style. | |
<big>...</big> | A larger font size. | |
<small>...</small> | A smaller font size. | |
<code>...</code> | Indicates Code. (same as <tt>...</tt>. For larger chunks of code, use the block-tag pre. | |
<tt>...</tt> | Typewriter font style. | |
<font>...</font> | Customizes the font size, family and text color. The tag understands the following attributes:
+
| |
<img...> | An image. This tag understands the following attributes:
+
| |
<hr> | A horizonal line. | |
<br> | A line break. | |
<nobr>...</nobr> | No break. Prevents word wrap. | |
<table>...</table> | A table definition.
+The default table is frameless. Specify the boolean attribute
+border in order to get a frame. Other attributes are:
+
| |
<tr>...</tr> | A table row. Can only be used within table. Understands the attribute
+
| |
<td>...</td> | A table data cell. Can only be used within tr. Understands the attributes
+
| |
<th>...</th> | A table header cell. Like td but defaults to center-alignment and a bold font. | |
<author>...</author> | Marks the author of this text. | |
<dl>...</dl> | A definition list. | |
<dt>...</dt> | A definition tag. Can only be used within dl. | |
<dd>...</dd> | Definition data. Can only be used within dl. |
+
Tag | Meaning | |
< | < | |
> | > | |
& | & | |
| non-breaking space | |
ä | ä | |
ö | ö | |
ü | ü | |
Ä | Ä | |
Ö | Ö | |
Ü | Ü | |
ß | ß | |
© | © | |
° | ° | |
µ | µ | |
± | ± |
+.x#n ++In this pattern 'x' is replaced by the character +
+'b' for board files
+'s' for schematic files
+'l' for library files
+
+'n' stands for a single digit number in +the range 1..9. Higher numbers indicate older files. +
+The fixed '#' character makes it easy to delete all backup files +from the operating system, using *.?#? as a wildcard. +
+Note that backup files with the same number 'n' do not necessarily +represent consistent combinations of board and schematic files! +
+The maximum number of backup copies can be set in the +backup dialog. +
+This safety backup file will have a name that follows the pattern +
+.x## ++In this pattern 'x' is replaced by the character +
+'b' for board files
+'s' for schematic files
+'l' for library files
+
+The safety backup file will be deleted after a successful regular save +operation. If the drawing has not been saved with the WRITE command +(e.g. due to a power failure) this file can be renamed and loaded as a +normal board, schematic or library file, repectively. +
+The auto backup interval can be set in the backup dialog.
+
+
+
+
+Normally a board and schematic will always be consistent as long as they
+have never been edited separately (in which case the message
+"No Forward&Back Annotation will be performed!"
+will have warned you).
+
+When loading a pair of board and schematic files the program will check
+some consistency markers in the data files to see if these two files are
+still consistent. If these markers indicate an inconsistency, you will be
+offered to run an Electrical Rule Check (ERC),
+which will do a detailed cross-check on both files.
+
+If this check turns out positive, the two files are marked as consistent
+and Forward&Back Annotation will be activated.
+
+If the two files are found to be inconsistent the ERC protocol file will
+be brought up in a dialog and Forward&Back Annotation will
+not be activated.
+
+Please do not be alarmed if you get a lot
+of inconsistency messages. In most cases fixing one error (like renaming
+a part or a net) will considerably reduce the number of error messages you get in the next
+ERC run.
+
+CadSoft Computer
+Forward&Back Annotation
+A schematic and board file are logically interconnected through automatic
+Forward&Back Annotation. Normally there are no special things to be
+considered about Forward&Back Annotation. This section, however, lists all of the
+details about what exactly happens during f/b activities:
+
+
+
+
+
+Consistency Check
+In order to use Forward&Back Annotation a board and schematic
+must be consistent, which means they must contain an equivalent set of
+parts/elements and nets/signals.
+Making a Board and Schematic consistent
+To make an inconsistent pair of board and schematic files consistent, you
+have to manually fix any inconsistency listed in the ERC protocol.
+This can be done by applying editor commands like
+NAME,
+VALUE,
+PINSWAP,
+REPLACE etc.
+After fixing the inconsistencies you must use the
+ERC command again to check the files and
+eventually activate Forward&Back Annotation.
+
+
+
+Limitations
+The following actions are not allowed in a board when Back Annotation
+is active (i.e. the schematic is loaded, too):
+
+
+If you try to do one of the above things, you will receive a message
+telling you that this operation cannot be backannotated. In such a
+case please do the necessary operations in the schematic (they will
+then be forward annotated to the board). If you absolutely have to
+do it in the board, you can close the schematic window and then do
+anything you like inside the board. In that case, however, board and
+schematic will not be consistent any more!
+
+
+
+Technical Support
+As a registered EAGLE user you get free technical support from CadSoft.
+There are several ways to contact us or obtain the latest part libraries,
+drivers or program versions:
+
+19620 Pines Blvd. Suite 217
+Pembroke Pines, FL 33029
+USA
+
Phone | 954-237-0932 | |
Fax | 954-237-0968 | |
support@cadsoftusa.com | ||
URL | www.cadsoftusa.com |
+Under Mac OS X you can find this information under "EAGLE/About EAGLE". + |
+There are different types of licenses, varying in the number of users +who may use the program and in the areas of application the program +may be used in: +
+A typical application of this kind would be a user who has a PC at home +and also a notebook or laptop computer which he uses "on the road". As +he would only use one of these computers at a time it is ok to have EAGLE +installed on both of them. +
+In the dialog "EAGLE License" enter the name of your EAGLE license file, as well +as the corresponding Installation Code you have received together with your +license file (this code consists of 10 lowercase characters). +
+After pressing enter or clicking on the +OK +button, EAGLE will be installed with your personalized license data. +
+If you have problems installing EAGLE or are in doubt about the +validity of your license please contact our +Technical Support staff for +assistance. +
+If you receive an error message like +
+The Light edition of EAGLE can't perform the requested action! +
+this means that you are attempting to do something that would violate +the limitations that apply to the EAGLE edition in use, like for example +placing an element outside of the allowed area. +
+Both the Standard and Light edition of EAGLE can be +used to view files created with the Professional edition, +even if these drawings exceed the editing capabilities of the edition +currently in use. +
+To check which edition your license has enabled, select
+Help/About EAGLE from the Control Panel's menu.
+
+
+
diff --git a/eagle-5.7.0/bin/eagleicon16.png b/eagle-5.7.0/bin/eagleicon16.png
new file mode 100644
index 0000000..bb8d979
Binary files /dev/null and b/eagle-5.7.0/bin/eagleicon16.png differ
diff --git a/eagle-5.7.0/bin/eagleicon50.png b/eagle-5.7.0/bin/eagleicon50.png
new file mode 100644
index 0000000..fed0a01
Binary files /dev/null and b/eagle-5.7.0/bin/eagleicon50.png differ
diff --git a/eagle-5.7.0/bin/freeware.key b/eagle-5.7.0/bin/freeware.key
new file mode 100644
index 0000000..98bd054
--- /dev/null
+++ b/eagle-5.7.0/bin/freeware.key
@@ -0,0 +1,86 @@
+CadSoft License Registration File - Copyright (c) 2010 CadSoft
+
+Installation Code: enxrntrtnl
+
+ Registered user: Freeware license for "non-profit"
+ and evaluation purposes. See the
+ file "freeware.key" or the URL
+ "www.cadsoft.de/freeware.htm"
+
+ Product: EAGLE
+ Serial number: 62191E841E
+ Modules: Layout Editor, Schematic Editor, Ripup Router
+ Platforms: Windows, Linux, Mac
+ Users: 1
+ Type: Educational
+ Edition: Light
+ Program version: 5
+ Expiration date: none
+
+-----------------------------------------------------------------------------
+Freeware License
+
+The "Freeware" version of EAGLE Light is limited to "non-profit" or
+evaluation use. By "non-profit" we mean that as soon as you earn money
+by using EAGLE, you have to register it! This allows anybody who wishes
+to use EAGLE Light for their private hobby projects to do so. Also students
+can use this version for any educational projects. It is even ok to use this
+version in a commercial environment as long as you just want to evaluate the
+program. As soon as you start using it for commercial projects, you will
+have to register it.
+
+For more details please see "www.cadsoft.de/freeware.htm".
+
+The Freeware version of EAGLE Light is copyright protected software,
+(c) 2010 CadSoft Computer GmbH, all rights reserved worldwide. No part of
+the executable files that come with EAGLE nor the freeware.key file that
+implements the Freeware license may be altered in any way.
+CadSoft reserves the right to decide whether to continue this Freeware
+program with the next version of EAGLE.
+-----------------------------------------------------------------------------
+
+Registration Data:
+
+86 5C 53 CF 05 43 E0 90 E9 49 B1 BD C4 86 E7 F9 7A
+87 AE 6F 6C 24 64 CD 5B DC EC 8C 86 4A 87 46 D8 77
+C9 97 C1 9A 0C 0C 5E F4 8B 76 3F 23 E1 D8 69 90 C6
+F6 CC B9 27 5C 3F 2C 22 54 1E 34 69 D5 1F 0C 7A EC
+96 7A 7A D9 A6 99 97 93 80 AB CF C3 20 90 88 27 18
+45 64 5B 88 45 7E F2 1C AA AE 7D D9 BB 46 47 E9 C4
+6C CF 30 C4 9C 75 D5 65 51 B4 57 3F 1C 4D 35 8D C0
+EA 95 80 78 05 25 AC BD 4B 64 AF 81 8C 54 4E 31 B8
+51 8A 65 45 8E 02 76 34 77 A8 9D A0 8D 27 13 37 E7
+13 D9 EF 44 2D 70 FD F1 BC 0E FC 24 77 36 D0 37 B8
+26 D0 83 EA B3 97 9C BE C5 89 57 81 BB 38 FC 6D 77
+4A 81 C5 D3 78 15 23 A5 BC E8 22 76 8B C3 91 36 F7
+28 F0 1B 92 02 66 4E 6D 42 4D 43 2F 7B 30 60 11 FB
+16 B9 97 B3 36 B2 4C FA 37 F8 4B FA 22 86 D2 A7 24
+CE 55 FF 61 9D 8A D2 EB 51 64 F4 2B 7C 57 69 7B 0E
+47 F6 D5 28 70 DA 3E 03 79 D6 0F 98 E5 26 ED CB 82
+87 48 2E FF 98 EA D1 A9 9C 09 62 40 8C 74 72 B5 9A
+
+begin-base64 A
+zCxdgMawcOV2/LJUoE8TbYD2cQOa2i1M1OgXzgCZxlJNPH3z2aJqdGIGCNI+E/G4
+a6SzieODxsqkTLCjIxB7TiCQ69SLmIm+J3Pi84dFjLuIUhl1F2K6MuTWYOYU0Yk5
+DkFkspiaDFDDGWWULu0h9Hfs8CxxZhd1o8AprXlzUsbxRp6Ie00HOFtahIdiPQkK
+tCkUWzpX2PHCKfXtxqQOjRk/mMZVpj51uxjLIMgRnAp+Ih4WpXppBMozcsU0Le+V
+ENxFmyD6fWelujs9brWZ/ihkjUTR+KV/MjNIHI9jOm8R63m8cZkRBchmTdrIYvcC
+60nqNaaE1CuTmgY7QwjYVc9bSOwldtYa4mEq6XtBtRvrdtS+nGXKfdeWt+C8FmgJ
+sjAeFcYDfs6/+Y5Atf4I5ZAT8o5L1TFxxIAipeDMRU9HSk1nlnka2nFrLBHLG1W3
+6s3+YLPU9Ob5MhQZnE951uhWXu6wYXEqxXWMjr0UbYCuww112zi5FUQPpLWlSz3B
+BJTy5HB1hRyJpijVt61XUuzCKCRUO8CP7IoYXJUWW3FrgKnKOh29/mAZU1ZrvF75
+g6UvZQz0FJ3COJ9G2ThdaXHYBeYPjBR4RR1nBLZZBqvbgwoKCiTuQpCKcz/7i5nn
+SlUbIAYQO5iszxC5QAIgki0sdJcZzwHBrzSh12Zgs0YLRk3KrmwHeGB7kfyr4ul4
+J0oWrV11BeEXzQK2ED14vU063FcvxEBUsKzPFC4OAaQUm3UOTQ13fSvC5NKc/gWp
+XApivNROtYsc7r1r/j7oS7QeM7NVxeBRosFWXSZmiPMmc3vJyomhuwomPuvSgolE
+Y+S6CLoLAFfyhqKNZB10V4DzTeh8bKduae3/vFHap3KAu19q4QgGrc3udJDvVAv+
+lmlim+79t803uFZ/Qlv8cAg9ylpGb0fdiSlFRADdUl9RYt0ANJnbLGu7Nikf4Nbj
+pWDhTNwwFOhjmwq42rsJJ0EixAUrciYYtcDqUiwbHBI9VmV+Fl4oMJku7XPfBYtg
+n0ueSAcofvwI6aSxz1ZbQtuznrr1xaxnkQCYEoCqLBHkBLnKxFm7/Dqx5UeLYZtu
+hTUScxnoucFV3l24IRZuhzVSOr+RykgpfZHaO7kgX2tLUmLgg9Vza1kAC9CQeiD9
+cVjsDBbs7JN/yFPm64jeiWxKTfqCvI+ETdF2IQVm0yMz3iQRAaANzPE28evhp1qW
+ui/HQkZnqVng6rs3EvSG9Fb6Wn8RHyMaxjhN12PDHXelgfUXqxV+vBGiItCT3XZI
+Qg5NTH3DE7wzWZRwp0k+B957WHvnK/gCXjP/jirRe8adcqBSpX3pMbYy3AOonnOe
+gRO9MlEA8bC29cEexOIxH0d4mco=
+====
+
diff --git a/eagle-5.7.0/bin/platforms-lin.png b/eagle-5.7.0/bin/platforms-lin.png
new file mode 100644
index 0000000..a416721
Binary files /dev/null and b/eagle-5.7.0/bin/platforms-lin.png differ
diff --git a/eagle-5.7.0/bin/platforms-mac.png b/eagle-5.7.0/bin/platforms-mac.png
new file mode 100644
index 0000000..fdc1bf9
Binary files /dev/null and b/eagle-5.7.0/bin/platforms-mac.png differ
diff --git a/eagle-5.7.0/bin/platforms-win.png b/eagle-5.7.0/bin/platforms-win.png
new file mode 100644
index 0000000..a3bfe06
Binary files /dev/null and b/eagle-5.7.0/bin/platforms-win.png differ
diff --git a/eagle-5.7.0/bin/qt_de.qm b/eagle-5.7.0/bin/qt_de.qm
new file mode 100644
index 0000000..9ea09a7
Binary files /dev/null and b/eagle-5.7.0/bin/qt_de.qm differ
diff --git a/eagle-5.7.0/cam/DESCRIPTION b/eagle-5.7.0/cam/DESCRIPTION
new file mode 100644
index 0000000..6a51528
--- /dev/null
+++ b/eagle-5.7.0/cam/DESCRIPTION
@@ -0,0 +1,13 @@
+
+Der CAM-Prozessor stellt einen Job-Mechanismus zur Verfügung, mit
+dessen Hilfe die gesamte Erstellung der Ausgabedaten für eine
+Platine automatisiert werden kann.
+
+The CAM Processor provides a job mechanism with the aid of which
+the creation of the output data for a board can be automated.
+
\nDieser CAM-Job kann verwendet werden, um Bohrdaten im Excellon-Format für numerisch gesteuerte Bohrmaschinen zu erzeugen.
\nDer EXCELLON-Treiber erzeugt eine Bohrdatendatei, die bereits die\nBohrertabelle im Dateikopf enthält." +Description[en]="Generates Excellon Drill Data
\nThis CAM job can be used to generate data for drilling machines in Ecxellon format.
\nThe EXCELLON device generates a drill data file which contains the drill table in the header of the file.\n" +Section=Sec_1 + +[Sec_1] +Name[de]="Bohrdaten erzeugen" +Name[en]="Generate drill data" +Prompt="" +Device="EXCELLON" +Wheel=".whl" +Rack="" +Scale=1.000000 +Output="%N.drd" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.025000 0.025000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 44 45" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" diff --git a/eagle-5.7.0/cam/gerb274x-4layer.cam b/eagle-5.7.0/cam/gerb274x-4layer.cam new file mode 100644 index 0000000..e2e4bdc --- /dev/null +++ b/eagle-5.7.0/cam/gerb274x-4layer.cam @@ -0,0 +1,203 @@ +[CAM Processor Job] +Description[de]="Erzeugt Extended-Gerber-Format (RS274X) für eine 4-Lagen-Platine
\nDieser CAM-Job besteht aus zehn Schritten und erzeugt Fertigungsdaten für eine vierlagige Platine.
Achtung: Die Innenlagen werden als normale Innenlagen, nicht als Supply-Layer behandelt!
\nDie zehn Gerberdateien enthalten Daten für:
\nBestückungsseite *.cmp
\nLayer 2 (kein Supply-Layer!) *.ly2
\nLayer 15 (kein Supply-Layer!) *.l15
\nLötseite *.sol
\nBestückungsdruck oben *.plc
\nBestückungsdruck unten *.pls
\nLötstoplack Bestückungsseite *.stc
\nLötstoplack Lötseite *.sts
\nLotpastenmaske Bestückungsseite *.crc
\nLotpastenmaske Lötseite *.crs
"
+Description[en]="Generates Extended Gerber Format for a 4 layer board
\nThis CAM job consists of ten sections that generate data for a four layer board.
Note: The inner layers are treated as normal signal layers, not as supply layers!
\nYou will get ten Gerber files that contain data for:
\ncomponent side *.cmp
\ninner layer 2 (no supply layer!) *.ly2
\ninner layer 15 (no supply layer!) *.l15
\nsolder side *.sol
\nsilkscreen component side *.plc
\nsilkscreen solder side *.pls
\nsolder stop component side *.stc
\nsolder stop solder side *.sts
\ncream frame component side *.crc
\ncream frame solder side *.crs
"
+Section=Sec_1
+Section=Sec_2
+Section=Sec_3
+Section=Sec_4
+Section=Sec_5
+Section=Sec_6
+Section=Sec_7
+Section=Sec_8
+Section=Sec_9
+Section=Sec_10
+
+[Sec_1]
+Name[de]="Bestückungsseite"
+Name[en]="Component side"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.cmp"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 1 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_2]
+Name[de]="Innenlage - Layer2"
+Name[en]="Inner layer - Layer2"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.ly2"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 2 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_3]
+Name[de]="Innenlage - Layer15"
+Name[en]="Inner layer - Layer15"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.l15"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 15 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_4]
+Name[de]="Lötseite"
+Name[en]="Solder side"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sol"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 16 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_5]
+Name[de]="Bestückungsdruck oben"
+Name[en]="Silk screen CMP"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.plc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 20 21 25"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_6]
+Name[de]="Bestückungsdruck unten"
+Name[en]="Silk screen SOL"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.pls"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 20 22 26"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_7]
+Name[de]="Lötstopmaske Bestückungsseite"
+Name[en]="Solder stop mask CMP"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.stc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 29"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_8]
+Name[de]="Lötstopmaske Lötseite"
+Name[en]="Solder stop mask SOL"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sts"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 30"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_9]
+Name[de]="Lotpastenmaske oben"
+Name[en]="Cream frame CMP"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.crc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 31"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_10]
+Name[de]="Lotpastenmaske unten"
+Name[en]="Cream frame SOL"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.crs"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 32"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
diff --git a/eagle-5.7.0/cam/gerb274x.cam b/eagle-5.7.0/cam/gerb274x.cam
new file mode 100644
index 0000000..d1c4f3a
--- /dev/null
+++ b/eagle-5.7.0/cam/gerb274x.cam
@@ -0,0 +1,103 @@
+[CAM Processor Job]
+Description[de]="Erzeugt Extended-Gerber-Format (RS274X)
\nDieser CAM-Job besteht aus fünf Arbeitsschritten und erzeugt Fertigungsdaten für eine zweilagige Platine.
\nDie fünf Gerberdateien enthalten Daten für:
\nBestückungsseite *.cmp
\nLötseite *.sol
\nBestückungsdruck oben *.plc
\nLötstoplack Bestückungsseite *.stc
\nLötstoplack Lötseite *.sts
"
+Description[en]="Generates Extended Gerber Format
\nThis CAM job consists of five sections that generate data for a two layer board.
\nYou will get five gerber files that contain data for:
\ncomponent side *.cmp
\nsolder side *.sol
\nsilkscreen component side *.plc
\nsolder stop component side *.stc
\nsolder stop solder sid *.sts
"
+Section=Sec_1
+Section=Sec_2
+Section=Sec_3
+Section=Sec_4
+Section=Sec_5
+
+[Sec_1]
+Name[de]="Bestückungsseite"
+Name[en]="Component side"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.cmp"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 1 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_2]
+Name[de]="Lötseite"
+Name[en]="Solder side"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sol"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 16 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_3]
+Name[de]="Bestückungsdruck"
+Name[en]="Silk screen CMP"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.plc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 20 21 25"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_4]
+Name[de]="Lötstopmaske Bestückungsseite"
+Name[en]="Solder stop mask CMP"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.stc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 29"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_5]
+Name[de]="Lötstopmaske Lötseite"
+Name[en]="Solder stop mask SOL"
+Prompt[de]=""
+Device="GERBER_RS274X"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sts"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 30"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
diff --git a/eagle-5.7.0/cam/gerber.cam b/eagle-5.7.0/cam/gerber.cam
new file mode 100644
index 0000000..57b5597
--- /dev/null
+++ b/eagle-5.7.0/cam/gerber.cam
@@ -0,0 +1,124 @@
+[CAM Processor Job]
+Description[de]="Erzeugt Gerber-Format
\nDieser CAM-Job besteht aus sechs Arbeitsschritten und erzeugt dabei Fertigungsdaten für eine zweilagige Platine.
\nIm ersten Schritt wird einen Blendentabelle (Blenden-Konfigurations-Datei *.whl) erzeugt.
\nDie folgenden fünf Schritte generieren Daten im Gerber-Format (RS274D).
\n
\nDer Leiterplatten-Hersteller benötigt die Blendentabelle und die fünf Gerberdateien um die Platine zu fertigen:
\nBestückungsseite *.cmp
\nLötseite *.sol
\nBestückungsdruck oben *.plc
\nLötstopmaske Bestückungsseite *.stc
\nLötstopmaske Lötseite *.sts
\nUnd vergessen Sie nicht die Blendentabelle *.whl !
"
+Description[en]="Generates Gerber Format
\nThis CAM job consists of six sections that generate
\ndata for a two layer board.
\nThe first section generates a wheel file (aperture configuration file) *.whl.
\nThe following five section generate data files in Gerber (RS274D) format.
\n
\nThe board house needs the wheel file and five gerber files to make the board:
\ncomponent side *.cmp
\nsolder side *.sol
\nsilkscreen component side *.plc
\nsolder stop component side *.stc
\nsolder stop solder sid *.sts
\nAnd don't forget the wheel file *.whl !
"
+Section=Sec_1
+Section=Sec_2
+Section=Sec_3
+Section=Sec_4
+Section=Sec_5
+Section=Sec_6
+
+[Sec_1]
+Name[de]="Erzeugen der Blendentabelle"
+Name[en]="Generate a wheel file"
+Prompt[de]="Löschen Sie die Datei name.$$$ nach Beenden des Jobs!"
+Prompt[en]="Delete name.$$$ after job has been processed!"
+Device="GERBERAUTO"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.$$$"
+Flags="0 0 0 1 0 0 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0 0 0 0 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 1 16 17 18 20 21 25 29 30"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_2]
+Name[de]="Bestückungsseite"
+Name[en]="Component side"
+Prompt[de]=""
+Device="GERBER"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.cmp"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 1 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_3]
+Name[de]="Lötseite"
+Name[en]="Solder side"
+Prompt[de]=""
+Device="GERBER"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sol"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 16 17 18"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_4]
+Name[de]="Bestückungsdruck oben"
+Name[en]="Silk screen CMP"
+Prompt[de]=""
+Device="GERBER"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.plc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 20 21 25"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_5]
+Name[de]="Lötstopmaske Bestückungsseite"
+Name[en]="Solder stop mask CMP"
+Prompt[de]=""
+Device="GERBER"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.stc"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 29"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_6]
+Name[de]="Lötstopmaske Lötseite"
+Name[en]="Solder stop mask SOL"
+Prompt[de]=""
+Device="GERBER"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sts"
+Flags="0 0 0 1 0 1 1"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="12000.0mil 8000.0mil"
+Layers=" 30"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
diff --git a/eagle-5.7.0/cam/glaser.whl b/eagle-5.7.0/cam/glaser.whl
new file mode 100644
index 0000000..c893221
--- /dev/null
+++ b/eagle-5.7.0/cam/glaser.whl
@@ -0,0 +1,35 @@
+; Aperture file for Glaser DP-1504 fotoplotter
+
+; Basic "Draw" Apertures (will always work):
+
+SP1;SA1; draw 0.012
+SP1;SA2; draw 0.039
+SP2;SA1; draw 0.059
+SP2;SA2; draw 0.079
+
+; Emulated "Flash" Apertures (might not work because of a bug in the
+; plotter's firmware):
+
+;LB#027%\ round 0.012
+;LB#027&\ round 0.019
+;LB#027'\ round 0.025
+;LB#027(\ round 0.031
+;LB#027)\ round 0.039
+;LB#027*\ round 0.046
+;LB#027+\ round 0.052
+;LB#027,\ round 0.059
+;LB#027-\ round 0.066
+;LB#027.\ round 0.072
+;LB#027/\ round 0.079
+;LB#0270\ round 0.098
+;LB#0271\ round 0.118
+;LB#0272\ round 0.138
+;LB#0273\ round 0.157
+;LB#0274\ round 0.177
+;LB#0275\ round 0.197
+;LB#0276\ round 0.236
+;LB#0277\ round 0.315
+;LB#0278\ round 0.394
+;LB#027=\ square 0.063
+;LB#027>\ square 0.079
+;LB#027?\ square 0.157
diff --git a/eagle-5.7.0/cam/layout2.cam b/eagle-5.7.0/cam/layout2.cam
new file mode 100644
index 0000000..882ded4
--- /dev/null
+++ b/eagle-5.7.0/cam/layout2.cam
@@ -0,0 +1,43 @@
+[CAM Processor Job]
+Description[de]="Erzeugt Encapsulated-PostScript-Format (EPS)
\nBeispiel für cam2printer.ulp
\nDieser CAM-Job besteht aus zwei Schritten, die Daten
\n für eine zweilagige Platine erzeugen.
"
+Description[en]="Generates EPS Format
\nExample for cam2printer.ulp
\nThis CAM job consists of two sections that generate
\ndata for a two layer board.
"
+Section=Sec_1
+Section=Sec_2
+
+[Sec_1]
+Name[de]="Bestückungsseite"
+Name[en]="Component side"
+Prompt[de]=""
+Device="EPS"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.cmp"
+Flags="0 0 0 1 0 1 0"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="100000.0mil 100000.0mil"
+Layers=" 1 17 18 20"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
+
+[Sec_2]
+Name[de]="Lötseite"
+Name[en]="Solder side"
+Prompt[de]=""
+Device="EPS"
+Wheel=".whl"
+Rack=""
+Scale=1
+Output="%N.sol"
+Flags="0 0 0 0 0 0 0"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.01 0.01 0.01 0.01 0 0"
+Pen="0.0mil 0"
+Page="100000.0mil 100000.0mil"
+Layers=" 16 17 18 20"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
diff --git a/eagle-5.7.0/cam/schematic.cam b/eagle-5.7.0/cam/schematic.cam
new file mode 100644
index 0000000..33109cf
--- /dev/null
+++ b/eagle-5.7.0/cam/schematic.cam
@@ -0,0 +1,22 @@
+[CAM Processor Job]
+Description[de]="Beispiel für cam2printer.ulp
" +Description[en]="Example for cam2printer.ulp
"
+Section=Sec_1
+
+[Sec_1]
+Name="Schematic"
+Prompt=""
+Device="EPS"
+Wheel=""
+Rack=""
+Scale=1.000000
+Output="%N.eps"
+Flags="0 0 0 0 0 1 0"
+Emulate="0 0 0"
+Offset="0.0mil 0.0mil"
+Sheet=1
+Tolerance="0.000000 0.000000 0.000000 0.000000 0.000000 0.000000"
+Pen="0.0mil 0.000000"
+Page="100000.0mil 100000.0mil"
+Layers=" 16 17 18 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 94 95 96 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 122 124 126 127 128 129 130 131 132 133 134 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255"
+Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 1 1 1 1 1 1 8 1 8 1 8 1 8 8 8 8 8 4 4 1 1 1 1 3 3 1 1 1 1 1 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0"
diff --git a/eagle-5.7.0/doc/README_de b/eagle-5.7.0/doc/README_de
new file mode 100644
index 0000000..c416e56
--- /dev/null
+++ b/eagle-5.7.0/doc/README_de
@@ -0,0 +1,142 @@
+==============================================
+
+ E A G L E - L A Y O U T - S O F T W A R E
+ Hinweise zur Version 5.7.0
+
+==============================================
+
+Update von einer früheren Version
+---------------------------------
+
+WICHTIG: Falls Sie von einer früheren EAGLE-Version updaten, lesen Sie
+******* bitte die Datei doc/UPDATE komplett durch bevor Sie beginnen
+ mit dieser neuen Version zu arbeiten!
+
+Handbuch + Tutorial
+-------------------
+
+Das EAGLE-Handbuch und -Tutorial im PDF-Format befindet sich im Verzeichnis
+"doc". Bitte lesen Sie sich zumindest das Tutorial durch, bevor Sie mit
+EAGLE zu arbeiten beginnen.
+
+Minimale System-Voraussetzungen
+-------------------------------
+
+ - Intel-PC-basierendes Linux
+ - Kernel-Version 2.6
+ - X11 mit mindestens 8bpp Farbtiefe
+
+Installation
+------------
+
+Führen Sie das selbstentpackende Shell-Script eagle-lin-5.7.0.run
+aus und warten Sie, bis der EAGLE-Setup-Dialog erscheint (dies kann
+einige Sekunden dauern).
+Sollten Sie von einer CD-ROM installieren und keine Programme von CD
+ausführen können, so kann es erforderlich sein, das Script zunächst auf
+Ihre Festplatte zu kopieren.
+
+Falls Sie EAGLE aus einer Shell ohne grafische Anzeige heraus installieren
+wollen, können Sie das Script mit dem Namen des Verzeichnisses aufrufen,
+in das EAGLE installiert werden soll. Zum Beispiel würde
+
+ eagle-lin-5.7.0.run /opt
+
+EAGLE in das Verzeichnis '/opt/eagle-5.7.0' installieren.
+
+Benutzung
+---------
+
+Um EAGLE zu benutzen starten Sie einfach das Programm
+
+ /home/username/eagle-5.7.0/bin/eagle
+
+(vorausgesetzt, Sie haben EAGLE im vorgeschlagenen Verzeichnis unterhalb
+Ihres Benutzerverzeichnisses installiert).
+
+Grafikfehler beim Verschieben des Fensterinhaltes
+-------------------------------------------------
+
+Falls Sie Grafikfehler beim Verschieben des Fensterinhaltes feststellen,
+kann es sein, dass Sie den "Composite"-Modus in Ihren Grafikeinstellung
+abschalten müssen.
+Dies kann durch Hinzufügen folgender Zeilen zu Ihrer X-Konfigurationsdatei
+erfolgen:
+
+Section "Extensions"
+ Option "Composite" "Disable"
+EndSection
+
+Octagon-Blenden im Gerber RS-274X Format
+----------------------------------------
+
+Die verschiedenen auf dem Markt befindlichen Gerber-Viewer sind sich
+nicht einig darüber, wie im RS-274X-Format Octagon-Blenden darzustellen
+sind. Es gibt hier die unterschiedlichsten Auffassungen bezüglich der
+Interpretation des Durchmessers und der Rotation.
+EAGLE geht bei der Erzeugung von Octagon-Blenden im RS-274X-Format davon
+aus, dass der Viewer den Durchmesser als den Abstand zweier
+gegenüberliegender Eckpunkte interpretiert, und dass zur Erreichung der
+korrekten Rotation eine Drehung um 22.5 Grad nötig ist. Sollte Ihr
+spezieller Gerber-Viewer diese Daten anders interpretieren, so können Sie
+dies in der Datei 'eagle.def' den speziellen Gegebenheiten Ihres Viewers
+anpassen.
+
+WICHTIG: Bevor Sie Daten im RS-274X-Format an Ihren Leiterplattenhersteller
+schicken, sollten Sie sich unbedingt mit diesem in Verbindung setzen um zu
+erfragen, wie *seine* Software die Octagon-Daten interpretiert.
+
+Plattformen
+-----------
+
+Board-, Schematic- und Library-Dateien, die mit EAGLE Version 4.11 oder
+später erzeugt wurden, können zwischen Linux, Mac OS X und Windows
+ausgetauscht werden. Das binäre Datenformat ist auf allen Plattformen das
+selbe.
+
+Autorouter Job-Dateien, die mit EAGLE für Mac OS X auf der PPC-Plattform
+erzeugt wurden, können nicht mit anderen Versionen von EAGLE weiterverarbeitet
+werden (und umgekehrt).
+
+Drucken von Füllmustern
+-----------------------
+
+Das Drucken von Füllmustern in Postscript-Dateien funktioniert nicht.
+Wenn Sie Füllmuster ausgeben wollen, erzeugen Sie eine PDF-Datei
+und drucken dann diese Datei aus.
+
+Sprache
+-------
+
+EAGLE benutzt die selbe Sprache wie das Betriebssystem, auf dem es läuft
+(vorausgesetzt, die entsprechenden sprachspezifischen Text-Dateien sind
+vorhanden). Um dies zu überschreiben, können Sie die Umgebungsvariable
+LANG auf den gewünschten Wert setzen, wie in
+
+ SET LANG=en_US (unter Windows)
+
+bevor Sie EAGLE starten.
+
+
+ ===================
+========================= VERTRIEBSHINWEISE ===============================
+ ===================
+
+EAGLE ist ein Programm der: CadSoft Computer GmbH
+ Pleidolfweg 15
+ D-84568 Pleiskirchen
+ Tel. 08635/6989-10
+ Fax: 08635/6989-40
+ E-Mail: info@cadsoft.de
+ Web: http://www.cadsoft.de
+
+EAGLE ist verfügbar für Linux-, Mac OS X- und Windows-Rechner.
+
+===========================================================================
+"Linux" ist ein eingetragenes Warenzeichen von Linus Torvalds.
+"Mac", "Mac OS" und "Apple" sind eingetragene Warenzeichen von Apple Computer, Inc.
+"Windows" ist ein eingetragenes Warenzeichen der Microsoft Corporation.
+===========================================================================
+
+Copyright (c) 2010 CadSoft Computer GmbH - Alle Rechte vorbehalten
+
diff --git a/eagle-5.7.0/doc/README_en b/eagle-5.7.0/doc/README_en
new file mode 100644
index 0000000..8abc9ca
--- /dev/null
+++ b/eagle-5.7.0/doc/README_en
@@ -0,0 +1,147 @@
+==============================================
+
+ E A G L E - L A Y O U T - S O F T W A R E
+ Information about Version 5.7.0
+
+==============================================
+
+Updating from older versions
+----------------------------
+
+IMPORTANT: If you are updating from an older version of EAGLE, please make
+********* sure you read the file doc/UPDATE entirely before working
+ with this new version!
+
+Manual + Tutorial
+-----------------
+
+The EAGLE manual and tutorial in PDF format can be found in the "doc"
+subdirectory. Please make sure you read at least the tutorial before
+beginning to work with EAGLE.
+
+Minimum System Requirements
+---------------------------
+
+ - Intel PC based Linux
+ - Kernel version 2.6
+ - X11 in at least 8bpp mode
+
+Installation
+------------
+
+Run the self extracting shell script eagle-lin-5.7.0.run
+and wait until the EAGLE Setup dialog appears (this may take a few
+seconds).
+In case you are installing from CD-ROM and can't execute programs from
+the CD, you may need to copy this script to your hard disk first.
+
+If you want to install EAGLE from a shell without a graphical display,
+you can call the script with the name of the directory into which EAGLE
+shall be installed. For example
+
+ eagle-lin-5.7.0.run /opt
+
+would install EAGLE into the directory '/opt/eagle-5.7.0'.
+
+Usage
+-----
+
+To use EAGLE just run the program
+
+ /home/username/eagle-5.7.0/bin/eagle
+
+(assuming you have installed EAGLE into the default location under
+your home directory).
+
+Graphics distortions when scrolling windows
+-------------------------------------------
+
+If you encounter graphics distortions when scrolling windows, you may need
+to disable "composite" mode in your graphics setup.
+This can be done by adding the following lines to your X configuration file:
+
+Section "Extensions"
+ Option "Composite" "Disable"
+EndSection
+
+Octagon apertures in Gerber RS-274X format
+------------------------------------------
+
+The various Gerber viewers on the market have different ideas about how to
+display octagon apertures in RS-274X format. There are all kinds of
+interpretations of the diameter and rotation.
+When generating octagon apertures in RS-274X format, EAGLE assumes that the
+viewer will interpret the diameter as the distance between two opposite
+corners, and that it has to be rotated by 22.5 degrees to achieve the
+proper alignment. In case your specific viewer interprets these data
+differently you can adjust this to your viewer's special needs in the file
+'eagle.def'.
+
+IMPORTANT: Before sending data in RS-274X format to your board house you
+should make sure you ask them how *their* software will interpret octagon
+data.
+
+Platforms
+---------
+
+Board, schematic and library files created with EAGLE version 4.11 or later
+can be exchanged between Linux, Mac OS X and Windows. The binary data
+format is the same on all platforms.
+
+Autorouter job files that have been created with EAGLE for Mac OS X on the
+PPC platform can't be processed with any other version of EAGLE (and vice
+versa).
+
+Printing fill patterns
+----------------------
+
+Printing fill patterns doesn't work with Postscript files.
+If you want to print fill patterns, create a PDF file and then
+print that file.
+
+Electrical Schematics
+---------------------
+
+This EAGLE version is suited for drawing schematics and generating other
+documentation for electrical projects, according to the European standard.
+The descriptions of the specific libraries and user language programs,
+as well as the tutorial covering this topic, are written in German.
+At present, there are no plans to offer these features for the English-
+speaking market. Feel free to use them, but there will be no support
+in English.
+
+Language
+--------
+
+EAGLE uses the same language as the operating system it is running on
+(provided the necessary language specific text files are available).
+To override this, you can set the environment variable LANG to the
+desired value, as in
+
+ SET LANG=de_DE (under Windows)
+
+before starting EAGLE.
+
+
+ ===================
+========================= SALES INFORMATION ===============================
+ ===================
+
+EAGLE is a program of: CadSoft Computer
+ 19620 Pines Blvd. Suite 217
+ Pembroke Pines, FL 33029
+ Phone: 954-237-0932
+ Fax: 954-237-0968
+ E-Mail: info@cadsoftusa.com
+ Web: http://www.cadsoftusa.com
+
+EAGLE is available for Linux, Mac OS X and Windows platforms.
+
+===========================================================================
+"Linux" is a registered trademark of Linus Torvalds.
+"Mac", "Mac OS" and "Apple" are registered trademarks of Apple Computer, Inc.
+"Windows" is a registered trademark of Microsoft Corporation.
+===========================================================================
+
+Copyright (c) 2010 CadSoft Computer - All rights reserved
+
diff --git a/eagle-5.7.0/doc/UPDATE_de b/eagle-5.7.0/doc/UPDATE_de
new file mode 100644
index 0000000..bded7ed
--- /dev/null
+++ b/eagle-5.7.0/doc/UPDATE_de
@@ -0,0 +1,5371 @@
+Update-Informationen EAGLE Version 5
+====================================
+
+Diese Datei enthält Informationen für Anwender früherer EAGLE-Versionen.
+Bitte lesen Sie den Text vollständig durch, wenn Sie von einer früheren
+Version auf die Version 5.7.0 updaten!
+
+ACHTUNG: Aufgrund der veränderten Datenstruktur können Sie Dateien, die
+ mit Version 5.x bearbeitet wurden, nicht mehr mit Versionen vor
+ 5.0 bearbeiten.
+
+ BITTE LEGEN SIE BACKUP-KOPIEN IHRER PLATINEN-, SCHALTPLAN- UND
+ BIBLIOTHEKS-DATEIEN AN, BEVOR SIE MIT VERSION 5.0 BEARBEITET
+ WERDEN.
+
+ACHTUNG: FÃœHREN SIE NACH DEM UPDATE JEDER DATEI EINEN ELECTRICAL RULE CHECK
+ (ERC) UND EINEN DESIGN RULE CHECK (DRC) DURCH! ES KANN SEIN, DASS
+ SIE DIE EINSTELLUNGEN FÃœR DIE DESIGN RULES UNTER "Edit/Design rules..."
+ AN IHR LAYOUT ANPASSEN MÃœSSEN! LESEN SIE HIERZU BITTE AUCH DIE
+ ANMERKUNGEN ZUM THEMA RESTRING UND MINIMUM-ABSTÄNDE ZWISCHEN KUPFER
+ UND DIMENSION-LINIEN UNTER "Design Rules" WEITER UNTEN.
+
+Freigabemitteilung für EAGLE 5.7.0
+==================================
+
+* Plattformen:
+
+ - Ab dieser Version ist jede EAGLE-Lizenz für alle unterstützten
+ Plattformen gültig, ohne zusätzliche Gebühr.
+
+* Control-Panel:
+
+ - Die Option "Ansicht/Aktualisieren" im Menü des Control-Panels hat jetzt
+ die für die jeweilige Plattform typische Funktionstaste.
+ - Die Standard-Aktion bei einem Doppelklick oder dem Drücken der Leer- bzw.
+ der Eingabetaste auf einem Projekt-Verzeichnis in der Baumansicht des
+ Control-Panels ist jetzt, dass das Projekt geöffnet bzw. geschlossen wird.
+
+* User Language:
+
+ - Die neuen User Language Funktionen setgroup() und clrgroup() können dazu
+ benutzt werden die Flags zu setzen bzw. zu löschen, die bestimmen, ob
+ ein Objekt innerhalb der aktuellen Gruppe liegt.
+ - Members in einem Array von UL_*-Objekten können jetzt direkt angesprochen
+ werden, wie in
+
+ UL_SMD smds[];
+ ...
+ if (smds[i].x == smds[j].x)
+ ...
+
+* ADD-Befehl:
+
+ - Der Suchstring im ADD-Dialog wird nicht mehr verändert, wenn der ADD-Befehl
+ mit einem eindeutigen Bauteilnamen aufgerufen wird (aus der Kommandozeile
+ oder über einen Klick mit der rechten Maustaste auf den ADD-Button).
+
+* AUTO-Befehl:
+
+ - Der AUTO-Befehl unterstützt jetzt die Auswahl von Signalnamen mit
+ Platzhaltern.
+
+* BOARD-Befehl:
+
+ - Unmittelbar nachdem ein neues Board aus einem Schaltplan erzeugt wurde,
+ wird jetzt eine Konsistenzprüfung durchgeführt, um mögliche Probleme
+ sofort aufzudecken, die ansonsten unter Umständen erst später zu Tage
+ getreten wären.
+
+* CUT-Befehl:
+
+ - Der CUT-Befehl löscht jetzt den Paste-Puffer, falls die Gruppe leer ist.
+
+* DISPLAY-Befehl:
+
+ - Der DISPLAY-Dialog hat jetzt einen 'Ãœbernehmen'-Button.
+
+* DELETE-Befehl:
+
+ - Pads bzw. SMDs können jetzt aus einem Package in einer Bibliothek gelöscht
+ werden, selbst wenn das Package von einem Device benutzt wird,
+ vorausgesetzt das Pad bzw. SMD wird von keinem Pin in der Bibliothek
+ referenziert.
+ - Pins können jetzt aus einem Symbol in einer Bibliothek gelöscht
+ werden, selbst wenn das Symbol von einem Device-Set benutzt wird,
+ vorausgesetzt der Pin wird von keinem Pad bzw. SMD in der Bibliothek
+ referenziert.
+
+* GROUP-Befehl:
+
+ - GROUP ALL selektiert jetzt auch Objekte außerhalb des definierten
+ Koordinatenbereichs.
+
+* LABEL-Befehl:
+
+ - Die Koordinaten für XREF-Labels richten sich nicht mehr nach dem
+ umschließenden Rechteck des Netzes, sondern es werden hierfür jetzt
+ alle Objekte einzeln betrachtet.
+
+* MARK-Befehl:
+
+ - Der MARK-Befehl aktualisiert jetzt die Grid-Anzeige sofort, ohne dass erst
+ die Maus bewegt werden muß.
+
+* NAME-Befehl:
+
+ - Falls mehrere Objekte innerhalb des Selektionsradius liegen, bietet der
+ NAME-Befehl jetzt nur noch solche Objekte an, die auch wirklich einen
+ Namen haben.
+
+* OPTIMIZE-Befehl:
+
+ - Der OPTIMIZE-Befehl berücksichtigt keine Luftlinien mehr.
+ - Der OPTIMIZE-Befehl lässt jetzt das selektierte Signal kurz aufblitzen,
+ um eine sichtbare Rückmeldung auf einen Mausklick zu geben.
+
+* PAD-Befehl:
+
+ - Der PAD-Befehl kann jetzt ein Pad zu einem Package hinzufügen, selbst
+ wenn dieses Package von einem Device verwendet wird.
+
+* PIN-Befehl:
+
+ - Der PIN-Befehl kann jetzt einen Pin zu einem Symbol hinzufügen, selbst
+ wenn dieses Symbol von einem Device-Set verwendet wird.
+
+* PRINT-Befehl:
+
+ - Der Drucken-Dialog enthält jetzt eine Liste aller verfügbaren Drucker zur
+ direkten Auswahl. Auch die Ausgabe in eine PDF- oder Postscript-Datei
+ kann über diese Liste gewählt werden.
+ - Der PRINT-Befehl merkt sich jetzt, wenn der letzte Druckauftrag in eine
+ Datei ging.
+ - Der PRINT-Befehl hat eine neue Option namens PRINTER, mit der auf einem
+ bestimmten Drucker gedruckt werden kann.
+ - Die neue Option CAPTION des PRINT-Befehls kann dazu benutzt werden, eine
+ Bildunterschrift von der Kommandozeile aus zu drucken.
+ - Die neue Option PAPER des PRINT-Befehls kann dazu benutzt werden, auf eine
+ bestimmte Papiergröße zu drucken.
+ - Der Dateiname in der PRINT FILE Option kann jetzt Platzhalter für den
+ Namen der Zeichnung bzw. der Extension enthalten.
+ - Der PRINT FILE Befehl verweigert jetzt das Schreiben in eine Datei mit
+ einer der Dateinamenerweiterungen
+ .brd.sch.lbr.gpi.dri.whl.drl.ulp.epf.cam.scr.exe.com.bat.cmd.sys.dll,
+ um zu vermeiden, dass versehentlich Dateien überschrieben werden.
+
+* RATSNEST-Befehl:
+
+ - Der RATSNEST-Befehl bricht nicht mehr ab, wenn er auf einen unbekannten
+ Signalnamen trifft, sondern listet die unbekannten Signalnamen auf und
+ bietet die Option, weiterzumachen.
+ - Wird der RATSNEST-Befehl mit einem Signalnamen aufgerufen, so berechnet
+ er jetzt nur noch die Polygone des angegebenen Signals, und nicht mehr
+ alle Polygone aller Signale.
+ - Das Kontext-Menü von Wires und Vias, die zu einem Signal gehören, enthält
+ jetzt den RATSNEST-Befehl.
+
+* ROUTE-Befehl:
+
+ - Der ROUTE-Befehl blendet jetzt nicht mehr beim Start den aktuellen Layer
+ ein, sondern wartet, bis eine konkrete Luftlinie selektiert worden ist.
+ - Der Follow-me Router benutzt jetzt den in der Parameter-Toolbar
+ eingestellten Via-Durchmesser.
+
+* SET-Befehl:
+
+ - Bei der Eingabe von Werten für den Catch_Factor bzw. Select_Factor im
+ SET-Befehl über die Befehlszeile werden Zahlen im Bereich [1 ... 100]
+ jetzt als Prozentwerte genommen, um Fehler zu vermeiden, die dadurch
+ entstehen, dass der Faktor nicht als Dezimalzahl zwischen [0.0 ... 1.0]
+ eingegeben wird.
+ - Mit dem neuen Parameter Option.LayerSequence kann jetzt die Reihenfolge der
+ Layer bei der Ausgabe bestimmt werden (siehe "Hilfe/Editor-Befehle/SET").
+
+* SHOW-Befehl:
+
+ - Der SHOW-Befehl mit der Option '@' zeichnet jetzt das Rechteck zur
+ Hervorhebung des Objekts auch im jeweils anderen Fenster, wenn
+ Forward/Back-Annotation aktiv ist.
+ - Die durch den SHOW-Dialog hervorgehobenen Objekte bleiben jetzt auch nach
+ Schließen des Dialogs hervorgehoben (bis zum Ende des SHOW-Befehls).
+
+* SMD-Befehl:
+
+ - Der SMD-Befehl kann jetzt ein Smd zu einem Package hinzufügen, selbst
+ wenn dieses Package von einem Device verwendet wird.
+
+* UPDATE-Befehl:
+
+ - Der UPDATE-Befehl erlaubt jetzt die Auswahl mehrerer Dateien gleichzeitig
+ im Datei-Dialog.
+
+* USE-Befehl:
+
+ - Der USE-Befehl erlaubt jetzt die Auswahl mehrerer Dateien gleichzeitig
+ im Datei-Dialog.
+
+* VALUE-Befehl:
+
+ - Der VALUE-Befehls-Button hat jetzt auch eine History-Funktion.
+
+* VIA-Befehl:
+
+ - Der VIA-Befehl gibt jetzt eine Fehlermeldung aus, wenn im Layer-Setup
+ keine Vias definiert sind.
+
+* CAM-Prozessor:
+
+ - Der CAM-Prozessor-Treiber GERBER_RS274X_25 mit Koordinatenformat 2.5 Inch
+ wurde hinzugefügt.
+ - Bei den mitgelieferten CAM-Jobs ist jetzt nicht mehr die Option "Spiegeln"
+ gesetzt.
+
+* Verschiedenes:
+
+ - Die Sortierreihenfolge von numerischen Strings, die sich nur in der
+ Anzahl der führenden Nullen ihrer numerischen Anteile unterscheiden,
+ wurde stabil gemacht (d.h. wenn sie mehrfach sortiert werden ergibt sich
+ immer die gleiche Reihenfolge).
+ - Der Eigenschaften-Dialog eines Wires zeigt jetzt auch den Winkel des Wires
+ an.
+ - Die Fortschrittsanzeige des CAM-Prozessors drängt sich nicht mehr dauernd
+ in den Vordergrud.
+ - Die Performance des Neuberechnens der Luftlinien im Board nach einem ADD-,
+ DELETE- oder PASTE-Befehl im Schaltplan wurde verbessert für den Fall, dass
+ viele Pins bearbeitet werden, die am selben Netz angeschlossen sind.
+ - Die Ursprungskreuze für Bauteile im Board wurden verkleinert, so dass sie
+ im Falle von kleinen SMD-Bauteilen nicht so sehr überlappen.
+ - Der Eigenschaften-Dialog eines Elements übernimmt jetzt veränderte Werte
+ für Koordinaten und Orientierung auch dann, wenn die "Locked"-Option
+ eingeschaltet ist.
+ - In der Online-Hilfe wurde eine allgemeine Bemerkung über die spezielle
+ Koordinate '(@)' hinzugefügt.
+ - Führende und nachfolgende Leerzeichen in Datei- und Verzeichnisnamen
+ werden jetzt ignoriert.
+ - Die Behandlung leerer Schlüssel in bom.ulp wurde korrigiert.
+ - Zur besseren Lesbarkeit zeigt die Schaltplan-Seitenvorschau jetzt nur mehr
+ die einzelne Seitennummer an, ohne die Gesamtzahl der Seiten.
+ - Die Behandlung von Bauteilen mit vielen Attributen im Schaltplan wurde
+ beschleunigt.
+ - Der Plausibilitätstest in den Design-Regeln prüft jetzt, ob die
+ Abstandsregeln für 'gleiches Signal' nicht größer sind als die für
+ 'unterschiedliche Signale'.
+ - Das _OUTLINES_-Polygon wird jetzt (falls vorhanden) mit erhöhter
+ Genauigkeit berechnet, damit die Fräskonturen den Objekt-Umrissen besser
+ folgen können.
+ - Die Erkennung der verbundenen Teile eines freigerechneten Polygons (die
+ zum Beispiel im RATSNEST- oder ROUTE-Befehl verwendet wird) wurde
+ beschleunigt.
+ - Eine unnötige Abhängigkeit von libXft.so in der Linux-Version wurde
+ entfernt.
+ - Mit dem neuen SET-Parameter Interface.MouseButtonReleaseTimeout kann die
+ Zeit eingestellt werden, während der das Loslassen einer Maustaste die
+ Funktion eines Buttons auslöst, selbst wenn dieses Loslassen außerhalb
+ der Fäche des Buttons passierte (Standardwert 500ms).
+ - Der Farbindex im dxf.ulp beginnt jetzt bei 1, da AutoCAD 2007 die Farbe 0
+ nicht mag.
+ - Die Warnung des CAM-Prozessors bezüglich Polygonen, die sehr große
+ Datenmengen erzeugen können, wird jetzt nur mehr ausgegeben, wenn der
+ Layer, der das jeweilige Polygon enthält, auch wirklich geplottet wird.
+ - Der "Value"-Eintrag im Eigenschaften-Dialog eines Bauteils, dessen Device
+ "Value off" hat, enthält jetzt eine Check-Box die anzeigt, dass dieser
+ Wert den Standardwert (also den Device-Namen) überschreibt. Wird das
+ Häkchen in dieser Box entfernt, so fällt der Wert auf den Standardwert
+ zurück.
+ - Beim Öffnen eines Projekts werden Fenster, die geöffnet werden, nicht mehr
+ auf die aktuelle Größe der Arbeitsfläche skaliert, sondern, soweit nötig,
+ in Lage und Größe so verändert, dass sie vollständig auf die Arbeitsfläche
+ passen.
+ - Das Umschalten der Fenster mit Alt+0, Alt+1 etc. wird auf der Mac OS X
+ Plattform nicht mehr unterstützt, da bei manchen landesspezifischen
+ Tastaturbelegungen diese Tastenkombinationen bereits anderweitig belegt
+ sind.
+ - Die Platzhalter >SHEETNR und >SHEETS wurden eingebaut, um die Seitennummer
+ und die Gesamtzahl der Seiten eines Schaltplans separat verfügbar zu
+ machen.
+ - In der Online-Hilfe wurde ein Hinweis darauf hinzugefügt, wie man im
+ ATTRIBUTE- und LABEL-Befehl den Layer einstellen kann.
+ - Beim Laden eines Schaltplans werden jetzt etwaige übriggebliebene, leere
+ Netze automatisch gelöscht.
+ - Wenn eine Board-Datei, die mit einer EAGLE-Edition erzeugt worden ist,
+ welche nur eine Untermenge der Signal-Layer handhaben kann, mit einer
+ Edition geladen wird, die zusätzliche Layer handhaben kann, und das
+ Layer-Setup so geändert wird, dass zusätzliche Signal-Layer verwendet
+ werden, so werden diese jetzt automatisch angelegt.
+ - Die Geschwindigkeit des Pannings außerhalb des umschließenden Rechtecks
+ der gesamten Zeichnung wurde verbessert.
+
+* Fehlerbehebungen:
+
+ - Die fehlende Technology beim Hinzufügen eines Strings zur
+ Command-Button-History des REPLACE-Befehls wurde korrigiert.
+ - Ein Absturz bei negativem 'number'-Parameter in der User Language Funktion
+ sort() wurde behoben.
+ - Die Behandlung von Links wie in dlgTextView wurde
+ korrigiert.
+ - Die "Link"-Variable in dlgTextView kann jetzt dazu benutzt werden, zu
+ Beginn an eine vorgegebene Textstelle zu positionieren.
+ - Die Sortierung im INVOKE-Dialog wurde korrigiert.
+ - Die Behandlung von Links wie im Control-Panel wurde
+ korrigiert.
+ - Die Wiederherstellung der Breite der Schaltplan-Seitenvorschau wurde
+ korrigiert für den Fall, dass die Vorschau "gedockt" ist.
+ - Die Behandlung des minimalen Bohrabstands im Autorouter wurde korrigiert.
+ - Das Auffrischen des Zeichenfensters wurde korrigiert für den Fall, dass
+ Einträge der Farbpalette mit dem SET-Befehl geändert wurden.
+ - Die Änderung "Die dynamische Berechnung der Luftlinie im ROUTE-Befehl wurde
+ korrigiert für den Fall, dass Layer, die Objekte enthalten, die zum
+ gerouteten Signal gehören, ausgeblendet sind" wurde rückgängig gemacht, da
+ sie zur Folge hatte, dass Segmente eines Signals, die durch Wires im
+ ausgeblendeten Layer verbunden sind, als nicht verbunden angesehen wurden,
+ wodurch die dynamische Luftlinie nicht mehr richtig berechnet wurde.
+ - Das Neuzeichnen von über die Board-Fläche hinausstehenden Polygonen beim
+ Starten des Autorouters wurde korrigiert.
+ - Artefakte beim Bewegen eines gesmashten Bauteils, welches die
+ Platzhalter >PLOT_DATE_TIME, >LAST_DATE_TIME oder >DRAWING_NAME enthält,
+ wurden korrigiert.
+ - Die Werte der Papiergrößen im PRINT-Dialog wurden korrigiert.
+ - Das Ãœberspringen von Luftlinien beim Paste von einer Board- in eine
+ Package-Zeichnung wurde korrigiert.
+ - Texte und Rechtecke in benutzerdefinierten Layern eines Boards bzw.
+ Packages, die einen nicht-othogonalen Winkel haben, werden jetzt beim
+ Paste in eine Sheet- oder Symbol-Zeichnung übersprungen.
+ - Die Parameter des Editor-Fensters fallen nicht mehr auf Standardwerte
+ zurück, wenn eine andere Zeichnung geladen wird.
+ - Die Behandlung von Signalpolygonen im Autorouter wurde korrigiert.
+ - Eine ungerechtfertigte Warnung "Das Attribut '...' ist bereits im Board
+ definiert mit dem Wert '...'! Ãœberschreiben?" wurde korrigiert.
+ - Die Funktion UL_PART.attribute[] wurde korrigiert für den Fall, dass der
+ tatsächliche Name des Attributes länger ist als der als Index angegebene
+ String, wie etwa in "ABC" und "ABCDE".
+ - Ein möglicher Verlust der Konsistenz nach GROUP/CUT/PASTE wurde behoben
+ für den Fall, dass ein Bauteil auf einem Schaltplanblatt in der Gruppe
+ liegt, der an einem seiner Pins angeschlossene Wire aber nicht. Nach dem
+ Löschen von anderen Wires dieses Netzes konnte die Konsistenz zwischen
+ Board und Schaltplan verloren gehen.
+ - Das Hinzufügen des "Abbrechen"-Buttons zur Message-Box beim Ausführen
+ eines Scripts in einer Bibliothek, ohne vorher etwas zum Editieren
+ ausgewählt zu haben, wurde korrigiert.
+ - Der Aufruf der User Language Funktion strxstr() ohne jeden optionalen
+ Parameter wurde korrigiert.
+ - Ein möglicher Absturz wurde behoben für den Fall, dass ein Net-Wire
+ komplett verschwindet dadurch, dass einer seiner Endpunkte auf den anderen
+ verschoben wird.
+ - Ein Absturz im Follow-me Router wurde behoben für den Fall, dass das
+ Raster und der aktuelle Layer geändert wird, während eine Luftline am
+ Cursor hängt.
+ - Bei der Definition eines neuen Bohrdurchmessers im Dialog
+ "Optionen/Einstellungen/Bohrsymbole/Neu" ist jetzt die Standardeinheit
+ die gleiche wie im Grid des Editor-Fensters.
+ - Die Behandlung von Kleinbuchstaben in Platzhaltertexten für Attribute im
+ SMASH-Befehl wurde korrigiert.
+ - Die Behandlung der '.tif"-Extension im EXPORT IMAGE Befehl wurde
+ korrigiert.
+ - Die Behandlung von verschachtelten Typecasts in User Language Programmen
+ wurde korrigiert.
+ - Die konsistente Behandlung der Wire-Knickwinkel im ROUTE-Befehl ohne
+ Autorouter-Modul wurde korrigiert für den Fall, dass Klicken mit der
+ rechten Maustaste und Klicks auf die Buttons in der Toolbar gemischt
+ werden.
+ - Eine unnötige zusätzliche automatische Sicherung wurde korrigiert für den
+ Fall, dass die automatische Sicherung in einem Editor-Fenster ausgelöst
+ wurde, während im anderen Editor-Fenster ein längerer Befehl läuft.
+ - Eine mögliche Datenverfälschung wurde korrigiert für den Fall, dass die
+ automatische Sicherung in einem Editor-Fenster ausgelöst wurde, während
+ im anderen Editor-Fenster ein längerer Befehl läuft.
+ - Die Anzeige von Script-Kommentaren im Control Panel, die UTF-8-Zeichen
+ enthalten, wurde korrigiert.
+ - Die Behandlung von "dead keys" unter Windows wurde korrigiert.
+ - Ein Absturz im Follow-me-Router beim Selektieren einer neuen Luftlinie
+ mit Ctrl+Linke Maustaste wurde behoben.
+ - Ein möglicher Absturz bei der Verwendung des Datei-Dialogs nach dem
+ Schließen eines Projekts wurde behoben.
+ - Der Aufruf von UL_ATTRIBUTE.defaultvalue für Attribute, die in der
+ Bibliothek definiert sind, aus dem Schaltplan heraus mit geöffnetem
+ Projekt, wurde korrigiert.
+ - Die Berechnung des Anzeige-Rechtecks im SHOW-Befehl wurde korrigiert für
+ den Fall, dass das angezeigte Netz-Segment nur Pin-Referenzen enthält
+ (keine Wires, Labels oder Junctions).
+ - Das Einfügen von gesmashten Bauteilen in den Schaltplan mit dem
+ PASTE-Befehl wurde korrigiert (in solchen Fällen ging der Attribut-Wert
+ verloren).
+ - Die Erkennung von Netzen mit nur einem angeschlossenen Pin im ERC wurde
+ korrigiert für den Fall, dass ansonsten nur Supply-Pins ohne zugehörige
+ Pads an diesem Netz angeschlossen sind.
+ - Die Behandlung von Backslashes und Ausrufezeichen in Namen und Werten von
+ Bauteilen beim Update von Dateien aus Versionen vor 5.0 wurde korrigiert.
+ - Ein Absturz unter Mac OS X wurde behoben für den Fall, dass das Programm
+ verlassen wird während das CAM-Prozessor-Fenster offen und im Vordergrund
+ ist.
+ - Der Library-Update wurde korrigiert für den Fall, dass nur Attribute mit
+ leeren Werten verändert wurden.
+ - Ein Hängenbleiben des Programms wurde korrigiert für den Fall, dass in
+ einem Eingabefeld, welches seinen Inhalt überprüft und momentan ungültige
+ Daten enthält, die rechte Maustaste gedrückt wird.
+ - Der EXPORT IMAGE Befehl lässt keine leere Datei mehr stehen, wenn ihm der
+ Speicher ausgeht.
+ - Der RIPUP-Befehl selektiert keine Objekte mehr, die er nicht auflösen
+ kann.
+ - Werden nach einem ERC- bzw. DRC-Lauf Fehler gemeldet, und das zugehörige
+ Editor-Fenster ist zu diesem Zeitpunkt minimiert, so wird es jetzt wieder
+ in den Vordergrund geholt.
+ - In der CAM-Prozessor-Meldung "Package '...' des Bauteils '...' enthält ein
+ Polygon das extrem große Plotdaten verursachen kann" waren der Name des
+ Packages und der des Bauteils vertauscht.
+ - Ein Verlust der Schaltplan-Seitenvorschau für den Fall, dass unter GNOME
+ zeitweise auf eine andere virtuelle Arbeitsfläche gewechselt wird, wurde
+ behoben.
+ - Ein Problem mit REPLACE im Board wurde behoben für den Fall, dass unmittelbar
+ vorher das Schaltplanfenster aus einem Script heraus geschlossen wurde.
+ - Die Behandlung von Zeilenumbrüchen beim Speichern von *.cam-Dateien wurde
+ korrigiert.
+ - Die Behandlung von Supply-Layern wurde korrigiert für den Fall, dass ein Board
+ mit Supply-Layern editiert wurde, und dann ein anderes Board geladen wurde,
+ welches einen oder mehrere dieser Layer nicht enthält.
+ - Das Verschwinden der Gruppen-Polygon-Linien für den Fall, dass der
+ WINDOW-Befehl während des Zeichnens eines Gruppen-Polygons benutzt wird,
+ wurde korrigiert.
+ - Die Behandlung der .dev, .pac und .sym Extensions wurde korrigiert für den
+ Fall, dass sie im EDIT-Dialog des Bibliotheks-Editors eingegeben werden.
+ - Eine Umgehungslösung für ein Problem unter Windows beim Erzeugen eines
+ maximierten Fensters, welches anfangs minimiert ist, wurde eingebaut.
+ - Die Berechnung des umschließenden Rechtecks von XREF-Labels wurde
+ korrigiert.
+ - Der DISPLAY LAST Befehl wurde korrigiert für den Fall, dass der
+ vorhergehende DISPLAY-Befehl keine Änderung bewirkt hat.
+ - Zeichen-Artefakte bei der Darstellung von SMDs wurden behoben für den Fall,
+ dass der Cream-Maskenparameter ungleich Null ist.
+ - Überlappende Texte im Layer-Setup-Dialog wurden korrigiert für den Fall,
+ dass nur der Top-Layer aktiv ist.
+ - Die Behandlung von negativen Array-Indizes in User Language Programmen
+ wurde korrigiert.
+ - Die Berechnung der Maskendaten für SMDs mit einer Roundness ungleich Null
+ wurde korrigiert.
+ - Eine mögliche Datenverfälschung wurde korrigiert für den Fall, dass ein
+ Script einen CONNECT-Befehl gefolgt von einem REMOVE-Befehl enthält, ohne
+ einen dazwischen liegenden EDIT-Befehl.
+ - Die Optimierung von doppelten, überlappenden Wires wurde korrigiert für
+ den Fall, dass sich an beiden Enden Pads oder Vias befinden.
+ - Die Optimierung eines Kurzen Wires, der von einem längeren Wire an einer
+ Stelle überlappt wird, an der ein dritter Wire endet, wurde korrigiert.
+ - Die Online-Hilfe für das User Language Statement 'while' wurde korrigiert.
+ - Die Wire-Koordinaten in UL_PIN.texts() wurden korrigiert.
+ - Das Verschieben von Wires und Vias im CHANGE PACKAGE Befehl wurde
+ korrigiert.
+ - Die Erkennung von Abstandsfehlern zwischen runden Pads, Vias oder SMDs
+ wurde korrigiert für den Fall, das der geforderte Mindestabstand größer
+ als 4.634mm ist.
+ - Eine falsche Fensterreihenfolge nach dem Wiedereinfügen einer losgelösten
+ Toolbar unter Linux wurde korrigiert.
+ - Losgelöste Parameter-Toolbars passen jetzt ihre Größe dem veränderten
+ Inhalt an.
+ - Das Setzen der Spaltenbreiten in der Attributs-Liste des Eigenschaften-
+ Dialogs, sowie im Change-Package-Dialog wurde korrigiert.
+ - Doppelte PinRefs oder Connects werden jetzt gelöscht, wenn ein Schematic
+ bzw. Board geladen wird.
+ - Ein überflüssiger UNDO-Schritt nach dem Laden eines anderen Schaltplans
+ aus dem Schaltplan-Editor heraus, oder nach dem Anlegen einer neuen Seite
+ in einem existierenden Schaltplan, wurde behoben.
+ - Die Fehlerbehandlung für den Fall, dass der PRINT-Befehl eine Datei zu
+ schreiben versucht, die gerade durch eine andere Applikation geöffnet ist,
+ wurde korrigiert.
+ - Das Neuberechnen des umschließeneden Rechtecks der Ursprungs-Schaltplanseite
+ wurde korrigiert für den Fall, dass ein Bauteil von einer Seite auf eine
+ andere verschoben wird.
+ - Die Darstellung von Layer-Farben und -Füllmustern in Dialogen unter
+ Ubuntu-Linux wurde korrigiert (Problem wurde auf Ubuntu Version 9.10
+ beobachtet).
+ - Die Darstellung des großen Cursors unter Ubuntu-Linux mit transparentem
+ Desktop-Effekt wurde korrigiert (Problem wurde auf Ubuntu Version 9.10
+ beobachtet).
+
+Freigabemitteilung für EAGLE 5.6.0
+==================================
+
+* Fehlerbehebungen:
+
+ - RIPUP wurde korrigiert, so dass es bei Pads halt macht, wenn auf eine
+ Luftlinie geklickt wird (war seit Version 5.2.4 fehlerhaft).
+ - Ein möglicher "Abort: Unknown objectType..." im SIGNAL-Befehl wurde
+ behoben.
+ - Ein Fehler im Autorouter wurde behoben, durch den es manchmal zu
+ DRC-Fehlern bei Pads, Vias und SMDs kam.
+ - Die Status-Meldung nach einem DRC bzw. ERC wurde korrigiert, da sie
+ manchmal fälschlicherweise das Wort "gebilligte" enthielt.
+ - Eine mögliche Inkonsistenz der Netzklassen wurde behoben für den Fall, dass
+ alle Segmente eines Netzes auf der aktuellen Schaltplanseite umbenannt
+ wurden.
+ - Eine mögliche Inkonsistenz der Netzklassen wurde behoben für den Fall, dass
+ Bauteile mit Power-Pins gepastet wurden, die automatisch neue Signale im
+ Board generiert haben.
+ - Die Behandlung von cfPad/SmdImpact im Autorouter wurde korrigiert.
+ - Das Beeenden einer Leiterbahn im Follow-me-Router durch zweimaliges
+ Klicken am gleichen Punkt wurde korrigiert.
+ - Ein unerwarteter Offset der Luftlinie beim Klicken an einem unerreichbaren
+ Punkt im Follow-me-Router wurde behoben.
+
+Freigabemitteilung für EAGLE 5.5.0
+==================================
+
+* User Language:
+
+ - Die neue Funktion strxstr() kann in User Language Programmen dazu benutzt
+ werden, Strings nach regulären Ausdrücken zu durchsuchen.
+ - In der Online-Hilfe für UL_DEVICE wurde eine Bemerkung darüber hinzugefügt,
+ dass das Data-Member 'package' dazu benutzt werden kann festzustellen, ob
+ dieses Device ein Package hat.
+
+* Design Rule Check:
+
+ - Der DRC meldet keinen "Drill Distance" Fehler mehr für Vias, die nur
+ einen Layer gemeinsam haben, zum Beispiel 1-2 und 2-3 ("stacked vias").
+ - Der Design Rules Dialog gibt jetzt eine Warnung aus, wenn im Layer-Setup
+ Layer verwendet werden, die in der lizenzierten Programm-Edition nicht
+ verfügbar sind.
+
+* Text-Editor:
+
+ - Es ist jetzt möglich, einen externen Text-Editor anstatt des in EAGLE
+ eingebauten zu verwenden (siehe "Hilfe/Editor-Fenster/Text-Editor).
+
+* AUTO-Befehl:
+
+ - Die neue Option FOLLOWME des AUTO-Befehls öffnet den Autorouter-Dialog in
+ einem Modus, in dem nur die für den Follow-me-Router maßgeblichen Parameter
+ verändert werden können.
+ - Das Routen von und zu Pads, Smds und Vias im Autorouter wurde verbessert.
+
+* CHANGE-Befehl:
+
+ - Der Befehl CHANGE PACKAGE/TECHNOLOGY überschreibt nicht mehr den Wert von
+ Bauteilen bei denen das Device "value off" hat, aber der Benutzer den Wert
+ überschrieben hat (was dadurch erkannt wird, dass der alte Wert des
+ Bauteils mit dem Namen des alten Devices verglichen wird).
+
+* CONNECT-Befehl:
+
+ - Die Behandlung der Breite der Verbindungsliste im CONNECT-Dialog wurde
+ verbessert.
+
+* DRC-Befehl:
+
+ - Der DRC-Befehl öffnet nicht mehr automatisch den ERRORS-Dialog falls nur
+ gebilligte Fehler gefunden wurden.
+
+* ERC-Befehl:
+
+ - Der ERC-Befehl öffnet nicht mehr automatisch den ERRORS-Dialog falls nur
+ gebilligte Fehler/Warnungen gefunden wurden.
+ - Die ERC-Meldung "OUTPUT- und ...-Pins gemischt an Netz ..." wurde um die
+ Angabe der konkreten Pin-Direction des referenzierten Pins ergänzt, um das
+ Auffinden des beanstandeten Pins zu erleichtern.
+
+* EXPORT-Befehl:
+
+ - Die neue Option WINDOW des EXPORT IMAGE-Befehls kann dazu benutzt werden,
+ ein Bild zu exportieren, das nur den momentan sichtbaren Ausschnitt der
+ Zeichnung enthält.
+
+* PRINT-Befehl:
+
+ - Die neue Option SHEETS des PRINT-Befehls kann dazu benutzt werden, einen
+ bestimmten Bereich von Schaltplanseiten von der Kommandozeile aus zu
+ drucken.
+ - Die neue Option WINDOW des PRINT-Befehls kann dazu benutzt werden, nur den
+ momentan sichtbaren Ausschnitt der Zeichnung zu drucken.
+ - Die neuen Optionen PORTRAIT und LANDSCAPE des PRINT-Befehls können benutzt
+ werden um die Orientierung der Ausgabe zu bestimmen.
+
+* RENAME-Befehl:
+
+ - Der RENAME-Dialog enthält jetzt den momentanen Namen des Objekts, so dass
+ es einfacher ist, kleine Änderungen vorzunehmen.
+
+* REPLACE-Befehl:
+
+ - Der REPLACE-Befehl überschreibt nicht mehr den Wert von
+ Bauteilen bei denen das Device "value off" hat, aber der Benutzer den Wert
+ überschrieben hat (was dadurch erkannt wird, dass der alte Wert des
+ Bauteils mit dem Namen des alten Devices verglichen wird).
+
+* ROUTE-Befehl:
+
+ - Der ROUTE-Befehl kann jetzt im "Follow-me"-Modus benutzt werden, wodurch
+ der Autorouter verwendet wird um die selektierte Luftlinie automatisch
+ gemäß den aktuellen Design-Regeln und Autorouter-Parametern zu verlegen.
+ Bitte beachten Sie, dass in Ihrer EAGLE-Lizenz das Autorouter-Modul
+ aktiviert sein muß, damit Sie den Follow-me-Router verwenden können.
+ - Der ROUTE-Befehl setzt jetzt automatisch die Wire-Width und den Via-Drill
+ auf die in den Design-Regeln und Netzklassen spezifizierten Werte, wenn
+ der neue Schalter "Optionen/Einstellungen/Verschiedenes/Width und Drill bei
+ Route autom. setzen" eingeschaltet ist.
+
+* SET-Befehl:
+
+ - Die neuen Werte '8' und '9' für Wire_Bend bestimmen das Verhalten des
+ Follow-me-Routers. Mit '8' wird nur das kurze Ende der selektierten
+ Luftlinie verlegt, mit '9' beide Enden.
+
+* SHOW-Befehl:
+
+ - Wird das Zeichen '@' in der Kommandozeile des SHOW-Befehls angegeben, so
+ wird jetzt ein Rechteck um das hervorgehobene Objekt gezeichnet. Dies ist
+ hilfreich bei der Suche nach kleinen Objekten, die durch bloßes Hervorheben
+ nicht leicht zu finden wären.
+ - Wird ein namentlich im SHOW-Befehl genanntes Objekt nicht auf der aktuellen
+ Schaltplanseite gefunden, so erscheint jetzt ein Dialog mit einer Liste
+ aller Seiten, auf denen dieses Objekt gefunden wurde.
+
+* UPDATE-Befehl:
+
+ - Der Library-Update überschreibt nicht mehr den Wert von Bauteilen bei
+ denen das Device "value off" hat, aber der Benutzer den Wert überschrieben
+ hat (was dadurch erkannt wird, dass der alte Wert des Bauteils mit dem
+ Namen des alten Devices verglichen wird).
+
+* Verschiedenes:
+
+ - Der Zeitbedarf beim Billigen von ERC/DRC-Fehlern wurde verringert.
+ - Das Löschen der Liste des ERRORS-Dialogs beim Klicken auf den Button
+ "Alle löschen" wurde beschleunigt.
+ - Die Art wie EAGLE seine Dateien schreibt wurde geändert, um fehlerhafte
+ Daten auf nicht einwandfrei funktionierenden NAS (Network Attached Storage)
+ Systemen zu vermeiden.
+ - Das Freirechnen von Signal-Polygonen wurde beschleunigt.
+ - Die Packages von Bauteilen, die im Schaltplan hinzugefügt werden, werden
+ jetzt im Board im eingestellten Raster platziert.
+ - Das Befüllen der ERRORS-Liste nach einem DRC/ERC wurde beschleunigt.
+ - Die Funktion "Datei/Alles speichern" speichert jetzt auch die
+ eaglerc-Datei.
+ - Manche Benutzer wollen nicht gewarnt werden, wenn ein Supply-Pin den
+ generierten Namen eines bestehenden Netzsegments überschreibt. Der Befehl
+
+ SET Warning.SupplyPinAutoOverwriteGeneratedNetName 1;
+
+ kann dazu benutzt werden, diese Warnung abzuschalten.
+ - Zur "Stop"-Checkbox im Eigenschaften-Dialog eines Vias wurde eine
+ Bemerkung hinzugefügt, die besagt, dass diese Einstellung wirkungslos ist,
+ falls der Bohrduchrmesser des Vias größer ist als der in
+ "Design-Regeln/Masks/Limit" eingestellte Wert.
+ - Wenn ein Supply-Pin auf ein Netzsegment platziert wird, so wird der
+ Benutzer jetzt gefragt, ob das Netzsegment in den Namen des Supply-Pins
+ umbenannt werden soll.
+
+* Fehlerbehebungen:
+
+ - Die Prüfung auf symmetrische Paare von '{' und '}' im MENU-Befehl wurde
+ korrigiert.
+ - Die Aktualisierung der Combo-Box für die Via-Länge wurde korrigiert für den
+ Fall, dass das Layer-Setup verändert wird während der VIA-Befehl aktiv ist.
+ - Die Anzeige von Technologie-Namen im "Description" Feld des Device-Editors
+ wurde korrigiert für den Fall, dass sie sich nur durch führende Nullen
+ ihrer numerischen Anteile unterscheiden.
+ - Das Markieren einer Zeichnung als verändert wurde korrigiert für den Fall,
+ dass ein globales Attribut geändert wird.
+ - Die fehlenden User Language Konstanten FRAME_BORDER_* wurden hinzugefügt.
+ - Das Wechseln des Layers eines Polygons in einem Package oder Symbol wurde
+ korrigiert (es konnt nicht zwischen Signal- und Nicht-Signal-Layern
+ gewechselt werden).
+ - Ein Absturz bei einer Drag&Drop-Operation aus dem Programm WinRAR unter
+ Windows wurde behoben (das "Droppen" aus WinRAR funktioniert zwar immer
+ noch nicht, aber zumindest stürzt EAGLE nicht mehr ab).
+ - Die Aktualisierung der Pfadnamen von Einträgen in der Baumansicht des
+ Control-Panels wurde korrigiert für den Fall, dass das Verzeichnis, in dem
+ sie sich befinden, innerhalb der Baumansicht umbenannt wurde.
+ - Die Behandlung des 'Fangfaktors' wurde korrigiert für den Fall, dass dieser
+ kleiner als der 'Selektionsfaktor' ist.
+ - Die Behandlung der Referenzlinien für den Fall, dass ein gesmashter Text
+ eines verriegelten Bauteils Bestandteil eines "GROUP MOVE", ist wurde
+ korrigiert.
+ - Die Aktualisierung der Durchmesser-Anzeige im Eigenschaften-Dialog eines
+ Vias nach einer Änderung des Bohrdurchmessers und einem Klick auf
+ "Anwenden" wurde korrigiert.
+ - Die Aktualisierung des Baumes im ADD-, REPLACE- etc. Dialog beim erneuten
+ Öffnen eines solchen Dialogs nach einer Veränderung einer Bibliotheksdatei
+ von außerhalb EAGLE wurde korrigiert.
+ - Das Drucken von Pad-Formen in Innenlagen wurde korrigiert.
+ - Die Darstellung der Bohrlöcher von Pads und Vias wurde korrigiert (sie
+ wurden ein Pixel zu klein im Radius dargestellt).
+ - Eine unberechtigte ERC-Warnung "Segment des Netzes ... hat keine erkennbare
+ Verbindung (z.B. Label, Bus oder Supply-Pin) zu anderen Segmenten des
+ selben Netzes" bei leeren Segmenten wurde behoben (solche blieben manchmal
+ in älteren Versionen stehen).
+ - Stehengebliebene Statusmeldungen wie etwa "DRC:" wurden korrigiert.
+ - Die Layer-Setup-Seite des Design-Regeln-Dialogs zeigt jetzt die
+ Gesamtdicke der Leiterplatte an, indem die Dicken aller Kupfer- und
+ Isolationslagen aufaddiert werden.
+ - Ein möglicher Verlust der Konsistenz beim Löschen einer Junction von einem
+ Pin wurde behoben.
+ - Die Anzeige von Statusmeldungen im Text-Editor wurde korrigiert.
+ - Die fehlenden Konstanten LAYER_INFO und LAYER_GUIDE wurden zur
+ Online-Hilfe-Seite für UL_LAYER hinzugefügt.
+ - Die Benutzung des MIRROR- bzw. ROTATE-Befehls wurde korrigiert für den
+ Fall, dass eine neue Gruppe definiert wird während einer dieser Befehle
+ aktiv ist.
+ - Die Behandlung des -Tags im Description-Editor und im ADD-Dialog
+ wurde korrigiert.
+ - Ein gelegentliches Problem beim Umbenennen temporärer Dateien unter Windows
+ für den Fall, dass der neue Dateiname bereits existiert, wurde behoben.
+ - Das fälschlicherweise geschehene Löschen der gebilligten DRC-Fehler beim
+ Klicken auf den "Alle löschen"-Button des ERRORS-Dialogs wurde behoben.
+ - Die erstmalige Anzeige einer Gruppe an der Mausposition bei PASTE wurde
+ korrigiert für den Fall, dass der PASTE-Befehl in der Kommandozeile
+ mit einer Orientierung eingegeben wurde.
+ - Die Anzeige des aktuellen Winkels in der Winkel-Combo-Box der
+ Parameter-Toolbar wurde korrigiert für den Fall, dass der Wert in der
+ Kommandozeile eingegeben wurde und nicht einer der standardmäßigen
+ orthogonalen Werte ist.
+ - Ein Absturz wurde behoben für den Fall, dass mit dem MITER-Befehl auf einen
+ Wire eines aus nur drei Kanten bestehenden Polygons geklickt wurde.
+ - Die Erzeugung von Technology- und Attribute-Zeilen bei EXPORT SCRIPT für
+ Devices ohne Package (wie etwa Zeichnungsrahmen etc.) wurde korrigiert.
+ - Das Loslösen eines Pins von einem Netz-Segment wurde korrigiert für den
+ Fall, dass ein Netz-Wire an dem Pin endet, ein anderer Netz-Wire über den
+ Anschlußpunkt des Pins verläuft, und der am Pin endende Wire gelöscht wird.
+ In einem solchen Fall blieb der Pin mit dem Netz verbunden, und wenn er
+ später mit einem anderen Netz verbunden wurde, war das entsprechende Pad
+ im Board an zwei verschiedenen Signalen angeschlossen.
+ - Die Online-Hilfe für das HTML-Tag wurde korrigiert (es erlaubt nur
+ Links innerhalb des gleichen Dokuments).
+ - Das Billigen von DRC-Fehlern im ERRORS-Dialog wurde korrigiert für den
+ Fall, dass einige Fehler momentan nicht angezeigt werden, da ihr Layer
+ ausgeblendet ist.
+ - Ein Absturz in der Mac-Version wurde behoben für den Fall, dass ein
+ Device im Library-Editor geladen war, das "EAGLE"-Menü geöffnet wurde und
+ der Mauszeiger über den (fälschlicherweise deaktivierten) Menü-Eintrag
+ "EAGLE beenden" bewegt wurde.
+ - Das Invertieren der Gruppenzugehörigkeit von Objekten durch Anklicken mit
+ gedrückter Ctrl-Taste wurde korrigiert.
+
+Freigabemitteilung für EAGLE 5.4.0
+==================================
+
+* Verschiedenes:
+
+ - Der Bildaufbau im Schaltplan-Editor wurde beschleunigt für den Fall, dass
+ es viele Bauteile mit vielen Attributen gibt, bei denen der Wert nicht
+ angezeigt wird.
+
+* Fehlerbehebungen:
+
+ - Das Erkennen von fälschlicherweise auftauchenden, namenlosen Attributen bei
+ Bauteilen, für den Fall, dass ein Bauteil kopiert wird und vorher Attribute
+ gelöscht wurden, wurde korrigiert.
+ - Ein Absturz im DRC bei Kreisbögen mit der Breite 0 in den Layern
+ t/bRestrict wurde behoben.
+ - Die Behandlung von geraden Wires der Breite 0 in den Layern t/bRestrict
+ wurde korrigiert.
+ - Das Ändern des Netznamens aller Segmente auf der aktuellen Seite wurde
+ korrigiert für den Fall, dass das gleiche Netz auch auf anderen Seiten
+ vorkommt.
+ - Die Behandlung von UNC-Pfaden in Optionen/Verzeichnisse wurde korrigiert.
+ - Die Auswahl von Bauteilen, die aus mehreren Gattern bestehen, über deren
+ Namen im NAME-Befehl wurde korrigiert (der alte Name mußte als voller
+ Gattername angegeben werden, etwa IC1A, anstatt des eigentlichen
+ Bauteilnamens, also IC1).
+ - Zeichen-Artefakte beim Bewegen eines Bauteils im Board, welches Pads bzw.
+ SMDs mit langen Namen hat, wurden korrigiert für den Fall, dass die
+ Anzeige der Pad-Namen eingeschaltet ist.
+ - Ein Absturz in der User Language Funktion fileglob() wurde behoben für
+ den Fall, dass der übergebene Muster-String leer ist.
+ - Eine doppelte Bestätigungsabfrage bei Benutzung der User Language Funktion
+ dlgFileSave() wurde korrigiert.
+ - Das Löschen der Statuszeile im SHOW-Befehl wurde behoben für den Fall, dass
+ auf ein unbenamtes Objekt geklickt wird, nachdem ein benamtes hervorgehoben
+ wurde.
+ - Die Behandlung von Luftlinien der Länge 0 beim Bewegen einer Gruppe wurde
+ korrigiert.
+ - Es wird jetzt sichergestellt, dass die tatsächlich im VIA-Befehl verwendete
+ Via-Länge auch eine der im Layer-Setup definierten Längen ist.
+ - Überflüssige Luftlinien bei der Prüfung, ob ein Wire mit einem Polygon
+ verbunden ist, wurden behoben.
+ - Die Berechnung von Polygonen mit einer großen Width, die an Pads mit
+ Thermals angeschlossen sind, wurde korrigiert.
+ - Eine fehlerhafte Backannotation wurde behoben für den Fall, dass ein
+ Attribut eines Bauteils im Board geändert wird, und das entsprechende
+ Bauteil im Schaltplan dieses Attribut nicht hat.
+ - Die Behandlung von Pin-Namen mit @nnbei CUT/PASTE wurde korrigiert.
+ - Ein Absturz bei der Eingabe von 'CLASS -8' wurde behoben.
+ - Das Löschen der Statusmeldung "Bauteiledefinition wird aus dem
+ Zwischenspeicher aktualisiert" im PASTE-Befehl wurde korrigiert.
+ - Die Funktion des INVOKE-Befehls nach einer CUT/PASTE-Operation wurde
+ korrigiert für den Fall, dass das Gatter gesmasht war, und nicht
+ Bestandteil der ursprünglich definierten Gruppe war.
+ - Beim Laden einer Schaltplan- bzw. Library-Datei aus einer früheren Version
+ werden jetzt die neuen Layer 97 und 98 automatisch hinzugefügt.
+ - Die Behandlung von "blind" bzw. "buried" Vias im CAM-Prozessor wurde
+ korrigiert für den Fall, dass keiner der von einem bestimmten Via
+ betroffenen Layer aktiv ist (das Bohrloch wurde bei ausgeschalteter Option
+ "Pads füllen" immer dargestellt und beschädigte unter Umständen Wires in
+ anderen Layern).
+ - Die Behandlung des Offsets von Wires und Texten von im Symbol eines Devices
+ enthaltenen Zeichnungsrahmen in UL_FRAME wurde korrigiert.
+ - Die Orientierung und Positionierung von Texten von im Symbol eines Devices
+ enthaltenen Zeichnungsrahmen im CAM-Prozessor wurde korrigiert.
+ - Die Behandlung von Extensions im RENAME-Befehl wurde korrigiert.
+ - Die Berechnung der Zahl der Ecken von Kreisbögen und Kreisen in den
+ Ausgabegeräten des CAM-Prozessors wurde korrigiert.
+ - Eine mögliche Datenverfälschung wurde behoben für den Fall, dass der
+ RIPUP-Befehl mit der Option '!' benutzt wurde, ohne die Kommandozeile
+ mit ';' abzuschließen.
+
+Freigabemitteilung für EAGLE 5.3.0
+==================================
+
+* Plattformen:
+
+ - Die Linux-Version von EAGLE benutzt nicht mehr die libXinerama und
+ libXfixes, da diese nicht auf allen Systemen vorhanden sind.
+
+* User Interface:
+
+ - Normalerweise verändert EAGLE die Position des Mauszeigers nicht von sich
+ aus. Es gibt allerdings Benutzer, die möchten, dass der Mauszeiger auf den
+ Punkt zurückpositioniert wird, an dem er war, bevor ein Kontext-Menü im
+ Zeichnungseditor geöffnet wurde. Der Befehl
+
+ SET Option.RepositionMouseCursorAfterContextMenu 1;
+
+ schaltet jetzt diese Funktionalität ein.
+ - Shift+Rechte Maustaste kehrt jetzt die Richtung der Drehung um bei
+ Befehlen, die Objekte mit der rechten Maustaste drehen.
+
+* AUTO-Befehl:
+
+ - Die Optionen LOAD und SAVE im AUTO-Befehl erlauben jetzt das Laden bzw.
+ Abspeichern der Autorouter-Parameter.
+
+* BOARD-Befehl:
+
+ - Die Standard-Platinenumrisse, die vom BOARD-Befehl generiert werden,
+ beginnen jetzt am Ursprung der Zeichenfläche, und sind nicht mehr so
+ versetzt, dass sie symmetrisch im 50mil-Raster liegen.
+
+* INVOKE-Befehl:
+
+ - Der INVOKE-Befehl zeigt jetzt in der Statuszeile den Bauteil- und
+ Device-Namen des am Cursor hängenden Objektes an.
+
+* PASTE-Befehl:
+
+ - Der PASTE-Befehl akzeptiert jetzt einen 'orientation'-Parameter in der
+ Kommandozeile.
+ - Der PASTE-Befehl ist nicht mahr transparent, da dies verhinderte, dass
+ seine Parameter-Toolbar angezeigt wird.
+
+* ROUTE-Befehl:
+
+ - Wenn eine Luftlinie geroutet wird, die an einem bereits verlegten Wire
+ beginnt, so übernimmt der neu verlegte Wire jetzt die Breite des bereits
+ existierenden Wires, wenn beim Selektieren der Luftlinie die Shift-Taste
+ gedrückt wird.
+ - Der Endpunkt der dynamisch berechneten Luftlinie wird jetzt immer als
+ zusätzlicher Rasterpunkt benutzt, auch wenn er nicht auf dem aktuellen
+ Raster liegt. Hat die verbleibende Luftlinie eine Länge, die kürzer als
+ SNAP_LENGTH ist, so schnappt der zu verlegende Wire automatisch auf den
+ Endpunkt der Luftlinie, und bleibt dort, bis der Mauszeiger mindestens
+ SNAP_LENGTH von diesem Punkt entfernt wird.
+ Der SET-Parameter SNAP_BENDED ist jetzt obsolet, wird aber aus
+ Kompatibilitätsgründen noch toleriert.
+
+* SET-Befehl:
+
+ - Der SET-Parameter SNAP_BENDED ist jetzt obsolet, wird aber aus
+ Kompatibilitätsgründen noch toleriert.
+
+* Verschiedenes:
+
+ - Das Selektieren von nahe beieinander liegenden Wires, die zum selben
+ Signal gehören, wurde verbessert.
+ - Pin-Namen mit '@' werden jetzt in den Voransichten genauso dargestellt
+ wie im Schaltplan (mit allem nach und einschießlich dem '@' abgeschnitten).
+
+* Fehlerbehebungen:
+
+ - Die Statuszeile wird jetzt nach einem Eigenschaften-Dialog gelöscht.
+ - Die Behandlung von Polygonen im t/bStop-Layer von gespiegelten Bauteilen
+ im DRC wurde korrigiert.
+ - Das Auslesen des Pfades zum AppData-Verzeichnis aus der Windows-Registry
+ wurde korrigiert für den Fall, dass dieser Nicht-ASCII-Zeichen enthält.
+ - Ein Absturz im NET-Befehl wurde behoben für den Fall, dass auf einen Bus
+ geklickt wird, dessen Name nur den "SYNONYM:"-Anteil enthält.
+ - Die Behandlung von Via-Längen im Eigenschaften-Dialog, die gemäß dem
+ Layer-Setup nicht erlaubt sind, wurde korrigiert.
+ - Ein Absturz bei CHANGE LAYER mit Signal-Wires wurde behoben.
+ - Die Darstellung von Objekten im Layer 50 am Bildschirm und beim Ausdrucken
+ wurde korrigiert.
+ - Das Umbenennen eines Netzes im Eigenschaften-Dialog wurde korrigiert für
+ den Fall, dass das gleiche Netz auch auf anderen Schaltplanseiten vorkommt.
+ - Ein möglicher Verlust der Konsistenz wurde behoben für den Fall, dass
+ Änderungen im Schaltplan gemacht wurden, auf eine andere Schaltplanseite
+ umgeschaltet wurde, weitere Änderungen gemacht wurden, und schließlich im
+ Board-Editor UNDO gemacht wurde. In einem solchen Fall driftete die Zahl
+ der UNDO-Schritte in Board- und Schaltplan-Editor auseinander. Bei jedem
+ Wechsel der Schaltplanseite wird jetzt ein separater UNDO-Schritt
+ gespeichert, auch wenn auf dieser Seite nichts verändert wird.
+ - Das unSMASH von Bauteilen im Schaltplan wurde korrigiert (es löschte
+ Attribute des Bauteils im Board).
+ - Eine extrem lange Verzögerung beim Speichern einer Datei wurde
+ korrigiert.
+ - Das Beispiel zur Benutzung von SMD_FLAG_STOP in der Online-Hilfe zu
+ UL_SMD wurde korrigiert.
+ - Die Anzeige des Titels in der Statuszeile wurde korrigiert für den Fall,
+ dass ein Befehl längere Zeit läuft und die Maus innerhalb des
+ Editor-Fensters bewegt wird.
+ - Die User Language Funktion UL_SIGNAL.airwireshidden wurde korrigiert.
+ - Das Markieren des Textes des ersten String-Eingabefeldes eines UserLanguage
+ Dialogs beim Öffnen des Dialogs wurde korrigiert (hat unter Windows nicht
+ funktioniert).
+ - Die Behandlung der $HOME Umgebungsvariablen unter Windows in den
+ Verzeichnissen, die im Dialog "Optionen/Verzeichnisse" eingetragen wurden,
+ wurde korrigiert.
+ - Das Selektieren von Pins mit dem GROUP-Befehl wurde korrigiert (sie waren
+ in der Gruppe, auch wenn der Symbols-Layer ausgeblendet war).
+ - Fälschlicherweise auftauchende, namenlose Attribute bei Bauteilen wurden
+ korrigiert für den Fall, dass ein Bauteil kopiert wird und vorher
+ Attribute gelöscht wurden.
+ - Das Sicherstellen der Sichtbarkeit des Text-Cursors beim Öffnen eines
+ Text-Editor-Fenster während des Ladens eines Projekts wurde korrigiert.
+ - Die Darstellung der Platzhaltertexte ">DRAWING_NAME", ">LAST_DATE_TIME",
+ ">PLOT_DATE_TIME" und ">SHEET" wurde korrigiert für neue, noch nicht
+ abgespeicherte Zeichnungen.
+ - Die Layer-Liste behält jetzt den Fokus wenn auf einen Button im
+ DISPLAY-Dialog geklickt wird.
+ - Der Text in der oberen Hälfte des HTML-Editors wird jetzt immer als HTML
+ angezeigt.
+ - Das Zentrieren auf den aktuellen Fehler im ERRORS-Dialog durch Drücken der
+ Eingabetaste wurde korrigiert.
+ - Das Setzen des Fokus im Design Rules Dialog wurde korrigiert.
+ - Das Auffrischen der Baumansicht des Control Panels nach dem Kopieren eines
+ Verzeichnisses wurde korrigiert.
+ - Das Löschen der ursprünglichen Luftlinie nach der Anzeige eines Dialogs,
+ während der ROUTE-Befehl aktiv ist und eine Luftlinie am Mauszeiger
+ hängt, wurde korrigiert.
+ - Das Melden von Aufrufen von nicht existierenden Objekt-Members in der
+ User Language (wie etwa UL_WIRE.arc.curve) wurde korrigiert.
+ - Das Setzen des 'Curve'-Parameters auf 0 im Eigenschaften-Dialog eines
+ gebogen Wires wurde korrigiert.
+ - Ein möglicher Absturz bei der Verwendung von CLOSE in einer Script-Datei
+ und dem anschließenden Auftreten einer Message Box wurde behoben.
+ - Das automatische Platzieren von Elementen im BOARD-, ADD- und PASTE-Befehl
+ (vom Schaltplan aus) wurde korrigiert, so dass sie nicht außerhalb des
+ gültigen Koordinatenbereichs platziert werden.
+ - Das Einsortieren von neu angelegten Objekten in der Baumansicht des
+ Control Panels wurde korrigiert.
+ - Zeichen-Artefakte bei UNDO nach RIPUP wurden korrigiert.
+ - Doppelte Daten für gedrehte rechteckige Blenden bei Gerber RS-274-X wurden
+ korrigiert.
+ - Zeichen-Artefakte bei UNDO nach dem Löschen einer Polygon-Kante wurden
+ korrigiert.
+ - Die dynamische Berechnung der Luftlinie im ROUTE-Befehl wurde korrigiert
+ für den Fall, dass Layer, die Objekte enthalten, die zum gerouteten Signal
+ gehören, ausgeblendet sind.
+ - Die Eingabe von Werten in der Winkel-ComboBox der Parameter-Toolbar wurde
+ korrigiert.
+ - Das Setzen von HKEY_CLASSES_ROOT\Applications\eagle.exe\shell\open\command
+ in der Windows-Registry wurde korrigiert (es war eine Zeichenkette anstatt
+ eines Schlüssels).
+ - Das Drucken von Linien der Breite 0 auf dem Mac wurde korrigiert (sie
+ wurden zu dick gedruckt).
+ - Ein mögliches Hängenbleiben des Programms wurde behoben für den Fall, dass
+ in der Tabelle des Attribut-Dialogs des Bibliotheks-Editors eine Ziffern-
+ oder Buchstabentaste gedrückt wurde.
+
+Freigabemitteilung für EAGLE 5.2.0
+==================================
+
+* ATTRIBUTE-Befehl:
+
+ - Die "Technologien" Combo-Box im "Neues Attribut/Attribut ändern" Dialog
+ zeigt jetzt den Namen der aktuellen Technologie an.
+ - Das Verhalten des ATTRIBUTE-Befehls für den Fall, dass keine Koordinaten
+ in der Kommandozeile angegeben werden, wurde verändert, um es zu
+ ermöglichen, den Wert eines bereits existierenden Attributs über die
+ Kommandozeile zu ändern.
+
+* DRC-Befehl:
+
+ - Der DRC meldet jetzt Supply-Layer, die nicht im Layer-Setup der
+ Design-Rules enthalten sind, als "Layer Setup"-Fehler.
+
+* SET-Befehl:
+
+ - Der SET-Befehl kann jetzt dazu benutzt werden, Parameter der eaglerc-Datei
+ zu verändern.
+
+* Verschiedenes:
+
+ - Falls Ihnen die Art, wie die Kanten von nicht berechneten Polygonen
+ dargestellt werden (als gepunktete Linien), nicht zusagt, so können Sie
+ dies mit dem Befehl
+
+ SET Option.DrawUnprocessedPolygonEdgesContinuous 1
+
+ ändern. Die Kanten von nicht berechneten Polygonen werden dann wieder als
+ durchgezogene Linien dargestellt, wie es vor Version 5 der Fall war
+ (allerdings nicht hell).
+ - Die Befehle CUT, DRC, ERC, ERRORS, EXPORT, GROUP, OPTIMIZE, PASTE, PRINT,
+ RATSNEST, UPDATE, USE und WRITE sind jetzt "transparent", d. h. sie
+ beenden nicht mehr einen vorher aktiven Befehl, wie etwa MOVE.
+ - Die Layer werden jetzt in der Reihenfolge dargestellt, wie es der fertigen
+ Platine entspricht. So wird zum Beispiel zuerst der Bestückungsplan der
+ Unterseite gezeichnet, dann die Signallagen von "Bottom" bis "Top", und
+ schließlich der Bestückungsplan der Oberseite. Bei gespiegeltem Ausdruck
+ wird diese Reihenfolge umgekehrt.
+ - Die Online-Hilfe für den PAD- bzw. VIA-Befehl enthält jetzt den Hinweis,
+ dass die Form nur für die Aussenlagen gilt (in Innenlagen ist die Form
+ immer "rund").
+ - Bauteile auf dem Board werden jetzt in die erlaubte Fläche der Light- bzw.
+ Standard-Edition verschoben, wenn sie nach einem der Befehle REPLACE,
+ CHANGE PACKAGE oder UPDATE aus dieser Fläche hinausragen.
+
+* Fehlerbehebungen:
+
+ - CHANGE SHAPE ignoriert jetzt die Optionen LONG und OFFSET, wenn der Befehl
+ in der Kommandozeile eines Board-Editor-Fensters eingegeben wird.
+ - Die Darstellung sehr schmaler Rechtecke unter Linux wurde korrigiert für
+ den Fall, dass das resultierende Rechteck auf dem Bildschirm nur ein
+ Pixel breit ist.
+ - Die Sichtbarkeit der Seitennummern in der Schaltplan-Seitenvorschau bei
+ schwarzem Hintergrund wurde korrigiert.
+ - Die Berechnung der Anzahl der Kanten beim Zeichnen eines Kreisbogens mit
+ runden Enden im CAM-Prozessor wurde korrigiert.
+ - Das Umschalten des Knickwinkels mittels der Buttons in der
+ Parameter-Toolbar, nachdem mit Ctrl+Linke Maustaste in den Kreisbogen-Modus
+ geschaltet wurde, wurde korrigiert.
+ - Ein User Language Performance-Problem mit String-Ausdrücken wie 's += t'
+ in Schleifen, die oft durchlaufen werden, wurde behoben.
+ - Ein Absturz beim Ändern der Grid-Farbe wurde behoben für den Fall, dass
+ eine Bibliothek geöffnet, aber noch kein konkretes Package, Symbol oder
+ Device-Set geladen ist, und das Grid eingeblendet ist.
+ - Ein Performance-Problem bei der Anzeige von Status-Meldungen und
+ Fortschrittsanzeigen wurde korrigiert.
+ - Die Behandlung von Großbuchstaben in Verzeichnisnamen in der Baumansicht
+ des Control Panels unter Windows und Mac OS X wurde korrigiert.
+ - Das Setzen des Zustandes einer dlgCheckBox aus ihrem Statement heraus
+ wurde korrigiert.
+ - Ein Absturz bei der Eingabe eines Kurvenparameters (etwa "@+20") in einem
+ Befehl, der mit Wires arbeitet, ohne einen konkreten Wire am Cursor hängen
+ zu haben, wurde korrigiert.
+ - Ein Verlust der aktuellen Text-Markierung beim Klicken mit der rechten
+ Maustaste in ein numerisches Eingabefeld wurde korrigiert.
+ - Eine mögliche Datenverfälschung nach der Änderung der Koordinaten eines
+ Objektes bzw. des Layers eines Wires im "Eigenschaften"-Dialog, für den
+ Fall, dass sich daraus eine Wire-Optimierung ergab, wurde behoben.
+ - Die Behandlung des 'A'-Steuerzeichens bei der Eingabe von Koordinaten in
+ der Kommandozeile wurde korrigiert.
+ - Die Auffrischung eines ULP-Dialogs wurde korrigiert für den Fall, dass der
+ Aufruf von dlgRedisplay() von einer Schleifen-Anweisung gefolgt wird.
+ - Eine unerwartete Änderung des Offsets in einer dlgTextView, für den Fall,
+ dass ein anderes Dialogobjekt verändert wurde, wurde korrigiert.
+ - Die Anzeige von Statusmeldungen während ein Script läuft wurde
+ korrigiert.
+ - Die Berechnung der Breite der letzten Spalte einer dlgListView wurde
+ korrigiert.
+ - Die Aktualsierung der Layer-Farben in der Layer-Combo-Box der
+ Parameter-Toolbar wurde korrigiert für den Fall, dass diese mit dem
+ DISPLAY- bzw. SET-Befehl verändert werden während ein Befehl aktiv ist.
+ - Die Forward-Annotation einer Änderung eines Netznamens im
+ Eigenschaften-Dialog eines Netz-Wires bzw. einer Junction wurde korrigiert.
+ - Das Zeichnen von gedrehten Rechtecken im GERBER_RS274X-Treiber des
+ CAM-Prozessors wurde korrigiert für den Fall, dass die Zeichnung
+ ausschließlich aus solchen Rechtecken besteht.
+ - Das Setzen der Seitengröße im Druckdialog auf Linux-Systemen die das CUPS
+ Drucksystem verwenden wurde korrigiert.
+ - Das Zurücksetzen eines veränderten Attributwertes auf den Standardwert
+ der Bibliothek wurde korrigiert für den Fall, dass der Standardwert leer
+ ist.
+ - Das Ãœberschreiben eines nicht leeren Standardwerts eines Attributes mit
+ einem leeren Wert im Schaltplan wurde korrigiert.
+ - Der RIPUP-Befehl für Polygone von ausgewählten Signalen wurde korrigiert
+ für den Fall, dass die Kommandozeile mit ';' abgeschlossen wurde.
+ - Fehlende Leerzeichen bei der Behandlung des '-' Zeichens zwischen
+In den Design-Regeln ("Design Rules") legt man alle für die Platine und deren
+Fertigung relevanten Parameter fest. Die Überprüfung eines
+Layouts kann jederzeit mit dem Design-Rule-Check (DRC-Befehl)
+erfolgen. Verwenden Sie den Autorouter, sind diese Regeln
+ebenfalls gültig.
+
+All the parameters relevant to the board and its manufacture
+are specified in the Design Rules. The layout can be checked
+any time with the aid of the Design Rule Check (DRC
+command). These rules are also valid for the Autorouter.
+ \nDie Standard-Design-Rules sind so gewählt, dass sie für \ndie meisten Anwendungen passen. Sollte ihre Platine \nbesondere Anforderungen haben, treffen Sie die erforderlichen\nEinstellungen hier und speichern die Design Rules unter \neinem neuen Namen ab.
+description[en] = EAGLE Design Rules\n \nThe default Design Rules have been set to cover\na wide range of applications. Your particular design\nmay have different requirements, so please make the\nnecessary adjustments and save your customized\ndesign rules under a new name.
+layerSetup = (1*16)
+mtCopper = 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm
+mtIsolate = 1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm
+mdWireWire = 8mil
+mdWirePad = 8mil
+mdWireVia = 8mil
+mdPadPad = 8mil
+mdPadVia = 8mil
+mdViaVia = 8mil
+mdSmdPad = 8mil
+mdSmdVia = 8mil
+mdSmdSmd = 8mil
+mdViaViaSameLayer = 8mil
+mnLayersViaInSmd = 2
+mdCopperDimension = 40mil
+mdDrill = 8mil
+mdSmdStop = 0mil
+msWidth = 10mil
+msDrill = 24mil
+msMicroVia = 9.99mm
+msBlindViaRatio = 0.500000
+rvPadTop = 0.250000
+rvPadInner = 0.250000
+rvPadBottom = 0.250000
+rvViaOuter = 0.250000
+rvViaInner = 0.250000
+rvMicroViaOuter = 0.250000
+rvMicroViaInner = 0.250000
+rlMinPadTop = 10mil
+rlMaxPadTop = 20mil
+rlMinPadInner = 10mil
+rlMaxPadInner = 20mil
+rlMinPadBottom = 10mil
+rlMaxPadBottom = 20mil
+rlMinViaOuter = 8mil
+rlMaxViaOuter = 20mil
+rlMinViaInner = 8mil
+rlMaxViaInner = 20mil
+rlMinMicroViaOuter = 4mil
+rlMaxMicroViaOuter = 20mil
+rlMinMicroViaInner = 4mil
+rlMaxMicroViaInner = 20mil
+psTop = -1
+psBottom = -1
+psFirst = -1
+psElongationLong = 100
+psElongationOffset = 100
+mvStopFrame = 1.000000
+mvCreamFrame = 0.000000
+mlMinStopFrame = 4mil
+mlMaxStopFrame = 4mil
+mlMinCreamFrame = 0mil
+mlMaxCreamFrame = 0mil
+mlViaStopLimit = 0mil
+srRoundness = 0.000000
+srMinRoundness = 0mil
+srMaxRoundness = 0mil
+slThermalGap = 0.500000
+slMinThermalGap = 20mil
+slMaxThermalGap = 100mil
+slAnnulusIsolate = 20mil
+slThermalIsolate = 10mil
+slAnnulusRestring = 0
+slThermalRestring = 1
+slThermalsForVias = 0
+checkGrid = 0
+checkAngle = 0
+checkFont = 1
+checkRestrict = 1
+useDiameter = 13
+maxErrors = 50
diff --git a/eagle-5.7.0/lbr/19inch.lbr b/eagle-5.7.0/lbr/19inch.lbr
new file mode 100644
index 0000000..0813832
Binary files /dev/null and b/eagle-5.7.0/lbr/19inch.lbr differ
diff --git a/eagle-5.7.0/lbr/40xx.lbr b/eagle-5.7.0/lbr/40xx.lbr
new file mode 100644
index 0000000..292aa81
Binary files /dev/null and b/eagle-5.7.0/lbr/40xx.lbr differ
diff --git a/eagle-5.7.0/lbr/41xx.lbr b/eagle-5.7.0/lbr/41xx.lbr
new file mode 100644
index 0000000..76ca9f6
Binary files /dev/null and b/eagle-5.7.0/lbr/41xx.lbr differ
diff --git a/eagle-5.7.0/lbr/45xx.lbr b/eagle-5.7.0/lbr/45xx.lbr
new file mode 100644
index 0000000..3b49653
Binary files /dev/null and b/eagle-5.7.0/lbr/45xx.lbr differ
diff --git a/eagle-5.7.0/lbr/74ac-logic.lbr b/eagle-5.7.0/lbr/74ac-logic.lbr
new file mode 100644
index 0000000..ea31003
Binary files /dev/null and b/eagle-5.7.0/lbr/74ac-logic.lbr differ
diff --git a/eagle-5.7.0/lbr/74ttl-din.lbr b/eagle-5.7.0/lbr/74ttl-din.lbr
new file mode 100644
index 0000000..bf0f48a
Binary files /dev/null and b/eagle-5.7.0/lbr/74ttl-din.lbr differ
diff --git a/eagle-5.7.0/lbr/74xx-eu.lbr b/eagle-5.7.0/lbr/74xx-eu.lbr
new file mode 100644
index 0000000..366176b
Binary files /dev/null and b/eagle-5.7.0/lbr/74xx-eu.lbr differ
diff --git a/eagle-5.7.0/lbr/74xx-little-de.lbr b/eagle-5.7.0/lbr/74xx-little-de.lbr
new file mode 100644
index 0000000..17e8b9b
Binary files /dev/null and b/eagle-5.7.0/lbr/74xx-little-de.lbr differ
diff --git a/eagle-5.7.0/lbr/74xx-little-us.lbr b/eagle-5.7.0/lbr/74xx-little-us.lbr
new file mode 100644
index 0000000..ff267c5
Binary files /dev/null and b/eagle-5.7.0/lbr/74xx-little-us.lbr differ
diff --git a/eagle-5.7.0/lbr/74xx-us.lbr b/eagle-5.7.0/lbr/74xx-us.lbr
new file mode 100644
index 0000000..ca9bb99
Binary files /dev/null and b/eagle-5.7.0/lbr/74xx-us.lbr differ
diff --git a/eagle-5.7.0/lbr/751xx.lbr b/eagle-5.7.0/lbr/751xx.lbr
new file mode 100644
index 0000000..cb28c3b
Binary files /dev/null and b/eagle-5.7.0/lbr/751xx.lbr differ
diff --git a/eagle-5.7.0/lbr/ChangeLog b/eagle-5.7.0/lbr/ChangeLog
new file mode 100644
index 0000000..7990f16
--- /dev/null
+++ b/eagle-5.7.0/lbr/ChangeLog
@@ -0,0 +1,6994 @@
+EAGLE Library ChangeLog
+=======================
+
+2010-01-11
+ * analog-devices.lbr: Eagle 5.6.4
+ added:
+ AD8235.DEV
+ AD8603.DEV
+ AD8607.DEV
+ AD8609.DEV
+ BGA_CB11.PAC
+
+2010-01-07
+ * texas.lbr: Eagle 5.6.4
+ corrected connection:
+ MSP430F5*.DEV
+
+2010-01-07
+ * con-phoenix-smkdsp.lbr: Eagle 5.6.4
+ changed pads to drill 1.6mm; diameter 1.8mm:
+ SMKDSP_1,5/2.PAC
+ SMKDSP_1,5/3.PAC
+ SMKDSP_1,5/4.PAC
+ SMKDSP_1,5/5.PAC
+ SMKDSP_1,5/6.PAC
+ SMKDSP_1,5/7.PAC
+ SMKDSP_1,5/8.PAC
+ SMKDSP_1,5/9.PAC
+ SMKDSP_1,5/10.PAC
+ SMKDSP_1,5/11.PAC
+ SMKDSP_1,5/12.PAC
+ SMKDSP_1,5/13.PAC
+ SMKDSP_1,5/14.PAC
+ SMKDSP_1,5/12.PAC
+
+2010-01-07
+ * microchip.lbr: Eagle 5.6.4
+ changed smd size to 0.65 1.7 mm at package:
+ SO28W.PAC
+
+2009-12-22
+ * logo.lbr: Eagle 5.6.3
+ added:
+ EAGLE-PLC-8MM.PAC
+ EAGLE-PLC-10MM.PAC
+ EAGLE-PLC-12MM.PAC
+ EAGLE-PLC-15MM.PAC
+ EAGLE-TOP-8MM.PAC
+ EAGLE-TOP-10MM.PAC
+ EAGLE-TOP-12MM.PAC
+ EAGLE-TOP-15MM.PAC
+
+2009-12-22
+ * analog-devices.lbr: Eagle 5.6.3
+ added:
+ AD210.DEV
+ AD215.DEV
+ AD526.DEV
+ AD623.DEV
+ AD625.DEV
+ AD627.DEV
+ AD711.DEV
+ AD712.DEV
+ AD744.DEV
+ AD745.DEV
+ AD746.DEV
+ AD797.DEV
+ AD807*.DEV
+ AD811.DEV
+ AD817.DEV
+ AD818.DEV
+ AD820.DEV
+ AD820N.DEV
+ AD822.DEV
+ AD825.DEV
+ AD826.DEV
+ AD845.DEV
+ AD1985.DEV
+ AD7676.DEV
+ AD7730.DEV
+ AD8001.DEV
+ AD8015.DEV
+ AD8031.DEV
+ AD8033.DEV
+ AD8041.DEV
+ AD8042.DEV
+ AD8065.DEV
+ AD8066.DEV
+ AD8079.DEV
+ AD8519.DEV
+ AD8529.DEV
+ AD8541.DEV
+ AD8542.DEV
+ AD8544.DEV
+ AD8597.DEV
+ AD8599.DEV
+ AD8610.DEV
+ AD8614.DEV
+ AD8620.DEV
+ AD8644.DEV
+ AD8655.DEV
+ AD8656.DEV
+ ADA4075-2.DEV
+ ADA4627-1CP.DEV
+ ADA4627-1R.DEV
+ ADA4692-2.DEV
+ ADA4692-4.DEV
+ ADA4853-1.DEV
+ ADA4853-2.DEV
+ ADA4853-3RU.DEV
+ ADA4853-3VQ.DEV
+ ADAU1592.DEV
+ ADAV801.DEV
+ ADAV803.DEV
+ ADAV804.DEV
+ ADG411.DEV
+ ADG412.DEV
+ ADG413.DEV
+ ADSP_21368.DEV
+ ADSP_21369.DEV
+ ADSP_21375.DEV
+ ADSP_21462W.DEV
+ ADSP_21467.DEV
+ ADV7184.DEV
+ ADV7194.DEV
+ BUF04.DEV
+ MAT04.DEV
+ AD210.PAC
+ AD215.PAC
+ BGA_256.PAC
+ BGA_324_CSP.PAC
+ H08.PAC
+ LFCSP8.PAC
+ LFCSP8_CP.PAC
+ SC70-5.PAC
+ SC70-6.PAC
+ SOIC16R.PAC
+ SOIC20R.PAC
+ TSSOP8.PAC
+
+2009-12-22
+ * linear.lbr: Eagle 5.6.3
+ added:
+ OP97.DEV
+ OP183.DEV
+ OP249.DEV
+ OP270.DEV
+ OP275.DEV
+ HA5024.DEV
+
+2009-12-21
+ * : Eagle 5.6.3
+ deleted: (used layer 53/54)
+ supply-dummy.lbr
+ special-pad.lbr
+ ground-junctions.lbr
+
+2009-12-21
+ * supply1.lbr: Eagle 5.6.3
+ deleted:
+ GND-GNDA.DEV
+ GND-GNDA.PAC
+ Layer 53
+ Layer 54
+
+2009-12-14
+ * resistor-power.lbr: Eagle 5.6.3
+ added:
+ AC01.PAC
+ AC03.PAC
+ AC04.PAC
+ AC05.PAC
+ AC07.PAC
+ AC10.PAC
+ CA0001.PAC
+ CA0002.PAC
+ CA4050.PAC
+ CA4055.PAC
+ CA4060.PAC
+ CA4070.PAC
+ CA4080.PAC
+ CA4090.PAC
+ CA4100.PAC
+ CA4150.PAC
+ CA4200.PAC
+ CA4220.PAC
+ CA5050.PAC
+ CA5055.PAC
+ CA5060.PAC
+ CA5070.PAC
+ CA5080.PAC
+ CA5090.PAC
+ CA5100.PAC
+ CA5150.PAC
+ CA5200.PAC
+ CA5220.PAC
+ HPS58.PAC
+ HPS63.PAC
+ HPS68.PAC
+ HPS523.PAC
+ HPS923.PAC
+ HPS932.PAC
+ HPS947.PAC
+ RS01A.PAC
+ RS01M.PAC
+ RS1/2.PAC
+ RS1/4.PAC
+ RS1/8.PAC
+ RS002.PAC
+ RS02B.PAC
+ RS02C.PAC
+ RS02C_17-23.PAC
+ RS02M.PAC
+ RS05_69-70.PAC
+ RS007.PAC
+ RS10_38-39.PAC
+ RWM4X10.PAC
+ RWM4X22.PAC
+ RWM5X26.PAC
+ RWM6X22.PAC
+ RWM6X34.PAC
+ RWM8X26.PAC
+ RWM8X34.PAC
+ RWM8X45.PAC
+ RWM10X45.PAC
+ RWM10X64.PAC
+ RWM10X65.PAC
+
+2009-12-11
+ * e-sps.lbr: Eagle 5.6.3
+ added:
+ NS-80.DEV
+ NS-80.PAC
+
+2009-12-10
+ * e-sps.lbr: Eagle 5.6.3
+ added:
+ AL2-2DA.DEV
+ AL2-2PT-ADP.DEV
+ AL2-4EX.DEV
+ AL2-4EX-A2.DEV
+ AL2-4EYR.DEV
+ AL2-4EYT.DEV
+ AL2-14MR-D.DEV
+ AL2-24MR-A.DEV
+ AL2-24MR-D.DEV
+ AL2-2DA.PAC
+ AL2-2PT-ADP.PAC
+ AL2-4EX.PAC
+ AL2-4EX-A2.PAC
+ AL2-4EYR.PAC
+ AL2-4EYT.PAC
+ AL2-14MR-D.PAC
+ AL2-24MR-A.PAC
+ AL2-24MR-D.PAC
+
+2009-12-10
+ * linear-technology.lbr: Eagle 5.6.3
+ added:
+ LT1763.DEV
+ LT1763CS8.DEV
+ DFN12.PAC
+ LT1963EFE.DEV
+ TSSOP16.PAC
+ TSSOP16EXP.PAC
+
+2009-12-09
+ * micro-philips.lbr: Eagle 5.6.3
+ added: package variant SO8
+ PCA82C250.DEV
+
+2009-12-08
+ * u-blox.lbr: Eagle 5.6.3
+ added:
+ LEON-G100/G200.DEV
+ LEON-G100/G200.PAC
+
+2009-12-04
+ * analog-devices.lbr: Eagle 5.6.2
+ added:
+ AD1877.DEV
+ AD1890.DEV
+ AD1891.DEV
+ AD1892.DEV
+ AD1953.DEV
+ AD1954.DEV
+ AD1983.DEV
+ DIL28-6.PAC
+ SO-28R.PAC
+
+2009-12-04
+ * con-phoenix-762.lbr: Eagle 5.6.2
+ transferred from con-phoenix-508.lbr:
+ GMSTBA2.DEV
+ GMSTBA3.DEV
+ GMSTBA4.DEV
+ GMSTBA6.DEV
+ GMSTBA7.DEV
+ GMSTBA8.DEV
+ GMSTBA9.DEV
+ GMSTBA10.DEV
+ GMSTBA12.DEV
+ GMSTBV2.DEV
+ GMSTBV3.DEV
+ GMSTBV4.DEV
+ GMSTBV5.DEV
+ GMSTBV6.DEV
+ GMSTBV7.DEV
+ GMSTBV8.DEV
+ GMSTBV9.DEV
+ GMSTBV10.DEV
+ GMSTBV12.DEV
+ GMSTBA2.PAC
+ GMSTBA3.PAC
+ GMSTBA4.PAC
+ GMSTBA6.PAC
+ GMSTBA7.PAC
+ GMSTBA8.PAC
+ GMSTBA9.PAC
+ GMSTBA10.PAC
+ GMSTBA12.PAC
+ GMSTBV2.PAC
+ GMSTBV3.PAC
+ GMSTBV4.PAC
+ GMSTBV5.PAC
+ GMSTBV6.PAC
+ GMSTBV7.PAC
+ GMSTBV8.PAC
+ GMSTBV9.PAC
+ GMSTBV10.PAC
+ GMSTBV12.PAC
+ GMST2H.PAC
+ GMST2V.PAC
+ GMST3H.PAC
+ GMST3V.PAC
+ GMST4H.PAC
+ GMST4V.PAC
+ GMST5H.PAC
+ GMST5V.PAC
+
+2009-12-04
+ * con-phoenix-508.lbr: Eagle 5.6.2
+ transferred to con-phoenix-762.lbr:
+ GMSTBA2.DEV
+ GMSTBA3.DEV
+ GMSTBA4.DEV
+ GMSTBA6.DEV
+ GMSTBA7.DEV
+ GMSTBA8.DEV
+ GMSTBA9.DEV
+ GMSTBA10.DEV
+ GMSTBA12.DEV
+ GMSTBV2.DEV
+ GMSTBV3.DEV
+ GMSTBV4.DEV
+ GMSTBV5.DEV
+ GMSTBV6.DEV
+ GMSTBV7.DEV
+ GMSTBV8.DEV
+ GMSTBV9.DEV
+ GMSTBV10.DEV
+ GMSTBV12.DEV
+ GMSTBA2.PAC
+ GMSTBA3.PAC
+ GMSTBA4.PAC
+ GMSTBA6.PAC
+ GMSTBA7.PAC
+ GMSTBA8.PAC
+ GMSTBA9.PAC
+ GMSTBA10.PAC
+ GMSTBA12.PAC
+ GMSTBV2.PAC
+ GMSTBV3.PAC
+ GMSTBV4.PAC
+ GMSTBV5.PAC
+ GMSTBV6.PAC
+ GMSTBV7.PAC
+ GMSTBV8.PAC
+ GMSTBV9.PAC
+ GMSTBV10.PAC
+ GMSTBV12.PAC
+ GMST2H.PAC
+ GMST2V.PAC
+ GMST3H.PAC
+ GMST3V.PAC
+ GMST4H.PAC
+ GMST4V.PAC
+ GMST5H.PAC
+ GMST5V.PAC
+
+2009-12-03
+ * special-drill.lbr: Eagle 5.6.2
+ added:
+ PAD_0.1800.PAC
+
+2009-12-02
+ * linx.lbr: Eagle 5.6.2
+ added:
+ TRM-*-LT.DEV
+ TRM-XXX-LT.PAC
+
+2009-12-02
+ * linear.lbr: Eagle 5.6.2
+ added:
+ TL331.DEV
+ DBV-R-PDSO-G5.PAC
+
+2009-12-02
+ * diode.lbr: Eagle 5.6.2
+ added:
+ 1N581*.DEV
+ DO41-7.6.PAC
+
+2009-12-01
+ * eib-busch-jaeger.lbr: Eagle 5.6.2
+ added:
+ 6010-25.DEV
+ 6020-XX.DEV
+ 6021-XX.DEV
+ 6108-U.DEV
+ 6109-U.DEV
+ 6110-U-101.DEV
+ 6114-U.DEV
+ 6115-XX-101.DEV
+ 6116-XX-101.DEV
+ 6117-XX-101.DEV
+ 6119/20.DEV
+ 6119/40.DEV
+ 6122-XX.DEV
+ 6123-XX.DEV
+ 6123USB-XX.DEV
+ 6124-XX.DEV
+ 6125-XX.DEV
+ 6126-XX.DEV
+ 6127-XX.DEV
+ 6127MF-XX.DEV
+ 6128-XX.DEV
+ 6129-XX.DEV
+ 6131-XX-102.DEV
+ 6132-XX-102.DEV
+ 6132-XX-102M.DEV
+ 6133-XX-101.DEV
+ 6133USB-XX.DEV
+ 6134-XX-102.DEV
+ 6134/10.DEV
+ 6135-XX-102.DEV
+ 6136-XX.DEV
+ 6136/30M.DEV
+ 6136/40-101.DEV
+ 6136/100C.DEV
+ 6136/100CB.DEV
+ 6136/100M.DEV
+ 6140-101.DEV
+ 6144/10-101.DEV
+ 6146.DEV
+ 6146-101.DEV
+ 6151EB.DEV
+ 6152EB-101.DEV
+ 6153EB.DEV
+ 6155EB-101.DEV
+ 6156EB.DEV
+ 6157EB.DEV
+ 6158EB.DEV
+ 6164/40.DEV
+ 6164U.DEV
+ 6172AG-101.DEV
+ 6173AG-101.DEV
+ 6174/10.DEV
+ 6174/11.DEV
+ 6174/12.DEV
+ 6174/13.DEV
+ 6174/14.DEV
+ 6174/15.DEV
+ 6174/16.DEV
+ 6174/17.DEV
+ 6174/18.DEV
+ 6174/19.DEV
+ 6174/20.DEV
+ 6174/21.DEV
+ 6179-XX.DEV
+ 6180-102.DEV
+ 6180/10.DEV
+ 6180/11.DEV
+ 6181-101.DEV
+ 6186/20.DEV
+ 6186/30.DEV
+ 6186USB.DEV
+ 6187-103.DEV
+ 6188/13.DEV
+ 6188/14.DEV
+ 6188/15.DEV
+ 6188/16.DEV
+ 6188/17.DEV
+ 6188/18.DEV
+ 6190/10.DEV
+ 6190/40-101.DEV
+ 6193/32.DEV
+ 6194/11.DEV
+ 6194/12.DEV
+ 6194/13.DEV
+ 6194/14.DEV
+ 6194/15.DEV
+ 6194/16.DEV
+ 6194/17.DEV
+ 6195/21.DEV
+ 6195/22.DEV
+ 6195/24.DEV
+ 6195/25.DEV
+ 6195/26.DEV
+ 6196/20.DEV
+ 6196/40-101.DEV
+ 6196/41-101.DEV
+ 6196/42.DEV
+ 6196/43.DEV
+ 6196/80.DEV
+ 6196/82.DEV
+ 6197/22.DEV
+ 6197/40.DEV
+ 6198-101.DEV
+ 6198/JA.DEV
+ 6198ST.DEV
+ 6321-XX.DEV
+ 6322-XX-101.DEV
+ 6323-XX.DEV
+ 6324-XX.DEV
+ 6325-XX.DEV
+ 6326-XX-101.DEV
+ 6327-XX.DEV
+ 6010-25.PAC
+ 6020-XX.PAC
+ 6021-XX.PAC
+ 6108-U.PAC
+ 6109-U.PAC
+ 6110-U-101.PAC
+ 6114-U.PAC
+ 6115-XX-101.PAC
+ 6116-XX-101.PAC
+ 6117-XX-101.PAC
+ 6119/20.PAC
+ 6119/40.PAC
+ 6122-XX.PAC
+ 6123-XX.PAC
+ 6123USB-XX.PAC
+ 6124-XX.PAC
+ 6125-XX.PAC
+ 6126-XX.PAC
+ 6127-XX.PAC
+ 6127MF-XX.PAC
+ 6128-XX.PAC
+ 6129-XX.PAC
+ 6131-XX-102.PAC
+ 6132-XX-102.PAC
+ 6132-XX-102M.PAC
+ 6133-XX-101.PAC
+ 6133USB-XX.PAC
+ 6134-XX-102.PAC
+ 6134/10.PAC
+ 6135-XX-102.PAC
+ 6136-XX.PAC
+ 6136/30M.PAC
+ 6136/40-101.PAC
+ 6136/100C.PAC
+ 6136/100CB.PAC
+ 6136/100M.PAC
+ 6140-101.PAC
+ 6144/10-101.PAC
+ 6146.PAC
+ 6146-101.PAC
+ 6151EB.PAC
+ 6152EB-101.PAC
+ 6153EB.PAC
+ 6155EB-101.PAC
+ 6156EB.PAC
+ 6157EB.PAC
+ 6158EB.PAC
+ 6164/40.PAC
+ 6164U.PAC
+ 6172AG-101.PAC
+ 6173AG-101.PAC
+ 6174/10.PAC
+ 6174/11.PAC
+ 6174/12.PAC
+ 6174/13.PAC
+ 6174/14.PAC
+ 6174/15.PAC
+ 6174/16.PAC
+ 6174/17.PAC
+ 6174/18.PAC
+ 6174/19.PAC
+ 6174/20.PAC
+ 6174/21.PAC
+ 6179-XX.PAC
+ 6180-102.PAC
+ 6180/10.PAC
+ 6180/11.PAC
+ 6181-101.PAC
+ 6186/10.PAC
+ 6186/20.PAC
+ 6186/30.PAC
+ 6186AG.PAC
+ 6186USB.PAC
+ 6187-103.PAC
+ 6188/13.PAC
+ 6188/14.PAC
+ 6188/15.PAC
+ 6188/16.PAC
+ 6188/17.PAC
+ 6188/18.PAC
+ 6190/10.PAC
+ 6190/40-101.PAC
+ 6191/10.PAC
+ 6193/32.PAC
+ 6194/11.PAC
+ 6194/12.PAC
+ 6194/13.PAC
+ 6194/14.PAC
+ 6194/15.PAC
+ 6194/16.PAC
+ 6194/17.PAC
+ 6194/23.PAC
+ 6194/27.PAC
+ 6195/21.PAC
+ 6195/22.PAC
+ 6195/24.PAC
+ 6195/25.PAC
+ 6195/26.PAC
+ 6196/20.PAC
+ 6196/40-101.PAC
+ 6196/41-101.PAC
+ 6196/42.PAC
+ 6196/43.PAC
+ 6196/80.PAC
+ 6196/82.PAC
+ 6197/11-102.PAC
+ 6197/20.PAC
+ 6198-101.PAC
+ 6198/JA.PAC
+ 6198ST.PAC
+ 6321-XX.PAC
+ 6322-XX-101.PAC
+ 6323-XX.PAC
+ 6324-XX.PAC
+ 6325-XX.PAC
+ 6326-XX-101.PAC
+ 6327-XX.PAC
+
+2009-12-01
+ * e-sps.lbr: Eagle 5.6.2
+ added:
+ S7-1200_AC/DC/RELAIS.DEV
+ S7-1200_DC/DC/DC.DEV
+ SB_1223_DC/DC.DEV
+ SB_1232AO1.DEV
+ SM1222_DO_16X24VDC.DEV
+ SM1222_DO_16XRELAIS.DEV
+ SM_1221_DI_8X24VDC.DEV
+ SM_1221_DI_16X24VDC.DEV
+ SM_1223_DI-16X24VDC_DO-16X24VDC.DEV
+ SM_1223_DI-16X24VDC_DO-16XRELAIS.DEV
+ SM_1231_AI4X13BIT.DEV
+ SM_1232_AQ2X14BIT.DEV
+ SM_1234_AI4X13BIT-AQ2X14BIT.DEV
+ S7-1200_AC/DC/RELAIS.PAC
+ S7-1200_DC/DC/DC.PAC
+ SB_1223_DC/DC.PAC
+ SB_1232AO1.PAC
+ SM1222_DO_16X24VDC.PAC
+ SM1222_DO_16XRELAIS.PAC
+ SM_1221_DI_8X24VDC.PAC
+ SM_1221_DI_16X24VDC.PAC
+ SM_1223_DI-16X24VDC_DO-16X24VDC.PAC
+ SM_1223_DI-16X24VDC_DO-16XRELAIS.PAC
+ SM_1231_AI4X13BIT.PAC
+ SM_1232_AQ2X14BIT.PAC
+ SM_1234_AI4X13BIT-AQ2X14BIT.PAC
+
+2009-11-30
+ * resistor-power.lbr: Eagle 5.6.2
+ added:
+ RMG100.DEV
+ TO-247-2H.PAC
+ TO-247-2V.PAC
+
+2009-11-27
+ * e-steckverbinder.lbr: Eagle 5.6.2
+ set PREFIX: STECKVERBINDER_5-POL.DEV
+
+2009-11-27
+ * atmel.lbr: Eagle 5.6.2
+ added:
+ AT45DB642D.DEV
+ 28T-TSOP-1.PAC
+
+2009-11-25
+ * murata-filter.lbr: Eagle 5.6.2
+ added:
+ NFM.DEV
+ NFM3DC.PAC
+ NFM21C.PAC
+
+2009-11-25
+ * analog-devices.lbr: Eagle 5.6.2
+ added:
+ ADUM1300.DEV
+ ADUM1301.DEV
+
+2009-11-25
+ * texas.lbr: Eagle 5.6.2
+ added:
+ SN74LVCR162245A.DEV
+ DL_R-PDSO-G48.PAC
+
+2009-11-24
+ * analog-devices.lbr: Eagle 5.6.2
+ added:
+ AD1836.DEV
+
+2009-11-23
+ * transistor-fet.lbr: Eagle 5.6.2
+ added:
+ 2SJ109.DEV
+ 2SK389.DEV
+ 2-10M1A.PAC
+
+2009-11-17
+ * allegro.lbr: Eagle 5.6.2
+ added:
+ A3982.DEV
+
+2009-11-17
+ * atmel.lbr: Eagle 5.6.2
+ added:
+ ATMEGA325P.DEV
+ 64M1.PAC
+
+2009-11-17
+ * allegro.lbr: Eagle 5.6.2
+ added:
+ A4983.DEV
+ QFN28ET.PAC
+
+2009-11-09
+ * texas.lbr: Eagle 5.6.1
+ added:
+ TUSB2046BIRHB.DEV
+ TUSB2046B.DEV
+ VF_S-PQFP-G32.PAC
+ RHB_S-PQFP-N32.PAC
+
+2009-10-22
+ * texas.lbr: Eagle 5.6.1
+ added:
+ TMS320VC5509.DEV
+
+2009-10-22
+ * texas.lbr: Eagle 5.6.1
+ added:
+ TMS320VC5509A.DEV
+ GHH_S-PBGA-N179.PAC
+
+2009-10-22
+ * analog-devices.lbr: Eagle 5.6.1
+ added:
+ SSM2165.DEV
+ SSM2166.DEV
+ SSM2167.DEV
+ SO14.PAC
+
+2009-10-19
+ * micro-intel.lbr: Eagle 5.6.1
+ added:
+ HL-PBGA304.PAC
+ HL-PBGA352.PAC
+ HL-PBGA432.PAC
+ PBGA196.PAC
+ PBGA208.PAC
+ PBGA241.PAC
+ PBGA256-17.PAC
+ PBGA256-27.PAC
+ PBGA304.PAC
+ PBGA324.PAC
+ PBGA421.PAC
+ PBGA468.PAC
+ PBGA544.PAC
+
+2009-10-19
+ * texas.lbr: Eagle 5.6.1
+ added:
+ OMAP-L138ZCE.DEV
+ OMAP-L138ZWT.DEV
+ ZCE_S-PBGA-N361.PAC
+ ZEN_S-PBGA-N196.PAC
+ ZWT_S-PBGA-N361.PAC
+
+2009-10-15
+ * rohm.lbr: Eagle 5.6.1
+ added:
+ BD623*F.DEV
+ BD623*FP.DEV
+ BD623*HFP.DEV
+ BD6232FP.DEV
+ HRP7.PAC
+ HSOP25.PAC
+ HSOP28.PAC
+ SOP8.PAC
+
+2009-10-14
+ * texas.lbr: Eagle 5.6.1
+ added:
+ ADS1274.DEV
+
+2009-10-12
+ * gennum.lbr: Eagle 5.6.1
+ added:
+ GS2970.DEV
+ GS2974.DEV
+ GS4910B.DEV
+ GS4911B.DEV
+ GS4915.DEV
+ LBGA100.PAC
+ QFN16-4X4.PAC
+ QFN40-6X6.PAC
+ QFN64-9X9.PAC
+
+2009-10-12
+ * altera-stratix-iv.lbr: Eagle 5.6.1
+ added:
+ EP4S40G2F40ES1.DEV
+ EP4S40G5H40ES1.DEV
+ EP4S100G2F40ES1.DEV
+ EP4S100G5F45ES1.DEV
+ EP4S100G5H40ES1.DEV
+ EP4SE230F29.DEV
+ EP4SE360F35.DEV
+ EP4SE360H29.DEV
+ EP4SE530F43.DEV
+ EP4SE530H35.DEV
+ EP4SE530H40.DEV
+ EP4SGX70DF29.DEV
+ EP4SGX70HF35.DEV
+ EP4SGX110DF29.DEV
+ EP4SGX110FF35.DEV
+ EP4SGX110HF35.DEV
+ EP4SGX180DF29.DEV
+ EP4SGX180FF35.DEV
+ EP4SGX180HF35.DEV
+ EP4SGX180KF40.DEV
+ EP4SGX230DF29.DEV
+ EP4SGX230FF35.DEV
+ EP4SGX230HF35.DEV
+ EP4SGX230KF40.DEV
+ EP4SGX290FF35.DEV
+ EP4SGX290FH29.DEV
+ EP4SGX290HF35.DEV
+ EP4SGX290KF40.DEV
+ EP4SGX290KF43.DEV
+ EP4SGX360FF35.DEV
+ EP4SGX360FH29.DEV
+ EP4SGX360HF35.DEV
+ EP4SGX360KF40.DEV
+ EP4SGX360KF43.DEV
+ EP4SGX530HH35.DEV
+ EP4SGX530KF43.DEV
+ EP4SGX530KH40.DEV
+ EP4SGX530NF45.DEV
+ FBGA780.PAC
+ FBGA1152.PAC
+ FBGA1517.PAC
+ FBGA1760.PAC
+ FBGA1932.PAC
+
+2009-10-12
+ * burr-brown.lbr: Eagle 5.6.1
+ added:
+ INA163.DEV
+ INA217.DEV
+ PGA2500.DEV
+ DB_R-PDSO-G28.PAC
+ DW_RPDSO-G16.PAC
+
+2009-10-12
+ * linear.lbr: Eagle 5.6.1
+ added:
+ LM*18.DEV
+ OPA725.DEV
+ OPA726.DEV
+ OPA2725.DEV
+ OPA2726.DEV
+ SA5534.DEV
+ D_R-PDSO-G8.PAC
+ LCCC20.PAC
+ LCCC28.PAC
+ PS_R-PDSO-G8.PAC
+
+2009-10-12
+ * texas.lbr: Eagle 5.6.1
+ added:
+ ADS1210.DEV
+ ADS1211.DEV
+ ADS1211E.DEV
+ ADS1271.DEV
+ ADS1278.DEV
+ DIT4192-H.DEV
+ DIT4192-S.DEV
+ DIX4192.DEV
+ ISO1050.DEV
+ OMAP-L137.DEV
+ PCM1792.DEV
+ PCM1796.DEV
+ PCM1804.DEV
+ PCM4204.DEV
+ PCM4220.DEV
+ PCM4222.DEV
+ SN65LVD*125.DEV
+ SRC4382.DEV
+ SRC4392.DEV
+ TAS5261.DEV
+ TL7660.DEV
+ TMS320C64X_DSP.DEV
+ TMS320C6474.DEV
+ TMS320C6720*DH.DEV
+ TMS320C6720RFP.DEV
+ TMS320C6720RFP-EXPAD.DEV
+ DBT_R-PDSO-G38.PAC
+ DB_R-PDSO-G28.PAC
+ DGK_S-PDSO-G8.PAC
+ DKD_R-PDSO-G36.PAC
+ DUB-R-PDSO-G8.PAC
+ GDH_S-PBGA-N256.PAC
+ GTS_S-PBGA-N288.PAC
+ PAP_S-PQFP-G64.PAC
+ PDIP-T24.PAC
+ PDIP-T28.PAC
+ PFB_S-PQFP-G48.PAC
+ RFP_S-PQFP-G144-EXP.PAC
+ RFP_S-PQFP-G144-EXPAD.PAC
+ S-PQFP-G48.PAC
+ TSSOP16.PAC
+ ZDH_S-PBGA-N256.PAC
+ ZKB_S-PBGA-N256.PAC
+ ZUN_SPBGA-N561.PAC
+
+2009-10-08
+ * linear.lbr: Eagle 5.6.1
+ added:
+ OPA22*.DEV
+ OPA222*.DEV
+ OPA422*.DEV
+ OPA2134.DEV
+ OPA4134.DEV
+
+2009-10-08
+ * opto-trans-siemens.lbr: Eagle 5.6.1
+ added:
+ SFH303.DEV
+ SFH303.PAC
+
+2009-09-28
+ * con-lumberg.lbr: Eagle 5.6.0
+ corrected PIN/PAD connection:
+ NEB1R.DEV
+ NEB1R.PAC
+ NEBJ21R.DEV
+ NEBJ21R.PAC
+ NEBJ21.DEV
+ NEBJ21.PAC
+ NEBJ25R.DEV
+ NEBJ25R.PAC
+ NEBJ25.DEV
+ NEBJ25.PAC
+
+2009-09-24
+ * linear.lbr: Eagle 5.6.0
+ corrected connection: DAC0808D.DEV
+
+2009-09-24
+ * con-molex.lbr: Eagle 5.6.0
+ added:
+ 105081-0001.DEV
+ 105081-0001.PAC
+
+2009-09-16
+ * microchip.lbr: Eagle 5.6.0
+ added:
+ PIC16F688.DEV
+ QFN16-4X4.PAC
+
+2009-09-11
+ * texas.lbr: Eagle 5.6.0
+ added:
+ TPS6108*.DEV
+
+2009-09-10
+ * texas.lbr: Eagle 5.6.0
+ added:
+ MSP430FG437.DEV
+
+2009-08-26
+ * nrj-semiconductor.lbr: Eagle 5.6.0
+ added:
+ NJU9207B.DEV
+ qfp80-C1.PAC
+
+2009-08-25
+ * con-vg.lbr: Eagle 5.6.0
+ added:
+ FH11.DEV
+ FH11.PAC
+
+2009-08-25
+ * infineon.lbr: Eagle 5.6.0
+ added:
+ TLE5205-2.DEV
+ P-TO220-7-11.PAC
+ P-TO220-7-12.PAC
+ P-TO263-7-1.PAC
+
+2009-08-17
+ * transistor.lbr: Eagle 5.6.0
+ corrected:
+ *-NPN.DEV BC635, BC639, BC639 Packagevariant TO92-ECB
+
+2009-08-13
+ * allegro.lbr: Eagle 5.6.0
+ added:
+ A12*?.DEV
+ A13*?.DEV
+ A136*.DEV
+ SIP3-UA.PAC
+ SIP4-KT.PAC
+ SOT23-W.PAC
+
+2009-08-12
+ * con-molex.lbr: Eagle 5.6.0
+ added:
+ 87438-02.DEV
+ 87438-03.DEV
+ 87438-04.DEV
+ 87438-05.DEV
+ 87438-06.DEV
+ 87438-07.DEV
+ 87438-08.DEV
+ 87438-09.DEV
+ 87438-10.DEV
+ 87438-11.DEV
+ 87438-12.DEV
+ 87438-13.DEV
+ 87438-14.DEV
+ 87438-15.DEV
+ 87438-02.PAC
+ 87438-03.PAC
+ 87438-04.PAC
+ 87438-05.PAC
+ 87438-06.PAC
+ 87438-07.PAC
+ 87438-08.PAC
+ 87438-09.PAC
+ 87438-10.PAC
+ 87438-11.PAC
+ 87438-12.PAC
+ 87438-13.PAC
+ 87438-14.PAC
+ 87438-15.PAC
+
+2009-08-06
+ * led.lbr: Eagle 5.6.0
+ added:
+ F50360.DEV
+ LZ1-00WW03.DEV
+ LZ1-00WW05.DEV
+ LZ4-00WW10.DEV
+ LZC-00CW40.DEV
+ W724C0.DEV
+ W49180.DEV
+ X42180.DEV
+ X42182.DEV
+ F50360.PAC
+ LZ1-00WW03.PAC
+ LZ4-00WW10.PAC
+ LZC-00CW40.PAC
+ W724C0.PAC
+ Z-POWER-LED-DOME-TYPE.PAC
+ Z-POWER-LED-PCB-TYPE.PAC
+
+2009-08-06
+ * texas.lbr: Eagle 5.6.0
+ added:
+ TPA3123D2.DEV
+ PWP-TSSOP24.PAC
+
+2009-08-03
+ * advanced-test-technologies.lbr: Eagle 5.6.0
+ added:
+ 64POL-SOCKED.DEV
+ QFP-SOCKED-64.PAC
+
+2009-08-03
+ * relay.lbr: Eagle 5.6.0
+ added:
+ 9802.DEV
+ 9814.DEV
+ 9852.DEV
+ 9802-00.PAC
+ 9802-20.PAC
+ 9814-00.PAC
+ 9814-20.PAC
+ 9852-00.PAC
+ 9852-20.PAC
+
+2009-08-03
+ * analog-devices.lbr: Eagle 5.6.0
+ added:
+ ADG608.DEV
+ ADG609.DEV
+ ADG658.DEV
+ ADG659.DEV
+ ADG1408YCPZ.DEV
+ ADG1408YRUZ.DEV
+ ADG1409YCPZ.DEV
+ ADG1409YRUZ.DEV
+ QSOP16.PAC
+ TSSOP16.PAC
+
+2009-07-28
+ * pot.lbr: Eagle 5.6.0
+ added:
+ 3223G.PAC
+ 3223J.PAC
+ 3223W.PAC
+
+2009-07-16
+ * maxim.lbr: Eagle 5.6.0
+ added:
+ DS2726.DEV
+ TQFN32.PAC
+
+2009-07-10
+ * texas.lbr: Eagle 5.6.0
+ added:
+ TPA6132A2.DEV
+ QFN16.PAC
+
+2009-07-08
+ * *.lbr: Eagle 5.6.0
+ checked all LBR, changed >NAME, >PART, >GATE, >VALUE to proportional font
+
+2009-07-08
+ * con-lumberg.lbr: Eagle 5.6.0
+ corrected pad coordinate PAD 'B':
+ KLBR4.PAC
+
+2009-07-06
+ * led.lbr: Eagle 5.6.0
+ added:
+ NSSM038A.DEV
+ NSSM038A.PAC
+
+2009-06-29
+ * texas.lbr: Eagle 5.6.0
+ added:
+ UC*637.DEV
+ DIL18.PAC
+
+2009-06-26
+ * con-coax.lbr: Eagle 5.6.0
+ added:
+ LTI-SASF54GT.DEV
+ LTI-SASF54GT.PAC
+
+2009-06-24
+ * con-lumberg.lbr: Eagle 5.6.0
+ corrected connection/pad:
+ KLBR4.DEV
+
+2009-06-24
+ * con-lumberg.lbr: Eagle 5.6.0
+ corrected milling:
+ 1503_04.PAC
+
+2009-06-23
+ * allegro.lbr: Eagle 5.6.0
+ added:
+ ACS758*.DEV
+ CB-PFF.PAC
+
+2009-06-19
+ * con-pulse.lbr: Eagle 5.6.0
+ added:
+ J1006F01P.DEV
+ J1006F21.DEV
+ J1011F.DEV
+ J1012F21R.DEV
+ J1026F.DEV
+ J1026F01.DEV
+ J11012F.DEV
+ JP006821U.DEV
+ JP011821U.DEV
+ JP026851U.DEV
+ J1.PAC
+ JP.PAC
+
+2009-06-18
+ * atmel.lbr: Eagle 5.6.0
+ added:
+ XMEGA16A4.DEV
+ XMEGA128A1.DEV
+
+2009-06-18
+ * display-hp.lbr: Eagle 5.6.0
+ corrected: included missing Pin LEDSUP in PWR.SYM (HTIL311A.DEV)
+
+2009-06-18
+ * atmel.lbr: Eagle 5.6.0
+ changed: Pin VCC1=VCC@1, GND1=GND@2 (PAD 52/53) and visible both
+ MEGA64.SYM
+ MEGA64-M.SYM
+ MEGA128.SYM
+ MEGA128-M.SYM
+ MEGA169.SYM
+ MEGA169-M.SYM
+ 48-I/O-1.SYM
+
+2009-06-16
+ * trafo-bei.lbr: Eagle 5.6.0
+ added: 2 holes at HDS28G2.PAC
+
+2009-06-15
+ * con-ebyelectro.lbr: Eagle 5.6.0
+ added:
+ 5202-12-N-02.DEV
+ 5202-12-N-02.PAC
+
+2009-06-09
+ * cypress.lbr: Eagle 5.6.0
+ added:
+ CY8C2*345.DEV
+ CY8C22545.DEV
+ SOIC28-3.PAC
+ TQFP44.PAC
+ CY8C21234.DEV
+ CY8C21334.DEV
+ CY8C21434.DEV
+ CY8C21534.DEV
+ CY8C21634.DEV
+ QFN32.PAC
+ QFN32-MAX06.PAC
+ QFN32-SAWN.PAC
+ SOIC16.PAC
+ SSOP20.PAC
+ SSOP28.PAC
+
+2009-06-09
+ * con-hirose.lbr: Eagle 5.6.0
+ corrected stop mask: FH28-50S-0.5SH(51)
+
+2009-06-09
+ * inductors.lbr: Eagle 5.6.0
+ added:
+ BL0.DEV
+ BL01RN1A.PAC
+ BL02RN1.PAC
+ BL02RN2.PAC
+ BL03RN2.PAC
+
+2009-06-04
+ * infineon.lbr: Eagle 5.6.0
+ correct smd coordinate in package:
+ PG-DSO-36.PAC
+ PG-DSO-36PAD.PAC
+ PG-DSO-36W.pac
+
+2009-05-28
+ * microchip.lbr: Eagle 5.6.0
+ package changed TQFP100 to SQFP-S-12X12-100.PAC:
+ PIC32MX320F128L.DEV
+ PIC32MX360F256L.DEV
+ PIC32MX360F512L.DEV
+ PIC32MX440F128L.DEV
+ PIC32MX460F256L.DEV
+ PIC32MX460F512L.DEV
+
+2009-05-25
+ * microchip.lbr: Eagle 5.6.0
+ deleted: Variant 8S0 (PIC16LF628SO)
+ Variant doesn't exist.
+
+2009-05-18
+ * maxim.lbr: Eagle 5.6.0
+ added:
+ MAX312.DEV
+ MAX313.DEV
+ MAX314.DEV
+
+2009-05-18
+ * pinhead.lbr: Eagle 5.6.0
+ added:
+ 1X22/90.PAC
+ 1X24/90.PAC
+ 2X22/90.PAC
+ 2X24/90.PAC
+ 2X25/90.PAC
+ 2X30/90.PAC
+ Added variant '/90' to all devices.
+
+2009-05-13
+ * testpad.lbr: Eagle 5.6.0
+ new: ATTRIBUTE >TP_SIGNAL_NAME in all devices
+
+2009-05-04
+ * e-sicherungen.lbr: Eagle 5.5.0
+ added:
+ FEHLER-STROM-SCHUTZSCHALTER_2-POL.DEV
+ FEHLER-STROM-SCHUTZSCHALTER_4-POL.DEV
+ FEHLER-STROM-SCHUTZSCHALTER_2-POL.PAC
+ FEHLER-STROM-SCHUTZSCHALTER_4-POL.PAC
+
+2009-04-27
+ * con-coax.lbr: Eagle 5.5.0
+ changed description (Distributor deleted) in:
+ BU-SMA-H.PAC
+ BU-SMA-H.DEV
+
+2009-04-24
+ * transistor-fet.lbr: Eagle 5.5.0
+ added:
+ FDD4141.DEV
+ D2PACK.PAC
+
+2009-04-24
+ * trafo-bei.lbr: Eagle 5.5.0
+ added:
+ HDS.DEV
+ HDS28G2.PAC
+
+2009-04-21
+ * relay.lbr: Eagle 5.4.8
+ added:
+ AZ8-FORM-A.DEV
+ AZ8-FORM-C.DEV
+ AZ8.PAC
+
+2009-04-21
+ * con-ebyelectro.lbr: Eagle 5.4.8
+ added:
+ 5202-03-N-02.DEV
+ 5202-04-N-02.DEV
+ 5202-05-N-02.DEV
+ 5202-06-N-02.DEV
+ 5202-03-N-02.PAC
+ 5202-04-N-02.PAC
+ 5202-05-N-02.PAC
+ 5202-06-N-02.PAC
+
+2009-04-20
+ * transistor-fet.lbr: Eagle 5.4.8
+ added:
+ 2N5950.DEV
+
+2009-04-20
+ * pinhead.lbr: Eagle 5.4.8
+ added:
+ PINHD-1X40.DEV
+ 1X40.PAC
+
+2009-04-20
+ * micro-philips.lbr: Eagle 5.4.8
+ added from Christopher K. Johnson
+The component libraries supplied with EAGLE have been compiled with
+great care as an additional service to you, our customer. However,
+the large number of available components and suppliers of these
+components means that the occasional discrepancy is unavoidable.
+Please note, therefore, that CadSoft takes no responsibility for the
+complete accuracy of information included in library files.
+
+Additional new libraries, that have not yet been officially released,
+can be found on CadSoft's internet site at the download section of
+http://www.cadsoftusa.com.
+
+Use the ADD command in the Schematic Editor or Layout Editor
+window to search for a certain device or package!
+
+Information about defining your own libraries can be found in the
+file library.txt in the doc directory.
+
+Die Bibliotheken wurden mit großer Sorgfalt erstellt. Dennoch sind
+Fehler nicht auszuschließen. Bitte haben Sie Verständnis dafür, dass
+die Firma CadSoft keinerlei Gewähr für die Richtigkeit der
+Bauelemente-Definitionen Ãœbernimmt.
+
+Weitere Bibliotheken, die nicht oder noch nicht zum offiziellen
+EAGLE-Lieferumfang gehören, finden Sie im Download-Bereich von
+CadSofts Internet-Seiten unter http://www.cadsoft.de.
+
+Verwenden Sie den ADD-Befehl im Schaltplan-Editor- bzw. Layout-Editor-Fenster
+um nach Devices bzw. Packages zu suchen.
+
+Hinweise zur Erstellung eigener Bibliotheken finden Sie in der
+Datei library.txt im doc-Verzeichnis.
+
+This folder contains subfolders which contain all your projects.
+
+Subfolders which contain an EAGLE project file (eagle.epf) have
+a red folder icon. Click on a project's marker here in the projects branch
+to open or close an existing project.
+
+Dieses Verzeichnis enthält Unterverzeichnisse, die Ihre Projekte enthalten.
+
+Unterverzeichnisse, die eine EAGLE-Projekt-Datei (eagle.epf) enthalten, werden
+mit einem roten Icon markiert. Klicken Sie auf den Marker eines Projekts hier
+im Projects-Zweig, öffnen bzw. schließen Sie ein bestehendes Projekt.
+
+This folder contains subfolders which contain example projects.
+
+Dieses Verzeichnis enthält verschiedene Unterverzeichnisse mit
+Beispiel-Projekten.
+
+Consists of a consistent pair of schematic and layout files.
+
+Besteht aus einer Schaltplan- und einer Platinen-Datei. Beide sind konsistent.
+
+Test various Autorouter control files to use the Autorouter in one layer.
+
+Testen Sie verschiedene Autorouter-Steuerdateien (*.ctl) um den Autorouter
+für einseitige Platinen zu verwenden.
+
+This folder contains some files which are used in examples of the
+EAGLE Tutorial.
+
+Dieses Verzeichnis enthält einige Dateien, die in den Beispielen im
+EAGLE-Trainings-Handbuch verwendet werden.
+
+Script files are a powerful tool. They can contain
+long sequences of commands, such as the specification
+of specific colors and fill-patterns for layers.
+Since every EAGLE operation can be carried out with the
+help of text commands, you can, for example, import data or
+configure EAGLE with the aid of script files.
+
+Script-Dateien sind ein überaus leistungsfähiges Werkzeug.
+Sie können längere Befehlssequenzen, etwa die Einstellung
+bestimmter Farben oder Füllmuster für Layer enthalten.
+Da sich jede EAGLE-Operation mit Hilfe von Text-Befehlen
+ausführen lässt, können Sie zum Beispiel mit Hilfe von
+Script-Dateien Daten importieren oder EAGLE nach Ihren
+Bedürfnissen konfigurieren.
+
+ULPs named ex-... are examples which demonstrate some features of the User Language.
+They have no practical use.
+
+All other programs are real applications which, of course, show the abilities of the
+EAGLE User Language, too.
+
+Please check our web pages for further interesting ULPs:
+ULPs mit ex-... im Namen sind Beispiel-ULPs, die einige Funktionen der User-Language
+erklären. Sie sind nicht für eine konkrete Anwendung geeignet.
+
+Bei allen anderen Programmen handelt es sich um echte Anwendungen, die natürlich
+auch als Beispiele für die Möglichkeiten der User-Language dienen.
+
+Bitte sehen Sie auch auf unsere Internet-Seiten. Dort finden Sie weitere
+nützliche ULPs: "
+ "Generates a project's Bill Of Material."
+ " "
+ "A database with additional information like order codes, manufacturers "
+ "or prices can be created and managed."
+ " "
+ " "
+ "Erzeugt die Stückliste (Bill Of Material) eines Projekts."
+ " "
+ "Eine Datenbank mit zusätzlichen Informationen wie Bestellnummern, Herstellern "
+ "oder Preisen kann angelegt und verwaltet werden."
+ " "
+ " \n"
+ "List type\n"
+ " \n"
+ "The Bill Of Material can be generated either as a list\n"
+ "of parts (where every part is listed on a line of its own),\n"
+ "or as a list of values, where all parts with the same value are grouped\n"
+ "together in one line. Use the Parts and Values\n"
+ "radio buttons to select the list type.\n"
+ " \n"
+ "Output format\n"
+ " \n"
+ "Choose between pure ASCII Text format or HTML.\n"
+ " \n"
+ "Database\n"
+ " \n"
+ "You can pull in additional information about the used parts by loading\n"
+ "a database file with the Load button.\n"
+ " \n"
+ "A database file must consist of lines of text, each of which contains\n"
+ "one record consisting of CSV (Comma Separated Values)\n"
+ "or TSV (Tab Separated Values) data.\n"
+ "The very first line must contain a \"header\", which defines a unique name for\n"
+ "each column, and the first column of every following line must contain\n"
+ "a unique (non-empty) key for this record.\n"
+ " \n"
+ "An example for a valid database file would be:\n"
+ " \n"
+ "Creating a new database\n"
+ " \n"
+ "Click on the New button to create a new database.\n"
+ "You will get a dialog in which you can define the names of the column headers\n"
+ "for your new database. The first column always contains the key for database\n"
+ "lookups and can't be deleted (you can edit it, though, to give it a different\n"
+ "name than the default \"Key\"). This first column will not be visible in the\n"
+ "generated list, so you don't really need to worry about it.\n"
+ " \n"
+ "Editing the database\n"
+ " \n"
+ "If you have loaded a database you can either double click on a line\n"
+ "in the list, or select a line and press Enter (or click on the Edit\n"
+ "button) to bring up a dialog in which you can edit the database entry\n"
+ "for this part. If the database has been modified you will be asked if\n"
+ "you want to save it before leaving the program or loading a new database.\n"
+ " \n"
+ "Viewing the output\n"
+ " \n"
+ "Click on the View button to get a preview of the list output.\n"
+ " \n"
+ "Saving the list\n"
+ " \n"
+ "Click on the Save button to save the list to disk.\n"
+ ;
+
+string HelpTextDE =
+ "Erzeugen der Stückliste\n"
+ " \n"
+ "Listen-Typ\n"
+ " \n"
+ "Die Stückliste kann entweder als Liste der Bauteile generiert werden\n"
+ "(wobei jedes Bauteil in einer eigenen Zeile aufgeführt wird),\n"
+ "oder als Liste der Werte, wobei alle Bauteile mit dem gleichen Wert in einer Zeile\n"
+ "zusammengefasst werden. Mit den Radio-Buttons Bauteile und Werte\n"
+ "kann zwischen den beiden Listen-Typen gewählt werden.\n"
+ " \n"
+ "Ausgabeformat\n"
+ " \n"
+ "Wählen Sie zwischen reinem ASCII-Text oder HTML-Format.\n"
+ " \n"
+ "Datenbank\n"
+ " \n"
+ "Mit dem Load-Button können Sie eine Datenbankdatei mit zusätzlichen\n"
+ "Informationen über die Bauteile laden.\n"
+ " \n"
+ "Eine Datenbankdatei besteht aus Textzeilen, von denen jede einen Datensatz bestehend\n"
+ "aus CSV (Comma Separated Values) oder\n"
+ "TSV (Tab Separated Values) Daten enthält.\n"
+ "Die erste Zeile muß eine Titelzeile enthalten, welche einen eindeutigen Namen\n"
+ "für jede Spalte definiert, und die erste Spalte jeder folgenden Zeile muß einen eindeutigen\n"
+ "(nicht leeren) Schlüssel für diesen Datensatz enthalten.\n"
+ " \n"
+ "Beispiel für eine gültige Datenbankdatei:\n"
+ " \n"
+ "Neue Datenbank anlegen\n"
+ " \n"
+ "Klicken Sie auf Neu um eine neue Datenbank anzulegen.\n"
+ "In einem Dialog können Sie dann die Namen der Datenfelder Ihrer neuen Datenbank\n"
+ "festlegen. Das erste Feld enthält immer den Schlüssel für den Datenbank-Zugriff\n"
+ "und kann nicht gelöscht werden (es kann aber editiert werden um ihm einen anderen Namen\n"
+ "als den Standardwert \"Key\" zu geben). Dieses erste Feld wird in der generierten Liste\n"
+ "nicht sichtbar sein, Sie brauchen sich also keine Gedanken darüber zu machen.\n"
+ " \n"
+ "Bearbeiten der Datenbank\n"
+ " \n"
+ "Wenn Sie eine Datenbank geladen haben können Sie entweder auf eine Zeile in der\n"
+ "Liste doppelklicken, oder eine Zeile auswählen und die Eingabetaste drücken (oder auf Bearbeiten\n"
+ "klicken) um einen Dialog zu erhalten in dem Sie den Datenbank-Eintrag für dieses Bauteil\n"
+ "bearbeiten können. Wurde die Datenbank verändert so werden Sie vor dem Verlassen des Programms\n"
+ "oder vor dem Laden einer neuen Datenbank gefragt, ob Sie diese abspeichern wollen.\n"
+ " \n"
+ "Betrachten der Ausgabe\n"
+ " \n"
+ "Klicken Sie auf Vorschau um eine Vorschau der Ausgabe zu erhalten.\n"
+ " \n"
+ "Speichern der Liste\n"
+ " \n"
+ "Klicken Sie auf Speichern um die Liste abzuspeichern.\n"
+ ;
+
+string I18N[] = {
+ "en\v"
+ "de\v"
+ ,
+ " \nThis program can only work in the schematic editor.\v"
+ " \nDieses Programm kann nur in einem Schaltplan verwendet werden.\v"
+ ,
+ "Part\tValue\tDevice\tPackage\tDescription\v"
+ "Bauteil\tWert\tDevice\tPackage\tDescription\v"
+ ,
+ "Qty\tValue\tDevice\tParts\v"
+ "Menge\tWert\tDevice\tBauteile\v"
+ ,
+ "Partlist exported from %s at %s\v"
+ "Stückliste exportiert aus %s am %s\v"
+ ,
+ "Bill Of Material - Preview\v"
+ "Stückliste - Vorschau\v"
+ ,
+ "-Close\v"
+ "-Schließen\v"
+ ,
+ "Save Bill Of Material\v"
+ "Stückliste speichern\v"
+ ,
+ "File '\v"
+ "Datei '\v"
+ ,
+ "' exists\n\nOverwrite?\v"
+ "' existiert\n\nÃœberschreiben?\v"
+ ,
+ "+&Yes\v"
+ "+&Ja\v"
+ ,
+ "-&No\v"
+ "-&Nein\v"
+ ,
+ "&No\v"
+ "&Nein\v"
+ ,
+ "Name already defined!\v"
+ "Name ist bereits definiert!\v"
+ ,
+ " Header\v"
+ " Spaltenüberschrift\v"
+ ,
+ "&Name:\v"
+ "&Name:\v"
+ ,
+ "+OK\v"
+ "+OK\v"
+ ,
+ "Name can't be empty!\v"
+ "Name kann nicht leer sein!\v"
+ ,
+ "-Cancel\v"
+ "-Abbrechen\v"
+ ,
+ "New Database\v"
+ "Neue Datenbank\v"
+ ,
+ "&Headers\v"
+ "&Spaltenüberschriften\v"
+ ,
+ "Edit\v"
+ "Bearbeiten\v"
+ ,
+ "&Add\v"
+ "&Hinzufügen\v"
+ ,
+ "New\v"
+ "Neu\v"
+ ,
+ "&Del\v"
+ "&Löschen\v"
+ ,
+ "Can't delete the \"Key\" header!\n\nUse \"Edit\" to change it.\v"
+ "Die Spaltenüberschrift \"Key\" kann nicht gelöscht werden!\n\nBenutzen Sie \"Bearbeiten\" um sie zu ändern.\v"
+ ,
+ "&Edit\v"
+ "&Bearbeiten\v"
+ ,
+ "Edit\v"
+ "Bearbeiten\v"
+ ,
+ "Please add at least one header!\v"
+ "Bitte fügen Sie mindestens eine Spaltenüberschrift hinzu!\v"
+ ,
+ "Choose database file\v"
+ "Datenbankdatei auswählen\v"
+ ,
+ "Database files (*.tsv *.csv);;All files (*)\v"
+ "Datenbankdateien (*.tsv *.csv);;Alle Dateien (*)\v"
+ ,
+ "Save database file\v"
+ "Datenbankdatei speichern\v"
+ ,
+ "Database files (*\v"
+ "Datenbankdateien (*\v"
+ ,
+ ");;All files (*)\v"
+ ");;Alle Dateien (*)\v"
+ ,
+ "Edit Database\v"
+ "Datenbank bearbeiten\v"
+ ,
+ "Please select a list entry first!\v"
+ "Bitte wählen Sie erst einen Listeneintrag aus!\v"
+ ,
+ "Please load a database file first!\v"
+ "Bitte Laden Sie zuerst eine Datenbankdatei!\v"
+ ,
+ "Database has been modified\n\nSave?\v"
+ "Die Datenbank wurde verändert\n\nSpeichern?\v"
+ ,
+ "Bill Of Material - Help\v"
+ "Stückliste - Hilfe\v"
+ ,
+ "Bill Of Material\v"
+ "Stückliste\v"
+ ,
+ "Database:\v"
+ "Datenbank:\v"
+ ,
+ "&Load\v"
+ "&Laden\v"
+ ,
+ "&New\v"
+ "&Neu\v"
+ ,
+ "List type\v"
+ "Listen-Typ\v"
+ ,
+ "&Parts\v"
+ "&Bauteile\v"
+ ,
+ "&Values\v"
+ "&Werte\v"
+ ,
+ "Output format\v"
+ "Ausgabeformat\v"
+ ,
+ "&Text\v"
+ "&Text\v"
+ ,
+ "&HTML\v"
+ "&HTML\v"
+ ,
+ "+Edit\v"
+ "+Bearbeiten\v"
+ ,
+ "Vie&w\v"
+ "&Vorschau\v"
+ ,
+ "&Save...\v"
+ "&Speichern...\v"
+ ,
+ "H&elp\v"
+ "H&ilfe\v"
+ };
+
+int Language = strstr(I18N[0], language()) / 3;
+
+string tr(string s)
+{
+ string t = lookup(I18N, s, Language, '\v');
+ return t ? t : s;
+}
+
+if (!schematic) {
+ dlgMessageBox(usage + tr(" \nThis program can only work in the schematic editor."));
+ exit(1);
+ }
+
+//XXX
+/*
+ TODO: - Query user for missing database entries ("Check" button)
+ - Allow user to define which database columns to actually use
+ - dto. for the internal data?
+ - store and retrieve the setup?
+ - what if this is run in a board?
+*/
+
+int NumParts;
+numeric string Lines[];
+numeric string PartName[], PartValue[], PartDevice[], PartPackage[], PartHeadline[], PartDescription[];
+int PartValueOn[];
+int Selected;
+
+enum { ltParts, ltValues }; // List Types
+enum { ofText, ofHTML }; // Output Formats
+int ListType = 0;
+int OutputFormat = 0;
+
+string DatabaseFile;
+string Database[];
+char DatabaseSeparator = '\t';
+string DatabaseFields[];
+int DatabaseModified = 0;
+
+char ValueSeparator = ':';
+
+string StripWhiteSpace(string s)
+{
+ while (s && isspace(s[0]))
+ s = strsub(s, 1);
+ while (s && isspace(s[strlen(s) - 1]))
+ s = strsub(s, 0, strlen(s) - 1);
+ return s;
+}
+
+void CollectPartData(void)
+{
+ NumParts = 0;
+
+ schematic(SCH) {
+ SCH.parts(P) {
+ if (P.device.package) {
+ PartName[NumParts] = P.name;
+ PartValue[NumParts] = P.value;
+ PartDevice[NumParts] = P.device.name;
+ PartPackage[NumParts] = P.device.package.name;
+ PartHeadline[NumParts] = P.device.headline;
+ PartDescription[NumParts] = P.device.description;
+ PartValueOn[NumParts] = P.device.value == "On";
+ NumParts++;
+ }
+ }
+ }
+}
+
+string DatabaseHeader(void)
+{
+ string s;
+
+ if (Database[0]) {
+ string a[];
+ int n = strsplit(a, Database[0], DatabaseSeparator);
+ int i;
+ for (i = 1; i < n; i++) {
+ s += "\t" + a[i];
+ DatabaseFields[i - 1] = a[i];
+ }
+ DatabaseFields[i - 1] = "";
+ }
+ return s;
+}
+
+string DatabaseKey(int i)
+{
+ string key = PartValue[i];
+ if (PartValueOn[i])
+ key = PartDevice[i] + ValueSeparator + key;
+ return key;
+}
+
+string DatabaseLookup(string key, int f)
+{
+ return key ? lookup(Database, key, DatabaseFields[f], DatabaseSeparator) : "";
+}
+
+void GeneratePartList(void)
+{
+ int NumLines = 0;
+
+//XXX column sequence?
+ Lines[NumLines++] = tr("Part\tValue\tDevice\tPackage\tDescription") + DatabaseHeader();
+ for (int i = 0; i < NumParts; i++) {
+ Lines[NumLines] = PartName[i] + "\t" + PartValue[i] + "\t" + PartDevice[i] + "\t" + PartPackage[i] + "\t" + PartHeadline[i];
+ if (Database[0]) {
+ string key = DatabaseKey(i);
+ for (int f = 0; DatabaseFields[f]; f++)
+ Lines[NumLines] += "\t" + DatabaseLookup(key, f);
+ Lines[NumLines] += "\t" + key; // hidden field!
+ }
+ NumLines++;
+ }
+ Lines[NumLines] = "";
+}
+
+void GenerateValueList(void)
+{
+ int NumLines = 0;
+ int Index[];
+
+//XXX column sequence?
+ Lines[NumLines++] = tr("Qty\tValue\tDevice\tParts") + DatabaseHeader();
+ sort(NumParts, Index, PartValue, PartDevice, PartName);
+ for (int n1 = 0, n2 = 0; ++n2 <= NumParts; ) {
+ int i1 = Index[n1];
+ if (n2 < NumParts) {
+ int i2 = Index[n2];
+ //XXX value on/off?
+ if (PartValue[i1] == PartValue[i2] && PartDevice[i1] == PartDevice[i2])//XXX && lname[i1] == lname[i2])
+ continue;
+ }
+ string Quantity;
+ sprintf(Quantity, "%d", n2 - n1);
+ Lines[NumLines] = Quantity + "\t" + PartValue[i1] + "\t" + PartDevice[i1] + "\t";
+ for (;;) {
+ Lines[NumLines] += PartName[i1];
+ if (++n1 < n2) {
+ i1 = Index[n1];
+ Lines[NumLines] += ", ";
+ }
+ else
+ break;
+ }
+ if (Database[0]) {
+ string key = DatabaseKey(i1);
+ for (int f = 0; DatabaseFields[f]; f++)
+ Lines[NumLines] += "\t" + DatabaseLookup(key, f);
+ Lines[NumLines] += "\t" + key; // hidden field!
+ }
+ NumLines++;
+ }
+ Lines[NumLines] = "";
+}
+
+void GenerateList(void)
+{
+ switch (ListType) {
+ case ltParts: GeneratePartList(); break;
+ case ltValues: GenerateValueList(); break;
+ }
+}
+
+string MakeListHeader(void)
+{
+ string s;
+ schematic(SCH) sprintf(s, tr("Partlist exported from %s at %s"), SCH.name, t2string(time()));
+ return s;
+}
+
+string MakeListText(void)
+{
+ int l, Width[];
+ for (l = 0; Lines[l]; l++) {
+ string a[];
+ for (int n = strsplit(a, Lines[l], '\t'); n--; )
+ Width[n] = max(Width[n], strlen(a[n]));
+ }
+ string List;
+ List = MakeListHeader() + "\n\n";
+ int numHeaders;
+ for (l = 0; Lines[l]; l++) {
+ string line, a[];
+ int n = strsplit(a, Lines[l], '\t');
+ if (l == 0)
+ numHeaders = n;
+ else
+ n = numHeaders; // for the hidden key!
+ for (int i = 0; i < n; i++) {
+ string s;
+ sprintf(s, "%s%-*s", line ? " " : "", Width[i], a[i]);
+ line += s;
+ }
+ List += line + "\n";
+ }
+ return List;
+}
+
+string MakeListHTML(void)
+{
+ string List;
+ List = "" + MakeListHeader() + "\n \n";
+ List += " "
+ "Usage: RUN cam2dxf [ filename ]"
+ " "
+ "Tip: Assign a funktion key with "
+ "ASSIGN Shift+Ctrl+Alt+P 'run cam2dxf;';"
+ " "
+ "or"
+ " "
+ "ASSIGN Shift+Ctrl+Alt+P 'run cam2dxf myjob.cam;';"
+ " "
+ " \n" +
+ "If the layer list is empty after starting this ULP,\n" +
+ "you did not start it from the proper editor window (SCH/BRD). \n" +
+ "CAM jobs for the layout have to be started from the Layout Editor, " +
+ "jobs for a schematic from the Schematic Editor. " +
+ "CAM Jobs can be edited and saved by the CAM processor only. "
+ " "
+ "Tip: Assign a funktion key with"
+ " "
+ " "
+ "Usage: RUN cam2print [ pagelimit [ filename ]]"
+ " "
+ "Tip: Assign a funktion key with"
+ " "
+ "ASSIGN Shift+Ctrl+Alt+P 'run cam2print.ulp;';"
+ " "
+ "or"
+ " "
+ "ASSIGN Shift+Ctrl+Alt+P 'run cam2print.ulp 0 myjob.cam;';"
+ " "
+ " \n" +
+ "If the layer list is empty after starting this ULP,\n" +
+ "you did not start it from the proper editor window (SCH/BRD). \n" +
+ "CAM jobs for the layout have to be started from the Layout Editor, " +
+ "jobs for a schematic from the Schematic Editor. \n" +
+ "CAM Jobs can be edited and save only by the CAM processor. "
+ " "
+ "run clear-layer-in-lbr.ulp [YES] layer [layer] [layer] .... "
+ " Usage: "
+ "NameOff = 1 switches off the checking of net names. "
+
+string hilfe =
+ "Dieses ULP ändert die Leiterbahnbreite abhaengig vom Signalnamen und "
+ "der vorgegebenen min. max. Breite. " +
+ "! Mit NameOff kann die Netz-Namen-Ueberpruefung abgeschaltet werden. ";
+
+// "THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED. "
+ " "
+ " Options: "
+ "+ distance/radius "
+ " Optionen: "
+ "+ Distance/Radius "
+ " " +
+ " "
+ "Usage: "
+ "Example: "
+ "Attention:"
+ "In special situations it could happen that importing a netlist into a schematic "
+ "(in form of 'airwires' as it happens here) results in misconnections. ACHTUNG: "
+ "Opens a file dialog to select a netscript file. "
+ "Some PCB systems allow to export an EAGLE netscript file in order to make "
+ "a layout in EAGLE. This ULP allows to use the netscript to generate an "
+ "EAGLE schematic, too. At least it can be used to draw all net connections "
+ "in the schematic easily, provided all parts have been placed before. "
+ " "
+ "Attention: "
+ "We want to avoid this problem in the ULP by drawing the net "
+ "line from the first pin with an offset of 50 mil. This way "
+ "diagonal net lines will be drawn and there will be hardly pins "
+ "that lie under net lines. "
+ "If a net has to be drawn on a further sheet of the schematic "
+ "EAGLE uses the diagonal offset of 50 mil and places an "
+ "additional LABEL."
+ " "
+ " \n"
+ "Das Einlesen einer Netzliste (Airwire) in den Schaltplan, "
+ "kann in besonderen Situationen zu falschen Verbindungen fuehren. \n"
+ "Werden die Netze als "Luftlinien" zwischen den Bauteilpins gezeichnet, "
+ "so kann es vorkommen, dass eine Netzlinie Bauteilpins ueberlagert. "
+ "Wird spaeter dieser Pin unter der Linie an ein Netz angeschlossen "
+ "so nimmt EAGLE das Netz als Kontaktpunkt und nicht den "
+ "darunterliegenden Pin. "
+ "In diesem ULP wird versucht diese Problematik zu umgehen, in dem vom "
+ "ersten Pin mit einem Offset (50mil) vom Pin weg "
+ "und dann zum zweiten Pin gezeichnet wird. Dadurch entstehen diagonale "
+ "Luftlinien die nur in seltenen Faellen einen Pin ueberlagern. \n"
+ "Wird ein Netz auf einer anderen Schaltplanseite weitergefuehrt, "
+ "so wird vom Pin um 50 Mil diagonal weggezeichnet und zusaetzlich "
+ "ein LABEL plaziert. \n"
+*/
+
+// Eagle NET-Command definition
+string net_name = strupr(argv[1]);
+string device_a = strupr(argv[2]);
+string pin_a = strupr(argv[3]);
+string device_b = strupr(argv[4]);
+string pin_b = strupr(argv[5]);
+
+string cmd = "";
+
+string lines[];
+int nLines;
+string s;
+
+// *** Eagle NET-SCRIPT definition ***
+string tok_Signal = "Signal";
+string signalLines[];
+string signalName;
+int signalCnt = 0;
+string tok_Change = "Change";
+
+// *** functions ***
+
+int actSheet(UL_SHEET S)
+{
+ return S.number;
+}
+
+void readNetList(void)
+{
+ int sn = 0;
+ do {
+ if( strstr(lines[sn], tok_Signal) == 0) {
+ signalCnt = strsplit (signalLines, lines[sn], '\'');
+ // init NET command
+ string netName = signalLines[1];
+ string dev_a = signalLines[3];
+ string pin_a = signalLines[5];
+ string dev_b = "";
+ string pin_b = "";
+ // start NET command with run-cmd-net.ulp
+ sn++;
+ while (strstr(lines[sn], ";") < 0) { // end of Signallist
+ signalCnt = strsplit (signalLines, lines[sn], '\'');
+ string dev_b = signalLines[1];
+ string pin_b = signalLines[3];
+ cmd += "run " + argv[0] + " '" + netName + "' '" + dev_a + "' '" + pin_a + "' ";
+ cmd += "'" + dev_b + "' '" + pin_b + "' ;\n";
+ dev_a = dev_b;
+ pin_a = pin_b;
+ sn++;
+ }
+ }
+ if( strstr(lines[sn], tok_Change) == 0) {
+ sprintf(s, "%s\n", lines[sn]);
+ cmd += s;
+ }
+ sn++;
+ } while (lines[sn]);
+ return;
+}
+
+// *** MAIN ***
+if (schematic) {
+
+ // run as net command
+ if (device_b && pin_b) {
+
+ int pinA_sheet = 0;
+ int pinB_sheet = 0;
+ int xA, yA, xB, yB;
+ string g = ";\nGRID LAST;\n";
+ int actualsheet;
+ if (sheet) sheet(SH) actualsheet = SH.number;
+
+ // *** Schematic coord. ***
+ schematic(S) {
+ cmd = "SET WIRE_BEND 2;\nGRID MIL 50 2 ;\n";
+ S.sheets(SH) {
+ SH.parts(PA) {
+ if (PA.name == device_a ) {
+ PA.instances(IN) {
+ IN.gate.symbol.pins(P) { // Pin
+ if (P.contact) {
+ string cp = P.contact.name; // PAD name von Connect/Pad
+ if (cp == pin_a) {
+ xA = P.x;
+ yA = P.y;
+ pinA_sheet = SH.number;
+ }
+ }
+ }
+ }
+ }
+ if (device_b) {
+ if (PA.name == device_b ) {
+ PA.instances(IN) {
+ IN.gate.symbol.pins(P) { // Pin
+ if (P.contact) {
+ string cp = P.contact.name; // PAD name von Connect/Pad
+ if (cp == pin_b) {
+ xB = P.x;
+ yB = P.y;
+ pinB_sheet = SH.number;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (net_name) net_name = "'" + net_name + "'";
+ // place Name in ' ' for NET-Command
+
+ string s;
+ if ( (pinA_sheet != 0) && (pinB_sheet != 0) ) {
+ if (pinA_sheet == pinB_sheet) {
+ if (actualsheet != pinA_sheet) {
+ sprintf(s, "EDIT .s%d;\n", pinA_sheet);
+ cmd += s;
+ }
+ sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f)", u2mil(xA)+50, u2mil(yA)-50 );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f);\n", u2mil(xB), u2mil(yB) );
+ cmd += s;
+ exit (cmd + g);
+ }
+ else {
+ if (actualsheet != pinA_sheet) {
+ sprintf(s, "EDIT .s%d;\n", pinA_sheet);
+ cmd += s;
+ }
+ sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xA), u2mil(yA) );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
+ cmd += s;
+ sprintf(s, "LABEL (%.3f %.3f)", u2mil(xA), u2mil(yA) );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
+ cmd += s;
+ sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xA)+50, u2mil(yA)+50 );
+ cmd += s;
+
+ if (actualsheet != pinB_sheet) {
+ sprintf(s, "EDIT .s%d;\n", pinB_sheet);
+ cmd += s;
+ }
+ sprintf(s, "NET %s (%.3f %.3f)", net_name, u2mil(xB), u2mil(yB) );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
+ cmd += s;
+ sprintf(s, "LABEL (%.3f %.3f)", u2mil(xB), u2mil(yB) );
+ cmd += s;
+ sprintf(s, " (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
+ cmd += s;
+ sprintf(s, "CHANGE LAYER 91 (%.3f %.3f);\n", u2mil(xB)+50, u2mil(yB)+50 );
+ cmd += s;
+ exit (cmd + g);
+ }
+ }
+ else {
+ cmd = "";
+ if (pinA_sheet == 0) cmd += "Device " + device_a + " Pin " + pin_a + "\n";
+ if (pinB_sheet == 0) cmd += "Device " + device_b + " Pin " + pin_b + "\n";
+ cmd += "not fond!";
+ dlgMessageBox(cmd, "OK");
+ exit (-1);
+ }
+ }
+
+ // run as script converter
+ else {
+ string ulp_path ;
+ char bkslash = '/';
+ int pos = strrchr(argv[0], bkslash);
+ if (pos >= 0) {
+ ulp_path = strsub(argv[0], 0, pos + 1);
+ }
+
+ // File handling
+ int n = 0;
+ string text;
+ string NetListfileName;
+ int nBytes;
+
+ if (argv[1]) {
+ NetListfileName = argv[1];
+ }
+ else {
+ NetListfileName = dlgFileOpen("Select Script File", "*.scr", "*.*");
+ }
+
+ if (NetListfileName) {
+ nLines = fileread(lines, NetListfileName);
+ readNetList();
+ }
+ output(NetListfileName + "x", "wt") printf("%s", cmd);
+
+ exit (cmd);
+ }
+ }
+else {
+ dlgMessageBox("Start this ULP from a schematic!", "OK");
+ exit (0);
+ }
diff --git a/eagle-5.7.0/ulp/cmd-place-restrict-name-value.ulp b/eagle-5.7.0/ulp/cmd-place-restrict-name-value.ulp
new file mode 100644
index 0000000..8eaf539
--- /dev/null
+++ b/eagle-5.7.0/ulp/cmd-place-restrict-name-value.ulp
@@ -0,0 +1,162 @@
+#usage "Copy name and value into restrict layer\n"
+ " "
+ "Generates a command sequence which copies the name texts-wires and value texts-wires "
+ "of all elements of your layout into restrict layers (41 and 42)."
+ " "
+ " "
+ " %s to : "
+ "See Help of the ULP for further instructions."
+ " "
+ " \n"
+ "If there are names like R01, the program will ask you if it may change those names. "
+ "Otherwise no renaming can be performed."
+ " \n"
+ "Your board MUST be drawn on layer 20 (dimension) and all components MUST be inside it, otherwise the result is unpredictable.\n"
+ " \n"
+ " \n"
+ "Meaning of Parameters\n"
+ " \n"
+ "Unit\n"
+ " \n"
+ "Unit for the value entered in the Scan window.\n"
+ " \n"
+ "Direction\n"
+ " \n"
+ "Renumber direction.\n"
+ " \n"
+ "Top Side: Start from\n"
+ " \n"
+ "Renumber starting point for top (component) side.\n"
+ " \n"
+ "Bottom Side: Start from\n"
+ " \n"
+ "Renumber starting point for bottom (solder) side.\n"
+ " \n"
+ "Scan window\n"
+ " \n"
+ "Dimension of the user-defined window to determine row or column width for components scanning.\n"
+ " \n"
+ "Bottom suffix\n"
+ " \n"
+ "Renumbering starts at the component side.\n"
+ "If Bottom suffix is 0, the bottom component suffixes are continued in sequence.\n"
+ "If Bottom suffix is > 0, the bottom component suffixes start with this number, provided there is no overlapping with component names at the top side.\n"
+ " \n"
+ "Show scripts\n"
+ " \n"
+ "If this box is checked, the respective command scripts are shown before execution of Preview and Renumber. \n"
+ "Preview\n"
+ " \n"
+ "Highlights all components in the order of the currently selected renumbering sequence. \n"
+ "Renumber\n"
+ " \n"
+ "Executes the renumber function and quits program.\n"
+ " \n"
+ ;
+//-----------------------------------------------------------------------------------------
+
+real window, win;
+int sequence_bottom;
+int dir;
+int c_top;
+int c_bottom;
+enum {unitINCH, unitMM};
+int unit = unitINCH;
+int show_script;
+string params;
+
+if (!argv[1]) { // first program instance
+ //---- edit the following default values to your liking ---------------------------------
+ window = 0.4 ; // default scan window width
+ sequence_bottom = 100; // if no overlap, use this new suffix to start on bottom,
+ // otherwise continue in sequence
+ dir = 0; // 0 = horizontally, 1 = vertically
+ c_top = 0; // starting point for top side
+ c_bottom = 3; // starting point for bottom side
+ unit = unitINCH; // change to unitMM, if you want mm as default
+ show_script = 0; // 1 = show script file before execution
+ }
+else {
+ if (argv[1] == "end") { // last program instance
+ dlgMessageBox("Renumber finished!", "&OK");
+ exit(0);
+ }
+ sprintf (params, " %s", argv[1]); // other program instances
+ window = strtod(params);
+ for (int ix = 2; ix <= 7; ix++) {
+ string hx = "";
+ sprintf (hx, " %s", argv[ix]);
+ params += hx;
+ }
+ sequence_bottom = strtol(argv[2]);
+ dir = strtol(argv[3]);
+ c_top = strtol(argv[4]);
+ c_bottom = strtol(argv[5]);
+ unit = strtol(argv[6]);
+ show_script = strtol(argv[7]);
+ if (unit == unitINCH)
+ win = window;
+ else
+ win = window / 25.4;
+ }
+
+//-----------------------------------------------------------------------------------------
+string h, cmd;
+int Result, tmp_int, i, j, z, length_of_name, number_prefix, largest_number_prefix;
+int i_p_top, index_top[], old_suffix_top[], new_suffix_top[];
+real comp_x_abs_top[], comp_y_abs_top[];
+int i_p_bottom, index_bottom[], old_suffix_bottom[], new_suffix_bottom[];
+real comp_x_abs_bottom[], comp_y_abs_bottom[];
+int i_p_both, index_both[], old_suffix_both[], new_suffix_both[];
+real tmp_real, w, pcb_min_x, pcb_min_y, pcb_max_x, pcb_max_y, pcb_length, pcb_height;
+string tmp_string, ref_name, last_prefix, prefix_top[], prefix_bottom[], prefix_both[];
+//-----------------------------------------------------------------------------------------
+
+void DisplayHelp(void)
+{
+ dlgDialog("Renumer Help") {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(HelpText);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("-Close") dlgReject();
+ }
+ };
+}
+//-----------------------------------------------------------------------------------------
+
+string get_progname(void) {
+ string s = strsub(argv[0], 0, strlen(argv[0])-4);
+ string p = s;
+ char c = '/';
+ int pos = strrchr(s, c);
+ if (pos >= 0) {
+ p = strsub(s, pos + 1);
+ }
+ return p;
+}
+//-----------------------------------------------------------------------------------------
+
+void renumber (void) {
+ cmd = "";
+ h = ""; sprintf(h, ";\n"); cmd += h;
+ h = ""; sprintf(h, "Grid Inch;\n"); cmd += h;
+ h = ""; sprintf(h, "Display None;\n"); cmd += h;
+ h = ""; sprintf(h, "Window fit;\n"); cmd += h;
+ h = ""; sprintf(h, "Display 20 21 22 25 26 -27 -28;\n"); cmd += h;
+ for (i = 0; i < i_p_both; ++i) {
+ new_suffix_both[i] = i + 1 ;
+ }
+ sort (i_p_both, index_both, prefix_both, new_suffix_both, old_suffix_both);
+ for (j = 0; j < i_p_both; ++j) { // all parts ------------------------
+ z = 1;
+ tmp_int = 1;
+ tmp_string = prefix_both[index_both[j]];
+ for (i = j; prefix_both[index_both[i]] == tmp_string; ++i) {
+ if ((sequence_bottom > largest_number_prefix) && (new_suffix_both[index_both[i]] > i_p_top) && (tmp_int == 1)) {
+ z = sequence_bottom;
+ tmp_int = 0;
+ }
+ if ((new_suffix_both[index_both[i]] > 0) && (old_suffix_both[index_both[i]] != z)) {
+ new_suffix_both[index_both[i]] = z * -1;
+ }
+ else {
+ new_suffix_both[index_both[i]] = 0 ;
+ }
+ ++z;
+ if (i == i_p_both - 1) break; // added!!!
+ }
+ if (i == i_p_both - 1) break; // added!!!
+ j = i - 1;
+ }
+ for (i = 0; i < i_p_both; ++i) {
+ if (new_suffix_both[index_both[i]] < 0) {
+ h = ""; sprintf(h, "Name '%s%d' '$$%s%d';\n", prefix_both[index_both[i]], old_suffix_both[index_both[i]], prefix_both[index_both[i]], abs(new_suffix_both[index_both[i]])); cmd += h;
+ }
+ }
+ for (i = 0; i < i_p_both; ++i) {
+ if (new_suffix_both[index_both[i]] < 0) {
+ h = ""; sprintf(h, "Name '$$%s%d' '%s%d';\n", prefix_both[index_both[i]], abs(new_suffix_both[index_both[i]]), prefix_both[index_both[i]], abs(new_suffix_both[index_both[i]])); cmd += h;
+ }
+ }
+ h = ""; sprintf(h, "Grid Last;\n"); cmd += h;
+ if (show_script) {
+ Result = dlgDialog("Edit Commands") {
+ dlgVBoxLayout {
+ dlgLabel("Edit only if you are sure what you do!");
+ dlgTextEdit(cmd);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+Ok") dlgAccept();
+ dlgPushButton("-Quit") dlgReject();
+ dlgPushButton("+Save") {
+ string dest = dlgFileSave("Save Script File", "renumber.scr", "*.scr");
+ if (dest != "") output(dest, "wt") {printf(cmd);}
+ }
+ }
+ };
+ if (!Result) exit(0);
+ }
+ cmd += "RUN "+get_progname()+" end";
+ exit(cmd);
+}
+//--------------------------------------------------------------------------------
+
+void preview(void) {
+ cmd = "";
+ sprintf (params, " %f %d %d %d %d %d %d",
+ window, sequence_bottom, dir, c_top, c_bottom, unit, show_script);
+ h = ""; sprintf(h, ";\n"); cmd += h;
+ h = ""; sprintf(h, "Grid Inch;\n"); cmd += h;
+ h = ""; sprintf(h, "Display None;\n"); cmd += h;
+ h = ""; sprintf(h, "Window fit;\n"); cmd += h;
+ h = ""; sprintf(h, "Display 20 21 22 25 26 -27 -28;\n"); cmd += h;
+ for (i = 0; i < i_p_both; ++i)
+ {
+ h = ""; sprintf(h, "Show %s%d %s%d;\n", prefix_both[i], old_suffix_both[i], prefix_both[i], old_suffix_both[i]); cmd += h;
+ }
+ if (show_script) {
+ Result = dlgDialog("Edit Commands") {
+ dlgVBoxLayout {
+ dlgLabel("Edit only if you are sure what you do!");
+ dlgTextEdit(cmd);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+Ok") dlgAccept();
+ dlgPushButton("-Quit") dlgReject();
+ }
+ };
+ if (!Result) exit(0);
+ }
+ cmd += "RUN "+get_progname()+params;
+ exit(cmd);
+}
+//--- collect data ---------------------------------------------------------------
+
+void get_data(void) {
+board(B) { // Get board size to determine ratio.
+ tmp_int = 1;
+ B.wires(W) {
+ if (W.layer == 20) {
+ if (tmp_int == 1) {
+ pcb_min_x = u2inch(W.x1);
+ pcb_min_y = u2inch(W.y1);
+ pcb_max_x = u2inch(W.x1);
+ pcb_max_y = u2inch(W.y1);
+ tmp_int = 0;
+ }
+ if (u2inch(W.x1) < pcb_min_x){pcb_min_x = u2inch(W.x1);}
+ if (u2inch(W.x1) > pcb_max_x){pcb_max_x = u2inch(W.x1);}
+ if (u2inch(W.x2) < pcb_min_x){pcb_min_x = u2inch(W.x2);}
+ if (u2inch(W.x2) > pcb_max_x){pcb_max_x = u2inch(W.x2);}
+ if (u2inch(W.y1) < pcb_min_y){pcb_min_y = u2inch(W.y1);}
+ if (u2inch(W.y1) > pcb_max_y){pcb_max_y = u2inch(W.y1);}
+ if (u2inch(W.y2) < pcb_min_y){pcb_min_y = u2inch(W.y2);}
+ if (u2inch(W.y2) > pcb_max_y){pcb_max_y = u2inch(W.y2);}
+ }
+ }
+ pcb_length = pcb_max_x - pcb_min_x;
+ pcb_height = pcb_max_y - pcb_min_y;
+ number_prefix = 1;
+ last_prefix = "";
+ largest_number_prefix = 1;
+ B.elements(E) {
+ ref_name = E.name ;
+ if (!(strlen(ref_name)<=1 || isdigit(ref_name[0]))) { // exclude R, 04 etc.
+ length_of_name = strlen(ref_name) ;
+ prefix_top[i_p_top] = "" ;
+ new_suffix_top[i_p_top] = 0 ;
+ tmp_string = "" ;
+ if (isdigit(ref_name[length_of_name - 1]) && E.mirror == 0 ) { // on top & num suffix
+ for (i = strlen(ref_name) - 1; isdigit(ref_name[i]); --i); // find prefix + suffix
+ prefix_top[i_p_top] = strsub(ref_name, 0, i+1); // prefix
+ tmp_string = strsub(ref_name, i+1); // suffix
+
+ if (prefix_top[i_p_top] == last_prefix) {
+ ++number_prefix; // inc as long as same prefix
+ }
+ else {
+ last_prefix = prefix_top[i_p_top];
+ if (number_prefix > largest_number_prefix) {
+ largest_number_prefix = number_prefix; // update largest_n..
+ number_prefix = 1;
+ }
+ }
+ old_suffix_top[i_p_top] = strtol(tmp_string) ;
+ switch (c_top) {
+ case 1: // Top-Right
+ {
+ comp_x_abs_top[i_p_top] = abs(u2inch(E.x) - pcb_max_x) ;
+ comp_y_abs_top[i_p_top] = abs(u2inch(E.y) - pcb_max_y) ;
+ break;
+ }
+ case 0: // Top-Left
+ {
+ comp_x_abs_top[i_p_top] = abs(u2inch(E.x) + abs(pcb_min_x)) ;
+ comp_y_abs_top[i_p_top] = abs(u2inch(E.y) - pcb_max_y) ;
+ break;
+ }
+ case 2: // Bottom-Left
+ {
+ comp_x_abs_top[i_p_top] = abs(u2inch(E.x) + abs(pcb_min_x)) ;
+ comp_y_abs_top[i_p_top] = abs(u2inch(E.y) + abs(pcb_min_y)) ;
+ break;
+ }
+ case 3: // Bottom-Right
+
+ {
+ comp_x_abs_top[i_p_top] = abs(u2inch(E.x) - pcb_max_x) ;
+ comp_y_abs_top[i_p_top] = abs(u2inch(E.y) + abs(pcb_min_y)) ;
+ break;
+ }
+ default: // default is Top-Left Corner for Top side.
+ {
+ comp_x_abs_top[i_p_top] = abs(u2inch(E.x) + abs(pcb_min_x)) ;
+ comp_y_abs_top[i_p_top] = abs(u2inch(E.y) - pcb_max_y) ;
+ }
+ }
+ ++i_p_top ;
+ }
+ }
+ }
+ if (number_prefix > largest_number_prefix) {
+ largest_number_prefix = number_prefix; // update largest_n..
+ number_prefix = 1;
+ }
+ }
+if (dir == 1) {
+ sort (i_p_top, index_top, comp_x_abs_top, comp_y_abs_top, prefix_top, old_suffix_top, new_suffix_top) ;
+ j = 0 ;
+ do {
+ w = comp_x_abs_top[index_top[j]] + win;
+ for (i = j + 1; i < i_p_top; ++i) {
+ if (comp_x_abs_top[index_top[i]] > w) {
+ break ;
+ }
+ if (comp_y_abs_top[index_top[i]] < comp_y_abs_top[index_top[i - 1]]) {
+ tmp_real = comp_x_abs_top[index_top[i - 1]];
+ comp_x_abs_top[index_top[i - 1]] = comp_x_abs_top[index_top[i]];
+ comp_x_abs_top[index_top[i]] = tmp_real;
+ tmp_real = comp_y_abs_top[index_top[i - 1]];
+ comp_y_abs_top[index_top[i - 1]] = comp_y_abs_top[index_top[i]];
+ comp_y_abs_top[index_top[i]] = tmp_real;
+ tmp_string = prefix_top[index_top[i - 1]];
+ prefix_top[index_top[i - 1]] = prefix_top[index_top[i]];
+ prefix_top[index_top[i]] = tmp_string;
+ tmp_int = old_suffix_top[index_top[i - 1]];
+ old_suffix_top[index_top[i - 1]] = old_suffix_top[index_top[i]];
+ old_suffix_top[index_top[i]] = tmp_int;
+ tmp_int = new_suffix_top[index_top[i - 1]];
+ new_suffix_top[index_top[i - 1]] = new_suffix_top[index_top[i]];
+ new_suffix_top[index_top[i]] = tmp_int;
+ i = j ;
+ }
+ }
+ j = i ;
+ } while (j < i_p_top) ;
+ }
+else {
+ sort (i_p_top, index_top, comp_y_abs_top, comp_x_abs_top, prefix_top, old_suffix_top, new_suffix_top) ;
+ j = 0 ;
+ do {
+ w = comp_y_abs_top[index_top[j]] + win;
+ for (i = j + 1; i < i_p_top; ++i) {
+ if (comp_y_abs_top[index_top[i]] > w) {
+ break ;
+ }
+ if (comp_x_abs_top[index_top[i]] < comp_x_abs_top[index_top[i - 1]]) {
+ tmp_real = comp_x_abs_top[index_top[i - 1]];
+ comp_x_abs_top[index_top[i - 1]] = comp_x_abs_top[index_top[i]];
+ comp_x_abs_top[index_top[i]] = tmp_real;
+ tmp_real = comp_y_abs_top[index_top[i - 1]];
+ comp_y_abs_top[index_top[i - 1]] = comp_y_abs_top[index_top[i]];
+ comp_y_abs_top[index_top[i]] = tmp_real;
+ tmp_string = prefix_top[index_top[i - 1]];
+ prefix_top[index_top[i - 1]] = prefix_top[index_top[i]];
+ prefix_top[index_top[i]] = tmp_string;
+ tmp_int = old_suffix_top[index_top[i - 1]];
+ old_suffix_top[index_top[i - 1]] = old_suffix_top[index_top[i]];
+ old_suffix_top[index_top[i]] = tmp_int;
+ tmp_int = new_suffix_top[index_top[i - 1]];
+ new_suffix_top[index_top[i - 1]] = new_suffix_top[index_top[i]];
+ new_suffix_top[index_top[i]] = tmp_int;
+ i = j ;
+ }
+ }
+ j = i ;
+ } while (j < i_p_top) ;
+ }
+// Bottom side of board
+board(B) {
+ B.elements(E) {
+ ref_name = E.name ;
+ if (!(strlen(ref_name)<=1 || isdigit(ref_name[0]))) { // exclude R, 04 etc.
+ length_of_name = strlen(ref_name) ;
+ prefix_bottom[i_p_bottom] = "" ;
+ new_suffix_bottom[i_p_bottom] = 0 ;
+ tmp_string = "" ;
+ if (isdigit(ref_name[length_of_name - 1]) && E.mirror == 1 ) {
+ for (i = strlen(ref_name) - 1; isdigit(ref_name[i]); --i); // find prefix
+ prefix_bottom[i_p_bottom] = strsub(ref_name, 0, i+1);
+ tmp_string = strsub(ref_name, i+1); // suffix
+ old_suffix_bottom[i_p_bottom] = strtol(tmp_string) ;
+ switch (c_bottom)
+ {
+ case 1: // Top-Right
+ {
+ comp_x_abs_bottom[i_p_bottom] = abs(u2inch(E.x) - pcb_max_x) ;
+ comp_y_abs_bottom[i_p_bottom] = abs(u2inch(E.y) - pcb_max_y) ;
+ break;
+ }
+ case 0: // Top-Left
+ {
+ comp_x_abs_bottom[i_p_bottom] = abs(u2inch(E.x) + abs(pcb_min_x)) ;
+ comp_y_abs_bottom[i_p_bottom] = abs(u2inch(E.y) - pcb_max_y) ;
+ break;
+ }
+ case 2: // Bottom-Left
+ {
+ comp_x_abs_bottom[i_p_bottom] = abs(u2inch(E.x) + abs(pcb_min_x)) ;
+ comp_y_abs_bottom[i_p_bottom] = abs(u2inch(E.y) + abs(pcb_min_y)) ;
+ break;
+ }
+ case 3: // Bottom-Right
+ {
+ comp_x_abs_bottom[i_p_bottom] = abs(u2inch(E.x) - pcb_max_x) ;
+ comp_y_abs_bottom[i_p_bottom] = abs(u2inch(E.y) + abs(pcb_min_y)) ;
+ break;
+ }
+ default: // default is Top-Right Corner for Bottom side.
+ {
+ comp_x_abs_bottom[i_p_bottom] = abs(u2inch(E.x) - pcb_max_x) ;
+ comp_y_abs_bottom[i_p_bottom] = abs(u2inch(E.y) - pcb_max_y) ;
+ }
+ }
+ ++i_p_bottom ;
+ }
+ }
+ }
+ }
+if (dir == 1) {
+ sort (i_p_bottom, index_bottom, comp_x_abs_bottom, comp_y_abs_bottom, prefix_bottom, old_suffix_bottom, new_suffix_bottom) ;
+ j = 0 ;
+ do {
+ w = comp_x_abs_bottom[index_bottom[j]] + win;
+ for (i = j + 1; i < i_p_bottom; ++i) {
+ if (comp_x_abs_bottom[index_bottom[i]] > w) {
+ break ;
+ }
+ if (comp_y_abs_bottom[index_bottom[i]] < comp_y_abs_bottom[index_bottom[i - 1]]) {
+ tmp_real = comp_x_abs_bottom[index_bottom[i - 1]];
+ comp_x_abs_bottom[index_bottom[i - 1]] = comp_x_abs_bottom[index_bottom[i]];
+ comp_x_abs_bottom[index_bottom[i]] = tmp_real;
+ tmp_real = comp_y_abs_bottom[index_bottom[i - 1]];
+ comp_y_abs_bottom[index_bottom[i - 1]] = comp_y_abs_bottom[index_bottom[i]];
+ comp_y_abs_bottom[index_bottom[i]] = tmp_real;
+ tmp_string = prefix_bottom[index_bottom[i - 1]];
+ prefix_bottom[index_bottom[i - 1]] = prefix_bottom[index_bottom[i]];
+ prefix_bottom[index_bottom[i]] = tmp_string;
+ tmp_int = old_suffix_bottom[index_bottom[i - 1]];
+ old_suffix_bottom[index_bottom[i - 1]] = old_suffix_bottom[index_bottom[i]];
+ old_suffix_bottom[index_bottom[i]] = tmp_int;
+ tmp_int = new_suffix_bottom[index_bottom[i - 1]];
+ new_suffix_bottom[index_bottom[i - 1]] = new_suffix_bottom[index_bottom[i]];
+ new_suffix_bottom[index_bottom[i]] = tmp_int;
+ i = j ;
+ }
+ }
+ j = i ;
+ } while (j < i_p_bottom) ;
+ }
+else {
+ sort (i_p_bottom, index_bottom, comp_y_abs_bottom, comp_x_abs_bottom, prefix_bottom, old_suffix_bottom, new_suffix_bottom) ;
+ j = 0 ;
+ do {
+ w = comp_y_abs_bottom[index_bottom[j]] + win;
+ for (i = j + 1; i < i_p_bottom; ++i) {
+ if (comp_y_abs_bottom[index_bottom[i]] > w) {
+ break ;
+ }
+ if (comp_x_abs_bottom[index_bottom[i]] < comp_x_abs_bottom[index_bottom[i - 1]]) {
+ tmp_real = comp_x_abs_bottom[index_bottom[i - 1]];
+ comp_x_abs_bottom[index_bottom[i - 1]] = comp_x_abs_bottom[index_bottom[i]];
+ comp_x_abs_bottom[index_bottom[i]] = tmp_real;
+ tmp_real = comp_y_abs_bottom[index_bottom[i - 1]];
+ comp_y_abs_bottom[index_bottom[i - 1]] = comp_y_abs_bottom[index_bottom[i]];
+ comp_y_abs_bottom[index_bottom[i]] = tmp_real;
+ tmp_string = prefix_bottom[index_bottom[i - 1]];
+ prefix_bottom[index_bottom[i - 1]] = prefix_bottom[index_bottom[i]];
+ prefix_bottom[index_bottom[i]] = tmp_string;
+ tmp_int = old_suffix_bottom[index_bottom[i - 1]];
+ old_suffix_bottom[index_bottom[i - 1]] = old_suffix_bottom[index_bottom[i]];
+ old_suffix_bottom[index_bottom[i]] = tmp_int;
+ tmp_int = new_suffix_bottom[index_bottom[i - 1]];
+ new_suffix_bottom[index_bottom[i - 1]] = new_suffix_bottom[index_bottom[i]];
+ new_suffix_bottom[index_bottom[i]] = tmp_int;
+ i = j ;
+ }
+ }
+ j = i ;
+ } while (j < i_p_bottom) ;
+ }
+i_p_both = 0;
+for (i = 0; i < i_p_top; ++i) {
+ prefix_both[i_p_both] = prefix_top[index_top[i]];
+ old_suffix_both[i_p_both] = old_suffix_top[index_top[i]];
+ new_suffix_both[i_p_both] = new_suffix_top[index_top[i]];
+ ++i_p_both;
+ }
+for (i = 0; i < i_p_bottom; ++i) {
+ prefix_both[i_p_both] = prefix_bottom[index_bottom[i]];
+ old_suffix_both[i_p_both] = old_suffix_bottom[index_bottom[i]];
+ new_suffix_both[i_p_both] = new_suffix_bottom[index_bottom[i]];
+ ++i_p_both;
+ }
+}
+//--------------------------------------------------------------------------------
+// change names if necessary: R01 -> R100001 etc.
+
+string correct_name(string s) {
+string s1, s2;
+int i, j;
+ if (strlen(s) < 2 || isdigit(s[0]))
+ return s; // single character or name starts with 0
+ if (!isdigit(s[strlen(s)-1])) // no suffix
+ return s;
+ for (i = 0; !isdigit(s[i]); ++i); // i points to first numeric character
+ for (j = strlen(s) - 1; isdigit(s[j]); --j); // j points to last non-numeric character
+ if ((i < strlen(s) -1) && s[i] == '0') {
+ s1 = strsub(s, 0, i);
+ s2 = strsub(s, i);
+ s = s1+"1000"+s2;
+ }
+ return s;
+}
+//--------------------------------------------------------------------------------
+void view_names(void) {
+ board(B) {
+ B.elements(P) {
+ h= ""; sprintf(h, "%s\n", P.name);
+ cmd += h;
+ }
+ }
+
+ dlgDialog("Part names") {
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(cmd);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("-Close") dlgReject();
+ }
+ };
+}
+//--------------------------------------------------------------------------------
+
+void check_names(void) {
+ int name_changed = 0;
+ string corr_name;
+ cmd = ";\n";
+ board(B) { // replace R01 with R100001 etc.
+ B.elements(P) {
+ corr_name = correct_name(P.name);
+ if (corr_name != P.name) {
+ name_changed = 1;
+ h= ""; sprintf(h, "NAME '%s' '%s';\n", P.name, corr_name);
+ cmd += h;
+ }
+ }
+ }
+if (name_changed) {
+ if (dlgMessageBox("Board contains packages with leading zero\nsuffixes (e.g. R01). Renumber cannot handle such names!\n\nChange automatically?",
+ "&OK", "&Quit") == 0) {
+ Result = dlgDialog("Changes") {
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(cmd);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgSpacing(40);
+ dlgPushButton("-OK") dlgAccept();
+ dlgPushButton("-Close") dlgReject();
+ }
+ };
+ if (!Result) exit(0);
+ cmd += "RUN "+get_progname();
+ exit(cmd);
+ }
+ else {
+ exit(0);
+ }
+ }
+ }
+//--- main -----------------------------------------------------------------------
+
+if (!board) {
+ dlgMessageBox(usage + " \nThis program can only work in the board editor.");
+ exit(1);
+ }
+
+dlgDialog("Renumber Components") {
+ dlgHBoxLayout {
+ dlgGroup("Unit") {
+ dlgRadioButton("&inch", unit);
+ dlgRadioButton("&mm", unit);
+ }
+ dlgGroup("Direction") {
+ dlgRadioButton("&Horizontal", dir);
+ dlgRadioButton("&Vertical", dir);
+ }
+ dlgGroup("Top Side: Start from") {
+ dlgGridLayout {
+ dlgCell(0, 0) dlgRadioButton("Top left", c_top);
+ dlgCell(0, 3) dlgRadioButton("Top right", c_top);
+ dlgCell(3, 0) dlgRadioButton("Bottom left ", c_top);
+ dlgCell(3, 3) dlgRadioButton("Bottom right", c_top);
+ }
+ }
+ dlgGroup("Bottom Side: Start from") {
+ dlgGridLayout {
+ dlgCell(0, 0) dlgRadioButton("Top left", c_bottom);
+ dlgCell(0, 3) dlgRadioButton("Top right", c_bottom);
+ dlgCell(3, 0) dlgRadioButton("Bottom left ", c_bottom);
+ dlgCell(3, 3) dlgRadioButton("Bottom right", c_bottom);
+ }
+ }
+ }
+dlgHBoxLayout {
+ dlgRealEdit(window, 0.0, 99.0);
+ dlgLabel("Scan &window ");
+ dlgIntEdit(sequence_bottom, 0, 1000);
+ dlgLabel("Bottom suffix ");
+ dlgCheckBox("&Show scripts ", show_script);
+ dlgStretch(1);
+ }
+ dlgSpacing(30);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&View names") view_names();
+ dlgPushButton("+&Preview") { get_data();
+ check_names();
+ preview();
+ }
+ dlgPushButton("&Renumber") { get_data();
+ check_names();
+ renumber();
+ }
+ dlgPushButton("-&Quit") dlgReject();
+ dlgSpacing(30);
+ dlgPushButton("&Help") DisplayHelp();
+ }
+ };
diff --git a/eagle-5.7.0/ulp/cmd-showzoom.ulp b/eagle-5.7.0/ulp/cmd-showzoom.ulp
new file mode 100644
index 0000000..78b5e86
--- /dev/null
+++ b/eagle-5.7.0/ulp/cmd-showzoom.ulp
@@ -0,0 +1,91 @@
+#usage "Show object and zoom in\n"
+ " "
+ "Implemented for parts and signals on a board. "
+ "Could be extended for schematics."
+ " "
+ " "
+ "Snaps components, wires and vias of the current "
+ "board to a given grid. "
+ "If 'Show script' is checked, you can edit the MOVE commands "
+ "before they are executed. So you are able to exclude certain "
+ "elements from the snap procedure."
+ " "
+ " \nThis program can only work in the board editor.");
+ exit(1);
+}
+
+if (argc == 4) {
+ unit = strtol(argv[2]);
+ GridDist = strtod(argv[3]);
+ snap_to_grid();
+}
+
+else {
+ dlgDialog("Snap Packages/Wires/Vias") {
+ dlgHBoxLayout {
+ dlgHBoxLayout {
+ dlgGroup("Unit") {
+ dlgRadioButton("&inch", unit);
+ dlgRadioButton("&mil", unit);
+ dlgRadioButton("&mm", unit);
+ dlgRadioButton("&mic", unit);
+ dlgSpacing(20);
+ dlgLabel("Snap grid ");
+ dlgRealEdit(GridDist, 0.0001, 1000);
+ }
+ }
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgSpacing(10);
+ dlgLabel(Status, 1);
+ dlgHBoxLayout {
+ dlgPushButton("+&Snap") {
+ Status = "Busy...";
+ dlgRedisplay();
+ snap_to_grid();
+ dlgAccept();
+ }
+ dlgPushButton("-&Cancel") exit(0);
+ }
+ dlgSpacing(7);
+ }
+ }
+ };
+}
+
+output(script_name, "wtD") printf(cmd);
+string s;
+sprintf(s, "SCRIPT '%s'\n;GRID LAST;\n%s;\n", script_name, h);
+exit(s);
diff --git a/eagle-5.7.0/ulp/cmd-snappads.ulp b/eagle-5.7.0/ulp/cmd-snappads.ulp
new file mode 100644
index 0000000..83be0dd
--- /dev/null
+++ b/eagle-5.7.0/ulp/cmd-snappads.ulp
@@ -0,0 +1,153 @@
+#usage "Snap pads and smds in a package\n"
+ " "
+ "Snaps pads and SMDs in the package editor to a given grid "
+ "(different grids in x and y direction selectable)."
+ " "
+ " \nThis program can only work in the package editor.");
+ exit(1);
+ }
+
+library(L) {
+ if (package) package(PAC) {
+ }
+ else {
+ dlgMessageBox("No package loaded!", "OK");
+ exit(1);
+ }
+ }
+
+while (1) {
+dlgDialog("Snap") {
+ dlgHBoxLayout {
+ dlgHBoxLayout {
+ dlgGroup("Unit") {
+ dlgRadioButton("&inch", unit);
+ dlgRadioButton("&mil", unit);
+ dlgRadioButton("&mm", unit);
+ dlgRadioButton("&mic", unit);
+ dlgSpacing(20);
+ dlgLabel("Snap grid horizontal");
+ dlgRealEdit(GridDistH, 0.0001, 1000);
+ if (!sym) {
+ dlgLabel("Snap grid vertical");
+ dlgRealEdit(GridDistV, 0.0001, 1000);
+ }
+ }
+ }
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgSpacing(110);
+ if (!sym)dlgSpacing(35);
+ dlgHBoxLayout {
+ if (sym) {
+ dlgPushButton("Two Grids ") {sym = 0;
+ GridDistV = GridDistH;
+ dlgAccept();
+ }
+ }
+ else {
+
+ dlgPushButton("One Grid ") {sym = 1;
+ dlgAccept();
+ }
+ }
+ dlgPushButton("+&Snap") {if (sym) GridDistV = GridDistH;
+ snappads();
+ }
+ dlgPushButton("-&Cancel") exit(0);
+ }
+ }
+ }
+ };
+}
diff --git a/eagle-5.7.0/ulp/copy-layer-to-any-layer.ulp b/eagle-5.7.0/ulp/copy-layer-to-any-layer.ulp
new file mode 100644
index 0000000..7553c8c
--- /dev/null
+++ b/eagle-5.7.0/ulp/copy-layer-to-any-layer.ulp
@@ -0,0 +1,363 @@
+#usage " "
+ "This ULP copies copper wire and/or polygon from layer (1 or 16) of selected signals into "
+ "any layer in order. "
+ "Use: "
+ "Options are case sensitive. "
+ "Generates a command sequence which copies the silk placement "
+ "of all elements of your layout into newly generated layers (+100). "
+ "After running the ULP you can GROUP, CUT and PASTE your layout "
+ "to get an array of several boards."
+ " "
+ "The duplicated name texts in the new layers will not be changed. "
+ "Please notice that you have to deactivate layers 21 - 28 and 51 - 52, if you use "
+ "the CAM processor e.g. for generating gerber data. Instead, you have to activate "
+ "the new layers 121 - 152. Thus you get an identical silk screen for all "
+ "your layouts in this array."
+ " "
+ " "
+ "Generates a command sequence which copies the texts-wires "
+ "of texts of your layout into user layer(s)."
+ " "
+ " "
+ "This ULP copies copper wire and/or polygon from layer (1 or 16) of selected signals into "
+ "the solderstop layers or any layer in order to keep it free from solder stop layer. "
+ "Use: "
+ "Options are case sensitive. "
+ " "
+ "To delete a number of devices, run this ULP and "
+ "edit the commands in the appearing editor window."
+ " "
+ "The remaining DELETE commands are executed after the "
+ "EXECUTE button has been clicked."
+ " "
+ " "
+ "To delete devices without a symbol from a library, "
+ "run this ULP and click EXECUTE."
+ " "
+ "Before executing the DELETE commands you can edit them "
+ "in the appearing editor window."
+ " "
+ " "
+ "To delete unused packages and symbols from a library, "
+ "run this ULP. You are allowed to edit the commands in "
+ "the appearing editor window."
+ " "
+ "The remaining DELETE commands will be executed after "
+ "clicking the EXECUTE button."
+ " "
+ "Packages and Symbols in use can't be deleted. To confirm this "
+ "messages keep the Enter key pressed until the ULP has finished."
+ " "
+ " "
+ "This format is used for production and test purposes. It has been defined by Digitaltest GmbH. "
+ "Run the ULP from the board editor and get the file boardname.dif. "
+ "Please have a look at the \"user definable parameters\" section of the program."
+ " "
+ " "
+ "Generates data to control the solder cream dosage for the dispenser "
+ "unit of 'Martin' on 'Bungard' drill/milling machines."
+ " "
+ "The file boardname.plt contains the coordinates of the SMD pads "
+ "in the Top layer, while boardname.plb contains those in the "
+ "bottom layer."
+ " "
+ "The file boardname.dod contains the information of the SMD pads "
+ "regarding tool number Txx."
+ " "
+ " "
+ "Draws small circles in layer 116 inside the drilling of pads, vias and holes, "
+ "which should make it easier to center the tool while drilling the "
+ "board manually."
+ " "
+ "Usage: RUN drill-aid [ diameter ]"
+ " "
+ "Activate layer 116 in addition to the bottom side layers in the "
+ "CAM processor or use the DISPLAY command to activate it for printing."
+ " "
+ "To delete the elements in layer 116 afterwards, display it without "
+ "any other layers, and use GROUP and DELETE. Then remove the whole "
+ "layer with the command LAYER -116."
+ " "
+ " "
+ "Generates a drill configuration file for the current board."
+ " "
+ "Units: mm or inches can be chosen."
+ " "
+ "The generated file can be edited before saving."
+ " "
+ "Use this ULP also for checking the drills of a board."
+ " "
+ " "
+ "This ULP add a drill legend in a board in Layer 144 (default). "
+ " Drill legend Settings" +
+ " " +
+ " Drill legend Orientation Symbols Settings " +
+ " " +
+ "Nota: " +
+ "Drilegend.ulp drills symbols and Eagle drills symbols are associated with the same drill tool number " +
+ "in the same ascending order, so each drill tool number always is associated with the same drill symbol. " +
+ "But, they are not associated in the same manner with the holes diameters. " +
+ "Drilegend.ulp sort the holes diameters (like drillcfg.ulp) in ascending order before to associate each with " +
+ "a drill tool number, so drill tools numbers and holes diameters are sorted together in a same increasing order. " +
+ "Eagle extract the holes diameters as is from the board, and give them a increasing tool number without sort before. " +
+ "The result of each method is evidently different and that's why it's very important after each run of this ulp " +
+ "to open the \"Options>Settings>Drill\" and verify if it's necessary to update and sort holes diameters and tools numbers " +
+ "in the same ascending order like the drill legend. Texts Settings " +
+ " " +
+ "Nota: For printer output choose the font what you want but " +
+ "for gerber output keep VECTOR. Cell Margin Factor " +
+ "Enter in theses fields a value (from 1.0 to 9.9) for increase or decrease the space between texts and border cells. " +
+ " " +
+ "Outline Width Non-Plated " +
+ "All holes diameters (plated or not plated) are sorted in ascending mode. " +
+ " " +
+ "Plated Status " +
+ "Nota: Avoid to use the same diameter for plated an non-plated holes. " +
+ "Unit Precision " +
+ "Choose here the number of unit after the decimal point." +
+ " Holes Tolerance " +
+ "Nota: Tolerance field is String type, so you can enter anything like: 0,02 or +/- 0.03 Drill Rack File for CAM Processor " +
+ " "
+ "Converts a board or schematic into a DXF file."
+ " "
+ "Usage: RUN dxf [ -s suffix ] [ -u mm|inch ] [ -a ] [ -w ] [ -f ]"
+ " "
+ "Options: "
+ "RUN dxf -s _s1 -u mm -w"
+ " "
+ "This will create a DXF file named filename_s1.dxf, with units in millimeters and "
+ "wires drawn with their real widths."
+ " "
+ "DXF syntax generated according to the specifications given in the book "
+ "Konvertiert ein Board oder einen Schaltplan in eine DXF-Datei."
+ " "
+ "Aufruf: RUN dxf [ -s suffix ] [ -u mm|inch ] [ -a ] [ -w ] [ -f ]"
+ " "
+ "Optionen: "
+ "RUN dxf -s _s1 -u mm -w"
+ " "
+ "Erzeugt eine DXF-Datei namens dateiname_s1.dxf, mit der Einheit Millimeter und "
+ "Linien die in ihrer wirklichen Breite dargestellt werden."
+ " "
+ "Die generierte DXF-Syntax folgt der Spezification im Buch \nThis program can only work in the board or schematic editor.\v"
+ " \nDieses Programm kann nur im Board- oder Schaltplan-Editor verwendet werden.\v"
+ ,
+ "DXF Converter\v"
+ "DXF-Konverter\v"
+ ,
+ "&Output file\v"
+ "&Ausgabedatei\v"
+ ,
+ "&Browse\v"
+ "&Durchsuchen\v"
+ ,
+ "Save DXF file\v"
+ "DXF-Datei speichern\v"
+ ,
+ "DXF files (*.dxf)\v"
+ "DXF-Dateien (*.dxf)\v"
+ ,
+ "&Always vector font\v"
+ "Immer &Vektor-Font\v"
+ ,
+ "If checked, texts will always be drawn with the builtin vector font.\v"
+ "Falls ausgewählt, werden Texte immer mit dem eingebauten Vektor-Font dargestelt.\v"
+ ,
+ "&Use wire widths\v"
+ "&Linienbreite verwenden\v"
+ ,
+ "If checked, wires, arcs and circles will be generated as polygons showing their real widths. This, however, can cause the DXF file to become very large! Uncheck this if you do not need the real widths.\v"
+ "Falls ausgewählt, werden Linien, Kreisbögen und Kreise als Polygone mit ihrer tatsächlichen Breite dargestellt. Dies kann jedoch dazu führen, daß die DXF-Datei sehr groß wird! Deselektieren Sie diese Option wenn Sie die wahren Breiten nicht benötigen.\v"
+ ,
+ "&Fill areas\v"
+ "&Flächen füllen\v"
+ ,
+ "If checked, wires, arcs etc. will be filled (implies 'Use wire widths'!).\v"
+ "Falls ausgewählt, werden Linien, Kreisbögen usw. gefüllt (impliziert 'Linienbreite verwenden'!).\v"
+ ,
+ "Thermal Emulation\v"
+ "Thermal Emulation\v"
+ ,
+ "Relative inner diameter\v"
+ "Relativer Innendurchmesser\v"
+ ,
+ "Relative gap size\v"
+ "Relative Spaltgröße\v"
+ ,
+ "Only the outer diameter of Thermals is available. The inner diameter and gap size are calculated based on the outer diameters according to these factors.\v"
+ "Für Thermals steht nur der Außendurchmesser zur Verfügung. Der Innendurchmesser und die Spaltgröße werden mittels dieser Faktoren aus dem Außendurchmesser errechnet.\v"
+ ,
+ "Unit\v"
+ "Einheit\v"
+ ,
+ "Defines the unit used for coordinates and values in the DXF file\v"
+ "Legt die Einheit fest mit der Koordinaten und Werte in der DXF-Datei angegeben werden\v"
+ ,
+ "File exists: \v"
+ "Datei existiert: \v"
+ ,
+ "\n\nOverwrite?\v"
+ "\n\nÃœberschreiben?\v"
+ ,
+ "+&Yes\v"
+ "+&Ja\v"
+ ,
+ "-&No\v"
+ "-&Nein\v"
+ ,
+ "About\v"
+ "Info\v"
+ };
+
+int Language = strstr(I18N[0], language()) / 3;
+
+string tr(string s)
+{
+ string t = lookup(I18N, s, Language, '\v');
+ return t ? t : s;
+}
+
+//
+// The following switches allow us to customize the generated DXF file:
+//
+
+enum { NO, YES };
+
+int AlwaysVectorFont= YES; // YES always draws texts in vector font, no
+ // matter what the actual font settings are
+int UseWireWidths = YES; // YES will generate wires, arcs and circles
+ // as polygons showing their real widths.
+ // This, however, can cause the DXF file to
+ // become very large!
+ // Set this to NO if you do not need the real
+ // widths.
+int FillAreas = YES; // YES will fill wires, arcs etc. You must also
+ // set UseWireWidths to YES for this to work
+
+real AnnulusRelInnerDiameter = 0.8;
+real AnnulusRelGap = 0.2;
+int VisibleSupplyLayer = NO;
+int IsSupplyLayer[];
+
+enum { MM, INCH };
+
+int Unit = MM;
+
+int SafetyOverlap = 1.0 / u2mil(1); // 1.0 mil overlap
+
+int PadColor = 0, ViaColor = 0;
+
+//
+// Some tools we need later:
+//
+
+real DxfUnit(int n)
+{
+ return (Unit == MM) ? u2mm(n) : u2inch(n);
+}
+
+real DxfAngle(real a)
+{
+ return a >= 360 ? a - 360 : a; // 0 <= DXF-Angle < 360
+}
+
+int LayerActive[] = {1};
+
+int DxfColors[] = { // AutoCAD Color Index (ACI)
+ 0x00000000, // 0 0.00000 0.00000 0.00000
+ 0x00FF0000, // 1 1.00000 0.00000 0.00000
+ 0x00FFFF00, // 2 1.00000 1.00000 0.00000
+ 0x0000FF00, // 3 0.00000 1.00000 0.00000
+ 0x0000FFFF, // 4 0.00000 1.00000 1.00000
+ 0x000000FF, // 5 0.00000 0.00000 1.00000
+ 0x00FF00FF, // 6 1.00000 0.00000 1.00000
+ 0x00FFFFFF, // 7 1.00000 1.00000 1.00000
+ 0x00FFFFFF, // 8 1.00000 1.00000 1.00000
+ 0x00FFFFFF, // 9 1.00000 1.00000 1.00000
+ 0x00FF0000, // 10 1.00000 0.00000 0.00000
+ 0x00FF7F7F, // 11 1.00000 0.50000 0.50000
+ 0x00A50000, // 12 0.65000 0.00000 0.00000
+ 0x00A55252, // 13 0.65000 0.32500 0.32500
+ 0x007F0000, // 14 0.50000 0.00000 0.00000
+ 0x007F3F3F, // 15 0.50000 0.25000 0.25000
+ 0x004C0000, // 16 0.30000 0.00000 0.00000
+ 0x004C2626, // 17 0.30000 0.15000 0.15000
+ 0x00260000, // 18 0.15000 0.00000 0.00000
+ 0x00261313, // 19 0.15000 0.07500 0.07500
+ 0x00FF3F00, // 20 1.00000 0.25000 0.00000
+ 0x00FF9F7F, // 21 1.00000 0.62500 0.50000
+ 0x00A52900, // 22 0.65000 0.16250 0.00000
+ 0x00A56752, // 23 0.65000 0.40625 0.32500
+ 0x007F1F00, // 24 0.50000 0.12500 0.00000
+ 0x007F4F3F, // 25 0.50000 0.31250 0.25000
+ 0x004C1300, // 26 0.30000 0.07500 0.00000
+ 0x004C2F26, // 27 0.30000 0.18750 0.15000
+ 0x00260900, // 28 0.15000 0.03750 0.00000
+ 0x00261713, // 29 0.15000 0.09375 0.07500
+ 0x00FF7F00, // 30 1.00000 0.50000 0.00000
+ 0x00FFBF7F, // 31 1.00000 0.75000 0.50000
+ 0x00A55200, // 32 0.65000 0.32500 0.00000
+ 0x00A57C52, // 33 0.65000 0.48750 0.32500
+ 0x007F3F00, // 34 0.50000 0.25000 0.00000
+ 0x007F5F3F, // 35 0.50000 0.37500 0.25000
+ 0x004C2600, // 36 0.30000 0.15000 0.00000
+ 0x004C3926, // 37 0.30000 0.22500 0.15000
+ 0x00261300, // 38 0.15000 0.07500 0.00000
+ 0x00261C13, // 39 0.15000 0.11250 0.07500
+ 0x00FFBF00, // 40 1.00000 0.75000 0.00000
+ 0x00FFDF7F, // 41 1.00000 0.87500 0.50000
+ 0x00A57C00, // 42 0.65000 0.48750 0.00000
+ 0x00A59152, // 43 0.65000 0.56875 0.32500
+ 0x007F5F00, // 44 0.50000 0.37500 0.00000
+ 0x007F6F3F, // 45 0.50000 0.43750 0.25000
+ 0x004C3900, // 46 0.30000 0.22500 0.00000
+ 0x004C4226, // 47 0.30000 0.26250 0.15000
+ 0x00261C00, // 48 0.15000 0.11250 0.00000
+ 0x00262113, // 49 0.15000 0.13125 0.07500
+ 0x00FFFF00, // 50 1.00000 1.00000 0.00000
+ 0x00FFFF7F, // 51 1.00000 1.00000 0.50000
+ 0x00A5A500, // 52 0.65000 0.65000 0.00000
+ 0x00A5A552, // 53 0.65000 0.65000 0.32500
+ 0x007F7F00, // 54 0.50000 0.50000 0.00000
+ 0x007F7F3F, // 55 0.50000 0.50000 0.25000
+ 0x004C4C00, // 56 0.30000 0.30000 0.00000
+ 0x004C4C26, // 57 0.30000 0.30000 0.15000
+ 0x00262600, // 58 0.15000 0.15000 0.00000
+ 0x00262613, // 59 0.15000 0.15000 0.07500
+ 0x00BFFF00, // 60 0.75000 1.00000 0.00000
+ 0x00DFFF7F, // 61 0.87500 1.00000 0.50000
+ 0x007CA500, // 62 0.48750 0.65000 0.00000
+ 0x0091A552, // 63 0.56875 0.65000 0.32500
+ 0x005F7F00, // 64 0.37500 0.50000 0.00000
+ 0x006F7F3F, // 65 0.43750 0.50000 0.25000
+ 0x00394C00, // 66 0.22500 0.30000 0.00000
+ 0x00424C26, // 67 0.26250 0.30000 0.15000
+ 0x001C2600, // 68 0.11250 0.15000 0.00000
+ 0x00212613, // 69 0.13125 0.15000 0.07500
+ 0x007FFF00, // 70 0.50000 1.00000 0.00000
+ 0x00BFFF7F, // 71 0.75000 1.00000 0.50000
+ 0x0052A500, // 72 0.32500 0.65000 0.00000
+ 0x007CA552, // 73 0.48750 0.65000 0.32500
+ 0x003F7F00, // 74 0.25000 0.50000 0.00000
+ 0x005F7F3F, // 75 0.37500 0.50000 0.25000
+ 0x00264C00, // 76 0.15000 0.30000 0.00000
+ 0x00394C26, // 77 0.22500 0.30000 0.15000
+ 0x00132600, // 78 0.07500 0.15000 0.00000
+ 0x001C2613, // 79 0.11250 0.15000 0.07500
+ 0x003FFF00, // 80 0.25000 1.00000 0.00000
+ 0x009FFF7F, // 81 0.62500 1.00000 0.50000
+ 0x0029A500, // 82 0.16250 0.65000 0.00000
+ 0x0067A552, // 83 0.40625 0.65000 0.32500
+ 0x001F7F00, // 84 0.12500 0.50000 0.00000
+ 0x004F7F3F, // 85 0.31250 0.50000 0.25000
+ 0x00134C00, // 86 0.07500 0.30000 0.00000
+ 0x002F4C26, // 87 0.18750 0.30000 0.15000
+ 0x00092600, // 88 0.03750 0.15000 0.00000
+ 0x00172613, // 89 0.09375 0.15000 0.07500
+ 0x0000FF00, // 90 0.00000 1.00000 0.00000
+ 0x007FFF7F, // 91 0.50000 1.00000 0.50000
+ 0x0000A500, // 92 0.00000 0.65000 0.00000
+ 0x0052A552, // 93 0.32500 0.65000 0.32500
+ 0x00007F00, // 94 0.00000 0.50000 0.00000
+ 0x003F7F3F, // 95 0.25000 0.50000 0.25000
+ 0x00004C00, // 96 0.00000 0.30000 0.00000
+ 0x00264C26, // 97 0.15000 0.30000 0.15000
+ 0x00002600, // 98 0.00000 0.15000 0.00000
+ 0x00132613, // 99 0.07500 0.15000 0.07500
+ 0x0000FF3F, // 100 0.00000 1.00000 0.25000
+ 0x007FFF9F, // 101 0.50000 1.00000 0.62500
+ 0x0000A529, // 102 0.00000 0.65000 0.16250
+ 0x0052A567, // 103 0.32500 0.65000 0.40625
+ 0x00007F1F, // 104 0.00000 0.50000 0.12500
+ 0x003F7F4F, // 105 0.25000 0.50000 0.31250
+ 0x00004C13, // 106 0.00000 0.30000 0.07500
+ 0x00264C2F, // 107 0.15000 0.30000 0.18750
+ 0x00002609, // 108 0.00000 0.15000 0.03750
+ 0x00132617, // 109 0.07500 0.15000 0.09375
+ 0x0000FF7F, // 110 0.00000 1.00000 0.50000
+ 0x007FFFBF, // 111 0.50000 1.00000 0.75000
+ 0x0000A552, // 112 0.00000 0.65000 0.32500
+ 0x0052A57C, // 113 0.32500 0.65000 0.48750
+ 0x00007F3F, // 114 0.00000 0.50000 0.25000
+ 0x003F7F5F, // 115 0.25000 0.50000 0.37500
+ 0x00004C26, // 116 0.00000 0.30000 0.15000
+ 0x00264C39, // 117 0.15000 0.30000 0.22500
+ 0x00002613, // 118 0.00000 0.15000 0.07500
+ 0x0013261C, // 119 0.07500 0.15000 0.11250
+ 0x0000FFBF, // 120 0.00000 1.00000 0.75000
+ 0x007FFFDF, // 121 0.50000 1.00000 0.87500
+ 0x0000A57C, // 122 0.00000 0.65000 0.48750
+ 0x0052A591, // 123 0.32500 0.65000 0.56875
+ 0x00007F5F, // 124 0.00000 0.50000 0.37500
+ 0x003F7F6F, // 125 0.25000 0.50000 0.43750
+ 0x00004C39, // 126 0.00000 0.30000 0.22500
+ 0x00264C42, // 127 0.15000 0.30000 0.26250
+ 0x0000261C, // 128 0.00000 0.15000 0.11250
+ 0x00132621, // 129 0.07500 0.15000 0.13125
+ 0x0000FFFF, // 130 0.00000 1.00000 1.00000
+ 0x007FFFFF, // 131 0.50000 1.00000 1.00000
+ 0x0000A5A5, // 132 0.00000 0.65000 0.65000
+ 0x0052A5A5, // 133 0.32500 0.65000 0.65000
+ 0x00007F7F, // 134 0.00000 0.50000 0.50000
+ 0x003F7F7F, // 135 0.25000 0.50000 0.50000
+ 0x00004C4C, // 136 0.00000 0.30000 0.30000
+ 0x00264C4C, // 137 0.15000 0.30000 0.30000
+ 0x00002626, // 138 0.00000 0.15000 0.15000
+ 0x00132626, // 139 0.07500 0.15000 0.15000
+ 0x0000BFFF, // 140 0.00000 0.75000 1.00000
+ 0x007FDFFF, // 141 0.50000 0.87500 1.00000
+ 0x00007CA5, // 142 0.00000 0.48750 0.65000
+ 0x005291A5, // 143 0.32500 0.56875 0.65000
+ 0x00005F7F, // 144 0.00000 0.37500 0.50000
+ 0x003F6F7F, // 145 0.25000 0.43750 0.50000
+ 0x0000394C, // 146 0.00000 0.22500 0.30000
+ 0x0026424C, // 147 0.15000 0.26250 0.30000
+ 0x00001C26, // 148 0.00000 0.11250 0.15000
+ 0x00132126, // 149 0.07500 0.13125 0.15000
+ 0x00007FFF, // 150 0.00000 0.50000 1.00000
+ 0x007FBFFF, // 151 0.50000 0.75000 1.00000
+ 0x000052A5, // 152 0.00000 0.32500 0.65000
+ 0x00527CA5, // 153 0.32500 0.48750 0.65000
+ 0x00003F7F, // 154 0.00000 0.25000 0.50000
+ 0x003F5F7F, // 155 0.25000 0.37500 0.50000
+ 0x0000264C, // 156 0.00000 0.15000 0.30000
+ 0x0026394C, // 157 0.15000 0.22500 0.30000
+ 0x00001326, // 158 0.00000 0.07500 0.15000
+ 0x00131C26, // 159 0.07500 0.11250 0.15000
+ 0x00003FFF, // 160 0.00000 0.25000 1.00000
+ 0x007F9FFF, // 161 0.50000 0.62500 1.00000
+ 0x000029A5, // 162 0.00000 0.16250 0.65000
+ 0x005267A5, // 163 0.32500 0.40625 0.65000
+ 0x00001F7F, // 164 0.00000 0.12500 0.50000
+ 0x003F4F7F, // 165 0.25000 0.31250 0.50000
+ 0x0000134C, // 166 0.00000 0.07500 0.30000
+ 0x00262F4C, // 167 0.15000 0.18750 0.30000
+ 0x00000926, // 168 0.00000 0.03750 0.15000
+ 0x00131726, // 169 0.07500 0.09375 0.15000
+ 0x000000FF, // 170 0.00000 0.00000 1.00000
+ 0x007F7FFF, // 171 0.50000 0.50000 1.00000
+ 0x000000A5, // 172 0.00000 0.00000 0.65000
+ 0x005252A5, // 173 0.32500 0.32500 0.65000
+ 0x0000007F, // 174 0.00000 0.00000 0.50000
+ 0x003F3F7F, // 175 0.25000 0.25000 0.50000
+ 0x0000004C, // 176 0.00000 0.00000 0.30000
+ 0x0026264C, // 177 0.15000 0.15000 0.30000
+ 0x00000026, // 178 0.00000 0.00000 0.15000
+ 0x00131326, // 179 0.07500 0.07500 0.15000
+ 0x003F00FF, // 180 0.25000 0.00000 1.00000
+ 0x009F7FFF, // 181 0.62500 0.50000 1.00000
+ 0x002900A5, // 182 0.16250 0.00000 0.65000
+ 0x006752A5, // 183 0.40625 0.32500 0.65000
+ 0x001F007F, // 184 0.12500 0.00000 0.50000
+ 0x004F3F7F, // 185 0.31250 0.25000 0.50000
+ 0x0013004C, // 186 0.07500 0.00000 0.30000
+ 0x002F264C, // 187 0.18750 0.15000 0.30000
+ 0x00090026, // 188 0.03750 0.00000 0.15000
+ 0x00171326, // 189 0.09375 0.07500 0.15000
+ 0x007F00FF, // 190 0.50000 0.00000 1.00000
+ 0x00BF7FFF, // 191 0.75000 0.50000 1.00000
+ 0x005200A5, // 192 0.32500 0.00000 0.65000
+ 0x007C52A5, // 193 0.48750 0.32500 0.65000
+ 0x003F007F, // 194 0.25000 0.00000 0.50000
+ 0x005F3F7F, // 195 0.37500 0.25000 0.50000
+ 0x0026004C, // 196 0.15000 0.00000 0.30000
+ 0x0039264C, // 197 0.22500 0.15000 0.30000
+ 0x00130026, // 198 0.07500 0.00000 0.15000
+ 0x001C1326, // 199 0.11250 0.07500 0.15000
+ 0x00BF00FF, // 200 0.75000 0.00000 1.00000
+ 0x00DF7FFF, // 201 0.87500 0.50000 1.00000
+ 0x007C00A5, // 202 0.48750 0.00000 0.65000
+ 0x009152A5, // 203 0.56875 0.32500 0.65000
+ 0x005F007F, // 204 0.37500 0.00000 0.50000
+ 0x006F3F7F, // 205 0.43750 0.25000 0.50000
+ 0x0039004C, // 206 0.22500 0.00000 0.30000
+ 0x0042264C, // 207 0.26250 0.15000 0.30000
+ 0x001C0026, // 208 0.11250 0.00000 0.15000
+ 0x00211326, // 209 0.13125 0.07500 0.15000
+ 0x00FF00FF, // 210 1.00000 0.00000 1.00000
+ 0x00FF7FFF, // 211 1.00000 0.50000 1.00000
+ 0x00A500A5, // 212 0.65000 0.00000 0.65000
+ 0x00A552A5, // 213 0.65000 0.32500 0.65000
+ 0x007F007F, // 214 0.50000 0.00000 0.50000
+ 0x007F3F7F, // 215 0.50000 0.25000 0.50000
+ 0x004C004C, // 216 0.30000 0.00000 0.30000
+ 0x004C264C, // 217 0.30000 0.15000 0.30000
+ 0x00260026, // 218 0.15000 0.00000 0.15000
+ 0x00261326, // 219 0.15000 0.07500 0.15000
+ 0x00FF00BF, // 220 1.00000 0.00000 0.75000
+ 0x00FF7FDF, // 221 1.00000 0.50000 0.87500
+ 0x00A5007C, // 222 0.65000 0.00000 0.48750
+ 0x00A55291, // 223 0.65000 0.32500 0.56875
+ 0x007F005F, // 224 0.50000 0.00000 0.37500
+ 0x007F3F6F, // 225 0.50000 0.25000 0.43750
+ 0x004C0039, // 226 0.30000 0.00000 0.22500
+ 0x004C2642, // 227 0.30000 0.15000 0.26250
+ 0x0026001C, // 228 0.15000 0.00000 0.11250
+ 0x00261321, // 229 0.15000 0.07500 0.13125
+ 0x00FF007F, // 230 1.00000 0.00000 0.50000
+ 0x00FF7FBF, // 231 1.00000 0.50000 0.75000
+ 0x00A50052, // 232 0.65000 0.00000 0.32500
+ 0x00A5527C, // 233 0.65000 0.32500 0.48750
+ 0x007F003F, // 234 0.50000 0.00000 0.25000
+ 0x007F3F5F, // 235 0.50000 0.25000 0.37500
+ 0x004C0026, // 236 0.30000 0.00000 0.15000
+ 0x004C2639, // 237 0.30000 0.15000 0.22500
+ 0x00260013, // 238 0.15000 0.00000 0.07500
+ 0x0026131C, // 239 0.15000 0.07500 0.11250
+ 0x00FF003F, // 240 1.00000 0.00000 0.25000
+ 0x00FF7F9F, // 241 1.00000 0.50000 0.62500
+ 0x00A50029, // 242 0.65000 0.00000 0.16250
+ 0x00A55267, // 243 0.65000 0.32500 0.40625
+ 0x007F001F, // 244 0.50000 0.00000 0.12500
+ 0x007F3F4F, // 245 0.50000 0.25000 0.31250
+ 0x004C0013, // 246 0.30000 0.00000 0.07500
+ 0x004C262F, // 247 0.30000 0.15000 0.18750
+ 0x00260009, // 248 0.15000 0.00000 0.03750
+ 0x00261317, // 249 0.15000 0.07500 0.09375
+ 0x00545454, // 250 0.33000 0.33000 0.33000
+ 0x00767676, // 251 0.46400 0.46400 0.46400
+ 0x00989898, // 252 0.59800 0.59800 0.59800
+ 0x00BABABA, // 253 0.73200 0.73200 0.73200
+ 0x00DCDCDC, // 254 0.86600 0.86600 0.86600
+ 0x00FFFFFF // 255 1.00000 1.00000 1.00000
+ };
+
+int DxfColor(int Rgb)
+{
+ int r = (Rgb & 0x00FF0000) >> 16;
+ int g = (Rgb & 0x0000FF00) >> 8;
+ int b = (Rgb & 0x000000FF);
+ int n = 1; // = 0; if the DXF tool is able to handle color 0
+ int Min = INT_MAX;
+ for (int i = n; i < 256; i++) {
+ int c = DxfColors[i];
+ int dr = r - ((c & 0x00FF0000) >> 16);
+ int dg = g - ((c & 0x0000FF00) >> 8);
+ int db = b - (c & 0x000000FF);
+ int d = dr * dr * 77 + dg * dg * 150 + db * db * 29;
+ if (d < Min) {
+ n = i;
+ Min = d;
+ }
+ }
+ return n;
+}
+
+//
+// Level 0: DXF code generating functions:
+//
+
+void DxfString(int code, string value)
+{
+ printf("%3d\n%s\n", code, value);
+}
+
+void DxfInt(int code, int value)
+{
+ printf("%3d\n%d\n", code, value);
+}
+
+void DxfReal(int code, real value)
+{
+ printf("%3d\n%1.*f\n", code, (Unit == MM) ? 4 : 6, value);
+}
+
+//
+// Level 1: DXF group functions:
+//
+
+void DxfCoordinate(int n, real x, real y)
+{
+ DxfReal(10 + n, x);
+ DxfReal(20 + n, y);
+ DxfReal(30 + n, 0.0);
+}
+
+void DxfSection(string name)
+{
+ DxfString(0, "SECTION");
+ DxfString(2, name);
+}
+
+void DxfEndSection(void)
+{
+ DxfString(0, "ENDSEC");
+}
+
+void DxfTable(string name, int number)
+{
+ DxfString(0, "TABLE");
+ DxfString(2, name);
+ DxfInt(70, number);
+}
+
+void DxfEndTable(void)
+{
+ DxfString(0, "ENDTAB");
+}
+
+void DxfBlock(string name)
+{
+ DxfString(0, "BLOCK");
+ DxfInt(8, 0);
+ DxfString(2, name);
+ DxfInt(70, 64);
+ DxfCoordinate(0, 0.0, 0.0);
+ DxfString(3, name);
+}
+
+void DxfEndBlock(void)
+{
+ DxfString(0, "ENDBLK");
+ DxfInt(8, 0);
+}
+
+void DxfVariable(string name)
+{
+ DxfString(9, "$" + name);
+}
+
+void DxfTrailer(void)
+{
+ DxfString(0, "EOF");
+}
+
+void DxfPolyline(int layer, real width)
+{
+ int Mode = width > 0 ? 0 // polyline is NOT closed
+ : 1; // polyline is closed
+ if (width < 0)
+ width = -width;
+ DxfString(0, "POLYLINE");
+ DxfInt(8, layer);
+ DxfInt(66, 1);
+ DxfCoordinate(0, 0.0, 0.0);
+ DxfReal(40, width);
+ DxfReal(41, width);
+ DxfInt(70, Mode);
+}
+
+void DxfVertex(int layer, real x, real y)
+{
+ DxfString(0, "VERTEX");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+}
+
+void DxfVertexRound(int layer, real x, real y, real r)
+{
+ DxfString(0, "VERTEX");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+ DxfReal(42, r);
+}
+
+void DxfSeqEnd(void)
+{
+ DxfString(0, "SEQEND");
+ DxfInt(8, 0);
+}
+
+void DxfInsert(int layer, string name, real x, real y, real dx, real dy, real a)
+{
+ if (LayerActive[layer]) {
+ DxfString(0, "INSERT");
+ DxfInt(8, layer);
+ DxfString(2, name);
+ DxfCoordinate(0, x, y);
+ DxfReal(41, dx);
+ DxfReal(42, dy);
+ DxfReal(43, 1.0);
+ DxfReal(50, a);
+ }
+}
+
+void DxfPoint(int layer, real x, real y)
+{
+ if (LayerActive[layer]) {
+ DxfString(0, "POINT");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+ }
+}
+
+void DxfLine(int layer, real x1, real y1, real x2, real y2)
+{
+ if (LayerActive[layer]) {
+ DxfString(0, "LINE");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x1, y1);
+ DxfCoordinate(1, x2, y2);
+ }
+}
+
+void DxfCircle(int layer, real x, real y, real r)
+{
+ if (layer == 0 || LayerActive[layer]) {
+ DxfString(0, "CIRCLE");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+ DxfReal(40, r);
+ }
+}
+
+void DxfArc(int layer, real x, real y, real r, real a1, real a2)
+{
+ if (LayerActive[layer]) {
+ DxfString(0, "ARC");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+ DxfReal(40, r);
+ DxfReal(50, a1);
+ DxfReal(51, a2);
+ }
+}
+
+void DxfSolid(int layer, real x1, real y1, real x2, real y2, real x3, real y3, real x4, real y4)
+{
+ if (layer == 0 || LayerActive[layer]) {
+ DxfString(0, "SOLID");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x1, y1);
+ DxfCoordinate(1, x2, y2);
+ DxfCoordinate(2, x3, y3);
+ DxfCoordinate(3, x4, y4);
+ }
+}
+
+void DxfText(int layer, int font, real x, real y, real size, string value, real angle, int mirror, int spin)
+{
+ if (LayerActive[layer]) {
+ int Adjust = !spin;
+ int Reference = 0; // 3 2
+ // Text
+ // 0 1
+ if (!board)
+ Adjust = 1;
+ if (!board && mirror) {
+ mirror = 0;
+ Adjust = 0;
+ if (angle == 0) { Reference = 1; }
+ else if (angle == 90) { Reference = 3; }
+ else if (angle == 180) { Reference = 3; angle = 0; }
+ else if (angle == 270) { Reference = 1; angle = 90; }
+ }
+ DxfString(0, "TEXT");
+ DxfString(7, font == FONT_PROPORTIONAL ? "ISOCP" : "ISOCT");
+ DxfInt(8, layer);
+ DxfCoordinate(0, x, y);
+ Adjust = Adjust && 90 < angle && angle <= 270;
+ if (mirror) {
+ angle = -angle;
+ if (angle < 0)
+ angle += 360;
+ }
+ if (Adjust) {
+ angle -= 180;
+ if (angle < 0)
+ angle += 360;
+ Reference = 2;
+ }
+ DxfReal(40, size);
+ DxfString(1, value);
+ if (angle)
+ DxfReal(50, angle);
+ if (mirror)
+ DxfInt(71, 2);
+ if (Reference) {
+ DxfInt(72, Reference == 1 || Reference == 2 ? 2 : 0);
+ DxfInt(73, Reference >= 2 ? 3 : 0);
+ DxfCoordinate(1, x, y);
+ }
+ }
+}
+
+void DxfLayer(int number, int color)
+{
+ DxfString(0, "LAYER");
+ DxfInt(2, number);
+ DxfInt(70, 64);
+ DxfInt(62, DxfColor(palette(color)));
+ DxfString(6, "CONTINUOUS");
+}
+
+void DxfLineTypes(void)
+{
+ DxfString(0, "LTYPE");
+ DxfString(2, "CONTINUOUS");
+ DxfInt(70, 64);
+ DxfString(3, "Solid line");
+ DxfInt(72, 65);
+ DxfInt(73, 0);
+ DxfInt(40, 0);
+}
+
+void DxfVersion(void)
+{
+ DxfVariable("ACADVER");
+ DxfString(1, "AC1009");
+ DxfVariable("FILLMODE");
+ DxfInt(70, FillAreas ? 1 : 0);
+}
+
+void DxfWireRaw(int layer, real x1, real y1, real x2, real y2, real width)
+{
+ real dx = x2 - x1;
+ real dy = y2 - y1;
+ real l = sqrt(dx * dx + dy * dy);
+
+ if (l > 0) {
+ if (FillAreas)
+ l *= 2;
+
+ real w2 = width / 2;
+ real dxl = dx / l * w2;
+ real dyl = dy / l * w2;
+
+ if (FillAreas) {
+ DxfPolyline(layer, width);
+ DxfVertex(layer, x1, y1);
+ DxfVertex(layer, x2, y2);
+ DxfSeqEnd();
+ DxfPolyline(layer, w2);
+ DxfVertexRound(layer, x2 + dyl, y2 - dxl, 1);
+ DxfVertex (layer, x2 - dyl, y2 + dxl);
+ DxfSeqEnd();
+ DxfPolyline(layer, w2);
+ DxfVertexRound(layer, x1 - dyl, y1 + dxl, 1);
+ DxfVertex (layer, x1 + dyl, y1 - dxl);
+ DxfSeqEnd();
+ }
+ else {
+ DxfPolyline(layer, 0);
+ DxfVertex(layer, x1 + dyl, y1 - dxl);
+ DxfVertexRound(layer, x2 + dyl, y2 - dxl, 1);
+ DxfVertex (layer, x2 - dyl, y2 + dxl);
+ DxfVertexRound(layer, x1 - dyl, y1 + dxl, 1);
+ DxfSeqEnd();
+ }
+ }
+}
+
+void DxfWire(int layer, real x1, real y1, real x2, real y2, real width)
+{
+ if (UseWireWidths && width > 0)
+ DxfWireRaw(layer, x1, y1, x2, y2, width);
+ else
+ DxfLine(layer, x1, y1, x2, y2);
+}
+
+void DxfPie(int layer, real x, real y, real radius)
+{
+ if (FillAreas) {
+ DxfPolyline(layer, radius);
+ DxfVertexRound(layer, x, y - 0.5 * radius, 1);
+ DxfVertexRound(layer, x, y + 0.5 * radius, 1);
+ DxfVertex (layer, x, y - 0.5 * radius);
+ DxfSeqEnd();
+ }
+ else
+ DxfCircle(layer, x, y, radius);
+}
+
+//
+// Level 1: Block definitions for EAGLE primitives:
+//
+
+void DxfOctagonBlock(string name, real e1, real e2)
+{
+ int layer = 0;
+ real r = 0.5;
+ real w = 0;
+
+ if (e1 || e2) {
+ e1 *= r;
+ e2 *= r;
+ DxfBlock(name);
+ DxfWireRaw(layer, -e1, 0, e2, 0, 1);
+ DxfEndBlock();
+ }
+ else {
+ real a_2 = r * (sqrt(2) - 1); // a = 2 * r * tan(22.5)
+
+ if (FillAreas) {
+ w = 0.5;
+ r *= 0.5;
+ a_2 *= 0.5;
+ }
+ DxfBlock(name);
+ DxfPolyline(layer, w);
+ DxfVertex(layer, -r , -a_2);
+ DxfVertex(layer, -r , a_2);
+ DxfVertex(layer, -a_2, r);
+ DxfVertex(layer, a_2, r);
+ DxfVertex(layer, r , a_2);
+ DxfVertex(layer, r , -a_2);
+ DxfVertex(layer, a_2, -r);
+ DxfVertex(layer, -a_2, -r);
+ if (FillAreas) {
+ DxfVertex(layer, -r, -a_2);
+ DxfVertex(layer, -r, a_2);
+ }
+ DxfSeqEnd();
+ DxfEndBlock();
+ }
+}
+
+void DxfPadAndSmdBlocks(void) // LONG/OFFSET pad and any smd shapes
+{
+ string CollectedPads,
+ CollectedSmds;
+ string s;
+
+ if (board) board(B) {
+ B.elements(E)
+ E.package.contacts(C) {
+ if (C.pad) {
+ int Elongation = C.pad.elongation;
+
+ if (Elongation) {
+ int sc = C.pad.shape[LAYER_PADS];
+
+ sprintf(s, "%sP%d", sc == PAD_SHAPE_OFFSET ? "OFFSET" : "LONG", Elongation);
+ if (strstr(CollectedPads, s + '#') < 0) {
+ CollectedPads += s + '#';
+
+ real e = Elongation / 100.0;
+
+ if (sc == PAD_SHAPE_OFFSET)
+ DxfOctagonBlock(s, 0, 2 * e);
+ else
+ DxfOctagonBlock(s, e, e);
+ }
+ }
+ }
+ else if (C.smd) {
+ int Roundness = C.smd.roundness;
+ if (Roundness) {
+ for (int l = C.smd.layer; l; ) {
+ if (LayerActive[l]) {
+ int dx2 = C.smd.dx[l] / 2,
+ dy2 = C.smd.dy[l] / 2;
+
+ sprintf(s, "RECT%dX%dR%d", dx2, dy2, Roundness);
+ if (strstr(CollectedSmds, s + '#') < 0) {
+ CollectedSmds += s + '#';
+
+ real rr = sqrt(2) - 1;
+ int rf = min(dx2, dy2) * Roundness / 100;
+
+ if (FillAreas) {
+ rf /= 2;
+ dx2 -= rf;
+ dy2 -= rf;
+ }
+
+ real r = DxfUnit(rf);
+ real x1 = DxfUnit(-dx2),
+ y1 = DxfUnit(-dy2),
+ x2 = DxfUnit(dx2),
+ y2 = DxfUnit(dy2);
+
+ DxfBlock(s);
+ DxfPolyline(0, FillAreas ? -2 * r : 0);
+ DxfVertex (0, x2 , y1 + r);
+ DxfVertexRound(0, x2 , y2 - r, rr);
+ DxfVertex (0, x2 - r, y2 );
+ DxfVertexRound(0, x1 + r, y2 , rr);
+ DxfVertex (0, x1 , y2 - r);
+ DxfVertexRound(0, x1 , y1 + r, rr);
+ DxfVertex (0, x1 + r, y1 );
+ DxfVertexRound(0, x2 - r, y1 , rr);
+ DxfSeqEnd();
+
+ if (FillAreas) {
+ int o = min(SafetyOverlap, rf / 2);
+ dx2 -= rf - o;
+ dy2 -= rf - o;
+ x2 = DxfUnit(dx2);
+ y2 = DxfUnit(dy2);
+ DxfSolid(0, -x2, -y2, x2, -y2, -x2, y2, x2, y2);
+ }
+ DxfEndBlock();
+ }
+ }
+ switch (l) {
+ case LAYER_TOP: l = LAYER_TSTOP; break;
+ case LAYER_TSTOP: l = LAYER_TCREAM; break;
+ case LAYER_BOTTOM: l = LAYER_BSTOP; break;
+ case LAYER_BSTOP: l = LAYER_BCREAM; break;
+ default: l = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void DxfBlocks(void)
+{
+ DxfBlock("RECT");
+ DxfSolid(0, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5);
+ DxfEndBlock();
+
+ DxfBlock("PIE");
+ DxfPie(0, 0, 0, 0.5);
+ DxfEndBlock();
+
+ if (board) {
+ string pv[] = { "P", "V" };
+
+ for (int i = 0; i < 2; ++i) {
+ DxfOctagonBlock("OCTAGON" + pv[i], 0, 0);
+
+ DxfBlock("SQUARE" + pv[i]);
+ DxfSolid(0, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5);
+ DxfEndBlock();
+
+ DxfBlock("ROUND" + pv[i]);
+ DxfPie(0, 0, 0, 0.5);
+ DxfEndBlock();
+
+ DxfBlock("ANNULUS" + pv[i]);
+ DxfPie(0, 0, 0, 0.5);
+ DxfEndBlock();
+
+ DxfBlock("THERMAL" + pv[i]);
+ real dr = (1.0 + AnnulusRelInnerDiameter) / 4,
+ dw = (1.0 - AnnulusRelInnerDiameter) / 2,
+ ds = dr - (AnnulusRelGap + dw) / sqrt(2.0);
+
+ if (ds < 0.01)
+ ds = 0.01;
+ DxfWire(0, -ds, +dr, +ds, +dr, dw);
+ DxfWire(0, +dr, +ds, +dr, -ds, dw);
+ DxfWire(0, +ds, -dr, -ds, -dr, dw);
+ DxfWire(0, -dr, -ds, -dr, +ds, dw);
+ DxfEndBlock();
+ }
+ DxfPadAndSmdBlocks();
+ }
+}
+
+//
+// Level 2: Low level EAGLE to DXF conversion functions:
+//
+
+void Layer(UL_LAYER L)
+{
+ if (L.visible)
+ DxfLayer(L.number, L.color);
+ LayerActive[L.number] = L.visible;
+ switch (L.number) {
+ case LAYER_PADS: PadColor = L.color; break;
+ case LAYER_VIAS: ViaColor = L.color; break;
+ }
+}
+
+void Area(UL_AREA A)
+{
+ DxfVariable("EXTMIN");
+ DxfCoordinate(0, DxfUnit(A.x1), DxfUnit(A.y1));
+ DxfVariable("EXTMAX");
+ DxfCoordinate(0, DxfUnit(A.x2), DxfUnit(A.y2));
+}
+
+void Arc(UL_ARC A)
+{
+ if (LayerActive[A.layer]) {
+ if (UseWireWidths && A.width > 0) {
+
+ real a1 = A.angle1 / 180 * PI;
+ real a2 = A.angle2 / 180 * PI;
+ real vr = tan((a2 - a1) / 4); // vertex roundness: vr = tan(delta_phi/4) = 2*H/R (H: segment height, R: segment radius)
+
+ real x1 = DxfUnit(A.x1), y1 = DxfUnit(A.y1),
+ x2 = DxfUnit(A.x2), y2 = DxfUnit(A.y2);
+ real w2 = DxfUnit(A.width / 2);
+ real x1r = w2 * cos(a1), y1r = w2 * sin(a1), // a vector with angle1 and a length of width/2
+ x2r = w2 * cos(a2), y2r = w2 * sin(a2);
+
+ if (FillAreas) {
+ DxfPolyline(A.layer, DxfUnit(A.width));
+ DxfVertexRound(A.layer, x1, y1, vr);
+ DxfVertex(A.layer, x2, y2);
+ DxfSeqEnd();
+ if (A.cap == CAP_ROUND) {
+ DxfPolyline(A.layer, w2);
+ DxfVertexRound(A.layer, x1 - x1r/2, y1 - y1r/2, 1);
+ DxfVertex (A.layer, x1 + x1r/2, y1 + y1r/2);
+ DxfSeqEnd();
+ DxfPolyline(A.layer, w2);
+ DxfVertexRound(A.layer, x2 + x2r/2, y2 + y2r/2, 1);
+ DxfVertex (A.layer, x2 - x2r/2, y2 - y2r/2);
+ DxfSeqEnd();
+ }
+ }
+ else {
+ DxfPolyline(A.layer, 0);
+ if (A.cap == CAP_ROUND)
+ DxfVertexRound(A.layer, x1 - x1r, y1 - y1r, 1);
+ else
+ DxfVertex (A.layer, x1 - x1r, y1 - y1r);
+ DxfVertexRound (A.layer, x1 + x1r, y1 + y1r, vr);
+ if (A.cap == CAP_ROUND)
+ DxfVertexRound(A.layer, x2 + x2r, y2 + y2r, 1);
+ else
+ DxfVertex (A.layer, x2 + x2r, y2 + y2r);
+ DxfVertexRound (A.layer, x2 - x2r, y2 - y2r, -vr);
+ DxfSeqEnd();
+ }
+ }
+ else
+ DxfArc(A.layer,
+ DxfUnit(A.xc), DxfUnit(A.yc),
+ DxfUnit(A.radius),
+ DxfAngle(A.angle1), DxfAngle(A.angle2));
+ }
+}
+
+void WireSegment(UL_WIRE W)
+{
+ if (W.arc)
+ Arc(W.arc);
+ else
+ DxfWire(W.layer, DxfUnit(W.x1), DxfUnit(W.y1), DxfUnit(W.x2), DxfUnit(W.y2), DxfUnit(W.width));
+}
+
+void Wire(UL_WIRE W)
+{
+ if (LayerActive[W.layer]) {
+ if (W.style != WIRE_STYLE_CONTINUOUS)
+ W.pieces(P) WireSegment(P);
+ else
+ WireSegment(W);
+ }
+}
+
+void Circle(UL_CIRCLE C)
+{
+ if (LayerActive[C.layer]) {
+ if (UseWireWidths) {
+ if (C.width > 0) {
+ if (FillAreas) {
+ DxfPolyline(C.layer, DxfUnit(C.width));
+ DxfVertexRound(C.layer, DxfUnit(C.x), DxfUnit(C.y - C.radius), 1);
+ DxfVertexRound(C.layer, DxfUnit(C.x), DxfUnit(C.y + C.radius), 1);
+ DxfVertex(C.layer, DxfUnit(C.x), DxfUnit(C.y - C.radius));
+ DxfSeqEnd();
+ }
+ else {
+ int r1 = C.radius - C.width / 2,
+ r2 = C.radius + C.width / 2;
+
+ if (r1 > 0)
+ DxfCircle(C.layer, DxfUnit(C.x), DxfUnit(C.y), DxfUnit(r1));
+ DxfCircle(C.layer, DxfUnit(C.x), DxfUnit(C.y), DxfUnit(r2));
+ }
+ return;
+ }
+ else if (FillAreas) {
+ DxfPolyline(C.layer, DxfUnit(C.radius));
+ DxfVertexRound(C.layer, DxfUnit(C.x), DxfUnit(C.y - C.radius / 2), 1);
+ DxfVertexRound(C.layer, DxfUnit(C.x), DxfUnit(C.y + C.radius / 2), 1);
+ DxfVertex(C.layer, DxfUnit(C.x), DxfUnit(C.y - C.radius / 2));
+ DxfSeqEnd();
+ return;
+ }
+ }
+ DxfCircle(C.layer, DxfUnit(C.x), DxfUnit(C.y), DxfUnit(C.radius));
+ }
+}
+
+void Rectangle(UL_RECTANGLE R)
+{
+ DxfInsert(R.layer, "RECT", DxfUnit((R.x1 + R.x2) / 2), DxfUnit((R.y1 + R.y2) / 2), DxfUnit(R.x2 - R.x1), DxfUnit(R.y2 - R.y1), R.angle);
+}
+
+void Hole(UL_HOLE H)
+{
+ DxfCircle(LAYER_DIMENSION, DxfUnit(H.x), DxfUnit(H.y), DxfUnit(H.drill / 2));
+ if (LayerActive[LAYER_TSTOP]) DxfPie(LAYER_TSTOP, DxfUnit(H.x), DxfUnit(H.y), DxfUnit(H.diameter[LAYER_TSTOP] / 2));
+ if (LayerActive[LAYER_BSTOP]) DxfPie(LAYER_BSTOP, DxfUnit(H.x), DxfUnit(H.y), DxfUnit(H.diameter[LAYER_BSTOP] / 2));
+}
+
+void Via(UL_VIA V)
+{
+ string Shape[] = { "SQUAREV", "ROUNDV", "OCTAGONV", "XLONGOCT", "YLONGOCT", "ANNULUSV", "THERMALV" };
+ int Count = 0;
+ int Extended = 0;
+
+ for (int l = LAYER_TOP; l; ) {
+ real d = DxfUnit(V.diameter[l]);
+ if (d && (LayerActive[l] || l == Extended)) {
+ Count++;
+ DxfInsert(ViaColor && !IsSupplyLayer[l] && l <= LAYER_BOTTOM ? LAYER_VIAS : l, Shape[V.shape[l]], DxfUnit(V.x), DxfUnit(V.y), d, d, 0);
+ }
+ if (l < LAYER_BOTTOM) {
+ if (Extended)
+ l = Extended = LAYER_BOTTOM;
+ else
+ ++l;
+ }
+ else
+ switch (l) {
+ case LAYER_BOTTOM: if (!Extended && !Count && ViaColor && LayerActive[LAYER_VIAS])
+ l = Extended = LAYER_BOTTOM;
+ else
+ l = LAYER_TSTOP;
+ break;
+ case LAYER_TSTOP: l = LAYER_BSTOP; break;
+ default: l = 0;
+ }
+ }
+ if (Count)
+ DxfCircle(LAYER_DRILLS, DxfUnit(V.x), DxfUnit(V.y), DxfUnit(V.drill / 2));
+}
+
+void Pad(UL_PAD P)
+{
+ string Shape[] = { "SQUAREP", "ROUNDP", "OCTAGONP", "LONGP", "OFFSETP", "ANNULUSP", "THERMALP" };
+ int Count = 0;
+ int Extended = 0;
+
+ for (int l = LAYER_TOP; l; ) {
+ real d = DxfUnit(P.diameter[l]);
+ if (d && (LayerActive[l] || l == Extended)) {
+ int sc = P.shape[l];
+ string s;
+
+ switch (sc) {
+ case PAD_SHAPE_LONG:
+ case PAD_SHAPE_OFFSET: {
+ int e = P.elongation;
+ if (e)
+ sprintf(s, "%d", e);
+ else
+ sc = PAD_SHAPE_OCTAGON;
+ }
+ }
+ Count++;
+ DxfInsert(PadColor && !IsSupplyLayer[l] && l <= LAYER_BOTTOM ? LAYER_PADS : l, Shape[sc] + s, DxfUnit(P.x), DxfUnit(P.y), d, d, P.angle);
+ }
+ if (l < LAYER_BOTTOM) {
+ if (Extended)
+ l = Extended = LAYER_BOTTOM;
+ else
+ ++l;
+ }
+ else
+ switch (l) {
+ case LAYER_BOTTOM: if (!Extended && !Count && PadColor && LayerActive[LAYER_PADS])
+ l = Extended = LAYER_TOP;
+ else
+ l = LAYER_TSTOP;
+ break;
+ case LAYER_TSTOP: l = LAYER_BSTOP; break;
+ default: l = 0;
+ }
+ }
+ if (Count)
+ DxfCircle(LAYER_DRILLS, DxfUnit(P.x), DxfUnit(P.y), DxfUnit(P.drill / 2));
+}
+
+void Smd(UL_SMD S)
+{
+ for (int l = S.layer; ; ) {
+ if (LayerActive[l]) {
+ int dx2 = S.dx[l] / 2, dy2 = S.dy[l] / 2;
+
+ if (dx2 == 0 || dy2 == 0)
+ ; // nothing to do
+ else if (S.roundness == 100 && dx2 == dy2)
+ DxfInsert(l, "PIE", DxfUnit(S.x), DxfUnit(S.y), DxfUnit(2 * dx2), DxfUnit(2 * dy2), 0);
+ else if (S.roundness) {
+ string Name;
+
+ sprintf(Name, "RECT%dX%dR%d", dx2, dy2, S.roundness);
+ DxfInsert(l, Name, DxfUnit(S.x), DxfUnit(S.y), 1.0, 1.0, S.angle);
+ }
+ else
+ DxfInsert(l, "RECT", DxfUnit(S.x), DxfUnit(S.y), DxfUnit(2 * dx2), DxfUnit(2 * dy2), S.angle);
+ }
+ switch (l) {
+ case LAYER_TOP: l = LAYER_TSTOP; break;
+ case LAYER_TSTOP: l = LAYER_TCREAM; break;
+ case LAYER_BOTTOM: l = LAYER_BSTOP; break;
+ case LAYER_BSTOP: l = LAYER_BCREAM; break;
+ default: return;
+ }
+ }
+}
+
+void Junction(UL_JUNCTION J)
+{
+ DxfPie(LAYER_NETS, DxfUnit(J.x), DxfUnit(J.y), DxfUnit(J.diameter / 2));
+}
+
+void Polygon(UL_POLYGON P)
+{
+ P.contours(W) Wire(W);
+ if (P.width > 0)
+ P.fillings(W) Wire(W);
+ else if (dlgMessageBox(tr("Can't fill polygon with Width = 0"), tr("+OK"), tr("-Cancel")) != 0)
+ exit(1);
+}
+
+void Text(UL_TEXT T)
+{
+ if (LayerActive[T.layer]) {
+ if (T.font == FONT_VECTOR || AlwaysVectorFont) {
+ T.wires(W) WireSegment(W);
+ }
+ else {
+ DxfText(T.layer, T.font,
+ DxfUnit(T.x), DxfUnit(T.y), DxfUnit(T.size),
+ T.value, T.angle, T.mirror, T.spin);
+ }
+ }
+}
+
+void Label(UL_LABEL L)
+{
+ if (LayerActive[L.layer]) {
+ L.wires(W) Wire(W);
+ Text(L.text);
+ }
+}
+
+void Frame(UL_FRAME F)
+{
+ F.wires(W) Wire(W);
+ F.texts(T) Text(T);
+}
+
+//
+// Level 3: High level EAGLE decomposing functions:
+//
+
+void Package(UL_PACKAGE P)
+{
+ P.polygons(P) Polygon(P);
+ P.wires(W) Wire(W);
+ P.texts(T) Text(T);
+ P.circles(C) Circle(C);
+ P.rectangles(R) Rectangle(R);
+ P.frames(F) Frame(F);
+ P.holes(H) Hole(H);
+ P.contacts(C) {
+ if (C.pad) Pad(C.pad);
+ else Smd(C.smd);
+ }
+}
+
+void Element(UL_ELEMENT E)
+{
+ int layer;
+
+ switch (E.mirror) {
+ case 0: layer = LAYER_TORIGINS; break; // not mirrored
+ case 1: layer = LAYER_BORIGINS; break; // mirrored
+ }
+ DxfPoint(layer, DxfUnit(E.x), DxfUnit(E.y));
+ Package(E.package);
+ E.texts(T) Text(T);
+}
+
+void Signal(UL_SIGNAL S)
+{
+ S.polygons(P) Polygon(P);
+ S.wires(W) Wire(W);
+ S.vias(V) Via(V);
+}
+
+void Board(UL_BOARD B)
+{
+ B.polygons(P) Polygon(P);
+ B.wires(W) Wire(W);
+ B.texts(T) Text(T);
+ B.circles(C) Circle(C);
+ B.rectangles(R) Rectangle(R);
+ B.frames(F) Frame(F);
+ B.holes(H) Hole(H);
+ B.elements(E) Element(E);
+ B.signals(S) Signal(S);
+}
+
+void Pin(UL_PIN P)
+{
+ P.wires(W) Wire(W);
+ P.circles(C) Circle(C);
+ P.texts(T) Text(T);
+}
+
+void Symbol(UL_SYMBOL S)
+{
+ S.polygons(P) Polygon(P);
+ S.wires(W) Wire(W);
+ S.texts(T) Text(T);
+ S.pins(P) Pin(P);
+ S.circles(C) Circle(C);
+ S.rectangles(R) Rectangle(R);
+ S.frames(F) Frame(F);
+}
+
+void Instance(UL_INSTANCE I)
+{
+ Symbol(I.gate.symbol);
+ I.texts(T) Text(T);
+ I.xrefs(X) Symbol(X.symbol);
+}
+
+void Part(UL_PART P)
+{
+ P.instances(I) Instance(I);
+}
+
+void Segment(UL_SEGMENT S)
+{
+ S.wires(W) Wire(W);
+ S.junctions(J) Junction(J);
+ S.labels(L) Label(L);
+}
+
+void Bus(UL_BUS B)
+{
+ B.segments(S) Segment(S);
+}
+
+void Net(UL_NET N)
+{
+ N.segments(S) Segment(S);
+}
+
+void Sheet(UL_SHEET S)
+{
+ S.polygons(P) Polygon(P);
+ S.wires(W) Wire(W);
+ S.texts(T) Text(T);
+ S.circles(C) Circle(C);
+ S.rectangles(R) Rectangle(R);
+ S.frames(F) Frame(F);
+ S.parts(P) Part(P);
+ S.busses(B) Bus(B);
+ S.nets(N) Net(N);
+}
+
+//
+// Main program:
+//
+
+string OutputFileName;
+int DoDialog = argc == 1;
+string FileNameSuffix;
+
+for (int i = 1; i < argc; i++) {
+ if (argv[i] == "-s") FileNameSuffix = argv[++i];
+ else if (argv[i] == "-u") {
+ string u = strupr(argv[++i]);
+ if (u) {
+ if (u == "MM")
+ Unit = MM;
+ else if (u == "INCH")
+ Unit = INCH;
+ else {
+ dlgMessageBox(usage + tr(" \nThis program can only work in the board or schematic editor."));
+ exit(1);
+ }
+
+OutputFileName = filesetext(OutputFileName, FileNameSuffix + ".dxf");
+
+if (DoDialog) {
+ dlgDialog(tr("DXF Converter")) {
+ dlgHBoxLayout dlgSpacing(400); // let's have some space for the file name
+ dlgHBoxLayout {
+ dlgLabel(tr("&Output file"));
+ dlgStringEdit(OutputFileName);
+ dlgPushButton(tr("&Browse")) {
+ string FileName = dlgFileSave(tr("Save DXF file"), OutputFileName, tr("DXF files (*.dxf)"));
+ if (FileName)
+ OutputFileName = FileName;
+ }
+ }
+ dlgCheckBox(tr("&Always vector font"), AlwaysVectorFont);
+ dlgLabel(tr("If checked, texts will always be drawn with the builtin vector font."));
+ dlgCheckBox(tr("&Use wire widths"), UseWireWidths) { UseWireWidths |= FillAreas; };
+ dlgLabel(tr("If checked, wires, arcs and circles will be generated as polygons showing their real widths. This, however, can cause the DXF file to become very large! Uncheck this if you do not need the real widths."));
+ dlgCheckBox(tr("&Fill areas"), FillAreas) { UseWireWidths |= FillAreas; }
+ dlgLabel(tr("If checked, wires, arcs etc. will be filled (implies 'Use wire widths'!)."));
+ if (VisibleSupplyLayer) {
+ dlgGroup(tr("Thermal Emulation")) {
+ dlgHBoxLayout {
+ dlgLabel(tr("Relative inner diameter"));
+ dlgRealEdit(AnnulusRelInnerDiameter, 0.5, 0.99);
+ }
+ dlgHBoxLayout {
+ dlgLabel(tr("Relative gap size"));
+ dlgRealEdit(AnnulusRelGap, 0.1, 0.5);
+ }
+ dlgLabel(tr("Only the outer diameter of Thermals is available. The inner diameter and gap size are calculated based on the outer diameters according to these factors."));
+ }
+ }
+ dlgGroup(tr("Unit")) {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgRadioButton("&mm", Unit);
+ dlgRadioButton("&inch", Unit);
+ }
+ dlgLabel(tr("Defines the unit used for coordinates and values in the DXF file"));
+ }
+ }
+ dlgStretch(1);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+OK")) {
+ string a[];
+ if (!fileglob(a, OutputFileName) || dlgMessageBox(tr("File exists: ") + OutputFileName + tr("\n\nOverwrite?"), tr("+&Yes"), tr("-&No")) == 0)
+ dlgAccept();
+ }
+ dlgPushButton(tr("-Cancel")) { dlgReject(); exit(1); }
+ dlgPushButton(tr("About")) dlgMessageBox(usage);
+ }
+ };
+ }
+
+output(OutputFileName) {
+ DxfSection("HEADER");
+ DxfVersion();
+ if (board) board(B) Area(B.area);
+ else sheet(S) Area(S.area);
+ DxfEndSection();
+ DxfSection("TABLES");
+ DxfTable("LTYPE", 1);
+ DxfLineTypes();
+ DxfEndTable();
+ DxfTable("LAYER", 255);
+ if (board) board(B) B.layers(L) Layer(L);
+ else schematic(SCH) SCH.layers(L) Layer(L);
+ DxfEndTable();
+ DxfEndSection();
+ DxfSection("BLOCKS");
+ DxfBlocks();
+ DxfEndSection();
+ DxfSection("ENTITIES");
+ if (board) board(B) Board(B);
+ else sheet(S) Sheet(S);
+ DxfEndSection();
+ DxfTrailer();
+ }
diff --git a/eagle-5.7.0/ulp/e-attributverwaltung.ulp b/eagle-5.7.0/ulp/e-attributverwaltung.ulp
new file mode 100644
index 0000000..b21a050
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-attributverwaltung.ulp
@@ -0,0 +1,1250 @@
+#usage "Attributverwaltung "
+ "Mit diesem ULP können Sie Attribute anlegen und verwalten. Für einige "
+ "Bauteile (speziell für Zeichnungsrahmen aus der Bibliothek "
+ "e-elektro-zeichnungsrahmen) sind schon bei der Bibliotheksdefinition "
+ "Attribute und die entsprechenden Textplatzhalter angelegt worden. "
+ "Es wird unterschieden zwischen lokalen und globalen Attributen: "
+ "Ein globales Attribut wird direkt im Schaltplan oder Board angelegt. "
+ "Es ist für alle Bauteile gültig, die bereits einen entsprechenden "
+ "Platzhaltertext haben. Dieser muss bereits bei der Bauteildefinition "
+ "im Symbol angelegt worden sein. Globale Attribute werden üblicherweise "
+ "für Zeichnugsrahmen verwendet. "
+ "Das ULP hilft Ihnen beim Bearbeiten und Erstellen von Attributen. "
+ "Nach dem Start entscheiden Sie zuerst was Sie tun möchten. "
+ "Es gibt die Möglichkeiten LOKALE oder GLOBALE Attribute zu "
+ "bearbeiten oder anlegen. "
+ "Das ULP kann auch in einer Bibliothek im Device-Editor zum einfachen "
+ "erstellen und bearbeiten von lokalen Attributen verwendet werden. "
+ "Benutzung des ULP: "
+ "Starten Sie das Programm vom Bibliothekseditor aus."
+ " "
+ "Sie können damit aus vorhandenen Symbolen ein fertiges Device mit "
+ "Dummy-Package erzeugen. Die Pad-Namen des Package lassen sich editieren. "
+ "Das ist deshalb wichtig, weil in den Devices der Elektro-Bibliotheken nicht die "
+ "Symbol-Pin-Namen, sondern die Package-Pad-Namen angezeigt werden."
+ " "
+ "Das Programm erzeugt eine temporäre Script-Datei im ersten SCR-Pfad, die "
+ "nach Drücken des OK-Buttons sofort ausgeführt wird. Die Datei wird gelöscht, "
+ "sobald EAGLE beendet wird. "
+ " "
+"Wählen Sie im Bereich Symbolauswahl-Filter, welche Symbolart in der oberen Liste dargestellt "
+"werden soll. Ein Doppelklick auf einen Listeneintrag fügt dieses Symbol in die Device-Liste "
+"ein. "
+"Wenn Sie ein Schütz entwerfen, wählen Sie zuerst eine Spule, dann die Kontakte und danach "
+"eventuell Zusatzsymbole ohne Kontakte. Das ganze Bauteil wird in dieser Reihenfolge im Schaltplan "
+"dargestellt. Die Reihenfolge ist wichtig, damit der Kontaktspiegel richtig dargestellt wird. "
+"Die Zusatzsymbole werden nur auf Anforderung (mit INVOKE) in den Schaltplan geholt. "
+"Danach können Sie nach Anklicken des entsprechenden Buttons die Kontaktnamen editieren. "
+"Nach OK entsteht das Bauteil in der geladenen Bibliothek. Vergessen Sie nicht, sie danach abzuspeichern. "
+"Wenn Sie Bauteile ohne Kontaktspiegel entwerfen wollen, selektieren Sie Alle Symbole und "
+"übertragen Sie die Symbole in die Device-Liste, die nicht mit _KS (Kontaktspiegel) enden."
+;
+
+void ShowHelp(void) {
+dlgDialog("Hilfe") {
+ dlgVBoxLayout {
+ dlgLabel("&Hilfe");
+ dlgTextView(HelpAllgemein);
+ }
+ };
+}
+
+string HelpTextKontaktnamen =
+"Tragen Sie die gewünschten Kontaktnamen durch Leerzeichen getrennt ein und kontrollieren Sie \
+die Namen in der Listenansicht.\n\
+Reihenfolge: links oben, links unten (Spule), erster Kontakt oben, erster Kontakt unten etc.";
+
+string ErrorCorrectNames =
+"Kontaktamen nicht korrekt oder kein Device-Listen-Eintrag!\n"
+"Jeder Kontaktname darf nur einmal vorkommen, und die Anzahl \n"
+"der Namen muss der Anzahl der Pins entsprechen.\n"
+;
+
+// Debug-Routinen
+string DebugString = "";
+
+void DebugInt(string name, int n) {
+ string s;
+ sprintf(s, name + " %d\n", n);
+ DebugString += s;
+ }
+
+void DebugStr(string name, string v) {
+ DebugString += name + " " + v +"\n";
+ }
+
+void ShowInteger (string v, int n) {
+ string s;
+ sprintf(s, "%d", n);
+ dlgMessageBox(v + ": " + s);
+ }
+
+void ShowString (string label, string v) {
+ dlgMessageBox(label + ": " + v);
+ }
+
+// -----------------------------------------------------------------------------
+string StripWhiteSpace(string s) { // mit Zusatz: Doppel-Blanks im Inneren werden 1 Blank
+ int i, n;
+ string t;
+
+ while (s && isspace(s[0]))
+ s = strsub(s, 1);
+ while (s && isspace(s[strlen(s) - 1]))
+ s = strsub(s, 0, strlen(s) - 1);
+// Doppel-Blanks
+
+ for (i = 0; i < strlen(s); i++) {
+ if (!isspace(s[i])) t[n++] = s[i];
+ else {
+ if ((strlen(s) > i+1) && isspace(s[i+1]));
+ else t[n++] = s[i];
+ };
+ }
+ s = t;
+
+ return s;
+}
+
+// Erzeuge Symbolauswahlliste
+void MakeSymSelectList(void) {
+ int NumLines = 0;
+ int NrOfPins = 0;
+ int Xref = 0;
+ string PNam;
+ NrOfPins = 0;
+
+ library(L) {
+ f = filename(L.name);
+ f = filesetext(f, "$$$.scr");
+ f = path_scr[0] + '/' + f; // verwende Script-Pfad
+ L.symbols(S) {
+ NrOfPins = 0;
+ Xref = 0;
+ PinCount[NumLines] = "";
+ PinNames[NumLines] = "";
+ SymName[NumLines] = S.name;
+ S.texts(T) {
+ if (T.value == ">XREF") Xref++;
+ }
+ S.pins(P) {
+ NrOfPins++;
+ PinNames[NumLines] += StripWhiteSpace(P.name) + " ";
+ sprintf(PinCount[NumLines], "%d", NrOfPins);
+ PNam = P.name;
+ }
+ if ((strstr(S.name, "SPULE") >= 0) && SymDisplay == 0) {
+ Lines[NumLines++] = PinCount[NumLines] + // Spulen
+ "\t" + PinNames[NumLines] +
+ "\t" + SymName[NumLines];
+ }
+ if (strstr(S.name, "_KS", strlen(S.name) - 3) >= 0) { // nur wenn Symbolname auf xxxx_KS endet
+ if (NrOfPins && SymDisplay == 1 && strstr(S.name, "SPULE") == -1 && strstr(PNam, "_") == -1) {
+ Lines[NumLines++] = PinCount[NumLines] + // Hauptkontakte
+ "\t" + PinNames[NumLines] +
+ "\t" + SymName[NumLines];
+ }
+ if (NrOfPins && SymDisplay == 2 && strstr(S.name, "SPULE") == -1 && strstr(PNam, "_") == 0) {
+ Lines[NumLines++] = PinCount[NumLines] + // Hilfskontakte
+ "\t" + PinNames[NumLines] +
+ "\t" + SymName[NumLines];
+ }
+ }
+ if (!NrOfPins && !Xref && SymDisplay == 3) { // Symbole ohne Kontakte
+ Lines[NumLines++] = PinCount[NumLines] +
+ "\t" + PinNames[NumLines] +
+ "\t" + SymName[NumLines];
+ }
+ if (SymDisplay == 4) { // Symbole ohne Kontakte
+ Lines[NumLines++] = PinCount[NumLines] +
+ "\t" + PinNames[NumLines] +
+ "\t" + SymName[NumLines];
+ }
+ Lines[NumLines] = "";
+ }
+}
+}
+
+
+// Übertrage gewähltes Symbol in Symbolliste
+void SymEntry(void) { // Selected liefert aus ListView gewählten Symbol-Index
+ numeric string Rang;
+
+ RangDev++;
+ sprintf(Rang, "%d", RangDev);
+
+ DevRang[NumSyms] = Rang;
+ DevPinCount[NumSyms] = PinCount[Selected];
+ DevPinNames[NumSyms] = PinNames[Selected];
+ DevSymName[NumSyms] = SymName[Selected];
+
+ DevLines[NumSyms++] = Rang +
+ "\t" + PinCount[Selected] +
+ "\t" + PinNames[Selected] +
+ "\t" + SymName[Selected];
+
+ NumAllPins += strtol(PinCount[Selected]);
+
+ DevPinNamesAll += " " + PinNames[Selected];
+ DevPinNamesAll = StripWhiteSpace(DevPinNamesAll);
+}
+
+void ClearDevList(void) {
+ int i;
+ for (i = 0; i <= NumSyms; i++) {
+ DevLines[i] = "";
+ }
+ NumSyms = 0;
+ RangDev = 0;
+ NumAllPins = 0;
+ MakeDevCmd = "";
+ DevPinNamesAll = "";
+}
+
+// int ValidSymName(string symname) {
+// if (symname == "") return 0;
+// library(L) { // Symbol-Name schon vorhanden?
+// L.symbols(S) {
+// if (strupr(symname) == S.name) return 0;
+// }
+// }
+// return 1;
+// }
+
+string GetPinName(int PinIndex) { // Pin-Namen aus Listeneintrag extr., PinIndex 0...
+ string Pnames[];
+ strsplit(Pnames, DevPinNamesAll, ' ');
+ return Pnames[PinIndex];
+}
+
+int CorrectContactNames(void) { // Anzeige der Kontaktnamen aktualisieren
+ int i, j, n;
+ string pn = ""; // temp. Pin-Namen-String für 1 Symbol
+ string a[];
+
+ DevPinNamesAll = StripWhiteSpace(DevPinNamesAll);
+
+ // Prüfe Zahl der Pins
+ if (strsplit(a, DevPinNamesAll, ' ') != NumAllPins) return 0;
+
+ // Prüfe Doppelnamen
+ if (NumAllPins > 1) {
+ while (i < NumAllPins) {
+ j = i + 1;
+ while (j < NumAllPins) {
+ if (a[i] == a[j++]) return 0;
+ }
+ i++;
+ }
+ }
+ for (j = 0; j < NumSyms; j++) {
+ pn = "";
+ for (i = 0; i < strtol(DevPinCount[j]); i++) {
+ pn += " " + GetPinName(n++);
+ }
+ pn = StripWhiteSpace(pn);
+ DevPinNames[j] = pn;
+ DevLines[j] = DevRang[j] +
+ "\t" + DevPinCount[j] +
+ "\t" + pn +
+ "\t" + DevSymName[j];
+ }
+ return 1;
+}
+
+int OkToClose(void) {
+ if (!CorrectContactNames()) {
+ dlgMessageBox(ErrorCorrectNames);
+ return 0;
+ }
+ library(L) { // Device-Name schon vorhanden?
+ L.devicesets(D) {
+ if (strupr(NewDeviceName) == D.name) {
+ dlgMessageBox("Bitte wählen Sie einen anderen Namen\n (Device schon vorhanden)!\n");
+ return 0;
+ }
+ }
+ L.packages(P) {
+ if (strupr(NewDeviceName) == P.name) {
+ dlgMessageBox("Bitte wählen Sie einen anderen Namen\n (Package schon vorhanden)!\n");
+ return 0;
+ }
+ }
+ }
+ if (NewDeviceName == "" || !NumSyms) {
+ dlgMessageBox("Das Bauteil kann nur erzeugt werden, wenn Sie einen Namen eingeben\n und mindestens ein Symbol in der Device-Liste steht!");
+ return 0;
+ }
+ else return 1;
+}
+
+string GetPinNameFromLbr(string Sname, int i) { // Pinname, i-ter Pin
+ string pn = "";
+ int n;
+ library(L) {
+ L.symbols(S) {
+ if (S.name == Sname) {
+ n = 0;
+ S.pins(P) {
+ if (i == n++) {
+ pn = P.name;
+ return pn;
+ }
+ }
+ }
+ }
+ }
+ return "";
+}
+
+void GenerateDevice(void) {
+ string s;
+ int i, j, k;
+ int XOffset = 0; // virtuelle Y-Nulllinie: rechts daneben wird nächster Kontakt platziert
+ int SymOffset;
+ int CoordY;
+ // Erzeuge Device-Befehle
+ MakeDevCmd += "edit " + NewDeviceName + ".dev;\n";
+ MakeDevCmd += "value on;\n";
+ MakeDevCmd += "grid mil 100 on;\n";
+ MakeDevCmd += "prefix '" + DevicePrefix + "';\n";
+ MakeDevCmd += "description '" + DeviceDescription + "';\n";
+ MakeDevCmd += "package '" + NewDeviceName + "';\n";
+ sprintf(s, "add '%s' R0 must 0 (%d %d);\n", DevSymName[0], SpulenOffset, XrefOffset);
+ MakeDevCmd += s;
+ for (i = 1; i < NumSyms; i++) {
+ if (strtol(DevPinCount[i]) >= 9) SymOffset = 600;
+ if (strtol(DevPinCount[i]) < 9) SymOffset = 400;
+ if (strtol(DevPinCount[i]) < 7) SymOffset = 300;
+ if (strtol(DevPinCount[i]) < 5) SymOffset = 200;
+ if (strtol(DevPinCount[i]) < 3) SymOffset = 100; // Abstand zwischen Einzelkontaktsymbolen, mil
+
+ if (strtol(DevPinCount[i])) { // Symbol mit Pins, rechts der Reihe nach platzieren
+ sprintf(s, "add '%s' R0 next 0 (%d %d);\n", DevSymName[i], XOffset + SymOffset, XrefOffset);
+ }
+ else { // Symbol ohne Pins, unter Spule aufeinander platzieren
+ sprintf(s, "add '%s' R0 can 0 (%d %d);\n", DevSymName[i], SpulenOffset, ZeicheSymbolOffset + SymOffset);
+ }
+
+ MakeDevCmd += s;
+ XOffset += 2 * SymOffset;
+ }
+
+ // Erzeuge Connect-Befehle
+ i = 0;
+ while (DevSymName[i]) {
+ j = 0;
+ while (GetPinNameFromLbr(DevSymName[i], j) != "") {
+ if (GetPinName(k)) {
+ sprintf(s, "connect 'G$%d.%s' '%s';\n", i+1 , GetPinNameFromLbr(DevSymName[i], j++), GetPinName(k++));
+ MakeDevCmd += s;
+ }
+ }
+ i++;
+ }
+
+//MakeDevCmd += "value on;\n";
+ MakeDevCmd += "grid last;\n";
+
+ // Erzeuge Package-Befehle
+ MakePackCmd = "edit " + NewDeviceName + ".pac;\n";
+ MakePackCmd += "grid mil 100 on;\n";
+ for (i = 0; i < NumAllPins; i++) {
+ CoordY = i * PadOffset;
+ sprintf(s, "pad '%s' (%d 0);\n", GetPinName(i), CoordY);
+ MakePackCmd += s;
+ }
+
+ MakePackCmd += "grid last;\n";
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ // Ausgabe zuerst in Script-Datei, dann SCRIPT-Befehl ausführen
+ s = MakePackCmd + MakeDevCmd;
+ output(f, "wtD") printf("%s", s); // temporäre Script-Datei erzeugen
+ exit("SCRIPT '"+ f +"';");
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ }
+
+void EditSymParams(void) {
+ string a[];
+
+ dlgDialog("Kontaktnamen editieren") {
+ dlgHBoxLayout {
+ dlgLabel("Kontaktnamen");
+ dlgStringEdit(DevPinNamesAll);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("&Hilfe") dlgMessageBox(HelpTextKontaktnamen);
+ dlgPushButton("-Abbrechen") dlgReject();
+ dlgPushButton("+OK") if (CorrectContactNames()) dlgAccept();
+ else dlgMessageBox(ErrorCorrectNames);
+ }
+ };
+}
+
+//***************************************************************
+SymDisplay = 0;
+MakeSymSelectList();
+
+dlgDialog("Erzeuge Device") {
+ dlgLabel("Symbolauswahlliste");
+ dlgListView("Pins\tPin-Namen\tSymbol-Name", Lines, Selected) SymEntry();
+ dlgLabel("Device-Liste");
+ dlgListView("Rang\tPins\tKontakt-Namen\tSymbol-Name", DevLines, SelectedDev);
+ dlgHBoxLayout {
+ dlgGroup("Symbolauswahl-Filter") {
+ dlgRadioButton("Spulen", SymDisplay) MakeSymSelectList();
+ dlgRadioButton("Hauptkontakte mit Kontaktspiegel", SymDisplay) MakeSymSelectList();
+ dlgRadioButton("Hilfskontakte mit Kontaktspiegel", SymDisplay) MakeSymSelectList();
+ dlgRadioButton("Symbole ohne Kontakte", SymDisplay) MakeSymSelectList();
+ dlgRadioButton("Alle Symbole", SymDisplay) MakeSymSelectList();
+ }
+ dlgGroup("Device-Parameter") {
+ dlgHBoxLayout {
+ dlgLabel("&Device-Name");
+ dlgStringEdit(NewDeviceName);
+ }
+ dlgHBoxLayout {
+ dlgLabel("&Bauteil-Prefix ");
+ dlgStringEdit(DevicePrefix);
+ }
+ dlgHBoxLayout {
+ dlgLabel("&Beschreibung");
+ dlgStringEdit(DeviceDescription);
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&Hilfe") ShowHelp();
+ dlgPushButton("&Device-Liste löschen") ClearDevList();
+ dlgPushButton("&Kontaktnamen ändern") EditSymParams();
+ dlgPushButton("-Abbrechen") dlgReject();
+ dlgPushButton("+OK") if (OkToClose()) GenerateDevice();
+ }
+ };
diff --git a/eagle-5.7.0/ulp/e-brueckenverwaltung.ulp b/eagle-5.7.0/ulp/e-brueckenverwaltung.ulp
new file mode 100644
index 0000000..8f8ffc8
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-brueckenverwaltung.ulp
@@ -0,0 +1,952 @@
+// Verwaltung von Brückenklemmen (nur für Devices KLEMME*BRUECKE in Bibliothek e-klemmen.lbr)
+
+// Gate-Namen der Brücken-Devices müssen alphabetisch so geordnet sein, dass ihre Pins
+// der Reihe nach 1.x, 2.x etc. sind
+
+// todo
+// Anzeigen, welcher Klemmenblock gerade bearbeitet wird
+
+string Version = "Version 1.01";
+
+// History
+// 1.01 -- 2009-10-01
+// nicht benötigte "\t\t" in Kopfzeilen von dlgDialog() entfernt
+//
+
+#require 4.9206
+
+#usage "Brückenklemmen-Verwaltung: Brücken eintragen und ändern\n "
+
+"Brückenklemmen sind Bauteile mit Einzelklemmen, die jeweils zwei Kontakte "
+"mit Anschlussmöglichkeit für Drähte haben. Zusätzlich können die Klemmen "
+"untereinander mit gesteckten Brückenkämmen o.ä. verbunden werden. Mit diesem "
+"User-Language-Programm (ULP) definieren Sie auf bequeme Weise, welche Klemmen "
+"innerhalb eines Klemmenblocks gebrückt werden sollen. Die Brückendefinitionen "
+"werden als Liste in einer Datei (schaltungsname.brk) ausgegeben. Außerdem "
+"wird eine Log-Datei (schaltungsname.log) angelegt, aus der mögliche Probleme "
+"hervorgehen. Die Log-Datei wird gelöscht, nachem die EAGLE-Sitzung beendet ist. "
+"Die erzeugte Liste (schaltungsname.brk) kann in einem Tabellenkalkulationsprogramm "
+"weiter verarbeitet oder mit Hilfe von e-makelist.ulp direkt in die "
+"Schaltungszeichnung importiert werden. "
+
+" "
+
+"Brückenklemmen sind Bauteile mit Einzelklemmen, die jeweils zwei Kontakte "
+"mit Anschlussmöglichkeit für Drähte haben. Zusätzlich können die Klemmen "
+"untereinander mit gesteckten Brückenkämmen o.ä. verbunden werden. Mit diesem "
+"User-Language-Programm (ULP) definieren Sie auf bequeme Weise, welche Klemmen "
+"innerhalb eines Klemmenblocks gebrückt werden sollen. Die Brückendefinitionen "
+"werden als Liste in einer Datei (schaltungsname.brk) ausgegeben. Außerdem "
+"wird eine Log-Datei (schaltungsname.log) angelegt, aus der mögliche Probleme "
+"hervorgehen. Die Log-Datei wird gelöscht, nachem die EAGLE-Sitzung beendet ist. "
+
+"Klemmenbibliothek "
+
+"Dieses Programm berücksichtigt nur Brückenklemmen, wie sie in der "
+"Bibliothek e-klemmen.lbr unter den Device-Namen KLEMME*BRUECKE definiert sind. "
+"In der Schaltung muss der Bauteilname mit X beginnen, und in der Bibliothek "
+"muss der Namensbestandteil BRUECKE vorhanden sein. "
+"In der Bibliothek e-klemmen.lbr befinden sich vordefinierte Brückenklemmen. "
+"Bitte lesen Sie die Bibliotheksbeschreibung (z.B. im Control-Panel), wenn Sie "
+"eigene Brückenklemmen definieren wollen. "
+
+"Prinzip "
+
+"Klemmen werden behandelt, wie jedes andere Bauteil auch: Kontakte, die mit "
+"anderen verbunden sind, erscheinen im Klemmenplan. Eine Verbindung entsteht, "
+"wenn die Kontakte über eine Netzlinie verbunden sind oder wenn an den Kontakten "
+"jeweils ein Netz mit gleichem Namen hängt. Letzteres ist insbesondere dann "
+"der Fall, wenn Kontakte auf unterschiedlichen Schaltplanseiten verbunden sind. "
+
+"Brückenklemmen bieten darüber hinaus eine weitere Möglichkeit, Verbindungen "
+"innerhalb desselben Klemmenblocks zu definieren. Man bringt einen "
+"Verweis (Referenz) im Brückenklemmen-Symbol an, der auf die vorherige bzw. nächste "
+"Klemme zeigt, mit der die Klemme verbunden werden soll. Damit vermeidet man ein "
+"Wirrwarr von gezeichneten Brücken bei größeren Plänen. Die Verweise verwenden "
+"Attribute, die in der Bibliothek festgelegt sind. Der Benutzer hat damit aber "
+"nichts zu tun, solange er für die Definition der Brücken dieses ULP verwendet. "
+
+"Was steht im Klemmenplan und im Brückenplan? "
+
+"Der Klemmenplan stellt alle Draht- und Kabelverbindungen in einer Liste dar. "
+"Der Brückenplan enthält die (üblicherweise mit Brückenkämmen ausgeführten) "
+"Verbindungen innerhalb eines Klemmenblocks, die mit Hilfe dieses Programms "
+"erstellt wurden. "
+
+"Werden Kontakte eines Brückenklemmenblocks über ein Netz verbunden, erscheint diese "
+"Verbindung im Klemmenplan als Drahtverbindung. Sie sollten das dann tun, wenn "
+"Sie darauf hinweisen wollen, dass hier tatsächlich ein Draht von einer Klemme "
+"zur anderen verlegt werden soll. "
+
+"Werden Kontakte eines Brückenklemmenblocks über Klemmen-Referenzen (mit diesem "
+"Programm) verbunden, erscheint diese Verbindung im Brückenplan (ebenso wie "
+"Verbindungen zwischen unterschiedlichen Klemmenblöcken, etwa eine Klemme "
+"von X1 mit einer von X2). "
+
+"Falls Kontakte auf beide Arten verbunden sind (was keinen Sinn macht), "
+"erscheinen sie im Klemmenplan und im Brückenplan. "
+
+"Wie werden Brücken im Stromlaufplan dargestellt? "
+
+"Im Brückenklemmen-Symbol weisen (maximal) zwei Zahlen auf die nächsten Klemmen hin, "
+"mit denen es verbunden ist. Da Referenzverbindungen nicht über die Draht-Anschlüsse "
+"realisiert werden, erscheint als Referenz nicht der jeweilige Kontaktname "
+"(1.1, 1.2 etc.), sondern die Klemmennummer (1, 2, 3 etc.). Klemme 5 etwa "
+"ist die Klemme mit den Kontakten 5.1 und 5.2. "
+
+"Beispiel: In einem Block mit sechs Einzelklemmen, sollen die Klemmen 1, 3 und 5 "
+"miteinander verbunden sein: Klemme 1 verweist auf 3, Klemme 3 verweist auf 1 und 5, "
+"und Klemme 5 verweist auf Klemme 3. "
+
+"Bedienung "
+
+"In jeder Programmsitzung können Sie nur die Brücken eines Klemmenblocks (also etwa X1) "
+"bearbeiten. "
+
+"Typischer Ablauf einer Programmsitzung: "
+
+"Log-Datei: Dieser Button öffnet ein Textfenster, in dem Sie die vorhandenen "
+"Draht- und Referenz-Brücken sowie Warnungen zu eventuellen Fehlern finden. "
+
+"Doppelklick auf obere Liste: Wählen Sie den zu bearbeitenden Klemmenblock. "
+"Dargestellt sind die Anzahl und die Nummern der in der Schaltung platzierten "
+"Klemmen sowie die Klemmen, die mit Drähten (Netzen) verbunden sind. "
+"Mit dem Doppelklick wird dieser Klemmenblock in die untere Liste zur Bearbeitung "
+"übertragen. "
+
+"Untere Liste: Links sind Drahtverbindungen dargestellt, sie können nicht "
+"verändert werden (nur in der Schaltung). Rechts sind die Einzelbrücken "
+"in jeweils einer Zeile dargestellt. "
+
+"Doppelklick auf untere Liste: Die verbundenen Klemmen einer Einzelbrücke "
+"wandern in das Editier-Fenster (Verbinden). Dort können Sie eintragen, "
+"welche Klemmen verbunden werden sollen (durch Leerzeichen getrennt). "
+"Die Eingabetaste oder ein Klick auf Anwenden ändert die selektierte "
+"Zeile entsprechend. Falls Sie Klemmen gewählt haben, die nicht in der "
+"Schaltung platziert sind, erscheint eine Fehlermeldung. "
+
+"Speichern: Dieser Button beendet das Programm und führt die Änderungen "
+"an der zuletzt bearbeiteten Klemme durch. Der aktuelle Brückenplan "
+"wird als schaltungsname.brk abgespeichert, zusätzlich die Log-Datei "
+"(*.log) und eine Script-Datei (*.scr), aus der die EAGLE-Befehle zur Änderung "
+"der Referenzen hervorgehen. Um den endgültigen Brückenplan für ihre "
+"Projektunterlagen zu erstellen, sollten Sie das Programm starten und "
+"ohne eine Änderung durchzuführen den Button Speichern betätigen, dann "
+"ist die Liste richtig sortiert. "
+
+"Undo: Dieser Button bringt nach einer Änderung den letzten Zustand in die "
+"untere Liste (nur eine Undo-Stufe). "
+
+"Unbenutzte: Dieser Button bringt alle Klemmen in das Editier-Feld, die "
+"als Eingabe möglich sind, da sie gegenwärtig keiner anderen Brücke angehören. "
+"Am besten, sie betätigen diesen Button und löschen dann die Klemmen heraus, "
+"die nicht mit der zu erstellenden Brücke verbunden werden sollen. "
+
+"Löschen: Löscht eine komplette Brückenzeile. "
+
+"Neu: Erzeugt eine neue Brückenzeile, in die Sie den Inhalt des Editier-Fensters "
+"übertragen können. "
+
+"Abbrechen: Programm ohne Änderungen verlassen."
+;
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SetFileNames(void) { // in Schematic-Kontext aufrufen
+
+ if (!schematic) {
+ // dlgMessageBox("Dieses Programm muss vom Schaltplan-Editor aus aufgerufen werden");
+ exit(1);
+ }
+ schematic(SCH) {
+ scrfile = filesetext(SCH.name, ".scr");
+ errorfile = filesetext(SCH.name, ".log");
+ listfile = filesetext(SCH.name, ".brk");
+ }
+}
+
+string StripWhiteSpace(string s) { // mit Zusatz: Doppel-Whitespaces im Inneren werden 1 Whitespace
+ int i, n;
+ string t;
+
+ while (s && isspace(s[0]))
+ s = strsub(s, 1);
+ while (s && isspace(s[strlen(s) - 1]))
+ s = strsub(s, 0, strlen(s) - 1);
+// Doppel-Blanks
+ for (i = 0; i < strlen(s); i++) {
+ if (!isspace(s[i])) t[n++] = s[i];
+ else {
+ if ((strlen(s) > i+1) && isspace(s[i+1]));
+ else t[n++] = s[i];
+ };
+ }
+ s = t;
+
+ return s;
+}
+
+string SortBlankSeparatedString(string s) {
+ int nb;
+ numeric string b[];
+ s = StripWhiteSpace(s);
+ nb = strsplit(b, s, ' ');
+ sort(nb, b);
+ s = strjoin(b, ' ');
+ return s;
+}
+
+// Lösche Mehrfacheinträge aus blanksepariertem String und sortiere
+string DelMultiples(string st) {
+ string s, h[], ht[];
+ int i, n, np;
+ st = SortBlankSeparatedString(st);
+ np = strsplit(h, st, ' ');
+ for (i = 0; i < np; i++) {
+ ht[n] = h[i];
+ if (ht[n] == h[i+1]) {
+ i++;
+ }
+ n++;
+ }
+ s = strjoin(ht, ' ');
+ return StripWhiteSpace(s);
+}
+
+// Liefert einen kommaseparierten String mit allen verdrahteten Brücken eines Klemmenblocks
+// Für Log werden die Brücken nach Netzen getrennt ausgegeben
+string GetConnectedOnePart(string pname) {
+ int klnr, nrnetpins;
+ string s, t, connects, allconnects;
+ schematic(SCH) {
+ SCH.nets(N) {
+ nrnetpins = 0;
+ N.pinrefs(P) {
+ if (P.part.name == pname && P.pin.contact) {
+ nrnetpins++;
+ if (nrnetpins == 2) {
+ sprintf(s, "%s\tNetz: %s\tKlemmen: ", P.part.name, N.name); LogCmd += s;
+ break;
+ }
+ }
+ }
+ t = ""; connects = ""; nrnetpins = 0;
+ N.pinrefs(P) {
+ s = "";
+ if (P.part.name == pname && P.pin.contact) {
+ if(strtol(P.pin.contact.pad.name)) klnr = strtol(P.pin.contact.pad.name);
+ else sprintf(s, "\n%s: Fehler in Bibliothek! Pad-Name muss mit Ziffer beginnen!\n", P.pin.contact.pad.name); LogCmd += s;
+ sprintf(s, "%d ", klnr); connects += s; t += s; // nur wegen \n
+ nrnetpins++;
+ }
+ }
+ if (nrnetpins == 1) connects = ""; // nur ein Pin an Netz
+ LogCmd += SortBlankSeparatedString(connects);
+ if (t && nrnetpins > 1) LogCmd += "\n";
+ allconnects += " " + connects;
+ }
+ }
+ return SortBlankSeparatedString(allconnects);
+}
+
+void PackListsel (int ix, int pos, string s) {
+ int np;
+ if (ix < 0 || pos < 0) return;
+ numeric string h[];
+ strsplit(h, listsel[ix], '\t');
+ h[pos] = s;
+ listsel[ix] = strjoin(h, '\t');
+}
+
+string UnpackListsel (int ix, int pos) {
+ if (ix < 0) return "";
+ numeric string h[];
+ strsplit(h, listsel[ix], '\t');
+ return h[pos];
+}
+
+void PackListall (int ix, int pos, string s) {
+ int np;
+ if (ix < 0 || pos < 0) return;
+ numeric string h[];
+ strsplit(h, listall[ix], '\t');
+ h[pos] = s;
+ listall[ix] = strjoin(h, '\t');
+}
+
+string UnpackListall (int ix, int pos) {
+ if (ix < 0) return "";
+ numeric string h[];
+ strsplit(h, listall[ix], '\t');
+ return h[pos];
+}
+
+int IsInBlankStr (string item, string st) { // ist item in blanksep. String st vorhanden?
+ int i, np;
+ numeric string h[];
+ st = StripWhiteSpace(st);
+ np = strsplit(h, st, ' ');
+ for (i = 0; i < np; i++) {
+ if (item == h[i]) return 1;
+ }
+ return 0;
+}
+
+// Löscht Edit-Liste
+void DelListsel(void) {
+ for (i = 0; i < maxklemmen; i++) {
+ listsel[i] = "";
+ }
+}
+
+// Ref-Verbindungen für Editierliste erstellen: blank/tab separated string (ordered)
+// 1 2 5 \n 4 6 Zeilen mit \t getrennt
+string GetConnectedRefwise(string pname){
+ numeric string s, sa, klemmenused[], ku, c1, c2, bridges[], h[], lastline[], prevline[];
+ int i, j, k, u, v, w, np, np1, np2, bx, found;
+ schematic(SCH) {
+ SCH.sheets(SH) {
+ SH.parts(P) {
+ if (P.name == pname) {
+ if (LogOn) LogCmd += P.name + " ";
+ np = strsplit(klemmenused, StripWhiteSpace(lookup(PartDatabase, P.name, "Verwendet", '\t')) ,' ');
+ i = 0; bx = 0; found = 0;// Brückenindex, trennt Einzelpotentiale
+ for (i = 0; i < np; i++) {
+ ku = klemmenused[i];
+ c1 = P.attribute[klemmenused[i]+"1"];
+ c2 = P.attribute[klemmenused[i]+"2"];
+ if (P.attribute[klemmenused[i]+"1"] || P.attribute[klemmenused[i]+"2"]) {
+ sprintf(s, "%d: %s %s %s\n", bx, ku, c1, c2);
+ sprintf(s, "%s %s %s", ku, c1, c2);
+ if (StripWhiteSpace(s))
+ bridges[bx++] = StripWhiteSpace(s);
+ }
+ }
+ // bx Zahl der Klemmen mit Ref (höchster Index ist bx-1); max drei Klemmen pro Eintrag
+ for (j = bx-1; j > 0; j--) { // Fasse Potentiale in bridges[] zusammen
+ np1 = strsplit(lastline, bridges[j], ' '); // bis zu drei Klemmen in lastline
+ v = j - 1;
+ while (v >= 0) { // vorherige Zeilen
+ strsplit(prevline, bridges[v], ' ');
+ w = 0;
+ while(prevline[w]) {
+ u = 0;
+ while (lastline[u]) {
+ if (lastline[u] == prevline[w]) {
+ bridges[v] += " " + StripWhiteSpace(bridges[j]);
+ bridges[j] = "";
+ found = 1;
+ break;
+ }
+ u++;
+ }
+ if (found) break;
+ w++;
+ }
+ v--;
+ }
+ } // Ende Zusammenfassen der Potentiale (Mehrfacheinträge hier noch möglich)
+ i = 0; n = 0;
+ while (h[i]) h[i++] = "";
+ for (i = 0; i < maxklemmen; i++) {
+ if (StripWhiteSpace(bridges[i])){
+ h[n] = DelMultiples(bridges[i]);
+ n++;
+ }
+ }
+ sort(n, h);
+ i = 0; s = "";
+ while (StripWhiteSpace(h[i])) {
+ h[i] = DelMultiples(h[i]);
+ s += h[i] + "\n";
+ if (LogOn) LogCmd += " : " + h[i];
+ i++;
+ }
+ if (LogOn) LogCmd += "\n";
+ }
+ }
+ }
+ }
+ return s;
+}
+
+// Editier-Liste (Drähte) für einen Klemmenblock erstellen: blank/tab separated string (ordered)
+// 1 2 5 \n 4 6 Zeilen mit \t getrennt
+string GetConnectedNetwise(string pname){
+ int klnr, nrnetpins;
+ string s, t, connects, allconnects;
+ schematic(SCH) {
+ SCH.nets(N) {
+ t = ""; connects = ""; nrnetpins = 0;
+ N.pinrefs(P) {
+ s = "";
+ if (P.part.name == pname && P.pin.contact) {
+ klnr = strtol(P.pin.contact.pad.name); // trennt .x ab von x.x
+ sprintf(s, "%d ", klnr); connects += s; t += s; // t nur wegen \n erforderlich
+ nrnetpins++;
+ }
+ }
+ connects = SortBlankSeparatedString(connects);
+ if (nrnetpins == 1) connects = ""; // nur ein Pin an Netz
+ if (t && nrnetpins > 1) {
+ allconnects += connects + "\n";
+ }
+ }
+ }
+ return allconnects;
+}
+
+// Ermittelt Wired-Brücken an und schreibt Log nach Startvorgang
+// Part \t Klemmen
+// wobei Klemmen blanksepariert sind (alle fest verdrahteten Klemmen)
+// z. B.: X1 1 3 4 5 9
+void GetConnectedAllParts(void) {
+ int i, np;
+ string h[];
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ LogCmd += "Mit Netzen realisierte Brücken: nicht mit diesem ULP zu verändern!\n";
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ while (listall[i]) {
+ np = strsplit(h, listall[i], '\t');
+// Wired Connections
+ h[Verdrahtet] = DelMultiples((GetConnectedOnePart(h[Name])));
+ listall[i] = strjoin(h, '\t');
+ i++;
+ }
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ LogCmd += "Mit Referenzen realisierte Brücken: mit diesem ULP zu verändern!\n";
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+// Ref Connections
+ i = 0;
+ while (listall[i]) {
+ np = strsplit(h, listall[i], '\t');
+ LogOn = 1;
+ GetConnectedRefwise(h[Name]);
+ LogOn = 0;
+ i++;
+ }
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+}
+
+
+int CheckOKBridgeLine(string st) { // lässt nur in schematic vorhandene Klemmen zu
+ int i, np;
+ string s, h[];
+ s = StripWhiteSpace(st);
+ if (st == "") return 1;
+ char c;
+ for (i = 0; i < strlen(s); i++) {
+ c = s[i];
+ if (isdigit(c) || c == ' ') {
+ }
+ else return 0;
+ }
+ np = strsplit(h, st, ' ');
+ if (np == 1) return 0;
+ for (i = 0; i < np; i++) {
+ if (!IsInBlankStr(h[i], UnpackListall(CurrentPartIndex, Verwendet))) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+void MakeEditListOnePart(int Sel) {
+ int i, ErrPrinted;
+ string wirelines[], reflines[], h[], x[];
+ if (Sel < 0) return;
+ strsplit(h, listall[Sel], '\t');
+ CurrentPartIndex = Sel;
+ CurrentPart = h[Name];
+ DelListsel();
+ strsplit(wirelines, GetConnectedNetwise(h[Name]), '\n'); // alle Br. als Einzelzeilen
+ strsplit(reflines, GetConnectedRefwise(h[Name]), '\n'); // alle Br. als Einzelzeilen
+ while(wirelines[i] || reflines[i]) {
+ listsel[i] = DelMultiples(wirelines[i]) + "\t" + DelMultiples(reflines[i]);
+ if (!CheckOKBridgeLine(reflines[i])) {
+ if (ErrOn && !ErrPrinted) {
+ dlgMessageBox( "Unzulässige Brückenbezeichnung, siehe Log-Liste! "
+ "Bitte tragen Sie in die Brückenzeilen nur erlaubte Bezeichnungen ein "
+ "und speichern Sie das Ergebnis ab!"
+ );
+ ErrPrinted = 1;
+ }
+ if (!ErrOn)
+ if (strsplit(x, reflines[i], ' ') == 1)
+ LogCmd += UnpackListall(Sel, Name) + ": " + reflines[i] +
+ "\tNur ein Klemmenverweis (min. 2 erforderlich)!\n";
+ else
+ LogCmd += UnpackListall(Sel, Name) + ": " + reflines[i] +
+ "\tNicht alle Klemmen in Schaltung vorhanden!\n";
+ }
+ i++;
+ }
+ return;
+}
+
+// void MakeEditListPerName(string pname) {
+// int i;
+// pname = StripWhiteSpace(pname);
+// while (UnpackListall(i, Name)) {
+// if (pname == UnpackListall(i, Name)) {
+// MakeEditListOnePart(i);
+// SelAll = i;
+// return;
+// }
+// i++;
+// }
+// dlgMessageBox("Kein Klemmenblock mit diesem Namen vorhanden! ");
+// return;
+// }
+
+// Sammle Brückenklemmen (Part-Name: X...; Device-Name: ..BRUECKE..)
+// Fülle obere Liste und lege identische Datenbank mit Header an (PartDatabase[])
+void CollectX(void) {
+ numeric string s, s1, s2, s3, sh0, sh;
+ int i, n;
+ PartDatabase[0] = ListHeaderMain + "\tSeite";
+ schematic(SCH) {
+ SCH.sheets(SH) {
+ SH.parts(P) {
+ if (strchr(P.name, 'X') == 0) {
+ if (strstr(P.device.name, "BRUECKE") >= 0) {
+ n = 0;
+ sprintf(s, "%s\t", P.name);
+ P.instances(I) {
+ n++;
+ }
+ maxklemmen = max(maxklemmen, n);
+ sprintf(s1, "%d\t", n);
+ listall[i] = s + s1;
+ s3 = "";
+ P.instances(I) {
+ s3 += I.gate.name + " ";
+ }
+ sh = "";
+ P.instances(I) {
+ sprintf(sh, "%d ", SH.number); // sheets
+ }
+ listall[i] += StripWhiteSpace(s3) + "\t" + DelMultiples(sh);
+ PartDatabase[i+1] = listall[i] + "\t" + DelMultiples(sh); // LogCmd += PartDatabase[i] + "\n";
+ i++;
+ }
+ }
+ }
+ }
+ }
+}
+
+void PushUndo(void) {
+ int i;
+ while (listundo[i]) {
+ listundo[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listsel[i]) {
+ listundo[i] = listsel[i];
+ i++;
+ }
+}
+
+void PullUndo(void) {
+ int i;
+ while (listsel[i]) {
+ listsel[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listundo[i]) {
+ listsel[i] = listundo[i];
+ i++;
+ }
+}
+
+void ShowLog(void) {
+ dlgDialog("Brückendaten aus der Schaltung") {
+ dlgHBoxLayout dlgSpacing(600);
+ dlgHBoxLayout{
+ dlgTextEdit(LogCmd);
+ }
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&Hilfe") dlgMessageBox( "Die Liste gibt Hinweise auf mögliche Probleme beim Einlesen\n"
+ "der Brückenverbindungen."
+ );
+ dlgPushButton("+OK") dlgAccept();
+ }
+ };
+}
+
+// liefert alle a, die nicht in b sind; a,b und return-Wert sind blanksep. Strings
+string AllAnotinB(string a, string b) {
+ int i, na;
+ numeric string ha[];
+ a = StripWhiteSpace(a);
+ b = StripWhiteSpace(b);
+ na = strsplit(ha, a, ' ');
+ a = "";
+ for (i = 0; i < na; i++) {
+ if (!IsInBlankStr(ha[i], b)) {
+ a += ha[i] + " ";
+ }
+ }
+ return StripWhiteSpace(a);
+}
+
+string GetUnused(int Sel) { // liefert unbenutzte Klemmen als blanksep. String
+ int i, n;
+ string h[], s, usedB, usedD, t; // von Brücken benutzt; von Drähten benutzt
+ if (Sel < 0 || CurrentPartIndex < 0) return "";
+ PushUndo();
+ s = UnpackListall(CurrentPartIndex, Verwendet);
+ while (listsel[i]) {
+ if (Sel != i) usedB += UnpackListsel(i, Bruecken) + " ";
+ usedD += UnpackListsel(i, Draehte) + " ";
+ i++;
+ }
+ s = AllAnotinB(s, usedB);
+ if (ExcludeDrahtverbindungen)
+ s += " " + AllAnotinB(s, usedD);
+ return StripWhiteSpace(s);
+}
+
+int CheckOKChangeString(string st) { // lässt nur solche zu, die noch nicht in anderer Br. verwendet
+ int i, np;
+ string s, h[];
+ s = StripWhiteSpace(st);
+ char c;
+ for (i = 0; i < strlen(s); i++) {
+ c = s[i];
+ if (isdigit(c) || c == ' ') {
+ }
+ else return 0;
+ }
+ np = strsplit(h, st, ' ');
+ if (np == 1) return 0;
+ for (i = 0; i < np; i++) {
+ if (!IsInBlankStr(h[i], GetUnused(SelConnected))) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+void ClearGarbageListsel() { // löscht leere Einträge am Ende von listsel
+ int i;
+ while (listsel[i]) {
+ if (UnpackListsel(i, Draehte) == "" && UnpackListsel(i, Bruecken) == "") listsel[i] = "";
+ i++;
+ }
+}
+
+// Lösche eine Verbindung aus Auswahlliste
+void DelOneEntry(int Sel) {
+ int i, n, imax;
+ string x[];
+ PushUndo();
+ if (Sel < 0) return;
+ SelConnected = -1;
+ while(UnpackListsel(i, Bruecken)) i++; // # Einträge feststellen
+ imax = i;
+ for (i = 0; i < imax; i++) {
+ if (i <= Sel) {
+ x[i] = UnpackListsel(i, Bruecken);
+ }
+ else {
+ x[i-1] = UnpackListsel(i, Bruecken);
+ }
+ }
+ if (imax != 0) PackListsel(imax-1, Bruecken, "");
+
+ if (Sel == 0 && imax == 0) {
+ PackListsel(0, Bruecken, "");
+ }
+ else {
+ imax = imax -1;
+ for (i = 0; i < imax; i++) {
+ PackListsel(i, Bruecken, x[i]);
+ }
+ }
+ if (Sel > 0) SelConnected = Sel-1;
+ else SelConnected = 0;
+ ClearGarbageListsel(); // entferne leere Zeilen aus listsel
+}
+
+void CreateBridge(void) {
+ int i;
+ while(UnpackListsel(i, Bruecken)) i++; // # Einträge feststellen
+ PackListsel(i, Bruecken, "");
+ ChangeString = "";
+ SelConnected = i;
+}
+
+void EditOneEntry(int Sel) {
+ string h[];
+ if (Sel < 0) return;
+ strsplit(h, listsel[Sel], '\t');
+ ChangeString = SortBlankSeparatedString(h[Bruecken]);
+}
+
+void TransferEditLine (int Sel) {
+ string h[];
+ if (Sel < 0) return;
+ PushUndo();
+ if (StripWhiteSpace(ChangeString) == "") {
+ DelOneEntry(Sel);
+ return;
+ }
+ ChangeString = SortBlankSeparatedString(ChangeString);
+ if (CheckOKChangeString(ChangeString)) {
+ PackListsel(Sel, Bruecken, ChangeString);
+ }
+ else dlgMessageBox("Ungültige Klemmennummern im Editier-Feld! "
+ "Erlaubt sind Klemmennummern, die in der selektierten Brücke verwendet wurden, "
+ "aber in keiner anderen (nur Leerzeichen und 0-9). "
+ "Es müssen mindestens zwei Klemmen eingetragen sein.");
+}
+
+void WriteAttributeLog(void) {
+ int i;
+ string s;
+ ErrOn = 0;
+ LogCmd += "Warnungen! - Falsche Verweise\n";
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ while (listall[i]) {
+ SelAll = i;
+ CurrentPartIndex = i;
+ MakeEditListOnePart(i);
+ i++;
+ }
+ SelAll = 0;
+ CurrentPartIndex = 0;
+ MakeEditListOnePart(0);
+ ErrOn = 1;
+}
+
+string MakeList (void) { // aktuelle Brückenliste erstellen
+ int i, j, k;
+ string h[], b[], BrkCmd, s;
+ BrkCmd += "Name\tBrücken\n";
+ while (listall[i]) {
+ strsplit(h, listall[i], '\t'); // hole Bauteilnamen
+ LogOn = 0;
+ BrkCmd += h[Name] + "\t";
+ strsplit (b, GetConnectedRefwise(h[Name]), '\n'); // h: 1 2 3 \t 2 4
+
+ if (CurrentPartIndex == i) {
+ k = 0;
+ while (UnpackListsel(k, Bruecken)) {
+ b[k] = UnpackListsel(k, Bruecken);
+ k++;
+ }
+ b[k] = "";
+ }
+
+ j = 0; s = "";
+ while (b[j]) { // Einzelbrücken
+ // hier ev. aus 1 2 3 4 5 -> 1-5
+ if (!s) s += b[j] + " ";
+ else s += " : " + b[j];
+ j++;
+ }
+ // s = strjoin(b, ':');
+ BrkCmd += s + "\n";
+ i++;
+ }
+ return BrkCmd;
+}
+
+int CancelOk(void) {
+ int CancelOk;
+ dlgDialog("Programm verlassen") {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgTextView ( "Wenn Sie das Programm abbrechen, verlieren Sie alle Änderungen!\n\n"
+ "Abbrechen?"
+ );
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+Nein") dlgReject();
+ dlgPushButton("-Ja") {CancelOk = 1; dlgAccept();}
+ }
+ };
+ if (CancelOk) return 1;
+ else return 0;
+}
+
+void SaveList(void) {
+ int i, k, np;
+ string line, klemme[], h[], sht, pname;
+ DoCmd = "";
+// if (SelConnected < 0) {
+// dlgMessageBox( "Sie müssen erst eine Zeile im unteren Fenster selektieren! ");
+// return;
+// }
+ strsplit(h, listall[CurrentPartIndex], '\t');
+ pname = h[Name];
+ sht = lookup(PartDatabase, pname, "Seite", '\t');
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ LogCmd += "Befehle zum Eintragen der neuen Verweise\n";
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+ DoCmd += "edit .s" + sht + ";\n";
+ DoCmd += "change display off;\n";
+ line = StripWhiteSpace(UnpackListall(CurrentPartIndex, Verwendet));
+ np = strsplit(klemme, line, ' ');
+ for (k = 0; k < np; k++) { // alle Attr. der verwendeten Klemmen löschen
+ DoCmd += "change display off;\n";
+ DoCmd += "attribute " + pname + " " + klemme[k] + "1 " + "'';\n";
+ DoCmd += "change display off;\n";
+ DoCmd += "attribute " + pname + " " + klemme[k] + "2 " + "'';\n";
+ }
+ i = 0; k = 0;
+ while (StripWhiteSpace(UnpackListsel(i, Bruecken))) { // alle Brückenzeilen in Att. eintragen
+ line = StripWhiteSpace(UnpackListsel(i, Bruecken));
+ np = strsplit(klemme, line, ' ');
+ for (k = 1; k < np; k++) { // alle Klemmen pro Brücke
+ DoCmd += "change display off;\n";
+ DoCmd += "attribute " + pname + " " + klemme[k-1] + "2 " + "'" + klemme[k] + "';\n";
+ }
+ for (k = np - 2; k >= 0; k--) { // alle Klemmen pro Brücke
+ DoCmd += "change display off;\n";
+ DoCmd += "attribute " + pname + " " + klemme[k+1] + "1 " + "'" + klemme[k] + "';\n";
+ }
+ i++;
+ }
+ LogCmd += DoCmd;
+ LogCmd += "---------------------------------------------------------------------------------------------\n";
+
+ output(errorfile, "wtD") printf("%s", LogCmd);
+ output(scrfile, "wtD") printf("%s", DoCmd);
+ ListCmd = MakeList();
+ output(listfile, "wt") printf("%s", ListCmd);
+
+ exit (DoCmd);
+// schematic(SCH) brkfile = filesetext(SCH.name, ".brk");
+// string FileName = dlgFileSave("Speichere Brückenliste", brkfile);
+// if (FileName) {
+// string a[];
+// output(FileName, "wtF") {
+// printf ("%s\n", ListHeaderMain);
+// while (listall[i]) {
+// printf("%s\n", listall[i]); // "%s" um Probleme zu vermeiden, wenn listall '%' enthält
+// i++;
+// }
+// }
+// }
+}
+
+void ShowHelp(void) {
+ dlgDialog("Hilfe") {
+ dlgHBoxLayout dlgSpacing(600);
+ dlgHBoxLayout{
+ dlgVBoxLayout dlgSpacing(600);
+ dlgTextView(HelpText);
+ }
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+OK") dlgAccept();
+ }
+ };
+}
+
+//*****************************************************
+void ShowUserInterface(void) {
+dlgDialog("Brückenklemmen verwalten - " + Version) {
+ dlgHBoxLayout dlgSpacing(300);
+ dlgGroup("") {
+ dlgLabel("Vorhandene Klemmenblöcke");
+ dlgListView(ListHeaderMain, listall, SelAll, SortAll) MakeEditListOnePart(SelAll);
+ dlgSpacing(10);
+ }
+ dlgGroup("") {
+ dlgHBoxLayout {
+ dlgLabel(CurrentPart, 1) ;
+ dlgLabel(": Brücken dieses Klemmenblocks editieren");
+ dlgStretch(1);
+ }
+ dlgListView(ListHeader, listsel, SelConnected, Sort) EditOneEntry(SelConnected);
+ dlgHBoxLayout {
+ dlgLabel("Verbinden");
+ dlgStringEdit(ChangeString);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("Undo") PullUndo();
+ dlgStretch(1);
+ dlgPushButton("Unbenutzte") ChangeString = GetUnused(SelConnected);
+ dlgPushButton("Löschen") DelOneEntry(SelConnected);
+ dlgPushButton("Neu") CreateBridge();
+ dlgPushButton("+Anwenden") TransferEditLine(SelConnected);
+ }
+ }
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgPushButton("&Hilfe") ShowHelp();
+ dlgStretch(1);
+ dlgPushButton("Log-Datei") ShowLog();
+ dlgPushButton("-Abbrechen") dlgReject(); // if (CancelOk()) dlgReject();
+ dlgPushButton("Speichern") SaveList();
+ }
+ };
+}
+//***************** Main ******************************
+SetFileNames();
+NrHeader = strsplit(head, ListHeader, '\t');
+CollectX();
+GetConnectedAllParts();
+WriteAttributeLog();
+output(errorfile, "wtD") printf("%s", LogCmd);
+ShowUserInterface();
+
diff --git a/eagle-5.7.0/ulp/e-klemmenplan.ulp b/eagle-5.7.0/ulp/e-klemmenplan.ulp
new file mode 100644
index 0000000..941e90f
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-klemmenplan.ulp
@@ -0,0 +1,1113 @@
+// Klemmenplan/Kabelplan/Brückenplan für Elektro-Projekte
+
+// todo
+// Prüfen ob Netz auf Pin und nicht angeschlossen (pindatabase)
+// x-Verbindungen nach Namen sortieren
+
+string Version = "Version 1.03";
+
+// History
+// 1.03 -- 2009-10-01
+// nicht benötigte "\t\t" im Titel von dlgDialog() entfernt
+//
+// 1.02
+// Verbindungen von Netzen mit mehr als zwei Kontakten werden jetzt in anderer Reihenfolge
+// erstellt (siehe Help)
+//
+// Ist auf einer Seite keine Klemme (Prefix X) vorhanden, werden alle Verbindungen als d
+// (Drahtverbindung) gekennzeichnet
+//
+// 1.01 Keine Fehlermeldung mehr, wenn Packages Smds enthalten
+
+#require 4.9206
+
+#usage "Erstellen eines Klemmenplans\n "
+
+"Mit diesem ULP erstellen Sie einen Klemmenplan, der alle Zweipunktverbindungen "
+"der geladenen Schaltung enthält, also Verbindungen im Schaltschrank, die "
+"üblicherweise mit Drähten realisert werden, und externe, die mit Kabeln "
+"realisiert werden. Interne, externe und Brücken-Verbindungen erscheinen nacheinander in der Liste. "
+"Das Programm sollte erst dann verwendet werden, wenn die "
+"Schaltung nicht mehr oder nur noch geringfügig verändert wird. "
+"Die erzeugte Liste (schaltungsname.vbd) kann in einem Tabellenkalkulationsprogramm "
+"weiter verarbeitet oder mit Hilfe von e-makelist.ulp direkt in die "
+"Schaltungszeichnung importiert werden. "
+" "
+
+"Mit diesem ULP erstellen Sie einen Klemmenplan, der alle Zweipunktverbindungen "
+"der geladenen Schaltung enthält, also Verbindungen im Schaltschrank, die "
+"üblicherweise mit Drähten realisert werden, und externe, die mit Kabeln "
+"realisiert werden. Das Programm sollte erst dann verwendet werden, wenn die "
+"Schaltung nicht mehr oder nur noch geringfügig verändert wird. "
+
+"Die obere Liste (Verbindungsliste) enthält immer alle Verbindungen mit diversen "
+"Parametern. Sie wird abgespeichert, wenn Sie den Button Speichern "
+"anklicken. Der Benutzer hat die Aufgabe, jeder Verbindung die passenden "
+"Parameter (Farbe, Kabeltyp etc.) zuzuordnen. Dabei unterstützt ihn dieses "
+"ULP. "
+"Die erzeugte Liste (schaltungsname.vbd) kann in einem Tabellenkalkulationsprogramm "
+"weiter verarbeitet oder mit Hilfe von e-makelist.ulp direkt in die "
+"Schaltungszeichnung importiert werden. "
+
+"Regeln für das Zeichnen von Mehrfachverbindungen "
+
+"Sind mehr als zwei Klemmen im Schaltplan miteinander verbunden, dann gelten folgende Regeln: "
+"Die Klemmen werden der Reihe nach von oben nach unten und von links nach rechts verbunden. "
+"Das heißt, wenn sich auf diese Weise eine Reihenfolge der Klemmen von A, B, C, D ergibt, "
+"dann entstehen die Drahtverbindungen A-B, B-C, C-D. Die Art, wie die Netzlinien gezeichnet sind, "
+"spielt dabei keine Rolle. Sollen die Einzelverbindungen auf andere Art realisiert werden, "
+"etwa A-C, C-B, B-D, dann müssen die Klemmen im Schaltplan entsprechend platziert werden. "
+"Erstreckt sich ein Netz über mehrere Seiten, dann wird die Klemme rechts unten mit der "
+"Klemme rechts oben auf der Folgeseite verbunden. "
+
+"Bedeutung der Spalten "
+
+"Die Spalten der beiden dargestellen Listen haben folgende Bedeutung: "
+
+"Nummer: Laufende Nummer, die vom Programm automatisch erzeugt wird. "
+"Von/Nach: 1.A1 bedeutet, die Verbindung startet/endet auf Seite 1, "
+"Rahmenkoordinaten A1. "
+"Quelle/Ziel: F1 1 bedeutet, die Verbindung beginnt/endet an Bauteil F1, Kontakt 1. "
+"Art: "
+
+"Das Programm kennzeichnet alle Verbindungen als extern, die auf einer Seite "
+"unterhalb der untersten Klemme (Präfix X..) beginnen. "
+
+"Die Spalteneinträge bis Art werden vom Programm automatisch erzeugt. Die "
+"Spalten rechts davon trägt der Benutzer ein. Art kann ebenfalls verändert werden, "
+"dieser Parameter ist dafür verantwortlich, wo die Verbindung in der Ausgabeliste "
+"erscheint (wenn das Feld leer ist, wird die Zeile nicht ausgegeben). "
+
+"Bedienung des Programms "
+
+"In die untere Liste (Auswahlliste) holen Sie eine Gruppe von Verbindungen, die "
+"gemeinsame Parameter erhalten sollen, abhängig davon, welche Auswahl-Parameter "
+"eingetragen sind (Button Holen). Danach setzen sie für die ganze Gruppe "
+"die Werte, die Sie unter Parameter ändern eingetragen haben (Button "
+"Alle eintragen oder Alle außer leere). Dann übertragen Sie die "
+"Parameter in die obere Liste mit dem Button Anwenden. "
+"Sie können die Parameter der selektierten Auswahllisten-Zeile auch in einem "
+"separaten Fenster editieren, das sich nach einem Doppelklick auf diese Zeile öffnet. "
+
+"Beispiel: Es sollen alle Bauteile als Farbe rot erhalten, die mit F "
+"beginnen. "
+"Löschen Sie zunächst die Auswahlliste mit dem Button Alle löschen. "
+"Klicken Sie dann Alle * an, damit das Wildcard-Zeichen * in alle "
+"Suchfelder eingetragen wird. In die Felder kann ein sogenannter Wildcard-Text "
+"eingegeben werden, bei dem das Zeichen * beliebige Zeichen ersetzt. Ein Stern "
+"bedeuted, es spielt keine Rolle, wie der Eintrag lautet. "
+"Jetzt tippen Sie in das Feld Quelle/Ziel der Gruppe Auswahl-Parameter F* ein und "
+"klicken dann auf Holen. Alle F..-Bauteile erscheinen jetzt in der "
+"unteren Liste. "
+"Tragen Sie jetzt rot im Feld Farbe des Blocks Parameter "
+"ändern ein, und klicken Sie auf den Button Anwenden. Die Parameter "
+"werden dann in die obere Liste übertragen. "
+
+"Bedeutung der Buttons "
+
+"Undo oben: Die letzte Veränderung der Verbindungsliste wird "
+"rückgängig gemacht (nur ein Schritt möglich). "
+
+"Nach oben/Nach unten: Die in der Verbindungsliste selektierte Zeile wird nach "
+"oben oder unten verschoben. Damit ändert sich die laufende Nummer der Zeile. Auf "
+"diese Weise lässt sich die Ausgabereihenfolge verändern. "
+
+"Quelle - Ziel: Quelle und Ziel des selektierten Eintrags in der "
+"Verbindungsliste werden vertauscht. "
+
+"Undo unten: Die letzte Veränderung der Auswahlliste wird "
+"rückgängig gemacht (nur ein Schritt möglich). "
+
+"Eintrag löschen: Die in der Auswahlliste selektierte Zeile wird gelöscht. "
+
+"Alle löschen: Alle Zeilen der Auswahlliste werden gelöscht. "
+
+"Anwenden: Die Parameter der Auswahlliste werden in die entsprechenden "
+"Verbindungen der Verbindungsliste eingetragen: Dabei werden die bisherigen "
+"Parameter (einschließlich leere Felder) überschrieben. "
+
+"Löschen: Alle Felder der Blöcke Auswahl-Parameter und Parameter "
+"ändern werden gelöscht. "
+
+"Alle *: Setze alle Suchfelder auf das Wildcard-Zeichen *. Es sind auch Muster "
+"wie *F* oder *F*1* erlaubt. "
+
+"Holen: Hole alle Verbindungen, bei denen die eingetragenen Suchparameter "
+"zutreffen. Die Felder untereinander sind UND-Verknüpft, das heißt nur wenn bei "
+"allen Feldern ein entsprechender Eintrag in der Verbindungsliste gefunden wird, "
+"wird die Verbindung in die Auswahlliste geholt. Wenn Sie etwa alle Verbindungen "
+"auf Seite 1 mit der Farbe rot holen wollen, dann tragen Sie in Von/Nach "
+"1.* ein und in das Feld Farbe rot. Alle anderen Felder enthalten *. "
+
+"Alle eintragen: Die in den Feldern eingetragenen Parameter werden in alle "
+"Verbindungen der Auswahlliste eingetragen (auch leere Felder). "
+
+"Alle außer leere: Die in den Feldern eingetragenen Parameter werden in alle "
+"Verbindungen der Auswahlliste eingetragen. Ist ein Feld im Block Parameter "
+"ändern leer, dann wird das entsprechende Feld in der Auswahlliste nicht "
+"verändert. "
+
+"Fehlerliste: Zeigt eine Liste mit möglichen Fehlern in der Schaltung. "
+
+"Lade ext. Liste: Falls Sie bereits einen Klemmenplan erstellt haben und "
+"anschließend nur noch geringfügige Änderungen durchgeführt wurden (Namen der "
+"Bauteile im Wesentlichen gleich), dann starten Sie das ULP und klicken als "
+"erstes auf diesen Button, damit die bisherigen Parameter in die Verbindungsliste "
+"übernommen werden. Verbindungen, die aufgrund von Schaltungsänderungen nicht "
+"zugeordnet werden können, erscheinen in der Auswahlliste. "
+
+"Abbrechen: Programm ohne Abspeichern des Klemmenplans verlassen. Achtung, Sie "
+"verlieren alle Änderungen am Klemmenplan. "
+
+"Speichern: Abspeichern des Klemmenplans. "
+
+"Ausgabe "
+
+"In der vorliegenden Version wird eine tabulatorseparierte Liste ausgegeben, "
+"die Sie entweder in einem Texteditor (mit passend gesetzten Tabulatorwerten) "
+"oder z. B. mit Excel oder OpenOffice weiterverarbeiten können. "
+
+"Verändern der Spaltenüberschriften "
+
+"Wenn Sie die Spaltenüberschriften an eigene Bedürfnisse anpassen wollen, "
+"verändern Sie im Programm die Zeile: "
+
+"\"Nummer\\tVon\\tQuelle\\tZiel\\tNach\\tArt\\tBrücke\\tFarbe\\tQuerschnitt\\tKabeltyp\\tFunktion\"; "
+
+"Sie können zwischen den Tabulatorzeichen (\\t) die Texte verändern oder neue "
+"Texte hizufügen, z.B.: "
+
+"\"...\\tFunktion\\tBeschreibung\"; "
+
+"Achtung: Die Bedeutung der Spalten von Nummer bis Art bleibt "
+"unverändert! "
+;
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SetFileNames(void) { // in Schematic-Kontext aufrufen
+
+ if (!schematic) {
+ // dlgMessageBox("Dieses Programm muss vom Schaltplan-Editor aus aufgerufen werden");
+ exit(1);
+ }
+ schematic(SCH) {
+ tmpfile = filesetext(SCH.name, ".$$$");
+ listfile = filesetext(SCH.name, ".kp$");
+ errorfile = filesetext(SCH.name, ".log");
+ pinfile = filesetext(SCH.name, ".pi$");
+ vbdfile = filesetext(SCH.name, ".vbd");
+ klpfile = filesetext(SCH.name, ".klp");
+ kapfile = filesetext(SCH.name, ".kap");
+ brpfile = filesetext(SCH.name, ".brp");
+ }
+}
+
+string StripWhiteSpace(string s) { // mit Zusatz: Doppel-Whitespaces im Inneren werden 1 Whitespace
+ int i, n;
+ string t;
+
+ while (s && isspace(s[0]))
+ s = strsub(s, 1);
+ while (s && isspace(s[strlen(s) - 1]))
+ s = strsub(s, 0, strlen(s) - 1);
+// Doppel-Blanks
+ for (i = 0; i < strlen(s); i++) {
+ if (!isspace(s[i])) t[n++] = s[i];
+ else {
+ if ((strlen(s) > i+1) && isspace(s[i+1]));
+ else t[n++] = s[i];
+ };
+ }
+ s = t;
+
+ return s;
+}
+
+void ErrorMessage(string PartPin, string msg) {
+ string s, sh, col, row;
+ sh = lookup(pindatabase, PartPin, "Sheet", '\t');
+ col = lookup(pindatabase, PartPin, "Column", '\t');
+ row = lookup(pindatabase, PartPin, "Row", '\t');
+ sprintf(s, "S. %s/%s-%s \tKontakt %s: \t%s", sh, row, col, PartPin, msg);
+ ErrCmd += s + "\n";
+}
+
+/////////////////////////////////////////
+// pindatabase anlegen
+//
+// ermittle Zahl der Wires, die von Pin bzw. x,y aus starten
+int NrOfWiresFromPin(string net, int shnr, int x, int y) {
+ string s;
+ int n;
+ schematic(SCH) {
+ SCH.sheets(SH) {
+ if (SH.number == shnr) {
+ SH.nets(N) {
+ if (N.name == net) {
+ N.segments(SEG) {
+ SEG.wires(W) {
+ if (x == W.x1 && y == W.y1 || x == W.x2 && y == W.y2) { // Wire beginnt an x, y
+ n++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (net && !n) n = 1; // wenn Pin auf Pin, net vorhanden, deshalb n auf 1
+ return n;
+}
+
+// ermittle Zahl der Wires, die nach dem ersten Wire-Segment vom Pin aus starten
+// Wire vom Pin weg wird mitgezählt
+int NrOfWiresAfterPin(string net, int shnr, int x, int y) {
+ string s;
+ int n, n1, u;
+ schematic(SCH) {
+ SCH.sheets(SH) {
+ if (SH.number == shnr) {
+ SH.nets(N) {
+ if (N.name == net) {
+ N.segments(SEG) {
+ n1 = 0;
+ SEG.wires(W) {
+ if (x == W.x1 && y == W.y1 || x == W.x2 && y == W.y2) { // suche ersten Wire
+ if (x == W.x1 && y == W.y1) { // stelle Endkoordinaten des Wires fest
+ x = W.x2; y = W.y2;
+ }
+ else {
+ x = W.x1; y = W.y1;
+ }
+ if (y == W.y1 || y == W.y2) { // Wire-Anfang zweigt nach erstem Wire-Segment über/unter Pin ab
+ n1 = NrOfWiresFromPin(net, shnr, x, y); // x, y nach erstem Wire-Stück
+ distY = y; // global, Distanz des Abzweigs in vertikaler Richtung
+ if (n1) break;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return n1;
+}
+
+void SetupPinDatabase(void) {
+ string s, cmd, pname;
+ int np, nw;
+ schematic(SCH) {
+ cmd = "PartContact\tNet\tSheet\tRow\tColumn\tx\ty\tNP\tNW\tdistY\n";
+ SCH.sheets(SH) { // # Wires ab Pin
+ SH.parts(PRT) { // # Wires nach erstem Wire
+ PRT.instances (I) { // Abstand des Abzweigs vertikal
+ I.gate.symbol.pins(P) {
+ if (P.contact) {
+ pname = P.contact.name;
+ }
+ else {
+ pname = P.name;
+ }
+ np = NrOfWiresFromPin(P.net, SH.number, P.x, P.y); nw = NrOfWiresAfterPin(P.net, SH.number, P.x, P.y);
+ sprintf(s, "%s%s%s\t%s\t%d\t%s\t%s\t%d\t%d\t", PRT.name, PartPinSep, pname, P.net, SH.number, I.row, I.column, P.x, P.y); cmd += s;
+ sprintf(s, "\t%d\t%d\t%d\n", np, nw, distY); cmd += s;
+ // Hier lassen sich alle Pin-Parameter prüfen
+ if (nw > 3 || np > 2) {
+ sprintf(s, "S. %d/%s-%s \tKontakt %s %s: \tMehr als zwei Abzweigungen vom Kontakt!", SH.number, I.row, I.column, PRT.name, pname);
+ ErrCmd += s + "\n";
+ }
+ // todo: Prüfen, ob ein nicht angeschlossenes Netz auf dem Pin liegt
+ }
+ }
+ }
+ }
+ }
+ strsplit(pindatabase, cmd, '\n');
+ output(pinfile, "wtD") {
+ printf(cmd);
+ }
+}
+//ende pindatabase /////////////////////////////////
+
+void ReadConnects(void) {
+ int i, n, x[], y[], index[], loopcnt;
+ numeric string Part_Pin[];
+ schematic(SCH) {
+ SCH.nets(NET) {
+ loopcnt = 0;
+ SCH.sheets(SH) {
+ SH.nets(N) {
+ if (NET.name == N.name) {
+ loopcnt++;
+ if (loopcnt == 1) {
+ cmd += "\n";
+ }
+ n = 0;
+ N.segments(SEG) {
+ SEG.pinrefs(P) {
+ if (P.pin.contact) {
+ Part_Pin[n] = P.part.name + "\t" + P.pin.contact.name;
+ }
+ else {
+ Part_Pin[n] = P.part.name + "\t" + P.pin.name;
+ }
+ x[n] = P.pin.x; y[n] = INT_MAX - P.pin.y; // scanne Klemmen von oben nach unten
+ ++n;
+ }
+ }
+ sort(n, index, x, y, Part_Pin); // sortiere PartPin innerhalb eines Segments nach Position
+ // scanne Klemmen: erst alle y auf x = 0 etc.
+ for (int i = 0; i < n; ++i) {
+ sprintf(s, "%s\t", Part_Pin[index[i]]); cmd += s;
+ }
+ }
+ }
+ }
+ }
+ }
+ output(tmpfile, "wtD") {
+ printf(cmd);
+ }
+}
+
+// Ermittle y-Wert für Trennung zwischen interner und externer Verdrahtung
+// Hier: Klemme mit niedrigstem y pro Sheet
+void GetYReference(void) { // YRef[] liefert: #sheets, yref-sh1, yref-sh2 ..
+ int sn, ymin, klemme_exists;
+ schematic(S) {
+ S.sheets(SH) {
+ sn++;
+ ymin = INT_MAX;
+ klemme_exists = 0;
+ SH.parts(P) {
+ P.instances(I) {
+ if (strchr(I.name, 'X') == 0) { // Alle, die mit X beginnen
+ ymin = min(ymin, I.y); // sprintf(s, "%s: %d\n", I.name, ymin); ErrCmd += s;
+ klemme_exists = 1;
+ }
+ }
+ }
+ YRef[SH.number] = ymin; // sprintf(s, " %d: %d\n", SH.number, YRef[SH.number]); ErrCmd += s;
+ if (klemme_exists == 0) {
+ YRef[SH.number] = 0;
+ }
+ }
+ YRef[0] = sn;
+ }
+}
+
+string AssembleNetLine(string line){
+ int i, j, n, npar, snr;
+ string s, st, lxy, rxy;
+ string ps[]; // Einzelparameter, Source
+ string pair[]; // Name-Pin-Paar mit Blank
+ string x[];
+ string y[];
+ string distY[];// Distanz der Abzweigung vom Pin
+ string np[]; // # Wires ab Pin
+ string nw[]; // # Wires ab erstem Wire-Segment nach Pin
+ string Sep = "\t";
+ string net[];
+ string sht[];
+ string row[];
+ string col[];
+
+ npar = strsplit(ps, line, '\t');
+ for (j = 0; j < npar/2;) { // Zusammenfassen von Part und Pin mit Blank
+ pair[j++] = ps[n++] + " " + ps[n++];
+ }
+ n = 0;
+ while (pair[n]) { // Sammeln der Pin-Informationen
+// np[n] = lookup(pindatabase, PartPin, "NP", '\t');
+ x[n] = lookup(pindatabase, pair[n], "x", '\t');
+ y[n] = lookup(pindatabase, pair[n], "y", '\t');
+ net[n] = lookup(pindatabase, pair[n], "Net", '\t');
+ sht[n] = lookup(pindatabase, pair[n], "Sheet", '\t');
+ row[n] = lookup(pindatabase, pair[n], "Row", '\t');
+ col[n] = lookup(pindatabase, pair[n], "Column", '\t');
+ if (!sht[n]) {
+ sht[n] = "?";
+ col[n] = "?";
+ row[n] = "?";
+ }
+ n++;
+ }
+ if (npar <= 2) {
+ ErrorMessage(pair[0], "Netz nicht abgeschlossen!");
+ return "";
+ }
+
+ netnr++;
+ sprintf (lxy, "%08d %08d", strtol(x[0]), strtol(y[0]));
+ sprintf (rxy, "%08d %08d", strtol(x[1]), strtol(y[1]));
+
+ // Art voranstellen
+ snr = min (strtol(sht[0]), strtol(sht[1])); // Sheetnr
+ if (strtol(y[0]) <= YRef[snr] && strtol(y[1]) > YRef[snr]) ErrorMessage(pair[0], "Verbindung nicht eindeutig (intern oder extern?)");
+ if (strtol(y[0]) > YRef[snr]) s = "d\t";
+ if (strtol(y[0]) <= YRef[snr]) s = "k\t";
+ if (strsub(pair[0], 0, 1) == "X" && ps[0] == ps[2]) s = "x\t";
+ st += s;
+
+ if ((lxy > rxy && strtol(sht[0]) == strtol(sht[1])) || (strtol(sht[0]) > strtol(sht[1]))) { // Reihenfolge Quelle-Ziel etc. tauschen
+ sprintf(s, "%03d%s", strtol(sht[1]), Sep); st+= s;
+ sprintf(s, "%08d %08d%s%08d %08d%s", strtol(x[1]), strtol(y[1]), Sep, strtol(x[0]), strtol(y[0]), Sep); st += s;
+ sprintf(s, "%d%s%s%s%s.%s%s%s", netnr, Sep, net[1], Sep, sht[1], row[1], col[1], Sep); st += s + pair[1] + Sep + pair[0];
+ sprintf(s, "%s%s.%s%s", Sep, sht[0], row[0], col[0]); st += s;
+ }
+ else {
+ sprintf(s, "%03d%s", strtol(sht[0]), Sep); st+= s;
+ sprintf(s, "%08d %08d%s%08d %08d%s", strtol(x[0]), strtol(y[0]), Sep, strtol(x[1]), strtol(y[1]), Sep); st += s;
+ sprintf(s, "%d%s%s%s%s.%s%s%s", netnr, Sep, net[0], Sep, sht[0], row[0], col[0], Sep); st += s + pair[0] + Sep + pair[1];
+ sprintf(s, "%s%s.%s%s", Sep, sht[1], row[1], col[1]); st += s;
+ }
+
+ st += "\n";
+ if (npar <= 4) return st; // nur Zweipunktverbindung
+ if (npar > 4) { // jeden mit dem Nachbarn verbinden (gleiches y hat Vorrang)
+ n = 2;
+ while (pair[n]) {
+ netnr++;
+ sprintf (lxy, "%08d %08d", strtol(x[n-1]), strtol(y[n-1]));
+ sprintf (rxy, "%08d %08d", strtol(x[n]), strtol(y[n]));
+
+ // Art voranstellen
+ snr = min (strtol(sht[n-1]), strtol(sht[n])); // Sheetnr
+ if (strtol(y[n-1]) <= YRef[snr] && strtol(y[n]) > YRef[snr]) ErrorMessage(pair[n-1], "Verbindung nicht eindeutig (intern oder extern?)");
+ if (strtol(y[n-1]) > YRef[snr]) s = "d\t";
+ if (strtol(y[n-1]) <= YRef[snr]) s = "k\t";
+ if (strsub(pair[n-1], 0, 1) == "X" && ps[(n-1)*2] == ps[n*2]) s = "x\t";
+ st += s;
+
+ if ((lxy > rxy && strtol(sht[n-1]) == strtol(sht[n])) || (strtol(sht[n-1]) > strtol(sht[n]))) {
+ sprintf(s, "%03d%s", strtol(sht[n]), Sep); st+= s;
+ sprintf(s, "%08d %08d%s%08d %08d%s", strtol(x[n]), strtol(y[n]), Sep, strtol(x[n-1]), strtol(y[n-1]), Sep); st += s;
+ sprintf(s, "%d%s%s%s%s.%s%s%s", netnr, Sep, net[n], Sep, sht[n], row[n], col[n], Sep); st += s + pair[n] + Sep + pair[n-1];
+ sprintf(s, "%s%s.%s%s", Sep, sht[n-1], row[n-1], col[n-1]); st += s;
+ }
+ else {
+ sprintf(s, "%03d%s", strtol(sht[n-1]), Sep); st+= s;
+ sprintf(s, "%08d %08d%s%08d %08d%s", strtol(x[n-1]), strtol(y[n-1]), Sep, strtol(x[n]), strtol(y[n]), Sep); st += s;
+ sprintf(s, "%d%s%s%s%s.%s%s%s", netnr, Sep, net[n-1], Sep, sht[n-1], row[n-1], col[n-1], Sep); st += s + pair[n-1] + Sep + pair[n];
+ sprintf(s, "%s%s.%s%s", Sep, sht[n], row[n], col[n]); st += s;
+ }
+ st += "\n";
+ n++;
+ }
+ }
+ return st;
+}
+
+// Verbindungsliste aufbereiten
+void ChangeList(void) {
+ int i, j, nl, np;
+ numeric string a[], c[], s, sh;
+ GetYReference(); // YRef[sheet] enthält y von unterstem Klemmenkontakt
+
+ nl = fileread(a, tmpfile);
+ // sort(n, a);
+ output(tmpfile, "wtD") { // leere Zeilen entfernen
+ for (i = 0; i < nl; i++) {
+ if (a[i]) printf("%s\n",a[i]);
+ }
+ }
+ nl = fileread(a, tmpfile);
+ if (nl > 0) {
+ output(listfile, "wtD") { // sheetnr \t x y \t x y \t Nummer \t Netz \t Von ..
+ for (i = 0; i < nl; i++) {
+ a[i] = StripWhiteSpace(a[i]); // a[] enthält urspr. Connect-Zeilen
+ b[i] = a[i]; // b[] enthält Zeilen eines Signals und wird verändert (global)
+ b[i] = AssembleNetLine(b[i]);
+ if (b[i]) printf("%s", b[i]); // b[0..nl] -> alle Zeilen eines Signals geordnet nach Pos.
+ }
+ }
+ }
+ nl = fileread(a, listfile); // sortieren nach sheetnr und erstem x y \t xy
+ sort(nl, a);
+ output(listfile, "wtD") {
+ for (i = 0; i < nl; i++) {
+ strsplit(c, a[i], '\t');
+ printf("%d\t%s\t%s\t%s\t%s\t%s\n", i + 1, c[6], c[7], c[8], c[9], c[0]);
+// printf("%s\n", a[i]);
+ }
+ }
+}
+
+//************** von Main benutzt **********************
+
+void PushUndo(void) {
+ int i;
+ while (listundo[i]) {
+ listundo[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listsel[i]) {
+ listundo[i] = listsel[i];
+ i++;
+ }
+}
+
+void PullUndo(void) {
+ int i;
+ while (listsel[i]) {
+ listsel[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listundo[i]) {
+ listsel[i] = listundo[i];
+ i++;
+ }
+}
+
+void PushUndoOben(void) {
+ int i;
+ while (listundoOben[i]) {
+ listundoOben[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listall[i]) {
+ listundoOben[i] = listall[i];
+ i++;
+ }
+}
+
+void PullUndoOben(void) {
+ int i;
+ while (listundoOben[i]) {
+ i++;
+ }
+ if (i == 0) return; // wenn alte Liste leer (nach dem Start)
+ i = 0;
+ while (listall[i]) {
+ listall[i] = "";
+ i++;
+ }
+ i = 0;
+ while (listundoOben[i]) {
+ listall[i] = listundoOben[i];
+ i++;
+ }
+}
+
+// Lies rohe Verbindungsliste
+void ReadList(void) {
+ int i, j, np;
+ numeric string h[];
+ NrLinesListAll = fileread(listall, listfile) -1;
+ for (i = 0; i < NrLinesListAll; i++) {
+ while (strsplit(h, listall[i], '\t') < NrHeader) listall[i] += "\t";
+ listsel[i] = listall[i]; // erst, Auswahliste füllen, damit Listen gleich formatiert werden
+ }
+}
+
+void ShowErrorList(void) {
+ dlgDialog("Fehlerliste") {
+ dlgHBoxLayout dlgSpacing(600);
+ dlgHBoxLayout{
+ dlgTextEdit(ErrCmd);
+ }
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&Hilfe") dlgMessageBox( "Überprüfen Sie die in der Liste aufgeführten Kontakte!\n"
+ "Sie können die Fehlerliste auch editieren und mit Cut&Paste \n"
+ "zu einem Texteditor übertragen."
+ );
+ dlgPushButton("+OK") dlgAccept();
+ }
+ };
+}
+
+// Ãœbertrage eine Verbindung in Auswahlliste, wenn noch nicht vorhanden
+void TransferOneEntry(int Sel) {
+ int i, n;
+ string h1[], h2[];
+ PushUndo();
+ strsplit(h1, listall[Sel], '\t');
+ while(listsel[i]) {
+ strsplit(h2, listsel[i], '\t');
+ if (h1[Nummer] == h2[Nummer] &&
+ h1[Von] == h2[Von] &&
+ h1[Quelle] == h2[Quelle] &&
+ h1[Ziel] == h2[Ziel] &&
+ h1[Nach] == h2[Nach]
+ )
+ return; // Zeilen identisch -> kein neuer Eintrag (nur feste Felder bis Nach geprüft)
+ i++;
+ }
+ i = 0;
+ while(listsel[i++]) { // finde letzte Zeile
+ }
+ listsel[i-1] = listall[Sel];
+}
+
+// Lösche eine Verbindung aus Auswahlliste
+void DelOneEntry(int Sel) {
+ int i, n, imax;
+ string x[];
+ PushUndo();
+ if (Sel < 0) return;
+ //SelConnection = -1;
+ while(listsel[i++]) {
+ }
+ imax = i;
+ for (i = 0; i < imax; i++) {
+ if (i <= Sel) {
+ x[i] = listsel[i];
+ }
+ else {
+ x[i-1] = listsel[i];
+ }
+ }
+ listsel[imax-1] = ""; listsel[imax] = "";
+ imax = imax -1;
+ for (i = 0; i < imax; i++) {
+ listsel[i] = x[i];
+ }
+}
+
+void SetSelParams(string c) {
+ int i;
+ for (i = 1; i < NrHeader; i++) {
+ SelParam[i] = c; // einige nicht relevant
+ }
+}
+
+void SetChangeParams(string c) {
+ int i;
+ for (i = 1; i < NrHeader; i++) {
+ ChangeParam[i] = c; // einige nicht relevant
+ }
+}
+
+// Suche mit Wildcard *
+int WildMatch(string wild, string st) { // wild = Suchmuster, st = zu durchsuchender Sting
+ int wx, sx, pos;
+ string sw, ss;
+ wild = StripWhiteSpace(wild);
+ st = StripWhiteSpace(st);
+ if (wild == st || wild == "*") return 1;
+ if (!wild && st) return 0;
+ if (strchr(wild, '*') < 0 && strlen(wild) > 0 && st == "") return 0; // wild exist., aber kein *
+ if (strlen(wild) > 0 && st == "") { // wild exist. mit Nicht-*-Zeichen, st = ""
+ pos = 0;
+ sw = wild;
+ while (sw[pos]) { // Zeichen außer * in wild vorhanden -> return 0
+ if (sw[pos] != '*') return 0;
+ pos++;
+ }
+ return 1; // wild ist **...
+ }
+ while (wild[wx] && st[sx]) {
+ while (wild[wx] != '*') { // vgl. bis zum nächsten *
+ if (wild[wx++] != st[sx++]) return 0;
+ if (sx == strlen(st) && !(wx == strlen(wild))) { // Ende von st erreicht aber nicht Ende von wild
+ if (wild[wx] == '*' && !wild[wx+1]) return 1; // nächstes Zeichen von wild ist *, dann Stringende
+ else return 0;
+ }
+ if (wx == strlen(wild) && !(sx == strlen(st))) return 0; // Ende von wild erreicht aber nicht Ende von st
+ if (wx == strlen(wild) && (sx == strlen(st))) return 1; // Ende von wild erreicht aber nicht Ende von st
+ }
+ // jetzt kommt zwingend ein *, wx steht auf Index von *
+ if (wx == strlen(wild) - 1) return 1; // Ende von wild erreicht und *
+ wx++;
+ while (st[sx] != wild[wx] && wild[wx] != '*') { // bis zum Match nach Stern
+ if (sx == strlen(st) -1) return 0; // Ende von st erreicht ohne Match
+ sx++;
+ }
+ }
+ return 1;
+}
+
+// Von Verbindungs- in Auswahlliste
+void TransferMatchingEntries(void) {
+ int iall, i, match1, match2, np;
+ string h[]; // Einzelparameter
+ PushUndo();
+ SelParam[Quelle] = strupr(SelParam[Quelle]);
+ SelParam[Von] = strupr(SelParam[Von]);
+ while (listall[iall]) {
+ match1 = 0;
+ np = strsplit(h, listall[iall], '\t'); // bisherige Einzelpar. in h[]
+ if ((WildMatch(SelParam[Quelle], h[Quelle]) || WildMatch(SelParam[Quelle], h[Ziel])) &&
+ (WildMatch(SelParam[Von], h[Von]) || WildMatch(SelParam[Von], h[Nach]))
+ ) match1 = 1;
+ match2 = 0;
+ for (i = Nach + 1; i < NrHeader; i++) {
+ if (WildMatch(SelParam[i], h[i]) ) {
+ match2 = 1;
+ }
+ else {
+ match2 = 0;
+ break;
+ }
+ }
+ if (match1 && match2) { // nach break
+ TransferOneEntry(iall);
+ }
+ iall++;
+ }
+ SelAll = -1;
+}
+
+// Lösche alle Verbindungen aus Auswahlliste
+void DelAllEntries(void) {
+ int i;
+ PushUndo();
+ while(listsel[i]) {
+ listsel[i] = "";
+ i++;
+ }
+}
+
+void ChangeOneEntry(int Sel) {
+ int i;
+ PushUndo();
+ for (i = Nach + 1; i < NrHeader; i++) {
+ h[i] = ChangeParam[i];
+ }
+ listsel[Sel] = strjoin(h, '\t');
+}
+
+void EditOneEntry(int Sel) {
+ int i, np;
+ np = strsplit(h, listsel[Sel], '\t');
+ for (i = np; i < NrHeader; i++) h[i] = "";
+ dlgDialog("Editiere Verbindungs-Parameter") {
+ for (i = Nach + 1; i < NrHeader; i++) {
+ ChangeParam[i] = h[i];
+ }
+ for (i = Nach + 1; i < NrHeader; i++) {
+ dlgHBoxLayout {
+ dlgLabel(head[i] + "\t");
+ dlgStringEdit(ChangeParam[i]);
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("-Abbrechen") dlgReject();
+ dlgPushButton("+OK") {dlgAccept(); ChangeOneEntry(Sel);}
+ }
+ };
+}
+
+void CopyChangeParams(int all) {
+ int i, j;
+ string h[];
+ PushUndo();
+ while (listsel[j]) {
+ strsplit(h, listsel[j], '\t');
+ for (i = Nach + 1; i < NrHeader; i++) {
+ if (ChangeParam[i] != "" || all)
+ h[i] = ChangeParam[i];
+ }
+ listsel[j] = strjoin(h, '\t');
+ j++;
+ }
+}
+
+void ApplyChanges(void) {
+ int j, k;
+ string ls[], la[];
+ PushUndoOben();
+ while (listall[j]) {
+ strsplit(la, listall[j], '\t'); // bisherige Zeile in la[]
+ k = 0;
+ while (listsel[k]) {
+ strsplit(ls, listsel[k], '\t'); // neue Zeile in ls[]
+ if ((la[Quelle] == ls[Quelle] && la[Ziel] == ls[Ziel]) ||
+ (la[Quelle] == ls[Ziel] && la[Ziel] == ls[Quelle])
+ ) { // Match-Zeile gefunden
+ ls[0] = la[0]; // alte Nummer verwenden
+ listall[j] = strjoin(ls, '\t');
+ }
+ k++;
+ }
+ j++;
+ }
+}
+
+// Übertrage Parameter der externen Liste nach listall und lösche die verwendeten aus listsel
+void ApplyChangesOldList(void) {
+ int j, k;
+ string ls[], la[];
+ while (listall[j]) {
+ strsplit(la, listall[j], '\t'); // bisherige Zeile in la[]
+ k = 0;
+ while (listsel[k]) {
+ strsplit(ls, listsel[k], '\t'); // neue Zeile in ls[]
+ if ((la[Quelle] == ls[Quelle] && la[Ziel] == ls[Ziel]) ||
+ (la[Quelle] == ls[Ziel] && la[Ziel] == ls[Quelle])
+ ) { // Match-Zeile gefunden
+ ls[0] = la[0]; // alte Nummer verwenden
+ listall[j] = strjoin(ls, '\t');
+ DelOneEntry(k);
+ break;
+ }
+ k++;
+ }
+ j++;
+ }
+}
+
+int LoadOldListOk(void) {
+ int LoadOk;
+ dlgDialog("Verbindungsliste laden") {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgTextView ( "Achtung, wenn Sie eine vorhandene Verbindungsliste laden, "
+ "werden alle bisher definierten Parameter der Verbindungen "
+ "überschrieben, die in der aktuellen und der gespeicherten "
+ "Liste vorhanden sind!\n\n"
+ "Nicht gefundene Verbindungen sind im Auswahlfenster aufgelistet.\n\n"
+ );
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+Abbrechen") dlgReject();
+ dlgPushButton("-Weiter") {LoadOk = 1; dlgAccept();}
+ }
+ };
+ if (LoadOk) return 1;
+ else return 0;
+}
+
+int CancelOk(void) {
+ int CancelOk;
+ dlgDialog("Programm verlassen") {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgTextView ( "Wenn Sie das Programm abbrechen, verlieren Sie alle veränderten Parametereinträge!\n\n"
+ "Abbrechen?"
+ );
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+Nein") dlgReject();
+ dlgPushButton("-Ja") {CancelOk = 1; dlgAccept();}
+ }
+ };
+ if (CancelOk) return 1;
+ else return 0;
+}
+
+
+void ApplyOldList(void) {
+ int NrLines;
+ string FileName = dlgFileOpen("Verbindungsliste/Klemmenplan/Kabelplan/Brückenplan wählen", vbdfile, "Klemmenplan-Dateien (*.vbd);;Alle Dateien (*)");
+ if (FileName) {
+ PushUndo();
+ PushUndoOben();
+ DelAllEntries();
+ NrLines = fileread(listsel, FileName);
+ DelOneEntry(0); // Header löschen
+ ApplyChangesOldList();
+ }
+}
+
+void SaveList(void) {
+ int i;
+ schematic(SCH) vbdfile = filesetext(SCH.name, ".vbd");
+ string FileName = dlgFileSave("Speichere Verbindungsliste", vbdfile);
+ if (FileName) {
+ string a[];
+ output(FileName, "wt") {
+ printf ("%s\n", ListHeader);
+ while (listall[i]) {
+ printf("%s\n", listall[i]); // "%s" um Probleme zu vermeiden, wenn listall '%' enthält
+ i++;
+ }
+ }
+ }
+}
+
+void MoveDown(int Sel) {
+ int i;
+ string hi[], lo[], tmp;
+ if (listall[Sel + 1]) {
+ PushUndoOben();
+ while (listsel[i]) listsel[i++] = "";
+ strsplit(hi, listall[Sel + 1], '\t');
+ strsplit(lo, listall[Sel], '\t');
+ tmp = hi[Nummer]; hi[Nummer] = lo[Nummer]; lo[Nummer] = tmp; // vertausche Rang
+ listall[Sel] = strjoin(hi, '\t');
+ listall[Sel + 1] = strjoin(lo, '\t');
+ SelAll = Sel + 1;
+ }
+}
+
+void MoveUp(int Sel) {
+ int i;
+ string hi[], lo[], tmp;
+ if (Sel > 0) {
+ PushUndoOben();
+ while (listsel[i]) listsel[i++] = "";
+ strsplit(hi, listall[Sel], '\t');
+ strsplit(lo, listall[Sel - 1], '\t');
+ tmp = hi[Nummer]; hi[Nummer] = lo[Nummer]; lo[Nummer] = tmp; // vertausche Rang
+ listall[Sel] = strjoin(lo, '\t');
+ listall[Sel - 1] = strjoin(hi, '\t');
+ SelAll = Sel - 1;
+ }
+}
+
+void ChangeSourceDest (int Sel) {
+ string h[], s;
+ if (Sel < 0) return;
+ PushUndoOben();
+ strsplit(h, listall[Sel], '\t');
+ s = h[Quelle]; h[Quelle] = h[Ziel]; h[Ziel] = s;
+ listall[Sel] = strjoin(h, '\t');
+}
+
+void ShowHelp(void) {
+ dlgDialog("Hilfe") {
+ dlgHBoxLayout dlgSpacing(600);
+ dlgHBoxLayout{
+ dlgVBoxLayout dlgSpacing(600);
+ dlgTextView(HelpText);
+ }
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+OK") dlgAccept();
+ }
+ };
+}
+
+//*****************************************************
+void ShowUserInterface(void) {
+dlgDialog("Klemmenplan/Kabelplan erstellen - " + Version) {
+ dlgHBoxLayout dlgSpacing(800);
+ dlgGroup("") {
+ dlgLabel("Verbindungsliste");
+ dlgListView(ListHeader, listall, SelAll, SortAll) TransferOneEntry(SelAll);
+ dlgSpacing(10);
+ }
+ dlgGroup("") {
+ dlgLabel("Auswahlliste");
+ dlgListView(ListHeader, listsel, SelConnection, Sort) EditOneEntry(SelConnection);
+ dlgHBoxLayout {
+ dlgPushButton("Undo oben") PullUndoOben();
+ dlgPushButton("Nach oben") MoveUp(SelAll);
+ dlgPushButton("Nach unten") MoveDown(SelAll);
+ dlgPushButton("Quelle <-> Ziel") ChangeSourceDest(SelAll);
+ dlgStretch(1);
+ dlgPushButton("Undo unten") PullUndo();
+ dlgPushButton("Eintrag löschen") DelOneEntry(SelConnection);
+ dlgPushButton("Alle löschen") DelAllEntries();
+ dlgPushButton("Anwenden") ApplyChanges();
+ }
+ }
+
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ dlgGroup("Auswahl-Parameter") {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgHBoxLayout {
+ dlgLabel(head[Quelle] + "/" + head[Ziel] + "\t");
+ dlgStringEdit(SelParam[Quelle]);
+ }
+ dlgHBoxLayout {
+ dlgLabel(head[Von] + "/" + head[Nach] + "\t");
+ dlgStringEdit(SelParam[Von]);
+ }
+ dlgGroup("") {
+ }
+ }
+ dlgVBoxLayout {
+ for (i = Nach + 1; i < NrHeader; i++) {
+ dlgHBoxLayout {
+ dlgLabel(head[i] + "\t");
+ dlgStringEdit(SelParam[i]);
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("Löschen") SetSelParams("");
+ dlgPushButton("Alle *") SetSelParams("*");
+ dlgPushButton("Holen") TransferMatchingEntries();
+ }
+ }
+ }
+ }
+ dlgGroup("Parameter ändern") {
+ for (i = Nach + 1; i < NrHeader; i++) {
+ dlgHBoxLayout {
+ dlgLabel(head[i] + "\t");
+ dlgStringEdit(ChangeParam[i]);
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("Löschen") SetChangeParams("");
+ dlgPushButton("Alle eintragen") CopyChangeParams(1);
+ dlgPushButton("Alle außer leere") CopyChangeParams(0);
+ }
+ }
+ }
+
+ dlgHBoxLayout {
+ dlgPushButton("&Hilfe") ShowHelp();
+ dlgStretch(1);
+ dlgPushButton("Fehlerliste") ShowErrorList();
+ dlgPushButton("Lade ext. Liste") if (LoadOldListOk()) ApplyOldList();
+ dlgPushButton("-Abbrechen") if (CancelOk()) dlgReject();
+ dlgPushButton("+Speichern") SaveList();
+ }
+ };
+}
+//***************** Main ******************************
+NrHeader = strsplit(head, ListHeader, '\t');
+SetFileNames();
+SetupPinDatabase();
+ReadConnects();
+ChangeList();
+output(errorfile, "wt") printf(ErrCmd + "\n"); // hier sind alle Listen fertig (*.kp$ ohne Parameter-Einträge
+// Oberfläche
+ReadList();
+ShowUserInterface();
+
diff --git a/eagle-5.7.0/ulp/e-makelist.ulp b/eagle-5.7.0/ulp/e-makelist.ulp
new file mode 100644
index 0000000..e551566
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-makelist.ulp
@@ -0,0 +1,285 @@
+// Generiere Liste als EAGLE-Script
+
+string Version = "Listenausgabe Version 1.0";
+
+#require 4.9206
+
+#usage "Erstellen von Listen auf EAGLE-Schaltplanseiten (nicht mit EAGLE Light)\n "
+
+"Mit diesem ULP erstellen Sie aus den Dateien, die von den Programmen "
+"e-klemmenplan und e-brueckenverwaltung erzeugt wurden, "
+"Listen, die Bestandteil eines Schaltplans sind. "
+
+"Außerdem können Sie mit diesem Programm Schaltplanseiten ab einer "
+"bestimmten Seite bequem löschen. "
+
+" "
+
+"Mit diesem ULP erstellen Sie aus den Dateien, die von den Programmen "
+"e-klemmenplan und e-brueckenverwaltung erzeugt wurden, "
+"Listen, die Bestandteil eines Schaltplans sind. "
+
+"Nach dem Start des Programms wählen Sie, ob Sie eine Liste erstellen "
+"oder eine vorher erstellte Liste ab einer bestimmten Seite löschen wollen. "
+
+"Liste erstellen "
+
+"Wählen Sie eine Datei, die Sie vorher mit den oben genannten Programmen erzeugt haben "
+"(*.brk oder *.vbd). "
+
+"Im Menü links können Sie selektieren, welche Spalten der Datei nicht ausgegeben werden sollen. "
+"Das Programm errechnet den Maximalwert der Textgröße (in mil), damit die Tabelle auf eine "
+"Schaltplanseite passt. "
+"Sie können den Wert innerhalb bestimmter Grenzen im Menü rechts verändern. "
+"Ein Klick auf Liste erzeugen hängt die Liste an den bisherigen Schaltplan an. "
+"Dabei wird auf den neuen Seiten jeweils der Rahmen von Seite 1 des Schaltplans verwendet. "
+"Voraussetzung: er muss am Koordinatennullpunkt platziert sein. "
+
+"Anpassungen an andere Rahmen können Sie direkt im Programm vornehmen (siehe Kommentare). "
+
+"Achtung! Alle Maße in mil (40 mil ist ca. 1 mm) "
+
+"Seiten löschen "
+
+"Tragen Sie in das Textfeld die Seitennummer ein, ab der (inklusive) die restlichen Seiten "
+"des Schaltplans gelöscht werden sollen, und klicken Sie auf Seiten löschen. "
+"Bestätigen Sie dann die Fragen des Programms alle mit Ja, bis alle Seiten gelöscht sind. "
+
+"Die Seitennummer muss 2 oder größer sein. "
+;
+
+void ShowHelp(void) {
+ dlgDialog("Hilfe\t\t\t\t\t") {
+ dlgHBoxLayout dlgSpacing(500);
+ dlgHBoxLayout{
+ dlgVBoxLayout dlgSpacing(600);
+ dlgTextView(HelpText);
+ }
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+OK") dlgAccept();
+ }
+ };
+}
+
+void SetFileNames(void) { // in Schematic-Kontext aufrufen
+ if (!schematic) {
+ exit(1);
+ }
+ schematic(SCH) {
+ FileName = filesetext(SCH.name, fext);
+ FileTmp = filesetext(SCH.name, ".scr");
+ i = 0;
+ SCH.sheets(SH) {
+ i++;
+ }
+ shnr = i + 1;
+ }
+}
+
+void ReadFile(void) {
+ if (FileName != "")
+ NrLines = fileread(lines, FileName);
+}
+
+int GetMaxSize(void) {
+ if (FileName == "") return MaxSize;
+ np = strsplit(head, lines[0], '\t');
+ // Breite der Felder feststellen
+ for (i = 0; i < NrLines; i++) {
+ strsplit(item, lines[i], '\t');
+ linelength = 0; // max # Zeichen
+ for (j = 0; j < np; j++) {
+ maxlen[j] = max(maxlen[j], strlen(item[j]));
+ if (!PrintOff[j]) {
+ linelength += maxlen[j] + fieldmarginchar; // linelength in Zeichen
+ }
+ }
+ }
+ // Höhe zu Breite = 100/85
+ MaxSize = min (180, 11000 * 100 / (linelength * 85)); // max. 180 Mil
+ sprintf(MaxSizeStr, "Zeichengröße/mil (max. %d)\t", MaxSize);
+ return MaxSize;
+}
+
+int GenerateScr(void) {
+ // Header
+ Cmd = ""; ypos = ystart;
+ GetMaxSize();
+ if (size > MaxSize) return 0; // Zeilen zu lang (11050 ist max., aber 50 mil Sicherheit)
+ //Kommandostring erzeugen
+ sprintf(s, "grid mil 100 1;\n"); Cmd += s;
+ sprintf(s, "group (-1 -1) (-1 1) (1 1) (1 -1) (> -1 -1);\ncut (0 0);\n"); Cmd += s;
+ sprintf(s, "display -98;\n"); Cmd += s;
+ sprintf(s, "edit .S%d;\n", shnr); Cmd += s;
+ sprintf(s, "paste (0 0);\nwindow fit;\n"); Cmd += s;
+ sprintf(s, "change layer %d;\n", layer); Cmd += s;
+ sprintf(s, "change font fixed;\n"); Cmd += s;
+ sprintf(s, "change size %d;\n", size); Cmd += s;
+ sprintf(s, "change width %d;\n", width_head); Cmd += s;
+ sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
+ for (i = 0; i < NrLines; i++) {
+ if (ypos > lowmargin + linedist) {
+ ypos -= linedist;
+ }
+ else { // neue Seite
+ ypos = ystart;
+ shnr++;
+ sprintf(s, "edit .S%d;\n", shnr); Cmd += s;
+ sprintf(s, "paste (0 0);\nwindow fit;\n"); Cmd += s;
+ sprintf(s, "change width %d;\n", width_head); Cmd += s;
+ sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
+ ypos -= linedist;
+ sprintf (s, "text '%s' R0 (%d %d);\n", headline, xtextpos, ypos + y_margin); Cmd += s;
+ sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
+ ypos -= linedist;
+ sprintf(s, "change width %d;\n", width); Cmd += s;
+ }
+ strsplit(item, lines[i], '\t');
+ t = "";
+ for (j = 0; j < np; j++) {
+ maxlen[j] = max(maxlen[j], strlen(item[j]));
+ if (!PrintOff[j]) {
+ sprintf (s, "%-*s", maxlen[j]+fieldmarginchar, item[j]); t += s; // t ist Textzeile
+ }
+ }
+ sprintf (s, "text '%s' R0 (%d %d);\n", t, xtextpos, ypos + y_margin); Cmd += s;
+ sprintf(s, "wire (%d %d) (%d %d);\n", xstart, ypos, xright, ypos); Cmd += s;
+ if (i == 0) {
+ headline = t;
+ sprintf(s, "change width %d;\n", width); Cmd += s;
+ }
+ }
+ Cmd += "grid last;\n";
+ return 1;
+}
+
+void OutputScr(string Cmd) {
+ output(FileTmp, "wtD") {
+ printf ("%s", Cmd);
+ }
+ exit("script '" + FileTmp + "';\n");
+}
+
+void DelSheets(int page) {
+ CmdDel = "";
+ if (page == 0) return;
+ schematic(SCH) {
+ SCH.sheets(SH) {
+ if (SH.number >= page) {
+ sprintf(s, "remove .S%d;\n", page);
+ CmdDel += s;
+ }
+ }
+ }
+}
+//--------------------------------------------------------------------------------------
+void GetFileName(void) {
+ dlgDialog("Ausgangsdatei wählen") {
+ dlgHBoxLayout dlgSpacing(+450);
+ dlgTextView("Wählen Sie die Ausgangsdatei für die Listenausgabe, "
+ "normalerweise *.vbd oder *.brk, wie von den Programmen "
+ "e-klemmenplan oder e-brueckenverwaltung erzeugt. "
+ "Oder wählen Sie Seiten löschen, wenn Sie "
+ "Seiten Ihres Schaltplans löschen wollen."
+ );
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&Seiten löschen") {FileName = ""; dlgAccept();}
+ dlgPushButton("+&Liste erzeugen") {
+ FileName = dlgFileOpen("Datei wählen", FileName,
+ "Klemmenplan (*.vbd);;Brückenplan (*.brk);;Alle Dateien (*)");
+ if (FileName != "") dlgAccept();
+ }
+ dlgPushButton("-&Beenden") exit(0);
+ }
+ };
+}
+
+void ShowUserInterface(void) {
+dlgDialog(Version) {
+ dlgHBoxLayout dlgSpacing(100);
+ dlgHBoxLayout {
+ if (FileName != "") {
+ dlgGroup("Nicht drucken") {
+ for (i = 0; i < np; i++) {
+ dlgHBoxLayout {
+ dlgCheckBox(head[i], PrintOff[i]) if (GetMaxSize() < size) size = MaxSize;
+ }
+ }
+ dlgSpacing(10);
+ }
+ }
+
+ dlgGroup("") {
+ if (FileName != "")
+ dlgHBoxLayout {
+ dlgLabel(MaxSizeStr, 1);
+ dlgIntEdit(size, 40, 180);
+ }
+ else
+ dlgHBoxLayout {
+ dlgLabel("Löschen ab Seite\t");
+ dlgIntEdit(delpage, 0, 999);
+ }
+ }
+
+ }
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ }
+ dlgHBoxLayout {
+ dlgPushButton("&Hilfe") ShowHelp();
+ dlgStretch(1);
+ if (FileName == "")
+ dlgPushButton("&Seiten Löschen") if (delpage > 1){DelSheets(delpage); OutputScr(CmdDel);}
+ else dlgMessageBox("Löschen erst ab Seite 2 möglich!", "OK");
+ else
+ dlgPushButton("&Liste erzeugen") if (GenerateScr()) OutputScr(Cmd);
+ else dlgMessageBox("Wert für Textgröße zu hoch!", "OK");
+ dlgPushButton("&Beenden") dlgReject();
+ }
+ };
+}
+
+//--------------------------------------------------------------------------------------
+
+SetFileNames();
+GetFileName();
+ReadFile();
+if (!GenerateScr()) size = MaxSize;
+ShowUserInterface();
diff --git a/eagle-5.7.0/ulp/e-packages-aus-devices-pin-ist-padname.ulp b/eagle-5.7.0/ulp/e-packages-aus-devices-pin-ist-padname.ulp
new file mode 100644
index 0000000..2a105f6
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-packages-aus-devices-pin-ist-padname.ulp
@@ -0,0 +1,78 @@
+#usage "Generiert Dummy-Package für aktuelles Device im Bibliothekseditor\n"
+ " "
+
+ "Für Elektro-Bauteile empfiehlt es sich, dass Symbol-Pins und Package-Pads gleiche "
+ "Namen haben. Dieses Programm erzeugt ein Package mit identischen Pad-/Pin-Namen, "
+ "falls kein Pin-Name doppelt vorkommt. "
+ "Starten Sie das Programm im Bibliothekseditor, sobald Sie ein Device angelegt "
+ "und die Symbole mit dem Add-Befehl geholt haben. Es wird ein Package angelegt, "
+ "dessen Name dem des Device entspricht (falls noch nicht vorhanden) und dessen "
+ "Pads entsprechend den Pins benannt sind. Pins und Pads sind mit dem Connect-Befehl "
+ "verbunden. "
+ " "
+ "It is also possible to edit a DEVice, PACkage, or SYMbol from Schematic or Board directly. "
+ "Example: "
+ "Attention: If the used Library is not available in the given path, see - Options - Directory - Library - in the Control Panel, " +
+ "Vom Schaltplan bzw. Board muss es mit den Optionen Bauteilname Gatename aufgerufen werden. " +
+ "Beispiel: "
+ " "
+ " "
+ " "
+ " "
+ " "
+ " "
+ "Returns the path of the ULP."
+ " "
+ " "
+ " "
+ " "
+ " "
+ "Demonstrates how to use the include file 'useful-routines.ulp'."
+ " "
+ " "
+ " "
+ "This is an example how to loop through all libraries in a directory "
+ "and perform a device check."
+ " "
+ "In this case, the device descriptions are checked for double bold tags. "
+ "An error report error.txt is generated in the library directory."
+ " "
+ "Load any library from the library directory and execute the ULP."
+ " "
+ " "
+ " "
+ " ", " \n", dev[count], descript[count]);
+ cmd += h;
+ }
+
+ L.packages(P) {
+ count++;
+ dev[count] = P.name;
+ descript[count] = replace_string(P.description, " ", " \n", dev[count], descript[count]);
+ cmd += h;
+ }
+
+//define destination path name
+//for a fixed destination, delete next line, uncomment the one after
+//the next line and edit it
+ string dest = dlgFileSave("Save Description File", doc_path+"descript.htm", "*.htm");
+//dest = "c:/eagle/doc/descript.htm";
+
+ output(dest, "wt") {
+ printf(cmd);
+ }
+ }
diff --git a/eagle-5.7.0/ulp/exp-descr-script.ulp b/eagle-5.7.0/ulp/exp-descr-script.ulp
new file mode 100644
index 0000000..442cbc6
--- /dev/null
+++ b/eagle-5.7.0/ulp/exp-descr-script.ulp
@@ -0,0 +1,105 @@
+#usage "Export descriptions of devices and packages to a script\n"
+ " "
+ "Use this ULP to export the device and package descriptions "
+ "of a library to a file."
+ " "
+ "You can then edit this file with a text editor and read back "
+ "changed descriptions with the SCRIPT command."
+ " "
+ " \n"
+ "Can be used to make individual changes to components in a project. "
+ "Just load the board or the schematic and the board, use this ULP to "
+ "generate a library or several libraries "
+ "containing the used components, make your changes in the library, and use the "
+ "UPDATE command to introduce the changes to the schematic or board. "
+ "Version 1.2: Put objects in forbidden layers into trash layer (edit variable trash_layer). "
+ "Replace @ in library and device names with $, and spaces with _. "
+ "10.02.2004 Accept spaces in path and file name. "
+ " \n"
+
+ "This program collects the parts from a schematic or board and stores them back "
+ "into one or several libraries. \n"
+
+ "Attention: Before using this program please make sure no library is open and all layers containing objects "
+ "are used. If in doubt, execute the command \n"
+ "If you use this ULP from a schematic, the respective board MUST be opened, too! \n"
+
+ "Creation Mode \n"
+ "If 'Multiple libraries' is checked, the program generates libraries with their original name. "
+ "Thus you can edit symbols and/or packages in the generated libraries and "
+ "use the UPDATE command to change all of the respective parts in the schematic or board. \n"
+ "If 'One library' is checked, a single project library with the name of the schematic or board is generated. "
+ "Package/symbol/device names are then prefixed with the names of the original libraries [optional]. \n"
+ "Show scripts and file dialogs "
+ "If checked, you can edit the scripts and select path/filename for the library "
+ "script and the log file before execution of the library generation script file. \n"
+ "Save log file "
+ "If checked, the logfile is saved before execution of the library generation script file. \n"
+ "Working path "
+ "Enter the path where the libraries and the log file go to, or use 'Browse' to select the directory. \n"
+ "Collect data, Create library "
+ "Use these buttons in this order to create the project library or libraries. \\n\\\nby %s';\n", filename(project_name), filename(argv[0]));
+ cmd += h;
+ return;
+}
+
+void CreateHeader(UL_LIBRARY LBR) {
+ if (project.board) {
+ project.board(B) {
+ B.layers(L) {
+ sprintf(h, "Layer %d %s;\n", L.number, strip_at_num(L.name));
+ if (L.number > 1 && L.number < 16) cmd += "# "+h;
+ else cmd += h;
+ }
+ }
+ }
+ if (project.schematic) {
+ project.schematic(SCH) {
+ SCH.layers(L) {
+ sprintf(h, "Layer %d %s;\n", L.number, strip_at_num(L.name));
+ cmd += h;
+ }
+ }
+ }
+
+ sprintf(h, "Set Wire_bend 2;\nSet Select_factor 0;\nSet Undo_log off;\n"); cmd += h;
+ sprintf(h, "Grid mic 1;\n"); cmd += h;
+ sprintf(h, "Display All;\n"); cmd += h;
+ cmd += "DESCRIPTION "+replacenewline(LBR.description)+";\n";
+ return;
+}
+
+void CreateTrailer(void) {
+ sprintf(h, "Set Undo_log On;\nSet Select_factor 0.02;\nGrid last;\n"); cmd += h;
+ return;
+}
+
+void PrintValidLayer(int LNr) {
+ // put anything not allowed in trash_layer
+ if (mode==in_symbol && (LNr<91 || (LNr>96 && LNr<100))) {
+ sprintf(h, "Layer trash %d;\n", trash_layer); cmd += h;
+ LNr = trash_layer;
+ }
+ if (mode==in_package && (LNr>90 && LNr<100)) {
+ LNr = trash_layer;
+ sprintf(h, "Layer trash %d;\n", trash_layer); cmd += h;
+ }
+ sprintf(h, "Layer %d;\n", LNr); cmd += h;
+ return;
+}
+
+
+void DrawCircle(UL_CIRCLE C) {
+ PrintValidLayer(C.layer);
+ sprintf(h, "Circle %f (%f %f) (%f %f);\n",
+ u2mic(C.width),
+ u2mic(C.x), u2mic(C.y),
+ u2mic(C.x + C.radius), u2mic(C.y));
+ cmd += h;
+ return;
+}
+
+void DrawWire(UL_WIRE W) {
+ PrintValidLayer(W.layer);
+ if (W.arc) { // 2008-09-11
+ sprintf(h, "WIRE %f (%f %f) %+f (%.f %.f);\n",
+ u2mic(W.width),
+ u2mic(W.x1), u2mic(W.y1),
+ W.curve,
+ u2mic(W.x2), u2mic(W.y2));
+ cmd += h;
+ }
+ else {
+ sprintf(h, "Wire %f (%f %f) (%f %f);\n",
+ u2mic(W.width), u2mic(W.x1), u2mic(W.y1), u2mic(W.x2), u2mic(W.y2));
+ cmd += h;
+ }
+ return;
+}
+
+void DrawRectangle(UL_RECTANGLE R) {
+ PrintValidLayer(R.layer);
+ sprintf(h, "Rect R%.1f (%f %f) (%f %f);\n",
+ R.angle,
+ u2mic(R.x1), u2mic(R.y1),
+ u2mic(R.x2), u2mic(R.y2));
+ cmd += h;
+ return;
+}
+
+
+void DrawContact(UL_CONTACT C) {
+ string ShapeString;
+ string ShapeFlag;
+ if (C.pad) {
+ switch(C.pad.shape[17]) {
+ case PAD_SHAPE_SQUARE : ShapeString = "Square"; break;
+ case PAD_SHAPE_ROUND : ShapeString = "Round"; break;
+ case PAD_SHAPE_OCTAGON : ShapeString = "Octagon"; break;
+ case PAD_SHAPE_LONG : ShapeString = "Long"; break;
+ case PAD_SHAPE_OFFSET : ShapeString = "Offset"; break;
+ }
+ if (!(C.pad.flags & PAD_FLAG_STOP) ) ShapeFlag = "NOSTOP ";
+ if (!(C.pad.flags & PAD_FLAG_THERMALS) ) ShapeFlag += "NOTHERMALS ";
+ if ((C.pad.flags & PAD_FLAG_FIRST) ) ShapeFlag += "FIRST "; // 22.11.2004 support@cadsoft
+ //
+ // PAD [diameter] [shape] [orientation] [flags] ['name'] *..
+ //
+ sprintf(h, "Change Drill %f;\n", u2mic(C.pad.drill)); cmd += h;
+ sprintf(h, "Pad %f %s R%.1f %s '%s' (%f %f);\n",
+ u2mic(C.pad.diameter[17]),
+ ShapeString,
+ C.pad.angle,
+ ShapeFlag,
+ addApostroph(C.pad.name),
+ u2mic(C.pad.x), u2mic(C.pad.y));
+ cmd += h;
+ }
+ else if (C.smd) {
+ if (!(C.smd.flags & PAD_FLAG_STOP) ) ShapeFlag = "NOSTOP ";
+ if (!(C.smd.flags & SMD_FLAG_THERMALS) ) ShapeFlag += "NOTHERMALS ";
+ if (!(C.smd.flags & SMD_FLAG_CREAM) ) ShapeFlag += "NOCREAM ";
+
+ PrintValidLayer(C.smd.layer);
+ sprintf(h, "CHANGE Roundness %d;\n", C.smd.roundness); cmd += h;
+ //
+ // SMD [x_width y_width] [-roundness] [orientation] [flags] ['name'] *..
+ //
+ sprintf(h, "SMD %f %f -%d R%.1f %s '%s' (%f %f);\n",
+ u2mic(C.smd.dx), u2mic(C.smd.dy),
+ C.smd.roundness,
+ C.smd.angle,
+ ShapeFlag,
+ addApostroph(C.smd.name),
+ u2mic(C.smd.x), u2mic(C.smd.y));
+ cmd += h;
+ }
+ return;
+}
+
+void DrawText(UL_TEXT T) {
+ PrintValidLayer(T.layer);
+ switch(T.font) {
+ case FONT_VECTOR : sprintf(h, "CHANGE FONT VECTOR;\n");
+ cmd += h;
+ break;
+ case FONT_PROPORTIONAL : sprintf(h, "CHANGE FONT PROPORTIONAL;\n");
+ cmd += h;
+ break;
+ case FONT_FIXED : sprintf(h, "CHANGE FONT FIXED;\n");
+ cmd += h;
+ break;
+ }
+ string Spin = "";
+ string Mirror = "";
+ if (T.spin) Spin = "S";
+ if (T.mirror) Mirror = "M";
+
+ sprintf(h, "Change Size %f;\n", u2mic(T.size));
+ cmd += h;
+ sprintf(h, "Change Ratio %d;\n", T.ratio);
+ cmd += h;
+ sprintf(h, "Text %s%sR%.1f '%s' (%f %f);\n",
+ Spin, Mirror, T.angle, T.value, u2mic(T.x), u2mic(T.y)
+ );
+ cmd += h;
+ return;
+}
+
+void DrawHole(UL_HOLE H) {
+ sprintf(h, "Change Drill %f;\n", u2mic(H.drill)); cmd += h;
+ sprintf(h, "Hole (%f %f);\n", u2mic(H.x), u2mic(H.y)); cmd += h;
+ return;
+}
+
+void DrawPolygon(UL_POLYGON PL) {
+ PrintValidLayer(PL.layer);
+ sprintf(h, "Change Isolate %f;\n", u2mic(PL.isolate)); cmd += h;
+ sprintf(h, "Change Spacing %f;\n", u2mic(PL.spacing)); cmd += h;
+ if (PL.orphans) {
+ sprintf(h, "Change Orphans On;\n");
+ cmd += h;
+ }
+ else {
+ sprintf(h, "Change Orphans Off;\n"); cmd += h;
+ }
+ if (PL.thermals) {
+ sprintf(h, "Change Thermals On;\n"); cmd += h;
+ }
+ else {
+ sprintf(h, "Change Thermals Off;\n"); cmd += h;
+ }
+ if (PL.pour == POLYGON_POUR_SOLID) {
+ sprintf(h, "Change Pour Solid;\n"); cmd += h;
+ }
+ else {
+ sprintf(h, "Change Pour Hatch;\n"); cmd += h;
+ }
+ sprintf(h, "Polygon %f ", u2mic(PL.width)); cmd += h;
+ PL.wires(W) {
+ sprintf(h, "(%f %f) ", u2mic(W.x1), u2mic(W.y1)); cmd += h; /*start coord.*/
+ break;
+ }
+ PL.wires(W) {
+ sprintf(h, " %+f (%f %f) ", W.curve, u2mic(W.x2), u2mic(W.y2)); cmd += h;
+ }
+ sprintf(h, ";\n"); cmd += h;
+ return;
+}
+
+void DrawPin(UL_PIN P) {
+ string DIR = "", FUNC = "", LEN = "", VIS = "", ANGLE = "R0";
+ if (P.angle == 90) (ANGLE = "R90");
+ if (P.angle == 180) (ANGLE = "R180");
+ if (P.angle == 270) (ANGLE = "R270");
+
+ if (P.function == PIN_FUNCTION_FLAG_NONE) (FUNC = "None");
+ if (P.function == PIN_FUNCTION_FLAG_DOT) (FUNC = "Dot");
+ if (P.function == PIN_FUNCTION_FLAG_CLK) (FUNC = "Clk");
+ if (P.function == (PIN_FUNCTION_FLAG_DOT | PIN_FUNCTION_FLAG_CLK))
+ (FUNC = "DotClk");
+
+ if (P.visible == PIN_VISIBLE_FLAG_OFF) (VIS = "Off");
+ if (P.visible == PIN_VISIBLE_FLAG_PIN) (VIS = "Pin");
+ if (P.visible == PIN_VISIBLE_FLAG_PAD) (VIS = "Pad");
+ if (P.visible == (PIN_VISIBLE_FLAG_PIN | PIN_VISIBLE_FLAG_PAD))
+ (VIS = "Both");
+
+ switch(P.direction) {
+ case PIN_DIRECTION_NC : DIR = "NC"; break;
+ case PIN_DIRECTION_IN : DIR = "In"; break;
+ case PIN_DIRECTION_OUT : DIR = "Out"; break;
+ case PIN_DIRECTION_IO : DIR = "I/O"; break;
+ case PIN_DIRECTION_OC : DIR = "OC"; break;
+ case PIN_DIRECTION_PWR : DIR = "Pwr"; break;
+ case PIN_DIRECTION_PAS : DIR = "Pas"; break;
+ case PIN_DIRECTION_HIZ : DIR = "Hiz"; break;
+ case PIN_DIRECTION_SUP : DIR = "Sup";
+ }
+
+ switch(P.length) {
+ case PIN_LENGTH_POINT : LEN = "Point"; break;
+ case PIN_LENGTH_SHORT : LEN = "Short"; break;
+ case PIN_LENGTH_MIDDLE : LEN = "Middle"; break;
+ case PIN_LENGTH_LONG : LEN = "Long";
+ }
+
+ sprintf(h, "Pin '%s' %s %s %s %s %s %d (%f %f);\n",
+ addApostroph(P.name),
+ DIR, FUNC, LEN, ANGLE, VIS, P.swaplevel, u2mic(P.x), u2mic(P.y));
+ cmd += h;
+ return;
+}
+
+void DrawSymbol(UL_SYMBOL S) {
+ mode = in_symbol;
+ IsPackage = 0;
+ S.circles(C) DrawCircle(C);
+ S.rectangles(R) DrawRectangle(R);
+ S.wires(W) DrawWire(W);
+ S.pins(P) DrawPin(P);
+ S.texts(T) DrawText(T);
+ S.polygons(PL) DrawPolygon(PL);
+ mode = no_mode;
+ return;
+}
+
+void DrawPackage(UL_PACKAGE P) {
+ mode = in_package;
+ IsPackage = 1;
+ P.circles(C) DrawCircle(C);
+ P.wires(W) DrawWire(W);
+ P.rectangles(R) DrawRectangle(R);
+ P.contacts(C) DrawContact(C);
+ P.texts(T) DrawText(T);
+ P.holes(H) DrawHole(H);
+ P.polygons(PL) DrawPolygon(PL);
+ mode = no_mode;
+ return;
+}
+
+
+
+void checktechno(string tec, string dev, string lib) {
+ string t[];
+ int n = strsplit(t, tec, ' ');
+ if (n > 254) {
+ string s;
+ sprintf(s, " "
+ "Usage: RUN exp2image monochrome resolution image type layer [layer layer]"
+ " "
+ " \n"
+ "See program text for more information "
+ "ULP Rev. 1.42 "
+ "To delete the elements in user layer afterwards, display it without "
+ "any other layers, and use GROUP and DELETE. Then remove the user "
+ "layer with the command LAYER -number."
+ " "
+ " "
+ "Find single-ended wires that don't start or end at another wire, via or pad. "
+ "NOTE: WIREs or VIAs that end in a polygon's area, are recognized as single-ended! "
+ " "
+ "Findet WIREs die nicht an einem Pad, Via oder einem anderen Wire beginnen bzw. enden (Stummel). "
+ "ACHTUNG: WIREs oder VIAs, die in einer Polygonfläche enden, werden ebenfalls als Single-Ended erkannt! "
+ " "
+ "Centers the object and zooms into the drawing."
+ " "
+ " "
+ "Usage: RUN find [ name [ pin | pad | [value CH new_value] [ count | * ]]"
+ " "
+ "RUN find "
+ "counter specifies the number of elements that shall be found before ending the search "
+ "PIN | PAD | DEV | GATE additionally searches for PIN, PAD, GATE, DEVICE names "
+ " "
+ "Zoomt das gefundene Element in die Fenstermitte"
+ " "
+ " "
+ "RUN find [ name [ pin | pad | value [CH new_value] [ count | * ]]"
+ " "
+ " "
+ " "
+ " "
+ "This program is used in conjunction with gluemark.ulp. "
+ "Define output format in function outputdata."
+ " "
+ " "
+ "* HyprLynx.ULP Written by Frank Hoffman of LLOYD I/O INC "
+ "* 1 sided boards use layer 16 ULP aborted. "
+ "This ULP generates a SCRIPT file that draws rectangles of successional pixels with identical color. "
+ " "
+ "Das ULP erzeugt eine SCRIPT-Datei, in der zusammenhängende gleichfarbige Pixel als Rechteck generiert werden. "
+ " is a %.0f color BitMaP : ist eine %.0f-Farben-BitMaP "
+ "Imports ULTIBOARD PCB Design Data File format (DDF) Version 4.80 & 5.50."
+ " "
+ "Based on : Ultiboard User Manual, Appendix A, FILE FORMATS."
+ " "
+ "ULTIBOARD is a registered trademark of Electronics Workbench."
+ " "
+ " \n" +
+ "connect Signals \n" +
+ " S$nn \n" +
+ " S$nn \n" +
+ " with OK. " +
+ " " +
+ " - ULTIBOARD uses the text center as origin point " +
+ " - EAGLE uses the left lower corner of the text as origin point. " +
+ "The DDF format does not provide information about the lenght of characters. ";
+
+string ULTIBoardinfo =
+ "ULTIBOARD Version 4, Revision 80 " +
+ " The x_coord and y_coord are expressed in database units (1/1200th of an inch) " +
+ " The rotation is given in degrees, specified as a floating point number between 0.0 and 360.0 degrees. " +
+ " Internally, Ultiboard works with a precision of 1/64th degree " +
+ " " +
+ " The x_coord and y_coord are expressed in database units (1 nanometer) " +
+ " The rotation is given in degrees, specified as a floating point number between 0.0 and 360.0 degrees. " +
+ " Internally, Ultiboard works with a precision of 1/64th degree " +
+ " \n" +
+ "connect Signals \n" +
+ " S$nn \n" +
+ " S$nn \n" +
+ " mit OK. " +
+ "Diese Meldung wird dadurch erzeugt, daß ein Netzsegment (Leiterzug) mit " +
+ "einem anderen Netzsegment verbunden wird. " +
+ "Die Ursache ist die Reihenfolge der Ausgabe der Leiterbahn-Segmente aus ULTIBOARD, " +
+ "da ULTIBOARD zuerst waagrechte dann senkrechte und am Schluß diagonale " +
+ "Leiterbahnsegmente ausgibt. " +
+ "Wird von ULTIBOARD diesen Leitersegmenten kein Netzname zugewiesen, " +
+ "so erzeugt EAGLE einen Namen mit dem Zeichen $ an zweiter Position. " +
+ " \n" +
+ " - ULTIBOARD plaziert Texte am Mittelpunkt des Textes. " +
+ " - EAGLE plaziert Texte mit der linken unteren Ecke des 1. Buchstaben. " +
+ "Das ULP berechnet die Position anhand der Stringlänge und Texthöhe. " +
+ "Im DDF-Format gibt es keine Information bezüglich der Buchstabenlänge, " +
+ "dadurch kann es vorkommen, daß längere Texte nicht exakt an der gleichen " +
+ "Position wie im ULTIBOARD Layout positioniert werden. " +
+ " " +
+ "wird erzeugt, falls ein Schaltplan zur Laufzeit des ULP geladen ist, und muß " +
+ "mit OK bestätigt werden. ";
+
+string Version = "1.1.0";
+string costomer;
+string versionnumb;
+string revisionnum;
+string tmpchtxtfile = ".ch$";
+string tmpextfile = "$.scr";
+string changetextfile;
+string scriptfile;
+string ULTIversion[] = { "480", "550" };
+real ULTIscale[] = { 1.20, 25400.0 };
+real rotatemult[] = { 64 , 64 };
+int VersionCnt = 2;
+real xScale;
+real rotatemultiple;
+string Grid = "MIL";
+real CharacterLength;
+real eagle_caracter_length[] = {
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.000, 00.000, 00.000, 00.000,
+ 00.917, 00.303, 00.764, 00.917,
+ 00.917, 01.071, 00.917, 00.610,
+ 00.764, 00.764, 00.917, 00.917,
+ 00.764, 00.917, 00.764, 00.917,
+ 00.917, 00.764, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.764, 00.764,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.764, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.764,
+ 00.917, 00.764, 00.917, 00.917,
+ 00.610, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.764, 00.917,
+ 00.917, 00.764, 00.917, 00.917,
+ 00.764, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.764, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.457, 00.917, 00.917, 00.917,
+ 01.390, 01.236, 01.390, 00.150,
+ -6.000, 00.000, 00.307, 00.618,
+ 00.618, 00.307, 00.925, 00.618,
+ 00.610, 00.307, 00.307, 00.917,
+ 00.618, 00.618, 00.618, 00.917,
+ 00.917, 00.917, 00.618, 00.925,
+ 00.925, 00.618, 00.925, 00.925,
+ 00.917, 00.618, 00.610, 01.071,
+ 00.000, 00.303, 00.917, 01.224,
+ 00.618, 00.610, 00.307, 00.764,
+ 00.457, 00.610, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.764,
+ 00.764, 00.917, 00.610, 00.917,
+ 00.917, 00.917, 00.764, 00.457,
+ 00.764, 00.917, 00.917, 00.917,
+ 01.071, 01.071, 00.917, 00.917,
+ 00.917, 00.610, 00.917, 00.618,
+ 00.917, 00.917, 01.531, 00.917,
+ 00.307, 00.917, 00.618, 00.618,
+ 00.618, 00.618, 00.925, 00.618,
+ 00.618, 00.917, 01.071, 01.071,
+ 00.764, 01.071, 00.917, 01.224,
+ 01.071, 00.764, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.764,
+ 00.917, 00.917, 00.917, 00.307,
+ 00.917, 00.917, 01.378, 00.917,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.764, 00.610, 00.764, 00.764,
+ 00.618, 00.917, 00.917, 00.917,
+ 00.917, 00.917, 00.917, 00.764,
+ 00.917, 00.917, 00.917, 00.917,
+ 00.917, 01.224, 01.071, 00.917
+ };
+real def_grid;
+real refpointx;
+real refpointy;
+string ulp_path = "";
+int lastLayer = 0;
+string filter;
+string ddffile;
+int Result = 0;
+string st = "";
+char lf = 10;
+char cr = 13;
+char nl = 12;
+char polysepar = ':';
+char semikolon = ';';
+string cmd = "";
+string brd = "";
+string cmdroute = "";
+string script = "";
+string polygon = "";
+string arcscript = "";
+string cmdchname = "";
+string cmdvalue = "";
+real TextRatio = 8;
+char c[];
+int nBytes = 0;
+int n = 0;
+string fileName = "";
+string shapename = "";
+string refLayer[] = { "49",
+ "1",
+ "16",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "116",
+ "117",
+ "118",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "130",
+ "131"
+ };
+string TMrefLayer[] = { "",
+ "",
+ "M",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ };
+real boardoutline[];
+string layerDirection[];
+real tracewidth[];
+real traceclearance[];
+real drilltolerance;
+real drilltolerancevalue;
+int drillcode[];
+real pad0innerX1[];
+real pad0innerX2[];
+real pad0innerY[];
+real pad0innerRadius[];
+real pad0innerClear[];
+real pad0innerHorizont[];
+real pad0innerVertical[];
+real pad0innerThermH[];
+real pad0innerThermV[];
+real pad1topX1[];
+real pad1topX2[];
+real pad1topY[];
+real pad1topRadius[];
+real pad1topClear[];
+real pad1topHorizont[];
+real pad1topVertical[];
+real pad1topThermH[];
+real pad1topThermV[];
+real pad2bottomX1[];
+real pad2bottomX2[];
+real pad2bottomY[];
+real pad2bottomRadius[];
+real pad2bottomClear[];
+real pad2bottomHorizont[];
+real pad2bottomVertical[];
+real pad2bottomThermH[];
+real pad2bottomThermV[];
+int net = -1;
+string netname[];
+int nettracecode[];
+real netxlo[];
+real netxhi[];
+real netylo[];
+real netyhi[];
+real netxsum[];
+real netysum[];
+int netpincount[];
+netname[65535] = "";
+int cntrefPin = 0;
+string refPinNr[];
+string refPackname[];
+int pointPackPin[];
+int cntShape = 0;
+string signal[];
+string brdvia;
+int comp = 0;
+real stringLength(string s, real hight) {
+ real len = 0;
+ for (int l = 0; l < strlen(s); l++) {
+ len += (eagle_caracter_length[s[l]] * hight);
+ }
+ return len;
+ }
+void importpass2(void) {
+ string changetextfile = argv[2];
+ string scriptfile = filesetext(changetextfile, "$" + tmpextfile);
+ string s[];
+ int nString = fileread(s, changetextfile);
+ if (board) board(B) {
+ output(scriptfile, "wt") {
+ printf("DISPLAY NONE 25;\n");
+ printf("GRID %s FINEST;\n", Grid);
+ B.elements(E) {
+ for (int n = 0; n < nString; n+= 7) {
+ if (E.name == s[n]) {
+ E.texts(T) {
+ if (T.layer == 25 && T.value == s[n]) {
+ real size = strtod(s[n+5]);
+ if (size != 0) {
+ printf("# %s\n", s[n]);
+ real r = T.angle;
+ int pacnametextrotate = abs(r);
+ real slen = strtod(s[n+1]);
+ int trotate = strtod(s[n+2]);
+ real relx = strtod(s[n+3]);
+ real rely = strtod(s[n+4]);
+ real ratio = strtod(s[n+6]);
+ if(ratio <= 1) ratio = 1;
+ printf("CHANGE SIZE %.2f (%.2f %.2f);\n", size, u2mil(T.x), u2mil(T.y) );
+ printf("CHANGE RATIO %.0f (%.2f %.2f);\n", ratio, u2mil(T.x), u2mil(T.y) );
+ int pacrotate = E.angle;
+ if (pacrotate == pacnametextrotate) {
+ switch (pacrotate) {
+ case 0 :
+ switch(trotate) {
+ case 0 :
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) - slen,
+ u2mil(E.y) + (rely) - (size/2) );
+ break;
+ case 90 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) + (size/2),
+ u2mil(E.y) + (rely) - slen );
+ break;
+ case 180 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) + slen,
+ u2mil(E.y) + (rely) + (size/2));
+ break;
+ case 270 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) + (size/2),
+ u2mil(E.y) + (rely) - slen );
+ break;
+ }
+ break;
+ case 90 :
+ switch(trotate) {
+ case 0 :
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (rely) + (size/2),
+ u2mil(E.y) + relx - slen);
+ break;
+ case 90 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (rely) - slen,
+ u2mil(E.y) + (relx) - (size/2) );
+ break;
+ case 180 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) + slen,
+ u2mil(E.y) + (rely) + (size/2));
+ break;
+ case 270 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - rely + slen,
+ u2mil(E.y) + relx + (size/2) );
+ break;
+ }
+ break;
+ case 180 :
+ switch(trotate) {
+ case 0 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (relx) - slen,
+ u2mil(E.y) - (rely) - (size/2) );
+ break;
+ case 90 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (relx) + (size/2),
+ u2mil(E.y) - (rely) - slen );
+ break;
+ case 180 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (relx) - slen,
+ u2mil(E.y) - (rely) - (size/2) );
+ break;
+ case 270 :
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (relx) - slen,
+ u2mil(E.y) + (rely) - (size/2) );
+ break;
+ }
+ break;
+ case 270 :
+ switch(trotate) {
+ case 0 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (rely) + (size/2),
+ u2mil(E.y) - (relx) - slen );
+ break;
+ case 90 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + (rely) - slen,
+ u2mil(E.y) - relx - (size/2) );
+ break;
+ case 180 :
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) - (relx) + (size/2),
+ u2mil(E.y) + (rely) - slen);
+ break;
+ case 270 :
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("ROTATE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ printf("MOVE (%.2f %.2f) (%.2f %.2f);\n",
+ u2mil(T.x), u2mil(T.y),
+ u2mil(E.x) + rely + slen,
+ u2mil(E.y) - relx + (size/2) );
+ break;
+ }
+ break;
+ default : if(dlgMessageBox("Rotation only in 0, 90, 180, 270 drgree", "OK", "ESC") != 0) exit (0);
+ }
+ }
+ else dlgMessageBox( s[n+0] + "\nPackage und Textplatzhalter ungleiche Rotation", "OK");
+ }
+ else printf("DELETE (%.2f %.2f);\n", u2mil(T.x), u2mil(T.y) );
+ }
+ }
+ }
+ }
+ }
+ printf("DISPLAY 1 16 17 18 20 21 -23 49;\n");
+ printf("GRID LAST;\n");
+ printf("# WRITE;\n");
+ }
+ }
+ exit ("SCRIPT '" + scriptfile + "';\n");
+ }
+void test(char cc) {
+ sprintf(st, "Caracter=>%c<\n", cc);
+ if (dlgMessageBox("Character =" + st, "&Yes", "&No") != 0) {
+ exit (0);
+ }
+ return ;
+ }
+real val2mil(string val) {
+ return strtod(val) * xScale;
+ }
+real v2mil(real val) {
+ return val * xScale;
+ }
+string format(real rval) {
+ string fmt;
+ sprintf(fmt, "%.3f", rval);
+ return fmt;
+ }
+void rwire( int netnr, int layer, real x1, real y1, real x2, real y2) {
+ string w;
+ if (netnr < 0) {
+ string h;
+ sprintf(h, "Netz#=%d\n", netnr);
+ dlgMessageBox(h, "OK");
+ }
+ cmdroute += "CHANGE LAYER " + refLayer[layer] + ";\n";
+ if(netname[netnr] != "") {
+ sprintf(w, "WIRE '%s' (%s %s) (%s %s);\n", netname[netnr],
+ format(v2mil(x1)), format(v2mil(y1)),
+ format(v2mil(x2)), format(v2mil(y2)) );
+ }
+ else {
+ sprintf(w, "WIRE (%s %s) (%s %s);\n",
+ format(v2mil(x1)), format(v2mil(y1)),
+ format(v2mil(x2)), format(v2mil(y2)) );
+ }
+ cmdroute += w;
+ return ;
+ }
+void route(int layer, real coord1, real coord2, real coord3, int Netnr, int Code, int Type, int Orient) {
+ cmdroute += "CHANGE Layer " + refLayer[layer] + ";\n";
+ cmdroute += "CHANGE WIDTH " + format(v2mil(tracewidth[Code])) + ";\n" ;
+ switch (Orient) {
+ case 1 : rwire(Netnr, layer, coord2, coord1, coord3, coord1);
+ break;
+ case 2 : rwire(Netnr, layer, coord1, coord2, coord1, coord3);
+ break;
+ case 4 : rwire(Netnr, layer, coord2 + ((coord1 - coord2) / 2 ) ,
+ (coord1 - coord2) / -2, coord3 + ((coord1 - coord3) / 2 ) ,
+ (coord1 - coord3) / -2);
+ break;
+ case 8 : rwire(Netnr, layer, coord2 - ((coord2 - coord1) / 2 ) ,
+ (coord2 - coord1) / -2, coord3 - ((coord3 - coord1) / 2 ) ,
+ (coord3 - coord1) / -2);
+ break;
+ default: {
+ string o;
+ sprintf(o, "Route error:\nLayer=%d\n%.2f\n%.2f\n%.2f\nN#%d\nC=%d\nT=%d\nO=%d\n",
+ layer, coord1, coord2, coord3, Netnr, Code, Type,Orient);
+ if (dlgMessageBox(o, "&Yes", "&No") != 0) exit (0);
+ }
+ }
+ return ;
+ }
+void arcDraw( int Layer, real X, real Y, real Radius, real arcs, real arce, int Netnr, int TraceCode, string TraceType) {
+ string as;
+ sprintf (as, " Change Layer %s;\n", refLayer[Layer]);
+ if (arce == 360) {
+ sprintf (as, " Circle (%.3f %.3f) (%.3f %.3f);\n",X, Y, X + Radius, Y);
+ arcscript += as;
+ }
+ else {
+ real arcStart = 360 + (arcs);
+ if (arcStart > 360) arcStart -= 360;
+ real arcEnd = arcStart + (arce);
+ if (arcEnd > 360) arcEnd -= 360;
+ real xArcStart = Radius * cos(PI / 180 * arcStart);
+ real yArcStart = Radius * sin(PI / 180 * arcStart);
+ real xArcEnd = Radius * cos(PI / 180 * arcEnd);
+ real yArcEnd = Radius * sin(PI / 180 * arcEnd);
+ sprintf (as, " ARC CCW (%.3f %.3f) (%.3f %.3f) (%.3f %.3f);\n",
+ X + xArcStart, Y + yArcStart,
+ X - xArcStart, Y - yArcStart,
+ X + xArcEnd, Y + yArcEnd);
+ arcscript += as;
+ }
+ return;
+}
+string scriptheader(void) {
+ string scrh = "Grid " + Grid + " FINEST;\n";
+ scrh += "Grid ON;\nSET UNDO_LOG OFF;\nSET WIRE_BEND 2;\n";
+ scrh += "LAYER 125 Alias;\n";
+ return scrh ;
+ }
+string readTstring(void) {
+ string s = "";
+ do {
+ if (c[n] == cr) {
+ n++;
+ return s;
+ }
+ else {
+ s += c[n];
+ n++;
+ }
+ } while (c[n]);
+ }
+string read(char srch, int rdlf) {
+ string s = "";
+ do {
+ if (c[n] != ' ') {
+ break;
+ }
+ else n++;
+ } while (c[n]);
+ do {
+ if (c[n] != cr) {
+ break;
+ }
+ else n++;
+ } while (c[n]);
+ do {
+ if (c[n] != lf) {
+ break;
+ }
+ else {
+ n++;
+ if (rdlf) {
+ return s;
+ }
+ }
+ } while (c[n]);
+ do {
+ if (c[n] == ';' || c[n] == ':') {
+ if (s == "") {
+ string cc;
+ sprintf(cc, "%c", c[n]);
+ return cc;
+ }
+ else return s;
+ }
+ if (c[n] == srch || c[n] == cr) {
+ n++;
+ return s;
+ }
+ else {
+ s += c[n];
+ n++;
+ }
+ } while (c[n]);
+ return s;
+ }
+string readstring(char separ, char eol, char sepline) {
+ string sline = "";
+ do {
+ string wx = read(separ, 0);
+ if (wx[0] ==eol || wx[0] == sepline) {
+ if ( sline == "") {
+ return wx;
+ }
+ else return sline;
+ }
+ string wy = read(separ, 1);
+ sprintf(st, "(%s %s) ", format(val2mil(wx)), format(val2mil(wy)));
+ sline += st;
+ } while (c[n]);
+ sprintf(st, "%d", n);
+ if(dlgMessageBox( "Progr. end by counter " + st , "&Yes", "&No") != 0) exit (0);
+ exit (0);
+ }
+void Headerfield(void) {
+ n++;
+ costomer = read(lf, 0);
+ versionnumb = read(' ', 0);
+ revisionnum = read(' ', 0);
+ for (int v = 0; v < VersionCnt; v++) {
+ if (versionnumb + revisionnum == ULTIversion[v]) {
+ xScale = 1 / ULTIscale[v];
+ rotatemultiple = rotatemult[v];
+ break;
+ }
+ }
+ printf("%s", scriptheader());
+ boardoutline[1] = strtol(read(',', 0));
+ boardoutline[2] = strtol(read(',', 0));
+ boardoutline[3] = strtol(read(',', 0));
+ boardoutline[4] = strtol(read(',', 0));
+ def_grid = strtol(read(',', 0));
+ int grid_step = strtol(read(',', 0));
+ string swaplevel = read(',', 0);
+ int max_layers = strtod(read(';', 0));
+ n++;
+ string layerlaminat = read(' ', 0);
+ refpointx = strtol(read(',', 0));
+ refpointy = strtol(read(cr, 0));
+ string routeroptions[];
+ int x = 0;
+ routeroptions[0] = read(' ', 0);
+ st = routeroptions[0] ;
+ do {
+ x++;
+ routeroptions[x] = read(' ', 1);
+ st += " " + routeroptions[x];
+ } while (routeroptions[x] != "");
+ x = 1;
+ layerDirection[x] = read(' ', 0);
+ do {
+ st += "\nLayer " + refLayer[x] + "=" + layerDirection[x];
+ x++;
+ layerDirection[x] = read(' ', 1);
+ } while (layerDirection[x] != "");
+ string powerplanes[];
+ for (int p = 1; p <= 32; p++) {
+ powerplanes[p] = read(' ', 0);
+ }
+ return ;
+ }
+void padset(void) {
+ n++;
+ string padsetword = read(cr, 1);
+ return ;
+ }
+void TraceCode(void) {
+ n++;
+ string nb = read(',', 0);
+ int number = strtol(nb);
+ tracewidth[number] = strtol(read(',', 0));
+ traceclearance[number] = strtol(read(cr, 1));
+ return ;
+ }
+void Drilltolerance(void) {
+ n++;
+ drilltolerance = strtol(read(' ', 0));
+ drilltolerancevalue = strtol(read(cr, 0));
+ return ;
+ }
+void DrillCode(void) {
+ n++;
+ string nb = read(',', 0);
+ int number = strtol(nb);
+ drillcode[number] = strtod(read(cr, 1));
+ return ;
+ }
+void PadDefinitionInner(void) {
+ n++;
+ string nb = read(',', 0);
+ int number = strtol(nb);
+ pad0innerX1[number] = strtol(read(',',0));
+ pad0innerX2[number] = strtol(read(',',0));
+ pad0innerY[number] = strtol(read(',',0));
+ pad0innerRadius[number] = strtol(read(',',0));
+ pad0innerClear[number] = strtol(read(',',0));
+ pad0innerHorizont[number] = strtol(read(',',0));
+ pad0innerVertical[number] = strtol(read(',',0));
+ pad0innerThermH[number] = strtol(read(',',0));
+ pad0innerThermV[number] = strtol(read(cr, 1));
+ return ;
+}
+void PadDefinitionTop(void) {
+ n++;
+ string nb = read(',', 0);
+ int number = strtol(nb);
+ pad1topX1[number] = strtol(read(',', 0));
+ pad1topX2[number] = strtol(read(',', 0));
+ pad1topY[number] = strtol(read(',', 0));
+ pad1topRadius[number] = strtol(read(',', 0));
+ pad1topClear[number] = strtol(read(',', 0));
+ pad1topHorizont[number] = strtol(read(',', 0));
+ pad1topVertical[number] = strtol(read(',', 0));
+ pad1topThermH[number] = strtol(read(',', 0));
+ pad1topThermV[number] = strtol(read(cr, 1));
+ return ;
+ }
+void PadDefiniBottom(void) {
+ n++;
+ string nb = read(',', 0);
+ int number = strtol(nb);
+ pad2bottomX1[number] = strtol(read(',', 0));
+ pad2bottomX2[number] = strtol(read(',', 0));
+ pad2bottomY[number] = strtol(read(',', 0));
+ pad2bottomRadius[number] = strtol(read(',', 0));
+ pad2bottomClear[number] = strtol(read(',', 0));
+ pad2bottomHorizont[number] = strtol(read(',', 0));
+ pad2bottomVertical[number] = strtol(read(',', 0));
+ pad2bottomThermH[number] = strtol(read(',', 0));
+ pad2bottomThermV[number] = strtol(read(cr, 1));
+ return ;
+ }
+void WaveSolderDir(void) {
+ n++;
+ string WaveSolder = read(' ', 0);
+ string WaveSolderDir = read(' ', 0);
+ string WaveSolderClear = read(cr, 1);
+ return ;
+ }
+void testxy(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int ox, int oy) {
+ sprintf(st, "s(%s %s)\n2(%s %s)\n3(%s %s)\n4(%s %s)\no(%s %s)" ,
+ format(v2mil(x1)), format(v2mil(y1)),
+ format(v2mil(x2)), format(v2mil(y2)),
+ format(v2mil(x3)), format(v2mil(y3)),
+ format(v2mil(x4)), format(v2mil(y4)),
+ format(v2mil(ox)), format(v2mil(oy)) );
+ dlgDialog("Koordinaten?") {
+ dlgTextEdit(st);
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgPushButton("+Yes") dlgAccept();
+ dlgStretch(1);
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(0);
+ }
+ };
+ return ;
+ }
+void outlinedescript(void) {
+ int x, y;
+ int wcnt = 0;
+ string w = "";
+ string wire = "";
+ string h;
+ int n;
+ sprintf(h, "CHANGE LAYER 21;\n");
+ wire += h;
+ do {
+ w = read(',', 0);
+ if (w == ";") {
+ break;
+ }
+ x = strtod(w);
+ y = strtod(read(',', 0));
+ if ( (x & 1) == 1) {
+ wire += ";wire\n";
+ sprintf (h, "(%s %s)\n", format(v2mil(x - 1)), format(v2mil(y)) );
+ }
+ else {
+ sprintf (h, "(%s %s)\n", format(v2mil(x)), format(v2mil(y)) );
+ }
+ wire += h;
+ wcnt++;
+ } while (c[n]);
+ wire += ";\n";
+ printf("%s", wire);
+ return ;
+ }
+void pindescript(void) {
+ do {
+ string padcode = read(',', 0);
+ if (strrchr(padcode, ';') == 0) {
+ n++;
+ return ;
+ }
+ int pcodnumber = strtol(padcode);
+ real padcodeRotation = strtod(read(',', 0)) / rotatemultiple;
+ int padcodelayerset = strtol(read(',', 0));
+ real padcoderelx = val2mil(read(',', 0));
+ real padcoderely = val2mil(read(',', 0));
+ string padcodepinname = read(',', 1);
+ refPinNr[cntrefPin] = padcodepinname;
+ cntrefPin++;
+ real px1 = v2mil(pad2bottomX1[pcodnumber]);
+ real px2 = v2mil(pad2bottomX2[pcodnumber]);
+ real py = v2mil(pad2bottomY[pcodnumber]);
+ real prad = v2mil(pad2bottomRadius[pcodnumber]);
+ real pc = v2mil(pad2bottomClear[pcodnumber]);
+ real ph = v2mil(pad2bottomHorizont[pcodnumber]);
+ real pv = v2mil(pad2bottomVertical[pcodnumber]);
+ real pth = v2mil(pad2bottomThermH[pcodnumber]);
+ real ptv = v2mil(pad2bottomThermV[pcodnumber]);
+ real centeroffset = (px1 - px2);
+ real px = px1 + px2;
+ int pdril = drillcode[pcodnumber];
+ if(pdril != 0) {
+ printf("CHANGE DRIll %s;\n", format(v2mil(drillcode[pcodnumber])) );
+ }
+ printf("CHANGE LAYER 48;\n");
+ printf("CHANGE SIZE 32;\n");
+ if (py == 0) {
+ dlgDialog("Warning") {
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel("");
+ dlgStretch(1);
+ }
+ dlgLabel( "Package: "+ shapename + ";\nPad : " + padcodepinname + " / PadCode = " + padcode + "\n\nY-Value is zerro = 0; changed to 1 Mil\n", 1);
+ dlgPushButton("+&Accept") dlgAccept();
+ dlgPushButton("-&Cancel") { dlgReject(); exit(-1); }
+ py = 1;
+ px = 1;
+ };
+ }
+ printf("CHANGE LAYER 21;\n");
+ if(pdril == 0) {
+ int roundness = prad / (py / 200) ;
+ printf("CHANGE LAYER %s;\n", refLayer[padcodelayerset]);
+ if (centeroffset == 0) {
+ if (padcodeRotation == 90 || padcodeRotation == 270) {
+ printf("SMD %.3f %.3f -%d '%s' (%s %s);\n", py, px, roundness, padcodepinname, format(padcoderelx), format(padcoderely) );
+ }
+ else {
+ printf("SMD %.3f %.3f -%d '%s' (%s %s);\n", px, py, roundness, padcodepinname, format(padcoderelx), format(padcoderely) );
+ }
+ }
+ else {
+ printf("SMD %.3f %.3f -%d '%s' (%s %s);\n", px, py, roundness, padcodepinname, format(padcoderelx), format(padcoderely) );
+ }
+ }
+ else {
+ if (centeroffset == 0 && px == py) {
+ if (prad < px / 2) {
+ printf("CHANGE SHAPE SQUARE;\n");
+ }
+ else {
+ printf("CHANGE SHAPE ROUND;\n");
+ }
+ printf("CHANGE DIAMETER %s;\n", format(px) );
+ }
+ else {
+ if (centeroffset == 0) {
+ if (padcodeRotation == 90 || padcodeRotation == 270) {
+ printf("CHANGE SHAPE YLongOct;\n");
+ printf("CHANGE DIAMETER %s;\n", format(py) );
+ }
+ else {
+ printf("CHANGE SHAPE XLongOct;\n");
+ printf("CHANGE DIAMETER %s;\n", format(py) );
+ }
+ }
+ else {
+ printf("CHANGE SHAPE OCTAGON;\n");
+ if (py > px1 || py > px2) {
+ printf("CHANGE DIAMETER %s;\n", format(py) );
+ }
+ else {
+ printf("CHANGE DIAMETER %s;\n", format(px2) );
+ }
+ }
+ }
+ printf("PAD '%s' (%s %s);\n", padcodepinname, format(padcoderelx), format(padcoderely) );
+ }
+ } while (c[n]);
+ return ;
+ }
+void arcdescript(void) {
+ do {
+ string arcxs = read(',', 0);
+ if (strrchr(arcxs, ';') == 0) {
+ n++;
+ return ;
+ }
+ real arcx = val2mil(arcxs);
+ real arcy = val2mil(read(',', 0));
+ real arcradius = val2mil(read(',', 0));
+ real ang1 = strtod(read(',', 0)) / rotatemultiple ;
+ real ang2 = strtod(read(',', 1)) / rotatemultiple ;
+ printf("CHANGE LAYER 21;\n");
+ if(ang1 == 0 && ang2 == 360) {
+ printf("CIRCLE (%s %s) (%s %s);\n", format(arcx), format(arcy), format(arcx - arcradius), format(arcy) );
+ }
+ else {
+ real endangle = ang1 + ang2;
+ if (endangle >= 360) {
+ endangle -= 360;
+ }
+ real startXarc = arcradius * cos(PI / 180 * ang1);
+ real startYarc = arcradius * sin(PI / 180 * ang1);
+ real endXarc = arcradius * cos(PI / 180 * endangle);
+ real endYarc = arcradius * sin(PI / 180 * endangle);
+ printf("ARC CCW (%s %s) (%s %s) (%s %s);\n",
+ format(arcx + startXarc), format(arcy + startYarc),
+ format(arcx - startXarc), format(arcy - startYarc),
+ format(arcx + endXarc), format(arcy + endYarc) );
+ }
+ } while (c[n]);
+ return ;
+ }
+void ShapeDef(void) {
+ n++;
+ shapename = read(cr, 1);
+ printf("EDIT '" + shapename + ".PAC';\n");
+ printf("CHANGE FONT VECTOR;\n");
+ real ShapeNameRelx = val2mil(read(' ', 0));
+ real ShapeNameRely = val2mil(read(' ', 0));
+ real ShapeNameHeight = val2mil(read(' ', 0));
+ real ShapeNameRotate = strtod(read(' ', 0));
+ real ShapeNameWidth = val2mil(read(' ', 0));
+ real ShapeNameThickness = strtod(read(' ', 1));
+ real AliasNameRelx = val2mil(read(' ', 0));
+ real AliasNameRely = val2mil(read(' ', 0));
+ real AliasNameHeight = val2mil(read(' ', 0));
+ real AliasNameRotate = strtod(read(' ', 0));
+ real AliasNameWidth = val2mil(read(' ', 0));
+ real AliasNameThickness = strtod(read(' ', 1));
+ if (ShapeNameHeight == 0) {
+ ShapeNameHeight = 1;
+ }
+ real strglen2 = stringLength(shapename, ShapeNameHeight) / 2;
+ printf ("CHANGE SIZE %s;\n", format(ShapeNameHeight ) );
+ printf ("CHANGE LAYER 25;\n");
+ printf ("TEXT '>NAME' (%s %s);\n", format(ShapeNameRelx - strglen2), format(ShapeNameRely - (ShapeNameHeight / 2)) );
+ if (AliasNameHeight == 0) {
+ AliasNameHeight = 1;
+ }
+ strglen2 = stringLength(shapename, AliasNameHeight) / 2;
+ printf ("CHANGE SIZE %s;\n", format(AliasNameHeight) );
+ printf ("CHANGE LAYER 27;\n");
+ printf ("TEXT '>VALUE' (%s %s);\n", format(AliasNameRelx), format(AliasNameRely- (AliasNameHeight / 2)) );
+ n++;
+ string RthJuncBoard = read(cr, 1);
+ outlinedescript();
+ n++;
+ cntShape++;
+ pointPackPin[cntShape] = cntrefPin;
+ refPackname[cntShape] = shapename;
+ pindescript();
+ arcdescript();
+ return ;
+ }
+string nnameCheck(string name, int nb) {
+ name = strsub(name, 1);
+ if (name == "") {
+ sprintf(name, "SB$%d", nb);
+ }
+ int ch;
+ do {
+ ch = strchr( name, '\'');
+ if (ch == -1) break;
+ else name[ch] = '/';
+ } while (ch != -1);
+ return name;
+ }
+void NetDef(void) {
+ n+= 2;
+ net++;
+ netname[net] = read(' ' ,0);
+ if(netname[net] == "65535") {
+ netname[net] = "";
+ dlgMessageBox("NEt 65535","OK");
+ }
+ nettracecode[net] = strtod(read(' ' ,0));
+ netxlo[net] = strtol(read(' ' ,0));
+ netxhi[net] = strtol(read(' ' ,0));
+ netylo[net] = strtol(read(' ' ,0));
+ netyhi[net] = strtol(read(' ' ,0));
+ netxsum[net] = strtol(read(' ' ,0));
+ netysum[net] = strtol(read(' ' ,0));
+ netpincount[net] = strtod(read(';' ,1));
+ netname[net] = nnameCheck(netname[net], net);
+ return ;
+ }
+string GenNet(void) {
+ string sign = "";
+ for (int s = 0; s <= net; s++) {
+ string sig;
+ sprintf(sig, "SIGNAL '%s'\n%s\n", netname[s], signal[s] );
+ sign += sig;
+ }
+ return sign;
+ }
+void ComponentDef(void) {
+ n += 1;
+ comp++;
+ string componentName = read(' ', 0);
+ string componentAlias = read(' ', 0);
+ string componentShapename = read(cr, 1);
+ real componentX = val2mil(read(',', 0));
+ real componentY = val2mil(read(',', 0));
+ real componentRotate = strtod(read(',', 0)) / rotatemultiple;
+ real componentNameX = val2mil(read(',', 0));
+ real componentNameY = val2mil(read(',', 0));
+ real componentNameRotate = strtod(read(',', 0)) / rotatemultiple;
+ real componentNameHeight = val2mil(read(',', 0));
+ real componentNameWidth = val2mil(read(',', 0));
+ real componentNameThick = strtod(read(',', 0));
+ real componentAliasX = val2mil(read(',', 0));
+ real componentAliasY = val2mil(read(',', 0));
+ real componentAliasRotate = strtod(read(',', 0)) / rotatemultiple;
+ real componentAliasHight = val2mil(read(',', 0));
+ real componentAliasWidth = val2mil(read(',', 0));
+ real componentAliasThick = val2mil(read(cr, 1));
+ string ca;
+ sprintf(ca, "CHANGE LAYER 27;\n");
+ cmdvalue += ca;
+ if (componentAliasHight == 0) componentAliasHight = 1;
+ sprintf (ca, "change size %s;\n", format(componentAliasHight) );
+ cmdvalue += ca;
+ if (componentAliasThick <= 0) componentAliasThick = 50;
+ sprintf (ca, "change ratio %.0f;\n", componentAliasThick / 100 * TextRatio );
+ cmdvalue += ca;
+ sprintf(ca, "TEXT '%s' R%.0f (%s %s);\n", componentAlias, componentAliasRotate, format(componentAliasX), format(componentAliasY) );
+ cmdvalue += ca;
+ real stringlengh_2 = stringLength(componentName, componentNameHeight ) / 2;
+ sprintf(ca, "%s\n%.2f\n%.0f\n%s\n%s\n", componentName, stringlengh_2, componentNameRotate, format(componentNameX), format(componentNameY) );
+ cmdchname += ca;
+ sprintf (ca, "%s\n", format(componentNameHeight) );
+ cmdchname += ca;
+ sprintf (ca, "%.0f\n", componentNameThick / 100 * TextRatio );
+ cmdchname += ca;
+ real componentXforceVect = val2mil(read(',', 0));
+ real componentYforceVect = val2mil(read(',', 0));
+ real componentTempcase = val2mil(read(',', 0));
+ real componentTempjunc = val2mil(read(',', 0));
+ real componentPower = val2mil(read(',', 0));
+ real componentRTHjuncboard = val2mil(read(',', 0));
+ real nul = val2mil(read(cr, 0));
+ sprintf(st, "ADD %s '%s' R%.0f (%s %s);\n", componentShapename, componentName, componentRotate, format(componentX), format(componentY) );
+ brd += st;
+ sprintf(st, "SMASH (%s %s);\n", format(componentX), format(componentY) );
+ brd += st;
+ int pin = 0;
+ int z = 0;
+ for ( int p = 0 ; p <= cntShape ; p++ ) {
+ if ( componentShapename == refPackname[p]) {
+ z = pointPackPin[p];
+ break ;
+ }
+ }
+ do {
+ string componentNetNr = read(' ', 0);
+ string componentPadSetting = read(' ', 1);
+ if (componentNetNr == ";") break;
+ int NetNr = strtod(componentNetNr);
+ if (NetNr <= net) {
+ string sig;
+ sprintf(sig, "%s %s\n", componentName, refPinNr[z + pin]);
+ signal[NetNr] += sig;
+ pin++;
+ }
+ } while (c[n]);
+ n--;
+ return ;
+ }
+void LTrace(void) {
+ n++;
+ int Tracelayer = strtol(read(' ', 0));
+ real Tracecoord1 = strtod(read(cr, 0));
+ n++;
+ do {
+ string Tracec2 = read(' ', 0);
+ if (Tracec2 == ";") { n++; break;}
+ real Tracecoord2 = strtod(Tracec2);
+ real Tracecoord3 = strtod(read(' ', 0));
+ int TraceNetnr = strtol(read(' ', 0));
+ int TraceCode = strtol(read(' ', 0));
+ int TraceType = strtol(read(' ', 0));
+ int TraceOrient = strtol(read(' ', 0));
+ route(Tracelayer, Tracecoord1, Tracecoord2, Tracecoord3, TraceNetnr, TraceCode, TraceType, TraceOrient);
+ } while (c[n]);
+ return ;
+ }
+void LVector() {
+ n++;
+ int VectLayer = strtod(read(' ', 0));
+ real VectX1 = strtol(read(' ', 0));
+ real VectY1 = strtol(read(' ', 0));
+ real VectX2 = strtol(read(' ', 0));
+ real VectY2 = strtol(read(' ', 0));
+ int VectNetnr = strtod(read(' ', 0));
+ int VectTraceCode = strtod(read(' ', 0));
+ string VectTraceType = read(cr, 1);
+ rwire(VectNetnr, VectLayer, VectX1, VectY1, VectX2, VectY2);
+ return ;
+ }
+void LArc(void) {
+ n++;
+ int ArcLayer = strtod(read(' ', 0));
+ real ArcX = val2mil(read(' ', 0));
+ real ArcY = val2mil(read(' ', 0));
+ real ArcRadius = val2mil(read(' ', 0));
+ real Arc1 = strtol(read(' ', 0)) / rotatemultiple;
+ real Arc2 = strtol(read(' ', 0)) / rotatemultiple;
+ int ArcNetnr = strtod(read(' ', 0));
+ int ArcTraceCode = strtod(read(' ', 0));
+ string ArcTraceType = read(cr, 1);
+ arcDraw( ArcLayer, ArcX, ArcY, ArcRadius, Arc1, Arc2, ArcNetnr, ArcTraceCode, ArcTraceType);
+ return ;
+ }
+string polygonstart(void) {
+ string polygx1 = read(' ', 0);
+ string polygy1 = read(' ', 0);
+ string polystart;
+ sprintf(polystart, "(%s %s) ", format(val2mil(polygx1)), format(val2mil(polygy1)));
+ return polystart;
+ }
+void LPolygon(void) {
+ n++;
+ int PolyLayer = strtod(read(' ', 0));
+ int PolyNetnr = strtod(read(' ', 0));
+ string PolyPattern = read(' ', 0);
+ string PolyDummy = read(' ', 0);
+ int PolyDist = strtod(read(' ', 0));
+ int PolyCode = strtod(read(' ', 0));
+ int PolyClearance = strtod(read(' ', 0));
+ string PolyType = read(cr, 1);
+ string pld;
+ sprintf(pld , "\n Layer %d\n Net %s\n Pattern %s\n Dist %d\n Code %d\n Clearance %d\n Type %s\n Dummy %s",
+ PolyLayer,
+ netname[PolyNetnr],
+ PolyPattern,
+ PolyDist,
+ PolyCode,
+ PolyClearance,
+ PolyType,
+ PolyDummy
+ );
+ n++;
+ polygon += "CHANGE LAYER " + refLayer[PolyLayer] + ";\n";
+ polygon += "CHANGE ORPHANS ON;\n";
+ polygon += "CHANGE WIDTH " + format(v2mil(nettracecode[PolyNetnr])) + ";\n";
+ polygon += "CHANGE ISOLATE " + format(v2mil(PolyCode)) + ";\n";
+ int fillpoly = 1;
+ string polystart = polygonstart();
+ polygon += "POLYGON " + "'" + netname[PolyNetnr] + "' " + polystart ;
+ string TotalPolygon = "";
+ do {
+ string TotalPolygon = readstring(' ', semikolon, polysepar);
+ if(TotalPolygon[0] == semikolon) {
+ n++;
+ polygon += ";\n";
+ return;
+ }
+ if(TotalPolygon[0] == polysepar) {
+ n+= 3;
+ fillpoly = 0;
+ polystart = polygonstart();
+ if (fillpoly) {
+ polygon += ";\nPOLYGON " + "'" + netname[PolyNetnr] + "' " + polystart ;
+ }
+ TotalPolygon = "";
+ }
+ else {
+ if (fillpoly) {
+ polygon += TotalPolygon;
+ TotalPolygon = "";
+ polygon += polystart;
+ }
+ polystart = polygonstart();
+ }
+ } while (c[n]);
+ }
+void ViaList(void) {
+ n++;
+ string via;
+ int ViaX = strtod(read(cr, 1));
+ do {
+ string VY = read(' ', 0);
+ if (VY == ";") break;
+ int ViaY = strtod(VY);
+ int ViaNetnr = strtod(read(' ', 0));
+ int ViaPadCode = strtod(read(' ', 0));
+ string ViaPadSetting = read(' ', 0);
+ real ViaPadRotation = strtol(read(' ', 0)) / 32;
+ int ViaPadShift = strtod(read(' ', 0));
+ string ViaIndex = read(' ', 0);
+ string ViaGLueFlag = read(';', 1);
+ sprintf(via , "CHANGE SHAPE ROUND;\n");
+ brd += via;
+ sprintf(via , "CHANGE DIAMETER %s;\n", format(v2mil( pad2bottomY[ViaPadCode])) );
+ brd += via;
+ sprintf(via , "CHANGE DRILL %s;\n", format(v2mil( drillcode[ViaPadCode])) );
+ brd += via;
+ sprintf(via , "VIA '%s' (%s %s);\n", netname[ViaNetnr], format(v2mil(ViaX)), format(v2mil(ViaY)) );
+ brd += via;
+ } while (c[n]);
+ return ;
+ }
+void Text(void) {
+ n++;
+ string text;
+ real TextX = strtod(read(' ', 0));
+ real TextY = strtod(read(' ', 0));
+ real TextHeight = strtod(read(' ', 0));
+ real TextWidth = strtod(read(' ', 0));
+ real TextThick = strtod(read(' ', 0));
+ real TextRotation = strtod(read(' ', 0)) / rotatemultiple;
+ int TextLayer = strtod(read(' ', 0));
+ string TextString = readTstring();
+ real strgLength2 = stringLength( TextString, TextHeight) / 2;
+ sprintf(text, "CHANGE SIZE %s\n", format(v2mil(TextHeight)) );
+ brd += text;
+ sprintf( text, "CHANGE LAYER %s;\n", refLayer[TextLayer]);
+ brd += text;
+ int ro = TextRotation;
+ if (TMrefLayer[TextLayer] == "M") {
+ strgLength2 = (strgLength2 * -1);
+ }
+ switch (ro) {
+ case 0 : sprintf(text , "TEXT '%s' %sR%.0f (%s %s);\n",
+ TextString, TMrefLayer[TextLayer], TextRotation,
+ format(v2mil(TextX - (strgLength2))), format(v2mil(TextY - (TextHeight / 2))) );
+ break;
+ case 90 : sprintf(text , "TEXT '%s' %sR%.0f (%s %s);\n",
+ TextString, TMrefLayer[TextLayer], TextRotation,
+ format(v2mil(TextX + (TextHeight / 2))), format(v2mil(TextY - (strgLength2))) );
+ break;
+ case 180 : sprintf(text , "TEXT '%s' %sR%.0f (%s %s);\n",
+ TextString, TMrefLayer[TextLayer], TextRotation,
+ format(v2mil(TextX + (strgLength2))), format(v2mil(TextY + (TextHeight / 2))) );
+ break;
+ case 270 : sprintf(text , "TEXT '%s' %sR%.0f (%s %s);\n",
+ TextString, TMrefLayer[TextLayer], TextRotation,
+ format(v2mil(TextX - (TextHeight / 2))), format(v2mil(TextY + strgLength2)) );
+ break;
+ }
+ brd += text;
+ return ;
+ }
+void RecTechnology(void) {
+ n++;
+ switch (c[n]) {
+ case 'P' : padset();
+ break;
+ case 'T' : TraceCode();
+ break;
+ case 'C' : Drilltolerance();
+ break;
+ case 'D' : DrillCode();
+ break;
+ case '0' : PadDefinitionInner();
+ break;
+ case '1' : PadDefinitionTop();
+ break;
+ case '2' : PadDefiniBottom();
+ break;
+ case 'S' : WaveSolderDir();
+ break;
+ }
+ return ;
+ }
+void SubRecordL(void) {
+ n++;
+ switch (c[n]) {
+ case 'T' : LTrace();
+ break;
+ case 'V' : LVector();
+ break;
+ case 'A' : LArc();
+ break;
+ case 'P' : LPolygon();
+ break;
+ }
+ return ;
+ }
+void Record(void) {
+ n++;
+ switch (c[n]) {
+ case 'P' : Headerfield();
+ break;
+ case 'T' : RecTechnology();
+ break;
+ case 'S' : ShapeDef();
+ break;
+ case 'N' : NetDef();
+ break;
+ case 'C' : ComponentDef();
+ break;
+ case 'L' : SubRecordL();
+ break;
+ case 'V' : ViaList();
+ break;
+ case 'X' : Text();
+ break;
+ }
+ return ;
+}
+void BRDTrailer(void) {
+ printf("CHANGE LAYER 20;\n");
+ printf("SET WIRE_BEND 0;\n");
+ printf("WIRE 0 (%s %s) (%s %s) (%s %s) ;\n",
+ format(v2mil(boardoutline[1])),
+ format(v2mil(boardoutline[2])),
+ format(v2mil(boardoutline[3])),
+ format(v2mil(boardoutline[4])),
+ format(v2mil(boardoutline[1])),
+ format(v2mil(boardoutline[2]))
+ );
+ printf("CHANGE SIZE 50;\n");
+ real tx;
+ if (boardoutline[1] < boardoutline[3]) tx = boardoutline[1];
+ else tx = boardoutline[3];
+ real ty;
+ if (boardoutline[2] > boardoutline[4]) ty = boardoutline[2];
+ else ty = boardoutline[4];
+ int yy = 75;
+ printf("# 'ULTIBOARD - %s Version %s Revision %s' (%s %s);\n", costomer, versionnumb, revisionnum, format(v2mil(tx)) ,format(v2mil(ty) + yy) );
+ yy += 75;
+ printf("# 'with import filter : %s %s' (%s %s);\n", filter, Version, format(v2mil(tx)) ,format(v2mil(ty) + yy) );
+ yy += 75;
+ printf("# 'converted from ULTIBOARD-DDF file : %s at %s' (%s %s);\n", ddffile, t2string(time()), format(v2mil(tx)) ,format(v2mil(ty) + yy) );
+ yy += 75;
+ printf("# '%s' (%s %s);\n", EAGLE_SIGNATURE, format(v2mil(tx)) ,format(v2mil(ty) + yy) );
+ yy += 75;
+ }
+void sign() {
+ printf("# %s\n", EAGLE_SIGNATURE);
+ printf("# Script converted from ULTIBOARD-DDF file : %s at %s\n", ddffile, t2string(time()) );
+ printf("# with %s\n\n", filter );
+ return;
+ }
+void LBRdescript(void) {
+ printf("Description 'Library converted from ULTIBOARD-DDF file : \\n\\\n %s at %s \\n\\\n with import filter : %s';\n", ddffile, t2string(time()), filter );
+ }
+void ULPhelp(void) {
+ dlgDialog("Import ddf help") {
+ dlgStretch(0);
+ dlgHBoxLayout {
+ dlgSpacing(500);
+ }
+ dlgStretch(0);
+ dlgLabel(usage, 1);
+ dlgStretch(0);
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgPushButton("+&OK") dlgAccept();
+ dlgStretch(0);
+ dlgPushButton("-&Cancel") {dlgReject(); exit(0);}
+ dlgStretch(1);
+ dlgPushButton("&Version Info") dlgMessageBox(ULTIBoardinfo, "OK");
+ dlgStretch(0);
+// dlgPushButton("Hilf&e") dlgMessageBox(InfoDE, "OK");
+// dlgStretch(0);
+ dlgPushButton("&Help") dlgMessageBox(InfoUS, "OK");
+ dlgStretch(0);
+ }
+ dlgStretch(1);
+ };
+ }
+void main(void) {
+ if (board) board(B) {
+ char bkslash = '/';
+ int pos = strrchr(argv[0], bkslash);
+ if (argv[1] == "") ULPhelp();
+ if (argv[1] == "PASS2") importpass2();
+ else {
+ if (pos >= 0) {
+ ulp_path = strsub(argv[0], 0, pos + 1);
+ }
+ filter = strsub(argv[0], pos + 1);
+ fileName = dlgFileOpen("Select a DDF-File", "", "*.ddf");
+ }
+ if (!fileName) exit (0);
+ string changetextfile = filesetext(fileName, tmpchtxtfile);
+ string scriptfile = filesetext(fileName, tmpextfile);
+ pos = strrchr(fileName, bkslash);
+ ddffile = strsub(fileName, pos + 1);
+ nBytes = fileread(c, fileName);
+ output(scriptfile, "wt") {
+ sign();
+ printf("OPEN '%s';\n", filesetext(fileName, ".lbr"));
+ LBRdescript();
+ do {
+ switch (c[n]) {
+ case 0:
+ break;
+ case '*': Record();
+ break;
+ case ';': break;
+ case 10:
+ break;
+ case 12:
+ break;
+ case 13:
+ break;
+ case 27: cmd += "\nEscape\n";
+ break;
+ default: test(c[n]);
+ break;
+ }
+ n++;
+ } while (n <= nBytes);
+ printf("SET UNDO_LOG ON;\n");
+ printf("WRITE\n");
+ printf("CLOSE;\n");
+ sign();
+ printf("EDIT '%s'\n", filesetext(fileName, ".brd") );
+ printf("SET VECTOR_FONT ON;\n");
+ printf("%s", scriptheader());
+ printf("USE -*;\n");
+ printf("USE '%s';\n",filesetext(fileName, ".lbr") );
+ printf("\n%s\nWINDOW FIT;\n", brd);
+ printf("%s\n", GenNet() );
+ printf("%s\n", cmdroute);
+ printf("%s\n", arcscript);
+ if (polygon) printf("%s\n", polygon);
+ printf("RATSNEST;\n");
+ BRDTrailer();
+ printf("SET UNDO_LOG ON;\n");
+ printf("WINDOW FIT;\n");
+ printf("WRITE;\n");
+ printf("RUN '%s' 'PASS2' '%s';\n", argv[0], changetextfile);
+ }
+ output(changetextfile, "wt") {
+ printf("%s\n", cmdchname);
+ }
+ string ecmd = "SCRIPT '" + scriptfile + "';\n";
+ string r;
+ sprintf(r, "REMOVE '%s';\n", scriptfile);
+ ecmd += r;
+ sprintf(r, "REMOVE '%s';\n", filesetext(changetextfile, "$" + tmpextfile) );
+ ecmd += r;
+ sprintf(r, "REMOVE '%s';\n", changetextfile);
+ ecmd += r;
+ exit (ecmd);
+ }
+ else {
+ dlgMessageBox( "ERROR:\nStart this ULP from a Board", "&OK") ;
+ }
+ }
diff --git a/eagle-5.7.0/ulp/length-freq-ri.ulp b/eagle-5.7.0/ulp/length-freq-ri.ulp
new file mode 100644
index 0000000..b3346ba
--- /dev/null
+++ b/eagle-5.7.0/ulp/length-freq-ri.ulp
@@ -0,0 +1,187 @@
+#usage "Create a list of all signals with various data\n"
+ " "
+ "Creates a list of all signals of a board, together "
+ "with their maximum frequency, length, area, resistance, "
+ "minimum and maximum width and maximum current."
+ " "
+ "This is a very simplified calculation for a first evaluation "
+ "of the layout."
+ " "
+ "Parallel tracks and polygons are not taken into consideration."
+ " "
+ " "
+ "(nur Layer 1 bis 16) und die zugehoerige Frequenz (f=c/l) "
+ "und erzeugt eine Textdatei length-ri.txt, die alle Signale nach "
+ "Frequenz bzw Laenge sortiert enthaelt. "
+ "Bei der Frequenzberechnung handelt es sich um eine ganz einfache "
+ "Umrechnung, die eine erste Abschaetzung bzgl. Stoerstrahlung erlaubt. "
+ "Zusaetzlich wird die minimale und maximale Leiterbahnbreite ermittelt "
+ "und die daraus resultierende Strombelastung. "
+ "Bei der Widerstands- und Strombelastbarkeits-Berechnung wird die "
+ "minimale Leiterbahnbreite herangezogen. "
+ "Es wird auch keine eine Parallelführung bzw. Fläche (Polygon) "
+ "berücksichtigt. "
+ "A. Zaffran 05.04.2000 alf@cadsoft.de "
+*/
+
+real f, WLtotal;
+int index[];
+
+ // ** aus "Mechanik der Elektronik"
+ // mm <1 1 2 3 4 5 6 7 8 9 10 11 12 13 mm Leiterbreite bei 35 um Cu
+
+real k[] = { 9, 8.8, 6, 4, 3.2, 2.9, 2.9, 2.9, 2.9, 2.9, 2.9, 2.9, 2.9, 2.9, 2.9 };
+
+ // _______________________
+ // Imax ~ 5.25 V [d x b x (d + b)] x k || (tL ~60°)
+ //
+ // d = um Cu-Kaschierung
+ // b = Breite mm
+ // k = Korrekturwert aus Tabelle 02.02.2000 alf
+ // ** aus "Mechanik der Elektronik"
+
+real Cu = 0.035; // 35 um Cu Kaschierung
+
+real Length[], Freq[], Widthmin[], Widthmax[];
+string Signal[];
+
+real c = 299800; // Lichtgechwindigkeit Vakuum in [km/s]
+
+int n = 0;
+int t;
+string data[];
+string h;
+string header;
+int note = 0;
+
+void dialog(void)
+{
+ int select = 0;
+ int Result = dlgDialog("Wire length of Layout") {
+ dlgLabel(header);
+ string lab;
+ sprintf(lab, " Cu thickness = %.3f mm", Cu);
+ dlgLabel(lab);
+ dlgListView("", data, select);
+ dlgStretch(0);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("+&Save") {
+ board(B) {
+ string FileName = dlgFileSave("Save list", filesetext(B.name, ".txt"));
+ if (FileName) {
+ output (FileName, "wt") {
+ printf("%s", header);
+ for (int x = 0; x < t; x++)
+ printf("%s\n", data[x]);
+ if (note) {
+ sprintf( h, "\n *** note wire width.\n");
+ data[t] += h;
+ t++;
+ }
+ }
+ }
+ }
+ }
+ dlgPushButton("-Close") dlgReject();
+ }
+ };
+ if (!Result)
+ exit(0);
+}
+
+real WireLength(real x1, real x2, real y1, real y2)
+{
+ return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
+}
+
+real ArcLength(real ang1, real ang2, real radius)
+{
+ return radius * 2 * PI / 360 * (ang2 - ang1);
+}
+
+real Frequency(real c, real l)
+{
+ return c / l;
+}
+
+void WireWidth(string sig, real w)
+{
+ // ermitteln der min-max Leiterbahnbreite
+ if (w < Widthmin[n]) Widthmin[n] = w;
+ if (w > Widthmax[n]) Widthmax[n] = w;
+}
+
+real imax(real breite)
+{
+ return (breite == 0) ? 0 : 5.25 * sqrt((Cu * breite * (Cu + breite)) * k[int(trunc(breite))]);
+}
+
+if (board) board(B) {
+ sprintf(h, "%s\n", EAGLE_SIGNATURE);
+ header += h;
+ sprintf(h, "List of signals with length and its max. frequency / current\n");
+ header += h;
+ sprintf(h, "exported from %s\nat %s\n", B.name, t2string(time()));
+ header += h;
+
+ B.signals(S) {
+ WLtotal = 0;
+ Widthmin[n] = 32000;
+ Widthmax[n] = 0;
+ S.wires(W) {
+ if (W.layer < 17) { // nur Kupfer-Layer
+ if (W.arc) {
+ WLtotal += ArcLength(W.arc.angle1, W.arc.angle2, u2mm(W.arc.radius));
+ }
+ else {
+ WLtotal += WireLength(u2mm(W.x2), u2mm(W.x1), u2mm(W.y2), u2mm(W.y1));
+ }
+ WireWidth(S.name, u2mm(W.width));
+ }
+ }
+ if (WLtotal != 0) {
+ Signal[n] = S.name;
+ Length[n] = WLtotal;
+ Freq[n] = Frequency(c, WLtotal);
+ ++n;
+ }
+ }
+ sort(n, index, Freq);
+
+ sprintf(h, "Signal\tf max. [MHz]\tl [mm]\tA [mm2]\tR [mOhm]\tw min [mm]\tw max [mm]\tImax [A]");
+ data[0] = h;
+ t = 1;
+
+ for (int i = 0; i < n; ++i) {
+ real mm2 = Widthmin[index[i]] * Cu;
+ real mOhm = 0;
+ string R;
+ if (Widthmin[index[i]]) {
+ mOhm = (174 * Length[index[i]] / 10) / ( Cu * 1000 * Widthmin[index[i]]);
+ sprintf(R, "%7.2f", mOhm);
+ }
+
+ sprintf(h, "%s\t%10.2f\t%7.3f\t%4.3f\t%s\t%6.3f\t%6.3f\t%6.2f", Signal[index[i]], Freq[index[i]], Length[index[i]], mm2, R, Widthmin[index[i]], Widthmax[index[i]], imax(Widthmin[index[i]]));
+ data[t] = h;
+
+ if (!Widthmin[index[i]]) {
+ note = 1;
+ sprintf( h, " ***");
+ data[t] += h;
+ }
+ t++;
+ }
+
+ dialog();
+ }
+
+else {
+ dlgMessageBox("\n Start this ULP in a Board \n");
+ exit (0);
+}
diff --git a/eagle-5.7.0/ulp/length.ulp b/eagle-5.7.0/ulp/length.ulp
new file mode 100644
index 0000000..d1b1297
--- /dev/null
+++ b/eagle-5.7.0/ulp/length.ulp
@@ -0,0 +1,254 @@
+#usage "This ULP calculates the signal length of routed tracks in the layout "
+ "EXAMPLE: "
+ "Wires in layers 1 to 16 will be added, airwires will be shown separately. "
+ " " +
+ "run length [name | name* | *name | *name*] " +
+ "Beispiel: " +
+ "Die Wire in den Layern 1 bis 16 werden addiert, die Airwire werden gesondert angegeben. " +
+ " "
+ "Generates Symbol and Device from a text file containing a list of pin names. "
+ " "+
+ "Bei Text-Dateien wird über die Anzahl der Trennzeichen der word separator ermittelt und voreingestellt. " +
+ "Um Text-Dateien (Tabellen) zu bearbeiten, gibt es folgende Möglichkeiten: " +
+ " " +
+ "Bei Text-Dateien kann ein Package aus der vorhandenen Use-Liste der geladenen LBR gewählt, oder über Package automatisch generiert werden. " +
+ "BGA-Package generieren (BSDL): Es wird davon ausgegangen, daß das Gehäuse symmetrisch aufgebaut ist. " +
+ " "+
+ "The number of separators in the text file determins and presets the word separator. " +
+ "There are the following possibilities to edit text files (spreadsheets): " +
+ " " +
+ "Generate a package (BSDL files only): The package is assumed to be designed symmetrically. " +
+ " ", x, grid_unit, maxminxy, grid_unit);
+ }
+ if (y > maxminxy || y < -maxminxy) {
+ sprintf(s, " ", y, grid_unit, maxminxy, grid_unit);
+ }
+ if (s) {
+ if (edit_type == e_symbol) s += "Check Symbol Pin Layout: Single | Dual | Quad before exiting this ULP Use MAP? \\n\\\nAuto generated by %s %s \\n\\\nAuto generated by %s %s "
+ "Start this ULP in the editor which contains the source values. Different counts of parts %5d Devices/SCH STOP "
+ "RUN microstrip-radial-stub"
+ " "
+ " "
+ "Press button Reference to generate a reference Package to place ";
+
+
+//
+// The various output devices
+//
+
+int defaultdevice = 2; // set default device
+int SelectedDevice = 0;
+string Device;
+
+enum { devScript = 1, devHPGL };
+
+string DeviceNames[] = { "Select a device", "SCRIPT", "HPGL" };
+string DeviceExt[] = { ".$$$" , ".scr", ".plt" };
+string DrillExt[] = { ".$$$" , "_drl.scr" , "" };
+string DefaultSuffix = DeviceExt[0];
+string DrlDefaultSuffix = DrillExt[0];
+string DrillLabel = "D&rill file";
+string DrBrowse = "Bro&wse";
+
+
+
+//
+// Parmameters
+//
+
+// *** The milling tool diameter ***
+real MillToolOutl = 0.2;
+real MillToolIsolate = 0.0; //
+int OverlapOutlPercent = 20; // percent, to avoid fine copper lines while milling out the area
+real MillToolFree = 0.8; // Blow up & free pouring
+int millfreeyes = 1; // free pouring on/off
+int OverlapRubOut = 20; // percent, to avoid fine copper lines while milling out the area
+real DrillPad = 0.8;
+real DrillVia = 0.8;
+real DrillHole = 0.8;
+int onlydrill = 0; // output only drill on HPGL
+int generatedrills = 1; // aktivate drills only in one export file
+ // while drills crashed in 2. run.
+real DimensionMillTool = 2.0; // milling board outline from holder
+
+real Distance_Copper_Dimension = 1.016; // default value
+real Holder_Spacing = 10.0; // in mm, the distance to make a holder spacing for outline miling.
+
+// The HPGL PEN list
+enum { PadDrill = 1, ViaDrill, Contour, BlowUp_RubOut, HoleDrill, DimensionLine } // HPGL Pen select "SP.."
+string PenList[];
+PenList[PadDrill] = "PadDrill";
+PenList[ViaDrill] = "ViaDrill";
+PenList[Contour] = "Contour";
+PenList[BlowUp_RubOut] = "Blow-Up/Rub-Out";
+//PenList[RubOut] = "Rub-Out";
+PenList[HoleDrill] = "HoleDrill";
+PenList[DimensionLine] = "DimensionLine";
+
+string sToolValue[]; // Tool diameter as String
+
+enum { HPGLsolution = 1016 } // Inch/1016 = 0.025 mm
+
+real Mirror = 1.0;
+string ref_pac = "_REFERENCE_HOLE_"; // special package for mirror milling data
+int mirr_offsetx = 0;
+int ref_null_offsetX = 0;
+int ref_null_offsetY = 0;
+int ref_offsetX[];
+int ref_offsetY[];
+int ref_cnto = 0;
+
+
+int Layer = 0;
+string fillstyle = "Interleave"; // 9 Interleave
+string lOutl; // 1. milling tool
+string lOutl1; // 2. milling tool 26.07.2006
+string lOutl2; // 3. milling tool
+string trueOutline_coordinate; // the generatet polygon outlines for the milling polygon
+
+string OutlinesSignalName = "_OUTLINES_"; // reserved Signal name for special polygon
+string OutlineMillSignal = "$_OUTLINEMILL_$";
+string PassDimensionPoly = "PASSDIMESION"; // the true output line defined by Layer 20 Dimension
+string Pass2 = "PASS_2";
+string PassPour = "PASS_POUR";
+string PassOutmill = "PASS_OUTLINE";
+string InPassDimensionPoly;
+string InPass2;
+string InPassPour;
+string InPassOutmill;
+int menu = 0;
+
+string showpic[];
+string info;
+string infotext;
+string path;
+string File, FileName;
+string DrFile, DrillFile;
+
+
+int test = 0;
+
+// *** Functions ***
+void viewtest(string txt) {
+ dlgDialog("test") {
+ dlgHBoxLayout {
+ dlgTextEdit(txt);
+ dlgVBoxLayout dlgSpacing(150);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("OK") dlgAccept();
+ dlgPushButton("Cancel") { dlgReject(); exit(0); }
+ dlgSpacing(400);
+ }
+ };
+ return;
+}
+
+void Warning(string Message, string Details) {
+ dlgMessageBox("Warning: " + Message + " " + Details, "OK");
+ return;
+}
+
+void Fatal(string Message, string Details) {
+ dlgMessageBox("ERROR: " + Message + " \n" + Details);
+ exit(1);
+}
+
+void Error(string Message, string Details) {
+ dlgMessageBox("ERROR: " + Message + " \n" + Details);
+}
+
+if (!board) Fatal("No board!", "This program can only work in the board editor.");
+
+void dirtest(void) {
+ string a[];
+ int n = fileglob(a, "*.*");
+ if (n) {
+ dlgMessageBox("Working directory:\n" + filedir(a[0]), "OK");
+ }
+ return;
+}
+
+string vunit(int val, int unit) {
+ string s;
+ if (unit) sprintf(s, "%.4f", u2mm(val));
+ else sprintf(s, "%.6f",u2inch(val));
+ return s;
+}
+
+
+string getval(string line, real exf, real refholediameter) {
+ int Y = strchr(line, 'Y');
+ string s;
+ sprintf(s, "(%.4f %.4f) (%.4f %.4f);\n",
+ strtol(strsub(line, 1)) * exf,
+ strtol(strsub(line, Y+1)) * exf,
+ strtol(strsub(line, 1)) * exf + refholediameter/2 * exf,
+ strtol(strsub(line,Y+1)) * exf );
+ return s;
+}
+
+void setZerroReference(void) {
+ int refunit = 0;
+ int format = 0;
+ string ReferenceUnit[] = { "INCH", "MM", "INCH", "MM" };
+ real exf[] = { 0.001, 0.0001, 0.001, 0.0001 };
+ // Drillformat 2.3 2.4 2.3 2.4
+ // Unit Inch Inch MM MM
+ real refhdiameter[] = { 118, 1180, 3000, 30000 };
+
+ int Result = dlgDialog(filename(argv[0]) + " - generate refernece and place on Board") {
+ dlgLabel(showpic[17]);
+ dlgLabel(infoREFERENCE);
+ dlgHBoxLayout {
+ dlgGroup("Unit") {
+ dlgHBoxLayout {
+ dlgRadioButton("INCH", refunit);
+ dlgRadioButton("MM", refunit);
+ dlgStretch(1);
+ }
+ }
+ dlgStretch(1);
+ }
+ dlgGroup("Format") {
+ dlgHBoxLayout {
+ dlgRadioButton("2.3", format);
+ dlgRadioButton("2.4", format);
+ dlgStretch(1);
+ }
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgStretch(1);
+ dlgPushButton("-Cancel") dlgReject();
+ }
+ };
+ if (Result) {
+ board(B) {
+ string usedlibraries = "USE -*;\n";
+ int u = 0;
+ do {
+ if (used_libraries[u]) {
+ usedlibraries += "USE '" + used_libraries[u] + "';\n";
+ u++;
+ }
+ } while(used_libraries[u]);
+ string used_scr = filedir(B.name) + "used-lbrs-" + filesetext(filename(B.name), ".scr");
+ output(used_scr, "wt") {
+ printf("%s", usedlibraries);
+ }
+ dlgMessageBox(" " +
+ "Spacers will be set on vertical & horizontal and in HPGL-Format only. " +
+ "The width of the spacer depends on the diameter of tool#2.";
+ }
+ }
+ dlgVBoxLayout dlgSpacing (400); // high of Cell
+ dlgStretch(0);
+ dlgVBoxLayout {
+ dlgStretch(0);
+ dlgLabel(info, 1);
+ dlgStretch(0);
+ dlgLabel(infotext, 1);
+ dlgStretch(1);
+ }
+ dlgStretch(1);
+ }
+ dlgStretch(1);
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgLabel("Mill fil&e");
+ dlgStretch(0);
+ dlgStringEdit(File);
+ dlgStretch(0);
+ dlgPushButton("&Browse") {
+ string fn = dlgFileSave("Save Outlines file", File);
+ if (fn) {
+ File = fn;
+ FileName = fn;
+ info = showpic[1];
+ }
+ }
+ dlgStretch(0);
+ }
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgLabel(DrillLabel);
+ dlgStretch(0);
+ dlgStringEdit(DrFile);
+ dlgStretch(0);
+ dlgPushButton(DrBrowse) {
+ string fd = dlgFileSave("Save Drill file", DrFile);
+ if (fd) {
+ DrFile = fd;
+ DrillFile = fd;
+ info = showpic[3];
+ }
+ }
+ dlgStretch(0);
+ }
+ dlgStretch(1);
+ dlgHBoxLayout dlgSpacing(600);
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgPushButton("+OK") {
+ if (!SelectedDevice) Error("No device selected!", "Please select a device.");
+ else {
+ int fault = 0;
+ real distanceDimension = DimensionMillTool / 2 - Distance_Copper_Dimension;
+ if (DimensionMillTool) { // **** if used ? ****
+ if (distanceDimension < 0) {
+ string d;
+ sprintf(d, "%.4f", distanceDimension * -1);
+ fault = dlgMessageBox(" "
+ "Check/change Distance Copper/Dimension in Design Rules DRC "
+ "or accept a distance of " + d +
+ "mm to board dimension. "
+ " "
+ "RUN mount-trace (this help page) "
+ "Tip: Define function key(s) with ASSIGN for easier use of this ULP. "
+ " " +
+ "RUN mount-trace (diese Hilfeseite) " +
+ "Tip: Setzen Sie sich Funktionstasten [ASSIGN] mit den Optionen für eine einfachere Bedienung. " +
+ " "
+ "Generates a file that can be used with mounting machines. "
+ "The x- and y- coordinates (units: mil) are calculated as mean of "
+ "maximum and mimimum value of the pads or smds origin points. "
+ "The calculated value does not necessarily fit with the origin "
+ "point of the part in the layout."
+ " "
+ "The syntax of the output data looks like this:"
+ " "
+ "value;x-coord;y-coord;rotation;name"
+ " "
+ " "
+ "Generates files for smds on the top and bottom layers "
+ "wich can be used with mounting machines. "
+ "The x and y coordinates (units: mm) of the SMD elements are calculated "
+ "as mean of maximum and mimimum value of the smds origin points. "
+ "The calculated value does not necessarily fit with the origin "
+ "point of the part in the layout."
+ " "
+ "The syntax of the output data looks like this:"
+ " "
+ "name x-coord y-coord rotation value package"
+ " "
+ " "
+ " "
+ " This ULP program smashes all texts on the silkscreen layers. It then normalizes the "
+ "texts so that they all have the same size and thickness. Ratio is calculated from "
+ "the desired thickness. Normalize silkscreen text sizes %s By Tennessee Carmel-Veilleux (veilleux@ameth.org) This ULP normalizes all the text on the silkscreen layers to "+
+ "the specified size and thickness. The ratio is automatically calculated " +
+ "from the size and thickness. Ratio clipped to 31 ! Make sure that text thickness is not too large for proper ratio. Text size clipped to 5.0mm ! "
+ "Generates outlines data for a board layout."
+ " "
+ "Usage: RUN outlines [ device [ width [ layer [ filename ]]]]"
+ " "
+ " "
+ " "
+ "Erzeugt Konturdaten für ein Platinenlayout."
+ " "
+ "Aufruf: RUN outlines [ device [ width [ layer [ filename ]]]]"
+ " "
+ " "
+ " \n" + Details);
+ exit(1);
+}
+
+void Error(string Message, string Details)
+{
+ dlgMessageBox("" + tr("ERROR: ") + Message + " \n" + Details);
+}
+
+//
+// Parmameters
+//
+
+string DefaultSuffix = ".out";
+
+string Device;
+real Width = 0;
+int Layer = 0;
+string FileName;
+
+if (!board)
+ Fatal(tr("No board!"), tr("This program can only work in the board editor."));
+
+if (argv[1]) {
+ Device = argv[1];
+ if (argv[2]) {
+ Width = strtod(argv[2]);
+ if (Width <= 0)
+ Fatal(tr("Illegal width: ") + argv[2], tr("The width must be greater than zero."));
+ if (argv[3]) {
+ Layer = strtol(argv[3]);
+ if (Layer < 0 || Layer > 16)
+ Fatal(tr("Illegal layer: ") + argv[3], tr("The layer must be one of 1..16 or 0 to use the current layer."));
+ if (argv[4]) {
+ FileName = argv[4];
+ }
+ }
+ }
+ }
+
+if (!FileName)
+ board(B) FileName = filesetext(B.name, DefaultSuffix);
+
+//
+// The various output devices
+//
+
+enum { devScript = 1, devHPGL };
+string DeviceNames[] = { tr("Select a device"), "Script", "HPGL" };
+int SelectedDevice;
+
+void DeviceInit(void)
+{
+ // Do anything necessary to initialize the output device
+ switch (SelectedDevice) {
+ case devScript:
+ // TODO make the layer user definable?
+ printf("layer %d;\nset wire_bend 2; grid mm; change width %f;\n", Layer + 100, Width);
+ break;
+ case devHPGL:
+ break;
+ }
+}
+
+void DeviceDraw(int x1, int y1, int x2, int y2, int state)
+{
+ // Actually draw a line on the output device.
+ // 'state' is defined as
+ // 0 = this is the first line of a partial polygon
+ // 1 = this is a "normal" line (neither the first nor the last one)
+ // 2 = this is the last line of a partial polygon
+ switch (SelectedDevice) {
+ case devScript:
+ if (state == 0)
+ printf("wire (%f %f) (%f %f)", u2mm(x1), u2mm(y1), u2mm(x2), u2mm(y2));
+ else {
+ printf(" (%f %f)", u2mm(x2), u2mm(y2));
+ if (state == 2)
+ printf(";\n");
+ }
+ break;
+ case devHPGL:
+ if (state == 0)
+ printf("PU; PA %f %f; PD; PA %f %f;", u2mm(x1), u2mm(y1), u2mm(x2), u2mm(y2));
+ else {
+ printf(" PA %f %f", u2mm(x2), u2mm(y2));
+ if (state == 2)
+ printf("\n");
+ }
+ break;
+ }
+}
+
+void DeviceEnd(void)
+{
+ // Do anything necessary to end output to the device
+ switch (SelectedDevice) {
+ case devScript:
+ break;
+ case devHPGL:
+ printf("PU;\n");
+ break;
+ }
+}
+
+//
+// The actual outlines generator
+//
+
+string OutlinesSignalName = "_OUTLINES_";
+string Pass2 = "PASS_2";
+
+int InPass2 = argv[5] == Pass2;
+
+void GenerateOutlines(void)
+{
+ board(B) {
+ real f = 20, // mm frame
+ x1 = u2mm(B.area.x1) - f, y1 = u2mm(B.area.y1) - f,
+ x2 = u2mm(B.area.x2) + f, y2 = u2mm(B.area.y2) + f;
+ B.signals(S) {
+ if (S.name == OutlinesSignalName)
+ Fatal(tr("There is already a signal named ") + OutlinesSignalName + tr(" in this board!"), tr("Please make sure that there is no such signal in this board."));
+ }
+ string Cmd;
+ sprintf(Cmd, "grid mm;\n"
+ "window fit;\n"
+ "change isolate 0;\n"
+ "change rank 6;\n"
+ "change pour solid;\n"
+ "change orphans on;\n"
+ "layer %d;\n"
+ "polygon %s %f (%f %f) (%f %f) (%f %f) (%f %f) (%f %f);\n"
+ "ratsnest;\n"
+ "run '%s' '%s' '%f' '%d' '%s' '%s';",
+ Layer,
+ OutlinesSignalName, Width, x1, y1, x2, y1, x2, y2, x1, y2, x1, y1,
+ argv[0], Device, Width, Layer, FileName, Pass2);
+ exit(Cmd);
+ }
+}
+
+void WriteOutlines(void)
+{
+ board(B) {
+ output(FileName) {
+ string Cmd;
+ B.signals(S) {
+ if (S.name == OutlinesSignalName) {
+ S.polygons(P) {
+ int x1 = INT_MAX, y1 = INT_MAX, x2 = INT_MIN, y2 = INT_MIN;
+ int x0, y0, first = 1;
+ int FrameWire;
+ int State;
+
+ P.wires(W) {
+ x1 = min(x1, W.x1);
+ x2 = max(x2, W.x1);
+ y1 = min(y1, W.y1);
+ y2 = max(y2, W.y1);
+ }
+ DeviceInit();
+ P.contours(W) {
+ if (first) {
+ // a new partial polygon is starting
+ x0 = W.x1;
+ y0 = W.y1;
+ FrameWire = (x1 == x0 || x2 == x0) && (y1 == y0 || y2 == y0);
+ State = 0;
+ first = 0;
+ }
+ else if (W.x2 == x0 && W.y2 == y0) {
+ // this was the last wire of the partial polygon,
+ // so the next wire (if any) will be the first wire
+ // of the next partial polygon
+ State = 2;
+ first = 1;
+ }
+ else
+ State = 1;
+ if (!FrameWire)
+ DeviceDraw(W.x1, W.y1, W.x2, W.y2, State);
+ }
+ DeviceEnd();
+ sprintf(Cmd, "delete (%f %f) (%f %f); window fit;\n", u2mm(x1), u2mm(y1), u2mm(x2), u2mm(y2));
+ }
+ break;
+ }
+ }
+ exit(Cmd);
+ }
+ }
+}
+
+//
+// Main program:
+//
+
+if (Device) {
+ int n;
+ while (DeviceNames[n]) {
+ if (strupr(DeviceNames[n]) == strupr(Device)) {
+ SelectedDevice = n;
+ break;
+ }
+ n++;
+ }
+ if (!SelectedDevice)
+ Fatal(tr("Illegal device: ") + Device, tr("Please select one of the known devices."));
+ }
+
+if (!InPass2) {
+ string Layers[];
+ int SelectedLayer = -1;
+ int ForceDialog = (!Device || !Width);
+
+ board(B) {
+ int n;
+ B.layers(L) {
+ if (L.number <= 16 && L.visible) {
+ if (Layer == L.number)
+ SelectedLayer = n;
+ sprintf(Layers[n++], "%d %s", L.number, L.name);
+ }
+ }
+ if (n == 0)
+ Fatal(tr("No signal layer active!"), tr("Please activate the signal layer to generate outlines for."));
+ if (!Layer) {
+ if (n > 1)
+ ForceDialog = 1;
+ SelectedLayer = 0;
+ }
+ if (SelectedLayer < 0) {
+ string s;
+ sprintf(s, "%d", Layer);
+ Fatal(tr("Invalid layer: ") + s, tr("The layer was not found or is not active."));
+ }
+ }
+
+ if (ForceDialog) {
+ dlgDialog(tr("Outlines Generator")) {
+ dlgGridLayout {
+ dlgCell(0, 0) dlgLabel("&Device");
+ dlgCell(0, 1) dlgComboBox(DeviceNames, SelectedDevice) {
+ // TODO should we generalize this?
+ if (FileName && SelectedDevice == devScript)
+ FileName = filesetext(FileName, ".scr");
+ }
+ dlgCell(1, 0) dlgLabel(tr("&Width"));
+ dlgCell(1, 1) dlgRealEdit(Width, 0, 10);
+ dlgCell(2, 0) dlgLabel(tr("&Layer"));
+ dlgCell(2, 1) dlgComboBox(Layers, SelectedLayer);
+ }
+ dlgHBoxLayout {
+ dlgLabel(tr("&Output file"));
+ dlgStringEdit(FileName);
+ dlgPushButton(tr("&Browse")) {
+ string fn = dlgFileSave(tr("Save Outlines file"), FileName);
+ if (fn)
+ FileName = fn;
+ }
+ }
+ dlgStretch(1);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+OK")) {
+ if (!SelectedDevice)
+ Error(tr("No device selected!"), tr("Please select a device."));
+ else if (!Width)
+ Error(tr("Illegal width: 0"), tr("The width must be greater than zero."));
+ else
+ dlgAccept();
+ }
+ dlgPushButton(tr("-Cancel")) { dlgReject(); exit(1); }
+ dlgPushButton(tr("About")) dlgMessageBox(usage);
+ }
+ };
+ }
+ Device = DeviceNames[SelectedDevice];
+ Layer = strtol(Layers[SelectedLayer]);
+ GenerateOutlines();
+ }
+else
+ WriteOutlines();
diff --git a/eagle-5.7.0/ulp/panelize.ulp b/eagle-5.7.0/ulp/panelize.ulp
new file mode 100644
index 0000000..8a64d23
--- /dev/null
+++ b/eagle-5.7.0/ulp/panelize.ulp
@@ -0,0 +1,131 @@
+#usage "Generate name layers to panelize board\n"
+ " "
+ "Generates a command sequence which copies the name texts (support spin-flag) "
+ "of all elements of your layout into newly generated layers (125 and 126). "
+ "After running the ULP you can GROUP, CUT and PASTE your layout "
+ "to get an array of several boards. Make sure all layers are displayed before."
+ " "
+ "The duplicated name texts in the new layers will not be changed. "
+ "Please notice that you have to deactivate layers 25 and 26 if you use "
+ "the CAM processor e.g. for generating gerber data. Instead, you have to activate "
+ "the new layers 125 and 126. Thus you get an identical silk screen for all "
+ "your layouts in this array."
+ " "
+ "Texts must be SMASHed before we can duplicate them! "
+ " "
+ " "
+ "Generates an HTML file of a board's partlist for publishing on an intranet."
+ " "
+ " Generated by PART2HTM v0.4 by Sean D. Alcorn "
+ " "
+ " "
+ "Depending from where you are starting the ULP, places pads (library) or vias (board). "
+ "The calculation of coils or inductivities depends on a lot of "
+ "different factors, like " +
+ "Dieses ULP kann in der Libary ebenso wie im Board benutzt werden. Pad/Via-Diameter %.f mm > Distance 'e' + 'w' + 'd' %.f mm Pad/Via-Drill %.f mm > Distance 'e' + 'w' + 'd' %.f mm %.4f mm difference at %.f full turns (%.1f turns) More turns as distance h, (check Calculate)/qt>");
+ dlgMessageBox(s, "OK");
+ ok = 0;
+ }
+ }
+
+ if (ok) {
+ if (!ferrit_length_L || !ferrit_length_K) ferrit_length_L = ferrit_length_K = 0;
+ dlgAccept();
+ degree_resol = turn_degree / arcresolution;
+ doit();
+ }
+ }
+ dlgStretch(0);
+ dlgPushButton("-Cancel") { dlgReject(); exit(0); }
+ dlgStretch(1);
+ dlgPushButton("Inf&o") dlgMessageBox(Help, "Ok");
+ }
+};
diff --git a/eagle-5.7.0/ulp/remove-dev-sym-pac.ulp b/eagle-5.7.0/ulp/remove-dev-sym-pac.ulp
new file mode 100644
index 0000000..e63bd10
--- /dev/null
+++ b/eagle-5.7.0/ulp/remove-dev-sym-pac.ulp
@@ -0,0 +1,92 @@
+#usage "Remove actual device/symbol/package and edit next\n"
+ " "
+ " "
+ "RUN rename-signals [suffix] "
+ " "
+ " \n" +
+ "Please verify that your corresponding layout file (if already existing) " +
+ "has been loaded with the schematic file. \n" +
+ "Otherwise back-/forward-annotation will not work afterwards. \n" +
+ "This version renumbers only devices with package (no supply) " +
+ "sorted by sheets and coordinates (vertical/descending, horizontal/ascending). \n" +
+ " You can change the following sorting parameters: \n" +
+ " descx = 0 (X ascending [left >> right]) \n" +
+ " descx = 1 (X descending [right >> left]) \n" +
+ " descy = 0 (Y ascending) \n" +
+ " descy = 1 (Y descending) \n";
+
+string Version = "4.2.0";
+int descy = 1; // set to 0 sorting ascending
+int descx = 0; // set to 1 sorting descending
+
+numeric string OldNames[], NewNames[];
+int x[], y[], i[], sh[];
+int nrNames = 0;
+
+numeric string SymNames[]; // Device-Name of Symbol
+int symsh[];
+int sx[], sy[];
+int Snr = 0;
+int Dnr = 0;
+
+string error = "";
+string SymPrefix[];
+string DevPrefix[];
+string DevName[];
+string SymDevName[];
+
+string cmd;
+string c;
+
+real Grid = 100; // in 100 Mil
+string lbr[], dev[], sym[];
+
+int GetNumberIndex(string Name)
+{
+ // Returns the index of the first digit of the numeric part of Name
+ // -1 indicates there is no numeric part in Name
+ int l = strlen(Name) - 1;
+ for (int i = l; i >= 0; --i) {
+ if (!isdigit(Name[i]))
+ return i < l ? i + 1 : -1;
+ }
+ return 0;
+}
+
+string prefix(string name) // Prefix of Device
+{
+ int num = GetNumberIndex(name);
+ if (num < 1) return name;
+ else {
+ string pfx = name;
+ pfx[num] = 0;
+ return pfx;
+ }
+}
+
+void DescendingY(void)
+{
+ for (int ny = 0; ny < nrNames ; ny++) {
+ y[ny] = 0 - y[ny];
+ }
+}
+
+void DescendingX(void)
+{
+ for (int nx = 0; nx < nrNames ; nx++) {
+ x[nx] = 0 - x[nx];
+ }
+}
+
+void SortElements(void)
+{
+ // Sorts the elements according to their location, first by ascending
+ // x coordinates, then by ascending y coordinates.
+ // If you prefer a different kind of sorting, you can implement this here.
+ // As a result, the integer array i[] must contain the new sequence
+ // in which to renumber the elements.
+ if (descy) DescendingY();
+ if (descx) DescendingX();
+
+ sort(nrNames,i, sh, y, x);
+ if (descy) DescendingY();
+ if (descx) DescendingX();
+ return;
+}
+
+void GenerateNames(void)
+{
+ // Generates new numeric parts to the element names in NewNames
+ for (int n = 0; n < nrNames - 1; ++n) {
+ int k = 0;
+ string s = NewNames[i[n]];
+ if (!isdigit(s[strlen(s) - 1])) {
+ for (int j = n; j < nrNames; ++j) {
+ if (NewNames[i[j]] == s) {
+ sprintf(NewNames[i[j]], "%s%d", NewNames[i[j]], ++k);
+ }
+ }
+ }
+ }
+ return;
+}
+
+void Rename(int x, int y, string New)
+{
+ // Generates the EAGLE command necessary to change element name Old to New
+ sprintf(c, "Name '%s' (%d %d);\n", New, x, y);
+ cmd += c;
+ return;
+}
+
+void GenerateScript(void)
+{
+ // Generates an EAGLE script file that does the whole renumbering.
+ // The tricky part here is that we cannot rename an element to a name
+ // that already exists in the schematic (which, e.g. might be necessary if
+ // we had to swap the names of two elements). Therefore we have to
+ // use a ScratchName wherever this is necessary.
+
+ // If there is nothing to do, the resulting script file will be empty.
+
+ int ScratchIndex = 0;
+ string ScratchName;
+ int sch = 0;
+ for (int n = 0; n < nrNames; ++n) {
+ if (sh[i[n]] != sch) {
+ sch = sh[i[n]]; // *** change sheet
+ sprintf(c, "Edit .s%d;\n", sch);
+ cmd += c;
+ }
+ if (OldNames[i[n]] != NewNames[i[n]]) {
+ for (int k = n + 1; k < nrNames; ++k) {
+ if (OldNames[i[k]] == NewNames[i[n]]) {
+ sprintf(ScratchName, "$%0*d", ELEMENT_NAME_LENGTH - 1, ++ScratchIndex);
+
+ if (sh[i[k]] != sch) {
+ sch = sh[i[k]]; // *** change sheet
+ sprintf(c, "Edit .s%d;\n", sch);
+ cmd += c;
+ }
+ Rename(x[i[k]],y[i[k]], ScratchName);
+
+ if (sh[i[n]] != sch) {
+ sch = sh[i[n]]; // *** change sheet
+ sprintf(c, "Edit .s%d;\n", sch);
+ cmd += c;
+ }
+
+ OldNames[i[k]] = ScratchName;
+ break;
+ }
+ }
+ if (sh[i[n]] != sch) {
+ sch = sh[i[n]]; // *** change sheet
+ }
+ Rename(x[i[n]],y[i[n]], NewNames[i[n]]);
+ }
+ }
+ return;
+}
+
+// *** check collision befor rename ***
+string CheckNames(void) {
+ string new_name = ";";
+ string h;
+
+ for (int Dn = 0; Dn < Dnr; Dn++ ) {
+ for (int Sn = 0; Sn < Snr; Sn++) {
+ if (DevPrefix[Dn] == SymPrefix[Sn]) {
+ sprintf(h, "# Do not use Prefix %s on Device with Package (%s) and Device without Package (%s)\n",
+ SymPrefix[Sn], DevName[Dn], SymDevName[Sn]);
+ error += h;
+ break;
+ }
+ }
+ }
+ for (int n = 0; n < nrNames - 1; ++n) { // make a long string
+ new_name += NewNames[n] + ";";
+ }
+
+ for (int xx = 0; xx < Snr - 1; xx++) {
+ string sd = SymNames[xx];
+ if(sd[0] == '$') { // if first character a $ on Symbolname
+ error += "# Do not use $ character on first position in device name\n";
+ sprintf(h, "# RENAME %s on (%.2f %.2f) - sheet %d befor run this ULP again' (%.2f %.2f)\n",
+ SymNames[xx], sx[xx] / 1000.0, sy[xx] / 1000.0, symsh[xx], sx[xx] / 1000.0, sy[xx] / 1000.0);
+ error += h;
+ }
+
+ int s;
+ int pos = strrstr(new_name, ";" + SymNames[xx] + ";");
+ if (pos > 0 ) {
+ for (s = 0; s < nrNames - 1; s++) {
+ if(NewNames[s] == SymNames[xx]) {
+ break;
+ }
+ }
+ error += "# Collision by symbol name and device name (eg. Frames, Supply ...)\n";
+ sprintf(h, "# Rename PREFIX of Device %s on (%.2f %.2f) - sheet %d befor rename %s on (%.2f %.2f) - sheet %d';\n",
+ SymNames[xx], sx[xx] / 1000.0, sy[xx] / 1000.0, symsh[xx],
+ OldNames[s], x[s] / 1000.0, y[s] / 1000.0, sh[s] );
+ error += h;
+ }
+ }
+ return error;
+}
+
+void setgridmil (void)
+{
+ sprintf(c, "GRID MIL 100 OFF;\n");
+ cmd += c;
+ // ## only display layer 94 (symbol) if placed a text
+ // ## on symbol origin. 15.06.2004 alf@cadsoft.de
+ sprintf(c, "DISPLAY NONE 94 -95 -96;\n");
+ cmd += c;
+ return;
+}
+
+void visible(UL_SCHEMATIC S) {
+ sprintf(c, "DISP NONE ");
+ cmd += c;
+ S.layers(L) {
+ if (L.visible) {
+ sprintf(c, "%d ", L.number);
+ cmd += c;
+ }
+ }
+ cmd += ";\n";
+ return;
+}
+
+void menue(void) {
+ int Result = dlgDialog("Renumber Schematic") {
+ dlgLabel(Info);
+ dlgHBoxLayout {
+ dlgGroup("Sort X") {
+ dlgRadioButton("&Ascending", descx);
+ dlgRadioButton("&Descending", descx);
+ }
+ dlgGroup("Sort Y") {
+ dlgRadioButton("A&scending", descy);
+ dlgRadioButton("D&escending", descy);
+ }
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+&OK") dlgAccept();
+ dlgStretch(1);
+ dlgPushButton("-&Cancel") dlgReject();
+ }
+ };
+ if (!Result) exit (0);
+ return ;
+ }
+
+if (schematic) {
+ schematic(S) {
+ menue();
+ int l = 1;
+ S.sheets(SH) {
+ SH.parts(P) {
+ int n = GetNumberIndex(P.name);
+ if (n > 0) {
+
+ if (P.device.package) { // **** only Devices with Package
+ // **** without Supply symbol Frames ect...
+ DevPrefix[Dnr] = prefix(P.name);
+ DevName[Dnr] = P.name;
+ ++Dnr;
+ P.instances(I) {
+
+ int found = -1;
+ for (int fn = 0; fn < nrNames; fn++) {
+ if (OldNames[fn] == P.name) {
+ found = fn;
+ break;
+ }
+ }
+ if (found < 0) {
+
+ x[nrNames] = u2mil(I.x); // cannot use E.x/y directly because of
+ y[nrNames] = u2mil(I.y); // sort() problem with integers > 32767
+ OldNames[nrNames] = P.name; // in version 3.50
+ NewNames[nrNames] = strsub(P.name, 0, n);
+ sh[nrNames] = I.sheet;
+ ++nrNames;
+ }
+
+ else {
+ if (sh[fn] == I.sheet) {
+ if ( u2mil(I.x) < x[fn] || u2mil(I.y) > y[fn] ) {
+ // tausche wenn x kleiner oder y groesser
+ x[fn] > u2mil(I.x);
+ y[fn] > u2mil(I.y);
+ }
+ }
+ }
+ }
+ }
+
+ // Only Symbol (Supply, Port, Frame...)
+ else { // *** check PartName on Symbols Supply, Port, Frame ... ***
+ SymPrefix[Snr] = prefix(P.name);
+ SymDevName[Snr] = P.name;
+ P.instances(I) {
+ SymNames[Snr] = P.name; // Device-Name of Symbol
+ sx[Snr] = u2mil(I.x); // cannot use E.x/y directly because of
+ sy[Snr] = u2mil(I.y); // sort() problem with integers > 32767
+ symsh[Snr] = I.sheet;
+ ++Snr;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ SortElements();
+ GenerateNames();
+ setgridmil ();
+ GenerateScript();
+
+ if (CheckNames()) {
+ int select;
+ dlgDialog("Symbol ref Device Names") {
+ dlgVBoxLayout {
+ dlgLabel("Warnings for renumber!");
+ dlgTextView(error);
+ }
+ dlgHBoxLayout {
+ dlgSpacing(450);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+&OK") dlgAccept();
+ dlgStretch(1);
+ }
+ };
+ exit (-1);
+ }
+
+ sprintf(c, "GRID INCH 0.1;\n");
+ cmd += c;
+ sprintf(c, "EDIT .S1;\n");
+ cmd += c;
+ visible(S);
+ exit (cmd);
+ }
+}
+
+else {
+ dlgMessageBox("\n Start this ULP in a Schematic \n");
+ exit (0);
+}
diff --git a/eagle-5.7.0/ulp/renumber-sheet.ulp b/eagle-5.7.0/ulp/renumber-sheet.ulp
new file mode 100644
index 0000000..184bacf
--- /dev/null
+++ b/eagle-5.7.0/ulp/renumber-sheet.ulp
@@ -0,0 +1,469 @@
+#usage "Renumber the parts of a schematic "
+ "This version renumbers only devices with packages (no supply) "
+ "sorted by sheets and coordinates (vertical/descending, horizontal/ascending). "
+ " \n" +
+ "Please verify that the corresponding layout file (if already existing) " +
+ "has been loaded with the schematic file. " +
+ "Otherwise back-/forward-annotation will not work afterwards.";
+
+string Infoplus =
+ " You can change the following sorting parameters: " +
+ " descx = 0 (X ascending [left >> right]) \n"
+ "RUN run-loop-all-devicesets-script [SCRIPT] "
+
+string Version = "1.0"; // 2008-08-28
+string ScriptFile = argv[1];
+string cmd, s;
+
+if (library) {
+ library(L) {
+ if (!ScriptFile) ScriptFile = dlgFileOpen("Select a SCRIPT to run in all DEVICESETS", path_scr[0], "*.scr");
+ if (!ScriptFile) exit(0);
+ L.devicesets(DS) {
+ sprintf(s, "EDIT %s.DEV;\nSCRIPT '%s';\n", DS.name, ScriptFile);
+ cmd += s;
+ }
+ }
+ exit (cmd);
+}
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/run-loop-all-lbr-script.ulp b/eagle-5.7.0/ulp/run-loop-all-lbr-script.ulp
new file mode 100644
index 0000000..cf1e375
--- /dev/null
+++ b/eagle-5.7.0/ulp/run-loop-all-lbr-script.ulp
@@ -0,0 +1,27 @@
+#usage "run a SCRIPT through all libraries in a directory \n"
+ "Load any library from the library directory and execute the SCRIPT. "
+ " "
+
+string a[], cmd;
+
+
+//-------- main program --------------------------------------------------
+
+if (library) {
+ library(L) {
+ string lbr_path = filedir(L.name);
+ string ScriptFile = dlgFileOpen("Select a SCRIPT to start in all LBRs", "", "*.scr");
+ if (!ScriptFile) exit(0); // 2006.02.20 librarian@cadsoft.de
+ int n = fileglob(a, lbr_path + "*.lbr");
+ if (n) {
+ for (int xl = 0; xl < n; xl++) {
+ string h;
+ sprintf(h, "OPEN '" + lbr_path + filename(a[xl]) + "';\nSCRIPT '" + ScriptFile + "';\n");
+ cmd += h;
+ }
+ }
+ }
+ exit (cmd);
+ }
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/run-loop-all-lbr-ulp.ulp b/eagle-5.7.0/ulp/run-loop-all-lbr-ulp.ulp
new file mode 100644
index 0000000..e33ba9a
--- /dev/null
+++ b/eagle-5.7.0/ulp/run-loop-all-lbr-ulp.ulp
@@ -0,0 +1,30 @@
+#usage "run a ULP through all libraries in a directory \n"
+ "This is an example how to loop through all libraries in a directory "
+ "and counts the devices. "
+ "Load any library from the library directory and execute the ULP. "
+ " "
+
+string a[], cmd;
+
+
+//-------- main program --------------------------------------------------
+
+
+if (library) {
+ library(L) {
+ string lbr_path = filedir(L.name);
+ string ulpFile = dlgFileOpen("Select a ULP to run in LBRs", "", "*.ulp");
+ if (!ulpFile) exit(0); // 2006.02.20 librarian@cadsoft.de
+ int n = fileglob(a, lbr_path + "*.lbr");
+ if (n) {
+ for (int xl = 0; xl < n; xl++) {
+ string h;
+ sprintf(h, "OPEN '" + lbr_path + filename(a[xl]) + "';\nRUN '" + ulpFile + "';\n");
+ cmd += h;
+ }
+ }
+ }
+ exit (cmd);
+ }
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/run-loop-all-packages-script.ulp b/eagle-5.7.0/ulp/run-loop-all-packages-script.ulp
new file mode 100644
index 0000000..6c3099b
--- /dev/null
+++ b/eagle-5.7.0/ulp/run-loop-all-packages-script.ulp
@@ -0,0 +1,21 @@
+#usage "Run a SCRIPT through all symbols in a library \n"
+ "RUN run-loop-all-packages-script [SCRIPT] "
+
+string Version = "1.0"; // 2008-08-28
+string ScriptFile = argv[1];
+string cmd, s;
+
+if (library) {
+ library(L) {
+ if (!ScriptFile) ScriptFile = dlgFileOpen("Select a SCRIPT to run in all PACKAGES", path_scr[0], "*.scr");
+ if (!ScriptFile) exit(0);
+ L.packages(P) {
+ sprintf(s, "EDIT %s.PAC;\nSCRIPT '%s';\n", P.name, ScriptFile);
+ cmd += s;
+ }
+ }
+ exit (cmd);
+}
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/run-loop-all-symbols-script.ulp b/eagle-5.7.0/ulp/run-loop-all-symbols-script.ulp
new file mode 100644
index 0000000..14be647
--- /dev/null
+++ b/eagle-5.7.0/ulp/run-loop-all-symbols-script.ulp
@@ -0,0 +1,21 @@
+#usage "Run a SCRIPT through all symbols in a library \n"
+ "RUN run-loop-all-symbols-script [SCRIPT] "
+
+string Version = "1.0"; // 2008-08-28
+string ScriptFile = argv[1];
+string cmd, s;
+
+if (library) {
+ library(L) {
+ if (!ScriptFile) ScriptFile = dlgFileOpen("Select a SCRIPT to run in all SYMBOLS", path_scr[0], "*.scr");
+ if (!ScriptFile) exit(0);
+ L.symbols(S) {
+ sprintf(s, "EDIT %s.SYM;\nSCRIPT '%s';\n", S.name, ScriptFile);
+ cmd += s;
+ }
+ }
+ exit (cmd);
+}
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/set-all-devices-attribute.ulp b/eagle-5.7.0/ulp/set-all-devices-attribute.ulp
new file mode 100644
index 0000000..cf044d3
--- /dev/null
+++ b/eagle-5.7.0/ulp/set-all-devices-attribute.ulp
@@ -0,0 +1,130 @@
+#usage "en:Run a SCRIPT through all Device Sets (Technology) in a library to define ATTRIBUTEs \n"
+ "RUN set-all-devices-attribute [SCRIPT] "
+ "The words may be separated by one single space character only. "
+ "Value must be included in two single quotes, otherwise special "
+ "characters, like + - space can cause error messages in the script file. "
+ " "
+ ,
+ "de:Startet ein SCRIPT um in allen Devicesets (Technologien) in einer Bibliothek ATTRIBUTE zu definieren. \n"
+ "RUN set-all-devices-attribute [SCRIPT] "
+ "Die Wörter dürfen mit nur einem Leerzeichen (Space) getrennt sein. "
+ "Der Wert muß in zwei Apostrophen eingeschlossen sein, da es sonst bei "
+ "Sonderzeichen + - Space etc. im erzeugten Script zu Fehlermeldungen kommen kann. "
+ " "
+
+string Version = "1.1"; // 2008-09-04 check Variant name
+ // 1.0 // 2008-06-13 alf@cadsoft.de
+
+string ScriptFile = argv[1];
+string cmdScript, cmd, s;
+
+string Lines[], Attribut[], AttValue[];
+int setAtt[];
+int cntl = 0;
+int cntAtt = 0;
+
+if (argv[1] == "?") {
+ dlgMessageBox(usage, "OK");
+}
+
+void test(void) {
+ dlgDialog(filename(argv[0]) + " Script") {
+ dlgTextView(cmd);
+ dlgHBoxLayout {
+ dlgPushButton("OK") dlgAccept();
+ dlgPushButton("Abbruch") { dlgReject(); exit(-2); }
+ }
+ };
+ return;
+}
+
+
+string check_varname(string s) { // 2008-09-04
+ if(s == "''") return s;
+ return "'"+s+"'";
+}
+
+
+void readScript(void) {
+ cntl = fileread(Lines, ScriptFile);
+ for (int n = 0; n < cntl; n++) {
+ if (strstr(Lines[n], "ATTRIBUTE") == 0) {
+ string a[];
+ int cnta = strsplit(a, Lines[n], ' ');
+ Attribut[cntAtt] = a[1];
+ AttValue[cntAtt] = a[2];
+ for (int an = 3; an < cnta; an++) { // complete parameter with space
+ AttValue[cntAtt] += " "+a[an];
+ }
+ cntAtt++;
+ }
+ }
+ return;
+}
+
+
+if (library) {
+ library(L) {
+ if (ScriptFile) {
+ string fg[];
+ int cntf = fileglob(fg, path_scr[0]+"/"+ScriptFile);
+ if (!cntf) ScriptFile = "";
+ else ScriptFile = fg[0];
+ }
+ if (!ScriptFile) ScriptFile = dlgFileOpen("Select a SCRIPT with ATTRIBUTE commands to run in all DEVICESETS", path_scr[0], "*.scr");
+ if (!ScriptFile) exit(0);
+ readScript();
+ cmdScript = filesetext(L.name, "~.scr");
+ L.devicesets(DS) {
+ sprintf(s, "EDIT %s.DEV;\n", DS.name);
+ cmd += s;
+ int n;
+ DS.devices(D) {
+ string t[];
+ int nt = strsplit(t, D.technologies, ' ');
+ sprintf(s, "PACKAGE %s;\n", check_varname(D.name) );
+ cmd += s;
+ for (int i = 0; i < nt; i++) {
+ sprintf(s, "TECHNOLOGY %s;\n", t[i]);
+ cmd += s;
+ for (n = 0; n < cntAtt; n ++) setAtt[n] = 1; // preset flags
+ D.attributes(A, t[i]) {
+ for (n = 0; n < cntAtt; n++) {
+ status(DS.name+":"+D.name+":"+t[i]);
+
+ if (A.name == Attribut[n]) {
+ if (A.value || !AttValue[n]) setAtt[n] = 0; // wenn das Attribut schon einen Wert besitzt
+ // oder im Script kein Wert zugewiesen wird,
+ // wird das Attribut nicht geändert
+ }
+ }
+ }
+ for (n = 0; n < cntAtt; n ++) {
+ if (setAtt[n] || AttValue[n] == "DELETE") {
+ sprintf(s, "ATTRIBUTE %s %s;\n", Attribut[n], AttValue[n]);
+ cmd+=s;
+ s="";
+ }
+ }
+ }
+ }
+ }
+ }
+ output(cmdScript, "wtD") printf("%s", cmd);
+ sprintf(s, "SCRIPT '%s';\n", cmdScript);
+ exit(s);
+}
+
+else dlgMessageBox("Start this ULP from a Library", "OK");
diff --git a/eagle-5.7.0/ulp/set_name_value.ulp b/eagle-5.7.0/ulp/set_name_value.ulp
new file mode 100644
index 0000000..1d1b4cf
--- /dev/null
+++ b/eagle-5.7.0/ulp/set_name_value.ulp
@@ -0,0 +1,41 @@
+#usage "place >NAME and >VALUE in Package or Symbol if not placed"
+
+string cmd;
+
+if (symbol) {
+ int no_Sname = 1;
+ int no_Svalue = 1;
+ symbol(S) {
+ S.texts(T) {
+ if (T.value == ">NAME" && T.layer == 95) no_Sname = 0;
+ if (T.value == ">VALUE" && T.layer == 96) no_Svalue = 0;
+ if (T.value == ">GATE" && T.layer == 95 || T.value == ">PART" && T.layer == 95) {
+ no_Sname = 0;
+ no_Svalue = 0;
+ }
+ }
+ }
+ if (no_Sname && no_Svalue) {
+ cmd = "GRID MIL;\nCHANGE SIZE 70;\nCHANGE LAYER 95;\nTEXT >NAME (0 100);\n GRID LAST;";
+ cmd += "GRID MIL;\nCHANGE SIZE 70;\nCHANGE LAYER 96;\nTEXT >VALUE (0 0);\n GRID LAST;";
+ }
+}
+
+if (package) {
+ int no_Pname = 1;
+ int no_Pvalue = 1;
+ package(P) {
+ P.texts(T) {
+ if (T.value == ">NAME" && T.layer == 25) no_Pname = 0;
+ if (T.value == ">VALUE" && T.layer == 27) no_Pvalue = 0;
+ }
+ }
+ if (no_Pname) {
+ cmd = "GRID MIL;\nCHANGE SIZE 50;\nCHANGE LAYER 25;\nTEXT >NAME (0 100);\n GRID LAST;";
+ }
+ if (no_Pvalue) {
+ cmd += "GRID MIL;\nCHANGE SIZE 50;\nCHANGE LAYER 27;\nTEXT >VALUE (0 0);\n GRID LAST;";
+ }
+}
+
+exit (cmd);
\ No newline at end of file
diff --git a/eagle-5.7.0/ulp/showclass.ulp b/eagle-5.7.0/ulp/showclass.ulp
new file mode 100644
index 0000000..697032e
--- /dev/null
+++ b/eagle-5.7.0/ulp/showclass.ulp
@@ -0,0 +1,115 @@
+#usage "en: "
+ "Some board manufacturers want to have at least a width of 8mil "
+ "for silk screen lines in order to guarantee legible results. "
+ "EAGLE libraries use 5 mil width for silk screen as default. "
+ "This ULP changes all silk screen elemtents to a minimum "
+ "with of 8 mil . All elements of layers 21 and 22 "
+ "are written into new layers 121(_tplace) and 122 (_bplace). "
+ "Texts are changes as well. The new ratio is 16% (default 8). That "
+ "means texts with a size of 50 mil get a wire width of 8 mil as well. "
+ " "
+ "Two new layers will be defined and the new silk screen will be "
+ "generated. For generating GERBER data be aware that you have to "
+ "activate layers 121 or 122 instead of the original layers 21 and 22."
+ " "
+ " "
+ " "
+ "Generates two files which contain the coordinates of the "
+ "Smd pads in the layout. Boardname.smt for the Top layer, "
+ "boardname.smb for Bottom layer. "
+ " "
+ " "
+ "Snaps symbols, junctions, nets and busses to the "
+ "given grid (default: 0.1 inch)."
+ " "
+ " "
+ "The first run snaps all the devices and all the net lines "
+ "that are connected to a pin to default grid. "
+ "The second run snaps the rest of the net lines that are "
+ "not tied to a pin directly (like bends and junctions)."
+ "This avoids that elements will be snapped more than once. "
+ " 1. with the device "
+ " 2. with the net lines "
+ " The end of the net tied to the pin can not be moved."
+ " Thus EAGLE would only move the free end of a net segment"
+ " again."
+ "The coordinates will be stored in an array and searched for"
+ "multiple occurences. "
+ "If devices do not snap to default grid, they are defined"
+ "offgrid in the libary (symbol) editor. In this case please"
+ "correct your library definition. "
+ "If it happens that net lines do not snap, they might be"
+ "connected to a pin (as mentioned above). Or there are"
+ "superimposed nets at this point. Use the SHOW command to"
+ "check this closely "
+ "Der erste Durchlauf snapt die Devices (Symbole). "
+ "Dabei werden auch alle an Pins angeschlossenen Netzsegmente "
+ "automatisch gesnapt. Der zweite Durchlauf snapt nur "
+ "noch die Knickpunkte, Abzweigungen und Kreuzungen der "
+ "Netze. Andernfalls würden die Netz-Segmente durch die "
+ "Mehrfachinformation mehrmals verschoben werden. "
+ " 1. mit dem Device. "
+ " 2. mit dem Netz-Segment. "
+ " Das Segment-Ende, das an einem Pin kontaktiert ist, "
+ " kann nicht verschoben werden. So würde EAGLE nur das "
+ " freie Segment-Ende ein weiteres Mal verschieben. "
+ "Die Koordinaten werden zuerst in einer Tabelle gesammelt "
+ "und nach mehrfachem Vorkommen durchsucht."
+ " "
+ "Sollten Devices nicht auf das Default Grid gesnapt werden, "
+ "sind sie in der Library (Symbol) ausserhalb des Grids "
+ "definiert worden. "
+ "Sollten Netz-Elemente nicht verschoben werden, "
+ "sind sie - wie oben erwaehnt - an einem Pin angeschlossen, "
+ "oder an dieser Koordinate doppelt vorhanden. "
+ "In diesem Fall ueberpruefen Sie mit SHOW, ob es sich um "
+ "das gleiche Netz handelt. " + S.name , "OK"));
+ if (Result) exit(0);
+
+}
diff --git a/eagle-5.7.0/ulp/snap-pin-in-symbol.ulp b/eagle-5.7.0/ulp/snap-pin-in-symbol.ulp
new file mode 100644
index 0000000..c3ffaa3
--- /dev/null
+++ b/eagle-5.7.0/ulp/snap-pin-in-symbol.ulp
@@ -0,0 +1,38 @@
+#usage "snap pins in symbol to grid "
+ "Example: run snap-pin-in-symbol [100]"
+ " "
+ "Depending from where you are starting the ULP, places pads (library) or vias (board). "
+ "The calculation of coils or inductivities depends on a lot of "
+ "different factors, like " +
+ "Dieses ULP kann in der Libary ebenso wie im Board benutzt werden. "
+ "Example: "
+ "Please note: "
+ " "
+ "ACHTUNG: "
+ " \n"
+ "To change the units in the table, please use the variable uval,\n"
+ "which can be found in the ulp file. \n"
+ "THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, "
+ "EXPRESSED OR IMPLIED. \n"
+ " ";
+ switch (uval) {
+ case GRID_UNIT_INCH : if(u2inch(v) < minv) {
+ sprintf(sv, "%s < %.4f ", attention, minv );
+ }
+ break;
+
+ case GRID_UNIT_MIL : if(u2mil(v) < minv) {
+ sprintf(sv, "%s < %.4f ", attention, minv );
+ }
+ break;
+
+ case GRID_UNIT_MM : if(u2mm(v) < minv) {
+ sprintf(sv, "%s < %.4f ", attention, minv );
+ }
+ break;
+
+ case GRID_UNIT_MIC : if(u2mic(v) < minv) {
+ sprintf(sv, "%s < %.4f ", attention, minv );
+ }
+ break;
+ }
+ return sv;
+}
+
+
+string check_min_ValueWidth(void) {
+ string sh;
+ sprintf(sh, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ value(minWires, " - Wire width "),
+ min_value(minWires, checkMinWire),
+ value(minPOLYw, " - Polygon wire width"),
+ min_value(minPOLYw, checkMinPoly),
+ value(minARCw, " - Arc width "),
+ min_value(minARCw, checkMinArc),
+ value(minCIRCw, " - Circle width "),
+ min_value(minCIRCw, checkMinCirc),
+ value(minPADrest, " - Pad Restring "),
+ min_value(minPADrest, checkMinRestringP),
+ value(minVIArest, " - Via Restring "),
+ min_value(minVIArest, checkMinRestringV),
+ value(minClearance, " - Clearance "),
+ min_value(minClearance, checkMinClearance),
+ value(minISOL, " - Isolate Polygon "),
+ min_value(minISOL, checkMinIsol)
+ );
+ return sh;
+}
+
+string check_min_ValueOther(void) {
+ string sh;
+ sprintf(sh, "%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ value(minTEXTw, " - Text width ") + " ",
+ value(minSMDx, " - SMD X ") + " ",
+ value(minSMDy, " - SMD Y ") + " ",
+ value(minPADdril, " - Pad drill "),
+ min_value(minPADdril, checkMinPadDrill),
+ value(minPADrestI, " - Pad Restring Inner. "),
+ value(minVIAdril, " - Via drill "),
+ min_value(minVIAdril, checkMinViaDrill),
+ value(minVIArestI, " - Via Restring Inner. "),
+ value(minHOLE, " - Hole drill "),
+ min_value(minHOLE, checkMinHoleDrill),
+ value(minRECTx, " - Rectangle X ") + " ",
+ value(minRECTy, " - Rectangle Y ")
+ );
+ return sh;
+}
+
+void AddDrilling(int Size) {
+ real x;
+ switch (uval) {
+ case GRID_UNIT_MIC : x = round(u2mic(Size) * RoundFactor) / RoundFactor;
+ break;
+ case GRID_UNIT_MM : x = round(u2mm(Size) * RoundFactor) / RoundFactor;
+ break;
+ case GRID_UNIT_MIL : x = round(u2mil(Size) * RoundFactor) / RoundFactor;
+ break;
+ case GRID_UNIT_INCH : x = round(u2inch(Size) * RoundFactor) / RoundFactor;
+ break;
+ }
+
+ for (int i = imax; --i >= 0; )
+ if (Drilling[i] == x)
+ return;
+ Drilling[imax++] = x;
+ return;
+}
+
+void loadminval(void) {
+ string line[];
+ int lines = fileread(line, minvalfile);
+ checkMinWire = strtod(line[0]);
+ checkMinArc = strtod(line[1]);
+ checkMinCirc = strtod(line[2]);
+ checkMinPoly = strtod(line[3]);
+ checkMinRestringP = strtod(line[4]);
+ checkMinRestringV = strtod(line[5]);
+ checkMinClearance = strtod(line[6]);
+ checkMinIsol = strtod(line[7]);
+ checkMinPadDrill = strtod(line[8]);
+ checkMinViaDrill = strtod(line[9]);
+ checkMinHoleDrill = strtod(line[10]);
+ return;
+}
+
+
+void saveminval(void) {
+ output( minvalfile, "wt") {
+ printf("%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f\n%.4f",
+ checkMinWire,
+ checkMinArc,
+ checkMinCirc,
+ checkMinPoly,
+ checkMinRestringP,
+ checkMinRestringV,
+ checkMinClearance,
+ checkMinIsol,
+ checkMinPadDrill,
+ checkMinViaDrill,
+ checkMinHoleDrill );
+ }
+ return;
+}
+
+void GetCheckValues(void) {
+ dlgDialog("Checked min values") {
+ dlgGridLayout {
+ dlgCell( 0, 0) dlgRealEdit( checkMinWire, 0, 10);
+ dlgCell( 0, 1) dlgLabel("Check minimum Wire width");
+ dlgCell( 1, 0) dlgRealEdit( checkMinArc, 0, 10);
+ dlgCell( 1, 1) dlgLabel("Check minimum ARC width");
+ dlgCell( 2, 0) dlgRealEdit( checkMinCirc, 0, 10);
+ dlgCell( 2, 1) dlgLabel("Check minimum Circle width");
+ dlgCell( 3, 0) dlgRealEdit( checkMinPoly, 0, 10);
+ dlgCell( 3, 1) dlgLabel("Check minimum Polygon width");
+ dlgCell( 4, 0) dlgRealEdit( checkMinRestringP, 0, 10);
+ dlgCell( 4, 1) dlgLabel("Check minimum Pad Restring width");
+ dlgCell( 5, 0) dlgRealEdit( checkMinRestringV, 0, 10);
+ dlgCell( 5, 1) dlgLabel("Check minimum Via Restring width");
+ dlgCell( 6, 0) dlgRealEdit( checkMinClearance, 0, 10);
+ dlgCell( 6, 1) dlgLabel("Check minimum Clearance");
+ dlgCell( 7, 0) dlgRealEdit( checkMinIsol, 0, 10);
+ dlgCell( 7, 1) dlgLabel("Check minimum Polygon Isolate");
+ dlgCell( 8, 0) dlgRealEdit( checkMinPadDrill, 0, 10);
+ dlgCell( 8, 1) dlgLabel("Check minimum Pad drill");
+ dlgCell( 9, 0) dlgRealEdit( checkMinViaDrill, 0, 10);
+ dlgCell( 9, 1) dlgLabel("Check minimum Via drill");
+ dlgCell(10, 0) dlgRealEdit( checkMinHoleDrill, 0, 10);
+ dlgCell(10, 1) dlgLabel("Check minimum Hole drill");
+ }
+ dlgLabel("All Units = " + unit[uval]);
+
+ dlgHBoxLayout {
+ dlgPushButton("+OK") {
+ dlgAccept();
+ showminValWidth = check_min_ValueWidth();
+ showminValOther = check_min_ValueOther();
+ }
+ dlgPushButton("&Save") saveminval();
+ dlgPushButton("&Load") loadminval();
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(1);
+ }
+ };
+ return;
+}
+
+string makestrg(string s) {
+ string rs;
+ return rs;
+}
+
+string saveReport(void) {
+ int t = time();
+ int n;
+ string report = "Data Exported from: ";
+ report += brdfile + "\n";
+ report += "with: " + argv[0] + "\n";
+ report += "at: " + t2string(t) + "\n";
+ report += EAGLE_SIGNATURE + "\n\n";
+ report += "all Values in " + unit[uval] + "\n";
+ report += brdmaximum + "\n";
+ report += brdoutline + "\n\n";
+ report += usedLayer + "_________________________\n";
+ if (layerError) report += layerError;
+ report += "\n";
+ report += sum + "\n";
+ report += "\n============================\n"; n=0;
+ if (Unrouted) report += Unrouted + " Unroutet airwires ***\n";
+
+ report += "\n----------------------------\nLAYER\n"; n=0;
+ sort(cntalllay, allLayers);
+ report += "Nb.\tName\tUsed\n";
+ for (n = 0; n < cntalllay; n++) {
+ report+= allLayers[n] + "\n";
+ }
+ report += "\n----------------------------\nCLASS\n"; n=0;
+ while (statisticCLASS[n]) {
+ report += statisticCLASS[n] + "\n"; n++;
+ }
+ report += "\n----------------------------\nWIDTH\n"; n=0;
+ while (statisticWirew[n]) {
+ report += statisticWirew[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticARCw[n]) {
+ report += statisticARCw[n] + "\n"; n++;
+ }
+ report += wireWidthInternal;
+
+ report += "\n"; n=0;
+ while (statisticPolyw[n]) {
+ report += statisticPolyw[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPoliso[n]) {
+ report += statisticPoliso[n] + "\n"; n++;
+ }
+ report += "\nPolygon\n"; n=0;
+ report += "Type\tName\tLayer\tRank\tWidth\n";
+ while (PolygonLayer[n]) {
+ report += PolygonLayer[n] + "\n"; n++;
+ }
+ if (PolyWidthError) report += PolygonError + "\n";
+
+ report += wireWidthInternal;
+ report += "\n----------------------------\n"; n=0;
+ while (statisticCIRw[n]) {
+ report += statisticCIRw[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticCIRdiam[n]) {
+ report += statisticCIRdiam[n] + "\n"; n++;
+ }
+ report += "\n----------------------------\n"; n=0;
+ while (statisticTEXTw[n]) {
+ report += statisticTEXTw[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticTEXTsize[n]) {
+ report += statisticTEXTsize[n] + "\n"; n++;
+ }
+ report += "\n----------------------------\n"; n=0;
+ while (statisticSMD[n]) {
+ report += statisticSMD[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADdiaTOP[n]) {
+ report += statisticPADdiaTOP[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADdiaBOT[n]) {
+ report += statisticPADdiaBOT[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADrestTOP[n]) {
+ report += statisticPADrestTOP[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADrestBOT[n]) {
+ report += statisticPADrestBOT[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADdiaI[n]) {
+ report += statisticPADdiaI[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADrestI[n]) {
+ report += statisticPADrestI[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIAdia[n]) {
+ report += statisticVIAdia[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIArest[n]) {
+ report += statisticVIArest[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIAdiaI[n]) {
+ report += statisticVIAdiaI[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIArestI[n]) {
+ report += statisticVIArestI[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIAdril[n]) {
+ report += statisticVIAdril[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticVIAstack[n]) {
+ report += statisticVIAstack[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPADdril[n]) {
+ report += statisticPADdril[n] + "\n"; n++;
+ }
+ report += "\n----------------------------\n"; n=0;
+ while (statisticHOLE[n]) {
+ report += statisticHOLE[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (drillRack[n]) {
+ report += drillRack[n] + "\n"; n++;
+ }
+ report += "\n----------------------------\n"; n=0;
+ while (statisticLBR[n]) {
+ report += statisticLBR[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticPAC[n]) {
+ report += statisticPAC[n] + "\n"; n++;
+ }
+ report += "\n"; n=0;
+ while (statisticValPacLay[n]) {
+ report += statisticValPacLay[n] + "\n", n++;
+ }
+ report += "\n----------------------------\n"; n=0;
+ while (statisticRECT[n]) {
+ report += statisticRECT[n] + "\n"; n++;
+ }
+ report += LabelcntRECT + "\n";
+
+ report += "\n----------------------------\n"; n=0;
+ while (statisticTEXTsize[n]) {
+ report += statisticTEXTsize[n] + "\n"; n++;
+ }
+ report += LabelcntTextSize + "\n";
+
+ report += "\n"; n=0;
+ while (statisticTEXTw[n]) {
+ report += statisticTEXTw[n] + "\n"; n++;
+ }
+ report += LabelcntTextWidth + "\n";
+
+ report += "\n"; n=0;
+ while (statisticPlaceTEXTsize[n]) {
+ report += statisticPlaceTEXTsize[n] + "\n"; n++;
+ }
+ report += LabelcntPlaceTextSize + "\n";
+
+ while (statisticPlaceTEXTw[n]) {
+ report += statisticPlaceTEXTw[n] + "\n"; n++;
+ }
+ report += LabelcntPlaceTextWidth + "\n";
+
+ report += "\n"; n=0;
+ while (statisticCIRdiam[n]) {
+ report += statisticCIRdiam[n] + "\n"; n++;
+ }
+ report += LabelcntCIRCLE + "\n";
+
+ report += "\n";
+ if (falseSignalCnt) {
+ report += "False signals:\n"; // 2009-02-11
+ for (n = 0; n < falseSignalCnt; n++) {
+ report += statisticFalseSignals[n]+"\n";
+ }
+ }
+ if (deleteRudimentalSignalName) { // 2009-02-12
+ report += "\n";
+ report += "Rudimentarily signal name(s):\n";
+ report += deleteRudimentalSignalName;
+ report += "\n";
+ }
+ report += "End report";
+ report += "\n";
+ return report;
+}
+
+
+void drillStackRack(int rack, real drill) { // 2009-10-15 missing 2cnd dimension for array, realize by string(split)
+ string d[];
+ real Drills[];
+ int cDrills[];
+ int cntDrills = strsplit(d, StackDrills[rack], '\t') / 2; // definition : drill \t count \t drill \t count ....
+ int found = 0;
+ int n;
+ for (n = 0; n < cntDrills; n++) {
+ Drills[n] = strtod(d[n*2]);
+ cDrills[n] = strtol(d[n*2+1]);
+ if (Drills[n] == drill){
+ cDrills[n]++;
+ found = 1;
+ }
+ }
+ if (!found) {
+ Drills[cntDrills] = drill;
+ cDrills[cntDrills]++;
+ cntDrills++;
+ }
+ string s;
+ StackDrills[rack] = ""; // clear string to generate new, with new counter
+ for (n = 0; n < cntDrills; n++) {
+ sprintf(s, "%.2f\t%d\t", Drills[n], cDrills[n]);
+ StackDrills[rack]+=s;
+ }
+ return;
+}
+
+
+void showLayerRack(int sel) {
+ string d[];
+ int cntDrills = strsplit(d, StackDrills[sel], '\t') / 2; // definition : drill \t count \t drill \t count ....
+ showStackDrills[0] = "";
+ int n;
+ for (n = 0; n < cntDrills; n++) {
+ sprintf(showStackDrills[n], "%s\t%s", d[n*2], d[n*2+1]);
+ }
+ showStackDrills[n] = ""; // clear last string
+ return;
+}
+
+
+void viaStackRack(int start, int end, real drill) { // 2009-10-15 new drill
+ string sstack = "";
+ sprintf(sstack, "%02d-%02d", start, end);
+ int notfound = 1;
+ int stc = 0;
+ for (stc = 0; stc < cntStack; stc ++) {
+ if (sstack == ViaStack[stc]) {
+ drillStackRack(stc, drill); // 2009-10-15 add drill to stack rack
+ ViaStackCnt[stc]++;
+ notfound = 0;
+ break;
+ }
+ }
+ if (notfound) {
+ ViaStack[cntStack] = sstack; // 2009-10-15 add drill to stack rack
+ drillStackRack(cntStack, drill); // cound drill
+ ViaStackCnt[cntStack]++;
+ cntStack++;
+ }
+ return;
+}
+
+
+real WireLength(int x1, int x2, int y1, int y2) {
+ return sqrt( pow(u2u(x2) - u2u(x1), 2) + pow( u2u(y2) - u2u(y1), 2));
+}
+
+
+real WireLengthCircle(real r) {
+ return u2u(r * 2 * PI) ;
+}
+
+
+real WireLengthArc(real startangle, real endangle, int r) {
+ return u2u(r * 2 * PI) / 360 * (endangle - startangle);
+}
+
+
+void checkmaxmin(int x1, int x2, int y1, int y2, int width) {
+ int w = 0;
+ if (width) w = width/2; // 2005-07-05 alf
+ if (x1 > maxX) maxX = x1+w;
+ if (x2 > maxX) maxX = x2+w;
+ if (y1 > maxY) maxY = y1+w;
+ if (y2 > maxY) maxY = y2+w;
+ if (x1 < minX) minX = x1-w;
+ if (x2 < minX) minX = x2-w;
+ if (y1 < minY) minY = y1-w;
+ if (y2 < minY) minY = y2-w;
+ return;
+}
+
+void checkHole( int x, int y, int drill ) {
+ checkmaxmin( x - drill/2, x + drill/2, y - drill/2, y + drill/2 , 0);
+ return;
+}
+
+
+void checkarc( int x1, int x2, int y1, int y2, int xc, int yc, real angle1, real angle2, real radius, int width) {
+ checkmaxmin( x1, x2, y1, y2, width );
+ if ( angle2 > angle1 + 270.0) {
+ if ( angle1 < 90 ) checkmaxmin( x1 , xc - radius, yc + radius, yc - radius, width );
+ else if( angle1 < 180 ) checkmaxmin( xc - radius, xc + radius, y1 , yc - radius, width );
+ else if( angle1 < 270 ) checkmaxmin( x1 , xc + radius, yc - radius, yc + radius, width );
+ else if( angle1 < 360 ) checkmaxmin( xc + radius, xc - radius, y1 , yc + radius, width );
+ }
+ else if( angle2 > angle1 + 180.0) {
+ if ( angle1 < 90 ) checkmaxmin( x1 , xc - radius, yc + radius, y2 , width );
+ else if( angle1 < 180 ) checkmaxmin( x1 , xc - radius, yc - radius, y2 , width );
+ else if( angle1 < 270 ) checkmaxmin( x1 , xc + radius, yc - radius, y2 , width );
+ else if( angle1 < 360 ) checkmaxmin( x1 , xc + radius, yc + radius, y2 , width );
+ }
+ else if( angle2 > angle1 + 90.0 ) {
+ if ( angle1 < 90 ) checkmaxmin( x1 , x2 , yc + radius, y2 , width );
+ else if( angle1 < 180 ) checkmaxmin( x1 , xc - radius, y1 , y2 , width );
+ else if( angle1 < 270 ) checkmaxmin( x1 , x2 , yc - radius, y2 , width );
+ else if( angle1 < 360 ) checkmaxmin( x1 , xc + radius, y1 , y2 , width );
+ }
+ return;
+}
+
+
+void checkpad( int x, int y, int diameter1, int diameter16, int shape1, int shape16, int P_elongation) {
+ int d = diameter1;
+ int d2 = diameter1 / 2;
+ if (shape16 == PAD_SHAPE_LONG) d = diameter1 * (diameter1 * P_elongation / 100);
+ if (shape16 == PAD_SHAPE_OFFSET) d = diameter1 * (diameter1 * P_elongation / 100) * 1.5;
+ checkmaxmin( x + d2, x - d2, y + d2, y - d2, 0 );
+ return;
+}
+
+
+void checksmd( int x, int y, int smddx, int smddy, int Layer) {
+ int dx2 = smddx / 2;
+ int dy2 = smddx / 2;
+ checkmaxmin( x + dx2, x - dx2, y + dy2, y - dy2, 0 );
+ return;
+}
+
+
+real ArcLength(real ang1, real ang2, real radius) {
+ return radius * 2 * PI / 360 * (ang2 - ang1);
+}
+
+
+string NetClassLabel(string ClassName , int cnt) {
+ string s;
+ sprintf(s, "CLASS %s : %d Netze", ClassName , cnt);
+ return s;
+}
+
+
+string isempty(string s) {
+ if (!s) s = empty;
+ return s;
+}
+
+
+void list_pac_drills(int drill) {
+ int n;
+ for ( n = 0; n <= cnt_d; n++) {
+ if (pac_drill[n] == drill) {
+ cntpac_drill[n]++;
+ break;
+ }
+ }
+ if (n > cnt_d) { // a new drill
+ cnt_d++;
+ pac_drill[cnt_d] = drill;
+ cntpac_drill[cnt_d]++;
+ pac_drill[cnt_d+1] = 0;
+ }
+ return;
+}
+
+
+void list_pac_holes(int drill) {
+ int n;
+ for ( n = 0; n <= cnt_h; n++) {
+ if (pac_hole[n] == drill) {
+ cntpac_hole[n]++;
+ break;
+ }
+ }
+ if (n > cnt_h) { // a new drill
+ cnt_h++;
+ pac_hole[cnt_h] = drill;
+ cntpac_hole[cnt_h]++;
+ pac_hole[cnt_h+1] = 0;
+ }
+ return;
+}
+
+
+string infoDril(UL_ELEMENT E) {
+ string s, h;
+ cnt_d = -1;
+ cnt_h = -1;
+ cntpac_drill[0] = 0;
+ cntpac_hole[0] = 0;
+ E.package.holes(H) list_pac_holes(H.drill);
+
+ if (cnt_d > -1) {
+ s += "Drills:\n";
+ for (int n = 0; n <= cnt_d; n++) {
+ sprintf(h, "%d\t%.4f mm\n", cntpac_drill[n], u2mm(pac_drill[n]) );
+ s += h;
+ }
+ }
+ if (cnt_h > -1) {
+ s += "Holes:\n";
+ for (int n = 0; n <= cnt_h; n++) {
+ sprintf(h, "%d\t%.4f mm\n", cntpac_hole[n], u2mm(pac_hole[n]) );
+ s += h;
+ }
+ }
+ if (cnt_d > -1 || cnt_h > -1) s += "------\n";
+ return s;
+}
+
+void infoLBR( string val) {
+ linfo = "Element : Value : Package";
+ string s, M;
+ board(B) {
+ B.elements(E) {
+ if (E.package.library == val) {
+ sprintf(s, "%s %s(%.3f %.3f)\t: %s\t: %s\n", E.name, M, u2u(E.x), u2u(E.y), isempty(E.value), E.package.name);
+ Element_info += s;
+ }
+ }
+ }
+ return;
+}
+
+void infoPAC( string val) {
+ linfo = "Element : Value : Library";
+ string s, M;
+ int getdrill = 0;
+ board(B) B.elements(E) if (E.package.name == val) {
+ if (E.mirror) M = "Bot ";
+ else M = "Top ";
+ if (!getdrill) {
+ Element_info += infoDril(E);
+ getdrill++;
+ }
+ sprintf(s, "%s %s(%.3f %.3f)\t: %s\t: %s\n", E.name, M, u2u(E.x), u2u(E.y), isempty(E.value), E.package.library);
+ Element_info += s;
+ }
+ return;
+}
+
+
+void infoVAL( string val) {
+ string s, M;
+ int pos = strstr(val, empty);
+ if (pos == 0) {
+ linfo = "Package : Library";
+ val = strsub(val, strlen(empty));
+ board(B) B.elements(E) if (E.name == val) {
+ sprintf(Element_info, "Value empty/leer\n");
+ if (E.mirror) M = "Bot ";
+ else M = "Top ";
+ sprintf(s, "%s %s(%.3f %.3f) %s\t: %s\n", E.name, M, u2u(E.x), u2u(E.y), E.package.name, E.package.library);
+ Element_info += s;
+ }
+
+ }
+ else {
+ linfo = "Element : Package : Library";
+ board(B) B.elements(E) if (E.value == val) {
+ if (E.mirror) M = "Bot ";
+ else M = "Top ";
+ sprintf(s, "%s %s(%.3f %.3f)\t: %s\t: %s\n\n", E.name, M, u2u(E.x), u2u(E.y), E.package.name, E.package.library);
+ Element_info += s;
+ }
+ }
+ return;
+}
+
+
+void get_Info(int art, string val) {
+ Element_info = "";
+ int pos = strchr(val, '\t', 0);
+ val = strsub(val, 0, pos);
+ switch(art) {
+ case 1 : infoLBR(val);
+ break;
+
+ case 2 : infoPAC(val);
+ break;
+
+ case 3 : infoVAL(val);
+ break;
+
+ default : break;
+ }
+ return;
+}
+
+
+void resetMaxMin(void) {
+ maxX = INT_MIN;
+ minX = INT_MAX;
+ maxY = INT_MIN;
+ minY = INT_MAX;
+ return;
+}
+
+
+// *** used area in board to calculate if board area enuff ***
+
+real used_area(UL_ELEMENT E) {
+ resetMaxMin();
+ E.package.circles(C) {
+ if (C.layer == 1 || C.layer == 16 || C.layer == 21 || C.layer == 22 || C.layer == 51 || C.layer == 52 )
+ checkmaxmin( C.x - C.radius, C.x + C.radius, C.y - C.radius, C.y + C.radius, C.width );
+ }
+ E.package.wires(W) {
+ if (W.layer == 1 || W.layer == 16 || W.layer == 21 || W.layer == 22 || W.layer == 51 || W.layer == 52 ) {
+ if (W.arc) {
+ checkarc(W.arc.x1, W.arc.x2, W.arc.y1, W.arc.y2, W.arc.xc, W.arc.yc, W.arc.angle1, W.arc.angle2, W.arc.radius, W.width);
+ }
+ else checkmaxmin( W.x1, W.x2, W.y1, W.y2, W.width );
+ }
+ }
+ E.package.contacts(CON) {
+ if (CON.pad) checkpad(CON.pad.x, CON.pad.y, CON.pad.diameter[1], CON.pad.diameter[16], CON.pad.shape[1], CON.pad.shape[16], CON.pad.elongation);
+ else checksmd(CON.smd.x, CON.smd.y, CON.smd.dx[CON.smd.layer], CON.smd.dy[CON.smd.layer], CON.smd.layer);
+ }
+ E.package.holes(H) checkHole( H.x, H.y, H.drill );
+ E.package.rectangles(R) {
+ if (R.layer == 1 || R.layer == 16 || R.layer == 21 || R.layer == 22 || R.layer == 51 || R.layer == 52 )
+ checkmaxmin( R.x1, R.x2, R.y1, R.y2, 0 );
+ }
+ E.package.texts(T) {
+ T.wires(W) {
+ if (W.layer == 1 || W.layer == 16 || W.layer == 21 || W.layer == 22 || W.layer == 51 || W.layer == 52 ) {
+ if (W.arc) {
+ checkarc(W.arc.x1, W.arc.x2, W.arc.y1, W.arc.y2, W.arc.xc, W.arc.yc, W.arc.angle1, W.arc.angle2, W.arc.radius, W.width);
+ }
+ else checkmaxmin( W.x1, W.x2, W.y1, W.y2, W.width );
+ }
+ }
+ }
+ int mx = maxX - minX;
+ int my = maxY - minY;
+ return u2u(mx) * u2u(my);
+}
+
+
+// main
+if (board) {
+ board(B) {
+ brdfile = B.name;
+ int n;
+ string usedLayers;
+ string displayUnrouted;
+ status("Layer");
+ B.layers(L) {
+ string sl;
+ sprintf(sl, "%3d\t%s\t%d", L.number, L.name, L.used);
+ allLayers[cntalllay] = sl;
+ cntalllay++;
+ string Lnam = L.name;
+ if (Lnam[0] == '$') {
+ SupplyLayers[L.number] = 1; // 2009-07-15 check polygon on supply layer
+ SupplyLayerName[L.number] = L.name;
+ }
+ if (L.used && L.number >=1 && L.number <= 16) {
+ cntLayer++;
+ sprintf(sl, "%2d %s\n", L.number, L.name);
+ usedLayers += sl;
+ if (L.number == 1 || L.number == 16) {
+ sl = L.name;
+ if (sl[0] == '$') {
+ sprintf( sl, "Do not use Layer %.d %s for Powerplane! '$' in Layer Name.", L.number, L.name);
+ layerError += "\n" + sl;
+ sprintf( sl, " "
+ " \n"
+ "To change the units in the table, please use the variable uval,\n"
+ "which can be found in the ulp file. \n"
+ "THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, "
+ "EXPRESSED OR IMPLIED. \n"
+ " "
+ "RUN trace-layer + "
+ "Usage: RUN ulpmessage text"
+ " "
+ " "
+ " "
+ "alf@cadsoft.de"
+
+string referencepackage = "plcc-socket.lbr";
+string cmd = "";
+
+library(L) {
+ if (filename(L.name) == referencepackage);
+ else sprintf(cmd, "UPDATE %s;\nWRITE;\n", referencepackage);
+}
+exit(cmd);
\ No newline at end of file
diff --git a/eagle-5.7.0/ulp/useful-routines.ulp b/eagle-5.7.0/ulp/useful-routines.ulp
new file mode 100644
index 0000000..c37d3ac
--- /dev/null
+++ b/eagle-5.7.0/ulp/useful-routines.ulp
@@ -0,0 +1,67 @@
+#usage "Collection of useful routines\n"
+ " "
+ "
+http://www.cadsoftusa.com
+
+http://www.cadsoft.de
+\n"
+ "Key Manufacturer Order Code Price\n"
+ "74LS00N Texas Instruments 123-456 0.20\n"
+ "R-EU_0204/5:4k7 Somebody RES4k7 0.10\n"
+ "
\n"
+ "Note that the columns are separated by a tab character (you may also\n"
+ "use a semicolon (';') to separate the columns, but then you will have to make sure\n"
+ "none of the data items contains a semicolon).\n"
+ "The keys for looking up records in the database are built from the\n"
+ "parts' values. If a part's device has defined \"value on\" it means that\n"
+ "the user needs to specify a particular value for this part, as for\n"
+ "example with a resistor. In such a case the key consists of the device\n"
+ "name and the user defined value, separated by a colon (':'). If the\n"
+ "device has \"value off\", only the device name is used as key (if the\n"
+ "user has edited the value of such a part and insisted on changing\n"
+ "it, the edited value will be used).\n"
+ "\n"
+ "Key Hersteller Best.-Nr. Preis\n"
+ "74LS00N Texas Instruments 123-456 0.20\n"
+ "R-EU_0204/5:4k7 Somebody RES4k7 0.10\n"
+ "
\n"
+ "Beachten Sie, daß die Spalten durch Tabulator-Zeichen getrennt sind (Sie können\n"
+ "auch das Semikolon-Zeichen (';') als Trennzeichen verwenden, wobei Sie dann aber sicherstellen\n"
+ "müssen, daß keines der Datenfelder ein Semikolon enthält).\n"
+ "Die Schlüssel für die Suche nach Datensätzen in der Datenbank werden aus den Werten der\n"
+ "Bauteile gebildet. Hat das Device eines Bauteils \"value on\" gesetzt, so bedeutet dies, daß\n"
+ "der Benutzer einen individuellen Wert für dieses Bauteil (zum Beispiel einen Widerstand)\n"
+ "angeben muß. In einem solchen Fall besteht der Schlüssel aus dem Device-Namen und dem vom\n"
+ "Benutzer angegebenen Wert, getrennt durch einen Doppelpunkt (':'). Hat das\n"
+ "Device \"value off\", so wird nur der Name des Devices als Schlüssel genommen (hat der\n"
+ "Benutzer den Wert eines solchen Bauteils editiert und darauf bestanden, ihn zu verändern,\n"
+ "so wird der veränderte Wert genommen).\n"
+ "
ERROR: No schematic!
FEHLER: Kein Schaltplan!
ERROR: No schematic!\n";
+ int numHeaders;
+ for (int l = 0; Lines[l]; l++) {
+ List += "
\n";
+ return List;
+}
+
+string MakeList(void)
+{
+ switch (OutputFormat) {
+ case ofText: return MakeListText(); break;
+ case ofHTML: return MakeListHTML(); break;
+ }
+ return "";
+}
+
+void ViewList(void)
+{
+ dlgDialog(tr("Bill Of Material - Preview")) {
+ string s = MakeList();
+ if (OutputFormat == ofText)
+ s = "";
+ string a[];
+ int n = strsplit(a, Lines[l], '\t');
+ if (l == 0)
+ numHeaders = n;
+ else
+ n = numHeaders; // for the hidden key!
+ for (int i = 0; i < n; i++) {
+ if (l == 0)
+ a[i] = "" + a[i] + "";
+ List += " \n";
+ }
+ List += "" + a[i] + " ";
+ }
+ List += "" + s + "
";
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(s);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("-Close")) dlgReject();
+ }
+ };
+}
+
+void SaveList(void)
+{
+ string FileName;
+ schematic(SCH) FileName = filesetext(SCH.name, OutputFormat == ofHTML ? ".htm" : ".bom");
+ FileName = dlgFileSave(tr("Save Bill Of Material"), FileName);
+ if (FileName) {
+ string a[];
+ if (!fileglob(a, FileName) || dlgMessageBox(tr("File '") + FileName + tr("' exists\n\nOverwrite?"), tr("+&Yes"), tr("-&No")) == 0) {
+ output(FileName, "wt") {
+ printf("%s", MakeList()); // using "%s" to avoid problems if list contains any '%'
+ }
+ }
+ }
+}
+
+int ReadDatabase(string FileName)
+{
+ string data;
+ if (fileread(data, FileName) > 0) {
+ strsplit(Database, data, '\n');
+ DatabaseSeparator = (strchr(Database[0], '\t') > -1) ? '\t' : ';';
+ DatabaseFile = FileName;
+ return 1;
+ }
+ return 0;
+}
+
+// --- Create a new database -------------------------------------------------
+
+string Headers[];
+int NumHeaders;
+int SelectedHeader;
+
+int NewDatabaseHeaderOk(string Name)
+{
+ for (int i = 0; i < NumHeaders; i++) {
+ if (Name == Headers[i]) {
+ dlgMessageBox(tr("Name already defined!"));
+ return 0;
+ }
+ }
+ return 1;
+}
+
+void NewDatabaseEdit(string Title, string Name)
+{
+ int NewName = !Name;
+ dlgDialog(Title + tr(" Header")) {
+ dlgLabel(tr("&Name:"));
+ dlgStringEdit(Name);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+OK")) {
+ Name = StripWhiteSpace(Name);
+ if (!NewName) {
+ if (Name == Headers[SelectedHeader] || NewDatabaseHeaderOk(Name)) {
+ Headers[SelectedHeader] = Name;
+ dlgAccept();
+ }
+ }
+ else if (Name) {
+ if (NewDatabaseHeaderOk(Name)) {
+ SelectedHeader = NumHeaders;
+ Headers[NumHeaders] = Name;
+ Headers[++NumHeaders] = "";
+ dlgAccept();
+ }
+ }
+ else
+ dlgMessageBox(tr("Name can't be empty!"));
+ }
+ dlgPushButton(tr("-Cancel")) dlgReject();
+ }
+ };
+}
+
+void NewDatabase(void)
+{
+ DatabaseFile = "";
+ Database[0] = "";
+ GenerateList();
+ dlgRedisplay();
+
+ Headers[0] = "Key";
+ Headers[1] = "";
+ NumHeaders = 1;
+ SelectedHeader = -1;
+ int result = dlgDialog(tr("New Database")) {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel(tr("&Headers"));
+ dlgListBox(Headers, SelectedHeader) NewDatabaseEdit(tr("Edit"), Headers[SelectedHeader]);
+ }
+ dlgVBoxLayout {
+ dlgPushButton(tr("&Add")) NewDatabaseEdit(tr("New"), "");
+ dlgPushButton(tr("&Del")) {
+ if (SelectedHeader > 0) {
+ for (int i = SelectedHeader; i < NumHeaders - 1; i++)
+ Headers[i] = Headers[i + 1];
+ Headers[--NumHeaders] = "";
+ if (SelectedHeader >= NumHeaders)
+ SelectedHeader = NumHeaders - 1;
+ }
+ else
+ dlgMessageBox(tr("Can't delete the \"Key\" header!\n\nUse \"Edit\" to change it."));
+ }
+ dlgPushButton(tr("&Edit")) {
+ if (SelectedHeader >= 0)
+ NewDatabaseEdit(tr("Edit"), Headers[SelectedHeader]);
+ else
+ dlgMessageBox(tr("Please select a list entry first!"));
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+OK")) {
+ if (NumHeaders > 1)
+ dlgAccept();
+ else
+ dlgMessageBox(tr("Please add at least one header!"));
+ }
+ dlgPushButton(tr("-Cancel")) dlgReject();
+ }
+ };
+ if (result) {
+ string sep;
+ for (int i = 0; Headers[i]; i++) {
+ Database[0] += sep + Headers[i];
+ sep = "\t";
+ }
+ DatabaseSeparator = '\t';
+ DatabaseModified = 1;
+ GenerateList();
+ }
+}
+
+// ---
+
+void LoadDatabase(void)
+{
+ string FileName = dlgFileOpen(tr("Choose database file"), DatabaseFile, tr("Database files (*.tsv *.csv);;All files (*)"));
+ if (FileName) {
+ if (ReadDatabase(FileName)) {
+ GenerateList();
+ DatabaseModified = 0;
+ }
+ }
+}
+
+int SaveDatabase(void)
+{
+ if (!DatabaseFile) {
+ string ext = (DatabaseSeparator == '\t') ? ".tsv" : ".csv";
+ DatabaseFile = dlgFileSave(tr("Save database file"), "", tr("Database files (*") + ext + tr(");;All files (*)"));
+ if (!DatabaseFile)
+ return 0;
+ if (fileext(DatabaseFile) != ext)
+ DatabaseFile += ext;
+ }
+ fileerror();
+ output(DatabaseFile, "wt") {
+ for (int i = 0; Database[i]; i++)
+ printf("%s\n", Database[i]);
+ };
+ return !fileerror();
+}
+
+void EditDatabaseEntry(string Key, int Entry)
+{
+ string Header[];
+ string Data[];
+ int Fields = strsplit(Header, Database[0], DatabaseSeparator);
+ strsplit(Data, Database[Entry], DatabaseSeparator);
+ if (!Data[0])
+ Data[0] = Key;
+ int result = dlgDialog(tr("Edit Database")) {
+ dlgGridLayout {
+ for (int f = 0; f < Fields; f++) {
+ dlgCell(f, 0) dlgLabel(Header[f]);
+ dlgCell(f, 1) if (f) { dlgStringEdit(Data[f]); } else { dlgLabel(Data[f]); }
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+OK")) dlgAccept();
+ dlgPushButton(tr("-Cancel")) dlgReject();
+ }
+ };
+ if (result) {
+ for (int f = 0; f < Fields; f++)
+ Data[f] = StripWhiteSpace(Data[f]);
+ Database[Entry] = strjoin(Data, DatabaseSeparator);
+ DatabaseModified = 1;
+ GenerateList();
+ }
+}
+
+void EditDatabase(void)
+{
+ if (Database[0]) {
+ if (Selected) {
+ string a[];
+ int KeyField = strsplit(a, Lines[0], '\t');
+ strsplit(a, Lines[Selected], '\t');
+ string key = a[KeyField];
+ string data;
+ int entry;
+ for (entry = 0; Database[entry]; entry++) {
+ strsplit(a, Database[entry], DatabaseSeparator);
+ if (a[0] == key) {
+ data = Database[entry];
+ break;
+ }
+ }
+ EditDatabaseEntry(key, entry);
+ }
+ else
+ dlgMessageBox(tr("Please select a list entry first!"));
+ }
+ else
+ dlgMessageBox(tr("Please load a database file first!"));
+}
+
+int OkToClose(void)
+{
+ if (DatabaseModified) {
+ switch (dlgMessageBox(tr("Database has been modified\n\nSave?"), tr("+&Yes"), tr("&No"), tr("-Cancel"))) {
+ case 0: return SaveDatabase();
+ case 1: break;
+ case 2: return 0;
+ }
+ }
+ return 1;
+}
+
+void DisplayHelp(void)
+{
+ dlgDialog(tr("Bill Of Material - Help")) {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(language() == "de" ? HelpTextDE : HelpTextEN);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("-Close")) dlgReject();
+ }
+ };
+}
+
+CollectPartData();
+GenerateList();
+
+dlgDialog(tr("Bill Of Material")) {
+ dlgListView("", Lines, Selected) EditDatabase();
+ dlgHBoxLayout {
+ dlgLabel(tr("Database:"));
+ dlgLabel(DatabaseFile, 1);
+ dlgStretch(1);
+ dlgPushButton(tr("&Load")) if (OkToClose()) LoadDatabase();
+ dlgPushButton(tr("&New")) if (OkToClose()) NewDatabase();
+ }
+ dlgHBoxLayout {
+ dlgGroup(tr("List type")) {
+ dlgRadioButton(tr("&Parts"), ListType) GeneratePartList();
+ dlgRadioButton(tr("&Values"), ListType) GenerateValueList();
+ }
+ dlgGroup(tr("Output format")) {
+ dlgRadioButton(tr("&Text"), OutputFormat);
+ dlgRadioButton(tr("&HTML"), OutputFormat);
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton(tr("+Edit")) EditDatabase();
+ dlgPushButton(tr("Vie&w")) ViewList();
+ dlgPushButton(tr("&Save...")) SaveList();
+ dlgPushButton(tr("H&elp")) DisplayHelp();
+ dlgPushButton(tr("-Close")) if (OkToClose()) dlgAccept();
+ }
+ };
diff --git a/eagle-5.7.0/ulp/cam2dxf.ulp b/eagle-5.7.0/ulp/cam2dxf.ulp
new file mode 100644
index 0000000..8420311
--- /dev/null
+++ b/eagle-5.7.0/ulp/cam2dxf.ulp
@@ -0,0 +1,488 @@
+#usage "Convert a CAM job to a script to export DXF data\n"
+ "
"
+ "ASSIGN Shift+Ctrl+Alt+I 'run cam2image;';"
+ "
"
+ "or ASSIGN Shift+Ctrl+Alt+I 'run cam2image myjob.cam monochrome 150 .bmp;';"
+ "
"
+ "or ASSIGN Shift+Ctrl+Alt+I 'run cam2image myjob.cam color 300 .tif;';"
+ "
\n" +
+ "If the layer list is empty after starting this ULP,
" +
+ "you did not start it from the proper editor window (SCH/BRD).
" +
+ "CAM jobs for the layout have to be started from the Layout Editor, " +
+ "jobs for a schematic from the Schematic Editor. " +
+ "CAM Jobs can be edited and saved by the CAM processor only.
run " + filename(argv[0]) + " n
");
+ }
+ // *** Layer list to print ***
+ int Seleclayer;
+ string layer[] ;
+ int n = 0;
+ int ln = strsplit(layer, sec_Layers[tpn], ' ');
+ for (int x = 0; x < ln; x++) {
+ int num = strtod(layer[x]);
+ if (useLayer[num]) {
+ if(schematic) {
+ if (num >= 90) {
+ sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]);
+ n++;
+ }
+ }
+ if(board) {
+ if (num < 90 || num >= 100) { // incl. layer 100, 25.03.2008
+ sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]);
+ n++;
+ }
+ }
+ }
+ }
+ sec_usedlayer[n] = ""; // clear last+1
+ dlgStretch(0);
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgHBoxLayout { dlgSpacing(100); }
+ dlgLabel("Printed layers");
+ dlgListBox(sec_usedlayer, Seleclayer);
+ }
+ // *** Layer list to print ***
+ }
+ }
+ dlgSpacing(10);
+ dlgStretch(1);
+ tpn++;
+ }
+ } // end off while
+ // ************ End of TAB | SHEET ***********
+ dlgTabPage("&Help") {
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgHBoxLayout {
+ dlgLabel(Eagle);
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgLabel(EAGLE_SIGNATURE);
+ dlgSpacing(10);
+ if (description) {
+ dlgHBoxLayout {
+ dlgPushButton("&show Job-Description") viewDescript();
+ dlgStretch(1);
+ }
+ }
+ else dlgLabel("CAM-Job description is EMPTY");
+ }
+ dlgStretch(1);
+ }
+ dlgSpacing(10);
+ dlgLabel(help);
+ dlgStretch(1);
+ }
+ }
+ }
+ } // ************ End of all TABs ***********
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgPushButton("+OK") dlgAccept();
+ dlgStretch(0);
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(1);
+ dlgPushButton("&Load CAM-File") {
+ CAMfileName = dlgFileOpen("select a File", path_cam[0]+"/*.cam", "");
+ if (CAMfileName) {
+ exit ("run " + filesetext(argv[0], " ") + " '" + PageLimit_all + "' '" + CAMfileName + "';\n");
+ }
+ }
+ dlgStretch(1);
+ }
+ };
+
+if (Result == 0) exit (0);
+
+// make print command
+ if (test) cmd = "# generatet by " + argv[0] + " from " + CAMfileName + "\n";
+
+for (int tpn = 1; tpn <= sx; tpn++) {
+ string layer[] ;
+ int n = 0;
+ int ln = strsplit(layer, sec_Layers[tpn], ' ');
+ if (test) cmd += "# Section: " + sec_Name[tpn] + "\n";
+ if(board) {
+ if(fillpads[tpn]) {
+ cmd += "SET DISPLAY_MODE NODRILL;\n";
+ }
+ else {
+ cmd += "SET DISPLAY_MODE REAL;\n";
+ }
+ 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, " %s", layer[x]);
+ cmd += s;
+ if(num == 21) cmd += " -23 -25 -27 -51";
+ if(num == 22) cmd += " -24 -26 -28 -52";
+ n++;
+ }
+ }
+ }
+ cmd += ";\n";
+ commandPrint(tpn);
+ }
+
+ if(schematic) {
+ cmd += "DISPLAY NONE ";
+ for (int x = 0; x < ln; x++) {
+ int num = strtod(layer[x]);
+ if (useLayer[num]) {
+ if (num >= 90) {
+ sprintf(s, " %s", layer[x]);
+ cmd += s;
+ n++;
+ }
+ }
+ }
+ cmd += ";\n";
+ string sh;
+ switch (sheetprint) {
+ case 0 : schematic(S) {
+ S.sheets(SH) {
+ sprintf(sh, "EDIT '.s%d';\n", SH.number);
+ cmd += sh;
+ commandPrint(tpn);
+ }
+ }
+ break;
+
+ case 1 : for (int prn = sheetprint_from[tpn]; prn <= sheetprint_to[tpn]; prn++) {
+ sprintf(sh, "EDIT '.s%d';\n", prn);
+ cmd += sh;
+ commandPrint(tpn);
+ }
+ break;
+
+ case 2 : sprintf(sh, "EDIT '.s%d';\n", sec_Sheet[tpn]);
+ cmd += sh;
+ commandPrint(tpn);
+ break;
+
+ case 3 : sprintf(sh, "EDIT '.s%s';\n", actualsheet);
+ cmd += sh;
+ commandPrint(tpn);
+ break;
+ }
+ }
+ }
+
+cmd += "DISPLAY ";
+if(board) {
+ 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 += ";\nSET DISPLAY_MODE REAL;\n";
+ }
+
+if(schematic) {
+ 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";
+ sprintf(s, "EDIT '.s%s';\n", actualsheet);
+ cmd += s;
+ }
+
+if (test) { if (dlgMessageBox(cmd, "OK", "Cancel") != 0) exit (-1);}
+// output("c:/tmp/cam2print.scr", "wt") printf("%s", cmd);
+exit (cmd);
diff --git a/eagle-5.7.0/ulp/change-pad-in-lbr-1.bmp b/eagle-5.7.0/ulp/change-pad-in-lbr-1.bmp
new file mode 100644
index 0000000..7cbc5e3
Binary files /dev/null and b/eagle-5.7.0/ulp/change-pad-in-lbr-1.bmp differ
diff --git a/eagle-5.7.0/ulp/change-pad-in-lbr-x.bmp b/eagle-5.7.0/ulp/change-pad-in-lbr-x.bmp
new file mode 100644
index 0000000..cb4429a
Binary files /dev/null and b/eagle-5.7.0/ulp/change-pad-in-lbr-x.bmp differ
diff --git a/eagle-5.7.0/ulp/change-pad-in-lbr.ulp b/eagle-5.7.0/ulp/change-pad-in-lbr.ulp
new file mode 100644
index 0000000..a95f3ce
--- /dev/null
+++ b/eagle-5.7.0/ulp/change-pad-in-lbr.ulp
@@ -0,0 +1,491 @@
+#usage "Change shape, diameter, flags and drill of all pads in a library\n"
+ "
" +
+ "
Only for drill diameter of pads that are within the given tolerances.
" +
+ "
" +
+ "
" +
+ "
Rundet nur Bohrdurchmesser von PADs deren Wert innerhalb des Toleranzfensters liegt.
" +
+ "
" +
+ "
"
+ "YES = clear without confirmation.
"
+ "Clear only layer in packages
" + usage, "OK");
+ exit(0);
+ }
+ if (argv[1] == "YES") { cnt = 2; clear_outo = 1; }
+ for (int n = cnt; n <= argc; n++) {
+ clear_layer[n] = strtol(argv[n]);
+ cmd += argv[n] + "\n";
+ }
+
+ library(L) {
+ L.layers(LY) {
+ layer_visible[LY.number] = LY.visible;
+ }
+ scriptfile = filedir(L.name) + clrscript;
+ output(scriptfile, "wtD") {
+ printf("GRID MM FINEST;\nDISPLAY NONE ");
+ for (int n = cnt; n < argc; n++) {
+ printf(" %d", clear_layer[n]);
+ if (clear_layer[n] == 21) {
+ printf(" -23 -25 -27 -51");
+ }
+ if (clear_layer[n] == 22) {
+ printf(" -24 -26 -28 -52");
+ }
+ }
+ printf(";\n");
+
+ L.packages(P) {
+ // extended with .PAC ## 22.03.2005 support@cadsoft.de
+ sprintf(s, "Edit %s.PAC;\nCHANGE LAYER %d;\nRECT (%.4f %.4f)(%.4f %.4f);\nGROUP (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (>%.4f %.4f);\nDELETE (>%.4f %.4f);\n",
+ P.name,
+ clear_layer[cnt],
+ u2mm(P.area.x1)/2, u2mm(P.area.y1)/2,
+ u2mm(P.area.x2)/2, u2mm(P.area.y2)/2,
+ u2mm(P.area.x1), u2mm(P.area.y1),
+ u2mm(P.area.x2), u2mm(P.area.y1),
+ u2mm(P.area.x2), u2mm(P.area.y2),
+ u2mm(P.area.x1), u2mm(P.area.y2),
+ u2mm(P.area.x1), u2mm(P.area.y1),
+ u2mm(P.area.x1), u2mm(P.area.y1) );
+ if (clear_outo) {
+ printf("%s", s);
+ }
+ else {
+ if (dlgMessageBox("clear layer(s) in package:\n" + P.name, "Yes", "+No") == 0) {
+ printf("%s", s);
+ }
+ }
+ }
+ printf("grid last;\n");
+ printf("DISPLAY NONE ");
+ for (int l = 255; l ; l--) {
+ if (l == 99) l = 89; // *** no Symbol Layer ***
+ if (layer_visible[l]) printf(" %d", l);
+ }
+ }
+ }
+ exit("SCRIPT '" + scriptfile + "';");
+}
+
+
+dlgMessageBox("Start this ULP from a Library", "OK");
+exit(0);
diff --git a/eagle-5.7.0/ulp/cmd-change-brd-width.ulp b/eagle-5.7.0/ulp/cmd-change-brd-width.ulp
new file mode 100644
index 0000000..44c3c77
--- /dev/null
+++ b/eagle-5.7.0/ulp/cmd-change-brd-width.ulp
@@ -0,0 +1,267 @@
+#usage "
"
+ "Angle start [Angle step] [End angle]
"
+ "[Layer]
"
+ "[Wire & width]
"
+ "[Xcoordinate] [Ycoordinate] **
"
+ "[Polygon]
"
+ "[Pad || Smd || Via]
"
+ "[Width Length] SMD_dx SMD_dy
"
+ "[-Name] signal/pad/smd
"
+ "[Diameter] for Pad/Via, if used
"
+ "[Drill] for Pad/Via/Hole, if used
"
+ "[°] define angle (in degrees) for step
"
+ "[/] define number of steps within start and end angle
"
+ "[Group] rotate and paste
"
+ "[rotate match]
"
+ "[MOVE] elements on place by order
start with name (only in Board)
"
+ "[Circle] emulate/draw a cricle with wire or polygon
"
+ "[full ellipse 0]
"
+ "[Ellipse factor] height = radius * f
"
+ "[1/4 ellipse] 90 degree, 1st quadrant
"
+ "
"
+ "** If MARK is set in PAC/BRD/SCH editor, coordinates are relativ.
"
+ "Parameters can be used in any order; not case sensitive."
+ "
"
+ "Startwinkel [Winkelschritt oder Anzahl (# .)] [Endwinkel]
"
+ "[Layer]
"
+ "[Wre width] setzt die Breite (width) und den Befehl WIRE.
"
+ "Für Polygon muß W vor O angegeben werden.
"
+ "[X-Koordinate] [Y-Koordinate] **
"
+ "[Polygon]
"
+ "[Pad || Smd || Via]
"
+ "[Width Length] SMD_dx SMD_dy
"
+ "[-Name] Signal/Pad/Smd
"
+ "[Diameter] für Pad/Via, wenn benutzt
"
+ "[Drill] für Pad/Via/Hole, wenn benutzt
"
+ "[°] Winkelschritt in Grad
"
+ "[/] berechnet den Winkel (End - Start / Anzahl
"
+ "[Group] Rotate und Paste der vorher definierten Gruppe
"
+ "[Rotate match] dreht die Bauteile/Pad/Smd im selben Winkel
in dem sie angeordnet werden
"
+ "[MOVE] plaziert Elemente aufsteigend beginnend mit dem
angegebenen Namen (nur im Board nutzbar )
"
+ "[Circle] zeichnet einen Kreis oder Ellipse als Wire oder Polygon
je nach Option (W/O)
"
+ "[full ellipse 0] zeichnet eine volle Ellipse
"
+ "[Ellipse faktor] der Wert mit dem die Länge multipliziert wird
(Raduis * f) ergibt die Länge in y
"
+ "[1/4 ellipse] zeichnet nur den ersten Qudranten
einer Ellipse oder Kreises
"
+ "
"
+ "** Ist MARK im benutzten PAC/BRD/SCH Editor gesezt,
werden die Koordinaten relativ zur Marke benutzt.
"
+ "Die Parameter können in beliebiger Reihenfolge angegeben
und groß oder klein geschrieben werden."
+ "
" +
+ "RUN cmd-draw w0.4 -gnd x1.3 y2.56 +17.45 a115 n75 e180 . lTop
" +
+ "RUN cmd-draw w0.4 -gnd x1.3 y2.56 +17.45 a115 ltop
" +
+ "RUN cmd-draw a0 e150.0 x30 y4 w0.2 n9 # o +2.27 -gnd l1
" +
+ "RUN cmd-draw a0 e50.0 x30 y4 w0.2 n9 o 0 f1.7 +2.27 -gnd l1
" +
+ "RUN cmd-draw w0.4 +1.5 -gnd a2 y2.56 l16
" +
+ "RUN cmd-draw +2.0 e270.0 n9.0 w0.2 x-2.54 y5.08
" +
+ "RUN cmd-draw x1 y3.33 l1 w.2 +4.77 # n5
" +
+ "RUN cmd-draw s -1 +9 n7 #
" +
+ "RUN cmd-draw r1.2 +19.9 n7 #
" +
+ "RUN cmd-draw r1.2 +9.5 n7 .
" +
+ "RUN cmd-draw +2.20 n9.0 w0.2 x-2.54 y-5.08 w.01 l1 O 0 f1.75
" +
+ "RUN cmd-draw +2.20 n9.0 w0.2 x-2.54 y-5.08 w.01 l1 O 4 f1.75
" +
+ "RUN cmd-draw s -1 +9 a22.5 m
" +
+ "RUN cmd-draw s i1.55 t2.7 -A +2.20 n20.0 x-2.54 y-5.08 l1 f1.75 m
" +
+ "RUN cmd-draw r.8 d1.4 v -A +4.20 n20.0 x-2.54 y-5.08 l1 f1.75
" +
+ "RUN cmd-draw g n33.333 # A0.0 e359.9
" +
+ "RUN cmd-draw G n33.333 . A0.0 e359.9
" +
+ "RUN cmd-draw +10 MOVE -R1 M a33 L16 N7 E322 .
"+
+ "
" +
+ "Ist Angle start bei negativen Angle step " +
+ "kleiner als Angle end wird auf Angle start 360° aufaddiert.
" +
+ "Damit ist es möglich die Elemente rechtsdrehen anzuordnen.";
+
+ mark_info = "
"
+ "RUN cmd-net-list2sch [netlist-file ]
"
+ "RUN cmd-net-list2sch [net part pin part pin ]
"
+ "RUN cmd-net-list2sch : Opens a file dialog to select the Net list file."
+ "
"
+ "RUN cmd-net-list2sch hexapod.lst
"
+ "RUN cmd-net-list2sch IN1 R1 1 C1 2
"
+ "RUN cmd-net-list2sch clk ic1 9 ic3 15
"
+ "
"
+ "This is the case if a net line overlaps a pin connection point.
"
+ "If this certain pin under the net should get connected later, EAGLE will connect to the net "
+ "instead of the pin under it.
"
+ "We want to avoid this problem in the ULP by drawing the net "
+ "line from the first pin with an offset of 50 mil. This way "
+ "diagonal net lines will be drawn
"
+ "and there will be hardly pins that lie under net lines.
"
+ "If a net has to be drawn on a further sheet of the schematic "
+ "EAGLE uses the diagonal offset of 50 mil and places an "
+ "additional LABEL."
+ "
\n"
+ "Das Einlesen einer Netzliste (Airwire) in den Schaltplan, " +
+ "kann in besonderen Situationen zu falschen Verbindungen führen.
" +
+ "Werden die Netze als Luftlinien zwischen den Bauteilpins gezeichnet, " +
+ "so kann es vorkommen, dass eine Netzlinie Bauteilpins überlagert.
" +
+ "Wird später dieser Pin unter der Linie an ein Netz angeschlossen " +
+ "so nimmt EAGLE das Netz als Kontaktpunkt und nicht den darunterliegenden Pin.
" +
+ "In diesem ULP wird versucht diese Problematik zu umgehen, in dem vom " +
+ "ersten Pin mit einem Offset (50mil) diagonal vom Pin weg, " +
+ "und dann direkt zum zweiten Pin gezeichnet wird.
" +
+ "Dadurch entstehen diagonale Luftlinien die nur in seltenen Fällen einen Pin " +
+ "überlagern.
" +
+ "Wird ein Netz auf einer anderen Schaltplanseite weitergeführt, " +
+ "so wird vom Pin um 50 Mil diagonal weggezeichnet und zusätzlich " +
+ "ein LABEL plaziert.
"
+ "In special situations it could happen that importing a netlist "
+ "into a schematic (in form of 'airwires' as it happens here) "
+ "results in misconnections. This is the case if a net line "
+ "overlaps a pin connection point. If this certain pin under the "
+ "net should get connected later, EAGLE will connect to the net "
+ "instead of the pin under it.
\n"
+ "The Renumber Script can be saved.\n"
+ "
\n"
+ "Please note that on fast computers Preview might be too fast to watch!\n"
+ "
ERROR: No board!
ERROR: No board!
ERROR: No package!
"
+ "run copy-wire-to-any-layer.ulp $nameoff$
"
+ "run copy-wire-to-any-layer.ulp -p [signalname] [signalname]
"
+ "run copy-wire-to-any-layer.ulp +p [signalname] [signalname]
"
+ "run copy-wire-to-any-layer.ulp -p -f [signalname] [signalname]
"
+ "run copy-wire-to-any-layer.ulp +p +f [signalname] [signalname]
"
+ "$nameoff$ switches off the checking of net names
"
+ "$nameoff$ copy all signals.
"
+ "-p copies also polygons.
"
+ "+p copies only polygons.
"
+ "-f copies only polygon contour as polygon.
"
+ "-f copies polygon contour and filling as wire.
"
+ "
"
+ "run copy-wire-to-solder-mask.ulp $nameoff$
"
+ "run copy-wire-to-solder-mask.ulp -p [signalname] [signalname]
"
+ "run copy-wire-to-solder-mask.ulp +p [signalname] [signalname]
"
+ "run copy-wire-to-solder-mask.ulp -p -f [signalname] [signalname]
"
+ "run copy-wire-to-solder-mask.ulp +p +f [signalname] [signalname]
"
+ "$nameoff$ switches off the checking of net names
"
+ "$nameoff$ copy all signals.
"
+ "-p copies also polygons.
"
+ "+p copies only polygons.
"
+ "-f copies only polygon contour as polygon.
"
+ "-f copies polygon contour and filling as wire.
"
+ "
"
+ "Sort both drill tools and drill diameters in the same ascending order as the drill legend.
"
+ "You could also generate the drill configuration for the CamProcessor.
"
+ "
"
+ "Place also the symbols of drills on board.
"
+ "Do not use the Option - Set - Drill set,
"
+ "while drills are roundet in diameter in this ULP!
"
+ "You can extend the symbol list below the line:
"
+ "ARRAY OF EAGLE DRILL SYMBOLS
in the source text of this ULP.
"
+ "Legend
" +
+ "Title " +
+ "Enter here the name of your choice for the title field. Rank "+
+ " Choose here a number (from 1 to 8) for the position of each field in the drill legend. 0 = unselected. " +
+ ""+
+ " Horizontal " +
+ " Choose this option for horizontal drill legend. "+
+ " Vertical " +
+ " Choose this option for vertical drill legend. Symbols
Symbol Layer " +
+ " Choose in this field the layer in which you want draw this drill legend. " +
+ " Symbol Size " +
+ " Enter in this field the symbol diameter (in mils). " +
+ " Symbol Width " +
+ " Enter in this field the symbol line width (in mils). Texts
Text Font " +
+ " Choose a text font in the list. " +
+ "Text Size " +
+ "Enter in this field the font size (in mils). " +
+ "Text Ratio Enter in this field the font ratio (in %). Table
Horizontal " +
+ "" +
+ " Horizontal space between texts and border cells. Vertical " +
+ " Vertical space between texts and border cells. " +
+ " Cell " +
+ "Enter in this field the outline width of a cell (in mils). Title " +
+ "" +
+ " Enter in this field the outline width of the title (in mils). Table " +
+ " Enter in this field the outline width of the table (in mils). Holes
Alternate " +
+ "" +
+ " For each diameter, non-plated holes are treated after plated holes but before the following diameter. Mixed " +
+ " Only one diameter per column. Plated and non-plated holes with same diameter are added in the same column. " +
+ "In this case, plated status show: \"BOTH\". " +
+ " Last " +
+ " All plated holes diameter are treated first, then all non-plated are treated last. " +
+ " Not Plated " +
+ " Enter in this field a string meaning: not plated hole. Default: \"NOT\". " +
+ " Mixed " +
+ "" +
+ " Enter in this field a string meaning: plated and not plated use the same drill tool. Default: \"BOTH\". Plated " +
+ " Enter in this field a string meaning: plated hole. Default: \"YES\". Mils " +
+ " Unit of precision for mils. MM " +
+ " Unit of precision for millimeters. " +
+ "
Plated Holes " +
+ " Enter in this field your value for plated holes tolerance. " +
+ " Non-Plated Holes " +
+ " Enter in this field your value for non-plated holes tolerance. Outputs
Create file " +
+ " Click on this check button for create the drill rack file used in the cam processor. " +
+ "Choose the output unit: milimeters or inches.
"
+ ""
+ "
"
+ "Example:"
+ " "
+ "-s suffix define a suffix that will be appended to the file name "
+ "-u mm|inch select the unit for coordinates and dimensions "
+ "-a set the 'Always vector font' option "
+ "-w set the 'Use wire width' option "
+ "-f set the 'Fill areas' option
"
+ "
"
+ ""
+ "Der DXF-Standard
"
+ "By Dietmar Rudolph
"
+ "Publisher: Dr. L. Rossipaul Verlagsgesellschaft m.b.H.
"
+ "München, 1993
"
+ "ISBN 3-87686-246-9"
+ "
"
+ ""
+ "
"
+ "Beispiel:"
+ " "
+ "-s suffix definiert einen Suffix, der an den Dateinamen angehängt wird "
+ "-u mm|inch bestimmt die Einheit für Koordinaten und Abmessungen "
+ "-a schaltet die Option 'Immer Vektor-Font' ein "
+ "-w schaltet die Option 'Linienbreite benutzen' ein "
+ "-f schaltet die Option 'Flächen füllen' ein
"
+ "
"
+ ""
+ "Der DXF-Standard
"
+ "Von Dietmar Rudolph
"
+ "Herausgeber: Dr. L. Rossipaul Verlagsgesellschaft m.b.H.
"
+ "München, 1993
"
+ "ISBN 3-87686-246-9"
+ "
ERROR: unknown unit: \v"
+ "
FEHLER: unbekannte Einheit: \v"
+ ,
+ "
ERROR: missing unit\v"
+ "
FEHLER: fehlende Einheit\v"
+ ,
+ "
ERROR: unknown option: \v"
+ "
FEHLER: unbekannte Option: \v"
+ ,
+ "
ERROR: No board or schematic!
FEHLER: Kein Board oder Schaltplan!
ERROR: unknown unit: ") + argv[i] + "");
+ exit(1);
+ }
+ }
+ else {
+ dlgMessageBox(usage + tr("
ERROR: missing unit"));
+ exit(1);
+ }
+ }
+ else if (argv[i] == "-a") AlwaysVectorFont = YES;
+ else if (argv[i] == "-w") UseWireWidths = YES;
+ else if (argv[i] == "-f") FillAreas = YES;
+ else {
+ dlgMessageBox(usage + tr("
ERROR: unknown option: ") + argv[i] + "");
+ exit(1);
+ }
+ }
+
+if (board)
+ board(B) {
+ OutputFileName = B.name;
+ B.layers(L) {
+ string s = L.name;
+ if (L.visible && s[0] == '$') {
+ VisibleSupplyLayer = YES;
+ IsSupplyLayer[L.number] = YES;
+ }
+ }
+ }
+else if (schematic)
+ schematic(SCH) OutputFileName = SCH.name;
+else {
+ dlgMessageBox(usage + tr("
ERROR: No board or schematic!
"
+ "Bei einem lokalen Attribut wurde in der Bibliothek im Symbol "
+ "ein Platzhaltertext (>ATTRIBUTNAME) angelegt und in der Devicedefinition "
+ "das entsprechende Attribut definiert. Der Attributwert ist üblicherweise "
+ "noch nicht festgelegt.
"
+ "Ein Attribut gilt ebenfalls als lokal, wenn es erst im Schaltplan "
+ "für ein spezielles Bauteil angelegt wurde. Der Platzhaltertext muss "
+ "aber bereits bei der Bauteildefinition im Symbol angelegt worden sein.
"
+ "Wollen Sie zum Beispiel für einen Zeichnungsrahmen ein globales Attribut anlegen, "
+ "wählen Sie unter GLOBALE die Option anlegen. "
+ "Doppelklicken Sie dann auf den Rahmen in der Liste der Bauteile. "
+ "Es öffnet sich ein neues Fenster mit den vorhandenen Attributen. "
+ "Durch Doppelklick auf einen Eintrag in der Liste wählen Sie das Attribut, "
+ "das angelegt werden soll. Es öffnet sich ein weiteres Fenster in dem Sie "
+ "den Wert für das Attribut definieren können.
"
+ "Aktivieren Sie unter Attribut bearbeiten die Option ja, "
+ "wenn Sie die Änderung übernehmen wollen, nicht ändern, wenn Sie "
+ "keine Änderung machen wollen, oder löschen wenn sie das Attribut "
+ "löschen wollen.
"
+ "Mit OK übernehmen Sie die Einstellungen.
"
+ "Dieselbe Vorgehensweise gilt auch für das Bearbeiten und Anlegen "
+ "von lokalen Attributen.
"
+ "RUN e-attributverwaltung [+L | -L]
"
+ "
"
+ "Option -L löscht die Attribute aus einer definierbaren Liste im Deviceset (direkt ohne nachfragen)
"
+ "
");
+ dlgHBoxLayout {
+ dlgPushButton("&Alle") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else setzealle(alle_setzen);
+ }
+ dlgPushButton("nur &Atrribute") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if(sel < 0) dlgMessageBox("Wählen sie ein Atrribut (stellvertretend in einer Zeile).", "OK");
+ else setze_attribut(alle_setzen, sel);
+ }
+ dlgPushButton("nur &Variant") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if (sel < 0) dlgMessageBox("Wählen sie eine Variante (stellvertretend in einer Zeile).", "OK");
+ else setze_variant(alle_setzen, sel);
+ }
+ dlgPushButton("nur &Technologie") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if (sel < 0) dlgMessageBox("Wählen sie eine Technologie (stellvertretend in einer Zeile).", "OK");
+ else setze_techno(alle_setzen, sel);
+ }
+ dlgStretch(1);
+ }
+ }
+ else {
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&nein") { alle_setzen = nein; setzealle(alle_setzen); }
+ dlgPushButton("&ja") { alle_setzen = ja; setzealle(alle_setzen); }
+ dlgPushButton("&löschen") { alle_setzen = loeschen; setzealle(alle_setzen); }
+ dlgStretch(1);
+ }
+ }
+ }
+ dlgStretch(1);
+ }
+ else {
+ dlgGroup("Alle Attribute anlegen") {
+ if (deviceset) {
+ dlgHBoxLayout {
+ dlgRadioButton("&nein", alle_setzen);
+ dlgRadioButton("&ja", alle_setzen);
+ dlgRadioButton("&löschen", alle_setzen);
+ dlgStretch(1);
+ }
+ dlgLabel("
");
+ dlgHBoxLayout {
+ dlgPushButton("&Alle") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else setzealle(alle_setzen);
+ }
+ dlgPushButton("nur &Atrribute") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if(sel < 0) dlgMessageBox("Wählen sie ein Atrribut (stellvertretend in einer Zeile).", "OK");
+ else setze_attribut(alle_setzen, sel);
+ }
+ dlgPushButton("nur &Variant") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if(sel < 0) dlgMessageBox("Wählen sie eine Variante (stellvertretend in einer Zeile).", "OK");
+ else setze_variant(alle_setzen, sel);
+ }
+ dlgPushButton("nur &Technologie") {
+ if (alle_setzen < 0) dlgMessageBox("Wählen sie, nein, ja, löschen.", "OK");
+ else if (sel < 0) dlgMessageBox("Wählen sie eine Technologie (stellvertretend in einer Zeile).", "OK");
+ else setze_techno(alle_setzen, sel);
+ }
+ dlgStretch(1);
+ }
+ }
+ else {
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("&nein") { alle_setzen = nein; setzealle(alle_setzen); }
+ dlgPushButton("&ja") { alle_setzen = ja, setzealle(alle_setzen); }
+ dlgStretch(1);
+ }
+ }
+ }
+ dlgStretch(1);
+ }
+ }
+ dlgLabel("oder selektieren Sie ein Attribut durch Doppelklick in die Zeile.");
+ if (isBoard && isSchematic && Objekt != Lokal) {
+ dlgCheckBox(attmsg, in_brd_sch);
+ }
+
+ if (Objekt == Lokal && schematic) dlgLabel("Anmerkung: Lokale Attribute die im Device definiert sind, können nicht gelöscht werden.");
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel(Version);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-&Zurück") { dlgReject(); clear_list(); }
+ dlgStretch(1);
+ dlgPushButton("Hilfe") dlgMessageBox(usage, "OK");
+ }
+ };
+ return RESULT;
+}
+
+/************** SCHEMATIC ***************/
+void SCH_attribut_anlegen(int Type, string PartName, string PartSheet) {
+ cntP = 0;
+ cntA = 0;
+ int cntL = 0;
+ if (project.schematic) project.schematic(SCH) {
+ if (Type == Global) {
+ SCH.attributes(A) { // sammle globale Attribute
+ AttribPart[cntA] = A.name;
+ AttribWert[cntA] = A.value;
+ cntA++;
+ }
+ SCH.parts(P) {
+ if (P.name == PartName) {
+ P.instances(I) {
+ I.gate.symbol.texts(T) { // sammle Platzhalter
+ string s = AttribT(strupr(T.value));
+ if (s) {
+ Platzhalter[cntP] = s;
+ cntP++;
+ LPlatzhalter[cntL] = s;
+ cntL++;
+ }
+ }
+ }
+ Platzhalter[cntP] = "";
+ }
+ }
+ }
+ else {
+ SCH.parts(P) {
+ if (P.name == PartName) {
+ cntA = 0;
+ P.attributes(A) { // sammle lokale Attribute
+ AttribPart[cntA] = A.name;
+ cntA++;
+ }
+ AttribPart[cntA] == "";
+ P.instances(I) {
+ I.gate.symbol.texts(T) { // sammle Platzhalter
+ string s = AttribT(strupr(T.value));
+ if (s) {
+ Platzhalter[cntP] = s;
+ cntP++;
+ LPlatzhalter[cntL] = s;
+ cntL++;
+ }
+ }
+ }
+ Platzhalter[cntP] = "";
+ }
+ }
+ }
+ }
+ if (!cntP) {
+ dlgMessageBox("In "+PartName+" sind keine freien Textplatzhalter verfügbar!", "OK");
+ return;
+ }
+ if (cntP) {
+ copyPlatzhalterList(cntL);
+ if (menu(Type, SCHeditor, PartName, PartSheet, neu)) generateAttribScript(Type, SCHeditor, PartName, PartSheet);
+ }
+ return;
+}
+
+
+void SCH_attribut_bearbeiten(int Type, string PartName, string Sheet) {
+ cntP = 0;
+ cntA = 0;
+ if (project.schematic) project.schematic(SCH) {
+ if (Type == Global) {
+ SCH.attributes(A) { // sammle globale Attribute
+ ListAttrib[cntA] = A.name + "\t" + setze[ja] + "\t" + A.value;
+ AttribPart[cntA] = A.name;
+ AttribWert[cntA] = A.value;
+ cntA++;
+ }
+ Platzhalter[cntA] = ""; // letzten Platzhalter markieren
+ ListAttrib[cntA] = "";
+ cntP = cntA;
+ if (cntP) {
+ if (menu(Type, SCHeditor, PartName, Sheet, bearbeiten)) generateAttribScript(Type, SCHeditor, PartName, Sheet);
+ }
+ else dlgMessageBox("!Keine globalen Attribute definiert!", "OK");
+ }
+ else if (Type == Lokal) {
+ SCH.parts(P) {
+ if (P.name == PartName) {
+ P.attributes(A) { // sammle lokale Attribute
+ ListAttrib[cntA] = A.name + "\t" + setze[ja] + "\t" + A.value;
+ Platzhalter[cntA] = A.name;
+ AttribWert[cntA] = A.value;
+ cntA++;
+ }
+ }
+ }
+ Platzhalter[cntA] = ""; // letzten Platzhalter markieren
+ ListAttrib[cntA] = "";
+ cntP = cntA;
+ if (cntP) {
+ if (menu(Type, SCHeditor, PartName, Sheet, bearbeiten)) generateAttribScript(Type, SCHeditor, PartName, Sheet);
+ }
+ else dlgMessageBox("In "+PartName+" sheet " + Sheet + " sind keine lokalen Attribute definiert!", "OK");
+ }
+ }
+ return;
+}
+
+
+/************** BOARD ***************/
+void BRD_attribut_anlegen(int Type, string ElementName) {
+ cntP = 0;
+ cntA = 0;
+ cntE = 0;
+ if (project.board) project.board(BRD) {
+ BRD.attributes(A) { // sammle globale Attribute
+ AttribPart[cntA] = A.name;
+ AttribWert[cntA] = A.value;
+ cntA++;
+ }
+ BRD.elements(E) {
+ if (E.name == ElementName) {
+ cntA = 0;
+ E.attributes(A) {
+ AttribPart[cntA] = A.name;
+ cntA++;
+ }
+ AttribPart[cntA] == "";
+
+ E.package.texts(T) { // sammle Platzhalter
+ // in Packages kann es sinnvoll sein, Platzhalter mehrfach zu platzieren,
+ // Beispiel: Zeichnungsrahmen für Top und Bottom, wegen gespiegeltem Ausdruck.
+ // Hier muß überprüft werden ob eine POlattzhalter dopplet definiert ist,
+ // da es sonst zu doppelter Definition kommt, und die letzte Defionition
+ // die entscheidende ist.
+ string s = AttribT(strupr(T.value)); // überprüfe auf reservierte Textplatzhalter wie >NAME >VALUE >GATE ...
+ if (s) {
+ int found = 0;
+ for(int n = 0; n < cntP; n++) {
+ if (Platzhalter[n] == s) {
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ Platzhalter[cntP] = s;
+ cntP++;
+ LPlatzhalter[cntE] = s;
+ cntE++;
+ }
+ }
+ }
+ Platzhalter[cntP] = "";
+ }
+ }
+ }
+ if (!cntP) {
+ dlgMessageBox("In "+ElementName+" sind keine freien Textplatzhalter verfügbar!", "OK");
+ return;
+ }
+ if (cntP) {
+ copyPlatzhalterList(cntP);
+ if (menu(Type, BRDeditor, ElementName, "BRD", neu)) generateAttribScript(Type, BRDeditor, ElementName, ".BRD");
+ }
+ return;
+}
+
+
+void BRD_attribut_bearbeiten(int Type, string ElementName) {
+ if (project.board) project.board(BRD) {
+ if (Type == Global) {
+ cntE = 0;
+ BRD.attributes(A) { // sammle globale Attribute
+ ListAttrib[cntE] = A.name + "\t" + setze[ja] + "\t" + A.value;
+ AttribPart[cntE] = A.name;
+ AttribWert[cntE] = A.value;
+ cntE++;
+ }
+ cntP = cntE;
+ if (!cntP) dlgMessageBox("Keine globalen Attribute definiert!", "OK");
+ else {
+ if (menu(Type, BRDeditor, ElementName, "BRD", bearbeiten)) generateAttribScript(Type, BRDeditor, ElementName, ".BRD");
+ }
+ }
+ else if (Type == Lokal) {
+ cntE = 0;
+ BRD.elements(E) {
+ if (ElementName == E.name) {
+ E.attributes(A) { // sammle lokale Attribute
+ ListAttrib[cntE] = A.name + "\t" + setze[ja] + "\t" + A.value;
+ Platzhalter[cntE] = A.name;
+ AttribWert[cntE] = A.value;
+ cntE++;
+ }
+ }
+ }
+ cntP = cntE++;
+ Platzhalter[cntP] = ""; // letzten Platzhalter markieren
+ ListAttrib[cntP] = "";
+ if (cntP) {
+ if (menu(Type, BRDeditor, ElementName, "BRD", bearbeiten)) generateAttribScript(Type, BRDeditor, ElementName, ".BRD");
+ }
+ else dlgMessageBox("In "+ElementName+" sind keine lokalen Attribute definiert!", "OK");
+ }
+ }
+ return;
+}
+
+
+/************** DEVICE ***************/
+void DEV_attribut_bearbeiten(int Type, string PartName) {
+ deviceset(DS) {
+ getAttributeDS(DS);
+ if (cntA) {
+ if (menu(Type, DEVeditor, PartName, "DEV", bearbeiten)) generateAttribScript(Type, DEVeditor, PartName, "");
+ }
+ else dlgMessageBox("In " + PartName + " sind keine Attribute in definiert!", "OK");
+ }
+ return;
+}
+
+
+void DEV_attribut_anlegen(void) {
+ deviceset(DS) {
+ getTextPlatzhalterDS(DS);
+ if (!cntP) {
+ dlgMessageBox("In " + DS.name + " sind keine Textplatzhaltzer definiert,
oder keine freien Textplatzhalter verfügbar.", "OK");
+ }
+ else {
+ if (menu(Device, DEVeditor, DS.name, "DEV", neu)) generateAttribScript(Device, DEVeditor, DS.name, "");
+ }
+ }
+ return;
+}
+
+
+
+void generateAttribListe(string devname, string option) {
+ // kopiere Liste in Arbeitsliste
+ for (int n = 0; n < cntattributelist; n++) {
+ sprintf( ListAttrib[n], "%s\t%s\t", attribute_liste[n], option);
+ }
+ cntP = n;
+
+ generateAttribScript(Lokal, DEVeditor, devname, "");
+}
+
+
+void attributliste_sichern(void) {
+ output(attribute_list_datei, "wt") {
+ for (int n = 0; n < cntattributelist; n++) {
+ printf("%s\n", strupr(attribute_liste[n]));
+ }
+ }
+ return;
+}
+
+
+void attributliste_erweitern(void) {
+ string s;
+ dlgDialog("Attributliste bearbeiten") {
+ dlgHBoxLayout {
+ dlgLabel("Hinzufügen ");
+ dlgStringEdit(s);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") { attribute_liste[cntattributelist] = strupr(s); cntattributelist++; dlgAccept(); }
+ dlgPushButton("-Abbruch") dlgReject();
+ }
+ };
+ return;
+}
+
+
+void attributliste_delete(int sel) {
+ if (sel < 0) {
+ dlgMessageBox("wählen Sie einen Eintrag in der Liste", "OK");
+ return;
+ }
+ for (int n = sel; n < cntattributelist-1; n++) {
+ attribute_liste[n] = attribute_liste[n+1];
+ }
+ cntattributelist--;
+ attribute_liste[cntattributelist] = "";
+ return;
+}
+
+
+string attributliste_bearbeiten(string alt) {
+ string s = alt;
+ dlgDialog("Attributliste bearbeiten") {
+ dlgHBoxLayout {
+ dlgLabel("ändern ");
+ dlgStringEdit(s);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Abbruch") { s = alt; dlgReject(); }
+ }
+ };
+ return s;
+}
+
+
+void aus_liste_anlegen(string devname) {
+ int sel = -1;
+ dlgDialog("Attributliste verwalten") {
+ dlgLabel(attribute_list_datei);
+ dlgListView("Attr. Name", attribute_liste, sel) attribute_liste[sel] = strupr(attributliste_bearbeiten(attribute_liste[sel]));
+ // cntattributelist
+ dlgLabel("Listeneintrag");
+ dlgHBoxLayout {
+ dlgPushButton("Erweitern") attributliste_erweitern();
+ dlgPushButton("Löschen") attributliste_delete(sel);
+ dlgPushButton("Sichern") attributliste_sichern();
+ dlgStretch(1);
+ }
+ dlgLabel("Attribute ");
+ dlgHBoxLayout {
+ dlgPushButton("Anlegen") { dlgAccept(); generateAttribListe(devname, setze[ja]); }
+ dlgStretch(1);
+ dlgPushButton("-Abbruch") { dlgReject(); return; }
+ }
+ };
+ return;
+}
+
+
+void gen_attr_sch_brd(void) { // 2008-09-10
+ if (board);
+ else sprintf(cmd, "EDIT .brd;\n");
+ for (int n = 0; n < cnt_schattr; n++) {
+ sprintf(s, "ATTRIBUTE * %s '%s';\n", sch_attributte[n], sch_attributteValue[n]);
+ cmd += s;
+ }
+ return;
+}
+
+
+void gen_attr_brd_sch(void) {
+ if (schematic);
+ else sprintf(cmd, "EDIT .sch;\n");
+ for (int n = 0; n < cnt_brdattr; n++) {
+ sprintf(s, "ATTRIBUTE * %s '%s';\n", brd_attributte[n], brd_attributteValue[n]);
+ cmd += s;
+ }
+ return;
+}
+
+
+void get_diff_attr_sch(void) {
+ int n = 0;
+ if (board);
+ else cmd = "EDIT .brd;\n";
+ do {
+ if (attdiff_sch[n]) {
+ string l[];
+ int ln = strsplit(l, attdiff_sch[n], '\t');
+ sprintf(s, "ATTRIBUTE * %s %s;\n", l[0], l[1]);
+ cmd += s;
+ }
+ n++;
+ } while (attdiff_sch[n]);
+ exit(cmd);
+}
+
+
+void get_diff_attr_brd(void) {
+ int n = 0;
+ if (schematic);
+ else cmd = "EDIT .sch;\n";
+ do {
+ if (attdiff_brd[n]) {
+ string l[];
+ int ln = strsplit(l, attdiff_brd[n], '\t');
+ sprintf(s, "ATTRIBUTE * %s %s;\n", l[0], l[1]);
+ cmd += s;
+ }
+ n++;
+ } while (attdiff_brd[n]);
+ exit(cmd);
+}
+
+
+void get_diff_val_sch(void) { // Werte der Attribute angleichen
+ int n = 0;
+ if (schematic);
+ else cmd = "EDIT .sch;\n";
+ do {
+ if (attdiff_val[n]) {
+ string l[];
+ int ln = strsplit(l, attdiff_val[n], '\t');
+ sprintf(s, "ATTRIBUTE * %s '%s';\n", l[0], l[2]);
+ cmd += s;
+ }
+ n++;
+ } while (attdiff_val[n]);
+ exit(cmd);
+}
+
+
+void get_diff_val_brd(void) { // Werte der Attribute angleichen
+ int n = 0;
+ if (board);
+ else cmd = "EDIT .brd;\n";
+ do {
+ if (attdiff_val[n]) {
+ string l[];
+ int ln = strsplit(l, attdiff_val[n], '\t');
+ sprintf(s, "ATTRIBUTE * %s '%s';\n", l[0], l[1]);
+ cmd += s;
+ }
+ n++;
+ } while (attdiff_val[n]);
+ exit(cmd);
+}
+
+
+
+// ======== main ======== //
+if (schematic || deviceset || board) {
+ int npart = 0;
+ int nelement = 0;
+ string fg[];
+ int fcnt = fileglob(fg, attribute_list_datei);
+ if (!fcnt) dlgMessageBox("Attributliste " + attribute_list_datei + " nicht gefunden!", "OK");
+ else cntattributelist = fileread(attribute_liste, attribute_list_datei);
+
+ if (project.schematic) {
+ isSchematic = 1;
+ project.schematic(SCH) {
+ SCH.parts(P) {
+ Pname[npart] = P.name;
+ P.instances(I) {
+ sprintf(Psheet[npart], ".s%d", I.sheet);
+ break;
+ }
+ npart++;
+ }
+ SCH.attributes(A) {
+ sch_attributte[cnt_schattr] = A.name;
+ sch_attributteValue[cnt_schattr] = A.value;
+ cnt_schattr++;
+ }
+ }
+ }
+ if (project.board) {
+ isBoard = 1;
+ project.board(BRD) {
+ BRD.elements(E) {
+ Ename[nelement] = E.name;
+ nelement++;
+ }
+ BRD.attributes(A) {
+ brd_attributte[cnt_brdattr] = A.name;
+ brd_attributteValue[cnt_brdattr] = A.value;
+ cnt_brdattr++;
+ }
+ }
+ }
+ else if (deviceset) {
+ deviceset(DS) {
+ Pname[0] = DS.name;
+ npart = 1;
+ }
+ if (argv[1] == "+L") generateAttribListe(Pname[0], setze[ja]);
+ if (argv[1] == "-L") generateAttribListe(Pname[0], setze[loeschen]);
+ }
+ int psel = -1;
+ int esel = -1;
+ if (deviceset) psel = 0;
+ int Result;
+ string statsch, statbrd, statusdif;
+ sprintf(statsch, "%d Part(s) in SCH gefunden", npart);
+ sprintf(statbrd, "%d Element(s) in BRD gefunden", nelement);
+
+ if (isBoard && isSchematic) {
+ if (diff_attr_sch_brd(0)) sprintf(statusdif, "In Schematic und Board sind unterschiedliche globale Attribute definiert.");
+ }
+
+ // ======== Haupt-Menu ======== //
+ Result = dlgDialog("Attributverwaltung") {
+ int atttype = -1;
+ dlgHBoxLayout { // ---------------------
+ if (deviceset) {
+ dlgVBoxLayout {
+ dlgGroup("Attribute") {
+ dlgLabel("LOKALE");
+ dlgHBoxLayout {
+ dlgPushButton("&Anlegen") DEV_attribut_anlegen();
+ dlgLabel(" aus Textplatzhalter in Symbolen.");
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("An&legen") aus_liste_anlegen(Pname[0]);
+ dlgLabel(" aus definierter Liste.");
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("&Bearbeiten") DEV_attribut_bearbeiten(Lokal, Pname[psel]);
+ dlgStretch(1);
+ }
+ }
+ dlgStretch(1);
+ }
+ }
+ else {
+ dlgTabWidget {
+ if (isSchematic) {
+ dlgTabPage("Schematic") { // ######## Schaltplan #################
+ dlgVBoxLayout {
+ dlgGroup("Attribute") {
+ dlgLabel("LOKALE");
+ dlgHBoxLayout {
+ dlgPushButton("an&legen") {
+ if (psel < 0) dlgMessageBox("Wählen sie ein Part aus der Liste!", "OK");
+ else if (psel >= 0) SCH_attribut_anlegen(Lokal, Pname[psel], Psheet[psel]);
+ }
+ dlgStretch(1);
+ dlgLabel(" nur def. Textplatzhalter");
+ }
+ dlgHBoxLayout {
+ dlgPushButton("b&earbeiten") {
+ if (psel < 0) dlgMessageBox("Wählen sie ein Part aus der Liste!", "OK");
+ else if (psel >= 0) SCH_attribut_bearbeiten(Lokal, Pname[psel], Psheet[psel]);
+ }
+ dlgStretch(1);
+ }
+ dlgLabel("
");
+ dlgLabel("GLOBALE");
+ dlgHBoxLayout {
+ dlgPushButton("&anlegen") {
+ if (psel < 0) dlgMessageBox("Wählen sie ein Part aus der Liste!", "OK");
+ else if(psel >= 0) SCH_attribut_anlegen(Global, Pname[psel], ".SCH");
+ }
+ dlgStretch(1);
+ dlgLabel(" nur def. Textplatzhalter");
+ }
+ dlgHBoxLayout {
+ dlgPushButton("&bearbeiten") {
+ SCH_attribut_bearbeiten(Global, "*", ".SCH");
+ }
+ dlgStretch(1);
+ }
+ }
+ }
+ dlgListView("Part", Pname, psel);
+ dlgLabel(statsch);
+ }
+ }
+ if (isBoard) {
+ dlgTabPage("Board") { // ######## Layout #################
+ dlgVBoxLayout {
+ dlgGroup("Attribute") {
+ dlgLabel("LOKALE");
+ dlgHBoxLayout {
+ dlgPushButton("anlegen") {
+ if (esel < 0) dlgMessageBox("Wählen sie ein Element aus der Liste!", "OK");
+ else BRD_attribut_anlegen(Lokal, Ename[esel]);
+ }
+ dlgStretch(1);
+ dlgLabel(" nur def. Textplatzhalter");
+ }
+ dlgHBoxLayout {
+ dlgPushButton("bearbeiten") {
+ if (esel < 0) dlgMessageBox("Wählen sie ein Element aus der Liste!", "OK");
+ else BRD_attribut_bearbeiten(Lokal, Ename[esel]);
+ }
+ dlgStretch(1);
+ }
+ dlgLabel("
");
+ dlgLabel("GLOBALE");
+ dlgHBoxLayout {
+ dlgPushButton("anlegen") {
+ if (esel < 0) dlgMessageBox("Wählen sie ein Element aus der Liste!", "OK");
+ else BRD_attribut_anlegen(Global, Ename[esel]);
+ }
+ dlgStretch(1);
+ dlgLabel(" nur def. Textplatzhalter");
+ }
+ dlgHBoxLayout {
+ dlgPushButton("bearbeiten") BRD_attribut_bearbeiten(Global, "*");
+ dlgStretch(1);
+ }
+ }
+ }
+ dlgVBoxLayout {
+ dlgListView("Element", Ename, esel);
+ dlgLabel(statbrd);
+ }
+ }
+ }
+ }
+ }
+ if (statusdif) {
+ dlgVBoxLayout {
+ dlgLabel(statusdif);
+ dlgHBoxLayout {
+ int globatt = -1; // 2008-09-10
+ int assel, absel;
+ if (isSchematic && isBoard) {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel("Schematic");
+ dlgListView("Attributte", sch_attributte, assel);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("SCH >>") gen_attr_sch_brd();
+ }
+ }
+ dlgVBoxLayout {
+ dlgLabel("Board");
+ dlgListView("Attributte", brd_attributte, absel);
+ dlgHBoxLayout {
+ dlgPushButton("<< BRD") gen_attr_brd_sch();
+ dlgStretch(1);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Unterschiede ------------------------------------------------
+ if (cntdiffval || statusdif) {
+ int ssel, bsel, dsel;
+ dlgVBoxLayout {
+ dlgLabel(" ");
+ dlgGroup("Unterschiede") {
+ if (statusdif) {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgListView("nicht im BRD\tValue", attdiff_sch, ssel);
+ dlgHBoxLayout {
+ dlgPushButton("in BRD übertragen") {
+ get_diff_attr_sch();
+ exit(cmd);
+ }
+ dlgStretch(1);
+ }
+ }
+ dlgVBoxLayout {
+ dlgListView("nicht im SCH\tValue", attdiff_brd, bsel);
+ dlgHBoxLayout {
+ dlgPushButton("in SCH übertragen") {
+ get_diff_attr_brd();
+ exit(cmd);
+ }
+ dlgStretch(1);
+ }
+ }
+ }
+ }
+ if (cntdiffval) {
+ dlgLabel("Values");
+ dlgListView("Attributt\tSCH\tBRD", attdiff_val, dsel);
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("SCH >>> BRD") {
+ get_diff_val_brd();
+ exit(cmd);
+ }
+ dlgPushButton("SCH <<< BRD") {
+ get_diff_val_sch();
+ exit(cmd);
+ }
+ dlgStretch(1);
+ }
+ }
+ }
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel(Version);
+ }
+ dlgSpacing(8);
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Abbruch") dlgReject();
+ dlgStretch(1);
+ dlgPushButton("Hilfe") dlgMessageBox(usage, "OK");
+ }
+ };
+}
+
+else dlgMessageBox("Starten Sie das ULP in einem Schaltplan, Board oder Device (Bibliothek).", "OK");
diff --git a/eagle-5.7.0/ulp/e-bauteil-erstellen.ulp b/eagle-5.7.0/ulp/e-bauteil-erstellen.ulp
new file mode 100644
index 0000000..9728042
--- /dev/null
+++ b/eagle-5.7.0/ulp/e-bauteil-erstellen.ulp
@@ -0,0 +1,437 @@
+#require 4.9203
+#usage "Bequemes Definieren von Bauteilen, insbesondere von Schützen\n"
+ "
"
+"Die erzeugte Liste (schaltungsname.brk) kann in einem Tabellenkalkulationsprogramm "
+"weiter verarbeitet oder mit Hilfe von e-makelist.ulp direkt in die "
+"Schaltungszeichnung importiert werden.
"
+"\td = Drahtverbindung (intern, im Schaltschrank)
"
+"\tk = Kabelverbindung (extern, außerhalb des Schaltschranks)
"
+"\tx = Brücke (Klemme zu Klemme im gleichen Klemmenblock)
"
+"Ein Doppelklick auf einen Eintrag in der Verbindungsliste bringt diese "
+"eine Verbindung in die Auswahlliste.
"
+ "RUN edit-used-dev-pac-sym
"
+ "RUN edit-used-dev-pac-sym partname gatename
"
+ "RUN edit-used-dev-pac-sym partname @
"
+ "If the Device consits of one Gate only, use the option '@' for the gatename.
"
+ "In case of using @ for a device with more than one Gate, the first Gate used by the Device will be opened.
"
+ "a new Schematic/Bord with the Device/Symbole/Package name will be opened!
"
+ "
" +
+ "RUN edit-used-dev-pac-sym
" +
+ "RUN edit-used-dev-pac-sym Bauteilname Gatename
" +
+ "RUN edit-used-dev-pac-sym Bauteilname @
" +
+ "Besitzt das Bauteil nur ein Symbol (Gate) kann mit @ das Symbol aufgerufen werden.
" +
+ "Wird @ bei einem Bauteil mit mehreren Symbolen (Gates) angewendet, so wird das erste benutzte Symbol aufgerufen
" +
+ "Achtung: Ist die benutzte Bibliothek nicht im Pfad im Menü - Optionen -- Verzeichnisse - Bibliotheken
" +
+ "enthalten, so wird ein Schaltplan bzw. Board mit dem Bauteil/Symbol/Package-Namen angelegt.
" +
+ "
");
+
+ string h = "";
+
+ int l = strlen(dev[count]);
+ string s = strsub(dev[count], 0, 2);
+ string t = strsub(dev[count], 3, l);
+
+ sprintf(h, "DEVICE: %s
%s
");
+ string h = "";
+ int l = strlen(dev[count]);
+ string s = strsub(dev[count], 0, 2);
+ string t = strsub(dev[count], 3, l);
+
+ sprintf(h, "PACKAGE: %s
%s
"
+ "09.06.2004 Replace @ in package, device and symbol names with $, and spaces with _.
"
+ "22.11.2004 check pin.contact (old eagle versions allow in device pins without contact)
"
+ " - replace # with _ in Layernames
"
+ " - correct first flag in package
"
+ "21.12.2004 strip @x from Device or Library name
"
+ "21.03.2005 export correct layer [17] of PAD Shape
"
+ "28.04.2005 browse path corrected
"
+ " - Change spaces in library and device names to '_'
"
+ " - Clear data and log if working path changed
"
+ " - Option: Generate with or without Library-Name if creat 'one' library
"
+ "03.08.2005 Technologies separated with ' ' if start a Technology with '-'
"
+ "08.01.2007 Correct Apostroph in Pin/Padnames
"
+ "See Help for further details
\n"
+ " SET USED_LAYERS ALL
"
+ "If one of the library files to be created already exists, you will be prompted if "
+ "the existing file may be deleted."
+ ;
+
+void DisplayHelp(void) {
+ dlgDialog("Export Project Library - Help") {
+ dlgHBoxLayout dlgSpacing(400);
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300);
+ dlgTextView(HelpText);
+ }
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("-Close") dlgReject();
+ }
+ };
+ return;
+}
+
+
+void testview(void) {
+ dlgDialog("Test") {
+ int sel;
+ dlgListView("Lines", x, sel);
+ dlgPushButton("+Ok") dlgAccept();
+ dlgPushButton("-Esc") { dlgReject(); exit(-9); }
+ };
+ return;
+}
+
+
+string get_project_path() {
+ if (board) board(B) return(filedir(B.name));
+ if (schematic) schematic(B) return(filedir(B.name));
+ if (library) library(B) return(filedir(B.name));
+}
+
+string replacenewline(string nl) {
+ string a[];
+ int n = strsplit(a, nl, '\n');
+ if (n > 0) {
+ nl = "";
+ for (int x = 0; x < n - 1; x++) {
+ nl += a[x] + "\\n";
+ }
+ nl += a[x];
+ }
+ return "'" + nl + "'";
+}
+
+
+string addApostroph(string s) {
+ int len = strlen(s);
+ int pos = strrchr(s, '\'');
+ string l;
+ if (pos >= 0) {
+ l = strsub(s, 0, pos) + "'" + strsub(s, pos, len-pos);
+ s = l;
+ }
+ return s;
+}
+
+// *** characters '#@ ' not allowed in LBR, DEV, SYM or PAC-Name ***
+string change_at(string s) { // replace '@' -> '$' | 'space' -> '_' | '#' -> '_'
+ int i;
+ for (i=0; i
This program can only work in the schematic or board editor.");
+ exit(1);
+}
+else {
+ if (board) board(B) EditName = filename(B.name); // name of loaded board/schematic w/o path
+ if (schematic) schematic(S) EditName = filename(S.name);
+}
+
+PureScriptName = filesetext(EditName, ".scr"); // name of generated script w/o path
+PureLogName = filesetext(EditName, ".log"); // name of generated log msgs w/o path
+WorkPath = get_project_path();
+
+Status = "Version " + Version;
+
+int Result = dlgDialog("Create Project Library") {
+ string globList[];
+ int globListIndex = -1;
+ int globCnt = 0;
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgSpacing(500);
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgGroup("Creation Mode") {
+ dlgRadioButton("&Multiple libraries", onelib);
+ dlgRadioButton("&One library", onelib);
+ dlgHBoxLayout {
+ dlgSpacing(16);
+ dlgCheckBox("&Generate LBR-Name_/PAC/SYM/DEV", generate_lbrname);
+
+ }
+ dlgHBoxLayout {
+ dlgSpacing(34);
+ dlgLabel("if One library selected");
+ }
+ }
+ dlgGroup("User Interface") {
+ dlgCheckBox("Show scripts and file dialogs", show_script);
+ dlgCheckBox("Save log file", save_log);
+ }
+ dlgStretch(1);
+ }
+ dlgVBoxLayout {
+ dlgLabel("Log file");
+ dlgTextView(logf);
+ }
+ }
+ dlgHBoxLayout {
+ dlgSpacing(60);
+ dlgLabel("&Working path:");
+ dlgStringEdit(WorkPath);
+ dlgPushButton("Bro&wse") {
+ if (cmd) {
+ cmd = "";
+ logf = "";
+ }
+
+ h = WorkPath;
+ WorkPath = dlgDirectory("Select a directory", WorkPath);
+ if (WorkPath == "") WorkPath = h;
+ else WorkPath += "/"; // 29.03.2005 support@cadsoft.de
+ }
+ }
+ dlgSpacing(10);
+ dlgHBoxLayout {
+ dlgLabel(Status, 1);
+ dlgStretch(1);
+ dlgPushButton("+&Collect data") { logf = "Project Library Creation Log File "+t2string(time())+"\n"
+ +EAGLE_SIGNATURE+"\nCreated from: "+EditName+"\n\n";
+ if (onelib) { cmd = ""; make_one_lbr(); }
+ else { cmd = ""; make_lbr(); }
+ show_save_script_file(cmd);
+ Status = "Collect finish";
+ dlgRedisplay();
+ if (save_log) show_save_log_file(logf);
+ }
+ dlgPushButton("Create &library") { if (cmd == "") dlgMessageBox("Use 'Collect data' first!","&OK");
+ else exit("SCRIPT '"+ScriptName+"';\n");
+ }
+ dlgPushButton("-&Quit") dlgReject();
+ dlgSpacing(23);
+ dlgPushButton("&Help") DisplayHelp();
+ }
+};
diff --git a/eagle-5.7.0/ulp/exp2image.ulp b/eagle-5.7.0/ulp/exp2image.ulp
new file mode 100644
index 0000000..13822e2
--- /dev/null
+++ b/eagle-5.7.0/ulp/exp2image.ulp
@@ -0,0 +1,414 @@
+#usage "Export a SCH/BRD to IMAGE
"
+ "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;';"
+ "
"
+ "
"
+ "Starting the ulp without parameter generates a list. "
+ "The temporary list (file) will be deleted as soon as you quit EAGLE.
"
+ "After running this ULP the MOVE command will be active. Now you should move this wire at a position where you can
"
+ "select it easily with the RIPUP command."
+ ""
+ "
"
+ "When using the parameters + and - for purposes of clarity only the layer that contains "
+ "the wire is displayed. Possibly plus the layer(s) Pads and/or Vias. "
+ "+ shows the next entry of the list (trace). "
+ "- shows the previous entry of the list (trace) "
+ "= shows this message again "
+ "M defines a 0.1 micron group around this coordinate and activates the MOVE command
"
+ "For recognizing the wire stubs it is necessary to set the fill style of the respective layer "
+ "to not filled (dotted or hatched).
"
+ "To avoid mistake use RATSNEST to calculate the polygons before. Now you can start the ULP!"
+ "
"
+ "Der Start des ULP ohne Parameter erzeugt eine Liste (Datei) der Wire, die zum einzeln durchschalten benutzt werden kann.
"
+ "Die Liste (Datei) wird nur temporär erzeugt und beim Beenden von Eagle gelöscht."
+ ""
+ "
"
+ "Nach dem Beenden des ULP ist der MOVE-Befehl aktiv. Damit kann der Wire zuerst aus dem "
+ "Bereich herausgezogen werden um ihn eindeutig mit dem RIPUP-Befehl zu selektieren. "
+ "+ zeigt den nächsten Eintrag in der Liste der gefundenen Elemente "
+ "- zeigt den vorhergehenden Eintrag in der Liste der gefundenen Elmente "
+ "= zeige den aktuellen Eintrag nochmal "
+ "M Definiert einen Bereich von 0.1 Mircon als Gruppe um die Koordinate und aktiviert den MOVE-Befehl
"
+ "Um die Übersichtlichkeit zu erhöhen wird bei der Weiterschaltung mit + oder - nur der "
+ "Layer in dem sich der Wire-Stummel befindet, plus eventuell der Pad-Layer und/oder "
+ "Via-Layer eingeblendet.
"
+ "Um die Wire-Stummel innerhalb eines Pad oder Via zu erkennen ist es nötig das Füllmuster der "
+ "entsprechenden Layer auf nicht füllend (gepunktet oder schraffiert) einzustellen.
"
+ "Um Verwechslungen auszuschliessen lassen Sie mit RATSNEST zuerst die Polygonflächen berechnen und starten dann das ULP!"
+ "You can also run this ULP from the command line:
"
+ "RUN find name
"
+ "RUN find name [counter]
"
+ "RUN find [DEV | GATE | PIN | PAD | POLYGON width | DRILL diameter | VIA stack | value [-S|+|-] [counter | *]] **
"
+ "RUN find DRILL diameter [counter | *] **
"
+ "RUN find current-value CH new-value [counter]
"
+ "RUN find value -S
"
+ "RUN find value + | - (step option)
"
+ "
"
+ "* sets the counter to 1000
"
+ "GATE without a given name, places the foremost found, unused gate
"
+ "GATE * lists all unused gates, select one of them to place it
"
+ "VIA start end searches for blind, buried, and micro vias with a certain length
"
+ "valueCHvalue replaces the value of an element with the given new one, if found (CH is case sensitive)
"
+ "value -S displays all elements with the same value at the same time (highlighted like with SHOW), in BRD only
"
+ "value - + shows step by step the previous or next found element, in BRD and SCH
"
+ "
"
+ "Searching order:
"
+ ""
+ "
"
+ "** Device name, Gate name, Pin name, Pad name, Polygon width, or Drill diameter will be searched, if one of the options DEV, GATE, PIN, PAD, POLYGON or DRILL is given. "
+ "Schematic: Board: "
+ "1. Part name 1. Element "
+ "2. Net name 2. Signal/Wires/Vias "
+ "3. Bus name 3. Pads "
+ "4. Value 4. Value "
+ "5. Device ** 5. Polygon width ** "
+ "6. Gate ** 6. Drill "
+ "7. Pin ** 7. Via stack "
+ "8. Pad **
"
+ "Sie können das ULP auch aus der Kommandozeile starten mit:
"
+ "RUN find
"
+ "RUN find name
"
+ "RUN find name [Zähler]
"
+ "RUN find [DEV | GATE | PIN | PAD | POLYGON width | DRILL diameter | VIA stack | value [-S|+|-] [Zähler | *]] **
"
+ "RUN find DRILL Durchmesser [Zähler | *] **
"
+ "RUN find alter-value CH neuer-value [Zähler]
"
+ "RUN find value -S
"
+ "RUN find value + | - (Step-Option)
"
+ "
"
+ "Suchbegriff ist der name des Device/Package/Net/Bus/Pin/Pad/Signal/Value
"
+ "Zähler legt die Anzahl der gefundenen Elemente fest, nach der die Suche beendet wird
"
+ "* setzt den Zähler auf 1000
"
+ "PIN | PAD | DEV | GATE sucht zusätzlich nach PIN-, PAD-, GATE-, DEVICE-Namen
"
+ "GATE ohne Namen, platziert das zuerst gefundene, nicht benutzte Gate.
"
+ "GATE * listet alle nicht benutzen Gates, das aus der Liste gewählte Gate wird plaziert.
"
+ "VIA start end sucht Blind- Buried- und Micro-Via einer bestimmten Länge
"
+ "value CH value ersetzt den Value des gefundenen Elements (CH beachtet die Gross-/Klein-Schreibung)
"
+ "value -S zeigt alle Elemente mit gleichen Values gleichzeitig (gehighlightet wie bei SHOW), nur in BRD.
"
+ "- + zeigt die gefundenen Elemente Schritt für Schritt (+ vor, - zurück), in BRD und SCH
"
+ "
"
+ "Such-Reihenfolge:
"
+ ""
+ "
"
+ "** nach Device-, Gate-, Pin-, Pad-Namen, Polygon-Width und Drill-Durchmesser wird gesucht, falls DEV, GATE, PIN, PAD, POLYGON oder DRILL gesetzt ist. "
+ "Schematic: Board: "
+ "1. Part name 1. Element "
+ "2. Net name 2. Signal/Wires/Vias "
+ "3. Bus name 3. Pads "
+ "4. Value 4. Value "
+ "5. Device ** 5. Polygon width ** "
+ "6. Gate ** 6. Drill "
+ "7. Pin ** 7. Via stack "
+ "8. Pad **
"
+ "
" + Version);
+ exit(0);
+ }
+ library(L) gridunit = (L.grid.unit);
+ S.pins(P) {
+ if (P.name == vfind) {
+ sprintf(vfind, "WIN (%.4f %.4f);", u2u(P.x), u2u(P.y) );
+ exit(vfind);
+ }
+ }
+ exit("run ulpmessage.ulp '" + vfind + " not found!';\n");
+}
+
+else if (package) package(P) { // 2007.10.16
+ vfind = strupr(argv[1]);
+ if (!vfind) {
+ dlgMessageBox(usage + "
" + Version);
+ exit(0);
+ }
+ library(L) gridunit = (L.grid.unit);
+ P.contacts(C) {
+ if (C.name == vfind) {
+ sprintf(vfind, "WIN (%.4f %.4f);", u2u(C.x), u2u(C.y) );
+ exit(vfind);
+ }
+ }
+ exit("run ulpmessage.ulp '" + vfind + " not found!';\n");
+}
+
+else if (schematic) {
+ if ( strupr(argv[1]) == SCHfPinPad[1]) { fpin = SCHfPinPad[1]; vfind = argv[2]; } // "PIN"
+ else if ( strupr(argv[1]) == SCHfPinPad[2]) { fpin = SCHfPinPad[2]; vfind = argv[2]; } // "PAD"
+ else if ( strupr(argv[1]) == SCHfPinPad[3]) { fpin = SCHfPinPad[3]; vfind = argv[2]; } // "DEV"
+ else if ( strupr(argv[1]) == SCHfPinPad[4]) { // "GATE"
+ fpin = SCHfPinPad[4];
+ vfind = argv[2];
+ if (!vfind) { // found Gates are not placed in schematic
+ vfind = "0";
+ }
+ }
+ else if ( strupr(argv[1]) == SCHfPinPad[5]) { fpin = SCHfPinPad[5]; vfind = argv[2]; } // "VALUE"
+ if (argc > 2) again = strupr(argv[argc-1]);
+ else again = "";
+}
+
+else if (board) {
+ if ( strupr(argv[1]) == BRDfPinPad[bPad]) { fpin = BRDfPinPad[bPad]; vfind = argv[2]; } // "PAD"
+ else if ( strupr(argv[1]) == BRDfPinPad[bValue]) { fpin = BRDfPinPad[bValue]; vfind = argv[2]; } // "VALUE"
+ else if ( strupr(argv[1]) == BRDfPinPad[bPolygon]) { // "POLYGON"
+ fpin = BRDfPinPad[bPolygon];
+ find = BRDfPinPad[bPolygon];
+ PolyWidth = strtod(argv[2]);
+ if (argc > 3) again = strupr(argv[argc-1]);
+ else again = "";
+ }
+ else if ( strupr(argv[1]) == BRDfPinPad[bDrill]) { // "DRILL"
+ fpin = BRDfPinPad[bDrill];
+ find = BRDfPinPad[bDrill];
+ DrillDiam = strtod(argv[2]);
+ if (argc > 3) again = strupr(argv[argc-1]);
+ else again = "";
+ }
+ else if ( strupr(argv[1]) == BRDfPinPad[bVia]) { // "VIA"
+ fpin = BRDfPinPad[bVia];
+ find = BRDfPinPad[bVia];
+ Vstart = strtod(argv[2]);
+ Vend = strtod(argv[3]);
+ if (argc > 4) again = strupr(argv[argc-1]);
+ else again = "";
+ }
+}
+
+else {
+ if (language() == "de") dlgMessageBox("Starten Sie dieses ULP in einem Schaltplan, Board, Symbol oder Package Editor", "OK");
+ else dlgMessageBox("Start this ULP in Schematic, Board, Symbol or Package Editor", "OK");
+ exit(0);
+}
+
+if (argv[3] == "CH") {
+ ChangeValue = argv[2];
+ change_value = 1;
+ NewValue = argv[4];
+}
+
+
+if (again == "*") all = 1000;
+else all = strtol(again) - 1;
+
+if (!vfind) {
+ vfind = getfind();
+}
+find = strupr(vfind);
+if (!find && change_value) exit (0);
+cnt = all + 1;
+
+if (!fpin && !find) {
+ dlgMessageBox("Missing options", "OK");
+ exit(-1);
+}
+
+
+// *** Board coord. ***
+if (board) {
+ int mx, my; // 2008.06.10 alf
+ if (argv[2] == "-S") optshow = 1; // Show option 2006.04.25
+ board(B) {
+ gridunit = (B.grid.unit);
+ if (optshow) {
+ all = 10000;
+ repeat = check_layer();
+ repeat += ";SHOW;\nWIN;\nSHOW "; // refresh window clear showed elements // 2007.06.27 alf
+ }
+
+ mx = B.area.x2 + (B.area.x1 * -1);
+ my = B.area.y2 + (B.area.y1 * -1);
+ if (!fpin && find) {
+ B.elements(E) {
+ if (E.name == find) {
+ fndpin = "Element";
+ repeat += show_B(u2u(E.x), u2u(E.y), 2, 5, find, all, E.mirror);
+ sprintf(foundelement, "Element %s on (%.4f %.4f)", E.name, u2u(E.x), u2u(E.y) );
+ check(repeat);
+ }
+ }
+ B.signals(S) {
+ if (S.name == find) {
+ fndpin = "Signal";
+ S.contactrefs(C) {
+ repeat += show_B(u2u(C.contact.x), u2u(C.contact.y), 2, 5, find, all, 0); // 0 = dummy for Layer
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.signals(S) {
+ if (S.name == find ) {
+ S.wires(W) {
+ fndpin = "Wire";
+ real z = zfactor(u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2) );
+ repeat += show_B( u2u((W.x1 + W.x2)/2), u2u((W.y1 + W.y2)/2), z/(z/2) , z/(z/5), find, all, W.layer);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.signals(S) {
+ if (S.name == find ) {
+ S.polygons(P) {
+ fndpin = "Polygon";
+ P.contours(W) {
+ real z = zfactor(u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2) );
+ repeat += show_B( u2u((W.x1 + W.x2)/2), u2u((W.y1 + W.y2)/2), z/(z/2) , z/(z/5), find, all, W.layer);
+ if (all <= 0) check(repeat);
+ all--;
+ break;
+ }
+ }
+ }
+ }
+ B.signals(S) {
+ if (S.name == find ) {
+ S.vias(V) {
+ fndpin = "Via";
+ repeat += show_B(u2u(V.x), u2u(V.y), 1, 5, find, all, 18); // 18 dummy layer for via
+ sprintf(foundelement, "Element on (%.4f %.4f) %s
VIA
",
+ u2u(V.x), u2u(V.y),
+ unit[gridunit],
+ u2u(V.diameter[1]),
+ u2u( (V.diameter[1] - V.drill) / 2),
+ u2u(V.diameter[2]),
+ u2u( (V.diameter[2] - V.drill) / 2),
+ u2u(V.diameter[16]),
+ u2u( (V.diameter[16] - V.drill) / 2),
+ u2u(V.drill) );
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.elements(E) {
+ if (E.value == vfind || E.value == find) {
+ fndpin = "Value";
+ if (StepMode && all > 0) {
+ ; // do nothing
+ }
+ else {
+ repeat += show_B(u2u(E.x), u2u(E.y), 2, 5, E.name, all, E.mirror);
+ sprintf(foundelement, "Element %s on (%.4f %.4f)", E.name ,u2u(E.x), u2u(E.y) );
+ }
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.elements(E) {
+ if (fpin == BRDfPinPad[bPad]) { // "PAD"
+ E.package.contacts(C) {
+ if (C.pad) {
+ if (C.pad.name == find) {
+ fndpin = "Pad/Smd";
+ repeat += show_B(u2u(C.pad.x), u2u(C.pad.y), 2, 5, E.name, all, E.mirror);
+ sprintf(foundelement, "Layer Diameter Restring Top %.4f %.4f Inner %.4f %.4f Bottom %.4f %.4f Drill %.4f
PAD %s on (%.4f %.4f) %s [Element %s]
",
+ C.pad.name,
+ u2u(C.pad.x), u2u(C.pad.y),
+ unit[gridunit],
+ E.name,
+ u2u(C.pad.diameter[1]),
+ u2u( (C.pad.diameter[1] - C.pad.drill) / 2),
+ u2u(C.pad.diameter[2]),
+ u2u( (C.pad.diameter[2] - C.pad.drill) / 2),
+ u2u(C.pad.diameter[16]),
+ u2u( (C.pad.diameter[16] - C.pad.drill) / 2),
+ u2u(C.pad.drill) );
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ if (C.smd) {
+ if (C.smd.name == find) {
+ fndpin = "Pad/Smd";
+ repeat += show_B(u2u(C.smd.x), u2u(C.smd.y), 2, 5, E.name, all, E.mirror);
+ sprintf(foundelement, "Layer Diameter Restring Top %.4f %.4f Inner %.4f %.4f Bottom %.4f %.4f Drill %.4f
SMD %s on (%.4f %.4f) %s [Element %s]",
+ C.smd.name,
+ u2u(C.smd.x), u2u(C.smd.y),
+ unit[gridunit],
+ E.name );
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ }
+ }
+
+ if (fpin == BRDfPinPad[bPolygon]) { // "POLYGON"
+ B.signals(S) S.polygons(P) {
+ if (PolyWidth == u2u(P.width)) {
+ fndpin = "Polygon";
+ P.contours(W) {
+ sprintf(fndpin, " Polygon with WIRE-Width %.4f", PolyWidth);
+ repeat += show_B(u2u(W.x1), u2u(W.y1), 2, 5, S.name, all, P.layer);
+ sprintf(foundelement, "
POLYGON in Layer %d on (%.4f %.4f) %s",
+ P.layer,
+ u2u(W.x1), u2u(W.y1),
+ unit[gridunit] );
+ break;
+ }
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ B.polygons(P) {
+ if (PolyWidth == u2u(P.width)) {
+ fndpin = "Polygon";
+ P.contours(W) {
+ sprintf(fndpin, " Polygon with WIRE-Width %.4f", PolyWidth);
+ repeat += show_B(u2u(W.x1), u2u(W.y1), 2, 5, "POLYGON", all, P.layer);
+ sprintf(foundelement, "
POLYGON in Layer %d on (%.4f %.4f) %s",
+ P.layer,
+ u2u(W.x1), u2u(W.y1),
+ unit[gridunit] );
+ break;
+ }
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ if (fpin == BRDfPinPad[bDrill]) { // "DRILL"
+ B.elements(E) {
+ E.package.contacts(C) {
+ if (C.pad) {
+ if (u2u(C.pad.drill) == DrillDiam) {
+ sprintf(fndpin, " Drill %.4f", DrillDiam);
+ repeat += show_B(u2u(C.x), u2u(C.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 17);
+ sprintf(foundelement, "
Drill %.4f on (%.4f %.4f) %s",
+ DrillDiam, u2u(C.x), u2u(C.y), unit[gridunit]);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ E.package.holes(H) {
+ if (u2u(H.drill) == DrillDiam) {
+ sprintf(fndpin, " Drill %.4f", DrillDiam);
+ repeat += show_B(u2u(H.x), u2u(H.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 45);
+ sprintf(foundelement, "
Hole %.4f on (%.4f %.4f) %s",
+ DrillDiam, u2u(H.x), u2u(H.y), unit[gridunit]);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.signals(S) {
+ S.vias(V) {
+ if (u2u(V.drill) == DrillDiam) {
+ sprintf(fndpin, " Drill %.4f", DrillDiam);
+ repeat += show_B(u2u(V.x), u2u(V.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 18);
+ sprintf(foundelement, "
Dril %.4f in Via on (%.4f %.4f) %s",
+ DrillDiam, u2u(V.x), u2u(V.y), unit[gridunit]);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ B.holes(H) {
+ if (u2u(H.drill) == DrillDiam) {
+ sprintf(fndpin, " Drill %.4f", DrillDiam);
+ repeat += show_B(u2u(H.x), u2u(H.y), 1, u2u(B.area.x2 - B.area.x1)/DrillDiam/10, "DRILL", all, 45);
+ sprintf(foundelement, "
Hole %.4f on (%.4f %.4f) %s",
+ DrillDiam, u2u(H.x), u2u(H.y), unit[gridunit]);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ if (fpin == BRDfPinPad[bVia]) { // "VIA"
+ B.signals(S) {
+ sprintf(fndpin, "VIA stack %d-%d", Vstart, Vend);
+ S.vias(V) {
+ if (V.start == Vstart && V.end == Vend) {
+ repeat += show_B(u2u(V.x), u2u(V.y), 2, 5, find, all, 0);
+ if (all <= 0) check(repeat);
+ all--;
+ }
+ }
+ }
+ }
+ }
+ if (repeat) check(repeat);
+ string StepFound = " not found!"
+ "
"
+ "
"
+ "It generates top and bottom glue data from circles on layers 111 and 112."
+ "
"
+ "* Copyright (c) 1997, All Rights Reserved by LLOYD I/O INC
"
+ "* 503/222-0702 frankh@lloydio.com www.lloydio.com"
+ "
"
+ "* 2 sided boards use layers 1 and 16
"
+ "* 4 layer boards use layers 1,2 and 15, 16
"
+ "* 6 layer boards use layers 1,2,3 and 14,15,16
"
+ "* 8 layer boards use layers 1,2,3,4 and 13,14,15,16
"
+ "* 10 layer boards use layers 1,2,3,4,5 and 12,13,14,15,16
"
+ "* 12 layer boards use layers 1,2,3,4,5,6 and 11,12,13,14,15,16
"
+ "* 14 layer boards use layers 1,2,3,4,5,6,7 and 10,11,12,13,14,15,16
"
+ "* 16 layer boards use layers 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
"
+ "*
"
+ "* Adapted for Eagle-Version 4.1
"
+ "* - Unrouted layer not exported
"
+ "* - Export also Wire-Arcs
"
+ "* - SMD shape Roundnes is included
"
+ "* - PAD shape LONG OFFSET (Oblong) is included
"
+ "* - PAD accept Top, Bottom and Inner (MDEF) layer
"
+ "* - VIA generate only used layer in stack
"
+ "* 02.04.2004 alf@cadsoft.de
"
+ "* - W.curve correction in C.element.package.wires(W)
"
+ "* 21.04.2005 alf@cadsoft.de
"
+ "* - {PADSTACK=...%03d correct number while count from 1
"
+ "* 17.08.2005 alf@cadsoft.de
"
+ "*
";
+
+
+// Version 4.11 : W.curve correction in C.element.package.wires(W) 21.04.2005
+// Version 4.12 : Correct Padstack number while list from 0 (zerro) 03.05.2005
+// The original ULP counts the PADSTACK-List from 1 (+1),
+// the used Pads counts from 0 ! *** 03.05.2005
+// Version 4.13 : Correct Padstack counter in for { loop } *** 11.08.2005
+// Check if a SMD-Pad dx=0 or dy=0 then aborted this ULP RUN.
+// Version 4.14 : Correct Padstack counter in all function, count now from 1 to total_pad
+// eliminate correction of 4.12 from 03.05.2005
+
+string Version = "Version 2.00 9/11/97 -- 4.14 17/08/2005";
+
+
+string headerline = "* Exports the board to HyperLynx Signal-Integrity Transfer Format (.HYP)";
+
+
+
+//***********************************************
+// Definitions of yes and no! Do not modify!
+char yes = 1; // yes must be different from no.
+char no = 0; // no must be zero (0)
+//********************************************************************************************
+//********************************************************************************************
+//********************************************************************************************
+// USER MODIFYABLE DATA
+
+// Generate Files Options:
+char GenerateReferenceFile = yes; // Generate the Reference File ('yes'/'no')
+char GenerateHyperlynxFile = yes; // Generate the Hyperlynx File ('yes'/'no')
+
+// Generate Component Types Options:
+char UseComponentTypes = yes; // Devices Q, T, U, IC, C, D, L, R, BD, etc. ('yes'/'no')
+
+// Generate Component Pin Direction Options:
+char GeneratePinDirection = no; // If 'yes', slows down many many times.
+
+// Component Value Change Options:
+char TruncateComponentValues = no; // Truncate ".1uf 50v" to ".1uf" ('yes'/'no')
+char ConvertCapValues = yes; // Convert Capacitor Values. i.e. change ".1" to ".1u" ('yes'/'no')
+string ConvertLT1to = "uF"; // values less than 1 are labeled as this unit
+string ConvertGE1to = "uF"; // convert greater than or equal to 1 are labeled as this unit
+
+// Board Thickness AND Stack Up Options:
+char UseBoardStackUp = yes; // Use board thickness data ('yes'/'no')
+real board_thickness = 0.0625; // Board Thickness, if 0: use fixed layer sizes else calc layer thicknesses
+
+// Copper Value Options:
+real zerooz = 0.0000; // zero copper thickness
+real halfoz = 0.0007; // 0.5 oz copper thickness
+real oneoz = 0.0014; // 1.0 oz copper thickness
+real twooz = 0.0028; // 2.0 oz copper thickness
+// Copper Layer Thickness for Each Layer of Copper
+real copper_thickness[] = {0.0, halfoz,halfoz,halfoz,halfoz,halfoz,halfoz,
+ halfoz,halfoz,halfoz,halfoz,halfoz,halfoz,
+ halfoz,halfoz,halfoz,halfoz}; // 1st number is not used (no layer 0)
+// Copper Layer Plating Thickness for Each Layer of Copper.
+// Top and Bottom are used most often.
+real copper_plating[] = {0.0, halfoz,zerooz,zerooz,zerooz,zerooz,zerooz,
+ zerooz,zerooz,zerooz,zerooz,zerooz,zerooz,
+ zerooz,zerooz,zerooz,halfoz}; // 1st number is not used (no layer 0)
+
+// Dielectric Value Options:
+real dicons = 4.8; // default dielectric constant
+real dit1ly = 0.0611; // dielectric thickness for 1 sided board
+real dit2ly = 0.0597; // dielectric thickness for 2 sided board
+real ditmly = 0.0200; // dielectric thickness for multilayered boards
+real dielectric_constant[] = { dicons,dicons,dicons,dicons,dicons,dicons,dicons,dicons,dicons};
+real dielectric_thickness[] = { dit1ly,dit2ly,ditmly,ditmly,ditmly,ditmly,ditmly,ditmly,ditmly};
+
+// Special Wire Width Options:
+real RectOutlineWireWidth = 0.001; // Rectangle outline wire width in inches
+real HoleOutlineWireWidth = 0.001; // Holes outline wire width in inches
+
+// Precision of board components to accurately draw and locate.
+// (After the decimal '.' point.)
+int precision_of_perimeter = 4; // board perimeter dimension precision
+int precision_of_layers = 5; // layer thickness precision
+int precision_of_pads = 3; // pad/smd size precision
+int precision_of_nets = 4; // pin/via/segment/width precision
+
+
+//********************************************************************************************
+//********************************************************************************************
+//********************************************************************************************
+// DO NOT MODIFY ANYTHING BELOW THIS LINE //
+
+int index[]; // sorting index array (indirect)
+
+// pad info
+int ISAPAD = 0; // through hole pad
+int ISASMD = 1; // surface mount device pad
+int ISAVIA = 18; //
+
+// *** HyperLynx pad shapes ***
+int OVALROUND = 0; // '0' means oval or round (pad_sx=pad_sy if round)
+int RECTSQUARE = 1; // '1' means rectangular or square (pad_sx=pad_sy if square)
+int OBLONG = 2; // '2' means oblong (oblong shape is a rectangular with rounded corners)
+
+string PadShapes[]; // list of hyp's pad shapes
+string HypPadShapes[]; // list of hyp's pad shapes
+string EaglePadShapes[]; // list of eagle pad shapes
+int Total_Pads = 0; // total pads
+int pad_type[]; // pad types (ISAPAD,ISASMD)
+int pad_layer[]; // 0 = Pad, 1 or 16 = SMD, 18 = Via
+int pad_shape_Top_rnds[]; // hyperlynx type OVALROUND, RECTSQUARE, OBLONG
+int pad_shape_Inner[]; // hyperlynx type OVALROUND, RECTSQUARE, OBLONG
+int pad_shape_Bott[]; // hyperlynx type OVALROUND, RECTSQUARE, OBLONG
+real pad_angle_end[]; // Pad rotation or Via End layer (Vias can not rotate!)
+int pad_diameter_Top_or_dx[];
+int pad_diameter_Inner[];
+int pad_diameter_Bott[];
+int pad_dy_elong_start[]; // SMD-dy, Pad-Elongation, Via Stack-Start
+int pad_drill[];
+
+string padStackList = "#\ttype\tlayer\tTop_rnd\tInner\tBott\tang_end\tdx_T\tdx_I\tdx_B\tdy_el\tdril\n";
+
+
+
+
+// copper layer info
+string LayerNames[]; // layer names
+int copp_lookup[] = {0, 1,16, 2,15, 3,14, 4,13, 5,12, 6,11, 7,10, 8,9 };
+int copp_used_layer[];
+int Total_Layers; // total number of used layers
+int layer_counter; // layer counter
+real Total_Board_Thickness; // calculated total board thickness
+
+/* ----- Eagle HELP --------------------------------
+PAD_SHAPE_SQUARE square
+PAD_SHAPE_ROUND round
+PAD_SHAPE_OCTAGON octagon
+PAD_SHAPE_LONG long
+PAD_SHAPE_OFFSET offset
+PAD_SHAPE_ANNULUS annulus (only in Supply-Layer)
+PAD_SHAPE_THERMAL thermal (only in Supply-Layer)
+-------------------------------------------------- */
+
+// define the HyperLynx Pad Shapes
+PadShapes[ PAD_SHAPE_SQUARE ] = "1"; // hyp's square and rectangle shape
+HypPadShapes[ PAD_SHAPE_SQUARE ] = "Square"; // HyperLynx's square and rectangle shape
+EaglePadShapes[ PAD_SHAPE_SQUARE ] = "Square"; // Eagle's square and rectangle shape
+PadShapes[ PAD_SHAPE_ROUND ] = "0"; // hyp's round and oval shape
+HypPadShapes[ PAD_SHAPE_ROUND ] = "Round"; // HyperLynx's round and oval shape
+EaglePadShapes[ PAD_SHAPE_ROUND ] = "Round"; // Eagle's round and oval shape
+PadShapes[ PAD_SHAPE_OCTAGON ] = "0"; // hyp's octagon is a round shape
+HypPadShapes[ PAD_SHAPE_OCTAGON ] = "Round"; // HyperLynx's octagon is a round shape
+EaglePadShapes[ PAD_SHAPE_OCTAGON ] = "Octagon"; // Eagle's octagon is a round shape
+PadShapes[ PAD_SHAPE_LONG ] = "2"; // hyp's oblong, rectangle with rounded corners
+HypPadShapes[ PAD_SHAPE_LONG ] = "Oblong"; // HyperLynx's oblong, rectangle with rounded corners
+EaglePadShapes[ PAD_SHAPE_LONG ] = "Long"; // Eagle's oblong, rectangle with rounded corners
+PadShapes[ PAD_SHAPE_OFFSET ] = "0"; // hyp's round and oval shape
+HypPadShapes[ PAD_SHAPE_OFFSET ] = "Round"; // HyperLynx's oblong, rectangle with rounded corners
+EaglePadShapes[ PAD_SHAPE_OFFSET ] = "Offset"; // Eagle's (Long) Offset, rectangle with rounded corners
+
+
+
+// ***************************************************************************
+// layers
+
+// This routine counts visible layers and stores the name in an internal table
+// Layer names beginning with '$' have the leading '$' striped.
+// This routine is called from a loop
+void CountLayers(UL_LAYER L) {
+ if ( ( L.number >= 1 ) && ( L.number <= 16 ) ) {
+ if ( strchr( L.name, '$' ) == 0 ) {
+ LayerNames[L.number] = strsub( L.name, 1 );
+ }
+ else {
+ LayerNames[L.number] = L.name;
+ }
+ if (L.visible) {
+ layer_counter++;
+ if (L.used) copp_used_layer[L.number] = 1;
+ }
+ }
+}
+
+// This routine writes out the layer names as signal layers or power planes
+// It also writes out the dielectric layer info when needed
+// This routine is called from a loop
+string layernam; // layer name buffer
+void PrintLayer(UL_LAYER L) {
+ real diele_thickness; // calculated dielectric thickness
+ real copp_thickness; // calculated total copper thickness
+ int i; // loop counter
+ if (L.visible) {
+ if ( L.number >= 1 && L.number <= 16 ) {
+ if ( strchr( L.name, '$' ) == 0 ) { // ** is it a Power plane?
+ layernam = strsub( L.name, 1 );
+ printf("(PLANE T=%6.*f L=%s)\n",
+ precision_of_layers, copper_thickness[L.number], layernam);
+ }
+ else {
+ printf("(SIGNAL T=%6.*f P=%6.*f L=%s)\n",
+ precision_of_layers, copper_thickness[L.number],
+ precision_of_layers, copper_plating[L.number],
+ L.name);
+ }
+ layer_counter++;
+ if (board_thickness) {
+ Total_Board_Thickness = board_thickness;
+ copp_thickness = 0.0;
+ for (int i = 1; i <= Total_Layers; i++ ) {
+ copp_thickness += copper_thickness[copp_lookup[i]] + copper_plating[copp_lookup[i]];
+ }
+ if (Total_Layers <= 2 ) diele_thickness = ( board_thickness - copp_thickness );
+ else diele_thickness = ( board_thickness - copp_thickness ) / ( real(Total_Layers) - 1.00 );
+ }
+ else {
+ diele_thickness = dielectric_thickness[Total_Layers/2];
+ copp_thickness = 0.0;
+ for (int i = 1; i <= Total_Layers; i++ ) {
+ copp_thickness += copper_thickness[copp_lookup[i]] + copper_plating[copp_lookup[i]];
+ }
+ if (Total_Layers <= 2 ) Total_Board_Thickness = copp_thickness + diele_thickness;
+ else Total_Board_Thickness = copp_thickness + (diele_thickness * ( real(Total_Layers) - 1.00 ));
+ }
+ if (layer_counter < Total_Layers) {
+ printf("(DIELECTRIC T=%6.*f C=%4.*f ",
+ precision_of_layers,diele_thickness,
+ precision_of_layers,dielectric_constant[Total_Layers/2]);
+ printf("L=DL%02d)\n",layer_counter);
+ }
+ if (Total_Layers == 1) {
+ printf("(DIELECTRIC T=%6.*f C=%4.*f ",
+ precision_of_layers,diele_thickness,
+ precision_of_layers,dielectric_constant[Total_Layers/2]);
+ printf("L=DL%02d)\n",layer_counter);
+ }
+ }
+ }
+}
+
+
+
+// ***************************************************************************
+// pads
+
+int search_A_Pad( int apad_type, int apad_layer,
+ int apad_shape_Top_rnds, int apad_shape_Inner, int apad_shape_Bott,
+ real apad_angle_end,
+ int apad_dx_Top, int apad_dx_Inner, int apad_dx_Bott,
+ int apad_dy_elong_start,
+ int apad_dril ) {
+ int found = 0;
+ for ( int i = 1; i <= Total_Pads; i++ ) {
+ if ( pad_type[i] == apad_type &&
+ pad_layer[i] == apad_layer &&
+ pad_shape_Top_rnds[i] == apad_shape_Top_rnds &&
+ pad_shape_Inner[i] == apad_shape_Inner &&
+ pad_shape_Bott[i] == apad_shape_Bott &&
+ pad_angle_end[i] == apad_angle_end &&
+ pad_diameter_Top_or_dx[i] == apad_dx_Top &&
+ pad_diameter_Inner[i] == apad_dx_Inner &&
+ pad_diameter_Bott[i] == apad_dx_Bott &&
+ pad_dy_elong_start[i] == apad_dy_elong_start&&
+ pad_drill[i] == apad_dril )
+ {
+ found = i;
+ break;
+ }
+ }
+ return( found);
+}
+
+// This routine inserts a pad of known type and size into the pad table
+// The returned value reflects the current number of pads in the table
+// If the pad size already exists, the pad is not inserted
+
+void Insert_A_Pad( int apad_type, int apad_layer,
+ int apad_shape_Top_rnds, int apad_shape_Inner, int apad_shape_Bott,
+ real apad_angle_end,
+ int apad_dx_Top, int apad_dx_Inner, int apad_dx_Bott,
+ int apad_dy_elong_start,
+ int apad_dril ) {
+
+ int fnd = search_A_Pad( apad_type, apad_layer, apad_shape_Top_rnds, apad_shape_Inner, apad_shape_Bott, apad_angle_end, apad_dx_Top, apad_dx_Inner, apad_dx_Bott, apad_dy_elong_start, apad_dril);
+ if (fnd == 0) {
+ Total_Pads++;
+ pad_type[Total_Pads] = apad_type;
+ pad_layer[Total_Pads] = apad_layer;
+ pad_shape_Top_rnds[Total_Pads] = apad_shape_Top_rnds;
+ pad_shape_Inner[Total_Pads] = apad_shape_Inner;
+ pad_shape_Bott[Total_Pads] = apad_shape_Bott;
+ pad_angle_end[Total_Pads] = apad_angle_end;
+ pad_diameter_Top_or_dx[Total_Pads] = apad_dx_Top;
+ pad_diameter_Inner[Total_Pads] = apad_dx_Inner;
+ pad_diameter_Bott[Total_Pads] = apad_dx_Bott;
+ pad_dy_elong_start[Total_Pads] = apad_dy_elong_start;
+ pad_drill[Total_Pads] = apad_dril;
+ }
+ return;
+}
+
+// This routine finds a pad of a known type and size and returns the ID
+// of the pad (internal number) that is used to identify the pad.
+
+int Find_A_Pad( int apad_type, int apad_layer,
+ int apad_shape_Top_rnds, int apad_shape_Inner, int apad_shape_Bott,
+ real apad_angle_end,
+ int apad_dx_Top, int apad_dx_Inner, int apad_dx_Bott,
+ int apad_dy_elong_start,
+ int apad_dril ) {
+ int fnd = search_A_Pad( apad_type, apad_layer, apad_shape_Top_rnds, apad_shape_Inner, apad_shape_Bott, apad_angle_end, apad_dx_Top, apad_dx_Inner, apad_dx_Bott, apad_dy_elong_start, apad_dril);
+ return( fnd );
+}
+
+// This routine finds the HyperLynx shape form of eagle shape
+int SmdRoundness(int r) {
+ if (r == 100) return 0; // oval or round
+ if (r == 0) return 1; // rect or square
+ return 2; // oblong
+}
+
+
+// Insert a pin on in a list of associated connected contacts
+int AssPinCount = 0; // Number of associated Contacts
+string AssTabEname[]; // Element Name
+string AssTabCname[]; // Contact Name
+int AssTabLenEname[]; // Element Name Length
+int AssTabLenCname[]; // Contact Name Length
+int InsertAssocatedPin( string ename, string cname ) {
+ int lenofename,lenofcname;
+ lenofename = strlen(ename);
+ lenofcname = strlen(cname);
+ if ( AssPinCount > 0 ) {
+ for ( int i = 0; i < AssPinCount; i++ ) {
+ if ( lenofename == AssTabLenEname[i] )
+ if ( lenofcname == AssTabLenCname[i] )
+ if ( strstr( AssTabEname[i], ename ) != -1 )
+ if ( strstr( AssTabCname[i], cname ) != -1 ) return( AssPinCount );
+ }
+ }
+ AssTabEname[AssPinCount] = ename;
+ AssTabCname[AssPinCount] = cname;
+ AssTabLenEname[AssPinCount] = lenofename;
+ AssTabLenCname[AssPinCount] = lenofcname;
+ AssPinCount++;
+ return( AssPinCount );
+}
+
+int FindAssocatedPin( string ename, string cname ) {
+ int lenofename,lenofcname;
+ lenofename = strlen(ename);
+ lenofcname = strlen(cname);
+ if ( AssPinCount > 0 ) {
+ for ( int i = 0; i < AssPinCount; i++ ) {
+ if ( lenofename == AssTabLenEname[i] )
+ if ( lenofcname == AssTabLenCname[i] )
+ if ( strstr( AssTabEname[i], ename ) != -1 )
+ if ( strstr( AssTabCname[i], cname ) != -1 ) return( AssPinCount );
+ }
+ }
+ return( 0 );
+}
+
+// write a divider
+void printdivider( void ) {
+ printf("**********************************************************************\n");
+ return;
+}
+
+// write a section header with dividers
+void printheader(string hs) {
+ printdivider();
+ printf("* %s\n*\n",hs);
+ return;
+}
+
+// write translated package types from Eagle to Hyperlynx
+int saypackagetype(string pn) {
+ if ( strstr( pn,"TSSOP" ) != -1 ) {
+ printf(" PKG=TSSOP");
+ }
+ else if ( strstr( pn,"TQFP" ) != -1 ) {
+ printf(" PKG=TQFP");
+ }
+ else if ( strstr( pn,"SSOP" ) != -1 ) {
+ printf(" PKG=SSOP");
+ }
+ else if ( strstr( pn,"PLCC" ) != -1 ) {
+ printf(" PKG=PLCC");
+ }
+ else if ( strstr( pn,"LCC" ) != -1 ) {
+ printf(" PKG=LCC");
+ }
+ else if ( strstr( pn,"DIP" ) != -1 ) {
+ printf(" PKG=DIP");
+ }
+ else if ( strstr( pn,"QFP" ) != -1 ) {
+ printf(" PKG=QFP");
+ }
+ else if ( strstr( pn,"BGA" ) != -1 ) {
+ printf(" PKG=BGA");
+ }
+ else if ( strstr( pn,"PGA" ) != -1 ) {
+ printf(" PKG=PGA");
+ }
+ else if ( strstr( pn,"DIL" ) != -1 ) {
+ printf(" PKG=DIP");
+ }
+ else if ( strstr( pn,"DIP" ) != -1 ) {
+ printf(" PKG=DIP");
+ }
+ else if ( strstr( pn,"SO" ) != -1 ) {
+ printf(" PKG=SO");
+ }
+ else return( no ); // no package type recognized
+ return( yes ); // yes, package recognized
+}
+
+
+// truncate trailing zeros and print value
+void TruncateTrailingZeros( real value, int prec ) {
+ string num;
+ int nlen;
+ sprintf( num, "%1.*f", prec, value );
+ nlen = strlen( num );
+ if ( nlen > 0 ) {
+ while ( num[ nlen-1 ] == '0' ) {
+ // truncate with a null
+ num[ nlen-1 ] = 0;
+ // recalc string length
+ nlen = strlen( num );
+ if ( nlen == 0 ) break;
+ }
+ }
+ printf("%s",num);
+ return;
+}
+
+// Convert Capacitor Values. i.e. change ".1" to ".1u"
+// char ConvertCapValues = yes;
+// Cap value conversion rules for values without suffix multipliers
+// string ConvertLT1to = "u"; // values less than 1 are "u" or "something else"
+// string ConvertGE1to = "u"; // convert greater than or equal to 1 as "u" or "p"
+//
+void ConvertCapValue( string capvalue ) {
+ char cstate; // state machine
+ char clabel; // unit label
+ real cvalue; // the value of the capacitor
+ int lenofcapvalue; // length of the string for parsing
+
+ if ( ConvertCapValues == yes ) {
+ cvalue = strtod( capvalue );
+ if ( cvalue != 0.0 ) {
+ lenofcapvalue = strlen( capvalue );
+ cstate = 1; // set state for searching digits
+ for ( int i=0; i
Pad %s'
Layer %d
Coordinate (%.4f %.4f) mil
Package %s.PAC
Element %s
Library %s.lbr
"
+ "These rectangles serve as templates in order to draw the image with EAGLE commands like POLYGON, WIRE, CIRCLE, TEXT.
"
+ "The ULP accepts BitMaP files with a maximum of 256 colors. You are allowed to select a maximum of 32 of them. "
+ "[Scan used colors] detects the used number of colors in the image. You have to reduce them to a maximum of 32 "
+ "in the following dialog.
"
+ "In the final dialog you can scale the image. Either in Dots per Inch (DPI), Pixel in the units Inch, "
+ "Mil, Millimeter, Micron, or as Aspect Ratio (the width of the image in pixels in X) in Inch, Mil, "
+ "Millimeter, Micron. "
+ "In the case of Aspect ratio, please keep in mind that there should not be pixels in a non-selected color on "
+ "the left or right boarder of the image. Otherwise the resulting width of the image is not the same as the calculated one.
"
+ "The start layer for the template is set to 200. Each of the maximum of 32 selected colors will use a separate layer, "
+ "beginning with the start layer. So it is possible to have colored logos in the Schematic or Symbol Editor.
"
+ "Reduce the number of colors of an image to two (black/white), if the logo shall be displayed monochrome in one of the copper "
+ "layers. As soon as the image (logo) is drawn with the EAGLE commands (see above) you may delete the template with GROUP DELETE "
+ "and a right mouse click. The layers can be removed with LAYER -number afterwards."
+ "
"
+ "Diese Rechtecke dienen als Vorlage, um das Bild mit EAGLE-Werkzeugen wie POLYGON, WIRE, CIRLE, TEXT zu definieren.
"
+ "Es werden nur BitMaP-Dateien mit maximal 256 Farben akzeptiert. Davon kann man bis zu 32 Farben auswählen.
"
+ "Mit [Scan used colors] können die benutzten Farben im Bild ermittelt werden. Im folgenden Menue muss man sie "
+ "auf maximal 32 reduzieren.
"
+ "Im abschliessenden Menue kann die Skalierung gewählt werden. Entweder Dots per Inch (DPI) oder Pixel in "
+ "der Maßeinheit Inch, Mil, Millimeter, Micron oder Aspect Ratio (die Breite des Bildes Pixel in X) in Inch, "
+ "Mil, Millimeter, Micron."
+ "Bei Aspect ratio sollte darauf geachtet werden, dass im Bild links und rechts keine Pixel in einer "
+ "nichtgewählten Farbe vorkommen. Ansonsten stimmt die Breite des Endergebnisses nicht mit der berechneten Breite überein.
"
+ "Der Startlayer für die Vorlage ist der Layer 200. Für jede, der bis zu max. 32 gewählten Farben, wird ein neuer Layer, "
+ "beginnend mit dem Sartlayer angelegt. So kann ein Logo im Schaltplan (Symbol) auch farbig definiert werden.
"
+ "Reduzieren Sie eine BitMaP auf 2 Farben (schwarz/weiss), wenn das Ergebnis in nur einer Farbe für einen Kupferlayer "
+ "dargestellt werden soll. Ist das Bild (Logo) mit EAGLE-Werkzeugen (siehe oben) definiert, können mit GROUP DELETE und rechter "
+ "Maustaste die 'Rechtecke' wieder gelöscht werden. Die Layer selbst können dann mit LAYER -nummer entfernt werden."
+ "
" +
+ "This message will be prompted if a net segment (track) is connected to another " +
+ "net segment. " +
+ "The reason for this is the way ULTIBOARD exports the tracks, first the " +
+ "horizontal ones, then the vertical ones and at least tracks that run diagonal." +
+ "If ULTIBOARD has not named a segment of a track, EAGLE generates a name of" +
+ "its own and uses the $ sign at second position in it." +
+ "Please notice that the text height (and length) differs in EAGLE and " +
+ "ULTIBOARD. The position of the text will be calculated dependent on " +
+ "the the height and length of each character of the EAGLE vector font.
" +
+ "ULTIBOARD Version 5, Revision 50
" +
+ "ULTIBOARD is a registered trademark of Electronics Workbench";
+
+string InfoDE =
+ "
" +
+ "Beachten Sie, daß die Buchstabengrößen (Zeichenlänge) " +
+ "von ULTIBOARD und EAGLE nicht identisch sind. Die Position der Texte wird " +
+ "berechnet durch die Texthöhe und dem Wert der Zeichenlänge jedes " +
+ "Buchstaben des EAGLE-Vector-Font.
" +
+ "Die Warnung: No forward-/backannotation will be performed!
"
+ "run length name [name name ...]
"
+ "run length +D -D
"
+ "run length d0 d2 d7 A*
"
+ "run length d*
"
+ "If net names are specified, the differences in length will be calculated in procentual values.
"
+ "The procentual difference is based on the shortest of the specified tracks which is taken as 100%.
"
+ "Parallel tracks and polygons are not taken into consideration.
"
+ "Only for all signals it is possible to change the sorting of the displayed signals in the list."
+ "
" +
+ "run length name [name name ...]
" +
+ "run length +D -D
" +
+ "run length d0 d2 d7 d6 A*
" +
+ "run length d*
" +
+ "Prozentuale Längendifferenzen werden nur berechnet wenn Netznamen angegeben wurden.
" +
+ "Für den prozentualen Längenunterschied wird die kürzeste Leiterbahn als 100% angesehen.
" +
+ "Es wird keine Parallelführung bzw. Fläche (Polygon) berücksichtigt.
" +
+ "Nur bei Anzeige aller Signale kann die Sortierung des Listfeldes beeinflußt werden.
"
+ "This version can use BSDL (Boundary Scan Description Language) files to create a Package for BGA
"
+ "or use a set of parameters to generate a Package.
"
+ "
" +
+ "Eine BSDL-Datei (Boundary Scan Description Language .bsdl) wird automatisch geparsed.
" +
+ "Pin-Direction: Der Bezeichner 'linkage' wird für No-Connects (NC), Power (VCC), oder Ground (GND) benutzt, wobei anhand der BSDL-Daten
"+
+ "nicht unterschieden werden kann ob es sich um einen NC oder PWR Pin handelt.
"+
+ "In einigen Fällen kann es vorkommen das dadurch Signalpins die Direction PWR erhalten, die man manuell im Symbol-Editor ändern muß.
" +
+ "" +
+ "
" +
+ "Durch Anwenden der einzelnen Möglichkeiten kann ein beliebiger Text zu einer brauchbaren Tabelle umgestaltet werden.
" +
+ "Als Trennzeichen zwischen den Wörtern wird der gewählte word separator benutzt." +
+ "
" +
+ "
" +
+ "
" +
+ "
" +
+ " Als Trennzeichen zwischen den Wörtern wird der gewählte word separator benutzt.
" +
+ "
" +
+ "
" +
+ "Es ist auch möglich einen Text aus der Zwischenablage einzufügen." +
+ "
" +
+ "Bei BSDL-Dateien (.bsdl) kann ebenfalls ein Package automatisch generiert werden.
" +
+ "Es wird überprüft ob im benutzten Package genügend Pads vorhanden sind um jeden Symbol-Pin zu verbinden.
" +
+ "
" +
+ " - Package Width: Die Gehäuseaussenmaße (Kunststoffkörper).
" +
+ " - PAD Grid: Der Abstand zwischen den SMD-Pads.
" +
+ " - PAD Diameter: Der Durchmesser der SMD-Pads.
" +
+ " - Stop Mask: Ein positiver Wert erzeugt eine Stopmaske um den angegebenen Wert größer als das Pad, " +
+ "ein negativer Wert erzeugt eine Maske um den Betrag kleiner als das Pad.
" +
+ "Package generieren: Durch Angabe der Parameter in der Karte Package können zweireihige oder vierseitige Packages generiert werden.
" +
+ "Der Start-Parameter edit-no-description verhindert daß in der Description des Device der Hinweis " +
+ " edit this description eingetragen wird.
" +
+ "A BSDL (Boundary Scan Description Language) file will be parsed automatically
" +
+ "PIN-Direction: In addition to in, out, and inout, a pin can be identified as type linkage.
"+
+ "This is used for no-connects (NC), power (VCC), or ground (GND).
" +
+ "" +
+ "
" +
+ "These tools allow to make a usable spreadsheet from any text." +
+ "It is also possible to insert text from the operating sytem's clipboard.
" +
+ "The given word separator is used as separator between words." +
+ "
" +
+ "
" +
+ "
" +
+ "
" +
+ "If you are working with text files you have to choose an already existing package from the currently loaded library or use Package.
" +
+ "It is also possible to generate a new package from a BSDL file (*.bsdl).
" +
+ "First the ULP will check if there are sufficient pads for the pins of the symbol.
" +
+ "
" +
+ " - Package width: The dimension of the (plastic) case .
" +
+ " - PAD grid: The distance between the smds.
" +
+ " - PAD diameter: The diameter of the smds." +
+ "
Coordinate (%.4f) %s out of range %.4f %s
Coordinate (%.4f) %s out of range %.4f %s
" + infile + "
and/or measures in BGA menu.";
+ else if (edit_type == e_pac) s += "Check pad names
" + infile + "
and/or measures in Packlage menu.";
+ dlgMessageBox(s, "Ok");
+ return -1;
+ }
+ return 0;
+}
+
+
+string replaceString(string source, string find, string replace) {
+ string result = source;
+ int i = strstr(source, find);
+ string head;
+ string tail;
+
+ if (i > -1) {
+ if(i == 0) {
+ head = "";
+ tail = strsub(source, i + strlen(find));
+ }
+ else {
+ head = strsub(source, 0, i);
+ tail = strsub(source, i + strlen(find));
+ }
+ result = head + replace + tail;
+ }
+ return result;
+}
+
+
+string replaceCharacter(string source, char find, char replace) {
+ string result = source;
+ int i = strchr(source, find);
+ string head;
+ string tail;
+
+ if (i > -1) {
+ if(i == 0) {
+ head = "";
+ tail = strsub(source, i + 1);
+ }
+ else {
+ head = strsub(source, 0, i);
+ tail = strsub(source, i + 1);
+ }
+ sprintf(result, "%s%c%s", head, replace, tail);
+ }
+ return result;
+}
+
+
+
+// cut spaces on left and on right of string 2005-10-05
+string trimString(string source) {
+ if(!source) return source;
+ string result;
+ int i, head = 0;
+ for (i = 0; source[i]; i++) {
+ if (!isspace(source[i])) {
+ head = i;
+ break;
+ }
+ }
+ int send = strlen(source);
+ int len = send;
+ if (len) {
+ for (i = len-1; i >= 0; i--) {
+ if (!isspace(source[i])) {
+ send = i+1;
+ break;
+ }
+ }
+ }
+ return strsub(source, head, send-head);
+}
+
+
+string cleanWhitespace(string line) {
+ string oldtext = "";
+ do {
+ oldtext = line;
+ line = replaceString(line, "\t", " ");
+ line = replaceString(line, " ", " ");
+ } while (line != oldtext);
+ return trimString(line);
+}
+
+
+string spaceCharacter(string l, char c) {
+ string oldtext = "";
+ do {
+ oldtext = l;
+ l = replaceCharacter(l, c, ' ');
+ } while (l != oldtext);
+ return l;
+}
+
+
+string clear_line(string l) {
+ if(!l) return l;
+
+ int comment = strstr(l, "--"); // comment
+ if (comment > 0) l = strsub(l, 0, comment); // strip comment 02.06.2005
+
+ for (int n = 0; n < strlen(l); n++) {
+ if (l[n] == '\"' || l[n] == '(' || l[n] == ')' || l[n] == '&' ) {
+ l[n] = ' ';
+ }
+ else if ( l[n] == ';') l[n] = ','; // *** replace ';' with ',' for last MAP_LINE
+ }
+ l = trimString(l);
+ return l;
+}
+
+
+string cleanName(string name) {
+ name = cleanWhitespace(name);
+ name = replaceString(name, " ", "_");
+ name = replaceString(name, ".", "_");
+ name = replaceString(name, "(", "_");
+ name = replaceString(name, ")", "_");
+ name = replaceString(name, "\\", "-");
+ // 2009-11-12 alf@cadsoft.de
+ name = replaceString(name, ",", "_");
+ name = replaceString(name, ";", "_");
+ return name;
+}
+
+
+void replaceWord(string search, string replace) {
+ string s;
+ tinfo = " ";
+ dlgRedisplay();
+ if (search == replace) {
+ dlgMessageBox("!Search string equal Replace string", "Cancel");
+ return;
+ }
+ int found, newfound;
+ int ct = 0;
+ do {
+ newfound = strstr(text, search, found);
+ if (newfound >= 0) {
+ sprintf(s, "(%d)", newfound);
+ status(s);
+ text = strsub(text, 0, newfound) + replace + strsub(text, newfound+strlen(search) );
+ found = newfound + strlen(replace);
+ ct++;
+ }
+ else break;
+ } while (text);
+
+ status(" ");
+ sprintf(tinfo, "
\\n\\\nSource: %s';\n",
+ filesetext(filename(infile), ""), editMode, filename(argv[0]), Revision, filename(infile) );
+ devicelib += Source_file;
+ devicelib += "Prefix 'IC';\n";
+ devicelib += "Value Off;\n";
+ devicelib += "ADD " + symbol_name + " 'G$1' 0 NEXT (0 0);\n";
+ }
+ int i;
+ int index[];
+ string last_pin;
+ suffix_cnt = 0;
+ sort( n_pins, index, pins);
+ for (i = 0; i < n_pins; i++) {
+ if (last_pin != pins[index[i]]) {
+ last_pin = pins[index[i]];
+ suffix_cnt = 0;
+ }
+ else {
+ suffix_cnt++;
+ }
+ suffix[index[i]] = suffix_cnt;
+ }
+ real x = 0;
+ real y = 0;
+ real dx = 0;
+ real dy = -.1;
+ int terminal_i = 1;
+ int s2 = 0;
+ int s3 = 0;
+ int s4 = 0;
+ int rot = 0;
+ real spacer = .8;
+
+ if (pin_layout == k_stripe) {
+ s2 = (n_pins / maxStripeCnt) / 2;
+ s3 = maxStripeCnt / 2;
+ x = -1.0 * s2 + -0.2;
+ y = 0.1 * s3;
+ dx = 0.0;
+ dy = -0.1;
+ }
+ else if (pin_layout == k_quad) {
+ y = (.1 * n_pins / 4) + spacer;
+ s2 = (n_pins / 4) + 1;
+ s3 = (2 * n_pins / 4) + 1;
+ s4 = (3 * n_pins / 4) + 1;
+ }
+ else if (pin_layout == k_dual) {
+ y = .1 * n_pins / 2;
+ s2 = (n_pins / 2) + 1;
+ }
+ else if (pin_layout == k_dual2) {
+ y = .1 * n_pins / 2;
+ }
+ else {
+ y = .1 * n_pins;
+ }
+
+ for (i = 0; i < n_pins; i++) {
+ int pin_num = i + 1;
+ if (suffix[i]) {
+ sprintf( pin_names[i], "%s@%d", pins[i], suffix[i]);
+ pins[i] = pin_names[i];
+ }
+ string pin_name = pin_names[i];
+ string pad_name = "";
+
+ if (use_pad_names) {
+ if (use_pad_names == useBGA) pad_name = pad_names[i]; // use Padname as is for BGA
+ else if (use_pad_names == usePACwithPrefix) pad_name = pad_names[i]; // use Padname for existing Package with Prefix
+ devicelib += "CONNECT 'G$1." + pin_name + "' '" + pad_name + "';\n";
+ }
+ else {
+ string pin_num_str;
+ sprintf(pin_num_str, "%u", pin_num); // genberate padname by number
+ devicelib += "CONNECT 'G$1." + pin_name + "' '" + pad_prefix + pin_num_str + "';\n";
+ }
+
+ if (check_Coordinate(pin_name, x, y, "INCH", e_symbol)) {
+ string ck;
+ sprintf(ck, "Pin %s, coordinate out of range (%.4f %.4f)", pin_name, x, y);
+ return ck;
+ }
+
+ string x_str;
+ string y_str;
+ sprintf(x_str, "%.4f", round(x * 10) / 10); // set to 0.1 Inch Grid 2006-06-01
+ sprintf(y_str, "%.4f", round(y * 10) / 10);
+
+ partlib += "PIN '" + pin_name + "' " + pin_direc[i] + " (" + x_str + " " + y_str + ");\n";
+ if (rot > 0) partlib += "ROTATE (" + x_str + " " + y_str + ");\n";
+ if (rot > 1) partlib += "ROTATE (" + x_str + " " + y_str + ");\n";
+ if (rot > 2) partlib += "ROTATE (" + x_str + " " + y_str + ");\n";
+
+ x += dx;
+ y += dy;
+ terminal_i ++;
+
+ if (pin_layout == k_stripe) {
+ if (terminal_i > maxStripeCnt) { // 2008-12-03 correct counts
+ terminal_i = 1;
+ s2--;
+ x = -1.0 * s2 + -0.2;
+ y = 0.1 * s3;
+ }
+ }
+ else if (pin_layout == k_quad) {
+ if (terminal_i == s2) {
+ dy = 0;
+ dx = .1;
+ x = spacer + .1;
+ y = 0;
+ rot = 1;
+ }
+ else if (terminal_i == s3) {
+ dy = .1;
+ dx = 0;
+ x += spacer;
+ y = spacer + .1;
+ rot = 2;
+ }
+ else if (terminal_i == s4) {
+ dy = 0;
+ dx = -.1;
+ y += spacer;
+ x -= spacer + .1;
+ rot = 3;
+ }
+ }
+ else if (pin_layout == k_dual) {
+ if (terminal_i == s2) {
+ dy = .1;
+ dx = 0;
+ x = spacer * 3;
+ y = .1;
+ rot = 2;
+ }
+ }
+ else if (pin_layout == k_dual2) {
+ int terminal_row = (terminal_i - 1) / 2;
+ y = (.1 * n_pins / 2) - .1 * terminal_row;
+ if ((terminal_i % 2) == 1) {
+ x = 0;
+ rot = 0;
+ }
+ else {
+ x = spacer * 3;
+ rot = 2;
+ }
+ }
+ }
+
+ real left = .2;
+ real bottom = 0;
+ real top = (.1 * n_pins) + .1;
+ real right = spacer * 1.5;
+
+ if (pin_layout == k_stripe) {
+ ; // no frame for this symbol
+ }
+ else if (pin_layout == k_quad) {
+ left = .2;
+ bottom = .2;
+ top = (spacer * 2) + (.1 * n_pins / 4) - .1;
+ right = (spacer * 2) + (.1 * n_pins / 4) - .1;
+ }
+ else if ((pin_layout == k_dual) || (pin_layout == k_dual2)) {
+ top = (.1 * n_pins / 2) + .1;
+ right = (spacer * 3) - .2;
+ }
+
+ real cx = ((right - left) / 2) + left - .2;
+ real cy = ((top - bottom) / 2) + bottom;
+
+ if (pin_layout == k_single) {
+ cx = right - .4;
+ }
+
+ string left_str;
+ string bottom_str;
+ string top_str;
+ string right_str;
+ string movexy05 = "";
+ string name_x;
+ string name_y;
+ string value_x;
+ string value_y;
+
+ if (pin_layout == k_stripe) { // place >NAME and >VALUE in stripe symbol
+ s2 = (n_pins / maxStripeCnt) / 2;
+ s3 = maxStripeCnt / 2;
+ x = -1.0 * s2;
+ y = 0.1 * s3;
+
+ sprintf(name_x, "%.4f", x - 0.2);
+ sprintf(name_y, "%.4f", y + .2);
+ sprintf(value_x, "%.4f", x - 0.2);
+ sprintf(value_y, "%.4f", y + .1);
+ }
+ else { // set to 0.1 Inch Grid 2006-06-01
+ sprintf(left_str, "%.4f", round(left * 10) / 10);
+ sprintf(bottom_str, "%.4f", round(bottom * 10) / 10);
+ sprintf(top_str, "%.4f", round(top * 10) / 10);
+ sprintf(right_str, "%.4f", round(right * 10) / 10);
+ // ** move Origin to center **
+ sprintf(movexy05, "GROUP (-29.9 -29.9) (29.9 -29.9) (29.9 29.9) (-29.9 29.9) (>-29.9 -29.9);\nMOVE (>%.4f %.4f) (0 0);\n",
+ round(((left + right) / 2) * 10) / 10,
+ round(((bottom + top) / 2) * 10) / 10);
+ sprintf(name_x, "%.4f", round(cx * 10) / 10);
+ sprintf(name_y, "%.4f", round(cy * 10) / 10 + .05);
+ sprintf(value_x, "%.4f", round(cx * 10) / 10);
+ sprintf(value_y, "%.4f", round(cy * 10) / 10 - .1);
+ // place no frame on stripe symbol
+ partlib += "LAYER 94;\n";
+ partlib += "WIRE (" + left_str + " " + bottom_str + ") (" + right_str + " " + bottom_str + ") (" + right_str + " " + top_str + ") (" + left_str + " " + top_str + ") (" + left_str + " " + bottom_str + ");\n";
+ }
+ partlib += "CHANGE SIZE .07;\n";
+ partlib += "LAYER 95;\n";
+ partlib += "TEXT \'>NAME\' (" + name_x + " " + name_y + ");\n";
+ partlib += "LAYER 96;\n";
+ partlib += "TEXT \'>VALUE\' (" + value_x + " " + value_y + ");\n";
+ partlib += "LAYER 94;\n";
+ partlib += movexy05;
+ partlib += "WINDOW FIT;\n";
+
+ output(symbol_file, "wtD") {
+ printf("%s", partlib);
+ }
+
+ output(device_file, "wtD") {
+ printf("%s", devicelib);
+ }
+ return "";
+}
+
+
+string viewPadname(string t, string pacname) { // 2008-11-07 return 0 or error, Cancel = check padname
+ int sel;
+ if (t) {
+ dlgDialog("Make Device Package") {
+ dlgLabel("Pads not found in parsed list.");
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel(pacname + ".PAC");
+ dlgTextView(t);
+ }
+ dlgVBoxLayout {
+ dlgLabel("Parsed from text");
+ dlgListView("Pads", pad_names, sel);
+ }
+ }
+ if (packageparameter_accept) {
+ dlgLabel(" Checke Pad-Name if Prefix used.");
+ dlgLabel(" Possibly delete PAD Prefix in BSDL-Pad Name.");
+ dlgLabel(" Use Text Options [Rename PAD] to rename.");
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") { dlgAccept(); if (t) t = "Check pad name(s) in package " + pacname; }
+ dlgPushButton("-Cancel") { dlgReject(); return "Check pad name(s) in package " + pacname; }
+ dlgSpacing(20);
+ dlgLabel(" Package is a BGA ");
+ dlgPushButton("Accept") { dlgAccept(); t = ""; }
+ dlgStretch(1);
+ }
+ };
+ }
+ return t;
+}
+
+
+string check_Padname(string name) {
+ for (int i = 0; i < n_pins; i++) {
+ if (name == pad_names[i]) {
+ name = "";
+ break;
+ }
+ }
+ if (name) name += "\n";
+ return name;
+}
+
+
+string getPackagePadCount(string pac_name) {
+ checkPadname = "";
+ int pcount = 0;
+ string s;
+ sprintf(s, " NOT found");
+ library(L) {
+ L.packages(PAC) {
+ if (PAC.name == pac_name) {
+ status("count pads " + pac_name);
+ PAC.contacts(C) {
+ checkPadname += check_Padname(C.name);
+ used_pad_number[pcount] = C.name; // 2008-11-07
+ pcount++;
+ }
+ sprintf(s, "%d Contacts", pcount);
+ break;
+ }
+ }
+ }
+ return s;
+}
+
+
+// 2008-11-07 if make package with bsdl.
+// Check used all pad-names in list with on generated Package.
+// Vergleiche padnamen des bsdl file mit generierten padnamen aus package.
+// Alle Pad-Namen in der Liste müssen im Package vorkommen.
+//
+string check_pin_pad_list(int n, int p) {
+ status("check pads in used package");
+ string ti = tinfo;
+ tinfo = "Please wait, check pad names!";
+ dlgRedisplay();
+ string tp;
+ int x = 0;
+ for (x = 0; x < n; x++) {
+ int notfound = 1;
+ for (int i = 0; i < p; i++) {
+ if (used_pad_number[i] == pad_names[x]) {
+ notfound = 0;
+ break;
+ }
+ }
+ if (notfound) tp += pad_names[x]+"\n";
+ }
+ tinfo = ti;
+ dlgRedisplay();
+ if (tp) return "Pads not found in Package\nCheck pad name in parsed list by 'Text Options'!\n"+tp;
+ return tp;
+}
+
+
+int check_exist_sym(string symname) {
+ int exist = 0;
+ library(L) {
+ L.symbols(SYM) {
+ if (SYM.name == symname) return 1;
+ }
+ }
+ return 0;
+}
+
+
+int getSymbolPinCount(string sym_name) {
+ int scount = -1;
+ library(L) {
+ L.symbols(SYM) {
+ if (SYM.name == sym_name) {
+ SYM.pins(P) scount++;
+ scount++;
+ break;
+ }
+ }
+ }
+ return scount;
+}
+
+
+string getPackagePadPrefix(string pac_name) {
+ library(L) {
+ L.packages(PAC) {
+ if (PAC.name == pac_name) {
+ PAC.contacts(C) {
+ string pad_name = C.name;
+ int i = strstr(pad_name, "1");
+ if (i != -1) {
+ string prefix = strsub(pad_name, 0, i);
+ return prefix;
+ }
+ }
+ }
+ }
+ }
+ return "P$";
+}
+
+
+// ** collect Packages **
+void coll_packages(void) {
+ packages[0] = " ";
+ n_packages = 1;
+ library(L) {
+ L.packages(PAC) {
+ packages[n_packages++] = PAC.name;
+ }
+ }
+ return;
+}
+
+
+// ***** change n.ts character to new character *****
+void change_char_text(char text_char, char to_char, int counter) {
+ int cc;
+ int cnt = 0;
+ for ( int n = 0; n < strlen(text); n ++) {
+ if (text[n] == text_char) {
+ if (cnt == counter) {
+ text[n] = to_char;
+ cc++;
+ cnt = 0;
+ }
+ else if (counter) cnt++;
+ }
+ }
+ sprintf(tinfo, "
See option:
[ Replace ] character string ..... with ....", "OK");
+ return;
+ }
+ if (search == replace) {
+ dlgMessageBox("Search string = Replace string, please change!
See option:
[ Replace ] character string .... with .....", "OK");
+ return;
+ }
+ for ( int n = 0; n < cnt; n++) {
+ int pos = strstr(pad_names[n], search);
+ if (pos >= 0) {
+ pad_names[n] = strsub(pad_names[n], 0, pos) + replace + strsub(pad_names[n], pos+strlen(search) );
+ cntrenamed++;
+ }
+ }
+ gen_viewlist(cnt);
+ sprintf(parsed_pins, "%d pads renamed", cntrenamed);
+ return;
+}
+
+
+// 2008-07-03
+void number_pins(int cnt) {
+ for ( int n = 0; n < cnt; n++) {
+ sprintf(pad_names[n], "%d", n+1);
+ }
+ gen_viewlist(cnt);
+ return;
+}
+
+
+// 2008-07-03
+void set_pin_direction(int cnt) {
+ string pin_dir[] = {
+ "NC",
+ "IN",
+ "OUT",
+ "I/O",
+ "OC",
+ "PWR",
+ "PAS",
+ "HIZ",
+ "SUP"
+ };
+ int setdir = 0;
+ dlgDialog("Set PIN-Directon") {
+ dlgHBoxLayout {
+ dlgGroup("Direction") {
+ dlgRadioButton("NC", setdir);
+ dlgRadioButton("IN", setdir);
+ dlgRadioButton("OUT", setdir);
+ dlgRadioButton("I/O", setdir);
+ dlgRadioButton("OC", setdir);
+ dlgRadioButton("PWR", setdir);
+ dlgRadioButton("PAS", setdir);
+ dlgRadioButton("HIZ", setdir);
+ dlgRadioButton("SUP", setdir);
+ }
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("OK") dlgAccept();
+ dlgPushButton("-Cancel") { dlgReject(); return; }
+ dlgStretch(1);
+ }
+ };
+ for ( int n = 0; n < cnt; n++) {
+ sprintf(pin_direc[n], "%s", pin_dir[setdir]);
+ }
+ gen_viewlist(cnt);
+ return;
+}
+
+
+string ch_dir(string dir) {
+ string s[];
+ strsplit(s, dir, '\t');
+ if (!s[1]) s[1] = s[0];
+ dlgDialog("New Direction") {
+ dlgHBoxLayout {
+ dlgLabel(s[0]);
+ dlgLabel(" &new ");
+ dlgStringEdit(s[1]);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(1);
+ }
+ };
+ return s[0]+"\t"+s[1];
+}
+
+
+// ** change direction of pin in parsed list ** 2008-04-02
+void change_dir(int cnt) {
+ string ndir[];
+ int cntdirection = 0;
+ int found = 0;
+ for (int n = 0; n < cnt; n++) {
+ found = 0;
+ for (int i = 0; i < cntdirection; i++) {
+ if (ndir[i] == pin_direc[n]) {
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ ndir[cntdirection] = pin_direc[n];
+ cntdirection++;
+ }
+ }
+ string info;
+ sprintf(info, "found %d directions", cntdirection);
+ int sel;
+ for (int i = 0; i < cntdirection; i++) {
+ ndir[i] += "\t" + ndir[i];
+ }
+ int Result = dlgDialog("Change Direction") {
+ dlgLabel(info);
+ dlgListView("Direction\tnew", ndir, sel) ndir[sel] = ch_dir(ndir[sel]);
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(1);
+ }
+ };
+ if (!Result) return;
+ for (n = 0; n < cnt; n++) {
+ string s[];
+ for (int i = 0; i < cntdirection; i++) {
+ strsplit(s, ndir[i], '\t');
+ if (pin_direc[n] == s[0]) {
+ pin_direc[n] = s[1];
+ break;
+ }
+ }
+ }
+ gen_viewlist(cnt);
+ return;
+}
+
+
+// *** generate package for NOT BGA ***
+void gen_package(string PacName) {
+ real mpad_stand_out = pad_stand_out; // 2005-12-01 save parameter for display
+ real mypad_length = ypad_length;
+ real mxpad_length = xpad_length;
+ real center_offset;
+ int middle = cnt_side % 2;
+ if (middle) {
+ center_offset = cnt_side / 2 * basic_pad_grid;
+ }
+ else {
+ center_offset = cnt_side / 2 * basic_pad_grid - basic_pad_grid / 2;
+ }
+ real pin_length = (xA_pac - xD_pac) / 2;
+
+ string h;
+ real k; // koordinate for Pad line
+ real xcoord, ycoord;
+ string SMDdirection;
+ string pad_rect;
+ int padnumber = 1;
+ sprintf(h, "EDIT %s.PAC;\n", PacName); // 2005-11-03 alf@cadsoft,de
+ paccmd += h;
+ sprintf(h, "GRID %s %.4f ON;\n", genpac_grid, grid_val/2); // 2008-11-07 set actual grid to generate package
+ paccmd += h;
+ sprintf(h, "SET WIRE_BEND 2;\n");
+ paccmd += h;
+ sprintf(h, "CHANGE ROUNDNESS %.0f;\n", roundness_restring);
+ paccmd += h;
+ sprintf(h, "CHANGE LAYER 1;\n");
+ paccmd += h;
+
+
+ // ** make SMD or PAD ** 2005-12-01
+ if (smd_pad) {
+ pad_stand_out = 0; // no offset from mechanical-pin to pad-drill
+ ypad_length = 0;
+ sprintf(h, "CHANGE DRILL %.4f;\n", xpad_length); // PAD drill diameter
+ paccmd += h;
+ sprintf(h, "CHANGE SHAPE %s;\n", PadShape[pad_shape]);
+ paccmd += h;
+ sprintf(h, "CHANGE DIAMETER %.4f;\n", xpad_length + roundness_restring);
+ paccmd += h;
+ xpad_length = 0; // 2005-12-01
+ }
+ else {
+ sprintf(h, "CHANGE SMD %.4f %.4f;\n", SMD_diameter, SMD_diameter);
+ paccmd += h;
+ }
+
+ switch (pad_layout) { // check Package PAD placement
+ case 0 : // ### quad package with Pin 1 on TOP of LEFT side (corner) ###
+ for (int q = 0; q < 4; q++) {
+ for (int n = 0; n < cnt_side; n++) {
+ k = n * basic_pad_grid - center_offset;
+ switch(q) {
+ case 0 : // 1. quadrant 1.-Pad TOP of LEFT side
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ ycoord = k * -1;
+ xcoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ -xA_pac/2, ycoord - pad_width/2,
+ -xA_pac/2 + pin_length, ycoord + pad_width/2
+ );
+ break;
+
+ case 1 : // 2. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", ypad_length, xpad_length);
+ xcoord = k;
+ ycoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ pin_length = (yA_pac - yD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xcoord - pad_width/2, -yA_pac/2,
+ xcoord + pad_width/2, -yA_pac/2 + pin_length
+ );
+ break;
+
+ case 2 : // 3. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ xcoord = xA_pac / 2 + pad_stand_out - xpad_length/2;
+ ycoord = k;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xA_pac/2, ycoord - pad_width/2,
+ xA_pac/2 - pin_length, ycoord + pad_width/2
+ );
+ break;
+
+ case 3 : // 4. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", ypad_length, xpad_length);
+ xcoord = k * -1;
+ ycoord = xA_pac / 2 + pad_stand_out - xpad_length/2;
+ pin_length = (yA_pac - yD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xcoord - pad_width/2, yA_pac/2,
+ xcoord + pad_width/2, yA_pac/2 - pin_length
+ );
+ break;
+
+ }
+
+ if (smd_pad) { // 2005-12-01
+ sprintf(h, "PAD '%d' (%.4f %.4f);\n", padnumber, xcoord, ycoord);
+ }
+ else {
+ sprintf(h, "SMD %s '%d' (%.4f %.4f);\n", SMDdirection, padnumber, xcoord, ycoord);
+ }
+ paccmd += h;
+ paccmd += pad_rect;
+ sprintf(used_pad_number[padnumber], "%d", padnumber); // 2008-11-07 for check package pad names
+ padnumber++;
+ }
+ }
+ sprintf(h, "LAYER 21;\nWIRE .2032 (%.4f %.4f) (%.4f %.4f);\n",
+ -xD_pac/2 + package_wire_width,
+ yD_pac/2 - mark_length,
+ -xD_pac/2 + mark_length,
+ yD_pac/2 - package_wire_width
+ );
+ paccmd += h;
+ break;
+
+ case 1 : // ### quad package with Pin 1 on MIDDLE of LEFT side ###
+ for (int qm = 0; qm < 5; qm++) {
+ for (int n = 0; n < cnt_side; n++) {
+ k = n * basic_pad_grid - center_offset;
+ switch(qm) {
+ case 0 : // 1. quadrant 1.-Pad MIDDLE of LEFT side
+ if (n >= cnt_side/2 - 0.5) {
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ xcoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ ycoord = k * -1;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ -xA_pac/2, ycoord - pad_width/2,
+ -xA_pac/2 + pin_length, ycoord + pad_width/2
+ );
+ }
+ else SMDdirection = ""; // ** clear, do not genearate line **
+ break;
+
+ case 1 : // 2. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", ypad_length, xpad_length);
+ xcoord = k;
+ ycoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ pin_length = (yA_pac - yD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xcoord - pad_width/2, -yA_pac/2,
+ xcoord + pad_width/2, -yA_pac/2 + pin_length
+ );
+ break;
+
+ case 2 : // 3. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ xcoord = xA_pac / 2 + pad_stand_out - xpad_length/2;
+ ycoord = k;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xA_pac/2, ycoord - pad_width/2,
+ xA_pac/2 - pin_length, ycoord + pad_width/2
+ );
+ break;
+
+ case 3 : // 4. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", ypad_length, xpad_length);
+ xcoord = k * -1;
+ ycoord = yA_pac / 2 + pad_stand_out - xpad_length/2;
+ pin_length = (yA_pac - yD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xcoord - pad_width/2, yA_pac/2,
+ xcoord + pad_width/2, yA_pac/2 - pin_length
+ );
+ break;
+
+ case 4 : // 1. quadrant pad right side to middle
+ if (n < cnt_side/2 - 0.5) {
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ ycoord = k * -1;
+ xcoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ -yA_pac/2, ycoord - pad_width/2,
+ -yA_pac/2 + pin_length, ycoord + pad_width/2
+ );
+ }
+ else SMDdirection = ""; // ** clear, do not genearate line **
+ break;
+ }
+ if (SMDdirection) {
+ if (smd_pad) { // 2005-12-01
+ sprintf(h, "PAD '%d' (%.4f %.4f);\n", padnumber, xcoord, ycoord);
+ }
+ else {
+ sprintf(h, "SMD %s '%d' (%.4f %.4f);\n", SMDdirection, padnumber, xcoord, ycoord);
+ }
+ paccmd += h;
+ paccmd += pad_rect;
+ sprintf(used_pad_number[padnumber], "%d", padnumber); // 2008-11-07 for check package pad names
+ padnumber++;
+ }
+ }
+ }
+ sprintf(h, "LAYER 21;\nCIRCLE .2032 (%.4f 0) (%.4f 0);\n",
+ -xD_pac/2 + xpad_length + mark_length/2,
+ -xD_pac/2 + xpad_length + mark_length
+ );
+ paccmd += h;
+ break;
+
+ case 2 : // dual in line package
+ for (int qd = 0; qd < 2; qd++) {
+ for (int n = 0; n < cnt_side; n++) {
+ k = n * basic_pad_grid - center_offset;
+ switch(qd) {
+ case 0 : // 1. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ ycoord = k * -1;
+ xcoord = -xA_pac / 2 - pad_stand_out + xpad_length/2;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ -xA_pac/2, ycoord - pad_width/2,
+ -xA_pac/2 + pin_length, ycoord + pad_width/2
+ );
+ break;
+
+ case 1 : // 2. quadrant
+ sprintf(SMDdirection, " %.4f %.4f ", xpad_length, ypad_length);
+ xcoord = xA_pac / 2 + pad_stand_out - xpad_length/2;
+ ycoord = k;
+ pin_length = (xA_pac - xD_pac) / 2;
+ sprintf(pad_rect, "LAYER 51;\nRECT (%.4f %.4f) (%.4f %.4f);\n",
+ xA_pac/2, ycoord - pad_width/2,
+ xA_pac/2 - pin_length, ycoord + pad_width/2
+ );
+ break;
+ }
+ if (smd_pad) { // 2005-12-01
+ sprintf(h, "PAD '%d' (%.4f %.4f);\n", padnumber, xcoord, ycoord);
+ }
+ else {
+ sprintf(h, "SMD %s '%d' (%.4f %.4f);\n", SMDdirection, padnumber, xcoord, ycoord);
+ }
+ paccmd += h;
+ paccmd += pad_rect;
+ sprintf(used_pad_number[padnumber], "%d", padnumber); // 2008-11-07 for check package pad names
+ padnumber++;
+ }
+ }
+ sprintf(h, "LAYER 21;\nARC CCW .2032 (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n",
+ -mark_length,
+ yD_pac/2 - package_wire_width,
+ mark_length,
+ yD_pac/2 - package_wire_width,
+ mark_length,
+ yD_pac/2 - package_wire_width
+ );
+ paccmd += h;
+ break;
+ }
+
+ sprintf(h, "SET WIRE_BEND 0;\n");
+ paccmd += h;
+ sprintf(h, "CHANGE LAYER 21;\n");
+ paccmd += h;
+ sprintf(h, "WIRE .2032 (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n",
+ -xD_pac /2 + package_wire_width,
+ -yD_pac /2 + package_wire_width,
+ xD_pac /2 - package_wire_width,
+ yD_pac /2 - package_wire_width,
+ -xD_pac /2 + package_wire_width,
+ -yD_pac /2 + package_wire_width
+ );
+ paccmd += h;
+ // mark edge on pin 1
+ sprintf(h, "SET WIRE_BEND 2;\n");
+ paccmd += h;
+ sprintf(h, "CHANGE SIZE %.2f;\n", textsize);
+ paccmd += h;
+ sprintf(h, "CHANGE LAYER 25;\n");
+ paccmd += h;
+ sprintf(h, "TEXT >NAME (%.4f %.4f);\n",
+ -xA_pac/2, yA_pac/2 + textsize*0.5);
+ paccmd += h;
+ sprintf(h, "CHANGE LAYER 27;\n");
+ paccmd += h;
+ sprintf(h, "TEXT >VALUE (%.4f %.4f);\n",
+ -xA_pac/2, -yA_pac/2 - textsize*1.5);
+ paccmd += h;
+ sprintf(h, "DESCRIPTION '%s
\\n';\n",
+ PacName, filename(argv[0]), Revision );
+ paccmd += h;
+
+ pad_stand_out = mpad_stand_out; // 2005-12-01
+ ypad_length = mypad_length;
+ xpad_length = mxpad_length;
+ return;
+}
+
+
+void display_error(string er) { // 2008-11-07 display error text/messages
+ dlgDialog(filename(argv[0])) {
+ dlgHBoxLayout dlgSpacing(300);
+ dlgLabel("Errors");
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(500);
+ dlgTextView(er);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("Back") dlgAccept();
+ dlgPushButton("Cancel") { dlgReject(); exit(-2); }
+ dlgStretch(1);
+ }
+ };
+}
+
+
+// Generate BGA Pad list to generate only GBA package 2009-10-16
+void genBGAlist(int x, int y) {
+ int existnpadname = 0;
+ do {
+ existnpadname++;
+ } while(bga_pad_name[existnpadname]);
+ string bga1 = "";
+ string bga2 = bga_pad_name[0];
+ string s;
+ int n = 0;
+ for (int ny = 0; ny < y; ny++) {
+ for (int nx = 0; nx < x; nx++) {
+ if (ny >= existnpadname) {
+ int firstcolumn = ny / existnpadname;
+ if (firstcolumn) {
+ bga2 = bga_pad_name[ny - firstcolumn*(existnpadname)];
+ bga1 = bga_pad_name[firstcolumn-1];
+ }
+ else bga2 = bga_pad_name[ny];
+ }
+ else bga2 = bga_pad_name[ny];
+ sprintf(pins_pads_direc[n], " \t%s%s%d\t ", bga1, bga2, nx+1);
+ sprintf(pad_names[n],"%s%s%d", bga1, bga2, nx+1);
+ n++;
+ }
+ }
+ pins_pads_direc[n] = ""; // clear last line in array
+ n_pins = x*y; // pins "parsed"!
+ sprintf(parsed_pins, "%d BGA pads generated", n_pins);
+ return;
+}
+
+
+void genBGA_PadList(void) { // 2009-10-16
+ dlgDialog("Generate BGA pad list") {
+ if (!is_bsdl) {
+ dlgLabel("Generate PAD list without a BSDL file to autogenerate a BGA package.");
+ dlgHBoxLayout {
+ dlgGridLayout {
+ dlgCell(0,0) dlgLabel("pad lines ");
+ dlgCell(0,1) dlgIntEdit(cntBGApadY, 1 , 500);
+ dlgCell(1,0) dlgLabel("pads in row ");
+ dlgCell(1,1) dlgIntEdit(cntBGApadX, 1 ,500);
+ }
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ dlgPushButton("OK") { dlgAccept(); only_generate_bga = 1; genBGAlist(cntBGApadX, cntBGApadY); }
+ dlgPushButton("CANCEL") dlgReject();
+ dlgStretch(1);
+ }
+ }
+ else {
+ dlgLabel("Can not use this option, while bsdl file is loaded!");
+ dlgHBoxLayout {
+ dlgPushButton("OK") dlgAccept();
+ dlgStretch(1);
+ }
+ }
+ };
+ return;
+}
+
+
+// *** main ***
+if (library) {
+ string rf[]; // 2008-11-07 check exist remember file
+ int nrf = fileglob(rf, filedir(argv[0])+rememberLastPathFile);
+ if (nrf) nrf = fileread(rememberBSDLpath, rf[0]);
+
+ if (argv[1] == "edit-no-description") editMode = "";
+ string packinfo = "";
+
+ int make_Symbol;
+ int make_Device;
+
+ real m_pac_width = pac_width; // 2006-06-01 alf
+ real m_grid_val = grid_val;
+ real m_SMD_diameter = SMD_diameter;
+ real m_MaskRestring = MaskRestring;
+ real m_CreamDiameter = CreamDiameter;
+
+ int exact_include = 0;
+ string del_line;
+ int delColumn = 1;
+ string st[];
+ int separator_counter = 2;
+ string c_separator;
+ int start_line, x_line;
+ int cc;
+ tinfo = " ";
+ int do_copy = 1;
+ string search, replace;
+ coll_packages();
+ package_name = ""; // default
+
+ string PadCount;
+ sprintf(String_separator, "%c", Word_separator);
+ string cmd;
+
+ int result = dlgDialog("Make Symbol / Device / Package ") {
+ dlgHBoxLayout {
+ dlgLabel("&File:");
+ dlgStringEdit(infile);
+ dlgPushButton("&Browse") {
+ infile = dlgFileOpen("Select a File", rememberBSDLpath, "*.bsdl *.bsd *.bsm *.txt");
+ if (infile) { // 23.03.2005
+ // 2008-11-07 write last path in file to remember for next start
+ output(filedir(argv[0])+rememberLastPathFile, "wt") printf("%s", filedir(infile));
+ readText(infile);
+ status(" "); // 2008-11-07 // clear display working
+ if (is_bsdl) {
+ make_Symbol = 1;
+ make_Device = 1;
+ make_Package = 1;
+ if (check_exist_pac(package_name)) make_Package = 0; // 2009-10-12 reset flag
+ m_pac_width = pac_width;
+ m_grid_val = grid_val;
+ m_SMD_diameter = SMD_diameter;
+ m_MaskRestring = MaskRestring;
+ m_CreamDiameter = CreamDiameter;
+ }
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(300); // 2005-01-26
+ dlgVBoxLayout {
+ dlgHBoxLayout dlgSpacing(500);
+ dlgHBoxLayout {
+ dlgLabel("Text");
+ dlgStretch(1);
+ dlgLabel(bsdl_package_name, 1);
+ }
+ dlgTextEdit(text);
+ }
+ dlgVBoxLayout {
+ dlgSpacing(25);
+ dlgPushButton(" &<<-- Copy") {
+ if (is_bsdl) {
+ do_copy = 0;
+ if (dlgMessageBox("!BSDL file loaded. Are you sure you want to copy listing to text?", "Ok", "Cancel") == 0) do_copy = 1;
+ }
+ if (do_copy) {
+ text = "";
+ for (int i = 0; i < n_pins; i++) {
+ if (i) text += "\n";
+ text += pin_names[i] + String_separator + pad_names[i];
+ if (pin_direc[i]) text += String_separator + pin_direc[i];
+ }
+ //infile = ""; // delete filename while text is copy from list // 2008-11-07 use for DESCRIPTION
+ is_bsdl = 0;
+ delete_empty_lines();
+ tinfo = "Text is a copy of pin/pad list.";
+ dlgRedisplay();
+ }
+ }
+ dlgStretch(1);
+ dlgPushButton("S&ort PAD") {
+ parsed_pins = "sorted by pad";
+ sorting_pad(n_pins);
+ gen_viewlist(n_pins);
+ }
+ dlgStretch(1);
+ dlgPushButton("So&rt PIN") {
+ parsed_pins = "sorted by pin";
+ sorting_pin(n_pins);
+ gen_viewlist(n_pins);
+ }
+ dlgStretch(1);
+ dlgPushButton("Parse -->&>") {
+ parsed_pins = "parsing text, please wait...";
+ dlgRedisplay();
+ if (!is_bsdl) filter_text(use_pad_names);
+ else dlgMessageBox(";Only text files can be parsed. BSDL files will be parsed automatically!", "Ok");
+ }
+ }
+ dlgVBoxLayout {
+ dlgHBoxLayout dlgSpacing(200);
+ dlgListView( "Pins\tPads\tDirect.", pins_pads_direc, select, sorting);
+ }
+ }
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgSpacing(18);
+ }
+ dlgLabel(tinfo, 1);
+ dlgStretch(1);
+ dlgLabel(parsed_pins, 1);
+ dlgSpacing(8);
+ }
+
+ dlgTabWidget {
+ dlgTabPage("Ma&ke") { // #######################################
+ dlgSpacing(12);
+ dlgHBoxLayout {
+ dlgSpacing(8);
+ dlgGridLayout {
+ dlgCell(1,0) dlgCheckBox("&Symbol", make_Symbol);
+ dlgCell(1,1) dlgLabel(" &Name ");
+ dlgCell(1,2) { dlgStringEdit(symbol_name); dlgLabel(".SYM"); }
+
+ dlgCell(2,0) dlgVBoxLayout dlgSpacing(64);
+
+ dlgCell(3,0) dlgCheckBox("Pa&ckage ", make_Package);
+ dlgCell(3,1) dlgLabel(" Na&me ");
+ dlgCell(3,2) { dlgStringEdit(package_name); dlgLabel(".PAC"); }
+ dlgCell(4,1) dlgLabel("&Variant ");
+ dlgCell(4,2) dlgStringEdit(pac_variant_name);
+
+ dlgCell(5,1) dlgVBoxLayout dlgSpacing(24);
+ dlgCell(5,2) dlgSpacing(200);
+
+ dlgCell(7,0) dlgCheckBox("&Device", make_Device)
+ if(make_Device) {
+ if (!device_name) {
+ dlgMessageBox("! Define a Device name", "OK");
+ make_Device = 0;
+ }
+ }
+ dlgCell(7,1) dlgLabel(" Nam&e ");
+ dlgCell(7,2) { dlgStringEdit(device_name); dlgLabel(".DEV"); }
+
+ }
+ dlgSpacing(16);
+ dlgGroup("Symbol Pin Layout") {
+ dlgGridLayout {
+ dlgCell(1, 1) dlgRadioButton("Sing&le", pin_layout) pinCntInfo = " ";
+ dlgCell(0, 1) dlgLabel("");
+ dlgCell(1, 3) dlgRadioButton("Dual &1", pin_layout) pinCntInfo = " ";
+ dlgCell(0, 3) dlgLabel("");
+ dlgCell(1, 5) dlgRadioButton("Dual &2", pin_layout) pinCntInfo = " ";
+ dlgCell(0, 5) dlgLabel("");
+ dlgCell(1, 7) dlgRadioButton("&Quad", pin_layout) pinCntInfo = " ";
+ dlgCell(0, 7) dlgLabel("");
+ dlgCell(1, 9) dlgRadioButton("Str&ipe", pin_layout) pinCntInfo = "
" +
+ "or accept BGA parameter,
or Use an existing Package.
");
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgLabel("quick file option");
+ dlgStretch(1);
+ }
+ dlgStretch(1);
+
+ dlgHBoxLayout {
+ dlgStretch(1);
+ dlgPushButton("Load") {
+ string fl = infile;
+ if (!fl) fl = path_epf[1] + "/~make.txt"; // 2008-05-20
+ else {
+ if (strstr(fl, "/~make.txt") < 0) { // 2009-02-18
+ fl = filedir(infile) + "~make.txt";
+ }
+ }
+ string fn[]; // 2008-11-07 first check if file exist
+ int fc = fileglob(fn, fl);
+ if (!fc) {
+ fl = dlgFileOpen(fl, "", "*.txt *.*");
+ }
+ if (fl) {
+ infile = fl; // 2008-11-07 show actual filename
+ int cnt = fileread(text, fl);
+ parsed_pins = "Text loaded:"+fl;
+ }
+ }
+ dlgPushButton("Save") {
+ string fs = infile;
+ if (!fs) fs = path_epf[1] + "/~make.txt"; // 2008-03-26
+ else {
+ if (strstr(fs, "/~make.txt") < 0) { // 2009-02-18
+ fs = filedir(infile) + "~make.txt";
+ }
+ }
+ output(fs, "wt") printf("%s", text);
+ parsed_pins = "Text saved:"+fs;
+ }
+ dlgPushButton("Save as") {
+ string fsa = dlgFileSave("BSDL-Text-Save", path_epf[1], "*.txt");
+ if (fsa) {
+ output(fsa, "wt") printf("%s", text);
+ parsed_pins = "Text saved:"+fsa;
+ }
+ }
+ }
+ }
+ dlgStretch(1);
+ }
+ dlgSpacing(8);
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgSpacing(8);
+ dlgPushButton("&Help") dlgMessageBox(Help, "Ok");
+ dlgStretch(1);
+ dlgLabel(Revision);
+ }
+ };
+
+ if (result) {
+ if (make_Symbol) cmd += "SCRIPT '" + symbol_file + "';\nWIN FIT;\n";
+ if (make_Device) cmd += "SCRIPT '" + device_file + "';\nWIN FIT;";
+ }
+ exit(cmd);
+}
+
+else {
+ dlgMessageBox("!This is no Library!\nThis program can only work in the Library editor.");
+ exit(0);
+}
\ No newline at end of file
diff --git a/eagle-5.7.0/ulp/make-value-consistent.ulp b/eagle-5.7.0/ulp/make-value-consistent.ulp
new file mode 100644
index 0000000..7116a76
--- /dev/null
+++ b/eagle-5.7.0/ulp/make-value-consistent.ulp
@@ -0,0 +1,588 @@
+#usage "
"
+ "
%5d Packages/BRD
", sch_cnt, brd_cnt);
+ if(sch_cnt > brd_cnt) Error += "
delete Device in SCH";
+ else Error += "Place Device in SCH or delete Package in BRD!
");
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel(InfoSch);
+ dlgListView("Name\tValue\tPackage", DeviceList, devsel, dsl);
+ }
+ dlgVBoxLayout {
+ dlgLabel(InfoBrd);
+ dlgListView("Name\tValue\tPackage", ElementList, pacsel, psl);
+ }
+ }
+ dlgHBoxLayout {
+ if (!Error && !cnt_SCHempty && !cnt_BRDempty) {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Cancel") dlgReject();
+ }
+ else {
+ dlgPushButton("OK") dlgReject();
+ }
+ dlgStretch(1);
+ dlgLabel(usage);
+ dlgStretch(1);
+ dlgLabel("Version " + Version);
+ }
+ };
+ if (!Result) exit(0);
+ if (!command) exit(0);
+ }
+
+ // ****** show script ******
+// int ssel, bsel, dsel;
+ int Result = dlgDialog("Make VALUE consistent") {
+ dlgHBoxLayout {
+ if (command) {
+ dlgVBoxLayout {
+ dlgLabel("Change values in " + argv[1]);
+ dlgLabel("Command");
+ dlgTextEdit(command);
+ }
+ }
+ else {
+ dlgVBoxLayout {
+ dlgLabel("Values are consistent");
+ }
+ }
+ }
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("-Cancel") dlgReject();
+ dlgStretch(1);
+ dlgLabel(" Version " + Version);
+ }
+ };
+ if (Result) {
+ if (command) {
+ string scriptfile = filesetext(readfile, "~.scr");
+ output(scriptfile, "wtD") printf("%s",command);
+ exit("script '" + scriptfile + "';ERC\n");
+ }
+ }
+ exit (0);
+}
+
+
+int noexist(string name, int cnt) {
+ int is = 1;
+ for (int n = 0; n < cnt; n++) {
+ if (s_name[n] == name) {
+ is = 0;
+ break;
+ }
+ }
+ return is;
+}
+
+
+// ### Main ###
+runcount = strtol(argv[2]);
+if (runcount == 1) {
+ string cmd;
+ lines_cnt = fileread( lines, readfile);
+ if (board) {
+ int rnp = fileread(DeviceList_no_pac, readfile_no_pac);
+ }
+ if (schematic) {
+ int rop = fileread(ElementList_only_pac, readfile_only_pac);
+ }
+}
+
+
+// *** Board ***
+if (board) {
+ string b_name[], b_value[], b_package[];
+ string b_name_only_pac[], b_value_only_pac[], b_package_only_pac[];
+
+ board(B) {
+ B.elements(E) {
+ int PACcontact = 0;
+ E.package.contacts(C) {
+ b_name[brd_cnt] = E.name;
+ b_value[brd_cnt] = E.value;
+ b_package[brd_cnt] = E.package.name;
+ brd_cnt++;
+ PACcontact++;
+ break;
+ }
+ if (!PACcontact) {
+ b_name_only_pac[brd_cnt_only_pac] = E.name;
+ b_value_only_pac[brd_cnt_only_pac] = E.value;
+ b_package_only_pac[brd_cnt_only_pac] = E.package.name;
+ brd_cnt_only_pac++;
+ }
+ }
+
+ sort (brd_cnt, brd_Index, b_value, b_name);
+ for (n = 0; n < brd_cnt; n++) {
+ brd_name[n] = b_name[brd_Index[n]] ;
+ brd_value[n] = b_value[brd_Index[n]] ;
+ brd_package[n] = b_package[brd_Index[n]];
+ sprintf(ElementList[n], "%s\t%s\t%s\t0", brd_name[n], brd_value[n], brd_package[n] );
+ }
+ sort (brd_cnt_only_pac, brd_Index_only_pac, b_value_only_pac, b_name_only_pac);
+ for (n = 0; n < brd_cnt_only_pac; n++) {
+ brd_name_only_pac[n] = b_name_only_pac[brd_Index_only_pac[n]] ;
+ brd_value_only_pac[n] = b_value_only_pac[brd_Index_only_pac[n]] ;
+ brd_package_only_pac[n] = b_package_only_pac[brd_Index_only_pac[n]];
+ sprintf(ElementList_only_pac[n], "%s\t%s\t%s", brd_name_only_pac[n], brd_value_only_pac[n], brd_package_only_pac[n] );
+ }
+
+ if (runcount < 1) {
+ output(readfile, "wtD") {
+ for(int x = 0; x < brd_cnt; x++) {
+ printf("%s\t%s\t%s\t0\n", brd_name[x], brd_value[x], brd_package[x] );
+ }
+ }
+ output(readfile_only_pac, "wtD") {
+ for(int x = 0; x < brd_cnt_only_pac; x++) {
+ printf("%s\t%s\t%s\n", brd_name_only_pac[x], brd_value_only_pac[x], brd_package_only_pac[x] );
+ }
+ }
+ runcount++;
+ string cmd;
+ sprintf( cmd, "edit '%s';\n run '%s' SCH %d;\n", filesetext(B.name, ".sch"), argv[0], runcount );
+ exit(cmd);
+ }
+ sch_cnt = lines_cnt;
+ string s[];
+ for (n = 0; n < sch_cnt; n++) {
+ strsplit(s, lines[n], '\t');
+ sch_name[n] = s[0];
+ sch_value[n] = s[1];
+ sch_package[n] = s[2];
+ sch_sheet[n] = strtol(s[3]);
+ sprintf(DeviceList[n], "%s\t%s\t%s\t%d", sch_name[n] , sch_value[n], sch_package[n], sch_sheet[n] );
+ }
+ }
+ menue();
+}
+
+// *** Schematic ***
+if (schematic) {
+ string s_value[], s_package[];
+ int s_sheet[];
+ string s_name_no_pac[];
+ string s_value_no_pac[];
+ string s_package_no_pac[];
+ int s_sheet_no_pac[];
+
+ schematic(S) {
+ S.sheets(SH) {
+ SH.parts(PA) {
+ if (PA.device.package) {
+ int PACcontact = 0;
+ PA.device.package.contacts(C) {
+ PACcontact++;
+ break;
+ }
+ if (PACcontact) {
+ if (noexist(PA.name, sch_cnt)) {
+ s_name[sch_cnt] = PA.name;
+ s_value[sch_cnt] = PA.value;
+ s_package[sch_cnt] = PA.device.package.name;
+ PA.instances(IN) { // Gate
+ if (IN.sheet) {
+ s_sheet[sch_cnt] = IN.sheet;
+ sch_cnt++;
+ break;
+ }
+ }
+ }
+ }
+ else {
+ s_name_no_pac[sch_cnt_no_pac] = PA.name;
+ s_value_no_pac[sch_cnt_no_pac] = PA.value;
+ s_package_no_pac[sch_cnt_no_pac] = PA.device.package.name;
+ PA.instances(IN) { // Gate
+ if (IN.sheet) {
+ s_sheet_no_pac[sch_cnt_no_pac] = IN.sheet;
+ sch_cnt_no_pac++;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ sort (sch_cnt, sch_Index, s_name);
+ for (n = 0; n < sch_cnt; n++) {
+ sch_name[n] = s_name[sch_Index[n]] ;
+ sch_value[n] = s_value[sch_Index[n]] ;
+ sch_package[n] = s_package[sch_Index[n]];
+ sch_sheet[n] = s_sheet[sch_Index[n]];
+ sprintf(DeviceList[n], "%s\t%s\t%s\t%d", sch_name[n] , sch_value[n], sch_package[n], sch_sheet[n]);
+ }
+ for (n = 0; n < sch_cnt_no_pac; n++) {
+ sch_name_no_pac[n] = s_name_no_pac[n] ;
+ sch_value_no_pac[n] = s_value_no_pac[n] ;
+ sch_package_no_pac[n] = s_package_no_pac[n];
+ sch_sheet_no_pac[n] = s_sheet_no_pac[n];
+ sprintf(DeviceList_no_pac[n], "%s\t%s\t%s\t%d", sch_name_no_pac[n] , sch_value_no_pac[n], sch_package_no_pac[n], sch_sheet_no_pac[n]);
+ }
+
+ if (runcount < 1) {
+ output(readfile, "wtD") {
+ for(int x = 0; x < sch_cnt; x++) {
+ printf("%s\t%s\t%s\t%d\n", sch_name[x], sch_value[x], sch_package[x], sch_sheet[x] );
+ }
+ }
+ output(readfile_no_pac, "wtD") {
+ for(int x = 0; x < sch_cnt_no_pac; x++) {
+ printf("%s\t%s\t%s\t%d\n", sch_name_no_pac[x], sch_value_no_pac[x], sch_package_no_pac[x], sch_sheet_no_pac[x] );
+ }
+ }
+ runcount++;
+ string cmd;
+ sprintf( cmd, "edit '%s';\n run '%s' BRD %d;\n", filesetext(S.name, ".brd"), argv[0], runcount );
+ exit(cmd);
+ }
+ brd_cnt = lines_cnt;
+ string s[];
+ for ( n = 0; n < brd_cnt; n++) {
+ strsplit(s, lines[n], '\t');
+ brd_name[n] = s[0];
+ brd_value[n] = s[1];
+ brd_package[n] = s[2];
+ sprintf(ElementList[n], "%s\t%s\t%s\t0", brd_name[n], brd_value[n], brd_package[n] );
+ }
+ }
+ menue();
+}
diff --git a/eagle-5.7.0/ulp/make_bga_package.bmp b/eagle-5.7.0/ulp/make_bga_package.bmp
new file mode 100644
index 0000000..1930fc4
Binary files /dev/null and b/eagle-5.7.0/ulp/make_bga_package.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_dual.bmp b/eagle-5.7.0/ulp/make_package_dual.bmp
new file mode 100644
index 0000000..5458caa
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_dual.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_pacinfo.bmp b/eagle-5.7.0/ulp/make_package_meass_pacinfo.bmp
new file mode 100644
index 0000000..7d1c3e8
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_pacinfo.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_pacinfo2.bmp b/eagle-5.7.0/ulp/make_package_meass_pacinfo2.bmp
new file mode 100644
index 0000000..7731048
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_pacinfo2.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_padinfo-oct.bmp b/eagle-5.7.0/ulp/make_package_meass_padinfo-oct.bmp
new file mode 100644
index 0000000..d56ef66
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_padinfo-oct.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_padinfo-round.bmp b/eagle-5.7.0/ulp/make_package_meass_padinfo-round.bmp
new file mode 100644
index 0000000..2d63bc3
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_padinfo-round.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_padinfo-sqr.bmp b/eagle-5.7.0/ulp/make_package_meass_padinfo-sqr.bmp
new file mode 100644
index 0000000..65eb8f6
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_padinfo-sqr.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_padinfo.bmp b/eagle-5.7.0/ulp/make_package_meass_padinfo.bmp
new file mode 100644
index 0000000..4aae004
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_padinfo.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_meass_smdinfo.bmp b/eagle-5.7.0/ulp/make_package_meass_smdinfo.bmp
new file mode 100644
index 0000000..4aae004
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_meass_smdinfo.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_quad_left.bmp b/eagle-5.7.0/ulp/make_package_quad_left.bmp
new file mode 100644
index 0000000..c575b81
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_quad_left.bmp differ
diff --git a/eagle-5.7.0/ulp/make_package_quad_middle.bmp b/eagle-5.7.0/ulp/make_package_quad_middle.bmp
new file mode 100644
index 0000000..4a7804f
Binary files /dev/null and b/eagle-5.7.0/ulp/make_package_quad_middle.bmp differ
diff --git a/eagle-5.7.0/ulp/make_symbol_dual1.bmp b/eagle-5.7.0/ulp/make_symbol_dual1.bmp
new file mode 100644
index 0000000..c9382bc
Binary files /dev/null and b/eagle-5.7.0/ulp/make_symbol_dual1.bmp differ
diff --git a/eagle-5.7.0/ulp/make_symbol_dual2.bmp b/eagle-5.7.0/ulp/make_symbol_dual2.bmp
new file mode 100644
index 0000000..c09a12d
Binary files /dev/null and b/eagle-5.7.0/ulp/make_symbol_dual2.bmp differ
diff --git a/eagle-5.7.0/ulp/make_symbol_quad.bmp b/eagle-5.7.0/ulp/make_symbol_quad.bmp
new file mode 100644
index 0000000..f65171a
Binary files /dev/null and b/eagle-5.7.0/ulp/make_symbol_quad.bmp differ
diff --git a/eagle-5.7.0/ulp/make_symbol_single.bmp b/eagle-5.7.0/ulp/make_symbol_single.bmp
new file mode 100644
index 0000000..7097a61
Binary files /dev/null and b/eagle-5.7.0/ulp/make_symbol_single.bmp differ
diff --git a/eagle-5.7.0/ulp/make_symbol_stripe.bmp b/eagle-5.7.0/ulp/make_symbol_stripe.bmp
new file mode 100644
index 0000000..d5d72e3
Binary files /dev/null and b/eagle-5.7.0/ulp/make_symbol_stripe.bmp differ
diff --git a/eagle-5.7.0/ulp/microstrip-radial-stub.bmp b/eagle-5.7.0/ulp/microstrip-radial-stub.bmp
new file mode 100644
index 0000000..123a04c
Binary files /dev/null and b/eagle-5.7.0/ulp/microstrip-radial-stub.bmp differ
diff --git a/eagle-5.7.0/ulp/microstrip-radial-stub.ulp b/eagle-5.7.0/ulp/microstrip-radial-stub.ulp
new file mode 100644
index 0000000..6d5209d
--- /dev/null
+++ b/eagle-5.7.0/ulp/microstrip-radial-stub.ulp
@@ -0,0 +1,298 @@
+#usage "
"
+ "
Distance Copper/Dimension (see DRC) this is the distance between
"
+ "the polygon and outline of the board. If the value for 'Copper/Dimension'
"
+ "in the DRC settings is set higher than the radius of the mill tool#2, the
"
+ "board dimensions will be milled larger by the difference of these two
"
+ "respective values. For the best result, make sure the value for
"
+ "Copper/Dimension in DRC Distance is set on 0.01 mm, or use the
"
+ "same value in the Design Rule's settings as the radius of the milling tool#2
"
+ "is, before running this ULP!
"
+ "refernece holes on PCB for exact mirroring the bottom side of PCB on milling machine.
"
+ "
" +
+ "REFERENCE circles in Layer Holes.
" +
+ "Place it in the layout for milling and
" +
+ "mirroring (bottom side) with offset and
" +
+ "start this ULP again.
";
+ "The position of the circles are defined
" +
+ "in the NC drill data file which comes
" +
+ "from the NC machine (eg. Excellon).
" +
+ used_scr +
+ "
to set the used libraries back.", "OK");
+ string cmd;
+ string ref[];
+ string reference_file = dlgFileOpen("Select drill reference file (Holes)", "", "*.ncd\n*.*");
+ if (!reference_file) return;
+ int unit_format = refunit * 2 + format;
+
+ int l;
+ l = fileread(ref, reference_file);
+ string lbrname;
+ lbrname = filesetext(B.name, "$$$ref_tmp.lbr");
+ sprintf( cmd, "OPEN '%s';\n", lbrname );
+ cmd += "Edit '" + ref_pac + ".PAC';\nCHANGE LAYER 45;\nGRID " + ReferenceUnit[refunit] + ";\n";
+ for (int n = 0; n <= l; n++) {
+ string s = ref[n];
+ if(s[0] == 'X') cmd += "CIRCLE 0 " + getval(ref[n], exf[unit_format], refhdiameter[unit_format]);
+ }
+ cmd += "WRITE;\n";
+ cmd += "EDIT '" + B.name + "';\n";
+ cmd += "DISPLAY 45;\n";
+ cmd += "GRID " + ReferenceUnit[refunit] + ";\n";
+ cmd += "WIN FIT; WIN (" +
+ vunit((B.area.x1 + B.area.x2 )/2, refunit) + " " +
+ vunit((B.area.y1 + B.area.y2 )/2, refunit) + ") (" +
+ vunit((B.area.x1 + B.area.x2 )/2 + 1000, refunit) + " " +
+ vunit((B.area.y1 + B.area.y2 )/2 + 1000, refunit) + ") (" +
+ vunit((B.area.x1 + B.area.x2 )/2 + 150 , refunit) + " " +
+ vunit((B.area.y1 + B.area.y2 )/2 + 150 , refunit) + ");\n",
+ cmd += "USE -*; USE '" + lbrname + "';\n";
+ cmd += "ADD " + ref_pac + "\n";
+ if (test) viewtest(cmd);
+ exit(cmd);
+ }
+ }
+ return;
+}
+
+
+// *** Tools in EXCELLON and GERBER (mm)
+void toolFiles(void) {
+ board(B) {
+ output(filesetext(B.name, ".rac")) {
+ printf("T01 %.1f mm\n", DrillPad);
+ printf("T02 %.1f mm\n", DrillVia);
+ printf("T03 %.1f mm\n", MillToolOutl);
+ printf("T04 %.1f mm\n", MillToolFree);
+ printf("T05 %.1f mm\n", DrillHole);
+ printf("T06 %.1f mm\n", DimensionMillTool);
+ }
+ output(filesetext(B.name, ".whl")) {
+ printf(";aperture wheel file generated by %s %s\n", EAGLE_SIGNATURE, filename(argv[0]) );
+ printf(";remove the above line to prevent this file from being overwritten!\n");
+ printf("D11 round %6.4fmm\n", DrillPad);
+ printf("D12 round %6.4fmm\n", DrillVia);
+ printf("D13 round %6.4fmm\n", MillToolOutl);
+ printf("D14 round %6.4fmm\n", MillToolFree);
+ printf("D15 round %6.4fmm\n", DrillHole);
+ printf("D16 round %6.4fmm\n", DimensionMillTool);
+ }
+ }
+ return;
+}
+
+void showRackFile(void) {
+ board(B) {
+ string text;
+ int nChars = fileread(text, filesetext(B.name, ".rac"));
+ dlgDialog("Show rack file") {
+ dlgTextView(text);
+ dlgHBoxLayout {
+ dlgPushButton("+&OK") dlgAccept();
+ dlgStretch(1);
+ }
+ };
+ }
+ return;
+}
+
+void showHPGLinfo(void) {
+ string text;
+ int nChars = fileread(text, filesetext(FileName, ".pli"));
+ dlgDialog("Show plot info") {
+ dlgTextView(text);
+ dlgHBoxLayout {
+ dlgPushButton("+&OK") dlgAccept();
+ dlgStretch(1);
+ dlgSpacing(200);
+ }
+ };
+ return;
+}
+
+void ValueInit(void) {
+ sprintf( sToolValue[PadDrill], "%.2f", DrillPad);
+ sprintf( sToolValue[ViaDrill], "%.2f", DrillVia);
+ sprintf( sToolValue[Contour], "%.2f", MillToolOutl);
+ sprintf( sToolValue[BlowUp_RubOut], "%.2f", MillToolFree);
+ sprintf( sToolValue[HoleDrill], "%.2f", DrillHole);
+ sprintf( sToolValue[DimensionLine], "%.2f", DimensionMillTool);
+ return;
+}
+
+
+void startlineprint( int x1, int y1, int x2, int y2) {
+ printf("\nPA%.0f,%.0f;PD;\nPA%.0f,%.0f;", Mirror * u2inch(x1 + mirr_offsetx)*HPGLsolution, u2inch(y1 + ref_null_offsetY)*HPGLsolution, Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution);
+ return;
+}
+
+void nextlineprint( int x2, int y2) {
+ printf("\nPA%.0f,%.0f;", Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution );
+ return;
+}
+
+void endlineprint( int x2, int y2) {
+ printf("\nPA%.0f,%.0f;PU;", Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution);
+ return;
+}
+
+void fullineprint( int x1, int y1, int x2, int y2) {
+ printf("\nPA%.0f,%.0f;PD;\nPA%.0f,%.0f;PU;", Mirror * u2inch(x1 + mirr_offsetx)*HPGLsolution, u2inch(y1 + ref_null_offsetY)*HPGLsolution, Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution );
+ return;
+}
+
+real WireLength(real x1,real x2,real y1,real y2) {
+ real WL = sqrt(pow(x2-x1,2) + pow(y2-y1,2)); // calculate Wire length WL
+ return WL;
+}
+
+// if the wire longer as longdistance and vertical or horizontal
+// then make a holder spacing
+void checkBridge(int x1, int y1, int x2, int y2, int state) {
+ real WL = WireLength(u2mm(x2),u2mm(x1),u2mm(y2),u2mm(y1));
+
+ if (WL >= Holder_Spacing && (x1 == x2 || y1 == y2) ) {
+ int bridgewidth = DimensionMillTool * 10000;
+ int xa, xb, ya, yb;
+ switch (state) {
+ case 0:
+ startlineprint(x1, y1, x2, y2);
+ break;
+ case 1:
+ if (x2 > x1 && x2 >= 0) {
+ xa = x2 - (2.5 * bridgewidth);
+ xb = x2 - bridgewidth;
+ }
+ if (x2 < x1 && x2 >= 0) {
+ xa = x2 + (2.5 * bridgewidth);
+ xb = x2 + bridgewidth;
+ }
+ if (x2 > x1 && x2 < 0) {
+ xa = x2 - (2.5 * bridgewidth);
+ xb = x2 - bridgewidth;
+ }
+ if (x2 < x1 && x2 < 0) {
+ xa = x2 + (2.5 * bridgewidth);
+ xb = x2 + bridgewidth;
+ }
+ if (y2 > y1 && y2 >= 0 ) {
+ ya = y2 - (2.5 * bridgewidth);
+ yb = y2 - bridgewidth;
+ }
+ if (y2 < y1 && y2 >= 0) {
+ ya = y2 + (2.5 * bridgewidth);
+ yb = y2 + bridgewidth;
+ }
+ if (y2 > y1 && y2 < 0 ) {
+ ya = y2 - (2.5 * bridgewidth);
+ yb = y2 - bridgewidth;
+ }
+ if (y2 < y1 && y2 < 0) {
+ ya = y2 + (2.5 * bridgewidth);
+ yb = y2 + bridgewidth;
+ }
+ if (x1 == x2) {
+ endlineprint(x1, ya);
+ startlineprint(x1, yb, x1, y2);
+ }
+ else {
+ endlineprint(xa, y1);
+ startlineprint(xb, y1, x2, y2);
+ }
+ break;
+
+ case 2:
+ endlineprint(x2, y2);
+ break;
+ }
+ return;
+ }
+ else {
+ switch (state) {
+ case 0:
+ startlineprint(x1, y1, x2, y2);
+ break;
+ case 1:
+ nextlineprint(x2, y2);
+ break;
+ case 2:
+ endlineprint(x2, y2);
+ break;
+ }
+ return;
+ }
+}
+
+void DeviceDraw(int x1, int y1, int x2, int y2, int state) {
+ // Actually draw a line on the output device.
+ // 'state' is defined as
+ // 0 = this is the first line of a partial polygon
+ // 1 = this is a "normal" line (neither the first nor the last one)
+ // 2 = this is the last line of a partial polygon
+ // 3 = this is a drill coordinate
+ // 4 = this is one line
+ switch (SelectedDevice) {
+ case devScript:
+ switch (state) {
+ case 0:
+ printf("WIRE (%.4f %.4f) (%.4f %.4f)\n", Mirror * u2mm(x1 + mirr_offsetx), u2mm(y1 + ref_null_offsetY), Mirror * u2mm(x2 + mirr_offsetx) , u2mm(y2 + ref_null_offsetY));
+ break;
+ case 1:
+ printf("(%.4f %.4f)\n", Mirror * u2mm(x2 + mirr_offsetx), u2mm(y2 + ref_null_offsetY));
+ break;
+ case 2:
+ printf("(%.4f %.4f);\n", Mirror * u2mm(x2 + mirr_offsetx), u2mm(y2 + ref_null_offsetY));
+ break;
+ case 3:
+ printf("HOLE (%.4f %.4f);\n", Mirror * u2mm(x2 + mirr_offsetx), u2mm(y2 + ref_null_offsetY));
+ break;
+ case 4:
+ printf("WIRE (%.4f %.4f) (%.4f %.4f)\n", Mirror * u2mm(x1 + mirr_offsetx), u2mm(y1 + ref_null_offsetY), Mirror * u2mm(x2 + mirr_offsetx), u2mm(y2 + ref_null_offsetY));
+ break;
+ }
+ break;
+ case devHPGL:
+ switch (state) {
+ case 0:
+ if (InPassOutmill) checkBridge(x1, y1, x2, y2, state);
+ else startlineprint(x1, y1, x2, y2);
+ break;
+ case 1:
+ if (InPassOutmill) checkBridge(x1, y1, x2, y2, state);
+ else nextlineprint(x2, y2);
+ break;
+ case 2:
+ if (InPassOutmill) checkBridge(x1, y1, x2, y2, state);
+ else endlineprint(x2, y2);
+ break;
+ case 3: // drilling tool
+ printf("\nPA%.0f,%.0f;PD;", Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution);
+ printf("\nPA%.0f,%.0f;PU;", Mirror * u2inch(x2 + mirr_offsetx)*HPGLsolution, u2inch(y2 + ref_null_offsetY)*HPGLsolution);
+ break;
+ case 4: // polygon filling
+ fullineprint(x1, y1, x2, y2);
+ break;
+ }
+ break;
+ }
+ return;
+}
+
+void CircleDraw(int centerx, int centery, int diam, int drilltool) {
+ switch (SelectedDevice) {
+ case devScript:
+ printf("CHANGE WIDTH %.4f;\n", DrillHole);
+ printf("CIRCLE (%.4f %.4f) (%.4f %.4f);\n", Mirror * u2mm(centerx + mirr_offsetx), u2mm(centery + ref_null_offsetY), Mirror * u2mm((centerx + diam / 2 - drilltool/2) + mirr_offsetx), u2mm(centery + ref_null_offsetY));
+ break;
+ case devHPGL:
+ // for HPGL 1. Start point arc,
+ // 2. Center point arc
+ // 3. angel
+ printf("\nPA%.0f,%.0f;PD;", Mirror * (u2inch((centerx + diam / 2 - drilltool / 2) + mirr_offsetx)) * HPGLsolution, u2inch(centery + ref_null_offsetY) * HPGLsolution);
+ printf("\nAA%.0f,%.0f,360;PU;", Mirror * u2inch(centerx + mirr_offsetx) * HPGLsolution, u2inch(centery + ref_null_offsetY) * HPGLsolution );
+ break;
+ }
+ return;
+}
+
+/*
+void ArcDraw(int startarcx, int startarcy, int endarcx, int endarcy, int centerarcx, int centerarcy, real angle) {
+ switch (SelectedDevice) {
+ case devScript:
+ int rx = 2 * (startarcx - centerarcx);
+ int ry = 2 * (startarcy - centerarcy);
+ if (Mirror == 1) printf("ARC CCW ");
+ else printf("ARC CW ");
+ printf("(%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n",
+ Mirror * u2mm(startarcx + mirr_offsetx), u2mm(startarcy + ref_null_offsetY),
+ Mirror * u2mm(startarcx - rx + mirr_offsetx), u2mm(startarcy - ry + ref_null_offsetY),
+ Mirror * u2mm(endarcx + mirr_offsetx), u2mm(endarcy + ref_null_offsetY) );
+ break;
+ case devHPGL:
+ printf("\nPA%.0f,%.0f;PD;", Mirror * u2inch(startarcx + mirr_offsetx)*HPGLsolution, u2inch(startarcy + ref_null_offsetY)*HPGLsolution);
+ printf("\nAA%.0f,%.0f,%.2f;PU;", Mirror * u2inch(centerarcx + mirr_offsetx)*HPGLsolution, u2inch(centerarcy + ref_null_offsetY)*HPGLsolution, Mirror * angle);
+ break;
+ }
+ return;
+}
+*/
+
+void scriptHeader(void) {
+ printf("GRID mm;\n");
+ printf("SET OPTIMIZING OFF;\nSET UNDO_LOG OFF;\nSET WIRE_BEND 2;\n");
+ printf("LAYER %d %s;\nSET FILL_LAYER %d %s;\n",
+ Layer + 100, lOutl, Layer + 100, fillstyle);
+ // 26.07.2006
+ printf("LAYER %d %s;\nSET FILL_LAYER %d %s;\n",
+ Layer + 101, lOutl1, Layer + 101, fillstyle);
+ printf("LAYER %d %s;\nSET FILL_LAYER %d %s;\n",
+ Layer + 102, lOutl2, Layer + 102, fillstyle);
+ printf("CHANGE LAYER %d;\n", Layer + 100 );
+ return;
+}
+
+
+void DeviceInit(int tool) {
+ // Do anything necessary to initialize the output device
+ switch (SelectedDevice) {
+ case devScript:
+ // TODO make the layer user definable?
+ if (InPassPour) {
+ real overlap = MillToolFree * OverlapOutlPercent / 100;
+ printf("CHANGE WIDTH %.4f;\n", MillToolFree);
+ printf("SET FILL_LAYER %d %s;\n", Layer + 100, fillstyle);
+ printf("CHANGE LAYER %d;\n", Layer + 101); // 26.07.2006
+ }
+ break;
+ case devHPGL:
+ output(filesetext(FileName,".pli"), "at") {
+ // printf("Pen #%d = %s mm\t%s\n", tool, sToolValue[tool], PenList[tool]);
+ }
+ if (tool = Contour) {
+ printf ("IN; IP 0,0,100,100;SC 0,100,0,100;");
+ }
+ break;
+ }
+ return;
+}
+
+
+void DeviceReInit(int tool) {
+ // Do anything necessary the secondary initialize the output device
+ switch (SelectedDevice) {
+ case devScript:
+ // TODO make the layer user definable?
+ switch (tool) {
+ case PadDrill:
+ printf("\nCHANGE DRILL %.2f;\n", DrillPad);
+ break;
+ case ViaDrill:
+ printf("\nCHANGE DRILL %.2f;\n", DrillVia);
+ break;
+ case HoleDrill:
+ printf("\nCHANGE DRILL %.2f;\n", DrillHole );
+ break;
+ case Contour:
+ printf("\nCHANGE WIDTH %.4f;\n", MillToolOutl);
+ break;
+ case BlowUp_RubOut:
+ printf("\nCHANGE WIDTH %.4f;\n", MillToolFree);
+ printf("\nchange layer %d;\n", Layer+101); // 26.07.2006
+ break;
+ case DimensionLine:
+ printf("\nCHANGE WIDTH %.4f;\n", DimensionMillTool);
+ printf("\nCHANGE LAYER %d;\n", Layer+102); // 26.07.2006
+ break;
+ default:
+ break;
+ }
+ break;
+ case devHPGL:
+ printf ("\nPU;\nSP%d;\nPA0,0;", tool); // pen select
+ if(test) printf(" # %s", PenList[tool]);
+ output(filesetext(FileName,".pli"), "at") {
+ if (onlydrill && tool == Contour);
+ printf("Pen #%d = %s mm\t%s\n", tool, sToolValue[tool], PenList[tool]);
+ }
+ break;
+ }
+ return;
+}
+
+
+void DeviceEnd(void) {
+ // Do anything necessary to end output to the device
+ switch (SelectedDevice) {
+ case devScript:
+ break;
+ case devHPGL:
+ printf("\nPU;\nSP0;");
+ break;
+ }
+ return;
+}
+
+
+// TRUE OUTLINE ***
+void trueOutlineDraw(string SignalName) {
+ board(B) {
+ B.signals(S) {
+ if (S.name == SignalName) {
+ S.polygons(P) {
+ int x1 = INT_MAX, y1 = INT_MAX, x2 = INT_MIN, y2 = INT_MIN;
+ int x0, y0, first = 1;
+ int FrameWire;
+ string s;
+
+ P.wires(W) {
+ x1 = min(x1, W.x1);
+ x2 = max(x2, W.x1);
+ y1 = min(y1, W.y1);
+ y2 = max(y2, W.y1);
+ }
+ string lasts;
+ P.contours(W) {
+ if (first) {
+ // a new partial polygon is starting
+ x0 = W.x1;
+ y0 = W.y1;
+ FrameWire = (x1 == x0 || x2 == x0) && (y1 == y0 || y2 == y0);
+ sprintf(s, " (%.4f %.4f)", u2mm(W.x1), u2mm(W.y1) );
+ trueOutline_coordinate = s;
+ lasts = s;
+ first = 0;
+ }
+ else if (W.x2 == x0 && W.y2 == y0) {
+ // this was the last wire of the partial polygon,
+ // so the next wire (if any) will be the first wire
+ // of the next partial polygon
+ sprintf(s, " (%.4f %.4f)", u2mm(W.x2), u2mm(W.y2) );
+ if (lasts != s) trueOutline_coordinate += s;
+ lasts = s;
+ first = 1;
+ }
+ else ;
+ if (!FrameWire) {
+ sprintf(s, " (%.4f %.4f)", u2mm(W.x2), u2mm(W.y2) );
+ if (lasts != s) trueOutline_coordinate += s;
+ lasts = s;
+ }
+ }
+ }
+ }
+ }
+ return ;
+ }
+}
+
+
+// *** the return string to start rekursiv ***
+string RUN_pass(string run_Pass) {
+ string s;
+ sprintf(s, "RUN '%s' '%s' '%.4f' '%.4f' '%.4f' '%d' '%s' '%s' '%s' '%.1f' '%.2f' '%.2f' '%.2f' '%d' '%d' '%.2f' '%.4f' '%d' '%.4f' '%d' '%d' '%s';\n",
+ argv[0], Device, MillToolOutl, MillToolIsolate, MillToolFree, Layer, FileName, DrillFile, run_Pass,
+ Mirror, DrillPad, DrillVia, DrillHole, OverlapOutlPercent, OverlapRubOut, Distance_Copper_Dimension,
+ DimensionMillTool, millfreeyes, Holder_Spacing, onlydrill, generatedrills, trueOutline_coordinate);
+ return s;
+}
+
+
+
+// place a VIA outside the board with the same signal name
+// for used polygon to calculate the filling with orpahns off
+// and get no more polygon contours
+void generateTruePolygonOutlines() { // the true outlines of board
+ board(B) {
+ real x1 = u2mm(B.area.x1) - DimensionMillTool, y1 = u2mm(B.area.y1) - DimensionMillTool,
+ x2 = u2mm(B.area.x2) + DimensionMillTool, y2 = u2mm(B.area.y2) + DimensionMillTool;
+ real distanceDimension = (DimensionMillTool / 2 - Distance_Copper_Dimension) * 2;
+ if (distanceDimension < 0) distanceDimension = 0.001;
+ string Cmd;
+ sprintf(Cmd, "GRID mm FINEST;\n"
+ "CHANGE DRILL 0.3;\nCHANGE DIAMETER 0.5;\nCHANGE SHAPE ROUND;\n"
+ "SET POLYGON_RATSNEST ON;\n"
+ "SET WIRE_BEND 0;\n"
+ "CHANGE RANK 1;\n" // 26.07.2006 to generate the true outline of dimension
+ "CHANGE POUR SOLID;\n"
+ "CHANGE THERMAL OFF;\n"
+ "CHANGE LAYER %d;\n"
+ "DISPLAY NONE 17 %d;\n",
+ Layer, Layer);
+ // make the 1st virtual Net for Normal Polygon Orphens OFF
+ // to generate the true outline for place the spacial polygon
+ // make a partial WIA for generate Polygon with orphans off
+ string millout;
+ sprintf(millout, "VIA '%s' (%.4f %.4f);\n", OutlineMillSignal, x1 - Distance_Copper_Dimension - 1, y1 - Distance_Copper_Dimension - 1);
+ Cmd += millout;
+ sprintf(millout, "CHANGE ISOLATE 0;\n");
+ Cmd += millout;
+ sprintf(millout, "CHANGE ORPHANS OFF;\n");
+ Cmd += millout;
+ // Width = MillFree-Diameter/2 minus "Distance Copper/Dimension"
+ sprintf(millout, "POLYGON '%s' %.4f (%.4f %.4f) (%.4f %.4f)(%.4f %.4f);\nRATSNEST;\n",
+ OutlineMillSignal, distanceDimension,
+ x1 - DimensionMillTool - Distance_Copper_Dimension - 2, // 2mm outside
+ y1 - DimensionMillTool - Distance_Copper_Dimension - 2,
+ x2 + DimensionMillTool + Distance_Copper_Dimension + 2,
+ y2 + DimensionMillTool + Distance_Copper_Dimension + 2,
+ x1 - DimensionMillTool - Distance_Copper_Dimension - 2,
+ y1 - DimensionMillTool - Distance_Copper_Dimension - 2);
+ Cmd += millout;
+ Cmd += "WINDOW FIT;\n";
+ Cmd += RUN_pass(PassDimensionPoly);
+ if (test) output(filesetext(B.name, "-cmd.txt"), "wt") printf("%s", Cmd);
+ exit (Cmd);
+ }
+}
+
+
+//
+// The actual outlines generator
+void GenerateOutlines(void) {
+ board(B) {
+ trueOutlineDraw(OutlineMillSignal);
+ string s;
+ real x1 = u2mm(B.area.x1) - MillToolFree, y1 = u2mm(B.area.y1) - MillToolFree,
+ x2 = u2mm(B.area.x2) + MillToolFree, y2 = u2mm(B.area.y2) + MillToolFree;
+ real distanceDimension = MillToolFree / 2 - Distance_Copper_Dimension;
+ if (distanceDimension < 0) distanceDimension = 0.001;
+
+ string Cmd = "SET WIRE_BEND 2;\n";
+
+ // delete virtual Polygon and VIA
+ B.signals(S) {
+ if (S.name == OutlineMillSignal) { // 2008.05.05
+ S.vias(V) {
+ sprintf( s, "RIPUP (%.4f %.4f);\n",
+ u2mm(V.x), u2mm(V.y) );
+ Cmd += s;
+ break;
+ }
+ S.polygons(POL) {
+ POL.wires(W) {
+ sprintf( s, "DELETE (S%.4f %.4f);\n",
+ u2mm(W.x1), u2mm(W.y1) );
+ Cmd += s;
+ break;
+ }
+ break;
+ }
+ }
+ }
+ sprintf(s, "CHANGE ISOLATE %.4f;\n", MillToolIsolate); // 26.07.2006
+ Cmd += s;
+ sprintf(s, "CHANGE RANK 6;\n"); // 26.07.2006
+ Cmd += s;
+ sprintf(s, "POLYGOn %s %.4f %s;\nRATSNEST;\n",
+ OutlinesSignalName, MillToolOutl, trueOutline_coordinate);
+ Cmd += s;
+ Cmd += RUN_pass(Pass2);
+ if (test) output(filesetext(B.name, "-cmd.txt"), "at") printf("%s", Cmd);
+ if (test) viewtest(Cmd);
+ exit(Cmd);
+ }
+}
+
+
+string WriteOutlines(string SignalName) { // OutlinesSignalName
+ board(B) {
+ if (InPassPour && MillToolFree == 0) return "";
+ if (InPassOutmill && !DimensionMillTool) return ""; // 0 = generate no Dimension with spacing
+ string Cmd;
+ B.signals(S) {
+ if (S.name == SignalName && !onlydrill) {
+ S.polygons(P) {
+ int x1 = INT_MAX, y1 = INT_MAX, x2 = INT_MIN, y2 = INT_MIN;
+ int x0, y0, first = 1;
+ int FrameWire;
+ int State;
+
+ P.wires(W) {
+ x1 = min(x1, W.x1);
+ x2 = max(x2, W.x1);
+ y1 = min(y1, W.y1);
+ y2 = max(y2, W.y1);
+ }
+ if (InPass2) {
+ DeviceReInit(Contour);
+ }
+ if (InPassPour) DeviceReInit(BlowUp_RubOut);
+ if (InPassOutmill) DeviceReInit(DimensionLine);
+ P.contours(W) {
+ if (first) {
+ // a new partial polygon is starting
+ x0 = W.x1;
+ y0 = W.y1;
+ FrameWire = (x1 == x0 || x2 == x0) && (y1 == y0 || y2 == y0);
+ State = 0;
+ first = 0;
+ }
+ else if (W.x2 == x0 && W.y2 == y0) {
+ // this was the last wire of the partial polygon,
+ // so the next wire (if any) will be the first wire
+ // of the next partial polygon
+ State = 2;
+ first = 1;
+ }
+ else State = 1;
+ if (!FrameWire) {
+ DeviceDraw(W.x1, W.y1, W.x2, W.y2, State);
+ }
+ }
+ if (InPassPour && millfreeyes) {
+ if (SelectedDevice == devScript) {
+ printf("# pouring\n");
+ }
+ DeviceReInit(BlowUp_RubOut);
+ State = 4;
+ int fx1[], fy1[], fx2[], fy2[];
+ int fcnt = 0;
+ P.fillings(F) {
+ fx1[fcnt] = F.x1;
+ fy1[fcnt] = F.y1;
+ fx2[fcnt] = F.x2;
+ fy2[fcnt] = F.y2;
+ fcnt++;
+ }
+ int diry = fy1[0];
+ for (int m = 0; m <= fcnt; m++) {
+ if (diry == fy1[m]) {
+ DeviceDraw(fx1[m], fy1[m], fx2[m], fy2[m], State);
+ }
+ else {
+ // ****** milling reverse ******
+ diry = fy1[m]; // next y_line
+ for (int mb = m; mb <= fcnt; mb++) {
+ if (diry == fy1[mb]);
+ else break;
+ }
+ for(int mback = mb -1 ; mback >= m; mback--) {
+ DeviceDraw(fx2[mback], fy2[mback], fx1[mback], fy1[mback], State);
+ // reverse milling 08.05.2002 alf@cadsoft.de
+ }
+ m = mb;
+ diry = fy1[m]; // next y_line
+ m--;
+ }
+ }
+ }
+ DeviceEnd();
+ }
+ break;
+ }
+ }
+ return Cmd;
+ }
+}
+
+
+void Pad(UL_PAD P) {
+ DeviceDraw(0, 0, P.x, P.y, 3);
+}
+
+
+void Package(UL_PACKAGE P) {
+ P.contacts(C) {
+ if (C.pad) Pad(C.pad);
+ }
+ return;
+}
+
+
+void Element(UL_ELEMENT E) {
+ Package(E.package);
+ return;
+}
+
+
+void PackageHole(UL_PACKAGE P) {
+ P.holes(H) {
+ if (u2mm(H.drill) > DrillHole) {
+ CircleDraw(H.x, H.y, H.drill, DrillHole*10000); // 2007.09.21 der Fraesweg fuer grosse Bohrungen wurde falsch berechnet
+ }
+ else DeviceDraw(0, 0, H.x, H.y, 3);
+ }
+ return;
+}
+
+
+void ElementHole(UL_ELEMENT E) {
+ PackageHole(E.package);
+ return;
+}
+
+
+void WriteDrills(void) {
+ board(B) {
+ DeviceReInit(PadDrill);
+ B.elements(E) Element(E);
+ DeviceReInit(ViaDrill);
+ B.signals(S) {
+ S.vias(V) {
+ DeviceDraw(0, 0, V.x, V.y, 3);
+ }
+ }
+ }
+ return;
+}
+
+
+void WriteHoles(void) {
+ board(B) {
+ DeviceReInit(HoleDrill);
+ B.elements(E) ElementHole(E);
+ B.holes(H) {
+ if (u2mm(H.drill) > DrillHole) {
+ CircleDraw(H.x, H.y, H.drill, DrillHole*10000); // internal unit
+ }
+ else DeviceDraw(0, 0, H.x, H.y, 3);
+ }
+ }
+ return;
+}
+
+
+// *** Pen assaign
+void penAssign(void) {
+ dlgDialog("Mill outlines: HPGL Pen Assignment") {
+ string pen_assign = "\n";
+ string t;
+ PenList[PadDrill] = "PadDrill";
+ PenList[ViaDrill] = "ViaDrill";
+ PenList[Contour] = "Contour";
+ PenList[BlowUp_RubOut] = "Blow-Up/Rub-Out";
+ PenList[HoleDrill] = "HoleDrill";
+ PenList[DimensionLine] = "DimensionLine";
+ sprintf(t, "
";
+ dlgLabel(pen_assign);
+ dlgHBoxLayout {
+ dlgStretch(0);
+ dlgPushButton("OK") dlgAccept();
+ dlgStretch(1);
+ }
+ };
+ return;
+}
+
+
+void selectDevice(void) {
+ File = filesetext(FileName, DeviceExt[SelectedDevice]);
+ if (SelectedDevice != devHPGL) {
+ info = showpic[12 + SelectedDevice];
+ DrFile = filesetext(DrillFile, DrillExt[SelectedDevice]);
+ DrillLabel = "D&rill file";
+ DrBrowse = "Bro&wse";
+ }
+ else {
+ info = showpic[12 + SelectedDevice];
+ DrFile ="";
+ DrillLabel = "D&rill file";
+ DrBrowse = "Bro&wse";
+ }
+ return;
+}
+
+
+void setMillOffset(void) {
+ board(B) {
+ path = filedir(B.name);
+ B.elements(E) {
+ if (E.package.name == ref_pac) {
+ ref_offsetX[ref_cnto] = E.x;
+ ref_offsetY[ref_cnto] = E.y;
+ ref_cnto++;
+ E.package.circles(C) {
+ if (C.layer == 45) {
+ ref_offsetX[ref_cnto] = C.x;
+ ref_offsetY[ref_cnto] = C.y;
+ ref_cnto++;
+ }
+ }
+ if(ref_offsetX[1] > ref_offsetX[2]) { // if first X > second X then swap
+ ref_offsetX[3] = ref_offsetX[2];
+ ref_offsetX[2] = ref_offsetX[1];
+ ref_offsetX[1] = ref_offsetX[3];
+ }
+ if (ref_cnto == 3) {
+ ref_null_offsetX = ref_offsetX[0] * -1;
+ ref_null_offsetY = ref_offsetY[0] * -1;
+ if (Mirror == -1) {
+ mirr_offsetx = (ref_offsetX[2] + ref_offsetX[1] + ref_null_offsetX) * -1;
+ }
+ else {
+ mirr_offsetx = ref_null_offsetX;
+ }
+ }
+ else {
+ ref_cnto = 0; // more then 2 circles can't use as reference
+ if (dlgMessageBox("The reference Hole-Package contains more then 2 Holes\n" +
+ "generate outlines without reference-offset", "accept", "break") != 0) exit(0);
+ }
+ }
+ }
+ }
+ return;
+}
+
+
+void setblowinfo(void) {
+ if (MillToolFree) {
+ if (millfreeyes) { // 14.05.2002 alf
+ info = showpic[18];
+ infotext = "PadDrill: PEN %d %.1f mm \n", PadDrill, DrillPad);
+ pen_assign += t;
+ sprintf(t, " ViaDrill: PEN %d %.1f mm \n", ViaDrill, DrillVia);
+ pen_assign += t;
+ sprintf(t, " Contour: PEN %d %.1f mm \n", Contour, MillToolOutl);
+ pen_assign += t;
+ sprintf(t, " BlowUp/RubOut: PEN %d %.1f mm \n", BlowUp_RubOut, MillToolFree);
+ pen_assign += t;
+ sprintf(t, " HoleDrill: PEN %d %.1f mm \n", HoleDrill, DrillHole);
+ pen_assign += t;
+ sprintf(t, " Mill outline (Dimension): PEN %d %.1f mm \n", DimensionLine, DimensionMillTool);
+ pen_assign += t;
+ pen_assign += "
If value set to 0, no Blow-Up (second isolate)
and Rub-Out (free milling) is generated.
Tool diameter for sec. isolate
If value set, Blow-Up (second isolate) is generated.
";
+ string Layers[];
+ int SelectedLayer = -1;
+ int ForceDialog = (!Device || !MillToolOutl);
+
+ board(B) {
+ B.signals(S) {
+ if (S.name == OutlinesSignalName)
+ Fatal("There is already a signal named " + OutlinesSignalName + " in this board!", "Please make sure that there is no such signal in this board.");
+ // *** Check Rank - 26.07.2006 ***
+ string s;
+ int is_polygon = 0;
+ S.polygons(P) {
+ is_polygon++;
+ if (P.rank == 6) {
+ P.contours(W) {
+ sprintf(s, "!%s Polygon in Layer %d at (%.4f %.4f)mm has Rank 6.\n\nDo not use Rank 6 while working with this ULP.\n" +
+ "Change the rank to 1..5 before using this ULP again.", S.name, P.layer, u2mm(W.x1), u2mm(W.y1) );
+ break;
+ }
+ dlgMessageBox(s, "OK");
+ exit(0);
+ }
+ }
+ if (is_polygon) { // *** 01.08.2006 check if Polygon used in Layout
+ // wenn ein füllendes Polygon im Board plaziert ist, dann muß die Clearance um 0.005mm größer
+ // sein als der Fräser, damit bei Leiterbahnen die nicht im 0° 45° oder 90° Winkel also mit
+ // beliebigen Winkel verlegt sind, keine Füllprobleme wegen Rechenungenauigkeit auftauchen.
+ B.signals(S) {
+ if (u2mm(S.class.clearance) < MillToolOutl + 0.005) {
+ sprintf(s, "!Clearance from CLASS %d %s = %.4f.\nMust be 0.005mm > Tool#1 %.4f", S.class.number, S.class.name, u2mm(S.class.clearance), MillToolOutl);
+ dlgMessageBox(s, "OK");
+ exit(0);
+ }
+ }
+ }
+ }
+ int n;
+ B.layers(L) {
+ if (L.number <= 16 && L.visible) {
+ if (Layer == L.number) SelectedLayer = n;
+ sprintf(Layers[n++], "%d %s", L.number, L.name);
+ }
+ }
+ if (n == 0) Fatal("No signal layer active!", "Please activate the signal layer to generate outlines for.");
+ if (!Layer) {
+ if (n > 1) ForceDialog = 1;
+ SelectedLayer = 0;
+ }
+ if (SelectedLayer < 0) {
+ string s;
+ sprintf(s, "%d", Layer);
+ Fatal("Invalid layer: " + s, "The layer was not found or is not active.");
+ }
+
+ if (ForceDialog) {
+ SelectedDevice = defaultdevice;
+ File = FileName;
+ DrFile = DrillFile;
+ DrillLabel = "D&rill file";
+ selectDevice();
+ int mir = 0;
+ dlgDialog(Version) {
+ dlgHBoxLayout {
+ dlgGridLayout {
+ dlgCell(0, 0) dlgLabel("&Device");
+ dlgCell(0, 1) dlgComboBox(DeviceNames, SelectedDevice) {
+ if (SelectedDevice) selectDevice();
+ else {
+ File = "";
+ DrFile = "";
+ }
+ // 26.07.2006
+ if (SelectedDevice == devHPGL) infotext = "";
+ else if (SelectedDevice == devScript) {
+ infotext = "
" +
+ "Layer+101 to read copper pouring milling,
" +
+ "Layer+102 to read real outlines milling (Dimension)
" +
+ "into board as wire.";
+ }
+ }
+ dlgCell(0, 3) dlgCheckBox("onl&y drills (HPGL)", onlydrill) {
+ if (onlydrill) {
+ generatedrills = 1;
+ infotext = "
";
+ }
+ }
+ dlgCell(6, 4) dlgPushButton("Pad info") { info = showpic[5]; infotext = "Pad drill diameter"; };
+ dlgCell(7, 0) dlgLabel("&Via drill");
+ dlgCell(7, 1) dlgRealEdit(DrillVia, 0.005, 10);
+ dlgCell(7, 2) dlgLabel("mm");
+ dlgCell(7, 4) dlgPushButton("Via info"){
+ info = showpic[6];
+ infotext = "Via drill diameter.";
+ }
+ dlgCell(8, 0) dlgLabel("&Hole drill");
+ dlgCell(8, 1) dlgRealEdit(DrillHole, 0.005, 10);
+ dlgCell(8, 2) dlgLabel("mm");
+ dlgCell(8, 4) dlgPushButton("Hole info"){
+ info = showpic[7];
+ infotext = "Hole drill diameter.";
+ }
+ dlgCell(9, 0) dlgLabel("Dist. &Copper/Dim");
+ dlgCell(9, 1) dlgRealEdit(Distance_Copper_Dimension, 0.0, 20);
+ dlgCell(9, 2) dlgLabel("mm");
+ dlgCell(9, 4) dlgPushButton("Distance info") {
+ info = showpic[10];
+ infotext = infotext = DRCinfo + usage +
+ "
";
+ }
+ dlgCell(10, 0) dlgLabel("Mill Board/D&im");
+ dlgCell(10, 1) dlgRealEdit(DimensionMillTool, 0.0, 5);
+ dlgCell(10, 2) dlgLabel("mm");
+ dlgCell(10, 3) dlgLabel(" (0 = OFF)");
+ dlgCell(10, 4) dlgPushButton("Dimension info") {
+ info = showpic[16];
+ if (DimensionMillTool) {
+ infotext = "
Set value 0 for switch OFF this function.
Set value for switch ON this function.
"
+ "RUN mount-trace -L (generate a trace list from current board)
"
+ "RUN mount-trace 0 (set pointer to zero.)
"
+ "RUN mount-trace + (pointer+1, show the next value(s).)
"
+ "RUN mount-trace - (pointer-1, show the previous value(s).)
"
+ "RUN mount-trace ++ (pointer+1, show the next value(s) in a loop.
"
+ " Resets the counter at the end.)
"
+ "RUN mount-trace -M (mirror the whole board [make Bottom to Top] "
+ " save board with an extended name and generate trace list from this side.)
" +
+ "RUN mount-trace -L (generiert die Trace-Liste des aktuellen Boards)
" +
+ "RUN mount-trace 0 (setzt den Zeiger auf null.)
" +
+ "RUN mount-trace + (Zeiger+1, zeige die Bauteile mit dem nächsten Wert an.)
" +
+ "RUN mount-trace - (Zeiger-1, zeige die Bauteile mit dem vorhergehenden Wert an.)
" +
+ "RUN mount-trace ++ (Zeiger+1, zeige die Bauteile mit dem nächsten Wert als Schleife.
" +
+ " Am Ende der Liste wird der Zähler zurückgesetzt.)
" +
+ "RUN mount-trace -M (Spiegelt das ganze Board [Unten nach Oben] " +
+ " Speichert das Board mit Namenserweiterung und generiert dafür eine Liste der Bauteile auf der Oberseite.)
Add to view list?", name);
+ if (dlgMessageBox(s, "YES", "NO") != 0) return;
+ value = empty;
+ }
+ for (int n = 0; n < cnt; n++) {
+ if (nvalue[n] == value) {
+ nshow[n] += " " + name + "";
+ return;
+ }
+ }
+ nvalue[cnt] = value;
+ nshow[cnt] += " " + name + "";
+ cnt++;
+ return;
+}
+
+
+void set_trace_zero(void) {
+ output(ftrace, "wt") {
+ printf("0");
+ }
+ return;
+}
+
+void generate_list(void) {
+ board(B) {
+ B.elements(E) {
+ E.package.contacts(S) { // only Packages with Pads or Smds
+ if (!E.mirror) add_list(E.name, strupr(E.value)); // only packages on Top
+ break;
+ }
+ }
+ int index[];
+ sort( cnt, index, nvalue, nshow);
+ output(fname, "wt") {
+ for (int n = 0; n < cnt; n++) {
+ printf("%s\t%s\n", nvalue[index[n]], nshow[index[n]]);
+ }
+ }
+ set_trace_zero();
+ }
+ cmd = "DISPLAY NONE 21 -23 25 27;\nRUN '" + argv[0] + "' +;\n";
+ exit(cmd);
+}
+
+
+void read(void) {
+ string l[];
+ lcnt = fileread(l, fname);
+ for (int n = 0; n < lcnt; n++) {
+ string s[];
+ int x = strsplit(s, l[n], '\t');
+ nvalue[n] = s[0];
+ nshow[n] = s[1];
+ }
+ string t;
+ cnt = fileread(t, ftrace);
+ cnt = strtol(t);
+ return;
+}
+
+
+void checkfile(void) { // check exist trace-list of this board
+ string s[];
+ int n = fileglob(s, ftrace);
+ if (!n) {
+ generate_list();
+ }
+ return;
+}
+
+
+void traceplus() {
+ cmd = "SHOW "+ nshow[cnt];
+ cnt++;
+ if (cnt < lcnt) {
+ output(ftrace, "wt") {
+ printf("%d", cnt);
+ }
+ }
+ else {
+ if (language() == "de") {
+ dlgMessageBox("Letzter Eintrag!" , "OK");
+ }
+ else {
+ dlgMessageBox("Last entry!" , "OK");
+ }
+ }
+ exit(cmd);
+}
+
+
+void traceminus() {
+ cnt--;
+ if (cnt < 0) {
+ cnt = 0;
+ if (language() == "de") {
+ dlgMessageBox("Erster Eintrag!", "OK");
+ }
+ else {
+ dlgMessageBox("First entry!", "OK");
+ }
+ }
+ cmd = "SHOW "+ nshow[cnt];
+ output(ftrace, "wt") {
+ printf("%d", cnt);
+ }
+ exit(cmd);
+}
+
+
+void opt_Mirror(void) { // 2006.04.25
+ string cmd;
+ int pos = strstr(mname , mirrorext);
+ if (pos > 0) {
+ if (language() == "de") {
+ if (dlgMessageBox("
Möchten Sie das nicht-gespiegelte Board laden?
Do you want load the non-mirrored board?
\n"
+ ""
+ "
"
+ "device: Script | HPGL "
+ " width: outlines width [mm] "
+ " layer: 1..16 (0 = active layer) "
+ " filename: output file name "
+ " "
+ "
"
+ "device: Script | HPGL "
+ " width: Breite der Konturlinien [mm] "
+ " layer: 1..16 (0 = aktiver Layer) "
+ " filename: Ausgabedatei "
+ "
" + tr("ERROR: ") + Message + "
Extended by support@cadsoft.deParts List for
\n\n");
+ printf("%s
\n", B.name);
+ printf("
\n\n");
+ printf("\n");
+ printf("
\n");
+ printf("Parts Listing
\n");
+ printf("\n");
+ printf("
\n");
+ printf("\n");
+ printf(" \n");
+
+ B.elements(E) {
+
+ printf(" Part \n");
+ printf(" Value \n");
+ printf(" Package \n");
+ printf(" Library \n");
+ printf(" \n");
+ printf(" \n");
+ }
+ printf("%s \n", E.name);
+ printf("%s \n", E.value);
+ printf("%s \n", E.package.name);
+ printf("%s \n", E.package.library);
+ printf(" \n");
+ printf("
\n");
+ printf("\n");
+ printf("");
+ }
+ }
diff --git a/eagle-5.7.0/ulp/prevdevdescript.ulp b/eagle-5.7.0/ulp/prevdevdescript.ulp
new file mode 100644
index 0000000..afe112e
--- /dev/null
+++ b/eagle-5.7.0/ulp/prevdevdescript.ulp
@@ -0,0 +1,42 @@
+#usage "Edit previous device description\n"
+ "
\n");
+ printf(" © 1997 Avion\n");
+ printf(" International Co. Ltd.
\n");
+ printf(" Bangkok Sydney Taipei
"
+ " -- basic material of the board
"
+ " -- thickness of the board
"
+ " -- number of layers
"
+ " -- thickness of the layers
"
+ " -- distances between elements
"
+ " -- tracks
"
+ " -- copper areas / ground plains
"
+ " -- thickness of the copper layers
"
+ " -- track width
"
+ " -- distances between tracks
"
+ " -- surface of tracks (tin?)
"
+ " -- the signal's frequency
"
+ " -- ...
"
+ "All these factors should be taken into consideration for the formula !
"
+ "used below to calculate an exact value for a coil. Nevertheless it !
"
+ "is necessary to check the result by a practical measurement. It is !
"
+ "very difficult to generate coils with exact values this way.
"
+ "Generally one can say that printed coils can be used in the MHz range only.
"
+ "
" +
+ "Je nachdem ob Sie es von einer Library oder von einem Borad aus "
+ "starten, werden Pads bzw. Vias plaziert.
" +
+ "
" +
+ "Die Berechnung der Windungen bzw. der Induktivität hängt von vielen Faktoren ab, wie z.B.:
" +
+ " - Basismaterial
" +
+ " - Stärke der Leiterplatte
" +
+ " - Anzahl der Lagen
" +
+ " - Dicke der Lagen
" +
+ " - Abstand zu benachbarten Bauteilen, Leitungen, Kupferflächen, Masseflächen etc.
" +
+ " - Dicke der Kupferbeschichtung
" +
+ " - Breite der Leiterbahn (unterätzen)
" +
+ " - Abstand zwischen den Leiterbahnen (Spiralkreise / Ätzgenauigkeit)
" +
+ " - Oberfläche der Leiterbahn (Verzinnt)
" +
+ " - Signal-Frequenz
" +
+ " - ...
" +
+ "Um daraus einen einigermassen genauen Wert zu berechnen, müßten alle oben genannten Faktoren
" +
+ "als Korrekturwerte in die Formel einfliessen.
" +
+ "Was aber in jedem Fall durch entspechende Messungen nachgeprüft werden müßte.
" +
+ "In der Praxis sind Printspulen mit genau definierten Werten und in engen Toleranzen " +
+ "nur sehr schwer herzustellen.
" +
+ "Im Allgemeinen kann man davon ausgehen, dass Printspulen nur im MHz Bereich " +
+ "einigermassen Nutzbar sind.
" +
+ "
%.4f mm 'e' + ('d'+'w'*n)
%.4f mm distance 'h'
"
+ "
"
+ "Optional: The starting point for the numeration of parts on the first sheet "
+ "defines an offset value for the following pages.
"
+ "Example:
"
+ " - 0 = R1 ... Rn
"
+ " - 100 sheet 1: R101..R199 sheet 2: R201..R299 ...
"
+ " - 1000 sheet 1: R1001..R1999 sheet 2: R2001..R2999 ...
"
+ "
" +
+ " descx = 1 (X descending [right >> left])
" +
+ " descy = 0 (Y ascending [bottom >> top])
" +
+ " descy = 1 (Y descending [top >> bottom])
";
+
+
+int descy = 1; // set to 0 sorting ascending
+int descx = 0; // set to 1 sorting descending
+int numerical_order = 0;
+
+numeric string OldNames[], NewNames[], Prefix[];
+int x[], y[], i[], sh[];
+int nrNames = 0;
+
+numeric string SymNames[]; // Device-Name of Symbol
+int symsh[];
+int sx[], sy[];
+int Snr = 0;
+int Dnr = 0;
+
+string error = "";
+string SymPrefix[];
+string DevPrefix[];
+string DevName[];
+string SymDevName[];
+
+string NoRenumber = "TP"; // Prefix do not renumber Testpoints
+
+int ckx[], cky[], cksh[];
+string ckname[];
+
+
+string cmd;
+string c;
+
+real Grid = 100; // in 100 Mil
+string lbr[], dev[], sym[];
+
+
+int GetNumberIndex(string Name)
+{
+ // Returns the index of the first digit of the numeric part of Name
+ // -1 indicates there is no numeric part in Name
+ int l = strlen(Name) - 1;
+ for (int i = l; i >= 0; --i) {
+ if (!isdigit(Name[i]))
+ return i < l ? i + 1 : -1;
+ }
+ return 0;
+}
+
+string prefix(string name) // Prefix of Device
+{
+ int num = GetNumberIndex(name);
+ if (num < 1) return name;
+ else {
+ string pfx = name;
+ pfx[num] = 0;
+ return pfx;
+ }
+}
+
+void DescendingY(void)
+{
+ for (int ny = 0; ny < nrNames ; ny++) {
+ y[ny] = 0 - y[ny];
+ }
+}
+
+void DescendingX(void)
+{
+ for (int nx = 0; nx < nrNames ; nx++) {
+ x[nx] = 0 - x[nx];
+ }
+}
+
+void SortElements(void)
+{
+ // Sorts the elements according to their location, first by ascending
+ // x coordinates, then by ascending y coordinates.
+ // If you prefer a different kind of sorting, you can implement this here.
+ // As a result, the integer array i[] must contain the new sequence
+ // in which to renumber the elements.
+ if (descy) DescendingY();
+ if (descx) DescendingX();
+
+ if(!numerical_order) {
+ sort(nrNames, i, NewNames, sh, y, x);
+ }
+ else {
+ sort(nrNames, i, sh, NewNames, y, x);
+ }
+ if (descy) DescendingY();
+ if (descx) DescendingX();
+ return;
+}
+
+
+void CheckSameOrigin(int chk) { // eagle can not rename an element
+ // if another element is on the same coordinate
+ int index[];
+ string checklist, h;
+ sort(chk, index, cksh, ckx, cky);
+ for (int n = 0; n < nrNames; n++) {
+ if(ckx[index[n]] == ckx[index[n+1]] && cky[index[n]] == cky[index[n+1]] && cksh[index[n]] == cksh[index[n+1]]) {
+ sprintf(h, "%s & %s on same coordinate (%d %d) mil in sheet %d\n",
+ ckname[index[n]], ckname[index[n+1]],
+ ckx[index[n]],
+ cky[index[n]],
+ cksh[index[n]]);
+ checklist += h;
+ }
+ }
+ if (checklist) {
+ dlgDialog("Check coordinates") {
+ dlgLabel("Eagle can not rename elements that are placed at the same position!");
+ dlgHBoxLayout {
+ dlgSpacing(300);
+ }
+ dlgTextView(checklist);
+ dlgHBoxLayout {
+ dlgPushButton("Break") dlgAccept();
+ dlgStretch(1);
+ }
+ };
+ exit(0);
+ }
+ return;
+}
+
+
+void GenerateNames(void) {
+ string memprefix = "";
+ int mem_sh = 0;
+ if(!numerical_order) {
+ // Generates new numeric parts to the element names in NewNames
+ int k;
+ for (int n = 0; n <= nrNames - 1; ++n) {
+ if (memprefix != NewNames[i[n]]) {
+ memprefix = NewNames[i[n]];
+ k = 0;
+ }
+ sprintf(NewNames[i[n]], "%s%d", NewNames[i[n]], ++k);
+ }
+ }
+ else { // renumber sheets by 100.. 200.. 300..
+ string h;
+ int newdevnr;
+ for(int n = 0; n < nrNames ; ++n) {
+ if (memprefix != NewNames[i[n]]) {
+ memprefix = NewNames[i[n]];
+ newdevnr = numerical_order * sh[i[n]] +1;
+ }
+ if (mem_sh != sh[i[n]]) { // a new Sheet is starting by old prefix *** 2006.08.23 alf@cadsoft.de
+ mem_sh = sh[i[n]];
+ newdevnr = numerical_order * sh[i[n]] +1;
+ }
+ sprintf(NewNames[i[n]], "%s%d", NewNames[i[n]], newdevnr);
+ newdevnr++;
+ if (newdevnr-(sh[i[n]]*numerical_order) >= numerical_order) {
+ sprintf(h, "
Start the ulp with numerical order >= %d
"
+ "
"
+ "
"
+ "
"
+ "The script must conform to the following syntax:
"
+ "ATTRIBUTE name 'value'
"
+ "ATTRIBUTE name DELETE
"
+ "In case the value DELETE is used, the attribute will be deleted.
"
+ "If there is no value given or this attribute is already defined in the Device Set "
+ "the attribute remains unchanged.
"
+ "Das Script muß nach folgenden Regeln erstellt sein:
"
+ "ATTRIBUTE Name 'Wert'
"
+ "ATTRIBUTE Name DELETE
"
+ "Ist der Wert DELETE zugewiesen, wird das Attribute gelöscht
"
+ "Ist kein Wert angegeben und/oder das Attribute im Deviceset schon vorhanden und "
+ "ein Wert zugewiesen, dann bleibt das Attribute in diesem Deviceset unverändert.Highlights all net with a given CLASS.
\n"
+ "This ULPs works from within a board or a schematic.
"
+ "Hebt Signale der gegebenen CLASS hervor.
\n"
+ "Dieses ULP arbeitet aus Boards oder Schematics heraus.
"
+ "
"
+ " -- basic material of the board
"
+ " -- thickness of the board
"
+ " -- number of layers
"
+ " -- thickness of the layers
"
+ " -- distances between elements
"
+ " -- tracks
"
+ " -- copper areas / ground plains
"
+ " -- thickness of the copper layers
"
+ " -- track width
"
+ " -- distances between tracks
"
+ " -- surface of tracks (tin?)
"
+ " -- the signal's frequency
"
+ " -- ...
"
+ "All these factors should be taken into consideration for the formula !
"
+ "used below to calculate an exact value for a coil. Nevertheless it !
"
+ "is necessary to check the result by a practical measurement. It is !
"
+ "very difficult to generate coils with exact values this way.
"
+ "Generally one can say that printed coils can be used in the MHz range only.
"
+ "
" +
+ "Je nachdem ob Sie es von einer Library oder von einem Borad aus "
+ "starten, werden Pads bzw. Vias plaziert.
" +
+ "
" +
+ "Die Berechnung der Windungen bzw. der Induktivitaet haengt von vielen Faktoren ab, wie z.B.:
" +
+ " - Basismaterial
" +
+ " - Staerke der Leiterplatte
" +
+ " - Anzahl der Lagen
" +
+ " - Dicke der Lagen
" +
+ " - Abstand zu benachbarten Bauteilen, Leitungen, Kupferflaechen, Masseflaechen etc.
" +
+ " - Dicke der Kupferbeschichtung
" +
+ " - Breite der Leiterbahn (unteraetzen)
" +
+ " - Abstand zwischen den Leiterbahnen (Spiralkreise / Ätzgenauigkeit)
" +
+ " - Oberflaeche der Leiterbahn (Verzinnt)
" +
+ " - Signal-Frequenz
" +
+ " - ...
" +
+ "Um daraus einen einigermassen genauen Wert zu berechnen, muessten alle oben genannten Faktoren
" +
+ "als Korrekturwerte in die Formael einfliessen.
" +
+ "Was aber in jedem Fall durch entspechende Messungen nachgeprueft werden muesste.
" +
+ "In der Praxis sind Printspulen mit genau definierten Werten und in engen Toleranzen " +
+ "nur sehr schwer herzustellen.
" +
+ "Im Allgemeinen kann man davon ausgehen, dass Printspulen nur im MHz Bereich " +
+ "einigermassen Nutzbar sind.
" +
+ "
");
+ dlgCell(6, 2) dlgLabel("
");
+ dlgCell(7, 1) dlgLabel("offset &X"); // place with offset X
+ dlgCell(7, 2) dlgRealEdit( offx );
+ dlgCell(8, 1) dlgLabel("offset &Y"); // place with offset Y
+ dlgCell(8, 2) dlgRealEdit( offy );
+
+ }
+ dlgStretch(1);
+ }
+ }
+ dlgLabel("
"
+ "which have been extracted from one big Symbol by GROUP; CUT; and PASTE.
"
+ "It is possible to generate a Device with Symbol and Package from a BSDL file or text file (spreadsheet) with "
+ "the help of RUN make-symbol-device-package-bsdl. In cases where the Symbol becomes too big, due to the "
+ "number of pins, and it does not fit onto a single schematic sheet, you can divide into several smaller Symbols with "
+ "the commands GROUP, CUT, EDIT xx.sym, PASTE ...., and adopt the Connect list from the 'original Device'.
"
+ "There must not be pins with same names. So it is not possible to use this ULP for Devices that consist of "
+ "identical Symbols (gates like NAND or OP-AMP..). "
+ "
"
+ "die wiederum durch GROUP; CUT; und PASTE aus einem großen Symbol erstellt wurden.
"
+ "Mit RUN make-symbol-device-package-bsdl kann mit einer BSDL- oder Textdatei (Tabelle) ein Device mit Symbol "
+ "und Package generiert werden. In den Fällen, in denen das Symbol durch die Anzahl der Pins zu groß wird, "
+ "um es im Schaltplan auf eine Seite zu platzieren, kann mit GROUP - CUT - EDIT xx.sym - PASTE .... das Symbol in "
+ "mehrere kleinere Symbole aufgeteilt werden und mit Hilfe dieses ULPs die Connect-Liste vom 'Original-Device' übernommen werden.
"
+ "Es dürfen keine Pin-Namen doppelt vorkommen. So ist es z.B. nicht möglich dieses ULP für ein Device, das aus mehreren gleichen "
+ "Symbolen (Gates wie NAND oder OP-AMP) besteht, zu benutzen."
+ "
Connect-List generated from "+ Device_Sets[selD] +".DEV Variant "+ checkVariant(Device_Variant[selV]) +" with "+ filename(argv[0])+""));
+ }
+ printf("WIN FIT;\n");
+ }
+ exit("SCRIPT '"+ file + "';\n");
+ }
+ }
+ }
+ else dlgMessageBox("Open a Device", "OK");
+}
+
+else dlgMessageBox("Start this ULP in a LBR (Device)", "OK");
diff --git a/eagle-5.7.0/ulp/statistic-brd-checkmin.val b/eagle-5.7.0/ulp/statistic-brd-checkmin.val
new file mode 100644
index 0000000..58dd048
--- /dev/null
+++ b/eagle-5.7.0/ulp/statistic-brd-checkmin.val
@@ -0,0 +1,11 @@
+0.1500
+0.1500
+0.1500
+0.1500
+0.1500
+0.1500
+0.1500
+0.1500
+0.5000
+0.2000
+0.5000
\ No newline at end of file
diff --git a/eagle-5.7.0/ulp/statistic-brd.ulp b/eagle-5.7.0/ulp/statistic-brd.ulp
new file mode 100644
index 0000000..ca0810a
--- /dev/null
+++ b/eagle-5.7.0/ulp/statistic-brd.ulp
@@ -0,0 +1,2746 @@
+#usage "
for detailed info
Do not use Layer %.d %s for Powerplane!", L.number, L.name);
+ displayLayerError += sl;
+ }
+ }
+ }
+ }
+ if (layerError) {
+ layerError += "\n\nUse only inner layer (2 to 15) for Powerplane!\n";
+ displayLayerError = "
" +
+ "
Only use layer 2 - 15 for power planes.
");
+ dlgLabel(usedLayer);
+ dlgLabel(displayLayerError);
+ dlgStretch(1);
+ }
+ dlgSpacing(10);
+ dlgVBoxLayout {
+ dlgGroup("Summary") {
+ dlgLabel(sum);
+ dlgHBoxLayout {
+ if (SignalUnrouted) {
+ dlgLabel(displayUnrouted);
+ dlgStretch(1);
+ }
+ }
+ }
+ dlgStretch(1);
+ }
+ dlgSpacing(5);
+ dlgVBoxLayout {
+ dlgGroup("Minor values") {
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel(showminValWidth, 1);
+ dlgHBoxLayout dlgSpacing(200);
+ }
+ dlgVBoxLayout {
+ dlgLabel(showminValOther, 1);
+ string emptyval = " ";
+ if (emptyValue) sprintf(emptyval, "%d %s%s Values", emptyValue, empty, attention);
+ dlgSpacing(6);
+ dlgLabel(emptyval);
+ }
+ }
+ dlgSpacing(8);
+ dlgHBoxLayout {
+ dlgPushButton("&Edit") {
+ GetCheckValues();
+ showminValWidth = check_min_ValueWidth();
+ showminValOther = check_min_ValueOther();
+ }
+ dlgStretch(1);
+ }
+ }
+ if (PolyWidthError) dlgLabel("" + PolygonError + "
Details see Tab POLYGON.");
+ }
+ dlgStretch(1);
+ }
+ }
+ dlgTabPage("&LAYER") { // *** all Layer are defined ***
+ int layselect = 0;
+ dlgHBoxLayout {
+ dlgListView("Nb.:\tName\tUsed", allLayers, layselect ); // 2005-11-17 alf@cadsoft.de
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&CLASS (Signal)") { // *** Class clearance/isolate ***
+ string classlabel = "Class 0: " + NetClassName[0];
+ string ClassNameL = NetClassLabel(NetClassName[SignalClassSelect] , cNetClass[SignalClassSelect]);
+ string SignalList = SignalClassList[selNetClassNr[SignalClassSelect]];
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgListView("", statisticCLASS, SignalClassSelect) { // 2007-12-04 - Corrected Class handling to select net-list if classes empty
+ SignalList = SignalClassList[selNetClassNr[SignalClassSelect]];
+ sprintf(classlabel, "Class %d : %s",
+ selNetClassNr[SignalClassSelect],
+ NetClassName[selNetClassNr[SignalClassSelect]]);
+ }
+ dlgSpacing(12);
+ if (falseSignalCnt) {
+ dlgLabel("False signals (not connected on PAD or SMD)");
+ dlgListView("", statisticFalseSignals, SignalClassSelect);
+ }
+ /********* 2009-02-12 *********/
+ if (deleteRudimentalSignalName) {
+ dlgLabel(" ");
+ dlgLabel("Found rudimentarily signal name(s).");
+ dlgLabel("You wish to delete this rudimentarily signal names, press button Delete");
+ dlgPushButton("&Delete") {
+ dlgAccept();
+ exit("GRID MM;\n"+deleteRudimentalSignalName+"GRID LAST;\nRUN '"+filename(argv[0])+"'");
+ }
+ }
+ }
+ dlgSpacing(12);
+ dlgGroup("Netlist") {
+ dlgLabel(classlabel, 1);
+ dlgHBoxLayout {
+ dlgSpacing(4);
+ dlgTextView(SignalList);
+ }
+ }
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&WIDTH") { // *** Wire / Text ***
+ dlgHBoxLayout {
+ dlgListView("", statisticWirew, Selected);
+ dlgListView("", statisticARCw, Selected);
+ dlgSpacing(8);
+ dlgVBoxLayout {
+ dlgListView("", statisticTEXTw, Selected);
+ dlgLabel(LabelcntTextWidth);
+ }
+ dlgSpacing(8);
+ dlgVBoxLayout {
+ dlgListView("", statisticTEXTsize, Selected);
+ dlgLabel(LabelcntTextSize);
+ }
+ dlgStretch(1);
+ }
+ dlgHBoxLayout {
+ if (SignalUnrouted) {
+ dlgSpacing(8);
+ dlgLabel(displayUnrouted);
+ dlgStretch(1);
+ }
+ }
+ dlgLabel(wireWidthInternal);
+ }
+
+ dlgTabPage("POL&YGON") { // *** Polygon ***
+ int selp;
+ dlgHBoxLayout {
+ dlgListView("", statisticPolyw, Selected);
+ dlgListView("", statisticPoliso, Selected);
+ dlgSpacing(8);
+ dlgVBoxLayout {
+ dlgListView("Type\tName\tLayer\tRank\tWidth", PolygonLayer, Selected);
+ if (PolyWidthError) dlgLabel("" + PolygonError + "");
+ dlgLabel(wireWidthInternal);
+ }
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&SMD") { // *** Smd ***
+ dlgHBoxLayout {
+ dlgListView("", statisticSMD, Selected);
+ dlgStretch(2);
+ }
+ }
+
+ dlgTabPage("&PAD") { // *** Pad ***
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgListView("", statisticPADdiaTOP, Selected);
+ dlgListView("", statisticPADdiaBOT, Selected);
+ }
+ dlgVBoxLayout {
+ dlgListView("", statisticPADrestTOP, Selected);
+ dlgListView("", statisticPADrestBOT, Selected);
+ }
+ dlgListView("", statisticPADdiaI, Selected);
+ dlgListView("", statisticPADrestI, Selected);
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&VIA") { // *** Via ***
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgListView("", statisticVIAdia, Selected);
+ dlgListView("", statisticVIArest, Selected);
+ }
+ dlgVBoxLayout {
+ dlgListView("", statisticVIAdiaI, Selected);
+ dlgListView("", statisticVIArestI, Selected);
+ }
+ dlgListView("", statisticVIAstack, Selected);
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&DRILL/HOLE") { // *** Drill Hole ***
+ int plrSelected = -1;
+ int vlrSelected = -1;
+ int hlrSelected = -1;
+ int lrSelected = -1;
+ int vrSelected = -1;
+ int shSel = 0;
+ string StackHead = "RACK";
+ dlgHBoxLayout {
+ dlgListView("", statisticPADdril, plrSelected);
+ dlgListView("", statisticVIAdril, vlrSelected);
+ dlgListView("", statisticHOLE, hlrSelected);
+ dlgListView("", drillRack, lrSelected);
+ dlgSpacing(12);
+ dlgListView("Layer/Rack", ViaStack, vrSelected) {
+ StackHead = "RACK/"+ ViaStack[vrSelected] + "\tQ.";
+ showLayerRack(vrSelected); // + "\n" + StackDrills[rack]
+ }
+ dlgListView(StackHead, showStackDrills, shSel);
+ //dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&ELEMENT") { // *** Element ***
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgHBoxLayout {
+ dlgListView("", statisticLBR, LBRselected) {
+ art_selected = 1;
+ get_Info(art_selected, statisticLBR[LBRselected]);
+ dlgRedisplay();
+ }
+ dlgListView("", statisticPAC, PACselected) {
+ art_selected = 2;
+ get_Info(art_selected, statisticPAC[PACselected]);
+ dlgRedisplay();
+ }
+ }
+ dlgHBoxLayout {
+ dlgListView("", statisticValPacLay, VALselected) {
+ art_selected = 3;
+ get_Info(art_selected, statisticValPacLay[VALselected]);
+ dlgRedisplay();
+ }
+ }
+ }
+ dlgVBoxLayout {
+ dlgHBoxLayout dlgSpacing(250);
+ dlgLabel(linfo ,1);
+ dlgSpacing(10);
+ dlgTextView(Element_info);
+ }
+ dlgVBoxLayout {
+ //dlgListView("Electrical", EContact, ECselected); // 2009-12-02
+ dlgListView("Mech. Part\tPac.", EnoContact, MCselected);
+ }
+ }
+ dlgSpacing(8);
+ dlgLabel(statisticLocked); // 2007-12-19 alf@cadsoft.de
+ dlgSpacing(12);
+ dlgLabel("
" + checkSupplyLayerPolygon + "");
+ dlgHBoxLayout {
+ dlgPushButton("-&Quit") dlgAccept();
+ dlgPushButton("&Save report") {
+ string fileName = dlgFileSave("Select a file", filesetext(brdfile,".rep"), "*.rep");
+ if (fileName) {
+ output(fileName, "wt") {
+ printf("%s", saveReport());
+ }
+ }
+ }
+ dlgSpacing(50);
+ dlgLabel("All Units = " + unit[uval]);
+ dlgSpacing(50);
+ dlgStretch(1);
+ dlgLabel(Version);
+ }
+ dlgHBoxLayout {
+ dlgLabel("Database:");
+ dlgLabel(brdfile, 1);
+ dlgStretch(1);
+ }
+ };
+ exit (0);
+ }
+}
+
+else dlgMessageBox("Start this ULP from a Board", "OK");
+
diff --git a/eagle-5.7.0/ulp/statistic-lbr.ulp b/eagle-5.7.0/ulp/statistic-lbr.ulp
new file mode 100644
index 0000000..293773b
--- /dev/null
+++ b/eagle-5.7.0/ulp/statistic-lbr.ulp
@@ -0,0 +1,831 @@
+#usage "RUN Library statistics\n"
+ "
%3d Pin in symbol", S.name, countPIN(S) );
+ }
+ }
+ L.devicesets(DS) {
+ int cntinuse;
+ int new = 0;
+ DS.gates(G) {
+ if (G.symbol.name == symbolname[0]) {
+ if (newUsed(DS.name)) {
+ used[usedcount] = DS.name;
+ usedcount++;
+ used[usedcount] = "";
+ new++;
+ }
+ cntinuse++;
+ }
+ }
+ if (new) {
+ string h;
+ sprintf(h, "\t%d", cntinuse);
+ used[usedcount-1] += h;
+ }
+ }
+ }
+ used[usedcount] = "";
+ if (cntclearused < usedcount) cntclearused = usedcount;
+ return;
+}
+
+
+void pacinfo(string Name_and_count) {
+ string packname[];
+ int n = strsplit(packname, Name_and_count, '\t');
+ usedlabel = "" + packname[0]+".PAC";
+ used[0] = "used in Deviceset\tcnt";
+ int usedcount = 1;
+ used[usedcount] = "";
+ for (int u = 1; u < cntclearused; u++) used[u] = ""; // while error in dlgListView()
+ // clear all strings in array 03.05.2005 alf
+ library(L) {
+ L.packages(P) {
+ if (P.name == packname[0]) {
+ int pac_rect;
+ int pac_circle;
+ int pac_wire;
+ int pac_poly;
+ int pac_text;
+ P.rectangles(R) pac_rect++;
+ P.circles(C) pac_circle++;
+ P.wires(W) pac_wire++;
+ P.polygons(P) pac_poly++;
+ P.texts(T) pac_text++;
+ sprintf(PackInfo, "Rects = %d\nCircles = %d\nWires = %d\nPolygons = %d\nTexts = %d", pac_rect, pac_circle, pac_wire, pac_poly, pac_text);
+ dlgMessageBox(PackInfo, "OK");
+ sprintf(PackInfo, "%s
%3d Pad
%3d Smd
%3d Hole", P.name, countPAD(P), countSMD(P), countHOLE(P) );
+ }
+ }
+ L.devicesets(DS) {
+ int cntinuse;
+ int new = 0;
+ DS.devices(D) {
+ if (D.package) {
+ if (D.package.name == packname[0]) {
+ if (newUsed(DS.name)) {
+ used[usedcount] = DS.name;
+ usedcount++;
+ used[usedcount] = "";
+ new++;
+ }
+ cntinuse++;
+ }
+ }
+ }
+ if (new) {
+ string h;
+ sprintf(h, "\t%d", cntinuse);
+ used[usedcount-1] += h;
+ }
+ }
+ }
+ used[usedcount] = "";
+ if (cntclearused < usedcount) cntclearused = usedcount;
+ return;
+}
+
+
+void drillinfo(int Drill) {
+ sprintf(usedlabel, "Drill %.4f mm", u2mm(Drill));
+ used[0] = "used in Package\tcnt";
+ int usedcount = 1;
+ used[usedcount] = "";
+ for (int u = 1; u < cntclearused; u++) used[u] = ""; // while error in dlgListView()
+ // clear all strings in array 03.05.2005 alf
+ library(L) {
+ L.packages(P) {
+ int cntinuse;
+ int new = 0;
+ P.contacts(C) {
+ if (C.pad) {
+ if (C.pad.drill == Drill) {
+ if (newUsed(P.name)) {
+ used[usedcount] = P.name;
+ usedcount++;
+ used[usedcount] = "";
+ new++;
+ }
+ cntinuse++;
+ }
+ }
+ }
+ if (new) {
+ string h;
+ sprintf(h, "\t%d", cntinuse);
+ used[usedcount-1] += h;
+ }
+ }
+ }
+ used[usedcount] = "";
+ if (cntclearused < usedcount) cntclearused = usedcount;
+
+ return;
+}
+
+
+void collectLbr(UL_LIBRARY L) {
+ L.packages(P) {
+ status(P.name+".PAC");
+ src_pac[cntpac] = P.name ;
+ cntpac++;
+ src_pac[cntpac] = "";
+ P.contacts(C) {
+ if (C.pad) {
+ checkDrill(C.pad.drill);
+ }
+ }
+ }
+
+ status("");
+ L.symbols(S) {
+ src_sym[cntsym] = S.name ;
+ cntsym++;
+ src_sym[cntsym] = "";
+ }
+
+ L.devicesets(DS) {
+ src_dev[cntdev] = DS.name ;
+ checkprefix(DS.prefix);
+ DS.devices(D) {
+ checkVariant(D.name);
+ checkTechno(D.technologies);
+ if (D.package) {
+ checkUsedPac(D.package.name);
+ }
+ cnt_variant[cntdev]++;
+ }
+ cntdev++;
+ src_dev[cntdev] = "";
+ DS.gates(G) {
+ checkUsedSym(G.symbol.name);
+ }
+ }
+ return;
+}
+
+void sort_data(void) {
+ int n;
+ string s;
+ sort (cntdev, index_dev, src_dev, cnt_variant); // 2005.11.15 alf
+ sort (cntvar, index_var, src_var);
+ sort (cnttec, index_tec, src_tec);
+ sort (cntpref, index_pref, src_pref);
+ sort (cntpac, index_pac, src_pac, used_pac);
+ sort (cntsym, index_sym, src_sym, used_sym);
+ sort (cntdrills, index_dril, drills, cntdril);
+
+ for (n = 0; n < cntdev; n++) {
+ srt_dev[n] = src_dev[index_dev[n]];
+ }
+ for (n = 0; n < cntvar; n++) {
+ srt_var[n] = src_var[index_var[n]];
+ }
+ for (n = 0; n < cnttec; n++) {
+ srt_tec[n] = src_tec[index_tec[n]];
+ }
+ for (n = 0; n < cntpref; n++) {
+ srt_pref[n] = src_pref[index_pref[n]];
+ }
+ for (n = 0; n < cntpac; n++) {
+ if (used_pac[index_pac[n]]) sprintf(s, "\t%d", used_pac[index_pac[n]]);
+ else {
+ s = "\t -";
+ unUsed_pac[cntUnUsed_pac] = src_pac[index_pac[n]];
+ cntUnUsed_pac++;
+ }
+ srt_pac[n] = src_pac[index_pac[n]] + s;
+ }
+ for (n = 0; n < cntsym; n++) {
+ if (used_sym[index_sym[n]]) sprintf(s, "\t%d", used_sym[index_sym[n]]);
+ else {
+ s = "\t -";
+ unUsed_sym[cntUnUsed_sym] = src_sym[index_sym[n]];
+ cntUnUsed_sym++;
+ }
+ srt_sym[n] = src_sym[index_sym[n]] + s;
+ }
+ for (n = 0; n < cntdrills; n++) {
+ sprintf(srt_drills[n], "%.4f\t%d", u2mm(drills[index_dril[n]]), cntdril[index_dril[n]]);
+ }
+ return;
+}
+
+
+// 2006.09.19 check used user layer
+string check_userlayer(string ulay) {
+ string use_user_layer = "";
+ int l = strtol(ulay);
+ library(L) {
+ L.packages(PAC) {
+ status(" check "+PAC.name+".PAC");
+ int use = 0;
+ PAC.wires(W) if (W.layer == l) { use++; break; }
+ PAC.circles(C) if (C.layer == l) { use++; break; }
+ PAC.rectangles(R) if (R.layer == l) { use++; break; }
+ PAC.polygons(P) if (P.layer == l) { use++; break; }
+ PAC.texts(T) if (T.layer == l) { use++; break; }
+ if (use) use_user_layer += PAC.name + ".PAC\n";
+ }
+ L.symbols(S) {
+ status(" check "+S.name+".SYM");
+ int use = 0;
+ S.wires(W) if (W.layer == l) { use++; break; }
+ S.circles(C) if (C.layer == l) { use++; break; }
+ S.rectangles(R) if (R.layer == l) { use++; break; }
+ S.polygons(P) if (P.layer == l) { use++; break; }
+ S.texts(T) if (T.layer == l) { use++; break; }
+ if (use) use_user_layer += S.name + ".SYM\n";
+ }
+ status("");
+ }
+ return use_user_layer;
+}
+
+
+void exit_edit(string text, string ulay) {
+ string s[], l[];
+ int n = strsplit(s, text, '\n');
+ int u = strsplit(l, ulay, ' ');
+ exit("EDIT "+s[0]+";\nLAYER "+l[0]+";");
+}
+
+void check_used(string ulay) {
+ string use_user_layer = check_userlayer(ulay);
+ if (use_user_layer) {
+ dlgDialog("Statistic") {
+ dlgLabel("Use layer " + ulay);
+ dlgTextView(use_user_layer);
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgPushButton("Edit") { dlgAccept(); exit_edit(use_user_layer, ulay); }
+ dlgStretch(1);
+ }
+ };
+ }
+ else if (dlgMessageBox(ulay + "\nthis layer is not used!", "OK", "Delete") != 0) {
+ string cmd;
+ sprintf(cmd, "LAYER -%d;\nRUN '%s'\n", strtol(ulay), argv[0]);
+ exit(cmd);
+ }
+ return;
+}
+
+
+// 2006.09.19 delete unused user layer
+void del_unused_userlayer(void) {
+ string cmd;
+ for (int n = 0; n < cnt_user_layers; n++) {
+ if (!check_userlayer(user_layers[n])) {
+ string s;
+ sprintf(s, "LAYER -%d;\n", strtol(user_layers[n]) );
+ cmd += s;
+ }
+ }
+ if (cmd) exit(cmd+"RUN '"+argv[0]+"';");
+ return;
+}
+
+
+void menue_1(void) {
+ int seldev = 0;
+ int seltec = 0;
+ int selvar = 0;
+ int selpref = 0;
+ int selsym = -1;
+ int selpac = -1;
+ int seldril = -1;
+ int selused = 0;
+
+ string ndev, nvar, ntec, npac, nsym, ndril, cupac, cusym, culay, npref;
+ string usedVariants = " select Device";
+ sprintf(ndev, "%3d", cntdev);
+ sprintf(nvar, "%3d", cntvar);
+ sprintf(ntec, "%3d", cnttec);
+ sprintf(npac, "%3d", cntpac);
+ sprintf(nsym, "%3d", cntsym);
+ sprintf(npref, "%3d", cntpref);
+ sprintf(ndril, "%3d", cntdrills);
+ sprintf(cupac, "%3d", cntUnUsed_pac);
+ sprintf(cusym, "%3d", cntUnUsed_sym);
+ sprintf(culay, "%3d", cnt_user_layers); // 2006.09.19
+ int listsort = 0;
+ int sellay, selulay;
+
+ int Result = dlgDialog("Library statistic") {
+ dlgHBoxLayout {
+ dlgVBoxLayout dlgSpacing(400);
+ dlgGridLayout {
+ dlgCell( 0,1) dlgSpacing(200);
+ dlgCell( 0,2) dlgSpacing(100);
+
+ dlgCell( 1,0) { dlgLabel(ndev); dlgLabel("&Devices"); }
+ dlgCell( 1,1) dlgComboBox(srt_dev, seldev) {
+ sprintf(usedVariants, "%d Variant ", cnt_variant[seldev]);
+ usedlabel = "Devicesets ";
+ used[0] = "Deviceset";
+ used[1] = srt_dev[seldev];
+ used[2] = "";
+ edittype = ".DEV";
+ }
+ dlgCell( 1,2) dlgLabel(usedVariants, 1);
+
+ dlgCell( 2,0) { dlgLabel(nvar); dlgLabel("&Variants"); }
+ dlgCell( 2,1) dlgComboBox(srt_var, selvar) { VarInfo(srt_var[selvar]); edittype = ".DEV"; }
+
+ dlgCell( 3,0) { dlgLabel(ntec); dlgLabel("&Technoligies"); }
+ dlgCell( 3,1) dlgComboBox(srt_tec, seltec) { TecInfo(srt_tec[seltec]); edittype = ".DEV"; }
+
+ dlgCell( 4,0) { dlgLabel(npref); dlgLabel("&Prefix"); }
+ dlgCell( 4,1) dlgComboBox(srt_pref, selpref) { PrefInfo(srt_pref[selpref]); edittype = ".DEV"; }
+
+ dlgCell( 5,0) dlgLabel("&Used Layers");
+ dlgCell( 5,1) dlgComboBox(used_layers, sellay);
+
+ if (cnt_deflayer) {
+ dlgCell( 6,1) dlgLabel("+ defined layer");
+ dlgCell( 7,0) dlgLabel("&+defined Layers");
+ dlgCell( 7,1) dlgComboBox(defined_layers, sellay);
+ }
+
+
+ if (cnt_user_layers) {
+ dlgCell( 8,1) dlgLabel("Layer user defined");
+ dlgCell( 9,1) dlgComboBox(user_layers, selulay) check_used(user_layers[selulay]);
+ dlgCell( 9,2) if (user_layers[0]) { dlgLabel(culay); dlgPushButton("DELETE") del_unused_userlayer(); } // 2006.09.19
+ }
+
+ dlgCell( 10,1) dlgVBoxLayout {
+ dlgLabel(usedlabel, 1);
+ dlgListView("", used, selused, listsort);
+ }
+ dlgCell( 10,2) dlgVBoxLayout {
+ dlgSpacing(18);
+ dlgHBoxLayout {
+ dlgPushButton("EDIT") {
+ string e[]; int n = strsplit(e, used[selused], '\t');
+ if(selused) { dlgAccept(); exit("EDIT '"+e[0]+edittype+"'"); }
+ else {
+ if (!used[1]) dlgMessageBox("!List is empty.\nSelect a Device, Variant, Technology, Symbol or Package.", "OK");
+ else if (selused < 1) {
+ if (edittype == ".DEV") dlgMessageBox("Select a Device", "OK");
+ if (edittype == ".PAC") dlgMessageBox("Select a Package", "OK");
+ }
+ }
+ }
+ dlgStretch(1);
+ }
+ dlgStretch(1);
+ }
+
+ dlgCell( 11,0) { dlgLabel(cupac); dlgLabel("Unused &Package"); }
+ dlgCell( 11,1) dlgComboBox(unUsed_pac, up);
+ dlgCell( 11,2) dlgHBoxLayout {
+ if (cntUnUsed_pac) { dlgPushButton("DELETE") del_unused_pac(); } // 2006.05.09
+ dlgStretch(1);
+ }
+
+ dlgCell( 12,0) { dlgLabel(cusym); dlgLabel("Unused &Symbol"); }
+ dlgCell( 12,1) dlgComboBox(unUsed_sym, us);
+ dlgCell( 12,2) dlgHBoxLayout {
+ if (cntUnUsed_sym) { dlgPushButton("DELETE") del_unused_sym(); } // 2006.05.09
+ dlgStretch(1);
+ }
+ }
+ dlgVBoxLayout {
+ dlgLabel("S&ymbols " + nsym);
+ dlgListView("Symbol\tUsed", srt_sym, selsym) {
+ syminfo(srt_sym[selsym]);
+ selpac = -1;
+ seldril = -1;
+ edittype = ".DEV";
+ }
+ dlgLabel(SymbolInfo, 1);
+ dlgPushButton("EDIT .sym") {
+ if(selsym >= 0) {
+ dlgAccept();
+ edittype = ".SYM";
+ string e[]; int n = strsplit(e, srt_sym[selsym], '\t');
+ exit("EDIT '"+e[0]+edittype+"'");
+ }
+ else dlgMessageBox("First select a Symbol", "OK");
+ }
+ }
+ dlgVBoxLayout {
+ dlgLabel("P&ackages " + npac);
+ dlgListView("Package\tUsed", srt_pac, selpac) {
+ pacinfo(srt_pac[selpac]);
+ selsym = -1;
+ seldril = -1;
+ edittype = ".DEV";
+ }
+ dlgLabel(PackInfo, 1);
+ dlgPushButton("EDIT .pac") {
+ if(selpac >= 0) {
+ dlgAccept();
+ edittype = ".PAC";
+ string e[]; int n = strsplit(e, srt_pac[selpac], '\t');
+ exit("EDIT '"+e[0]+edittype+"'");
+ }
+ else dlgMessageBox("First select a Package", "OK");
+ }
+ }
+ dlgVBoxLayout {
+ dlgLabel("D&rills " + ndril);
+ dlgListView("Drill mm\tUsed", srt_drills, seldril) {
+ drillinfo(drills[index_dril[seldril]]);
+ selsym = -1;
+ selpac = -1;
+ edittype = ".PAC";
+ }
+ }
+ dlgVBoxLayout dlgSpacing(300);
+ }
+
+ dlgSpacing(12);
+ dlgHBoxLayout {
+ dlgPushButton("+OK") dlgAccept();
+ dlgStretch(1);
+ }
+ };
+ return ;
+}
+
+
+// main
+if (library) library(L) {
+ status("Layers");
+ L.layers(LAY) {
+ if (LAY.used) {
+ sprintf(used_layers[cnt_used_layers], "%d %s", LAY.number, LAY.name);
+ cnt_used_layers++;
+ }
+ if (LAY.number >= 100) {
+ sprintf(user_layers[cnt_user_layers], "%d %s", LAY.number, LAY.name);
+ cnt_user_layers++;
+ }
+ if (LAY.number == 50 || LAY.number > 52 && LAY.number < 91 || LAY.number > 96 ) {
+ sprintf(defined_layers[cnt_deflayer], "%d %s", LAY.number, LAY.name);
+ cnt_deflayer++;
+ }
+ }
+ collectLbr(L);
+ sort_data();
+ menue_1();
+}
+
diff --git a/eagle-5.7.0/ulp/statistic-sch.ulp b/eagle-5.7.0/ulp/statistic-sch.ulp
new file mode 100644
index 0000000..4e8ead9
--- /dev/null
+++ b/eagle-5.7.0/ulp/statistic-sch.ulp
@@ -0,0 +1,770 @@
+#usage "
");
+ dlgLabel(usedLayer);
+ dlgLabel(displayLayerError);
+ dlgStretch(1);
+ }
+ }
+ dlgStretch(1);
+ }
+
+ dlgTabPage("&LAYER") { // *** all Layer are defined ***
+ int layselect = 0;
+ dlgHBoxLayout {
+ dlgListView("Nb.:\tName\tUsed", allLayers, layselect ); // 2005.11.17 alf@cadsoft.de
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&CLASS (Signal)") { // *** Class clearance/isolate ***
+ string classlabel = "Class : " + NetClassName[0];
+ string ClassNameL = NetClassLabel(NetClassName[NetClassSelect] , cNetClass[NetClassSelect]);
+ string NetList = NetClassList[NetClassSelect];
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgListView("", statisticCLASS, NetClassSelect) { NetList = NetClassList[NetClassSelect-1]; classlabel = "Class : " + NetClassName[NetClassSelect-1]; }
+ dlgSpacing(12);
+ dlgLabel("False Nets (not connected on a PIN)");
+ dlgListView("", statisticFalseNets, NetClassSelect);
+ }
+ dlgSpacing(12);
+ dlgGroup("Netlist") {
+ dlgLabel(classlabel, 1);
+ dlgHBoxLayout {
+ dlgSpacing(4);
+ dlgTextView(NetList);
+ }
+ }
+ dlgStretch(1);
+ }
+ }
+
+ dlgTabPage("&Device") { // *** Device ***
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgHBoxLayout {
+ dlgListView("", statisticLBR, LBRselected) {
+ art_selected = 1;
+ get_Info(art_selected, statisticLBR[LBRselected]);
+ dlgRedisplay();
+ }
+ dlgListView("", statisticPAC, PACselected) {
+ art_selected = 2;
+ get_Info(art_selected, statisticPAC[PACselected]);
+ dlgRedisplay();
+ }
+ dlgListView("", statisticDevice, DEVselected) {
+ art_selected = 3;
+ get_Info(art_selected, statisticDevice[DEVselected]);
+ dlgRedisplay();
+ }
+ }
+ }
+ dlgVBoxLayout {
+ dlgHBoxLayout { dlgLabel(linfo ,1); dlgSpacing(200); }
+ dlgSpacing(10);
+ dlgTextView(Part_info);
+ }
+ }
+ }
+
+ dlgTabPage("&Part") { // *** Part ***
+ int Gselect;
+ dlgHBoxLayout {
+ dlgVBoxLayout {
+ dlgLabel(" ");
+ dlgListView(" Part\tGate\tSheet\tLibrary", InstanceGate, Gselect);
+ }
+ dlgSpacing(19);
+ dlgVBoxLayout {
+ dlgLabel("
"
+ "RUN trace-layer -
"
+ "Layers 17 Pad, 18 Via, 19 Unrouted, 23 tOrigin and 24 bOrigin are not separated displayed"
+
+// Version 1.0 - 2007.06.06 support@cadsoft.de
+
+int supplyLayer[];
+int usedLayer[];
+int mLayer = 0;
+int lastUsed;
+string cmd;
+string message = "";
+
+string layerFile = filesetext(argv[0], ".trl");
+string f[];
+int isFile = fileglob(f, layerFile);
+
+void checkLayer(void) {
+ if (argv[1] == "+") {
+ if (mLayer == 23 || mLayer == 24) mLayer = 25;
+ if (mLayer == 17 || mLayer == 18 || mLayer == 19) mLayer = 20;
+ lastUsed = mLayer;
+ }
+ if (argv[1] == "-") {
+ if (mLayer == 23 || mLayer == 24) mLayer = 22;
+ if (mLayer == 17 || mLayer == 18 || mLayer == 19) mLayer = 16;
+ lastUsed = mLayer;
+ }
+ return;
+}
+
+if (isFile) {
+ string rLayer;
+ int n = fileread(rLayer, layerFile);
+ mLayer = strtol(rLayer);
+}
+
+
+if (argv[1] == "-") {
+ mLayer --;
+ if (board) {
+ if (mLayer < 1) {
+ if (!mLayer) message = "The first layer.";
+ mLayer = 1;
+ }
+ }
+ else if (schematic) {
+ if (mLayer < 91) mLayer = 91;
+ }
+}
+
+if (argv[1] == "+") {
+ mLayer ++;
+ if (mLayer >255) {
+ mLayer = 255;
+ if (!mLayer) message = "The last layer.";
+ }
+}
+
+
+checkLayer();
+if (board) {
+ board(B) {
+ B.layers(L) {
+ if (L.used) {
+ usedLayer[L.number] = 1;
+ }
+ string ln = L.name;
+ if (ln[0] == '$') {
+ usedLayer[L.number] = 1;
+ supplyLayer[L.number] = 1;
+ }
+ }
+ if (argv[1] == "+") {
+ if (!usedLayer[mLayer]) {
+ do {
+ mLayer++;
+ if (usedLayer[mLayer]) break;
+ } while (mLayer < 256);
+ if (mLayer >= 255) message = "The last Layer.";
+ }
+ }
+ if (argv[1] == "-") {
+ if (!usedLayer[mLayer]) {
+ do {
+ mLayer--;
+ if (usedLayer[mLayer]) break;
+ } while (mLayer > 1);
+ }
+ }
+
+ checkLayer();
+ if (usedLayer[mLayer]) {
+ if (mLayer < 17) {
+ if (supplyLayer[mLayer]) {
+ sprintf(cmd, "DISPLAY NONE %d;\n", mLayer);
+ message ="ATTENTION this is a Supply layer, do not use this Layer in CAM-Job with Pad- and/or Via-Layer.";
+ }
+ else {
+ sprintf(cmd, "DISPLAY NONE %d 17 18;\n", mLayer);
+ }
+ }
+ else {
+ sprintf(cmd, "DISPLAY NONE %d;\n", mLayer);
+ }
+ lastUsed = mLayer;
+ }
+ }
+}
+checkLayer();
+if (lastUsed) {
+ output(layerFile, "wtD") {
+ printf("%d", lastUsed);
+ }
+}
+if (message) {
+ string s;
+ sprintf(s, "RUN ulpmessage '%s';\n", message);
+ cmd += s;
+}
+exit (cmd);
\ No newline at end of file
diff --git a/eagle-5.7.0/ulp/ulpmessage.ulp b/eagle-5.7.0/ulp/ulpmessage.ulp
new file mode 100644
index 0000000..15b7177
--- /dev/null
+++ b/eagle-5.7.0/ulp/ulpmessage.ulp
@@ -0,0 +1,10 @@
+#usage "Display a popup message\n"
+ "
" + argv[2] + "