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 + + + + + +
EAGLE Help Version 5.7.0 +Copyright © 2010 CadSoft Computer GmbH +
+ +

Index

+ + + + +

Erklärung der Hilfe-Funktion

+Ist in einem
Layout-Editor-, +Schaltplan-Editor-, oder +Bibliotheks-Editor-Fenster ein Befehl +aktiviert, dann wird nach Drücken der F1-Taste oder Eintippen von +HELP die Hilfe-Seite für diesen Befehl aufgerufen. +

+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. +

+ + + +

EAGLE konfigurieren

+Die folgenden Editor-Befehle können dazu verwendet werden, EAGLE individuell +anzupassen. Sie können entweder direkt von der Kommandozeile eines +Editor-Fensters eingegeben werden oder man kann Sie in die Datei +
eagle.scr eintragen. +

+Für die Befehle ASSIGN und SET exisitieren auch Dialoge, die über das +Options-Menü der Editor-Fenster aufgerufen werden. +

Benutzer-Interface

+ + + + + + + + + + + + + + + + + +
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;
+

Bildschirmdarstellung

+ + + + + + + + + + + + + +
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;
+

Mode-Parameter

+ + + + + + + + +
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;
+

Voreinstellungen

+ + + + + + + + + + + + + + + +
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;
+ + + +

Kommandozeilen-Optionen

+EAGLE kann mit Kommandozeilen-Optionen aufgerufen werden. Dazu ist +folgendes Format erforderlich: +
+eagle [ Optionen [ Dateiname [ Layer ] ] ]
+
+

Optionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-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
+

Toleranzen definieren

+Ohne '+'- oder '-'-Zeichen gilt eine Toleranzangabe für beide Richtungen: + + + +
-D0.10 stellt Draw-Toleranz auf ±10% ein
-D+0.1 -D-0.05 stellt Draw-Toleranz auf +10% und -5% ein
+

Befehle Ausführen

+Wird ein Befehl über die Option '-C' angegeben, wie etwa +
+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': +

+Um EAGLE zu starten ohne automatisch die Datei eagle.scr auszuführen oder +ein Projekt zu laden, kann der Befehl auch leer sein: +
+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. +

Dateiname

+Falls der angegebene Dateiname eagle.epf ist (evtl. mit vorangestelltem +Verzeichnisnamen), so lädt EAGLE diese Projekt-Datei. Ansonsten wird, falls keine +Dateinamenserweiterung angegeben ist, .brd als Default verwendet. + + +
+

Schnelle Einführung

+Um schnell mit EAGLE zurechtzukommen, sollten Sie mehr über folgende Themen +wissen: +
+Bei Problemen wenden Sie sich bitte an unseren +kostenlosen Technischen Support. + + + +

Control Panel und Editor-Fenster

+Vom
Control Panel aus können Sie über das Datei-Menü +oder durch Anklicken eines Icons die Fenster des Schaltplan-, Layout- +und Bibliotheks-Editors öffnen. + + + +

Eingabe von Parametern und Werten

+Parameter und Werte können über die EAGLE-Kommandozeile oder, +wesentlich bequemer, über die Parameter-Toolbar eingegeben werden, die +erscheint, wenn ein Befehl aktiviert ist. Da dies keiner großen +Erklärung bedarf, wird an anderen Stellen im Hilfe-Text nicht explizit +darauf hingewiesen. +

+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. +

Symbole plazieren

+Bibliotheken mit USE laden und Symbole plazieren (siehe ADD, MOVE, +DELETE, ROTATE, NAME, VALUE). Fehlt ein bestimmtes Bauelement, dann +mit Bibliotheks-Editor definieren. +

Busse einzeichnen

+Busse mit BUS einzeichnen. Geben Sie den Bussen Namen (NAME), aus denen +hervorgeht, welche Signale sich herausführen lassen. +

Netze einzeichnen

+Die Verbindungen zwischen den Pins der Elemente definiert man +mit NET. Dargestellt werden Netze im Net-Layer. Mit dem +Befehl JUNCTION kennzeichnet man Verbindungen sich kreuzender Netze. + + + +

Schaltplan überprüfen

+Electrical Rule Check (
ERC) durchführen und anhand der Meldungen +Fehler korrigieren. Eventuell Netz- und Pin-Liste ausgeben (EXPORT). +Mit dem SHOW-Befehl Netze am Bildschirm verfolgen. + + + +

Platine aus Schaltplan erzeugen

+Mit dem
BOARD-Befehl bzw. durch Anklicken des Board-Icons +erzeugen Sie eine Platine aus dem geladenen Schaltplan (falls noch +keine Platine mit demselben Namen existiert). +

+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. +

Platinenumrisse und Plazierung festlegen

+Gegebenenfalls die Leerplatine in Größe und Form verändern (MOVE, +SPLIT). Elemente an gewünschte Position verschieben (MOVE) und +überprüfen, ob die Plazierung günstig oder ungünstig ist (RATSNEST). +

Sperrflächen definieren

+Falls gewünscht, zeichnet man Sperrflächen für den Autorouter als +Rechtecke, Polygone oder Kreise in die Layer tRestrict, bRestrict und +vRestrict (siehe RECT, POLYGON, CIRCLE). Für den Autorouter begrenzen +auch geschlossene Wire-Züge im Dimension-Layer die Route-Fläche. +

Routen

+Mit dem ROUTE-Befehl lassen sich jetzt die Luftlinien in Leitungen +umwandeln. Diese Aufgabe kann man auch dem Autorouter (siehe Befehl +AUTO) zuweisen. + + + +

Layout überprüfen

+Design Rule Check (
DRC) durchführen und Fehler korrigieren (ERRORS). +Eventuell Netz-, Bauteile- und Pin-Liste ausgeben (EXPORT). + + + +

Bauelement in Bibliothek definieren

+Die Definition eines Bauelements erfordert drei Schritte, die +aufeinander aufbauen. +

+Öffnen Sie eine Bibliothek mit Öffnen oder Neu im Datei-Menü. +

Package definieren

+Packages sind die Gehäuse der Bauelemente, die im Board dargestellt +werden. +

+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. +

Symbol definieren

+Symbole sind der Teil eines Devices, das im Schaltplan dargestellt wird. +

+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. +

Device definieren

+Ein Device enthält die Definition eines gesamten Bauelements +einschließlich Gehäuse und Schaltplan-Symbol(e). +

+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. +

Kontext-Menü

+Das Kontext-Menü eines Eintrags in der Baumstruktur +erreichen Sie mit einem rechten Mausklick auf den entsprechenden Eintrag. Es enthält +dann spezielle Punkte zu diesem Eintrag. +

Beschreibungen

+Die Beschreibung-Spalte der Baumansicht enthält eine Kurzbeschreibung des Eintrags +(wenn vorhanden). Diese Beschreibungen werden aus der ersten nicht leeren Textzeile der +folgenden Quellen erzeugt: +

+ + + + + + + + + +
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-ProgrammeText, durch die #usage-Anweisung gekennzeichnet
Script-Dateien Der Kommentar am Anfang der Script-Datei
CAM-Jobs DESCRIPTION-Befehl im CAM-Prozessor-Job
+

Drag&Drop

+Sie können mit Hilfe von Drag&Drop Dateien und Verzeichnisse innerhalb der +Baumstruktur kopieren oder bewegen. Es ist auch möglich, ein Device oder ein Package +in das Schaltplan-, Layout- bzw. Library-Fenster zu ziehen und dort zu plazieren. +Zieht man User-Language-Programme und Script-Dateien auf ein Editor-Fenster, werden sie +darin ausgeführt. Design Rules werden einem Layout zugeordnet, wenn Sie einen entsprechenden +Eintrag in das Layout-Editor-Fenster ziehen. +Ziehen Sie eine Board-, Schaltplan- oder Library-Datei auf das jeweilige Editor-Fenster, +so wird die Datei in den Editor geladen. +All diese Funktionen erreichen Sie auch über das Kontext-Menü des entsprechenden Eintrags +in der Baumstruktur. +

Informations-Fenster

+In der rechten Hälfte des Control Panels werden Informationen zum selektierten +Punkt in der Baumstruktur angezeigt. Diese Informationen werden aus den Quellen +erzeugt, die unter Beschreibungen angegeben sind. Bei Device und Package +erhält man eine Voransicht des Elements. +

Menü-Leiste

+Die Menü-Leiste des Control Panels enthält folgende Punkte: +

Datei

+ + + + + + + +
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ßenSchließt das aktuelle Projekt
Beenden Beendet das Programm
+

Ansicht

+ + + +
AktualisierenAktualisiert den Inhalt der Baumansicht
Sortieren Ändert die Sortierung der Baumansicht
+

Optionen

+ + + + + +
Verzeichnisse... Öffnet den Verzeichnis-Dialog
Sicherung... Öffnet den Sicherungs-Dialog
Benutzeroberfläche... Öffnet den Benutzeroberfläche-Dialog
Fensterpositionen... Öffnet den Fensterpositionen-Dialog
+

Fenster

+ + + + +
Control Panel Zum Control Panel wechseln
1 Schaltplan - ... Zu Fenster 1 wechseln
2 Board - ... Zu Fenster 2 wechseln
+

Hilfe

+ + + + + + + +
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
+

Statuszeile

+Die Statuszeile unten im Control Panel enthält +den vollständigen Namen des gegenwärtig selektierten Objektes. + + + +

Kontext-Menüs

+Ein Klick mit der rechten Maustaste auf ein Objekt des +
Control Panels öffnet ein Kontext-Menü das +folgende Aktionen ermöglicht (nicht alle davon sind für alle Objekte zutreffend): +

Neuer Ordner

+Erzeugt ein neues Verzeichnis unterhalb des selektierten Ordners und schaltet den +neu erzeugten Zweig der Baumansicht in den Umbenennen-Modus, so dass der +gewünschte Name vergeben werden kann. +

Beschreibung editieren

+Lädt die DESCRIPTION-Datei in den HTML-Editor. +

Umbenennen

+Schaltet den Eintrag der Baumansicht in den Editier-Modus, so dass er umbenannt +werden kann. +

Kopieren

+Öffnet einen Datei-Dialog in dem Sie den neuen Namen der zu kopierenden Datei bzw. des +Verzeichnisses angeben. Dateien oder Verzeichnisse kann man auch mit Hilfe von +Drag&Drop kopieren. +

Löschen

+Löscht die Datei oder das Verzeichnis. Sie werden vor dem Löschen gefragt, ob +wirklich gelöscht werden soll. +

Use

+Ist eine Bibliothek als in use markiert, werden die Devices und Packages darin +von der Suchfunktion berücksichtigt. Sie können auch durch einen Mausklick auf den Marker +in der zweiten Spalte der Baumansicht die Bibliothek freigeben oder nicht. +

Alle Bibliotheken laden

+Alle Bibliotheken im Bibliothekspfad werden bei der Suche nach Devices und Packages +berücksichtigt, d. h. alle Bibliotheken sind in use. +

Keine Bibliothek laden

+Keine der Bibliotheken ist in use (einschließlich der Bibliotheken, die nicht im Bibliothekspfad stehen). +

Update

+Tauscht alle Bauteile des geladenen Schaltplans oder Layouts, die aus dieser Bibliothek genommen wurden gegen die +aktuelle Bauteile-Definition aus. +

Update in Bibliothek

+Tauscht alle in der geladenen Bibliothek verwendeten Gehäusedefinitionen gegen den aktuellen Stand aus dieser +Bibliothek aus. +

In Schaltplan einfügen

+Startet den ADD-Befehl im Schaltplan-Editor für dieses Device. +Das ist auch über Drag&Drop möglich. +

In Platine einfügen

+Startet den ADD-Befehl im Layout-Editor für dieses Package. +Das ist auch über Drag&Drop möglich. +

In Bibliothek kopieren

+Kopiert das selektierte Device-Set oder Package in die geladene Bibliothek. +Das ist auch über Drag&Drop möglich. +

Neue Variante in der Bibliothek

+Erzeugt eine neue Package-Variante mit dem selektierten Package im aktuellen +Device-Set der geladenen Bibliothek. +Das ist auch über Drag&Drop möglich. +

Projekt öffnen/schließen

+Öffnet oder schließt ein Projekt. +Dazu können Sie auch auf den Marker rechts vom Projekt-Eintrag in der Baumansicht klicken. +

Neu

+Öffnet ein Fenster mit der neuen Datei des entsprechenden Typs. +

Öffnen

+Öffnet ein Editor-Fenster mit dieser Datei. +Das ist auch mit über Drag&Drop möglich. +

Drucken...

+Druckt die Datei auf dem System-Drucker aus. +Weitere Informationen zur Benutzung der Druck-Dialoge entnehmen Sie +bitte dem Kapitel Drucken auf dem System-Drucker. +

+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. +

Im ... ausführen

+Startet das gewählte User-Language-Programm bzw. Script im aktuellen Schaltplan, Board oder in der +Bibliothek. +Das ist auch über Drag&Drop möglich. +

Im Board laden

+Lädt diesen Satz von Design Rules für das aktuelle Board. +Das ist auch überDrag&Drop möglich. + + + +

Verzeichnisse

+Mit dem Verzeichnisse-Dialog definiert man die Pfade, in denen nach +Dateien gesucht werden soll. +

+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. +
+Wird einer der Befehle
OPEN, +USE, SCRIPT oder +RUN eingegeben, dann werden diese Pfade durchsucht, +mit Priorität von links nach rechts. +Wird der Datei-Dialog benutzt um eine Datei eines dieser Typen anzusprechen, so wird +das Verzeichnis, in das der Anwender mittels des Datei-Dialogs navigiert hat, implizit +an das Ende des jeweiligen Pfades angehängt. +

+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. +
+ + + +

Datensicherung

+Der Datensicherung-Dialog ermöglicht es Ihnen, den +automatischen Backup individuell +einzustellen. +

Max. Anzahl der Sicherungskopien

+Definiert wie viele Backup-Kopien Ihrer EAGLE-Dateien "aufgehoben" +werden wenn eine Datei normal mit dem WRITE-Befehl abgespeichert wird (Default: 9). +

Intervall f. automat. Sicherung (Minuten)

+Bestimmt das Zeitintervall nachdem EAGLE automatisch eine Sicherungskopie aller +modifizierten Zeichnungsdateien erzeugt (default ist 5 min.). +

Projektdatei automatisch sichern

+Ist diese Option gewählt, werden Ihre Projekteinstellungen automatisch gesichert, wenn +Sie das Programm verlassen. +Bitte beachten Sie, dass das momentan geöffnete Projekt nicht abgespeichert wird, +wenn Sie diese Option ausschalten, was zur Folge hat, dass die Einstellung nicht +nicht in der eagle.epf-Datei des Projekts gespeichert wird. Daher ist diese +Option wieder eingeschaltet, wenn Sie das Projekt das nächste Mal öffnen. +Wenn Sie wollen, dass diese Option für das aktuelle Projekt ausgeschaltet +bleibt, müssen Sie manuell "Datei/Alles speichern" aus dem Pulldown-Menü +wählen, nachdem Sie die Option ausgeschaltet haben. + + + +

Benutzeroberfläche

+Der Benutzeroberfläche-Dialog ermöglicht es, das Erscheinungsbild der +
Editor-Fenster für Layout, Schaltplan +und Bibliothek den eigenen Vorstellungen anzupassen. +

Symbolleisten und Menüs

+ + + + + + + +
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
+

Layout

+ + + +
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
+

Schaltplan

+ + + +
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
+

Hilfe

+ + + +
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
+

Misc

+ + + +
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)
+ + + +

Fensterpositionen

+Der Fensterpositionen-Dialog ermöglicht es, die Positionen aller momentan +geöffneten Fenster abzuspeichern, so dass später, wenn ein Fenster des gleichen Typs +erneut geöffnet wird, dieses an der gleichen Stelle wie zuvor erscheint. +

+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. + + + +

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. +

+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 +

+hostname:port
+
+ein, wobei hostname der volle Name des Proxy-Rechners ist, ohne etwaigen +http://-Präfix, und port eine optionale Port-Nummer. +

+Falls Sie auch über Betaversionen von EAGLE informiert werden möchten, so +können sie die Option "Auch auf Betaversionen prüfen" einschalten. + + + +

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. +

+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. +

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. +
+

Shift

+Wird die Shift-Taste zusammen mit der rechten Maustaste gedrückt so wird +die Richtung des Weiterschaltens des Knickwinkels umgekehrt (dies betrifft nur +Befehle die Wire-Knickwinkel unterstützen, wie etwa WIRE). +

+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. +

Esc

+Wird bei einem aktiven Befehl die Esc-Taste gedrückt, so wird die +aktuelle Aktion dieses Befehls beendet, ohne dass der gesamte Befehl +abgebrochen wird (falls die Kommandozeile Text enthält so wird dieser zuerst +gelöscht und der nächste Druck auf die Esc-Taste wirkt auf den Befehl). +Für den MOVE-Befehl zum Beispiel bedeutet dies, dass ein am Mauszeiger +befindliches Objekt "fallengelassen" wird und ein anderes Objekt +selektiert werden kann. +

Crsr-Up/Down

+Die Tasten Crsr-Up (Pfeil nach oben) bzw. Crsr-Down +(Pfeil nach unten) erlauben es in der Kommandozeile des Editor-Fensters +früher eingegeben Befehlszeilen wieder herzuholen ("History-Funktion"). +

Funktionstasten

+Beliebige Kommandos können mit dem ASSIGN-Befehl auf +Funktionstasten gelegt werden. +

Linke Maustaste

+Die linke Maustaste dient generell zum Selektieren, Zeichnen und Plazieren von +Objekten. +

Mittlere Maustaste

+Die mittlere Maustaste wechselt den aktuellen Layer oder spiegelt das am Mauszeiger +hängende Objekt. +

+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. +

Rechte Maustaste

+Die rechte Maustaste wird im Wesentlichen dazu verwendet, eine Gruppe zu selektieren, +am Mauszeiger hängende Objekte zu rotieren, den Wire-Knickwinkel zu ändern sowie für +einige andere, befehlsspezifische Funktionen. +

+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
+

Maus-Rädchen

+Innerhalb eines Editor-Fensters kann mit dem Maus-Rädchen die Zoomstufe verändert +werden. + + + +

Benachbarte Objekte selektieren

+Wenn Sie an einer Stelle ein Objekt selektieren wollen, an der mehrere +Objekte eng beieinander liegen, nimmt der Mauszeiger die Form eines +Vierfach-Pfeils an, und es erscheint die Frage +

+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. + + + + +

Bibliotheks-Editor

+Der Bibliotheks-Editor dient dazu, Bauelemente-Bibliotheken +(*.lbr) zu editieren. +

+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. + + + +

Bibliotheks-Editier-Modus

+Im Bibliotheks-Editier-Modus können Sie Packages, Symbole und Devices +editieren. +

+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ü. + + + +

Layout-Editor

+Der Layout-Editor dient dazu, Layouts (*.brd) zu editieren. +

+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. + + + +

Schaltplan-Editor

+Der Schaltplan-Editor dient dazu, Schaltpläne (*.sch) +zu editieren. +

+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. + + + +

Text-Editor

+Der Text-Editor dient dazu, Textdateien zu editieren. +

+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. +

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. +

+In diesem Befehl werden die folgenden Platzhalter durch aktuelle Werte ersetzt: +

+ + + + +
%Cdie Spalte, in die der Cursor positioniert werden soll (zur Zeit immer 1)
%Fder Name der zu ladenden Datei
%Ldie 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: +

+ + + +

Editor-Befehle

+

Wechsel der Betriebsart/Dateibefehle

+ + + + + + + + + + +
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
+

Zeichnungen/Bibliotheken editieren

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+

Spezielle Befehle für Platinen

+ + + + + + + + + + +
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
+

Spezielle Befehle für Schaltpläne

+ + + + + + + + + + +
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
+

Spezielle Befehle für Bibliotheken

+ + + + + + + + + + + +
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
+

Befehle für Bildschirmdarstellung und Benutzer-Interface

+ + + + + + + + +
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
+

Weitere Befehle

+ + + + + + + + + + + + +
AUTO Autorouter starten
HELP Hilfe-Seite anzeigen
INFO Information über Objekt zeigen
MARK Messmarke setzen/entfernen
OPTIMIZE Wire-Segmente zusammenfassen
PRINT 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
+ + +
+

Befehlseingabe

+EAGLE-Befehle können auf vier verschiedene Arten eingegeben werden: +
+Diese Eingabearten können auch gemischt verwendet werden. +

+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;
+

Verkürzte Eingabe

+Befehle und andere Schlüsselwörter können beliebig abgekürzt werden, +solange sie nicht mit anderen Schlüsselwörtern verwechselt werden +können. +

Alternative Parameter

+Das Zeichen | bedeutet, dass Parameter alternativ angegeben werden +können. Beispiel: +

+ + + + + +
Syntax: SET BEEP OFF | ON;
Input: SET BEEP OFF;
oder
SET BEEP ON;
+

Wiederholungspunkte

+Die Zeichen .. bedeuten, dass die Funktion mehrfach ausgeführt +werden kann bzw. dass mehrere Parameter vom gleichen Typ erlaubt +sind. Beispiel: +

+ + + +
Syntax: DISPLAY option layer_name..
Input: DISPLAY TOP PINS VIAS
+

Koordinatenangaben

+Das Zeichen • bedeutet normalerweise, dass an dieser Stelle im Befehl mit der +linken Maustaste ein Objekt anzuklicken ist. Beispiel: +

+

+ + + + + + + +
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.
+Soll eine andere als die im GRID-Befehl gewählte Einheit verwendet werden, +so kann diese an die angegebenen Koordinaten angefügt werden, wie in +
+(100mil 200mil)
+
+Erlaubte Einheiten sind mm, mic, mil und in. +Es können auch unterschiedliche Einheiten für x und y verwendet werden.
+Die spezielle Koordinate +
+(@)
+
+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
+Die Eingabe +

+(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;
+
+

Dezimalzahlen

+Bei der Eingabe von Dezimalzahlen in der Kommandozeile des Editor-Fensters +oder in Dialog-Eingabefeldern können Sie das Komma als Dezimal-Trennzeichen +verwenden (also zum Beispiel 12,34), falls Ihre landesspezifischen +Einstellungen dies zulassen. Allerdings sollten Sie beim Schreiben eines Scripts +oder eines ULPs, welches EAGLE-Befehle über die exit()-Funktion +zurückgibt, immer den Punkt als Dezimal-Trennzeichen verwenden (also 12.34). +Ansonsten kann es sein, dass Ihr Script bzw. ULP nicht auf anderen Systemen +lauffähig ist. Generell ist es empfehlenswert, immer den Punkt als +Dezimal-Trennzeichen zu verwenden. +

Strichpunkt

+Der Strichpunkt (';') schließt einen Befehl ab. Ein Befehl muss dann +mit einem Strichpunkt abgeschlossen werden, wenn er weniger als die +maximal mögliche Zahl von Parametern enthält. +Der Befehl +
+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. + + + +

ADD

+
+
+Funktion +
+Elemente in eine Zeichnung einfügen.
+Symbole in ein Device einfügen. +
+Syntax +
+ADD package_name[@library_name] [name] [orientation] •..
+ADD device_name[@library_name] [name [gate]] [orientation] •..
+ADD symbol_name [name] [options] •.. +
+Maustasten +
+Mittlere spiegelt das Bauteil.
+Rechte dreht das Bauteil.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
UPDATE, +USE, +INVOKE +

+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! +

Package oder Symbol in Zeichnung holen

+

Platzhalter

+Der ADD-Befehl kann mit Platzhaltern ('*' oder '?') arbeiten, um ein +bestimmtes Element zu finden. Der ADD-Dialog zeigt alle gefundenen Elemente in einer +Baumansicht und dazu auch eine Voransicht des Devices und der Package-Variante. +

+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. +

Namen

+Der Parameter package_name, device_name bzw. symbol_name ist der Name, unter dem das +Package/Device/Symbol in der Bibliothek abgelegt ist. Er wird üblicherweise aus einem +Menü selektiert. Der Parameter name ist der Name, den das Element in der Zeichnung erhalten +soll. Falls der Name als eine Orientierung oder Option interpretiert werden könnte, +muss er in Hochkommas eingeschlossen werden. Wird er nicht explizit angegeben, erhält +das Element einen generierten Namen. +

+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 •
+
+

Bestimmte Gatter

+Um ein bestimmtes Gatter eines neu hinzugefügten Bausteins zu holen kann nach dem Bauteilnamen der Name des Gatters angegeben werden: +

+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). +

Orientation

+Dieser Parameter gibt die Ausrichtung des Objektes in der Zeichnung an. +Normalerweise rotiert man Objekte mit der rechten Maustaste. +In Script-Dateien verwendet man die textuellen Angaben für diesen +Parameter: +

+[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
Rnnnsetzt 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.3um 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). +

Fehlermeldungen

+Soll ein Gate aus einem unvollständig definierten Device geholt werden, erscheint +eine Fehlermeldung (siehe BOARD-Befehl). Dies lässt sich mit dem +Befehl "SET CHECK_CONNECTS OFF;" +verhindern. Vorsicht: Der BOARD-Befehl führt diese Prüfung auf alle Fälle durch. Sie +abzuschalten ist also nur sinnvoll, wenn man keine Platine erzeugen will. +

Symbol in Device holen

+Bei der Device-Definition holt der ADD-Befehl ein vorher definiertes Symbol in das Device. +Als Optionen sind zwei Parameter (Swaplevel und Addlevel) möglich, die in beliebiger Reihenfolge +eingegeben werden können. Beide lassen sich mit dem CHANGE-Befehl +voreinstellen und ändern. Auch der im ADD-Befehl angegebene Wert bleibt als Voreinstellung erhalten. +

Swaplevel

+Der Swaplevel ist eine Zahl im Bereich 0..255, wobei gilt: +

+ + + +
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 +

Addlevel

+Für diesen Parameter gibt es folgende Möglichkeiten: + + + + + + +
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.
RequestDiese 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. + + + +

ARC

+
+
+Funktion +
+Zeichnen von Kreisbögen. +
+Syntax +
+ARC ['signal_name'] [CW | CCW] [ROUND | FLAT] [width] • • • +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte ändert den Drehsinn. +
+Siehe auch
CHANGE, +WIRE, +CIRCLE +

+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. +

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, wird der Kreisbogen 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 Kreisbogen so +plaziert wird, dass er unterschiedliche Signale verbindet. Bitte führen +Sie deshalb einen +Design Rule Check durch, nachdem Sie +den ARC-Befehl mit dem Parameter signal_name benutzt haben! +

Strichstärke

+Der Parameter width gibt die Strichstärke an, er lässt sich mit +dem Befehl +
+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. + + + +

ASSIGN

+
+
+Funktion +
+Tastenbelegung zuweisen. +
+Syntax +
+ASSIGN
+ASSIGN function_key befehl..;
+ASSIGN function_key; +

+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) +

+Siehe auch
SCRIPT, +Tastatur und Maus +

+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. +

Beispiele

+
+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. +

Befehlsmenü einstellen

+Will man mit ASSIGN eine Taste so belegen, dass sie ein +neues Menü einstellt, dann muss das im MENU-Befehl enthaltene +Trennzeichen (Strichpunkt) von jeweils drei Hochkommas eingeschlossen +sein, wie im dritten Beispiel zu sehen. +

Voreinstellung der Tastenbelegung

+ + + + + + + + + + + + + + +
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
+ + + +

ATTRIBUTE

+
+
+Funktion +
+Definition von Attributen für Bauteile. +
+Syntax +
+ATTRIBUTE name [ 'value' ] [ options ]
+ATTRIBUTE part_name attribute_name
+ATTRIBUTE part_name attribute_name 'attribute_value' [ [ orientation ] • ]
+ATTRIBUTE part_name attribute_name DELETE
+ATTRIBUTE * [ name [ 'value' ] ]
+ATTRIBUTE * name DELETE
+ATTRIBUTE •.. +
+Siehe auch
TECHNOLOGY, +NAME, +VALUE, +SMASH, +TEXT +

+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 in der Bibliothek

+In einer Bibliothek kann der ATTRIBUTE-Befehl dazu verwendet werden, die Attribute +einer bestimmten Technology-Variante zu definieren. Die Syntax hierfür lautet +
+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).
variableDas Attribut wird als variabel markiert, so dass es im Schaltplan überschrieben werden kann (dies ist die Standardeinstellung).
constantAttribute, 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.
+Optionen können abgekürzt werden und Groß-/Kleinschreibung spielt keine Rolle. +

+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')
+Wird der Wert eines Attributes verändert, so bleibt seine konstant/variabel-Einstellung +unverändert (es sei denn, sie wird explizit angegeben). +

+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'). +

Attribute im Schaltplan

+Im Schaltplan kann der ATTRIBUTE-Befehl dazu verwendet werden, einem Bauteil +Attribute zuzuweisen. Der Wert eines solchen Attributs überschreibt dann den +des gleichnamigen Attributs aus der Bibliothek (falls das Device ein solches +Attribut hat und das Überschreiben zulässt). Einem Bauteil können auch Attribute +zugewiesen werden, die nicht in der Bibliothek definiert wurden. +

+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. +

Attribute im Board

+Im Board können den Bauteilen Attribute auf die gleiche Weise zugewiesen werden +wie im Schaltplan. Standardmäßig haben die Bauteile im Board alle Attribute, die +für das jeweils zugehörige Bauteil im Schaltplan (und dessen Device in der Bibliothek) +definiert wurden. Gleichnamige Attribute eines zusammengehörenden Paares von Bauteilen +im Schaltplan und im Board haben immer den selben Wert (über die Forward&Back-Annotation). +Bauteile im Board können zusätzliche Attribute erhalten, die nicht im Schaltplan +oder in der Bibliothek definiert wurden. +

Globale Attribute

+Globale Attribute können in Boards und Schaltplänen definiert werden indem +als Bauteilname ein '*' eingegeben wird (was gleichbedeutend ist damit, +dass das Attribut für alle Bauteile gilt). Alternativ können die globalen +Attribute auch über die Menü-Option "Bearbeiten/Globale Attribute..." definiert +werden. Die globalen Attribute von Board und Schaltplan werden getrennt voneinander +behandelt und sind nicht über Forward&Back-Annotation +verbunden. +

+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 auswählen

+Im Gegensatz zu anderen Befehlen (wie etwa WIRE) merkt sich der ATTRIBUTE-Befehl +den zuletzt verwendeten Layer selbst. Das hat den Vorteil, dass Attribute immer +im richtigen Layer landen, egal welche Layer andere Befehle verwenden. Der +Nachteil ist, dass die übliche Vorgehensweise, den Layer in einem Script auszuwählen, +wie etwa +
+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.
+Die Befehle +
+ATTRIBUTE
+LAYER Layer;
+
+setzen den Layer für nachfolgende ATTRIBUTE-Befehle. +

Beispiele

+Zuerst müssen das Package und die Technology (falls es mehr als eine gibt) gewählt werden, +dann können die Attribute für diese Technology definiert werden: +
+PACKAGE N;
+TECHNOLOGY LS;
+ATTRIBUTE PartNo '12345-ABC';
+ATTRIBUTE Temp '100K' constant;
+ATTRIBUTE Remark 'mount manually';
+
+ + + +

AUTO

+
+
+Funktion +
+Autorouter aktivieren. +
+Syntax +
+AUTO;
+AUTO signal_name..;
+AUTO ! signal_name..;
+AUTO •..;
+AUTO FOLLOWME
+AUTO LOAD|SAVE filename; +
+Siehe auch SIGNAL, +ROUTE, +WIRE, +RATSNEST, +SET +

+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. +

Beispiel

+
+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. +

Platzhalter

+Falls der signal_name-Parameter angegeben wurde, so sind die Zeichen '*', '?' +und '[]' Platzhalter und haben folgende Bedeutung: +

+ + + + +
* 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. +

Polygone

+Beim Starten des Autorouters werden alle Polygone neu +freigerechnet. +

Protokolldatei

+Informationen zum Routing-Vorgang enthält die Datei name.pro, die +ebenfalls automatisch angelegt wird. +

Routing-Fläche

+Der Autorouter legt ein umschließendes Rechteck um alle Objekte des Boards +und nimmt die Größe dieses Rechtecks als maximale +Route-Fläche. Wires im Dimension-Layer stellen für den Autorouter +Sperrlinien dar. Das heisst, mit geschlossenen Linienzügen in diesem Layer kann man +den Route-Bereich begrenzen. +

Signale

+Als Signale erkennt der Autorouter Wires und Polygone in den Layern Top, Bottom und +Route2...15, sowie die mit SIGNAL definierten Luftlinien. +

Sperrflächen

+Objekte in den Layern bRestrict, tRestrict und +vRestrict werden als Sperrflächen für Löt- und Bestückungsseite sowie +für Durchkontaktierungen (Vias) behandelt. +

+Falls der Autorouter keine Signale in einem Layer verlegen soll, ist +in das Feld für die Vorzugsrichtung 0 einzutragen. +

Wahl des Rasters

+Bei der Wahl des Rasters ist zu beachten, dass möglichst keine Pads für +den Router "unsichtbar" werden. Das heisst, jedes Pad soll mindestens +einen Routing-Rasterpunkt belegen, sonst kann es passieren, dass der +Autorouter eine Verbindung nicht legen kann, die ansonsten ohne +Probleme zu verlegen wäre - einfach weil er das entsprechende Pad +nicht auf seinem Raster darstellen kann. +

Abbruch

+Wird der Autorouter durch einen Klick auf den STOP-Button abgebrochen, so +werden die bis dahin noch nicht verlegten Luftlinien nicht automatisch neu +berechnet. Benutzen hierzu Sie den RATSNEST-Befehl. + + + +

BOARD

+
+
+Funktion +
+Erzeugt eine Board-Datei aus einem Schaltplan. +
+Syntax +
+BOARD [ grid ] +
+Siehe auch
EDIT +

+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. +

Platine aus Schaltplan erzeugen

+Wird eine Platine zum erstenmal geladen, prüft das Programm, ob im +selben Verzeichnis ein Schaltplan mit demselben Namen existiert. Wenn +ja, fragt das Programm, ob aus dem Schaltplan die Platine erstellt +werden soll.
+Wenn ein Schaltplan geladen ist, können Sie die zugehörige Platine +erzeugen, indem Sie +
+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: +

+ + + +

BUS

+
+
+Funktion +
+Zeichnen von Bussen im Schaltplan. +
+Syntax +
+BUS [bus_name] • [curve | @radius] •.. +
+Maustasten +
+Rechte ändert den Knickwinkel (siehe SET Wire_Bend).
+Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her. +
+Siehe auch NET, +NAME, +SET +

+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). +

Beispiele für Busnamen

+
+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). +

Negierte Signale

+Der Name eines negierten Signals ("active low") kann überstrichen dargestellt werden, +wenn ihm ein Ausrufezeichen ('!') vorangestellt wird, wie in +
+  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. + + + +

CHANGE

+
+
+Funktion +
+Ändern von Parametern. +
+Syntax +
+CHANGE option • •.. +
+Maustasten +
+Ctrl+Rechte ändert Parameter der Gruppe. +
+Der CHANGE-Befehl dient generell dazu, Eigenschaften von Objekten +zu ändern oder voreinzustellen. Objekte, die schon in der Zeichnung +vorhanden sind, werden einfach der Reihe nach mit der Maus selektiert, +nachdem der Befehl und der entsprechende Parameter vorher eingegeben +(bzw. aus einem Menü mit der Maus ausgewählt) wurden. +

+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). +

Gruppe ändern

+Will man den CHANGE-Befehl auf eine Gruppe ausführen, definiert +man zuerst die Gruppe mit dem
GROUP-Befehl, dann gibt man den CHANGE-Befehl +mit den entsprechenden Parametern ein und klickt die Gruppe anschließend +mit der rechten Maustaste an. +

Möglichkeiten des CHANGE-Befehls

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+ + + +

CIRCLE

+
+
+Funktion +
+Kreis in eine Zeichnung einfügen. +
+Syntax +
+CIRCLE • •.. [Kreismitte, Radius]
+CIRCLE width • •.. +
+Maustasten +
+Mittlere wählt den Layer. +
+Siehe auch
CHANGE, +WIRE +

+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. +

Beispiel für Parameterangabe in Textform

+
+GRID inch 1;
+CIRCLE (0 0) (1 0);
+
+erzeugt einen Kreis mit einem Radius von 1 Zoll um den Ursprung (0 0). + + + +

CLASS

+
+
+Funktion +
+Definieren und Wählen von Netzklassen. +
+Syntax +
+CLASS
+CLASS number|name
+CLASS number [ name [ width [ clearance [ drill ] ] ] ] [ number:clearance .. ] +
+Siehe auch
Design Rules, +NET, +SIGNAL, +CHANGE +

+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. +

Width

+Der width-Parameter bestimmt die Mindestbreite, die alle Objekte in dieser +Netzklasse haben müssen. +

Clearance

+Der clearance-Parameter bestimmt den Mindestabstand zwischen Objekten +verschiedener Signale in dieser Netzklasse zu Objekten in anderen Netzklassen. +

Drill

+Der drill-Parameter bestimmt den Mindest-Bohrdurchmesser, den alle Objekte +in dieser Netzklasse haben müssen (bezieht sich nur auf Objekte, die auch tatsächlich +einen drill-Parameter haben, wie etwa Pads und Vias). +

Clearance zwischen Netzklassen

+Wird eine Clearance in der Form number:clearance angegeben, so definiert +sie den Mindestabstand zwischen Signalen in dieser Netzklasse und solchen in der +Netzklasse mit der angegebenen number. Der Befehl +
+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 + + + +

CLOSE

+
+
+Funktion +
+Schließt ein Editor-Fenster. +
+Syntax +
+CLOSE +
+Siehe auch
OPEN, +EDIT, +WRITE, +SCRIPT +

+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

+
+
+Funktion +
+Zuordnung von Pins und Pads. +
+Syntax +
+CONNECT
+CONNECT symbol_name.pin_name pad_name..
+CONNECT pin_name pad_name.. +
+Siehe auch
PREFIX, +OPEN, +CLOSE, +SCRIPT +

+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. +

Device hat ein Symbol

+Ist im Device nur ein Symbol vorhanden, kann der Parameter symbol_name +entfallen, z.B. +
+CONNECT gnd 1 rdy 2 phi1 3 !irq 4 nc1 5 ...
+
+

Device hat mehrere Symbole

+Sind im Device mehrere Symbole vorhanden, sind als Parameter symbol_name +und pin_name (mit Punkt als Trennzeichen) sowie pad_name anzugeben, +z.B.: +
+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. +

Gate- oder Pin-Namen mit Punkten

+Soll ein Gate- oder ein Pin-Name einen Punkt enthalten, kann dieser ohne +weiteres verwendet werden. Es sind keine besonderen Zeichen (Esc-Character +oder Anführungszeichen) nötig. +

Beispiel

+
+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

+
+
+Funktion +
+Kopieren von Objekten. +
+Syntax +
+COPY • •..
+COPY deviceset@library [name]
+COPY package@library [name] +
+Maustasten +
+Ctrl+Linke selektiert ein Objekt an seinem Aufhängepunkt.
+Ctrl+Rechte selektiert die Gruppe.
+Mittlere spiegelt das selektierte Objekt bzw. die Gruppe.
+Rechte dreht das selektierte Objekt bzw. die Gruppe.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
GROUP, +CUT, +PASTE, +ADD, +INVOKE, +POLYGON +

+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. +

Leitungen kopieren

+Kopiert man Wires oder Polygone, die zu einem Signal gehören, dann +gehört die Kopie zum selben Signal. Bitte beachten Sie, dass aus diesem +Grund der DRC keinen Fehler feststellt, wenn z. B. zwei Wires mit COPY +überlappend plaziert werden. Wird ein Netz- oder Bus-Wire im Schaltplan kopiert, so +gehört dieser zum gleichen Segment wie der ursprüngliche Wire, selbst +wenn optisch keine Verbindung zu erkennen ist. Dies kann zu unerwarteten +Effekten führen, zum Beispiel bei einem späteren Umbenennen. COPY sollte +daher auf Netz- bzw. Bus-Wires nicht angewendet werden. +

Bauteile kopieren

+Beim Kopieren eines Bauteils in einem Schaltplan wird immer eine komplette +neue Instanz dieses Bauteils hinzugefügt, auch wenn nur ein einzelnes Gatter +eines aus mehreren Gattern bestehenden Bauteils selektiert wurde. Zusätzlich +zu dem selektierten Gatter werden all jene Gatter des zugehörigen Devices, +welche Add-Level MUST oder ALWAYS haben, automatisch auch hinzugefügt. +

+Wenn Sie lediglich ein weiteres Gatter eines aus mehreren Gattern bestehenden +Bauteils verwenden wollen, sollten Sie stattdessen den +INVOKE-Befehl benutzen. +

Bibliothekselemente kopieren

+Durch Angabe von COPY deviceset@library oder COPY package@library +kann ein Device-Set oder ein Package aus einer gegebenen Bibliothek in die aktuell +geladene Bibliothek kopiert werden. Wird zusätzlich noch name angegeben, +so erhält das kopierte Objekt den angegebenen Namen. +Dies kann ebenso über das Kontext-Menü der +Bibliotheksobjekte oder über Drag&Drop aus der Baumansicht des Control +Panels erfolgen. +

+Beachten Sie bitte, dass etwaige existierende Bibliotheksobjekte (Device-Sets, +Symbole oder Packages), die von dem kopierten Bibliotheksobjekt verwendet werden, +automatisch upgedatet werden. +

Eine Gruppe kopieren

+Das Kopieren einer Gruppe durch Anklicken mit der rechten Maustaste wird durch +eine implizite CUT-Operation, gefolgt von einem +PASTE realisiert. + + + +

CUT

+
+
+Funktion +
+Gruppe in den Paste-Puffer laden. +
+Syntax +
+CUT •
+CUT; +
+Siehe auch
PASTE, +GROUP +

+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. +

Referenzpunkt

+Wird beim CUT-Befehl mit der Maus ein Punkt angeklickt, dann befindet +sich beim PASTE-Befehl der Mauszeiger an dieser Stelle der Gruppe +(genauer: am nächstgelegenen Rasterpunkt). Ansonsten befindet +sich der Mauszeiger bei PASTE etwa in der Mitte der Gruppe. +

Hinweis

+Im Gegensatz zu anderen (Windows-) Programmen entfernt der +CUT-Befehl von EAGLE die markierte Gruppe nicht physikalisch aus der +Zeichnung, sondern kopiert die Gruppe lediglich in den Paste-Buffer. + + + +

DELETE

+
+
+Funktion +
+Löschen von Objekten. +
+Syntax +
+DELETE •..
+DELETE name ..
+DELETE SIGNALS +
+Maustasten +
+Shift+Linke löscht das übergeordnete Objekt in der Hierarchie.
+Ctrl+Linke löscht die Verbindungsstelle zweier Wires.
+Ctrl+Rechte löscht die Gruppe. +
+Siehe auch
RIPUP, +DRC, +GROUP +

+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). +

Löschen von Wire-Verbindungsstellen

+Wird der DELETE-Befehl mit gedrückter Ctrl-Taste auf die Verbindungsstelle +zweier Wires angewendet, so werden diese zu einem einzelnen, geradlinigen Wire +zusammengefasst. Die beiden Wires müssen dazu im gleichen Layer liegen, die gleiche +Breite, den gleichen Linien-Typ und runde Enden (im Falle von Kreisbögen) haben. +

Löschen von Polygon-Kanten

+Bei Polygonen löscht der DELETE-Befehl jeweils eine Ecke. Sind +nur noch drei Ecken vorhanden, wird das ganze Polygon gelöscht. +

Löschen von Bauelementen

+Bauelemente auf der Top-Seite lassen sich nur löschen, wenn der +tOrigins-Layer sichtbar ist und wenn (bei aktiver +Forward&Back-Annotation) keine Signale +mit dem Element verbunden sind (siehe auch +REPLACE). Entsprechend lassen sich +Bauelemente auf der Bottom-Seite nur löschen, wenn der bOrigins-Layer +eingeblendet ist. +

Löschen von Junction-Punkten, Netzen und Bussen

+Es gelten folgende Regeln: + +

Löschen von Supply-Symbolen

+Wird das letzte Supply-Symbol einer gegebenen Versorgungsspannung von einem +Netzsegment, das den Namen dieses Supply-Symbols trägt, gelöscht, erhält dieses +Netzsegment einen neuen, automatisch generierten Namen (sofern kein anderes +Supply-Symbol mehr diesem Segment zugeordnet ist) oder den Namen eines noch +verbleibenden anderen Supply-Symbols. +

Löschen von Signalen

+Selektiert man mit dem DELETE-Befehl Wires oder Vias, die zu +einem Signal gehören, dann sind drei Fälle zu unterscheiden: + +Werden Wires oder Vias eines Signals gelöscht, das Polygone enthält, dann +bleiben alle Polygone in dem Teil des Signals, der den ursprünglichen +Namen behält (normalerweise der "größere" Teil). +

Alle Signale löschen

+

+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. +

Löschen von übergeordneten Objekten

+Wird ein Objekt mit gedrückter Shift-Taste angeklickt, so wird das in der Hierarchie +nächsthöhere Objekt gelöscht. Im Einzelnen gilt dies für folgende Objekte: +

+ + + + +
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

+
+
+Funktion +
+Definiert die Beschreibung eines Devices, Packages oder einer Bibliothek. +
+Syntax +
+DESCRIPTION
+DESCRIPTION description_string; +
+Siehe auch
CONNECT, +PACKAGE, +VALUE +

+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. +

Beispiel

+
+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

+
+
+Funktion +
+Auswählen der sichtbaren Layer. +
+Syntax +
+DISPLAY
+DISPLAY [option] layer_number..
+DISPLAY [option] layer_name.. +
+Siehe auch
LAYER, +PRINT +

+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. +

Nicht definierte Layer

+Die Optionen '?' und '??' werden verwendet, zu kontollieren, was passiert, +wenn ein nicht definierter Layer über DISPLAY aufgerufen wird. Jeder nicht +definierte Layer, der einem '?' folgt, erzeugt eine Warnmeldung, die der Benutzer +entweder bestätigen kann oder mit Cancel den DISPLAY-Befehl abbrechen kann. +Nicht definierte Layer, die nach '??' folgen, werden kommentarlos ignoriert. +Diese Optionen sind besonders beim Schreiben von Script-Dateien nützlich, die +in der Lage sein sollen beliebige Dateien zu modifizieren, unabhängig davon welche +Layer in der Datei letztendlich definiert wurden. +
+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. +

Pads und Vias

+Verwendet man Pads und Vias mit unterschiedlichen Formen in den einzelnen +Layern, werden alle Formen, die in den sichtbaren (über DISPLAY aktivierten) +Signal-Layern verwendet werden, übereinander dargestellt. +

+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. +

Objekte selektieren

+Um Objekte selektieren zu können (z. B. mit MOVE, +DELETE) muss der entsprechende Layer sichtbar sein. Elemente in +Platinen lassen sich nur selektieren, wenn der tOrigins-Layer (bzw. +bOrigins bei gespiegelten Elementen) sichtbar ist! +

+Vermeiden Sie die Layer-Namen ALL und NONE, sowie Namen, die mit einem +Minuszeichen beginnen. +

Parameter-Aliase

+Parameter-Aliase können dazu benutzt werden, bestimmte Parameter-Einstellungen des DISPLAY-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 DISPLAY-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. +

+Die Syntax zur Bearbeitung dieser Aliase ist: +

+
+DISPLAY = name parameter +
+Definiert den Alias name, der in die angegebenen parameter +expandiert wird. Der name darf aus beliebig vielen Buchstaben, Ziffern +und Unterstrichen bestehen, und Groß-/Kleinschreibung spielt keine Rolle. +Er muss mit einem Buchstaben oder Unterstrich beginnen und darf keines der +Options-Schlüsselworte sein. +
+DISPLAY = name @ +
+Definiert den Alias name, der in die aktuelle Parameter-Einstellung +des Befehls expandiert wird. +
+DISPLAY = ? +
+Erfragt vom Benutzer einen Namen zur Definition eines Aliases für +die aktuelle Parameter-Einstellung des Befehls. +
+DISPLAY = name +
+Öffnet den DISPLAY-Dialog und erlaubt es dem Benutzer einen +Satz von Layern einzustellen, der als Alias unter dem angegebenen +Namen gespeichert wird. +
+DISPLAY = name; +
+Löscht den Alias mit dem angegebenen Namen. +
+DISPLAY name +
+Expandiert den Alias mit dem angegebenen Namen und führt den DISPLAY-Befehl +mit dem resultierenden Satz von Parametern aus. Der name kann +abgekürzt werden und es dürfen andere Parameter vor und nach dem +Alias angegeben werden (auch andere Aliase). Beachten Sie bitte, +dass im Falle einer abgekürzten Eingabe Aliase Vorrang vor anderen Schlüsselwörtern +des Befehls haben. +
+Beispiel: +

+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

+
+
+Funktion +
+Design Rule Check (Platine prüfen) +
+Syntax +
+DRC
+DRC • • ;
+DRC LOAD|SAVE filename; +
+Siehe auch
Design Rules, +CLASS, +SET, +ERC, +ERRORS +

+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-Befehle, die den DRC beeinflussen

+Der SET-Befehl kann dazu verwendet werden, um das Verhalten des DRC-Befehls +zu verändern: +
+SET DRC_FILL fill_name;
+
+Legt das für die DRC-Fehlerpolygone verwendete Füllmuster +fest. Default: LtSlash. + + + +

EDIT

+
+
+Funktion +
+Lade-Befehl. +
+Syntax +
+EDIT name
+EDIT name.ext
+EDIT .ext
+EDIT .sX [ .sY ] +
+Siehe auch
OPEN, +CLOSE, +BOARD +

+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. +

Welches Verzeichnis?

+Der EDIT-Befehl holt Dateien aus dem +Projektverzeichnis. + + + +

ERC

+
+
+Funktion +
+Electrical Rule Check (Prüfung auf elektrische Fehler). +
+Syntax +
+ERC +
+Siehe auch
DRC, +ERRORS, +Konsistenzprüfung +

+Dieser Befehl prüft Schaltpläne auf elektrische Fehler. Die +Ergebnisse werden im ERRORS Dialog angezeigt. +

Konsistenzprüfung

+Der ERC-Befehl führt auch eine +Konsistenzprüfung +zwischen Schaltplan und zugehöriger Platine durch, sofern die +Board-Datei vor dem Start des ERC geladen worden ist. Als Ergebnis des +ERC wird die automatische +Forward&Back-Annotation +ein- oder ausgeschaltet, abhängig davon, ob die Dateien konsistent +sind oder nicht. +

+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

+
+
+Funktion +
+Zeigt Fehler, die vom ERC bzw. DRC gefunden wurden. +
+Syntax +
+ERRORS
+ERRORS CLEAR +
+Siehe auch
ERC, +DRC +

+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. +

Eine Meldung als behandelt markieren

+Der Behandelt Button markiert eine Meldung als behandelt. Sie ist zwar noch +in der Liste enthalten, aber es erfolgt keine Fehleranzeige im Zeichenfenster mehr +(ausser wenn der Listeneintrag selektiert wird). Hierdurch können Meldungen nach +Behebung des jeweiligen Problems als "abgearbeitet" gekennzeichnet werden, ohne +die Prüfung erneut durchzuführen. Nach dem nächsten ERC bzw. DRC verschwindet die +Meldung entweder ganz, oder sie wird wieder als unbehandelt markiert, falls das +Problem immer noch besteht. +

Eine Meldung billigen

+Falls ein Fehler bzw. eine Warnung nicht behoben werden kann, aber offensichtlich +kein wirkliches Problem darstellt (was der Benutzer zu entscheiden hat), kann Sie +durch Drücken des Buttons Billigen in den Abschnitt Gebilligt verschoben +werden. Meldungen in diesem Abschnitt erzeugen keine Fehleranzeigen im Zeichenfenster +(ausser wenn der Listeneintrag selektiert wird) und sind implizit als "behandelt" +markiert. Falls nach dem nächsten ERC bzw. DRC die entsprechenden Probleme nicht mehr +bestehen, werden die zugehörigen Meldung in diesem Abschnitt gelöscht. +Alle gebilligten Meldungen werden in der Zeichnungsdatei mit abgespeichert um zu +dokumentieren, welche Meldungen vom Benutzer explizit als unproblematisch +eingestuft wurden. Beachten Sie bitte, dass Konsistenzfehler nicht gebilligt werden +können - diese müssen auf jeden Fall behoben werden um die +Forward&Back-Annotation zu aktivieren. +

Die Liste löschen

+Der Alle löschen Button löscht alle Einträge aus der Liste, bis auf die +gebilligten Meldungen. Hierdurch können die Fehleranzeigen im Zeichenfenster +abgestellt werden. Der nächste ERC bzw. DRC erzeugt die Meldungen wieder, sofern +sie dann noch zutreffen. +

+Die Liste kann auch durch Eingabe des Befehls +

+ERRORS CLEAR
+
+gelöscht werden. + + + +

EXPORT

+
+
+Funktion +
+ASCII- und Grafik-Dateien erzeugen. +
+Syntax +
+EXPORT SCRIPT filename;
+EXPORT NETLIST filename;
+EXPORT NETSCRIPT filename;
+EXPORT PARTLIST filename;
+EXPORT PINLIST filename;
+EXPORT DIRECTORY filename;
+EXPORT IMAGE filename|CLIPBOARD [MONOCHROME|WINDOW] resolution; +
+Siehe auch
SCRIPT, +RUN +

+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: +

SCRIPT

+Die mit OPEN geöffnete Bibliothek +wird als Script-Datei ausgegeben. Damit besteht die Möglichkeit, +Bibliotheken mit einem Text-Editor zu bearbeiten und anschließend +wieder einzulesen. +

+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!). +

NETLIST

+Gibt eine Netzliste des geladenen Schaltplans oder der geladenen Platine +aus. Es werden nur Netze berücksichtigt, die mit Elementen verbunden +sind. +

NETSCRIPT

+Gibt die Netzliste des geladenen Schaltplans in Form einer Script-Datei +aus, das in eine Platine (mit bereits plazierten Elementen bzw. mit +durch DELETE SIGNALS gelöschten Signalen) eingelesen werden +kann. +Beachten Sie bitte, dass zum Einlesen des Scripts in die Platine kein +mit dieser Platine konsistenter Schaltplan geladen sein darf. +

PARTLIST

+Gibt eine Bauteile-Liste des Schaltplans oder der Platine aus. Es +werden nur Bauteile mit Pins/Pads berücksichtigt. +

PINLIST

+Gibt eine Liste mit den Pad- und Pin-Namen aller Bauteile aus, die zu +jedem Pin die Direction sowie den Namen des angeschlossenen Netzes enthält. +

DIRECTORY

+Gibt das Inhaltsverzeichnis der gerade geöffneten Bibliothek aus. +

IMAGE

+Bei der Ausgabe eines IMAGE wird eine Grafikdatei mit der +angegebenen Datei-Erweiterung erzeugt. Folgende Formate sind verfügbar: +

+ + + + + + + + + +
.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

+
+
+Funktion +
+Rahmen in eine Zeichnung einfügen. +
+Syntax +
+FRAME [ columns [ rows ] ] [ borders ] • • +
+Maustasten +
+Mittlere wählt den Layer. +
+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. +

Beispiel

+
+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. + + + +

GATESWAP

+
+
+Funktion +
+Äquivalente Gates vertauschen. +
+Syntax +
+GATESWAP • •..;
+GATESWAP gate_name gate_name..; +
+Siehe auch
ADD +

+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

+
+
+Funktion +
+Rasterdarstellung und -einheit einstellen. +
+Syntax +
+GRID option..;
+GRID; +
+Tastatur +
+F6: GRID; schaltet das Raster ein bzw. aus. +
+Siehe auch
SCRIPT +

+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
+

Beispiele

+
+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. +

Parameter-Aliase

+Parameter-Aliase können dazu benutzt werden, bestimmte Parameter-Einstellungen des GRID-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 GRID-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. +

+Die Syntax zur Bearbeitung dieser Aliase ist: +

+
+GRID = name parameter +
+Definiert den Alias name, der in die angegebenen parameter +expandiert wird. Der name darf aus beliebig vielen Buchstaben, Ziffern +und Unterstrichen bestehen, und Groß-/Kleinschreibung spielt keine Rolle. +Er muss mit einem Buchstaben oder Unterstrich beginnen und darf keines der +Options-Schlüsselworte sein. +
+GRID = name @ +
+Definiert den Alias name, der in die aktuelle Parameter-Einstellung +des Befehls expandiert wird. +
+GRID = ? +
+Erfragt vom Benutzer einen Namen zur Definition eines Aliases für +die aktuellen Grid-Parameter. +
+GRID = name +
+Öffnet den GRID-Dialog und erlaubt es dem Benutzer einen +Satz von Parametern einzustellen, der als Alias unter dem angegebenen +Namen gespeichert wird. +
+GRID = name; +
+Löscht den Alias mit dem angegebenen Namen. +
+GRID name +
+Expandiert den Alias mit dem angegebenen Namen und führt den GRID-Befehl +mit dem resultierenden Satz von Parametern aus. Der name kann +abgekürzt werden und es dürfen andere Parameter vor und nach dem +Alias angegeben werden (auch andere Aliase). Beachten Sie bitte, +dass im Falle einer abgekürzten Eingabe Aliase Vorrang vor anderen Schlüsselwörtern +des Befehls haben. +
+Beispiel: +

+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

+
+
+Funktion +
+Definieren einer Gruppe. +
+Syntax +
+GROUP •..
+GROUP ALL
+GROUP; +
+Maustasten +
+Linke&Ziehen definiert eine rechteckige Gruppe.
+Shift+Linke fügt die neue Gruppe zu einer bestehenden hinzu.
+Ctrl+Linke invertiert die Gruppenzugehörigkeit des selektierten Objekts.
+Ctrl+Shift+Linke invertiert die Gruppenzugehörigkeit des in der Hierarchie nächsthöheren Objekts.
+Rechte schließt das Gruppen-Polygon. +
+Siehe auch
CHANGE, +CUT, +PASTE, +MIRROR, +DELETE +

+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: +

+

Gruppe bewegen

+Um eine Gruppe zu bewegen, verwendet man den MOVE-Befehl mit der +rechten Maustaste. Bewegt werden alle Objekte, die vorher +mit dem GROUP-Befehl selektiert worden sind. Wires, von denen nur ein +Eckpunkt innerhalb des Polygons liegt, werden an diesem Ende bewegt, +während das andere fest bleibt. "Hängt" die Gruppe am Mauszeiger, lässt sie +sich wiederum mit der rechten Maustaste rotieren. +

+Die Gruppendefinition bleibt wirksam, bis eine neue Zeichnung geladen +wird oder bis der Befehl +

+GROUP;
+
+ausgeführt wird. +

Gruppe erweitern

+Wenn Sie bei einem beliebigen Mausklick zur Definition einer Gruppe die Shift-Taste +drücken, so wird die neu definierte Gruppe zur bereits vorhandenen hinzugefügt +(falls es bereits eine gibt). +

Einzelne Objekte

+Durch Anklicken eines einzelnen Objekts bei gedrückter Ctrl-Taste ist es +möglich, die Gruppenzugehörigkeit dieses Objekts zu invertieren. Wird dabei zusätzlich +auch noch die Shift-Taste gedrückt, so wird die Gruppenzugehörigkeit +des in der Hierarchie nächsthöheren Objekts invertiert. Klicken Sie beispielsweise +mit dem GROUP-Befehl bei gedrückter Ctrl- und Shift-Taste im +Schaltpan auf eine Netz-Linie, so wird die Gruppenzugehörigkeit des gesamten Segments +invertiert. + + + +

HELP

+
+
+Funktion +
+Hilfe-Seite anzeigen. +
+Syntax +
+HELP
+HELP command +
+Tastatur +
+F1: HELP ruft die kontextsensitive Hilfe-Funktion auf. +
+Dieser Befehl ruft ein Hilfe-Fenster mit Hinweisen zum Programm auf, +die vom momentanen Status abhängig sind (kontextsensitiv). +

+Wird im HELP-Befehl ein Befehlsname (command) angegeben, dann erhält +man die Beschreibung dieses Befehls. +

Beispiel

+
+HELP GRID;
+
+Es erscheint die Beschreibung des GRID-Befehls. + + +
+

HOLE

+
+
+Funktion +
+Bohrloch in Platine oder Package einfügen. +
+Syntax +
+HOLE drill •.. +
+Siehe auch
VIA, +PAD, +CHANGE +

+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. +

Beispiel

+
+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

+
+
+Funktion +
+Eigenschaften von Objekten anzeigen und verändern. +
+Syntax +
+INFO •..
+INFO name .. +
+Siehe auch
CHANGE, +SHOW +

+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

+
+
+Funktion +
+Bestimmte Gates von Bauteilen holen. +
+Syntax +
+INVOKE • orientation •
+INVOKE Part_Name Gate_Name orientation • +
+Maustasten +
+Mittlere spiegelt das Gate.
+Rechte dreht das Gate.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
COPY, +ADD +

+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 +

+Mit dem abschließenden Mausklick positioniert man das neue Gate. +

+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. +

Gates auf verschiedenen Seiten

+Soll ein Gate aus einem Bauelement geholt werden, das sich auf einer +anderen Seite des Schaltplans befindet, ist als Parameter der Name +des Bauelements anzugeben. In diesem Fall zeigt die rechte Spalte +des Popup-Menüs, auf welcher Seite sich die verwendeten Gates +befinden. Ein Gate auf der Seite, die gerade in Bearbeitung ist, wird +durch ein Sternchen in der rechten Spalte des Popup-Menüs gekennzeichnet. + + + +

JUNCTION

+
+
+Funktion +
+Markierungspunkt für zusammengehörige Netze setzen. +
+Syntax +
+JUNCTION •.. +
+Siehe auch
NET +

+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

+
+
+Funktion +
+Busse und Netze beschriften. +
+Syntax +
+LABEL [XREF] [orientation] • •.. +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte dreht das Label.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+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. +

Querverweis-Labels

+Wird das optionale Schlüsselwort XREF angegeben, so wird das Label +ein "Querverweis-Label". Querverweis-Labels können in Schaltplänen mit +mehreren Seiten benutzt werden, um anzuzeigen welches die nächste Seite ist, +auf der ein bestimmtes Netz vorkommt (bitte beachten Sie, dass dies nur für +Netze gilt, nicht für Busse!). +Das XREF-Schlüsselwort ist hauptsächlich für die Verwendung in Scripts +gedacht. Normalerweise richtet sich diese Einstellung danach, was vorher mit +CHANGE XREF bzw. durch Anklicken der Xref-Schaltfläche +in der Parameter-Toolbar gewählt wurde. +

+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 auswählen

+Im Gegensatz zu anderen Befehlen (wie etwa WIRE) merkt sich der LABEL-Befehl +den zuletzt verwendeten Layer selbst. Das hat den Vorteil, dass Labels immer +im richtigen Layer landen, egal welche Layer andere Befehle verwenden. Der +Nachteil ist, dass die übliche Vorgehensweise, den Layer in einem Script auszuwählen, +wie etwa +
+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.
+Die Befehle +
+LABEL
+LAYER Layer;
+
+setzen den Layer für nachfolgende LABEL-Befehle. + + + +

LAYER

+
+
+Funktion +
+Wechseln und Definieren von Layern. +
+Syntax +
+LAYER layer_number
+LAYER layer_name
+LAYER layer_number layer_name
+LAYER [??] -layer_number +
+Siehe auch
DISPLAY +

Zeichenebene auswählen

+Der LAYER-Befehl mit einem Parameter dient dazu, den (vorhandenen) +Layer auszuwählen, in den gezeichnet werden soll. Wird der Befehl +aus dem Menü ausgewählt, öffnet sich ein Popup-Menü, +in dem man den gewünschten Layer selektieren kann. Bei Eingabe +über die Tastatur ist als Parameter die Layer-Nummer oder der +Layer-Name (wie er im Popup-Menü erscheint) zulässig. +

+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 definieren

+Der LAYER-Befehl mit zwei Parametern dient dazu, einen neuen Layer +zu definieren oder einen vorhandenen umzubenennen. +Die Eingabe von z.B.: +
+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 löschen

+Der LAYER-Befehl mit dem der Layer-Nummer vorangestellten Minuszeichen +löscht den Layer mit dieser Nummer, z. B.: +
+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. +

Versorgungs-Layer

+Die Layer 2...15 werden als Versorgungs-Layer (supply layer) betrachtet falls ihr Name +mit dem '$'-Zeichen beginnt und es ein Signal mit dem gleichen Namen (ohne vorangestelltes +'$') gibt. +

+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. +

Vordefinierte EAGLE-Layer, nach Layer-Nummern geordnet

+

Layout

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+

Schaltplan

+ + + + + + + + + + +
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

+
+
+Funktion +
+Verriegelt die Position und Orientierung eines Bauteils im Board. +
+Syntax +
+LOCK •..
+LOCK name .. +
+Maustasten +
+Ctrl+Rechte wirkt auf die Gruppe.
+Shift+Linke macht die Verriegelung wieder rückgängig ("entriegelt" das Bauteil).
+Ctrl+Shift+Rechte "entriegelt" alle Bauteile in der Gruppe. +
+Siehe auch
MIRROR, +MOVE, +ROTATE +SMASH +

+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

+
+
+Funktion +
+Marke in der Zeichenfläche definieren. +
+Syntax +
+MARK •
+MARK; +
+Siehe auch
GRID +

+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

+
+
+Funktion +
+Text-Menüleiste verändern. +
+Syntax +
+MENU option ..;
+MENU; +
+Siehe auch
ASSIGN, +SCRIPT +

+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;\
+           }';
+
+

Beispiel

+
+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

+
+
+Funktion +
+Objekte spiegeln. +
+Syntax +
+MIRROR •..
+MIRROR name.. +
+Maustasten +
+Ctrl+Rechte spiegelt die Gruppe. +
+Siehe auch
ROTATE, +LOCK, +TEXT +

+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). +

Gruppe spiegeln

+Will man eine Gruppe spiegeln, definiert man zuerst die Gruppe mit +dem GROUP-Befehl, dann selektiert man den MIRROR-Befehl und klickt +mit der rechten Maustaste die Gruppe an. Sie wird dann um die senkrechte +Achse durch den dem Mauszeiger nächstgelegenen Rasterpunkt gespiegelt. +

+Wires, Circles, Pads und Polygone lassen sich +nicht explizit spiegeln (als Bestandteile von Gruppen werden sie +mitgespiegelt). +

Text spiegeln

+Text auf der Lötseite (Layer 'Bottom' und 'bPlace') wird automatisch +gespiegelt, so dass er dann später, wenn man die Platine von der +Lötseite her betrachtet, richtig lesbar ist. +

+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

+
+
+Funktion +
+Wire-Verbindungsstellen abschrägen. +
+Syntax +
+MITER [radius] •.. +
+Maustasten +
+Linke&Ziehen modifiziert die Abschrägung dynamisch.
+Rechte schaltet zwischen runder und gerader Abschrägung hin und her. +
+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. +

Abschrägen eines Punktes

+Wenn Sie einen Punkt selektieren, an dem sich genau zwei geradlinige Wires treffen, +so wird ein zusätzlicher Wire zwischen diesen beiden Wires eingefügt, dessen Abmessungen +sich aus dem angegebenen radius ergeben. +Wenn sie Click&Drag mit der linken Maustaste an einem solchen Punkt machen, können +Sie den zur Abschrägung verwendeten Wire dynamisch definieren. +

Abschrägen eines Wires

+Wenn sie einen Wire (der auch ein Kreisbogen sein kann) in der Mitte zwischen seinen Endpunkten +selektieren, und dieser Wire mit genau zwei anderen, geradlinigen Wires (jeweils einer +an jedem Ende) verbunden ist, so werden die Abmessungen dieses Wires gemäß dem +angegebenen radius neu berechnet. +Wenn sie Click&Drag mit der linken Maustaste an einem solchen Wire machen, können +Sie den zur Abschrägung verwendeten Wire dynamisch definieren. +

Geradlinige und runde Abschrägung

+Ist der radius positiv, so ist der eingefügte Wire ein Kreisbogen mit dem gegebenen +Radius; falls er negativ ist wird ein geradliniger Wire eingefügt (stellen Sie sich +das '-' Zeichen als Indikator für "geradlinig" vor). Durch Drücken der rechten +Maustaste können Sie zwischen runder und geradliniger Abschrägung hin und her schalten. +

Miter-Radius und Wire-Knickwinkel

+Der radius, den Sie mit dem MITER-Befehl einstellen, wird auch in allen anderen +Befehlen verwendet, die Wires zeichnen, falls der Knickwinkel einer der 90- bzw. 45-Grad +Winkel ist. Bei runder Abschrägung betrifft dies sowohl 90- als auch 45-Grad Winkel, +bei geradliniger Abschrägung nur die 90-Grad Winkel. + + + +

MOVE

+
+
+Funktion +
+Bewegen von Objekten. +
+Syntax +
+MOVE • •..
+MOVE name •.. +
+Maustasten +
+Ctrl+Linke selektiert ein Objekt an seinem Aufhängepunkt bzw. verändert es (siehe Anmerkung).
+Ctrl+Rechte selektiert die Gruppe.
+Linke&Ziehen bewegt das Objekt sofort.
+Ctrl+Rechte&Ziehen bewegt die Gruppe sofort.
+Mittlere spiegelt das Objekt bzw. die Gruppe.
+Rechte dreht das selektierte Objekt bzw. die Gruppe.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Tastatur +
+F7: MOVE aktiviert den MOVE-Befehl. +
+Siehe auch
GROUP, +LOCK, +RATSNEST +

+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). +

Leitungen bewegen

+Bewegt man mit MOVE Wires übereinander, dann werden diese Wires +nicht zu einem Signal verbunden (Kurzschluss, den der DRC-Befehl +feststellt). +

Gruppe bewegen

+Will man eine Gruppe bewegen, definiert man zuerst die Gruppe mit +dem GROUP-Befehl, dann selektiert man den MOVE-Befehl und klickt mit +der rechten Maustaste die Gruppe an. Jetzt lässt sich die ganze +Gruppe bewegen und mit der rechten Maustaste (um den Mauszeiger) rotieren. +

Hinweise für den Schaltplan

+Wird ein Supply-Pin (Pin-Direction Sup) +auf ein Netz plaziert, erhält dieses Netz-Segment den Namen des +Supply-Pins. Werden Pins direkt aufeinander plaziert (ohne explizite +Netz-Linie), sind sie verbunden. +

+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. +

Objekte an ihrem Aufhängepunkt selektieren

+Normalerweise bleibt ein selektiertes Objekt in dem Raster, in dem es ursprünglich +plaziert wurde. Wird beim Selektieren eines Objektes Ctrl gedrückt, +so wird der Punkt, an dem das Objekt selektiert wurde, an den Mauszeiger +gezogen und schnappt in das aktuelle Raster. +

+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. +

Teile einer Seite auf eine andere Seite verschieben

+Sie können Teile einer Seite auf eine andere Seite des gleichen Schaltplans +verschieben, ohne die Platine zu beeinflussen (falls Forward&Back Annotation +aktiviert ist), indem Sie eine Gruppe definieren, die die +zu verschiebenden Objekte enthält, diese mit dem MOVE-Befehl selektieren und dann +auf die gewünscht Seite umschalten, wobei der MOVE-Befehl immer noch aktiv sein und +die Gruppe am Mauszeiger hängen muss. In der neuen Seite ist dann der MOVE-Befehl wieder aktiv +und hat die vorher definierte Gruppe am Mauszeiger. Platzieren Sie die Gruppe jetzt +wie üblich, so werden alle betroffenen Objekte von der ursprünglichen Seite auf die +aktuelle Seite verschoben. Falls die aktuelle Seite gleich der ursprünglichen ist, +passiert nichts. +

+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

+
+
+Funktion +
+Anzeigen und Ändern von Namen. +
+Syntax +
+NAME •..
+NAME new_name •
+NAME old_name new_name +
+Siehe auch
SHOW, +SMASH, +VALUE +

+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. +

Bibliothek

+Im Bibliotheks-Editier-Modus gilt das gleiche für Pad-, Smd-, +Pin- und Gate(Symbol)-Namen. +

Automatische Namensvergabe

+EAGLE vergibt automatisch Namen (E$.. für Elemente; S$.. für +Signale; P$.. für Pads, Pins und Smds; G$.. für Gates). Zumindest +in Packages und Symbolen sollte man die Pad- und Pin-Bezeichnungen +durch gängige Namen (z.B. 1..14 bei einem 14pol. DIL-Gehäuse) +bzw. die Signalbezeichnung ersetzen. +

Schaltplan

+Beim Umbenennen von Netzen und Bussen in Schaltplänen werden drei +verschiedene Fälle unterschieden, da Netze und Busse aus mehreren +(nicht explizit verbundenen) Segmenten bestehen und über mehrere +Seiten verteilt sein können. Das in einem solchen Fall erscheinende Menü +ermöglicht die Auswahl, ob +

+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. +

Polygon

+Beim Umbenennen eines Signal-Polygons in einem Board kann ausgewählt werden, +ob nur dieses Polygon umbenannt (und damit Bestandteil eines anderen Signals) +werden soll, oder ob das gesamte Signal einen anderen Namen erhalten soll. + + + +

NET

+
+
+Funktion +
+Zeichnen von Netzen im Schaltplan. +
+Syntax +
+NET [net_name] • [curve | @radius] •.. +
+Maustasten +
+Rechte ändert den Knickwinkel (siehe SET Wire_Bend).
+Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her. +
+Siehe auch BUS, +NAME, +CLASS, +SET +

+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). +

Bussignal auswählen

+Startet man das Netz auf einem Bus, öffnet sich ein Popup-Menü, +aus dem man ein Signal des Busses auswählen kann. Das Netz erhält +dann den entsprechenden Namen und gehört damit zu diesem Signal. +Enthält der Bus mehrere Teilbusse, öffnet sich erst ein Popup-Menü, +in dem man den gewünschten Teilbus auswählen kann. +

Netz-Namen

+Gibt man einen Namen im NET-Befehl an, dann +erhält das Netz diesen Namen. +

+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. +

Linienbreite

+Die Breite der Linien, die ein Netz darstellen, lässt sich +mit dem Befehl +
+SET NET_WIRE_WIDTH width;
+
+voreinstellen (Default: 6 Mil). +

Negierte Signale

+Der Name eines negierten Signals ("active low") kann überstrichen dargestellt werden, +wenn ihm ein Ausrufezeichen ('!') vorangestellt wird, wie in +
+  !RESET
+
+was als +
+  _____
+  RESET
+
+dargestellt würde. +Einzelheiten hierzu finden Sie in der Beschreibung des TEXT-Befehls. + + + +

OPEN

+
+
+Funktion +
+Öffnen einer Bibliothek. +
+Syntax +
+OPEN library_name +
+Siehe auch
CLOSE, +USE, +EDIT, +SCRIPT +

+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

+
+
+Funktion +
+Zusammenfassen von Wire-Segmenten. +
+Syntax +
+OPTIMIZE;
+OPTIMIZE signal_name ..
+OPTIMIZE •.. +
+Maustasten +
+Ctrl+Rechte optimiert die Gruppe. +
+Siehe auch
SET, +SPLIT, +MOVE, +ROUTE +

+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. +

Automatische Optimierung

+Diese Wire-Optimierung geschieht auch automatisch nach dem MOVE-, +SPLIT und ROUTE-Befehl für den damit selektieren Wire, es sei +denn, sie wurde mit dem Befehl +
+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. + + + +

PACKAGE

+
+
+Funktion +
+Zuweisung einer Package-Variante für ein Device. +
+Syntax +
+PACKAGE
+PACKAGE pname vname
+PACKAGE pname@lname vname
+PACKAGE name
+PACKAGE -old_name new_name
+PACKAGE -name
+
+Siehe auch
CONNECT, +TECHNOLOGY, +PREFIX +

+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

+
+
+Funktion +
+Plazieren von Pads in Packages. +
+Syntax +
+PAD [diameter] [shape] [orientation] [flags] ['name'] •.. +
+Maustasten +
+Rechte dreht das Pad.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+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. +

Beispiel

+
+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. +

Pad-Formen

+Ein Pad kann eine der folgenden Formen (shape) haben: +

+ + + + + + +
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. +

Pad-Namen

+Pad-Namen werden vom Programm automatisch erzeugt und können mit +dem NAME-Befehl geändert werden. +Der Name kann als Parameter auch im PAD-Befehl mit angegeben werden +(muss in Hochkommas eingeschlossen sein). +

+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. +

Flags

+Folgende flags können dazu benutzt werden, das Erscheinungsbild eines Pads zu +beeinflussen: +

+ + + + +
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). +

Einzelne Pads

+Einzelne Pads in Platinen müssen als Package definiert und in +die Platine geladen werden. Durchkontaktierungen lassen sich aber +mit dem VIA-Befehl direkt in Platinen plazieren. Solche Durchkontaktierungen +haben aber keinen Elementnamen und können deshalb auch nicht in +der Netzliste geführt werden. +

Package verändern

+Es ist nicht möglich, in einem Package, das schon in einem Device +verwendet wird, nachträglich ein Pad hinzuzufügen oder zu +löschen, da dies die im Device definierten Pin-/Pad-Zuordnungen +(CONNECT-Befehl) verändern würde. + + + +

PASTE

+
+
+Funktion +
+Inhalt des PASTE-Puffers einfügen. +
+Syntax +
+PASTE [ orientation ] • +
+Maustasten +
+Mittlere spiegelt den PASTE-Puffer-Inhalt.
+Rechte dreht den PASTE-Puffer-Inhalt.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
CUT, +GROUP +

+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: +

+Befinden sich in der mit PASTE einzufügenden Zeichnung modifizierte Devices oder Packages, +die in einer älteren Version schon im Schaltplan oder im Layout verwendet wurden, wird +automatisch ein Library-Update gestartet, um die Elemente +durch die neueren aus dem PASTE-Puffer zu ersetzen. +Achtung: Nach einem Library Update sollten Sie immer einen Design Rule Check (DRC) +und einen Electrical Rule Check (ERC) durchführen! + + + +

PIN

+
+
+Funktion +
+Anschlusspunkte in Symbolen definieren. +
+Syntax +
+PIN 'name' options •.. +
+Maustasten +
+Rechte dreht den Pin.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
NAME, +SHOW, +CHANGE +

Options

+Die options teilen sich in folgende Gruppen auf: +

+Direction
+Function
+Length
+Orientation
+Visible
+Swaplevel +

Direction

+Die logische Richtung des Signalflusses. Sie ist für den Electrical +Rule Check (siehe ERC-Befehl) und für die automatische Verdrahtung +der Stromversorgungs-Pins von Bedeutung. Möglich sind: +

+ + + + + + + + + + +
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. +

Function

+Die grafische Darstellung des Pins. Möglich sind: +

+ + + + + +
None keine spezielle Funktion
Dot Invertier-Symbol
Clk Taktsymbol
DotClk Invertiertes Taktsymbol
+

+Default: None +

Length

+Die Länge des Pin-Symbols. Möglich sind: +

+

+ + + + + +
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 +

Orientation

+Die Lage des Pins. Beim Plazieren lassen sich Pins mit der rechten +Maustaste rotieren. Der Parameter "orientation" ist für +die textuelle Eingabe des Pin-Befehls erforderlich, z. B. in Script-Dateien. +

+ + + + + +
R0 Pin-Symbol rechts
R90 Pin-Symbol oben
R180 Pin-Symbol links
R270 Pin-Symbol unten
+

+Default: R0 +

Visible

+Dieser Parameter bestimmt, ob der Pin- und/oder Pad-Name im Schaltplan +sichtbar sein soll. +

+ + + + + +
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 +

Swaplevel

+Zahl zwischen 0 und 255. Die Zahl 0 bedeutet, dass der Pin nicht +gegen einen anderen desselben Gates ausgetauscht werden darf. Jede +Zahl, die größer als 0 ist, bedeutet, dass der Pin mit +solchen Pins ausgetauscht werden kann, die den gleichen Swaplevel +haben und im selben Symbol definiert sind. Beispiel: Die Eingangs-Pins +eines NAND-Gatters können beide denselben Swaplevel bekommen, +da sie äquivalent sind. +

+Default: 0 +

Anwendung des PIN-Befehls

+Der PIN-Befehl dient dazu, in einem Symbol die Anschlusspunkte +für Netze (Pins) zu definieren. Pins werden im Symbols-Layer dargestellt. +Zusätzliche Informationen erscheinen im Pins-Layer. Mit den options +lassen sich jedem Pin individuelle Eigenschaften mitgeben. Die options +dürfen in jeder beliebigen Reihenfolge eingegeben werden, man +kann sie aber auch ganz weglassen. +

+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. +

Namen "hochzählen"

+Will man beispielsweise Pins mit den Namen D0 bis D7 in einem Symbol +plazieren, dann setzt man den ersten Pin mit dem Befehl +
+PIN 'D0' •
+
+und alle weiteren nur noch mit je einem Mausklick ab. Der numerische +Teil des Namens wird dann automatisch weitergezählt. +

Options mit CHANGE einstellen

+Alle options lassen sich auch mit dem CHANGE-Befehl voreinstellen. +Sie bleiben so lange erhalten, bis sie entweder mit dem PIN- oder +dem CHANGE-Befehl wieder geändert werden. +

+Der SHOW-Befehl zeigt den Namen des Pins sowie Direction und +Swaplevel an. +

Pin rotieren

+Bewegt man einen Pin mit dem MOVE-Befehl, dann rotiert die rechte +Maustaste den Pin. +

Gleiche Pin-Namen

+Wenn Sie Bausteine definieren wollen, die mehrere Pins mit gleichem +Namen haben, dann gehen Sie folgendermaßen vor: +

+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. +

Pin-Beschriftung

+Die Position der Pin- und Pad-Namen in einem Schaltplansymbol ist +relativ zum Pin-Aufhängepunkt festgelegt und kann nicht verändert +werden. Ebenso ist die Schrifthöhe für Pin- und Pad-Namen +fest eingestellt (60 Mil). Bitte orientieren Sie sich beim Definieren +neuer Symbole an den Größenverhältnissen der in den mitgelieferten +Bibliotheken vorhandenen Bausteine. +

Negierte Pins

+Der Name eines negierten Pins ("active low") kann überstrichen dargestellt werden, +wenn ihm ein Ausrufezeichen ('!') vorangestellt wird, wie in +
+  !RESET
+
+was als +
+  _____
+  RESET
+
+dargestellt würde. +Einzelheiten hierzu finden Sie in der Beschreibung des TEXT-Befehls. + + + +

PINSWAP

+
+
+Funktion +
+Äquivalente Pins/Pads vertauschen. +
+Syntax +
+PINSWAP • •.. +
+Siehe auch
PIN +

+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

+
+
+Funktion +
+Zeichnen von Polygonflächen. +
+Syntax +
+POLYGON [signal_name] [width] • [curve | @radius] • •.. +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte ändert den Knickwinkel (siehe
SET Wire_Bend). +Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her.
+Ctrl+Linke beim Absetzen eines Wire-Endpunktes definiert den Kreisbogen-Radius.
+Linke zweimal an der gleichen Stelle schließt das 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). +

Anmerkung

+Sie sollten es vermeiden, sehr kleine Werte für die width eines +Polygons zu verwenden, da dies zu extrem großen Datenmengen führen kann, +wenn die Zeichnung mit dem CAM Prozessor +ausgegeben wird.
+Die Polygon-width sollte immer größer sein als die physikalische +Auflösung des Ausgabegeräts. Zum Beispiel sollte bei einem Gerber +Fotoplotter mit einer typischen Auflösung von 1 Mil die Polygon width +nicht kleiner als zum Beispiel 6 Mil gewählt werden. Im allgemeinen sollte +die Polygon width in der selben Größenordnung liegen wie die +der übrigen Wires. +

+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. +

Urzustand und freigerechneter Zustand

+Für Polygone, die Bestandteil eines Signals sind, gibt es zwei verschiedene +Zustände: +

+ + + +
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. +

Andere Befehle und Polygone

+Polygone werden an den Kanten selektiert (wie normale Wires) +

+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. +

Polygon-Parameter

+

Width

+Linienbreite der Polygonkanten. Wird auch zum Ausfüllen +verwendet. +

Layer

+Polygone können in jeden Layer gezeichnet werden. +Polygone in Signal-Layern sind Bestandteil eines Signals und werden +'freigestellt', d.h. potentialfremde Anteile werden 'abgezogen'. +Polygone in Signallayern gehören zu einem Signal und halten Mindestabstände zu anderen +Signalen, die in den Design Rules oder über die Netzklasse definiert wurden, ein. +Von Polygonen im Top-Layer werden auch Objekte im Layer tRestrict +abgezogen (entsprechendes gilt für Bottom und bRestrict). Damit ist es +z. B. möglich, eine negative Beschriftung innerhalb einer Massefläche +zu erzeugen. +

Pour

+Füllmodus (Solid = ganz gefüllt [Default], Hatch += schraffiert). +

Rank

+Legt fest wie Polygone voneinander subtrahiert werden. Polygone mit einem +niedrigeren 'Rank' "erscheinen zuerst" (haben eine höhere Priorität) und werden somit +von Polygonen mit einem höheren 'Rank' abgezogen.
+Für Polygone in Signallayern (im Layout gezeichnet) sind die Werte 1..6 erlaubt, +für Polygone in Packages die Werte 0 oder 7. +Polygone mit gleichem Rank werden vom Design Rule Check gegeneinander +geprüft. Der Parameter 'Rank' ist nur für Polygone in Signallayern (1..16) relevant +und wird von Polygonen in anderen Layern ignoriert. Der Standardwert ist 1 für +Signal-Polygone und 7 für Package-Polygone. +

Thermals

+Bestimmt wie potentialgleiche Pads und Smds angeschlossen werden +(On = es werden Thermals generiert [default], Off = keine Thermals). +

Spacing

+Abstand der Füll-Linien bei Pour=Hatch (Default: +50 Mil). +

Isolate

+Abstand der freigestellten Polygonkanten zu potentialfremdem +Kupfer bzw. Objekten im Dimension-Layer (default: 0). Dieser Wert ist nur dann +maßgeblich, wenn er größer ist als der jeweilige Wert in den Design Rules. +Siehe auch Design Rules unter Distance bzw. Supply. +

Orphans

+Beim Freistellen von Polygonen kann es passieren, +dass das ursprüngliche Polygon in mehrere Teile zerfällt. +Falls sich in einem solchen Teil kein Aufhängepunkt eines Objektes des zugehörigen +Signals befindet, entsteht eine 'Insel' ohne elektrische Verbindung +zum zugehörigen Signal. Sollen solche Inseln (oder 'verwaiste' +Flächen) erhalten bleiben, ist der Parameter Orphans auf +On zu setzen. Bei Orphans = Off [default] werden sie eliminiert. +Besteht ein Signal nur aus Polygonen und hat keine anderen, elektrisch angeschlossenen +Objekte, so werden alle Teile unabhängig von der Einstellung des Parameters Orphans +dargestellt. +

+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. +

Stegbreite bei Thermals

+Die Breite der Stege bei Thermals ist: + +

Konturdaten

+Der Signalname _OUTLINES_ gibt dem Polygon besondere Eigenschaften, +die man zur Erzeugung von Konturdaten (z. B. +zum Fräsen von Prototypen) benötigt. Dieser Name sollte ansonsten nicht +verwendet werden. +

Schraffierte Polygone und Luftlinien

+Abhängig vom Wert des spacing-Parameters können Pads, Smds, Vias und Wires +innerhalb eines schraffierten Polygons, die zum selben Signal gehören wie das +Polygon, durch das Raster fallen, und erhalten daher Luftlinien um Ihre Verbindung +zu dem Signal anzuzeigen. +

+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

+
+
+Funktion +
+Präfix für Schaltzeichen festlegen. +
+Syntax +
+PREFIX prefix_string; +
+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. +

Beispiel

+
+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. + + + +

PRINT

+
+
+Funktion +
+Druckt eine Zeichnung auf dem System-Drucker aus. +
+Syntax +
+PRINT [factor] [-limit] [options] [;] +
+Siehe auch
CAM-Prozessor, +Drucken auf dem System-Drucker +

+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. +

Drucken in eine Datei

+Die FILE Option kann dazu benutzt werden in eine Datei zu drucken. +Falls diese Option angegeben wird, muss der Dateiname unmittelbar nach ihr folgen. +

+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. +

Auf eine bestimmte Papiergröße drucken

+Die PAPER-Option gibt an, auf welche Papiergröße gedruckt werden soll. +Ihr muss unmittelbar einer der Namen für Papiergrößen folgen, die in der Combo-Box +Papier des Drucken-Dialogs aufgelistet sind, wie etwa A4, Letter etc. +Soll eine benutzerdefinierte Papiergröße benutzt werden, so muss diese im Format +
+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. +

Einen Bereich von Schaltplanseiten drucken

+Mit der SHEETS Option kann ein ausgewählter Bereich von Schaltplanseiten +gedruckt werden. +Der Bereich wird in Form von zwei Zahlen angegeben, die durch '-' +getrennt werden, etwa 2-15. +Ohne diese Option wird nur die aktuell im Editor befindliche Seite gedruckt. +Um alle Seiten auszudrucken, kann der Bereich ALL benutzt werden (wobei +Groß-/Kleinschreibung egal ist, das Wort aber voll ausgeschrieben werden muss). +Ein Bereich kann auch aus einer einzelnen Zahl bestehen, etwa 42, wodurch +genau diese Seite gedruckt wird. +Ist kein Schaltplan geladen, so hat diese Option keine Bedeutung. +

Beispiele

+ + + + + + + +
PRINT ö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
+ + + +

QUIT

+
+
+Funktion +
+Beendet die Arbeit mit EAGLE +
+Syntax +
+QUIT +
+Dieser Befehl beendet die Arbeit mit EAGLE. Sind seit dem letzten +Abspeichern der Zeichnung oder der Bibliothek Änderungen vorgenommen +worden, erscheint ein Popup-Menü, das nachfragt, ob die die Zeichnung +vorher abgespeichert werden soll. Beantwortet man diese Frage mit +no (n), dann wird das Programm ohne Abspeichern der Zeichnung +beendet. Bei Cancel bleibt man im Programm. +

+Sie können das Programm von jeder Stelle aus mit Alt+X verlassen. + + + +

RATSNEST

+
+
+Funktion +
+Neuberechnen der Luftlinien und Polygone. +
+Syntax +
+RATSNEST
+RATSNEST signal_name ..
+RATSNEST ! signal_name .. +
+Siehe auch
SIGNAL, +MOVE, +POLYGON, +RIPUP +

+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.
+RATSNEST berechnet keine Luftlinien für Signale, für die es +einen eigenen Versorgungs-Layer gibt (z.B. Layer $GND für Signal GND), +es sei denn für Smd-Bauelemente, die an das nächstgelegene GND-Pad +angeschlossen 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. +

Luftlinien der Länge Null

+Enden zwei oder mehr Wires desselben Signals am selben Punkt, aber auf +unterschiedlichen Layern, und sind die Signale nicht über eine +Durchkontaktierung verbunden, dann wird eine +Luftline der Länge Null erzeugt und als X-förmiges Kreuz im Unrouted-Layer +dargestellt. Dasselbe gilt für gegenüberliegende SMDs (auf Top- +und Bottom-Layer), die zum selben Signal gehören. +

+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. +

Überprüfen, ob alles geroutet ist

+Wenn kein unverdrahtetes Signal mehr vorhanden ist, gibt der +RATSNEST-Befehl die Meldung +
+Ratsnest: Nichts zu tun!
+
+aus. Andernfalls erscheint die Meldung +
+Ratsnest: Luftlinien: xx
+
+wobei xx die Zahl der ungerouteten Luftlinien repräsentiert. +

Platzhalter

+Falls der signal_name-Parameter angegeben wurde, so sind die Zeichen '*', '?' +und '[]' Platzhalter und haben folgende Bedeutung: +

+ + + + +
* 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. +

Ausgewählte Luftlinien ausblenden

+Manchmal kann es sinnvoll sein, die Luftlinien von bestimmten Signalen auszublenden, +zum Beispiel wenn diese später durch ein Polygon verbunden werden. Typischerweise +sind dies Versorgungssignale die viele Luftlinien haben, aber nicht explizit +geroutet werden, und so nur die Luftlinien anderer Signale verdecken. +

+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.
+Um die Luftlinien wieder einzublenden geben Sie einfach den RATSNEST-Befehl ohne +das Zeichen '!' mit der Liste der Signale ein: +
+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. + + + +

RECT

+
+
+Funktion +
+Rechteck in eine Zeichnung einfügen. +
+Syntax +
+RECT [orientation] • •.. +
+Maustasten +
+Mittlere wählt den Layer. +
+Siehe auch
CIRCLE +

+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. +

Sperrflächen

+Der RECT-Befehl in den Layern tRestrict, bRestrict und +vRestrict dient zum Anlegen von Sperrflächen +für den Autorouter. +

Nicht Bestandteil von Signalen

+Rechtecke in den Layer Top, Bottom oder Route2...15 gehören nicht zu Signalen. +Der DRC meldet deshalb Fehler, wenn sie mit +Wires, Pads usw. überlappen. + + + +

REDO

+
+
+Funktion +
+Befehl erneut ausführen. +
+Syntax +
+REDO; +
+Tastatur +
+F10: REDO REDO-Befehl ausführen.
+Shift+Alt+BS: REDO +
+Siehe auch
UNDO, +Forward&Back-Annotation +

+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

+
+
+Funktion +
+Löschen von Dateien, Devices, Symbolen, Packages und Schaltplanseiten. +
+Syntax +
+REMOVE name
+REMOVE name.Sxx +
+Siehe auch
OPEN, +RENAME +

Dateien löschen

+Der REMOVE-Befehl löscht im Platinen- und Schaltplan-Editier-Modus +die mit name angegebene Datei. +

Devices, Symbole, Packages

+Im Bibliotheks-Editier-Modus löscht der REMOVE-Befehl aus der +aktiven Bibliothek das unter dem Namen name gespeicherte Device, +Symbol oder Package. +Der Name kann mit einer Erweiterung (z. B. REMOVE name.pac) angegeben werden. Wenn Sie +den Namen ohne Erweiterung angeben, müssen Sie sich im entsprechenden Editier-Modus +des Bibliotheks-Editors befinden um ein Objekt zu löschen (z. B. im Package-Editor +um ein Package zu löschen). +

+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. +

Schaltplan-Seiten

+Der REMOVE-Befehl kann auch zum Löschen von Seiten aus einem Schaltplan +verwendet werden, dabei kann der Name der geladenen Zeichnung entfallen. +

Beispiel

+
+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

+
+
+Funktion +
+Symbole, Devices oder Packages in einer Bibliothek umbenennen. +
+Syntax +
+RENAME old_name new_name; +
+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

+
+
+Funktion +
+Bauteil austauschen. +
+Syntax +
+REPLACE •..
+REPLACE device_name •..
+REPLACE part_name device_name ..
+REPLACE package_name •..
+REPLACE element_name package_name .. +
+Siehe auch
SET, +UPDATE +

+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. +

Gleiche Namen

+Die erste Betriebsart wird mit +
+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. +

Gleiche Koordinaten

+Die zweite Betriebsart wird mit +
+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

+
+
+Funktion +
+Verdrahtete in unverdrahtete Signale (Luftlinien) verwandeln.
+Polygondarstellung auf "Umrisse". +
+Syntax +
+RIPUP;
+RIPUP [ @ ] [ ! ] •..
+RIPUP [ @ ] [ ! ] signal_name.. +
+Maustasten +
+Ctrl+Rechte verwandelt die Signale in der Gruppe in Luftlinien.
+
+Siehe auch
DELETE, +GROUP, +POLYGON, +RATSNEST +

+Der Befehl RIPUP wird dazu verwendet, bereits verlegte Signale wieder +in Luftlinien zu verwandeln. Der Befehl kann verwendet werden für: +

+Wird mit RIPUP auf eine Luftlinie geklickt, so werden die an dieser +Luftlinie angrenzenden verlegten Wires und Vias bis hin zum nächsten Pad, +SMD oder der nächsten Luftlinie in Luftlinien verwandelt. +
+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! +

Platzhalter

+Falls der signal_name-Parameter angegeben wurde, so sind die Zeichen '*', '?' +und '[]' Platzhalter und haben folgende Bedeutung: +

+ + + + +
* 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. +

Polygone

+Falls der RIPUP-Befehl mit einem Namen auf ein Signal angewendet wird, zu dem ein +Polygon gehört, wird das Polygon anschließend mit seinen Umrissen +dargestellt (schnellerer Bildaufbau!). Soll das Polygon wieder +freigerechnet werden, ist der Befehl RATSNEST +auszuführen. + + + +

ROTATE

+
+
+Funktion +
+Drehen von Objekten. +
+Syntax +
+ROTATE orientation •..
+ROTATE orientation name.. +
+Maustasten +
+Ctrl+Rechte dreht die Gruppe.
+Linke&Ziehen rotiert das Objekt um beliebige Winkel.
+Ctrl+Rechte&Ziehen rotiert die Gruppe um beliebige Winkel. +
+Siehe auch
ADD, +MIRROR, +MOVE, +LOCK, +GROUP +

+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

+Beim Drehen von Elementen bewegen sich die angeschlossenen Leitungen +mit (Achtung auf Kurzschlüsse!). +

+Elemente lassen sich nur drehen, wenn der tOrigins- bzw. der +bOrigins-Layer sichtbar ist. +

Texte

+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. + + + +

ROUTE

+
+
+Funktion +
+Luftlinien in Leiterbahnen umwandeln. +
+Syntax +
+ROUTE [width] • [curve | @radius] •..
+ROUTE name .. +
+Maustasten +
+Ctrl+Linke startet den Routevorgang an einem beliebigen Punkt eines Wires oder Vias.
+Shift+Linke startet den Routevorgang mit der gleichen Breite wie ein bestehender Wire.
+Mittlere wählt den Layer.
+Rechte ändert den Knickwinkel (siehe
SET Wire_Bend).
+Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her.
+Shift+Linke beim Absetzen setzt ein Via.
+Ctrl+Linke beim Absetzen eines Wire-Endpunktes definiert den Kreisbogen-Radius. +
+Siehe auch AUTO, +UNDO, +WIRE, +MITER, +SIGNAL, +SET, +RATSNEST +

+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. +

Auswahl des Routing-Layers und der Wire-Breite

+Wenn Sie eine Luftlinie selektieren wird der Layer in dem geroutet wird +durch Betrachtung der am Startpunkt vorhandenen Objekte wie folgt ermittelt: + +Beim Selektieren einer Luftlinie wird die Wire-Breite +zum Routen auf den Wert gesetzt, der sich aus den Design-Regeln und der +Netzklasse des selektierten Signals ergibt, wenn der Schalter "Optionen/Einstellungen/Verschiedenes/Width und Drill bei +Route autom. setzen" eingeschaltet ist. +Während die Luftlinie am Cursor +hängt können Sie eine andere Breite einstellen, und die Verbindung wird dann +mit der neuen Breite berechnet. Gleiches gilt für die Daten von Vias. +

+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. +

Fangfunktion

+Der Endpunkt der dynamisch berechneten Luftlinie wird 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. Mit +
+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. +

Follow-me-Router

+Mit den speziellen Knickwinkeln 8 und 9 +arbeitet der ROUTE-Befehl als "Follow-me"-Router. Das bedeutet, dass die selektierte +Luftlinie vollautomatisch vom Autorouter verlegt wird. +

+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: +

+ + + +

RUN

+
+
+Funktion +
+Führt ein User-Language-Programm aus. +
+Syntax +
+RUN file_name [argument ...] +
+Siehe auch SCRIPT +

+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. +

ULP von Script-Datei ausführen

+Wenn ein ULP von einer Script-Datei aufgerufen wird und das Programm +einen Wert ungleich 0 zurückgibt (durch einen Aufruf der +Funktion +exit() oder weil +das STOP-Symbol angeklickt wurde), wird die Ausführung der Script-Datei +beendet. +

Editor-Befehle von einem ULP ausführen

+Ein ULP kann die exit()-Funktion auch mit einem string-Parameter +verwenden, um einen Befehl direkt in einem Editor-Fenster auszuführen. + + + +

SCRIPT

+
+
+Funktion +
+Befehls-Datei ausführen. +
+Syntax +
+SCRIPT file_name; +
+Siehe auch
SET, +MENU, +ASSIGN, +EXPORT, +RUN +

+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. +

Beispiele

+ + + + +
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: +

+SCRIPT-Dateien enthalten EAGLE-Befehle, entsprechend den Syntax-Regeln. +Zeilen, die mit '#' beginnen, sind Kommentarzeilen. +

Fortsetzungszeilen

+Bei manchen Befehlen kann es erforderlich sein, mehrere Zeilen zu +belegen. Das Zeichen '\' +am Ende einer Kommandozeile sorgt dafür, dass das erste Wort +der nächsten Zeile nicht als Befehl interpretiert wird. Damit +lassen sich in vielen Fällen Hochkommas vermeiden. +

Start-Parameter setzen

+Die SCRIPT-Datei eagle.scr wird jedesmal ausgeführt wenn eine Zeichnung neu in einem +Editor-Fenster geladen wird, oder der Editier-Modus in einer Bibliothek gewechselt wird, +sofern eagle.scr im Projekt-Verzeichnis oder im Script-Pfad +steht. +

Script-Datei im Bibliotheks-Editor ausführen

+Alle Layer werden nur dann erkannt, wenn vorher der Bibliotheks-Editor neu +geöffnet worden ist. + + + +

SET

+
+
+Funktion +
+Systemparameter verändern. +
+Syntax +
+SET
+SET options; +
+Mit dem SET-Befehl können Parameter festgelegt werden, die das +Verhalten des Programms, die Bildschirmdarstellung und die +Benutzeroberfläche betreffen. Die genaue Syntax ist im folgenden +beschrieben. +

+Wird der SET-Befehl ohne Parameter aufgerufen, so erscheint ein Dialog +in dem alle Parameter eingestellt werden können. +

Benutzer-Interface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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;
+

Bildschirmdarstellung

+ + + + + + + + + + + + + + + + + + + + + + + +
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.
+

Mode-Parameter

+ + + + + + + +
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.
+

Farben

+Es gibt drei Paletten für schwarzen, weißen und farbigen Hintergrund. +Jede Palette hat 64 Farb-Einträge, die auf jeden beliebigen ARGB-Wert +gesetzt werden können. Der Paletten-Eintrag 0 wird für die Hintergrundfarbe +verwendet (in der "weißen" Palette ist dieser Eintrag nicht +veränderbar, da diese Palette auch zum Ausdrucken verwendet wird, wo der +Hintergrund immer weiß ist). +

+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
+

EagleRc-Parameter

+Manchmal ist es notwendig, ein kleines Funktionsdetail einstellbar zu machen, +zum Beispiel weil einige Benutzer es unbedingt anders haben wollen. +Diese Parameter sind nicht in irgendwelchen Dialogen verfügbar, sondern können +ausschließlich über einen Eintrag in der eaglerc-Datei verändert werden. +Um dieses zu vereinfachen wird jeder Parameter, der nicht in obigen Schlüsselwörtern +gefunden wurde, in den eaglerc-Parametern gesucht und kann so mit dem SET-Befehl +verändert werden. +Beachten Sie bitte, dass die Parameternamen vollständig und genau so, wie unten +aufgelistet, angegeben werden müssen (auch bezüglich Groß-/Kleinschreibung). +Der Parameterwert ist typischerweise '0' oder '1', um eine Funktion aus- bzw. +einzuschalten. Nach der Veränderung eines Parameters, der die Bildschirmdarstellung +beeinflußt, kann es nötig sein, das Zeichenfenster aufzufrischen. +

+Beispiel +

+SET Option.DrawUnprocessedPolygonEdgesContinuous 1;
+
+Folgende eaglerc-Parameter stehen zur Verfügung: +

+

+
Cmd.Delete.WireJointsWithoutCtrl +
+Falls Sie wollen, dass der DELETE-Befehl Wire-Verbindungspunkte löscht, ohne dass +die Ctrl-Taste gedrückt wird, so können Sie diesen Parameter auf '1' setzen. +
Cmd.Wire.IgnoreCtrlForRadiusMode +
+Falls Sie die spezielle Funktion beim Zeichnen eines Wires, mit der man durch +Drücken von Ctrl den Radius eines Arcs definieren kann, nicht haben wollen, +so können Sie diesen Parameter auf '1' setzen. +Dadurch wird dieses Feature für alle Befehle, die Wires zeichnen, abgeschaltet. +
ControlPanel.View.AutoOpenProjectFolder +
+Das automatische Öffnen des Projekt-Verzeichnisses beim Programmstart +(bzw. wenn ein Projekt durch Klicken auf seinen grauen Button aktiviert +wird) kann durch Setzen dieses Parameters auf '0' abgeschaltet werden. +
Erc.AllowUserOverrideConsistencyCheck +
+Um Boards/Schematics bearbeiten zu können, die nur geringfügige +Inkonsistenzen aufweisen, können Sie durch Setzen dieses Parameters +auf '1' einen Dialog aktivieren der es Ihnen erlaubt den Editor dazu zu zwingen, +die Forward-/Backannotation durchzuführen, selbst wenn der ERC die Dateien als +inkonsistent erkannt hat. +BEACHTEN SIE BITTE, DASS SIE DIES AUF EIGENES RISIKO MACHEN - sollten die +Dateien danach zerstört werden, kann womöglich niemand mehr sie wiederherstellen. +Schließlich hat der ERC ja gemeldet, dass die Dateien inkonsistent sind! +
Interface.MouseButtonReleaseTimeout +
+Die Zeit (in Millisekunden) innerhalb der das Loslassen einer Maustaste, welches +dem Drücken der Maustaste auf einem Button (zum Beispiel in einer Toolbar) folgt, +die Funktion des Buttons auslöst, selbst wenn das Loslassen der Maustaste +ausserhalb der Fläche des Buttons erfolgte. Standardwert ist 500, der Wert 0 +schaltet diese Funktion ab. Hat dieser Parameter beim Programmstart den Wert 0, +so wirken sich etwaige Änderungen erst nach einem erneuten Programmstart aus. +
Interface.PreferredUnit +
+Bei der Anzeige numerischer Werte in Dialog-Eingabefeldern werden die Einheiten +automatisch so ermittelt, dass sich die kleinste Anzahl von Nachkommastellen ergibt. +Dies kann beeinflusst werden durch Setzen dieses Parameters auf +'0' für automatische Wahl der Einheiten (default), +'1' für zöllige Einheiten, +'2' für metrische Einheiten. +
Interface.UseCtrlForPanning +
+Das Verschieben des Zeichnungsauschnittes erfolgt durch Click&Drag +mit der mittleren Maustaste (nicht mehr durch Drücken der Ctrl-Taste wie +in älteren Versionen). +Falls Sie die alte Verhaltensweise wiederhaben wollen, können Sie dies +erreichen, indem Sie diesen Parameter auf '1' setzen. +Beachten Sie aber bitte, dass die Ctrl-Taste jetzt für spezielle Funktionen +einiger Befehle benutzt wird (zum Beispiel zum Selektieren von Objekten +an ihrem Aufhängepunkt bei MOVE), so dass Sie, bei Benutzung dieser speziellen +Funktionen, dann unter Umständen das Zeichenfenster unbeabsichtigt +verschieben können. +
Option.DrawUnprocessedPolygonEdgesContinuous +
+Falls Ihnen die Art, wie die Kanten von nicht berechneten Polygonen +dargestellt werden (als gepunktete Linien), nicht zusagt, so können Sie +diesen Parameter auf '1' setzen. +Die Kanten von nicht berechneten Polygonen werden dann wieder als +durchgezogene Linien dargestellt, wie es vor Version 5 der Fall war +(allerdings nicht hell). +
Option.LayerSequence +
+Die internen Layer werden in der Reihenfolge dargestellt, die dem tatsächlichen +Lagenaufbau entspricht, so dass das Ergebnis auch auf Druckern und PDF- bzw. +Postscript-Dateien brauchbar aussieht, wo die Layer nicht transparent sind. +Manchmal kann es erforderlich sein, dass benutzerdefinierte Layer vor den internen +Layern dargestellt werden müssen, anstatt nach diesen. Mit diesem Parameter kann +die Reihenfolge, in der die Layer dargestellt werden, festgelegt werden. +Er besteht aus einer Folge von Layer-Nummern bzw. Layer-Bereichen, optional gefolgt +von 't' oder 'b'. + + + + + + + + +
123 stellt Layer 123 dar
123tstellt Layer 123 dar, wenn die Ausgabe "von oben gesehen" erfolgt (nicht gespiegelt)
123bstellt Layer 123 dar, wenn die Ausgabe "von unten gesehen" erfolgt (gespiegelt)
123-140stellt die Layer 123 bis 140 in der angegeben Reihenfolge dar
140-123stellt die Layer 140 bis 123 in der angegeben Reihenfolge dar
*fügt die Standard-Sequenz der internen Layer ein
123b * 123tsorgt dafür, dass Layer 123 immer als erster dargestellt wird
+
+Beachten Sie, daß jeder Layer nur einmal dargestellt wird, auch wenn er mehrmals +aufgeführt ist. Die Standard-Sequenz der internen Layer ist
+48t 49t 19t 47t 20t 46t 23 27 25 59 57 55 53 50 51 21 44t 45t 37 35 31 29 33 39 41 43t 18t 17t 1-16 17b 18b 43b 42 40 34 30 32 36 38 45b 44b 22 52 54 56 58 60 26 28 24 46b 20b 47b 19b 49b 48b 61-99.
+Bei Ansicht von oben, wird die Layer-Sequenz von rechts nach links abgearbeitet, +während sie bei Ansicht von unten (gespiegelt) von links nach rechts abgearbeitet wird. +Zum Beispiel ist Layer 48 (Document) als 48t und 48b enthalten, damit dieser immer +als letzter dargestellt wird. Die Layer 21 (tPlace) und 22 (bPlace) hingegen sind +nur jeweils einmal aufgelistet, damit Sie an der richtigen Stelle erscheinen, je +nachdem, ob die Ausgabe gespiegelt erfolgt oder nicht.
+Alle nicht explizit in der Layer-Sequenz aufgeführten Layer werden nach der +gegebenen Sequenz, in aufsteigender Reihenfolge, dargestellt. +
Option.RatsnestLimit +
+Der RATSNEST-Befehl verwendet alle Punkte eines Signals, auch wenn +dieses sehr komplex ist (in früheren Versionen blieben Wire-Endpunkte +unberücksichtigt, wenn die Gesamtzahl der Anknüpfungspunkte größer als 254 +war). Hierfür wird mehr Speicherplatz beim Berechnen des Ratsnest benötigt. +Falls dies auf Ihrem System ein Problem darstellen sollte, so können Sie +auf die ursprüngliche Methode zurückschalten indem Sie diesen Parameter +auf '254' setzen. +Der angegebene Wert ist die Anzahl der Anknüpfungspunkte bis zu der Wire- +Endpunkte berücksichtigt werden und beschränkt somit den Speicherbedarf +(die Berechnung benutzt Speicher bis zum Quadrat des angegebenen Wertes, +so dass ein Wert von 1024 den verwendeten Speicher auf 1MB beschränkt). +Ein Wert von '0' steht für "keine Begrenzung". Ein Wert von '1' bewirkt, +das Luftlinien ausschließlich an Pads, Smds und Vias anknüpfen. +
Option.RepositionMouseCursorAfterContextMenu +
+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. Setzen Sie diesen Parameter auf '1' um diese Funktionalität +zu erhalten. +
Option.ShowPartOrigins +
+Die Aufhängepunkte von Bauteilen in einem Schaltplan werden durch kleine +Kreuze gekennzeichnet. +Setzen Sie diesen Parameter auf '0' um dies abzuschalten. +
Option.ShowTextOrigins +
+Die Aufhängepunkte von Texten werden durch kleine +Kreuze gekennzeichnet. +Setzen Sie diesen Parameter auf '0' um dies abzuschalten. +
Option.ToggleCtrlForGroupSelectionAndContextMenu +
+Da die Kontext-Menü-Funktion über die rechte Maustaste im Konflikt mit +der Selektion einer Gruppe, wie sie vor Version 5 erfolgte, steht, wird eine +Gruppe jetzt mit Ctrl plus rechte Maustaste selektiert. Falls Sie die bisherige +Art der Gruppenselektierung wieder haben wollen, so können Sie diesen +Parameter auf '1' setzen. +Damit können Gruppen wieder mit der rechten Maustaste allein selektiert +werden und Kontext-Menüs werden mit Ctrl plus rechte Maustaste geöffnet. +
Sch.Cmd.Add.AlwaysUseDeviceNameAsValue +
+Einige Benutzer wollen immer den Device-Namen als Bauteilwert verwenden, +selbst wenn das Bauteil einen benutzerdefinierten Wert bräuchte. Wer das +will kann diesen Parameter auf '1' setzen. +
Warning.PartHasNoUserDefinableValue +
+Falls Sie die Warnung bezüglich Bauteilen, die keinen vom Benutzer zu +vergebenden Wert haben, nicht haben wollen, können Sie diesen Parameter +auf '0' setzen. +
Warning.SupplyPinAutoOverwriteGeneratedNetName +
+Manche Benutzer wollen nicht gewarnt werden, wenn ein Supply-Pin den +generierten Namen eines bestehenden Netzsegments überschreibt. Wird dieser +Parameter auf '1' gesetzt, so wird diese Warnung abgeschaltet. +
+ + +
+

SHOW

+
+
+Funktion +
+Stellt Objekte hervorgehoben dar. +
+Syntax +
+SHOW •..
+SHOW name..
+SHOW @ name.. +
+Maustasten +
+Ctrl+Linke invertiert die Hervorhebung des selektierten Objekts.
+
+Siehe auch
INFO +

+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. +

Quervergleich zwischen Platine und Schaltplan

+Bei aktivierter Forward&Back-Annotation +wird ein Objekt, das mit Hilfe des SHOW-Befehls heller dargestellt wird, +sowohl im Schaltplan als auch in der Platine heller dargestellt. +

Mehrere Objekte

+Wenn Sie mehrere Objekte mit dem SHOW-Befehl selektieren, wird jedes +einzelne hell dargestellt. +Sie können mehrere Objekte gleichzeitig hervorheben indem Sie diese jeweils +mit gedrückter Ctrl-Taste anklicken. Klicken Sie mit gedrückter Ctrl-Taste +auf ein Objekt, das bereits hervorgehoben dargestellt ist, so wird dieses +Objekt wieder in den nicht hervorgehobenen Zustand versetzt. +

+Werden mehrere Namen in einer Zeile eingegeben, so werden alle entsprechenden +Objekte gleichzeitig hell dargestellt. +

Kleine Objekte

+Wird das Zeichen @ in der Kommandozeile angegeben, so wird 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 mehr als ein Objekt hervorgehoben, so wird das Rechteck um alle Objekte +gezeichnet. Um das Rechteck zu sehen, kann es erforderlich sein, aus der Zeichnung +herauszuzoomen (oder WINDOW FIT einzugeben). +Soll ein Objekt mit dem Namen @ hervorgehoben werden, so muss der Name +in einfache Hochkommas eingeschlossen werden. +

Platzhalter

+Falls der name-Parameter angegeben wurde, so sind die Zeichen '*', '?' +und '[]' Platzhalter und haben folgende Bedeutung: +

+ + + + +
* 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. +

Objekte auf anderen Seiten

+Wird ein namentlich genanntes Objekt nicht auf der aktuellen Schaltplanseite +gefunden, so erscheint ein Dialog mit einer Liste aller Seiten, auf denen dieses +Objekt gefunden wurde. Wurde das Objekt auf keiner Seite gefunden, so wird als +Seitennummer in dieser Liste '-' angezeigt. Beachten Sie bitte, dass dieser Dialog +nur dann erscheint, wenn mindestens eines der durch Namen (bzw. Platzhalter) +angegebenen Objekte nicht auf der aktuellen Seite gefunden wurde. Wurden alle +Objekte auf der aktuellen Seite gefunden, so erscheint kein Dialog (selbst, wenn +einige Objekte auch auf anderen Seiten vorkommen). Wenn der Dialog erscheint, dann +enthält er alle gefundenen Objekte, auch diejenigen auf der aktuellen Seite. +

Beispiele

+
+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. + + + +

SIGNAL

+
+
+Funktion +
+Signale definieren. +
+Syntax +
+SIGNAL • •..
+SIGNAL signal_name • •..
+SIGNAL signal_name element_name pad_name..; +
+Siehe auch
AUTO, +ROUTE, +NAME, +CLASS, +WIRE, +RATSNEST, +EXPORT +

+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. +

Mauseingabe

+Man selektiert mit der Maus der Reihe nach die Anschlüsse, die +miteinander verbunden werden sollen. EAGLE stellt die Signale als +Luftlinien im Unrouted-Layer dar. +

+Gibt man signal_name mit ein, dann erhält das Signal den +angegebenen Namen. +

Texteingabe

+Man kann ein Signal aber auch vollständig textuell definieren. +Die Eingabe +
+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. +

Kurzschluss-Check

+Versucht man, mit SIGNAL zwei Pads zu verbinden, die bereits +unterschiedlichen Signalen angehören, dann wird in einem Popup-Menü +nachgefragt, ob die beiden Signale verbunden werden sollen und welchen +Namen sie erhalten sollen. +

Konturdaten

+Der Signalname _OUTLINES_ gibt dem Polygon besondere Eigenschaften, +die man zur Erzeugung von Konturdaten (z. B. +zum Fräsen von Prototypen) benötigt. Dieser Name sollte ansonsten nicht +verwendet werden. + + + +

SMASH

+
+
+Funktion +
+Loslösen von Text-Variablen und Attributen von Bauteilen. +
+Syntax +
+SMASH •.. +
+Maustasten +
+Ctrl+Rechte wirkt auf die Gruppe. +Shift+Linke macht die Loslösung der Texte wieder rückgängig. +Ctrl+Shift+Rechte macht die Loslösung der Texte für die Gruppe wieder rückgängig. +
+Siehe auch
NAME, +VALUE, +TEXT, +ATTRIBUTE +

+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

+
+
+Funktion +
+Plazieren von Smds in Packages. +
+Syntax +
+SMD [x_width y_width] [-roundness] [orientation] [flags] ['name'] •.. +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte dreht das SMD.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+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. +

Roundness

+Der Wert für roundness kann ganzzahlig - mit negativen Vorzeichen, um es +vom width-Parameter zu unterscheiden - zwischen 0 und 100 angegeben +werden. +Der Wert 0 erzeugt rechteckige SMDs, während der Wert 100 +die Ecken der SMDs vollständig rundet. +Der Befehl +
+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. +

Namen

+Smd-Namen werden vom Programm automatisch erzeugt und können mit +dem NAME-Befehl geändert werden. +Der Name kann als Parameter auch im SMD-Befehl mit angegeben werden +(muss in Hochkommas eingeschlossen sein). +

Flags

+Folgende flags können dazu benutzt werden, das Erscheinungsbild eines Smds zu +beeinflussen: +

+ + + + +
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. +

Einzelne Smds

+Einzelne Smds in Platinen sind als Package zu realisieren und dann +in die Platine zu holen. +

Package verändern

+Es ist nicht möglich, in einem Package, das in einem Device verwendet +wird, nachträglich ein Smd hinzuzufügen oder zu löschen, +da dies die im Device definierten Pin-/Pad-Zuordnungen (CONNECT-Befehl) +verändern würde. + + + +

SPLIT

+
+
+Funktion +
+Knicke in Wires einfügen. +
+Syntax +
+SPLIT • [curve | @radius] •.. +
+Maustasten +
+Rechte ändert den Knickwinkel (siehe SET Wire_Bend).
+Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her.
+Ctrl+Linke beim Absetzen eines Wire-Endpunktes definiert den Kreisbogen-Radius. +
+Tastatur +
+F8: SPLIT aktiviert den SPLIT-Befehl. +
+Siehe auch MITER, +MOVE, +OPTIMIZE, +SET +

+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. +

Leitung verjüngen

+Dazu selektiert man den SPLIT-Befehl, markiert den zu verjüngenden +Abschnitt mit zwei Mausklicks, gibt den Befehl +
+CHANGE WIDTH breite
+
+ein und klickt mit der Maus das gewünschte Segment an. + + + +

TECHNOLOGY

+
+
+Funktion +
+Definiert eventuell vorhandene Technologien für ein Device. +
+Syntax +
+TECHNOLOGY name ..;
+TECHNOLOGY -name ..;
+TECHNOLOGY -* ..; +
+Siehe auch
PACKAGE, +ATTRIBUTE +

+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. +

Beispiel

+In einem Device mit dem Namen "74*00" löscht der Befehl +
+TECHNOLOGY -* '' L LS S HCT;
+
+zunächst alle bisherigen Technologien und erzeugt anschließend die folgenden +Technologie-Varianten: +
+7400
+74L00
+74LS00
+74S00
+74HCT00
+
+ + + +

TEXT

+
+
+Funktion +
+Plazieren von Text. +
+Syntax +
+TEXT beliebige_zeichen orientation •..
+TEXT 'beliebige_zeichen' orientation •.. +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte dreht den Text.
+Shift+Rechte kehrt die Richtung der Drehung um. +
+Siehe auch
CHANGE, +MOVE, +MIRROR, +ROTATE, +ATTRIBUTE +

+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. +

Schreibrichtung

+Mit der rechten Maustaste dreht man den Text. +

+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. +

Text auf Lötseite

+Texte in den Layern Bottom und bPlace werden automatisch gespiegelt. +

Leerzeichen oder Strichpunkt

+Sollen in einem Text mehrere aufeinanderfolgende Leerzeichen oder +ein Strichpunkt enthalten sein, dann setzt man den ganzen String in +Hochkommas. Sollen Hochkommas gedruckt werden, dann ist jedes einzelne +in Hochkommas einzuschließen. +

Schlüsselwörter

+Ist der TEXT-Befehl aktiv und enthält der einzugebende Text Wörter, +die EAGLE für Befehle oder Orientation-Schlüsselwörter +hält (z. B. und für UNDO), dann sind diese +Wörter oder der gesamte Text in Hochkommas einzuschließen. +

Texthöhe

+Die Zeichengröße und die Strichstärke ändert man mit +den Befehlen: +
+CHANGE SIZE text_size •..
+CHANGE RATIO ratio •..
+
+Maximale Texthöhe: ca. 2 Zoll.
+Maximale Strichstärke: 0.51602 Zoll (ca. 13.1 mm)
+Parameter "ratio": 0...31 (% der Texthöhe). +

Schriftart

+Texte können in drei Schriftarten verwendet werden: + + + + +
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. +

Zeichensatz

+Eine korrekte Darstellung wird nur für die Zeichen im ASCII-Code unter +128 garantiert. Alle anderen Zeichen darüber können systemabhängig zu +unterschiedlichen Darstellungen in den unterschiedlichen Schriftarten führen. +

Spezielle Platzhalter-Texte

+Spezielle Texte in einer Symbol- oder Package-Zeichnung, die mit '>' +gekennzeichnet sind, werden durch konkreten Werten im Schaltplan bzw. Board ersetzt: +

+ + + + + + + + + + + + + +
>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. +

Attribute

+Soll in einer Symbol- oder Package-Zeichnung ein Attribut +des konkreten Bauteils dargestellt werden, so kann hierfür ein Text mit dem Namen +des Attributs und vorangestelltem '>' benutzt werden. +Standardmäßig wird nur der Wert des gegebenen Attributs dargestellt. Folgt auf den +Namen des Attributs eines der Zeichen '=', '~' oder '!', +so geschieht die Darstellung wie folgt: +

+ + + + + +
>ABC 123
>ABC=ABC = 123
>ABC~ABC
>ABC!nothing
+

Überstrichener Text

+Text kann überstrichen werden, was zum Beispiel sinnvoll ist für +die Namen von negierten Signalen ("active low", siehe auch +NET, BUS und PIN). +Hierfür muss dem Text ein Ausrufezeichen ('!') vorangestellt werden, wie in +
+  !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). + + + +

UNDO

+
+
+Funktion +
+Vorhergehende Befehle zurücknehmen. +
+Syntax +
+UNDO; +
+Tastatur +
+F9: UNDO UNDO-Befehl ausführen. +Alt+BS: UNDO +
+Siehe auch
REDO, +SET, +Forward&Back-Annotation +

+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

+
+
+Funktion +
+Aktualisiert Bibliotheks-Elemente. +
+Syntax +
+UPDATE
+UPDATE;
+UPDATE library_name..;
+UPDATE package_name@library_name..;
+UPDATE +@ | -@ [library_name..];
+UPDATE old_library_name = new_library_name; +
+Siehe auch
ADD, +REPLACE +

+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. +

Update im Layout oder Schaltplan

+Wird der Befehl ohne Parameter mit einem ';' abgeschlossen, werden alle +Bauteile überprüft. +

+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! +

Update in einer Bibliothek

+Beim Update in einer Bibliothek werden alle in dieser befindlichen Packages durch +die entsprechenden Versionen aus den angegebenen Bibliotheken ersetzt. +

+Durch die Angabe des Package-Namens (package_name@library_name) kann dafür gesorgt +werden, dass nur ein ganz bestimmtes Package ersetzt wird. + + + +

USE

+
+
+Funktion +
+Bibliothek zur Benutzung markieren. +
+Syntax +
+USE
+USE -*;
+USE library_name..; +
+Siehe auch
ADD, +REPLACE +

+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. +

Auswählen der Bibliotheken über das Control Panel

+Wenn eine Bibliothek, die Sie benutzen wollen im Bibliotheks-Editor +verändert und noch nicht gespeichert wurde, werden Sie gefragt, ob die Datei +jetzt gespeichert werden soll oder nicht. Beantworten Sie diese Frage mit +Yes, wird die Datei gespeichert und Sie benutzen die modifizierte Datei. +Antworten Sie mit No, wird die Datei nicht gespeichert und Sie benutzen +die Bibliothek unverändert, so wie sie auf der Festplatte gespeichert ist. +Die Schaltfläche Cancel bricht den Befehl ab, so dass weder die Datei +gespeichert noch diese Bibliothek "in use" ist. +Bibliotheken können im Control Panel als "in use" +markiert werden, indem Sie auf den Marker klicken, der seine Farbe ändert, um anzuzeigen, +ob die Bibliothek "in use" ist, oder durch die Auswahl des Punkts "Use" im Kontext-Menü +des Bibliothekseintrags in der Baumansicht. Im Kontext-Menü gibt es die Möglichkeit +alle all oder keine none der Bibliotheken zu wählen. +

Bibliotheken "in use" und Projekte

+Die Bibliotheken, die "in use" sind, werden in der Projekt-Datei (eagle.epf) gespeichert, +sofern ein Projekt geladen ist. +

Beispiele

+ + + + + +
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
+ + + +

VALUE

+
+
+Funktion +
+Elementwert eintragen und ändern. +
+Syntax +
+VALUE •..
+VALUE wert •..
+VALUE name wert ..
+VALUE ON;
+VALUE OFF; +
+Siehe auch
NAME, +SMASH +

In Platine und Schaltplan

+Elemente kann man mit einem Wert versehen, etwa 10k bei einem Widerstand. +Bei ICs trägt man anstelle des Wertes sinnvollerweise den Typ +ein (z. B. 7400). Den Wert bzw. Typ trägt man mit dem VALUE-Befehl +ein. Der Befehl selektiert das nächstgelegene Element und öffnet +ein Popup-Menü, in dem man einen neuen Wert festlegen oder den +bisherigen verändern kann. +

+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. +

Beispiel

+
+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. +

Im Device: Wert oder Typ

+Wendet man den VALUE-Befehl im Device-Editier-Modus an, dann sind +die Parameter On und Off zulässig. +

+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

+
+
+Funktion +
+Plazieren von Durchkontaktierungen in Platinen. +
+Syntax +
+VIA ['signal_name'] [diameter] [shape] [layers] [flags] •.. +
+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. +

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 Vias 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 Via so +plaziert wird, dass es unterschiedliche Signale verbindet. Bitte führen +Sie deshalb einen +Design Rule Check durch, nachdem Sie +den VIA-Befehl mit dem Parameter +signal_name benutzt haben! +

Via-Durchmesser und Bohrdurchmesser

+Die Eingabe eines Durchmessers vor dem Plazieren ändert die Größe +des Vias. Der Durchmesser wird in der aktuellen Maßeinheit angegeben. +Er darf maximal 0.51602 Zoll (ca. 13.1 mm) betragen. +

+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. +

Via-Form

+Ein Via kann eine der folgenden Formen (shape) haben: +

+ 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. +

Layer

+Der Parameter layers gibt an über welche Layer sich +dieses Via erstrecken soll. Die Syntax ist von-nach, wobei 'von' und 'nach' +die Layer-Nummern sind über die sich das Via erstrecken soll. So würde zum +Beispiel 2-7 ein Via erzeugen, das von Layer 2 bis Layer 7 geht (7-2 hätte +die selbe Bedeutung). Falls das Layer-Setup in den Design Rules genau dieses +Via nicht zulässt, wird das nächst längere Via genommen (bzw. eine Fehlermeldung +ausgegeben, falls kein solches Via gesetzt werden kann). +

Flags

+Folgende flags können dazu benutzt werden, das Erscheinungsbild eines Vias zu +beeinflussen: +

+ + +
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. + + + +

WINDOW

+
+
+Funktion +
+Bildausschnitt festlegen oder Bild auffrischen. +
+Syntax +
+WINDOW;
+WINDOW •;
+WINDOW • •;
+WINDOW • • •
+WINDOW scale_factor
+WINDOW FIT
+WINDOW LAST +
+Maustasten +
+Linke&Ziehen definiert einen rechteckigen Bildausschnitt (entspricht "• •;)". +
+Tastatur +
+Alt+F2: WINDOW FIT Zeichnung formatfüllend darstellen
+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) +
+Der WINDOW-Befehl legt den sichtbaren Ausschnitt der Zeichnung fest. +Ohne weitere Parameter frischt der Befehl das Bild auf. +

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. +

+Wenn Sie sehr stark in eine Zeichnung hineinzoomen können folgende Dinge passieren: +

+

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. +

+Die Syntax zur Bearbeitung dieser Aliase ist: +

+
+WINDOW = name parameter +
+Definiert den Alias name, der in die angegebenen parameter +expandiert wird. Der name darf aus beliebig vielen Buchstaben, Ziffern +und Unterstrichen bestehen, und Groß-/Kleinschreibung spielt keine Rolle. +Er muss mit einem Buchstaben oder Unterstrich beginnen und darf keines der +Options-Schlüsselworte sein. +
+WINDOW = name @ +
+Definiert den Alias name, der in die aktuelle Bildausschnitt-Einstellung +expandiert wird. +
+WINDOW = ? +
+Erfragt vom Benutzer einen Namen zur Definition eines Aliases für +die aktuelle Bildausschnitt-Einstellung. +
+WINDOW = name +
+Erlaubt es dem Benutzer einen Bildausschnitt zu wählen, der als Alias unter + dem angegebenen Namen gespeichert wird. +
+WINDOW = name; +
+Löscht den Alias mit dem angegebenen Namen. +
+WINDOW name +
+Expandiert den Alias mit dem angegebenen Namen und führt den WINDOW-Befehl +mit dem resultierenden Satz von Parametern aus. Der name kann +abgekürzt werden und es dürfen andere Parameter vor und nach dem +Alias angegeben werden (auch andere Aliase). Beachten Sie bitte, +dass im Falle einer abgekürzten Eingabe Aliase Vorrang vor anderen Schlüsselwörtern +des Befehls haben. +
+Beispiel: +

+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. + + + +

WIRE

+
+
+Funktion +
+Wires (Linien) zeichnen. +
+Syntax +
+WIRE ['signal_name'] [width] • •..
+WIRE ['signal_name'] [width] [ROUND | FLAT] • [curve | @radius] •.. +
+Maustasten +
+Mittlere wählt den Layer.
+Rechte ändert den Knickwinkel (siehe
SET Wire_Bend).
+Shift+Rechte kehrt die Richtung des Weiterschaltens des Knickwinkels um.
+Ctrl+Linke am Begin eines Wires schnappt zum nächstgelegenen existierenden Wire-Endpunkt.
+Ctrl+Rechte schaltet zwischen korrespondierenden Knickwinkeln hin und her.
+Ctrl+Linke beim Absetzen eines Wire-Endpunktes definiert den Kreisbogen-Radius. +
+Siehe auch MITER, +SIGNAL, +ROUTE, +CHANGE, +NET, +BUS, +DELETE, +RIPUP, +ARC +

+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. +

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. +

+Die Breite lässt sich auch zu jeder Zeit mit dem Befehl +

+CHANGE WIDTH breite •
+
+ändern oder voreinstellen. +

+Bitte verwenden Sie den WIRE-Befehl nicht für Netze und +Busse sowie für Luftlinien. Siehe +NET, +BUS und +SIGNAL. +

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. +

Signale in Top-, Bottom und Route-Layern

+Wires in den Layern Top, Bottom, Route2.. werden als Signale behandelt. +Wird ein Wire in einem der Signal-Layer an einem bestehenden Signal +angesetzt, so gehört der gesamte gezeichnete Wire-Zug zu diesem +Signal (nur, wenn die Wire-Enden bzw. das Wire-Ende und der Pad-Mittelpunkt +genau übereinstimmen). Setzt man das Ende eines Wires an einem anderen Signal ab, +fragt EAGLE zur Bestätigung nach, ob die beiden Signale wirklich +miteinander verbunden werden sollen. Jedes Geradenstück wird von +EAGLE (z. B. beim RIPUP-Befehl) als eigenes Objekt behandelt. +

Kreisbögen zeichnen

+Wires und Kreisbögen sind im Grunde die selben Objekte, so dass man einen Kreisbogen entweder mit dem +ARC-Befehl zeichnen kann, oder indem man die nötigen Parameter +zum WIRE-Befehl hinzufügt. Damit aus einem Wire ein Kreisbogen wird benötigt dieser entweder +den curve Parameter, der angibt wie stark der Kreisbogen gekrümmt sein soll, oder den +@radius Parameter, der den Radius des Kreisbogens bestimmt (beachten Sie den '@', +welcher nötig ist um curve und radius unterscheiden zu können). +

+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

+
+
+Funktion +
+Abspeichern einer Zeichnung oder Bibliothek. +
+Syntax +
+WRITE;
+WRITE drawing_name
+WRITE @drawing_name +
+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. +

+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: +

+ + + +

Ausgabedaten erzeugen

+
+ + + +

Drucken

+Die Parameter für das Drucken auf den Systemdrucker können mit folgenden +drei Dialogen eingestellt werden: +
+Siehe auch PRINT + + + +

Drucken einer Zeichnung

+Wenn Sie den
PRINT-Befehl ohne abschließenden +';' eingeben, oder wenn Sie Print aus dem +Kontext-Menü des Icons einer Zeichnung im +Control Panel auswählen, erhalten Sie einen +Dialog mit folgenden Optionen: +

Papier

+Definiert das zu verwendende Papierformat. +

Ausrichtung

+Definiert die Papierausrichtung. +

Voransicht

+Schaltet die Druck-Voransicht ein bzw. aus. +

Spiegeln

+Spiegelt die Ausgabe. +

Drehen

+Dreht die Ausgabe um 90°. +

Kopfüber

+Dreht die Ausgabe um 180°. Zusammen mit Drehen wird die Zeichnung um insgesamt 270° gedreht. +

Schwarz

+Ignoriert die Farbeinstellungen der Layer und druckt alles in Schwarz. +

Gefüllt

+Ignoriert die Füllmuster der Layer und druckt alles voll ausgefüllt. +

Skalierungsfaktor

+Skaliert die Zeichnung mit dem gegebenen Wert. +

Blatt-Limit

+Gibt an wieviele Blätter der Ausdruck maximal haben soll. +Falls die Zeichnung nicht auf die angegebene Zahl von Blättern passt, wird +der tatsächliche Skalierungsfaktor so lange verkleinert, bis sie passt. +Der Standardwert von 0 bedeutet "kein Limit". +

Alle

+Alle Seiten des Schaltplans werden ausgedruckt +(das ist der Standardwert, wenn Print aus dem +Kontext-Menü eines Schaltplan-Icons +ausgewählt wird). +

Von...bis

+Nur die angegebenen Seiten werden ausgedruckt. +

Diese

+Es wird nur die Seite ausgedruckt, die gerade editiert wird +(das ist der Standardwert, wenn der PRINT-Befehl +in einem Schaltplan-Editor Fenster verwendet wird). +

Drucker...

+Ruft den System-Druckerdialog auf, in dem der Drucker ausgewählt werden kann +sowie druckerspezifische Parameter eingestellt werden können. +

PDF...

+Erzeugt eine PDF-Datei (Portable Document Format) mit den gewählten Druckeinstellungen. +

+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: +

Lange Zeilen umbrechen

+Schaltet den Zeilenumbruch für zu lange Zeilen ein. +

Drucker...

+Ruft den System-Druckerdialog auf, in dem der Drucker ausgewählt werden kann +sowie druckerspezifische Parameter eingestellt werden können. +

PDF...

+Erzeugt eine PDF-Datei (Portable Document Format) mit den gewählten Druckeinstellungen. +

+Die restlichen Optionen dienen der Seiteneinrichtung. + + + +

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. +

+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. +

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. +

+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. +

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. +

+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). + + + +

CAM-Prozessor

+Mit dem CAM-Prozessor können Sie jede Layer-Kombination an ein Peripheriegerät +oder in eine Datei ausgeben. +

+Die folgenden Hilfe-Themen führen Sie durch die erforderlichen +Schritte, von der Auswahl der Daten-Datei bis zur Konfiguration des +Ausgabegeräts (Device). +

+Sie können verschiedene Parametersätze zu einem +CAM-Prozessor-Job zusammenstellen, +mit dessen Hilfe Sie einen kompletten Satz von Ausgabedateien durch +Anklicken eines Buttons erzeugen können. +

+Siehe auch Drucken auf dem System-Drucker + + + +

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öffnetLädt ein der zuletzt geöffneten Dateien
Job speichern...Gegenwärtigen Job sichern
Schließen CAM-Prozessor-Fenster schließen
Beenden Programm beenden
+

Layer

+ + + + +
Alle abwählen Alle Layer deselektieren
Ausgewählte zeigen Nur die selektierten Layer anzeigen
Alle zeigen Alle Layer anzeigen
+

Fenster

+ + + + +
Control Panel Zum Control Panel wechseln
1 Schaltplan - ... Zu Fenster 1 wechseln
2 Board - ... Zu Fenster 2 wechseln
+

Hilfe

+ + + + + + +
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
+ + +
+

CAM-Prozessor-Job

+Ein CAM-Prozessor-Job besteht aus unterschiedlichen +Sections, +von denen jede einen kompletten Satz von CAM-Prozessor-Parametern +mit einer bestimmten Layer-Auswahl darstellt. +

+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. +

Section

+Der Section-Selektor zeigt die gegenwärtig aktive Job-Section +an. Durch Anklicken des Buttons können Sie jede der vorher +mit dem Add-Button +definierten Sections auswählen. +

Prompt

+Wenn Sie in dieses Feld einen Text eintragen, gibt der CAM-Prozessor +diese Meldung aus, bevor er die zugehörige Job-Section bearbeitet. +Wenn Sie zum Beispiel vor jeder Ausgabe das Papier in den Stiftplotter +einlegen wollen, könnte die Meldung "Bitte Papier wechseln!" lauten. +Jede Section kann ihre eigene Meldung haben. Wenn keine Meldung definiert +ist, wird die Section ohne vorherige Unterbrechung ausgeführt. +

Add

+Klicken Sie den Add-Button an, um dem Job eine neue Section +hinzuzufügen. Sie werden dann nach dem Namen der neuen Section gefragt. +Für die neue Section gelten die Parametereinstellungen, die im Menü zu +sehen sind.
+Bitte achten Sie darauf, wenn Sie eine neue Job-Section anlegen, dass +Sie zuerst mit 'Add' die neue Section anlegen +und erst danach die Parameter modifizieren. +Wenn Sie zuerst die Parameter der gegenwärtigen Section modifizieren +und erst danach mit 'Add' die neue Section anlegen, werden Sie vom +Programm gefragt, ob Sie die Änderungen an der gegenwärtigen Section +abspeichern wollen oder nicht. +

Del

+Durch Anklicken des Del-Buttons löschen Sie die gegenwärtige +Job-Section. Bevor die Section gelöscht wird, müssen Sie die Rückfrage, +ob sie wirklich gelöscht werden soll, bestätigen. +

Process Section

+Der Process Section-Button startet die Datenausgabe für die gegenwärtig +angezeigte Section. +

Process Job

+Der Process Job-Button startet die Datenausgabe für den gesamten +Job. Dabei wird die zuerst definierte Section zuerst bearbeitet. +Es entstehen die gleichen Ausgabedaten, als würden Sie der Reihe nach +die unterschiedlichen Sections auswählen und mit dem Process Section-Button +starten. + + +
+

Ausgabetreiber (Output Device)

+Der Ausgabetreiber (Output Device) legt fest, welche Art von +Daten der CAM-Prozessor erzeugt. Sie können aus den unterschiedlichsten +Treiber den geeigneten auswählen, z.B. für Foto-Plotter, Bohrstationen etc. +

Device

+Durch Anklicken des Device-Selectors öffnen Sie eine Liste +aller verfügbaren Device-Treiber. +

Skalierungsfaktor

+Bei Geräten, die eine Skalierung erlauben, können Sie in dieses Feld +einen Skalierungsfaktor eintragen. Werte über 1 führen +zu einer Vergrößerung, Werte unter 1 verkleinern die Ausgabe. +

+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. +

Datei

+Sie können in dieses Feld den Namen der +
Ausgabedatei +direkt eingeben, oder Sie klicken den +Datei-Button an, um einen Dialog für die Definition +der Ausgabedatei zu öffnen.
+Wenn Sie den Dateinamen aus dem Namen der +Schaltplan- oder Platinen-Datei ableiten wollen, können Sie den Namen +teilweise angeben (mindestens die Extension, z.B. .gbr). In +diesem Fall wird der Rest des Dateinamens von der Quelldatei +abgeleitet. +

Blendentabelle

+Sie können in dieses Feld den Namen der +Blenden-Konfigurationsdatei +direkt eingeben, oder Sie klicken den Wheel-Button an, um einen +Datei-Dialog zu öffnen und die +Datei zu selektieren.
+Wenn Sie den Dateinamen aus dem Namen der +Schaltplan- oder Platinen-Datei ableiten wollen, können Sie den Namen +teilweise angeben (mindestens die Extension, z.B. .whl). In +diesem Fall wird der Rest des Dateinamens von der Quelldatei +abgeleitet. +

Bohrertabelle

+Sie können in dieses Feld den Namen der +Bohrer-Konfigurationsdatei +direkt eingeben, oder Sie klicken den Rack-Button an, um einen +Datei-Dialog zu öffnen und die +Datei zu selektieren.
+Wenn Sie den Dateinamen aus dem Namen der +Schaltplan- oder Platinen-Datei ableiten wollen, können Sie den Namen +teilweise angeben (mindestens die Extension, z.B. .drl). In +diesem Fall wird der Rest des Dateinamens von der Quelldatei +abgeleitet. +Manche Treiber (wie zum Beispiel EXCELLON) können die Bohrerkonfiguration automatisch +generieren, wobei dann dieses Feld nicht verfügbar ist. + + + +

Device-Parameter

+Abhängig vom gewählten
Ausgabetreiber +gibt es verschiedene treiberspezifische Parameter, mit denen Sie +die Ausgabe an Ihre Bedürfnisse anpassen können. + + + + +

Blenden-Konfigurationsdatei

+Dem Fotoplotter muss bekannt sein, welche Blenden den Codes in der Ausgabedatei +entsprechen. Diese Zuordnung ist in der Blenden-Konfigurationsdatei definiert. +

Beispiel

+
+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. + + +
+

Blenden-Emulation

+Wenn die Option "Blenden" gewählt ist, werden nicht vorhandene +Blenden mit kleineren Blenden emuliert. Ist sie ausgeschaltet, werden +keine Blenden emuliert, auch nicht Thermal- oder Annulus-Blenden. +

+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!). + + + +

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. +

+Toleranzen werden in Prozent angegeben. +

+Bitte beachten Sie, dass dadurch Ihre "Design Rules" unter Umständen +nicht mehr eingehalten werden! + + + +

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. +

+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. +

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. +

+Toleranzen werden in Prozent angegeben. + + + +

Offset

+Offset in x- und y-Richtung (Inch, Dezimalzahl) +

+Kann dazu verwendet werden den Nullpunkt von großformatigen Plottern in die linke +untere Ecke zu verlegen. + + + +

Bedruckbarer Bereich

+

Height

+Bedruckbarer Bereich in y-Richtung (Inch). +

Width

+Bedruckbarer Bereich in x-Richtung (Inch). +

+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. + + + +

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. +

+Bitte verwenden Sie einen Text-Editor, +der keine Steuerzeichen in die Datei schreibt. + + + +

Ausgabedatei

+Die Ausgabedatei enthält die Daten, die vom CAM-Prozessor +erzeugt werden. +

+Folgende 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
+=======================================================
+
+

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). +

Bohrdaten mit blind&buried Vias

+Falls das Board "blind" oder "buried" Vias enthält, +generiert der CAM-Prozessor separate Bohrdateien für jeden tatsächlich +im Board vorkommenden Via-Übergang. Die Dateinamen werden gebildet indem +die Nummern des Start- und End-Layers an den Basisnamen angehängt werden, +wie zum Beispiel in +
+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. + + +
+

Flag-Options

+

Mirror

+Ausgabe spiegeln. Achtung, dabei entstehen negative +Koordinaten, deshalb sollte gleichzeitig Funktion "pos. Coord." +eingeschaltet sein. +

Rotate

+Die Zeichnung wird um 90 Grad gedreht. Achtung, dabei +entstehen negative Koordinaten, deshalb sollte gleichzeitig die +Funktion "pos. Coord." eingeschaltet sein. +

Upside down

+Die Zeichnung wird um 180 Grad gedreht. Zusammen mit Rotate +wird die Zeichnung um insgesamt 270 Grad gedreht. Achtung, dabei +entstehen negative Koordinaten, deshalb sollte gleichzeitig Funktion +"pos. Coord." eingeschaltet sein. +

Pos. Coord

+Die Zeichnung wird so ausgegeben, dass keine negativen +Koordinaten vorkommen. Sie wird an die Koordinatenachsen +herangeschoben. Achtung: negative Koordinaten führen bei vielen +Peripheriegeräten zu Fehlern! +

Quickplot

+Beschleunigte Ausgabe, bei der nur die Umrisse von Objekten +erscheinen. +

Optimize

+Mit dieser Option schalten Sie die Wegoptimierung für die +Plotterausgabe ein oder aus. +

Fill pads

+Pads füllen. Diese Funktion ist nur mit Treiber des Typs "generic", +wie z. B. mit PostScript möglich.
+Wird die Option deselektiert, sind die Bohrungen in Pads und +Vias sichtbar. + + +
+

Layer und Farben

+Wählen Sie die auszugebenden Layer, indem Sie die Check-Boxes in +der Layer-Liste anklicken. +

+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
+=======================================================
+
+ + + +

Konturdaten

+EAGLE kann Konturdaten erzeugen, die beispielsweise zum Fräsen von Prototyp-Platinen +verwendet werden können. +

+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. +

Board vorbereiten

+Zuerst definieren Sie ein
POLYGON in dem Layer für den +die Konturdaten erzeugt werden sollen. +Das Polygon muss folgende Eigenschaften haben: + +Wenn sich ein solches Polygon in Ihrem Layout befindet, berechnet es der +RATSNEST-Befehl in der Weise, dass seine Konturen +genau den Linien entsprechen, die mit dem Fräswerkzeug gefahren werden müssen, +um die einzelnen Signale voneinander freizufräsen. +Die Füllung des berechneten Polygons bestimmt, was weggefräst werden muss, um +alle unnötigen Kupferflächen zu entfernen. +

Ausgeben der Daten

+Die Konturdaten können über ein User Language Program +aus dem Board extrahiert werden. Die Datei outlines.ulp, die mit EAGLE geliefert wird, +enthält diesen Prozess vollständig. Wenn Sie ein eigenes ULP schreiben wollen, +verwenden Sie am besten outlines.ulp als Ausgangsbasis. +Sehen Sie die Hilfe-Seite zu UL_POLYGON für weitere Details +über das Erzeugen von Konturdaten mit Hilfe eines Polygons. +

Durchmesser des Fräswerkzeugs

+Der Durchmesser des Fräsers (und somit die Strichbreite width des Polygons) +muss so klein sein, dass es möglich ist zwischen zwei unterschiedlichen Signalen +durchzukommen, um diese zu isolieren. + +Führen Sie in jedem Fall einen Design Rule Check (DRC) mit +den Werten für Mindestabstände zwischen unterschiedlichen Signalen (Clearance) durch, +die dem Durchmesser des Fräswerkzeugs entsprechen! +

+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. +

Herstellen des ursprünglichen Zustands im Board

+Stellen Sie sicher, dass Sie nach dem Erzeugen der Konturdaten das Polygon mit +dem Namen _OUTLINES_ löschen. Dieses spezielle Polygon verursacht ansonsten +Kurzschlüsse im Board, da es nicht den üblichen Design Rules +entspricht! + + + +

Autorouter

+Der integrierte Autorouter kann vom Board-Fenster aus mit dem Befehl +
AUTO gestartet werden. +

+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. + + + +

Ü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. +

+Der DRC wird in einem Platinen-Fenster ausgeführt. Er überprüft das +Design auf Überlappung von unterschiedlichen Potentialen, +Abstandsverletzungen etc. + + + +

Design Rules

+Design Rules legen alle Parameter fest denen ein Platinen-Layout entsprechen muss. +

+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. +

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. +

+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. +

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). +

+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 +

+(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. +

+

+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. +

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. +

+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. +

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. +

Masks

+Im Masks-Tab legt man die Abmessungen von Lötstop- (solder stop) und +Lotpasten-Symbolen (cream mask) fest. Sie werden in Prozent der kleineren Seite +eines Smds, Pads oder Vias angegeben und werden durch einen Minimal- bzw. +Maximalwert begrenzt.
+Eine Lötstopmaske wird automatisch für Smds, Pads und solche Vias erzeugt, die den +angegebenen Wert für den Bohrdurchmesser im Parameter "Limit" überschreiten.
+Die Lotpastenmaske (cream frame) wird nur für Smds ezeugt. +

Misc

+Unter Misc kann man die Prüfung von Raster, Winkel, Schriftart und +Sperrflächen aktivieren. +

+ + + +

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. +

+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. + + + +

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). +

+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. + + + +

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. +

+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. + + + +

User Language

+Die EAGLE-User-Language gestattet den Zugriff auf die EAGLE-Datenstrukturen +und kann beliebige Ausgabedateien erzeugen. +

+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: +

+ + + + + + + + + + +
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
+ + + +

Schreiben eines ULP

+Ein User-Language-Programm ist eine reine Textdatei und wird in einer C-ähnlichen +Syntax geschrieben. +User-Language-Programme +verwenden die Extension .ulp. Sie können ein ULP mit jedem beliebigen Text-Editor schreiben, +vorausgesetzt, er fügt keine Steuerzeichen ein, oder Sie können den +EAGLE-Text-Editor verwenden. +

+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. + + + +

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. +

+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 +

+string s = "Hello World";
+
+wo das Leerzeichen zwischen 'o' und 'W' ein Teil des Strings bleibt. +

+Wenn dem abschließenden Newline-Zeichen einer Zeile ein Backslash +(\), vorausgeht, werden Backslash und Newline nicht berücksichtigt. +

+"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. +

+Es gibt zwei Möglichkeiten, Kommentare einzufügen. Die erste verwendet +die Syntax +

+/* 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. +

+Die zweite Möglichkeit, einen Kommentar einzufügen, verwendet die Syntax +

+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. +

+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. +

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

+Mit der Zeit kann es vorkommen, dass neuere EAGLE-Versionen neue oder veränderte +User Language Funktionen implementieren, die Fehlermeldungen verursachen können, +wenn ein solches ULP aus einer älteren EAGLE-Version heraus aufgerufen wird. +Um dem Benutzer eine konkrete Meldung zu geben, dass dieses ULP mindestens eine +bestimmte EAGLE-Version benötigt, kann ein ULP die #require-Direktive +enthalten. Die Syntax lautet +
+#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

+Jedes User-Language-Programm sollte Informationen über seine Funktion, die Benutzung und +evtl. auch über den Autor enthalten.
+Die Direktive +
+#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). +

Beispiel

+
+#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"
+
+ + + +

Schlüsselwörter (Keywords)

+Die folgenden Schlüsselwörter sind für spezielle Zwecke reserviert +und dürfen nicht als normale Identifier-Namen verwendet werden: +
+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

+Ein Identifier ist ein Name, der dazu benutzt wird, eine benutzerdefinierte +
Konstante, +Variable oder +Funktion +einzuführen. +

+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. + + + + +

Character-Konstanten

+Eine Character-Konstante besteht aus einem einzelnen Buchstaben +oder einer +
Escape-Sequenz, eingeschlossen in +einfachen Hochkommas, wie in +
+'a'
+'='
+'\n'
+
+Der Typ der Character-Konstante ist +char. + + + +

Integer-Konstanten

+Abhängig vom ersten (eventuell auch vom zweiten) Zeichen wird eine +Integer-Konstante unterschiedlich interpretiert: +

+ + + + + +
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. +

Beispiele

+ + + + +
16 dezimal
020 oktal
0x10 hexadezimal
+ + + +

Real-Konstanten

+Eine Real-Konstante folgt dem allgemeinen Muster +
+[-]int.frac[e|E[±]exp]
+
+wobei die einzelnen Teile für + +stehen. +

+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. +

Beispiele

+ + + + + + + + + + +
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
+ + + +

String-Konstanten

+Eine String-Konstante besteht aus einer Sequenz von Buchstaben +oder einer
Escape-Sequenz, +eingeschlossen in doppelte Anführungszeichen, wie in +
+"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";
+
+ + + +

Escape-Sequenzen

+Eine Escape-Sequenz besteht aus einem Backslash (\), +gefolgt von einem oder mehreren Sonderzeichen: +

+ + + + + + + + + + + + + + +
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. +

Beispiele

+
+'\n'
+"A tab\tinside a text\n"
+"Ring the bell\a\n"
+
+ + + +

Punctuator-Zeichen

+Die Punctuator-Zeichen, die in einem User-Language-Programm +benutzt werden können, sind +

+ + + + + + + + +
[] 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) { ... }
+
+ + + +

Geschweifte Klammern

+Geschweifte Klammern (Braces) bezeichnen den Beginn und das Ende +einer Verbundanweisung (Compound Statement) +
+if (d == z) {
+   ++x;
+   func();
+   }
+
+und werden auch verwendet, um die Werte für die Array-Initialisierung zu +gruppieren: +
+int ai[] = { 1, 2, 3 };
+
+ + +
+

Komma

+Das Komma trennt die Elemente einer Funktionsargument-Liste +oder die Parameter eines Funktionsaufrufs: +
+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;
+
+ + +
+

Semikolon

+Der Semikolon schließt ein
Statement +ab, wie in +
+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);
+    }
+
+ + + +

Doppelpunkt

+Der Doppelpunkt bezeichnet das Ende eines Labels in einem +
Switch-Statement: +
+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");
+  }
+
+ + + +

Gleichheitszeichen

+Das Gleichheitszeichen trennt Variablen-Definitionen von +Initialisierungsliste: +
+int i = 10;
+char c[] = { 'a', 'b', 'c' };
+
+Es wird auch als +
Zuweisungsoperator verwendet. + + + +

Datentypen

+Ein User-Language-Programm kann Variablen unterschiedlicher Typen definieren, +die unterschiedliche Arten von EAGLE-Daten repräsentieren. +

+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. + + + +

char

+Der Datentyp char speichert Einzelzeichen, wie die Buchstaben des +Alphabets oder kleine Zahlen ohne Vorzeichen. +

+Eine Variable des Typs char belegt 8 bit (1 Byte), und kann jeden Wert +im Bereich 0..255 speichern. +

+Siehe auch Operatoren, +Character-Konstanten + + + +

int

+Der Datentyp int speichert Ganzzahlen mit Vorzeichen, wie die Koordinaten +eines Objekts. +

+Eine Variable vom Typ int belegt 32 bit (4 Byte), und kann +jeden Wert im Bereich -2147483648..2147483647 speichern. +

+Siehe auch Integer-Konstanten + + + +

real

+Der Datentyp real speichert Gleitkommazahlen mit Vorzeichen, z.B. +den Rasterabstand. +

+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 + + + +

string

+Der Datentyp string speichert Textinformation, z.B. den Namen eines Bauteils +oder eines Netzes. +

+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: +

+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! +

+Siehe auch Operatoren, +Builtin-Functions, +String-Konstanten +

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. +

+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 + + + +

Typecast

+Der Ergebnis-Typ eines arithmetischen +Ausdrucks +kann explizit in einen anderen arithmetischen Typ umgewandelt werden, +indem man einen +Typecast darauf anwendet. +

+Die allgemeine Syntax eines Typecast ist +

+type(expression)
+
+wobei type +char, +int oder +real ist und +expression jeder arithmetische +Ausdruck sein kann. +

+Wenn man mit Typecast einen Ausdruck vom Typ +real in +int umwandelt, wird der Dezimalbruch +des Wertes abgeschnitten. +

+Siehe auch Typ-Umwandlung + + + +

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. +

+Auf die "Properties" dieser Objekte kann mit Hilfe von Members +zugegriffen werden. +

+Es gibt zwei Arten von Members: +

+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. +

+Loop members werden verwendet, um auf Mehrfach-Objekte +derselben Art zuzugreifen, die in einem Objekt einer höheren Hierarchiestufe +enthalten sind: +

+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. +

+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: +

+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. +

+Objekt-Hierarchie einer Bibliothek: +

+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

+
+
+Data members +
+ + + + + + + + + + +
angle1 real (Startwinkel, 0.0...359.9)
angle2 real (Endwinkel, 0.0...719.9)
cap int (CAP_...)
layer int
radius int
width int
x1, y1 int (Startpunkt)
x2, y2 int (Endpunkt)
xc, yc int (Mittelpunkt)
+
+Siehe auch
UL_WIRE +

Konstanten

+ + + +
CAP_FLAT flache Kreisbogen-Enden
CAP_ROUND runde Kreisbogen-Enden
+

Anmerkung

+Start- und Endwinkel werden im mathematisch positiven Sinne ausgegeben +(also gegen den Uhrzeigersinn, "counterclockwise"), +wobei gilt angle1 < angle2. +Um diese Bedingung einzuhalten kann es sein, dass Start- und Endpunkt eines UL_ARC +gegenüber denen des UL_WIRE, von dem der Kreisbogen abstammt, vertauscht sind. +

Beispiel

+
+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

+
+
+Data members +
+ + + +
x1, y1 int (linke untere Ecke)
x2, y2 int (rechte obere Ecke)
+
+Siehe auch
UL_BOARD, +UL_DEVICE, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

+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. +

Beispiel

+
+board(B) {
+  printf("Area: (%d %d), (%d %d)\n",
+          B.area.x1, B.area.y1, B.area.x2, B.area.y2);
+  }
+
+ + + +

UL_ATTRIBUTE

+
+
+Data members +
+ + + + + + + +
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
+
+Siehe auch
UL_DEVICE, +UL_PART, +UL_INSTANCE, +UL_ELEMENT +

Konstanten

+ + + + +
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. +

Anmerkung

+display enthält einen bitweise ODER-verknüpften Wert, bestehend aus ATTRIBUTE_DISPLAY_FLAG_..., +der angibt welche Teile des Attributs dargestellt werden. +Dieser Wert ist nur dann gültig, wenn display in einem UL_INSTANCE- oder UL_ELEMENT-Kontext +benutzt wird. +

+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. +

Beispiel

+
+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);
+    }
+  }
+
+ + + +

UL_BOARD

+
+
+Data members +
+ + + + +
area UL_AREA
grid UL_GRID
name string (siehe Anmerkung)
+
+Loop members +
+ + + + + + + + + + + + + + +
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
+
+Siehe auch
UL_LIBRARY, +UL_SCHEMATIC +

Anmerkung

+Das name Member liefert den vollständigen Dateinamen, inklusive Verzeichnis. +

+Das Loop member attributes() geht durch die globalen Attribute. +

Beispiel

+
+board(B) {
+  B.elements(E) printf("Element: %s\n", E.name);
+  B.signals(S)  printf("Signal: %s\n", S.name);
+  }
+
+ + + +

UL_BUS

+
+
+Data members +
+ + +
name string (BUS_NAME_LENGTH)
+
+Loop members +
+ + +
segments() UL_SEGMENT
+
+Siehe auch
UL_SHEET +

Konstanten

+ + +
BUS_NAME_LENGTH max. Länge eines Busnamens (obsolet - ab Version 4 können Bus-Namen beliebig lang sein)
+

Beispiel

+
+schematic(SCH) {
+  SCH.sheets(SH) {
+    SH.busses(B) printf("Bus: %s\n", B.name);
+    }
+  }
+
+ + + +

UL_CIRCLE

+
+
+Data members +
+ + + + + +
layer int
radius int
width int
x, y int (Mittelpunkt)
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Beispiel

+
+board(B) {
+  B.circles(C) {
+    printf("Circle: (%d %d), r=%d, w=%d\n",
+           C.x, C.y, C.radius, C.width);
+    }
+  }
+
+ + + +

UL_CLASS

+
+
+Data members +
+ + + + + + +
clearance[number]int (siehe Anmerkung)
drill int
name string (siehe Anmerkung)
number int
width int
+
+Siehe auch
Design Rules, +UL_NET, +UL_SIGNAL, +UL_SCHEMATIC, +UL_BOARD +

Anmerkung

+Das clearance Data Member liefert den Mindestabstand zwischen dieser +Netzklasse und der Netzklasse mit der angegebenen Nummer. Wird keine Nummer +angegeben (und damit auch keine eckigen Klammern), wird der Mindestabstand der +Netzklasse selber geliefert. Wird eine Nummer angegeben, so muss diese zwischen +0 und der Nummer dieser Netzklasse liegen. +

+Wenn name einen leeren String liefert, ist die Netzklasse nicht definiert und wird somit +auch nicht von einem Signal oder Netz benutzt. +

Beispiel

+
+board(B) {
+  B.signals(S) {
+    printf("%-10s %d %s\n", S.name, S.class.number, S.class.name);
+    }
+  }
+
+ + + +

UL_CONTACT

+
+
+Data members +
+ + + + + + +
name string (CONTACT_NAME_LENGTH)
pad UL_PAD
signal string
smd UL_SMD
x, y int (Mittelpunkt, siehe Anmerkung)
+
+Siehe auch
UL_PACKAGE, +UL_PAD, +UL_SMD, +UL_CONTACTREF, +UL_PINREF +

Konstanten

+ + +
CONTACT_NAME_LENGTH max. empfohlene Länge eines "Contact"-Namens (wird nur für formatierte Ausgaben benutzt)
+

Anmerkung

+Das signal Data Member liefert den Namen des Signals, an das dieser Contact +angeschlossen ist (nur in einem Board-Kontext verfügbar). +

+Die Koordinaten (x, y) des "Contacts" hängen vom Kontext ab aus dem sie aufgerufen werden: +

+

Beispiel

+
+library(L) {
+  L.packages(PAC) {
+    PAC.contacts(C) {
+      printf("Contact: '%s', (%d %d)\n",
+             C.name, C.x, C.y);
+      }
+    }
+  }
+
+ + + +

UL_CONTACTREF

+
+
+Data members +
+ + + +
contact UL_CONTACT
element UL_ELEMENT
+
+Siehe auch
UL_SIGNAL, +UL_PINREF +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_DEVICE

+
+
+Data members +
+ + + + + + + + + + +
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")
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE (siehe Anmerkung)
gates() UL_GATE
+
+Siehe auch
UL_DEVICESET, +UL_LIBRARY, +UL_PART +

Konstanten

+ + + +
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. +

Anmerkung

+Das package Data Member liefert das Package, +das dem Device durch einen PACKAGE-Befehl zugewiesen +worden ist. Es kann als boolsche Funktion verwendet werden um zu prüfen, ob dem Device +ein Package zugewiesen wurde (siehe Beispiel unten). +

+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). +

Beispiele

+
+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);
+            }
+          }
+      }
+    }
+  }
+
+ + + +

UL_DEVICESET

+
+
+Data members +
+ + + + + + + + +
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")
+
+Loop members +
+ + + +
devices() UL_DEVICE
gates() UL_GATE
+
+Siehe auch
UL_DEVICE, +UL_LIBRARY, +UL_PART +

Konstanten

+ + + +
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)
+

Anmerkung

+Das description-Member liefert den vollständigen Beschreibungstext, der mit dem +DESCRIPTION-Befehl erzeugt wurde, während das headline-Member +nur die erste Zeile der Beschreibung ohne HTML-Tags ausgibt. +Wenn Sie description-Text schreiben, denken Sie daran, dass dieser Newline-Anweisungen +('\n') enthalten darf. +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_ELEMENT

+
+
+Data members +
+ + + + + + + + + + + + + +
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)
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE
texts() UL_TEXT (siehe Anmerkung)
+
+Siehe auch
UL_BOARD, +UL_CONTACTREF +

Konstanten

+ + + +
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)
+

Anmerkung

+Mit dem attribute[]-Member kann man ein UL_ELEMENT nach dem Wert eines +bestimmten Attributs fragen (siehe das zweite Beispiel). Der zurückgelieferte +String ist leer, wenn es kein Attribut mit dem angegebenen Namen gibt, oder +wenn dieses Attribut explizit leer ist. +

+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. +

Beispiele

+
+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"));
+    }
+  }
+
+ + + +

UL_FRAME

+
+
+Data members +
+ + + + + + + +
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)
+
+Loop members +
+ + + +
texts() UL_TEXT
wires() UL_WIRE
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Konstanten

+ + + + + +
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
+

Anmerkung

+border enthält einen bitweise ODER-verknüpften Wert, bestehend aus FRAME_BORDER_..., +der angibt welche der vier Ränder dargestellt werden. +

+Die Loop-Members texts() und wires() gehen durch alle Texte und +Linien, aus denen der Frame besteht. +

Beispiel

+
+board(B) {
+  B.frames(F) {
+    printf("Frame: (%d %d), (%d %d)\n",
+           F.x1, F.y1, F.x2, F.y2);
+    }
+  }
+
+ + + +

UL_GATE

+
+
+Data members +
+ + + + + + +
addlevel int (GATE_ADDLEVEL_...)
name string (GATE_NAME_LENGTH)
swaplevel int
symbol UL_SYMBOL
x, y int (Aufhängepunkt, siehe Anmerkung)
+
+Siehe auch
UL_DEVICE +

Konstanten

+ + + + + + +
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)
+

Anmerkung

+Die Koordinaten des Aufhängepunktes (x, y) sind immer bezogen auf die Lage des Gates +im Device, auch wenn das UL_GATE über ein UL_INSTANCE geholt wurde. +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_GRID

+
+
+Data members +
+ + + + + + + +
distance real
dots int (0=lines, 1=dots)
multiple int
on int (0=off, 1=on)
unit int (GRID_UNIT_...)
unitdist int (GRID_UNIT_...)
+
+Siehe auch
UL_BOARD, +UL_LIBRARY, +UL_SCHEMATIC, +Unit Conversions +

Konstanten

+ + + + + +
GRID_UNIT_MIC Micron
GRID_UNIT_MM Millimeter
GRID_UNIT_MIL Mil
GRID_UNIT_INCH Inch
+

Anmerkung

+unitdist liefert die Grid-Einheit mit der die tatsächliche Größe des Rasters +(die durch distance geliefert wird) definiert wurde, während unit +die Grid-Einheit liefert, die für die Anzeige von Werten und die Umrechnung von +Benutzereingaben verwendet wird. +

Beispiel

+
+board(B) {
+  printf("Gridsize=%f\n", B.grid.distance);
+  }
+
+ + + +

UL_HOLE

+
+
+Data members +
+ + + + + +
diameter[layer] int (siehe Anmerkung)
drill int
drillsymbol int
x, y int (Mittelpunkt)
+
+Siehe auch
UL_BOARD, +UL_PACKAGE +

Anmerkung

+diameter[] ist nur für die Layer LAYER_TSTOP und LAYER_BSTOP definiert +und liefert den Durchmesser der Lötstopmaske im jeweiligen Layer. +

+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. +

Beispiel

+
+board(B) {
+  B.holes(H) {
+    printf("Hole: (%d %d), drill=%d\n",
+           H.x, H.y, H.drill);
+    }
+  }
+
+ + + +

UL_INSTANCE

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+Loop members +
+ + + + +
attributes() UL_ATTRIBUTE (siehe Anmerkung)
texts() UL_TEXT (siehe Anmerkung)
xrefs() UL_GATE (siehe Anmerkung)
+
+Siehe auch
UL_PART, +UL_PINREF +

Konstanten

+ + + +
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!)
+

Anmerkung

+Das attributes()-Member läuft nur durch die Attribute, die explizit dieser +Instance zugewiesen wurden (einschließlich gesmashter Attribute). +

+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). +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_JUNCTION

+
+
+Data members +
+ + + +
diameter int
x, y int (Mittelpunkt)
+
+Siehe auch
UL_SEGMENT +

Beispiel

+
+schematic(SCH) {
+  SCH.sheets(SH) {
+    SH.nets(N) {
+      N.segments(SEG) {
+        SEG.junctions(J) {
+          printf("Junction: (%d %d)\n", J.x, J.y);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_LABEL

+
+
+Data members +
+ + + + + + + + +
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)
+
+Loop members +
+ + +
wires() UL_WIRE (siehe Anmerkung)
+
+Siehe auch
UL_SEGMENT +

Anmerkung

+Falls xref ungleich 0 ist, läuft das wires() Loop member durch die +Wires, aus denen die Umrandung des Querverweis-Labels besteht. Ansonsten ist die +Schleife leer. +

+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. +

Beispiel

+
+sheet(SH) {
+  SH.nets(N) {
+    N.segments(S) {
+      S.labels(L) {
+        printf("Label: %d %d '%s'", L.x, L.y, L.text.value);
+        }
+      }
+    }
+  }
+
+ + + +

UL_LAYER

+
+
+Data members +
+ + + + + + + +
color int
fill int
name string (LAYER_NAME_LENGTH)
number int
used int (0=unbenutzt, 1=benutzt)
visible int (0=off, 1=on)
+
+Siehe auch
UL_BOARD, +UL_LIBRARY, +UL_SCHEMATIC +

Konstanten

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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)
+

Beispiel

+
+board(B) {
+  B.layers(L) printf("Layer %3d %s\n", L.number, L.name);
+  }
+
+ + + +

UL_LIBRARY

+
+
+Data members +
+ + + + + +
description string (siehe Anmerkung)
grid UL_GRID
headline string
name string (LIBRARY_NAME_LENGTH, siehe Anmerkung)
+
+Loop members +
+ + + + + + +
devices() UL_DEVICE
devicesets() UL_DEVICESET
layers() UL_LAYER
packages() UL_PACKAGE
symbols() UL_SYMBOL
+
+Siehe auch
UL_BOARD, +UL_SCHEMATIC +

Konstanten

+ + +
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. +

Anmerkung

+Das description-Member liefert den vollständigen Beschreibungstext, der mit dem +DESCRIPTION-Befehl erzeugt wurde, während das headline-Member +nur die erste Zeile der Beschreibung ohne HTML-Tags ausgibt. +Wenn Sie den description-Text benutzen, denken Sie daran, dass dieser Newline-Anweisungen ('\n') enthalten darf. +Die description und headline Texte stehen nur direkt innerhalb einer Library-Zeichnung +zur Verfügung, nicht wenn die Bibliothek aus einem UL_BOARD- oder UL_SCHEMATIC-Kontext heraus angesprochen wird. +

+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. +

Beispiel

+
+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);
+  }
+
+ + + +

UL_NET

+
+
+Data members +
+ + + + + +
class UL_CLASS
column string (see note)
name string (NET_NAME_LENGTH)
row string (see note)
+
+Loop members +
+ + + +
pinrefs() UL_PINREF (siehe Anmerkung)
segments() UL_SEGMENT (siehe Anmerkung)
+
+Siehe auch
UL_SHEET, +UL_SCHEMATIC +

Konstanten

+ + +
NET_NAME_LENGTH max. empfohlene Länge eines Netznamens (wird nur für formatierte Ausgaben benutzt)
+

Anmerkung

+Das Loop member pinrefs() kann nur benutzt werden, wenn das +Net innerhalb eines UL_SCHEMATIC-Kontexts verwendet wird.
+Das Loop member segments() kann nur benutzt werden, +wenn das Net innerhalb eines UL_SHEET-Kontexts verwendet wird. +

+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. +

Beispiel

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_PACKAGE

+
+
+Data members +
+ + + + + + +
area UL_AREA
description string
headline string
library string
name string (PACKAGE_NAME_LENGTH)
+
+Loop members +
+ + + + + + + + + +
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
+
+Siehe auch
UL_DEVICE, +UL_ELEMENT, +UL_LIBRARY +

Konstanten

+ + +
PACKAGE_NAME_LENGTH max. empfohlene Länge eines Package-Namens (wird nur für formatierte Ausgaben benutzt)
+

Anmerkung

+Das description-Member liefert den vollständigen Beschreibungstext, der mit dem +DESCRIPTION-Befehl erzeugt wurde, während das headline-Member +nur die erste Zeile der Beschreibung ohne HTML-Tags ausgibt. +Wenn Sie description-Text schreiben, denken Sie daran, dass dieser Newline-Anweisungen ('\n') enthalten darf. +

+Stammt das UL_PACKAGE aus einem UL_ELEMENT-Kontext, so durchläuft das texts()-Member +nur die nicht losgelösten Texte dieses Elements. +

Beispiel

+
+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);
+    }
+  }
+
+ + + +

UL_PAD

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+Siehe auch
UL_PACKAGE, +UL_CONTACT, +UL_SMD +

Konstanten

+ + + + +
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)
+

Anmerkung

+Die Parameter des Pads hängen vom Kontext ab in dem es angesprochen wird: + +

+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. +

Beispiel

+
+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]);
+      }
+    }
+  }
+
+ + + +

UL_PART

+
+
+Data members +
+ + + + + + +
attribute[] string (siehe Anmerkung)
device UL_DEVICE
deviceset UL_DEVICESET
name string (PART_NAME_LENGTH)
value string (PART_VALUE_LENGTH)
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE (siehe Anmerkung)
instances() UL_INSTANCE (siehe Anmerkung)
+
+Siehe auch
UL_SCHEMATIC, +UL_SHEET +

Konstanten

+ + + +
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)
+

Anmerkung

+Mit dem attribute[]-Member kann man ein UL_PART nach dem Wert eines +bestimmten Attributs fragen (siehe das zweite Beispiel). Der zurückgelieferte +String ist leer, wenn es kein Attribut mit dem angegebenen Namen gibt, oder +wenn dieses Attribut explizit leer ist. +

+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. +

Beispiel

+
+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"]);
+    }
+  }
+
+ + + +

UL_PIN

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+Loop members +
+ + + + +
circles() UL_CIRCLE
texts() UL_TEXT
wires() UL_WIRE
+
+Siehe auch
UL_SYMBOL, +UL_PINREF, +UL_CONTACTREF +

Konstanten

+ + + + + + + + + + +
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
+

Anmerkung

+Das contact Data Member liefert den Contact, +der dem Pin durch einen CONNECT-Befehl zugewiesen +worden ist. Es kann als boolsche Funktion verwendet werden um zu prüfen, ob dem Pin +ein Contact zugewiesen wurde (siehe Beispiel unten). +

+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 name Data Member liefert den Namen des Pins immer so, wie er in der Bibliothek +definiert wurde, einschließlich eines etwaigen '@'-Zeichens für Pins mit dem gleichen Namen +(siehe PIN-Befehl).
+Das texts Loop-Member dagegen liefert den Pin-Namen (sofern er sichtbar ist) immer +in der Form, wie er im aktuellen Zeichnungstyp dargestellt wird. +

+Das net Data Member liefert den Namen des Netzes, an das der Pin angeschlossen ist +(nur in einem UL_SCHEMATIC-Kontext verfügbar). +

Beispiel

+
+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);
+        }
+      }
+    }
+  }
+
+ + + +

UL_PINREF

+
+
+Data members +
+ + + + +
instance UL_INSTANCE
part UL_PART
pin UL_PIN
+
+Siehe auch
UL_SEGMENT, +UL_CONTACTREF +

Beispiel

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_POLYGON

+
+
+Data members +
+ + + + + + + + + +
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
+
+Loop members +
+ + + + +
contours() UL_WIRE (siehe Anmerkung)
fillings() UL_WIRE
wires() UL_WIRE
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SIGNAL, +UL_SYMBOL +

Konstanten

+ + + +
POLYGON_POUR_SOLID solid
POLYGON_POUR_HATCH hatch
+

Anmerkung

+Die Loop-Member contours() und fillings() gehen durch alle Wires, mit +denen das Polygon gezeichnet wird, sofern es zu einem Signal gehört und mit +dem Befehl RATSNEST freigerechnet wurde. +Das Loop-Member wires() geht immer durch die Wires, die vom Benutzer gezeichnet +wurden. Für nicht freigerechnete Signal-Polygone liefert contours() dasselbe +Ergebnis wie wires(). Fillings() hat dann keine Bedeutung. +

+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. +

Polygon-Strichstärke

+Wenn Sie das Loop-Member fillings() verwenden um die Füll-Linien +des Polygons zu erreichen, stellen Sie sicher, dass die Strichstärke +width des Polygons nicht null ist (sie sollte etwas über null liegen, +bzw. mindestens der Auflösung des Ausgabetreibers mit dem Sie die Zeichnung ausgeben +wollen entsprechen). +Zeichnen Sie ein Polygon mit Strichstärke = 0, ergibt sich eine riesige Datenmenge, da +das Polygon mit der kleinsten Editor-Auflösung von 1/10000mm berechnet wird. +

Teilpolygone

+Ein berechnetes Polygon kann aus verschiedenen getrennten Teilen (positivePolygone +genannt) bestehen, wobei jedes davon Aussparungen (negative Polygone genannt) +enthalten kann, die von anderen Objekten, die vom Polygon subtrahiert werden, +herrühren. Negative Polygone können wiederum weitere positive Polygone enthalten +und so weiter. +

+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. +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_RECTANGLE

+
+
+Data members +
+ + + + + +
angle real (0.0...359.9)
layer int
x1, y1 int (linke untere Ecke)
x2, y2 int (rechte obere Ecke)
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

+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. +

Beispiel

+
+board(B) {
+  B.rectangles(R) {
+    printf("Rectangle: (%d %d), (%d %d)\n",
+           R.x1, R.y1, R.x2, R.y2);
+    }
+  }
+
+ + + +

UL_SCHEMATIC

+
+
+Data members +
+ + + + +
grid UL_GRID
name string (siehe Anmerkung)
xreflabel string
+
+Loop members +
+ + + + + + + + +
attributes() UL_ATTRIBUTE (siehe Anmerkung)
classes() UL_CLASS
layers() UL_LAYER
libraries() UL_LIBRARY
nets() UL_NET
parts() UL_PART
sheets() UL_SHEET
+
+Siehe auch
UL_BOARD, +UL_LIBRARY +

Anmerkung

+Das name Member liefert den vollständigen Dateinamen, inklusive Verzeichnis. +

+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. +

Beispiel

+
+schematic(S) {
+  S.parts(P) printf("Part: %s\n", P.name);
+  }
+
+ + + +

UL_SEGMENT

+
+
+Loop members +
+ + + + + + +
junctions() UL_JUNCTION (siehe Anmerkung)
labels() UL_LABEL
pinrefs() UL_PINREF (siehe Anmerkung)
texts() UL_TEXT (veraltet, siehe Anmerkung)
wires() UL_WIRE
+
+Siehe auch
UL_BUS, +UL_NET +

Anmerkung

+Die Loop members junctions() und pinrefs() +sind nur für Netzsegmente zugänglich. +

+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. +

Beispiel

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_SHEET

+
+
+Data members +
+ + + +
area UL_AREA
number int
+
+Loop members +
+ + + + + + + + + + +
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
+
+Siehe auch
UL_SCHEMATIC +

Beispiel

+
+schematic(SCH) {
+  SCH.sheets(S) {
+    printf("Sheet: %d\n", S.number);
+    }
+  }
+
+ + + +

UL_SIGNAL

+
+
+Data members +
+ + + + +
airwireshiddenint
class UL_CLASS
name string (SIGNAL_NAME_LENGTH)
+
+Loop members +
+ + + + + +
contactrefs() UL_CONTACTREF
polygons() UL_POLYGON
vias() UL_VIA
wires() UL_WIRE
+
+Siehe auch
UL_BOARD +

Konstanten

+ + +
SIGNAL_NAME_LENGTH max. empfohlene Länge eines Signalnamens (wird nur für formatierte Ausgaben benutzt)
+

Beispiel

+
+board(B) {
+  B.signals(S) printf("Signal: %s\n", S.name);
+  }
+
+ + + +

UL_SMD

+
+
+Data members +
+ + + + + + + + + +
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)
+
+Siehe auch
UL_PACKAGE, +UL_CONTACT, +UL_PAD +

Konstanten

+ + + + +
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)
+

Anmerkung

+Die Parameter des SMDs hängen vom Kontext ab in dem es angesprochen wird: + +Ruft man die Data Member dx und dy mit einem optionalen Layer-Index auf, +werden die Werte für den zugehörigen Layer, entsprechend den Design Rules +ausgegeben. +Gültige Layer sind LAYER_TOP, LAYER_TSTOP und LAYER_TCREAM für ein +Smd im Top-Layer, und LAYER_BOTTOM, LAYER_BSTOP und LAYER_BCREAM für ein Smd im Bottom-Layer. +

+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. +

Beispiel

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_SYMBOL

+
+
+Data members +
+ + + + +
area UL_AREA
library string
name string (SYMBOL_NAME_LENGTH)
+
+Loop members +
+ + + + + + + + +
circles() UL_CIRCLE
frames() UL_FRAME
rectangles() UL_RECTANGLE
pins() UL_PIN
polygons() UL_POLYGON
texts() UL_TEXT (siehe Anmerkung)
wires() UL_WIRE
+
+Siehe auch
UL_GATE, +UL_LIBRARY +

Konstanten

+ + +
SYMBOL_NAME_LENGTH max. empfohlene Länge eines Symbol-Namens (wird nur für formatierte Ausgaben benutzt)
+

Anmerkung

+Stammt das UL_SYMBOL aus einem UL_INSTANCE-Kontext, so durchläuft das texts()-Member +nur die nicht losgelösten Texte dieser Instance. +

Beispiel

+
+library(L) {
+  L.symbols(S) printf("Sym: %s\n", S.name);
+  }
+
+ + + +

UL_TEXT

+
+
+Data members +
+ + + + + + + + + + +
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)
+
+Loop members +
+ + +
wires() UL_WIRE (siehe Anmerkung)
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Konstanten

+ + + + +
FONT_VECTOR Vector-Font
FONT_PROPORTIONAL Proportional-Font
FONT_FIXED Fixed-Font
+

Anmerkung

+Das Loop-Member wires() greift immer auf die individuellen Wires, aus denen der Text +im Vektor-Font zusammengesetzt wird, zu. Auch dann, wenn der aktuelle Font nicht +FONT_VECTOR ist. +

+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. +

Beispiel

+
+board(B) {
+  B.texts(T) {
+    printf("Text: %s\n", T.value);
+    }
+  }
+
+ + + +

UL_VIA

+
+
+Data members +
+ + + + + + + + + +
diameter[layer] int
drill int
drillsymbol int
end int
flags int (VIA_FLAG_...)
shape[layer] int (VIA_SHAPE_...)
start int
x, y int (Mittelpunkt)
+
+Siehe auch
UL_SIGNAL +

Konstanten

+ + +
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
+

Anmerkung

+Der Durchmesser und die Form des Vias hängen davon ab für welchen Layer es gezeichnet +werden soll, denn es können in den Design Rules unterschiedliche +Werte definiert werden. +Gibt man einen der Layer LAYER_TOP...LAYER_BOTTOM, LAYER_TSTOP oder LAYER_BSTOP +als Index für diameter oder shape an, wird das Via entsprechend den Vorgaben aus den Design Rules +berechnet. Wird LAYER_VIAS angegeben, wird der ursprüngliche Wert mit dem das Via definiert wurde, +verwendet. +

+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. +

Beispiel

+
+board(B) {
+  B.signals(S) {
+    S.vias(V) {
+      printf("Via: (%d %d)\n", V.x, V.y);
+      }
+    }
+  }
+
+ + + +

UL_WIRE

+
+
+Data members +
+ + + + + + + + + +
arc UL_ARC
cap int (CAP_...)
curve real
layer int
style int (WIRE_STYLE_...)
width int
x1, y1 int (Anfangspunkt)
x2, y2 int (Endpunkt)
+
+Loop members +
+ + +
pieces() UL_WIRE (siehe Anmerkung)
+
+Siehe auch
UL_BOARD, +UL_PACKAGE, +UL_SEGMENT, +UL_SHEET, +UL_SIGNAL, +UL_SYMBOL, +UL_ARC +

Konstanten

+ + + + + + + +
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
+

Wire Style

+Bei einem UL_WIRE mit anderem style als WIRE_STYLE_CONTINUOUS, kann +über das Loop-Member pieces() auf die individuellen Teile, die z. B. eine gestrichelte +Linie darstellen, zugegriffen werden. Wenn pieces() für UL_WIRE mit +WIRE_STYLE_CONTINUOUS aufgerufen wird, erhält man ein Segment, das +genau dem original UL_WIRE entspricht. Das Loop-Member pieces() kann nicht +von UL_WIRE aus aufgerufen werden, wenn dieser selbst schon über pieces() +aufgerufen wurde (das würde eine unendliche Schleife verursachen). +

Kreisbögen auf Wire-Ebene

+Kreisbögen sind zunächst einfach nur Wires, mit einigen zusätzlichen Eigenschaften. +In erster Näherung werden Kreisbögen genauso behandelt wie Wires, das heisst sie haben +einen Anfangs- und Endpunkt, eine Breite und einen Linientyp. Hinzu kommen auf +Wire-Ebene die Parameter cap und curve. cap gibt an ob die Kreisbogen-Enden +rund oder flach sind, und curve bestimmt die "Krümmung" des Kreisbogens. +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. +

+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. +

Beispiel

+
+board(B) {
+  B.wires(W) {
+    printf("Wire: (%d %d) (%d %d)\n",
+           W.x1, W.y1, W.x2, W.y2);
+    }
+  }
+
+ + + +

Definitionen

+Konstanten, Variablen und Funktionen müssen definiert werden, +bevor sie in einem User-Language-Programm verwendet werden können. +

+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-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. +

+Konstanten kann man auch mit bestimmten Werten initialisieren, wie in +

+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. +

Beispiele

+ + + + + + + +
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
+Die Members von Elementen eines Arrays von Objekt-Typen können nicht direkt angesprochen werden: +
+UL_SIGNAL signals[];
+...
+UL_SIGNAL s = signals[0];
+printf("%s", s.name);
+
+ + + +

Funktions-Definitionen

+Sie können Ihre eigenen User-Language-Funktionen schreiben und sie genau so +aufrufen wie +
Builtin-Functions. +

+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. +

Die spezielle Funktion main()

+Wenn Ihr User-Language-Programm eine Funktion namens +main() enthält, wird diese Funktion explizit als Hauptfunktion +aufgerufen. Ihr Rückgabewert ist der +Rückgabewert des Programms. +

+Kommandozeilen-Argumente sind für das Programm über die globalen +Builtin-Variablen argc und argv +verfügbar. +

Beispiel

+
+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));
+  }
+
+ + + +

Operatoren

+Die folgende Tabelle listet alle User-Language-Operatoren in der Reihenfolge +ihrer Priorität auf (Unary hat die höchste Priorität, +Comma die niedrigste): +

+ + + + + + + + + + + + + + + +
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
+ + + +

Logische Operatoren

+Logische Operatoren arbeiten mit +Ausdrücken +von jedem Datentyp. +

+ + + + + + +
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
+ + + +

Evaluation-Operatoren

+Evaluation-Operatoren werden verwendet, um +Ausdrücke auszuwerten, die auf einer +Bedingung basieren, oder um eine Sequenz von Ausdrücken zu gruppieren +und sie als einen Ausdruck auszuwerten. +

+ + + +
?: 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. +

Beispiele

+
+a + b
+c++
+m << 1
+
+ + + +

Zuweisungs-Ausdruck

+Ein Zuweisungs-Ausdruck besteht aus einer Variablen auf der +linken Seite eines
Zuweisungsoperators und +einem Ausdruck auf der rechten Seite. +

Beispiele

+
+a = x + 42
+b += c
+s = "Hello"
+
+ + + +

String-Ausdruck

+Ein String-Ausdruck ist jede Kombination von +
string- und char- +Operanden und einem String-Operator. +

Beispiele

+
+s + ".brd"
+t + 'x'
+
+ + + +

Komma-Ausdruck

+Ein Komma-Ausdruck ist eine Sequenz von Ausdrücken, die mit dem +
Komma-Operator abgegrenzt werden. +

+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. +

Beispiel

+
+i++, j++, k++
+
+ + + +

Bedingter Ausdruck

+Ein bedingter Ausdruck verwendet den +
Conditional-Operator, um eine Entscheidung +innerhalb eines Ausdrucks zu treffen. +

Beispiel

+
+int a;
+// ...code that calculates 'a'
+string s = a ? "True" : "False";
+
+ + + +

Funktionsaufruf

+Ein Funktionsaufruf transferiert den Programmfluss zu einer +
benutzerdefinierten Funktion oder einer +Builtin-Function. +Die formalen Parameter, die in der +Funktions-Definition definiert sind, +werden ersetzt durch die Werte der Ausdrücke, die als aktuelle Argumente +des Funktionsaufrufs dienen. +

Beispiel

+
+int p = strchr(s, 'b');
+
+ + + +

Statements

+Ein Statement kann folgendes sein: +
+Statements spezifizieren die Programmausführung. Wenn keine Control-Statements +vorhanden sind, werden Statements der Reihe nach in der Reihenfolge +ihres Auftretens in der ULP-Datei ausgeführt. + + + +

Compound-Statement (Verbundanweisung)

+Ein Compound-Statement (auch bekannt als Block) +ist eine Liste (kann auch leer sein) von Statements in geschweiften +Klammern ({}). +Syntaktisch kann ein Block als einzelnes Statement angesehen werden, +aber er steuert auch den Gültigkeitsbereich von Identifiern. +Ein +
Identifier, der innerhalb eines Blocks +deklariert wird, gilt ab der Stelle, an der er definiert wurde, bis +zur schließenden geschweiften Klammer. +

+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. + + + +

Control-Statements (Steueranweisungen)

+Control-Statements werden verwendet, um den Programmfluss +zu steuern. +

+Iteration-Statements sind +

+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. + + + +

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. +

+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. +

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: +
    +
  1. Wenn es einen Initialisierungs-Ausdruck init gibt, wird er ausgeführt. +
  2. Wenn es einen test-Ausdruck gibt, wird er ausgeführt. Wenn das Ergebnis +ungleich null ist (oder wenn es keinen test-Ausdruck gibt), wird das +statement ausgeführt. +
  3. Wenn es einen inc-Ausdruck gibt, wird er ausgeführt. +
  4. Schließlich wird die Programmsteuerung wieder an Schritt 2 übergeben. +
+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. +

+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. +

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. +

+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 +

+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. + + + +

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). +

+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. +

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. +

+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. +

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. +

+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: +

+ + + + + + + + + + + +
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[]
+ + + +

Builtin Variablen

+Builtin-Variablen werden verwendet, um zur Laufzeit Informationen zu erhalten. +

+ + + +
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)
+ + +
+

Builtin-Functions

+Builtin-Functions werden für spezielle Aufgaben benötigt, +z.B. formatierte Strings drucken, Daten-Arrays sortieren o.ä. +

+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: +

+Alphabetische Auflistung aller Builtin-Functions: + + + + +

Character-Funktionen

+Mit Character-Funktionen manipuliert man einzelne Zeichen. +

+Die folgenden Character-Funktionen sind verfügbar: +

+ + + +

is...()

+
+
+Funktion +
+Prüfen, ob ein Zeichen in eine bestimmte Kategorie fällt. +
+Syntax +
+int isalnum(char c);
+int isalpha(char c);
+int iscntrl(char c);
+int isdigit(char c);
+int isgraph(char c);
+int islower(char c);
+int isprint(char c);
+int ispunct(char c);
+int isspace(char c);
+int isupper(char c);
+int isxdigit(char c); +
+Rückgabewert +
+Die is...-Funktionen liefern einen Wert ungleich null, wenn das +Zeichen in die Kategorie fällt, sonst null. +
+

Character-Kategorien

+ + + + + + + + + + + + +
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)
+

Beispiel

+
+char c = 'A';
+if (isxdigit(c))
+   printf("%c is hex\n", c);
+else
+   printf("%c is not hex\n", c);
+
+ + +
+

to...()

+
+
+Funktion +
+Buchstaben in Groß- oder Kleinbuchstaben umwandeln. +
+Syntax +
+char tolower(char c);
+char toupper(char c); +
+Rückgabewert +
+Die tolower-Funktion gibt den konvertierten Buchstaben zurück, +wenn c ein Großbuchstabe ist. Alle anderen Zeichen werden +unverändert zurückgegeben.
+Die toupper-Funktion gibt den konvertierten Buchstaben zurück, +wenn c ein Kleinbuchstabe ist. Alle anderen Zeichen werden +unverändert zurückgegeben. +
+Siehe auch
strupr, +strlwr + + + +

Datei-Funktionen

+Datei-Funktionen behandeln Datei-Namen, -Größen +und -Zeitstempel. +

+Folgende Datei-Funktionen sind verfügbar: +

+Weitere Informationen über Ausgaben in eine Datei, finden Sie unter output(). + + + +

fileerror()

+
+
+Funktion +
+Zeigt den Status von I/O-Operationen. +
+Syntax +
+int fileerror(); +
+Rückgabewert +
+Gibt die fileerror-Funktion 0 zurück, ist alles in Ordnung. +
+Siehe auch
output, +printf, +fileread +

+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. +

Beispiel

+
+fileerror();
+output("file.txt", "wt") {
+  printf("Test\n");
+  }
+if (fileerror())
+   exit(1);
+
+ + + +

fileglob()

+
+
+Funktion +
+Sucht in einem Verzeichnis. +
+Syntax +
+int fileglob(string &array[], string pattern); +
+Rückgabewert +
+Die Funktion fileglob liefert die Anzahl der Einträge, die in array kopiert wurden. +
+Siehe auch
dlgFileOpen(), +dlgFileSave() +

+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. +

Hinweis für Windows-Anwender

+
+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. +

+

Beispiel

+
+string a[];
+int n = fileglob(a, "*.brd");
+
+ + + +

Dateinamens-Funktionen

+
+
+Funktion +
+Datei-Namen in seine Einzelteile aufspalten. +
+Syntax +
+string filedir(string file);
+string fileext(string file);
+string filename(string file);
+string filesetext(string file, string newext); +
+Rückgabewert +
+filedir liefert das Directory von file (einschließlich Laufwerksbuchstaben unter Windows).
+fileext liefert die Extension von file.
+filename liefert den File-Namen von file (einschließlich Extension).
+filesetext liefert file mit Extension auf newext gesetzt. +
+Siehe auch
Datei-Daten-Funktionen +

Beispiel

+
+if (board) board(B) {
+  output(filesetext(B.name, ".out")) {
+    ...
+    }
+  }
+
+ + + +

Datei-Daten-Funktionen

+
+
+Funktion +
+Holt den Timestamp und die Größe einer Datei. +
+Syntax +
+int filesize(string filename);
+int filetime(string filename); +
+Rückgabewert +
+filesize liefert die Größe (in Byte) der Datei.
+filetime liefert den Timestamp der Datei in einem Format, das mit den
Zeit-Funktionen benutzt wird. +
+Siehe auch time, +Dateinamens-Funktionen +

Beispiel

+
+board(B)
+  printf("Board: %s\nSize: %d\nTime: %s\n",
+         B.name, filesize(B.name),
+         t2string(filetime(B.name)));
+
+ + + +

Datei-Einlese-Funktionen

+Datei-Einlese-Funktionen werden verwendet um Daten von Dateien einzulesen. +

+Folgendes Datei-Einlesen ist möglich: +

+Siehe output() für Informationen zum Thema 'In eine Datei schreiben'. + + + +

fileread()

+
+
+Funktion +
+Liest Daten aus einer Datei aus. +
+Syntax +
+int fileread(dest, string file); +
+Rückgabewert +
+fileread liefert die Anzahl der Objekte, die aus einer Datei ausgelesen wurden.
+Die tatsächliche Bedeutung des Rückgabewerts hängt vom dest-Typ ab. +
+Siehe auch
lookup, +strsplit, +fileerror +

+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). +

Beispiel

+
+char b[];
+int nBytes = fileread(b, "data.bin");
+string lines[];
+int nLines = fileread(lines, "data.txt");
+string text;
+int nChars = fileread(text, "data.txt");
+
+ + + +

Mathematische Funktionen

+Mathematische Funktionen werden dazu verwendet, matematische +Operationen auszuführen. +

+Die folgenden mathematischen Funktionen sind verfügbar: +

+

Fehlermeldungen

+Wenn die Argumente eines mathematischen Funktionsaufrufs zu einem Fehler führen, +zeigen die Fehlermeldungen die aktuellen Werte der Argumente. Deshalb +führen die Statements +
+real x = -1.0;
+real r = sqrt(2 * x);
+
+zur Fehlermeldung +
+Invalid argument in call to 'sqrt(-2)'
+
+ + + +

Absolutwert-, Maximum- und Minimum-Funktion

+
+
+Funktion +
+Absolutwert-, Maximum- und Minimum-Funktion. +
+Syntax +
+type abs(type x);
+type max(type x, type y);
+type min(type x, type y); +
+Rückgabewert +
+abs liefert den absoluten Wert von x.
+max liefert das Maximum von x und y.
+min liefert das Minimum von x und y. +

+Der Return-Typ dieser Funktionen ist identisch mit dem größeren Typ der Argumente. +type muss +char, +int oder +real sein. +

+

Beispiel

+
+real x = 2.567, y = 3.14;
+printf("The maximum is %f\n", max(x, y));
+
+ + + +

Rundungs-Funktionen

+
+
+Funktion +
+Rundungs-Funktionen. +
+Syntax +
+real ceil(real x);
+real floor(real x);
+real frac(real x);
+real round(real x);
+real trunc(real x); +
+Rückgabewert +
+ceil liefert den kleinsten Integer-Wert nicht kleiner als x.
+floor liefert den größten Integer-Wert nicht größer als x.
+frac liefert den Dezimalbruch von x.
+round liefert x gerundet auf den nächsten Integer-Wert.
+trunc liefert den ganzzahligen Teil von x. +
+

Beispiel

+
+real x = 2.567;
+printf("The rounded value of %f is %f\n", x, round(x));
+
+ + +
+

Trigonometrische Funktionen

+
+
+Funktion +
+Trigonometrische Funktionen. +
+Syntax +
+real acos(real x);
+real asin(real x);
+real atan(real x);
+real cos(real x);
+real sin(real x);
+real tan(real x); +
+Rückgabewert +
+acos liefert den arc-cosinus von x.
+asin liefert den arc-sinus von x.
+atan liefert den arc-tangens von x.
+cos liefert den cosinus von x.
+sin liefert den sinus von x.
+tan liefert den tangens von x. +
+

Konstanten

+ + +
PI der Wert von "pi" (3.14...)
+

Beispiel

+
+real x = PI / 2;
+printf("The sine of %f is %f\n", x, sin(x));
+
+ + +
+

Exponential-Funktionen

+
+
+Funktion +
+Exponential-Funktionen. +
+Syntax +
+real exp(real x);
+real log(real x);
+real log10(real x);
+real pow(real x, real y);
+real sqrt(real x); +
+Rückgabewert +
+exp liefert e hoch x.
+log liefert den natürlichen Logarithmus von x.
+log10 liefert den Zehnerlogarithmus von x.
+pow liefert den Wert von x hoch y.
+sqrt liefert die Quadratwurzel von x. +
+

Anmerkung

+Die "n-te" Wurzel kann mit Hilfe der pow-Funktion und einem negativen +Exponenten berechnet werden. +

Beispiel

+
+real x = 2.1;
+printf("The square root of %f is %f\n", x, sqrt(x));
+
+ + +
+

Sonstige Funktionen

+Sonstige Funktionen werden für weitere Aufgaben benötigt. +

+Die folgenden sonstigen Funktionen sind verfügbar: +

+ + + +

exit()

+
+
+Funktion +
+Beendet ein User-Language-Programm. +
+Syntax +
+void exit(int result);
+void exit(string command); +
+Siehe auch
RUN +

+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. +

Konstanten

+ + + +
EXIT_SUCCESS Rückgabewert für erfolgreiche Programmausführung (Wert 0)
EXIT_FAILURE Rückgabewert für fehlerhafte Programmausführung (Wert -1)
+ + + +

language()

+
+
+Funktion +
+Liefert den Sprachcode des verwendeten Systems. +
+Syntax +
+string language(); +
+Rückgabewert +
+language liefert einen String bestehend aus zwei Kleinbuchstaben, +der die auf dem aktuellen System verwendete Sprache angibt. +Falls sich diese Einstellung nicht ermitteln lässt, wird ein leerer +String zurückgegeben. +
+Die language-Funktion kann dazu benutzt werden, in einem ULP unterschiedliche +Texte zu verwenden, je nachdem welche Sprache das aktuelle System verwendet. +

+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. +

Beispiel

+
+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()

+
+
+Funktion +
+Sucht Daten in einem String-Array. +
+Syntax +
+string lookup(string array[], string key, int field_index[, char separator]);
+string lookup(string array[], string key, string field_name[, char separator]); +
+Rückgabewert +
+lookup liefert den Wert des Feldes, das durch field_index +oder field_name markiert wird.
+Existiert dieses Feld nicht oder wird kein passender String für key gefunden, +kommt ein leerer String zurück. +
+Siehe auch
fileread, +strsplit +

+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
+
+

Beispiel

+
+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');
+   }
+
+ + + +

palette()

+
+
+Funktion +
+Liefert Farbpaletten-Information. +
+Syntax +
+int palette(int index[, int type]); +
+Rückgabewert +
+Die palette-Funktion liefert einen ARGB-Wert als Integer-Zahl der Form 0xaarrggbb, +oder den Typ der momentan verwendeten Palette (abhängig vom Wert von index). +
+Die palette-Funktion liefert den ARGB-Wert der Farbe mit dem gegebenen +index (welcher im Bereich 0..PALETTE_ENTRIES-1 liegen kann). Falls type +nicht angegeben ist (oder den Wert -1 hat) wird die Palette verwendet, die dem +aktuellen Editor-Fenster zugewiesen ist. Ansonsten gibt type an, welche +Palette verwendet werden soll (PALETTE_BLACK, PALETTE_WHITE oder PALETTE_COLORED). +

+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. +

Konstanten

+ + + + + + +
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)
+ + +
+

sort()

+
+
+Funktion +
+Sortiert ein Array oder einen Satz von Arrays. +
+Syntax +
+void sort(int number, array1[, array2,...]); +
+Die sort-Funktion sortiert entweder direkt ein array1, +oder sie sortiert einen Satz von Arrays (beginnend mit array2), +wobei array1 ein int-Array ist, das als Pointer-Array +verwendet wird. +

+In jedem Fall definiert das Argument number die Zahl der +Einträge im Array oder in den Arrays. +

Einzelnes Array sortieren

+Wenn die sort-Funktion mit einem einzelnen Arrray aufgerufen wird, +wird dieses Array direkt sortiert, wie im folgenden Beispiel: +
+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]);
+
+

Einen Satz von Arrays sortieren

+Wenn die sort-Funktion mit mehr als einem Array aufgerufen wird, +muss das erste Array ein int-Array sein, während alle anderen +Arrays von jedem Typ sein können. Sie enthalten die zu sortierenden Daten. +Das folgende Beispiel zeigt, wie das erste Array als Pointer verwendet +wird: +
+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()

+
+
+Funktion +
+Zeigt eine Statusmeldung in der Statuszeile an. +
+Syntax +
+void status(string message);
+
+Siehe auch
dlgMessageBox() +

+Die status-Funktion zeigt die angegebene message in der Statuszeile +des Editor-Fensters an, in dem das ULP läuft. + + + +

system()

+
+
+Funktion +
+Führt ein externes Programm aus. +
+Syntax +
+int system(string command); +
+Rückgabewert +
+Die system-Funktion liefert den "Exit Status" des Befehls zurück. Dieser +ist normalerweise 0 wenn alles gut gegangen ist, und ungleich 0 +wenn ein Fehler aufgetreten ist. +
+Die system-Funktion führt das im command angegebene externe +Programm aus und wartet, bis dieses beendet ist. +

+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. +

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). +
+

Ausführung im Hintergrund

+Die system-Funktion wartet bis das angegebene Programm beendet ist. +Dies ist sinnvoll für Programme, die nur wenige Sekunden laufen, oder die +Aufmerksamkeit des Benutzers komplett an sich ziehen. +

+

+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). +
+

Beispiel

+
+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! + + +
+

Einheiten-Konvertierung

+
+
+Funktion +
+Konvertiert interne Einheiten. +
+Syntax +
+real u2inch(int n);
+real u2mic(int n);
+real u2mil(int n);
+real u2mm(int n); +
+Rückgabewert +
+u2inch liefert den Wert von n in Inch.
+u2mic liefert den Wert von n in Micron (1/1000mm).
+u2mil liefert den Wert von n in Mil (1/1000inch).
+u2mm liefert den Wert von n in Millimeter. +
+Siehe auch
UL_GRID +

+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. +

Beispiel

+
+board(B) {
+  B.elements(E) {
+    printf("%s at (%f, %f)\n", E.name,
+           u2mm(E.x), u2mm(E.y));
+    }
+  }
+
+ + + +

Print-Funktionen

+Print-Funktionen dienen zur Ausgabe formatierter Strings. +

+Die folgenden Print-Funktionen sind verfügbar: +

+ + + +

printf()

+
+
+Funktion +
+Schreibt formatiere Ausgaben in eine Datei. +
+Syntax +
+int printf(string format[, argument, ...]); +
+Rückgabewert +
+Die printf-Funktion liefert die Zahl der Zeichen, die in die +vom letzten output-Statement geöffnete Datei +geschrieben wurden. +

+Wenn ein Fehler auftritt, liefert printf -1. +

+Siehe auch sprintf, +output, +fileerror +

Format-String

+Der Format-String steuert, wie die Argumente konvertiert, formatiert +und ausgegeben werden. Es müssen genau so viele Argumente vorhanden +sein, wie für das Format erforderlich sind. Die Zahl und der Typ +der Argumente werden für jedes Format geprüft, und wenn sie nicht +den Anforderungen entsprechen, wird eine Fehlermeldung ausgegeben. +

+Der Format-String enthält zwei Objekt-Typen - einfache Zeichen +und Format-Specifier: +

+

Format-Specifier

+Ein Format-Specifier hat folgende Form: +

+% [flags] [width] [.prec] type +

+Jede Format-Spezifizierung beginnt mit dem Prozentzeichen (%). +Nach dem % kommt folgendes, in dieser Reihenfolge: +

+

Konvertiertyp-Zeichen

+ + + + + + + + + + + + + + +
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
+

Flag-Zeichen

+Die folgenden Flag-Zeichen können in jeder Kombination und Reihenfolge +auftreten. +

+ + + + +
"-" 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 " "
+

Width-Specifier

+Der Width-Specifier setzt die minimale Feldbreite für einen Ausgabewert. +

+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.
+

Präzisions-Specifier

+Ein Präzisions-Specifier beginnt immer mit einem Punkt (.), um +ihn von einem vorangehenden Width-Specifier zu trennen. +Dann wird, wie bei "Width", die Präzision entweder direkt mit einem +Dezimalstellen-String oder indirekt mit einem Stern (*) angegeben. +Wenn Sie * verwenden, legt das nächste Argument im Aufruf +(das vom Typ int sein muss) die Präzision fest. +

+ + + + + +
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.
+

Default-Präzisionswerte

+ + + + + + +
douxX 1
eEf 6
gG alle signifikanten Stellen
c keine Auswirkung
s gesamten String ausgeben
+

Wie die Präzisionsangabe (.n) die Konvertierung beeinflusst

+ + + + + + +
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.
+

Der binäre Wert 0

+Im Gegensatz zu sprintf kann die printf-Funktion den +binären Wert 0 (0x00) ausgeben. +
+char c = 0x00;
+printf("%c", c);
+
+

Beispiel

+
+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);
+
+ + + +

sprintf()

+
+
+Funktion +
+Schreibt eine formatierte Ausgabe in einen String. +
+Syntax +
+int sprintf(string result, string format[, argument, ...]); +
+Rückgabewert +
+Die sprintf-Funktion liefert die Zahl der Zeichen, die in den result-String +geschrieben wurden. +

+Im Falle eines Fehlers liefert sprintf den Wert -1. +

+Siehe auch
printf +

Format-String

+Siehe printf. +

Der binäre Wert 0

+Bitte beachten Sie, dass sprintf den binären Wert 0 (0x00) nicht verarbeiten +kann. Wenn der Ergebnis-String 0x00 enthält, werden die folgenden Zeichen ignoriert. +Verwenden Sie printf um binäre Daten auszugeben. +

Beispiel

+
+string result;
+int number = 42;
+sprintf(result, "The number is %d", number);
+
+ + + +

String-Funktionen

+String-Funktionen werden dazu verwendet, Character-Strings zu +manipulieren. +

+Die folgenden String-Funktionen sind verfügbar: +

+ + + +

strchr()

+
+
+Funktion +
+Durchsucht einen String nach dem ersten Vorkommen eines gegebenen Zeichens. +
+Syntax +
+int strchr(string s, char c[, int index]); +
+Rückgabewert +
+Die strchr-Funktion liefert den Integer-Offset des Zeichen im String +oder -1, wenn das Zeichen nicht vorkommt. +
+Siehe auch
strrchr, +strstr +

+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +

Beispiel

+
+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()

+
+
+Funktion +
+Erzeugt aus einem String-Array einen einzelnen String. +
+Syntax +
+string strjoin(string array[], char separator); +
+Rückgabewert +
+Die strjoin-Funktion liefert die kombinierten Einträge von array. +
+Siehe auch
strsplit, +lookup, +fileread +

+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. +

Beispiel

+
+string a[] = { "Field 1", "Field 2", "Field 3" };
+string s = strjoin(a, ':');
+
+ + + +

strlen()

+
+
+Funktion +
+Berechnet die Länge eines Strings. +
+Syntax +
+int strlen(string s); +
+Rückgabewert +
+Die strlen-Funktion liefert die Zahl der Zeichen im String. +
+

Beispiel

+
+string s = "This is a string";
+int l = strlen(s);
+printf("The string is %d characters long\n", l);
+
+ + +
+

strlwr()

+
+
+Funktion +
+Wandelt Großbuchstaben in einem String in Kleinbuchstaben um. +
+Syntax +
+string strlwr(string s); +
+Rückgabewert +
+Die strlwr-Funktion liefert den modifizierten String. +Der Original-String (als Parameter übergeben) wird nicht geändert. +
+Siehe auch
strupr, +tolower +

Beispiel

+
+string s = "This Is A String";
+string r = strlwr(s);
+printf("Prior to strlwr: %s - after strlwr: %s\n", s, r);
+
+ + + +

strrchr()

+
+
+Funktion +
+Durchsucht einen String nach dem letzten Vorkommen eines gegebenen Zeichens. +
+Syntax +
+int strrchr(string s, char c[, int index]); +
+Rückgabewert +
+Die strrchr-Funktion liefert den Integer-Offset des Zeichens im String +oder -1, wenn das Zeichen nicht vorkommt. +
+Siehe auch
strchr, +strrstr +

+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +

Beispiel

+
+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");
+
+ + + +

strrstr()

+
+
+Funktion +
+Durchsucht einen String nach dem letzten Vorkommen eines gegebenen +Substrings. +
+Syntax +
+int strrstr(string s1, string s2[, int index]); +
+Rückgabewert +
+Die strrstr-Funktion liefert den Integer-Offset des ersten +Zeichens von s2 in s1, oder -1, wenn der Substring nicht +vorkommt. +
+Siehe auch
strstr, +strrchr +

+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +

Beispiel

+
+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()

+
+
+Funktion +
+Teilt einen String in einzelne Felder. +
+Syntax +
+int strsplit(string &array[], string s, char separator); +
+Rückgabewert +
+Die strsplit-Funktion liefert die Anzahl der Einträge die nach array kopiert wurden. +
+Siehe auch
strjoin, +lookup, +fileread +

+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. +

Beispiel

+
+string a[];
+int n = strsplit(a, "Field 1:Field 2:Field 3", ':');
+
+ + + +

strstr()

+
+
+Funktion +
+Durchsucht einen String nach dem ersten Vorkommen eines gegebenen Substrings. +
+Syntax +
+int strstr(string s1, string s2[, int index]); +
+Rückgabewert +
+Die strstr-Funktion liefert den Integer-Offset des ersten +Zeichens von s2 in s1, oder -1, wenn der Substring nicht +vorkommt. +
+Siehe auch
strrstr, +strchr, +strxstr +

+Falls index angegeben wird, beginnt die Suche an dieser Position. +Negative Werte werden vom Ende des Strings her gezählt. +

Beispiel

+
+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");
+
+ + + +

strsub()

+
+
+Funktion +
+Extrahiert einen Substring aus einem String. +
+Syntax +
+string strsub(string s, int start[, int length]); +
+Rückgabewert +
+Die strsub-Funktion liefert den Substring, der durch +start und length definiert ist. +

+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. +

+

Beispiel

+
+string s = "This is a string";
+string t = strsub(s, 4, 7);
+printf("The extracted substring is: %s\n", t);
+
+ + +
+

strtod()

+
+
+Funktion +
+Konvertiert einen String in einen Real-Wert. +
+Syntax +
+real strtod(string s); +
+Rückgabewert +
+Die strtod-Funktion liefert die numerische Repräsentation +eines gegebenen Strings als real-Wert. Die Konvertierung +wird beim ersten Zeichen beendet, das nicht dem Format einer +Real-Konstanten entspricht. +Wenn ein Fehler während er Konvertierung auftaucht, wir der Wert +0.0 zurückgegeben. +
+Siehe auch strtol +

Beispiel

+
+string s = "3.1415";
+real r = strtod(s);
+printf("The value is %f\n", r);
+
+ + + +

strtol()

+
+
+Funktion +
+Konvertiert einen String in einen Integer-Wert. +
+Syntax +
+int strtol(string s); +
+Rückgabewert +
+Die strtol-Funktion liefert die numerische Representation +eines gegebenen Strings als int-Wert. Die Konvertierung +wird beim ersten Zeichen beendet, das nicht dem Format einer +Integer-Konstanten entspricht. +Wenn ein Fehler während der Konvertierung auftaucht, wir der Wert +0 zurückgegeben. +
+Siehe auch strtod +

Beispiel

+
+string s = "1234";
+int i = strtol(s);
+printf("The value is %d\n", i);
+
+ + + +

strupr()

+
+
+Funktion +
+Konvertiert Kleinbuchstaben in einem String in Großbuchstaben. +
+Syntax +
+string strupr(string s); +
+Rückgabewert +
+Die strupr-Funktion liefert den modifizierten String. +Der Original-String (als Parameter übergeben) wird nicht geändert. +
+Siehe auch
strlwr, +toupper +

Beispiel

+
+string s = "This Is A String";
+string r = strupr(s);
+printf("Prior to strupr: %s - after strupr: %s\n", s, r);
+
+ + + +

strxstr()

+
+
+Funktion +
+Durchsucht einen String nach dem ersten Vorkommen eines regulären Ausdrucks. +
+Syntax +
+int strxstr(string s1, string s2[, int index[, int &length]]); +
+Rückgabewert +
+Die strxstr-Funktion liefert den Integer-Offset des Teilstrings +in s1, auf den der reguläre Ausdruck in s2 passt, oder -1, wenn der +reguläre Ausdruck nicht passt. +
+Siehe auch
strstr, +strchr, +strrstr +

+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. +

Beispiel

+
+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");
+
+ + + +

Zeit-Funktionen

+Zeit-Funktionen werden dazu verwendet, die Zeit- und Datums- +Informationen zu erhalten und weiterzuverarbeiten. +

+Die folgenden Zeit-Funktionen sind verfügbar: +

+ + + +

time()

+
+
+Funktion +
+Holt die gegenwärtige Systemzeit. +
+Syntax +
+int time(void); +
+Rückgabewert +
+Die time-Funktion liefert die gegenwärtige Systemzeit als Zahl von +Sekunden, die seit einem systemabhängigen Referenzzeitpunkt vergangen sind. +
+Siehe auch
Zeit-Konvertierungen, +filetime +

Beispiel

+
+int CurrentTime = time();
+
+ + + +

timems()

+
+
+Funktion +
+Liefert die Zeit in Millisekunden seit dem Start des ULPs. +
+Syntax +
+int timems(void); +
+Rückgabewert +
+Die timems-Funktion liefert die Zeit in Millisekunden seit dem Start des ULPs. +

+Nach 86400000 Millisekunden (d.h. alle 24 Stunden) beginnt der Wert wieder bei 0. +

+Siehe auch
Zeit-Konvertierungen, +filetime, +timems() +

Beispiel

+
+int elapsed = timems();
+
+ + + +

Zeit-Konvertierungen

+
+
+Funktion +
+Zeit-Wert in Tag, Monat, Jahr etc. konvertieren. +
+Syntax +
+int t2day(int t);
+int t2dayofweek(int t);
+int t2hour(int t);
+int t2minute(int t);
+int t2month(int t);
+int t2second(int t);
+int t2year(int t);
+
+string t2string(int t); +
+Rückgabewert +
+t2day liefert den Tag des Monats (1..31)
+t2dayofweek liefert den Tag der Woche (0=sunday..6)
+t2hour liefert die Stunde (0..23)
+t2minute liefert die Minute (0..59)
+t2month liefert den Monat (0..11)
+t2second liefert die Sekunde (0..59)
+t2year liefert das Jahr (einschließlich Jahrhundert!)
+t2string liefert einen formatierten String, der Datum und Zeit enthält +
+Siehe auch
time +

Beispiel

+
+int t = time();
+printf("It is now %02d:%02d:%02d\n",
+       t2hour(t), t2minute(t), t2second(t));
+
+ + + +

Objekt-Funktionen

+Objekt-Funktionen werden dazu verwendet, allgemeine Informationen von +Objekten zu erfragen. +

+Die folgenden Objekt-Funktionen sind verfügbar: +

+ + + +

clrgroup()

+
+
+Funktion +
+Löscht die Gruppen-Flags eines Objekts. +
+Syntax +
+void clrgroup(object); +
+Siehe auch
ingroup(), +setgroup(), +GROUP-Befehl +

+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. +

Beispiel

+
+board(B) {
+  B.elements(E)
+    clrgroup(E);
+  }
+
+ + + +

ingroup()

+
+
+Funktion +
+Prüft ob ein Objekt in der Gruppe liegt. +
+Syntax +
+int ingroup(object); +
+Rückgabewert +
+Die ingroup-Funktion liefert einen Wert ungleich 0 wenn das gegebene Objekt +in der Gruppe liegt. +
+Siehe auch
clrgroup(), +setgroup(), +GROUP-Befehl +

+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. +

Beispiel

+
+output("group.txt") {
+  board(B) {
+    B.elements(E) {
+      if (ingroup(E))
+         printf("Element %s is in the group\n", E.name);
+      }
+    }
+  }
+
+ + + +

setgroup()

+
+
+Funktion +
+Setzt die Gruppen-Flags eines Objekts. +
+Syntax +
+void setgroup(object[, int flags]); +
+Siehe auch
clrgroup(), +ingroup(), +GROUP-Befehl +

+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. +

Beispiel

+
+board(B) {
+  B.elements(E)
+    setgroup(E);
+  }
+
+ + + +

Builtin-Statements

+Builtin-Statements werden im allgemeinen dazu verwendet, +einen Kontext zu eröffnen, der den Zugriff auf Datenstrukturen und Dateien +erlaubt. +

+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: +
+ + + +

board()

+
+
+Funktion +
+Öffnet einen Board-Kontext. +
+Syntax +
+board(identifier) statement +
+Siehe auch
schematic, +library +

+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. +

Prüfen, ob ein Board geladen ist

+Mit dem board-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster ein Board enthält. +In diesem Fall verhält sich board wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern ein Board geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Zugriff auf ein Board von einem Schaltplan aus

+Wenn das gegenwärtige Editor-Fenster einen Schaltplan enthält, +können Sie trotzdem auf das zugehörige Board zugreifen, indem Sie +dem board-Statement den Präfix project voranstellen, +wie in +
+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! +

Beispiel

+
+if (board)
+   board(B) {
+     B.elements(E)
+       printf("Element: %s\n", E.name);
+     }
+
+ + + +

deviceset()

+
+
+Funktion +
+Öffnet einen Device-Set-Kontext. +
+Syntax +
+deviceset(identifier) statement +
+Siehe auch
package, +symbol, +library +

+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. +

Prüfen, ob ein Device-Set geladen ist

+Mit dem deviceset-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster ein Device-Set enthält. +In diesem Fall verhält sich deviceset wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern ein Device-Set geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Beispiel

+
+if (deviceset)
+   deviceset(D) {
+     D.gates(G)
+       printf("Gate: %s\n", G.name);
+     }
+
+ + + +

library()

+
+
+Funktion +
+Öffnet einen Library-Kontext. +
+Syntax +
+library(identifier) statement +
+Siehe auch
board, +schematic, +deviceset, +package, +symbol +

+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. +

Prüfen, ob eine Bibliothek geladen ist

+Mit dem library-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster eine Bibliothek enthält. +In diesem Fall verhält sich library wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern eine Bibliothek geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Beispiel

+
+if (library)
+   library(L) {
+     L.devices(D)
+       printf("Device: %s\n", D.name);
+     }
+
+ + + +

output()

+
+
+Funktion +
+Öffnet eine Ausgabe-Datei für nachfolgende printf()-Aufrufe. +
+Syntax +
+output(string filename[, string mode]) statement +
+Siehe auch
printf, +fileerror +

+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. +

Datei-Modi

+Der mode-Parameter definiert, wie die Datei geöffnet werden soll. +Wenn kein mode-Parameter angegeben ist, gilt der Standardwert "wt". +

+ + + + + + + +
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"). +

Verschachtelte Output-Statements

+output-Statements können verschachtelt werden, +solange genügend Datei-Handles verfügbar sind - vorausgesetzt, es greifen +nicht mehrere aktive output-Statements auf dieselbe Datei zu. +

Beispiel

+
+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");
+  }
+
+ + + +

package()

+
+
+Funktion +
+Öffnet einen Package-Kontext. +
+Syntax +
+package(identifier) statement +
+Siehe auch
library, +deviceset, +symbol +

+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. +

Prüfen, ob ein Package geladen ist

+Mit dem package-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster ein Package enthält. +In diesem Fall verhält sich package wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern ein Package geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Beispiel

+
+if (package)
+   package(P) {
+     P.contacts(C)
+       printf("Contact: %s\n", C.name);
+     }
+
+ + + +

schematic()

+
+
+Funktion +
+Öffnet einen Schaltplan-Kontext. +
+Syntax +
+schematic(identifier) statement +
+Siehe auch
board, +library, +sheet +

+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. +

Prüfen, ob ein Schaltplan geladen ist

+Mit dem schematic-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster einen Schaltplan enthält. +In diesem Fall verhält sich schematic wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern ein Schaltplan geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Zugriff auf einen Schaltplan vom Board aus

+Wenn das gegenwärtige Editor-Fenster ein Board enthält, +können Sie trotzdem auf den zugehörigen Schaltplan zugreifen, indem Sie +dem schematic-Statement den Präfix project voranstellen, +wie in +
+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! +

Zugriff auf die gegenwärtige Seite eines Schaltplans

+Verwenden Sie das sheet-Statement, +um direkt auf die gegenwärtig geladene Schaltplanseite zuzugreifen. +

Beispiel

+
+if (schematic)
+   schematic(S) {
+     S.parts(P)
+       printf("Part: %s\n", P.name);
+     }
+
+ + + +

sheet()

+
+
+Funktion +
+Öffnet einen UL_SHEET-Kontext. +
+Syntax +
+sheet(identifier) statement +
+Siehe auch
schematic +

+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. +

Prüfen, ob eine Schaltplanseite geladen ist

+Mit dem sheet-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster eine Schaltplanseite enthält. +In diesem Fall verhält sich sheet wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern eine Schaltplanseite geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Beispiel

+
+if (sheet)
+   sheet(S) {
+     S.parts(P)
+       printf("Part: %s\n", P.name);
+     }
+
+ + + +

symbol()

+
+
+Funktion +
+Öffnet einen Symbol-Kontext. +
+Syntax +
+symbol(identifier) statement +
+Siehe auch
library, +deviceset, +package +

+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. +

Prüfen, ob ein Symbol geladen ist

+Mit dem symbol-Statement ohne Angabe eines Arguments können +Sie prüfen, ob das gegenwärtige Editor-Fenster ein Symbol enthält. +In diesem Fall verhält sich symbol wie eine Integer-Konstante, +die den Wert 1 zurückgibt, sofern ein Symbol geladen ist. +Andernfalls wird der Wert 0 zurückgegeben. +

Beispiel

+
+if (symbol)
+   symbol(S) {
+     S.pins(P)
+       printf("Pin: %s\n", P.name);
+     }
+
+ + + +

Dialoge

+User-Language-Dialoge ermöglichen es, ein eigenes Frontend für ein User-Language-Progamm zu definieren. +

+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
+ + +
+

Vordefinierte Dialoge

+Vordefinierte Dialoge sind die typischen Dialoge, die häufig zur Dateiauswahl oder +bei Fehlermeldungen verwendet werden. +

+Es gibt folgende vordefinierte Dialoge: +

+Siehe Dialog-Objekte für Informationen über +das Definieren eigener, komplexer Benutzer-Dialoge. + + + +

dlgDirectory()

+
+
+Funktion +
+Zeigt den Verzeichnis-Dialog. +
+Syntax +
+string dlgDirectory(string Title[, string Start]) +
+Rückgabewert +
+Die dlgDirectory-Funktion liefert den vollen Pfadnamen des gewählten Verzeichnisses.
+Hat der Benutzer den Dialog abgebrochen, ist das Resultat ein leerer String. +
+Siehe auch
dlgFileOpen +

+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. +

Beispiel

+
+string dirName;
+dirName = dlgDirectory("Select a directory", "");
+
+ + + +

dlgFileOpen(), dlgFileSave()

+
+
+Funktion +
+Zeigt einen Datei-Dialog. +
+Syntax +
+string dlgFileOpen(string Title[, string Start[, string Filter]])
+string dlgFileSave(string Title[, string Start[, string Filter]]) +
+Rückgabewert +
+Die Funktionen dlgFileOpen und dlgFileSave liefern die volle Pfadangabe +der gewählten Datei.
+Bricht der Benutzer den Dialog ab, ist das Ergebnis ein leerer String. +
+Siehe auch
dlgDirectory +

+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)". +

Beispiel

+
+string fileName;
+fileName = dlgFileOpen("Select a file", "", "*.brd");
+
+ + + +

dlgMessageBox()

+
+
+Funktion +
+Zeigt eine Message-Box. +
+Syntax +
+int dlgMessageBox(string Message[, button_list]) +
+Rückgabewert +
+Die dlgMessageBox-Funktion liefert den Index der Schaltfläche, die der Benutzer selektiert hat.
+Die erste Schaltfläche in button_list hat den Index 0. +
+Siehe auch
status() +

+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 "&lt;", "&gt;" bzw. "&amp;" 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. +
+

Beispiel

+
+if (dlgMessageBox("Are you sure?", "&Yes", "&No") == 0) {
+   // let's do it!
+   }
+
+ + + +

Dialog-Objekte

+Ein User-Language-Dialog kann aus folgenden Dialog-Objekten bestehen +(die einzelnen Begriffe wurden in diesem Fall nicht ins Deutsche übersetzt, +da sonst der Zusammenhang zu den ULP-Objekten verloren ginge): +

+ + + + + + + + + + + + + + + + + + + + + + + + +
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
dlgRadioButtonein 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

+
+
+Funktion +
+Definiert die Position einer Cell (Zelle) in einem Grid-Layout-Kontext. +
+Syntax +
+dlgCell(int row, int column[, int row2, int column2]) statement +
+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. +

Beispiel

+
+string Text;
+dlgGridLayout {
+  dlgCell(0, 0) dlgLabel("Cell 0,0");
+  dlgCell(1, 2, 4, 7) dlgTextEdit(Text);
+  }
+
+ + + +

dlgCheckBox

+
+
+Funktion +
+Definiert eine Checkbox. +
+Syntax +
+dlgCheckBox(string Text, int &Checked) [ statement ] +
+Siehe auch
dlgRadioButton, +dlgGroup, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+int mirror = 0;
+int rotate = 1;
+int flip   = 0;
+dlgGroup("Orientation") {
+  dlgCheckBox("&Mirror", mirror);
+  dlgCheckBox("&Rotate", rotate);
+  dlgCheckBox("&Flip", flip);
+  }
+
+ + + +

dlgComboBox

+
+
+Funktion +
+Definiert ein Combo-Box-Auswahl-Feld. +
+Syntax +
+dlgComboBox(string array[], int &Selected) [ statement ] +
+Siehe auch
dlgListBox, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+string Colors[] = { "red", "green", "blue", "yellow" };
+int Selected = 2; // initially selects "blue"
+dlgComboBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]);
+
+ + + +

dlgDialog

+
+
+Funktion +
+Führt einen User-Language-Dialog aus. +
+Syntax +
+int dlgDialog(string Title) block ; +
+Rückgabewert +
+Die dlgDialog-Funktion liefert einen Integer-Wert, dem durch den Aufruf der +dlgAccept()-Funktion eine benutzerspezifische +Bedeutung zugeordnet werden kann.
+Wird der Dialog einfach geschlossen, ist der Rückgabewert 0. +
+Siehe auch dlgGridLayout, +dlgHBoxLayout, +dlgVBoxLayout, +dlgAccept, +dlgReset, +dlgReject, +Ein vollständiges Beispiel +

+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. +

Beispiele

+
+int Result = dlgDialog("Hello") {
+  dlgLabel("Hello world");
+  dlgPushButton("+OK") dlgAccept();
+  };
+int haveButton = 1;
+dlgDialog("Test") {
+  dlgLabel("Start");
+  if (haveButton)
+     dlgPushButton("Here") dlgAccept();
+  };
+
+ + + +

dlgGridLayout

+
+
+Funktion +
+Öffnet einen Grid-Layout-Kontext. +
+Syntax +
+dlgGridLayout statement +
+Siehe auch
dlgCell, +dlgHBoxLayout, +dlgVBoxLayout, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+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");
+  }
+
+ + + +

dlgGroup

+
+
+Funktion +
+Definiert ein Group-Feld. +
+Syntax +
+dlgGroup(string Title) statement +
+Siehe auch
dlgCheckBox, +dlgRadioButton, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+int align = 1;
+dlgGroup("Alignment") {
+  dlgRadioButton("&Top", align);
+  dlgRadioButton("&Center", align);
+  dlgRadioButton("&Bottom", align);
+  }
+
+ + + +

dlgHBoxLayout

+
+
+Funktion +
+Öffnet einen Horizontal-Box-Layout-Kontext. +
+Syntax +
+dlgHBoxLayout statement +
+Siehe auch
dlgGridLayout, +dlgVBoxLayout, +Layout-Information, +Ein vollständige Beispiel +

+Das dlgHBoxLayout-Statement öffnet einen Horizontal-Box-Layout-Kontext für das +angegebene statement. +

Beispiel

+
+dlgHBoxLayout {
+  dlgLabel("Box 1");
+  dlgLabel("Box 2");
+  dlgLabel("Box 3");
+  }
+
+ + + +

dlgIntEdit

+
+
+Funktion +
+Definiert ein Integer-Eingabe-Feld. +
+Syntax +
+dlgIntEdit(int &Value, int Min, int Max) +
+Siehe auch
dlgRealEdit, +dlgStringEdit, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+int Value = 42;
+dlgHBoxLayout {
+  dlgLabel("Enter a &Number between 0 and 99");
+  dlgIntEdit(Value, 0, 99);
+  }
+
+ + + +

dlgLabel

+
+
+Funktion +
+Definiert ein Text-Label. +
+Syntax +
+dlgLabel(string Text [, int Update]) +
+Siehe auch
Layout-Information, +Ein vollständiges Beispiel, +dlgRedisplay() +

+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 "&lt;", "&gt;" bzw. "&amp;" 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. +

Beispiel

+
+string OS = "Windows";
+dlgHBoxLayout {
+  dlgLabel(OS, 1);
+  dlgPushButton("&Change OS") { OS = "Linux"; }
+  }
+
+ + + +

dlgListBox

+
+
+Funktion +
+Definiert ein List-Box-Auswahl-Feld. +
+Syntax +
+dlgListBox(string array[], int &Selected) [ statement ] +
+Siehe auch
dlgComboBox, +dlgListView, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+string Colors[] = { "red", "green", "blue", "yellow" };
+int Selected = 2; // initially selects "blue"
+dlgListBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]);
+
+ + + +

dlgListView

+
+
+Funktion +
+Definiert ein mehrspaltiges List-View-Auswahl-Feld. +
+Syntax +
+dlgListView(string Headers, string array[], int &Selected[, int &Sort]) [ statement ] +
+Siehe auch
dlgListBox, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+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]);
+
+ + + +

dlgPushButton

+
+
+Funktion +
+Definiert einen Push-Button. +
+Syntax +
+dlgPushButton(string Text) statement +
+Siehe auch
Layout-Information, +Dialog-Funktionen, +Ein vollständige Beispiel +

+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. +

Beispiel

+
+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(); }
+
+ + + +

dlgRadioButton

+
+
+Funktion +
+Definiert einen Radio-Button. +
+Syntax +
+dlgRadioButton(string Text, int &Selected) [ statement ] +
+Siehe auch
dlgCheckBox, +dlgGroup, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+int align = 1;
+dlgGroup("Alignment") {
+  dlgRadioButton("&Top", align);
+  dlgRadioButton("&Center", align);
+  dlgRadioButton("&Bottom", align);
+  }
+
+ + + +

dlgRealEdit

+
+
+Funktion +
+Definiert ein Real-Eingabe-Feld. +
+Syntax +
+dlgRealEdit(real &Value, real Min, real Max) +
+Siehe auch
dlgIntEdit, +dlgStringEdit, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+real Value = 1.4142;
+dlgHBoxLayout {
+  dlgLabel("Enter a &Number between 0 and 99");
+  dlgRealEdit(Value, 0.0, 99.0);
+  }
+
+ + + +

dlgSpacing

+
+
+Funktion +
+Definiert zusätzlichen Abstand in einem Box-Layout-Kontext. +
+Syntax +
+dlgSpacing(int Size) +
+Siehe auch
dlgHBoxLayout, +dlgVBoxLayout, +dlgStretch, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+dlgVBoxLayout {
+  dlgLabel("Label 1");
+  dlgSpacing(40);
+  dlgLabel("Label 2");
+  }
+
+ + + +

dlgSpinBox

+
+
+Funktion +
+Definiert ein Spin-Box-Auswahl-Feld. +
+Syntax +
+dlgSpinBox(int &Value, int Min, int Max) +
+Siehe auch
dlgIntEdit, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+int Value = 42;
+dlgHBoxLayout {
+  dlgLabel("&Select value");
+  dlgSpinBox(Value, 0, 99);
+  }
+
+ + + +

dlgStretch

+
+
+Funktion +
+Definiert einen leeren, dehnbaren Abstand in einem Box-Layout-Kontext. +
+Syntax +
+dlgStretch(int Factor) +
+Siehe auch
dlgHBoxLayout, +dlgVBoxLayout, +dlgSpacing, +Layout-Information, +Ein vollständiges Beispiel +

+Das dlgStretch-Statement definiert einen leeren dehnbaren Abstand in einem Vertical- +oder einem Horizontal-Box-Layout-Kontext. +

+Factor definiert den Dehnungsfaktor des Abstands. +

Beispiel

+
+dlgHBoxLayout {
+  dlgStretch(1);
+  dlgPushButton("+OK")    { dlgAccept(); };
+  dlgPushButton("Cancel") { dlgReject(); };
+  }
+
+ + + +

dlgStringEdit

+
+
+Funktion +
+Definiert ein String-Eingabe-Feld. +
+Syntax +
+dlgStringEdit(string &Text) +
+Siehe auch
dlgRealEdit, +dlgIntEdit, +dlgTextEdit, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+Das dlgStringEdit-Statement definiert ein Text-Eingabe-Feld mit dem angegebenen Text. +

Beispiel

+
+string Name = "Linus";
+dlgHBoxLayout {
+  dlgLabel("Enter &Name");
+  dlgStringEdit(Name);
+  }
+
+ + + +

dlgTabPage

+
+
+Funktion +
+Definiert eine Tab-Page. +
+Syntax +
+dlgTabPage(string Title) statement +
+Siehe auch
dlgTabWidget, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+dlgTabWidget {
+  dlgTabPage("Tab &1") {
+    dlgLabel("This is page 1");
+    }
+  dlgTabPage("Tab &2") {
+    dlgLabel("This is page 2");
+    }
+  }
+
+ + + +

dlgTabWidget

+
+
+Funktion +
+Definiert einen Container für Tab-Pages. +
+Syntax +
+dlgTabWidget statement +
+Siehe auch
dlgTabPage, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+dlgTabWidget {
+  dlgTabPage("Tab &1") {
+    dlgLabel("This is page 1");
+    }
+  dlgTabPage("Tab &2") {
+    dlgLabel("This is page 2");
+    }
+  }
+
+ + + +

dlgTextEdit

+
+
+Funktion +
+Definiert ein mehrzeiliges Text-Eingabe-Feld. +
+Syntax +
+dlgTextEdit(string &Text) +
+Siehe auch
dlgStringEdit, +dlgTextView, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+string Text = "This is some text.\nLine 2\nLine 3";
+dlgVBoxLayout {
+  dlgLabel("&Edit the text");
+  dlgTextEdit(Text);
+  }
+
+ + + +

dlgTextView

+
+
+Funktion +
+Definiert ein mehrzeiliges Text-Viewer-Feld. +
+Syntax +
+dlgTextView(string Text)
+dlgTextView(string Text, string &Link) statement +
+Siehe auch
dlgTextEdit, +dlgLabel, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+string Text = "This is some text.\nLine 2\nLine 3";
+dlgVBoxLayout {
+  dlgLabel("&View the text");
+  dlgTextView(Text);
+  }
+
+ + + +

dlgVBoxLayout

+
+
+Funktion +
+Öffnet einen Vertical-Box-Layout-Kontext. +
+Syntax +
+dlgVBoxLayout statement +
+Siehe auch
dlgGridLayout, +dlgHBoxLayout, +Layout-Information, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+dlgVBoxLayout {
+  dlgLabel("Box 1");
+  dlgLabel("Box 2");
+  dlgLabel("Box 3");
+  }
+
+ + + +

Layout-Information

+Alle Objekte eines User-Language-Dialogs werden in einem Layout-Kontext verwendet. +

+Es gibt verschiedene Layout-Kontexte, wie grid, horizontal +oder vertical. +

Grid-Layout-Kontext

+Objekte in einem Grid-Layout-Kontext müssen die Raster-Koordinaten der Zelle (Cell) oder der Zellen angeben, +in der/denen sie plaziert werden sollen. Um einen Text in Reihe (row) 5, Spalte (column) 2 zu plazieren, +schreiben Sie +
+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") {
+    //...
+    }
+  }
+
+

Horizontal-Layout-Kontext

+Objekte in einem Horizontal-Layout-Kontext werden von links nach rechts plaziert. +

+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();
+  }
+
+

Vertical-Layout-Kontext

+Objekte in einem Vertical-Layout-Kontext folgen denselben Vorschriften wie die in einem +Horizontal-Layout-Kontext mit dem Unterschied, dass sie von oben nach unten angeordnet werden. +

Gemischter Layout-Kontext

+Vertical-, Horizontal- und Grid-Layout-Kontexte können gemischt werden, um die gewünschte +Dialog-Struktur zu ezeugen. +Siehe Ein vollständiges Beispiel. + + + +

Dialog-Funktionen

+Folgende Funktionen können mit User-Language-Dialogen verwendet werden: +

+ + + + + +
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
+ + +
+

dlgAccept()

+
+
+Funktion +
+Schließt den Dialog und akzeptiert dessen Inhalt. +
+Syntax +
+void dlgAccept([ int Result ]); +
+Siehe auch
dlgReject, +dlgDialog, +Ein vollständiges Beispiel +

+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! +

Beispiel

+
+int Result = dlgDialog("Test") {
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               };
+
+ + + +

dlgRedisplay()

+
+
+Funktion +
+Aktualisiert den Dialog-Inhalt nachdem Werte verändert wurden. +
+Syntax +
+void dlgRedisplay(void); +
+Siehe auch
dlgReset, +dlgDialog, +Ein vollständiges Beispiel +

+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. +

Beispiel

+
+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.";
+                 }
+               };
+
+ + + +

dlgReset()

+
+
+Funktion +
+Setzt alle Dialog-Objekte auf ihren ursprünglichen Wert. +
+Syntax +
+void dlgReset(void); +
+Siehe auch
dlgReject, +dlgDialog, +Ein vollständiges Beispiel +

+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(). +

Beispiel

+
+int Number = 1;
+int Result = dlgDialog("Test") {
+               dlgIntEdit(Number);
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               dlgPushButton("Reset")  dlgReset();
+               };
+
+ + + +

dlgReject()

+
+
+Funktion +
+Schließt den Dialog und verwirft seinen Inhalt. +
+Syntax +
+void dlgReject([ int Result ]); +
+Siehe auch
dlgAccept, +dlgReset, +dlgDialog, +Ein vollständiges Beispiel +

+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(). +

Beispiel

+
+int Result = dlgDialog("Test") {
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               };
+
+ + + +

Escape-Zeichen

+Einige Zeichen haben in Schaltflächen- +oder Label-Texten eine besondere Bedeutung, so dass sie mit Escape-Zeichen +markiert werden müssen, wenn sie tatsächlich im Text erscheinen sollen. +

+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: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TagBeschreibung
<html>...</html>Ein HTML-Dokument. Es versteht folgende Attribute +
    +
  • bgcolor - Die Hintergrundfarbe, z. B. bgcolor="yellow" or bgcolor="#0000FF". +
  • background - Das Hintergrundbild, zum Beispiel background="granit.xpm". +
  • text - Die default Textfarbe, z. B. text="red". +
  • link - Die Farbe eines Links, z. B. link="green". +
+
<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 +
    +
  • href - Das Referenz-Ziel wie in <a href="#123">...</a>. +
  • name - Der Anker-Name, wie in <a name="123">...</a>. +
+
<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: +
    +
  • color - Die Textfarbe, z. B. color="red" oder color="#FF0000". +
  • size - Die logische Größe der Schrift. Logische Größen von 1 bis 7 werden unterstützt. Der Wert darf entweder absolut, z. B. size=3, oder relativ, wie size=-2 sein. Im letzten Fall werden die Größen einfach addiert. +
  • face - Die Schriftart-Familie, z. B. face=times. +
+
<img...>Ein Bild. Dieses Tag versteht die folgenden Attribute: +
    +
  • src - Den Namen des Bildes, z. B. <img src="image.xpm">.
    +Unterstützte Bildformate sind:
    +".bmp" (Windows Bitmap Dateien)
    +".pbm" (Portable Bitmap Dateien)
    +".pgm" (Portable Grayscale Bitmap Dateien)
    +".png" (Portable Network Graphics Dateien)
    +".ppm" (Portable Pixelmap Dateien)
    +".xbm" (X Bitmap Dateien)
    +".xpm" (X Pixmap Dateien) +
  • width - Die Breite des Bildes. Passt das Bild nicht in die angegebene Größe, wird es automatisch skaliert. +
  • height - Die Höhe des Bildes. +
  • align - Bestimmt wo das Bild plaziert wird. Defaultmäßig wird ein Bild "inline" plaziert, genauso wie ein Buchstabe. Legen Sie left oder right fest, um das Bild an der entsprechenden Stelle zu plazieren. +
+
<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: +
    +
  • bgcolor - Die Hintergrundfarbe. +
  • width - Die Tabellenbreite. Wird entweder in Pixel oder in Prozent der Spaltenbreite angegeben, z. B. width=80%. +
  • border - Die Breite des Tabellenrandes. Default ist 0 (= kein Rand). +
  • cellspacing - Zusätzlicher Leerraum um die Tabellenzelle. Default ist 2. +
  • cellpadding - Zusätzlicher Leerraum um den Inhalt einer Tabellenzelle. Default ist 1. +
+
<tr>...</tr>Eine Tabellen-Reihe. Kann nur mit table verwendet werden. Versteht die Attribute: +
    +
  • bgcolor - Die Hintergrundfarbe. +
+
<td>...</td>Eine Zelle in einer Tabelle. Kann nur innerhalb tr verwendet werden.Versteht die Attribute: +
    +
  • bgcolor - Die Hintergrundfarbe. +
  • width - Die Zellenbreite. Wird entweder in Pixel oder in Prozent der gesamten Tabellenbreite angegeben, z. B. width=50%. +
  • colspan - Legt fest wieviele Spalten diese Zelle belegt. Default ist 1. +
  • rowspan - Legt fest wieviele Reihen diese Zelle belegt. Default ist 1. +
  • align - Positionierung, mögliche Angaben sind left, right und center. Default ist links-bündig. +
+
<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.
+

+ + + + + + + + + + + + + + + + + +
TagBedeutung
&lt;<
&gt;>
&amp;&
&nbsp;Leerzeichen ohne Umbruch
&auml;ä
&ouml;ö
&uuml;ü
&Auml;Ä
&Ouml;Ö
&Uuml;Ü
&szlig;ß
&copy;©
&deg;°
&micro;µ
&plusmn;±
+ + + +

Automatischer Backup

+

Maximum backup level

+Der Write-Befehl erzeugt Backup-Kopien der gesicherten Dateien. +Sie haben denselben Namen wie die Originaldateien mit einer +modifizierten Extension, nach dem Muster +
+.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. +

Auto-Backup-Interval

+Wurde eine Zeichnung modifiziert, wird automatisch nach der unter +Auto backup interval eingestellten Zeit eine Sicherungskopie +erstellt. +

+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. + + + +

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. +

+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. +

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: +

+CadSoft Computer GmbH
+Pleidolfweg 15
+84568 Pleiskirchen
+Deutschland +

+ + + + + + +
Vertrieb 08635-6989-10
Hotline 08635-6989-30
Fax 08635-6989-40
Email support@cadsoft.de
URL www.cadsoft.de
+ + +
+

Lizenz

+Als legaler EAGLE-Benutzer müssen Sie im Besitz einer registrierten +Benutzer-Lizenz sein. Bitte überprüfen Sie, ob im Dialog "Hilfe/Über EAGLE" +unter "Lizenziert auf:" Ihr Name und Ihre Anschrift eingetragen ist. +Sollten Sie Zweifel an der Echtheit Ihrer Lizenz +haben, setzen Sie sich bitte mit unserem +Support-Personal +in Verbindung. +
+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. +

Einzelplatz-Lizenz

+Nur ein Benutzer darf das Programm zu einer bestimmten Zeit +benutzen. Der Benutzer darf das Programm allerdings auf +unterschiedlichen Computern installieren, solange er sicherstellt, dass +nur eine Programmkopie gleichzeitig verwendet wird. +

+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. +

Mehrbenutzer-Lizenz

+Eine Mehrbenutzer-Lizenz darf von mehreren Benutzern (bis zu der auf der +Lizenz angegebenen maximalen Anzahl) gleichzeitig benutzt werden. +Das Programm darf auf beliebig vielen unterschiedlichen +Computern am Standort des Lizenznehmers installiert sein. +

Commercial License

+Das Programm darf für jeden Zweck verwendet werden, kommerziell oder +privat. +

Educational License

+Das Programm darf ausschließlich in Ausbildungsstätten wie Schulen, +Universitäten oder Lehrwerkstätten zu Ausbildungszwecken verwendet +werden. +

Student License

+Das Programm darf ausschließlich für private Zwecke verwendet werden. +Jede kommerzielle Anwendung ist untersagt. Es stellt eine Verletzung der +Lizenzbedingungen dar, wenn Sie durch Gebrauch einer Studentenversion +Geld verdienen. + + + +

EAGLE-Lizenz

+Bevor Sie mit EAGLE arbeiten können, müssen Sie dem Programm Ihre +persönlichen Lizenzdaten "mitteilen". +

+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. +

Nachträgliches Installieren von Modulen

+Soll die Lizenz um das Schaltplan-/Autorouter-Modul erweitert werden, +erhalten Sie von uns eine neue Lizenzdatei mit einem +neuen Installations-Code, welche Sie dem Programm mitteilen müssen. +Dazu starten Sie das EAGLE-Programm und wählen im Control Panel +im Hilfe-Menü den Eintrag EAGLE Lizenz. + + + +

EAGLE-Editionen

+EAGLE ist in drei verschiedenen Editionen verfügbar, um den +Ansprüchen verschiedener Benutzergruppen gerecht zu werden. +

Professional

+Die Professional Edition stellt die volle Funktionalität zur Verfügung: + +

Standard

+Die Standard Edition besitzt folgende Einschränkungen: + +

Light

+Die Light Edition besitzt folgende Einschränkungen: + +

+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 + + + + + +
EAGLE Help Version 5.7.0 +Copyright © 2010 CadSoft Computer GmbH +
+ +

Index

+
+ + + +

General Help

+While inside a
board, +schematic, or +library editor window, +pressing F1 or entering the command HELP +will open the help page for the currently active command. +

+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: +

+ + + +

Configuring EAGLE

+Global EAGLE parameters can be adjusted in the +
Control Panel. +

+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. +

User Interface

+ + + + + + + + + + + + + + + + + +
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;
+

Screen Display

+ + + + + + + + + + + + + +
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;
+

Mode Parameters

+ + + + + + + + +
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;
+

Presettings

+ + + + + + + + + + + + + + + +
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;
+ + + +

Command Line Options

+You can call up EAGLE with command line parameters. Use the following format: +
+eagle [ options [ filename [ layer ] ] ]
+
+

Options

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-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
+

Defining Tolerance Values

+Without '+' or '-' sign, a tolerance value applies to both directions: + + + +
-D0.10 adjusts the draw tolerance to ±10%
-D+0.1 -D-0.05 adjusts the draw toleranceto +10% and -5%
+

Executing commands

+If a command is given with the '-C' option, as in +
+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: +

+To run EAGLE without automatically executing the eagle.scr file or loading +a project, the command string can be empty, as in +
+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. +

Filename

+If the given filename is eagle.epf (optionally preceded by a directory name), +EAGLE will load that Project File. Otherwise, if no file extension is given, +it defaults to .brd, to load a board file. + + +
+

Quick Introduction

+For a quick start you should know more about the following topics: +
+In case of problems please contact our +free Technical Support. + + + +

Control Panel and Editor Windows

+From the
Control Panel you can open schematic, +board, or library editor windows by using the File menu or double clicking +an icon. + + + +

Entering Parameters and Values

+Parameters and values can be entered in the EAGLE command line +or, more conveniently, in the Parameter Toolbars which appear when a +command is activated. As this is quite self-explanatory, the help text +does not explicitly mention this option at other locations. +

+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. +

Place Symbols

+Load appropriate libraries with USE and place symbols (see ADD, MOVE, +DELETE, ROTATE, NAME, VALUE). Where a particular component is not +available, define a new one with the library editor. +

Draw Bus Connections

+Using the BUS command, draw bus connections. You can NAME a bus in +such a way that you can drag nets out of the bus which are named +accordingly. +

Draw Net Connections

+Using the NET command, connect up the pins of the various elements on +the drawing. Intersecting nets may be made into connections with the +JUNCTION command. + + + +

Checking the Schematic

+Carry out an electrical rule check (
ERC) to look for open pins, etc., +and use the messages generated to correct any errors. Use the SHOW +command to follow complete nets across the screen. Use the EXPORT command +to generate a netlist, pinlist, or partlist if necessary. + + + +

Generating a Board from a Schematic

+By using the
BOARD command or clicking the Switch-to-Board icon you +can generate a board from the loaded schematic (if there is no board +with the same name yet). +

+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. +

Set Board Outlines and Place Components

+The board outlines can be adjusted with the MOVE and SPLIT +commands as appropriate before moving each package on the board. Once +all packages have been placed, the RATSNEST command is used to +optimize airwires. +

Define Restricted Areas

+If required, restricted areas for the Autorouter can be defined as +RECTangles, POLYGONs, or CIRCLEs on the tRestrict, bRestrict, or +vRestrict layers. Note: areas enclosed by wires drawn on the Dimension +layer are borders for the Autorouter, too. +

Routing

+Airwires are now converted into tracks with the aid of the ROUTE +command. This function can also be performed automatically by the +Autorouter, when available. + + + +

Checking the Layout

+Check the layout (
DRC) and correct the errors (ERRORS). Generate +net, part, or pin list if necessary(EXPORT). + + + +

Creating a Library Device

+Creating a new component part in a library has three steps. You must +follow these steps as they build upon each other. +

+To start, open a library. Use the File menu Open or New command (not +the USE command). +

Create a Package

+Packages are the part of the device that are added to a board. +

+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. +

Create a Symbol

+Symbols are the part of the device that are added to a schematic. +

+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. +

Create the Device

+Devices are the "master" part of a component and use both a package +and one or more symbols. +

+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. +

Context menu

+The context menu of the tree items can be accessed by clicking on them with the right +mouse button. It contains options specific to the selected item. +

Descriptions

+The Description column of the tree view contains a short description of the +item (if available). These descriptions are derived from the first non-blank line +of the text from the following sources: +

+ + + + + + + + + +
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
+

Drag&drop

+You can use Drag&Drop to copy or move files and directories within the +tree view. It is also possible to drag a device or package to a schematic, board or library +window, respectively, and drop it there to add it to the drawing. User Language Programs +and Scripts will be executed if dropped onto an editor window, and Design Rules will be +applied to a board if dropped onto a board editor window. If a board, schematic or +library file is dropped onto its respective editor window, it will be loaded into the +editor. +All of these functions can also be accessed through the context menu +of the particular tree item. +

Information window

+The right hand side of the Control Panel displays information about the current item +in the tree view. That information is derived from the places listed above under +Descriptions. Devices and packages also show a preview of their contents. +

Pulldown menu

+The Control panel's pulldown menu contains the following options: +

File

+ + + + + + + +
New create a new file
Open open an existing file
Open recent projectsopen a recently used project
Save all save all modified editor files
Close project close the current project
Exit exit from the program
+

View

+ + + +
Refreshrefresh the contents of the tree view
Sort change the sorting of the tree view
+

Options

+ + + + + +
Directories... opens the directories dialog
Backup... opens the backup dialog
User interface... opens the user interface dialog
Window positions...opens the window positions dialog
+

Window

+ + + + +
Control Panel switch to the Control Panel
1 Schematic - ... switch to window number 1
2 Board - ... switch to window number 2
+

Help

+ + + + + + + +
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
+

Status line

+The status line at the bottom of the Control Panel contains +the full name of the currently selected item. + + + +

Context Menus

+Clicking on an item in the
Control Panel +with the right mouse button opens a context menu which allows +the following actions (not all of them may be present on a particular item): +

New Folder

+Creates a new folder below the selected folder and puts the newly created tree +item into Rename mode. +

Edit Description

+Loads the DESCRIPTION file of a directory into the HTML editor. +

Rename

+Puts the tree item's text into edit mode, so that it can be renamed. +

Copy

+Opens a file dialog in which you can enter a name to which to copy this file or directory. +You can also use Drag&Drop to do this. +

Delete

+Deletes the file or directory (you will be prompted to confirm that you really want this to happen). +

Use

+Marks this library to be used when searching for devices or packages. +You can also click on the icon in the second column of the tree view to toggle this flag. +

Use all

+Marks all libraries in the Libraries path to be used when searching for devices or packages. +

Use none

+Removes the use marks from all libraries (including such libraries that are not +in the Libraries path). +

Update

+Updates all parts used from this library in the loaded board and schematic. +

Update in Library

+Updates all packages used from this library in the loaded library. +

Add to Schematic

+Starts the ADD command in the schematic window with this device. +You can also use Drag&Drop to do this. +

Add to Board

+Starts the ADD command in the board window with this package. +You can also use Drag&Drop to do this. +

Copy to Library

+Copies the selected device set or package into the loaded library. +You can also use Drag&Drop to do this. +

New variant in Library

+Creates a new package variant with the selected package in the current +device set of the loaded library. +You can also use Drag&Drop to do this. +

Open/Close Project

+Opens or closes this project. +You can also click on the icon in the second column of the tree view to do this. +

New

+Opens a window with a new file of the given type. +

Open

+Opens this file in the propper window. +You can also use Drag&Drop to do this. +

Print...

+Prints the file to the system printer. See the chapter on +printing to the system printer for more +information on how to use the print dialogs. +

+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. +

Run in ...

+Runs this User Language Program in the current schematic, board or library. +You can also use Drag&Drop to do this. +

Execute in ...

+Executes this script file in the current schematic, board or library. +You can also use Drag&Drop to do this. +

Load into Board

+Loads this set of Design Rules into the current board. +You can also use Drag&Drop to do this. + + + +

Directories

+The Directories dialog is used to define the directory paths +in which to search for files. +

+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 (';'). +
+When entering an
OPEN, +USE, SCRIPT or +RUN command, these paths will be searched +left-to-right to locate the file. +If the file dialog is used to access a file of one of these types, the directory into +which the user has navigated through the file dialog will be implicitly added to the +end of the respective search path. +

+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. +
+ + + +

Backup

+The Backup dialog allows you to customize the +automatic backup function. +

Maximum backup level

+Defines how many backup copies of your EAGLE data files shall be kept +when regularly saving a file to disk with the WRITE command +(default is 9). +

Auto backup interval (minutes)

+Defines the maximum time after which EAGLE automatically creates a safety backup +copy of any modified drawing (default is 5). +

Automatically save project file

+If this option is checked, your project settings will be automatically saved when +you exit from the program. +Note that if you uncheck this option while you have a project open, this +project will not be saved when you close it, and thus this setting will not +be stored in the project's eagle.epf file. This means that the next time you +open the project, this option will be checked again. If you want this option +to remain unchecked for the current project, you need to manually select +"File/Save all" from the pulldown menu after unchecking this option. + + + +

User Interface

+The User interface dialog allows you to customize the +appearance of the layout, schematic and library +
editor windows. +

Controls

+ + + + + + + +
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
+

Layout

+ + + +
Background selects a black, white or colored background for the layout mode
Cursor selects a small or large cursor for the layout mode
+

Schematic

+ + + +
Background selects a black, white or colored background for the schematic mode
Cursor selects a small or large cursor for the schematic mode
+

Help

+ + + +
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
+

Misc

+ + + +
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)
+ + + +

Window positions

+The Window positions dialog allows you to store the positions +of all currently open windows, so that later, when a window of the same +type is opened again, it will appear at the same position as before. +

+You can also delete all stored window positions, so that the window manager +can decide again where to place newly opened windows. + + + +

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. +

+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 +

+hostname:port
+
+where hostname is the full name of the proxy host, without any +http:// prefix, and port is an optional port number. +

+If you would like to be informed about beta versions of EAGLE, you can check +the "Also check for beta versions" box. + + + +

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. +
+

Shift

+Pressing the Shift key while clicking on the right mouse button reverses +the direction in which the wire bend styles are switched through (only applies to +commands that support wire bend styles, like, for instance, WIRE). +

+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. +

Esc

+Pressing the Esc key when a command is active will cancel the current +activity of that command without canceling the entire command (if there is text +in the command line, that text will be deleted first, and the next press of the +Esc key will act on the command). +For the MOVE command, for example, this means +that an object that is currently attached to the cursor +will be dropped and an other object can be selected. +

Crsr-Up/Down

+The keys Crsr-Up (cursor up) and Crsr-Down (cursor down) can be used in the +command line of an editor window to scroll through the command history. +

Function Keys

+Function keys can be assigned any commands by using the ASSIGN command. +

Left Mouse Button

+The left mouse button is generally used to select, draw or place objects. +

Center Mouse Button

+The center mouse button changes the current layer or mirrors the object currently +attached to the mouse cursor. +

+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. +

Right Mouse Button

+The right mouse button is mostly used to select a group, rotate objects attached to +the mouse cursor, change wire bend styles and several other command specific functions. +

+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
+

Mouse Wheel

+Inside an editor window the mouse wheel can be used to zoom in and out. + + + +

Selecting objects in dense areas

+When you try to select an object at a position where several objects +are placed close together, a four way arrow and the question +

+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. + + + + +

Library Editor

+The Library Editor is used to edit a part library (*.lbr). +

+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. + + + +

Edit Library Object

+In library edit mode you can edit packages, symbols, and devices. +

+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. + + + +

Board Editor

+The Board Editor is used to edit a board (*.brd). +

+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. + + + +

Schematic Editor

+The Schematic Editor is used to edit a schematic (*.sch). +

+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). + + + +

Text Editor

+The Text Editor is used to edit any kind of text. +

+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. +

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. +

+Within that command the following placeholders will be replaced with +actual values: +

+ + + + +
%Cthe column in which to place the cursor (currently always 1)
%Fthe name of the file to load
%Lthe 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: +

+ + + +

Editor Commands

+

Change Mode/File Commands

+ + + + + + + + + + +
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
+

Edit Drawings or Libraries

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+

Special Commands for Boards

+ + + + + + + + + + +
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
+

Special Commands for Schematics

+ + + + + + + + + + +
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
+

Special Commands for Libraries

+ + + + + + + + + + + +
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
+

Change Screen Display and User Interface

+ + + + + + + + +
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
+

Miscellaneous Commands

+ + + + + + + + + + + + +
AUTO Start Autorouter
HELP Show help page
INFO Show information about object
MARK Set/remove mark (for measuring)
OPTIMIZE Optimize (join) wire segments
PRINT Print to the system printer
REDO Redo commands
RUN Run User Language Program
SHOW Highlight object
UNDO Undo commands
UPDATE Update library objects
+ + +
+

Command Syntax

+EAGLE commands can be entered in different ways: +
+All these methods can be mixed. +

+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;
+

Shorten key words

+For command names and other key words, only so many characters must be +entered that they clearly differ from other key words. +

Alternative Parameters

+The sign | means that alternative parameters can be indicated. Example: +

+ + + + + +
Syntax: SET BEEP OFF | ON;
Input: SET BEEP OFF;
or
SET BEEP ON;
+

Repetition Points

+The signs .. mean that the function can be executed several times +or that several parameters of the same type are allowed. Example: +

+ + + +
Syntax: DISPLAY option layer_name..
Input: DISPLAY TOP PINS VIAS
+

Coordinates

+The sign • normally means that an object has to be selected with the +left mouse button at this point in the command. Example: +

+ + + + + + + +
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.
+If a unit other than the one selected with the GRID command shall be used, +it can be appended to the given coordinates, as in +
+(100mil 200mil)
+
+Allowed units are mm, mic, mil and in. +It is possible to use different units for x and y.
+The special coordinate +
+(@)
+
+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
+For example, the input +

+(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;
+
+

Decimal numbers

+When entering decimal numbers in the command line of the editor window or in +dialog input fields, you can use the comma as the decimal delimiter (as in 12,34), +if your locale settings allow this. However, when writing a script or a ULP that +returns EAGLE commands through the exit() function, you should always +use the 'dot' as the decimal delimiter (as in 12.34), because otherwise +your script or ULP might not work on other systems. In general, it is recommended +to always use the 'dot' as the decimal delimiter. +

Semicolon

+The semicolon (';') terminates commands. A command needs to be terminated +with a semicolon if there fewer than the maximum possible number of options. +For example the command +
+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. + + + +

ADD

+
+
+Function +
+Add elements into a drawing.
+Add symbols into a device. +
+Syntax +
+ADD package_name[@library_name] [name] [orientation] •..
+ADD device_name[@library_name] [name [gate]] [orientation] •..
+ADD symbol_name [name] [options] •.. +
+Mouse keys +
+Center mirrors the part.
+Right rotates the part.
+Shift+Right reverses the direction of rotating. +
+See also
UPDATE, +USE, +INVOKE +

+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! +

Fetching a Package or Symbol into a Drawing

+

Wildcards

+The ADD command can be used with wildcards ('*' or '?') to find +a specific device. The ADD dialog offers a tree view of the matching +devices, as well as a preview of the device and package variant. +

+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"). +

Names

+The package_name, device_name or symbol_name parameter is the name under which the package, device or symbol is stored in the library. +It is usually selected from a menu. The name parameter is the name which the element is to receive in the drawing. +If the name could be interpreted as an orientation or option, it must be enclosed in single quotes. +If a name is not explicitly given it will receive an automatically generated name. +

+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 •
+
+

Particular Gates

+To fetch a particular gate of a newly added device the name of that gate can be given following the part name: +

+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). +

Orientation

+This parameter defines the orientation of the object in the drawing. +Objects are normally rotated using the right mouse button. +In Script files textual descriptions of this parameter are used: +

+[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
Rnnnsets 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.3rotated 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). +

Error messages

+An error message appears if a gate is to be fetched from a device which is not fully defined (see BOARD command). This can be prevented with the "SET CHECK_CONNECTS OFF;" command. Take care: The BOARD command will perform this check in any case. Switching it off is only sensible if no pcb is to be made. +

Fetch Symbol into Device

+During device definition the ADD command fetches a previously defined symbol into the device. Two parameters (swaplevel and addlevel) are possible, and these can be entered in any sequence. Both can be preset and changed with the CHANGE command. The value entered with the ADD command is also retained as a default value. +

Swaplevel

+The swaplevel is a number in the range 0..255, to which the following rules apply: +

+ + + +
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 +

Addlevel

+The following possibilities are available for this parameter: +

+ + + + + + +
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.
RequestThis 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. + + + +

ARC

+
+
+Function +
+Draw an arc of variable diameter, width, and length. +
+Syntax +
+ARC ['signal_name'] [CW | CCW] [ROUND | FLAT] [width] • • • +
+Mouse keys +
+Center selects the layer.
+Right changes the orientation. +
+See also
CHANGE, +WIRE, +CIRCLE +

+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. +

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, the arc 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 an arc is placed in a way that it would connect +different signals. Please run a +Design Rule Check after using the ARC command +with the signal_name parameter! +

Line Width

+The parameter "width" defines the thickness of the drawn line. +It can be changed or predefined with the command: +
+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. + + + +

ASSIGN

+
+
+Function +
+Modify key assignments. +
+Syntax +
+ASSIGN
+ASSIGN function_key command..;
+ASSIGN function_key; +

+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) +

+See also
SCRIPT, +Keyboard and Mouse +

+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. +

Examples

+
+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. +

Define Command Menu

+If you want to assign the MENU command to a key, the separator +character in the MENU command (semicolon) has to be enclosed in three +pairs of apostrophes (see the third example). This semicolon will +show up in the new menu. +

Presetting of key assignments

+ + + + + + + + + + + + + + +
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
+ + + +

ATTRIBUTE

+
+
+Function +
+Definition of attributes for parts. +
+Syntax +
+ATTRIBUTE name [ 'value' ] [ options ]
+ATTRIBUTE part_name attribute_name
+ATTRIBUTE part_name attribute_name 'attribute_value' [ [ orientation ] • ]
+ATTRIBUTE part_name attribute_name DELETE
+ATTRIBUTE * [ name [ 'value' ] ]
+ATTRIBUTE * name DELETE
+ATTRIBUTE •.. +
+See also
TECHNOLOGY, +NAME, +VALUE, +SMASH, +TEXT +

+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. +

Attributes in the Library

+In a library the ATTRIBUTE command can be used to define the attributes of a given +technology variant, using the syntax +
+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').
variableMark this attribute as variable, so that it can be overwritten in the schematic (this is the default).
constantAttributes 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.
+Options may be abbreviated and are case insensitive. +

+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')
+If the value of an attribute is changed, its constant/variable setting +remains unchanged (unless explicitly given). +

+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'). +

Attributes in the Schematic

+In a schematic, the ATTRIBUTE command can be used to assign attributes to +a part, in which case the value of such an attribute overwrites the value +of the attribute with the same name in the library (if the device has such +an attribute and allows overwriting). A part may also be given attributes +that are not defined in the library at all. +

+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. +

Attributes in the Board

+In a board, attributes can be assigned to elements with the ATTRIBUTE +command, much the same as in schematics. By default elements have all the +attributes that are defined for their part in the schematic (and their +device in the library). Attributes with the same name for a given +element/part pair will always have the same value (through Forward&Back Annotation). +Elements can have additional attributes that are not present in the +schematic or library. +

Global attributes

+Global attributes can be defined in boards and schematics by using '*' as +the part name (which implies that this attribute applies to all parts). +Alternatively global attributes can be defined through the menu option +"Edit/Global attributes...". The global attributes of board and schematic +are handled separately and are not connected via Forward&Back-Annotation. +

+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. +

Selecting the layer

+Unlike other commands (like WIRE, for instance), the ATTRIBUTE command keeps track +of its last used layer by itself. This has the advantage of making sure that +attributes are always drawn into the right layer, no matter what layers other +commands draw into. The downside of this is that the usual way of setting the layer +in a script, as in +
+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.
+The commands +
+ATTRIBUTE
+LAYER layer;
+
+set the layer to use with subsequent ATTRIBUTE commands. +

Examples

+First the package and technology has to be selected (in case there is more +than one) and then attributes for that technology can be defined: +
+PACKAGE N;
+TECHNOLOGY LS;
+ATTRIBUTE PartNo '12345-ABC';
+ATTRIBUTE Temp '100K' constant;
+ATTRIBUTE Remark 'mount manually';
+
+ + + +

AUTO

+
+
+Function +
+Starts the Autorouter +
+Syntax +
+AUTO;
+AUTO signal_name..;
+AUTO ! signal_name..;
+AUTO •..;
+AUTO FOLLOWME
+AUTO LOAD|SAVE filename; +
+See also
SIGNAL, +ROUTE, +WIRE, +RATSNEST, +SET +

+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. +

Example

+
+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). +

Wildcards

+If a signal_name parameter is given, the characters '*', '?' +and '[]' are wildcards and have the following meaning: +

+ + + + +
* 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'. +

Polygons

+When the Autorouter is started all Polygons are +calculated. +

Protocol File

+A protocol file (name.pro) is generated automatically. +

Board Size

+The Autorouter puts a rectangle around all objects in the board +and takes the size of this rectangle as the routing area. Wires +in the Dimension layer are border lines for the +Autorouter. This means you can delimit the route area with closed +lines drawn into this layer with the WIRE command. +

+In practice you draw the board outlines into the Dimension layer with +the WIRE command and place the components within this area. +

Signals

+Signals defined with EAGLE's SIGNAL command, polygons, and wires drawn +onto the Top, Bottom, and ROUTE2...15 layers are recognized by the +Autorouter. +

Restricted Areas

+Objects in the layers tRestrict, bRestrict, +and vRestrict are treated as restricted areas for the Top and Bottom +side and for vias respectively. +

+If you want the Autorouter not to use a layer, enter "0" into the +preferred direction field. +

Canceling

+If you cancel the Autorouter by clicking on the STOP button, any airwires +that have not yet been routed, are not automatically recalculated. +Use the RATSNEST command to do this. + + + +

BOARD

+
+
+Function +
+Converts a schematic into a board. +
+Syntax +
+BOARD [ grid ] +
+See also
EDIT +

+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. +

Creating a board from a schematic

+The first time you edit a board the program checks if there is a +schematic with the same name in the same directory and gives you the +choice to create the board from that schematic.
+If you have opened a schematic window and want to create a board, just +type +
+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: +

+ + + +

BUS

+
+
+Function +
+Draws buses in a schematic. +
+Syntax +
+BUS [bus_name] • [curve | @radius] •.. +
+Mouse keys +
+Right changes the wire bend style (see SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Right toggles between corresponding bend styles. +
+See also NET, +NAME, +SET +

+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). +

Bus name examples

+
+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). +

Inverted signals

+The name of an inverted signal ("active low") can be displayed overlined if it +is preceded with an exclamation mark ('!'), as in +
+  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. + + + +

CHANGE

+
+
+Function +
+Changes parameters. +
+Syntax +
+CHANGE option • •.. +
+Mouse keys +
+Ctrl+Right changes parameter of the group. +
+The CHANGE command is used to change or preset properties of objects. +The objects are clicked on with the mouse after the desired parameters +have been selected from the CHANGE command menu or have been typed +in from the keyboard. +

+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. +

Change Groups

+When using the CHANGE command with a group, the group is first identified +with the
GROUP command before +entering the CHANGE command with appropriate parameters. The right +button of the mouse is then used to execute the changes. +

What can be changed?

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+ + + +

CIRCLE

+
+
+Function +
+Adds circles to a drawing. +
+Syntax +
+CIRCLE • •.. [center, circumference]
+CIRCLE width • •.. +
+Mouse keys +
+Center selects the layer. +
+See also
CHANGE, +WIRE +

+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. +

Example

+
+GRID inch 1;
+CIRCLE (0 0) (1 0);
+
+generates a circle with a radius of 1 inch and the center at the origin. + + + +

CLASS

+
+
+Function +
+Define and use net classes. +
+Syntax +
+CLASS
+CLASS number|name
+CLASS number [ name [ width [ clearance [ drill ] ] ] ] [ number:clearance .. ] +
+See also
Design Rules, +NET, +SIGNAL, +CHANGE +

+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. +

Width

+The width parameter defines a minimum width that all objects in this +net class must have. +

Clearance

+The clearance parameter defines the minimum clearance between objects +of different signals in this net class and objects in other net classes. +

Drill

+The drill parameter defines a minimum drill size that all objects in this +net class must have (only applies to objects that actually have a drill parameter, +like pads and vias). +

Clearance between net classes

+If a clearance is given in the form number:clearance, it defines the +minimum clearance between signals in this net class and signals in the net class +with the given number. The command +
+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. + + + +

CLOSE

+
+
+Function +
+Closes an editor window. +
+Syntax +
+CLOSE +
+See also
OPEN, +EDIT, +WRITE, +SCRIPT +

+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

+
+
+Function +
+Assigns package pads to symbol pins. +
+Syntax +
+CONNECT
+CONNECT symbol_name.pin_name pad_name..
+CONNECT pin_name pad_name.. +
+See also
PREFIX, +OPEN, +CLOSE, +SCRIPT +

+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. +

Device with one Symbol

+If only one symbol is included in a device, the parameter symbol_name +can be dropped, e.g.: +
+CONNECT gnd 1 rdy 2 phi1 3 !irq 4 nc1 5...
+
+(Note: "!" is used to indicate inverted data signals.) +

Device with Several Symbols

+If several symbols are present in a device, parameters must be entered +with symbol_name, pin_name and pad_name each time. For example: +
+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. +

Gate or Pin names that contain periods

+If a gate or pin name contains a period, simply enter them without any special +consideration (no quoting or escape characters are necessary). +

Example

+
+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

+
+
+Function +
+Copy objects. +
+Syntax +
+COPY • •..
+COPY deviceset@library [name]
+COPY package@library [name] +
+Mouse keys +
+Ctrl+Left selects an object at its origin.
+Ctrl+Right selects the group.
+Center mirrors the selected object or the group.
+Right rotates the selected object or the group.
+Shift+Right reverses the direction of rotating. +
+See also
GROUP, +CUT, +PASTE, +ADD, +INVOKE, +POLYGON +

+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. +

Copy Wires

+If you copy wires or polygons, belonging to a signal, the +copy will belong to the same signal. Please note, for this reason, +if two wires overlap after the use of the COPY command, the DRC will +not register an error. If a net or bus wire is copied in a schematic, +it belongs to the same segment as the original wire, even if there is +no visible connection. This can lead to unexpected effects, for instance +when renaming them later. Therefore COPY should not be used with +net or bus wires, respectively. +

Copy Parts

+When copying a part in a schematic, there will always be a new instance +of the complete part added, even if only a single gate of a multi-gate +part is selected. In addition to the selected gate, any other gates of that +device which have Add-Level MUST or ALWAYS will automatically be invoked. +

+If you just want to use another gate of a multi-gate part, you should use +the INVOKE command instead. +

Copy library objects

+By writing COPY deviceset@library or COPY package@library +you can copy a device set or a package from a given library into the currently +loaded library. If an additional name is given, the copied object will +be given that name. +This can also be done through the library objects' +context menu or via Drag&Drop from +the Control Panel's tree view. +

+Note that any existing library objects (device sets, symbols or packages) +used by the copied library object will be automatically updated. +

Copy a group

+Copying a group by selecting it with the right mouse button is actually +done by doing an implicit CUT operation, immediately +followed by a PASTE. + + + +

CUT

+
+
+Function +
+Loads a group into the paste buffer. +
+Syntax +
+CUT •
+CUT; +
+See also
PASTE, +GROUP +

+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. +

Reference Point

+If you click the mouse after selecting the CUT command, the position +of the mouse cursor defines a reference point for the group, i.e. +when using the PASTE command, the mouse cursor will be at the exact +position of the group. +

Note

+Unlike other (Windows-) programs EAGLE's CUT command does not physically +remove the marked group from the drawing; it only copies the group into +the paste buffer. + + + +

DELETE

+
+
+Function +
+Deletes objects. +
+Syntax +
+DELETE •..
+DELETE name ..
+DELETE SIGNALS +
+Mouse keys +
+Shift+Left deletes higher level object.
+Ctrl+Left deletes a wire joint.
+Ctrl+Right deletes the group. +
+See also
RIPUP, +DRC, +GROUP +

+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. +

Deleting Wire Joints

+If the DELETE command, with the Ctrl key pressed, is applied to the joining +point of two wires, these wires are combined to form one straight wire. +For this to work the two wires must be in the same layer and have the same width +and line style, and must both have round endings (in case of arcs). +

Deleting Polygon Corners

+The DELETE command deletes one corner at a time from a polygon. The +whole polygon is deleted if there are only three corners left. +

Deleting Components

+Components can be deleted only if the tOrigins layer (or bOrigins with +mirrored components) is visible and if (with active +Forward&Back Annotation) no signals are +connected to +the component (see also REPLACE). +Please note that an element may appear to be not connected (no airwires +or wires leading to any of it's pads), while in fact it is +connected to a supply voltage through an implicit power pin. In such a case +you can only delete the corresponding part in the schematic. +

Deleting Junctions, Nets, and Buses

+The following rules apply: + +

Deleting Supply Symbols

+If the last supply symbol of a given type is deleted from a net segment +that has the same name as the deleted supply pin, that segment is given +a newly generated name (if there are no other supply symbols still +attached to that segment) or the name of one of the remaining supply symbols. +

Deleting Signals

+If you select wires (tracks) or vias belonging to a signal with the DELETE +command three cases have to be considered: + +After wires or vias have been deleted from a signal which contains +polygons, all polygons belong to the signal keeping the original name +(usually the bigger part). +

Deleting all Signals

+

+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. +

Deleting higher level objects

+If the Shift key is pressed when clicking on an object, the object +that is hierarchically above the selected one will be deleted. This applies +to the following objects: +

+ + + + +
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

+
+
+Function +
+Defines the description of a device, package or library. +
+Syntax +
+DESCRIPTION
+DESCRIPTION description_string; +
+See also
CONNECT, +PACKAGE, +VALUE +

+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...". +

Example

+
+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

+
+
+Function +
+Selects the visible layers. +
+Syntax +
+DISPLAY
+DISPLAY [option] layer_number..
+DISPLAY [option] layer_name.. +
+See also
LAYER, +PRINT +

+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. +

Undefined Layers

+The options '?' and '??' can be used to control what happens if an undefined +layer is given in a DISPLAY command. Any undefined layers following a '?' will +cause a warning and the user can either accept it or cancel the entire DISPLAY +command. Undefined layers following a '??' will be silently ignored. +This is most useful for writing script files that shall be able to handle any drawing, +even if a particular drawing doesn't contain some of the listed layers. +
+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. +

Pads and Vias

+If pads or vias have different shapes on different layers, the shapes of the currently +visible (activated with DISPLAY) signal layers are displayed on top of each other. +

+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. +

Selecting Objects

+If you want to select certain objects or elements (e.g. +with MOVE or DELETE) the corresponding layer must be visible. Elements +can only be selected if the tOrigins (or bOrigins with mirrored elements) +layer is visible! +

Parameter Aliases

+Parameter aliases can be used to define certain parameter settings to the +DISPLAY command, which can later be referenced by a given name. +The aliases can also be accessed by clicking on the DISPLAY button +and holding the mouse button pressed until the list pops up. +A right click on the button also pops up the list. +

+The syntax to handle these aliases is: +

+
+DISPLAY = name parameters +
+Defines the alias with the given name to expand to the given +parameters. The name may consist of any number of letters, +digits and underlines, and is treated case insensitive. It must begin +with a letter or underline and may not be one of the option keywords. +
+DISPLAY = name @ +
+Defines the alias with the given name to expand to the current +parameter settings of the command. +
+DISPLAY = ? +
+Asks the user to enter a name for defining an alias for the current +parameter settings of the command. +
+DISPLAY = name +
+Opens the DISPLAY dialog and allows the user to select a set +of layers that will be defined as an alias under the given name. +
+DISPLAY = name; +
+Deletes the alias with the given name. +
+DISPLAY name +
+Expands the alias with the given name and executes the DISPLAY command with +the resulting set of parameters. The name may be abbreviated and +there may be other parameters before and after the alias (even other +aliases). Note that in case name is an abbreviation, aliases have precedence +over other parameter names of the command. +
+Example: +

+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

+
+
+Function +
+Checks design rules. +
+Syntax +
+DRC
+DRC • • ;
+DRC LOAD|SAVE filename; +
+See also
Design Rules, +CLASS, +SET, +ERC, +ERRORS +

+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. +

Related SET commands

+The SET command can be used to change the behavior of the DRC command: +
+SET DRC_FILL  fill_name;
+
+Defines the fill style used for the DRC error polygons. +Default is LtSlash. + + + +

EDIT

+
+
+Function +
+Loads an existing drawing to be edited or creates a new drawing. +
+Syntax +
+EDIT name
+EDIT name.ext
+EDIT .ext
+EDIT .sX [ .sY ] +
+See also
OPEN, +CLOSE, +BOARD +

+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. +

Which Directory?

+EDIT loads files from the +project directory. + + + +

ERC

+
+
+Function +
+Electrical Rule Check. +
+Syntax +
+ERC +
+See also
DRC, +ERRORS, +Consistency Check +

+This command is used to test schematics for electrical errors. The +result of the check is presented in the ERRORS +dialog. +

Consistency Check

+The ERC command also performs a +Consistency Check +between a schematic and its corresponding board, provided the board file +has been loaded before starting the ERC. +As a result of this check the automatic +Forward&Back Annotation +will be turned on or off, depending on whether the files have been found +to be consistent or not. +

+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

+
+
+Function +
+Shows the errors found by the ERC or DRC command. +
+Syntax +
+ERRORS
+ERRORS CLEAR +
+See also
ERC, +DRC +

+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. +

Marking a message as processed

+The Processed button marks a message as processed. It is still contained +in the list, but there is no error indicator in the editor window any more (except +if the list entry is selected). This can be used to mark messages as "done" after +fixing the related problem, without having to run the check again. After the next +ERC/DRC the message will be either gone, or marked as unprocessed again if the +problem still persists. +

Approving a message

+If an error or warning can't be fixed, but apparently doesn't matter (which the +user has to decide), it can be moved to the Approved section by pressing +the Approve button. Messages in that section will not draw error indicators +in the editor window (except if the list entry is selected) and are implicitly +marked as "processed". If any of these messages no longer apply after the +next ERC/DRC, they will be deleted. All approved messages are stored in the drawing +file, so that it is documented which ones have been explicitly approved by the +user. Note that consistency errors can not be approved - they always have to +be fixed in order to activate Forward&Back Annotation. +

Clearing the list

+The Clear all button deletes all entries form the list, except for the +approved messages. This can be used to get rid of the error indicators in +the editor window. The next ERC/DRC will regenerate the messages again, if +they still apply. +

+The list can also be cleared by entering the command +

+ERRORS CLEAR
+
+ + + + +

EXPORT

+
+
+Function +
+Generation of data files. +
+Syntax +
+EXPORT SCRIPT filename;
+EXPORT NETLIST filename;
+EXPORT NETSCRIPT filename;
+EXPORT PARTLIST filename;
+EXPORT PINLIST filename;
+EXPORT DIRECTORY filename;
+EXPORT IMAGE filename|CLIPBOARD [MONOCHROME|WINDOW] resolution; +
+See also
SCRIPT, +RUN +

+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: +

SCRIPT

+A library previously opened with the OPEN command will be output as +a script file. When a library has been exported and is to be imported +again with the SCRIPT command, a new library should be opened in order +to avoid duplication - e.g. the same symbol is defined more than +once. Reading script files can be accelerated if the command +
+Set Undo_Log Off;
+
+is given before. +

NETLIST

+Generates a netlist for the loaded schematic or board. Only nets which +are connected to elements are listed. +

NETSCRIPT

+Generates a netlist for the loaded schematic in the form of a script +file. This file can be used to read a new or changed netlist into +a board where elements have already been placed or previously routed +tracks have been deleted with DELETE SIGNALS. +Note that while reading such a script into a board no schematic that +is consistent with this board may be loaded. +

PARTLIST

+Generates a component list for schematics or boards. Only elements +with pins/pads are included. +

PINLIST

+Generates a list with pads and pins, containing the pin directions and +the names of the nets connected to the pins. +

DIRECTORY

+Lists the directory of the currently opened library. +

IMAGE

+Exporting an IMAGE generates an image file with a format corresponding +to the given filename extension. The following image formats are available: +

+ + + + + + + + + +
.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

+
+
+Function +
+Adds a frame to a drawing. +
+Syntax +
+FRAME [ columns [ rows ] ] [ borders ] • • +
+Mouse keys +
+Center selects the layer. +
+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. +

Example

+
+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. + + + +

GATESWAP

+
+
+Function +
+Swaps equivalent gates on a schematic. +
+Syntax +
+GATESWAP • •..;
+GATESWAP gate_name gate_name..; +
+See also
ADD +

+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

+
+
+Function +
+Defines grid. +
+Syntax +
+GRID option..;
+GRID; +
+Keyboard +
+F6: GRID; turns the grid on or off. +
+See also
SCRIPT +

+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
+

Examples

+
+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. +

Parameter Aliases

+Parameter aliases can be used to define certain parameter settings to the +GRID command, which can later be referenced by a given name. +The aliases can also be accessed by clicking on the GRID button +and holding the mouse button pressed until the list pops up. +A right click on the button also pops up the list. +

+The syntax to handle these aliases is: +

+
+GRID = name parameters +
+Defines the alias with the given name to expand to the given +parameters. The name may consist of any number of letters, +digits and underlines, and is treated case insensitive. It must begin +with a letter or underline and may not be one of the option keywords. +
+GRID = name @ +
+Defines the alias with the given name to expand to the current +parameter settings of the command. +
+GRID = ? +
+Asks the user to enter a name for defining an alias for the current +parameter settings of the command. +
+GRID = name +
+Opens the GRID dialog and allows the user to adjust the grid +parameters and define an alias for them under the given name. +
+GRID = name; +
+Deletes the alias with the given name. +
+GRID name +
+Expands the alias with the given name and executes the GRID command with +the resulting set of parameters. The name may be abbreviated and +there may be other parameters before and after the alias (even other +aliases). Note that in case name is an abbreviation, aliases have precedence +over other parameter names of the command. +
+Example: +

+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

+
+
+Function +
+Defines a group. +
+Syntax +
+GROUP •..
+GROUP ALL
+GROUP; +
+Mouse keys +
+Left&Drag defines a rectangular group.
+Shift+Left adds the new group to an existing one.
+Ctrl+Left toggles the group membership of the selected object.
+Ctrl+Shift+Left toggles the group membership of the higher level object.
+Right closes the group polygon. +
+See also
CHANGE, +CUT, +PASTE, +MIRROR, +DELETE +

+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: +

+

Move Group

+In order to move a group it is necessary to select the MOVE command +with the right mouse button. When moving wires (tracks) with +the GROUP command that have only one end point in the polygon, this +point is moved while the other one remains at its previous position. +

+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. +

Extending the group

+If you press the Shift key together with any mouse click when +defining the group, the newly defined group will be added to the existing group (if +any). +

Individual objects

+You can toggle the group membership of an individual object by clicking on it +with the Ctrl key pressed. If you also press the Shift key +when doing so, the group membership of the next higher level object is toggled. +For instance, when clicking on a net wire in a schematic with the GROUP command +and Ctrl+Shift pressed, the group membership of the entire segment will +be toggled. + + + +

HELP

+
+
+Function +
+Help for the current command. +
+Syntax +
+HELP
+HELP command +
+Keyboard +
+F1: HELP activates the context sensitive help. +
+This command opens a context sensitive help window. +

+A command name within the HELP command shows the help page of that +command. +

Example

+
+HELP GRID;
+
+displays the help page for the GRID command. + + +
+

HOLE

+
+
+Function +
+Add drill hole to a board or package. +
+Syntax +
+HOLE drill •.. +
+See also
VIA, +PAD, +CHANGE +

+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). +

Example

+
+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

+
+
+Function +
+Display and modify object properties. +
+Syntax +
+INFO •..
+INFO name .. +
+See also
CHANGE, +SHOW +

+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

+
+
+Function +
+Call a specific symbol from a device. +
+Syntax +
+INVOKE • orientation •
+INVOKE part_name gate_name orientation • +
+Mouse keys +
+Center mirrors the gate.
+Right rotates the gate.
+Shift+Right reverses the direction of rotating. +
+See also
COPY, +ADD +

+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: +

+The final mouse click positions the new gate. +

+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. +

Gates on Different Sheets

+If a gate from a device on a different sheet is to be added +to the current sheet, the name of the gate has to be specified in +the INVOKE command. In this case the right column of the popup menu +shows the sheet number where the already used gates are placed. A +gate placed on the current sheet is indicated by an asterisk. + + + +

JUNCTION

+
+
+Function +
+Places a dot at intersecting nets. +
+Syntax +
+JUNCTION •.. +
+See also
NET +

+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

+
+
+Function +
+Attaches text labels to buses and nets. +
+Syntax +
+LABEL [XREF] [orientation] • •.. +
+Mouse keys +
+Center selects the layer.
+Right rotates the label.
+Shift+Right reverses the direction of rotating. +
+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. +

Cross-reference labels

+If the optional keyword XREF is given, the label will be a +"cross-reference" label. Cross-reference labels can be used in multi-sheet +schematics to indicate the next sheet a particular net appears on (note that +this only works for nets, not for busses!). +The XREF keyword is mainly for use in scripts. Normally the setting +is taken from what has previously been set with CHANGE XREF, +or by clicking on the Xref button in the parameter toolbar. +

+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. +

Selecting the layer

+Unlike other commands (like WIRE, for instance), the LABEL command keeps track +of its last used layer by itself. This has the advantage of making sure that +labels are always drawn into the right layer, no matter what layers other +commands draw into. The downside of this is that the usual way of setting the layer +in a script, as in +
+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.
+The commands +
+LABEL
+LAYER layer;
+
+set the layer to use with subsequent LABEL commands. + + + +

LAYER

+
+
+Function +
+Changes and defines layers. +
+Syntax +
+LAYER layer_number
+LAYER layer_name
+LAYER layer_number layer_name
+LAYER [??] -layer_number +
+See also
DISPLAY +

Choose Drawing Layer

+The LAYER command with one parameter is used to change the current +layer, i.e. the layer onto which wires, circles etc. will be drawn. +If LAYER is selected from the menu, a popup menu will appear in which +you may change to the desired layer. If entered from the command line, +'layer_number' may be the number of any valid layer, and 'layer_name' +may be the name of a layer as displayed in the popup menu. +

+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. +

Define Layers

+The LAYER command with two parameters is used to define a new layer +or to rename an existing one. +If you type in at the command prompt e.g. +
+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. +

Delete Layers

+The LAYER command with the minus sign and a layer_number deletes the +layer with the specified number, e.g. +
+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. +

Supply Layers

+Layers 2...15 are treated as supply layers if their name starts with the '$' +character and there is a signal with an identical name but without the leading '$'. +

+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. +

Predefined EAGLE Layers

+

Layout

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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
+

Schematic

+ + + + + + + + + + +
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
+ + + +

LOCK

+
+
+Function +
+Locks the position and orientation of a part in the board. +
+Syntax +
+LOCK •..
+LOCK name .. +
+Mouse keys +
+Ctrl+Right applies the command to the group.
+Shift+Left reverses the lock operation ("unlocks" the part).
+Ctrl+Shift+Right "unlocks" all parts in the group. +
+See also
MIRROR, +MOVE, +ROTATE +SMASH +

+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

+
+
+Function +
+Defines a mark on the drawing area. +
+Syntax +
+MARK •
+MARK; +
+See also
GRID +

+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

+
+
+Function +
+Customizes the textual command menu. +
+Syntax +
+MENU option ..;
+MENU; +
+See also
ASSIGN, +SCRIPT +

+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;\
+           }';
+
+

Example

+
+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

+
+
+Function +
+Mirrors objects and groups. +
+Syntax +
+MIRROR •..
+MIRROR name.. +
+Mouse keys +
+Ctrl+Right mirrors the group. +
+See also
ROTATE, +LOCK, +TEXT +

+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). +

Mirror a Group

+In order to mirror a group of elements, the group is first defined +with the GROUP command and polygon in the usual manner. The MIRROR +command is then selected and the right mouse button is used to execute +the change. The group will be mirrored about the vertical axis through +the next grid point. +

+Wires, circles, pads and polygons may not be individually +mirrored unless included in a group. +

Mirror Texts

+Text on the solder side of a pc board (Bottom and bPlace layers) is +mirrored automatically so that it is readable when you look at the +solder side of the board. +

+Mirrored text in a schematic will be printed on the other side of its origin point, +but it will still remain normally readable. + + + +

MITER

+
+
+Function +
+Miters wire joints. +
+Syntax +
+MITER [radius] •.. +
+Mouse keys +
+Left&Drag dynamically modifies the miter.
+Right toggles between round and straight mitering. +
+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. +

Mitering a point

+If you select a point where exactly two straight wires join, an additional wire will +be inserted between these two wires, according to the given radius. +If you click&drag on such a point with the left mouse button, you can define +the mitering wire dynamically. +

Mitering a wire

+If you select a wire (which may also be an arc) somewhere in the middle between its +end points, and that wire is connected to exactly two other straight wires (one at each +end), the selected wire will be "re-mitered" according to the given radius. +If you click&drag on such a wire with the left mouse button, you can define +the mitering wire dynamically. +

Straight versus round mitering

+If radius is positive, the inserted wire will be an arc with the given radius; +if it is negative, a straight wire will be inserted (imagine the '-' sign as +indicating "straight"). You can toggle between round and straight mitering by pressing +the right mouse button. +

Miter radius and wire bend style

+The radius you give in the MITER command will be used in all other commands +that draw wires in case the wire bend style is one of the 90 or 45 degree styles. +If you have set round mitering, it will apply to both the 90 and 45 degree bend styles; +in case of straight mitering only the 90 degree bend styles are affected. + + + +

MOVE

+
+
+Function +
+Moves objects. +
+Syntax +
+MOVE • •..
+MOVE name •.. +
+Mouse keys +
+Ctrl+Left selects an object at its origin or modifies it (see note).
+Ctrl+Right selects the group.
+Left&Drag immediately moves the object.
+Ctrl+Right&Drag immediately moves the group.
+Center mirrors the selected object or the group.
+Right rotates the selected object or the group.
+Shift+Right reverses the direction of rotating. +
+Keyboard +
+F7: MOVE activates the MOVE command. +
+See also
GROUP, +LOCK, +RATSNEST +

+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). +

Move Wires

+If, following a MOVE command, two wires from different +signals are shorted together, they are maintained as separate signals +and the error will be flagged by the DRC command. +

Move Groups

+In order to move a group, the selected objects are defined in the +normal way (GROUP command and polygon) before selecting the MOVE command +and clicking the group with the right mouse button. The entire group +can now be moved and rotated with the right mouse button. +

Hints for Schematics

+If a supply pin (Direction Sup) is placed on a net, the pin name is +allocated to this net. +

+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. +

Selecting objects at their origin

+Normally a selected object remains within the grid it has been originally +placed on. If you press Ctrl while selecting an object, the point +where you have selected the object is pulled towards the cursor and snapped into +the current grid. +

+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. +

Move part of a sheet to an other sheet

+You can move part of a sheet to an other sheet of the same schematic without +affecting the board (in case Forward&Back Annotation +is active) by defining a GROUP that contains the objects +you want to move, selecting that group with the MOVE command and then switching to +the desired sheet, with the MOVE command still active and having the group attached +to the cursor. In the new sheet the MOVE command will be active again and will have +the previously defined group attached to the cursor. Now place the group as usual, +and all the affected objects will be transferred from the original sheet to the +current sheet. If the current sheet is the same as the original sheet, nothing +happens. +

+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

+
+
+Function +
+Displays and changes names. +
+Syntax +
+NAME •..
+NAME new_name •
+NAME old_name new_name +
+See also
SHOW, +SMASH, +VALUE +

+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. +

Library

+When in library edit mode, the NAME command is used to display or +edit the name of the selected pad, smd, pin or gate. +

Automatic Naming

+EAGLE generates names automatically: E$.. for elements, S$.. for signals, +P$.. for pads, pins and smds. In general, it is convenient to substitute +commonly used names (e.g. 1...14 for a 14-pin dual inline package) +in place of these automatically generated names. +

Schematic

+If nets or buses are to be renamed, the program has to distinguish +between three cases because they can consist of several segments placed +on different sheets. Thus a menu will ask the user: +

+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). +

Polygon

+When renaming a signal polygon in a board, you can choose whether to rename +only this polygon (and thus move it from one signal into another), or to +give the entire signal a different name. + + + +

NET

+
+
+Function +
+Draws nets on a schematic. +
+Syntax +
+NET [net_name] • [curve | @radius] •.. +
+Mouse keys +
+Right changes the wire bend style (see SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Right toggles between corresponding bend styles. +
+See also BUS, +NAME, +CLASS, +SET +

+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). +

Select Bus Signal

+If a net is started on a bus, a popup menu opens from which one of +the bus signals can be selected. The net then is named correspondingly +and becomes part of the same signal. If the bus includes several part +buses, a further popup menu opens from which the relevant part bus +can be selected. +

Net Names

+If the NET command is used with a net name +then the net is named accordingly. +

+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. +

Line Width

+The width of the line drawn by the net command may be changed with +the command: +
+SET NET_WIRE_WIDTH width;
+
+(Default: 6 mil). +

Inverted signals

+The name of an inverted signal ("active low") can be displayed overlined if it +is preceded with an exclamation mark ('!'), as in +
+  !RESET
+
+which would result in +
+  _____
+  RESET
+
+You can find further details about this in the description of the TEXT command. + + + +

OPEN

+
+
+Function +
+Opens a library for editing. +
+Syntax +
+OPEN library_name +
+See also
CLOSE, +USE, +EDIT, +SCRIPT +

+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

+
+
+Function +
+Joins wire segments together. +
+Syntax +
+OPTIMIZE;
+OPTIMIZE signal_name ..
+OPTIMIZE •.. +
+Mouse keys +
+Ctrl+Right optimizes the group. +
+See also
SET, +SPLIT, +MOVE, +ROUTE +

+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. +

Automatic Optimization

+This wire optimization takes place automatically after MOVE, SPLIT, +or ROUTE commands unless it is disabled with the command: +
+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

+
+
+Function +
+Defines a package variant for a device. +
+Syntax +
+PACKAGE
+PACKAGE pname vname
+PACKAGE pname@lname vname
+PACKAGE name
+PACKAGE -old_name new_name
+PACKAGE -name +
+See also
CONNECT, +TECHNOLOGY, +PREFIX +

+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

+
+
+Function +
+Adds pads to a package. +
+Syntax +
+PAD [diameter] [shape] [orientation] [flags] ['name'] •.. +
+Mouse keys +
+Right rotates the pad.
+Shift+Right reverses the direction of rotating. +
+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. +

Example

+
+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. +

Pad Shapes

+A pad can have one of the following shapes: +

+ + + + + + +
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. +

Pad Names

+Pad names are generated by the program automatically +and can be changed with the NAME command. The name can also be defined +in the PAD command. Pad name display can be turned on or off by means +of the commands: +
+SET PAD_NAMES OFF | ON;
+
+This change will be visible after the next screen refresh. +

Flags

+The following flags can be used to control the appearance of a pad: +

+ + + + +
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). +

Single Pads

+Single pads in boards can be used only by defining a package +with one pad. Via-holes can be placed in board but they don't have +an element name and therefore don't show up in the netlist. +

Alter Package

+It is not possible to add or delete pads in packages which +are already used by a device, because this would change the pin/pad +allocation defined with the CONNECT command. + + + +

PASTE

+
+
+Function +
+Copies the contents of the paste buffer to a drawing. +
+Syntax +
+PASTE [ orientation ] • +
+Mouse keys +
+Center mirrors the contents of the paste buffer.
+Right rotates the contents of the paste buffer.
+Shift+Right reverses the direction of rotating. +
+See also
CUT, +GROUP +

+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: +

+If there are modified versions of devices or packages in the paste buffer, +an automatic library update will be started to replace +the objects in the schematic or board with the ones from the paste buffer. +Note: You should always run a Design Rule Check (DRC) and an +Electrical Rule Check (ERC) after a library update has been performed! + + + +

PIN

+
+
+Function +
+Defines connection points for symbols. +
+Syntax +
+PIN 'name' options •.. +
+Mouse keys +
+Right rotates the pin.
+Shift+Right reverses the direction of rotating. +
+See also
NAME, +SHOW, +CHANGE +

Options

+There are six possible options: +

+Direction
+Function
+Length
+Orientation
+Visible
+Swaplevel +

Direction

+The logical direction of signal flow. It is essential for the Electrical +Rule Check (ERC) and for the automatic wiring of the power supply +pins. The following possibilities may be used: +

+ + + + + + + + + + +
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. +

Function

+The graphic representation of the pin: +

+ + + + + +
None no special function
Dot inverter symbol
Clk clock symbol
DotClk inverted clock symbol
+

+Default: None +

Length

+Length of the pin symbol: +

+ + + + + +
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 +

Orientation

+The orientation of the pin. When placing pins manually the right mouse +button rotates the pin. The parameter "orientation" is mainly +used in script files: +

+ + + + + +
R0 connection point on the right
R90 connection point above
R180 connection point on the left
R270 connection point below
+

+Default: R0 +

Visible

+This parameter defines if pin and/or pad name are visible in the schematic: +

+ + + + + +
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 +

Swaplevel

+A number between 0 and 255. Swaplevel = 0 indicates that a pin can +not be swapped with another. The allocation of a number greater than +0 indicates that a pin may be swapped with any other in the same symbol +with the same swaplevel number. For example: The inputs of a NAND +gate could be allocated the same swaplevel number as they are all +identical. +

+Default: 0 +

Using the PIN Command

+The PIN command is used to define connection points on a symbol for +nets. Pins are drawn onto the Symbols layer while additional information +appears on the Pins layer. Individual pins may be assigned various +options in the command line. The options can be listed in any order +or omitted. In this case the default options are valid. +

+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. +

Automatic Naming

+Pins may be automatically numbered in the following way. In order +to place the pins D0...D7 on a symbol, the first pin is placed with +the following command: +
+PIN 'D0' *
+
+and the location for the other pins defined with a mouse click for each. +

Predefine options with CHANGE

+All options may be predefined with CHANGE commands. The options remain +in use until edited by a new PIN or CHANGE command. +

+The SHOW command may be used to show pin options such as Direction +and Swaplevel. +

Pins with the same Name

+If it is required to define several pins in a component with the same +name, the following procedure can be used: +

+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. +

Pin Lettering

+The position of pin and pad names on a symbol relative +to the pin connection point can not be changed, nor can the text size. +When defining new symbols please ensure their size is consistent with +existing symbols. +

Inverted pins

+The name of an inverted pin ("active low") can be displayed overlined if it +is preceded with an exclamation mark ('!'), as in +
+  !RESET
+
+which would result in +
+  _____
+  RESET
+
+You can find further details about this in the description of the TEXT command. + + + +

PINSWAP

+
+
+Function +
+Swap pins or pads. +
+Syntax +
+PINSWAP • •.. +
+See also
PIN +

+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

+
+
+Function +
+Draws polygon areas. +
+Syntax +
+POLYGON [signal_name] [width] • [curve | @radius] • •.. +
+Mouse keys +
+Center selects the layer.
+Right changes the wire bend style (see
SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Right toggles between corresponding bend styles.
+Ctrl+Left when placing a wire end point defines arc radius.
+Left twice at the same point closes the 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). +

Note

+You should avoid using very small values for the width of a +polygon, because this can cause extremely large amounts of data when +processing a drawing with the CAM Processor.
+The polygon width should always be larger than the hardware +resolution of the output device. For example when using a Gerber photoplotter +with a typical resolution of 1 mil, the polygon width should +not be smaller than, say, 6 mil. Typically you should keep the polygon +width in the same range as your other wires. +

+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. +

Outlines or Real Mode

+Polygons belonging to a signal can be displayed in two different +modes: +

+ + + +
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. +

Other commands and Polygons

+Polygons are selected at their edges (like wires). +

+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. +

Parameters

+

Width

+Line width of the polygon edges. Also used for filling. +

Layer

+Polygons can be drawn into any layer. +Polygons in signal layers belong to a signal and keep the distance +defined in the design rules and net classes from other signals. +Objects in the tRestrict layer are substracted from polygons in the +Top layer (the same applies to bRestrict/Bottom). This allows you, for +instance, to generate "negative" text on a ground area. +

Pour

+Fill mode (Solid [default] or Hatch). +

Rank

+Defines how polygons are subtracted from each other. Polygons with +a lower 'rank' appear "first" and thus get subtracted from polygons with a higher 'rank'.
+Valid ranks are 1..6 for signal polygons and 0 or 7 for +polygons in packages. Polygons with the same rank are checked against each other +by the Design Rule Check. The rank parameter only has a +meaning for polygons in signal layers (1..16) and will be ignored for +polygons in other layers. The default is 1 for signal polygons and 7 +for package polygons. +

Thermals

+Defines how pads and smds are connected (On += thermals are generated [default], Off = no thermals). +

Spacing

+Distance between fill lines when Pour = Hatch +(default: 50 Mil). +

Isolate

+Distance between polygon areas and other signals or objects in +the Dimension layer (default: 0). +If a particular polygon is given an Isolate value that exceeds that from the +design rules and net classes, the larger value will be taken. +See also Design Rules under Distance and Supply, respectively. +

Orphans

+As a polygon automatically keeps a certain distance +to other signals it can happen that the polygon is separated into +a number of smaller polygons. If such a polygon has no electrical +connection to any other (non-polygon) object of its signal, +the user might want it to disappear. With the parameter Orphans = Off +[default] these isolated zones will disappear. With Orphans = On they +will remain. If a signal consists only of polygons and has no other electrically +connected objects, all polygon parts will remain, independent of the setting of +the Orphans parameter. +

+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. +

Thermal dimensions

+The width of the conducting path in the thermal symbol is calculated +as follows: + +

Outlines data

+The special signal name _OUTLINES_ gives a polygon certain properties that +are used to generate outlines data (for example +for milling prototype boards). +This name should not be used otherwise. +

Hatched polygons and airwires

+Depending on the value of the spacing parameter, pads, smds, vias and wires inside a +hatched polygon that are connected to the same signal as the polygon may "fall through" +the raster and thus have airwires generated to indicate their connection to the +signal. +

+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

+
+
+Function +
+Defines the prefix for a symbol name. +
+Syntax +
+PREFIX prefix_string; +
+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. +

Example

+
+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. + + + +

PRINT

+
+
+Function +
+Prints a drawing to the system printer. +
+Syntax +
+PRINT [factor] [-limit] [options] [;] +
+See also
CAM Processor, +printing to the system printer +

+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. +

Printing to a file

+The FILE option can be used to print the output into a file. +If this option is present, it must be immediately followed by the name of the output file. +

+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 +

Printing to a given paper size

+The PAPER option defines the size of the paper to print on. +It must be immediately followed by one of the paper size names listed in +the Paper combo box of the PRINT dialog, like A4, Letter etc. +If a custom paper size shall be set, it has to be given in the format +
+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. +

Printing a range of sheets

+The SHEETS option can be used to print a range of sheets from a schematic. +The range is given as two numbers, delimited by a '-', as in 2-15. +Without this option, only the currently edited sheet is printed. +To print all sheets, the range ALL can be used (which is case insensitive, +but must be written in full). +A range can also consist of just a single number, as in 42, which will +print exactly that sheet. +If no schematic is loaded, this option has no meaning. +

Examples

+ + + + + + + +
PRINT 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
+ + + +

QUIT

+
+
+Function +
+Quits the program +
+Syntax +
+QUIT +
+This command ends the editing session. If any changes have been made +but the drawing has not yet been saved, a popup menu will ask you +if you want to save the drawing/library first. +

+You can also exit from EAGLE at any time by pressing Alt+X. + + + +

RATSNEST

+
+
+Function +
+Calculates the shortest possible airwires and polygons. +
+Syntax +
+RATSNEST
+RATSNEST signal_name ..
+RATSNEST ! signal_name .. +
+See also
SIGNAL, +MOVE, +POLYGON, +RIPUP +

+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. +

Zero length airwires

+If two or more wires of the same signal on different routing layers end +at the same point without being connected through a pad or a via, a +zero length airwire is generated, which will be displayed +as an X-shaped cross in the Unrouted layer. The same applies to smds that +belong to the same signal and are placed on opposite sides of the board. +

+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. +

Making sure everything has been routed

+If there is nothing left to be routed, the RATSNEST command will respond +with the message +
+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. +

Wildcards

+If a signal_name parameter is given, the characters '*', '?' +and '[]' are wildcards and have the following meaning: +

+ + + + +
* 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'. +

Hiding selected airwires

+Sometimes it may be useful to hide the airwires of selected signals, for instance +if these will later be connected through a polygon. Typically this could be supply +signals, which have a lot of airwires that will never be routed explicitly and +just obscure the other signals' airwires. +

+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.
+To have the airwires displayed again just enter the RATSNEST command without the +'!' character, and the list of signals: +
+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. + + + +

RECT

+
+
+Function +
+Adds rectangles to a drawing. +
+Syntax +
+RECT [orientation] • •.. +
+Mouse keys +
+Center selects the layer. +
+See also
CIRCLE +

+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. +

Not Part of Signals

+Rectangles in the signal layers Top, Bottom, or Route2...15 don't +belong to signals. Therefore the DRC reports errors if they overlap +with wires, pads etc. +

Restricted Areas

+If used in the layers tRestrict, bRestrict, or vRestrict, the RECT +command defines restricted areas for the Autorouter. + + + +

REDO

+
+
+Function +
+Executes a command that was reversed by UNDO. +
+Syntax +
+REDO; +
+Keyboard +
+F10: REDO execute the REDO command.
+Shift+Alt+BS: REDO +
+See also
UNDO, +Forward&Back Annotation +

+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

+
+
+Function +
+Deletes files, devices, symbols, packages, and sheets. +
+Syntax +
+REMOVE name
+REMOVE name.Sxx +
+See also
OPEN, +RENAME +

Files

+The REMOVE command is used to delete the file name if in +board or schematic editing mode. +

Devices, Symbols, Packages

+The REMOVE command is used to delete the device, symbol or package +"name" from the presently opened library. +The name may include an extension (for example REMOVE name.pac). If the name is given without +extension, you have to be in the respective mode to remove an object +(i.e. editing a package if you want to remove packages). +

+Symbols and packages can be erased from a library only +if not used by a device. +

Sheets

+The REMOVE command may also be used to delete a sheet from a schematic. +The name of the presently loaded schematic can be omitted. +The parameter xx represents the sheet number, for example: +
+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

+
+
+Function +
+Renames symbols, devices or packages. +
+Syntax +
+RENAME old_name new_name; +
+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

+
+
+Function +
+Replace a part. +
+Syntax +
+REPLACE •..
+REPLACE device_name •..
+REPLACE part_name device_name ..
+REPLACE package_name •..
+REPLACE element_name package_name .. +
+See also
SET, +UPDATE +

+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

+
+
+Function +
+Changes routed wires and vias into airwires.
+Changes the display of polygons to "outlines". +
+Syntax +
+RIPUP;
+RIPUP [ @ ] [ ! ] •..
+RIPUP [ @ ] [ ! ] signal_name.. +
+Mouse keys +
+Ctrl+Right rips up the group. +
+See also
DELETE, +GROUP, +POLYGON, +RATSNEST +

+The RIPUP command changes routed wires (tracks) into airwires. That +can be done for: +

+Selecting an airwire with RIPUP converts all adjacent routed wires and vias +into airwires, up to the next pad, smd or airwire. +
+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! +

Wildcards

+If a signal_name parameter is given, the characters '*', '?' +and '[]' are wildcards and have the following meaning: +

+ + + + +
* 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'. +

Polygons

+If the RIPUP command with a name is applied to a signal which contains a polygon +the polygon will be displayed with its outlines (faster screen +redraw!). Use the RATSNEST command to have polygons +displayed in the "real mode" again. + + + +

ROTATE

+
+
+Function +
+Rotates objects. +
+Syntax +
+ROTATE orientation •..
+ROTATE orientation name.. +
+Mouse keys +
+Ctrl+Right rotates the group.
+Left&Drag rotates the object by any angle.
+Ctrl+Right&Drag rotates the group by any angle. +
+See also
ADD, +MIRROR, +MOVE, +LOCK, +GROUP +

+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

+When rotating an element, wires (tracks) connected to the element are +moved at the connection points (beware of short circuits!). +

+Elements can only be rotated if the appropriate tOrigins/bOrigins +layer is visible. +

Text

+Text is always displayed so that it can be read from the bottom +or from the right - even when 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. + + + +

ROUTE

+
+
+Function +
+Converts unrouted connections into routed wires (tracks). +
+Syntax +
+ROUTE [width] • [curve | @radius] •..
+ROUTE name .. +
+Mouse keys +
+Ctrl+Left starts routing at any given point along a wire or via.
+Shift+Left starts routing with the same width as an existing wire.
+Center selects the layer.
+Right changes the wire bend style (see
SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Right toggles between corresponding bend styles.
+Shift+Left places a via at the end point.
+Ctrl+Left when placing a wire end point defines arc radius. +
+See also AUTO, +UNDO, +WIRE, +MITER, +SIGNAL, +SET, +RATSNEST +

+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. +

Selecting the routing layer and wire width

+When you select an airwire, the initial layer in which to route is +determined by considering the objects at the starting point as follows: + +When selecting an airwire, the wire width for routing +will be that defined by the Design Rules and the net class of the selected signal +if the flag "Options/Set/Misc/Auto set route width and drill" is set. +You can select a different width wile the airwire is attached to the cursor, and +the track will be rerouted with the new width. The same applies to the via data. +

+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. +

Snap Function

+The end point of the dynamically calculated airwire is always used as an +additional snap point, even if it is off grid. If the remaining airwire has +a length that is shorter than SNAP_LENGTH, the routed wire automatically +snaps to the airwire's end point, and stays there until the mouse pointer +is moved at least SNAP_LENGTH away from that point. +The minimum distance for this snap function can be defined with the command +
+SET SNAP_LENGTH distance;
+
+where "distance" is the snap radius in the current grid unit. +

Follow-me Router

+With the special wire bend styles 8 and 9, +the ROUTE command works as a "Follow-me" router. This means that the selected airwire +will be routed fully automatically by the Autorouter. +

+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: +

+ + + +

RUN

+
+
+Function +
+Executes a User Language Program. +
+Syntax +
+RUN file_name [argument ...] +
+See also SCRIPT +

+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. +

Running a ULP from a script file

+If a ULP is executed from a script file and the program returns an integer value +other than 0 (either because it has been terminated through a +call to the exit() function or because +the STOP button was clicked), execution of the script file will be terminated. +

Editor commands resulting from running a ULP

+A ULP can also use the exit() function with a string +parameter to send a command string back to the editor window. + + + +

SCRIPT

+
+
+Function +
+Executes a command file. +
+Syntax +
+SCRIPT file_name; +
+See also
SET, +MENU, +ASSIGN, +EXPORT, +RUN +

+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". +

Examples

+ + + + +
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: +

+SCRIPT files contain EAGLE commands according to the syntax rules. +Lines beginning with '#' are comment. +

Continued Lines

+SCRIPT files contain one or more commands in every line according +to the syntax rules. The character '\' at the end of a command line ensures +that the first word of the next line is not interpreted as a command. +This feature allows you to avoid apostrophes in many cases. +

Set Default Parameters

+The SCRIPT file eagle.scr - if it exists in the project +directory or in the script path - is executed each time +a new drawing is loaded into an editor window (or when the drawing type is changed +in a library). +

Execute Script Files in the Library Editor

+All of the layers are recognized only if the library editor has previously been loaded. + + + +

SET

+
+
+Function +
+Alters system parameters +
+Syntax +
+SET
+SET options; +
+Parameters which affect the behavior of the program, the screen display, or the user interface can be specified with the SET command. The precise syntax is described below. +

+A dialog in which all the parameters can be set appears if the SET command is entered without parameters. +

User Interface

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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;
+

Screen display

+ + + + + + + + + + + + + + + + + + + + + + + +
Color for grid linesSET 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.
+

Mode parameters

+ + + + + + + +
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.
+

Colors

+There are three palettes for black, white and colored background, +respectively. Each palette has 64 color entries, which can be set to any +ARGB value. The palette entry number 0 is used as the background color +(in the "white" palette this entry cannot be modified, since this palette +will also be used for printing, where the background is always white). +

+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
+

EagleRc Parameters

+Sometimes a small detail of functionality needs to be made adjustable, for +instance because some users absolutely need to have it work differently. +These parameters are not available in any dialogs, but can only be changed +through an entry in the eaglerc file. In order to make this easier, any +parameter that is not found amoung the keywords listed above will be looked +up in the eaglerc parameters and can thus be changed using the SET command. +Note that the parameter names must be written in full and exactly as +listed below (case sensitive). The parameter value is typically '0' or '1', +to turn the functionality 'off' or 'on', respectively. After changing any +of these parameters that influence the way the screen display is drawn, a +window refresh may be necessary. +

+Example +

+SET Option.DrawUnprocessedPolygonEdgesContinuous 1;
+
+The following eaglerc parameters parameters are available: +

+

+
Cmd.Delete.WireJointsWithoutCtrl +
+If you insist on having the DELETE command delete wire joints +without pressing the Ctrl key, you can set this parameter to '1'. +
Cmd.Wire.IgnoreCtrlForRadiusMode +
+If you don't like the special mode in wire drawing commands that allows +for the definition of an arc radius by pressing the Ctrl key when placing +the wire, you can set this parameter to '1'. +This will turn this feature off for all commands that draw wires. +
ControlPanel.View.AutoOpenProjectFolder +
+The automatic opening of the project folder at program start (or when +activating a project by clicking on its gray button) can be disabled +by setting this parameter to '0'. +
Erc.AllowUserOverrideConsistencyCheck +
+In order to handle board/schematic pairs that have only minor inconsistencies, +the user can enable a dialog that allows him to force the editor to +perform forward-/backannotation, even if the ERC detects that the files are +inconsistent. This can be done by setting this parameter to '1'. +PLEASE NOTE THAT YOU ARE DOING THIS AT YOUR OWN RISK - if the files get +corrupted in the process, there may be nothing anybody can do to recover +them. After all, the ERC did state that the files were inconsistent! +
Interface.MouseButtonReleaseTimeout +
+The time (in milliseconds) within which a mouse button release that follows +a mouse button press on a button (like, for instance, toolbar buttons) +triggers the button's action, even if the mouse button release happened +outside the button's area. Default is 500, set this to 0 to turn off this +feature. If this parameter is 0 when the program is started, any change +to it will only take effect the next time the program is started. +
Interface.PreferredUnit +
+When displaying a numerical value in dialog input fields, the units are determined +automatically, so that the representation with the least number of decimal +digits is chosen. This can be controlled by setting this parameter to +'0' for automatic unit determination (default), +'1' for imperial units, and +'2' for metric units. +
Interface.UseCtrlForPanning +
+Panning is done by moving the mouse while holding the center mouse button +(or mouse wheel) down. In older versions this was done by pressing the Ctrl +key instead. If you want the old functionality back, you can set this +parameter to '1'. +Note, though, that the Ctrl key is now used for special functions in some +commands, so when using these special functions (like selecting an object +at its origin in MOVE) with this parameter enabled you may inadvertently +pan your draw window. +
Option.DrawUnprocessedPolygonEdgesContinuous +
+If you don't like the way unprocessed polygons display their edges (as dotted lines), +you can set this parameter to '1'. The edges of unprocessed polygons will then be +displayed as continuous lines, as was the case before version 5 (however, they will +not be highlighted). +
Option.LayerSequence +
+The internal layers are rendered in a sequence that mimics the actual layer +stack, so that the result looks useful even on printers and PDF or Postscript +files, where layers are not transparent. Sometimes user defined layers may need to +be rendered before internal layers instead of after them. This parameter can be +used to define the sequence in which layers are rendered. It consists of a string of +layer numbers or layer ranges, followed by an optional 't' or 'b'. + + + + + + + + +
123 renders layer 123
123trenders layer 123 if the output is "viewed from top" (not mirrored)
123brenders layer 123 if the output is "viewed from bottom" (mirrored)
123-140renders layers 123 through 140 in the given sequence
140-123renders layers 140 through 123 in the given sequence
*inserts the default sequence of the internal layers
123b * 123tmakes layer 123 always be rendered first
+
+Note that each layer is rendered only once, even if it is listed several times. +The default sequence of the internal layers is
+48t 49t 19t 47t 20t 46t 23 27 25 59 57 55 53 50 51 21 44t 45t 37 35 31 29 33 39 41 43t 18t 17t 1-16 17b 18b 43b 42 40 34 30 32 36 38 45b 44b 22 52 54 56 58 60 26 28 24 46b 20b 47b 19b 49b 48b 61-99.
+When viewed from top, the layer sequence is rendered from right to left, while +when viewed from bottom (mirrored) it is rendered from left to right. For instance, +layer 48 (Document) is entered as 48t and 48b to always have it rendered as the last one. +Layers 21 (tPlace) and 22 (bPlace), on the other hand, are listed only once, to have +them rendered at the proper place, depending on whether the output is mirrored or not.
+Any layers that are not explicitly mentioned in the layer sequence are rendered after +the given sequence in ascending order. +
Option.RatsnestLimit +
+The RATSNEST command processes all points of a signal, even if that +signal is very complex (in previous versions it dropped wire end points +from processing if the total number of connection points exceeded 254). +This requires more memory when calculating the ratsnest. In case this +is a problem on your system, you can revert to the original method +by setting this parameter to '254'. The value given +here is the number of connection points up to which all wire end points +will be taken into account and thus limits the amount of memory used +(processing will use up to the square of this value in bytes, so a value +of 1024 will limit the used memory to 1MB). A value of '0' means there is +no limit. A value of '1' will result in airwires being connected only to +pads, smds and vias. +
Option.RepositionMouseCursorAfterContextMenu +
+Normally EAGLE doesn't automatically position the mouse cursor. However, +some users want the cursor to be repositioned to the point where it has been +before a context menu in the drawing editor was opened. Set this parameter to +'1' to get this functionality. +
Option.ShowPartOrigins +
+The origins of parts in a schematic are indicated by small crosses. +Set this parameter to '0' to turn this off. +
Option.ShowTextOrigins +
+The origins of texts are indicated by small crosses. +Set this parameter to '0' to turn this off. +
Option.ToggleCtrlForGroupSelectionAndContextMenu +
+Since the context menu function on the right mouse button interferes +with the selection of groups as it was done before version 5, a group is +now selected with Ctrl plus right mouse button. If you want to have the old +method of selecting groups back, you can can set this parameter to '1'. +This will allow selecting groups with the right mouse button only and require +Ctrl plus right mouse button for context menus. +
Sch.Cmd.Add.AlwaysUseDeviceNameAsValue +
+Some users always want to use the device name as part value, even if the +part needs a user supplied value. Those who want this can set this +parameter to '1'. +
Warning.PartHasNoUserDefinableValue +
+If you don't want the warning message about a part not having a user +definable value, you can turn it off by setting this parameter to '0'. +
Warning.SupplyPinAutoOverwriteGeneratedNetName +
+Some users don't want the warning message about a supply pin overwriting +a generated net name. Setting this option to '1' disables that warning. +
+ + +
+

SHOW

+
+
+Function +
+Highlights objects. +
+Syntax +
+SHOW •..
+SHOW name..
+SHOW @ name.. +
+Mouse keys +
+Ctrl+Left toggles the show state of the selected object. +
+See also
INFO +

+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. +

Cross Probing

+With active Forward&Back Annotation an object +that is highlighted with the SHOW command in a board will also be +highlighted in the schematic, and vice versa. +

Different Objects

+If you select different objects with the SHOW command every single +object is highlighted separately. +You can select more than one object for highlighting by pressing the +Ctrl key when clicking on the objects. When you click on an object that +is already highlighted with the Ctrl key pressed, that object will +be displayed non-highlighted again. +

+If several names are entered in one line, all matching objects are +highlighted at the same time. +

Small Objects

+If the @ character is given in the command line, a pointer rectangle +is drawn around the shown object. This is helpful in locating small objects that +wouldn't show up too well just through highlighting. If more than one object is +shown, the rectangle is drawn around all the objects. It may be necessary to +zoom out (or do a WINDOW FIT command) in order to see the pointer. +If an object with the literal name @ shall be shown, the name must +be enclosed in single quotes. +

Wildcards

+If a name parameter is given, the characters '*', '?' +and '[]' are wildcards and have the following meaning: +

+ + + + +
* 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. +

Objects on different Sheets

+If an object given by name is not found on the current schematic sheet, a dialog +is presented containing a list of sheets on which the object is found. If the object +is not found on any sheet, the sheet number is '-' in this list. Note that this +dialog only appears if any of the objects given by name (or wildcards) is not found +on the current sheet. If all given objects are found on the current sheet, no dialog +appears (even if some of the objects are also present on other sheets). Once the +dialog appears, it contains all objects found, even those on the current sheet. +

Examples

+
+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". + + + +

SIGNAL

+
+
+Function +
+Defines signals. +
+Syntax +
+SIGNAL • •..
+SIGNAL signal_name • •..
+SIGNAL signal_name element_name pad_name..; +
+See also
AUTO, +ROUTE, +NAME, +CLASS, +WIRE, +RATSNEST, +EXPORT +

+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. +

Mouse Input

+To do that you select (with the mouse) the pads (or smds) of the elements +to be connected, step by step. EAGLE displays the part signals as airwires +in the Unrouted layer. +

+If input with signal_name the signal will be allocated the specified +name. +

Text Input

+Signals may also be defined completely by text input (via keyboard +or script file). The command +
+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. +

On-line Check

+If the SIGNAL command is used to connect pads (or smds) that already +belong to different signals, a popup menu will appear and ask the +user if he wants to connect the signals together, and which name the +signal should get. +

Outlines data

+The special signal name _OUTLINES_ gives a signal certain properties that +are used to generate outlines data. +This name should not be used otherwise. + + + +

SMASH

+
+
+Function +
+Separates text variables and attributes from parts or elements. +
+Syntax +
+SMASH •..
+SMASH name .. +
+Mouse keys +
+Ctrl+Right smashes the group.
+Shift+Left reverses the text separation ("unsmashes" the part).
+Ctrl+Shift+Right reverses the text separation for the group. +
+See also
NAME, +VALUE, +TEXT, +ATTRIBUTE +

+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

+
+
+Function +
+Adds smd pads to a package. +
+Syntax +
+SMD [x_width y_width] [-roundness] [orientation] [flags] ['name'] •.. +
+Mouse keys +
+Center selects the layer.
+Right rotates the smd.
+Shift+Right reverses the direction of rotating. +
+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. +

Roundness

+The roundness has to be entered as an integer number between +0 and 100, with a negative sign to distinguish it +from the width parameters. A value of 0 results in fully +rectangular smds, while a value of 100 makes the corners +of the smd fully round. The command +
+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. +

Names

+SMD names are generated automatically and may be modified with the +NAME command. Names may be included +in the SMD command if enclosed in single quotes. +

Flags

+The following flags can be used to control the appearance of an smd: +

+ + + + +
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. +

Single Smds

+Single smd pads in boards can only be used by defining +a package with one smd. +

Alter Package

+It is not possible to add or delete smds in packages which +are already used by a device, because this would change the pin/smd +allocation defined with the CONNECT command. + + + +

SPLIT

+
+
+Function +
+Splits wires and polygon edges into segments. +
+Syntax +
+SPLIT • [curve | @radius] •.. +
+Mouse keys +
+Right changes the wire bend style (see SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Right toggles between corresponding bend styles.
+Ctrl+Left when placing a wire end point defines arc radius. +
+Keyboard +
+F8: SPLIT activates the SPLIT command. +
+See also MITER, +MOVE, +OPTIMIZE, +SET +

+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. + + + +

TECHNOLOGY

+
+
+Function +
+Defines the possible technology parts of a device name. +
+Syntax +
+TECHNOLOGY name ..;
+TECHNOLOGY -name ..;
+TECHNOLOGY -* ..; +
+See also
PACKAGE, +ATTRIBUTE +

+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. +

Example

+In a device named "74*00" the command +
+TECHNOLOGY -* '' L LS S HCT;
+
+would first remove any existing technologies and then create the individual technology variants +
+7400
+74L00
+74LS00
+74S00
+74HCT00
+
+ + + +

TEXT

+
+
+Function +
+Adds text to a drawing. +
+Syntax +
+TEXT any_text orientation •..
+TEXT 'any_text' orientation •.. +
+Mouse keys +
+Center selects the layer.
+Right rotates the text.
+Shift+Right reverses the direction of rotating. +
+See also
CHANGE, +MOVE, +MIRROR, +PIN, +ROTATE, +ATTRIBUTE +

+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. +

Orientation

+The orientation of the text may be defined by the TEXT command (orientation) +using the usual definitions as listed in the ADD command (R0, R90 +etc.). The right mouse button will change the rotation of the text +and the center mouse button will change the current layer. +

+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. +

Special Characters

+If the text contains several successive blanks or a semicolon, the +whole string has to be enclosed in single quotes. If the text contains +single quotes then each one itself has to be enclosed in single quotes. +If apostrophes are required in the text, each must be enclosed +in single quotes. +

Key Words

+If the TEXT command is active and you want to type in a text that +contains a string that can be mistaken for a command (e.g. "red" +for "REDO") then this string has to be enclosed in single +quotes. +

Text Height

+The height of characters and the line width can be changed with the +CHANGE commands: +
+CHANGE SIZE text_size •..
+CHANGE RATIO ratio •..
+
+Maximum text height: 2 inches
+Maximum line width: 0.51602 inch (13.1 mm)
+Ratio: 0...31 (% of text height). +

Text Font

+Texts can have three different fonts: + + + + +
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. +

Character Sets

+Only the characters with ASCII codes below 128 are guaranteed to be printed correctly. +Any characters above this may be system dependent and may yield different results +with the various fonts. +

Text Variables

+Special texts in a symbol or package drawing, marked with the '>' +character, will be replaced with actual values in a board or schematic: +

+ + + + + + + + + + + + + +
>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. +

Attributes

+If a symbol or package drawing shall display an attribute +of the actual part or element, a text with the name of that attribute, marked with +the '>' character, can be used. By default, only the actual value of the +given attribute will be displayed. If the attribute name is followed by one of the +special characters '=', '~' or '!', the actual display +is as follows: +

+ + + + + +
>ABC 123
>ABC=ABC = 123
>ABC~ABC
>ABC!nothing
+

Overlined text

+Text can be overlined, which is useful for instance for the names of inverted +signals ("active low", see also +NET, BUS and PIN). +To do so, the text needs to be preceded with an exclamation mark ('!'), as in +
+  !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). + + + +

UNDO

+
+
+Function +
+Cancels previous commands. +
+Syntax +
+UNDO; +
+Keyboard +
+F9: UNDO execute the UNDO command. +Alt+BS: UNDO +
+See also
REDO, +SET, +Forward&Back Annotation +

+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. + + + +

UPDATE

+
+
+Function +
+Updates library objects. +
+Syntax +
+UPDATE
+UPDATE;
+UPDATE library_name..;
+UPDATE package_name@library_name..;
+UPDATE +@ | -@ [library_name..];
+UPDATE old_library_name = new_library_name; +
+See also
ADD, +REPLACE +

+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"). +

Update in a board or schematic

+If the command is terminated with a ';', but has no parameters, +all parts will be checked. +

+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! +

Update in a library

+The update in a library replaces all packages within that library with the versions +from the given libraries. +

+By specifying the package name (package_name@library_name) you can have only a +specific package be replaced. + + + +

USE

+
+
+Function +
+Marks a library for use. +
+Syntax +
+USE
+USE -*;
+USE library_name..; +
+See also
ADD, +REPLACE +

+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. +

Using Libraries via the Control Panel

+Libraries can be easily marked for use in the Control Panel +by clicking on their activation icon (which changes its color to indicate that this +library is being used), or by selecting "Use" from the library's context menu. +Through the context menu of the "Libraries" entry in the Control Panel it is also +possible to use all of the libraries or none of them. +

Used Libraries and Projects

+The libraries that are currently in use will be stored in the project file +(if a project is currently open). +

Examples

+ + + + + +
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
+ + + +

VALUE

+
+
+Function +
+Displays and changes values. +
+Syntax +
+VALUE •..
+VALUE value •..
+VALUE name value ..
+VALUE ON;
+VALUE OFF; +
+See also
NAME, +SMASH +

In Boards and Schematics

+Elements can be assigned a value, e.g. '1k' for a resistor or '10uF' +for a capacitor. This is done with the VALUE command. The +command selects an element and opens a popup menu that allows you +to enter or to change a value. +

+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. +

Example

+
+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. +

In Device Mode

+If the VALUE command is used in the device edit mode, the parameters +ON and OFF may be used: +

+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

+
+
+Function +
+Adds vias to a board. +
+Syntax +
+VIA ['signal_name'] [diameter] [shape] [layers] [flags] •.. +
+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. +

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 vias 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 via is placed in a way that it would connect +wires belonging to different signals. Please run a +Design Rule Check after using the VIA command +with the signal_name parameter! +

Via diameter

+Entering a number changes the diameter of the via (in the actual +unit) and the value remains in use for further vias. Via diameters +can be up to 0.51602 inch (13.1 mm). +

+The drill diameter of the via is the same as the diameter set for +pads. It can be changed with +

+CHANGE DRILL diameter •
+
+

Shape

+A via can have one of the following shapes: +

+ 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. +

Layers

+The layers parameter defines the layers this via shall +cover. The syntax is from-to, where 'from' and 'to' are the layer numbers +that shall be covered. For instance 2-7 would create a via that goes from +layer 2 to layer 7 (7-2 would have the same meaning). If that exact via is +not available in the layer setup of the Design Rules, the next longer via +will be used (or an error message will be issued in case no such via can be +set). +

Flags

+The following flags can be used to control the appearance of a via: +

+ + +
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. + + + +

WINDOW

+
+
+Function +
+Zooms in and out of a drawing. +
+Syntax +
+WINDOW;
+WINDOW •;
+WINDOW • •;
+WINDOW • • •
+WINDOW scale_factor
+WINDOW FIT
+WINDOW LAST +
+Mouse keys +
+Left&Drag defines a rectangular window (shortcut for "• •;"). +
+Keyboard +
+Alt+F2: WINDOW FIT Fit drawing on the screen
+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) +
+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. +

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. +

+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. +

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. +

+When zooming very far into a drawing, the following things may happen: +

+

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. +

+The syntax to handle these aliases is: +

+
+WINDOW = name parameters +
+Defines the alias with the given name to expand to the given +parameters. The name may consist of any number of letters, +digits and underlines, and is treated case insensitive. It must begin +with a letter or underline and may not be one of the option keywords. +
+WINDOW = name @ +
+Defines the alias with the given name to expand to the current +window selection. +
+WINDOW = ? +
+Asks the user to enter a name for defining an alias for the current +window settings. +
+WINDOW = name +
+Allows the user to select a window that will be defined as an alias +under the given name. +
+WINDOW = name; +
+Deletes the alias with the given name. +
+WINDOW name +
+Expands the alias with the given name and executes the WINDOW command with +the resulting set of parameters. The name may be abbreviated and +there may be other parameters before and after the alias (even other +aliases). Note that in case name is an abbreviation, aliases have precedence +over other parameter names of the command. +
+Example: +

+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. + + + +

WIRE

+
+
+Function +
+Adds wires (tracks) to a drawing. +
+Syntax +
+WIRE ['signal_name'] [width] • •..
+WIRE ['signal_name'] [width] [ROUND | FLAT] • [curve | @radius] •.. +
+Mouse keys +
+Center selects the layer.
+Right changes the wire bend style (see
SET Wire_Bend).
+Shift+Right reverses the direction of switching bend styles.
+Ctrl+Left when starting a wire snaps it to the next existing wire end point.
+Ctrl+Right toggles between corresponding bend styles.
+Ctrl+Left when placing a wire end point defines arc radius. +
+See also MITER, +SIGNAL, +ROUTE, +CHANGE, +NET, +BUS, +DELETE, +RIPUP, +ARC +

+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. +

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). +

+The wire width can be changed with the command +

+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. +

Signals in Top, Bottom, and Route Layers

+Wires (tracks) in the layers Top, Bottom, and ROUTE2...15 +are treated as signals. If you draw a wire in either of these layers +starting from an existing signal, then all of the segments of this wire +belong to that signal (only if the center of the wire is placed exactly onto +the center of the existing wire or pad). If you finish this drawing operation with a +wire segment connected to a different signal, then EAGLE will ask +you if you want to connect the two signals. +

+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. +

Drawing Arcs

+Wires and arcs are basically the same objects, so you can draw an arc either by +using the ARC command, or by adding the necessary parameters +to the WIRE command. To make a wire an arc it needs either the curve parameter, which +defines the "curvature" of the arc, or the @radius parameter, which defines +the radius of the arc (note the '@', which is necessary to be able to tell +apart curve and radius). +

+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. + + + +

WRITE

+
+
+Function +
+Saves the current drawing or library. +
+Syntax +
+WRITE;
+WRITE name
+WRITE @name +
+The WRITE command is used to save a drawing or library. If 'name' +is entered, EAGLE will save the file under the new name. +

+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: +

+ + + +

Generating Output

+
+ + + +

Printing

+The parameters for printing to the system printer can be modified through +the following three dialogs: +
+

+See also PRINT + + + +

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). +

From...to

+Only the given range of sheets will be printed. +

This

+Only the sheet that is currently being edited will be printed +(this is the default when using the PRINT command +from a schematic editor window). +

Printer...

+Invokes the system printer dialog, which enables you to choose which printer +to use and to set printer specific parameters. +

PDF...

+Creates a PDF (Portable Document Format) file with the given print settings. +

+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: +

Wrap long lines

+Enables wrapping lines that are too long to fit on the page width. +

Printer...

+Invokes the system printer dialog, which enables you to choose which printer +to use and to set printer specific parameters. +

PDF...

+Creates a PDF (Portable Document Format) file with the given print settings. +

+The remaining options are used for the page setup. + + + +

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. +

+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. +

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. +

+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. +

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. +

+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). + + + +

CAM Processor

+The CAM Processor allows you to output any combination of layers +to a device or file. +

+The following help topics lead you through the necessary steps from +selecting a data file to configuring the output device: +

+The CAM Processor allows you to combine several sets of parameter settings +to form a CAM Processor Job, which can be used to +produce a complete set of output files with a single click of a button. +

+See also printing to the system printer + + + +

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
+

Layer

+ + + + +
Deselect all deselect all layers
Show selected show only the selected layers
Show all show all layers
+

Window

+ + + + +
Control Panel switch to the Control Panel
1 Schematic - ... switch to window number 1
2 Board - ... switch to window number 2
+

Help

+ + + + + + +
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
+ + +
+

CAM Processor Job

+A CAM Processor Job consists of several Sections, +each of which defines a complete set of CAM Processor parameters +and layer selections. +

+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. +

Section

+The Section selector shows the currently active job section. +By pressing the button you can select any of the sections you have defined +previously with the Add button. +

Prompt

+If you enter a text in this field, the CAM Processor will prompt you with +this message before processing that particular job section. For example you +might want to change the paper in your pen plotter for each plot, so the +message could be "Please change paper!". Each job section can have its own +prompt message, and if there is no message the section will be processed +immediately. +

Add

+Click on the Add button to add a new section to the job. +You will be asked for the name of that new job section. The new job section +will be created with all parameters set to the values currently shown +in the menu.
+Please note that if you want to create a new job section, you should +first add that new section and then modify the +parameters. Otherwise, if you first modify the parameters of the current +section and then add a new section, you will be prompted to confirm whether +the modifications to the current section shall be saved or not. +

Del

+Use the Del button to delete the current job section. +You will be prompted to confirm whether you really want to delete that +section. +

Process Section

+The Process Section button processes the current job section, as +indicated in the Section selector. +

Process Job

+The Process Job button processes the entire job by processing +each section in turn, starting with the first section. What happens is +the same as if you would select every single section with the +Section selector and press the Process Section button for +each section - just a lot more convenient! + + +
+

Output Device

+The Output Device defines the kind of output the CAM Processor +is to produce. You can select from various device types, like photo plotters, +drill stations etc. +

Device

+Clicking on the button of the Device selector +opens a list of all available output devices. +

Scale

+On devices that can scale the output you can enter a scaling factor in +this field. Values larger than 1 will produce an enlarged output, +values smaller than 1 will shrink the output. +

+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. +

File

+You can either enter the name of the +
output file +directly into this field, or click on the +File button +to open a dialog for the definition of the output file.
+If you want to derive the output filename from the input data file, you +can enter a partial filename (at least an extension, e.g. .gbr), +in which case the rest of the filename will be taken from the input data +filename. +

Wheel

+You can either enter the name of the +aperture wheel file +directly into this field, or click on the Wheel button +to open a file dialog to select from.
+If you want to derive the output filename from the input data file, you +can enter a partial filename (at least an extension, e.g. .whl), +in which case the rest of the filename will be taken from the input data +filename. +

Rack

+You can either enter the name of the +drill rack file +directly into this field, or click on the Rack button +to open a file dialog to select from.
+If you want to derive the output filename from the input data file, you +can enter a partial filename (at least an extension, e.g. .drl), +in which case the rest of the filename will be taken from the input data +filename. +Some drill devices (like EXCELLON, for instance) can automatically generate the +necessary drill definitions, in which case this field is not present. + + + +

Device Parameters

+Depending on the type of
output device +you have selected, there are several device specific parameters that +allow you to adjust the output to your needs: + + + + +

Aperture Wheel File

+A photoplotter usually needs to know which apertures are +assigned to the codes used in the output file. These assignments +are defined in an Aperture Wheel File. +

Examples

+
+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. + + +
+

Aperture Emulation

+If the item "Apertures" is selected, apertures not available are +emulated with smaller apertures. If this item is not selected, +no aperture emulation will be done at all. +

+"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!). + + + +

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. +

+Tolerances are entered in percent. +

+Please be aware that your design rules might not be kept when allowing +tolerances! + + + +

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. +

+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. +

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. +

+Tolerances are entered in percent. + + + +

Offset

+Offset in x and y direction (inch, decimal number). +

+Can be used to position the origin of plotters at the lower left corner. + + + +

Printable Area

+

Height

+Printable area in Y direction (inch). +

Width

+Printable area in X direction (inch). +

+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. + + + +

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. +

+The plotter default speed is selected with the value 0. + + + +

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. +

+Please use a text editor which doesn't +place control characters into the file. + + + +

Output File

+The Output File contains the data produced by the CAM Processor. +

+The following file names are commonly used: +

+-------------------------------------------------------
+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). +

Drill data with blind&buried vias

+If the board contains blind or buried vias, the CAM +Processor generates a separate drill file for each via length that is +actually used in the board. The file names are built by adding the number +of the start and end layer to the base file name, as in +
+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. + + +
+

Flag Options

+

Mirror

+Mirror output. This option normally causes negative +coordinates, therefore it should be used only if "pos. Coord." is +selected, too. +

Rotate

+Rotate drawing by 90 degrees. This option normally causes +negative coordinates, therefore it should be used only if "pos. +Coord." is selected, too. +

Upside down

+Rotate the drawing by 180 degrees. Together with Rotate, the +drawing is rotated by a total of 270 degrees. This option normally causes +negative coordinates, therefore it should be used only if "pos. +Coord." is selected, too. +

pos. Coord

+Offsets the output so that negative coordinates are +eliminated and the drawing is referenced to the origin of the output device. +This is advisable for devices which generate error messages if +negative coordinates are detected. +

Quickplot

+Draft output which shows only the outlines of objects (subject to availability +on the selected output device). +

Optimize

+Activates the optimization of the drawing sequence for plotters. +

Fill pads

+Pads will be filled. This function can be properly executed only with +generic devices, like PostScript.
+If this option is not selected, the drill holes of pads will be visible +on the output. + + +
+

Layers and Colors

+Select the layer combination by clicking the check boxes in the +Layer list. +

+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.
+-------------------------------------------------------
+
+ + + +

Outlines data

+EAGLE can produce outlines data which can be used for milling prototype boards. +

+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. +

Preparing the board

+Outlines data is produced by defining a
POLYGON +in the layer for which the outlines shall be calculated. +This polygon must have the following properties: + +If a polygon with these properties is present in your board, the +RATSNEST command will calculate it in such +a way that its contours correspond to the lines that have to be drawn by +the milling tool to isolate the various signals from each other. +The fillings of the calculated polygon define what has to be milled out +if you want to completely remove all superfluous copper areas. +

Extracting the data

+The outlines data can be extracted from the board through a +User Language Program. The outlines.ulp +program that comes with EAGLE implements this entire process. If you want to +write your own ULP you can use outlines.ulp as a starting point. +See the help page for UL_POLYGON for details +about how to retrieve the outlines data from a polygon object. +

Milling tool diameter

+The diameter of the milling tool (and thus the Width of the polygon) must +be small enough to fit between any two different signals in order to be able to +isolate them from each other.
+Make sure you run a Design Rule Check (DRC) with +all Clearance values for different signals set to at least the diameter +of your milling tool! +

+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. +

Cleaning up

+Make sure that you always delete the _OUTLINES_ polygon after generating the +outlines data. Leaving this polygon in your drawing will cause short circuits +since this special polygon does not adhere to the Design Rules! + + + +

Autorouter

+The integrated Autorouter can be started from a board window with the +
AUTO command. +

+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. + + + +

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. +

+The DRC is performed in a board window, and checks the design for overlaps, +distance violations etc. + + + +

Design Rules

+Design Rules define all the parameters that the board layout has to follow. +

+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. +

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. +

+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. +

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). +

+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 +

+(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. +

+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. +

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. +

+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. +

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. +

Masks

+The Masks tab defines the dimensions of solder stop and cream masks. They are +given in percent of the smaller dimension of smds, pads and vias and can have an +absolute minimum and maximum value.
+Solder stop masks are generated for smds, pads and those vias that have a drill diameter +that exceeds the given Limit parameter.
+Cream masks are generated for smds only. +

Misc

+The Misc tab allows you to turn on a grid and angle check. +

+ + + +

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. +

+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. + + + +

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). +

+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. + + + +

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. +

+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. + + + +

User Language

+The EAGLE User Language can be used to access the EAGLE data structures +and to create a wide variety of output files. +

+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: +

+ + + + + + + + + + +
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
+ + + +

Writing a ULP

+A User Language Program is a plain text file which is written in a C-like +syntax. +User Language Programs use the extension .ulp. +You can create a ULP file with any text editor (provided it does +not insert any additional control characters into the file) or you can +use the builtin text editor. +

+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. + + + +

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. +

+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 +

+string s = "Hello World";
+
+where the blank character between 'o' and 'W' remains part +of the string. +

+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: +

+"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. +

+There are two ways to define a comment. The first one uses the syntax +

+/* 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. +

+The second way to define a comment uses the syntax +

+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. +

+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. +

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

+Over time it may happen that newer versions of EAGLE implement new or modified +User Language features, which can cause error messages when such a ULP is run +from an older version of EAGLE. In order to give the user a dedicated message +that this ULP requires at least a certain version of EAGLE, a ULP can contain +the #require directive. The syntax is +
+#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

+Every User Language Program should contain information about its function, how +to use it and maybe who wrote it.
+The directive +
+#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). +

Example

+
+#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"
+
+ + + +

Keywords

+The following keywords are reserved for special purposes +and must not be used as normal identifier names: +
+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

+An identifier is a name that is used to introduce a user defined +
constant, +variable or +function. +

+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. + + + + +

Character Constants

+A character constant consists of a single character or +an
escape sequence enclosed in +single quotes, like +
+'a'
+'='
+'\n'
+
+The type of a character constant is +char. + + + +

Integer Constants

+Depending on the first (and possibly the second) character, an +integer constant is assumed to be expressed in different +base values: +

+ + + + + +
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. +

Examples

+ + + + +
16 decimal
020 octal
0x10 hexadecimal
+ + + +

Real Constants

+A real constant follows the general pattern +
+[-]int.frac[e|E[±]exp]
+
+which stands for + +You can omit either the decimal integer or the decimal fraction +(but not both). You can omit either the decimal point or the +letter e or E and the signed integer exponent +(but not both). +

+The type of an real constant is +real. +

Examples

+ + + + + + + + + + +
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
+ + + +

String Constants

+A string constant consists of a sequence of characters or +
escape sequences enclosed in +double quotes, like +
+"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";
+
+ + + +

Escape Sequences

+An escape sequence consists of a backslash (\), followed +by one or more special characters: +

+ + + + + + + + + + + + + + +
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. +

Examples

+
+'\n'
+"A tab\tinside a text\n"
+"Ring the bell\a\n"
+
+ + + +

Punctuators

+The punctuators used in a User Language Program are +

+ + + + + + + + +
[] 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) { ... }
+
+ + + +

Braces

+Braces indicate the start and end of a compound statement: +
+if (d == z) {
+   ++x;
+   func();
+   }
+
+and are also used to group the values of an array initializer: +
+int ai[] = { 1, 2, 3 };
+
+ + +
+

Comma

+The comma separates the elements of a function argument list +or the parameters of a function call: +
+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;
+
+ + +
+

Semicolon

+The semicolon terminates a
statement, +as in +
+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);
+    }
+
+ + + +

Colon

+The colon indicates the end of a label in a +
switch statement: +
+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");
+  }
+
+ + + +

Equal Sign

+The equal sign separates variable definitions from initialization +lists: +
+int i = 10;
+char c[] = { 'a', 'b', 'c' };
+
+It is also used as an
assignment operator. + + + +

Data Types

+A User Language Program can define variables of different types, representing +the different kinds of information available in the EAGLE data structures. +

+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. + + + +

char

+The data type char is used to store single characters, like the +letters of the alphabet, or small unsigned numbers. +

+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 + + + +

int

+The data type int is used to store signed integral values, like the +coordinates of an object. +

+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 + + + +

real

+The data type real is used to store signed floating point values, like +the grid distance. +

+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 + + + +

string

+The data type string is used to store textual information, +like the name of a part or net. +

+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: +

+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! +

+See also Operators, +Builtin Functions, +String Constants +

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. +

+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 + + + +

Typecast

+The result type of an arithmetic expression +can be explicitly converted to a different arithmetic type by applying a +typecast to it. +

+The general syntax of a typecast is +

+type(expression)
+
+where type is one of +char, +int or +real, +and expression is any arithmetic +expression. +

+When typecasting a real expression to +int, the fractional part of the value +is truncated! +

+See also Type Conversions + + + +

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. +

+The properties of these objects can be accessed through members. +

+There are two kinds of members: +

+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. +

+Loop members are used to access multiple objects of the same +kind, which are contained in a higher level object: +

+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. +

+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 +

+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. +

+Object hierarchy of a Library: +

+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

+
+
+Data members +
+ + + + + + + + + + +
angle1 real (start angle, 0.0...359.9)
angle2 real (end angle, 0.0...719.9)
cap int (CAP_...)
layer int
radius int
width int
x1, y1 int (starting point)
x2, y2 int (end point)
xc, yc int (center point)
+
+See also
UL_WIRE +

Constants

+ + + +
CAP_FLAT flat arc ends
CAP_ROUND round arc ends
+

Note

+Start and end angles are defined mathematically positive (i.e. counterclockwise), +with angle1 < angle2. +In order to assure this condition, the start and end point of an UL_ARC may be exchanged +with respect to the UL_WIRE the arc has been derived from. +

Example

+
+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

+
+
+Data members +
+ + + +
x1, y1 int (lower left corner)
x2, y2 int (upper right corner)
+
+See also
UL_BOARD, +UL_DEVICE, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

+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. +

Example

+
+board(B) {
+  printf("Area: (%d %d), (%d %d)\n",
+          B.area.x1, B.area.y1, B.area.x2, B.area.y2);
+  }
+
+ + + +

UL_ATTRIBUTE

+
+
+Data members +
+ + + + + + + +
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
+
+See also
UL_DEVICE, +UL_PART, +UL_INSTANCE, +UL_ELEMENT +

Constants

+ + + + +
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. +

Note

+display contains a bitwise or'ed value consisting of ATTRIBUTE_DISPLAY_FLAG_... +and defines which parts of the attribute are actually drawn. +This value is only valid if display is used in a UL_INSTANCE or UL_ELEMENT +context. +

+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. +

Example

+
+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);
+    }
+  }
+
+ + + +

UL_BOARD

+
+
+Data members +
+ + + + +
area UL_AREA
grid UL_GRID
name string (see note)
+
+Loop members +
+ + + + + + + + + + + + + + +
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
+
+See also
UL_LIBRARY, +UL_SCHEMATIC +

Note

+The name member returns the full file name, including the directory. +

+The attributes() loop member loops through the global attributes. +

Example

+
+board(B) {
+  B.elements(E) printf("Element: %s\n", E.name);
+  B.signals(S)  printf("Signal: %s\n", S.name);
+  }
+
+ + + +

UL_BUS

+
+
+Data members +
+ + +
name string (BUS_NAME_LENGTH)
+
+Loop members +
+ + +
segments() UL_SEGMENT
+
+See also
UL_SHEET +

Constants

+ + +
BUS_NAME_LENGTH max. length of a bus name (obsolete - as from version 4 bus names can have any length)
+

Example

+
+schematic(SCH) {
+  SCH.sheets(SH) {
+    SH.busses(B) printf("Bus: %s\n", B.name);
+    }
+  }
+
+ + + +

UL_CIRCLE

+
+
+Data members +
+ + + + + +
layer int
radius int
width int
x, y int (center point)
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Example

+
+board(B) {
+  B.circles(C) {
+    printf("Circle: (%d %d), r=%d, w=%d\n",
+           C.x, C.y, C.radius, C.width);
+    }
+  }
+
+ + + +

UL_CLASS

+
+
+Data members +
+ + + + + + +
clearance[number]int (see note)
drill int
name string (see note)
number int
width int
+
+See also
Design Rules, +UL_NET, +UL_SIGNAL, +UL_SCHEMATIC, +UL_BOARD +

Note

+The clearance member returns the clearance value between this net class +and the net class with the given number. If the number (and the square brackets) is +ommitted, the net class's own clearance value is returned. If a number is given, +it must be between 0 and the number of this net class. +

+If the name member returns an empty string, the net class is not defined +and therefore not in use by any signal or net. +

Example

+
+board(B) {
+  B.signals(S) {
+    printf("%-10s %d %s\n", S.name, S.class.number, S.class.name);
+    }
+  }
+
+ + + +

UL_CONTACT

+
+
+Data members +
+ + + + + + +
name string (CONTACT_NAME_LENGTH)
pad UL_PAD
signal string
smd UL_SMD
x, y int (center point, see note)
+
+See also
UL_PACKAGE, +UL_PAD, +UL_SMD, +UL_CONTACTREF, +UL_PINREF +

Constants

+ + +
CONTACT_NAME_LENGTH max. recommended length of a contact name (used in formatted output only)
+

Note

+The signal data member returns the signal this contact is connected to +(only available in a board context). +

+The coordinates (x, y) of the contact depend on the context in which it is called: +

+

Example

+
+library(L) {
+  L.packages(PAC) {
+    PAC.contacts(C) {
+      printf("Contact: '%s', (%d %d)\n",
+             C.name, C.x, C.y);
+      }
+    }
+  }
+
+ + + +

UL_CONTACTREF

+
+
+Data members +
+ + + +
contact UL_CONTACT
element UL_ELEMENT
+
+See also
UL_SIGNAL, +UL_PINREF +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_DEVICE

+
+
+Data members +
+ + + + + + + + + + +
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")
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE (see note)
gates() UL_GATE
+
+See also
UL_DEVICESET, +UL_LIBRARY, +UL_PART +

Constants

+ + + +
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'). +

Note

+The package data member returns the package +that has been assigned to the device through a PACKAGE +command. It can be used as a boolean function to check whether a package has been +assigned to a device (see example below). +

+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). +

Examples

+
+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);
+            }
+          }
+      }
+    }
+  }
+
+ + + +

UL_DEVICESET

+
+
+Data members +
+ + + + + + + + +
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")
+
+Loop members +
+ + + +
devices() UL_DEVICE
gates() UL_GATE
+
+See also
UL_DEVICE, +UL_LIBRARY, +UL_PART +

Constants

+ + + +
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)
+

Note

+The description member returns the complete descriptive text as defined with +the DESCRIPTION command, while the headline +member returns only the first line of the description, without any HTML tags. +When using the description text keep in mind that it may contain newline characters ('\n'). +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_ELEMENT

+
+
+Data members +
+ + + + + + + + + + + + + +
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)
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE
texts() UL_TEXT (see note)
+
+See also
UL_BOARD, +UL_CONTACTREF +

Constants

+ + + +
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)
+

Note

+The attribute[] member can be used to query a UL_ELEMENT for the value of a given +attribute (see the second example below). The returned string is empty if there is no +attribute by the given name, or if this attribute is explicitly empty. +

+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. +

Examples

+
+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"));
+    }
+  }
+
+ + + +

UL_FRAME

+
+
+Data members +
+ + + + + + + +
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)
+
+Loop members +
+ + + +
texts() UL_TEXT
wires() UL_WIRE
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Constants

+ + + + + +
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
+

Note

+border contains a bitwise or'ed value consisting of FRAME_BORDER_... +and defines which of the four borders are actually drawn. +

+The texts() and wires() loop members loop through all the +texts and wires the frame consists of. +

Example

+
+board(B) {
+  B.frames(F) {
+    printf("Frame: (%d %d), (%d %d)\n",
+           F.x1, F.y1, F.x2, F.y2);
+    }
+  }
+
+ + + +

UL_GATE

+
+
+Data members +
+ + + + + + +
addlevel int (GATE_ADDLEVEL_...)
name string (GATE_NAME_LENGTH)
swaplevel int
symbol UL_SYMBOL
x, y int (origin point, see note)
+
+See also
UL_DEVICE +

Constants

+ + + + + + +
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)
+

Note

+The coordinates of the origin point (x, y) are always those of the gate's position within +the device, even if the UL_GATE has been derived from a UL_INSTANCE. +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_GRID

+
+
+Data members +
+ + + + + + + +
distance real
dots int (0=lines, 1=dots)
multiple int
on int (0=off, 1=on)
unit int (GRID_UNIT_...)
unitdist int (GRID_UNIT_...)
+
+See also
UL_BOARD, +UL_LIBRARY, +UL_SCHEMATIC, +Unit Conversions +

Constants

+ + + + + +
GRID_UNIT_MIC microns
GRID_UNIT_MM millimeter
GRID_UNIT_MIL mil
GRID_UNIT_INCH inch
+

Note

+unitdist returns the grid unit that was set to define the actual grid size +(returned by distance), while unit returns the grid unit that is +used to display values or interpret user input. +

Example

+
+board(B) {
+  printf("Gridsize=%f\n", B.grid.distance);
+  }
+
+ + + +

UL_HOLE

+
+
+Data members +
+ + + + + +
diameter[layer] int (see note)
drill int
drillsymbol int
x, y int (center point)
+
+See also
UL_BOARD, +UL_PACKAGE +

Note

+diameter[] is only defined vor layers LAYER_TSTOP and LAYER_BSTOP +and returns the diameter of the solder stop mask in the given layer. +

+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. +

Example

+
+board(B) {
+  B.holes(H) {
+    printf("Hole: (%d %d), drill=%d\n",
+           H.x, H.y, H.drill);
+    }
+  }
+
+ + + +

UL_INSTANCE

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+Loop members +
+ + + + +
attributes() UL_ATTRIBUTE (see note)
texts() UL_TEXT (see note)
xrefs() UL_GATE (see note)
+
+See also
UL_PART, +UL_PINREF +

Constants

+ + + +
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!)
+

Note

+The attributes() member only loops through those attributes that have been +explicitly assigned to this instance (including smashed attributes). +

+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). +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_JUNCTION

+
+
+Data members +
+ + + +
diameter int
x, y int (center point)
+
+See also
UL_SEGMENT +

Example

+
+schematic(SCH) {
+  SCH.sheets(SH) {
+    SH.nets(N) {
+      N.segments(SEG) {
+        SEG.junctions(J) {
+          printf("Junction: (%d %d)\n", J.x, J.y);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_LABEL

+
+
+Data members +
+ + + + + + + + +
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)
+
+Loop members +
+ + +
wires() UL_WIRE (see note)
+
+See also
UL_SEGMENT +

Note

+If xref returns a non-zero value, the wires() loop member loops through +the wires that form the flag of a cross-reference label. Otherwise it is an empty loop. +

+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. +

Example

+
+sheet(SH) {
+  SH.nets(N) {
+    N.segments(S) {
+      S.labels(L) {
+        printf("Label: %d %d '%s'\n", L.x, L.y, L.text.value);
+        }
+      }
+    }
+  }
+
+ + + +

UL_LAYER

+
+
+Data members +
+ + + + + + + +
color int
fill int
name string (LAYER_NAME_LENGTH)
number int
used int (0=unused, 1=used)
visible int (0=off, 1=on)
+
+See also
UL_BOARD, +UL_LIBRARY, +UL_SCHEMATIC +

Constants

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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)
+

Example

+
+board(B) {
+  B.layers(L) printf("Layer %3d %s\n", L.number, L.name);
+  }
+
+ + + +

UL_LIBRARY

+
+
+Data members +
+ + + + + +
description string (see note)
grid UL_GRID
headline string
name string (LIBRARY_NAME_LENGTH, see note)
+
+Loop members +
+ + + + + + +
devices() UL_DEVICE
devicesets() UL_DEVICESET
layers() UL_LAYER
packages() UL_PACKAGE
symbols() UL_SYMBOL
+
+See also
UL_BOARD, +UL_SCHEMATIC +

Constants

+ + +
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. +

Note

+The description member returns the complete descriptive text as defined with +the DESCRIPTION command, while the headline +member returns only the first line of the description, without any HTML tags. +When using the description text keep in mind that it may contain newline characters ('\n'). +The description and headline information is only available within a +library drawing, not if the library is derived form a UL_BOARD or UL_SCHEMATIC context. +

+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. +

Example

+
+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);
+  }
+
+ + + +

UL_NET

+
+
+Data members +
+ + + + + +
class UL_CLASS
column string (see note)
name string (NET_NAME_LENGTH)
row string (see note)
+
+Loop members +
+ + + +
pinrefs() UL_PINREF (see note)
segments() UL_SEGMENT (see note)
+
+See also
UL_SHEET, +UL_SCHEMATIC +

Constants

+ + +
NET_NAME_LENGTH max. recommended length of a net name (used in formatted output only)
+

Note

+The pinrefs() loop member can only be used if the net is in a +schematic context.
+The segments() loop member can only be used if the net is in a +sheet context. +

+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. +

Example

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_PACKAGE

+
+
+Data members +
+ + + + + + +
area UL_AREA
description string
headline string
library string
name string (PACKAGE_NAME_LENGTH)
+
+Loop members +
+ + + + + + + + + +
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
+
+See also
UL_DEVICE, +UL_ELEMENT, +UL_LIBRARY +

Constants

+ + +
PACKAGE_NAME_LENGTH max. recommended length of a package name (used in formatted output only)
+

Note

+The description member returns the complete descriptive text as defined with +the DESCRIPTION command, while the headline +member returns only the first line of the description, without any HTML tags. +When using the description text keep in mind that it may contain newline characters ('\n'). +

+If the UL_PACKAGE is derived from a UL_ELEMENT, the texts() member only loops through the +non-detached texts of that element. +

Example

+
+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);
+    }
+  }
+
+ + + +

UL_PAD

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+See also
UL_PACKAGE, +UL_CONTACT, +UL_SMD +

Constants

+ + + + +
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)
+

Note

+The parameters of the pad depend on the context in which it is accessed: + +

+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. +

Example

+
+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]);
+      }
+    }
+  }
+
+ + + +

UL_PART

+
+
+Data members +
+ + + + + + +
attribute[] string (see note)
device UL_DEVICE
deviceset UL_DEVICESET
name string (PART_NAME_LENGTH)
value string (PART_VALUE_LENGTH)
+
+Loop members +
+ + + +
attributes() UL_ATTRIBUTE (see note)
instances() UL_INSTANCE (see note)
+
+See also
UL_SCHEMATIC, +UL_SHEET +

Constants

+ + + +
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)
+

Note

+The attribute[] member can be used to query a UL_PART for the value of a given +attribute (see the second example below). The returned string is empty if there is no +attribute by the given name, or if this attribute is explicitly empty. +

+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. +

Example

+
+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"]);
+    }
+  }
+
+ + + +

UL_PIN

+
+
+Data members +
+ + + + + + + + + + + +
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)
+
+Loop members +
+ + + + +
circles() UL_CIRCLE
texts() UL_TEXT
wires() UL_WIRE
+
+See also
UL_SYMBOL, +UL_PINREF, +UL_CONTACTREF +

Constants

+ + + + + + + + + + +
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
+

Note

+The contact data member returns the contact +that has been assigned to the pin through a CONNECT +command. It can be used as a boolean function to check whether a contact has been +assigned to a pin (see example below). +

+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 name data member always returns the name of the pin as it was defined +in the library, with any '@' character for pins with the same name left intact +(see the PIN command for details).
+The texts loop member, on the other hand, returns the pin name (if it is +visible) in the same way as it is displayed in the current drawing type. +

+The net data member returns the name of the net to which this pin is connected +(only available in a schematic context). +

Example

+
+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);
+        }
+      }
+    }
+  }
+
+ + + +

UL_PINREF

+
+
+Data members +
+ + + + +
instance UL_INSTANCE
part UL_PART
pin UL_PIN
+
+See also
UL_SEGMENT, +UL_CONTACTREF +

Example

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_POLYGON

+
+
+Data members +
+ + + + + + + + + +
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
+
+Loop members +
+ + + + +
contours() UL_WIRE (see note)
fillings() UL_WIRE
wires() UL_WIRE
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SIGNAL, +UL_SYMBOL +

Constants

+ + + +
POLYGON_POUR_SOLID solid
POLYGON_POUR_HATCH hatch
+

Note

+The contours() and fillings() loop members loop through the +wires that are used to draw the calculated polygon if it is part of a signal and +the polygon has been calculated by the RATSNEST +command. The wires() loop member always loops through the polygon +wires as they were drawn by the user. For an uncalculated signal polygon +contours() does the same as wires(), and fillings() +does nothing. +

+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. +

Polygon width

+When using the fillings() loop member to get the fill wires of a solid +polygon, make sure the width of the polygon is not zero (actually it should +be quite a bit larger than zero, for example at least the hardware resolution of +the output device you are going to draw on). Filling a polygon with zero width +may result in enormous amounts of data, since it will be calculated with the +smallest editor resolution of 1/10000mm! +

Partial polygons

+A calculated signal polygon may consist of several distinct parts (called +positive polygons), each of which can contain extrusions (negative +polygons) resulting from other objects being subtracted from the polygon. +Negative polygons can again contain other positive polygons and so on. +

+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. +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_RECTANGLE

+
+
+Data members +
+ + + + + +
angle real (0.0...359.9)
layer int
x1, y1 int (lower left corner)
x2, y2 int (upper right corner)
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

+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. +

Example

+
+board(B) {
+  B.rectangles(R) {
+    printf("Rectangle: (%d %d), (%d %d)\n",
+           R.x1, R.y1, R.x2, R.y2);
+    }
+  }
+
+ + + +

UL_SCHEMATIC

+
+
+Data members +
+ + + + +
grid UL_GRID
name string (see note)
xreflabel string
+
+Loop members +
+ + + + + + + + +
attributes() UL_ATTRIBUTE (see note)
classes() UL_CLASS
layers() UL_LAYER
libraries() UL_LIBRARY
nets() UL_NET
parts() UL_PART
sheets() UL_SHEET
+
+See also
UL_BOARD, +UL_LIBRARY +

Note

+The name member returns the full file name, including the directory. +

+The xreflabel member returns the format string used to display +cross-reference labels. +

+The attributes() loop member loops through the global attributes. +

Example

+
+schematic(S) {
+  S.parts(P) printf("Part: %s\n", P.name);
+  }
+
+ + + +

UL_SEGMENT

+
+
+Loop members +
+ + + + + + +
junctions() UL_JUNCTION (see note)
labels() UL_LABEL
pinrefs() UL_PINREF (see note)
texts() UL_TEXT (deprecated, see note)
wires() UL_WIRE
+
+See also
UL_BUS, +UL_NET +

Note

+The junctions() and pinrefs() loop members are only available +for net segments. +

+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. +

Example

+
+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);
+          }
+        }
+      }
+    }
+  }
+
+ + + +

UL_SHEET

+
+
+Data members +
+ + + +
area UL_AREA
number int
+
+Loop members +
+ + + + + + + + + + +
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
+
+See also
UL_SCHEMATIC +

Example

+
+schematic(SCH) {
+  SCH.sheets(S) {
+    printf("Sheet: %d\n", S.number);
+    }
+  }
+
+ + + +

UL_SIGNAL

+
+
+Data members +
+ + + + +
airwireshiddenint
class UL_CLASS
name string (SIGNAL_NAME_LENGTH)
+
+Loop members +
+ + + + + +
contactrefs() UL_CONTACTREF
polygons() UL_POLYGON
vias() UL_VIA
wires() UL_WIRE
+
+See also
UL_BOARD +

Constants

+ + +
SIGNAL_NAME_LENGTH max. recommended length of a signal name (used in formatted output only)
+

Example

+
+board(B) {
+  B.signals(S) printf("Signal: %s\n", S.name);
+  }
+
+ + + +

UL_SMD

+
+
+Data members +
+ + + + + + + + + +
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)
+
+See also
UL_PACKAGE, +UL_CONTACT, +UL_PAD +

Constants

+ + + + +
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)
+

Note

+The parameters of the smd depend on the context in which it is accessed: + +If the dx and dy data members are called with an optional layer index, +the data for that layer is returned according to the Design Rules. +Valid layers are LAYER_TOP, LAYER_TSTOP and LAYER_TCREAM for a via in the Top layer, and +LAYER_BOTTOM, LAYER_BSTOP and LAYER_BCREAM for a via in the Bottom layer, respectively. +

+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. +

Example

+
+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);
+      }
+    }
+  }
+
+ + + +

UL_SYMBOL

+
+
+Data members +
+ + + + +
area UL_AREA
library string
name string (SYMBOL_NAME_LENGTH)
+
+Loop members +
+ + + + + + + + +
circles() UL_CIRCLE
frames() UL_FRAME
rectangles() UL_RECTANGLE
pins() UL_PIN
polygons() UL_POLYGON
texts() UL_TEXT (see note)
wires() UL_WIRE
+
+See also
UL_GATE, +UL_LIBRARY +

Constants

+ + +
SYMBOL_NAME_LENGTH max. recommended length of a symbol name (used in formatted output only)
+

Note

+If the UL_SYMBOL is derived from a UL_INSTANCE, the texts() member only loops through the +non-detached texts of that instance. +

Example

+
+library(L) {
+  L.symbols(S) printf("Sym: %s\n", S.name);
+  }
+
+ + + +

UL_TEXT

+
+
+Data members +
+ + + + + + + + + + +
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)
+
+Loop members +
+ + +
wires() UL_WIRE (see note)
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SHEET, +UL_SYMBOL +

Constants

+ + + + +
FONT_VECTOR vector font
FONT_PROPORTIONAL proportional font
FONT_FIXED fixed font
+

Note

+The wires() loop member always accesses the individual wires the text +is composed of when using the vector font, even if the actual font is not +FONT_VECTOR. +

+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. +

Example

+
+board(B) {
+  B.texts(T) {
+    printf("Text: %s\n", T.value);
+    }
+  }
+
+ + + +

UL_VIA

+
+
+Data members +
+ + + + + + + + + +
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)
+
+See also
UL_SIGNAL +

Constants

+ + +
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

+The diameter and shape of the via 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_VIAS is given, the raw value as defined in the via will +be returned. +

+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. +

Example

+
+board(B) {
+  B.signals(S) {
+    S.vias(V) {
+      printf("Via: (%d %d)\n", V.x, V.y);
+      }
+    }
+  }
+
+ + + +

UL_WIRE

+
+
+Data members +
+ + + + + + + + + +
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)
+
+Loop members +
+ + +
pieces() UL_WIRE (see note)
+
+See also
UL_BOARD, +UL_PACKAGE, +UL_SEGMENT, +UL_SHEET, +UL_SIGNAL, +UL_SYMBOL, +UL_ARC +

Constants

+ + + + + + + +
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
+

Wire Style

+A UL_WIRE that has a style other than WIRE_STYLE_CONTINUOUS can use the +pieces() loop member to access the individual segments that constitute +for example a dashed wire. If pieces() is called for a UL_WIRE with +WIRE_STYLE_CONTINUOUS, a single segment will be accessible which is just +the same as the original UL_WIRE. The pieces() loop member can't be called +from a UL_WIRE that itself has been returned by a call to pieces() (this would +cause an infinite recursion). +

Arcs at Wire level

+Arcs are basically wires, with a few additional properties. At the first level +arcs are treated exactly the same as wires, meaning they have a start and an end point, +a width, layer and wire style. In addition to these an arc, at the wire level, has +a cap and a curve parameter. cap defines whether the arc endings +are round or flat, and curve defines the "curvature" of the arc. 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. +

+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. +

Example

+
+board(B) {
+  B.wires(W) {
+    printf("Wire: (%d %d) (%d %d)\n",
+           W.x1, W.y1, W.x2, W.y2);
+    }
+  }
+
+ + + +

Definitions

+The data items to be used in a User Language Program must be defined +before they can be used. +

+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. + + + +

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. +

+Constants may also be initialized to specific values, like +

+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". +

Examples

+ + + + + + + +
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
+The members of array elements of object types can't be accessed directly: +
+UL_SIGNAL signals[];
+...
+UL_SIGNAL s = signals[0];
+printf("%s", s.name);
+
+ + + +

Function Definitions

+You can write your own User Language functions and call them just like the +
Builtin Functions. +

+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. +

The special function main()

+If your User Language Program contains a function called +main(), that function will be explicitly called as the +main function, and it's return value will be the +return value of the program. +

+Command line arguments are available to the program through the global +Builtin Variables argc and argv. +

Example

+
+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));
+  }
+
+ + + +

Operators

+The following table lists all of the User Language operators, in order +of their precedence (Unary having the highest precedence, +Comma the lowest): +

+ + + + + + + + + + + + + + + +
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
+ + + +

Logical Operators

+Logical operators work with expressions +of any data type. +

+ + + + + + +
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
+ + + +

Evaluation Operators

+Evaluation operators are used to evaluate expressions +based on a condition, or to group a sequence of expressions and have them +evaluated as one expression. +

+ + + +
?: 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. +

Examples

+
+a + b
+c++
+m << 1
+
+ + + +

Assignment Expression

+An assignment expression consists of a variable on the left +side of an
assignment operator, and an +expression on the right side. +

Examples

+
+a = x + 42
+b += c
+s = "Hello"
+
+ + + +

String Expression

+A string expression is any combination of +
string and char +operands and a string operator. +

Examples

+
+s + ".brd"
+t + 'x'
+
+ + + +

Comma Expression

+A comma expression is a sequence of expressions, delimited by +the
comma operator +

+Comma expressions are evaluated left to right, and the result of a comma +expression is the type and value of the rightmost expression. +

Example

+
+i++, j++, k++
+
+ + + +

Conditional Expression

+A conditional expression uses the +
conditional operator to make a decision +within an expression. +

Example

+
+int a;
+// ...code that calculates 'a'
+string s = a ? "True" : "False";
+
+ + + +

Function Call

+A function call transfers the program flow to a +
user defined function or a +builtin function. +The formal parameters defined in the +function definition are replaced +with the values of the expressions used as the actual arguments of the +function call. +

Example

+
+int p = strchr(s, 'b');
+
+ + + +

Statements

+A statement can be one of the following: +
+Statements specify the flow of control as a User Language Program +executes. In absence of specific control statements, statements are +executed sequentially in the order of appearance in the ULP file. + + + +

Compound Statement

+A compound statement (also known as block) is a list +(possibly empty) of statements enclosed in matching braces ({}). +Syntactically, a block can be considered to be a single statement, but it +also controls the scoping of identifiers. An +
identifier declared within a block has a +scope starting at the point of declaration and ending at the closing +brace. +

+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. + + + +

Control Statements

+Control statements are used to control the program flow. +

+Iteration statements are +

+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. + + + +

do...while

+The do...while statement has the general syntax +
+do statement while (condition);
+
+and executes the statement until the condition +expression becomes zero. +

+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. +

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: +
    +
  1. If an initializing expression init is present, it is executed. +
  2. If a test expression is present, it is executed. If the result +is nonzero (or if there is no test expression at all), the +statement is executed. +
  3. If an inc expression is present, it is executed. +
  4. Finally control returns to step 2. +
+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. +

+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. +

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. +

+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 +

+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. + + + +

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). +

+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. +

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. +

+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. +

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. +

+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: +

+ + + + + + + + + + + +
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[]
+ + + +

Builtin Variables

+Builtin variables are used to provide information at runtime. +

+ + + +
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)
+ + +
+

Builtin Functions

+Builtin functions are used to perform specific tasks, like +printing formatted strings, sorting data arrays or the like. +

+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: +

+Alphabetical reference of all builtin functions: + + + + +

Character Functions

+Character functions are used to manipulate single characters. +

+The following character functions are available: +

+ + + +

is...()

+
+
+Function +
+Check whether a character falls into a given category. +
+Syntax +
+int isalnum(char c);
+int isalpha(char c);
+int iscntrl(char c);
+int isdigit(char c);
+int isgraph(char c);
+int islower(char c);
+int isprint(char c);
+int ispunct(char c);
+int isspace(char c);
+int isupper(char c);
+int isxdigit(char c); +
+Returns +
+The is... functions return nonzero if the given character falls +into the category, zero otherwise. +
+

Character categories

+ + + + + + + + + + + + +
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)
+

Example

+
+char c = 'A';
+if (isxdigit(c))
+   printf("%c is hex\n", c);
+else
+   printf("%c is not hex\n", c);
+
+ + +
+

to...()

+
+
+Function +
+Convert a character to upper- or lowercase. +
+Syntax +
+char tolower(char c);
+char toupper(char c); +
+Returns +
+The tolower function returns the converted character if c +is uppercase. All other characters are returned unchanged.
+The toupper function returns the converted character if c +is lowercase. All other characters are returned unchanged. +
+See also
strupr, +strlwr + + + +

File Handling Functions

+Filename handling functions are used to work with file names, +sizes and timestamps. +

+The following file handling functions are available: +

+See output() for information about how to write into a file. + + + +

fileerror()

+
+
+Function +
+Returns the status of I/O operations. +
+Syntax +
+int fileerror(); +
+Returns +
+The fileerror function returns 0 if everything is ok. +
+See also
output, +printf, +fileread +

+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. +

Example

+
+fileerror();
+output("file.txt", "wt") {
+  printf("Test\n");
+  }
+if (fileerror())
+   exit(1);
+
+ + + +

fileglob()

+
+
+Function +
+Perform a directory search. +
+Syntax +
+int fileglob(string &array[], string pattern); +
+Returns +
+The fileglob function returns the number of entries copied into array. +
+See also
dlgFileOpen(), +dlgFileSave() +

+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. +

Note for Windows users

+
+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. +

+

Example

+
+string a[];
+int n = fileglob(a, "*.brd");
+
+ + + +

Filename Functions

+
+
+Function +
+Split a filename into its separate parts. +
+Syntax +
+string filedir(string file);
+string fileext(string file);
+string filename(string file);
+string filesetext(string file, string newext); +
+Returns +
+filedir returns the directory of file (including the drive letter under Windows).
+fileext returns the extension of file.
+filename returns the file name of file (including the extension).
+filesetext returns file with the extension set to newext. +
+See also
Filedata Functions +

Example

+
+if (board) board(B) {
+  output(filesetext(B.name, ".out")) {
+    ...
+    }
+  }
+
+ + + +

Filedata Functions

+
+
+Function +
+Gets the timestamp and size of a file. +
+Syntax +
+int filesize(string filename);
+int filetime(string filename); +
+Returns +
+filesize returns the size (in byte) of the given file.
+filetime returns the timestamp of the given file in a format to be used with the
time functions. +
+See also time, +Filename Functions +

Example

+
+board(B)
+  printf("Board: %s\nSize: %d\nTime: %s\n",
+         B.name, filesize(B.name),
+         t2string(filetime(B.name)));
+
+ + + +

File Input Functions

+File input functions are used to read data from files. +

+The following file input is available: +

+See output() for information about how to write into a file. + + + +

fileread()

+
+
+Function +
+Reads data from a file. +
+Syntax +
+int fileread(dest, string file); +
+Returns +
+fileread returns the number of objects read from the file.
+The actual meaning of the return value depends on the type of dest. +
+See also
lookup, +strsplit, +fileerror +

+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). +

Example

+
+char b[];
+int nBytes = fileread(b, "data.bin");
+string lines[];
+int nLines = fileread(lines, "data.txt");
+string text;
+int nChars = fileread(text, "data.txt");
+
+ + + +

Mathematical Functions

+Mathematical functions are used to perform mathematical +operations. +

+The following mathematical functions are available: +

+

Error Messages

+If the arguments of a mathematical function call lead to an error, the +error message will show the actual values of the arguments. Thus the +statements +
+real x = -1.0;
+real r = sqrt(2 * x);
+
+will lead to the error message +
+Invalid argument in call to 'sqrt(-2)'
+
+ + + +

Absolute, Maximum and Minimum Functions

+
+
+Function +
+Absolute, maximum and minimum functions. +
+Syntax +
+type abs(type x);
+type max(type x, type y);
+type min(type x, type y); +
+Returns +
+abs returns the absolute value of x.
+max returns the maximum of x and y.
+min returns the minimum of x and y. +

+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. +

+

Example

+
+real x = 2.567, y = 3.14;
+printf("The maximum is %f\n", max(x, y));
+
+ + + +

Rounding Functions

+
+
+Function +
+Rounding functions. +
+Syntax +
+real ceil(real x);
+real floor(real x);
+real frac(real x);
+real round(real x);
+real trunc(real x); +
+Returns +
+ceil returns the smallest integer not less than x.
+floor returns the largest integer not greater than x.
+frac returns the fractional part of x.
+round returns x rounded to the nearest integer.
+trunc returns the integer part of x. +
+

Example

+
+real x = 2.567;
+printf("The rounded value of %f is %f\n", x, round(x));
+
+ + +
+

Trigonometric Functions

+
+
+Function +
+Trigonometric functions. +
+Syntax +
+real acos(real x);
+real asin(real x);
+real atan(real x);
+real cos(real x);
+real sin(real x);
+real tan(real x); +
+Returns +
+acos returns the arc cosine of x.
+asin returns the arc sine of x.
+atan returns the arc tangent of x.
+cos returns the cosine of x.
+sin returns the sine of x.
+tan returns the tangent of x. +
+

Constants

+ + +
PI the value of "pi" (3.14...)
+

Example

+
+real x = PI / 2;
+printf("The sine of %f is %f\n", x, sin(x));
+
+ + +
+

Exponential Functions

+
+
+Function +
+Exponential Functions. +
+Syntax +
+real exp(real x);
+real log(real x);
+real log10(real x);
+real pow(real x, real y);
+real sqrt(real x); +
+Returns +
+exp returns the exponential e to the power of x.
+log returns the natural logarithm of x.
+log10 returns the base 10 logarithm of x.
+pow returns the value of x to the power of y.
+sqrt returns the square root of x. +
+

Note

+The "n-th" root can be calculated using the pow function with a +negative exponent. +

Example

+
+real x = 2.1;
+printf("The square root of %f is %f\n", x, sqrt(x));
+
+ + +
+

Miscellaneous Functions

+Miscellaneous functions are used to perform various tasks. +

+The following miscellaneous functions are available: +

+ + + +

exit()

+
+
+Function +
+Exits from a User Language Program. +
+Syntax +
+void exit(int result);
+void exit(string command); +
+See also
RUN +

+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. +

Constants

+ + + +
EXIT_SUCCESS return value for successful program execution (value 0)
EXIT_FAILURE return value for failed program execution (value -1)
+

+ + + +

language()

+
+
+Function +
+Returns the language code of the system in use. +
+Syntax +
+string language(); +
+Returns +
+language returns a string consisting of two lowercase characters +that identifies the language used on the current system. +If no such language setting can be determined, an empty string will +be returned. +
+The language function can be used to make a ULP use different +message string, depending on which language the current system is using. +

+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. +

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()

+
+
+Function +
+Looks up data in a string array. +
+Syntax +
+string lookup(string array[], string key, int field_index[, char separator]);
+string lookup(string array[], string key, string field_name[, char separator]); +
+Returns +
+lookup returns the value of the field identified by field_index +or field_name.
+If the field doesn't exist, or no string matching key is found, +an empty string is returned. +
+See also
fileread, +strsplit +

+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
+
+

Example

+
+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');
+   }
+
+ + + +

palette()

+
+
+Function +
+Returns color palette information. +
+Syntax +
+int palette(int index[, int type]); +
+Returns +
+The palette function returns an integer ARGB value in the form 0xaarrggbb, +or the type of the currently used palette (depending on the value of index). +
+The palette function returns the ARGB value of the color with the given +index (which may be in the range 0..PALETTE_ENTRIES-1). If type is not +given (or is -1) the palette assigned to the current editor window will +be used. Otherwise type specifies which color palette to use (PALETTE_BLACK, +PALETTE_WHITE or PALETTE_COLORED). +

+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. +

Constants

+ + + + + + +
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)
+ + +
+

sort()

+
+
+Function +
+Sorts an array or a set of arrays. +
+Syntax +
+void sort(int number, array1[, array2,...]); +
+The sort function either directly sorts a given array1, +or it sorts a set of arrays (starting with array2), in which case +array1 is supposed to be an array of int, which will +be used as a pointer array. +

+In any case, the number argument defines the number of items in the +array(s). +

Sorting a single array

+If the sort function is called with one single array, that array +will be sorted directly, as in the following example: +
+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]);
+
+

Sorting a set of arrays

+If the sort function is called with more than one array, the first +array must be an array of int, while all of the other arrays may be +of any array type and hold the data to be sorted. The following example +illustrates how the first array will be used as a pointer: +
+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()

+
+
+Function +
+Displays a status message in the status bar. +
+Syntax +
+void status(string message);
+
+See also
dlgMessageBox() +

+The status function displays the given message in the status bar of the +editor window in which the ULP is running. + + + + +

system()

+
+
+Function +
+Executes an external program. +
+Syntax +
+int system(string command); +
+Returns +
+The system function returns the exit status of the command. This is +typically 0 if everything was ok, and non-zero in case of an error. +
+The system function executes the external program given by the command +string, and waits until the program ends. +

+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. +

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). +
+

Background execution

+The system function waits until the given program has ended. +This is useful for programs that only run for a few seconds, or completely +take over the user's attention. +

+

+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). +
+

Example

+
+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! + + +
+

Unit Conversions

+
+
+Function +
+Converts internal units. +
+Syntax +
+real u2inch(int n);
+real u2mic(int n);
+real u2mil(int n);
+real u2mm(int n); +
+Returns +
+u2inch returns the value of n in inch.
+u2mic returns the value of n in microns (1/1000mm).
+u2mil returns the value of n in mil (1/1000inch).
+u2mm returns the value of n in millimeters. +
+See also
UL_GRID +

+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. +

Example

+
+board(B) {
+  B.elements(E) {
+    printf("%s at (%f, %f)\n", E.name,
+           u2mm(E.x), u2mm(E.y));
+    }
+  }
+
+ + + +

Printing Functions

+Printing functions are used to print formatted strings. +

+The following printing functions are available: +

+ + + +

printf()

+
+
+Function +
+Writes formatted output to a file. +
+Syntax +
+int printf(string format[, argument, ...]); +
+Returns +
+The printf function returns the number of characters written +to the file that has been opened by the most recent output +statement. +

+In case of an error, printf returns -1. +

+See also sprintf, +output, +fileerror +

Format string

+The format string controls how the arguments will be converted, +formatted and printed. There must be exactly as many arguments +as necessary for the format. The number and type of arguments +will be checked against the format, and any mismatch will lead +to an error message. +

+The format string contains two types of objects - plain characters +and format specifiers: +

+

Format specifiers

+A format specifier has the following form: +

+% [flags] [width] [.prec] type +

+Each format specification begins with the percent character (%). +After the % comes the following, in this order: +

+

Conversion type characters

+ + + + + + + + + + + + + + +
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
+

Flag characters

+The following flag characters can appear in any order and combination. +

+ + + + +
"-" 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 specifiers

+The width specifier sets the minimum field width for an output value. +

+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.
+

Precision specifiers

+A precision specifier always begins with a period (.) to +separate it from any preceding width specifier. Then, like width, +precision is specified either directly through a decimal digit string, or +indirectly, through an asterisk (*). If you use an asterisk for the +precision specifier, the next argument in the call (which must be an int) +specifies the precision. +

+ + + + + +
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.
+

Default precision values

+ + + + + + +
douxX 1
eEf 6
gG all significant digits
c no effect
s print entire string
+

How precision specification (.n) affects conversion

+ + + + + + +
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.
+

Binary zero characters

+Unlike sprintf, the printf function can print binary zero characters (0x00). +
+char c = 0x00;
+printf("%c", c);
+
+

Example

+
+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);
+
+ + + +

sprintf()

+
+
+Function +
+Writes formatted output into a string. +
+Syntax +
+int sprintf(string result, string format[, argument, ...]); +
+Returns +
+The sprintf function returns the number of characters written +into the result string. +

+In case of an error, sprintf returns -1. +

+See also
printf +

Format string

+See printf. +

Binary zero characters

+Note that sprintf can not return strings with embedded binary zero +characters (0x00). If the resulting string contains a binary zero character, +any characters following that zero character will be dropped. +Use printf if you need to output binary data. +

Example

+
+string result;
+int number = 42;
+sprintf(result, "The number is %d", number);
+
+ + + +

String Functions

+String functions are used to manipulate character strings. +

+The following string functions are available: +

+ + + +

strchr()

+
+
+Function +
+Scans a string for the first occurrence of a given character. +
+Syntax +
+int strchr(string s, char c[, int index]); +
+Returns +
+The strchr function returns the integer offset of the +character in the string, or -1 if the character does not +occur in the string. +
+See also
strrchr, +strstr +

+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +

Example

+
+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()

+
+
+Function +
+Joins a string array to form a single string. +
+Syntax +
+string strjoin(string array[], char separator); +
+Returns +
+The strjoin function returns the combined entries of array. +
+See also
strsplit, +lookup, +fileread +

+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. +

Example

+
+string a[] = { "Field 1", "Field 2", "Field 3" };
+string s = strjoin(a, ':');
+
+ + + +

strlen()

+
+
+Function +
+Calculates the length of a string. +
+Syntax +
+int strlen(string s); +
+Returns +
+The strlen function returns the number of characters in +the string. +
+

Example

+
+string s = "This is a string";
+int l = strlen(s);
+printf("The string is %d characters long\n", l);
+
+ + +
+

strlwr()

+
+
+Function +
+Converts uppercase letters in a string to lowercase. +
+Syntax +
+string strlwr(string s); +
+Returns +
+The strlwr function returns the modified string. +The original string (given as parameter) is not changed. +
+See also
strupr, +tolower +

Example

+
+string s = "This Is A String";
+string r = strlwr(s);
+printf("Prior to strlwr: %s - after strlwr: %s\n", s, r);
+
+ + + +

strrchr()

+
+
+Function +
+Scans a string for the last occurrence of a given character. +
+Syntax +
+int strrchr(string s, char c[, int index]); +
+Returns +
+The strrchr function returns the integer offset of the +character in the string, or -1 if the character does not +occur in the string. +
+See also
strchr, +strrstr +

+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +

Example

+
+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");
+
+ + + +

strrstr()

+
+
+Function +
+Scans a string for the last occurrence of a given substring. +
+Syntax +
+int strrstr(string s1, string s2[, int index]); +
+Returns +
+The strrstr function returns the integer offset of the +first character of s2 in s1, or -1 if the substring does not +occur in the string. +
+See also
strstr, +strrchr +

+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +

Example

+
+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()

+
+
+Function +
+Splits a string into separate fields. +
+Syntax +
+int strsplit(string &array[], string s, char separator); +
+Returns +
+The strsplit function returns the number of entries copied into array. +
+See also
strjoin, +lookup, +fileread +

+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. +

Example

+
+string a[];
+int n = strsplit(a, "Field 1:Field 2:Field 3", ':');
+
+ + + +

strstr()

+
+
+Function +
+Scans a string for the first occurrence of a given substring. +
+Syntax +
+int strstr(string s1, string s2[, int index]); +
+Returns +
+The strstr function returns the integer offset of the +first character of s2 in s1, or -1 if the substring does not +occur in the string. +
+See also
strrstr, +strchr, +strxstr +

+If index is given, the search starts at that position. +Negative values are counted from the end of the string. +

Example

+
+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");
+
+ + + +

strsub()

+
+
+Function +
+Extracts a substring from a string. +
+Syntax +
+string strsub(string s, int start[, int length]); +
+Returns +
+The strsub function returns the substring indicated by +the start and length value. +

+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. +

+

Example

+
+string s = "This is a string";
+string t = strsub(s, 4, 7);
+printf("The extracted substring is: %s\n", t);
+
+ + +
+

strtod()

+
+
+Function +
+Converts a string to a real value. +
+Syntax +
+real strtod(string s); +
+Returns +
+The strtod function returns the numerical representation +of the given string as a real value. Conversion ends at the +first character that does not fit into the format of a +real constant. +If an error occurs during conversion of the string 0.0 +will be returned. +
+See also strtol +

Example

+
+string s = "3.1415";
+real r = strtod(s);
+printf("The value is %f\n", r);
+
+ + + +

strtol()

+
+
+Function +
+Converts a string to an integer value. +
+Syntax +
+int strtol(string s); +
+Returns +
+The strtol function returns the numerical representation +of the given string as an int value. Conversion ends at the +first character that does not fit into the format of an +integer constant. +If an error occurs during conversion of the string 0 +will be returned. +
+See also strtod +

Example

+
+string s = "1234";
+int i = strtol(s);
+printf("The value is %d\n", i);
+
+ + + +

strupr()

+
+
+Function +
+Converts lowercase letters in a string to uppercase. +
+Syntax +
+string strupr(string s); +
+Returns +
+The strupr function returns the modified string. +The original string (given as parameter) is not changed. +
+See also
strlwr, +toupper +

Example

+
+string s = "This Is A String";
+string r = strupr(s);
+printf("Prior to strupr: %s - after strupr: %s\n", s, r);
+
+ + + +

strxstr()

+
+
+Function +
+Scans a string for the first occurrence of a given regular expression. +
+Syntax +
+int strxstr(string s1, string s2[, int index[, int &length]]); +
+Returns +
+The strxstr function returns the integer offset of the substring +in s1 that matches the regular expression in s2, or -1 if +the regular expression does not match in the string. +
+See also
strstr, +strchr, +strrstr +

+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. +

Example

+
+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");
+
+ + + +

Time Functions

+Time functions are used to get and process time and date +information. +

+The following time functions are available: +

+ + + +

time()

+
+
+Function +
+Gets the current system time. +
+Syntax +
+int time(void); +
+Returns +
+The time function returns the current system time as the number +of seconds elapsed since a system dependent reference date. +
+See also
Time Conversions, +filetime, +timems() +

Example

+
+int CurrentTime = time();
+
+ + + +

timems()

+
+
+Function +
+Gets the number of milliseconds since the start of the ULP. +
+Syntax +
+int timems(void); +
+Returns +
+The timems function returns the number of milliseconds since the +start of the ULP. +

+After 86400000 milliseconds (i.e. every 24 hours), the value starts at 0 again. +

+See also
time +

Example

+
+int elapsed = timems();
+
+ + + +

Time Conversions

+
+
+Function +
+Convert a time value to day, month, year etc. +
+Syntax +
+int t2day(int t);
+int t2dayofweek(int t);
+int t2hour(int t);
+int t2minute(int t);
+int t2month(int t);
+int t2second(int t);
+int t2year(int t);
+
+string t2string(int t); +
+Returns +
+t2day returns the day of the month (1..31)
+t2dayofweek returns the day of the week (0=sunday..6)
+t2hour returns the hour (0..23)
+t2minute returns the minute (0..59)
+t2month returns the month (0..11)
+t2second returns the second (0..59)
+t2year returns the year (including century!)
+t2string returns a formatted string containing date and time +
+See also
time +

Example

+
+int t = time();
+printf("It is now %02d:%02d:%02d\n",
+       t2hour(t), t2minute(t), t2second(t));
+
+ + + +

Object Functions

+Object functions are used to access common information about objects. +

+The following object functions are available: +

+ + + +

clrgroup()

+
+
+Function +
+Clears the group flags of an object. +
+Syntax +
+void clrgroup(object); +
+
+See also
ingroup(), +setgroup(), +GROUP command +

+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. +

Example

+
+board(B) {
+  B.elements(E)
+    clrgroup(E);
+  }
+
+ + + +

ingroup()

+
+
+Function +
+Checks whether an object is in the group. +
+Syntax +
+int ingroup(object); +
+Returns +
+The ingroup function returns a non-zero value if the given object is +in the group. +
+See also
clrgroup(), +setgroup(), +GROUP command +

+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. +

Example

+
+output("group.txt") {
+  board(B) {
+    B.elements(E) {
+      if (ingroup(E))
+         printf("Element %s is in the group\n", E.name);
+      }
+    }
+  }
+
+ + + +

setgroup()

+
+
+Function +
+Sets the group flags of an object. +
+Syntax +
+void setgroup(object[, int flags]); +
+See also
clrgroup(), +ingroup(), +GROUP command +

+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. +

Example

+
+board(B) {
+  B.elements(E)
+    setgroup(E);
+  }
+
+ + + +

Builtin Statements

+Builtin statements are generally used to open a certain context in which +data structures of files can be accessed. +

+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: +
+ + + +

board()

+
+
+Function +
+Opens a board context. +
+Syntax +
+board(identifier) statement +
+See also
schematic, +library +

+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. +

Check if there is a board

+By using the board statement without an argument you can check +if the current editor window contains a board drawing. In that case, +board behaves like an integer constant, returning 1 if +there is a board drawing in the current editor window, and 0 +otherwise. +

Accessing board from a schematic

+If the current editor window contains a schematic drawing, you can still +access that schematic's board by preceding the board statement +with the prefix project, as in +
+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! +

Example

+
+if (board)
+   board(B) {
+     B.elements(E)
+       printf("Element: %s\n", E.name);
+     }
+
+ + + +

deviceset()

+
+
+Function +
+Opens a device set context. +
+Syntax +
+deviceset(identifier) statement +
+See also
package, +symbol, +library +

+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. +

Check if there is a device set

+By using the deviceset statement without an argument you can check +if the current editor window contains a device drawing. In that case, +deviceset behaves like an integer constant, returning 1 if +there is a device drawing in the current editor window, and 0 +otherwise. +

Example

+
+if (deviceset)
+   deviceset(D) {
+     D.gates(G)
+       printf("Gate: %s\n", G.name);
+     }
+
+ + + +

library()

+
+
+Function +
+Opens a library context. +
+Syntax +
+library(identifier) statement +
+See also
board, +schematic, +deviceset, +package, +symbol +

+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. +

Check if there is a library

+By using the library statement without an argument you can check +if the current editor window contains a library drawing. In that case, +library behaves like an integer constant, returning 1 if +there is a library drawing in the current editor window, and 0 +otherwise. +

Example

+
+if (library)
+   library(L) {
+     L.devices(D)
+       printf("Device: %s\n", D.name);
+     }
+
+ + + +

output()

+
+
+Function +
+Opens an output file for subsequent printf() calls. +
+Syntax +
+output(string filename[, string mode]) statement +
+See also
printf, +fileerror +

+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. +

File Modes

+The mode parameter defines how the output file is to be opened. +If no mode parameter is given, the default is "wt". +

+ + + + + + + +
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". +

Nested Output statements

+output statements can be nested, as long as there are enough file +handles available, and provided that no two active output statements +access the same file. +

Example

+
+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");
+  }
+
+ + + +

package()

+
+
+Function +
+Opens a package context. +
+Syntax +
+package(identifier) statement +
+See also
library, +deviceset, +symbol +

+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. +

Check if there is a package

+By using the package statement without an argument you can check +if the current editor window contains a package drawing. In that case, +package behaves like an integer constant, returning 1 if +there is a package drawing in the current editor window, and 0 +otherwise. +

Example

+
+if (package)
+   package(P) {
+     P.contacts(C)
+       printf("Contact: %s\n", C.name);
+     }
+
+ + + +

schematic()

+
+
+Function +
+Opens a schematic context. +
+Syntax +
+schematic(identifier) statement +
+See also
board, +library, +sheet +

+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. +

Check if there is a schematic

+By using the schematic statement without an argument you can check +if the current editor window contains a schematic drawing. In that case, +schematic behaves like an integer constant, returning 1 if +there is a schematic drawing in the current editor window, and 0 +otherwise. +

Accessing schematic from a board

+If the current editor window contains a board drawing, you can still +access that board's schematic by preceding the schematic statement +with the prefix project, as in +
+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! +

Access the current Sheet

+Use the sheet statement to +directly access the currently loaded sheet. +

Example

+
+if (schematic)
+   schematic(S) {
+     S.parts(P)
+       printf("Part: %s\n", P.name);
+     }
+
+ + + +

sheet()

+
+
+Function +
+Opens a sheet context. +
+Syntax +
+sheet(identifier) statement +
+See also
schematic +

+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. +

Check if there is a sheet

+By using the sheet statement without an argument you can check +if the current editor window contains a sheet drawing. In that case, +sheet behaves like an integer constant, returning 1 if +there is a sheet drawing in the current editor window, and 0 +otherwise. +

Example

+
+if (sheet)
+   sheet(S) {
+     S.parts(P)
+       printf("Part: %s\n", P.name);
+     }
+
+ + + +

symbol()

+
+
+Function +
+Opens a symbol context. +
+Syntax +
+symbol(identifier) statement +
+See also
library, +deviceset, +package +

+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. +

Check if there is a symbol

+By using the symbol statement without an argument you can check +if the current editor window contains a symbol drawing. In that case, +symbol behaves like an integer constant, returning 1 if +there is a symbol drawing in the current editor window, and 0 +otherwise. +

Example

+
+if (symbol)
+   symbol(S) {
+     S.pins(P)
+       printf("Pin: %s\n", P.name);
+     }
+
+ + + +

Dialogs

+User Language Dialogs allow you to define your own frontend to a User Language Program. +

+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
+ + +
+

Predefined Dialogs

+Predefined Dialogs implement the typical standard dialogs that are frequently used +for selecting file names or issuing error messages. +

+The following predefined dialogs are available: +

+See Dialog Objects for information on how to +define your own complex user dialogs. + + + +

dlgDirectory()

+
+
+Function +
+Displays a directory dialog. +
+Syntax +
+string dlgDirectory(string Title[, string Start]) +
+Returns +
+The dlgDirectory function returns the full pathname of the selected directory.
+If the user has canceled the dialog, the result will be an empty string. +
+See also
dlgFileOpen +

+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. +

Example

+
+string dirName;
+dirName = dlgDirectory("Select a directory", "");
+
+ + + +

dlgFileOpen(), dlgFileSave()

+
+
+Function +
+Displays a file dialog. +
+Syntax +
+string dlgFileOpen(string Title[, string Start[, string Filter]])
+string dlgFileSave(string Title[, string Start[, string Filter]]) +
+Returns +
+The dlgFileOpen and dlgFileSave functions return the full pathname of the selected file.
+If the user has canceled the dialog, the result will be an empty string. +
+See also
dlgDirectory +

+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)". +

Example

+
+string fileName;
+fileName = dlgFileOpen("Select a file", "", "*.brd");
+
+ + + +

dlgMessageBox()

+
+
+Function +
+Displays a message box. +
+Syntax +
+int dlgMessageBox(string Message[, button_list]) +
+Returns +
+The dlgMessageBox function returns the index of the button the user has selected.
+The first button in button_list has index 0. +
+See also
status() +

+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 "&lt;", "&gt;" and "&amp;", 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. +
+

Example

+
+if (dlgMessageBox("!Are you sure?", "&Yes", "&No") == 0) {
+   // let's do it!
+   }
+
+ + + +

Dialog Objects

+A User Language Dialog is built from the following Dialog Objects: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
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
dlgRadioButtona 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

+
+
+Function +
+Defines a cell location within a grid layout context. +
+Syntax +
+dlgCell(int row, int column[, int row2, int column2]) statement +
+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. +

Example

+
+string Text;
+dlgGridLayout {
+  dlgCell(0, 0) dlgLabel("Cell 0,0");
+  dlgCell(1, 2, 4, 7) dlgTextEdit(Text);
+  }
+
+ + + +

dlgCheckBox

+
+
+Function +
+Defines a checkbox. +
+Syntax +
+dlgCheckBox(string Text, int &Checked) [ statement ] +
+See also
dlgRadioButton, +dlgGroup, +Layout Information, +A Complete Example +

+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. +

Example

+
+int mirror = 0;
+int rotate = 1;
+int flip   = 0;
+dlgGroup("Orientation") {
+  dlgCheckBox("&Mirror", mirror);
+  dlgCheckBox("&Rotate", rotate);
+  dlgCheckBox("&Flip", flip);
+  }
+
+ + + +

dlgComboBox

+
+
+Function +
+Defines a combo box selection field. +
+Syntax +
+dlgComboBox(string array[], int &Selected) [ statement ] +
+See also
dlgListBox, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+string Colors[] = { "red", "green", "blue", "yellow" };
+int Selected = 2; // initially selects "blue"
+dlgComboBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]);
+
+ + + +

dlgDialog

+
+
+Function +
+Executes a User Language Dialog. +
+Syntax +
+int dlgDialog(string Title) block ; +
+Returns +
+The dlgDialog function returns an integer value that can be given a user defined meaning +through a call to the dlgAccept() function.
+If the dialog is simply closed, the return value will be 0. +
+See also dlgGridLayout, +dlgHBoxLayout, +dlgVBoxLayout, +dlgAccept, +dlgReset, +dlgReject, +A Complete Example +

+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. +

Examples

+
+int Result = dlgDialog("Hello") {
+  dlgLabel("Hello world");
+  dlgPushButton("+OK") dlgAccept();
+  };
+int haveButton = 1;
+dlgDialog("Test") {
+  dlgLabel("Start");
+  if (haveButton)
+     dlgPushButton("Here") dlgAccept();
+  };
+
+ + + +

dlgGridLayout

+
+
+Function +
+Opens a grid layout context. +
+Syntax +
+dlgGridLayout statement +
+See also
dlgCell, +dlgHBoxLayout, +dlgVBoxLayout, +Layout Information, +A Complete Example +

+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. +

Example

+
+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");
+  }
+
+ + + +

dlgGroup

+
+
+Function +
+Defines a group field. +
+Syntax +
+dlgGroup(string Title) statement +
+See also
dlgCheckBox, +dlgRadioButton, +Layout Information, +A Complete Example +

+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. +

Example

+
+int align = 1;
+dlgGroup("Alignment") {
+  dlgRadioButton("&Top", align);
+  dlgRadioButton("&Center", align);
+  dlgRadioButton("&Bottom", align);
+  }
+
+ + + +

dlgHBoxLayout

+
+
+Function +
+Opens a horizontal box layout context. +
+Syntax +
+dlgHBoxLayout statement +
+See also
dlgGridLayout, +dlgVBoxLayout, +Layout Information, +A Complete Example +

+The dlgHBoxLayout statement opens a horizontal box layout context for the given +statement. +

Example

+
+dlgHBoxLayout {
+  dlgLabel("Box 1");
+  dlgLabel("Box 2");
+  dlgLabel("Box 3");
+  }
+
+ + + +

dlgIntEdit

+
+
+Function +
+Defines an integer entry field. +
+Syntax +
+dlgIntEdit(int &Value, int Min, int Max) +
+See also
dlgRealEdit, +dlgStringEdit, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+int Value = 42;
+dlgHBoxLayout {
+  dlgLabel("Enter a &Number between 0 and 99");
+  dlgIntEdit(Value, 0, 99);
+  }
+
+ + + +

dlgLabel

+
+
+Function +
+Defines a text label. +
+Syntax +
+dlgLabel(string Text [, int Update]) +
+See also
Layout Information, +A Complete Example, +dlgRedisplay() +

+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 "&lt;", "&gt;" and "&amp;", 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. +

Example

+
+string OS = "Windows";
+dlgHBoxLayout {
+  dlgLabel(OS, 1);
+  dlgPushButton("&Change OS") { OS = "Linux"; }
+  }
+
+ + + +

dlgListBox

+
+
+Function +
+Defines a list box selection field. +
+Syntax +
+dlgListBox(string array[], int &Selected) [ statement ] +
+See also
dlgComboBox, +dlgListView, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+string Colors[] = { "red", "green", "blue", "yellow" };
+int Selected = 2; // initially selects "blue"
+dlgListBox(Colors, Selected) dlgMessageBox("You have selected " + Colors[Selected]);
+
+ + + +

dlgListView

+
+
+Function +
+Defines a multi column list view selection field. +
+Syntax +
+dlgListView(string Headers, string array[], int &Selected[, int &Sort]) [ statement ] +
+See also
dlgListBox, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+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]);
+
+ + + +

dlgPushButton

+
+
+Function +
+Defines a push button. +
+Syntax +
+dlgPushButton(string Text) statement +
+See also
Layout Information, +Dialog Functions, +A Complete Example +

+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. +

Example

+
+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(); }
+
+ + + +

dlgRadioButton

+
+
+Function +
+Defines a radio button. +
+Syntax +
+dlgRadioButton(string Text, int &Selected) [ statement ] +
+See also
dlgCheckBox, +dlgGroup, +Layout Information, +A Complete Example +

+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. +

Example

+
+int align = 1;
+dlgGroup("Alignment") {
+  dlgRadioButton("&Top", align);
+  dlgRadioButton("&Center", align);
+  dlgRadioButton("&Bottom", align);
+  }
+
+ + + +

dlgRealEdit

+
+
+Function +
+Defines a real entry field. +
+Syntax +
+dlgRealEdit(real &Value, real Min, real Max) +
+See also
dlgIntEdit, +dlgStringEdit, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+real Value = 1.4142;
+dlgHBoxLayout {
+  dlgLabel("Enter a &Number between 0 and 99");
+  dlgRealEdit(Value, 0.0, 99.0);
+  }
+
+ + + +

dlgSpacing

+
+
+Function +
+Defines additional space in a box layout context. +
+Syntax +
+dlgSpacing(int Size) +
+See also
dlgHBoxLayout, +dlgVBoxLayout, +dlgStretch, +Layout Information, +A Complete Example +

+The dlgSpacing statement defines additional space in a vertical or horizontal box layout context. +

+Size defines the number of pixels of the additional space. +

Example

+
+dlgVBoxLayout {
+  dlgLabel("Label 1");
+  dlgSpacing(40);
+  dlgLabel("Label 2");
+  }
+
+ + + +

dlgSpinBox

+
+
+Function +
+Defines a spin box selection field. +
+Syntax +
+dlgSpinBox(int &Value, int Min, int Max) +
+See also
dlgIntEdit, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+int Value = 42;
+dlgHBoxLayout {
+  dlgLabel("&Select value");
+  dlgSpinBox(Value, 0, 99);
+  }
+
+ + + +

dlgStretch

+
+
+Function +
+Defines an empty stretchable space in a box layout context. +
+Syntax +
+dlgStretch(int Factor) +
+See also
dlgHBoxLayout, +dlgVBoxLayout, +dlgSpacing, +Layout Information, +A Complete Example +

+The dlgStretch statement defines an empty stretchable space in a vertical or horizontal box layout context. +

+Factor defines the stretch factor of the space. +

Example

+
+dlgHBoxLayout {
+  dlgStretch(1);
+  dlgPushButton("+OK")    { dlgAccept(); };
+  dlgPushButton("Cancel") { dlgReject(); };
+  }
+
+ + + +

dlgStringEdit

+
+
+Function +
+Defines a string entry field. +
+Syntax +
+dlgStringEdit(string &Text) +
+See also
dlgRealEdit, +dlgIntEdit, +dlgTextEdit, +dlgLabel, +Layout Information, +A Complete Example +

+The dlgStringEdit statement defines a text entry field with the given Text. +

Example

+
+string Name = "Linus";
+dlgHBoxLayout {
+  dlgLabel("Enter &Name");
+  dlgStringEdit(Name);
+  }
+
+ + + +

dlgTabPage

+
+
+Function +
+Defines a tab page. +
+Syntax +
+dlgTabPage(string Title) statement +
+See also
dlgTabWidget, +Layout Information, +A Complete Example +

+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. +

Example

+
+dlgTabWidget {
+  dlgTabPage("Tab &1") {
+    dlgLabel("This is page 1");
+    }
+  dlgTabPage("Tab &2") {
+    dlgLabel("This is page 2");
+    }
+  }
+
+ + + +

dlgTabWidget

+
+
+Function +
+Defines a container for tab pages. +
+Syntax +
+dlgTabWidget statement +
+See also
dlgTabPage, +Layout Information, +A Complete Example +

+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. +

Example

+
+dlgTabWidget {
+  dlgTabPage("Tab &1") {
+    dlgLabel("This is page 1");
+    }
+  dlgTabPage("Tab &2") {
+    dlgLabel("This is page 2");
+    }
+  }
+
+ + + +

dlgTextEdit

+
+
+Function +
+Defines a multiline text entry field. +
+Syntax +
+dlgTextEdit(string &Text) +
+See also
dlgStringEdit, +dlgTextView, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+string Text = "This is some text.\nLine 2\nLine 3";
+dlgVBoxLayout {
+  dlgLabel("&Edit the text");
+  dlgTextEdit(Text);
+  }
+
+ + + +

dlgTextView

+
+
+Function +
+Defines a multiline text viewer field. +
+Syntax +
+dlgTextView(string Text)
+dlgTextView(string Text, string &Link) statement +
+See also
dlgTextEdit, +dlgLabel, +Layout Information, +A Complete Example +

+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. +

Example

+
+string Text = "This is some text.\nLine 2\nLine 3";
+dlgVBoxLayout {
+  dlgLabel("&View the text");
+  dlgTextView(Text);
+  }
+
+ + + +

dlgVBoxLayout

+
+
+Function +
+Opens a vertical box layout context. +
+Syntax +
+dlgVBoxLayout statement +
+See also
dlgGridLayout, +dlgHBoxLayout, +Layout Information, +A Complete Example +

+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. +

Example

+
+dlgVBoxLayout {
+  dlgLabel("Box 1");
+  dlgLabel("Box 2");
+  dlgLabel("Box 3");
+  }
+
+ + + +

Layout Information

+All objects within a User Language Dialog a placed inside a layout context. +

+Layout contexts can be either grid, horizontal +or vertical. +

Grid Layout Context

+Objects in a grid layout context must specify the grid coordinates of the cell or cells into +which they shall be placed. To place a text label at row 5, column 2, you would write +
+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") {
+    //...
+    }
+  }
+
+

Horizontal Layout Context

+Objects in a horizontal layout context are placed left to right. +

+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();
+  }
+
+

Vertical Layout Context

+Objects in a vertical layout context follow the same rules as those in a horizontal +layout context, except that they are placed top to bottom. +

Mixing Layout Contexts

+Vertical, horizontal and grid layout contexts can be mixed to create the desired layout +structure of a dialog. +See the Complete Example for a demonstration of this. + + + +

Dialog Functions

+The following functions can be used with User Language Dialogs: +

+ + + + + +
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
+ + +
+

dlgAccept()

+
+
+Function +
+Closes the dialog and accepts its contents. +
+Syntax +
+void dlgAccept([ int Result ]); +
+See also
dlgReject, +dlgDialog, +A Complete Example +

+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! +

Example

+
+int Result = dlgDialog("Test") {
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               };
+
+ + + +

dlgRedisplay()

+
+
+Function +
+Redisplays the dialog after changing values. +
+Syntax +
+void dlgRedisplay(void); +
+See also
dlgReset, +dlgDialog, +A Complete Example +

+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. +

Example

+
+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.";
+                 }
+               };
+
+ + + +

dlgReset()

+
+
+Function +
+Resets all dialog objects to their initial values. +
+Syntax +
+void dlgReset(void); +
+See also
dlgReject, +dlgDialog, +A Complete Example +

+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(). +

Example

+
+int Number = 1;
+int Result = dlgDialog("Test") {
+               dlgIntEdit(Number);
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               dlgPushButton("Reset")  dlgReset();
+               };
+
+ + + +

dlgReject()

+
+
+Function +
+Closes the dialog and rejects its contents. +
+Syntax +
+void dlgReject([ int Result ]); +
+See also
dlgAccept, +dlgReset, +dlgDialog, +A Complete Example +

+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(). +

Example

+
+int Result = dlgDialog("Test") {
+               dlgPushButton("+OK")    dlgAccept(42);
+               dlgPushButton("Cancel") dlgReject();
+               };
+
+ + + +

Escape Character

+Some characters have special meanings in button +or label texts, so they need to be escaped if they shall appear literally. +

+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: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TagDescription
<html>...</html>An HTML document. It understands the following attributes +
    +
  • bgcolor - The background color, for example bgcolor="yellow" or bgcolor="#0000FF". +
  • background - The background pixmap, for example background="granit.xpm". +
  • text - The default text color, for example text="red". +
  • link - The link color, for example link="green". +
+
<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: +
    +
  • href - The reference target as in <a href="#123">...</a>. +
  • name - The anchor name, as in <a name="123">...</a>. +
+
<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: +
    +
  • color - The text color, for example color="red" or color="#FF0000". +
  • size - The logical size of the font. Logical sizes 1 to 7 are supported. The value may either be absolute, for example size=3, or relative like size=-2. In the latter case, the sizes are simply added. +
  • face - The family of the font, for example face=times. +
+
<img...>An image. This tag understands the following attributes: +
    +
  • src - The image name, for example <img src="image.xpm">.
    +Supported image formats are:
    +".bmp" (Windows Bitmap Files)
    +".pbm" (Portable Bitmap Files)
    +".pgm" (Portable Grayscale Bitmap Files)
    +".png" (Portable Network Graphics Files)
    +".ppm" (Portable Pixelmap Files)
    +".xbm" (X Bitmap Files)
    +".xpm" (X Pixmap Files) +
  • width - The width of the image. If the image does not fit to the specified size, it will be scaled automatically. +
  • height - The height of the image. +
  • align - Determines where the image is placed. Per default, an image is placed inline, just like a normal character. Specify left or right to place the image at the respective side. +
+
<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: +
    +
  • bgcolor - The background color. +
  • width - The table width. This is either absolute in pixels or relative in percent of the column width, for example width=80%. +
  • border - The width of the table border. The default is 0 (= no border). +
  • cellspacing - Additional space around the table cells. The default is 2. +
  • cellpadding - Additional space around the contents of table cells. Default is 1. +
+
<tr>...</tr>A table row. Can only be used within table. Understands the attribute +
    +
  • bgcolor - The background color. +
+
<td>...</td>A table data cell. Can only be used within tr. Understands the attributes +
    +
  • bgcolor - The background color. +
  • width - The cell width. This is either absolute in pixels or relative in percent of the entire table width, for example width=50%. +
  • colspan - Defines how many columns this cell spans. The default is 1. +
  • rowspan - Defines how many rows this cell spans. The default is 1. +
  • align - Alignment, possible values are left, right and center. The default is left-aligned. +
+
<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.
+

+ + + + + + + + + + + + + + + + + +
TagMeaning
&lt;<
&gt;>
&amp;&
&nbsp;non-breaking space
&auml;ä
&ouml;ö
&uuml;ü
&Auml;Ä
&Ouml;Ö
&Uuml;Ü
&szlig;ß
&copy;©
&deg;°
&micro;µ
&plusmn;±
+ + + +

Automatic Backup

+

Maximum backup level

+The WRITE command creates backup copies of the saved files. +These backups have the same name as the original file, with a +modified extension that follows the pattern +
+.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. +

Auto backup interval

+If a drawing has been modified a safety backup copy will be automatically +created after at most the given Auto backup interval. +

+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. + + + +

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. +

+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. +

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: +

+CadSoft Computer
+19620 Pines Blvd. Suite 217
+Pembroke Pines, FL 33029
+USA +

+ + + + + +
Phone 954-237-0932
Fax 954-237-0968
Email support@cadsoftusa.com
URL www.cadsoftusa.com
+ + +
+

License

+To legally use EAGLE you need a registered user license. +Please check whether the dialog "Help/About EAGLE" contains your name and address +under "Registered to:". +If you have any doubts about the validity or authenticity of your license, +please contact our +Technical Support staff +for verification. +
+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: +

Single-User License

+Only one user may use the program at any given time. +However, that user may install the program on any of his computers, as long +as he makes sure that the program will only be used on one of these +computers at a time. +

+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. +

Multi-user License

+A multi-user license may be used by several users (up to the maximum number +listed on the license) simultaneously. The program may be installed on any +number of different computers at the location of the license holder. +

Commercial License

+The program may be used for any purpose, be it commercial or private. +

Educational License

+The program may only be used in an educational environment like a school, +university or training workshop, in order to teach how to use ECAD +software. +

Student License

+The program may only be used for private ("non-profit") purposes. +Student versions are sold at a very low price, to allow people who +could otherwise never afford buying EAGLE the use of the program +for their private hobby or education. It is a violation of the license +terms if you "earn money" by using a Student Licence of EAGLE. + + + +

EAGLE License

+Before you can work with EAGLE it is necessary to register the program with +your personalized license data. +

+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. +

Installing additional modules

+If you decided to update your license with the schematic/autorouter module +you get a new license file with a new Installation Code. +To make the new modules available you have to register your EAGLE again. +Start the EAGLE program and choose in the Control Panel +in the Help menu the item EAGLE License. + + + +

EAGLE Editions

+EAGLE is available in three different editions to fit various +user requirements. +

Professional

+The Professional edition provides full functionality: + +

Standard

+The Standard edition has the following limitations: + +

Light

+The Light edition has the following limitations: + +

+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 @@ + +CAM-Prozessor-Jobs +

+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.

+ + +CAM Processor Jobs +

+The CAM Processor provides a job mechanism with the aid of which +the creation of the output data for a board can be automated. + diff --git a/eagle-5.7.0/cam/excellon.cam b/eagle-5.7.0/cam/excellon.cam new file mode 100644 index 0000000..7c1562f --- /dev/null +++ b/eagle-5.7.0/cam/excellon.cam @@ -0,0 +1,23 @@ +[CAM Processor Job] +Description[de]="Erzeugt Bohrdaten im Excellon-Format

\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 + Tags wurden korrigiert. + - Die Darstellung der Platzhaltertexte ">DRAWING_NAME", ">LAST_DATE_TIME", + ">PLOT_DATE_TIME" und ">SHEET" wurde korrigiert für gesmashte Bauteile. + - Die Behandlung von Dateinamen im PRINT-Befehl, die mit einem '.' beginnen, + wurde korrigiert. + - Unerwartete Wire-Fragmente in der Ausgabe des CAM-Prozessors und des + PRINT-Befehls wurden korrigiert. + - Ein möglicher Absturz des DRC bei der Behandlung extrem kleiner + Kreisbögen wurde korrigiert. + - Die Werte für "Fangfaktor" und "Selektionsfaktor" können jetzt im Menü + "Optionen/Einstellungen/Verschiedenes" als Dezimalzahlen eingegeben werden, + um Werte kleiner als 1 zu ermöglichen. + - Die Beschreibung der palette()-Funktion in der Online-Hilfe wurde + korrigiert, so dass sie den Alpha-Kanal der ARGB-Werte richtig beschreibt. + - Die Beschreibung von REAL_EPSILON in der Online-Hilfe wurde korrigiert. + - Die Selektion einer Gruppe mit dem alternativen Grid im COPY-Befehl wurde + korrigiert. + - Das Freirechnen sehr kleiner und dünner Kreisbögen von Polygonen wurde + korrigiert. + - Die Behandlung von UTF-8-Zeichen in der readfile()-Funktion wurde + korrigiert für den Fall, dass in ein String-Array eingelesen wird. + - Der DRC wurde korrigiert, so dass er nicht angeschlossene Pads bzw. SMDs + gegen Objekte im Dimension-Layer prüft, wie es in Version 4.x der Fall + war. + - Das Spiegeln von Polygonen innerhalb eines Packages beim Bewegen des + Packages mit dem ADD-Befehl wurde korrigiert. + - Das Speichern relativer Pfadnamen in der Projektdatei wurde korrigiert + für den Fall, dass zum Beispiel ein Projekt namens /abc/def offen ist und + eine Datei namens /abc/def-1/irgend/was editiert wird. + - Das Markieren des Textes des ersten String-Eingabefeldes eines UserLanguage + Dialogs beim Öffnen des Dialogs wurde korrigiert. + - Ein ungewolltes Aufblitzen des Signals beim Absetzen eines Wires im + ROUTE-Befehl wurde korrigiert. + - Ein Absturz wurde behoben für den Fall, dass der CHANGE-Befehl auf eine + Gruppe angewendet wird, die ein Polygon enthält, und diese Operation eine + Neuberechnung des Polygons auslöst. + - Die Berechnung des umschließenden Rechtecks von Platzhaltern für globale + Attribute wurde korrigiert. + - Die Behandlung von mit einem Escape-Zeichen markierten '&'-Zeichen in + dlgLabel wurde korrigiert für den Fall, dass das Label keinen echten + Hotkey enthält. + +Freigabemitteilung für EAGLE 5.1.0 +================================== + +* Plattformen: + + - In der Windows-Registry wird jetzt + HKEY_CLASSES_ROOT\Applications\eagle.exe\shell\open\command gesetzt, damit + Dateinamens-Erweiterungen mit der ausführbaren EAGLE-Datei verknüpft + werden können. + - Das Installationsprogramm benutzt jetzt die Benutzerkontensteuerung um + Administrationsrechte anzufordern, falls es auf Windows Vista unter einem + eingeschränkten Benutzerkonto läuft. + +* UPDATE-Befehl: + + - Die Online-Hilfe für 'UPDATE old_library_name = new_library_name' wurde + geändert, um klar zu machen, dass die Library in der Board- bzw. Schematic- + Datei umbenannt wird, und nicht die externe Library-Datei. + +* CAM-Prozessor: + + - Der GERBER_RS274X-Treiber des CAM-Prozessors generiert jetzt Codes zum + Füllen von Polygonflächen für gedrehte Rechtecke. + +* Verschiedenes: + + - Bei der Eingabe in der Kommandozeile werden jetzt auch Dezimalzahlen + akzeptiert, die mit Komma als Dezimal-Trennzeichen beginnen (falls die + landesspezifischen Einstellungen dies erlauben). + - Wird direkt in einem Board bzw. Schaltplan ein Text der Form >ABC + platziert, und es gibt ein globales Attribut gleichen Namens, aber mit + leerem Wert, so wird jetzt das Aufhängekreuz des Textes dargestellt, um + es dem Benutzer zu ermöglichen, den Text zu manipulieren. + +* Fehlerbehebungen: + + - Ein Absturz bei der Benutzung des CAM-Prozessors im Kommandozeilenmodus + (Option -X) mit ausgeschalteter Option "Immer Vektor-Schrift" wurde + behoben. + - Die Darstellung sehr kurzer Linien unter Windows und Mac OS X wurde + korrigiert für den Fall, dass ihre Koordinaten in Pixel eine Länge von + Null ergeben. + - Die Aktivierung des Zeilenumbruchs in dlgLabel wurde korrigiert für den + Fall, dass der Label-Text HTML-Tags enthält. + - Die Behandlung des '-' Zeichens zwischen ... Tags wurde + korrigiert. + - Die Behandlung von Luftlinien im ROUTE-Befehl nach dem teilweisen Routen + eines Signals wurde korrigiert (die verbleibende Luftlinie reagierte auf + CHANGE WIDTH). + - Das Kopieren und CUT/PASTEn von Bauteilen mit auf Bauteilebene definierten + Attributen wurde korrigiert. + - Die User Language Funktion printf() wurde korrigiert, so dass sie den Wert + 0x00 und die Wert über 0x7F im binären Modus richtig verarbeitet. + - Die Definition einer Gruppe für den Fall, dass der letzte Punkt des + Gruppenpolygons gleich dem ersten ist, wurde korrigiert. + - Fehlerhafte Fensterkoordinaten in eagle.epf- und eaglerc-Dateien werden + jetzt ignoriert. + - Die Ausführung von User Language Programmen, die mit einer + "Byte-Order-Mark" beginnen, wurde korrigiert. + - Ein Absturz im ADD/REPLACE-Dialog wurde behoben für den Fall, dass aus + einer Bibliothek ADD bzw. REPLACE gemacht wurde, das Editor-Fenster + geschlossen und wieder geöffnet wurde, und anschließend wieder aus der + selben Bibliothek ADD bzw. REPLACE gemacht wurde. + - Die Positionierung der Fenster beim Öffnen eines Projektes unter Linux + wurde korrigiert. + - Die Behandlung des XREF-Schlüsselwortes im LABEL-Befehl wurde korrigiert. + - Das Speichern der Werte der Farbpaletten wurde korrigiert für den Fall, + dass sie in der Kommandozeile oder einem Script mit dem SET-Befehl + definiert werden. + - Die Darstellung von Kreisen mit vollflächigem Füllmuster unter Windows + und Mac OS X wurde korrigiert für den Fall, dass die Linienbreite in der + Größenordnung des Radius liegt. + - Die Darstellung von Linien der Breite Null bei starkem Hineinzoomen in + die Zeichnung wurde korrigiert. + - Die Positionierung einer dlgMessageBox, welche HTML-Text enthält, wurde + korrigiert. + - Die Behandlung des '@radius'-Parameters im WIRE-Befehl (und allen anderen, + die einen solchen Parameter akzeptieren) wurde korrigiert. + - Die Aktualisierung des Bibliotheksnamens im Board beim Ersetzen eines + Bauteils im Schaltplan wurde korrigiert für den Fall, dass sich nur der + Bibliotheksname geändert hat. + - Die Behandlung der Mindestabstände bei Kreisen im Autorouter und beim + Freirechnen von Polygonen wurde korrigiert. + - Die Behandlung des Schalters "Alphablending benutzen" bei der Darstellung + des Farbdialogs für weißen oder farbigen Hintergrund wurde korrigiert. + - Das Entfernen des Fehler-Zeigers vom Board-Editor, wenn die ERC-Fehlerliste + geschlossen oder gelöscht wird, wurde korrigiert. + - Die Behandlung von UTF-8 Character-Konstanten in ULP-Dateien wurde + korrigiert. + - Die Anzeige der Direkthilfe in den Parameter-Toolbars wurde korrigiert. + - Die Bearbeitung von Tastenkürzeln im Bibliothekseditor für den Fall, dass + noch kein Pulldown-Menü geöffnet worden ist, wurde korrigiert. + - Die Handhabung von User Language Variablen des Typs 'char' als 8-Bit Werte + wurde korrigiert. + - Die Darstellung des Root-Verzeichnisses in der Baumansicht des Control + Panels wurde korrigiert, falls es in einem der Verzeichnispfade enthalten + ist. + - Die Behandlung von gebilligten Fehlern, die genau die gleiche Signatur + haben, wurde korrigiert. + - Das automatische Routen ausgewählter Signale wurde korrigiert für den Fall, + dass die Netzklassen bestimmte Mindestabstände zwischen ausgewählten und + nicht ausgewählten Signalen definieren. + - Das Verschieben der Zeichenfläche mit dem Mausrad für den Fall, dass der + "Mausrad-Zoomfaktor" auf 0 gesetzt ist, wurde korrigiert. + - Der Standard-Platzhalter in den User Language Dialogfunktionen dlgFileOpen() + und dlgFileSave() unter Windows wurde korrigiert. Mit "*" behandelt der + Windows Datei-Dialog *.lnk-Dateien nicht richtig, daher wurde der + Platzhalter nach "*.*" geändert, so wie er in früheren Versionen war. + - Grafikfehler wurden korrigiert für den Fall, dass die Linux-Version von + EAGLE einen X11-Server benutzt, der auf einem "big endian" System läuft. + - Darstellungsfehler des Ursprungskreuzes beim Bewegen eines Gatters in + einem Device-Set wurden behoben. + - Ein Absturz wurde behoben, der auftrat, wenn ein DRC-Fehler hervorgehoben + wurde, ein anderes Board geladen und dann mit dem DISPLAY-Befehl die + sichtbaren Layer verändert wurden. + - Die Forward-Annotation wurde korrigiert für den Fall, dass im Schaltplan + zu einem Bauteil ein neues Attribut mit leerem Wert hinzugefügt wird, bzw. + der Wert eines bestehenden Attributs im Schaltplan auf '' (leer) geändert + wird. + - Unbegründete DRC-Fehler bei runden Objekten für den Fall, dass der + tatsächliche Abstand genau dem Mindestabstand entspricht, wurden behoben. + - Die Referenzlinie für Netz-Labels wurde korrigiert für den Fall, dass + sie auf einen Kreisbogen zeigt. + - Ungültige Koordinaten in vom CAM-Prozessor erzeugten Daten für + Zeichengeräte (wie etwa HPGL-Plotter) wurden korrigiert für den Fall sehr + kurzer Linien, die in Maschinen-Einheiten eine Länge von Null haben. + - Die Behandlung von Bauteilattributen, die globale Attribute überschreiben, + wurde korrigiert (das Namensfeld war deaktiviert), sowie die Behandlung + von Attributen mit leerem Wert (das Wert-Feld war deaktiviert). + - Die Behandlung des umschließenden Rechtecks von gesmashten Bauteilen wurde + korrigiert für den Fall, dass das Package bzw. Symbol keine anderen Objekte + außer Platzhaltertexten enthält. + - Die Behandlung des letzten Wertes im Colors-Parameter vom CAM-Job-Dateien + wurde korrigiert. + - "Datei/Alles speichern" wurde korrigiert, so dass es die Projektdatei + speichert, auch wenn "Projekdatei automatisch sichern" ausgeschaltet ist. + - Die Behandlung des Aufrufs von UL_SMD.dx()/.dy() und UL_PAD.diameter() mit + einem "stop" bzw. "cream" Layer wurde korrigiert für den Fall, dass das SMD + bzw. Pad das NOSTOP oder NOCREAM Flage gesetzt hat. + - Das Löschen von lokalen Attributen, welche globale Attribute überschreiben, + wurde korrigiert. + - Das Ändern des Wertes lokaler Attribute, die globale Attribute + überschreiben, wurde korrigiert für den Fall, dass der aktuelle Wert leer + ist. + - Das Auftrennen von Wires beim Bewegen eines Wire-Endpunkts auf einen + anderen Wire wurde korrigiert. + - Die Auflösung von *.lnk-Dateien unter Windows in der Baumansicht des + Control Panels wurde korrigiert. + - Die Darstellung von Statustexten wurde korrigiert für den Fall, dass die + Informationen eines Objektes eines der Zeichen '<', '>' oder '&' enthalten. + - Die Verwendung eines Attributs namens VALUE als Standardwert für Bauteile + mit 'Value On' wurde korrigiert. + - Ein Geschwindigkeitsproblem in der User Language Funktion status() wurde + behoben. + - Die Anzeige des Namens der geladenen Datei in der Statuszeile des + CAM-Prozessors wurde korrigiert (der Name verschwand, sobald der + Mauszeiger über das Pulldown-Menü bewegt wurde). + - Die Behandlung von Supply-Layern im Autorouter wurde korrigiert für den + Fall, dass ein Signal, für das es einen Supply-Layer gibt, bereits + (teilweise) verlegt ist und der Autorouter gestartet wird (die Wires und + Vias eines solchen Signals wurden vom Autorouter nicht "gesehen" und + daher noch einmal verlegt; andere im gleichen Autorouter-Lauf verlegte + Signale konnten sogar mit ihnen überlappen oder ihnen zu nahe kommen). + - Die Prüfung des Fonts und der Width der Texte von gesmashten Elementen + im DRC wurde korrigiert. + - Ein unerwarteter Sprung der Gruppe wurde korrigiert für den Fall, dass + die Gruppe in einem Befehl mit Ctrl+Rechte Maustaste selektiert wurde, + nachdem vorher ohne aktiven Befehl mit Ctrl+Rechte Maustaste in die + Zeichenfläche geklickt wurde. + - Der SPLIT-Befehl für Polygonkanten wurde korrigiert für den Fall, dass + der Split-Punkt auf dem ursprünglichen Wire liegt. + +Freigabemitteilung für EAGLE 5.0.0 +================================== + +* Plattformen: + + - Die Mindest-Systemvoraussetzung auf Windows-Plattformen ist jetzt Windows + 2000, XP oder Vista. + - Die Mac OS X Version von EAGLE benötigt jetzt keinen X11-Server mehr + und wird als "Universal Binary" geliefert, welches auf PPC- und Intel-Macs + läuft. + - Die Linux Version von EAGLE wird jetzt als selbstextrahierendes + Shell-Script mit Setup-Dialog geliefert. + - Die Buttons in Dialogen werden jetzt in der Reihenfolge angeordnet, wie + es für die jeweilige Plattform typisch ist. + - Die Windows Version von EAGLE speichert die Datei 'eaglerc.usr' jetzt + unter dem Verzeichnis, das durch den Registry-Eintrag "HKEY_CURRENT_USER\ + Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\AppData" + definiert ist, falls keine Environment-Variable namens HOME definiert ist. + Falls es an der neuen Stelle keine solche Datei gibt, wird versucht, sie + von der alten Stelle zu lesen. + +* User Interface: + + - Wird ein Objekt in einem Zeichenfenster mit der rechten Maustaste + angeklickt, so wird jetzt ein kontextspezifisches Popup-Menü angezeigt, + aus dem Befehle, die für dieses Objekt anwendbar sind, ausgewählt werden + können. + - Da die Kontext-Menü-Funktion über die rechte Maustaste im Konflikt mit + der Selektion einer Gruppe steht, wird eine Gruppe jetzt mit Ctrl plus + rechte Maustaste selektiert. Falls Sie die bisherige Art der + Gruppenselektierung wieder haben wollen, so können Sie die Zeile + + Option.ToggleCtrlForGroupSelectionAndContextMenu = "1" + + ans Ende der Datei ~/.eaglerc anfügen. + Damit können Gruppen wieder mit der rechten Maustaste allein selektiert + werden und Kontext-Menüs werden mit Ctrl plus rechte Maustaste geöffnet. + - Das kontextspezifische Popup-Menü enthält einen Eintrag namens + "Eigenschaften", über den die Eigenschaften des Objektes angezeigt (und + manche ggf. verändert) werden können. + - Der Schaltplan-Editor enthält jetzt eine verkleinerte Vorschau aller + Seiten. Ein Klick auf ein Vorschaubild schaltet auf diese Seite um. + Drag&Drop innerhalb der Vorschau kann dazu benutzt werden, die Seiten + umzuordnen, und das Kontext-Menü erlaubt das Hinzufügen bzw. Löschen + von Seiten. + - Die Attribute von Bauteilen im Board und Schaltplan können jetzt bei den + Befehlen, die Objekte über ihren Namen selektieren können, dadurch + selektiert werden, dass die Kombination aus Bauteilname und Attributname + angegeben wird, wie etwa + + MOVE R5>VALUE + + - Das Kontext-Menü der Package-Varianten im Library-Editor enthält jetzt + eine neue Option 'Package editieren' über die das Package der selektierten + Variante schnell erreicht werden kann. + - Das Kontext-Menü eines Gatters im Device-Editor enthält jetzt eine + Option 'Symbol editieren' über die das Symbol des selektierten Gatters + schnell erreicht werden kann. + - Objekte im Control-Panel werden nicht mehr durch Klicken auf den Text + eines bereits selektierten Objekts umbenannt (dies führte zu oft zu + unbeabsichtigter Aktivierung des Editier-Modus). Benutzen Sie stattdessen + das Kontext-Menü. + - Die Positionen aller geöffneten Fenster können jetzt über + "Optionen/Fensterpositionen" im Control Panel abgespeichert werden. + Neu geöffnete Fenster des gleichen Typs werden dann an der gleichen + Stelle platziert. + - Statusanzeigen und "User Guidance" werden jetzt gleichzeitig in der + Statuszeile des Editor-Fensters dargestellt. + - Wenn das Pulldown-Menü in einem Editor-Fenster ausgeblendet ist, dann + führt die Alt+X Taste nicht mehr zum Verlassen des Programms. Um diese + Funktionalität trotz ausgeblendetem Pulldown-Menü zur Verfügung zu haben, + benutzen Sie "ASSIGN Alt+X Quit;". + - Beim Umschalten zwischen den Seiten eines Schaltplans wird jetzt der + jeweilige Fensterausschnitt gespeichert. + - Beim Verschieben des Ausschnitts im Editor-Fenster muß nicht mehr die + Shift-Taste gedrückt werden um die durch die Scrollbars definierten + Grenzen zu überschreiten. + +* User Language: + + - Einträge in einer dlgListView werden jetzt mehrzeilig dargestellt, wenn + sie '\n'-Zeichen enthalten. + - Die User Language Funktion UL_POLYGON.contours() unterstützt jetzt einen + zweiten Parameter der es ermöglicht, die 'positiven' und 'negativen' + Polygone getrennt zu durchlaufen. + - Die User Language Funktion UL_CLASS.clearance akzeptiert jetzt einen + Parameter, der die Abfrage des Mindestabstandes zwischen zwei Netzklassen + ermöglicht. + - Die User Language Objekte UL_ELEMENT und UL_INSTANCE haben jetzt eine + neue Member-Funktion 'smashed'. + - Include-Anweisungen mit relativen Pfadangaben in ULPs, etwa + + #include "dir/file.ulp" + + werden jetzt in den unter "Optionen/Verzeichnisse/User-Language-Programme" + eingetragenen Verzeichnissen gesucht. + - Die neue User Language Funktion timems() liefert die Zeit in Millisekunden + seit dem Start des ULPs. + - Die neue User Language Funktion ingroup() kann benutzt werden um zu prüfen, + ob ein Objekt innerhalb der aktuellen Gruppe liegt. + - Die neue User Language Funktion system() kann benutzt werden um externe + Programme aufzurufen. + - Die User Language Objekte UL_ELEMENT, UL_INSTANCE und UL_NET haben neue + Data-Members 'column' und 'row', welche die Position innerhalb eines + Zeichnungsrahmens liefern. + - Die User Language Member-Funktionen UL_ELEMENT.smashed und + UL_INSTANCE.smashed akzeptieren jetzt einen optionalen + Platzhaltertextnamen, wodurch man abfragen kann, ob es einen gesmashten + Platzhaltertext dieses Namens gibt. + - In der User Language werden die Labels eines Segments (sowohl bei Bussen + als auch bei Netzen) jetzt durch das neue Objekt UL_LABEL angesprochen, + welches durch die neue Funktion UL_SEGMENT.labels() generiert wird. Die + bisherige Methode, die Labels mittels UL_SEGMENT.texts() anzusprechen, ist + "veraltet" und behandelt die Querverweis-Labels nicht richtig. Der Text + eines Labels wird jetzt von UL_LABEL.text geliefert. + - Das User Language Objekt UL_SCHEMATIC hat ein neues Member 'xreflabel', + welches den Format-String liefert, der für die Darstellung von + Querverweis-Labels benutzt wird. + - Das User Language Objekt UL_SCHEMATIC hat ein neues Member 'xrefpart', + welches den Format-String liefert, der für die Darstellung von + Bauteil-Querverweisen benutzt wird. + - Das User Language Objekt UL_INSTANCE hat ein neues Loop-Member namens + 'xrefs', welches durch die Gatter läuft die den Kontaktspiegel + darstellen. + +* Bildschirm-Darstellung: + + - Beim Zeichnen auf dem Bildschirm werden keine "Raster-OPs" mehr + verwendet. Die einzelnen Layer werden jetzt mit "Alpha-Blending" + gezeichnet. Jede Farbe (ausgenommen die Hintergrundfarbe, welche immer + deckend ist) kann ihren eigenen Alpha-Wert haben, welcher angibt, wie + transparent sie ist. Ein Wert von 0 bedeutet, dass die Farbe vollkommen + durchsichtig (also unsichtbar) ist, während 255 für eine völlig deckende + Farbe steht. Beim Einlesen einer eaglerc-Datei aus einer älteren Version + werden die Alpha-Werte aller Farben auf einen Defaultwert initialisiert + wenn alle Paletteneinträge den Alpha-Wert 0 haben. + Sie können das Script 'defaultcolors.scr' verwenden um die Farben auf + die neuen Standardwerte zu setzen. + Beim Ausdrucken werden die Alpha-Werte immer auf 255 gesetzt. + - Da die Layer-Farben nicht mehr additive Farbmischung verwenden sondern + Alpha-Blending, wurde die Standardeinstellung für die Hintergrundfarbe + im Layout-Editor Fenster auf weiß geändert. + - Falls Sie die alte "Raster-OP"-Darstellung auf schwarzem Hintergrund + haben wollen, so können Sie die Option "Alphablending benutzen" im Dialog + "Optionen/Einstellungen/Farben" abschalten. + Der Alpha-Wert der Farben wird dann ignoriert, wenn ein schwarzer + Hintergrund verwendet wird, und die Farben werden mit einer ODER-Funktion + gemischt. + - In den Farbpaletten sind jetzt die Einträge oberhalb Index 15 mit einem + mittleren Grauwert initialisiert. + +* Benutzerdefinierte Attribute: + + - Bauteile in einer Bibliothek können jetzt "Attribute" besitzen, welche + aus beliebigen, vom Benutzer definierbaren "Name/Wert"-Paaren bestehen. + Attribute sind den einzelnen "Technology"-Varianten eines Bauteils + zugeordnet. + - Der neue Befehl ATTRIBUTE kann dazu benutzt werden, die Attribute einer + Technology-Variante zu definieren (siehe "Hilfe/Editor-Befehle/ATTRIBUTE"). + - Das neue User Language Objekt UL_ATTRIBUTE kann dazu benutzt werden, + Attribute anzusprechen (siehe "Hilfe/User Language/Objekt-Typen/UL_ATTRIBUTE"). + - Die User Language Objekte UL_PART, UL_INSTANCE, UL_ELEMENT und UL_DEVICE + haben ein neues Loop-Member namens 'attributes()'. + - Die User Language Objekte UL_PART und UL_ELEMENT haben eine neue + Member-Funktion namens 'attribute()', mit der ein Bauteil nach dem Wert + eines bestimmten Attributs gefragt werden kann. + - In einer 'Symbol' oder 'Package' Zeichnung werden alle Texte, die mit '>' + beginnen und einem Attribut-Namen des konkreten Bauteils entsprechen, + durch den Wert des Attributs im Schaltplan bzw. Board ersetzt (siehe + "Hilfe/Editor-Befehle/TEXT"). + - Der SMASH-Befehl smasht jetzt alle Texte in einem Symbol oder Package, + die mit '>' beginnen und einem konkreten Attribut-Namen entsprechen, + und weist sie dem Bauteil als Attribute zu (ausgenommen die traditionellen + Platzhalter-Texte wie ">NAME", ">VALUE" usw., die wie bisher behandelt + werden). + - Boards und Schaltpläne können jetzt globale Attribute haben. + - Die User Language Objekte UL_BOARD und UL_SCHEMATIC haben ein neues + Loop-Member namens 'attributes()', mit welchem durch die globalen + Attribute gegangen werden kann. + +* Position eines Bauteils verriegeln: + + - Der neue Befehl LOCK kann dazu benutzt werden, die Position eines + Bauteils im Board zu verriegeln. + - Der Aufhängepunkt eines verriegelten Bauteils wird als 'x' dargestellt, + um anzuzeigen, dass das Bauteil verriegelt ist. + - Das User Language Objekt UL_ELEMENT hat ein neues Member 'locked', + welches den Zustand der Verriegelungs-Einstellung liefert. + +* Popup-Menüs für Buttons: + + - Einige Buttons im Editor-Fenster haben jetzt ein Popup-Menü, welches eine + Liste der zuletzt verwendeten Objekte bzw. benutzerdefinierte Aliase + enthält (je nach Button-Typ). Diese Buttons sind durch einen kleinen + schwarzen Pfeil in der rechten unteren Ecke ihres Icons markiert. Um diese + Liste zu öffnen klicken Sie auf den Button und halten Sie die Maustaste + gedrückt bis die Liste erscheint, oder klicken Sie mit der rechten + Maustaste auf den Button. + - Die Button-Popup-Menüs für DISPLAY, GRID und WINDOW enthalten zwei + spezielle Einträge: "Last" stellt die vorherigen Einstellungen wieder her, + und "Neu..." erfragt vom Benutzer einen Namen, unter dem die aktuellen + Einstellungen gespeichert werden. Beachten Sie bitte, dass auch in der + deutschen Programmversion der Eintrag "Last" lautet, da dies ein + Schlüsselwort der Befehle ist und auch in Scripts funktionieren muss. + +* Aliase für Befehls-Parameter: + + - Die Befehle DISPLAY, GRID und WINDOW haben jetzt eine erweiterte Syntax, + über die der Benutzer "Aliase" für bestimmte Parameter-Einstellungen + definieren kann. + Die Syntax zur Bearbeitung dieser Aliase ist: + + CMD = + + Definiert den Alias , der in die angegebenen + expandiert wird. Der darf aus beliebigen Zeichen bestehen, + ausser Leerzeichen und Strichpunkt, und Groß-/Kleinschreibung spielt + keine Rolle. + + CMD = @ + + Definiert den Alias , der in die aktuelle Parameter-Einstellung + des Befehls expandiert wird. + + CMD = ? + + Erfragt vom Benutzer einen Namen zur Definition eines Aliases für + die aktuelle Parameter-Einstellung des Befehls. + + CMD = + + Öffnet den Dialog des Befehls und erlaubt es dem Benutzer einen + Satz von Parametern einzustellen, der als Alias unter dem angegebenen + Namen gespeichert wird. Im Falle des WINDOW-Befehls kann ein Rechteck + für die gewünschte Fläche aufgezogen werden. + + CMD = ; + + Löscht den Alias mit dem angegebenen Namen. + + CMD + + Expandiert den Alias mit dem angegebenen Namen und führt den Befehl + mit dem resultierenden Satz von Parametern aus. Der kann + abgekürzt werden und es dürfen andere Parameter vor und nach dem + Alias angegeben werden (auch andere Aliase). Beachten Sie bitte, + dass Aliase Vorrang vor anderen Schlüsselwörtern des Befehls haben. + + Beispiel: + + 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. Beachten Sie bitte die abgekürzte Verwendung des Aliases, + und dass die Groß-/Kleinschreibung keine Rolle spielt. + +* Negierte Namen: + + - Die Namen von negierten Signalen ("active low") können jetzt mit einem + Überstrich dargestellt werden. Hierfür muss dem Namen ein Ausrufezeichen + vorangestellt werden, wie in + + !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). + - Beim Update von Dateien aus früheren Versionen wird ein Backslash in einem + Pin-, Net-, Bus- oder Signalnamen durch ein entsprechendes Ausrufezeichen + ersetzt. Backslashes bzw. Ausrufezeichen in normalen Texten werden, soweit + nötig, durch Voranstellen eines Backslash ihrer Sonderfunktion beraubt, + da der Backslash in Texten jetzt als echtes "Fluchtsymbol" dient. + +* Zeichnungsrahmen: + + - Der neue Befehl FRAME kann benutzt werden um einen Rahmen mit nummerierten + Spalten und Zeilen zu zeichnen. + - Das neue User Language Objekt UL_FRAME erlaubt es, die Daten eines + Zeichnungsrahmens abzufragen. + - Die User Language Objekte UL_ELEMENT, UL_INSTANCE und UL_NET haben neue + Data-Members 'column' und 'row', welche die Position innerhalb eines + Zeichnungsrahmens liefern. + - Die Zeichnungsrahmen in der Bibliothek "frames" verwenden dieses neue + Rahmenobjekt. + +* Querverweis-Labels: + + - Ein "Label" an einem Netz-Segment hat jetzt eine neue Eigenschaft namens + "xref", mit der es in den "Querverweis"-Modus geschaltet werden kann. + In diesem Modus wird es gemäß dem unter "Format für Querverweis-Label" + in "Optionen/Einstellungen/Verschiedenes" angegebenen String dargestellt + und zeigt seinen Text etwas versetzt zu seinem Aufhängepunkt an, damit + man es passend am Ende eines Netz-Wires platzieren kann. + - Ein am Ende eines Netz-Wires platziertes Querverweis-Label verbindet sich + mit dem Wire, so dass der Wire sich mit dem Label mitbewegt und umgekehrt. + - Die Darstellung von Querverweis-Labels kann im Dialog + "Optionen/Einstellungen/Verschiedenes" unter "Format für Querverweis-Label" + definiert werden. Eine Liste der hierfür verwendbaren Platzhalter finden + Sie unter "Hilfe/Editor-Befehle/LABEL". + - Das User Language Objekt UL_SCHEMATIC hat ein neues Member 'xreflabel', + welches den Format-String liefert, der für die Darstellung von + Querverweis-Labels benutzt wird. + - Der SET-Befehl hat den neuen Parameter XREF_LABEL_FORMAT, mit dem das + Format für Querverweis-Labels definiert werden kann. + - Der CHANGE-Befehl hat die neue Option XREF, welche die Werte OFF und ON + annehmen kann und zum Umschalten eines Labels zwischen "einfach" und + "Querverweis" dient. + - Der LABEL-Befehl kennt die neue Option XREF, mit der ein Querverweis-Label + erzeugt werden kann. In der Parameter-Toolbar gibt es zwei neue Icons, + um diese Option einzustellen. + - In der User Language werden die Labels eines Segments (sowohl bei Bussen + als auch bei Netzen) jetzt durch das neue Objekt UL_LABEL angesprochen, + welches durch die neue Funktion UL_SEGMENT.labels() generiert wird. Die + bisherige Methode, die Labels mittels UL_SEGMENT.texts() anzusprechen, ist + "veraltet" und behandelt die Querverweis-Labels nicht richtig. Der Text + eines Labels wird jetzt von UL_LABEL.text geliefert. + +* Bauteil-Querverweise: + + - Der neue Platzhalter-Text '>XREF' kann in einer Symbol-Zeichnung benutzt + werden um einen Querverweis zum MUST-Gatter des Devices anzuzeigen, in dem + dieses Gatter verwendet wird. Eine typische Anwendung hierfür sind die + Kontakte eines Relais, bei denen der '>XREF' Platzhalter-Text die + Zeichnungsrahmen-Koordinaten der Relaisspule anzeigt. + - Die Darstellung von Bauteil-Querverweisen kann im Dialog + "Optionen/Einstellungen/Verschiedenes" unter "Format für + Bauteil-Querverweise" definiert werden. Eine Liste der hierfür + verwendbaren Platzhalter finden Sie unter "Hilfe/Editor-Befehle/TEXT". + - Der SET-Befehl hat den neuen Parameter XREF_PART_FORMAT, mit dem das + Format für Bauteil-Querverweise definiert werden kann. + +* Kontaktspiegel: + + - EAGLE kann jetzt automatisch einen "Kontaktspiegel" erzeugen, wie er + hauptsächlich für die Spulen und Kontakte von Relais in elektrischen + Schaltplänen benutzt wird. + - Der Kontaktspiegel wird für das erste MUST-Gatter eines Bauteils erzeugt + und stellt alle anderen Gatter dar, deren Symbolzeichnung den + Platzhaltertext '>XREF' enthält. Das MUST-Gatter ist typischerweise die + Spule eines Relais, während die anderen Gatter die Kontakte bilden. + - Der Kontaktspiegel wird an der selben X-Koordinate angezeigt wie das + MUST-Gatter, und an der durch den Platzhaltertext '>CONTACT_XREF' + definierten Y-Koordinate. Dieser Text kann entweder in einem + Zeichnungsrahmen-Symbol platziert werden oder direkt in der + Schaltplanseite. Der erste gefundene Text wird verwendet. Wird kein + solcher Text gefunden, so wird kein Kontaktspiegel erzeugt. + - Das User Language Objekt UL_INSTANCE hat ein neues Loop-Member namens + 'xrefs', welches durch die Gatter läuft die den Kontaktspiegel + darstellen. + +* ADD-Befehl: + + - Die Syntax des ADD-Befehls wurde verändert, damit Bibliotheken mit + Leerzeichen im Dateinamen verwendet werden können. Beachten Sie bitte, + dass der Device-, Package- bzw. Symbolname jetzt immer als erstes angegeben + werden muss. + +* ASSIGN-Befehl: + + - Auf dem Mac kennt der ASSIGN-Befehl jetzt die "Cmd" Zusatztaste. + +* BOARD-Befehl: + + - Der BOARD-Befehl hat jetzt einen Parameter, mit dem das Raster, in dem + die Bauteile beim Generieren des Boards platziert werden, definiert + werden kann, 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. + +* CHANGE-Befehl: + + - Der CHANGE-Befehl selektiert jetzt nur noch Objekte, die auch wirklich + die zu ändernde Eigenschaft besitzen. + - Wenn ein Objekt mit dem CHANGE-Befehl selektiert wird, so blinkt es jetzt + kurz um dem Anwender die Änderung anzuzeigen. + - CHANGE LAYER kann jetzt auch auf eine Gruppe angewendet werden. + - Die neue Option DISPLAY des CHANGE-Befehls kann dazu benutzt werden, den + Anzeige-Modus eines Attributes zu verändern. + - Die Optionen im CHANGE Popup-Menu sind jetzt alphabetisch sortiert. + - CHANGE TEXT akzeptiert jetzt die Eingabe des neuen Textes in der + Kommandozeile und erlaubt es diesen auf beliebig viele Text-Objekte oder + die aktuelle Gruppe anzuwenden. + - Der CHANGE-Befehl hat die neue Option XREF, welche die Werte OFF und ON + annehmen kann und zum Umschalten eines Labels zwischen "einfach" und + "Querverweis" dient. + +* CLASS-Befehl: + + - Der Mindestabstand zwischen Signalen unterschiedlicher Netzklassen kann + jetzt in Form einer Matrix angegeben werden, wodurch es Ihnen möglich ist, + für jede Kombination zweier Netzklassen (wie auch innerhalb einer + Netzklasse) einen separaten Wert hierfür festzulegen (siehe + "Hilfe/Editor-Befehle/CLASS"). + +* COPY-Befehl: + + - Der COPY-Befehl kann jetzt durch Klicken mit der rechten Maustaste eine + Gruppe kopieren. + +* DELETE-Befehl: + + - Der DELETE-Befehl kann jetzt Bauteile, Pads, Smds, Pins und Gatter per + Namen selektieren. Die Option SIGNALS zum Löschen aller Signale in einem + Board existiert nach wie vor, so dass, falls ein Bauteil mit dem Namen + SIGNALS gelöscht werden soll, dieser in einfache Hochkommas geschrieben + werden muß. + +* DISPLAY-Befehl: + + - DISPLAY-Befehl schaltet nicht mehr automatisch zugehörige Layer ein bzw. + aus, wenn der t/bPlace- oder Symbols-Layer umgeschaltet wird. + Der Parameter + + Option.DisplayRelatedLayers = "0" + + in der Datei ~/.eaglerc ist obsolet. + - Der DISPLAY-Befehl unterstützt jetzt "Aliase" für Parameter-Einstellungen + (siehe "Aliase für Befehls-Parameter"). + - Der DISPLAY-Befehl hat eine neue Option "Last", welche die Einstellungen + von vor dem letzten DISPLAY-Befehl wiederherstellt. + +* DRC-Befehl: + + - Der DRC meldet jetzt Wires in Versorgungs-Layern als Fehler wenn sie + Bestandteil eines Signals sind, das an irgend ein Pad oder SMD + angeschlossen ist. + - Der DRC prüft jetzt immer alle Signal-Layer, egal ob sie momentan + eingeblendet sind oder nicht. + - Der DRC meldet jetzt einen Fehler wenn ein Objekt im t/bPlace, t/bNames + oder t/bValues Layer mit einem Objekt im t/bStop Layer überlappt + (vorausgesetzt diese Layer sind aktiv wenn der DRC läuft). + - Der DRC meldet keine Objekte im Top- bzw. Bottom-Layer mehr, die mit + Objekten im t/bRestrict-Layer im selben Package überlappen. + - Der DRC unterscheidet jetzt zwischen Verletzungen des Mindestabstands + ("Clearance") und echten Überlappungen ("Overlap") zwischen Kupfer von + unterschiedlichen Signalen. + - Der Design-Regeln-Dialog markiert jetzt den Namen der Design-Regeln + mit einem Stern, wenn sie verändert wurden. + +* EDIT-Befehl: + + - Der EDIT-Befehl kann jetzt Schaltplanseiten einfügen und umsortieren. + - Das Umschalten zwischen Schaltplanseiten löscht jetzt nicht mehr den + Undo-Puffer. Wird eine Seite hinzugefügt, gelöscht oder verschoben, so + löscht dies aber nach wie vor den Undo-Puffer. + +* ERC-Befehl: + + - Die Ergebnisse des Electrical Rule Checks (ERC) werden jetzt in einem + Dialog angezeigt, bei dem ein Klick auf einen Eintrag das entsprechende + Ergebnis im Zeichenfenster graphisch markiert. + - Der Parameter Erc.SuppressAdditionalWarnings in der Datei ~/.eaglerc + ist obsolet. Fehler und Warnungen werden jetzt getrennt im ERRORS-Dialog + angezeigt. + - Der ERC prüft jetzt Bauteile mit benutzerdefinierbaren Werten auf das + Vorhandensein eines tatsächlichen Wertes. + - Der ERC warnt jetzt, wenn ein Input-Pin eines nicht verwendeten Gatters + offen ist. + - Der ERC warnt jetzt, wenn ein Netz aus mehreren Segmenten besteht und + eines oder mehrere davon nicht seine Zugehörigkeit zu einem größeren Netz + anzeigt (etwa durch ein Label, einen Bus oder einen Supply-Pin). + - Der ERC prüft jetzt, ob der Name eines Netz-Segments, das an einen Bus + angeschlossen ist, auch wirklich in diesem Bus enthalten ist. + - Der ERC warnt jetzt, wenn ein Pin an einem Netz angeschlossen ist, es + aber keine sichtbare Verbindung (etwa durch einen Netz-Wire, eine Junction + oder einen anderen Pin) gibt. + +* ERRORS-Befehl: + + - Wird der ERRORS-Befehl eingegeben ohne vorher einen ERC bzw. DRC gemacht + zu haben, so wird der jeweilige Test jetzt zuerst automatisch gestartet. + - Der ERRORS-Dialog erlaubt es dem Benutzer jetzt Meldungen als "gebilligt" + zu markieren, wodurch die Fehleranzeigen im Zeichenfenster unterdrückt + werden (Siehe "Help/Editor-Befehle/ERRORS"). + +* EXPORT-Befehl: + + - Das Default-Ausgabeformat für EXPORT IMAGE ist jetzt auf allen + Plattformen PNG (auf Windows war es bisher BMP). + +* GRID-Befehl: + + - Der GRID-Befehl unterstützt jetzt "Aliase" für Parameter-Einstellungen + (siehe "Aliase für Befehls-Parameter"). + - Der GRID-Dialog hat keinen "Last"-Button mehr, da diese Funktionalität + jetzt über das Button-Popup-Menü implementiert wird. Klicken Sie mit der + rechten Maustaste auf den GRID-Button um die "Last"-Funktion zu erreichen. + +* GROUP-Befehl: + + - Der GROUP-Befehl hat jetzt eine neue Option ALL, mit der eine Gruppe + definiert werden kann, die die gesamte Zeichnungsfläche einschließt. + - Der GROUP-Befehl kann jetzt mit der Shift- und Ctrl-Taste benutzt werden + um die Gruppe zu erweitern bzw. die Gruppenzugehörigkeit einzelner + Objekte zu invertieren. + +* HELP-Befehl: + + - Da Windows Vista das Windows Help Dateiformat nicht mehr unterstützt, + benutzt EAGLE nun auf allen Plattformen die gleiche HTML-formatierte + Hilfe. + - Das Hilfe-Fenster hat jetzt eine Eingabezeile für einen Suchtext, mit + dem erreicht werden kann, dass nur die Hilfeseiten angezeigt werden, die + den eingegebenen Text enthalten. + - Die Hilfe-Texte sind jetzt in einer einzelnen HTML-Datei pro Sprache + gespeichert. + +* INFO-Befehl: + + - Der INFO-Befehl kann jetzt Bauteile, Pads, Smds, Pins und Gatter per Namen + selektieren. + - Der INFO-Befehl zeigt jetzt den gleichen Dialog an wie die Option + "Eigenschaften" im Kontextmenü von Zeichnungsobjekten, und erlaubt auch + das Verändern der Objekt-Eigenschaften. + +* INVOKE-Befehl: + + - Wird im INVOKE-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 das + entsprechende Sheet gewechselt wird. + +* LABEL-Befehl: + + - Der LABEL-Befehl kennt die neue Option XREF, mit der ein Querverweis-Label + erzeugt werden kann. + - Der LABEL-Befehl erlaubt jetzt die textuelle Angabe der Orientierung des + Labels. + +* MIRROR-Befehl: + + - Der MIRROR-Befehl funktioniert jetzt auch mit Rechtecken. + - Der MIRROR-Befehl kann jetzt Bauteile, Pads, Smds und Pins per Namen + selektieren. + +* MOVE-Befehl: + + - Der MOVE-Befehl kann jetzt Bauteile, Pads, Smds, Pins und Gatter per Namen + selektieren. + - Der MOVE-Befehl kann jetzt eine Gruppe von Objekten von einer Seite eines + Schaltplans auf eine andere verschieben, ohne dabei das Board zu + verändern. + +* NAME-Befehl: + + - Der NAME-Befehl kann jetzt ein einzelnes Polygon umbenennen und es damit + von einem Signal in ein anderes verschieben. + - Der NAME-Befehl kann jetzt Bauteile, Pads, Smds, Pins und Gatter per Namen + selektieren. + +* PACKAGE-Befehl: + + - Der PACKAGE-Befehl verhält sich jetzt in Board- oder Schaltplan-Editor + genau so wie CHANGE PACKAGE. + +* PRINT-Befehl: + + - Der PRINT-Befehl hat eine neue Option namens FILE, mit der die Ausgabe + in eine Datei erfolgen kann. + - Der PRINT-Befehl kann jetzt PDF (Portable Document Format) Dateien + erzeugen. Diese Dateien können nach den darin enthaltenen Texten + durchsucht werden (solange dies nicht mit dem Vektor-Font dargestellt + werden). + - Der PRINT-Dialog zeigt jetzt eine Vorschau des zu druckenden Objekts. + - Der Vergrößerungsfaktor im PRINT-Befehl ist jetzt auf 0.001...1000 + begrenzt. + - Die Werte für die Kalibrierung beim Drucken sind jetzt auf 0.1...2 + begrenzt. + - Die vom Druckertreiber gelieferten Ränder werden jetzt auf das nächst + höhere Vielfache von 0.1mm aufgerundet. + +* RATSNEST-Befehl: + + - Der RATSNEST-Befehl ignoriert jetzt Wires in Versorgungs-Layern. + - Der RATSNEST-Befehl kann jetzt mit Signalnamen aufgerufen werden, um nur + die Luftlinien und Polygone von ausgewählten Signalen neu zu berechnen. + - Der RATSNEST-Befehl kann jetzt die Luftlinien von ausgewählten Signalen + ausblenden. + - Der RATSNEST-Befehl zeigt jetzt den Namen des gerade bearbeiteten Signals + in der Statuszeile an. + - Der RATSNEST-Befehl generiert jetzt Luftlinien für Objekte innerhalb + schraffierter Polygone, die durch das Raster der Schraffur fallen. + Thermal- und Annulus-Ringe innerhalb eines schraffierten Polygons, die + keinen soliden Kontakt zu den Polygon-Linien haben, werden nicht mehr + erzeugt. + - + +* REPLACE-Befehl: + + - Der REPLACE-Befehl funktioniert jetzt auch im Schaltplan. + +* RIPUP-Befehl: + + - Der RIPUP-Befehl hat eine neue Option '@' mit der alle oder ausgewählte + Polygone in ihren "Urzustand" verwandelt werden können. + - Der RIPUP-Befehl erlaubt jetzt Platzhalter in Signalnamen. + +* ROTATE-Befehl: + + - Der ROTATE-Befehl kann jetzt Bauteile, Pads, Smds und Pins per Namen + selektieren. + +* ROUTE-Befehl: + + - Die "Via-Layers" Combo-Box wurde aus der Parameter-Toolbar des + ROUTE-Befehls entfernt, da der ROUTE-Befehl das minimal nötige Via + für eine Verbindung immer automatisch ermittelt. + - Der ROUTE-Befehl kann jetzt Luftlinien über den Signalnamen selektieren. + - Der ROUTE-Befehl erlaubt es nicht mehr, in Versorgungs-Layern zu routen. + - Der ROUTE-Befehl mit gedrückter Ctrl-Taste kann jetzt den Routevorgang + auch an einem Via beginnen. + +* SET-Befehl: + + - Die neue SET-Variable CATCH_FACTOR legt fest, bis zu welchem Abstand vom + Cursor Objekte beim Anklicken mit der Maus berücksichtigt werden (siehe + "Help/Editor-Befehle/SET"). + - Die SET-Variable GRID_REDRAW hat keine Bedeutung mehr, wird aber aus + Gründen der Kompatibilität weiterhin toleriert. + - Der SET-Befehl kann jetzt die Popup-Menüs für Werte von Isolate, Spacing + und Miter konfigurieren indem die Isolate_Menu, Spacing_Menu und + Miter_Menu Arrays gesetzt werden. + - Der SET-Befehl hat den neuen Parameter XREF_LABEL_FORMAT, mit dem das + Format für Querverweis-Labels definiert werden kann. + - Der SET-Befehl hat den neuen Parameter XREF_PART_FORMAT, mit dem das + Format für Bauteil-Querverweise definiert werden kann. + +* SHOW-Befehl: + + - Der SHOW-Befehl funktioniert jetzt mit Platzhaltern. + - Der SHOW-Befehl hebt jetzt auch die einzelnen, zu einem Bus gehörenden + Netze hervor, wenn ein Bus ausgewählt wird. + - Der SHOW-Befehl akzeptiert jetzt eine Liste von Argumenten und hebt alle + entsprechenden Objekte hervor. + - Der SHOW-Befehl mit dem Namen eines einzelnen Gatters (wie IC1A, welches + das Gatter A des Bauteils IC1 ist) zeigt jetzt genau dieses Gatter an. + - Der SHOW-Befehl benutzt jetzt die Ctrl-Taste um die Hervorhebung des + selektierten Objekts zu invertieren. Dadurch lassen sich auch mehrere + Objekte gleichzeitig hervorgehoben darstellen. + +* SMASH-Befehl: + + - Der SMASH-Befehl kann jetzt Bauteile per Namen selektieren. + +* SPLIT-Befehl: + + - Der SPLIT-Befehl nimmt jetzt beim Absetzen eines gesplitteten Wires + sofort das nächste Wire-Segment auf. Dies ermöglicht ein leichteres + Neuverlegen eines bereits gerouteten Wires. + - Der SPLIT-Befehl funktioniert jetzt auch mit dem "Freihand" Knickwinkel. + +* TECHNOLOGY-Befehl: + + - Der TECHNOLOGY-Befehl verhält sich jetzt in Board- oder Schaltplan-Editor + genau so wie CHANGE TECHNOLOGY. + +* WINDOW-Befehl: + + - Der WINDOW-Befehl unterstützt jetzt "Aliase" für Parameter-Einstellungen + (siehe "Aliase für Befehls-Parameter"). + - Der WINDOW-Befehl hat eine neue Option "Last", welche die Einstellungen + von vor dem letzten WINDOW-Befehl wiederherstellt. + +* WIRE-Befehl: + + - 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. + +* CAM-Prozessor: + + - Der Name der Ausgabedatei im CAM-Prozessor kann jetzt mittels einiger + "Platzhalter" definiert werden (siehe "Help/Ausgabedaten erzeugen/CAM- + Prozessor/Ausgabedatei"). Die bisherige Variante mit ".ext" oder ".*#" + funktioniert zwar noch, ist aber veraltet. + - Die "Photoplotter" und "Drill Station" Info-Dateien beginnen jetzt mit + der fixen Zeile "Generated by EAGLE CAM Processor", gefolgt von der + EAGLE-Versionsnummer. + +* Autorouter: + + - Der Autorouter zeigt jetzt in der Statuszeile den Namen des gerade + bearbeiteten Signals und die Zeit (in Sekunden), die er bisher für eine + bestimmte Verbindung benötigt hat, an, wenn diese 5 Sekunden übersteigt. + +* Text-Editor: + + - Der "Finden&Ersetzen" Dialog des Text-Editors hat jetzt eine Option + "mit Rückfrage". + - Die Tastenkürzel im Text-Editor folgen jetzt den plattformspezifischen + Standards. + +* Polygone: + + - Beim Freirechnen von Signal-Polygonen werden runde Objekte jetzt so + abgezogen, dass der dabei entstehende Fehler 0.05mm (50 micron) nicht + übersteigt, was bedeutet, dass der Abstand zwischen einem Objekt und einem + generierten Polygon um bis zu 0.05mm größer sein kann als der für die + Clearance bzw. Isolation definierte Wert. Dies wird gemacht um die Anzahl + der Polygon-Ecken in einem vernünftigen Rahmen zu halten. + - Signalpolygone im "Urzustand" werden jetzt als gepunktete Wires + dargestellt, um sie von anderen Wires unterscheiden zu können. + - Das Freirechnen von Polygonen in Signalen, die auch andere Wires, Vias, + Pads oder SMDs enthalten, wurde korrigiert. Liegt keines dieser anderen + Objekte auf dem selben Layer wie das Polygon, wurde das Polygon + freigerechnet anstatt nur als Umrisse dargestellt zu werden. + WICHTIGER HINWEIS: Diese Korrektur kann dazu führen, dass Polygone, die + bisher freigerechnet wurden nun nicht mehr freigerechnet werden, und daher + beim Ausdruck oder in den CAM-Daten fehlen! Diese Polygone hatten kein + definiertes Potential, da sie nicht mit dem Rest des gleichnamigen Signals + verbunden waren. + +* Verschiedenes: + + - Die Enden von Wires und Arcs mit cap=round, sowie Pads mit der Form "long" + bzw. "offset" werden jetzt auf allen Ausgabegeräten rund dargestellt (keine + Näherung durch Achtecke mehr). + - Beim Bewegen einer Gruppe bleibt jetzt der Zusammenhang zwischen Wires, + Luftlinien und Vias auch dann erhalten, wenn einer der beteiligten Layer + ausgeblendet ist. + - Die maximale Verschachtelungstiefe in Konfigurationsdateien wurde erhöht, + um Probleme mit Autorouter-Kontrolldateien zu vermeiden, die eine große + Zahl von Optimierungsläufen definieren. + - Der Strichpunkt (';') ist jetzt in Objekt-Namen nicht mehr erlaubt, um + Probleme beim Parsen von Befehlseingaben zu vermeiden. + - Der Parameter Printer.InternalRendering in der Datei ~/.eaglerc + hat keine Bedeutung mehr. Das Drucken unter Windows sollte jetzt immer + funktionieren. + - Leerzeichen, die nach dem Fortsetzungszeichen '\' in Scriptdateien folgen, + werden jetzt ignoriert. + - Leerzeichen in Layer-Namen können nicht mehr eingegeben werden. + - Das Selektieren von Objekten mit nur einem einzigen Aufhängepunkt (wie + etwa Pads oder Vias) wurde verbessert. + - Die unterschiedlichen Sprachversionen werden jetzt alle auf einmal + installiert. Sprachspezifische Dateien werden durch Hinzufügen des + zweibuchstabigen Sprachcodes zu ihrem Namen unterschieden, wie etwa + README_de. Die DESCRIPTION-Dateien in Verzeichnissen speichern die + unterschiedlichen Sprachversionen zwischen den HTML-Tags + .... CAM-Prozessor- und Design-Rule-Dateien + unterscheiden verschiedene Sprachversionen ihrer Parameter indem + z.B. [de] zum Parameternamen hinzugefügt wird, wie in + Name[de]="Bestückungsseite". + - Die Positionen der Window-Splitter im Library-Editor werden jetzt für + jeden Zeichnungstyp getrennt abgespeichert. + - Wenn ein vom Benutzer eingegebener Layername oder Parameter-Alias + vollständig passt, so wird dieser gegenüber einem teilweise passenden + bevorzugt. Gibt es zum Beispiel zwei Layer mit Namen "Abcdef" und "Abc" + (in dieser Reihenfolge) und der Benutzer gibt "Ab" ein, so wird der erste + passende Layer "Abcdef" genommen. Gibt er dagegen "Abc" ein, so wird der + zweite, vollständig passende Layer genommen. + - Koordinaten und Abmessungen (z.B. Leiterbahnbreiten oder Pad-Durchmesser) + können jetzt mit Einheiten angegeben werden, wie etwa 50mil oder 0.8mm. + Wird keine Einheit angegeben, so wird die aktuelle Grid-Einheit verwendet. + - Der Info-Text für Bauteile (wie er von verschiedenen Befehlen, wie z.B. + SHOW und MOVE, angezeigt wird) gibt jetzt auch den Wert des Bauteils an. + - Einträge in den "Zuletzt geöffnet" Listen werden jetzt nur noch + hinzugefügt, wenn eine Datei tatsächlich von von der Platte geladen oder + auf diese gespeichert wurde. + - Beim Bewegen eines Netz- oder Bus-Labels wird jetzt eine Linie zum + nächstgelegenen Punkt des Segments gezeichnet, zu dem dieses Label gehört. + - Wenn ein Befehl eine Fortschrittsanzeige hat, so zeigt der Titel des + Fensters jetzt den aktuellen Prozentsatz an. + - Der Begriff "Rich Text" wurde in HTML geändert, um Verwechslungen mit + einem gleichnamigen Textformat von Microsoft zu vermeiden. + - Um Kreise, die eine im Vergleich zum Radius große Breite haben, besser + selektieren zu können, können diese jetzt nicht mehr nur an ihrem Radius, + sondern auch an ihrer inneren und äußeren Kante selektiert werden. + - Die Professional-Edition kann jetzt bis zu 999 Schaltplanseiten + verarbeiten. + - EAGLE kann jetzt automatisch prüfen, ob auf dem CadSoft-Server eine + neue Programmversion zur Verfügung steht. Sie können diese Prüfung auch + explizit über "Hilfe/Auf Update prüfen" ausführen. + - Der Projekte-Pfad unter Windows enthält jetzt auch "$HOME\eagle" um dem + Anwender ein Default-Verzeichnis zum Speichern eigener Projekte zu bieten. + - Die neue Kommandozeilen-Option -C kann benutzt werden, um EAGLE mit einer + Befehlszeile zu starten, die im Editor-Fenster ausgeführt wird (siehe + "Hilfe/Kommandozeilen-Optionen"). + - Das Zentrieren auf Fehler funktioniert jetzt auch, wenn der Fehler nahe + am Rand der Zeichnung liegt. + - Dezimalzahlen können jetzt mit Komma als Dezimal-Trennzeichen eingegeben + werden (falls die landesspezifischen Einstellungen dies erlauben). Es wird + jedoch dringend empfohlen, in Scripts und ULPs, welche EAGLE-Befehle über + die exit()-Funktion zurückliefern, den Punkt als Dezimal-Trennzeichen zu + verwenden, da diese ansonsten auf anderen Systemen eventuell nicht + lauffähig sind. + - Der Device-Editor zeigt jetzt an den Aufhängepunkten der Gatter Kreuze + an. + - Die neuen Schaltplan-Layer "Info" (97) und "Guide" (98) können für + allgemeine Informationen bzw. Hilfslinien verwendet werden. Letztere sind + vor allem für Elektro-Schaltpläne gedacht, als Hilfe zur Ausrichtung von + Relaisspulen etc. + +* Fehlerbehebungen: + + - Ein möglicher Verlust der Konnektivität beim Verschwinden eines Wires + (da beide Enden zusammenfallen) beim Bewegen einer Gruppe und anschließendem + nochmaligen Bewegen der selben Gruppe wurde behoben. + - Ein möglicher Absturz beim Bewegen einer Gruppe, die Supply-Pins enthält, + welche dadurch auf ein Netz zu liegen kommen, das einen anderen Namen hat + und ebenfalls in der Gruppe enthalten ist, wurde korrigiert. + - Ein möglicher ungerechtfertigter Fehler "nicht angeschlossene Wires in der + Nähe von..." im ERC wurde korrigiert. + - Die Prüfung auf '$' am Anfang des Layer-Namens im Dialog + "Layer-Eigenschaften ändern" wurde korrigiert. + - Die Behandlung leerer Texte beim DRC und beim Freirechnen von Polygonen + wurde korrigiert. + - Der LAYER-Befehl kann nicht mehr auf einen Layer schalten, der nicht im + Layer-Menü enthalten ist. + - Das Löschen des gerade editierten Device-Sets aus einem Script heraus + wurde korrigiert. + - Das Ignorieren der Groß-/Kleinschreibung bei der Behandlung von Layer-Namen + im DISPLAY-Dialog wurde korrigiert. + - Ein Problem mit temporären Dateien für den Fall, dass der gleiche Benutzer + mehrere Instanzen von EAGLE auf dem gleichen Rechner laufen lässt, wurde + behoben. + - Die Behandlung von HTML-Tags in Fehlermeldungen in der Statuszeile des + Text-Editors wurde korrigiert. + - Die Zuweisung an UL_*-Objekte für "virtuelle" Objekte, wie etwa die Wires + eines brechneten Polygons oder eines Textes mit Vektor-Font, wurde + korrigiert. + - Der Update von Dateien vor Version 4.0 wurde korrigiert (manchmal wurden + doppelte Bibliotheksnamen in alten Dateien nicht richtig erkannt). + - Die #require Direktive in der User Language hat Release- und + Revision-Nummern größer oder gleich 50 nicht richtig behandelt. + - Die Behandlung von Koordinatenangaben im DRC-Befehl wurde korrigiert. + - Die Behandlung von Kreisen mit Width/2 > Radius im Autorouter wurde + korrigiert. + - Beim Routen von Boards mit einem einzelnen Signal-Layer und einem + Supply-Layer setzt der Autorouter keine Vias mehr an Orten, wo dies + nicht möglich ist. + - Der Library-Update für den Fall, dass die Library Package-Varianten nicht + mehr enthält, die im Schaltplan zwar vorhanden, aber nicht verwendet sind, + wurde korrigiert. + +Freigabemitteilung für EAGLE 4.16r2 +=================================== + +* Fehlerbehebungen: + + - Das Erzeugen von Bitmaps mit dem EXPORT IMAGE Befehl, die in einer + Richtung deutlich länger sind, wurde korrigiert. + - Die Behandlung der Netzklasse beim Umbenennen eines Netzsegmentes in einen + neuen Namen wurde korrigiert. + - Ein Absturz beim Klicken in die leere Fläche des Technologies-Dialogs + wurde behoben. + - Ein 'Internal polygon error 73' für den Fall, dass in einem Board, das + SMDs mit einer Roundness ungleich 0 enthält, weit hineingezoomt wird, + wurde behoben. + +Freigabemitteilung für EAGLE 4.16r1 +=================================== + +* Fehlerbehebungen: + + - Die Behandlung von '\' im UNC Programmnamen unter Windows XP für den Fall, + dass das Programm auf einem Server installiert ist, wurde korrigiert. + - Die Behandlung der ESCape-Taste in ULPs mit verschachtelten Dialogen + wurde korrigiert. + - Die Behandlung the Programmnamens unter Windows für den Fall, dass er mit + ".\" beginnt, wurde korrigiert. + - Die Behandlung von deutschen Umlauten in den User Language Funktionen + strupr(), strlwr(), toupper() und tolower() unter Windows und Mac OS X + wurde korrigiert. + - Das Setzen des ausgewählten Objektes im Control Panel Tree bei Drag&Drop + eines Packages in eine Bibliothek für den Fall, dass es auch ein Device + Set mit dem selben Namen gibt, wurde korrigiert. + - Das unerwartete Auftreten von Luftlinien für den Fall, dass ein offener + Pwr-Pin an ein Netz mit dem gleichen Namen angeschlossen wird, oder dass + ein Supply-Pin mit dem gleichen Namen auf einen offenen Pwr-Pin gesetzt + wird, wurde behoben. + - Das Drucken von gedrehten oder gespiegelten Texten unter Linux und + Max OS X wurde korrigiert. + - Die Behandlung von Groß- und Kleinbuchstaben beim Lizenzieren auf einem + Server unter Windows wurde korrigiert. + - Die Behandlung des höchstwertigen Bytes der Palette-Werte in der eaglerc + Datei wurde korrigiert. + - Die Behandlung von Polygonen mit nur zwei Kanten, wobei eine der Kanten + ein Arc ist, wurde korrigiert. + +Freigabemitteilung für EAGLE 4.16 +================================= + +* Fehlerbehebungen: + + - Die CUT/PASTE Operation für Netzklassen wurde korrigiert (nur die ersten + beiden wurden bisher tatsächlich kopiert). + - Die Behandlung des Bibliotheksnamens nach "Speichern unter" wurde + korrigiert (war falsch im Description-Editor). + - Der CHANGE PACKAGE/TECHNOLOGY Befehl wurde korrigiert für den Fall, dass + ein Device mehr als 254 Technology-Varianten enthält (was durch eine + fehlende Prüfung im Technology-Dialog des Device-Editors möglich war). + - Der Technology-Dialog des Device-Editors wurde korrigiert, so dass er nicht + mehr als 254 Technologies pro Package-Variante akzeptiert. + - Eine mögliche Daten-Verfälschung für den Fall, dass ein Supply-Pin einen + Netznamen überschreibt, wurde behoben. Übriggebliebene Pin-Referenzen, + die durch eine solche Daten-Verfälschung entstehen konnten, werden + automatisch beim nächsten Library-Update entfernt. + - Ein unerwarteter "Cancel"-Button in einigen Dialogen wurde entfernt. + - Die Generierung von Annulus-Symbolen für Pads, bei denen das NOTHERMALS + Flag gesetzt ist, wurde korrigiert. + - Ein fehlerhaftes Splitten von Arcs nahe ihren Endpunkten wurde korrigiert. + - Ein Rundungsfehler bei der Behandlung von Rechteck-Koordinaten und dem + "curve" Parameter von Wires wurde behoben. + - Das Bewegen eines gespiegelten Bauteils mit Polygonen im Board wurde + korrigiert (Polygone wurden im falschen Layer dargestellt). + - Fälschlicherweise ausgegebene "Change Class..." Zeilen in EXPORT NETLIST + im Schaltplan wurden korrigiert. + - Ein Problem bei der Ermittlung des Programm-Verzeichnisnamens für den + Fall, dass die Konsolen-Version von EAGLE unter Windows XP ohne + vollständigen Pfadnamen aufgerufen wurde, wurde behoben. + - Ein möglicher Absturz beim Abbruch der Konsolen-Version von EAGLE unter + Windows XP mittels Ctrl+C wurde behoben. + - Das Laden einer Textdatei unter Windows XP wurde korrigiert (die Datei + konnte nicht editiert werden, obwohl sie im Dateisystem schreibbar war). + - Das Abspeichern der Undo-Daten bei einem Library-Update für den Fall, + dass sich die Reihenfolge der Gatter in einem Device geändert hat, wurde + korrigiert. Wurde nach einem solchen Update UNDO gefolgt von REDO gemacht, + so konnte es vorkommen, dass einige Gatter des Bauteils vertauscht wurden. + +Freigabemitteilung für EAGLE 4.15 +================================= + +* Fehlerbehebungen: + + - Der CHANGE PACKAGE Befehl aktualisiert jetzt das Package im Board auf den + Stand des Schaltplans, um Probleme zu vermeiden, falls bei geschlossenem + Schaltplan ein REPLACE gemacht wurde. + - Der Zugriff auf die einzelnen Characters eines Strings in ULPs unter Mac + OS X wurde korrigiert. + - Der COPY-Befehl aktualisiert jetzt das Package im Board auf den Stand des + Schaltplans _bevor_ das kopierte Bauteil tatsächlich hinzugefügt wird, um + Probleme zu vermeiden, falls bei geschlossenem Schaltplan ein REPLACE + gemacht wurde. + - Der Library-Update meldet nun auch dann eine Veränderung des Boards, wenn + es sich lediglich um die Umbenennung einiger Packages handelt, die durch + einen vorhergegangenen REPLACE bei geschlossenem Schaltplan verursacht + wurde. + - Die Behandlung von leeren Strings in dlgListView wurde korrigiert. + - Das Löschen der Selektion in dlgListView wurde korrigiert. + - Das Setzen der benutzerdefinierten Defaultwerte für die Design Rules beim + Laden einer existierenden Library-Datei aus einem Projekt heraus wurde + korrigiert. + - Das Auftauchen einer überflüssigen Linie beim Schließen einer leeren Gruppe + mit der rechten Maustaste wurde korrigiert. + - Ein möglicher Absturz in UL_WIRE.pieces() wurde behoben. + - Die Cursor-Positionierung nach einer Fehlermeldung in einem ULP im Kontext + eines Loop-Members wurde korrigiert. + +Freigabemitteilung für EAGLE 4.14 +================================= + +* CAM-Prozessor: + + - Die Auflösung des EXCELLON-Treibers wurde auf 1/10000 Inch erhöht. + - Automatisch generierte Drill-Codes werden jetzt nach dem Bohrerdurchmesser + sortiert. + +* User Language: + + - Das User Language Objekt UL_PIN hat ein neues Member 'net', welches den + Namen des Netzes liefert, an dem der Pin angeschlossen ist. + +* Fehlerbehebungen: + + - Ein ungerechtfertigtes Auftrennen gerouteter Verbindungen beim Anschluss + eines Pins oder Netz-Segments an ein Supply-Netz das aus mehr als einem + Segment besteht wurde behoben. + - Die Fortschrittsanzeige für den Fall, dass ein Script aus einem ULP heraus + über dessen exit()-Funktion aufgerufen wird, wurde korrigiert. + - Das Setzen eines Vias im ROUTE-Befehl für den Fall, dass der platzierte + Wire mit einem bereits existierenden Wire zusammenfällt, wurde korrigiert. + - Ein möglicher Absturz beim Kopieren eines Device-Sets von einer Bibliothek + in eine andere wurde korrigiert. + - Die Behandlung von '>SHEET' in ULPs wurde korrigiert (der Fix in Version + 4.13r1 war fehlerhaft). + - Die Definition einer Gruppe, die Vias enthält, für den Fall, dass die Farbe + des Vias-Layers auf 0 gesetzt ist, wurde korrigiert. + - Das Neuzeichnen aller Signal-Layer für den Fall, dass der Pads- oder Vias- + Layer eingeblendet wird und die Farbe 0 hat, wurde korrigiert. + - UL_CONTACT.signal wurde korrigiert für den Fall, dass es in einem UL_PART + Kontext verwendet wird. + - Das Zeichnen von Arcs mit einer Breite von einem Pixel beim Hineinzoomen + wurde korrigiert. + - Die Behandlung von unsortierten dlgListView Objekten in User Language + Programmen wurde korrigiert (die Elemente wurden in umgekehrter Reihenfolge + dargestellt). + - Eine ungerechtfertigte Fehlermeldung bzgl. eines fehlenden Rückgabewertes + für den Fall, dass eine User Language Funktion mit exit() verlassen wurde, + wurde behoben. + - Die Behandlung von Arrays von UL_*-Objekten in User Language Programmen + wurde korrigiert. + - Die Behandlung der eagle.key Datei für den Fall, dass das Programm über einen + UNC-Pfad unter Windows gestartet wurde, wurde korrigiert (es kann sein, dass + Sie nach Ihrer license.key-Datei gefragt werden, wenn Sie diese Version das + erste mal unter Windows starten; Benutzer der Freeware-Edition sollten die + Datei 'eagle.key' aus ihrem EAGLE-Binär-Verzeichnis löschen bevor sie + EAGLE starten, um erneut die Freeware-Lizenz angeboten zu bekommen). + - Der ASSIGN-Befehl wurde korrigiert (wenn der allererste ASSIGN-Befehl in + der Kommandozeile eingegeben wurde, wurden alle Default-Tastenbelegungen + gelöscht). + - Die Behandlung von mit ASSIGN definierten Tasten, die voll ausgeschriebene + Befehle enthalten, welche in einem der Pulldown-Menüs vorkommen, wurde + korrigiert. + - Der CLASS-Befehl wurde korrigiert für den Fall, dass der Name der Netzklasse + vor der Nummer angegeben wird. + - Die Darstellung gespiegelter Texte in einem Schematic nach einem PASTE aus + einem Board wurde korrigiert. + - Die Behandlung von 'char' Variablen in ULPs unter Mac OS X wurde korrigiert. + - Ein fälschlicherweise in Version 4.13r1 eingefügtes '%n' in den + *.cam-Dateien wurde korrigiert. + +Freigabemitteilung für EAGLE 4.13r1 +=================================== + +* DRC-Befehl: + + - Der Parameter "Stop after ... errors" wurde von der "Misc"-Seite des + Design Rules Dialogs entfernt. Dieser Parameter führte manchmal dazu, + dass Boards nicht komplett geprüft wurden und der Anwender die + Statusmeldung "DRC: Vorgegebene Fehlergrenze erreicht - xx Fehler" nicht + beachtet hat, welche angibt, dass die Prüfung nicht vollständig + durchgeführt wurde. + Der 'maxErrors' Parameter in *.dru Dateien wird zwar noch akzeptiert, hat + aber keine Bedeutung mehr. In einer mit dieser Version von EAGLE erzeugten + Board-Datei wird der 'maxErrors' Parameter auf 999999 gesetzt, so dass eine + ältere Version, die diese Datei lädt, einen vollständigen DRC durchführt. + +* Verschiedenes: + + - Die Standard-Funktionstastenbelegung wird jetzt nur noch zugewiesen, wenn + keine Tastenbelegung durch den Benutzer erfolgte. + - Falls eine Library beim Laden im ADD-Befehl eine Fehlermeldung erzeugt, + wird sie jetzt automatisch aus der Liste der benutzten Libraries entfernt. + - Die Erkennung des Click&Drag Modus bei einer Auswahl in einem dicht + belegten Gebiet wurde verbessert. + - Unter Linux wird die libstdc++ Bibliothek jetzt statisch gelinkt, um + Probleme mit inkompatiblen Versionen zu vermeiden. + +* Fehlerbehebungen: + + - Das Löschen eines blockierten Wires für den Fall, dass + Cmd.Delete.WireJointsWithoutCtrl gesetzt ist, wurde korrigiert. + - Die Behandlung des Namens der Bohrerdatei in einem existierenden + Excellon CAM-Job bei Umschaltung auf ein anderes Device wurde + korrigiert. + - Ein möglicher "internal polygon error 73" beim Zeichnen eines sehr breiten + oder sehr hohen Rechtecks wurde korrigiert. + - Die Darstellung von Rechtecken und Kreisen wurde korrigiert (sie wurden + eine Editor-Einheit zu klein dargestellt). + - Die Behandlung von CUT/PASTE für teilweise selektierte Polygone in + Symbolen und Packages wurde korrigiert. + - In ULPs wurde die Behandlung von Variablennamen, die so heissen wie der Name + eines Objekt-Members, innerhalb eines Member-Funktionsaufrufes, der einen + Index verlangt, korrigiert. + - Die Meldung fehlender Blenden im GERBER-Device für gedrehte, nicht runde + Pads und SMDs im Falle ausgeschalteter Blendenemulation wurde korrigiert. + - Die Berechnung des Umschließenden Rechtecks nach dem Editieren eines Symbols + wurde korrigiert (Fehler wurde in Version 4.12r06 eingebaut). + - Das Zurücksetzen des Signalnamens nach dem Zeichnen eines Polygons wurde + korrigiert. + - Ein möglicher Absturz im ROUTE-Befehl wurde behoben, wenn beim Absetzen + eines Wires eine Fehlermeldung auftrat, dass ein Via nicht gesetzt werden + konnte, und das Editor-Fenster neu gezeichnet werden musste (entweder, + weil die Fehlermeldung bewegt wurde oder weil ein anderes Fenster das + Editor-Fenster überdeckt hatte). + - Die Behandlung von '>SHEET' in ULPs wurde korrigiert. + - Das Füllen von großen, gedrehten Rechtecken im CAM-Prozessor für Devices + wie GERBER wurde korrigiert. + - Ein ungerechtfertigter DRC-Fehler bezüglich der Breite von sehr kurzen + Arcs mit runden Enden wurde behoben. + - Die Behandlung des Pfad-Trennzeichens für $HOME und $EAGLEDIR unter Windows + wurde korrigiert um sicherzustellen, dass Verzeichnisnamen in ULPs immer + durch "Forward-Slashes" ('/') getrennt sind, was wichtig ist um + plattformunabhängig zu sein. + - Das Exportieren von PAD- und SMD-Daten in Library-Scripts wurde korrigiert + (die Flags fehlten). + +Freigabemitteilung für EAGLE 4.13 +================================= + +* Plattformen: + + - EAGLE läuft jetzt auch auf Mac OS X (mit X11). Details zu den + Systemvoraussetzungen finden Sie in der README-Datei. + +* Versorgungs-Layer: + + - Ein Hinweis bezüglich der Größe der in Versorgungs-Layern verwendeten + Annulus-Symbole wurde zur Online-Help-Seite des LAYER-Befehls hinzugefügt. + +* User Language: + + - Das Beispiel in der Online-Hilfe zu 'dlgLabel' wurde korrigiert. + +* BOARD-Befehl: + + - Der BOARD-Befehl platziert jetzt Bauteile im dritten bzw. vierten + Quadranten des neu angelegten Boards, falls es zu viele davon gibt + um sie im zweiten Quadranten unterzubringen. + +* DRC-Befehl: + + - Der DRC prüft Polygone in Packages nicht mehr gegen andere Objekte ohne + elektrisches Potential auf Clearance-Fehler. + +* VIA-Befehl: + + - Wird ein Via an einer Stelle platziert, an der ein SMD liegt, das an ein + Signal angeschlossen ist, so wird das Via nun automatisch zu diesem + Signal hinzugefügt. + +* Verschiedenes: + + - Bei aktiver Forward-/Back-Annotation sind jetzt alle Operationen im Board, + die zwei Signale verbinden und zur Zusammenfassung von zwei Netzen im + Schaltplan führen würden, verboten und müssen im Schaltplan ausgeführt + werden. + - Die Standardeinträge in den Menüs für Bohrdurchmesser wurden auf metrische + Werte geändert. + - Es ist jetzt möglich so weit in eine Zeichnung hineinzuzoomen, dass die + interne Editor-Auflösung (0.1 micron) sichtbar wird. Der Schalter + "Optionen/Benutzeroberfläche/Zoomfaktor limitieren" ist zwar noch vorhanden + und standardmäßig aktiviert, es erfolgt aber keine Warnung mehr wenn er + deaktiviert wird. Unter "Help/Editor-Befehle/WINDOW" finden Sie Hinweise + auf einige Besonderheiten, die beim sehr starken Hineinzoomen auftreten + können. + - Wenn EAGLE unter Linux bzw. Mac OS X als User 'root' läuft (was nur für + die Lizenzierung notwendig ist und im normalen Betrieb vermieden werden + sollte), so wird der "Projekte"-Pfad nicht mehr gesetzt, um eine + Popup-Meldung beim Programmstart zu vermeiden. Des weiteren wird dann auch + die Datei ~/.eaglerc nicht mehr geschrieben. + - Das Öffnen des Menüs "Datei/Öffnen/Project" im Control-Panel für den Fall, + dass es sehr viele Verzeichnisse gibt, die kein EAGLE-Projekt enthalten, + wurde verbessert. + - Koordinaten werden nicht mehr auf das aktuelle Grid gesnappt, wenn sie + textuell mit dem '>'-Modifier eingegeben werden, wie etwa (> 1 2). + +* Fehlerbehebungen: + + - Die Behandlung sehr kurzer Wires im ERC bei der Prüfung, ob Net-Wires nur + scheinbar verbunden sind, wurde korrigiert. + - Eine manchmal auftretende, ungerechtfertigte Fehlermeldung "Kann das Fenster + nicht schließen während ein Befehl ausgeführt wird!" wurde behoben. + - Das automatische Routen hin zu einem Arc wurde korrigiert (es konnte + vorkommen, dass das letzte generierte Wire-Stück an einer ganz anderen + Stelle endete). + - Das Laden von bildschirmfüllenden Fenstern, die nicht maximiert sind, aus + einem Projekt heraus unter Windows wurde korrigiert. + - Ein Versatz beim Laden von Fenstern aus einem Projekt unter Linux wurde + behoben. + - Ein Fehler in den Fensterkoordinaten beim Laden von maximierten Fenstern + aus einem Projekt unter Windows wurde behoben. + - Ein möglicher Absturz bei der Ausführung von 'WINDOW (@);' nach einem PRINT + unter Windows wurde behoben (trat nur bei manchen Druckertreibern auf). + - Der DRC LOAD Befehl für den Fall, dass der Dateiname nicht absolut ist und + die Datei nicht im aktuellen Verzeichnis liegt wurde korrigiert. + - Die Behandlung von Dateinamen in der "Zuletzt geöffnet" Liste auf Systemen + die die Groß-/Kleinschreibung bei Dateinamen nicht unterscheiden (Windows) + wurde korrigiert. + - Ein seit Version 4.11r04 bestehendes Problem beim Belegen von + Funktionstasten wurde behoben. + - Die Darstellung von Pads und Vias beim Bewegen auf weissem oder farbigem + Hintergrund wurde korrigiert. + - Das Öffnen von Dateien in ULPs mit dem output() Statement für den Fall, + dass der Dateiname Großbuchstaben enthält, wurde korrigiert. + - Das Löschen eines Bauteils im Schaltplan mit Shift+DELETE für den Fall, dass + dieses Gatter auf anderen Seiten enthält, wurde korrigiert (diese anderen + Gatter wurden auch auf der aktuellen Seite gezeichnet wenn UNDO gemacht + wurde). + - Das Freirechnen der Polygone wurde korrigiert (der CAM-Prozessor lieferte + bei aufeinanderfolgenden Aufrufen mit der selben Board-Datei leicht + unterschiedliche Ergebnisse; diese Unterschiede betrugen maximal die + Maschinenauflösung, was in der Praxis keine negativen Folgen hatte). + - Da die Befehle RATSNEST und DRC zu falschen Ergebnissen führen können, + wenn sich in einer Zeichnung ungültige Polygone in den Layern Top...Bottom, + t/bRestrict, t/bKeepout oder Dimension befinden, werden solche Polygone + jetzt als Fehler gemeldet (ein Polygon ist ungültig, wenn sich zwei oder + mehrere seiner Kanten schneiden). + - Das Sichtbar-Halten der gewählten Package-Variante in der Liste der + Package-Varianten des Device-Editors wurde korrigiert. + - Die Behandlung der Liste der zuletzt geöffneten Dateien für neu aus einem + Schaltplan generierte Board-Dateien wurde korrigiert. + - Die Layer-Auswahl in CAM-Jobs wurde korrigiert (Änderungen gingen verloren + wenn eine Zeichnung geladen oder eine neue Section angelegt wurde ohne + vorher den geänderten CAM-Job abzuspeichern). + +Freigabemitteilung für EAGLE 4.12 +================================= + +* Autorouter: + + - Der Autorouter läuft jetzt optional auch dann, wenn ein Signal-Layer, der + Objekte enthält, nicht aktiviert ist. + - Beim Routen von einem Pad, welches mehrere Rasterpunkte belegt, versucht + der Autorouter jetzt, den Wire in der Mitte des Pads zu verlegen. + - Der Autorouter wendet jetzt den Parameter cfSmdImpact auch bei SMDs an, + die in Wnkeln von 45, 135, 225 oder 315 Grad platziert wurden. + +* CAM-Prozessor: + + - Der CAM-Prozessor hat jetzt auch ein "File/Open recent"-Menü. + - Der CAM-Prozessor gibt jetzt immer alle Vias (auch "blind" oder "buried") + aus wenn der Vias-Layer aktiv ist, aber keiner der Layer 1..16 aktiv ist. + - Im "Photoplotter Info File" des CAM-Prozessors wurde ein Hinweis bezüglich + fehlender Blenden, die in nicht orthogonalen Winkeln angefordert wurden, + hinzugefügt. + - Der CAM-Prozessor deselektiert nicht mehr alle Layer wenn man in einen + leeren Bereich der "Layers"-Liste klickt. + - Beim Füllen von Polygonen mit Postscript lässt der CAM-Prozessor die Linien + jetzt etwas überlappen um Lücken auf manchen Ausgabegeräten zu vermeiden. + - Das EXCELLON-Device im CAM Prozessor schreibt jetzt die verwendeten + Bohrer-Durchmesser in die Ausgabedatei, so dass Sie keine Bohrer-Konfigurations- + datei ("drill rack") mehr an den Leiterplattenhersteller zu schicken + brauchen. Falls Sie dieses Feature nicht wollen, können Sie es dadurch + abschalten, dass Sie in der Datei eagle.def die Zeile + + DrillSize = "%sC%0.4f\n" ; (Tool code, tool size) + + löschen oder auskommentieren. + - Das EXCELLON-Device im CAM Prozessor generiert jetzt die Bohrer-Konfiguration + automatisch gemäß den in der Boarddatei verwendeten Größen, so dass Sie keine + Bohrer-Konfigurationsdatei ("drill rack") mehr benötigen. Falls Sie dieses + Feature nicht wollen, können Sie es dadurch abschalten, dass Sie in der + Datei eagle.def die Zeile + + AutoDrill = "T%02d" ; (Tool number) + + löschen oder auskommentieren. Existierende CAM-Jobs, in denen eine + Bohrer-Konfigurationssdatei angegeben ist, verwenden diese weiterhin. + - Das Device EXCELLON_RACK wurde eingeführt um die alte Funktionalität mit + vom Benutzer definiertem Rack-File zur Verfügung zu stellen. + - Der neue Parameter BeginData für Bohrstationen kann dazu benutzt werden, + einen String zu definieren, der vor den eigentlichen Bohrdaten ausgegeben + wird (das EXCELLON-Device gibt jetzt hier '%' aus). + - M48 und M72 wurde zum EXECELLON Init-String hinzugefügt. + +* Control-Panel: + + - Das Control-Panel hat jetzt eine neue Option "File/Open recent projects". + +* Design Rules: + + - Die maximale Kupferstärke im Layer-Setup der Design Rules wurde auf + 1mm erhöht. + +* User Language: + + - Die neue User Language Funktion language() kann dazu benutzt werden, ULPs + zu internationalisieren (siehe "Help/User Language/Builtins/Builtin- + Functions/Sonstige Funktionen/language()"). + - Die User Language Direktive #usage kann jetzt internationalisierte Texte + handhaben (siehe "Help/User Language/Syntax/Direktiven/#usage"). + - Die neue User Language Direktive #require kann dazu benutzt werden dem + Benutzer mitzuteilen, dass ein ULP mindestens die angegebene EAGLE-Version + benötigt (siehe "Help/User Language/Syntax/Direktiven/#require"). + +* ADD-Befehl: + + - Die Bedeutung der Platzhalter ('*' and '?') im ADD-Befehl wurde geändert. + Sie standen bisher für [a-z0-9_] und stehen jetzt für jedes sichtbare + Zeichen. + - Der ADD-Dialog hat jetzt eine Checkbox über die die Pattern-Suche in den + Description-Texten abgeschaltet werden kann. + +* DELETE-Befehl: + + - Der DELETE-Befehl vereinigt jetzt zwei Wires zu einem Wire wenn er, mit + gedrückter Ctrl-Taste, auf deren Verbindungspunkt angewendet wird. Falls + Sie diese Funktionalität haben wollen ohne die Ctrl-Taste zu drücken, können + Sie die Zeile + + Cmd.Delete.WireJointsWithoutCtrl = "1" + + ans Ende der Datei ~/.eaglerc anfügen. + +* DRC-Befehl: + + - Die neuen Optionen LOAD und SAVE im DRC-Befehl können dazu verwendet werden + die Design Rules von einer Datei zu laden bzw. sie in diese zu speichern. + - Der DRC prüft Objekte ohne elektrisches Potential (wie Wires in Packages, + Rechtecke, Kreise und Texte) nicht mehr gegeneinander auf Clearance-Fehler. + - Der DRC-Dialog hat jetzt einen 'Check'-Button anstatt 'OK'. + +* EXPORT-Befehl: + + - Der EXPORT IMAGE-Befehl kann jetzt TIFF-Dateien erzeugen. + +* INFO-Befehl: + + - Der INFO-Befehl zeigt jetzt auch die Daten des Bauteils an, wenn er auf + einen Text eines gesmashten Bauteils angewendet wird. + +* MITER-Befehl: + + - Die Defaultwerte für den "Miter-Radius" wurden auf typische Raster-Werte + geändert. + +* MOVE-Befehl: + + - Beim Bewegen eines Textes eines gesmashten Bauteils wird jetzt eine Linie + zum Aufhängepunkt des Bauteils gezeichnet, damit der Benutzer sehen kann, + zu welchem Bauteil der Text gehört. + +* NET-Befehl: + + - Beim Zeichnen einer Net-Linie, die zwei Segmente unterschiedlicher Netze + verbindet, wurde die Frage "Connect Nets?" nach "Connect Net Segments?" + geändert um zu verdeutlichen, dass nur die beiden beteiligten Segmente + betroffen sind und nicht die gesamten Netze. + +* PRINT-Befehl: + + - Der gewählte Drucker, die Papiergröße und Orientierung werden jetzt auch + unter Windows gespeichert und wiederhergestellt. + +* RATSNEST-Befehl: + + - Unnötige Thermal-Stummel, die beim Berechnen von Signal-Polygonen an Pads, + Vias oder Smds entstehen konnten, werden jetzt vermieden. Beachten Sie + bitte, dass es durch diese Änderung Fälle geben kann, in denen ein Pad, Via + oder Smd, welches bisher als an das Polygon angeschlossen galt, nun nicht + mehr als angeschlossen gesehen wird und der RATSNEST-Befehl dann eine + Luftlinie generiert. + + ACHTUNG: Wenn Sie eine mit dieser EAGLE-Version erstellte Board-Datei zur + Fertigung an einen Leiterplattenhersteller schicken, und dieser die + Fertigungsdaten selber erstellt, stellen Sie bitte sicher, dass der + Hersteller die EAGLE-Version 4.11r05 oder höher verwendet. Ansonsten kann + es vorkommen, dass das gefertigte Board Thermal-Stummel enthält obwohl Sie + diese in Ihrer EAGLE-Version nicht gesehen haben. + +* RENAME-Befehl: + + - Wird der RENAME-Befehl in einer Package-, Symbol- oder Device-Zeichnung + ohne zusätzliche Parameter eingegeben, so erscheint jetzt ein Dialog in + dem der neue Name für dieses Objekt erfragt wird. + +* UPDATE-Befehl: + + - Die neue Syntax 'old_library_name = new_library_name' des UPDATE-Befehls + kann dazu verwendet werden, eine Bibliothek in einem Board oder Schematic + mit dem Inhalt einer anderen Bibliothen zu aktualisieren (siehe + "Help Update"). + +* VIA-Befehl: + + - Der VIA-Befehl aktiviert jetzt die Layer, die der Länge des Vias + entsprechen, falls noch keiner dieser Layer aktiv ist und der Vias-Layer + auf die Farbe 0 gesetzt ist. + +* WINDOW-Befehl: + + - 'WINDOW (@)' reagiert nicht mehr, wenn der Cursor ausserhalb des Editor- + Fensters ist. + +* Verschiedenes: + + - Beim Umbenennen eines Signals ist jetzt der neue Name der Defaultwert + wenn der Benutzer gefragt wird, ob zwei Signale zusammengefasst werden + sollen. + - Die Liste der Layer im CAM-Prozessor ist jetzt immer so breit, dass die + vollen Layernamen angezeigt werden. + - Der CAM-Prozessor fragt jetzt nur mehr einmal pro Job (nicht mehr bei + jeder einzelnen Job-Section) ob die aktuelle Datei neu geladen werden + soll. + - Beim Klicken in die Zeichenfläche eines Editor-Fensters um dieses Fenster + zu aktivieren ignoriert jetzt ein in diesem Fenster aktiver Befehl diesen + Mausklick, um ungewollte Effekte zu vermeiden (wie etwa das versehentliche + Löschen eines Objektes). + - Die Ratsnest-Berechnung für große Signal wurde beschleunigt. + - Die "File/Open recent"-Liste wird jetzt auch bei einer "File/Save as"- + Operation aktualisiert. + - Änderungen an der Sichtbarkeit von Toolbars, die über das Toolbar-Kontextmenu + gemacht wurden, werden jetzt auch in der eaglerc-Datei gespeichert. + - Beim Spiegeln von Bauteilen, bei denen angeschlossene Wires ihren Layer + wechseln, werden jetzt am fernen Ende dieser Wires nach Bedarf Vias + hinzugefügt bzw. entfernt. + - Das Programm benutzt jetzt deutsche Menütexte wenn das System auf "deutsch" + eingestellt ist. + - Die Fenster-Titelzeile zeigt jetzt die Programm-Versionsnummer an. + - Wird bei der Berechnung von Polygonen ein Fehler erkannt, so wird der + Bildausschnitt des Editor-Fensters auf eine der fehlerhaften Polygonkanten + eingestellt. + - Die Breite einiger Zeichen des Vektor-Fonts wurde korrigiert. + WARNUNG: Beachten Sie, dass durch diese Änderung manche Texte länger werden + können als bisher! Falls Sie Texte mit Vektor-Font auf einem Ihrer + Signal-Layer verwenden stellen Sie bitte sicher, dass Sie einen + DRC durchführen bevor Sie die Platine mit dieser neuen Version + fertigen! + - Wenn die mittlere Maustaste zum Verschieben des Bildausschnitts verwendet + wird, so wird jetzt eine eventuelle spezielle Funktion dieser Taste (wie + zum Beispiel die Anzeige des Layer-Dialogs) ausgeführt wenn die Größe der + Verschiebung 10 Pixel nicht übersteigt. + - Beim Verschieben des Bildausschnitts mit der mittleren Maustaste können + jetzt die durch die Scrollbars vorgegebenen Grenzen überschritten werden, + wenn gleichzeitig die Shift-Taste gedrückt wird. + - Wird EAGLE mit einer eagle.epf-Datei als Argument aufgerufen, so wird + jetzt das zugehörige Projekt geöffnet. + - Wird EAGLE mit dem Namen eines Projektes aufgerufen, das sich in einem der + unter "Options/Directories/Projects" aufgelisteten Verzeichnisse befindet, + so wird jetzt dieses Projekt geöffnet. + - Der Auswahlmechanismus beim Selektieren von Objekten mit Click&Drag in einem + dicht belegten Gebiet wurde verbessert. + - Die Position des "Splitters" im Control Panel und im Help-Fenster (nur Linux) + wird jetzt in der eaglerc-Datei gespeichert. + - Falls Sie die spezielle Funktion beim Zeichnen eines Wires, mit der man durch + Drücken von Ctrl den Radius eines Arcs definieren kann, nicht haben wollen, + so können Sie die Zeile + + Cmd.Wire.IgnoreCtrlForRadiusMode = "1" + + zur Datei ~/.eaglerc hinzufügen. Dadurch + wird dieses Feature für alle Befehle, die Wires zeichnen, abgeschaltet. + +* Fehlerbehebungen: + + - Wird eine Bibliothek im ADD-Dialog mit "Drop" aus der Liste der benutzten + Bibliotheken entfernt, so wird jetzt der entsprechende Eintrag in der + Baumansicht des Control Panels aktualisiert. + - Die Behandlung der Koordinaten von Rechtecken wurde korrigiert (sie lagen + manchmal um eine Editor-Einheit daneben). + - Das Selektieren eines gedrehten Rechtecks mit Ctrl+MOVE wurde korrigiert. + - Die Ausgabe der Gerber-Daten im Falle von negativen Koordinaten wurde + korrigiert (das '-' wurde bei der Zahl der Stellen mitgezählt). + - Die Behandlung von UL_GRID.unitdist wurde korrigiert. + - Ein Absturz unter Windows beim erneuten Laden einer sehr großen + Textdatei wurde behoben. + - Die '#'-Ersetzung im Ausgabe-Dateinamen im CAM-Prozessor wurde korrigiert. + - Ein möglicher Absturz beim Navigieren durch Bibliotheken aus älteren + Versionen im ADD-Dialog wurde behoben. + - Eine ungerechtfertigte DRC Width Fehlermeldung für kurze Arcs mit runden + Enden wurde behoben. + - Ein Absturz bei ROTATE mit einem Bauteilnamen und anschließendem Klicken + mit der rechten Maustaste im Falle, dass keine Gruppe definiert ist, wurde + behoben. + - Die Hervorhebung von Bauteilen, wenn ihre gesmashted Name- oder Valuetexte + mit SHOW angeklickt werden, wurde korrigiert. + - Das Zeichnen von Rechtecken auf HPGL2- und davon abgeleiteten Devices, + sowie auf dem DESIGNJET650 im CAM-Prozessor wurde korrigiert. Seit Version + 4.11 benötigt die "Bar"-Funktion in 'eagle.def' die Verarbeitung des + Winkels, was diese Devices nicht können und daher müssen sie Rechtecke + emulieren. + - Das Laden von Zeichnungen, die mit EAGLE-Versionen vor 3.0 erzeugt wurden, + direkt in Version 4.11 wurde korrigiert (Objekt-Orientierungen wurden nicht + richtig upgedatet). + - Die Behandlung von Rechtecken in Schaltplänen durch dxf.ulp wurde korrigiert. + - Das ungerechtfertigte Umbenennen eines Netzes beim Löschen einer Junction + wurde korrigiert. + - Die Behandlung von >PLOT_DATE_TIME bei EXPORT IMAGE wurde korrigiert. + - Die Behandlung des Zeichens 'mue' (0xB5) bei der Umwandlung von Strings + in Großbuchstaben wurde korrigiert. Beachten Sie aber, dass dennoch nur die + Zeichen mit ASCII-Codes kleiner als 127 garantiert funktionieren. Andere + Zeichen sollten nicht verwendet werden! + - Eine ungerechtfertigte Änderung von Package- bzw. Symbolnamen nach "...@1" + beim Library-Update für den Fall, dass das Device-Set, wie es im Schaltplan + verwendet wurde, nicht mehr in der Bibliothek vorhanden ist, wurde korrigiert. + - Das Spiegeln von Polygonen, die vollständig in einer Gruppe enthalten sind, + wurde korrigiert. + - Die Behandlung von Koordinaten im ERC-Report wurde korrigiert. + - Die Behandlung von Textdateien, die landesspezifische Zeichen wie zum + Beispiel das Euro-Symbol enthalten, wurde korrigiert. + - Ungerechtfertigte Luftlinien im Falle von nicht durchgehenden Vias und + Versorgungslayern wurden korrigiert. + - Das Hinzufügen von Bauteilen aus dem Control-Panel mittels Drag&Drop, + deren Name eines der Zeichen '{' oder '}' enthält, wurde ermöglicht. + - Das Selektieren von Vias mit gedrückter Ctrl-Taste wurde korrigiert. + - Ein Absturz beim Umschalten des Text-Befehlsmenüs aus einem Button mit + Untermenü heraus wurde behoben. + - Die Darstellung von Vias/Pads in EXPORT IMAGE für den Fall, dass der + Vias/Pads-Layer auf Farbe 0 gesetzt ist, wurde korrigiert. + - Die Generierung von Busnamen wurde korrigiert. + - Die Behandlung von '<', '>' und '&' in Namen und Werten bei der Ausgabe + in einem Rich-Text-Kontext wurde korrigiert. + - Die Darstellung der Text-Origins beim Panning wurde korrigiert. + - Die Behandlung von mit ASSIGN zugewiesenen Tasten wurde korrigiert. Diese + überschreiben jetzt auch Tasten, die für Pulldown-Menüs benutzt werden. + - Die automatische Beendigung eines Net- oder Bus-Wires wurde korrigiert für + den Fall, dass der neu gezeichnete und der Ziel-Wire in einer Linie liegen + und daher zu einem durchgehenden Wire optimiert werden. + - Das Auswählen von Vias des selben Signals, die fälschlicherweise an der + selben Koordinate platziert wurden, wurde korrigiert. + - Ein unerwartetes Popup-Menü im CHANGE-Befehl wurde korrigiert. + - Ein Absturz beim Drucken unter Linux ohne einen definierten Drucker + wurde behoben. + - Das Setzen eines Vias an einer Stelle, an der sich ein Polygon-Wire + befindet, wurde korrigiert. + - Das automatische Setzen von Junctions für den Fall. dass "Auto end net and + bus" ausgeschaltet ist, wurde korrigiert. + - Die Anzeige der Color-Spalte in der Layer-Liste des CAM-Prozessors wurde + korrigiert. + - Die Behandlung von Polygonen innerhalb von Packages im Autorouter wurde + korrigiert. + - Ein möglicher Verlust der Konnektivität von Wires bei den Befehlen MOVE + und PASTE im Zusammenhang mit nicht orthogonalen Winkeln wurde behoben. + - Die Zuordnung der Window-Icons beim Öffnen eines Script- oder ULP-Editor + Fensters aus einem Project heraus wurde korrigiert. + - Die Berechnung von Signalpolygonen mit sehr vielen Kanten wurde korrigiert. + - Das Selektieren von Gates in einer Device-Zeichnung mit Ctrl+MOVE wurde + korrigiert. + - Der MITER-Befehl fügt jetzt nur dann einen neuen Wire ein, wenn die beiden + existierenden Wires auf dem gleichen Layer liegen, die gleiche Breite und + den gleichen Wire-Style haben. + - Wires werden jetzt nur mehr dann optimiert, wenn sie den gleichen Wire-Style + haben. + - Der ROTATE-Befehl wurde korrigiert für den Fall, dass ein Objekt mit + Click&Drag selektiert wurde und die Maustaste ausserhalb des Zeichenfensters + losgelassen wurde. + - Die Benutzung der User Language Builtin Statements board, schematic, sheet, + library, deviceset, package und symbol in einer Variablen-Initialisierung + wie etwa + + int a = board; + + wurde korrigiert. + - Das Rückgängigmachen (UNDO) eines Library-Updates mit einer Library, die + Supply-Devices enthält, wurde korriigert. + - CUT/PASTE wurde für den Fall korrigiert, dass die zu pastende Zeichnung + veränderte Packages enthält, die nur von Devices referenziert werden, die + nicht in der Zieldatei enthalten sind. + - Ein möglicher Verlust der Konsistenz bezüglich impliziten Power-Pins für + den Fall, dass ein aus nur einem Segment bestehendes Netz mit dem selben + Namen wie diese Pins umbenannt oder mit einem andern Netz verbunden wurde, + wurde behoben. + - Das Umverlegen von Wires nach einem Library-Update wurde korrigiert (sie + konnten manchmal nicht mehr selektiert werden). + - Die Behandlung von Signal-Polygonen im EXPORT IMAGE-Befehl, die + nach dem Freirechnen komplett verschwinden würden, wurde korrigiert (ihre + Umrisse wurden so ausgedruckt wie sie auf dem Bildschirm angezeigt wurden). + - Ein unnötiger Bildaufbau beim Ein- oder Ausschalten der MARK wurde behoben. + - Das Setzen von "blind" oder "buried" Vias an Stellen, an denen sich Signal- + Wires befinden, die in Layern liegen, welche nicht von diesen Vias berührt + werden, wurde korrigiert. + - Die Fokus-Behandlung beim Schließen von ineinander verschachtelten Dialogen + in einem ULP wurde korrigiert. + - Die Ausführung von Scripts mit vielen NET-, MOVE- oder ROTATE-Befehlen + wurde beschleunigt. + - Die Behandlung des Default-Buttons in einem ULP-Dialog der ein dlgTextView + enthält wurde korrigiert. + - Die Behandlung der "recent files" Kategorien im eaglerc-File wurde + korrigiert (unter Windows waren sie manchmal komplett in Großbuchstaben). + - Das Exportieren monochromer Images unter Linux sowie das Drucken mit der + Option "black" unter Linux und Windows im Falle, dass die Farbe 15 nicht + den Standardwert hat, wurde korrigiert. + - Die Behandlung der "File/Open recent" Menüs in Script- und ULP-Editor- + Fenstern beim Laden aus einem Projekt wurde korrigiert. + - Die Erkennung eines Konsistenzverlustes für den Fall, dass eine Netzklasse + definiert (aber nicht benutzt) wird während die Forward-/Back-Annotation + nicht aktiv ist (zum Beispiel weil die andere Zeichnung nicht geladen ist) + wurde korrigiert. + - Die Behandlung der Netzklassen beim PASTE in ein Schematic/Board-Paar + wurde korrigiert. + - Die Behandlung von Micro-Vias in zweilagigen Boards wurde korrigiert (Vias + von Layer 1 nach 16 mit einem Bohrdurchmesser der kleiner ist als der + minimale Bohrdurchmesser wurden fälschlicherweise als Micro-Vias gesehen). + - Die Behandlung des 'orientation' Parameters im RECT-Befehl wurde korrigiert + (es werden jetzt auch Kleinbuchstaben akzeptiert). + - Das Setzen des >LAST_DATE_TIME Textes nach einer Veränderung der Design + Rules wurde korrigiert. + - Die Behandlung der textuellen Command-Buttons im Falle einer "nothing to + edit" Fehlermeldung wurde korrigiert. + - Die DRC-Abstandsprüfung für Wires im Dimension-Layer mit Breite 0 und einem + Copper/Dimension-Abstand von 0.2 oder 0.3 Micron wurde korrigiert. + - Die Behandlung von Einträgen in der eaglerc-Datei, welche '=' enthalten, + wurde korrigiert. + - Texte in Signallagen mit Proportional- oder Fixed-Font werden im DRC nicht + mehr auf gegenseitige Abstandsverletzungen geprüft (so wie dies bei + Vektor-Font-Texten bisher bereits der Fall war). + - Das Selektieren von Holes und Junctions mit Ctrl+MOVE wurde korrigiert. + - Die Darstellung des gerade gedrückten Buttons im Text-Befehlsmenü unter + Windows XP wurde korrigiert. + - Das Absetzen eines Wires im ROUTE-Befehl für den Fall, dass die Länge der + verbleibenden Luftlinie unterhalb der Snap_Length liegt, ein abschließender + Wire aber wegen Layer-Beschränkungen nicht automatisch platziert werden + kann, wurde korrigiert. + - Die automatische Ratsnest-Berechnung im ROUTE-Befehl wurde korrigiert (sie + hatte nicht immer die kürzeste Luftlinie berechnet). + - Das Zeichnen von Wires in Signal-Layern mit dem WIRE-Befehl von oder zu + einem SMD für den Fall, dass das SMD-Bauteil gespiegelt ist oder der Wire + nicht in dem selben Layer wie das SMD liegt, wurde korrigiert. + - Das Setzen der sichtbaren Routing-Layer im DISPLAY-Dialog gemäß den + Design-Rules für neu angelegte Boards wurde korrigiert. + - Der Übergang in den "Click&Drag" Modus für Objekte, die nicht auf dem + (groben) Raster liegen, wurde korrigiert. + - Die Ausgabe von SMDs mit Roundness 100 und orthogonalen Rotationen mit + allen vom "Generic"-Device abgeleiteten Devices im CAM-Prozessor (wie + zum Beispiel EPS) wurde korrigiert. + - Die Behandlung von Kreisen mit der Breite 0 (typischerweise verwendet für + Sperrflächen) im Autorouter wurde korrigiert (er routete nicht so nahe an + diese heran, wie es aufgrund der Design-Rules erlaubt gewesen wäre). + - Ein möglicher Absturz beim Bewegen eines Endes des letzten Wires eines + Netz-Segments auf das andere Ende dieses Wires wurde behoben. + +Freigabemitteilung für EAGLE 4.11 +================================= + +* Bibliotheksverwaltung: + + - Packages und Device-Sets können jetzt von anderen Bibliotheken in die + gerade geöffnete Bibliothek kopiert werden, entweder durch Drag&Drop aus + dem Control Panel oder durch Verwendung der neuen, erweiterten Syntax des + COPY-Befehls (siehe "Help Copy"). + - Neue Package-Varianten können jetzt erzeugt werden indem direkt Packages + aus anderen Bibliotheken verwendet werden, entweder durch Drag&Drop aus + dem Control Panel oder durch Verwendung der neuen, erweiterten Syntax des + PACKAGE-Befehls. + - Die Packages der gerade geöffneten Bibliothek können jetzt mit denen aus + anderen Bibliotheken auf den aktuellen Stand gebracht werden, entweder + durch Drag&Drop aus dem Control Panel oder durch Verwendung der neuen, + erweiterten Syntax des UPDATE-Befehls. + +* Blind & buried Vias: + + - Es können jetzt sog. "blind & buried" Vias verarbeitet werden. "Blind" + Vias sind solche, die beim jeweiligen Fertigungsschritt nicht ganz durch + den momentanen Lagenstapel gebohrt werden. "Buried" Vias entstehen indem + der momentane Lagenstapel ganz durchgebohrt wird. Vias die ganz durch das + komplette Board gehen sind grundsätzlich das Gleiche wie "buried" Vias, + werden aber manchmal auch als "through" ("durchgehende") Vias bezeichnet. + "Micro-Vias" sind kleine "blind" Vias, die von einem Layer zum nächsten + weiter innen liegenden Layer führen. Diese werden typischerweise dazu + benutzt, SMD-Pads an einen Innenlayer anzuschließen, ohne erst einen Wire + vom SMD wegführen zu müssen. + - Der Design-Rules-Dialog hat jetzt eine neue Seite mit dem Namen "Layers", + auf welcher das "Layer-Setup" eingestellt werden kann. Der Mindest- + Bohrdurchmesser sowie das Verhältnis von Tiefe zu Bohrdurchmesser ("Aspect + Ratio") bei "blind" Vias kann auf dem "Sizes"-Tab festgelegt werden. + - Beim Update existierender Boards aus früheren Versionen wir das Layer-Setup + aus den tatsächlich verwendeten Layern ermittelt (also jenen, in denen sich + Objekte befinden, oder die Supply-Layer sind, oder die im Autorouter-Setup + verwendet werden). Es wird ein Lagenstapel aus abwechselnd "Kern" und + "Prepreg" erzeugt (wobei die Dicke der einzelnen Lagen so gewählt wird, + dass sich eine Gesamtstärke der Leiterplatte zwischen 1mm und 1.5mm ergibt), + der ein durch alle Lagen gehendes Via erlaubt. + Nachdem Sie ein altes Board in diese Version geladen haben sollten Sie das + Layer-Setup in den Design Rules verifizieren und ggf. Ihren tatsächlichen + Bedürfnissen anpassen. + - Der DISPLAY- und LAYER-Dialog (und entsprechende Combo-Boxen) zeigen nur + mehr die Layer an, die im Layer-Setup verwendet wurden. + - Die Befehle CHANGE LAYER und ROUTE setzen nur die minimal nötigen Vias (gemäß + dem Layer-Setup in den Design Rules). Es kann 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. + - Der VIA-Befehl hat einen neuen Parameter, der angibt über welche Layer sich + dieses Via erstrecken soll. Die Syntax ist von-nach, wobei 'von' und 'nach' + die Layer-Nummern sind über die sich das Via erstrecken soll. So würde zum + Beispiel 2-7 ein Via erzeugen, das von Layer 2 bis Layer 7 geht (7-2 hätte + die selbe Bedeutung). Falls das Layer-Setup in den Design Rules genau dieses + Via nicht zulässt, wird das nächst längere Via genommen (bzw. eine Fehler- + meldung ausgegeben, falls kein solches Via gesetzt werden kann). + - Der Autorouter kann nicht gleichzeitig mit Supply-Layern und nicht ganz + durchgehenden Vias arbeiten. In solchen Fällen ist es nötig, die + Supply-Layer durch entsprechende Signal-Polygone zu ersetzen. + - Der CHANGE-Befehl hat eine neue Option namens VIA, mit der die Layer, über + die sich das Via erstreckt, geändert werden können. Die Syntax ist + + CHANGE VIA von-nach * + + wobei 'von' und 'nach' die Layer-Nummern sind über die sich das Via + erstrecken soll. Falls das Layer-Setup in den Design Rules genau dieses + Via nicht zulässt, wird das nächst längere Via genommen (bzw. eine Fehler- + meldung ausgegeben, falls kein solches Via gesetzt werden kann). + - Das User Language Objekt UL_VIA hat zwei neue Members 'start' und 'end', + welche den Layer zurückliefern, in dem dieses Via beginnt bzw. endet. + Beachten Sie bitte, dass die Members '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 iwrd). + - Der DRC prüft jetzt ob alle Vias und Objekte in Signal-Layern mit dem + Layer-Setup vereinbar sind. Falls dies nicht so ist, wird ein "Layer Setup" + Fehler angezeigt. + - Falls das Layer-Setup eines Boards "blind" oder "buried" Vias enthält, + generiert der CAM-Prozessor separate Bohrdateien für jeden tatsächlich + im Board vorkommenden Via-Übergang (siehe "CAM-Prozessor). + - Der DRC führt neue Prüfungen für "blind" Vias durch: Vias, die die Prüfung + gegen "Minimum Drill" bestanden haben und "blind" Vias sind, die genau + einen Layer tief sind (sogenannte "Micro-Vias") werden gegen den Parameter + "Min. Micro Via" geprüft. "Blind" Vias, die diese Tests bestehen werden + darüberhinaus dahingehend geprüft, ob sie einen Bohrdurchmesser besitzen, + der dem Parameter "Min. Blind Via Ratio" in "Edit/Design Rules/Sizes" + genügt. + +* Beliebige Winkel: + + - Texte und Elemente im Board-Kontext können jetzt um beliebige Winkel + rotiert werden, in Schritten von 0.1 Grad (siehe die Beschreibung der + "Orientation"-Flags unter "Help Add"). + - Das neue "Spin"-Flag kann dazu benutzt werden, die Funktion abzuschalten + welche Texte von unten oder rechts lesbar hält. + - Pads und SMDs können jetzt in beliebigen Winkeln platziert werden. + +* Arcs und Wires: + + - In weiten Bereichen werden Arcs jetzt genauso behandelt wie Wires. Sie + sind Teil eines Signals wenn sie in einen Signal-Layer gezeichnet werden, + sie können beim Zeichnen eines Polygons benutzt werden, und sie haben jetzt + auch einen Linientyp. + - Die Enden von Arcs können jetzt entweder rund oder flach sein. Flache Enden + sollten nur verwendet werden wenn dies unbedingt erforderlich ist (runde + Enden haben zum Beispiel Vorteile bei der Generierung von Gerber-Daten). + - Die Endpunkte eines Arcs können jetzt unabhängig voneinander bewegt werden, + so wie bei normalen Wires üblich. Werden solche Punkte bewegt, so wird der + Radius des Arcs entsprechend skaliert. + - Alle Befehle, die Wires zeichnen können, können nun auch Arcs zeichnen + indem sie den neuen 'curve' bzw. '@radius' Parameter verwenden (siehe + "Help/Editor-Befehle/WIRE"). + - Es gibt keine 'arcs()' Loop-Member-Funktionen mehr in der User Language. + ULPs die eine Schleife über die Arcs implementierten müssen jetzt das neue + Data-Member UL_WIRE.arc abfragen, wenn sie durch die Wires gehen (siehe + "Help/User Language/Objekt-Typen/UL_WIRE"). Im Abschnitt "User Language" + (siehe weiter unten) befindet sich ein Beispiel das zeigt wie vorhandene + ULPs angepasst werden können. + - Der neue Befehl MITER kann dazu benutzt werden, die Verbindungsstelle von + Wires abzuschrägen (siehe "Help Miter"). + - Die Wire-Knickwinkel 0, 1, 3 und 4 benutzen jetzt einen zusätzlichen Radius + zur Abschrägung des Knickpunktes, der mit dem MITER-Befehl eingestellt + werden kann. + +* Zusätzliche Flags für Pads, Vias und Smds: + + - Pads, Vias und Smds haben jetzt zusätzliche Flags, über die sich steuern + lässt ob die Stop- und Cream-Masken bzw. Thermal-Stege generiert werden sollen, + und ob das "erste" Pad eines Packages eine spezielle Form haben soll. + - Die User Language Objekte UL_PAD, UL_VIA und UL_SMD haben ein neues Data + Member 'flags', über das diese Flags abgefragt werden können (siehe + "Help/User Language/Objekt-Typen/UL_PAD", "Help/User Language/Objekt- + Typen/UL_VIA" und "Help/User Language/Objekt-Typen/UL_SMD"). + - Die Befehle PAD und SMD kennen die neuen Optionen NOSTOP, NOTHERMALS, + NOCREAM bzw. FIRST um diese Flags zu definieren. Der VIA-Befehl kennt die + neue Option STOP. + - Der CHANGE-Befehl kennt die neuen Optionen STOP, CREAM und FIRST um diese + Flags zu verändern (die Option THERMALS existiert bereits). + +* Benutzerdefinierbare Farben: + + - Die Farben für Layer, Hintergrund und Grid können jetzt vollständig vom + Benutzer definiert werden. + - Es gibt jetzt drei "Paletten" für schwarzen, weissen und farbigen Hinter- + grund. Jede Palette hat 64 Farb-Einträge, die auf jeden beliebigen RGB- + Wert gesetzt werden können. Der Paletten-Eintrag 0 wird für die Hinter- + grundfarbe verwendet (in der "weissen" Palette ist dieser Eintrag nicht + veränderbar, da diese Palette auch zum Ausdrucken verwendet wird, wo der + Hintergrund immer weiß ist). + - Die Farbpaletten können entweder über den Dialog unter + "Options/Set.../Colors" verändert werden, oder mittels des Befehls + + SET PALETTE + + wobei eine Zahl im Bereich 0..63 und ein hexadezimaler + RGB-Wert ist, etwa 0xFFFF00 (was ein helles Gelb ergeben würde). Beachten + Sie bitte, dass der RGB-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, weissen 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 selben Farben wie in früheren Versionen. + - 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. + - Die Hintergrundfarbe für Layout und Schematic kann jetzt auf jede beliebige + Farbe gesetzt werden. Beachten Sie dabei bitte, dass für den Fall, dass die + Hintergrundfarbe weder reines Schwarz noch reines Weiß ist, die Zeichnung + Layer für Layer dargestellt wird, wodurch sich der Bildaufbau gegenüber + einem weissen oder schwarzen Hintergrund verlangsamen dürfte. + - Anderungen am "Options/Set..."-Dialog: + + Die "Grid"-Seite wurde in "Colors" umbenannt. + + Der Parameter für das kleinste darzustellende Grid wurde auf die "Misc"- + Seite verschoben. + - Die neue User Language Funktion 'palette()' kann dazu benutzt werden, die + momentan aktive Palette sowie deren Einträge zu ermitteln (siehe "Help/User + Language/Builtins/Builtin Functions/Sonstige Funktionen/palette()"). + +* Control Panel: + + - Der Control Panel Tree kann jetzt über die Pulldown-Menü-Option "View/Sort" + wahlweise nach Name oder Typ sortiert werden. + - Die Pulldown-Menü-Option "File/Refresh tree" wurde nach "View/Refresh" + verlagert. + - Directory-Einträge im Control Panel Tree, welche Bibliotheken enthalten + können, haben jetzt alle die Optionen "Use all" und "Use none" in ihrem + Kontext-Menü. + - Neue Kontext-Menü-Optionen für Bibliotheken, Device-Sets und Packages + sowie Drag&Drop-Features zum Kopieren und Updaten von Bibliotheksobjekten, + und zum Anlegen von neuen Package-Varianten. + - Drag&Drop einer Board-, Schematic- oder Library-Datei auf das zugehörige + Editor-Fenster lädt jetzt die Datei zum Editieren in dieses Fenster. Die + bisherige Funktion, dass bei Drag&Drop einer Library-Datei auf ein Editor- + Fenster ein Library-Update ausgeführt wurde, wurde entfernt. + +* Design Rules: + + - Die neuen Design Rule Parameter Shapes/Elongation können benutzt werden um + die "Verlängerung" von Pads der Form "Long" bzw. "Offset" festzulegen. + Gültige Werte liegen im Bereich von 0 bis 200, wobei 0 in einem normalen + Octagon resultiert (keine Verlängerung) und 100 ein Seitenverhältnis von + 2:1 ergibt (100% Verlängerung), was auch das in früheren Programmversionen + fest vorgegebene Verhältnis war. + - Der Design-Rules-Dialog hat jetzt ein neues Tab "Layers", auf dem das + Layer-Setup für Multilayer-Platinen festgelegt wird (siehe "Help/Überprüfen + des Designs/Design Rules"). + - Das Design-Rules-Tab "Shapes" enthält eine neue Combo-Box namens "First", + über die eingestellt werden kann mit welcher Form das "erste" Pad eines + Bauteils dargestellt werden soll. + - Das Design-Rules-Tab "Sizes" enthält die beiden neuen Parameter "Min. + Micro Via" und "Min. Blind Via Ratio". + - Das Design-Rules-Tab "Restring" enthält einen neuen Satz von Restring- + Parametern für Micro-Vias. + +* User Language: + + - Die User Language Member-Funktionen UL_PAD.shape und UL_VIA.shape liefern + jetzt die Werte PAD_SHAPE_ANNULUS, PAD_SHAPE_THERMAL, VIA_SHAPE_ANNULUS bzw. + VIA_SHAPE_THERMAL zurück wenn die Form in einem Supply-Layer abgefragt wird + (siehe Help/User Language/Objekt-Typen/UL_PAD und UL_VIA). + - Das User Language Dialog-Object dlgListView kennt jetzt einen neuen + Parameter, der die Spalte und Richtung der Sortierung festlegt. + - Die User Language Funktionen strchr(), strstr(), strrchr() und strrstr() + akzeptieren jetzt einen 'index' Parameter, um die Suche an einer gegebenen + Position beginnen zu lassen. + - Das gleichzeitige Öffnen der selben Datei in zwei output()-Statements eines + User Language Programms wird jetzt als Fehler gemeldet. + - Die User Language Objekte UL_HOLE, UL_PAD und UL_VIA haben jetzt ein neues + Data-Member 'drillsymbol'. + - Ein User Language Programm kann jetzt auch dann abgebrochen werden, wenn es + gerade eine längere 'for' oder 'while' Schleife ausführt. + - Die neue ULP-Funktion status() kann verwendet werden, um eine Meldung in + der Statuszeile des Editor-Fensters anzuzeigen. + - Die User Language Dialog Funktion dlgTextView akzeptiert jetzt einen zweiten + Parameter um Hyperlinks in Rich Text zu unterstützen (siehe "Help/User + Language/Dialoge/Dialog-Objekte/dlgTextView()"). + - Die User Language Dialog Funktion dlgMessageBox kann jetzt der Message Box + ein Icon mitgeben, indem dem Text eines der Zeichen '!', ';' oder ':' + vorangestellt wird (siehe "Help/User Language/Dialoge/Vordefinierte + Dialoge/dlgMessageBox()"). + - Durch die Implementierung beliebiger Winkel und des "Spin"-Flags wurden + folgende neue Member-Funktionen zur User Language hinzugefügt: + UL_PAD.angle, UL_SMD.angle, UL_RECTANGLE.angle, UL_ELEMENT.angle, + UL_ELEMENT.spin und UL_TEXT.spin. + Benutzen Sie diese in Ihren eigenen ULPs nach Bedarf, ansonsten kann es + passieren, dass Boards, welche Objekte mit diesen neuen Features enthalten, + nicht richtig behandelt werden. Siehe 'dxf.ulp' als Beispiel. + - Aufgrund der Änderung an den Pad-Formen wurden die User Language Konstanten + PAD_SHAPE_XLONGOCT und PAD_SHAPE_YLONGOCT durch PAD_SHAPE_LONG ersetzt, und + die neue Konstante PAD_SHAPE_OFFSET hinzugefügt. + - Die neue Member-Funktion UL_PAD.elongation liefert den "Elongation"-Wert + für Pads der Formen Long bzw. Offset. + - Das User Language Objekt UL_VIA hat zwei neue Members 'start' und 'end', + welche den Layer zurückliefern, in dem dieses Via beginnt bzw. endet. + Der Wert von 'start' ist dabei immer kleiner als der von 'end'. + Beachten Sie bitte, dass die Members '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). + - Wegen des Einbaus verschiedener Arten von Enden bei Arcs wurde die Member- + Funktion UL_ARC.cap zur User Language hinzugefügt. + - Die Loop-Member-Funktionen UL_BOARD.arcs(), UL_PACKAGE.arcs(), UL_SHEET.arcs( + und UL_SYMBOL.arcs() existieren nicht mehr, da Arcs jetzt ähnlich wie Wires + behandelt werden. ULPs die bisher eine Schleife über die Arcs machten + müssen jetzt das neue Data-Member UL_WIRE.arc abfragen wenn sie durch die + Wires laufen (siehe "Help/User Language/Objekt-Typen/UL_WIRE"). + Das folgende Beispiel soll demonstrieren wie ein bestehendes ULP, welches + die arcs() Loop-Member-Funktionen benutzt, verändert werden muss: + + Nehmen wir an Sie haben ein ULP das folgendermaßen aussieht: + + void ProcessArc(UL_ARC A) { /* Arc bearbeiten */ } + void ProcessWire(UL_WIRE W) { /* Wire bearbeiten */ } + board(B) { + B.arcs(A) ProcessArc(A); + B.wires(W) ProcessWire(W); + } + + Um es mit EAGLE Version 4.1 lauffähig zu machen muss der Aufruf der 'arcs()' + Funktion entfernt und die Bearbeitung des Arcs nach ProcessWire() verlagert + werden: + + void ProcessArc(UL_ARC A) { /* Arc bearbeiten */ } + void ProcessWire(UL_WIRE W) + { + if (W.arc) + ProcessArc(W.arc); + else + /* Wire bearbeiten */ + } + board(B) { + B.wires(W) ProcessWire(W); + } + + Diese explizite Behandlung des Arcs ist allerdings nur dann nötig, wenn + Sie auf Parameter zugreifen wollen, die nur ein UL_ARC liefern kann. Falls + Sie diese Informationen nicht benötigen, können Sie den Arc wie einen ganz + gewöhnlichen Wire behandeln indem Sie die Parameter benutzen, die UL_WIRE + liefert. + - Um jeden UL_ARC auch auf UL_WIRE-Ebene behandeln zu können hat das UL_WIRE- + Objekt jetzt die beiden neuen Members 'cap' und 'curve'. + - Die User Language Objekte UL_PAD, UL_VIA und UL_SMD haben ein neues Data + Member 'flags', über das die Flags abgefragt werden können, welche die + Masken- und Thermal-Generierung steuern (siehe "Help/User Language/Objekt- + Typen/UL_PAD", "Help/User Language/Objekt-Typen/UL_VIA" und "Help/User + Language/Objekt-Typen/UL_SMD"). + - Das User Language Objekt UL_HOLE hat eine neues Data-Member 'diameter[]' + welches den Durchmesser der Lötstopmasken liefert. + - Das output() Statement unterstützt jetzt den neuen Mode-Buchstaben 'D', mit + dem die Datei am Ende der EAGLE-Sitzung automatisch gelöscht wird (siehe + "Help/User Language/Builtins/Builtin-Statements/output()"). + - Das User Language Objekt UL_GRID hat jetzt ein zusätzliches Data-Member + namens 'unitdist', welches die Einheit liefert, mit der die tatsächliche + Rastergröße definiert wurde (see "Help/User Language/Objekt-Typen/UL_GRID). + +* Autorouter: + + - Der Autorouter versucht nicht mehr, zunächst innerhalb der Grenzen des + umschließenden Rechtecks des Signals zu routen, da dies zur Folge hatte, + dass er manchmal dazu gezwungen wurde einen "teueren" Weg zu nehmen, den er + vermieden hätte, wenn ihm von Anfang an erlaubt gewesen wäre, auf der + gesamten Board-Fläche zu routen. Dies kann in einigen Fällen zu längeren + Routing-Zeiten führen, es kann aber auch - vor allem bei komplexen Boards - + den Vorgang beschleunigen. + +* CAM-Prozessor: + + - Der neue Parameter MaxApertureSize kann in der Datei 'eagle.def' dazu + benutzt werden, eine obere Grenze für die Größe der generierten Blenden + bei den Devices GERBERAUTO und GERBER_RS274X festzulegen. Falls Objekte + dargestellt werden sollen, die größer als diese Grenze sind, so werden + dafür Blenden emuliert. + - Falls das Board "blind" oder "buried" Vias enthält, generiert der + CAM-Prozessor separate Bohrdateien für jeden tatsächlich im Board + vorkommenden Via-Übergang. Die Dateinamen werden gebildet indem die Nummern + des Start- und End-Layers an den Basisnamen angehängt werden, wie zum + Beispiel in + + boardname.drd.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: + + .%L.drd + + ergäbe demnach + + boardname.0104.drd + + 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. + - Die Blendendatei wird jetzt auf doppelte D-Codes untersucht (siehe + "Help/Ausgabedateien erzeugen/CAM-Prozessor/Ausgabetreiber/Device- + Parameter/Blenden-Konfigurationsdatei"). + +* Text-Editor: + + - Die Auswahl des Fonts im Text-Editor geschieht jetzt über die Pulldown-Menü + Option "File/Font..." und nicht mehr im Printer-Setup. Der gewählte Font + wird jetzt auch im Text-Editor Fenster benutzt. + +* ADD-Befehl: + + - Der ADD-Befehl spiegelt jetzt das am Cursor hängende Objekt wenn die + mittlere Maustaste gedrückt wird. + +* ARC-Befehl: + + - Arcs sind jetzt Bestandteil von Signalen, wenn sie in einem Signal-Layer + eines Board gezeichnet werden. + Beim Update einer existierenden Board-Zeichnung werden Arcs in Signal-Layern + in Signale verwandelt (entweder neu generierte oder solche, zu denen die + Arcs offensichtlich aufgrund gemeinsamer Endpunktskoordinaten gehören). + - Der ARC-Befehl akzeptiert jetzt auch einen Signal-Namen (genau wie der + WIRE-Befehl). + - Die Enden von Arcs können jetzt entweder rund oder flach sein (hierzu gibt + es im ARC-Befehl die neuen Parameter ROUND und FLAT). + Beim Update einer existierenden Zeichnung wir der 'cap' Parameter aller + Arcs in Boards, Packages und Symbols, deren Enden durch andere Objekte + (etwa Wires oder Vias) verdeckt sind, auf 'round' eingestellt. Dadurch + können die Arcs auf verschiedenen Ausgabegeräten einfacher ausgegeben + werden. + +* BUS-Befehl: + + - Der BUS-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/BUS"). + +* CHANGE-Befehl: + + - Beim Layer-Wechsel eines Signal-Wires wird nur das minimal nötige Via (gemäß + dem Layer-Setup in den Design Rules) gesetzt. Es kann 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. + - Der CHANGE-Befehl hat eine neue Option namens VIA, mit der die Layer, über + die sich das Via erstreckt, geändert werden können. Die Syntax ist + + CHANGE VIA von-nach * + + wobei 'von' und 'nach' die Layer-Nummern sind über die sich das Via + erstrecken soll. Falls das Layer-Setup in den Design Rules genau dieses + Via nicht zulässt, wird das nächst längere Via genommen (bzw. eine Fehler- + meldung ausgegeben, falls kein solches Via gesetzt werden kann). + - Der CHANGE-Befehl kann jetzt mittels + + CHANGE CAP ROUND | FLAT + + die Art der Arc-Enden (rund bzw. flach) verändern. + - Der CHANGE-Befehl kennt die neuen Optionen STOP, CREAM und FIRST um die + neuen Pad- bzw. Smd-Flags zu verändern (die Option THERMALS existiert + bereits). + - Die Parameter Spacing und Isolate im CHANGE Popup-Menü bieten jetzt eine + Liste vordefinierter Werte an (so wie, zum Beispiel, der Width-Parameter). + Alle solchen Popup-Menüs enthalten jetzt als letzten Eintrag "...", über + den ein Dialog zur Eingabe eines neuen Wertes geöffnet werden kann. + +* COPY-Befehl: + + - Der COPY-Befehl kann jetzt Bauteile in einem Schaltplan kopieren (siehe + "Help Copy"). + - Der COPY-Befehl kann jetzt Packages und Device-Sets von anderen Biblio- + theken in die gerade editierte Bibliothek kopieren (siehe "Help Copy"). + - Der COPY-Befehl spiegelt jetzt das am Cursor hängende Objekt wenn die + mittlere Maustaste gedrückt wird. + +* DELETE-Befehl: + + - Die Option "SIGNALS" muss jetzt voll ausgeschrieben werden. + +* DISPLAY-Befehl: + + - Das automatische Ein-/Ausschalten zugehöriger Layer beim Aktivieren bzw. + Deaktivieren der Layer t/bPlace oder Symbols im DISPLAY-Befehl kann jetzt + durch Hinzufügen der Zeile + + Option.DisplayRelatedLayers = "0" + + ans Ende der Datei ~/.eaglerc abgeschaltet werden. + +* DRC-Befehl: + + - Der DRC prüft jetzt Objekte im Pads- bzw. Vias-Layer, die nicht Pads oder + Vias sind (z. B. Wires, Rectangles etc.) und meldet diese als "Layer Abuse" + Fehler. Der Grund hierfür ist, dass EAGLE solche Objekte nicht besonders + behandelt und es daher zu Kurzschlüssen kommen könnte. Falls Sie eine + solche Fehlermeldung vom DRC bekommen, sollten Sie die betreffenden + Objekte in den bzw. die entsprechenden Signal-Layer verlagern. + - Der DRC prüft jetzt Objekte im t/bKeepout-Layer nur dann, wenn der + entsprechende Layer eingeblendet ist. + - Der DRC prüft jetzt ob alle Vias und Objekte in Signal-Layern mit dem + Layer-Setup vereinbar sind. Falls dies nicht so ist, wird ein "Layer Setup" + Fehler angezeigt. + +* GRID-Befehl: + + - Der GRID-Befehl kennt die neue Option 'alt', die es erlaubt ein "alternatives" + Raster zu definieren, welches benutzt wird wenn die Alt-Taste gedrückt wird + wenn Objekte selektiert oder bewegt werden. Das alternative Raster kann seine + eigene Größe und Einheit haben und wird typischerweise benutzt um temporär + auf ein feiners Raster umzuschalten, falls das normale zu grob ist. + Siehe "Help/Editor-Befehle/GRID". + - Der GRID-Dialog wurde verändert um die Eingabe der Parameter für das + alternative Raster zu ermöglichen. + +* INVOKE-Befehl: + + - Der INVOKE-Befehl spiegelt jetzt das am Cursor hängende Objekt wenn die + mittlere Maustaste gedrückt wird. + +* MIRROR-Befehl: + + - Der MIRROR-Befehl akzeptiert jetzt den Namen eines Elements im Board, so + wie der MOVE-Befehl. + +* MITER-Befehl: + + - Der neue Befehl MITER kann dazu benutzt werden, die Verbindungsstelle von + Wires abzuschrägen (siehe "Help Miter"). + +* MOVE-Befehl: + + - Bei der Aufnahme eines Objektes mit dem MOVE-Befehl wird jetzt in der + Statuszeile die gleiche Information angezeigt wie beim SHOW-Befehl (derzeit + funktioniert dies nur wenn die "User guidance" abgeschaltet ist). + - Wird ein Arc an einem seiner Endpunkte selektiert, so kann dieser jetzt + frei bewegt werden (genauso wie bei einem Wire). Der Radius wird dabei + entsprechend skaliert. + - Der MOVE-Befehl spiegelt jetzt das am Cursor hängende Objekt wenn die + mittlere Maustaste gedrückt wird. + - Der MOVE-Befehl kann jetzt Objekte an ihrem Aufhängepunkt selektieren wenn + die Ctrl-Taste gedrückt wird (siehe "Help/Editor-Befehle/MOVE"). + +* NET-Befehl: + + - Der NET-Befehl zeigt jetzt in der Statuszeile Informationen über das + aktuelle Netz an. + - Der NET-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/NET"). + +* PACKAGE-Befehl: + + - Der PACKAGE-Befehl kann jetzt Package-Varianten mit Packages aus anderen + Bibliotheken erzeugen (siehe "Help Package"). + +* PAD-Befehl: + + - Der PAD-Befehl kann jetzt Pads mit beliebigen Winkeln erzeugen und + akzeptiert dafür einen "orientation"-Parameter. + - Die Pad-Formen XLongOct und YLongOct wurden in Long umbenannt. Beim + Updaten einer bestehenden Zeichnung aus einer früheren Version werden + XLongOct Pads in Long mit einem Winkel von 0 Grad, und YLongOct Pads in + Long mit 90 Grad konvertiert. + - Die neue Pad-Form "Offset" erzeugt Pads mit der gleichen Form wie "Long", + aber nur nach einer Seite verlängert. + - Der PAD-Befehl kennt die neuen Optionen NOSTOP, NOTHERMALS und FIRST, mit + denen die neuen 'flags' angegeben werden können (siehe "Help/Editor- + Befehle/PAD"). + +* PASTE-Befehl: + + - Der PASTE-Befehl spiegelt jetzt das am Cursor hängende Objekt wenn die + mittlere Maustaste gedrückt wird. + +* POLYGON-Befehl: + + - Die Parameter 'width' und 'layer' können jetzt während des Zeichnens eines + Polygons jederzeit geändert werden. + - Der POLYGON-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/POLYGON"). + +* RATSNEST-Befehl: + + - Der RATSNEST-Befehl verwendet jetzt alle Punkte eines Signals, auch wenn + dieses sehr komplex ist (in früheren Versionen blieben Wire-Endpunkte + unberücksichtigt, wenn die Gesamtzahl der Anknüpfungspunkte größer als 254 + war). Hierfür wird mehr Speicherplatz beim Berechnen des Ratsnest benötigt. + Falls dies auf Ihrem System ein Problem darstellen sollte, so können Sie + auf die ursprüngliche Methode zurückschalten indem Sie die Zeile + + Option.RatsnestLimit = "254" + + an die Datei ~/.eaglerc anfügen. Der + angegebene Wert ist die Anzahl der Anknüpfungspunkte bis zu der Wire- + Endpunkte berücksichtigt werden und beschränkt somit den Speicherbedarf + (die Berechnung benutzt Speicher bis zum Quadrat des angegebenen Wertes, + so dass ein Wert von 1024 den verwendeten Speicher auf 1MB beschränkt). + Ein Wert von "0" steht für "keine Begrenzung". Ein Wert von "1" bewirkt, + das Luftlinien ausschließlich an Pads, Smds und Vias anknüpfen. + - RATSNEST markiert die Board-Zeichnung nicht mehr als verändert, da die + berechneten Polygon-Daten (falls vorhanden) nicht in der Datei abgespeichert + werden, und die neuberechneten Luftlinien keine wirkliche Veränderung der + Zeichnung darstellen. + +* ROTATE-Befehl: + + - Der ROTATE-Befehl akzeptiert jetzt einen "Orientation"-Parameter (zum + Beispiel SMR359.9). + - Der ROTATE-Befehl akzeptiert jetzt den Namen eines Elements im Board, so + wie der MOVE-Befehl. + - Der ROTATE-Befehl kann jetzt mit Click&Drag benutzt werden um Objekte oder + Gruppen um beliebige Winkel zu drehen (siehe "Help Rotate"). + +* ROUTE-Befehl: + + - Der ROUTE-Befehl berechnet jetzt die aktuelle Luftline dynamisch neu + während des Routens. Dabei werden auch Punkte entlang eines Wires + berücksichtigt, wenn diese näher am Cursor liegen als die Endpunkte des + Wires. Falls sich ein Pad, Via oder Smd nicht weiter als Snap_Length vom + Ende der Luftlinie entfernt (im aktuellen Layer) befindet schnappt dieses + Ende jetzt in die Mitte des Objektes. + - Der ROUTE-Befehl setzt nicht mehr automatisch ein Via am Endpunkt eines + Wires. Falls Sie ein Via am Ende eines gerouteten Wires platzieren wollen, + so können Sie dies dadurch erreichen, dass Sie die Shift-Taste gedrückt + halten während Sie den Endpunkt anklicken. + - Bei der Ermittlung des Layers, in dem geroutet wird, berücksichtigt der + ROUTE-Befehl jetzt neben SMDs auch Wires. + - Beim Layer-Wechsel im ROUTE-Befehl wird nur das minimal nötige Via (gemäß + dem Layer-Setup in den Design Rules) gesetzt. Es kann 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. + - Der ROUTE-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/ROUTE"). + - Der ROUTE-Befehl erzeugt jetzt, wenn nötig, eine neue Luftlinie, wenn bei + der Auswahl des Startpunktes die Ctrl-Taste gedrückt wird (siehe + "Help/Editor-Befehle/ROUTE"). + +* SET-Befehl: + + - Der Befehl SET USED_LAYERS berücksichtigt auch die Layer des neuen + Multilayer-Setups in den Design Rules und belässt diese in den Menüs. + - Der Befehl SET WIRE_BEND akzeptiert die beiden neuen Werte 5 und 6 um + Knickwinkel zu definieren, die mit einem 90-Grad Arc beginnen bzw. enden, + sowie den neuen Wert 7 für einen Knickwinkel, der einen Arc erzeugt welcher + sich dem Wire am Startpunkt genau anschmiegt. Falls am Startpunkt nicht + genau ein Wire gefunden wird, wird eine gerade Linie gezeichnet. Diese Art + des Knickwinkels kann zum "freihändig" Zeichnen verwendet werden. + - Das spezielle Zeichen '@' kann im SET WIRE_BEND Befehl dazu verwendet werden + festzulegen, welche Knickwinkel tatsächlich durchlaufen werden sollen, wenn + mit der rechten Maustaste weitergeschaltet wird (z.B. SET WIRE_BEND @ 1 2 4 5;). + - Der SET-Befehl setzt jetzt die Parameter-Menüs auf die programminternen + Defaultwerte zurück wenn er, zum Beispiel, als + + SET WIDTH_MENU; + + eingegeben wird (also ohne jeglichen Wert). Dies gilt für alle *_MENU + Parameter. + +* SHOW-Befehl: + + - Der SHOW-Befehl zeigt jetzt die Netzklasse (im Falle eines Netzes bzw. + Signals) und den Gatternamen (im Falle eines aus mehreren Gattern + bestehenden Bauteils) an. + +* SMASH-Befehl: + + - Der SMASH-Befehl kann jetzt auf eine Gruppe angewendet werden. + - Wird die Shift-Taste gedrückt während mit dem SMASH-Befehl auf ein Bauteil + oder eine Gruppe geklickt wird, so macht dies den "SMASH"-Zustand wieder + rückgängig. + - Die >PART- und >GATE-Parameter werden jetzt ebenfalls gesmasht. + +* SMD-Befehl: + + - Der SMD-Befehl kennt die neuen Optionen NOSTOP, NOTHERMALS und NOCREAM, mit + denen die neuen 'flags' angegeben werden können (siehe "Help/Editor- + Befehle/SMD"). + +* SPLIT-Befehl: + + - Der SPLIT-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/SPLIT"). + +* UPDATE-Befehl: + + - Der UPDATE-Befehl kann jetzt Packages in eine Library updaten (siehe + "Help Update"). + +* VIA-Befehl: + + - Der VIA-Befehl hat einen neuen Parameter, der angibt über welche Layer sich + dieses Via erstrecken soll. Die Syntax ist von-nach, wobei 'von' und 'nach' + die Layer-Nummern sind über die sich das Via erstrecken soll. So würde zum + Beispiel 2-7 ein Via erzeugen, das von Layer 2 bis Layer 7 geht (7-2 hätte + die selbe Bedeutung). Falls das Layer-Setup in den Design Rules genau dieses + Via nicht zulässt, wird das nächst längere Via genommen (bzw. eine Fehler- + meldung ausgegeben, falls kein solches Via gesetzt werden kann). + - Der VIA-Befehl kennt die neue Option STOP, mit der die neuen 'flags' + angegeben werden können (siehe "Help/Editor-Befehle/VIA"). + +* WIRE-Befehl: + + - Der WIRE-Befehl hat jetzt eine erweiterte Syntax um das Zeichnen von Arcs + zu ermöglichen (siehe "Help/Editor-Befehle/WIRE"). + +* Verschiedenes: + + - Wenn ein Netz umbenannt wurde, weil ein Supply-Pin darauf platziert wurde, + so wird dies dem Benutzer jetzt mitgeteilt. + - Die Platzierung der Bauteile im BOARD- und PASTE-Befehl wurde verbessert. + - Die mit EXPORT IMAGE erzeugten Dateien enthalten jetzt die Auflösung des + Bildes, sofern das Dateiformat dies unterstützt. + - Der RIPUP-Befehl kann jetzt abgebrochen werden. + - Der Cursor schaltet jetzt auf die "Sanduhr" während der Autorouter läuft. + - Die Größe der Origin-Kreuze bei Texten wird jetzt auf die tatsächliche + Textgröße limitiert. + - Im "Edit" Pulldown-Menü gibt es jetzt einen neuen Punkt "Stop command", + der die selbe Funktion hat wie der "Stop"-Button in der Action-Toolbar. + - Beim Drucken auf DOS-basierten Windows-Versionen (Windows 95, 98, ME) kann + jetzt die Zeichnung im Speicher aufbereitet und dann die komplette Bitmap + an den Drucker geschickt werden, um Probleme mit dem Ausdrucken von Texten + bei manchen Druckertreibern zu umgehen. Dadurch wird das Ausdrucken langsamer, + erzeugt aber zumindest korrekte Resultate. Falls Sie einen Druckertreiber + verwenden, der nicht richtig funktioniert, so können Sie diese + Umgehungslösung einschalten indem Sie den Parameter + + Printer.InternalRendering + + in der Datei ~/.eaglerc auf einen anderen als + den Default-Wert "0" setzen. + Die einzelnen Bits in diesem Wert stehen jeweils für eine bestimmte + Windows-Version: + + 00000001 = Win32s + 00000010 = Windows 95 + 00000100 = Windows 98 + 00001000 = Windows Me + 00010000 = Windows NT + 00100000 = Windows 2000 + 01000000 = Windows XP + + Sie können jede Kombination aus diesen Bits verwenden um InternalRendering + für bestimmte Plattformen ein- oder auszuschalten. Zum Beispiel bewirkt + + Printer.InternalRendering = "6" + + dass dieses Feature nur für Windows 95 und Windows 98 aktiviert wird. + Falls Sie bis jetzt "Options/User interface/Always vector font" aktiviert + hatten, weil Ihr Drucker Nicht-Vektor-Fonts nicht korrekt ausgedruckt hat, + sollten Sie die Option jetzt ausschalten und nochmals versuchen, Nicht- + Vektor-Fonts zu drucken. Eventuell müssen Sie für einzelne Zeichnungen + auch die Option "Persistent in this drawing" abschalten. Die Option "Black" + im PRINT-Dialog kann das Ausdrucken beschleunigen, wenn Sie auf einen + schwarz/weiß-Drucker ausgeben. + - Beim Drucken unter Linux wird jetzt CUPS unterstützt. + - Beim Auswählen eines Objektes in einem dicht belegten Gebiet zeigt jetzt + die "Select highlighted object"-Meldung auch die Informationen über das + Objekt an, die der SHOW-Befehl anzeigen würde. + - Fehlermeldungs-Dialoge verwenden jetzt die vom System definierten + akustischen Signale. + - Wenn Netz-Segmente verbunden werden, so wird der Benutzer jetzt immer über + den resultierenden Namen informiert. + - Die Befehle SIGNAL und PINSWAP bieten jetzt eine Auswahl an, wenn zum + Beispiel an einer Stelle zwei SMD-Pads auf Top und Bottom liegen. + - Der DELETE-Befehl kann jetzt abgebrochen werden wenn eine Gruppe gelöscht + wird. + - Der Cursor wird jetzt während des Freirechnens von Polygonen auf die + "Sanduhr" umgeschaltet. + - Das Selektieren von gesmashten Name/Value Texten in dicht belegten Gebieten + wurde verbessert. + - Falls es beim Austauschen eines Package in einem Board dazu kommt, dass + angeschlossene Pads dieses Elements ausserhalb der erlaubten Fläche der + Light- oder Standard-Edition zu liegen kommen, so werden die an diesen + Pads angeschlossenen Wires in Luftlinien verwandelt, um die Beschränkung + der erlaubten Fläche einzuhalten. + - Die Behandlung des '\' am Ende von Script-Zeilen wurde korrigiert (der '\' + fügte ein zusätzliches Leerzeichen ein, welches Probleme mit 'Description'- + Zeilen bei mehrfachem EXPORT/SCRIPT einer Library verursachte). + - Eine Luftlinie in einem dicht belegten Gebiet triggert jetzt auch dann den + Auswahlmechanismus, wenn die anderen Objekte zum gleichen Signal gehören. + - Das Flackern der Statuszeile beim Ausführen von Library-Scripts mit vielen + EDIT-Befehlen wird jetzt verhindert. + - Die Behandlung der Mausklicks unter Windows wurde geändert, um eine + bessere Selektierbarkeit der Buttons zu erreichen. + - Die Fortschrittsanzeige in der Statuszeile eines Editor-Fensters wird jetzt + nur mehr angezeigt, wenn sie auch tatsächlich aktiv ist. Der Prozentwert + wird jetzt unter Windows ausserhalb des Fortschrittsbalkens angezeigt. + - Falls beim Bewegen eines Bauteils in einem Schaltplan automatisch Net-Wires + generiert werden, so wird jetzt an beiden Enden dieser Wires geprüft ob + Junctions fehlen oder gelöscht werden können (funktioniert nur wenn + "Options/Set.../Misc/Auto set junction" aktiv ist). + - Die ERC-Prüfungen auf nicht angeschlossene Net-Wires und fehlende Junctions + wurden verbessert. + - Die Parameter-Toolbar enthält jetzt im Board-Kontext eine Combo-Box in der + Winkel angezeigt bzw. eingegeben werden können (anstelle der bisherigen + 4 Buttons für R0...R270). + - Das Verschieben des Zeichnungsauschnittes erfolgt jetzt durch Click&Drag + mit der mittleren Maustaste (nicht mehr durch Drücken der Ctrl-Taste). + Falls Sie die alte Verhaltensweise wiederhaben wollen können Sie dies + erreichen indem Sie die Zeile + + Interface.UseCtrlForPanning = "1" + + zu Ihrer Datei ~/.eaglerc hinzufügen. + Beachten Sie aber bitte, dass die Ctrl-Taste jetzt für spezielle Funktionen + einiger Befehle benutzt wird (zum Beispiel zum Selektieren von Objekten + an ihrem Aufhängepunkt bei MOVE), so dass Sie, bei Benutzung dieser speziellen + Funktionen, dann unter Umständen das Zeichenfenster unbeabsichtigt + verschieben können. + - Luftlinien der Länge 0 werden jetzt als X-förmige Kreuze dargestellt um ihre + Erkennbarkeit zu verbessern. + - Die neuen Füllmuster Stipple1, Stipple2, Stipple3 and Stipple4 (numerische + Werte 12..15) können benutzt werden um Layer zu zeichnen und zu löschen + ohne dass sie sich gegenseitig stören. + - Der Library-Update im Falle von Device-Sets mit sehr vielen Package- + Varianten wurde beschleunigt. + - Beim Durchschalten durch die verschiedenen Knickwinkel mit der rechten + Maustaste (zum Beispiel beim WIRE-Befehl) kehrt die Shift-Taste die + Richtung um und die Ctrl-Taste schaltet zwischen korrespondierenden + Knickwinkeln hin und her. + - Bei gesetzter Marke werden die relativen Koordinaten jetzt auch als + "Polarkoordinaten" (Radius + Winkel) angezeigt, was durch "(P ...)" in der + Koordinaten-Anzeige dargestellt wird. Dies kann auch dazu benutzt werden, + den Abstand zwischen zwei beliebigen Punkten zu messen. + - Koordinatenangaben in der Kommandozeile oder in Scripts können jetzt + auch relativ zur Marke und in Polarkoordinaten angegeben werden und können + einen Klick der rechten Maustaste simulieren, was vor allem nützlich ist + um eine Gruppe zu selektieren (siehe "Help/Editor-Befehle/Befehlseingabe"). + - Dialog-Eingabefelder, welche Dezimalzahlen akzeptieren, wandeln jetzt das + ',' (oder was auch immer der lokale Dezimalpunkt sein sollte) in einen + richtigen Dezimalpunkt ('.') um. + - Beim Laden eines Board/Schematic-Paares, welches nicht als konsistent + gekennzeichnet ist, wird jetzt automatisch eine Konsistenzprüfung + durchgeführt. + - Die Sheet-Auswahl-Combo-Box in der Action-Toolbar enthält jetzt den Eintrag + "remove", mit dem das aktuelle Sheet aus dem Schaltplan entfernt werden kann. + - Die von SHOW hervorgehobenen Objekte bleiben jetzt auch bei einem WINDOW- + Befehl hell. + - Das Rich Text Tag wird nicht mehr mit einer kleineren Schrift + dargestellt. + - Die relative Koordinatenanzeige benutzt jetzt mindestens die Auflösung, + mit der die Marke gesetzt wurde. + - Editor-Fenster haben jetzt einen neuen menü-Eintrag "File/Open recent", + über den auf einfache Weise die zuletzt benutzten Dateien wieder geladen + werden können. + - Die Zahl der Nachkommastellen bei der Anzeige von Werten in Mil bzw. Inch + wurde erhöht. + - Wenn bei einem Befehl keine Gruppe definiert oder diese leer ist erfolgt + keine Popup-Meldung mehr sondern es ertönt nur ein Ton und die Meldung + wird in der Statuszeile angezeigt. + - Unnötige Backups (z. B. "*.b#1") beim Abspeichern von Dateien werden jetzt + vermieden, wenn die Datei nicht verändert wurde. + - Die Ausgabe von EXPORT PARTLIST für den Fall, dass lange Namen oder Werte + verwendet wurden, wurde korrigiert. + +* Fehlerbehebungen: + + - Die Unterteilung des Undo-Puffers bei CHANGE PACKAGE und CHANGE TECHNOLOGY + wurde korrigiert. + - Die "Change Isolate" Menu-Option ist jetzt auch im Package-Editor verfügbar. + - Ein Polygon das nur aus zwei definierten Punkten besteht wird jetzt + abgewiesen. + - Die Entfernung einer mit ASSIGN belegten Taste aus der 'eaglerc'-Datei + wurde korrigiert. + - Das Setzen des Default-Grids beim Wechsel des Zeichnungstyps innerhalb + einer Bibliothek (Package, Symbol, Device) wurde korrigiert. + - Das Abbrechen eines Befehls durch Drücken von "Cancel" in einem Dialog + wurde korrigiert (der NET-Befehl zum Beispiel wurde nicht vollständig + abgebrochen). + - Die Initialisierung der $EAGLEDIR-Variablen für den Fall, dass das Programm + mit './eagle' gestartet wird, wurde korrigiert. + - Das Suchen der 'eagle.scr'-Datei im aktuellen Verzeichnis sowie die + Behandlung von Verzeichnisnamen in der Option -S wurde korrigiert. + - Das Überspringen unpassender Objekte beim Paste zwischen unterschiedlichen + Zeichnungstypen wurde korrigiert. + - Die User Language erzeugt jetzt eine Fehlermeldung wenn ein 'contact' von + einem 'pin' aus angesprochen wird, ohne einen 'device' Kontext zu haben. + - Das Abschalten der DRC-Prüfung "Kupfer gegen t/bRestrict" wurde korrigiert + (Polygone im t/bRestrict Layer wurden trotzdem geprüft). + - Das Umbenennen einer Package-Variante im Library-Editor wurde korrigiert. + - Die Darstellung von Pads/Vias für den Fall, dass ein zusätzlicher Signal- + Layer mit DISPLAY aktiviert wird, wurde korrigiert. + - UL_AREA für Packages und Symbols im UL_ELEMENT- bzw. UL_INSTANCE-Kontext + wurde korrigiert. + - Ein Fehler beim Ansprechen einer nicht initialisierten User Language + Variablen während diese definiert wird, wird jetzt richtig erkannt. + - Das Abspeichern von NET_WIRE_WIDTH und BUS_WIRE_WIDTH in der eaglerc-Datei + wurde korrigiert. + - Doppelte Datei-Einträge im Control Panel unter Windows nach einem Umbenennen + mit Groß-/Kleinschreibung werden jetzt vermieden. + - Die Aktualisierung des Control-Panel-Trees nach dem Anlegen eines neuen + CAM-Jobs wurde korrigiert. + - Die Behandlung von CAM-Job-Descriptions, die Gänsefüßchen enthalten, wurde + korrigiert. + - Die Behandlung der Maus-Rädchen-Events wurde korrigiert (bisher wurde der + eingestellte "Mouse wheel zoom"-Faktor bei jedem Event zweimal angewendet). + - Das Setzen des Fokus im DISPLAY- und LAYER-Dialog wurde korrigiert. + - Die Anzeige von 'not saved' in >LAST_DATE_TIME bei der Druckausgabe wurde + korrigiert. + - Die Eingabe von negativen Werten in 'real'-Eingabefeldern wurde korrigiert. + - Das Ersetzen eines identischen Packages aus einer anderen Library wurde + korrigiert. + - Objekte, die keinen Rasterpunkt belegen, werden jetzt vom Autorouter + virtuell vergrößert, so dass sie mindestens einen Rasterpunkt belegen und + somit für den Autorouter "sichtbar" sind. + - Ein Problem beim Löschen eines Layers aus dem DISPLAY-Dialog heraus wurde + behoben. + - Der Update von Library-Devices mit neu hinzugekommenen Packages wurde + korrigiert. + - Die Behandlung von Value on/off im Library-Update wurde korrigiert. + - Der BOARD-Befehl kopiert nicht mehr alle Package-Varianten in das neu + erzeugte Board, sondern nur die tatsächlich verwendeten. Beim Laden + eines Boards aus einer früheren Version werden automatisch die + überflüssigen Packages gelöscht. + - Der Autorouter routete manchmal nicht zwischen Objekten hindurch, wo er dies + eigentlich hätte tun sollen. + - Der 'Cancel'-Button hat manchmal nicht funktioniert wenn ein Message- + Dialog zum Beispiel in einem Script angezeigt wurde. + - Der ADD-Dialog zeigte nicht mehr alle benutzten Bibliotheken an, nachdem + ein Bauteil über das Control Panel hinzugefügt worden ist. + - Die Behandlung des Layers von gespiegelten Texten in UL_TEXT.wires wurde + korrigiert. + - Die Darstellung von am Cursor hängenden Objekten bei Ctrl+MausBewegung + wurde korrigiert (unter Windows wurden Objekte nicht richtig dargestellt). + - Der Technology-Parameter in EXPORTierten Library-Scripts wurde korrigiert + (die Werte waren nicht in Hochkommas eingeschlossen). + - Das Spiegeln von Labels in einem Schaltplan wurde korrigiert. + - Ein Absturz beim Aufruf von INVOKE in einem Board wurde behoben. + - 'Replace all' im Text-Editor bei mehrfachem Vorkommen in der gleichen Zeile + und unterschiedlicher Länge des Such- und Ersetzungstexts wurde korrigiert. + - Ein Fehler im Library-Update bei alleinstehenden Boards für den Fall, dass + im Package ein Pad gelöscht wurde, wurde behoben. + - CHANGE PACKAGE für den Fall, dass beide Devices keine Connects haben wurde + korrigiert. + - Das Flackern gesmashter Texte beim Bewegen von Bauteilen wurde behoben. + - Die Darstellung von Wires beim starken Hineinzoomen in die Zeichnung wurde + korrigiert. + - Die Behandlung von leeren Packages und Symbolen bei CUT/PASTE wurde + korrigiert. + - Das Setzen der Größe des ERRORS-Fensters wurde korrigiert. + - Die Eingaben für 'Scale factor' und 'Page limit' im PRINT-Dialog sind jetzt + auf Werte >=0 beschränkt. + - Die Behandlung von Netzklassen beim Umbenennen von Netzen wurde korrigiert. + - Ein fehlender 'L'-Parameter im Format-Statement (FS) des GERBER_RS274X wurde + in eagle.def hinzugefügt. + - Das Schließen eines Projektes im Falle, dass der Benutzer keine Schreibrechte + in dem Verzeichnis hat, wurde korrigiert. + - Das Setzen der benutzerdefinierten Defaultwerte für die Design Rules beim + Laden einer existierenden Library-Datei wurde korrigiert. + - Die Behandlung von Objekten im DRC, die zu keinem Signal gehören, wurde für + den Fall korrigiert, dass es keine Signale gibt, die der Default-Netzklasse + angehören. + - Der Header für Postscript-Dateien in 'eagle.def' wurde korrigiert. + - Die Funktion UL_VIA.diameter[] für LAYER_TSTOP und LAYER_BSTOP wurde für + den Fall korrigiert, dass der Bohrdurchmesser nicht größer als das Stop-Limit + in den Design Rules ist. + - Das Hinzufügen (ADD) von Bauteilen mit '(' oder ')' im Namen wurde + korrigiert. + - Ein Absturz in GROUP/CUT für den Fall, dass nur Net-Labels in der Gruppe + waren, wurde behoben. + - Die Behandlung von Packages, die sowohl Pads als auch Smds enthalten, wurde + korrigiert. + - Die Behandlung von mehrfachen gesmashten '>NAME' etc. Texten in User + Language Programmen wurde korrigiert. + - Die Behandlung des Polygon-Layers bei GROUP/CUT/PASTE mit Spiegelung wurde + korrigiert. + - Die Ausgabe von Polygonen mit "hatch" Füll-Linien bei aktivierter Option + "pos. Coord" im CAM-Prozessor wurde korrigiert. + - Der CAM-Prozessor beschwert sich nicht mehr über Layer, die im Job aktiviert + aber in der Zeichnung nicht verwendet sind. + - Das 'dxf.ulp' wurde korrigiert damit die Lötstopmaske für Pads, Vias und + Holes richtig dargestellt wird. + - Das Rotieren eines Objektes mit der rechten Maustaste während es mit + Click&Drag bewegt wird wurde korrigiert. + - Das Löschen eines Net-Wires, der mit einem Supply-Pin verbunden war, wurde + korrigiert (das verbleibende Netz wurde nicht entsprechend umbenannt). + - Das Setzen des >DRAWING_NAME-Parameters beim Erzeugen eines Boards aus einem + Schematic wurde korrigiert. + - Die Behandlung von Wires, die genau auf einer senkrechten Polygonkante + enden, wurde korrigiert (das Polygon wurde nicht als an den Wire angeschlossen + betrachtet). + - Das Schließen einer ULP-Include-Datei nach einer Fehlermeldung wurde + korrigiert (der Text-Editor konnte die veränderte Datei unter Windows + nicht zurückschreiben). + - Die Prüfung leerer (Value-) Texte im DRC wurde korrigiert. + - Das Drucken unter Linux, nachdem ein vorhergehender Druckauftrag abgebrochen + wurde, wurde korrigiert. + - Die Behandlung geknickter Wires im Falle von aktiviertem "Options/Set/Misc/Snap + bended wires" wurde korrigiert. + - Ein Puffer-Überlauf in der User Language Funktion printf() mit sehr langen + '%*'-Formaten wurde behoben. + - Die Behandlung von SET WIRE_BEND während des Zeichnens eines Wires wurde + korrigiert. + - Die Berechnung von Luftlinien der Länge 0 für den Fall, dass sich sehr nahe + an diesen Koordinaten ein weiterer Wire-Endpunkt befindet, wurde korrigiert. + - Das Suchen der Bibliothek im Bibliothekspfad im Falle von + "ADD bauteil@bibliothek" wurde korrigiert. + - Das Ausführen der 'eagle.scr' im Falle, dass in der Kommandozeile nach dem + EDIT-Befehl noch ein weiterer Befehl folgt, wurde korrigiert. + - EXPORT SCRIPT für den Fall, dass die Description der Library das Backslash- + Zeichen enthält, wurde korrigiert. + - Die Emulation dünner Arcs auf Photoplottern wurde korrigiert. + - Einige überflüssige '*' im Gerber RS274X Ausgabeformat wurden entfernt. + - Ein Abort im Falle, dass ein ULP die Netze eines Schematics von einem Board + aus via project.schematic(SCH) anspricht, wurde behoben. + - Die Lage der Pad-Namen von Pins in gespiegelten "instances" in der User + Language wurde korrigiert. + +Freigabemitteilung für EAGLE 4.09r2 +=================================== + +* CAM-Prozessor: + + - Die neue Kommandozeilen-Option '-N' kann dazu benutzt werden, die Prompts + in der Kommandozeile im CAM-Prozessor abzuschalten. Dies ist vor allem für + voll automatisierte CAM Batch-Jobs sinnvoll. + +* Fehlerbehebungen: + + - Die Behandlung von Supply-Layern wurde korrigiert, da es vorkommen konnte, + dass ein Pad/Via darin in seiner ursprünglichen Form dargestellt wurde + (zusätzlich zum Thermal/Annulus-Symbol). Dies konnte auch dazu führen, dass + der Autorouter ein Signal routete, welches eigentlich einen Supply-Layer + besaß (und deswegen nicht hätte geroutet werden müssen). + - Die DRC-Prüfung zwischen Kupfer und Dimension-Linien der Breite 0 wurde + korrigiert. + - Die Reaktion auf Änderungen der System-Farben im Help-Fenster unter Windows + wurde korrigiert. + - Die Behandlung von Pwr-Pins im Library-Update wurde korrigiert (die + Konsistenz konnte verloren gehen wenn die Pins im neuen Symbol eine andere + Reihenfolge hatten). + +Freigabemitteilung für EAGLE 4.09r1 +=================================== + +* Fehlerbehebungen: + + - Die Ausgabe von SMDs mit Roundness-Werten ungleich 0 oder 100 auf Photo- + plottern mit festen Blenden-Tabellen wurde korrigiert. Beachten Sie bitte, + dass Blenden-Toleranzen relativ zu den endgültigen Abmessungen der Objekte + gelten, so dass die tatsächlich verwendete Blende beim Zeichnen eines + SMDs mit Roundness größer sein kann, selbst wenn nur eine negative Toleranz + angegeben wurde. Ebenso kann der Unterschied zwischen der ursprünglich + angeforderten und der tatsächlich verwendeten Blende wesentlich größer sein, + als der Toleranzwert erwarten lassen würde. + Wenn Sie CAM-Daten für ein Board erzeugen das SMDs mit Roundness enthält + und Sie erhalten eine Fehlermeldung "Aperture missing" bezüglich einer + Draw-Blende, so können Sie versuchen durch Angabe einer negativen Toleranz + von einigen Prozent für Draw-Blenden das Zeichnen dieser abgerundeten SMDs + zu ermöglichen (diese werden dann so dargestellt als hätten Sie einen + etwas größeren Roundness-Wert). + - Die Behandlung von GROUP-Rechtecken mit Breite 0 (welche einen Programm- + absturz zur Folge hatten) wurde korrigiert. + - Die Ausgabe der Bohrsymbole im CAM-Prozessor mit Postscript für den Fall, + das der Pads- bzw. Vias-Layer nicht eingeblendet ist, wurde korrigiert. + - Ungerechtfertigte 'close but unconnected...' Warnungen im ERC werden jetzt + vermieden. + - Die Behandlung der Netzklassen bei der Forward-Annotation des Aufspaltens + eines Netzes wurde korrigiert. + - Der Library-Update bei CUT/PASTE von einem Schematic in ein anderes wurde + korrigiert (es kam keine Fehlermeldung wenn eine Package-Variante nicht + mehr verfügbar war). + - Der fehlende "Cam Processor"-Eintrag wurde zum Pulldown-Menü des + Schaltplan-Editors hinzugefügt. + - Die Behandlung der "Description" bei der Beurteilung, ob ein CAM-Job + verändert worden ist, wurde korrigiert. + +Freigabemitteilung für EAGLE 4.09 +================================= + +Änderung der Versionsnummer für die endgültige Freigabe. + +Freigabemitteilung für EAGLE 4.08r2 +=================================== + +* Fehlerbehebungen: + + - Das Löschen von Netz-Segmenten von Pins, die mit anderen Segmenten + überlappen, wurde korrigiert (in solchen Fällen konnte es vorkommen, dass + die Konsistenz zwischen Board und Schematic verloren ging). + +Freigabemitteilung für EAGLE 4.08r1 +=================================== + +* Fehlerbehebungen: + + - Ein Problem beim Schließen eines Fensters und Abbrechen des "Save?" + Dialogs wurde behoben. + - Der Library-Update im ADD-Befehl für den Fall, dass eine Package-Variante + fehlt, wurde korrigiert. + +Freigabemitteilung für EAGLE 4.08 +================================= + +* Fehlerbehebungen: + + - Die Fehlermeldung "Load error 293" kam manchmal ungerechtfertigterweise. + +Freigabemitteilung für EAGLE 4.07 +================================= + +* Fehlerbehebungen: + + - Die Fehlermeldung "Load error 293" kam manchmal ungerechtfertigterweise. + - Ein möglicher Absturz beim Schließen eines Fensters in einem Script wurde + behoben. + +Freigabemitteilung für EAGLE 4.06 +================================= + +* Fehlerbehebungen: + + - Die Prüfung von rechteckigen Objekten gegen kreisförmige Objekte im DRC + wurde korrigiert. + - Die Installation der ausführbaren Datei und der Manualseite unter Linux + wurde korrigiert. + +Freigabemitteilung für EAGLE 4.05 +================================= + +* Fehlerbehebungen: + + - Die Polygon-Berechnung unter Windows wurde korrigiert. + - Das Abbrechen des Autorouters während des Ripup wurde korrigiert. + - Die Behandlung von Kreisen im Autorouter wurde korrigiert (manchmal wurde + einfach hindurch geroutet). + +Freigabemitteilung für EAGLE 4.04 +================================= + +* DELETE-Befehl: + + - Net-Segmente, die an einem Bus angeschlossen sind, behalten jetzt ihren + Namen wenn ein Segment aufgetrennt wird. + - In der Online-Hilfe zum DELETE-Befehl wurde ein Hinweis bezüglich des + Ripups von Signal-Wires beim Löschen eines Bauteils mit SHIFT+Delete + aufgenommen. + +* ERC-Befehl: + + - Um Boards/Schematics bearbeiten zu können, die nur geringfügige + Inkonsistenzen aufweisen, kann der Benutzer jetzt einen Dialog aktivieren + der es ihm erlaubt den Editor dazu zu zwingen, die Forward-/Backannotation + durchzuführen, selbst wenn der ERC die Dateien als inkonsistent erkannt + hat. Dies kann durch Hinzufügen der Zeile + + Erc.AllowUserOverrideConsistencyCheck = "1" + + ans Ende der Datei ~/.eaglerc erfolgen. + BEACHTEN SIE BITTE, DASS SIE DIES AUF EIGENES RISIKO MACHEN - sollten die + Dateien danach zerstört werden, kann womöglich niemand mehr sie wieder- + herstellen. Schließlich *hat* der ERC ja gemeldet, dass die Dateien + inkonsistent sind! + - Der ERC meldet jetzt einen Fehler wenn Supply-Pins mit dem selben Namen + mit mehr als einem Signal überschrieben werden. + +* EXPORT-Befehl: + + - Der EXPORT SCRIPT Befehl setzt jetzt die Grid-Einheit explizit auf 'mm' + wenn die aktuelle Grid-Einheit nicht metrisch ist, um Genauigkeitsverluste + zu vermeiden. + +* INFO-Befehl: + + - Der INFO-Befehl zeigt jetzt den VIA-Durchmesser getrennt für Aussen- und + Innenlagen an (so wie er sich aus den Design Rules ergibt), sowie den + ursprünglich vom Benutzer vergebenen Wert. + Das Format ist "Diameter = aussen/innen (original)". + +* OPTIMIZE-Befehl: + + - Der OPTIMIZE-Befehl optimiert jetzt auch die "flachen" Wires in einem Board + (also diejenigen, die nicht Bestandteil eines Signals sind). + +* PACKAGE-Befehl: + + - Der PACKAGE-Dialog akzeptiert jetzt ein leeres "Variant name"-Feld und + verlangt nicht mehr die explizite Eingabe von '' (zwei einfache Hochkommas) + für die Definition einer Package-Variante mit einem "leeren" Namen. + +* TECHNOLOGY-Befehl: + + - Der TECHNOLOGY-Befehl fragt nicht mehr nach bevor er eine Technology von + einem Device entfernt. + +* WIRE-Befehl: + + - Um die Abarbeitung großer Script-Dateien, die viele Wires erzeugen, zu + beschleunigen, schaltet 'Set Optimizing Off' jetzt in einem Script auch + das automatische Splitten von Wires ab. + +* User Language: + + - Bei Ausführung eines ULPs wird jetzt der interne Suchpfad für Bilder auf + das Verzeichnis des ULPs gesetzt. + - Die Help-Seite für Rich Text enthält jetzt eine Liste der unterstützten + Bildformate für das "" Tag. + - Die neue Member-Funktion UL_LAYER.used kann dazu benutzt werden in einem + ULP zu prüfen, ob ein bestimmter Layer tatsächlich in der Zeichnung + benutzt wird. + - Die neuen "Builtin-Constants" "path_...[]" und "used_libraries[]" können + benutzt werden um die Einträge im "Options/Directories"-Dialog und die + gerade benutzten Bibliotheken abzufragen. + Siehe "Help/User Language/Builtins/Builtin-Constants". + - Der neue Mode-Buchstabe 'F' im 'output()'-Statement der User Language + kann benutzt werden um das Öffnen einer Datei mit einer ansonsten + geschützten Extension zu erzwingen (*.brd, *.sch oder *.lbr). + +* Sonstiges: + + - Der CAM-Prozessor wurde beschleunigt. + - Der NET- bzw. SIGNAL-Befehl wird nicht mehr abgebrochen, wenn ein + 'Connect...?'-Dialog mit 'Cancel' beendet wird. + - Die Bohrlöcher von Pads und Vias werden nicht mehr von Polygonen abgezogen. + - Die Position der "Splitter" in Dialogen wie zum Beispiel "ADD" wird nicht + mehr prozentual in der Datei ~/.eaglerc gespeichert, + sondern als absolute Pixel-Werte. Beim ersten Öffnen eines solchen Dialogs + mit dieser Programmversion kann es daher sein, dass die Splitter-Positionen + nicht denen beim letzten Verlassen des Dialoges entsprechen. + - Polygone, die nach der Berechnung durch RATSNEST vollständig verschwinden + würden, werden jetzt auf dem Bildschirm im Ursprungszustand dargestellt. + Damit ist es möglich diese zu editieren oder zu löschen. + - Der Dialog zum Editieren von Strings passt jetzt seine Breite an um lange + Strings vollständig anzuzeigen (zum Beispiel beim Editieren eines langen + Busnamens). + - Command-Text-Buttons (über den MENU-Befehl definiert) bleiben jetzt + gedrückt um das momentan aktive Kommando anzuzeigen (gilt nicht für + Buttons die zu einem Untermenü führen). + - Der Windows Datei-Dialog prüft nicht mehr, ob eine Datei existiert. Dadurch + kann der Benutzer die Datei-Extension weglassen, wenn er einen Namen + eintippt. + - Die Command-Button Gruppen werden jetzt durch waagrechte Linien getrennt, + was Platz im Command-Menü spart. + - Der Defaultwert für die Lötstopmaske ("Edit/Design rules/Masks/Stop") + wurde auf einen festen Wert von 4mil eingestellt. + - Die Größe der SMD-Namen, die angezeigt werden wenn SET PAD_NAMES 'on' ist, + wird jetzt auf maximal 20mil begrenzt. + - Das "Description"-Feld im Library-Editor und das rechte Feld im Control- + Panel können jetzt mit dem Splitter vollständig minimiert werden. + - Wenn eine Package-Variante oder Technology nicht mehr vorhanden ist (weil + sie z.B. gelöscht oder umbenannt wurde) kann der Benutzer jetzt beim + Library-Update eine andere dafür auswählen. + - Die automatische Wahl der Einheiten in Dialog-Eingabefeldern kann jetzt + durch Hinzufügen der Zeile + + Interface.PreferredUnit = "x" + + ans Ende der Datei ~/.eaglerc kontrolliert werden, + wobei "x" den Wert + "0" für automatische Wahl der Einheiten (default) + "1" für zöllige Einheiten + "2" für metrische Einheiten + annehmen kann. + - Das 'dxf.ulp' hat jetzt Radio-Buttons über die die Einheit der generierten + Daten gewählt werden kann ('mm' oder 'inch') und gibt Werte in 'mm' mit + 4 Nachkommastellen aus anstatt bisher mit 3. + - Der CAM-Prozessor bricht im Kommandozeilen-Modus nicht mehr ab, wenn eine + Warnung ausgegeben wird, sondern gibt jetzt einen Prompt aus an dem der + Benutzer entscheiden kann, ob er weitermachen will oder nicht. + +* Fehlerbehebungen: + + - Die Behandlung von Klein-/Großbuchstaben beim Löschen bzw. Umbenennen von + Bibliotheksobjekten wurde korrigiert. + - Die Fehlerbehandlung im Falle der Verwendung einer nicht existierenden + Member-Funktion in einem ULP wurde korrigiert. + - Der Library-Update Fehler 403-1362 wurde behoben. + - Der Library-Update für den Fall, dass ein Device-Set nicht mehr in der + Bibliothek vorhanden ist, wurde korrigiert. + - Das Ausdrucken von Thermal-Symbolen über den PRINT-Befehl funktionierte + nicht. + - Technologies können keine Kleinbuchstaben mehr enthalten. + - Devices mit Gänsefüßchen im Namen werden jetzt im Control-Panel richtig + gehandhabt. + - Die Fokus-Behandlung im 'Connect Nets' Dialog wurde korrigiert. + - Die internen Objekt-Zähler werden jetzt gegen eine Sicherheitsgrenze + geprüft um Überläufe zu vermeiden. + - Die Zusammenfassung von Wire-Segmenten nach MOVE wurde korrigiert. + - Der Layer in den Funktionen UL_POLYGON.contours und UL_POLYGON.fillings + im Falle gespiegelter Polygone wurde korrigiert. + - Die Behandlung der PWR-Pins im Library-Update wurde korrigiert. + - Das Exportieren von Images wurde korrigiert. + - Die Behandlung von druckerspezifischen Papierformaten unter Windows wurde + korrigiert. + - Der Library-Update für den Fall, dass Packages im Board mit REPLACE + ausgetauscht worden sind, wurde korrigiert. + - Leere Values von gesmashten Bauteilen können nicht mehr versehentlich + selektiert werden. + - Die Behandlung des '\' im "Options/Directories"-Dialog unter Windows wurde + korrigiert. + - Die Darstellung von User Language Dialogen unter Windows wurde korrigiert. + - Die Behandlung von Technology-Werten mit genau 13 Zeichen wurde korrigiert. + - Der EXPORT SCRIPT Befehl generiert jetzt explizit ein "-''" wenn ein + Device die leere Technology nicht enthält. + - Die Behandlung von Kleinbuchstaben beim Löschen von Technologies wurde + korrigiert. + - Das Aufsplitten von Net-Segmenten mit Supply-Symbolen wurde korrigiert. + - Die Ausgabe der Netzklasse für implizite PWR-Pins im EXPORT-Befehl wurde + korrigiert. + - Die Optimierung der Wires nach dem Löschen einer Gruppe wurde korrigiert. + - Die Behandlung der PRINT-Option '-0' wurde korrigiert. + - Die Behandlung von Zeilen mit mehr als 1000 Zeichen in 'eaglerc' wurde + korrigiert. + - Der Befehl "SET BEEP ON|OFF" wurde korrigiert. + - Ein möglicher Absturz unter Windows, wenn das System-Datum ausserhalb des + Bereichs 1970..2037 lag, wurde behoben. + - Die Verarbeitung von '(' in der Kommandozeile wurde korrigiert (verursachte + eine Fehlermeldung beim Umbenennen einer Package Variante die dieses Zeichen + enthielt). + - Beim Löschen eines Bauteils aus einem Schematic mit SHIFT+Delete konnte es + zum Programmabsturz kommen, wenn dieses Bauteil das letzte seiner Art in + dieser Zeichnung war. + - Das Löschen von Bauteilen mit SHIFT+Delete funktionierte nicht für Bauteile, + deren Gatter sich auf unterschiedlichen Sheets befanden. + - Bei exportierten Scripts fehlte das abschließende ';' bei "Hole...". + - Der "WRITE @filename;"-Befehl wurde korrigiert. + - Die Behandlung der Directory-Pfade nach einem Navigieren mit dem Datei-Dialog + wurde korrigiert. + - Der "...not saved" Dialog für den Fall, dass ein anderes Board geladen + werden soll, nachdem eine Änderung gemacht wurde die sowohl das Board als + auch das Schematic betraf, wurde korrigiert (er listete das Schematic nicht + als verändert). + - Das Setzen der Netzklasse eines neu gezeichneten Netzes oder Signals wurde + für den Fall, dass der Netz- bzw. Signalname in der Kommandozeile angegeben + wurde, korrigiert. + - Der Library-Update für den Fall, dass ein nicht-Pwr-Pin zu einem Pwr-Pin + wurde, wurde korrigiert. + - Die Behandlung von nicht angeschlossenen Supply-Pins wurde korrigiert. Diese + werden jetzt implizit an das gleiche Netz angeschlossen wie alle anderen + überschriebenen Supply-Pins gleichen Namens. + - Die Behandlung von "&xxx;"-Tags im Control Panel wurde korrigiert. + - Wenn ein neues Netz- bzw. Signal-Segment an ein bestehendes herangezeichnet + wird, so wird nicht mehr die Netzklasse des bestehenden Netzes/Signals + überschrieben. + - "File/Open/Text..." öffnet jetzt immer ein Text-Editor Fenster, selbst wenn + der Dateiname eine Extension hat, die ein anderes Fenster erfordern würde + (z.B. ".cam"). + - Das Library-Editor-Fenster wird jetzt nach der Ausführung eines Scripts + aktualisiert. + - Das Schließen eines "Description" oder "Connect" Dialogs über den "Close"- + Button des Systems reagiert jetzt richtig wenn der Benutzer sich dazu + entschließt, eventuelle Veränderungen nicht zu verwerfen. + - Wenn vom Control-Panel aus mit "File/Open/..." eine Datei geöffnet wird, + dann wird jetzt die passende Dateinamenserweiterung angefügt, falls diese + fehlt. + - Die Benamung der Netze im Falle, dass der NET-Befehl einen expliziten + Netznamen enthält, wurde korrigiert. + - Die Unterteilung des Undo-Puffers im REPLACE-Befehl wurde korrigiert. + - Die Vorgabe des Verzeichnisses bei "Save as..." wurde korrigiert. + - Die Behandlung der PRINT-Parameter in der Kommandozeile wurde korrigiert. + - Die Selektierung von nahe beieinander liegenden Objekten wurde korrigiert. + - Die Verwendung eines Ausdrucks als "Title" einer dlgGroup wurde korrigiert. + - Die User Language liefert keine Wires im Layer 0 mehr. + - Die PASTE-Operation für Netze mit unterschiedlichen Netzklassen als ein + bereits vorhandenes Netz des selben Namens wurde korrigiert. + - Die Positionierung der Toolbars wurde korrigiert. + - Die Prüfung der vom Benutzer definierten Ränder beim Drucken gegen die + Minimalwerte des Drucker-Treibers wurde korrigiert. + - Der Library-Update für den Fall, dass Pin-Namen das '@'-Zeichen enthalten, + wurde korrigiert. + - Die Behandlung von Pin-Namen in der User Language, die '@' enthalten, + wurde korrigiert. + - Die Behandlung der Parameter-Strings (z.B. '>NAME') in ULPs für den Fall, + dass das Editor-Fenster nach einem Dialog neu gezeichnet werden muss, wurde + korrigiert. + - Die Behandlung des '>GATE' Parameter-Strings in ULPs wurde korrigiert. + - Die Funktion UL_TEXT.wires() für gespiegelte Texte von gesmashten + Elementen wurde korrigiert. + - Das Berechnen des Ratsnest nach dem Hinzufügen eines Bauteils mit vielen + Pwr-Pins dauerte sehr lange. + - Die Blattgröße für das PS_DINA3-Device im CAM-Prozessor wurde korrigiert. + - Die Polygon-Freirechnung wurde korrigiert für den Fall, dass viele gleiche + Objekte von dem selben Polygon abgezogen werden müssen. + - Das Schließen eines Fensters mit CLOSE von einem Script aus, das von einem + anderen Fenster aus gestartet wurde, wurde korrigiert. + - Der Kompatibilitätsmodus mit Version 3.5 im PACKAGE-Befehl wurde korrigiert. + - Die Funktion UL_PIN.contact wurde für den Fall korrigiert, dass sie aus + einem UL_PINREF-Kontext heraus aufgerufen wurde. + +Freigabemitteilung für EAGLE 4.03 +================================= + +ACHTUNG: Aufgrund einer notwendigen Änderung in der Datenstruktur können Sie + Dateien, die mit Version 4.03 bearbeitet wurden, nicht mehr mit einer + früheren Version bearbeiten. + + BITTE LEGEN SIE BACKUP-KOPIEN IHRER PLATINEN-, SCHALTPLAN- UND + BIBLIOTHEKS-DATEIEN AN, BEVOR SIE MIT VERSION 4.03 BEARBEITET + WERDEN. + +* ADD-Befehl: + + - Der ADD-Dialog hat jetzt einen 'Drop'-Button, der die aktuelle Bibliothek + aus der Liste entfernt. + - Der ADD-Befehl kann jetzt ein bestimmtes Gatter eines Devices holen, ohne + dabei automatisch die MUST- und ALWAYS-Gatter ebenfalls zu holen. + - Einige Benutzer wollen immer den Device-Namen als Bauteilwert verwenden, + selbst wenn das Bauteil einen benutzerdefinierten Wert bräuchte. Wer das + will kann das jetzt durch Hinzufügen der Zeile + + Sch.Cmd.Add.AlwaysUseDeviceNameAsValue = "1" + + ans Ende der Datei ~/.eaglerc erreichen. + +* DELETE-Befehl: + + - Der DELETE-Befehl löscht jetzt das ganze Bauteil wenn mit gedrückter Shift- + Taste auf ein Gatter geklickt wird. In diesem Fall werden die an dem Bauteil + im Board angeschlossenen Wires nicht in Luftlinien verwandelt. + - Der DELETE-Befehl löscht jetzt das gesamte Polygon wenn mit gedrückter + Shift-Taste auf einen Wire eines Polygons geklickt wird. + - Der DELETE-Befehl löscht jetzt das gesamte Netz- bzw. Bus-Segment wenn mit + gedrückter Shift-Taste auf einen Netz- bzw. Bus-Wire geklickt wird. + +* ERC-Befehl: + + - Da manche Anwender die neuen ERC-Prüfungen nicht haben wollen, lassen sich + diese jetzt durch Hinzufügen der Zeile + + Erc.SuppressAdditionalWarnings = "1" + + ans Ende der Datei ~/.eaglerc unterdrücken. + - Der ERC meldet jetzt unbenutzte MUST-Gatter als Fehler. + - Der ERC prüft jetzt ob Netze und Signale konsistente Netzklassen haben. + - Der ERC prüft nicht mehr auf Pin-Überlappungen innerhalb eines Gatters. + +* EXPORT-Befehl: + + - Der EXPORT IMAGE Befehl akzeptiert jetzt das neue Schlüsselwort + MONOCHROME um ein schwarz/weisses Bild zu erzeugen. + - EXPORT IMAGE schaltet jetzt den Mauscursor auf die Sanduhr um, wenn die + Aktion länger dauert. + - EXPORT NETSCRIPT gibt jetzt die Netzklassen mit aus. + +* INFO-Befehl: + + - Der INFO-Befehl zeigt jetzt auch den Layer-Namen an. + +* LAYER-Befehl: + + - Die neue Option '??' kann beim Löschen eines Layers angegeben werden, um + Fehlermeldungen zu unterdrücken. + +* UPDATE-Befehl: + + - Der UPDATE-Befehl kennt jetzt die Parameter '+@' und '-@', die benutzt + werden können um die in einer Zeichnung befindlichen Bibliotheken + umzubenennen. + +* VALUE-Befehl: + + - Einige Anwender wollen die Warnung bezüglich Bauteilen, die keinen vom + Benutzer zu vergebenden Wert haben, nicht. Diese Warnung kann jetzt durch + Hinzufügen der Zeile + + Warning.PartHasNoUserDefinableValue = "0" + + ans Ende der Datei ~/.eaglerc unterdrückt werden. + +* Design Rules: + + - Die DRC-Prüfung "Kupfer gegen t/bRestrict" kann jetzt im Design Rules + Dialog über "Misc/Check restrict" komplett abgeschaltet werden. + Standardmäßig werden alle Kupferobjekte in den Layern Top und Bottom + gegen Objekte in t/bRestrict geprüft. + - Auf der "Restring"-Seite gibt es jetzt Checkboxen die eingeschaltet + werden können um den Durchmesser von Pads und Vias auch in Innenlagen zu + berücksichtigen. Standardmäßig ist diese Option bei neu angelegten Boards + ausgeschaltet, wird aber beim Update von Boards aus Version 3.5 oder + früher eingeschaltet, da in diesen Versionen Pads und Vias auf allen Layern + den gleichen Durchmesser hatten. + UM DIESES FEATURE EINBAUEN ZU KÖNNEN WAR ES NÖTIG, DIE DATENSTRUKTUR SO + ZU ÄNDERN, DASS DATEIEN DIE MIT VERSION 4.03 BEARBEITET WURDEN NICHT MEHR + IN FRÜHERE VERSIONEN GELADEN WERDEN KÖNNEN (ANSONSTEN WÄREN DIE ERGEBNISSE + UNTER UMSTÄNDEN NICHT KORREKT). + - Die Restring-Parameter in den Design Rules werden nicht mehr auf 0 gesetzt + wenn ein Board aus Version 3.55 oder früher upgedatet wird. Sie bleiben + jetzt auf den Defaultwerten und wenn die Datei Pads oder Vias enthält, die + durch diese neuen Parameter vergrößert würden, so wird der Benutzer darauf + hingewiesen und gebeten, die Design Rules wenn nötig anzupassen. + Wenn der CAM-Prozessor eine Datei aus Version 3.55 (oder früher) lädt, so + werden die Restring-Parameter nach wie vor auf 0 gesetzt um sicherzustellen, + dass das Ergebnis das gleiche ist wie in früheren Versionen. + Wenn eine Datei aus Version 4.0 oder 4.01 geladen wird, so werden die + Restring-Parameter geprüft und der benutzer wird, falls diese 0 sind, + darauf hingewiesen und gebeten, die Design Rules wenn nötig anzupassen. + - Der DRC überprüft die Design Rules jetzt auf Plausibilität. + - Der DRC prüft jetzt nur noch Pads und Smds, sowie alle an diese + angeschlossenen Kupfer-Objekte, gegen Dimensions. + +* Polygone: + + - Die Einschränkung, dass das für die Berechnung der Konturdaten verwendete + Polygon mit dem Namen _OUTLINES_ den Isolate-Wert 0 haben muss, entfällt + (siehe "Help/Ausgabedaten erzeugen/Konturdaten"). + - Bei der Berechnung des _OUTLINES_-Polygons wurden fälschlicherweise Objekte + in den Layern t/bRestrict und Dimension abgezogen. + +* User Language: + + - Neue Data-Mambers UL_PART.deviceset, UL_DEVICESET.library, + UL_DEVICE.library und UL_SYMBOL.library. + +* CAM-Prozessor: + + - Der CAM-Prozessor kann wieder Schaltpläne ausgeben. + +* Sonstiges: + + - Die Selektierbarkeit von Arcs wurde verbessert. + - Das Abspeichern von Dateien dauerte recht lange, wenn sich sehr viele + Dateien im Control Panel Tree befanden und in einem langsamen Netzwerk + gearbeitet wurde. + - Das "Always vector font"-Flag, das in Zeichnungsdateien gespeichert wird, + kann jetzt über "Options/Set/Persistent in this drawing" gesteuert werden + (bisher war das nur durch Eingabe eines SET-Befehls in der Kommandozeile + möglich). + - Die Vektor-Font Zeichen '&', '@' und '~' wurden verbessert. + - Das 'dxf.ulp' gibt jetzt Texte standardmäßig immer mit dem eingebauten + Vektor-Font aus (über eine neue Checkbox im Dialog kann das geändert werden). + - Junctions werden jetzt auch beim Platzieren eines Bauteils automatisch + gesetzt, und sie werden automatisch gelöscht wenn ein Bauteil oder ein + Net-Wire gelöscht wird. + - Das automatische Öffnen des Projekt-Verzeichnisses beim Programmstart + (bzw. wenn ein Projekt durch Klicken auf seinen grauen Button aktiviert + wird) kann jetzt durch Hinzufügen der Zeile + + ControlPanel.View.AutoOpenProjectFolder = "0" + + ans Ende der Datei ~/.eaglerc unterdrückt werden. + +* Fehlerbehebungen: + + - Teilweise routete der Autorouter zu nahe an Pads heran, was zu + Kurzschlüssen führen konnte (dies trat nur dann auf, wenn die Pad-Form + auf den verschiedenen Layern unterschiedlich war). + - Unter Linux konnte es bei X-Servern mit 8 Bit Farbtiefe zu einem Absturz + bei EXPORT IMAGE kommen. + - Beim Löschen eines Sheets mit dem REMOVE-Befehl konnte es zu einem Absturz + kommen. + - Beim Erzeugen der Daten für einen Supply-Layer mit dem CAM-Prozessor + Device GERBER_RS274X fehlten die Thermal-Stege. + - Beim Ausdruck mehrerer Sheets war die Bildunterschrift beim zweiten und + weiteren Blättern unter Windows bei manchen Druckern nicht korrekt. + - Der CAM-Prozessor erzeugte mit GERBERAUTO nicht immer alle Blenden wenn + Pads oder Vias in verschiedenen Layern unterschiedliche Formen hatten. + - Der Resourcenverbrauch unter Windows wurde erheblich gesenkt. + - Bei Eingabe zu langer Befehlsnamen kam es zu einem Absturz. + - Die Werte der CAM-Prozessor Kommandozeilen-Optionen -h, -w, -x und -y + wurden fälschlicherweise abgewiesen. + - In 'eagle.def' definierte Werte für Width und Height wurden nicht in das + CAM-Prozessor Fenster übernommen, und im CAM-Prozessor eingegebene Werte + für Width und Height wurden nicht verwendet. + - CUT funktionierte nicht mit der rechten Maustaste. + - Der Library-Update-Mechanismus erkannte manchmal unterschiedliche Symbole + oder Packages nicht, was dazu führen konnte, dass man bestimmte Bauteile + nicht zu einer Schaltung hinzufügen konnte. + - Wenn bei EXPORT IMAGE die resultierende Bitmap zu groß wurde, konnte es + zum Absturz kommen oder es wurde ohne weitere Meldung kein Output erzeugt. + - Beim Anlegen von Bibliothekselementen war es möglich Namen einzugeben, die + Leerzeichen enthielten. + - Wenn EXPORT IMAGE in einer frisch geladenen Bibliothek benutzt wurde, in + der noch kein Objekt zum Editieren geladen wurde, stürzte das Programm ab. + - Unter Windows konnte es vorkommen, dass das Programm beim Verlassen mit + Alt-X abstürzte. + - Die User Language Funktion fileglob() funktionierte nicht, wenn der Pattern + für den Filenamen ein Leerzeichen enthielt. + - Es konnte vorkommen, dass einige Layer im CHANGE PACKAGE Vorschaufenster + nicht dargestellt wurden. + - Der gewählte Zeichnungsausschnitt wurde nicht richtig wiederhergestellt + wenn ein Schematic aus einem Projekt geladen wurde. + - Die ERC-Warnung bezüglich zu nahe beieinanderliegender Net-Wires wird nicht + mehr ausgegeben, wenn sich an dieser Stelle ein Bus-Wire befindet. + - Unter Windows ignorierte der UPDATE-Befehl die Groß-/Kleinschreibung nicht. + - CHANGE LAYER für ein Polygon in einem Package funktionierte nicht richtig. + - Beim Ausdrucken mehrerer Sheets unter Windows 2000 war der Offset beim + zweiten und allen folgenden Sheets bei manchen Druckertreibern falsch. + - Leerzeilen in Textdateien wurden nicht ausgedruckt. + - Das Editieren der DESCRIPTION eines Verzeichnisses erzeugte unter Windows + fehlerhafte Zeilenenden. + - Es erfolgte keine Fehlermeldung wenn die DESCRIPTION-Datei nicht + geschrieben werden konnte. + - Das Berechnen und Löschen der DRC-Fehler im Falle der Verwendung des + großen Cursors wurde beschleunigt. + - Das Einlesen einer Design Rules Datei funktionierte nicht, wenn die + Decription ein '=' enthielt. + - Die Liste der "Package Varianten" im Device Editor wurde nicht aufgefrischt + wenn ein Package umbenannt wurde. + - Das Control Panel öffnete den Tree zum beim Programmstart geladenen Projekt + nicht, wenn im "Projects" Pfad mehr als ein Directory eingetragen war. + - Der Tree im Control Panel wurde nach Aktionen wie Umbenennen, Kopieren etc. + nicht aufgefrischt. + - Die Beschreibung der User Language Funktion 'lookup()' fehlte in der + deutschen Online-Hilfe unter Windows. + - Relative symbolische Links wurden unter Linux nicht richtig expandiert. + - Pads und Vias hielten ihre Bohrlöcher innerhalb von Signalpolygonen nicht + offen. + - Der DRC meldet jetzt Texte in Signallagen, die nicht den eingebauten + Vektor-Font benutzen (diese Prüfung kann über "Check texts" auf der "Misc"- + Seite des Design Rules Dialoges abgeschaltet werden). + - Der DRC und der Autorouter stürzten manchmal ab wenn das Board einen großen + Arc oder Circle enthielt. + - Polygon-Wires reagieren nicht mehr auf CHANGE STYLE. + - Der SIGNAL-Befehl fragte nicht nach, ob neu angelegte Signale mit bereits + existierenden verbunden werden sollen, sondern hat sie einfach + stillschweigend verbunden. + - Wird ein Dialog abgebrochen ('Cancel'), so wird ein eventuell laufendes + Script jetzt ebenfalls beendet. + - Vorher eingegebener Text im 'Find'-Dialog des Text-Editors ist jetzt + selektiert. + - Der 'Sanduhr'-Cursor wird jetzt bei Dialogen während länger dauernder + Vorgänge vermieden. + - EXPORT IMAGE benutzte nicht die im Board definierten Design Rules. + - Ein von einem UL_INSTANCE abgeleitetes UL_GATE lieferte nicht die + richtigen Werte für x und y. + - Beim Einlesen eines Autorouter Control-Files das einen Wert für das + Routing-Grid enthielt der die interne Auflösung des Editors von 0.0001mm + überstieg wurde dieser Wert auf die interne Auflösung gerundet. + - Wenn eine Datei über das Kontext-Menü des Control Panels geöffnet wurde, + so funktionierten unter Windows die Toolbar Buttons des Editor-Fensters + nicht richtig. + - Es kam zum Absturz wenn ein Device mittles Drag&Drop in ein Schematic + eingefügt wurde, und die Bibliothek aus einer älteren Version upgedatet + werden musste. + - Der PRINT-Befehl behandelte unter Linux einige Papierformate nicht richtig. + - Wurde im CAM-Prozessor ein Device verwendet das Farben unterstützt, so + führte die Benutzung von "Layer/Show selected" oder "Layer/Show all" dazu, + dass die Anzeige der Farbnummern in der Layer-Liste verschwand. + - Das Entfernen einer Tastenbelegung mit "ASSIGN key;" funktionierte nicht. + - Der ADD-Befehl fügte kein neues Bauteil hinzu wenn ein Bauteilname + angegeben wurde und es noch unbenutzte NEXT-Gatter dieses Typs in einem + bereits existierenden Bauteil gab. + - Der 'Stop'-Button wurde nicht richtig deaktiviert wenn er im LABEL-Befehl + gedrückt wurde. + - Supply-Layer wurden nicht richtig ausgedruckt wenn der Ausdruck gedreht + erfolgte. + - Im Text-Editor war der Cursor in der ersten Spalte nicht sichtbar, wenn das + erste Zeichen einer Zeile zum Beispiel '{' war. + - Wenn der MOVE-Befehl im "Click&Drag"-Modus verwendet wird, so wird das + Loslassen der Maustaste ausserhalb der Zeichenfläche ignoriert (so, wie das + auch in Version 3.55 der Fall war). + - Manchmal wurde das nächste Kommando übersprungen wenn in einem Script eine + Fehlermeldung ausgegeben wurde. + - Beim Routen eines großen Boards mit vielen Layern und feinem Grid brauchte + der Autorouter manchmal extrem viel Speicher. Dies wurde verbessert, so dass + er nun mit weniger Speicher arbeitet. + - Bei Verwendung eines feinen Routing-Rasters fügte der Autorouter manchmal + am Beginn einer gerouteten Verbindung ein unnötiges Wire-Stück ("Zacke") + ein. + - Wenn das Routing-Raster nicht ein ganzzahliges Vielfaches der internen + Editor-Auflösung von 1/10000mm war (z.B. 6.25mil), so rundete der Autorouter + manchmal die Koordinaten der entstehenden Leiterbahnen nicht richtig. + - Der Inhalt einer dlgComboBox wird jetzt nach der Ausführung eines Statements + richtig aufgefrischt. + - Das Verhalten der "Again"-Funktion im Text Editor für den Fall, dass noch + nichts gesucht wurde, wurde berichtigt. + - Das Setzen der Farben, Füllmuster und langen Strings beim Hinzufügen neuer + Layer aus einer Library in eine Board- oder Schematic-Zeichnung wurde + berichtigt. + - Die Behandlung textueller Koordinatenwerte wurde berichtigt (manchmal wurde + in einem Script nur jedes zweite Koordinatenpaar erkannt). + - Die Berechnung der für "Window Fit;" verwendeten Zeichenfläche nach einem + Library-Update in einem Sheet wurde berichtigt. + - User Language Dialoge reagierten manchmal nicht mehr nachdem eine Message- + Box durch "Cancel" beendet wurde. + - Das umschließende Rechteck von Texten wird neu berechnet, damit es genau + der Textgröße entspricht wenn Vektor-Font verwendet wird. + - Der CAM-Prozessor schrieb die Offset-Werte nicht richtig in die Info-Files. + - Der PASTE-Befehl in einem Schaltplan hat die Netzklassen der gepasteten + Netze nicht immer richtig in das Board übertragen. + - Die Behandlung leerer Strings in einer dlgComboBox wurde berichtigt. + - Der Library-Update im PASTE-Befehl wurde korrigiert. + - Manchmal erschienen kleine weisse "Punkte" wenn eine Datei frisch geladen + wurde. Diese erzeugten dann auch Blenden der Länge und Breite Null in der + Gerber-Ausgabe. + - Wenn eine Datei im Control Panel umbenannt wird, so wird eine eventuell + existierende Zieldatei nicht mehr überschrieben. + - Unter Windows wurde manchmal ein Klick auf einen Push Button nicht erkannt, + wenn die Maustaste losgelassen wurde während der Mauszeiger vom Button + wegbewegt wurde. + - Die Behandlung von Parametern, die '=' enthalten (z.B. Package Varianten- + namen) wurde korrigiert. + - Das Anlegen neuer Projekte und Verzeichnisse funktionierte nicht richtig, + wenn mehrere Zweige im Control Panel Tree das gleiche Verzeichnis enthielten. + - Manchmal wurden Thermal- und Annulus-Symbole für Supply-Layer nicht richtig + generiert wenn ein Window-Refresh im Board-Editor erfolgte während der + CAM-Prozessor lief. + - CHANGE PACKAGE hat manchmal die Pad-Zuordnungen nicht richtig zugewiesen, + was zu falschen Verbindungen im Board und damit einem Verlust der + Konsistenz führen konnte. + - Der ROUTE-Befehl generiert kein Via mehr an Punkten, an denen sich bereits + ein Wire im selben Layer befindet. + - Der Layer von SMDs wurde manchmal nicht richtig erkannt. + +Freigabemitteilung für EAGLE 4.01 +================================= + +* Fehlerbehebungen: + + - Das 'bom.ulp' druckte die "Description" nicht wenn keine Datenbank in + Verwendung war. + - Beim Speichern als HTML ist die Default-Extension in 'bom.ulp' jetzt '.htm'. + - Fehlende Warnungen wurden auf der Help-Seite des ERC-Befehls hinzugefügt. + - Holes werden auch dann von Signal-Polygonen abgezogen, wenn der Design + Rules Parameter für den Abstand Copper/Dimension 0 ist (wegen besserer + Kompatibilität mit Version 3.55). + - Der sichtbare Zeichnungsausschnitt wurde nicht richtig wiederhergestellt, + wenn ein Schematic aus einem Projekt geladen wurde. + - Umlaute im NAME-Befehl wurden nicht richtig behandelt. + - Manchmal wurden Textdateien nicht richtig erkannt und daher nicht im Tree + des Control Panels aufgelistet. + - Es wird jetzt sichergestellt, dass ein sehr kleiner Circle mit Width=0 + als mindestens ein Pixel auf dem Bildschirm dargestellt wird (dies wird + manchmal als Referenz-Markierung benutzt). + - Die Aufhebung der Beschränkung des Zoom-Faktors funktionierte bei kleinen + Zeichnungen nicht richtig. + - Vermeidung der flackernden Sanduhr beim Laden vieler Libraries bei ADD. + - In einer Device-Set-Zeichnung werden keine Text-Origins mehr dargestellt. + - Ein Fehler in der Prüfung ob ein Pad oder Via mit einem Polygon verbunden + ist wurde behoben. + - Die Berechnung der Luftlinien zwischen Teilpolygonen wurde korrigiert. + - Koordinaten werden jetzt überprüft, ob sie im erlaubten Bereich liegen. + - Die Berechnung von Polygonen mit einer Width von unter 1 Micron wurde + korrigiert. + - Die Option "Use all/none" fehlte im Kontext-Menü des "Libraries"-Zweiges + des Control Panels wenn sich nur ein Eintrag im Pfad + "Options/Directories/Libraries" befand. + - Manchmal erschien ein fehlerhafter "used" Indikator im Control Panel bei + Directories die keine Projekt-Directories sind. + - Nachdem Design Rules aus einer Datei in den Design Rules Dialog geladen + worden sind, wurden die Prozentwerte für z. B. die Restring-Parameter + nicht richtig aufgefrischt. + - Der Auswahlcursor im Zeichenfenster wurde manchmal nicht richtig + zurückgeschaltet. + - Es war nicht möglich, aus einer Symbol-Zeichnung heraus die Description + der Library zu editieren. + - Das Symbol für den Mausklick wurde in der Linux-Hilfe nicht richtig + dargestellt. + - Das Umschalten von "Options/Set/Display mode" wurde nicht an die anderen + Fenster weitergegeben. + - Polygone und gestrichelte Linien in Gehäusen oder Symbolen wurden in der + User Language nicht richtig behandelt. + - Seit Version 4.0 kann der Name eines Teilbuses, der mit einem Index verwendet + wird, nicht mehr mit einer Ziffer enden. Falls jedoch ein solcher Busname + in einer mit einer früheren Version erstellten Zeichnung vorhanden war, + und ein Netz daraus extrahiert wurde, so stürzte das Program ab. Jetzt + gibt es in einem solchen Fall eine entsprechende Fehlermeldung. + - Wurde (z. B. in einem Script) sehr schnell hintereinander (innerhalb der + gleichen Sekunde) eine Bibliothek abgespeichert und Bauteile daraus mit ADD + verwendet, so konnte es passieren, dass nicht der aktuelle Stand der + Bibliothek verwendet wurde. + - Die Beschreibung der nicht mehr vorhandenen Option DISPLAY_MODE FAST wurde + aus der Online-Hilfe entfernt. + - Ein Fehler im Library-Update-Mechanismus, der einen Fehlercode 400-1363 + zur Folge hatte, wurde behoben. + +Freigabemitteilung für EAGLE 4.0 +================================ + +* Control Panel: + + - Das Control Panel hat nun eine Baumstruktur, die einen Überblick über + alle EAGLE-Bereiche, wie Bibliotheken, User-Language-Programme, Projekte + usw. ermöglichen. + - Die Baum-Ansicht im Control Panel unterstützt "Drag&Drop" um Dateien und + Verzeichnisse zu kopieren oder bewegen. Dateien (wie ULPs oder Scripts) + können auch in ein Editor-Fenster gezogen und dort abgesetzt werden; dadurch + wird die Datei mit RUN gestartet bzw. mit SCRIPT ausgeführt. Devices und + Packages können ebenfalls mit Drag&Drop in ein Editor-Fenster gezogen + werden. Wird eine ganze Bibliothek in ein Editor-Fenster gezogen wird + ein Library-Update (aktualisieren der Bauteile) durchgeführt. + - Objekte in der Baumansicht haben ein Kontext-Menü, das Sie mit der + rechten Maustaste öffnen können. + - Der Menü-Eintrag "Save project as..." ist nicht mehr verfügbar. Neue Projekte + werden jetzt über das Kontext-Menü des Projects-Zweigs in der Baum-Ansicht + oder über das Menü "File/New/Project" angelegt. + - In den Pfad-Einstellungen in "Options/Directories" können die Variablen + "$HOME" und "$EAGLEDIR" verwendet werden, um auf das Home-Verzeichnis + des Benutzers bzw. das EAGLE-Programm-Verzeichnis anzugeben. + Handelt es sich um symbolische Links, werden diese aufgelöst. + - Die neue "Auto backup"-Funktion speichert eine modifizierte Zeichnung + nach einer bestimmten Zeit in einer Sicherungsdatei. + Siehe "Help/Automatic backup" für weitere Details. + +* Neue Projekt Struktur: + + - Die Namen der Dateien, die im aktuellen Projekt-Verzeichnis sind, + werden nicht mehr als absolute Angabe in der Datei "eagle.epf" + gespeichert, sondern als relative Angabe zum Projekt-Verzeichnis. + Das erlaubt es ganze Projekt-Verzeichnisse einfach zu kopieren oder + umzubenennen. + - Ein Projekt befindet sich jetzt in einem Unterverzeichnis, das eine + Datei "eagle.epf" enthält (welche die Position und Einstellungen + geöffneter Fenster enthält). + +* Konvertieren von Projekten aus älteren Versionen: + + - Frühere EAGLE-Versionen verwendeten individuelle Projekt-Dateien (*.epf) + um projektspezifische Informationen zu speichern. Seit Version 4 befindet + sich ein Projekt vollständig in einem Verzeichnis, welches eine Datei + mit dem festen Namen 'eagle.epf' enthält. + - Der einfachste Weg um ein früheres Projekt in die neue Projekt-Struktur zu + überführen, ist ein Verzeichnis mit dem Projekt-Namen anzulegen und die + bisherige Projekt-Datei '*.epf' unter dem Namen eagle.epf in dieses zu + kopieren. + - Benutzen Sie das "Projects"-Feld im "Options/Directories"-Dialog, um + den Namen des Verzeichnisses anzugeben, das die einzelnen Projekt- + Unterverzeichnisse enthält. + +* User Interface: + + - Das Text-Menü kann jetzt konfiguriert werden. Man kann mit Befehlen + verknüpfte Schaltflächen und auch Untermenüs definieren. Sehen Sie + hierzu die Hilfe-Funktion (MENU-Befehl). + - Änderungen im Menü "Options/User interface" werden jetzt sofort für + geöffnete Fenster wirksam. + - Der Mauszeiger im Layout- bzw. Schaltplan-Editor-Fenster kann jetzt + als großes Fadenkreuz dargestellt werden (siehe "Options/User interface"). + - Das "Delete"-Icon wird jetzt als 'X' dargestellt. + - Das Split-Icon wurde verändert, um die Funktion zu verdeutlichen. + +* Tastatur- und Maus-Steuerung: + + - Alt-0 öffnet nicht mehr die Fenster-Liste, sondern holt das Control Panel + in den Vordergrund. + - Drückt man die Ctrl-Taste während man die Maus bewegt, bewegt sich + die Zeichenfläche in die entsprechende Richtung. + - Dreht man das Rädchen einer Rädchen-Maus, kann man in einem Editor- + Fenster in eine Zeichnung hinein- bzw. herauszoomen (den Zoom-Faktor + stellt man über "Options/User interface/Mouse wheel zoom" ein, der + Wert '0' deaktiviert diese Funktion, das Vorzeichen bestimmt die + Richtung der Zoom-Aktion). + +* Bildschirm-Anzeige: + + - Der Default-Wert für "minimum visible text size" wurde auf 3 geändert. + - Der Display-Mode-Parameter FAST ist entfallen. + - Standardmäßig wird der Zoom-Faktor so begrenzt, dass die erzeugte + virtuelle Zeichenfläche den 16-Bit-Koordinatenbereich nicht überschreitet. + Das wurde notwendig, um Probleme mit Grafiktreibern, die nicht + "32-Bit-fest" sind, zu vermeiden. + Wenn der Grafiktreiber eines bestimmten Systems mit Koordinatenwerten, + die den 16-Bit-Bereich überschreiten, arbeiten kann, erlaubt das + Deaktivieren der Option "Options/User interface/Limit zoom factor" einen + höheren Zoomfaktor. + +* Design Rules: + + - EAGLE unterstützt jetzt einen Satz von Design Rules, die in der + Board-Datei gespeichert werden (und auch in eine separate Datei + geschrieben werden können). Der Design Rule Check und der Autorouter + nutzen denselben Satz von Design Rules. + - Für neu angelegte Board-Dateien gelten die Werte aus der Datei 'default.dru', + die im ersten Verzeichnis, das unter "Options/Directories/Design rules" + angegeben wurde, gesucht wird. + - Werte für die Cream-Maske (Lotpastenmaske) werden jetzt nach "innen" + gemessen und haben somit ein positives Vorzeichen. + - Die Parameter AnnulusConduct und ThermalConduct sind nicht mehr gültig. + Die Angaben im "Supply"-Tab des Design-Rules-Dialogs bestimmen nun, ob ein + Thermal- oder Annulus-Symbol jetzt einen "Restring" hat oder nicht. + - Um sicher zu gehen, dass bereits existierende Boards nach dem Update auf + Version 4 dieselben Resultate beim Erzeugen von Fertigungsdaten liefern, + wurde der Minimum-Restring-Wert für die Aussenlayer in den Design Rules + auf 0 gesetzt (das erlaubt den Pads und Vias den definierten Durchmesser + zu behalten). Der Benutzer sollte für diese Parameter geeignete Werte + einstellen und nach dem Plazieren von Bauteilen aus Version-4-Bibliotheken + einen Design-Rule-Check durchführen. + + ACHTUNG: Obiges Verhalten wurde in Version 4.03 geändert - bitte beachten + Sie die Freigabemitteilung für Version 4.03! + + Ausserdem wird der neue Parameter für die Einhaltung des Mindestabstands + zwischen Objekten in einem Signal-Layer und den Dimensions-Linien des + Layouts (default: 40 Mil) auf den Wert 0 gesetzt, wenn ein Board mit + einem Signalpolygon von einer älteren Version upgedatet wird. Der Grund + dafür ist die Tatsache, dass beim Berechnen von Polygonen in älteren + Versionen Begrenzungslinien nicht berücksichtigt wurden. Seit Version 4 + hält ein Polygon einen Mindestabstand zu den Board-Begrenzungslinien ein. + Diesen Wert definiert man in "Edit/Design rules/Distance/Copper/Dimensions". + Um sicherzustellen, dass upgedatete Boards beim Erzeugen von Fertigungs- + daten dieselben Ergebnisse wie bisher liefern, wurde dieser Wert auf 0 + gesetzt. Bitte beachten Sie, dass das auch Auswirkungen auf den Autorouter + hat, so dass Sie diesen Parameter auf einen geeigneten Wert einstellen + müssen. + +* Net Classes (Netzklassen): + + - Netze und Signale haben einen neuen Parameter "Net Class". + - Der neue Befehl CLASS wird verwendet um Netzklassen zu definieren und + einzustellen. + - Der CHANGE-Befehl hat eine neue Option 'class', um die Netzklasse + eines Netzes oder Signals zu ändern. + +* Polygone: + + - Beim Berechnen von Polygonen werden die Mindestabstände, die für Netzklassen + festgelegt wurden, berücksichtigt. Deshalb ist jetzt der voreingestellte Wert + für den Parameter Isolate bei neuen Polygonen gleich 0. Wird einem + Polygon ein Isolate-Wert gegeben, der die in den Design Rules bzw. + Netzklassen festgelegten Werte überschreitet, gilt der größte Wert. + - Der neue Parameter 'Rank' definiert ob und wie Polygone voneinander + subtrahiert werden. Werden bestehende Dateien upgedatet, erhalten + Signalpolygone einen Rank von '1', Polygone in Packages Rank = '7'. + - Polygone werden jetzt vom Design Rule Check gegeneinander geprüft, wenn + Sie denselben Rank haben. + - An manchen Stelle wurde das Polygon nicht durch Engstellen geführt, obwohl + es aufrund der eingestellten Width und der Mindestabstände möglich gewesen + wäre. + - Polygone in the Layern t/bRestrict werden jetzt von Signalpolygonen in den + Layern Top bzw. Bottom abgezogen. + +* Design Rule Check: + + - Der DRC arbeitet jetzt wesentlich schneller. + - Die Aktivität des DRC wird in einer Fortschrittsanzeige gezeigt + (die DRC-Rechtecke werden nicht mehr angezeigt, die SET-Variablen + DRC_SHOW und DRC_COLOR sind entfallen). + - Seitdem der DRC wesentlich schneller ist, werden die Fehlermeldungen + nicht mehr in einer separaten DRC-Datei gespeichert. (diese separate + Datei konnte u. U. Board- und Fehlerdatei ausser Tritt bringen). + - Polygone mit unterschiedlichen Signalen aber gleichem Rank werden + gegeneinander geprüft. + - Alle Objekte in den Layern Top..Bottom werden jetzt geprüft (auch Arcs, Circles..). + - Die Prüfungen 'Overlap' und 'Minimum distance' sind nicht mehr separat zu + wählen. + - Der DRC prüft nicht mehr einzelne Signale gegenüber allem anderen. + Dazu dienen jetzt die neu eingeführten Netzklassen. + - Das Rechteck für einen selektiven DRC kann nun mit "Click&Drag" aufgezogen + werden (wie auch beim WINDOW-Befehl). + - Holes werden in der "Grid"-Prüfung nicht mehr berücksichtigt (nur Pads, Vias, + Smds und Wires in Signal-Layern werden geprüft). + - Jedes Objekt in einem Signal-Layer innerhalb eines Packages wird jetzt geprüft. + - Einige neue Prüfungen wurden hinzugefügt (siehe DRC-Dialog für weitere + Informationen zu den neuen Parametern). + - Aufgrund eines Berechnungsfehlers meldete der DRC manchmal kleine Abstands- + fehler, wo in Wirklichkeit keine waren. Das wurde behoben. + +* Lange Namen: + + - Namen, Values und Texte dürfen jetzt beliebig lang sein. + - Die Beschränkung der User-Language-Konstanten bzgl. Länge der Namen + existieren noch; das Programm verwendet diese Konstanten allerdings nur für + formatierte Ausgaben mit dem EXPORT-Befehl. Sie sind nur noch aus Kompa- + tibilitätsgründen geblieben. + - Es gibt keine Begrenzung bzgl. der Bus-Member im Bus-Namen (Bus-Index-Werte + sind auf 0..511 begrenzt). + - Bus-Member dürfen jetzt beliebige Zeichen enthalten. + Ausnahme: ':', ',', '[', ']' und Leerzeichen. + +* Wire styles (Linienarten): + + - Wires haben einen neuen Parameter 'Style', der einen der folgenden Werte + annehmen kann: + + Continuous _______________ (default) + LongDash ___ ___ ___ ___ + ShortDash _ _ _ _ _ _ _ _ + DashDot ___ . ___ . ___ + + - Die Variable zum Festlegen des Knickwinkels wurde von Wire_Style nach + Wire_Bend umbenannt, um Verwechslungen der beiden Eigenschaften zu vermeiden. + - Beachten Sie, dass der DRC und der Autorouter Wires immer als "Continuous" + (durchgezogen) behandeln, egal wie der Style tatsächlich ist. Linienarten + sind hauptsächlich für elektrische oder mechanische Zeichnungen gedacht und + sollten nicht in Kupferlagen verwendet werden. Es ist ein ausdrücklicher + DRC-Fehler, wenn eine "Nicht-Continuous-Linie" als Teil eines Signals + mit einem Pad verbunden ist. + +* Zeichensätze: + + - Texte können jetzt drei verschiedene Zeichensätze haben: + 'Vector' der programm-interne, eingebaute Vektor-Font (wie er auch schon in + den vorherigen Versionen verwendet wurde) + 'Proportional' ein Proportional-Pixel-Font (üblicherweise 'Helvetica') + 'Fixed' ein Monospaced-Pixel-Font (üblicherweise 'Courier') + - Werden Zeichnungen aus älteren Versionen upgedatet, werden Texte in + 'Proportional'-Schrift geändert, ausser solche, die in den Layern Top..Bottom, + tRestrict und bRestrict stehen, da diese möglicherweise von Polygonen + substrahiert werden sollen und dieses nur mit Vektor-Font funktioniert. + - Das Programm versucht Texte, die nicht im Vektor-Font geschrieben sind so gut + wie möglich auszugeben. Da dieser Font jedoch vom Grafik-Interface des + Systems gezeichnet wird, kann es sein, dass 'Proportional'- und 'Fixed'- + Texte in anderer Größe oder Länge als erwartet geschrieben werden. + Siehe HELP TEXT, wenn Sie wollen, dass Texte nur im Vektor-Font verwendet + werden. Setzen Sie die User-interface-Option "Always vector font", wenn + Sie Texte nur im programm-internen Vektor-Font gezeichnet haben wollen. + - Beim Erzeugen von Daten mit dem CAM-Prozessor, kann es sein, dass Texte, die + mit einem Nicht-Vektor-Font definiert wurden, im Vektor-Font erzeugt werden. + Das ist dann er Fall, wenn der Ausgabetreiber nicht in der Lage ist Texte + mit verschiedenen Schriftarten zu erzeugen. + - Will man einen Nicht-Vektor-Font von einem Signalpolygon subtrahieren, + kann nur das umschließende Rechteck subtrahiert werden. Aufgrund der oben + angeführten möglichen Größen-/Längen-Probleme kann es sein, dass der Text + über das umschließende Rechteck hinausgeht. Daher empfehlen wir für solche + Fälle den Vektor-Font zu verwenden. + - Der Parameter 'Ratio' hat für Nicht-Vektor-Fonts keine Bedeutung. + - Der CHANGE-Befehl enthält eine neue Option "Font". + +* Pads und Vias: + + - Der Durchmesser von Pads und Vias wird jetzt über die Design Rules aus + dem Bohrdurchmesser festgelegt (der Pad- und Via-Durchmesser 0 ist jetzt + erlaubt und ergibt einen Wert, der über die Design Rules bestimmt wird). + Wird ein Pad mit einem Durchmesser angelegt, das den über die Design Rules + errechneten Durchmesser überschreitet, gilt der größere Wert. Der + Standardwert für neu angelegte Pads und Vias ist jetzt '0', so dass über + die Design Rules der tatsächliche Durchmesser festgelegt werden kann. + - Pads können auf Top und Bottom verschiedene Formen haben (in den Innenlagen + sind sie immer rund). + - Die Via-Form gilt nur für Aussenlagen, in den Innenlagen sind Vias immer rund. + - Der Durchmesser von X/YLongOct bestimmt jetzt die schmälere Seite des + Pads (früher die längere Seite). Schon bestehende Dateien werden beim + Update entsprechend modifiziert. + - Vias erzeugen standardmäßig keine Thermal-Symbole mehr in Supply-Layern. + Es gibt jetzt einen neuen Parameter in den Design Rules, der bestimmt + ob für Vias Thermals-Symbole in Supply-Layern und in Signalpolygonen + erzeugt werden sollen. + - Werden Dateien upgedatet, die Pads und Vias mit einem Durchmesser <= dem + Bohrdurchmesser verwendet wurden, werden diese durch ein "Hole" mit + entsprechendem Bohrdurchmesser ersetzt. Das funktioniert nur bei nicht + verbundenen Pads; ist ein Pad mit einem Pin (in einer Bibliothek oder in + einem Schaltplan) oder mit einem Signal (in einem Board) verbunden, kann + es nicht durch ein Hole ersetzt werden und der Benutzer hat zu entscheiden + was in diesem Fall zu tun ist. Diese Konvertierung wurde notwendig, da jetzt + jedes Pad und Via einen Restring hat, der von den Design Rules bestimmt + wird. + Wird ein konsistentes Schaltplan/Board-Paar auf Version 4 konvertiert, + und werden solche Pads durch Holes ersetzt, wird das Paar inkonsistent. + In diesem Fall müssen Sie die entsprechende Package/Device-Definition + modifizieren, um die Konsistenz wieder zu erlangen. + +* Runde SMDs: + + - SMDs haben einen neuen Parameter "Roundness", der zwischen 0 und 100 + gewählt werden kann und die "Rundung" der Ecken in Prozent angibt. Der + Wert 0 (default) ergibt ein Rechteck (keine Rundung), während der + Wert 100 eine runde Form ergibt (sofern Wert für x und y gleich ist), die + für BGAs verwendet werden kann. + - Der SMD-Befehl akzeptiert ein Wert für Roundness mit einem vorangestellten + '-'-Zeichen (um es von den Werten für die SMD-Größe unterscheiden zu können). + - Der CHANGE-Befehl hat eine neue Option "Roundness". + +* Neue Bibliotheks-Struktur: + + - Was bisher als "Device" bezeichnet wurde wird jetzt als "Device Set" + bezeichnet. Ein "Device Set" besteht aus den Gatter-Definitionen sowie + mehreren tatsächlichen "Devices", die in Form von Gehäuse-Varianten + realisiert werden. + - Der PACKAGE-Befehl kann jetzt einem Device mehrere verschiedene + Package-Varianten zuordnen (wie z.B. 7400N, 7400D...). + - Der neue Befehl TECHNOLOGY kann verwendet werden, um einer Package-Variante + eines Devices verschiedene Technolgie-Varianten zuzuordnen (wie z.B. + 74LS00N, 74S00N...). + - Der CHANGE-Berfehl hat zwei neue Optionen PACKAGE und TECHNOLOGY, die + es erlauben ein Package und/oder eine Technologie eines Device-Sets zu + wählen. + - Der neue Befehle DESCRIPTION kann verwendet werden, um eine detailierte + Beschreibung eines Devices/Packages bzw. einer Bibliothek zu geben. + - Der CONNECT-Dialog erlaubt es jetzt die Pad/Pin-Verbindungen von + einer anderen Package-Variante zu übernehmen. In der "Copy from"-Combo-Box + werden nur die Package-Varianten angeboten, die dieselben Pad-Namen + wie die aktuelle Variante haben (es werden nur verbundene Pads geprüft). + - Beim Abbrechen des CONNECT-Dialogs wird der Benutzer jetzt gefragt, ob + er die Änderungen verwerfen will oder nicht. + - Der CONNECT-Befehl kann jetzt mit Gate-Namen arbeiten, die Punkte enthalten. + - Der Device-Editor zeigt jetzt die Liste der Package-Varianten, eine + Voransicht des aktuellen Packages und eine Beschreibung des Devices. + - Da es jetzt möglich ist ein Device "vollständig", mit allen Package- und + Technology-Varianten zu definieren, wurde der Default-Wert von "Value" + auf "Off" gesetzt. + - Die Bedeutung der Parameters "Value" in einem Device-Set ist folgende: + + "Value Off" bedeutet, dass der Value vom Benutzer nicht verändert werden + kann, d.h der Value wird durch den Device-Namen festgelegt (inklusive + der Technology- bzw. Package-Variante, wenn vorhanden). Beispiel: "74LS00N". + + "Value On" Bedeutet, dass der Benutzer einen Value vergeben muss, um das + Bauteil genau zu spezifizieren. Beispiel wäre ein Widerstand. + Auch bei "Value Off" ist es (nach einer Abfrage) möglich den Wert zu + verändern, um in besonderen Fällen mögliche Probleme zu vermeiden. + Wurde der Value geändert, wird nach jedem CHANGE TECHNOLOGY- oder CHANGE + PACKAGE-Befehl der ursprüngliche Value (also der Device-Name) wieder + eingestellt. + +* Automatischer Bibliotheks-Update: + + - Wurde eine Bibliothek verändert nachdem man aus dieser Elemente in einem + Schaltplan oder Board verwendet hat, kann man mit dem UPDATE-Befehl alle + benutzten Bibliothekselemente mit den neuen Bibliotheksdefinitionen + aktualisieren. (siehe "Help Update"). + - Der UPDATE-Befehl kann über das "Library"-Menü im Schaltplan oder Board + oder über das Kontext-Menü einer Bibliothek im Control Panel gestartet + werden. Es ist auch möglich eine Bibliothek aus dem Control Panel mit + "Drag&Drop" auf einen Schaltplan oder ein Board zu ziehen und so das + Update zu starten. + +* Stückliste (Bill Of Material): + + - Das User-Language-Programm 'bom.ulp" zur Stücklistenerzeugung wurde + überarbeitet. Es bietet jetzt einen Dialog mit dem der Benutzer + interaktiv eine Stückliste generieren kann und ergänzende Daten + aus einer benutzerspezifischen Datenbank-Datei einfügen kann. Starten + Sie RUN bom.ulp und klicken Sie auf die Schaltfläche "Help" für + weitere Informationen. + +* Erzeugen von Kontur-Daten zum Prototypen-Fräsen: + + - Das User-Language-Programm 'outlines.ulp' kann zur Erzeugung von Daten + für Steuerung einer Fräsmaschine zur Prototypen-Fertigung verwendet werden. + +* User Language: + + - Die User Language unterstützt jetzt benutzerdefinierte Dialoge, Standard- + Dialoge und Message-Fenster. + - Der RUN-Befehl erlaubt nun zusätzliche Argumente, die für das ULP über + die Parameter 'argc' und 'argv' verfügbar sind. + - Es können Daten in ein ULP eingelesen werden. + - Die neue lookup()-Funktion kann für Datenbank-Zugriffe verwendet werden. + - Die neue fileglob()-Funktion durchsucht Verzeichnisse. + - Die neue fileerror()-Funktion prüft I/O-Fehler. + - Die exit()-Funktion kann jetzt mit einem String-Parameter umgehen, der + an ein Editor-Fenster geschickt und darin als Befehls-String ausgeführt + werden kann. + - ULPs können andere ULPs mit der neuen #include-Direktive einschließen. + - Die neue #usage-Direktive wird verwendet, um Informationen über ein ULP + zu liefern. + - Das neue Objekt UL_DEVICESET erlaubt den Zugriff auf Device-Sets in + Bibliotheken. + - Das device()-Statement wurde in deviceset() umbenannt, um der neuen + Bibliotheksstruktur zu genügen. + - UL_POLYGON hat ein neues Member 'Rank'. + - Die neuen UL_POLYGON-Member 'contours()' und 'fillings()' erlauben den + Zugriff auf die Daten eines berechneten Polygons. Das 'dxf.ulp' benutzt + jetzt diese Member um die tatsächliche Form des berechneten Polygons zu + zeichnen. + - Das neue Objekt UL_CLASS erlaubt den Zugriff auf die Netzklassen. + - UL_BOARD und UL_SCHEMATIC haben das neue Member 'classes(). + - UL_NET und UL_SIGNAL haben das neue Member 'classes(). + - UL_WIRE hat die neue Member, 'style' und 'pieces'. + - UL_TEXT hat ein neues Member 'font'. + - Die Daten-Member 'diameter' und 'shape' von UL_PAD und UL_VIA sind nun + layerabhängig und benötigen somit eine Layernummer für die die Daten + erzeugt werden sollen (der Durchmesser und die Form von Pads oder Vias ist + werden jetzt von den Design Rules festgelegt, und können in verschiedenen + Layern unterschiedlich sein. Die Syntax ist jetzt z. B. pad.diameter[LAYER_TOP] + um den Pad-Durchmesser im Layer 1 zu erhalten. Schon bestehende ULPs + müssen entsprechend der neuen Syntax korrigiert werden. Siehe "Help UL_PAD/ + UL_VIA für weitere Details. + Das 'dxf.ulp' erzeugt Pads und Vias jetzt für jeden Layer separat, + einschließlich der Lötstopmaske. + - Die Daten-Member UL_SMD.dx und UL_SMD.dy haben nun einen optionalen + Layer-Index um die Abmessungen in den t/bStop- und den t/bCream-Layern + zu bekommen. Das 'dxf.ulp' erzeugt jetzt auch Maskendaten, wenn diese + Layer aktiv sind. + - Neue Builtin-Konstanten INT_MAX, INT_MIN, REAL_EPSILON und REAL_MIN + (siehe "Help/User Language/Builtins/Builtin-Konstanten"). + +* Script-Dateien: + + - Script-Dateien können jetzt andere Script-Dateien aufrufen (solange keine + rekursiven Aufrufe gemacht werden). + - Script-Dateien können jetzt Kommentare enthalten. Alles nach (und inklusive) + einem '#'-Zeichen wird ignoriert. '#'-Zeichen innerhalb von Anführungs- + zeichen haben keine besondere Bedeutung. Beachten Sie, dass nach Labels (z. B. + "BRD:") und Fortsetzungszeichen ("\") nichts anderes als Leerzeichen + verwendet werden dürfen und somit auch kein Kommentar (ansonsten verlieren + sie ihre besondere Bedeutung). + - Die Datei 'eagle.scr' wird jetzt zuerst im aktuellen Projekt-Verzeichnis + gesucht (oder im Arbeitsverzeichnis, falls kein Projekt-Verzeichnis + existiert) und dann in den Verzeichnissen, die im Control Panel unter + "Options/Directories/Scripts" gelistet sind. + +* Autorouter: + + - Der Autorouter kann jetzt "durch" Signal-Polygone routen (steuerbar über + den neuen Kostenfaktor 'cfPolygon'). Ein Nebeneffekt davon ist, dass eine + Verbindung, die durch das Polygon vor dem Autorouten besteht, nach dem + Routen u. U. nicht mehr vorhanden ist, da das Polygon durch eine Leiterbahn + zerteilt werden könnte. Deswegen kann das Routing-Ergebnis (nach einem + Neuberechnen des Polygons mit RATSNEST) unter 100% liegen, obwohl der + Autorouter zu 100% entflochten hat. + - Die Autorouter-Parameter werden jetzt in der Board-Datei gespeichert. + Sie können auch in separaten Steuerdateien gespeichert oder von diesen + über den Autorouter-Dialog geladen werden. + Bestehende Control-Dateien werden beim Update älterer Dateien automatisch + gelesen und die Werte in der Board-Datei gespeichert (die alte *.ctl- + Datei wird dann nicht mehr benötigt und wird auch nicht mehr beim + Start des Autorouters gelesen - Änderungen, die mit einem Text-Editor + in einer solchen Datei gemacht werden, sind unwirksam). + - Der Autorouter und der DRC nutzen einen gemeinsamen Satz von Design Rules. + Die alten Autorouter-Parameter werden in den entsprechenden DRC-Parametern + gespeichert. Es gelten folgende Ausnahmen: + + Anstatt der beiden 'mdWireDimension' und 'mdViaDimension' gibt es jetzt + nur noch einen Parameter 'Copper/Dimension'. Dieser Wert wird auf den + in der *.ctl-Datei letztgenannten der beiden 'md*'-Parameter gesetzt + (wobei das typischerweise 'mdViaDimension' ist). + + Die Parameter 'mdWireRestrict' und 'mdViaRestrict' werden ignoriert, da + der Mindestabstand zwischen Kupfer (mit Ausnahme von Pads und Smds) und + einer Restrict-Fläche jetzt gleich 0 ist. + + Der Parameter 'tpVia Diameter' wird ignoriert, da der Via-Durchmesser + jetzt aus dem Bohrdurchmesser und dem Restring-Parameter ermittelt wird. + + Die Parameter 'tpWireWidth' und 'tpViaDrill' werden in der Default-Netz- + Klasse 0 gespeichert. + Werden die Autorouter-Control-Parameter in eine Datei geschrieben, sind + die Parameter für Mindestabstände nicht mehr Teil dieser Datei. + - Es können beliebig viele Optimierungsläufe durchgeführt werden. + Standardmäßig werden jetzt 4 Optimierungsläufe durchgeführt. + - Jeder Routing-Schritt (Pass) kann separat aktiviert/deaktiviert werden. + - Der Autorouter kann jetzt verschiedene Leiterbahnbreiten und Mindestabstände, + entsprechend den Netzklassen, gleichzeitig verwenden. + - Die Werte für Mindestabstände werden nicht mehr im Autorouter-Dialog, sondern + im Dialog der Design Rules festgelegt. + - Die Track-Parameter (Leiterbahnbreite und Via-Durchmesser) werden jetzt + im Dialog der Design Rules (absolutes Minimum) und über die Netzklassen + festgelegt. + - Das kleinste Routing-Raster beträgt jetzt 0.02mm (ca. 0.8 Mil). + - Die Standard-Einstellungen und das Verhalten von cfChangeDir wurden + modifiziert um 'zittrige' Leiterbahnverläufe zu vermeiden. + - Der Wert 99 des Parameters cfNonPref verbietet dem Autorouter jetzt + Leiterbahnen gegen die Vorzugsrichtung des entsprechenden Layer zu + verlegen. Bitte bedenken Sie, ob diese Einstellung für Ihr Layout + sinnvoll ist. Um unerwünschte Effekte mit existierenden Boards zu vermeiden, + wird dieser Wert beim Update älterer Dateien stillschweigend von 99 auf + 98 geändert. + - Bei sehr feinem Routing-Raster verlegte der Autorouter manchmal Leitungen + zu Nahe an runden Vias/Pads. + - Manchmal legte der Autorouter keine Leitung durch eine Engstelle, obwohl + er aufgrund der Mindestabstände eine Leitung verlegen hätte können. + +* ADD-Befehl: + + - Der ADD-Befehl kann mit Platzhaltern ('*' oder '?') verwendet werden, um + bestimmte Devices zu finden. Der ADD-Dialog zeigt die passende Devices in + einer Baumstruktur und ebenfalls eine Voransicht des Devices der + zugehörigen Package-Variante. + - Um Bauteile direkt von einer bestimmten Bibliothek zu holen, verwendet man + die Befehls-Syntax + + ADD devicename@libraryname + + 'devicename' darf Platzhalter enthalten und 'libraryname' kann ein einfacher + Bibliotheksname sein (wie "ttl" or "ttl.lbr") oder eine vollständige Pfadan- + gabe enthalten (wie "/home/mydir/myproject/ttl.lbr" oder "../lbr/ttl"). + - Soll ein Device oder Package plaziert werden, und existiert bereits ein solches + Element (mit demselben Namen aus derselben Bibliothek) in dieser Zeichnung, + wird automatisch ein Bibliotheks-Update durchgeführt, bei dem die bereits + plazierten Elemente durch die neueren aus der Bibliothek ersetzt werden. + - Der UPDATE-Befehl kann dazu verwendet werden alle Teile in einem Board + oder Schaltplan durch die aktuellen Versionen aus den Bibliotheken zu + ersetzen (siehe "Help Update"). + +* CHANGE-Befehl: + + - CHANGE LAYER funktioniert für Wires und Polygone jetzt für alle Layer + innerhalb eines Packages oder Symbols. + +* CONNECT-Befehl: + + - Drückt man die Leer-Taste während ein Listen-Element selektiert ist, wird + die Connect- bzw. Disconnect-Aktion ausgeführt. + +* DELETE-Befehl: + + - Wird das letzte Supply-Symbol einer bestimmten Spannung von einem Netz- + segment, das denselben Namen wie das Supply-Symbol hat, gelöscht, erhält + dieses Segment jetzt einen neu generierten Namen (sofern kein weiteres + Supply-Symbol mehr zugeordnet ist) oder den Namen eines der verbleibenden + Supply-Symbole. + +* DISPLAY-Befehl: + + - Die neuen Parameter '?' und '??' steuern das Verhalten des DISPLAY-Befehls + wenn ein Layer angegeben wird, der in der aktuellen Zeichnung nicht + existiert. Siehe "Help Display" in der Hilfe-Funktion. + +* GROUP-Befehl: + + - Ist eine selektierte Gruppe leer, zeigt der GROUP-Befehl die Fehlermeldung + "Group is empty" nicht mehr in einem Fenster an. Statt dessen wird die + Meldung jetzt in der Status-Zeile gezeigt; der Befehl bleibt für die + Auswahl der nächsten Gruppe aktiv. + +* ERC-Befehl: + + - Der ERC zeigt bei der Fehlermeldung "parts/elements with inconsistent packages" + jetzt auch die Package-Namen an. + - Der ERC erkennt jetzt Unstimmigkeiten zwischen impliziten Supply- und Power-Pins + im Schaltplan und den tatsächlichen Signalverbindungen im Board. Solche + Unterschiede können entstehen, wenn die Supply-Verbindungen verändert + werden nachdem ein Board über den BOARD-Befehl erzeugt wurde. Wenn die + Versorgungspins nur 'implizit' verbunden sind, kann es sein, dass Veränderungen + nicht immer in das Board übernommen werden können. Werden solche Fehler + erkannt, bleibt die Forward-/Back-Annotation weiterhin erhalten; Sie sollten + aber dringend die Supply-Pin-Konfiguration überprüfen! + - Der ERC sucht jetzt auch nach fehlenden Junctions und überlappenden Wires + und Pins. + +* ERRORS-Befehl: + + - Der ERRORS-Dialog ist nicht mehr modal (er bleibt jetzt "auf" dem Editor- + Fenster) und kann offen bleiben während Sie mit dem Editieren im + Editor-Fenster fortfahren. + - Die verschiedenen Fehler-Typen werden jetzt detaillierter aufgeführt. + +* EXPORT-Befehl: + + - Der EXPORT-Befehl kann jetzt Grafikdaten erzeugen (BMP, PNG, usw.). + Siehe "Help/EXPORT" für weitere Details. + +* NET- und BUS-Befehl: + + - Wird eine Netzlinie auf einem Punkt abgesetzt auf dem schon ein anderes Netz, + ein Bus oder ein Pin liegt, wird das Netz an dieser Stelle beendet + (in Vorgängerversionen musste man dazu doppelklicken). Dasselbe gilt für + Busse, die an einer Stelle abgesetzt werden sollen, an der schon ein anderer + Bus liegt. Diese Funktion kann mit "SET AUTO_END_NET OFF;" oder durch + Deselektieren von "Options/Set/Misc/Auto end net and bus" abgeschaltet + werden. + - Wird ein Netz auf einem Punkt abgesetzt an dem sich schon mindestens zwei + weitere Linien und/oder Pins befinden, wird automatisch eine Junction + gesetzt. Diese Funktion kann man mit "SET AUTO_JUNCTION OFF;" oder durch + Deselektieren der Option "Options/Set/Misc/Auto set junction" deaktivieren. + - 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. + +* PASTE-Befehl: + + - Werden Objekte mit PASTE in eine Zeichnung eingefügt, die schon frühere + (andere) Versionen dieser Objekte enthält, wird ein automatischer + Library-Update durchgeführt, der die Objekte in der Zeichnung durch die + neueren Objekte aus dem PASTE-Buffer ersetzt. + +* PRINT-Befehl: + + - Im "Page Setup" des PRINT-Dialogs kann man nun für die Seitenränder + kleinere Werte einstellen als vom Druckertreiber vorgegeben werden. + Um die Standardeinstellungen wieder zu erhalten, geben Sie den Wert '0' ein. + Bitte beachten Sie, dass Ihr Drucker unter Umständen nicht so nahe an + den Blattrand drucken kann. + - Die Drucker-Einstellungen werden nicht mehr in der Projekt-Datei, sondern + in den Benutzer-Parametern ('eaglerc') gespeichert. + +* REMOVE-Befehl: + + - Der REMOVE-Befehl löscht jetzt auch Devices, Symbole und Packages wenn der + Name mit der entsprechenden Erweiterung angegeben wird (z. B. REMOVE name.pac). + Wird der Name ohne Erweiterung angegeben, müssen Sie sich im entsprechenden + Editier-Modus befinden um ein Objekt zu löschen (editieren Sie z. B. ein + Package wenn Sie ein Package löschen wollen). + + * RENAME-Befehl: + + - Der RENAME-Befehl erlaubt jetzt auch '.' im Namen. + - Beim RENAME-Befehl kann auch die Erweiterung des Device-, Symbol- + bzw. Package-Namen angegeben werden (z. B. RENAME name1.pac name2[.pac] + - beachten Sie, dass beim zweiten Parameter die Angabe der Erweiterung + optional ist). Wird der erste Parameter ohne Erweiterung angegeben, müssen + Sie sich im entsprechenden Editier-Modus befinden (editieren Sie z. B. ein + Package wenn Sie ein Package umbenennen wollen). + +* REPLACE-Befehl: + + - Der REPLACE-Befehl kann bei aktiver Back- und Forward-Annotation nicht mehr + verwendet werden. Die Ursache hierfür liegt in der jetzt vollständigen + Definition des Device-Sets mit all seinen Package-Varianten. Verwenden Sie + CHANGE PACKAGE, um eine der definierten Package-Varianten auszuwählen, oder + verwenden Sie den UPDATE-Befehl um ein Package durch eine neuere Version + aus einer Bibliothek zu ersetzen. + +* SET-Befehl: + + - Die SET-Optionen für die Parameter Thermal und Annulus sowie für die + Parameter Solder Stop und Cream Mask sind entfallen. Diese Werte werden + jetzt in den Design Rules definiert. + - Die SET-Variablen DRC_SHOW und DRC_COLOR sind entfallen (der DRC-Status wird + jetzt in einer Fortschrittsanzeige dargestellt). + - Die SET-Variable MAX_ERROR_ZOOM ist entfallen. Der ERRORS-Dialog ist nicht + mehr modal (er bleibt jetzt "auf" dem Editor-Fenster); der WINDOW-Befehl kann + mit geöffnetem ERRORS-Fenster wie gewohnt verwendet werden. + +* SHOW-Befehl: + + - Hell dargestellte Objekte bleiben bei nachfolgenden WINDOW-Operationen + hell. + - Drücken Sie bei aktivem SHOW-Befehl die ESCape-Taste, werden die bisher hell + markierten Objekte wieder dunkel geschaltet. + +* USE-Befehl: + + - Der USE-Befehl wird jetzt nur noch für Script-Dateien benötigt. + - Die tatsächlich benutzten Bibliotheken können jetzt über das Control + Panel einfach ausgewählt werden. + +* CAM-Prozessor: + + - Der CAM-Prozessor unterstützt keine Matrix-Drucker mehr. Verwenden Sie den + PRINT-Befehl um an einen Systemdrucker zu drucken. + - Der CAM-Prozessor kann keine Schaltpläne mehr ausgeben. Verwenden Sie dazu + den PRINT-Befehl. (Ab Version 4.03 kann der CAM-Prozessor wieder Schaltpläne + drucken). + - Die Kommandozeilen-Option -I ist entfallen, da der CAM-Prozessor in der + Freeware-Version frei verfügbar ist. + - Ausgaben sind nur noch in Dateien möglich. Sollen Daten an eine COM- oder + LPT-Schnittstelle ausgegeben werden, kann man unter Windows den UNC-Datei- + namen der diesem Port zugeordnet ist, angeben. + - Sieht der "Section"-Text einer Section im CAM-Prozessor beispielsweise so + aus: "Title: Beschreibender Text...", erscheint "Title" im Tab der + Section, während "Beschreibender Text" nur im "Section"-Feld sichtbar ist. + - CAM-Prozessor-Jobs können jetzt eine Beschreibung (Description) haben. + - Der Durchmesser octagonaler Pads wurde im Treiber RS274X um den Faktor + 1.08239 erhöht, um die unterschiedliche Interpretation der Pad-Druchmesser + in EAGLE und RS274X zu kompensieren. + - Leiterbahnen werden im CAM-Prozessor nicht mehr gekürzt, um Bohrlöcher offen + zu halten. Offene Bohrlöcher werden nur noch von Treibern unterstützt, die + tatsächlich Pixel im Output löschen können (zur Zeit ist das nur mit den + Postscript-Treibern "PS" und "EPS" möglich). + - Der neue CAM-Prozessor-Treiber PS_INVERTED kann für invertierte Postscript- + Ausgaben verwendet werden. + +* Speichern der Einstellungen: + + - Benutzerspezifische Einstellungen werden jetzt in einer "eaglerc"-Datei + gespeichert. Beim Programmstart werden die Einstellungen (in angegebener + Reihenfolge) aus den Dateien gelesen: + + /eaglerc (Linux und Windows) + /etc/eaglerc (nur Linux) + $HOME/.eaglerc (Linux) + $HOME/eaglerc.usr (Windows) + + bezeichnet das Verzeichnis in dem die EAGLE-Programmdatei ist. + Ist keine Umgebungsvariable HOME definiert, wird stattdessen + verwendet. Wird das Programm beendet, speichert EAGLE alle aktuellen + Einstellungen (sofern welche verändert wurden) in der eaglerc-Datei + im HOME-Verzeichnis. + "$HOME" steht unter Linux für die Umgebungsvariable HOME. + Unter Windows bezeichnet "$HOME" entweder die Umgebungsvariable HOME + (sofern gesetzt) oder den Wert des Registrierungsschlüssels + "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ + Shell Folders\Personal" welcher den Namen des "Eigene Dateien"- + Verzeichnisses enthält. + - Die Datei 'eagle.cfg' wird nicht mehr gelesen. + - Tastenbelegungen, die mit dem ASSIGN-Befehl definiert werden, speichert + EAGLE jetzt benutzerspezifisch. + +* Kommandozeilen-Optionen: + + - Die Optionen '-A' und '-T' sind entfallen (Thermal- und Annulus-Optionen + werden jetzt in den Design Rules definiert). + - Die Optionen '-B' und '-M' sind entfallen (Lötstop- und Lotpasten-Werte + definiert man jetzt in den Design Rules). + - Die Option '-C' ist entfallen, da der CAM-Prozessor keine Matrix-Drucker + mehr unterstützt (Ausdrucke werden jetzt über PRINT erzeugt). + - Die Optionen '-Z' und '-Y' sind entfallen (Bohrsymbole werden über + Options/Set/Drill" festgelegt und benutzerspezifisch in der "eaglerc"- + Datei gespeichert). + +* Fehlerbehebungen: + + - Wurden mehrere Schaltplanseiten auf einmal gedruckt, zeigte >SHEET immer + die aktuell editierte Seite an. + - Speicherte man eine Datei, die mehr als einen Punkt im Namen enthielt, + wurde der Name abgeschnitten. + +* Verschiedenes: + + - Die Betriebssysteme DOS und OS/2 werden nicht mehr unterstützt. + - Aufgrund von Änderungen in der Datenstruktur werden Sie beim Laden eines + Schaltplan/Board-Paares aus einer früheren EAGLE-Version meistens gefragt + werden, ob Sie einen ERC ausführen wollen. + - Dateien aus vorherigen Versionen können unterschiedliche Bibliotheksobjekte + mit gleichem Namen enthalten. Das konnte bei PASTE- oder ADD-Operationen + mit modifizierten Packages bzw. Devices entstehen. Version 4 erlaubt es + nicht mehr verschiedene Versionen eines Bibliotheksobjekts in einer Zeichnung + zu verwenden, und muss beim Update einer Datei sicherstellen, dass Objekte + mit gleichem Namen nicht mehrfach vorkommen. Um das sicherzustellen, + ergänzt die Update-Routine den Namen eines betroffenen Bibliotheksobjekts + um ein '@'-Zeichen und eine Nummer. + - Enthält die Lizenz kein Schaltplan-Modul, kann der Bibliotheks-Editor jetzt + trotzdem Symbole und Devices editieren. + - Mehrfache 'Save?'-Abfragen werden bei Boards und Schaltplänen, die durch + Back- und Forward-Annotation verbunden sind, vermieden. + - Wird eine Datei einer älteren Version geladen, zeigt EAGLE die Update- + Meldung in einem eigenen Text-Editor-Fenster. + diff --git a/eagle-5.7.0/doc/UPDATE_en b/eagle-5.7.0/doc/UPDATE_en new file mode 100644 index 0000000..6c965f3 --- /dev/null +++ b/eagle-5.7.0/doc/UPDATE_en @@ -0,0 +1,4805 @@ +EAGLE Version 5 Update Information +================================== + +This file contains information for users of previous EAGLE versions. +Please read this file entirely if you are updating from an EAGLE version +prior to 5.7.0! + +WARNING: Due to some necessary changes in the data structure once you edit + a file with version 5.x you will no longer be able to edit it + with versions prior to 5.0! + + PLEASE MAKE BACKUP COPIES OF YOUR CURRENT BOARD-, SCHEMATIC- AND + LIBRARY-FILES BEFORE EDITING THEM WITH VERSION 5.0! + +WARNING: AFTER UPDATING ANY FILES PLEASE RUN BOTH AN ELECTRICAL RULE CHECK + (ERC) AND A DESIGN RULE CHECK (DRC)! YOU MAY NEED TO ADJUST THE + DESIGN RULE PARAMETERS UNDER "Edit/Design rules..." TO YOUR + SPECIFIC NEEDS! SEE ALSO THE REMARKS REGARDING RESTRINGS AND + MINIMUM DISTANCES BETWEEN COPPER AND DIMENSIONS UNDER "Design Rules" + BELOW! + +Release notes for EAGLE 5.7.0 +============================= + +* Platforms: + + - As of this version, every EAGLE license is valid for all supported + platforms, without any more additional fee. + +* Control Panel: + + - The "View/Refresh" option in the Control Panel's pulldown menu now has + the platform specific hotkey. + - The default action when double clicking, pressing Space or Enter on a + project directory in the Control Panel's tree view is now to open/close + the project. + +* User Language: + + - The new User Language functions setgroup() and clrgroup() can be used to + set and clear the flags that define whether an object is within the current + group. + - It is now possible to directly access members in an array of UL_* + objects, as in + + UL_SMD smds[]; + ... + if (smds[i].x == smds[j].x) + ... + +* ADD command: + + - The search string in the ADD dialog is no longer modified if the + ADD command is called with a unique device name (from the command + line or the right mouse button history function of the ADD button). + +* AUTO command: + + - The AUTO command now supports selecting signal names by wildcards. + +* BOARD command: + + - Added a consistency check right after a board is newly created from a + schematic, in order to immediately catch any problems that otherwise + might have turned up later on. + +* CUT command: + + - The CUT command now clears the paste buffer in case the group is empty. + +* DISPLAY command: + + - The DISPLAY dialog now has an 'Apply' button. + +* DELETE command: + + - Pads/smds can now be deleted from a package in a library, even if the + package is in use by a device, as long as the pad/smd is not referenced + by any pin in any device of that library. + - Pins can now be deleted from a symbol in a library, even if the + symbol is in use by a device set, as long as the pin is not referenced + by any pad/smd in any device of that library. + +* GROUP command: + + - Made GROUP ALL also select objects outside the defined coordinate area. + +* LABEL command: + + - The coordinates used in xref labels no longer refer to the surrounding + rectangle of the net, but rather take each object into account separately. + +* MARK command: + + - The MARK command now immediately updates the grid display, without the + need to first move the mouse. + +* NAME command: + + - The NAME command now only offers objects that actually have a name in case + there are several objects within the select radius. + +* OPTIMIZE command: + + - The OPTIMIZE command no longer takes airwires into account. + - The OPTIMIZE command now flashes the selected signal to provide visual + feedback to a mouse click. + +* PAD command: + + - The PAD command can now add a pad to a package, even if that package + is in use by a device. + +* PIN command: + + - The PIN command can now add pins to a symbol, even if that symbol is in + use by a device set. + +* PRINT command: + + - The PRINT dialog now contains a list of all available printers for direct + selection. Printing to a PDF or Postscript file can also be selected from + this list. + - The PRINT command now remembers if the last print went into a file. + - The PRINT command has a new option named PRINTER, which can be used + to print to a specific printer. + - The new option CAPTION of the PRINT command can be used to print a caption + from the command line. + - The new option PAPER of the PRINT command can be used to print to a given + paper size. + - The file name in the PRINT FILE option may now contain placeholders to + insert the actual drawing file name or extension. + - The PRINT FILE command now refuses to write any of the file extensions + .brd.sch.lbr.gpi.dri.whl.drl.ulp.epf.cam.scr.exe.com.bat.cmd.sys.dll, to + make sure files are not overwritten inadvertently. + +* RATSNEST command: + + - The RATSNEST command no longer stops when it encounters an unknown signal + name, but rather tells the user about the unknown signals and offers the + choice of continuing. + - The RATSNEST command, if given a signal name, now only processes the + polygons of the given signal, not all polygons of all signals. + - The context menu of wires and vias that belong to a signal now contains + the RATSNEST command. + +* ROUTE command: + + - The ROUTE command no longer activates the current layer when it is + started, but waits until an airwire has actually been selected. + - The Follow-me router now uses the via diameter as set in the parameter + toolbar. + +* SET command: + + - When entering values for the Catch_Factor or Select_Factor in the SET + command via the command line, numbers in the range [1 ... 100] are now + taken as percentages to avoid errors caused by not entering the factor + as a decimal number between [0.0 ... 1.0]. + - The new parameter Option.LayerSequence can be used to define the + sequence in which layers are rendered (see "Help/Editor Commands/SET"). + +* SHOW command: + + - The SHOW command with the '@' option now also draws the pointer rectangle + in the other editor window, if f/b annotation is active. + - The highlighted objects from the SHOW command's dialog now stay + highlighted, even after closing the dialog (until the end of the SHOW + command). + +* SMD command: + + - The SMD command can now add an smd to a package, even if that package + is in use by a device. + +* UPDATE command: + + - The UPDATE command now allow selecting multiple files from the file dialog. + +* USE command: + + - The USE command now allow selecting multiple files from the file dialog. + +* VALUE command: + + - The VALUE command button now also has a history function. + +* VIA command: + + - The VIA command now issues an error message if there are no vias defined + in the layer setup. + +* CAM Processor: + + - Added CAM Processor driver GERBER_RS274X_25 with 2.5 inch coordinate + format. + - The default CAM jobs no longer have the "Mirror" option checked. + +* Miscellaneous: + + - The sorting sequence of numeric strings that differ only in the number + of leading zeros in their numeric parts has been made stable (i.e. + sorting them more than once always leads to the same sequence). + - The Properties dialog of a wire now also displays the angle of the wire. + - The progress display of the CAM Processor no longer keeps popping into + the foreground. + - Improved the performance of recalculating the ratsnest in the board after + an ADD, DELETE or PASTE command in the schematic, in case many pins are + processed that are connected to the same net. + - Made the origin crosses for elements in a board smaller, so that they + don't overlap that much in case of small SMD parts. + - The Properties dialog of an element now applies modified coordinates and + orientation settings even if the "Locked" flag is checked. + - Added a general note to the online help about the special coordinate + value '(@)'. + - Leading and trailing blanks in file and directory names are now ignored. + - When defining a new drill diameter in the "Options/Set/Drill/New" dialog, + the default unit is now the same as in the editor window's grid. + - Fixed handling empty keys in bom.ulp. + - For better readability the sheet thumbnails now show only the individual + sheet number, without the total number of sheets. + - Speeded up handling parts with lots of attributes in the schematic. + - The Design Rules plausibility check now tests whether the clearance values + for 'same signal' are not larger than those for 'different signals'. + - The _OUTLINES_ polygon (if present) is now calculated with increased + precision, to allow the milling contours to better follow the object + outlines. + - The detection of connected parts of a calculated polygons (which is used, + for instance, in the RATSNEST and ROUTE commands) has been speeded up. + - Removed an unnecessary dependency of libXft.so in the Linux version. + - The new SET parameter Interface.MouseButtonReleaseTimeout can be used + to set a timeout within which a mouse button release will trigger a + button's action, even if the release happened outside the button's area + (default is 500ms). + - The color index in the dxf.ulp now starts at 1, since AutoCAD 2007 doesn't + like color 0. + - The CAM Processor's warning about polygons that may produce very large + plot data is now only given if the layer containing that polygon will + actually be plotted. + - The Value entry in the Properties dialog of a part where the device has + "Value off" now contains a check box that indicates that this value + overwrites the default (i.e. the device name). When this box is unchecked, + the value falls back to the default. + - When opening a project, the windows that get opened are no longer scaled + to the current desktop size, but rather moved and resized if necessary + to make them fit entirely onto the desktop. + - Switching between windows with Alt+0, Alt+1 etc. has been disabled on + the Mac OS X platform, because on some localized keyboard layouts these + key combinations are already used otherwise. + - Implemented the placeholders >SHEETNR and >SHEETS to make the sheet number + and the total number of sheets in a schematic available separately. + - Added a note to the online help about selecting the layer in the ATTRIBUTE + and LABEL commands. + - When a schematic is loaded, any leftover empty nets are now deleted + automatically. + - If a board file that has been created with an EAGLE edition that can + handle only a subset of the routing layers is loaded with an edition that + can handle additional routing layers, and the layer setup is changed so + that additional layers are used, these layers are now created + automatically. + - Improved performance of panning outside the surrounding rectangle of the + entire drawing. + +* Bugfixes: + + - Fixed missing technology when adding string to the command button history + of the REPLACE command. + - Fixed a crash with negative 'number' parameter in the User Language + function sort(). + - Fixed handling links like in dlgTextView. + - The "Link" variable in dlgTextView can now be used to initially scroll + to a given position in the text. + - Fixed sorting in the INVOKE dialog. + - Fixed handling links like in the Control Panel. + - Fixed restoring the width of the sheet thumbnail view if the view is + docked. + - Fixed handling the minimum drill distance in the Autorouter. + - Fixed refreshing the draw window if color palette entries are changed + via the SET command. + - The modification "Fixed dynamic airwire calculation in the ROUTE command + in case layers containing objects that belong to the routed signal are not + displayed" that was done in version 5.2.4, has been revoked because it + caused segments of a signal that are connected through wires in the + undisplayed layer not to be seen as connected, which resulted in an + incorrectly calculated dynamic airwire. + - Fixed redrawing polygons that extend outside the board area when the + Autorouter is started. + - Fixed artifacts in case a smashed part that contains the placeholders + >PLOT_DATE_TIME, >LAST_DATE_TIME or >DRAWING_NAME is moved. + - Fixed the paper size values in the PRINT dialog. + - Fixed skipping airwires when pasting from a board into a package drawing. + - Texts and rectangles in user defined layers of a board or package, that + have a non-orthogonal angle, are now skipped when pasting them into a + sheet or symbol drawing. + - The parameters of the editor window no longer fall back to defaults when + loading a different drawing. + - Fixed handling signal polygons in the Autorouter. + - Fixed an unjustified warning message "The attribute '...' is already + defined in the board with value '...'! Overwrite?". + - Fixed UL_PART.attribute[] in case the actual name of the attribute is + longer than the string given as the index, as in "ABC" vs. "ABCDE". + - Fixed a possible loss of consistency after GROUP/CUT/PASTE in case a + part on a schematic sheet is in the group, but the net wire connected + to one of its pins isn't. After deleting some other wires from that net + the consistency between board and schematic may have been lost. + - Fixed adding the "Cancel" button to the message box in case a script is + run in a library and nothing has been selected for editing. + - Fixed calling the User Language function strxstr() without any optional + parameter. + - Fixed a possible crash in case a net wire completely disappears when + moving one of its end points onto the other. + - Fixed the User Language function strtol(), so that hex values above + 0x7FFFFFFF are converted to negative integers. + - Fixed a crash in the Follow-me router when changing the grid and the + current layer while an airwire is attached to the cursor. + - Fixed handling lowercase characters in placeholder texts for attributes in + the SMASH command. + - Fixed handling the '.tif' extension in the EXPORT IMAGE command. + - Fixed handling nested typecasts in User Language programs. + - Fixed handling wire bend styles in the ROUTE command without autorouter + module consistently in case right mouse button clicks and clicking on + the bend style buttons in the toolbar is mixed. + - Fixed an unnecessary extra automatic backup if the automatic backup is + triggered in one editor window, while a lengthy command is running in the + other editor window. + - Fixed a possible data corruption if the automatic backup is triggered in + one editor window, while a lengthy command is running in the other editor + window. + - Fixed displaying script comments containing UTF-8 characters in the + Control Panel. + - Fixed handling "dead keys" under Windows. + - Fixed a crash in the Follow-me router when selecting a new airwire with + Ctrl-Left mouse button. + - Fixed a possible crash when using the file dialog after closing a project. + - Fixed calling UL_ATTRIBUTE.defaultvalue for attributes that are defined in + the library from within a schematic in case a project is open. + - Fixed calculating the pointer rectangle in the SHOW command in case the + shown net segment contains only pin references (no wires, labels or + junctions). + - Fixed pasting smashed parts with attributes in the schematic (the attribute + value was lost in such cases). + - Fixed the ERC to detect nets with only one pin connected to them, in case + the only other pin types connected to that net are supply pins that have + no pad. + - Fixed handling backslashes and exclamation marks in part names and values + when updating from versions before 5.0. + - Fixed a crash on Mac OS X when leaving the program while the CAM Processor + window is open and has keyboard focus. + - Fixed the library update in case only attributes with empty values have + been modified. + - Fixed a hangup when pressing the right mouse button inside an entry + field that checks its contents and currently contains invalid data. + - The EXPORT IMAGE command no longer leaves a zero length file in case it + runs out of memory. + - The RIPUP command no longer selects objects it can't rip up. + - The CAM Processor message "Package '...' of element '...' contains a + polygon that may cause extremely large plot data" had the package and + element name reversed. + - Fixed a loss of the sheet thumbnail view if temporarily changing to another + virtual desktop under GNOME. + - Fixed a problem with REPLACE in the board if the schematic has been closed + immediately before from within a script. + - Fixed handling newlines when saving *.cam files. + - Fixed handling supply layers in case a board is edited that contains supply + layers, and then an other board is loaded that doesn't contain one or more + of these layers. + - Fixed disappearing group polygon lines in case the WINDOW command is used + while a group polygon is being drawn. + - Fixed handling the .dev, .pac and .sym extensions if they are entered in + the EDIT dialog of the library editor. + - Workaround for a problem with constructing a maximized window initially + minimized on Windows. + - Fixed calculating the bounding rectangle of xref labels. + - Fixed the DISPLAY LAST command in case the previous DISPLAY command + didn't actually change anything. + - Fixed drawing artifacts with SMDs in case the Cream frame mask parameter + is not zero. + - Fixed overlapping texts in the LayerSetup dialog in case only the Top + layer is active. + - Fixed handling negative array indexes in User Language programs. + - Fixed calculating mask data for SMDs with a non-zero roundness. + - Fixed a possible data corruption in case a script contains a CONNECT + command followed by a REMOVE command (without an intermediate EDIT + command). + - Fixed optimizing duplicate overlapping wires in case there are pads or + vias at both ends. + - Fixed optimizing a short wire that is overlapped by a longer wire at a + point where a third wire ends. + - Fixed the online help for the User Language statement 'while'. + - Fixed wire coordinates in UL_PIN.texts(). + - Fixed relocating wires and vias in the CHANGE PACKAGE command. + - Fixed detecting clearance errors between round pads, vias or smds if the + minimum clearance value is larger than 4.634mm. + - Fixed wrong z-order after re-docking a floating toolbar under Linux. + - Fixed resizing floating parameter toolbars if their contents changes. + - Fixed setting the width of the columns in the attribute list of the + properties dialog and in the change package dialog. + - Now removing duplicate PinRefs and Connects when loading a schematic + or a board, respectively. + - Fixed a superfluous UNDO step after loading an other schematic from + within the schematic editor, or creating a new sheet in an existing + schematic. + - Fixed handling error conditions in case the PRINT command tries to write + to a file that is currently open by another application. + - Fixed updating the surrounding rectangle of the source sheet when moving a + part from one sheet to another. + - Fixed displaying layer colors and fill styles in dialogs on Ubuntu-Linux + (problem observed on Ubuntu version 9.10). + - Fixed drawing the large cursor on Ubuntu-Linux with desktop transparency + effect (problem observed on Ubuntu version 9.10). + +Release notes for EAGLE 5.6.0 +============================= + +* Bugfixes: + + - Fixed RIPUP to make it stop at pads when clicking on an airwire + (was broken since version 5.2.4). + - Fixed a possible "Abort: Unknown objectType..." in the SIGNAL command. + - Fixed a bug in the Autorouter that sometimes caused DRC errors at pads, + vias and SMDs. + - Fixed the status message after a DRC or ERC, which sometimes wrongfully + contained the word "approved". + - Fixed a possible inconsistency of net classes after renaming all segments + of a net on the current sheet. + - Fixed a possible inconsistency of net classes after pasting parts with + power pins that automatically create new signals in the board. + - Fixed handling cfPad/SmdImpact in the Autorouter. + - Fixed terminating a track in the Follow-me router by clicking twice at the + same point. + - Fixed an unexpected offset of the airwire when clicking at an unroutable + point in the Follow-me router. + +Release notes for EAGLE 5.5.0 +============================= + +* User Language: + + - The new function strxstr() can be used to search strings using regular + expressions in User Language Programs. + - Added a note to the online help for UL_DEVICE about using the 'package' + data member to check whether this device has a package. + +* Design Rule Check: + + - The DRC no longer issues a "Drill Distance" error for vias that have only + one layer in common, e.g. 1-2 and 2-3 ("stacked vias"). + - The Design Rules dialog now issues a warning if the layer setup uses + any layers that are not available in the licensed program edition. + +* Text editor: + + - It is now possible to use an external text editor instead of EAGLE's + built in text editor (see "Help/Editor Windows/Text Editor"). + +* AUTO command: + + - The new option FOLLOWME in the AUTO command opens the Autorouter dialog + in a mode where only the parameters controlling the Follow-me router + can be modified. + - Routing from and to pads, smds and vias in the Autorouter has been + improved. + +* CHANGE command: + + - The CHANGE PACKAGE/TECHNOLOGY command no longer overwrites the value of + parts where the device has "value off", but the user has overwritten the + value (which is detected by comparing the old value to the name of the old + device). + +* CONNECT command: + + - Improved handling the width of the connection list in the CONNECT dialog. + +* DRC command: + + - The DRC command no longer automatically brings up the ERRORS dialog if + there are only approved errors. + +* ERC command: + + - The ERC command no longer automatically brings up the ERRORS dialog if + there are only approved errors/warnings. + - The ERC message "OUTPUT and ... pins mixed on net ..." has been enhanced + to show the actual direction of the referenced pin, so that the offending + pin can be easily located. + +* EXPORT command: + + - The new option WINDOW of the EXPORT IMAGE command can be used to export + an image that contains only the currently visible window selection of the + drawing. + +* PRINT command: + + - The new option SHEETS of the PRINT command can be used to print a given + range of sheets from the command line. + - The new option WINDOW of the PRINT command can be used to print only the + currently visible window selection of the drawing. + - The new options PORTRAIT and LANDSCAPE of the PRINT command can be used to + define the orientation of the resulting output. + +* RENAME command: + + - The RENAME dialog now contains the current name of the object, so that + it is easier to make small changes. + +* REPLACE command: + + - The REPLACE command no longer overwrites the value of + parts where the device has "value off", but the user has overwritten the + value (which is detected by comparing the old value to the name of the old + device). + +* ROUTE command: + + - The ROUTE command can now be used in "Follow-me" mode, where the + Autorouter is used to automatically route the selected airwire according + to the current Design Rules and Autorouter parameters. + Note that you need to have the Autorouter module enabled in your EAGLE + license in order to use the Follow-me router. + - The ROUTE command now automatically sets the wire width and via drill + according to the values defined by the Design Rules and net classes if + the new flag "Options/Set/Misc/Auto set route width and drill" is set. + +* SET command: + + - The new wire bend styles '8' and '9' are used to control the behavior of + the Follow-me router. '8' means route only the short end of the selected + airwire, while '9' routes both ends. + +* SHOW command: + + - If the '@' character is given in the command line of the SHOW command, + a pointer rectangle is now drawn around the shown object. This is helpful + in locating small objects that wouldn't show up too well just through + highlighting. + - If an object given by name in the SHOW command is not found on the current + schematic sheet, a dialog is now presented containing a list of sheets on + which the object is found. + +* UPDATE command: + + - The library update no longer overwrites the value of parts where the + device has "value off", but the user has overwritten the value (which is + detected by comparing the old value to the name of the old device). + +* Miscellaneous: + + - Improved performance of approving ERC/DRC errors. + - Speeded up clearing the ERRORS list when clicking on the "Clear all" button + of the dialog. + - Modified the way EAGLE writes its files in order to avoid data corruption + on broken NAS (Network Attached Storage) systems. + - Speeded up calculating signal polygons. + - The packages of parts that are added to the schematic are now placed on + the board using the current grid. + - Speeded up filling the ERRORS list after running the DRC/ERC. + - The "File/Save all" function now also saves the eaglerc file. + - Some users don't want the warning message about a supply pin overwriting + a generated net name. The command + + SET Warning.SupplyPinAutoOverwriteGeneratedNetName 1; + + can now be used to disable that warning. + - Added a note to the "Stop" checkbox in the properties dialog of a via, + telling the user that this is not applicable if the drill diameter of the + via exceeds the value defined in "Design Rules/Masks/Limit"). + - When a supply pin is placed on a net segment, the user is now asked + whether the net segment shall be renamed to the name of the supply pin. + +* Bugfixes: + + - Fixed checking for balanced pairs of '{' and '}' in the MENU command. + - Fixed updating the via length combo box if the layer setup is modified + while the VIA command is active. + - Fixed displaying technology names in the device editor's Description + pane in case they differ only in leading zeroes of their numeric parts. + - Fixed marking a drawing as modified if a global attribute is changed. + - Added missing User Language constants FRAME_BORDER_*. + - Fixed changing the layer of a polygon in a package or symbol (it wouldn't + change between signal and non-signal layers). + - Fixed a crash when doing a Drag&Drop from the WinRAR program under + Windows (dropping still doesn't work from WinRAR, but at least EAGLE + won't crash any more). + - Fixed updating the path names of items in the Control Panel's tree view + if the directory in which they are contained is renamed from within the + tree view. + - Fixed handling the 'catch factor' in case it is smaller than the 'select + factor'. + - Fixed handling the indicator lines if a smashed text of a locked part + is contained in a GROUPE MOVE. + - Fixed updating the via diameter display in the Properties dialog when + changing the drill diameter and clicking on 'Apply'. + - Fixed updating the tree list in the ADD, REPLACE etc. dialog when + reopening such dialogs after modifying a library from outside of EAGLE. + - Fixed printing pad shapes in inner layers. + - Fixed drawing drill holes of pads and vias (they were drawn one pixel too + small in radius). + - Fixed unjustified ERC warning "Segment of net ... has no visual connection + (like Label, Bus or Supply pin) to other segments of the same net" in case + of empty segments (which sometimes were left over from older versions). + - Fixed sticky status messages like "DRC:". + - The layer setup tab in the Design Rules dialog now displays the total + thickness of the board by adding up all copper and isolate values. + - Fixed a possible loss of consistency when deleting a junction from a pin. + - Fixed displaying status messages in the text editor. + - Added missing constants LAYER_INFO and LAYER_GUIDE to the online help + page for UL_LAYER. + - Fixed using the MIRROR and ROTATE command after defining a new group + while one of these commands is already active. + - Fixed handling the tag in the description editor and in the ADD + dialog. + - Fixed an occasional problem with renaming temporary files on Windows in + case the new file name already exists. + - Fixed keeping approved DRC errors when clicking on the "Clear all" + button in the ERRORS dialog. + - Fixed initial display of a pasted group at the mouse position in case + the PASTE command was entered from the command line with an orientation. + - Fixed showing the current angle in the Angle combo box of the parameter + toolbar if the value has been entered in the command line and is not one + of the default orthogonal values. + - Fixed a crash when clicking with the MITER command on a wire of a polygon + that consists of only three edges. + - Fixed generating technology and attribute lines in EXPORT SCRIPT for + devices that have no package (like frames etc.). + - Fixed detaching a pin from a net in case one net wire ends at the pin, + while another net wire of the same net segment passes over the pin's + connection point, and the wire ending at the pin is deleted. In such + a situation, the pin was left connected to the net, and when it was + later connected to a different net, the corresponding pad in the board + was connected to two different signals. + - Fixed the online help of the HTML tag (it allows only links within + the same document). + - Fixed approving DRC errors in the ERRORS dialog in case some errors are + currently not displayed, because their layer is hidden. + - Fixed a crash in the Mac version in case a device was loaded in the + library editor, the "EAGLE" pulldown menu was openend and the mouse cursor + was moved over the (wrongfully disabled) "Quit EAGLE" item. + - Fixed toggling the group membership of objects when clicking on them + with the Ctrl key pressed. + +Release notes for EAGLE 5.4.0 +============================= + +* Miscellaneous: + + - Speeded up the window refresh in the schematic editor in case there are + many parts with lots of attributes that don't display their value. + +* Bugfixes: + + - Fixed detecting faulty nameless attributes for parts in case a part is + copied and there have been attributes deleted before that. + - Fixed a crash in the DRC with zero-width arcs in the t/bRestrict layers. + - Fixed checking zero-width straight wires in the t/bRestrict layers. + - Fixed changing the net name of every segment on the current sheet in case + the same net is also present on other sheets. + - Fixed handling UNC paths in Options/Directories. + - Fixed selecting multi-gate parts by name in the NAME command (the old name + had to be given as a full gate name, e.g. IC1A, instead of the basic part + name, e.g. IC1). + - Fixed drawing artefacts when moving a part in the board that has pads or + smds with long names, and displaying the pad names is activated. + - Fixed a crash in the User Language function fileglob() in case the given + pattern string is empty. + - Fixed a duplicate confirmation when using the User Language function + dlgFileSave(). + - Fixed clearing the status bar in the SHOW command when clicking on an + object that has no name after highlighting a named object. + - Fixed handling zero length airwires when moving a group. + - Making sure the actual via length used in the VIA command is one of + those defined in the layer setup. + - Fixed superfluous airwires when checking whether a wire is connected to + a polygon. + - Fixed calculating polygons with a large Width that are connected to pads + with thermals. + - Fixed faulty backannotation when changing an attribute of an element in + the board where the corresponding part in the schematic doesn't have that + attribute. + - Fixed handling pin names with @nn when CUT/PASTEing. + - Fixed a crash when entering 'CLASS -8'. + - Fixed clearing the "Updating libraries from paste buffer" status message + in the PASTE command. + - Fixed invoking instances after CUT/PASTE in case they were smashed and + were not part of the original group. + - When loading a schematic or library file from an earlier version, the + new layers 97 and 98 are now automatically added. + - Fixed handling the drill holes of blind/buried vias in the CAM Processor + in case none of the layers affected by a particular via is active (if the + "Fill pads" option was unchecked, the hole was always drawn and may have + punched through wires in other layers). + - Fixed handling the offset of wires and texts of frames contained in a + device's symbol in UL_FRAME. + - Fixed handling the orientation and positioning of texts of frames + contained in a device's symbol in the CAM Processor. + - Fixed handling extensions in the RENAME command. + - Fixed calculating the number of edges for arcs and circles in the CAM + Processor's output devices. + - Fixed a possible data corruption if the RIPUP command with the '!' + option was used without terminating the command line with ';'. + +Release notes for EAGLE 5.3.0 +============================= + +* Platforms: + + - The Linux version of EAGLE no longer uses libXinerama and libXfixes, + because these libraries are not available on all systems. + +* User interface: + + - Normally EAGLE doesn't automatically position the mouse cursor. However, + some users want the cursor to be repositioned to the point where it has + been before a context menu in the drawing editor was opened. The command + + SET Option.RepositionMouseCursorAfterContextMenu 1; + + can now be used to get this functionality. + - Shift+Right mouse button now reverses the direction of rotation in + commands that rotate objects with the right mouse button. + +* AUTO command: + + - Added the options LOAD and SAVE to the AUTO command, which allow loading + and saving the Autorouter parameters. + +* BOARD command: + + - The default board outlines generated by the BOARD command now start at + the origin of the drawing area, and are no longer offset so that they + are centered within the 50mil grid. + +* INVOKE command: + + - The INVOKE command now displays in the status line the part and device + name of the object attached to the cursor. + +* PASTE command: + + - The PASTE command now accepts an 'orientation' parameter in the command + line. + - The PASTE command is no longer a transparent command, because this + prevented its parameter toolbar from being shown. + +* ROUTE command: + + - When routing an airwire that starts at an already routed wire, the new + wire's width is now automatically adjusted to that of the existing wire + if the Shift key is pressed when selecting the airwire. + - The end point of the dynamically calculated airwire is now always used as + an additional snap point, even if it is off grid. If the remaining airwire + has a length that is shorter than SNAP_LENGTH, the routed wire + automatically snaps to the airwire's end point, and stays there until the + mouse pointer is moved at least SNAP_LENGTH away from that point. + The SET parameter SNAP_BENDED is now obsolete, but is still tolerated for + compatibility. + +* SET command: + + - When routing an airwire that starts at an already routed wire, the new + wire's width is now automatically adjusted to that of the existing wire. + - The SET parameter SNAP_BENDED is now obsolete, but is still tolerated for + compatibility. + +* Miscellaneous: + + - Improved selecting wires of the same signal that are close together. + - Pin names with '@' are now displayed in the previews the same way as in + a schematic (with everything after and including the '@' stripped). + +* Bugfixes: + + - Now clearing the status bar after a Properties dialog. + - Fixed handling polygons in the t/bStop layer of mirrored elements in the + DRC. + - Fixed getting the path to the AppData directory from the Windows + registry in case it contains non-ASCII characters. + - Fixed a crash in the NET command when clicking on a bus that has a name + that consists only of a "SYNONYM:" part. + - Fixed handling via lengths in the Properties dialog that are not allowed + according to the layer setup. + - Fixed a crash in the CHANGE LAYER command with signal wires. + - Fixed displaying and printing objects in layer 50. + - Fixed renaming a net in the Properties dialog, in case the same net + is present on other sheets, too. + - Fixed a possible loss of consistency when making changes in the schematic, + switching to another sheet, making more changes, and then doing UNDO in + the board, in which case the number of undo steps in the two editor + windows drifted apart. Every time the sheet is changed in the schematic + editor, a separate UNDO step is now stored, even if there is no actual + change made on that sheet. + - Fixed unSMASHing parts in the schematic (this deleted attributes from the + part in the board). + - Fixed extremely long delay when saving a file. + - Fixed the example regarding the use of SMD_FLAG_STOP in the online help + page for UL_SMD. + - Fixed displaying the status bar header in case a command runs for a + longer time and the mouse is moved inside the editor window. + - Fixed the User Language function UL_SIGNAL.airwireshidden. + - Fixed marking the text in the first string entry field in a User Language + dialog when the dialog is opened (didn't work under Windows). + - Fixed handling the $HOME environment variable in the directories set in + the Options/Directories dialog under Windows. + - Fixed selecting pins with the GROUP command (they were included in the + group even if the Symbols layer was not active). + - Fixed faulty nameless attributes for parts in case a part is copied and + there have been attributes deleted before that. + - Fixed ensuring that the text cursor is visible when opening a text + editor window while loading a project. + - Fixed displaying the placeholder texts ">DRAWING_NAME", ">LAST_DATE_TIME", + ">PLOT_DATE_TIME" and ">SHEET" in a new, yet unsaved drawing. + - Fixed keeping the layer list focused when clicking on a button in the + DISPLAY dialog. + - Fixed always displaying text in the HTML editor's upper pane as HTML. + - Fixed centering on the current error in the ERRORS dialog by pressing + the 'Enter' or 'Return' key. + - Fixed setting the focus in the Design Rules dialog. + - Fixed refreshing the Control Panel's tree view after copying a directory. + - Fixed erasing the original airwire after displaying a dialog while the + ROUTE command is active with an airwire attached to the mouse pointer. + - Fixed reporting calls to non-existing object members in the User Language + (like, for instance, UL_WIRE.arc.curve). + - Fixed setting the 'Curve' parameter to 0 in the Properties dialog of + an arc shaped wire. + - Fixed a possible crash when using CLOSE in a script file and a message + box appears after that. + - Fixed automatically placing elements in the BOARD, ADD and PASTE command + (issued from the schematic), so that they are not placed outside the + valid range of coordinates. + - Fixed sorting newly created items in the Control Panel's tree view. + - Fixed drawing artefacts when doing UNDO after RIPUP. + - Fixed duplicate data for rotated rectangular apertures in Gerber RS-274-X. + - Fixed drawing artefacts when doing UNDO after deleting a polygon edge. + - Fixed dynamic airwire calculation in the ROUTE command in case layers + containing objects that belong to the routed signal are not displayed. + - Fixed entering values into the Angle combo box of the parameter toolbar. + - Fixed setting HKEY_CLASSES_ROOT\Applications\eagle.exe\shell\open\command + in the Windows registry ("command" was a string instead of a key). + - Fixed printing lines with zero width on the Mac (they were printed too + thick). + - Fixed a possible hangup when pressing a character or digit key in the + table of the attribute dialog of the library editor. + +Release notes for EAGLE 5.2.0 +============================= + +* ATTRIBUTE command: + + - The "Technologies" combo box in the "New/Change Attribute" dialog now lists + the name of the current technology. + - Changed the behavior of the ATTRIBUTE command in case no coordinates are + given in the command line, so that the value of an existing attribute + can be changed via the command line. + +* DRC command: + + - The DRC now reports supply layers, that are not contained in the layer + setup of the Design Rules, as "Layer Setup" errors. + +* SET command: + + - The SET command can now be used to set parameters of the eaglerc file. + +* Miscellaneous: + + - If you don't like the way unprocessed polygons display their edges (as + dotted lines), you can change this with the command + + SET Option.DrawUnprocessedPolygonEdgesContinuous 1 + + The edges of unprocessed polygons will then be displayed as continuous + lines, as was the case before version 5 (however, they will not be + highlighted). + - The commands CUT, DRC, ERC, ERRORS, EXPORT, GROUP, OPTIMIZE, PASTE, PRINT, + RATSNEST, UPDATE, USE and WRITE are now "transparent", which means they + no longer terminate a previously active command like MOVE etc. + - The layers are now drawn in a sequence that properly reflects the actual + resulting board. For instance, the bottom placeplan is drawn first, then + the signal layers from bottom to top, then the top placeplan. This + sequence is reversed when printing mirrored. + - Added a note to the online help of the PAD and VIA commands, saying that + the shape only applies to the outer layers (in inner layers the shape is + always "round"). + - Parts on the board are now shifted into the allowed area of the + Light or Standard edition, respectively, if they extend outside that area + after a REPLACE, CHANGE PACKAGE or UPDATE operation. + +* Bugfixes: + + - CHANGE SHAPE now silently ignores the options LONG and OFFSET when + entered in the command line of a board editor window. + - Fixed displaying very narrow rectangles under Linux, in case the resulting + rectangle on the screen is only a single pixel wide. + - Fixed visibility of sheet numbers in sheet thumbnails in case of black + background. + - Fixed calculating the number of edges when drawing an arc with round + endings in the CAM Processor. + - Fixed changing the wire bend style with the parameter toolbar buttons + after switching into arc mode with Ctrl+Left. + - Fixed a User Language performance issue with string expressions like + 's += t' in loops with many executions. + - Fixed a crash when changing the grid color while a library is open + without having edited a particular package, symbol or device set, yet, + and the grid is actually displayed. + - Fixed a performance issue in displaying status messages and progress bars. + - Fixed handling uppercase characters in directory names in the Control + Panel's tree view under Windows and Mac OS X. + - Fixed setting the state of a dlgCheckBox from within its statement. + - Fixed a crash when entering a curve parameter (like "@+20") in a command + that works with wires, without an actual wire attached to the cursor. + - Fixed a loss of the current text marking when clicking into a numerical + entry field with the right mouse button. + - Fixed a possible data corruption after changing the coordinates of an + object or the layer of a wire in the properties dialog, in case this + resulted in a wire optimization. + - Fixed handling the 'A' modifier in coordinates entered in the command line. + - Fixed redisplaying a ULP dialog if the dlgRedisplay() call is followed by + a loop statement. + - Fixed an unexpected change of the offset in a dlgTextView in case an other + dialog item is modified. + - Fixed displaying status messages while a script is running. + - Fixed calculating the width of the last column in a dlgListView. + - Fixed updating the layer colors in the parameter toolbar's Layer combo + box in case they are modified with the DISPLAY or SET command while + a command is active. + - Fixed forward annotating a change of a net name in the properties dialog + of a net wire or junction. + - Fixed drawing rotated rectangles with the CAM Processor's GERBER_RS274X + driver in case the drawing consists exclusively of such rectangles. + - Fixed setting the paper size in the printer dialog on Linux systems + that use the CUPS printing system. + - Fixed setting a modified attribute value back to the library default + in case the default value is empty. + - Fixed overwriting a non-empty attribute default value with an empty value + in the schematic. + - Fixed RIPUP of polygons of selected signals in case the command line is + terminated with ';'. + - Fixed missing spaces when rendering '-' between tags. + - Fixed displaying the placeholder texts ">DRAWING_NAME", ">LAST_DATE_TIME", + ">PLOT_DATE_TIME" and ">SHEET" in case a part is smashed. + - Fixed handling file names that start with a '.' in the PRINT command. + - Fixed unexpected wire fragments in CAM Processor and PRINT output. + - Fixed a possible crash in the DRC when handling extremely small arcs. + - The values for "Catch factor" and "Select factor" can now be entered + as decimal numbers in the "Options/Set/Misc" menu to allow values less + than 1. + - Fixed the description of the palette() function in the online help to + properly mention the alpha channel of ARGB values. + - Fixed the description of REAL_EPSILON in the online help. + - Fixed selecting a group with the alternate grid in the COPY command. + - Fixed subtracting very small and thin arcs from polygons. + - Fixed handling UTF-8 characters in the readfile() function when reading + into a string array. + - Fixed the DRC to have it check unconnected pads/smds against objects in + the Dimension layer, as it was the case in version 4.x. + - Fixed mirroring polygons in packages when dragging the packages in the ADD + command. + - Fixed storing relative path names in the project file in case, e.g., a + project named /abc/def is open and a file named /abc/def-1/some/name + is edited. + - Fixed marking the text in the first string entry field in a User Language + dialog when the dialog is opened. + - Fixed unwanted flashing of signal when placing a wire in the ROUTE command. + - Fixed a crash if a CHANGE command is applied to a group containing a + polygon that is in the calculated state, and that CHANGE causes a + recalculation of the polygon. + - Fixed calculating the bounding rectangle of placeholders for global + attributes. + - Fixed handling escaped '&' characters in dlgLabel in case there is no + actual hotkey in the label. + +Release notes for EAGLE 5.1.0 +============================= + +* Platforms: + + - Now setting HKEY_CLASSES_ROOT\Applications\eagle.exe\shell\open\command + in the Windows registry to allow associating file extensions with the + EAGLE executable. + - The installer now uses the User Access Control dialog to request + Administrator rights when running under a limited user account on Windows + Vista. + +* UPDATE command: + + - Rephrased the online help for 'UPDATE old_library_name = new_library_name', + to make it clear that the library inside the board/schematic file will be + renamed, not the external library file. + +* CAM Processor: + + - The CAM Processor's GERBER_RS274X driver now generates polygon area fill + codes when drawing rotated rectangles. + +* Miscellaneous: + + - Decimal numbers beginning with a comma are now accepted in the command + line, provided the locale settings define the comma as decimal delimiter. + - If a text like >ABC is placed directly in a board or schematic, and there + is a global attribute with the same name and an empty value, the origin + cross of that text is now displayed to allow the user to manipulate the + text. + +* Bugfixes: + + - Fixed a crash when using the CAM Processor in command line mode + (option -X) and having "Always vector font" turned off. + - Fixed drawing very short lines under Windows and Mac OS X, in case their + coordinates in pixels result in a zero length. + - Fixed setting word wrapping in dlgLabel in case the label text contains + HTML tags. + - Fixed rendering the '-' character between ... tags. + - Fixed handling airwires in the ROUTE command after routing part of a + signal (the remaining airwire reacted on CHANGE WIDTH). + - Fixed copying and CUT/PASTEing parts with attributes defined at part level. + - Fixed the User Language function printf() to correctly handle the value + 0x00 and those above 0x7F in binary mode. + - Fixed defining a GROUP if the last coordinate of the group polygon is equal + to the first one. + - Now ignoring faulty window coordinates in eagle.epf and eaglerc files. + - Fixed running User Language Programs that start with a Byte Order Mark. + - Fixed a crash in the ADD/REPLACE dialog when adding/replacing from a + library, closing the editor window, opening the editor window again and + adding/replacing again using the same library. + - Fixed positioning windows when opening a project under Linux. + - Fixed handling the XREF keyword in the LABEL command. + - Fixed storing color palette values in case they are defined in the + command line or a script using the SET command. + - Fixed drawing circles with a solid fill style on Windows and Mac OS X in + case the width is about as big as the radius. + - Fixed drawing lines with zero width when zooming far into the drawing. + - Fixed positioning a dlgMessageBox that contains HTML text. + - Fixed handling the '@radius' parameter in the WIRE command (and all others + that accept such a parameter). + - Fixed updating the library name in the board when replacing a part in the + schematic and only the library name has changed. + - Fixed handling minimum clearance values for circles in the Autorouter and + when processing polygons. + - Fixed handling the "Use alpha blending" flag when displaying the color + dialog for white or colored background. + - Fixed removing the error indicator from the board editor when closing or + clearing the ERC error list. + - Fixed handling UTF-8 character constants in ULP files. + - Fixed displaying tool tips ("bubble help") in the parameter toolbars. + - Fixed processing keyboard shortcuts in the library editor in case no + pulldown menu has been opened, yet. + - Fixed handling 'char' variables in the User Language as 8 bit values. + - Fixed displaying the root directory in the Control Panel's tree view, in + case it is part of one of the directory paths. + - Fixed handling approved errors that have exactly the same signature. + - Fixed autorouting selected signals in case the net classes define + particular clearance values between signals that have been selected for + routing and those not selected. + - Fixed scrolling the drawing area with the mouse wheel if the "Mouse wheel + zoom" factor is set to 0. + - Fixed the default wildcard in the User Language dialog functions + dlgFileOpen() and dlgFileSave() under Windows. With "*" the Windows file + dialog doesn't handle *.lnk files correctly, therefore the default + wildcard is now "*.*" as in previous versions. + - Fixed graphics distortions when running the Linux version of EAGLE on an + X11 server that runs on a "big endian" system. + - Fixed drawing artefacts from the origin cross when moving a gate in a + device set. + - Fixed a crash after highlighting a DRC error, switching to another board, + and then using the DISPLAY command to change the visible layers. + - Fixed forward annotation in case a new attribute with an empty value is + added to a part in the schematic, or the value of an existing attribute + is changed to '' (empty) in the schematic. + - Fixed false positive DRC errors for round objects in case the actual + clearance is exactly the same as the minimum clearance. + - Fixed reference line for net labels when pointing to an arc. + - Fixed invalid coordinates in data generated by the CAM Processor for + draw devices (like HPGL plotters) in case of very short lines that result + in a zero length in machine units. + - Fixed handling part attributes that overwrite global attributes (the name + field was disabled) and attributes with an empty value (the value field + was disabled). + - Fixed handling bounding rectangles of smashed parts, in case the package + or symbol contains nothing but placeholder texts. + - Fixed handling the last value in the Colors parameter of CAM job files. + - Fixed "File/Save all" so that it saves the project file even if + "Automatically save project file" is not set. + - Fixed handling UL_SMD.dx()/.dy() and UL_PAD.diameter() when called with + a "stop" or "cream" layer in case the smd or pad has the NOSTOP or + NOCREAM flag set. + - Fixed deleting local attributes that overwrite global attributes. + - Fixed changing the value of local attributes that overwrite global + attributes in case the current value is empty. + - Fixed splitting wires when moving a wire endpoint onto an other wire. + - Fixed resolving *.lnk files under Windows in the Control Panel's tree + view. + - Fixed displaying status texts in case an object's information contains one + of the characters '<', '>' or '&'. + - Fixed using an attribute named VALUE as default value for devices that + have 'Value On'. + - Fixed a performance issue in the User Language function status(). + - Fixed displaying the name of the loaded file in the status bar of the + CAM Processor (it disappeared as soon as the mouse cursor was moved + over the pull down menu). + - Fixed handling supply layers in the Autorouter in case a signal that + has a supply layer is already (partially) routed and the Autorouter is + run (the wires and vias of such a signal were not "seen" by the + Autorouter and thus routed again; other signals routed in the same + Autorouter run may even have overlapped or gotten too close to them). + - Fixed checking the font and width of texts of smashed elements in the DRC. + - Fixed an unexpected jump of the group when selecting the group with + Ctrl+Right in a command after clicking into the drawing area with + Ctrl+Right without an active command. + - Fixed the SPLIT command for polygon edges in case the split point is on + the original wire. + +Release notes for EAGLE 5.0.0 +============================= + +* Platforms: + + - The minimum system requirement on Windows platforms is now Windows 2000, + XP or Vista. + - The Mac OS X version of EAGLE no longer requires an X11 server, and + comes as a "Universal Binary" that runs on PPC and Intel Macs. + - The Linux version now comes as a a self extracting shell script with a + setup dialog. + - The buttons in dialogs are now placed in the sequence suggested by the + interface guidelines for the particular platform. + - The Windows version of EAGLE now stores the 'eaglerc.usr' file under + the directory that is defined by the registry key "HKEY_CURRENT_USER\ + Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\AppData" + if no environment variable named HOME is defined. If no such file exists + at the new location, it tries to read it from the old location. + +* User interface: + + - When clicking with the right mouse button on an object in an editor window, + a context specific popup menu is now displayed from which commands that + apply to this object can be selected. + - Since the context menu function on the right mouse button interferes + with the selection of groups, a group is now selected with Ctrl plus + right mouse button. If you want to have the old method of selecting groups + back, you can can add the line + + Option.ToggleCtrlForGroupSelectionAndContextMenu = "1" + + to the ~/.eaglerc file. This will allow + selecting groups with the right mouse button only and require Ctrl plus + right mouse button for context menus. + - The context specific object menu contains an entry named "Properties", + which allows to display (and modify some of) the object's properties. + - The schematic editor now contains a thumbnail view of all sheets. + Clicking on a thumbnail switches to that sheet. Drag&drop in the + thumbnail view can be used to reorder the sheets, and the context + menu allows you to add and delete sheets. + - The attributes of parts in the board and schematic can now be selected + by the commands that allow selecting objects with names by entering the + concatenation of part name and attribute name, as in + + MOVE R5>VALUE + + - The context menu of package variants in the library editor now contains + an option 'Edit Package' to quickly access the package of the selected + variant. + - The context menu of a gate in the device editor now contains an option + 'Edit Symbol' to quickly access the symbol of the selected gate. + - Renaming an item in the Control Panel is no longer done by clicking + into the text of an already selected item (this has caused too many + unintended activations of the editing mode). Use the context menu instead. + - The positions of all open Windows can now be stored using + "Options/Window positions" in the Control Panel. Newly opened windows of + the same type will then be positioned at the same places. + - Status messages and User Guidance are now displayed simultaneously + in the status bar of the editor window. + - If the pulldown menu in an editor window is hidden, the Alt+X key no + longer leaves the program. To have this functionality even with the + pulldown menu hidden, use "ASSIGN Alt+X Quit;". + - When switching between the sheets of a schematic, the current zoom level + is now saved. + - Panning the editor window with the center mouse button no longer requires + to press the Shift key to exceed the area defined by the scrollbars. + +* User Language: + + - Entries in a dlgListView are now displayed in multiple lines if they + contain '\n' characters. + - The User Language function UL_POLYGON.contours() now supports a second + parameter that allows looping through 'positive' and 'negative' + polygons separately. + - The User Language function UL_CLASS.clearance now accepts a parameter + that allows retrieving the clearance between two net classes. + - The User Language objects UL_ELEMENT and UL_INSTANCE now have a new + member function 'smashed'. + - Include statements in ULPs that contain relative paths, as in + + #include "dir/file.ulp" + + are now searched for within the directories entered under + "Options/Directories/User Language Programs". + - The new User Language function timems() delivers the time in milliseconds + since the start of the ULP. + - The new User Language function ingroup() can be used to check whether an + object is within the current group. + - The new User Language function system() can be used to execute external + programs. + - The User Language objects UL_ELEMENT, UL_INSTANCE and UL_NET have new + data members 'column' and 'row' which return the location within a + drawing frame. + - The User Language member functions UL_ELEMENT.smashed and + UL_INSTANCE.smashed now accept an optional parameter text name that allows + you to query whether there is a smashed parameter text by that name. + - In the User Language the labels of a segment (both bus as well as net) + can now be accessed through the new object type UL_LABEL, which is + generated by the new loop member UL_SEGMENT.labels(). The old way of + accessing labels through UL_SEGMENT.texts() is now deprecated and won't + handle cross-reference labels correctly. The actual text of a label is + now returned by UL_LABEL.text. + - The User Language object UL_SCHEMATIC has a new member 'xreflabel', + which returns the format string used to display cross-reference labels. + - The User Language object UL_SCHEMATIC has a new member 'xrefpart', + which returns the format string used to display part cross-references. + - The User Language object UL_INSTANCE has a new loop member named 'xrefs', + which loops through the gates that represent the contact cross-reference. + +* Screen drawing: + + - Drawing on screen no longer uses "raster OPs". The individual layers + are now drawn using "alpha blending". Each color (except for the + background color, which is always opaque) can have its own alpha value, + which defines how transparent it is. A value of 0 means the color is + fully transparent (i.e. invisible), while 255 means the color is + completely opaque. When reading an eaglerc file from an older version, + the alpha values of all colors are initialized to a default value if + all palette entries have an alpha value of 0. + You can use the script 'defaultcolors.scr' to set the colors to the + new defaults. + When printing, the alpha values are always set to 255. + - Since the layer colors no longer use additive mixing, but rather use + alpha blending, the default background color in the layout editor + window has been changed to white. + - If you want to have the old raster OP behavior on black background, + you can uncheck the "Use alpha blending" box in the "Options/Set/Colors" + dialog. In that case the alpha value defined for the colors is ignored + when using a black background, and colors are mixed using an OR function. + - The colors above index 15 in the color palettes are now by default + initialized with a medium gray value. + +* User defined Attributes: + + - In a library, devices can now have "attributes", which are arbitrary + user definable "name/value" pairs. Attributes are related to the individual + "technology" variants of a device. + - The new command ATTRIBUTE can be used to define the attributes of a given + technology variant (see "Help/Editor commands/ATTRIBUTE" for details). + - The new User Language object UL_ATTRIBUTE can be used to access attributes + (see "Help/User Language/Object Types/UL_ATTRIBUTE" for details). + - The User Language objects UL_PART, UL_INSTANCE, UL_ELEMENT and UL_DEVICE + have a new loop member named 'attributes()'. + - The User Language objects UL_PART and UL_ELEMENT have a new member function + named 'attribute()', which can be used to query a part for the value of a + given attribute. + - The User Language object UL_ELEMENT has a new member function named + 'attribute()', which can be used to query an element for the value of a given + attribute. + - In a 'symbol' or 'package' drawing, any text that starts with a '>' character + and matches an attribute name of the actual part or element will be replaced + by the attribute value in the schematic or board, respectively (see + "Help/Editor commands/TEXT" for details). + - The SMASH command now smashes all texts in the symbol or package that start + with '>' and match an actual attribute name, and assigns them as attributes + to the part (except for the traditional placeholder texts like ">NAME", + ">VALUE" etc., which are treated like before). + - Boards and schematics can now have global attributes. + - The User Language objects UL_BOARD and UL_SCHEMATIC have a new loop member + named 'attributes()', which can be used to loop through the global + attributes. + +* Locking the position of a part: + + - The new command LOCK can be used to lock the position of a part in the + board. + - The origin of a locked part is displayed as an 'x' to have a visual + indication that the part is locked. + - The User Language object UL_ELEMENT has a new data member 'locked', which + return the setting of the lock flag. + +* Popup menus for buttons: + + - Various buttons in the editor window now have a popup menu that contains + a list of recently used items or user defined aliases (depending on the + button type). These buttons are marked with a small black arrow at the + bottom right corner of their icon. To access this list, click on the + button and hold the mouse button pressed until the list pops up, or + click on the button with the right mouse button. + - The button popup menus for DISPLAY, GRID and WINDOW contain two special + entries: "Last" restores the previous settings, and "New..." queries the + user for a new alias name and stores the current settings under that name. + +* Aliases for command parameters: + + - The DISPLAY, GRID and WINDOW commands now have an extended syntax that + allows the user to define "aliases" for certain parameter settings. + The syntax to handle these aliases is: + + CMD = + + Defines the alias with the given to expand to the given + . The may consist of any characters, except blank + or semicolon, and is treated case insensitive. + + CMD = @ + + Defines the alias with the given to expand to the current + parameter settings of the command. + + CMD = ? + + Asks the user to enter a name for defining an alias for the current + parameter settings of the command. + + CMD = + + Opens the dialog of the command and allows the user to adjust the set + of parameters that will be defined as an alias under the given . + In case of the WINDOW command a rectangle can be defined that + represents the desired window area. + + CMD = ; + + Deletes the alias with the given . + + CMD + + Expands the alias with the given and executes the command with + the resulting set of parameters. The may be abbreviated and + there may be other parameters before and after the alias (even other + aliases). Note that aliases have precedence over other parameter + names of the command. + + Example: + + 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. + Note the abbreviated use of the alias and the case insensitivity. + +* Inverted names: + + - The names of inverted ("active low") signals can now be displayed with + a bar over the text ("overline"). To do so, the name needs to be preceded + with an exclamation mark ('!'), as in + + !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). + - When updating files from older versions, a backslash in any pin, net, bus + or signal name will be replaced with the appropriate exclamation mark. + Any backslash or exclamation mark in a normal text will be escaped by + preceding it with a backslash as necessary, since the backslash is now a + real escape symbol in texts. + +* Drawing frame: + + - The new command FRAME can be used to draw a frame with numbered columns + and rows. + - The new User Language object UL_FRAME can be used to access the data + of a drawing frame. + - The User Language objects UL_ELEMENT, UL_INSTANCE and UL_NET have new + data members 'column' and 'row' which return the location within a + drawing frame. + - The drawing frames in the "frames" library now use this new frame object. + +* Cross-reference labels: + + - A "label" on a net segment now has a new property named "xref", which + puts it into "cross-reference" mode. In this mode it will be displayed + according to the "Xref label format" string defined under + "Options/Set/Misc", and will show its text at a different offset from + its origin, so that it can be placed nicely at the end of a net wire. + - 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 format of cross-reference labels can be defined in the + "Options/Set/Misc" dialog under "Xref label format". See + "Help/Editor Commands/LABEL" for a list of placeholders that can be + used here. + - The User Language object UL_SCHEMATIC has a new member 'xreflabel', + which returns the format string used to display cross-reference labels. + - The SET command has the new parameter XREF_LABEL_FORMAT, which can + be used to define the cross-reference label format string. + - The CHANGE command has a new option XREF that can take the values OFF + and ON, and can be used to change whether a label is "plain" or + "cross-reference". + - The LABEL command has the new option XREF to define a cross-reference + label. There are also two new icons in the parameter toolbar to set this + option. + - In the User Language the labels of a segment (both bus as well as net) + can now be accessed through the new object type UL_LABEL, which is + generated by the new loop member UL_SEGMENT.labels(). The old way of + accessing labels through UL_SEGMENT.texts() is now deprecated and won't + handle cross-reference labels correctly. The actual text of a label is + now returned by UL_LABEL.text. + +* Part cross-reference: + + - The new text variable '>XREF' can be used in a symbol drawing to display + a cross-reference to the MUST gate of the device this symbol is used in. + A typical application for this are the contacts of a relay, where the + '>XREF' text variable would display the frame coordinates of the relay's + coil. + - The format of part cross-references can be defined in the + "Options/Set/Misc" dialog under "Xref part format". See + "Help/Editor Commands/TEXT" for a list of placeholders that can be + used here. + - The SET command has the new parameter XREF_PART_FORMAT, which can + be used to define the part cross-reference format string. + - The User Language object UL_SCHEMATIC has a new member 'xrefpart', + which returns the format string used to display part cross-references. + +* Contact cross-reference: + + - EAGLE can now automatically generate a contact cross-reference, which is + mainly used for relay coils and contacts in electrical schematics. + - The contact cross-reference is generated for the first MUST gate in a + part, and will display all other gates that have an '>XREF' text variable + in their symbol drawing. The MUST gate is typically the coil of a relay, + while the other gates are the contacts. + - The contact cross-reference is displayed at the same X coordinate as the + MUST gate, and at the Y coordinate defined by a text variable with a + value of '>CONTACT_XREF'. This text can be placed either in a frame + symbol, or directly on the schematic sheet drawing. The first one + encountered will be used. If no such text is found, no contact + cross-reference will be generated. + - The User Language object UL_INSTANCE has a new loop member named 'xrefs', + which loops through the gates that represent the contact cross-reference. + +* ADD command: + + - The syntax of the ADD command has been changed to allow using libraries + with blanks in their file name. Note that now the device, package or + symbol name always has to come first. + +* ASSIGN command: + + - On the Mac the ASSIGN command now knows the "Cmd" modifer key. + +* BOARD command: + + - The BOARD command now accepts a parameter that defines the raster in + which to place the parts when generating the board, 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. + +* CHANGE command: + + - The CHANGE command now selects only objects that actually possess the + property that shall be changed. + - When selecting an object with the CHANGE command, that object is now + flashed to indicate the change to the user. + - CHANGE LAYER now also works with a group. + - The new CHANGE option DISPLAY can be used to change the display mode of + an attribute. + - The options in the CHANGE popup menu are now sorted alphabetically. + - CHANGE TEXT now accepts the new text on the command line and allows it + to be applied to any number of text objects or the current group. + - The CHANGE command has a new option XREF that can take the values OFF + and ON, and can be used to change whether a label is "plain" or + "cross-reference". + +* CLASS command: + + - The minimum clearance between signals of different net classes can + now be defined in a matrix, allowing you to define separate individual + values for any combination of two net classes, as well as within the + same net class (see "Help/Editor Commands/CLASS"). + +* COPY command: + + - The COPY command can now copy a group by clicking with the right mouse + button. + +* DELETE command: + + - The DELETE command can now select parts, pads, smds, pins and gates by + name. The option SIGNALS to delete all signals in a board still exists, + so if a part with the name SIGNALS shall be deleted, its name must be + written in single quotes. + +* DISPLAY command: + + - The DISPLAY command no longer automatically turns related layers on or off + when used with the t/bPlace or Symbols layer. + The parameter + + Option.DisplayRelatedLayers = "0" + + to the ~/.eaglerc file is now obsolete. + - The DISPLAY command now supports "aliases" for parameter settings (see + "Aliases for command parameters"). + - The DISPLAY command has a new option "Last", which restores the settings + as they were before the previous DISPLAY command. + +* DRC command: + + - The DRC now reports wires in supply layers as errors if they are part of + a signal that is connected to any pad or smd. + - The DRC now always checks all signal layers, no matter whether they are + currently visible or not. + - The DRC now reports an error if an object in the t/bPlace, t/bNames or + t/bValues layer overlaps with an object in the t/bStop layer (provided + these layers are active when the DRC is run). + - The DRC no longer reports objects in the Top or Bottom layer that + intersect with objects in the t/bRestrict layer in the same package. + - The DRC now distinguishes between clearance violations and actual + overlaps of copper between different signals. + - The Design Rules dialog now marks the name of the Design Rules with an + asterisk if they have been modified. + +* EDIT command: + + - The EDIT command can now insert and reorder schematic sheets. + - Switching between sheets in a schematic no longer clears the undo + buffer. Adding, removing or reordering a sheet, however, still clears + the undo buffer. + +* ERC command: + + - The results of the Electrical Rule Check (ERC) are now listed in a dialog, + where clicking on a list item graphically marks the result in the + editor window (if applicable). + - The parameter Erc.SuppressAdditionalWarnings in the ~/.eaglerc file + is obsolete. Errors and warnings are now presented separately in the + ERRORS dialog. + - The ERC now checks for parts with user definable values that have no + actual value. + - The ERC now warns about unconnected input pins of uninvoked gates. + - The ERC now warns if a net has more than one segment, and any of these + doesn't indicate that it is part of a larger net (like, for instance, + though a label, bus or supply pin). + - The ERC now checks whether the name of a net segment that is connected to + a bus is actually contained in that bus. + - The ERC now warns if a pin is connected to a net, but there is no visisble + indication of the connection (like a net wire, junction or another pin). + +* ERRORS command: + + - If the ERRORS command is entered without having run an ERC or DRC + before, the appropriate check is now started first automatically. + - The ERRORS dialog now allows the user to mark messages as "approved", + which suppresses the error indicator in the editor window (see + "Help/Editor Commands/ERRORS"). + +* EXPORT command: + + - The default output format for EXPORT IMAGE is now PNG on all platforms + (on Windows it used to be BMP). + +* GRID command: + + - The GRID command now supports "aliases" for parameter settings (see + "Aliases for command parameters"). + - The GRID dialog no longer has a "Last" button, because this functionality + is now implemented through the command button popup menu. Click on the + GRID button with the right mouse button to access the "Last" function. + +* GROUP command: + + - The GROUP command now has a new option ALL, which can be used to define + a group that includes the entire drawing area. + - The GROUP command can now be used with the Shift and Ctrl key to extend + the group or toggle the group membership of individual objects, + respectively. + +* HELP command: + + - Since Windows Vista doesn't support the Windows Help file format any more, + EAGLE now uses the same HTML formatted help on all platforms. + - The Help window now has a "Find" bar where you can enter a text that will + be used to filter all help pages, so that only those that contain the + text will be shown. + - The help texts are now stored in one single HTML file for each language. + +* INFO command: + + - The INFO command can now select parts, pads, smds, pins and gates by name. + - The INFO command now brings up the same dialog as the Properties + option in the context menu of drawing objects, and also allows changing + properties. + +* INVOKE command: + + - If an already invoked gate is selected in the INVOKE 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. + +* LABEL command: + + - The LABEL command has the new option XREF to define a cross-reference + label. + - The LABEL command now accepts an 'orientation' parameter to define the + orientation of the label textually. + +* MIRROR command: + + - The MIRROR command now also works with rectangles. + - The MIRROR command can now select parts, pads, smds and pins by name. + +* MOVE command: + + - The MOVE command can now select parts, pads, smds, pins and gates by name. + - The MOVE command can now move a group of objects from one schematic sheet + to an other, without modifying the board. + +* NAME command: + + - The NAME command can now rename an individual polygon, which moves the + polygon from one signal to another. + - The NAME command can now select parts, pads, smds, pins and gates by name. + +* PACKAGE command: + + - The PACKAGE command, when used in the board or schematic editor, now + behave exactly like CHANGE PACKAGE. + +* PRINT command: + + - The PRINT command has a new option named FILE, which can be used + to print into a file. + - The PRINT command can now create PDF (Portable Document Format) + files. These files are fully searchable for any (non-vector-font) + texts they contain. + - The PRINT dialog now has a preview of the printed object. + - The scale factor in the PRINT command is now limited to the range + 0.001...1000. + - The calibration values for printing are now limited to the range 0.1...2. + - The border values as delivered by the printer driver are now rounded + up to the next higher multiple of 0.1mm. + +* RATSNEST command: + + - The RATSNEST command now ignores wires in supply layers. + - The RATSNEST command can now be called with signal names to calculate + only the airwires and polygons of selected signals. + - The RATSNEST command can now hide the airwires of selected signals. + - The RATSNEST command now displays the name of the currently processed + signal in the status line. + - The RATSNEST command now generates airwires for objects inside hatched + polygons that would "fall through" the hatch lines. Thermal and annulus + rings inside a hatched polygon that do not have solid contact to any of + the polygon lines are no longer generated. + +* REPLACE command: + + - The REPLACE command now works in the schematic, too. + +* RIPUP command: + + - The RIPUP command now has a new option '@' to allow ripping up all + or selected polygons. + - The RIPUP command can now handle wildcards in signal names. + +* ROTATE command: + + - The ROTATE command can now select parts, pads, smds and pins by name. + +* ROUTE command: + + - The "Via-Layers" combo box has been removed from the parameter toolbar + of the ROUTE command, since the ROUTE command always automatically + determines the minimum necessary via to make a connection. + - The ROUTE command can now select airwires by signal name. + - The ROUTE command no longer allows routing in supply layers. + - The ROUTE command with the Ctrl key pressed can now also start routing at + a via. + +* SET command: + + - The new SET variable CATCH_FACTOR defines the distance from the cursor up + to which objects are taken into account when clicking with the mouse (see + "Help/Editor Commands/SET"). + - The SET variable GRID_REDRAW is now obsolete, but is still tolerated + for compatibility. + - The SET command can now configure the popup menus for values of Isolate, + Spacing and Miter by setting the Isolate_Menu, Spacing_Menu and Miter_Menu + arrays. + - The SET command has the new parameter XREF_LABEL_FORMAT, which can + be used to define the cross-reference label format string. + - The SET command has the new parameter XREF_PART_FORMAT, which can + be used to define the part cross-reference format string. + +* SHOW command: + + - The SHOW command now works with wildcards. + - The SHOW command now highlights the individual nets belonging to a bus + if a bus is selected. + - The SHOW command now accepts a list of arguments and highlights all the + matching objects. + - The SHOW command with the name of an individual instance (like IC1A, + which is the gate A of part IC1) now shows exactly that instance. + - The SHOW command now uses the Ctrl key to toggle the highlight status + of the selected object, which also allows more than one object to be + highlighted at the same time. + +* SMASH command: + + - The SMASH command can now select parts by name. + +* SPLIT command: + + - The SPLIT command now automatically picks up the next wire segment when + placing a splitted wire. That way an already routed wire can be re-routed + more easily. + - The SPLIT command now also works with the "freehand" wire bend style. + +* TECHNOLOGY command: + + - The TECHNOLOGY command, when used in the board or schematic editor, now + behaves exactly like CHANGE TECHNOLOGY. + +* WINDOW command: + + - The WINDOW command now supports "aliases" for parameter settings (see + "Aliases for command parameters"). + - The WINDOW command has a new option "Last", which restores the settings + as they were before the previous WINDOW command. + +* WIRE command: + + - Starting a WIRE with the Ctrl key pressed now 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. + +* CAM Processor: + + - The output file name in the CAM Processor can now be defined using + several "placeholders" (see "Help/Generating Output/CAM Processor/Output + File"). The old variant of using ".ext" or ".*#" still works, but is + obsolete. + - The photoplotter and drill station info files now start with the fixed + string "Generated by EAGLE CAM Processor", followed by the EAGLE version + number. + +* Autorouter: + + - The autorouter now displays in the status line the name of the currently + processed signal and the time (in seconds) it has spent on a particular + connection in case it takes longer than 5 seconds. + +* Text editor: + + - The "Find&Replace" dialog in the text editor now has a "Prompt before + Replace" option. + - The keyboard shortcuts in the text editor now follow the platform + specific standards. + +* Polygons: + + - When processing signal polygons, round objects are subtracted in such a + way that the resulting error does not exceed 0.05mm (50 micron), which + means that the distance between an object and a generated polygon edge + may be up to 0.05mm larger than the value defined for the clearance or + isolation, respectively. This is done to keep the number of polygon + edges reasonably low. + - Signal polygons in "outline" mode are now displayed with dotted wires, + so that they can be distinguished from other wires. + - Fixed calculating polygons in signals that also contain other wires, vias, + pads or smds. If none of these other objects is on the same layer as the + polygon, the polygon was actually calculated instead of being shown as + outlines. + IMPORTANT NOTE: This fix may cause polygons that have previously been + calculated to be not calculated any more, and thus be missing from the + printout or CAM data! These polygons were electrically "floating", because + they were not connected to any other part of the same signal. + +* Miscellaneous: + + - The endings of wires and arcs with cap=round, as well as 'long' and + 'offset' pads, are now displayed round on all devices (no more octagonal + approximation). + - GROUP/MOVE now preserves the connectivity between wires, airwires and vias, + even if one of the related layers is not currently displayed. + - Increased the maximum nesting level in config files to avoid problems with + autorouter control files that define a large number of optimizing passes. + - The semicolon (';') is now no longer accepted in object names, to avoid + problems with parsing command lines. + - The Printer.InternalRendering parameter in the ~/.eaglerc file + has no meaning any more. Printing under Windows should now always work. + - Trailing whitespace following the continuation character '\' in script + files is now ignored. + - Blanks in layer names are no longer accepted. + - Selecting objects with only a single selection point (like pads, vias etc.) + has been improved. + - The different language versions are now all installed at once. + Language specific files are distinguished by adding the two letter + language code to their name, as in README_en. The DESCRIPTION files + in directories hold the language specific texts between HTML tags + .... CAM Processor and Design Rules files + separate different language versions of their parameters by adding, + e.g., [en] to the parameter names, as in Name[en]="Component side". + - The positions of the window splitters in the library editor are now + stored separately for each drawing type. + - If a layer name or a parameter alias entered by the user fully matches, + it is now preferred over a partially matching one. For instance, if there + are two layers named "Abcdef" and "Abc" (in this squence) and the user + enters "Ab", then the first matching layer "Abcdef" will be selected. + If the user enters "Abc", the second, fully matching layer is selected. + - Coordinates and sizes (like width, diameter etc.) can now be given with + units, as in 50mil or 0.8mm. If no unit is given, the current grid unit + is used. + - The info string for parts (as displayed by various command, like SHOW and + MOVE) now also lists the part's value in the status line. + - Entries in the "Open recent" lists are now only added when a file is + actually loaded from or saved to disk. + - When moving a net or bus label, a line is now drawn to the closest point + of the segment this label belongs to. + - If a command displays a progriess bar, the window title now displays the + current percentage. + - Changed the term "Rich Text" to HTML, to avoid confusing it with a + text format from Microsoft. + - In order to allow easier selection of circles that have a a large width + (as compared to their radius), circles can now be selected not only at + their radius, but also at their inner and outer circumference. + - The Professional Edition can now handle up to 999 schematic sheets. + - EAGLE can now automatically check if there is a new version available + on the CadSoft server. You can explicitly run this check through + "Help/Check for Update" from the Control Panel. + - The Projects path under Windows now also contains "$HOME\eagle" to offer + the user a default location for saving own projects. + - The new command line option -C can be used to start EAGLE with a + command string that will be executed in the editor window (see + "Help/Command Line Options"). + - Centering on errors now also works if the error is close to the edge + of the drawing. + - Decimal numbers can now be entered with a comma as the decimal separator + (if the locale settings allow this). It is strongly recommended, though, + to use the 'dot' as the decimal separator when writing scripts or ULPs + that return EAGLE commands through the exit() function, otherwise they + might not work on other systems. + - The device editor now displays origin crosses at the individual gates' + origins. + - The new schematic layers "Info" (97) and "Guide" (98) can be used for + general information and guide lines, respectively. The latter is mainly + for electrical schematics, to help properly align relay coils etc. + +* Bugfixes: + + - Fixed a possible loss of connectivity if a wire disappears (because + both ends coincide) after moving a group, and that same group is moved + again. + - Fixed a possible crash when moving a group that contains supply pins + that get connected to a net with a different name which is also contained + in the group. + - Fixed a possible unjustified "close but unconnected wires" error in the ERC. + - Fixed checking for '$' at the beginning of the layer name in the + "Change layer properties" dialog. + - Fixed handling empty texts in DRC and polygon subtraction. + - The LAYER command can no longer switch to a layer that is not contained + in the layer menu. + - Fixed removing the currently edited device set from within a script. + - Fixed handling layer names case insensitively in the DISPLAY dialog. + - Fixed a problem with temporary files in case the same user runs more + than one instance of EAGLE on the same computer. + - Fixed handling HTML tags in error messages in the status line of the text + editor. + - Fixed assigning to UL_* objects for "virtual" objects like the wires of + a calculated polygon of a text with vector font. + - Fixed updating files from versions before 4.0 (sometimes duplicate + library names were not detected properly in old files). + - The #require directive in the User Language didn't handle release and + revision numbers above and including 50 correctly. + - Fixed handling coordinate parameters in the DRC command. + - Fixed handling circles with width/2 > radius in the Autorouter. + - Preventing the autorouter from setting vias at places where this is not + possible when routing boards with a single signal layer and a supply layer. + - Fixed the library update in case the library no longer contains package + variants that are present, but unused in the schematic. + +Release notes for EAGLE 4.16r2 +============================== + +* Bugfixes: + + - Fixed generating pixmaps that are much longer in one dimension with the + EXPORT IMAGE command. + - Fixed handling the net class when renaming a net segment to a new name. + - Fixed a crash when clicking into the empty area of the Technologies + dialog. + - Fixed an 'Internal polygon error 73' when zooming far in on a board that + contains smds with a roundness other than 0. + +Release notes for EAGLE 4.16r1 +============================== + +* Bugfixes: + + - Fixed handling '\' in UNC program file name under Windows XP in case the + program is installed on a server. + - Fixed handling the ESCape key in ULPs with nested dialogs. + - Fixed handling the program file name under Windows if it starts + with ".\". + - Fixed handling German umlauts in the User Language functions strupr(), + strlwr(), toupper() and tolower() under Windows and Mac OS X. + - Fixed setting the current item in the Control Panel's tree view when + drag&dropping a package into a library in case there is also a device + set with the same name. + - Fixed unexpected airwires in case an open Pwr pin is connected to a net + with the same name, or a Supply pin with the same name is placed on an + open Pwr pin. + - Fixed printing rotated or mirrored texts under Linux and Mac OS X. + - Fixed handling upper/lowercase when licensing under Windows on a server. + - Fixed handling the highest byte of the Palette values in the eaglerc + file. + - Fixed handling polygons with only two edges, in case one of them is + an arc. + +Release notes for EAGLE 4.16 +============================ + +* Bugfixes: + + - Fixed CUT/PASTE of net classes (only the first two were actually pasted). + - Fixed handling library name after "Save as" (was wrong in Description + editor). + - Fixed CHANGE PACKAGE/TECHNOLOGY in case a device contains more than 254 + technologies (which was possible due to a missing check in the technology + dialog of the device editor). + - Fixed the technology dialog in the device editor, so that it doesn't + accept more than 254 technologies per package variant. + - Fixed a possible data corruption when a supply pin overwrites a net name. + Leftover pin references that may have been caused by such a data + corruption are automatically deleted during the next library update. + - Fixed an unexpected "Cancel" button in some message boxes. + - Fixed generating annulus symbols for pads that have the NOTHERMALS + flag set. + - Fixed faulty splitting of arcs near their end points. + - Fixed a rounding error in handling rectangle coordinates and wire + curves. + - Fixed moving mirrored packages with polygons in a board (polygons were + displayed in the wrong layer). + - Fixed faulty "Change Class..." lines in the EXPORT NETLIST output from + a schematic. + - Fixed a problem with getting the program directory name under Windows XP + if the console version of EAGLE was started without a full path name. + - Fixed a possible crash when canceling the console version of EAGLE with + Ctrl+C under Windows XP. + - Fixed loading a text file on Windows XP from a non-Windows server (the + file was not editable even though it was writable in the file system). + - Fixed storing Undo data when doing a library update where the sequence + of gates had changed in a device. If doing UNDO followed by REDO after + such an update, some of the part's gates may have been swapped. + +Release notes for EAGLE 4.15 +============================ + +* Bugfixes: + + - The CHANGE PACKAGE command now updates the package in the board with the + version from the schematic, in order to avoid problems in case a REPLACE + has been done in the board while the schematic was closed. + - Fixed handling access to the individual characters of a string in ULPs on + Mac OS X. + - The COPY command now updates the package in the board with the version + from the schematic _before_ actually adding the copied part, in order to + avoid problems in case a REPLACE has been done in the board while the + schematic was closed. + - The library update now reports a modification to the board even if it was + just the renaming of some packages due to a previous REPLACE with the + schematic closed. + - Fixed handling empty strings in dlgListView. + - Fixed clearing the selection of a dlgListView. + - Fixed setting user defined default Design Rules when loading an existing + library from within a project. + - Fixed an extra line that appeared when closing a group with the right + mouse button in case the group was empty. + - Fixed a possible crash in UL_WIRE.pieces(). + - Fixed cursor positioning after an error message regarding a loop member + in a ULP. + +Release notes for EAGLE 4.14 +============================ + +* CAM Processor: + + - Increased resolution of EXCELLON driver to 1/10000 inch. + - Automatically generated drill codes are now sorted by drill size. + +* User Language: + + - The User Language object UL_PIN has a new data member 'net' which + returns the name of the net the pin is connected to. + +* Bugfixes: + + - Fixed an unjustified ripup of wire segments when connecting a pin or net + segment to a supply net that consists of more than one segment. + - Fixed the progress display in case a script is called from a ULP through + its exit() function. + - Fixed setting a via in the ROUTE command if the placed wire coincides with + an existing wire after a layer change. + - Fixed a possible crash when copying a device set from one library to + another. + - Fixed handling '>SHEET' in ULPs (the fix in version 4.13r1 was broken). + - Fixed defining a group that contains vias in case the color of the Vias + layer has been set to 0. + - Fixed refreshing all signal layers if the Pads or Vias layer is activated + and has the color 0. + - Fixed UL_CONTACT.signal in case it is used in a UL_PART context. + - Fixed drawing arcs with a width of one pixel when zooming in. + - Fixed handling unsorted dlgListView objects in User Language Programs + (the items were in reverse order). + - Fixed an unjustified "missing return value" error message in case a User + Language Function is terminated through the exit() function. + - Fixed handling arrays of UL_* objects in User Language Programs. + - Fixed handling eagle.key in case the program was started using an UNC path + name under Windows (you may be asked for your license.key file when you + first run this version under Windows; users of the Freeware edition should + delete the file 'eagle.key' from their EAGLE binary directory before + starting EAGLE, to have it automatically offer the Freeware license again). + - Fixed the ASSIGN command (if the very first ASSIGN was given in the command + line, all default key assignments were deleted). + - Fixed handling assigned keys that are mapped to comletely written commands + that appear in one of the pulldown menus. + - Fixed the CLASS command in case the name of the net class is given before + the number. + - Fixed displaying mirrored texts in schematics after pasting from a board. + - Fixed handling 'char' variables in ULPs on Mac OS X. + - Fixed a spurious '%n' in the *.cam files that was introduced in version + 4.13r1. + +Release notes for EAGLE 4.13r1 +============================== + +* DRC command: + + - The "Stop after ... errors" parameter has been removed from the "Misc" + tab of the Design Rules dialog. This parameter has sometimes lead to + boards not being tested completely, without people noticing the + "DRC: Stopped after xx errors" status message, which indicated that the + DRC was not completely finished. + The 'maxErrors' parameter in *.dru files is still accepted, but has no + more meaning. A board file that is created with this version of EAGLE will + have the 'maxErrors' parameter set to 999999, so that an older version that + loads this file will perform a full DRC. + +* Miscellaneous: + + - Now the default key macros are assigned only if no key assignments exist. + - If a library causes an error message when loading it in the ADD command, + it will now automatically be removed from the list of used libraries. + - Improved the click&drag detection in case of an object selection in a + densely populated area. + - The libstdc++ library is now linked statically under Linux to avoid + problems with incompatiple versions. + +* Bugfixes: + + - Fixed deleting a blocked wire if Cmd.Delete.WireJointsWithoutCtrl is set. + - Fixed handling a drill rack file name in an existing Excellon CAM job + when switching to a different device. + - Fixed a possible "internal polygon error 73" when drawing a very wide + or very high rectangle at a large zoom level. + - Fixed drawing rectangles and circles (they were drawn 1 editor unit too + small). + - Fixed handling CUT/PASTE of partially selected polygons in symbols and + packages. + - Fixed handling variable names in ULPs that are the same as an object member + name within a member function that requires an index. + - Fixed reporting missing apertures in the GERBER device for rotated, non + round pads and smds in case of aperture emulation being turned off. + - Fixed calculating the surrounding rectangle after editing a symbol (bug + was introduced in 4.12r06). + - Fixed resetting the signal name after drawing a polygon. + - Fixed a possible crash in the ROUTE command when placing a wire and an + error message about not being able to set a via pops up, and while that + message is on screen, the editor window had to be refreshed (either + because the error message has been moved or some other window has + obstructed the editor window). + - Fixed handling '>SHEET' in ULPs. + - Fixed filling large rotated rectangles in the CAM Processor for devices + like GERBER. + - Fixed an unjustified DRC width error for very short arcs with round endings. + - Fixed handling directory delimiters for $HOME and $EAGLEDIR under Windows + to make sure directory names are always separated by forward slashes ('/') + inside ULPs in order to make things platform independent. + - Fixed exporting PAD and SMD data in library scripts (flags were missing). + +Release notes for EAGLE 4.13 +============================ + +* Platforms: + + - EAGLE now also runs on Mac OS X (with X11). See the README file for + details about system requirements. + +* Supply Layers: + + - Added a note regarding the size of annulus symbols in supply layers to + the online help for the LAYER command. + +* User Language: + + - Fixed the example in the online help of 'dlgLabel'. + +* BOARD command: + + - The BOARD command now places elements in the third and, if necessary, + fourth quadrant of the newly created board in case there are too many + of them to fit into the second quadrant. + +* DRC command: + + - The DRC no longer checks polygons in packages against objects that have no + electrical potential for clearance errors. + +* VIA command: + + - When placing a via at a point where an SMD exists that is connected to + a signal, the via is now automatically added to that signal. + +* Miscellaneous: + + - With active f/b annotation any operations that would combine two signals + in the board and would result in combining two nets in the schematic are + now forbidden and need to be done in the schematic. + - Changed the default entries in the drill diameter menus to metric values. + - It is now possible to zoom into a drawing up to a factor where the + internal editor resolution (0.1 micron) is visible. The checkbox + "Options/User interface/Limit zoom factor" is still present and checked + by default, but there is no more warning message when it is turned off. + See "Help/Editor commands/WINDOW" for details on a few quirks that may + happen when zooming in very far. + - When running as user 'root' under Linux and Mac OS X (which is only + necessary to do the licensing and should be avoided under normal operation), + EAGLE no longer sets the "Projects" path to avoid a popup message at program + start, and it also doesn't save the ~/.eaglerc file any more. + - Improved opening the Control Panel's "File/Open/Project" menu in case + there are many subdirectories that do not contain EAGLE projects. + - Coordinates are no longer snapped to the current grid if they are entered + textually with the '>' modifier, as in (> 1 2). + +* Bugfixes: + + - Fixed handling very short wires in the ERC's test about net wires that only + appear to be connected. + - Fixed an occasional unjustified "Can't close window while command is + running!" error. + - Fixed auto routing towards an arc (it could happen that the last generated + wire segment ended somewhere completely different). + - Fixed loading full screen windows that are not maximized from a project + under Windows. + - Fixed drifting windows when loading from a project under Linux. + - Fixed wrong window coordinates when restoring maximized windows from a + project under Windows. + - Fixed a possible crash when doing 'WINDOW (@);' after a PRINT on Windows + (only happened with some printer drivers). + - Fixed the DRC LOAD command in case the file name was not absolute and + the file was not located in the current directory. + - Fixed handling file names in the "Open recent" lists on systems that + handle file names case insensitive (Windows). + - Fixed a problem in assigning function keys, which has been introduced in + version 4.11r04. + - Fixed displaying pads and vias when dragging them on a white or colored + background. + - Fixed opening files in ULPs with the output() statement if the file + name contains uppercase characters. + - Fixed deleting a part in a schematic with Shift+DELETE in case it has + gates on other sheets (these other gates were also drawn on the current + sheet when doing UNDO). + - Fixed calculating polygons (the CAM Processor generated slightly different + results in consecutive calls with the same board file; these differences + were at most the size of the machine resolution, which in practice had + no negative effects). + - Since the RATSNEST and the DRC command may produce faulty results if a + drawing contains invalid polygons in the layers Top...Bottom, t/bRestrict, + t/bKeepout or Dimension, such polygons are now reported as errors (a + polygon is invalid if two or more of its edges intersect). + - Fixed keeping the selected package variant visible in the device editor's + package variants list. + - Fixed handling the recent files list for boards that have been newly + created from a schematic. + - Fixed layer selection in CAM jobs (changes were lost when loading a + drawing, or creating a new section, without first saving the changed + CAM job). + +Release notes for EAGLE 4.12 +============================ + +* Autorouter: + + - The Autorouter now optionally runs even if a signal layer that contains + objects is not activated. + - When routing from a pad that covers more than one raster point, the + Autorouter now tries to lay out the wire at the middle of the pad. + - The Autorouter now applies the cfSmdImpact parameter to SMDs that are + placed at angles of 45, 135, 225 or 315 degrees. + +* CAM Processor: + + - The CAM Processor now also has a "File/Open recent" menu. + - The CAM Processor now always prints all vias (even blind or buried) if + the Vias layer is active, but none of the layers 1..16 is active. + - Added a note to the CAM Processor's "Photoplotter Info File" regarding + missing apertures in case they were requested in a non-orthogonal angle. + - The CAM Processor no longer deselects all layers when clicking into + some empty space of the "Layers" list. + - Implemented some overlap when filling polygons with Postscript in the + CAM Processor to avoid small gaps on some output devices. + - The EXCELLON device in the CAM Processor now writes the actual drill sizes + into the output file, so you no longer need to send the "drill rack" file + to the board manufacturer. If you don't like this, you can disable this + feature by deleting or commenting out the line + + DrillSize = "%sC%0.4f\n" ; (Tool code, tool size) + + in the eagle.def file. + - The EXCELLON device in the CAM Processor now automatically generates the + drill size definitions according to the actual values used in the board, + so you no longer need a drill rack file. If you don't like this feature, + you can disable it by deleting or commenting out the line + + AutoDrill = "T%02d" ; (Tool number) + + in the eagle.def file. Existing CAM jobs that have a drill rack file defined + will continue to use that file. + - The device EXCELLON_RACK has been introduced to still have the old + functionality with user supplied rack file available. + - The new drill station parameter BeginData can be used to define a string + that is output before the actual drill data (the EXCELLON device now + outputs a '%' here). + - Added M48 and M72 to the EXCELLON Init string. + +* Control Panel: + + - The Control Panel now has a new menu item "File/Open recent projects". + +* Design Rules: + + - Increased the maximum copper thickness in the layer setup of the Design + Rules to 1mm. + +* User Language: + + - The new User Language function language() can be used to internationalize + ULPs (see "Help/User Language/Builtins/Builtin Functions/Miscellaneous + Functions/language()"). + - The User Language directive #usage can now handle internationalized + texts (see "Help/User Language/Syntax/Directives/#usage"). + - The new User Language directive #require can be used to tell the user that + a ULP requires at least the given version of EAGLE (see "Help/User + Language/Syntax/Directives/#require"). + +* ADD command: + + - Changed the meaning of the wildcards ('*' and '?') in the ADD command. + They used to match [a-z0-9_] and will now match any non-whitespace + character. + - The ADD dialog now has a checkbox that allows the pattern search in the + descriptions to be turned off. + +* DELETE command: + + - The DELETE command now combines two wires if applied to their joining point + with the Ctrl key pressed. If you want to have this functionality without + pressing the Ctrl key, you can append the line + + Cmd.Delete.WireJointsWithoutCtrl = "1" + + to the ~/.eaglerc file. + +* DRC command: + + - The new options LOAD and SAVE in the DRC command can be used to load the + Design Rules from or save them to a given file. + - The DRC no longer checks objects that have no electrical potential (like + wires in packages, rectangles, circles and texts) against each other for + clearance errors. + - The DRC dialog now has a 'Check' button instead of 'OK'. + +* EXPORT command: + + - The EXPORT IMAGE command can now create TIFF files. + +* INFO command: + + - The INFO command now also displays the data of the part when selecting a + text from a smashed part. + +* MITER command: + + - Changed the default values for "miter radius" to some typical grid values. + +* MOVE command: + + - Moving texts of a smashed part now draws a line to the part's origin + so that the user can see which part this text belongs to. + +* NET command: + + - When drawing a net wire that connects two segments of different nets, the + question "Connect Nets?" was changed to "Connect Net Segments?" in order + to make it clear that only the two segments involved are concerned, and + not the entire nets. + +* PRINT command: + + - The selected printer, paper size and orientation are now also saved and + restored under Windows. + +* RATSNEST command: + + - Unnecessary thermal stubs that could occur around pads, vias and smds when + calculating signal polygons are now avoided. Note that due to this + modification there may be cases where a pad, via or smd that used to be + considered connected to the polygon is now no longer actually connected + and the RATSNEST command will generate an airwire. + + WARNING: If you send a board file created with this version of EAGLE to + a boardhouse for manufacturing, and they will produce the CAM data + themselves, please make sure that they use EAGLE version 4.11r05 or higher. + Otherwise the manufactured board may contain thermal stubs even though + you didn't see them in your version of EAGLE. + +* RENAME command: + + - If the RENAME command is entered without any additional parameters in + a package, symbol or device drawing, a dialog now pops up that requests + the input of the new name for this object. + +* UPDATE command: + + - The UPDATE command's new syntax 'old_library_name = new_library_name' can + be used to update a library in a board or schematic with the contents of + an other library (see "Help Update"). + +* VIA command: + + - The VIA command now activates the layers that correspond to the length + of the via in case none of these layers is active and the Vias layer + is set to color 0. + +* WINDOW command: + + - 'WINDOW (@)' no longer reacts if the cursor is outside the editor window. + +* Miscellaneous: + + - When renaming a signal the new name is now the default when the user + is prompted whether to combine two signals. + - The list of layers in the CAM Processor is now always wide enough to + display the full layer names. + - The CAM Processor now only prompts once per job (not once per job section) + whether the current file should be reloaded. + - When clicking into the drawing area of an editor window in order to + activate that window, an active command in that window now ignores that + mouse click to avoid unintended effects (like, for instance, inadvertently + deleting an object). + - Speeded up ratsnest calculation for large signals. + - The "File/Open recent" list is now also updated in case of a "File/Save as" + operation. + - Changes to the visibility of toolbars made through the toolbar context + menu are now also stored in the eaglerc file. + - When mirroring a part where wires connected to that part change their + layer, vias at the far ends of these wires are now placed/removed as + necessary. + - The program now uses German menu texts if the system is set to a + German environment. + - The window title now displays the program version number. + - If an error is detected while calculating polygons, the editor window + now zooms to one of the offending polygon edges. + - Fixed the width of some characters in the vector font. + WARNING: Note that due to this change some texts may turn out longer + than they used to! If you have vector font texts on any of your + signal layers, make sure you do a DRC before manufacturing the + board with this new version! + - If the center mouse button is used to pan the editor window, any special + function of that mouse button (like bringing up the layer dialog) will + now be performed if the panning distance doesn't exceed 10 pixel. + - When panning the editor window with the center mouse button, the movement + can now exceed the limits defined by the scroll bars if the Shift key is + held down while panning. + - If EAGLE is called with an eagle.epf file as argument, the respective + project will now be opened. + - If EAGLE is called with the name of a project that is contained in one + of the directories listed in "Options/Directories/Projects", that project + will now be opened. + - Improved selecting objects in densely populated areas with click&drag. + - The splitter position in the Control Panel and the Help window (Linux only) + is now stored in the eaglerc file. + - If you don't like the special mode in wire drawing commands that allows + for the definition of an arc radius by pressing the Ctrl key when placing + the wire, you can add the line + + Cmd.Wire.IgnoreCtrlForRadiusMode = "1" + + to the ~/.eaglerc file. This will turn this + feature off for all commands that draw wires. + +* Bugfixes: + + - After dropping a library from the ADD dialog, the respective entry in the + Control Panel's tree view is now refreshed accordingly. + - Fixed handling the coordinates of rectangles (were sometimes off by one + editor unit). + - Fixed selecting a rotated rectangle with Ctrl+MOVE. + - Fixed Gerber data output in case of negative coordinates ('-' was counted + against the number of digits). + - Fixed handling UL_GRID.unitdist. + - Fixed a crash under Windows when re-loading a very large text file. + - Fixed '#' substitution in output file names of the CAM Processor. + - Fixed a possible crash when browsing through libraries from older versions + in the ADD dialog. + - Fixed an unjustified DRC width error for short arcs with round endings. + - Fixed a crash when doing ROTATE with a part name and then clicking into + the drawing with the right mouse button in case there was no group defined. + - Fixed highlighting parts and elements when clicking on their smashed names + or values with SHOW. + - Fixed drawing rectangles on HPGL2 and derived devices and DESIGNJET650 + in the CAM Processor. Since version 4.11 the "Bar" function in 'eagle.def' + requires handling of the angle, which these devices can't do, so they need + to emulate rectangles. + - Fixed loading drawings that were created with EAGLE versions before 3.0 + directly into version 4.11 (object orientations were not updated correctly). + - Fixed handling rectangles in schematics in dxf.ulp. + - Fixed an unjustified renaming of a net when deleting a junction. + - Fixed handling >PLOT_DATE_TIME in EXPORT IMAGE. + - Fixed handling the character 'mue' (0xB5) when converting strings to + uppercase. Note, though, that still only the characters below ASCII + code 127 are guaranteed to work. Any other characters should not be used! + - Fixed an unjustified change of package or symbol names to "...@1" when + doing a library update in case the device set as used in the schematic + is no longer present in the library. + - Fixed mirroring polygons that are completely contained in a group. + - Fixed handling coordinates in the ERC report. + - Fixed handling text files containing locale dependent characters like, + for instance, the 'euro' symbol. + - Fixed unjustified airwires in case non-through vias and supply layers + are used. + - Fixed ADDing parts with drag&drop from the Control Panel that have one + of the characters '{' or '}' in their name. + - Fixed selecting vias with the Ctrl key pressed. + - Fixed a crash when changing the command text menu from within a button + that has a submenu. + - Fixed displaying vias/pads in EXPORT IMAGE in case the Vias/Pads layer + is set to color 0. + - Fixed generating bus names. + - Fixed handling of '<', '>' and '&' in names and values when displayed + in a Rich Text context. + - Fixed drawing text origins when panning. + - Fixed handling ASSIGNed keys. They now really override hotkeys that + are used for pulldown menus. + - Fixed automatic ending of net and bus wires in case the newly drawn + and the target wire are in a straight line and get optimized to form + a single wire. + - Fixed selecting vias of the same signal that have been wrongly placed + at the same coordinates. + - Fixed an unexpected popup menu in the CHANGE command. + - Fixed a crash when printing under Linux without a defined printer. + - Fixed placing a via in case there is a polygon wire at that location. + - Fixed automatically setting junctions if "Auto end net and bus" is off. + - Fixed displaying the Color column in the layer list of the CAM Processor. + - Fixed handling polygons within packages in the Autorouter. + - Fixed a possible loss of wire connectivity in the MOVE and PASTE commands + with non-orthogonal angles. + - Fixed assigning window icons when opening a script or ULP editor window + from a project. + - Fixed calculating signal polygons with a very large number of edges. + - Fixed selecting gates in a device drawing with Ctrl+MOVE. + - The MITER command now only inserts a new wire if the two existing wires + are on the the same layer, have the same width and wire style. + - Wires are now only optimized if they have the same wire style. + - Fixed the ROTATE command if an object was selected with click&drag + and the mouse button was released outside the editor window. + - Fixed using the User Language builtin statements board, schematic, sheet, + library, deviceset, package and symbol in a variable initialization, as in + int a = board; + - Fixed undoing a library update of a library that contained supply devices. + - Fixed CUT/PASTE in case the pasted drawing contains modified packages that + are only referenced by devices that are not contained in the target drawing. + - Fixed a possible loss of consistency with implicit power pins in case a + single segment net with the same name as these power pins was renamed or + connected to an other net. + - Fixed relocating wires after a library update (sometimes they could no + longer be selected). + - Fixed handling signal polygons in the EXPORT IMAGE command that + would completely vanish after being calculated (their outlines were printed + as seen on the screen). + - Fixed an unnecessary window refresh when turning the MARK on or off. + - Fixed setting blind or buried vias at places where there are signal wires + on layers that are not covered by those vias. + - Fixed focus handling when closing stacked dialogs in a ULP. + - Fixed slow script execution with NET, MOVE and ROTATE. + - Fixed handling the default button in a ULP dialog that contains a + dlgTextView. + - Fixed handling recent files category names in the eaglerc file (were + sometimes all uppercase under Windows). + - Fixed exporting monochrome images under Linux and printing with the "black" + option under both Linux and Windows in case color 15 did not have the + default value. + - Fixed handling the "File/Open recent" menus in script and ULP editor windows + when loading them from a project. + - Fixed detecting a loss of consistency if a net class is defined (but not + used) while f/b annotation is not active (maybe because the other drawing + is not loaded). + - Fixed handling net classes when doing a PASTE into a schematic/board pair. + - Fixed handling micro vias on two layer boards (vias from layer 1 to 16 with + a drill diameter less than the minimum drill diameter were wrongfully + considered micro vias). + - Fixed handling orientation in the RECT command (now also accepts lowercase). + - Fixed setting the >LAST_DATE_TIME string when modifying the Design Rules. + - Fixed handling command text buttons in case of a "nothing to edit" error. + - Fixed the DRC distance check in case of dimension wires with a width of + zero and a Copper/Dimension distance value of 0.2 or 0.3 micron. + - Fixed handling eaglerc entries that contain '='. + - Texts in signal layers with proportional or fixed font are no longer checked + against each other for clearance errors in the DRC (same as has already + been the case with vector font texts). + - Fixed selecting holes and junctions with Ctrl+MOVE. + - Fixed displaying the currently pressed button in the command text menu + under Windows XP. + - Fixed placing a wire in the ROUTE command in case the length of the + remaining airwire is below the Snap_Length, but a finishing wire can't + be placed automatically due to layer constraints. + - Fixed the automatic ratsnest calculation in the ROUTE command (it didn't + always calculate the shortest airwire). + - Fixed drawing wires in signal layers with the WIRE command to or from smds + in case the smd part is mirrored or the wire is not in the same layer as + the smd. + - Fixed setting the visible routing layers in the DISPLAY dialog according + to the Design Rules for newly created boards. + - Fixed going into click&drag mode for off-grid objects with coarse grid. + - Fixed drawing smds with roundness 100 and orthogonal rotations with any + of the CAM Processor devices that are derived from the "Generic" device + (like EPS, for instance). + - Fixed handling circles with zero width (typically used in restrict layers) + in the autorouter (it didn't route as close to them as it would have been + allowed according to the design rules). + - Fixed a possible crash when moving one end of the last wire of a net segment + onto the other end of that wire. + +Release notes for EAGLE 4.11 +============================ + +* Library Management: + + - Packages and Device Sets can now be copied into the currently edited + library from other libraries, either through Drag&Drop from the Control + Panel or by using the COPY command's new extended syntax (see "Help Copy"). + - New package variants can now be created by directly using packages from + other libraries, either through Drag&Drop from the Control Panel or by + using the PACKAGE command's new extended syntax. + - The packages of the currently edited library can now be updated with those + from other libraries, either through Drag&Drop from the Control Panel or + by using the UPDATE command's new extended syntax. + +* Blind & buried vias: + + - The program can now handle so-called "blind & buried" vias. "Blind" vias + are those that are not drilled all the way through the current layer stack. + "Buried" vias are produced by drilling through the entire current layer + stack. Vias that go all the way through the complete board are basically + the same as "buried" vias, but sometimes are also referred to as "through" + vias. "Micro vias" are small blind vias that go from one layer to the next + inner layer. These are typically used to connect SMD pads to an inner layer, + without having to run a wire away from the SMD. + - The Design Rules dialog now has a new tab named "Layers", in which the + layer setup can be defined. The minimum drill size and aspect ratio for + blind vias can be defined on the "Sizes" tab. + - When updating an existing board from an older version, the layer setup + will be determined by the layers that are actually in use (either because + there are objects in them, or they are supply layers, or they are used by + the Autorouter setup). The layer stack will consist of a sequence of + "core" and "prepreg" material (with the thickness of the individual layers + chosen so that the final board results in a thickness between 1mm and 1.5mm), + and which allows a via that goes through all layers. + After loading an old board into this version you should verify the layer + setup in the Design Rules and adjust it to your actual needs. + - The DISPLAY and LAYER dialogs (and related combo boxes) will only display + those signal layers that are used in the layer setup. + - The CHANGE LAYER and ROUTE command only set the minimum necessary vias + (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. + - The VIA command has a new parameter that defines the layers this via shall + cover. The syntax is from-to, where 'from' and 'to' are the layer numbers + that shall be covered. For instance 2-7 would create a via that goes from + layer 2 to layer 7 (7-2 would have the same meaning). If that exact via is + not available in the layer setup of the Design Rules, the next longer via + will be used (or an error message will be issued in case no such via can be + set). + - The Autorouter cannot work with supply layers and non-through vias at the + same time. In such cases you need to replace the supply layers with signal + polygons accordingly. + - The CHANGE command has a new option named VIA, which can be used to change + the layers a via covers. The syntax is + + CHANGE VIA from-to * + + where 'from' and 'to' are the layer numbers the via shall cover. If that + exact via is not available in the layer setup of the Design Rules, the + next longer via will be used (or an error message will be issued in case + no such via can be set). + - The User Language object UL_VIA, now has two new data members 'start' and + 'end', which return the layer numbers in which that via starts and ends. + The value of 'start' will always be less than that of 'end'. Note that the + data members '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). + - The DRC now checks whether all vias and objects in signal layers correspond + to the actual layer setup. If they don't, a "Layer Setup" error is flagged. + - If the layer setup of a board contains blind or buried vias, the CAM + Processor generates a separate drill file for each via length that is + actually used in the board (see "CAM Processor"). + - The DRC performs new checks for blind vias: vias that don't pass the check + against the "Minimum Drill" parameter and are blind vias that are exactly + one layer deep (so-called "micro vias") are checked against the "Min. + Micro Via" parameter. Blind vias that pass these tests will further be + checked to see whether they have a drill diameter that conforms to the + "Min. Blind Via Ratio" parameter in "Edit/Design Rules/Sizes". + +* Arbitrary angles: + + - Texts and elements in a board context can now be rotated by any angle, + in steps of 0.1 degrees (see "Help Add" for a description of the + "orientation" flags). + - The new "Spin" flag in orientations can be used to disable the function + that keeps texts readable from the bottom or right side. + - Pads and SMDs can now be placed with arbitrary angles. + +* Arcs and Wires: + + - In many aspects Arcs are now treated the same way as Wires. They are + part of a signal when drawn in a signal layer, they can be used when + drawing a polygon, and they now also have a wire style. + - The endings of arcs can now be either round or flat. You should use + flat arc endings only when absolutely necessary (round endings have + advantages when generating, e.g., Gerber files). + - The end points of an arc can now be moved independently, just like those + of wires. When moving such points, the radius of the arc will be scaled + accordingly. + - All commands that draw wires can now draw arcs by using the new 'curve' + or '@radius' parameter (see "Help/Editor Commands/WIRE"). + - There are no more 'arcs()' loop members in the User Language. Any ULPs + that used to loop through arcs must now check the new data member + UL_WIRE.arc when looping through the wires (see "Help/User Language/Object + Types/UL_WIRE"). The "User Language" section below contains an example + that shows how to adapt existing ULPs. + - The new command MITER can be used to take the edge off wire joins + (see "Help Miter"). + - The wire bend styles 0, 1, 3 and 4 now use an additional miter radius as + defined with the MITER command. + +* Additional flags for pads, vias and smds: + + - Pads, Vias and SMDs now have additional flags that control the generation + of the stop and cream masks, the thermals and the shape of the "first" pad + within a package. + - The User Language objects UL_PAD, UL_VIA and UL_SMD have a new data member + 'flags', which returns the setting of these flags (see "Help/User + Language/Object Types/UL_PAD", "Help/User Language/Object Types/UL_VIA" and + "Help/User Language/Object Types/UL_SMD"). + - The PAD and SMD commands support the new options NOSTOP, NOTHERMALS, + NOCREAM, and FIRST, respectively, to define these flags. The VIA command + supports the new option STOP. + - The CHANGE command has the new options STOP, CREAM, and FIRST to modify + these flags (the THERMALS option already exists). + +* User definable colors: + + - The layer, background and grid colors are now completely user definable. + - There are now three "palettes" for black, white and colored background, + respectively. Each palette has 64 color entries, which can be set to any + RGB value. The palette entry number 0 is used as the background color + (in the "white" palette this entry cannot be modified, since this palette + will also be used for printing, where the background is always white). + - The color palettes can be modified either through the dialog under + "Options/Set.../Colors" or by using the command + + SET PALETTE + + where is a number in the range 0..63 and is a hexadecimal + RGB value, like 0xFFFF00 (which would result in a bright yellow). Note + that the RGB 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 + same colors as previous versions. + - 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. + - The background color for layout and schematic can now be set to any color. + Note, though, that in case the background color is neither pure black nor + pure white, the drawing will be displayed layer by layer, which usually + makes a window refresh slower than with black or white background. + - Changes to the "Options/Set..." dialog: + + The "Grid" Tab has been renamed to "Colors". + + The minimum visible grid size parameter has been moved to the "Misc" tab. + - The new User Language builtin function 'palette()' can be used to determine + the currently used palette as well as the palette entries (see "Help/User + Language/Builtins/Builtin Functions/Miscellaneous Functions/palette()"). + +* Control Panel: + + - The tree view in the Control Panel can now be sorted by 'name' or by + 'type' via the pulldown menu option "View/Sort". + - The Control Panel's pulldown menu option "File/Refresh tree" has been + moved to "View/Refresh". + - Directory entries in the Control Panel's tree view which can contain + libraries now all have the "Use all" and "Use none" options in their + context menus. + - New context menu options for libraries, device sets and packages as well + as Drag&Drop features for copying and updating library objects, and for + creating new package variants. + - Drag&Drop of a board, schematic or library file into the appropriate + editor window now loads the file into that window for editing. The + previous functionality of performing a library update when dropping a + library into any editor window has been removed. + +* Design Rules: + + - The new Design Rule parameters Shapes/Elongation can be used to define + the elongation of Long and Offset shaped Pads. Valid values are from 0 to + 200, where 0 results in a regular octagon shape (no elongation) and 100 + gives you a side ratio of 2:1 (100% elongation), which is the ratio that + has been hard-coded in previous program versions. + - The Design Rules dialog now has a new tab named "Layers", which defines + the layer setup for multilayer boards (see "Help/Design Checks/Design Rules"). + - The Design Rules tab "Shapes" contains a new combo box named "First", which + defines the shape of the "first" pad within a package. + - The Design Rules tab "Sizes" contains the two new parameters "Min. Micro Via" + and "Min. Blind Via Ratio". + - The Design Rules tab "Restring" contains a new set of restring parameters + for micro vias. + +* User Language: + + - The User Language member functions UL_PAD.shape and UL_VIA.shape now return + PAD_SHAPE_ANNULUS, PAD_SHAPE_THERMAL, VIA_SHAPE_ANNULUS and + VIA_SHAPE_THERMAL, respectively, if their shape is requested for a supply + layer (see Help/User Language/Object Types/UL_PAD and UL_VIA). + - The User Language dialog object dlgListView now accepts a new parameter + that defines the column and direction to use for sorting. + - The User Language functions strchr(), strstr(), strrchr() and strrstr() + now accept an 'index' parameter to start the search at a given position. + - Opening the same file concurrently in two output() statements in a User + Language Program is now treated as an error. + - The User Language objects UL_HOLE, UL_PAD and UL_VIA now have a new + data member 'drillsymbol'. + - A User Language Program can now be aborted even if it is currently + executing a lengthy 'for' or 'while' loop. + - The new ULP function status() can be used to display a message in the + editor window's status bar. + - The User Language dialog function dlgTextView now accepts a second + parameter to support hyperlinks in Rich Text (see "Help/User + Language/Dialogs/Dialog objects/dlgTextView()"). + - The User Language dialog function dlgMessageBox can now add an icon + to the message box by prepending the message string with one of the + characters '!', ';' or ':' (see "Help/User Language/Dialogs/Predefined + Dialogs/dlgMessageBox()"). + - Due to the implementation of arbitrary angles and "spin" the following new + member functions have been added to the User Language: + UL_PAD.angle, UL_SMD.angle, UL_RECTANGLE.angle, UL_ELEMENT.angle, + UL_ELEMENT.spin and UL_TEXT.spin. + Make sure you take these into account in your own ULPs as necessary, + otherwise boards containing objects with these new features may be handled + incorrectly. See the 'dxf.ulp' for an example. + - Due to the modifications of pad shapes, the User Language constants + PAD_SHAPE_XLONGOCT and PAD_SHAPE_YLONGOCT have been replaced with + PAD_SHAPE_LONG, and the new constant PAD_SHAPE_OFFSET has been introduced. + - The new User Language member function UL_PAD.elongation returns the + elongation value for pads with shapes Long or Offset. + - The User Language object UL_VIA, now has two new data members 'start' and + 'end', which return the layer numbers in which that via starts and ends. + The value of 'start' will always be less than that of 'end'. Note that the + data members '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). + - Due to the implementation of different arc cap styles the member function + UL_ARC.cap has been added to the User Language. + - The loop member functions UL_BOARD.arcs(), UL_PACKAGE.arcs(), UL_SHEET.arcs() + and UL_SYMBOL.arcs() no longer exist, since arcs are now treated a lot like + wires. Any ULPs that used to loop through arcs must now check the new data + member UL_WIRE.arc when looping through the wires (see "Help/User + Language/Object Types/UL_WIRE"). + To convert an existing ULP that uses the arcs() loop member functions + consider the following example: + + Assume you have a ULP that looks like this: + + void ProcessArc(UL_ARC A) { /* do something with the arc */ } + void ProcessWire(UL_WIRE W) { /* do something with the wire */ } + board(B) { + B.arcs(A) ProcessArc(A); + B.wires(W) ProcessWire(W); + } + + To make it run with EAGLE version 4.1 you need to eliminate the 'arcs()' + call and move the actual arc processing into the ProcessWire() function: + + void ProcessArc(UL_ARC A) { /* do something with the arc */ } + void ProcessWire(UL_WIRE W) + { + if (W.arc) + ProcessArc(W.arc); + else + /* do something with the wire */ + } + board(B) { + B.wires(W) ProcessWire(W); + } + + Note that you only need this explicit handling of arcs if you actually + need to gain access to parameters only the UL_ARC can provide. If you are + not interested in that kind of information, you can handle the arcs just + like ordinary wires, using the parameters the UL_WIRE provides. + - To be able to handle any UL_ARC on UL_WIRE level the UL_WIRE object now + has the two additional members 'cap' and 'curve'. + - The User Language objects UL_PAD, UL_VIA and UL_SMD have a new data member + 'flags', which returns the setting of the flags that control mask and + thermal generation (see "Help/User Language/Object Types/UL_PAD", + "Help/User Language/Object Types/UL_VIA" and "Help/User Language/Object + Types/UL_SMD"). + - The User Language object UL_HOLE has a new data member 'diameter[]' which + returns the diameter of the solder stop masks. + - The output() statement in a User Language Program now supports the new + mode character 'D', which causes the file to be automatically deleted at + the end of the EAGLE session (see "Help/User Language/Builtins/Builtin + Statements/output()"). + - The User Language object UL_GRID now has an additional data member named + 'unitdist', which returns the grid unit that was used to define the actual + grid distance (see "Help/User Language/Object Types/UL_GRID). + +* Autorouter: + + - The Autorouter no longer attempts to route within the borders of the + signal's surrounding rectangle first, because that way it sometimes was + forced to take an "expensive" path, which it would have avoided if it + had been allowed to use the entire board area in the first place. This + may cause longer routing times in some cases, but may just as well speed + up the routing, especially on complex boards. + +* CAM Processor: + + - The new parameter MaxApertureSize can be used in the 'eagle.def' file to + define an upper limit for the size of the generated apertures for the + GERBERAUTO and GERBER_RS274X devices. If objects larger than this limit + are to be displayed, apertures will be emulated for them. + - If the board contains blind or buried vias, the CAM Processor generates a + separate drill file for each via length that is actually used in the board. + The file names are built by adding the number of the start and end layer + to the base file name, as in + + boardname.drd.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 + + .%L.drd + + which would result in + + boardname.0104.drd + + 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. + - The aperture wheel file is now checked for duplicate D-codes (see + "Help/Generating Output/CAM Processor/Output Device/Device + Parameters/Aperture Wheel File"). + +* Text editor: + + - Setting the font in a text editor window is now done via the pulldown + menu option "File/Font..." and no longer via the printer setup. The + selected font is now also used in the text editor window. + +* ADD command: + + - The ADD command now mirrors the object that is attached to the cursor + when the center mouse button is pressed. + +* ARC command: + + - Arcs are now part of a signal if drawn in a signal layer of a board. + When updating an existing board drawing, arcs in signal layers are + transferred into signals (either newly generated ones or the ones that + the arcs are apparently connected to by sharing the same end points). + - The ARC command now accepts a signal name (just like the WIRE command). + - The endings of arcs can now be either round or flat (the ARC command + therefore accepts the new parameters ROUND and FLAT). + When updating an existing drawing, the 'cap' parameter of all arcs in + boards, packages and symbols, that have their endings covered by other + objects (like wires or vias) will be set to 'round'. This allows them + to be drawn more easily on the various output devices. + +* BUS command: + + - The BUS command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/BUS"). + +* CHANGE command: + + - When changing the layer of a signal wire, only the minimum necessary + via 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. + - The CHANGE command has a new option named VIA, which can be used to change + the layers a via covers. The syntax is + + CHANGE VIA from-to * + + where 'from' and 'to' are the layer numbers the via shall cover. If that + exact via is not available in the layer setup of the Design Rules, the + next longer via will be used (or an error message will be issued in case + no such via can be set). + - The CHANGE command can now change the cap style of arcs by using + + CHANGE CAP ROUND | FLAT + - The CHANGE command has the new options STOP, CREAM, and FIRST to modify + the new pad/smd flags (the THERMALS option already exists). + - The parameters Spacing and Isolate in the CHANGE popup menu now present + a list of predefined values (just like, for instance, the Width parameter). + All such popup menus now contain the entry "..." at the bottom, which + brings up a dialog to enter a new value. + +* COPY command: + + - The COPY command can now copy parts in a schematic (see "Help Copy"). + - The COPY command can now copy packages and device sets from other + libraries into the currently edited library (see "Help Copy"). + - The COPY command now mirrors the object that is attached to the cursor + when the center mouse button is pressed. + + +* DELETE command: + + - The option "SIGNALS" must now be written in full. + +* DISPLAY command: + + - The automatic enabling/disabling of related layers when activating or + deactivating the t/bPlace or Symbols layer in the DISPLAY command can now + be turned off by appending the line + + Option.DisplayRelatedLayers = "0" + + to the ~/.eaglerc file. + +* DRC command: + + - The DRC now checks for objects in the Pads and Vias layer that are not + Pads or Vias (i.e. wires, rectangles etc.) and flags them as "Layer Abuse" + errors. The reason for this is that EAGLE does not handle these object + in any special way, so they might cause short circuits. If you get such + an error from the DRC, you should move the object in question into the + proper signal layer(s). + - The DRC now checks objects in the t/bKeepout layers only if the + respective layer is activated. + - The DRC now checks whether all vias and objects in signal layers correspond + to the actual layer setup. If they don't, a "Layer Setup" error is flagged. + +* GRID command: + + - The GRID command accepts the new option 'alt', which allows you to define + an "alternate" grid that will be used whenever you press the Alt key while + selecting or moving objects. The alternate grid can have its own size and + unit, and is typically used to temporarily switch into a finer grid if the + normal grid is too coarse. See "Help/Editor Commands/GRID". + - The GRID dialog has been changed to allow the user to enter the alternate + grid parameters. + +* INVOKE command: + + - The INVOKE command now mirrors the object that is attached to the cursor + when the center mouse button is pressed. + +* MIRROR command: + + - The MIRROR command now accepts the name of an element in a board, just + like the MOVE command. + +* MITER command: + + - The new command MITER can be used to "take the edge off" wire joins + (see "Help Miter"). + +* MOVE command: + + - When picking up an object with the MOVE command, the status line now + displays the same information as the SHOW command (currently this only + works if the "User guidance" is turned off). + - If an Arc is selected at one of its end points, that point can now be moved + freely (just like that of a Wire). The Radius of the Arc is then scaled + accordingly. + - The MOVE command now mirrors the object that is attached to the cursor + when the center mouse button is pressed. + - The MOVE command can now select objects at their origin by pressing the + Ctrl key (see "Help/Editor Commands/MOVE"). + +* NET command: + + - The NET command now displays information about the current net in the + status line. + - The NET command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/NET"). + +* PACKAGE command: + + - The PACKAGE command can now create package variants with packages from + other libraries (see "Help Package"). + +* PAD command: + + - The PAD command can now create pads with arbitrary angles and therefore + accepts an "orientation" parameter (See "Help Pad"). + - The pad shapes XLongOct and YLongOct have been renamed to Long. When + updating an existing drawing from a previous version, XLongOct pads will + be converted to Long pads with an angle of 0 degrees, and YLongOct pads + will become Long with 90 degrees. + - The new pad shape "Offset" can be used to have pads that have the shape as + defined by Long, but extend only to one side. + - The PAD command supports the new options NOSTOP, NOTHERMALS and FIRST to + define the new 'flags' (see "Help/Editor Commands/PAD"). + +* PASTE command: + + - The PASTE command now mirrors the object that is attached to the cursor + when the center mouse button is pressed. + +* POLYGON command: + + - The 'width' and 'layer' can now be changed at any time while drawing a + polygon. + - The POLYGON command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/POLYGON"). + +* RATSNEST command: + + - The RATSNEST command now processes all points of a signal, even if that + signal is very complex (in previous versions it dropped wire end points + from processing if the total number of connection points exceeded 254). + This requires more memory when calculating the ratsnest. In case this + is a problem on your system, you can revert to the original method + by appending the line + + Option.RatsnestLimit = "254" + + to the ~/.eaglerc file. The value given + here is the number of connection points up to which all wire end points + will be taken into account and thus limits the amount of memory used + (processing will use up to the square of this value in bytes, so a value + of 1024 will limit the used memory to 1MB). A value of "0" means there is + no limit. A value of "1" will result in airwires being connected only to + pads, smds and vias. + - RATSNEST no longer marks 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. + +* ROTATE command: + + - The ROTATE command now accepts an "orientation" parameter (e.g. SMR359.9). + - The ROTATE command now accepts the name of an element in a board, just + like the MOVE command. + - The ROTATE command can now be used with Click&Drag to rotate objects or + groups by any angle (see "Help Rotate"). + +* ROUTE command: + + - The ROUTE command now dynamically recalculates the current airwire while + routing. In doing so, it also takes into account points along a wire, if + those are closer to the cursor than the ends of that wire. If there is + a pad, via or smd that is at most Snap_Length away from the end of the + airwire (in the current layer), that end will now snap to the center of + the object. + - The ROUTE command no longer automatically sets a Via at the end point + of a wire. If you want to place a Via at the end point of a routed wire + you can do so by holding the Shift key down while clicking at the end + point. + - When determining the layer in which to route, the ROUTE command now also + considers Wires (not only SMDs). + - When changing the layer in the ROUTE command, only the minimum necessary + via 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. + - The ROUTE command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/ROUTE"). + - The ROUTE command now creates a new airwire if necessary when Ctrl is + pressed while selecting the starting point (see "Help/Editor Commands/ROUTE"). + +* SET command: + + - The SET USED_LAYERS command also takes into account the layers from the + new multilayer setup in the Design Rules and keeps them in the menus. + - The SET WIRE_BEND command accepts the two new values 5 and 6 to define + bend styles that start or end in a 90 degree arc, plus the new value 7 + for a bend style that results in an arc that exactly fits to the wire at + the starting point. If there isn't exactly one wire at the starting point, + a straight wire is drawn. This bend style can be used to draw wires in sort + of a "freehand" way. + - The special character '@' can be used with the SET WIRE_BEND command to + define which bend styles shall actually be used when switching with the + right mouse but (as in SET WIRE_BEND @ 1 2 4 5;). + - The SET command now restores the program default values for the parameter + menus when executed as, for instance, + + SET WIDTH_MENU; + + (i.e. without any values). This applies to all *_WIDTH parameters. + +* SHOW command: + + - The SHOW command now displays the net class (in case of a net or signal) + and the gate name (in case of a multi gate part). + +* SMASH command: + + - The SMASH command can now be applied to a GROUP. + - Pressing the Shift key while clicking on a part or group with the SMASH + command will now "un-smash" the object. + - The >PART and >GATE parameters are now also smashed. + +* SMD command: + + - The SMD command supports the new options NOSTOP, NOTHERMALS and NOCREAM to + define the new 'flags' (see "Help/Editor Commands/SMD"). + +* SPLIT command: + + - The SPLIT command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/SPLIT"). + +* UPDATE command: + + - The UPDATE command can now update packages in a library (see "Help Update"). + +* VIA command: + + - The VIA command has a new parameter that defines the layers this via shall + cover. The syntax is from-to, where 'from' and 'to' are the layer numbers + that shall be covered. For instance 2-7 would create a via that goes from + layer 2 to layer 7 (7-2 would have the same meaning). If that exact via is + not available in the layer setup of the Design Rules, the next longer via + will be used (or an error message will be issued in case no such via can be + set). + - The VIA command supports the new option STOP to define the new 'flags' + (see "Help/Editor Commands/VIA"). + +* WIRE command: + + - The WIRE command now has an extended syntax to allow drawing arcs (see + "Help/Editor Commands/WIRE"). + +* Miscellaneous: + + - If a net gets renamed because a Supply pin was placed on it, the user is + now notified of this. + - Improved part placement in BOARD and PASTE command. + - The files created with EXPORT IMAGE now contain the image resolution in + case the image format supports this. + - The RIPUP command can now be interrupted. + - The cursor is now switched to the "hour glass" while the Autorouter run. + - The size of the text origins is now limited to the actual size of the text. + - There is now a new item "Stop command" in the "Edit" pull down menu which + has the same effect as the "Stop" button in the action toolbar. + - When printing on DOS based Windows systems (Windows 95, 98, ME) EAGLE can + now render the drawing in memory and send the complete bitmap to the printer + in order to overcome problems with printing texts on some printer drivers. + This slows down printing, but at least it produces correct results. If you + happen to have a printer driver that doesn't work correctly, you can + turn this workaround on by setting the parameter + + Printer.InternalRendering + + in the ~/.eaglerc file to a value other than + the default "0". + The individual bits in the number each stand for a specific Windows version: + + 00000001 = Win32s + 00000010 = Windows 95 + 00000100 = Windows 98 + 00001000 = Windows Me + 00010000 = Windows NT + 00100000 = Windows 2000 + 01000000 = Windows XP + + You can use any combination of these bits in order to turn InternalRendering + on or off for specific platforms. For instance the setting + + Printer.InternalRendering = "6" + + would turn this feature on only for Windows 95 and Windows 98. + If you had "Options/User interface/Always vector font" active because + your printer wouldn't print non-vector fonts correctly, you may want to + turn that option off now and try printing non-vector fonts. You may also + need to turn off the "Persistent in this drawing" option for a particular + drawing. Selecting the "Black" option in the PRINT dialog may speed up + printing (in case you are printing to a black&white device). + - Printing under Linux now supports CUPS. + - When selecting an object in a densly populated area, the "Select + highlighted object" message now also displays the information about + that object, as would the SHOW command. + - Opening the same file concurrently in two output() statements in a User + Language Program is now treated as an error. + - Error message dialogs now use the system defined sound effects. + - When connecting net segments the user is now always informed about the + resulting name. + - The SIGNAL and PINSWAP commands now offer a selection if there are, for + instance, two SMD pads on Top and Bottom at the same location. + - The DELETE command can now be interrupted when deleting a GROUP. + - The cursor now changes to the "hour glass" while processing polygons. + - Improved selecting smashed names/values in densely populated areas. + - If changing a package in a board results in connected pads of that + element being moved outside of the allowed board area of the Light or + Standard edition, the wires attached to these pads are now ripped up + in order to comply with the board area limitations. + - Fixed handling of '\' at the end of script lines (the '\' inserted an + additional blank, which caused problems with 'Description' lines in muliple + EXPORT/SCRIPT of a library). + - An airwire in a dense area now triggers the selection mechanism even if the + other objects belong to the same signal. + - Avoiding flickering status bar in library script with many EDIT commands. + - Changed mouse button handling under Windows to improve application + button selectability. + - The progress bar in the status line of an editor window is now only + displayed when it is actually active, and the percentage value is + displayed outside of the bar under Windows. + - When moving a part in a schematic causes net wires to be automatically + generated, both ends of these wires are now checked to see if any + junctions are missing or can be deleted (this only works if + "Options/Set.../Misc/Auto set junction" is active). + - Improved ERC's checks for unconnected net wires and missing junctions. + - The parameter toolbar in board context now contains a combo box where + angles can be selected and entered (instead of the former four buttons + for R0...R270). + - Panning is now done through Click&Drag with the center mouse button (no + longer with the Ctrl button). If you want to have the old functionality + back you can add the line + + Interface.UseCtrlForPanning = "1" + + to your ~/.eaglerc file. Note, though, that the + Ctrl key is now used for special functions in some commands, so when using + these special functions (like selecting an object at its origin in MOVE) + with this parameter enabled you may inadvertently pan your draw window. + - Zero length airwires are now displayed as X-shaped crosses to improve their + visibility. + - The new fill styles Stipple1, Stipple2, Stipple3 and Stipple4 (numerical + values 12..15) can be used to have layers be drawn and erased without + disturbing each other. + - Improved library update in case of device sets with a large number of + package variants. + - When switching through the wire bend styles with the right mouse button + (for instance in the WIRE command), the Shift key reverses the direction + and the Ctrl key toggles between corresponding bend styles. + - When a Mark is active, the relative coordinates are now also displayed as + "polar coordinates" (radius + angle), indicated by "(P ...)" in the + coordinate display. This can also be used to measure the distance between + any two points. + - Coordinates entered in the command line or in scripts can now be given + relative to the mark, as polar coordinates, and can simulate a right mouse + button click, which is mainly useful to select a group (see "Help/Editor + Commands/Command Syntax"). + - Dialog input fields that accept decimal numbers now automatically + convert the ',' (or whatever the local decimal point is set to) into + a real decimal point ('.'). + - When loading a board/schematic pair that doesn't indicate consistency, a + consistency check will now be performed automatically. + - The sheet selection combo box in the action toolbar now contains an entry + named "remove", which can be used to remove the current sheet from the + schematic. + - The highlighted objects from SHOW now stay hightlighted if a WINDOW + command is given. + - The Rich Text tag no longer uses a smaller font. + - The relative coordinate display now uses at least the mark's precision. + - Editor windows now have a new menu entry "File/Open recent" which allows + to easily reload recently used files. + - Increased grid display pecision for mil and inch. + - No more popup message for undefined or empty group, rather 'beep' and + status message. + - Avoiding unnecessary backups (for instance "*.b#1") when saving files + that have not been modified. + - Fixed EXPORT PARTLIST in case of long names or values. + +* Bugfixes: + + - Fixed delimiting the undo buffer in CHANGE PACKAGE and CHANGE TECHNOLOGY. + - The "Change Isolate" menu option is now also available in the package + editor. + - A polygon that consists only of two defined points is now rejected. + - Fixed removing an ASSIGNed key from the 'eaglerc' file. + - Fixed setting the default grid when changing the drawing type (package, + symbol, device) inside a library. + - Fixed canceling a command by pressing the "Cancel" button in a dialog + (for instance the NET command was not completely terminated). + - Fixed initializing the $EAGLEDIR variable when starting the program with + './eagle' (was only a problem under Linux). + - Fixed searching the 'eagle.scr' file in the current directory and handling + directory paths in the -S option. + - Fixed skipping unsuitable objects when pasting between different drawing + types. + - The User Language now generates an message if accessing a contact from a + pin without a device context. + - Fixed switching off the DRC check "copper against t/bRestrict" (polygons + in the t/bRestrict layers were still checked). + - Fixed renaming a package variant in the library editor. + - Fixed displaying pads/vias in case an additional signal layer is activated + with the DISPLAY command. + - Fixed UL_AREA for packages and symbols in an UL_ELEMENT or UL_INSTANCE + context, respectively. + - Fixed detecting an error condition in accessing an uninitialized User + Language variable while it is being defined. + - Fixed storing NET_WIRE_WIDTH and BUS_WIRE_WIDTH in the eaglerc file. + - Fixed double file name entries in the Control Panel under Windows after + renaming files with upper-/lowercase. + - Fixed refreshing the Control Panel tree after creating a new CAM job. + - Fixed handling CAM job descriptions that contain double quotes. + - Fixed handling mouse wheel events when zooming in/out (previously the + given "Mouse wheel zoom" factor was applied twice for each event). + - Fixed setting the focus in the DISPLAY and LAYER dialogs. + - Fixed displaying 'not saved' in >LAST_DATE_TIME on printed output. + - Fixed entering negative values in 'real' dialog fields. + - Fixed raplacing an identical package from a different library. + - Objects that don't cover any raster point are now virtually enlarged + by the Autorouter to make them cover at least one raster point, so that + the Autorouter can "see" them. + - Fixed a problem when deleting a layer from within the DISPLAY dialog. + - Fixed updating library devices with newly added packages. + - Fixed handling value on/off in the library update. + - The BOARD command no longer copies all package variants into the newly + created board, but rather just the ones that are actually used. When + loading a board from a previous version, the superfluous packages will + automatically be deleted. + - The Autorouter sometimes didn't route between objects where it + actually should have been able to do so. + - The 'Cancel' button sometimes didn't work when a message box was + displayed while, for instance, running a script. + - The ADD dialog didn't display all used libraries after a device has been + added from the Control Panel. + - Fixed handling layer of mirrored text wires in UL_TEXT.wires. + - Fixed drawing objects attached to the cursor when doing Ctrl+MouseMove + (wasn't drawn correctly under Windows). + - Fixed the Technology parameter in EXPORTed library scripts (the values + were not quoted). + - Fixed mirroring labels in a schematic. + - Fixed a crash if INVOKE was used in a board. + - Fixed 'Replace all' in the text editor for several occurrences in the same + line with different lengths of find and replace text. + - Fixed a bug in the library update of standalone boards in case a pad was + removed from a package. + - Fixed CHANGE PACKAGE in case both devices have no connects. + - Fixed flickering smashed texts when dragging parts. + - Fixed displaying wires when zooming far into the drawing. + - Fixed handling empty packages and symbols in CUT/PASTE. + - Fixed setting the size of the ERRORS window. + - The 'scale factor' and 'page limit' in the PRINT dialog are now limited + to values >=0. + - Fixed handling of net classes when renaming nets. + - Added missing 'L' parameter to the format statement (FS) of GERBER_RS274X + in eagle.def. + - Fixed closing a project if the user doesn't have write access to the + directory. + - Fixed setting user defined default Design Rules when loading an existing + library. + - Fixed handling of objects that don't belong to any signal in the DRC, in + case there are no signals with the default net class. + - Fixed the header for Postscript files in 'eagle.def'. + - Fixed UL_VIA.diameter[] for LAYER_TSTOP and LAYER_BSTOP in case the drill + isn't larger than the stop limit in the Design Rules. + - Fixed ADDing devices with '(' or ')' in their name. + - Fixed a crash in GROUP/CUT in case only net labels where in the group. + - Fixed handling packages that contain both pads and smds. + - Fixed handling multiple smashed '>NAME' etc. texts in User Language + Programs. + - Fixed handling the layer of polygons when doing GROUP/CUT/PASTE with + mirroring. + - Fixed printing hatched polygons with "pos. Coord" option in the + CAM Processor. + - The CAM Processor no longer complains about layers that are enabled in + the job but not used in the drawing. + - Fixed 'dxf.ulp' to correctly display solder stop masks for pads, vias + and holes. + - Fixed rotating with right mouse button while moving an object with + click&drag. + - Fixed deleting a net wire that was connected to a supply pin (the remaining + net wasn't renamed accordingly). + - Fixed setting the >DRAWING_NAME parameter when creating a board from a + schematic. + - Fixed handling wires that ended exactly on a vertical polygon edge (the + polygon was not considered to be connected to that wire). + - Fixed closing ULP include file after an error message (text editor was + unable to save the edited file under Windows). + - Fixed checking empty (value) texts in the DRC. + - Fixed printing under Linux after a previous print job has been canceled. + - Fixed snapping bended wires if "Options/Set/Misc/Snap bended wires" is on. + - Fixed buffer overflow in printf() with very long '%*' formats in ULPs. + - Fixed handling SET WIRE_BEND while drawing a wire. + - Fixed calculating zero length airwires in case there is another wire end + point very close to these coordinates. + - Fixed searching the library in the library path in case of + "ADD part@libraryname". + - Fixed execution of 'eagle.scr' in case there is a command following the + EDIT command in the command line. + - Fixed EXPORT SCRIPT in case the library description contains the backslash + character. + - Fixed emulating thin arcs on photoplotters. + - Fixed some superfluous '*' in the Gerber RS274X output format. + - Fixed an abort if a ULP accesses a schematic's nets from a board via + project.schematic(SCH). + - Fixed the location of pad names for pins in mirrored instances in + the User Language. + +Release notes for EAGLE 4.09r2 +============================== + +* CAM Processor: + + - The new command line option '-N' can be used to turn off the command line + message prompts in the CAM Processor. This is mostly useful for fully + automated CAM batch jobs. + +* Bugfixes: + + - Fixed a case where the original pad/via shape was drawn in a supply + layer (in addition to the thermal/annulus symbol). This also may have + caused the autorouter to route a signal that actually had a supply layer + (and therefore didn't have to be routed). + - Fixed the DRC check between copper and Dimension lines with zero width. + - Fixed reacting on system color changes in the Help window under Windows. + - Fixed handling Pwr pins in the library update (consistency could be lost + if the pins had a different sequence in the new symbol). + +Release notes for EAGLE 4.09r1 +============================== + +* Bugfixes: + + - Fixed drawing SMDs with Roundness values other than 0 or 100 on photo + plotters with fixed aperture wheels. Note that aperture tolerances are + relative to the final object dimensions, so when drawing SMDs with + Roundness the aperture actually used may be larger, even if only a + negative tolerance value was specified. Also, the difference between the + initially requested aperture and the actually used one may be a lot + bigger than the absolute value of the tolerance would indicate. + If you are processing CAM data for a board that contains SMDs with Roundness + and you get an "Aperture missing" error regarding a Draw aperture, you can + try specifying a negative draw tolerance of a few percent to enable + drawing of the rounded SMDs (which will then be drawn as if they had a + larger Roundness value). + - Fixed handling GROUP rectangles with zero width (which caused a program + crash). + - Fixed printing drill symbols with Postscript in the CAM Processor in case + the Pads or Vias layer was not activated. + - Avoiding unjustified 'close but unconnected...' warnings in the ERC. + - Fixed net class handling in forward annotation when splitting a net. + - Fixed library update in case of CUT/PASTE from one schematic into another + (there was no error message if a package variant was no longer available). + - Added the missing "Cam Processor" entry to the pulldown menu in the + schematic editor. + - Fixed handling description when checking for modified CAM job. + +Release notes for EAGLE 4.09 +============================ + +Version number changed for final release. + +Release notes for EAGLE 4.08r2 +============================== + +* Bugfixes: + + - Fixed deleting net segments from pins that overlap with another segment + (in such cases it could have happened that the consistency between board + and schematic was lost). + +Release notes for EAGLE 4.08r1 +============================== + +* Bugfixes: + + - Fixed a problem when closing a window and canceling the "Save?" dialog. + - Fixed library update in ADD when package variant is missing. + +Release notes for EAGLE 4.08 +============================ + +* Bugfixes: + + - Fixed another unjustified error message "Load error 293". + +Release notes for EAGLE 4.07 +============================ + +* Bugfixes: + + - Fixed unjustified error message "Load error 293". + - Fixed a possible crash when closing a window in a script. + +Release notes for EAGLE 4.06 +============================ + +* Bugfixes: + + - Fixed checking rectangular objects versus circular objects in the DRC. + - Fixed installing executable file and manual page under Linux. + +Release notes for EAGLE 4.05 +============================ + +* Bugfixes: + + - Fixed polygon calculation under Windows. + - Fixed canceling the Autorouter during ripup. + - Fixed handling circles in the autorouter (sometimes it routed right through + them). + +Release notes for EAGLE 4.04 +============================ + +* DELETE command: + + - Net segments connected to a bus now keep their name when splitting segments. + - Added a note to the online help of the DELETE command, regarding ripup of + signal wires when deleting a part with SHIFT+Delete. + +* ERC command: + + - In order to handle board/schematic pairs that have only minor inconsistencies, + the user can now enable a dialog that allows him to force the editor to + perform forward-/backannotation, even if the ERC detects that the files are + inconsistent. This can be done by appending the line + + Erc.AllowUserOverrideConsistencyCheck = "1" + + to the ~/.eaglerc file. + PLEASE NOTE THAT YOU ARE DOING THIS AT YOUR OWN RISK - if the files get + corrupted in the process, there may be nothing anybody can do to recover + them. After all, the ERC *did* state that the files were inconsistent! + - The ERC now reports an error if supply pins with the same name are + overwritten with more than one signal. + +* EXPORT command: + + - The EXPORT SCRIPT command now sets the grid unit to 'mm' if the current + grid isn't metric, in order to avoid loss of precision. + +* INFO command: + + - The INFO command now displays the VIA diameter separately for outer and + inner layers (as determined by the Design Rules), plus the value that has + been originally defined by the user. + The format is "Diameter = outer/inner (original)". + +* OPTIMIZE command: + + - The OPTIMIZE command now also optimizes the "flat" wires in a board (i.e. + those not being part of a signal). + +* PACKAGE command: + + - The PACKAGE dialog now accepts an empty "Variant name" field and no longer + requires the explicit entry of '' (two single quotes) to define a + package variant with an "empty" name. + +* TECHNOLOGY command: + + - The TECHNOLOGY command no longer asks before removing a Technology from + a device. + +* WIRE command: + + - In order to speed up execution of large scripts that produce many wires, + 'Set Optimizing Off' now also disables automatic wire splitting in scripts. + +* User Language: + + - When running a ULP the internal search path for images will now be set to + the ULP's directory. + - The help page for Rich Text now contains a list of the supported image + formats for the "" tag. + - The new member function UL_LAYER.used can be used in a ULP to check if a + given layer is actually used in a drawing. + - The new builtin constants "path_...[]" and "used_libraries[]" can be used + to determine the entries in the "Options/Directories" dialog and the + currently used libraries from within a ULP. + See "Help/User Language/Builtins/Builtin-Constants". + - The new mode character 'F' in the 'output()' statement of the User Language + can be used to force opening a file with an otherwise protected extension + (*.brd, *.sch or *.lbr). + +* Miscellaneous: + + - Improved speed of CAM Processor. + - NET and SIGNAL commands are no longer terminated when canceling a + 'Connect...?' dialog. + - Pad and via drill holes are no longer subtracted from polygons. + - The position of the "splitters" in dialogs like for instance "ADD" are no + longer stored as percentage values in the file ~/.eaglerc, + but rather as absolute pixel values. The first time such a dialog is opened + with this program version the splitter positions may therefore not be the + same as when the dialog was left last time. + - Polygons that would completely disappear after being calculated with RATSNEST + are now shown on the screen with their original outlines. This allows editing + or deleting them. + - The string edit dialog now adjusts its width to completely show longer + strings (for instance when editing a long bus name). + - Command text buttons (defined with the MENU command) now stay pressed to + indicate the currently active command (this does not apply to buttons that + result in a submenu). + - The Windows file dialog no longer checks for the existence of a file, thus + allowing the user to leave out the filename extension when typing in a + file name. + - The command button groups are now separated by horizontal lines, which saves + space in the command menu. + - The default value for the solder stop mask ("Edit/Design rules/Masks/Stop") + has been changed to a fixed value of 4mil. + - The size of SMD names displayed when SET PAD_NAMES is on is now limited to + 20mil. + - The "Description" field in the library editor and the right pane in the + Control Panel can now be completely minimized with the splitter. + - If a package variant or technology is no longer there (e.g. because it has + been deleted or renamed) the user can now select a different one in the + library update. + - The automatic unit determination in dialog input fields can now be controlled + by appending the line + + Interface.PreferredUnit = "x" + + to the ~/.eaglerc file, where "x" can be + "0" for automatic unit determination (default) + "1" for imperial units + "2" for metric units. + - The 'dxf.ulp' now has radio buttons to choose the unit of the generated + data ('mm' or 'inch'), and outputs data in 'mm' with 4 decimal digits + instead of 3. + - When using the CAM Processor in command line mode it no longer stops if + a warning message is given, but rather offers a prompt that allows the user + to decide whether to continue or not. + +* Bugfixes: + + - Fixed handling of upper/lowercase umlauts in removing/renaming library + objects. + - Fixed error handling if a non existing member function was used in a ULP. + - Fixed library update error 403-1362. + - Fixed library update in case a device set is no longer present in the + library. + - Fixed printing Thermal symbols. + - Technologies can no longer contain lowercase characters. + - Fixed handling devices with double quotes in their name in the Control Panel. + - Fixed focus handling in 'Connect Nets' dialog. + - The internal object counters are now checked against a safety limit in order + to avoid overflows. + - Fixed optimizing wires after MOVE. + - Fixed layer in UL_POLYGON.contours and UL_POLYGON.fillings in case of + mirrored polygons. + - Fixed handling of PWR pins in library update. + - Fixed exporting images. + - Fixed handling printer specific page sizes under Windows. + - Fixed updating libraries in case packages had been replaced in the board. + - Empty values of smashed parts are no longer selectable by mistake. + - Fixed handling '\' in the "Options/Directories" dialog under Windows. + - Fixed displaying User Language dialogs under Windows. + - Fixed handling Technology values that add up to exactly 13 characters. + - The EXPORT SCRIPT command now explicitly generates a "-''" if a device + does not contain the empty Technology. + - Fixed handling lowercase characters when deleting Technologies. + - Fixed splitting net segments with supply symbols. + - Fixed EXPORTing net class for implicit PWR pins. + - Fixed optimizing wires after deleting a group. + - Fixed handling the PRINT option '-0'. + - Fixed handling lines longer than 1000 characters in eaglerc. + - Fixed handling "SET BEEP ON|OFF". + - Fixed a possible crash that happened under Windows if the system date was + outside the range 1970..2037. + - Fixed parsing '(' in the command line (caused an error message when + renaming a package variant that contained this character). + - Fixed a possible crash that could happen if a part on a sheet was deleted + with SHIFT+Delete, and that part was the last of this type in the schematic. + - Fixed 'Shift-Deleting' parts with gates on different sheets. + - The terminating ';' was missing for "Hole..." in exported scripts. + - Fixed handling "WRITE @filename;". + - Fixed handling directory paths after navigating with the file dialog. + - Fixed the "...not saved" dialog in case an other board should be edited + after a modification that changed both the board and the schematic (it + didn't list the schematic as modified). + - Fixed setting the net class of a newly drawn net or signal in case the + net/signal name is specified in the command line. + - Fixed library update in case a non-pwr pin became a pwr pin. + - Fixed handling unconnected supply pins. They are now implicitly mapped to + the same net name as any other overwritten supply pin with the same name. + - Fixed handling "&xxx;" tags in the tree view of the control panel. + - When drawing a new net/signal segment towards an existing one, the net + class of the existing net/signal is no longer overwritten. + - "File/Open/Text..." now always opens a text editor window, even if the file + name has an extension that would indicate a different kind of window (like + ".cam"). + - The library editor window is now refreshed after executing a script. + - Closing a "Description" or "Connect" dialog with the system's close button + now reacts correctly if the user selects not to discard changes. + - When opening a file from the Control Panel with "File/Open/..." the proper + filename extension is now added if it is missing. + - Fixed naming nets if the NET command contains an explicit net name. + - Fixed delimiting the undo buffer in the REPLACE command. + - Fixed setting the directory in "Save as...". + - Fixed handling command line PRINT parameters. + - Fixed selecting objects that are close together. + - Fixed using expressions as title in a dlgGroup. + - The User Language no longer returns wires in layer 0. + - Fixed PASTEing nets with different net classes than an existing net of the + same name. + - Fixed toolbar positioning. + - Fixed checking user defined print borders against the printer driver's + minimums. + - Fixed library update in case of pins with '@' in their name. + - Fixed handling pin names with '@' in the User Language. + - Fixed handling parameter strings (like '>NAME') in ULPs in case the editor + window was refreshed after a dialog. + - Fixed handling the '>GATE' parameter String in ULPs. + - Fixed UL_TEXT.wires() for mirrored texts of smashed elements. + - Fixed calculating ratsnest when adding a part with many Pwr pins (this took + a very long time). + - Fixed page size of PS_DINA3 device in CAM Processor. + - Fixed the polygon subtractor to handle cases where many identical objects + have to be subtracted from the same polygon. + - Fixed closing a window in a script that has been called from an other + window. + - Fixed version 3.5 compatibility mode in PACKAGE command. + - Fixed the UL_PIN.contact function if called from a UL_PINREF context. + +Release notes for EAGLE 4.03 +============================ + +WARNING: Due to some necessary changes in the data structure once you edit + a file with version 4.03 you will no longer be able to edit it + with earlier versions! + + PLEASE MAKE BACKUP COPIES OF YOUR CURRENT BOARD-, SCHEMATIC- AND + LIBRARY-FILES BEFORE EDITING THEM WITH VERSION 4.03! + +* ADD command: + + - The ADD dialog now has a 'Drop' button that removes a library from the list + of used libraries. + - The ADD command can now fetch a particular gate from a device, without + automatically fetching the MUST and ALWAYS gates, too. + - Some users always want to use the device name as part value, even if the + part needs a user supplied value. Those who want this can now append the line + + Sch.Cmd.Add.AlwaysUseDeviceNameAsValue = "1" + + to the ~/.eaglerc file. + +* DELETE command: + + - The DELETE command now deletes an entire part when clicking on a gate + with the Shift key pressed. In that case, the wires connected to the element + in the board will not be ripped up. + - The DELETE command now deletes the entire polygon when clicking on a + polygon wire with the Shift key pressed. + - The DELETE command now deletes the entire net or bus segment when clicking + on a net or bus wire with the Shift key pressed. + +* ERC command: + + - Since some people did not appreciate the new checks implemented into the + ERC, these can now be suppressed by appending the line + + Erc.SuppressAdditionalWarnings = "1" + + to the ~/.eaglerc file. + - The ERC now reports uninvoked MUST gates as errors. + - The ERC now checks whether nets and signals have consistent net classes. + - The ERC no longer checks pin overlaps within the same gate. + +* EXPORT command: + + - The EXPORT IMAGE command now accepts the new keyword MONOCHROME to produce + a black&white image. + - EXPORT IMAGE now displays a 'wait' cursor if the operation takes some time. + - EXPORT NETSCRIPT now outputs the net classes. + +* INFO command: + + - The INFO command now displays the layer name. + +* LAYER command: + + - The new option '??' can be used to suppress error messages when deleting + a layer. + +* UPDATE command: + + - The UPDATE command now accepts the parameters '+@' and '-@' which allow + renaming the libraries contained in a drawing. + +* VALUE command: + + - Some users don't want the warning message about a part not having a user + definable value, so that warning can now be disabled by appending the line + + Warning.PartHasNoUserDefinableValue = "0" + + to the ~/.eaglerc file. + +* Design Rules: + + - The DRC check "copper against t/bRestrict" can now be completely turned + off through "Misc/Check restrict" in the Design Rules dialog. By default + any copper objects in the Top and Bottom layers are checked against objects + in t/bRestrict. + - There are now checkboxes on the "Restring" tab that can be + set to enable using the actual pad or via diameter in inner layers, too. + By default this option is off for newly created boards, but will be set + when updating a board from version 3.5 or earlier, since previous versions + used the same pad/via diameter on all layers. + TO IMPLEMENT THIS FEATURE IT WAS NECESSARY TO MODIFY THE DATA STRUCTURE + IN A WAY SO THAT FILES EDITED WITH VERSION 4.03 CAN NO LONGER BE LOADED + INTO EARLIER VERSIONS (OTHERWISE THE RESULTS MIGHT NOT BE CORRECT). + - The Restring parameters in the Design Rules are no longer set to 0 when + updating a board file from version 3.55 or earlier. They are now left at + their default values and if the file contains any pads or vias that would + become larger due to these new parameters, the user will pe prompted to + confirm this and to adjust the Design Rules if necessary. + When the CAM Processor loads a version 3.55 (or earlier) file, the Restring + Parameters will still be set to 0, which makes sure that the result will be + the same as in previous versions. + When loading a file from version 4.0 or 4.01, the restring parameters will + be checked, and if they are 0 the user will be prompted to confirm this and + and to adjust the Design Rules if necessary. + - The DRC now checks the Design Rules for plausibilities. + - The DRC now only checks pads and smds, as well as any copper objects + connected to them, against dimensions. + +* Polygons: + + - The polygon named _OUTLINES_, which is used for calculating outlines, no + longer needs to have an Isolate parameter of 0 (See "Help/Generating + Output/Outlines data"). + - When calculating the _OUTLINES_ polygon, objects in the layers t/bRestrict + and Dimension were wrongly subtracted. + +* User Language: + + - New data members UL_PART.deviceset, UL_DEVICESET.library, + UL_DEVICE.library and UL_SYMBOL.library. + +* CAM Processor: + + - The CAM Processor can print schematics again. + +* Miscellaneous: + + - Improved selectability of arcs. + - Speeded up saving a file when there are many entries in the CP tree and the + network is slow. + - The "Always vector font" flag that is stored in a drawing file can now + be controlled via "Options/Set/Persistent in this drawing" (previously + this was only possible by entering the SET command in the command line). + - The vector font characters '&', '@' and '~' have been improved. + - The 'dxf.ulp' now outputs texts always with the builtin vector font by + default (this can be changed through a new checkbox in the dialog). + - Junctions are now also set automatically when a part is placed, and they + will be automatically deleted if a part or a net wire is deleted. + - The automatic opening of the project folder at program start (or when + activating a project by clicking on its gray button) can now be disabled + by appending the line + + ControlPanel.View.AutoOpenProjectFolder = "0" + + to the ~/.eaglerc file. + +* Bugfixes: + + - The Autorouter sometimes routed too close towards pads, which could result + in short circuits (this only happened when the pad shape was different in + the various routing layers). + - A crash could happen in EXPORT IMAGE unter Linux with 8bpp X-servers. + - A crash could happen when removing a sheet with the REMOVE command. + - When using the CAM Processor device GERBER_RS274X to generate data for + a supply layer, the thermal gaps were missing. + - When printing several sheets the caption was not printed correctly under + Windows with some printers. + - The CAM Processor's GERBERAUTO didn't always create all apertures when + pads or vias had different shapes in the various layers. + - Resource usage under Windows was drastically reduced. + - Entering command names that were too long caused a crash. + - The values used with the CAM Processor command line options -h, -w, -x and + -y have been wrongly rejected. + - Values for Width and Height defined in 'eagle.def' were not copied into + the CAM Processor window, and values entered in the CAM Processor were not + used. + - CUT didn't work with the right mouse button. + - The library update mechanism sometimes didn't recognize different symbols + or packages, which made it impossible to add certain parts to a schematic. + - If the resulting bitmap was too large, the EXPORT IMAGE sometimes crashed + or didn't create any output (without an error message). + - When creating new library objects it was possible to enter names that + contained blanks. + - When EXPORT IMAGE was used in a newly loaded library with no object being + edited, the program crashed. + - A possible crash under Windows that happened when the program was left with + Alt-X was fixed. + - The User Language function fileglob() didn't work if the filename pattern + contained a blank. + - Sometimes some layers were not displayed in the CHANGE PACKAGE preview. + - The selected window area was not restored correctly when a schematic was + loaded from a project file. + - Avoiding ERC warnings about net wires being too close if there is a bus + wire at that point. + - Under Windows the UPDATE command didn't search for libraries case + insensitively. + - Fixed changing the layer of a polygon in a package. + - When printing more than one sheet on Windows 2000 the offset of the second + and following sheets was incorrect with some printer drivers. + - Empty lines in text files were not printed. + - Editing the DESCRIPTION of a directory produced faulty line ends under + Windows. + - There was no error message when the DESCRIPTION file couldn't be written. + - Speeded up DRC processing and deleting errors when the large cursor is + used. + - Reading a Design Rules file didn't work if the description contained the + '=' character. + - When a package was renamed, the package variant list wasn't updated. + - The Control Panel did not open the tree to the initial project if the + "Projects" path contained more than one entry. + - The Control Panel tree was not refreshed after operations like rename, + copy etc. + - The chapter describing the User Language function 'lookup()' was missing + from the German online help under Windows. + - Relative symbolic links were not expanded correctly under Linux. + - Pads and vias didn't keep their drills open inside signal polygons. + - The DRC now reports texts in signal layers that don't use the builtin + vector font (this check can be disabled through "Check texts" on the + Design Rules' "Misc" page). + - The DRC and Autorouter sometimes crashed when the board contained a large + arc or circle. + - Polygon wires no longer react on CHANGE STYLE. + - The SIGNAL command did not ask the user whether to combine newly defined + signals with existing ones, but rather silently connected them. + - When a dialog is canceled, any running script will now also be canceled. + - Previously entered text in the text editor's 'Find' dialog is now selected. + - Avoiding 'wait' cursor in dialogs during lengthy operations. + - EXPORT IMAGE didn't use the board's Design Rules. + - A UL_GATE that has been derived from a UL_INSTANCE did not provide the + correct x and y values. + - When loading an Autorouter control file that contained a routing grid with a + precision that exceeded the internal editor resolution of 0.0001mm, the + routing grid was rounded to the internal resolution. + - When a file was opened using the Control Panel's context menu, the buttons + in the editor window's toolbars didn't work correctly under Windows. + - The program crashed when a device was added to a schematic via Drag&Drop + from the Control Panel, and the library needed to be updated from an older + version. + - Some paper sizes were not handled correctly in the PRINT command under Linux. + - When a device that supports colors has been used in the CAM Processor, + selecting "Layer/Show selected" or "Layer/Show all" disabled the display of + the color numbers in the layer list. + - Removing a key assignment with "ASSIGN key;" didn't work. + - The ADD command didn't add a new part if a part name was given and there + were still unused NEXT gates of that type available in an already existing + part. + - The 'Stop' button wasn't disabled correctly when pressed in the LABEL + command. + - Supply layers were not printed correctly if the print was done rotated. + - Fixed missing cursor in text editor if the first character in a line is + something like '{'. + - When using the MOVE command with "click&drag" mode, releasing the mouse + button outside the drawing area is now ignored (as was the case in version + 3.55). + - The next command was sometimes skipped when an error message was given in + a script file. + - When routing a large board with many layers and a fine grid, the autorouter + sometimes needed extremely much memory. This has been improved to make it + work with less memory. + - When using a fine routing grid the Autorouter sometimes inserted an extra + (jagged) wire segment at the starting point of a trace. + - When the routing grid was not an integer multiple of the internal editor + resolution of 1/10000mm (e.g. 6.25mil), the Autorouter sometimes didn't + round the resulting coordinates corrrectly. + - Fixed updating the contents of a dlgComboBox when a statement is executed. + - Fixed the bahaviour of the "Again" function in the text editor in case + nothing has been searched yet. + - Fixed setting colors, fill styles and long strings when adding new layers + from a library to a board or schematic drawing. + - Fixed processing textual coordinate values (sometimes in script files only + every other coordinate pair was recognized). + - Fixed recalculating the "Window Fit;" area of a sheet after a library + update. + - User Language Dialogs sometimes became inoperative after canceling a + message box. + - The bounding box of texts will be recalculated in order to fit exactly to + the text size when using vector font. + - The CAM Processor didn't correctly write the offsets into the info files. + - The PASTE command in a schematic didn't always forward annotate the net + classes of the pasted nets correctly. + - Fixed handling empty strings in dlgComboBox. + - Fixed updating libraries in the PASTE command. + - Sometimes small white "dots" appeared when a file was newly loaded. + These also caused zero-length/zero-width apertures to be generated in + Gerber output. + - When renaming a file in the Control Panel, a possibly existing target file + is no longer overwritten. + - Sometimes under Windows a click on a push button was not recognized when + the mouse button was released while moving the mouse pointer away from the + push button. + - Fixed handling parameters (e.g. package variant names) containing '='. + - Fixed creating new projects and folders in case several branches in the + Control Panel tree view contained the same directory. + - Sometimes thermal and annulus symbols were not correctly generated for + supply layers if a window refresh in the board editor was caused while the + CAM Processor was running. + - CHANGE PACKAGE sometimes didn't map the pad assignments correctly, which + could cause wrong connections in the board and a loss of consistency. + - The ROUTE command no longer generates a via at points where there is + already a wire in the same layer. + - The layer of SMDs was sometimes not recognized correctly. + +Release notes for EAGLE 4.01 +============================ + +* Bugfixes: + + - The 'bom.ulp' didn't print the "Description" if no database was in use. + - 'bom.ulp' now uses '.htm' as default extension when saving as HTML. + - Added missing warning messages to the ERC help page. + - Holes will be subtracted from signal polygons even if the Distance + parameter for Copper/Dimension in the Design Rules is 0 (for better + compatibility with version 3.55). + - Fixed restoring the visible area in a schematic when loading a project. + - Fixed handling umlauts in NAME command. + - Sometimes text files were not correctly recognized and thus not listed + in the Control Panel's tree view. + - Making sure a very small circle with Width=0 is drawn as at least one pixel + on the screen (this is sometimes used as a reference marker). + - Fixed not limiting the zoom factor for small drawings. + - Avoiding flickering hour glass cursor when loading many libraries in ADD. + - No longer displaying text origins in device set drawing. + - Fixed checking whether a pad or via is connected to a polygon. + - Fixed calculating airwires between partial polygons. + - Checking if coordinates are within the allowed range. + - Fixed calculating polygons with widths less than 1 micron. + - The "Use all/none" option was missing in the context menu of the "Libraries" + entry in the Control Panel if there was only one entry in the + "Options/Directories/Libraries" path. + - Sometimes a faulty "used" indicator appeared in the Control Panel on + directories that are not project directories. + - After loading Design Rules from a file into the Design Rules dialog, the + percentage values of e.g. the Restring parameters were not updated + correctly. + - Fixed switching back the mouse cursor from the four-way selection cursor. + - Fixed editing the library description from a symbol drawing. + - The "mouse click" symbol was not displayed correctly in the Linux help. + - Changing "Options/Set/Display mode" did not propagate the parameter change + to the other windows. + - Polygons and non-continuous wires in packages and symbols were not handled + correctly in the User Language. + - Since version 4.0 a bus name that is used with a range can no longer end + with a digit. However, if such a name was already present in a drawing from + a previous version and a net was extracted from that bus, the program + crashed. Now there will be an error message in such a case. + - If a library was saved and parts from that library were added very quickly + (within the same second, for example in a script) it could happen that the + current version of the library was not used, but rather the previously + loaded version. + - The obsolete description of DISPLAY_MODE FAST has been removed from the + online help. + - Fixed a bug in the library update mechanism that caused an error code + of 400-1363. + +Release notes for EAGLE 4.0 +=========================== + +* Control Panel: + + - The Control Panel now has a "Tree View" which provides an overview over + all areas of EAGLE, like Libraries, User Language Programs, Projects etc. + - The Control Panel's tree view supports "Drag&Drop" to copy or move files + and directories. Files (like ULPs or scripts) can also be dragged over + an editor window and dropped there; this results in the file being RUN + or executed by the SCRIPT command inside the respective window. Devices + and packages can also be dragged and dropped onto editor windows. Dropping + an entire library onto a board or schematic editor window will perform + a library update. + - Objects in the tree view have a context menu that can be accessed by + pressing the right mouse button. + - The menu option "Save project as..." is no longer available. New projects + can now be created via the context menu in the "Projects" tree item, or + by selecting "File/New/Project" from the Control Panel. + - The path settings in "Options/Directories" can now use the special names + "$HOME" and "$EAGLEDIR" to access the user's home directory or the EAGLE + installation directory, respectively. + If these are symbolic links, they will be expanded. + - The new "Auto backup" feature will automatically save any modified + drawing into a safety backup file after a certain time. + See "Help/Automatic backup" for details. + +* New Project Structure: + + - The names of files that are under the current project directory are + no longer written as absolute paths into the 'eagle.epf' file, but rather + relative to the project directory. This allows for complete project + directories to be easily copied or renamed. + - A project is now held in a subdirectory that contains a file named + 'eagle.epf' (which stores the location and settings of open windows). + +* Converting projects from previous versions: + + - Previous versions of EAGLE used individually named project files (*.epf) + to store project information. Beginning with version 4 a project is stored + entirely in a subdirectory, and that directory contains a file with the + fixed name 'eagle.epf'. + - The easiest way to convert projects from older versions is to create one + directory for each project and copy that project's '.epf' file into this + directory under the name 'eagle.epf'. The name of the project in version 4 + is the name of the project's directory. + - In the Control Panel use the "Options/Directories" dialog to enter the + name of the directory that contains your project subdirectories into the + "Projects" field. + +* User Interface: + + - The textual command menu can now be configured to display aliased + command buttons as well as submenus (see HELP MENU for details). + - Changes made in the "Options/User interface" dialog now take effect + immediately for open editor windows. + - The cursor inside a layout or schematic editor window can now be set + to a "large" crosshair cursor (see "Options/User interface"). + - The "Delete" icon was changed from a pencil with an eraser to an 'X'. + - The "Split" icon was changed to better indicate what will happen. + +* Keyboard and mouse control: + + - Alt-0 no longer popups up the window list, but leads directly + to the Control Panel. + - Pressing the Ctrl key while moving the mouse now scrolls the + draw window in any direction. + - The mouse wheel now zooms in and out in editor windows (zoom factor can be + adjusted in "Options/User interface/Mouse wheel zoom", a value of '0' + disables this feature and the sign of this factor defines the direction + of the zoom operation). + +* Screen display: + + - The default for "minimum visible text size" has been changed to 3. + - The display mode parameter FAST has been dropped. + - By default the zoom factor in editor windows is limited so that the + resulting virtual drawing area does not exceed the 16-bit coordinate range. + This is necessary to avoid problems with graphics drivers that are not + 32-bit proof. If the graphics driver on a particular system can handle + coordinates that exceeed the 16-bit range, "Options/User interface/Limit + zoom factor" can be switched off allow larger zoom factors. + +* Design Rules: + + - EAGLE now supports a full set of Design Rules that are stored inside + the board file (and can also be saved to disk files). Both the Design + Rule Check and the Autorouter will use the same set of rules. + - 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. + - Cream mask values are now measured "inwards" and thus have a positive sign. + - The parameters AnnulusConduct and ThermalConduct are no longer available. + There are now checkboxes in the Design Rules dialog's "Supply" tab that + define whether a Thermal or Annulus symbol shall have a "Restring" or not. + - In order to assure that existing boards yield the same results when + producing CAM data after they have been updated to version 4, the minimum + restring parameters for the outer layers are set to 0 in the design rules + (this allows the existing pads and vias to keep their defined diameters). + The user should adjust these parameters to some reasonable values and run + a design rule check after adding new parts from version 4 libraries. + + NOTE: The above has been changed in version 4.03 - see release notes for + version 4.03! + + Also, the new design rule parameter that controls the minimum distance + between objects in signal layers and the board dimensions (default: 40mil) + will be set to 0 if a board that is updated from an older version contains + any signal polygons. The reason for this is that in previous versions + polygons didn't take the board dimensions into account when they were + calculated, but starting with version 4 polygons keep the minimum distance + defined in "Edit/Design rules/Distance/Copper/Dimensions" from the boards + dimensions. In order to guarantee that updated boards will yield the same + results when producing CAM data with version 4 this parameter is set to 0. + Note that this will also have an impact on the autorouter, so the user + should adjust this parameter to some reasonable value. + +* Net Classes: + + - Nets and Signals now have a new parameter called "Net Class". + - The new command CLASS is used to define and select net classes. + - The CHANGE command has a new option 'class' to change the net class + of a net or signal. + +* Polygons: + + - When calculating polygons, the minimum distances defined in the design + rules and net classes will be taken into account. Therefore the default + value for the Isolate parameter of newly created polygons is now 0. If a + particular polygon is given an Isolate value that exceeds that from the + design rules and net classes, the larger value will be taken. + - The new parameter 'rank' defines if and how polygons are subtracted from + each other. When updating existing files, polygons in signals will get + a rank of '1', while polygons in packages will get rank '7'. + - Polygons are now checked in the Design Rule Check if they have the same + 'rank'. + - Sometimes the polygon subtractor didn't go through a gap where, according + to the actual widths and minimum distances, it should have. + - Polygons in the t/bRestrict layers are now subtracted from signal polygons + in the Top and bottom layer, respectively. + +* Design Rule Check: + + - The DRC now runs a lot faster. + - Progress is now displayed in a progress bar (the progress rectangles + are no longer displayed and the SET variables DRC_SHOW and DRC_COLOR + are now obsolete). + - Since the DRC is now much faster its error messages are no longer + stored in a separate '*.drc' file (this separate file sometimes + caused board and DRC error messages to be out of sync). + - Polygons from different signals with the same 'rank' are checked + against each other. + - All objects in layers Top..Bottom (including arcs, circles etc.) + are now checked. + - The 'overlap' and 'minimum distance' check are no longer separate checks. + - The DRC no longer checks an individual signal against everything else. + The newly introduced "Net Classes" can be used to do this. + - The rectangle for a selective DRC can now be defined with "click&drag" + (just as in the WINDOW command). + - Holes are no longer checked in the "Grid" check (only pads, vias, smds + and wires in signal layers are checked). + - Any objects in signal layers within a package are now checked against each + other. + - Several new checks have been added (see the DRC dialog for more information + about the new parameters). + - Due to a calculation problem the DRC sometimes reported very small errors + where in reality there were no errors. + +* Long strings: + + - All names, values and texts can now be of any length. + - The User Language constants regarding name lengths still exist, + but the program uses these constants only for formatted output + as in the EXPORT command. They are still present for compatibility + only. + - There is no more limit to the number of members in a bus (bus index + values are limited to 0..511). + - Bus member names can now contain any characters, except ':', ',', '[', ']' + and blanks. + +* Wire styles: + + - Wires now have a new parameter 'Style', which can be set to one of the + following values: + + Continuous _______________ (default) + LongDash ___ ___ ___ ___ + ShortDash _ _ _ _ _ _ _ _ + DashDot ___ . ___ . ___ + + - The variable for setting the bend type of a wire has been renamed from + Wires_Style to Wire_Bend to avoid confusing the two parameters. + - 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 copper layers. It is + an explicit DRC error to use a non-continuous wire as part of a signal + that is connected to any pad. + +* Text fonts: + + - Texts can now have three different fonts: + 'Vector' the program's internal vector font (as used in previous versions) + 'Proportional' a proportional pixel font (usually 'Helvetica') + 'Fixed' a monospaced pixel font (usually 'Courier') + - When updating drawings from older versions, all texts are converted to + 'Proportional' font, except for those in layers Top...Bottom, tRestrict + and bRestrict, since these texts probably need to be subtracted from + signal polygons, which only works with the 'Vector' font. + - 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. + See HELP TEXT if you don't want texts to be displayed with fonts other + than 'Vector'. You can set the user interface option "Always vector font" + to always have texts output with the builtin vector font. + - When creating output files with the CAM Processor, texts with fonts + other than 'Vector' may be output using the 'Vector' font instead. + This happens if the actual output device is unable to produce texts + with different fonts. + - 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'. + - The CHANGE command has a new option "Font". + +* Pads and Vias: + + - The diameter of pads and vias is now derived from the drill diameter + using the Design Rules (the pad and via diameter '0' is now allowed + and results in a diameter that is derived from the current design rules). + If a pad is defined with a diameter that exceeds the one that would + result from the current design rules, the larger diameter is taken. + The default value for the diameter of newly created pads and vias is now + '0' to allow the Design Rules to define the actual diameters. + - Pads can have different shapes on Top and Bottom (they will always be + 'round' on the inner layers). + - The via shape now only applies to the outer layers (they will always be + 'round' on the inner layers). + - The diameter of pads with shape X/YLongOct now defines the smaller side + of the pad (formerly the wider side). Existing files will be modified + accordingly during the update. + - By default vias no longer generate Thermal symbols in supply layers. + There is a new design rules parameter that enables Thermal symbols to + be generated for vias in supply layers and signal polygons. + - When updating files from older versions, pads and vias with diameter <= + drill will be replaced with a 'hole' of that drill diameter. This only + works for unconnected pads; if a pad is connected to a pin (in a library + or schematic) or to a signal (in a board) it can't be converted to a hole + and the user must decide what to do in such a case. This conversion has + become necessary because pads and vias now always have a 'restring' that + is determined by the design rules. + If a consistent board/schematic pair is updated to version 4 and such pads + are replaced with holes in only one of the drawings, the board/schematic + pair will become inconsistent. If that happens you will need to modify + the respective package/device definition to make things consistent again. + +* Round SMDs: + + - SMDs have a new parameter "Roundness", which can range between 0 and 100 + and defines the percentage by which the corners are "rounded". A value + of 0 (default) results in a rectangle, while a value of 100 results in + a circular shape (if the x and y dimension of the SMD are the same), + which can be used for BGAs. + - The SMD command accepts roundness values as numbers with a leading '-' + (to be able to distinguish it from the SMD size values). + - The CHANGE command has a new option "Roundness". + +* New Library structure: + + - What was called a "Device" in previous versions is now called a "Device Set". + A "Device Set" consists of the gate definitions and several actual devices, + implemented through "Package Variants" + - The PACKAGE command can now assign several different package variants + to a device (as in 7400N, 7400D,...). + - The new command TECHNOLOGY can be used to define various "technology" + variants for a device's package variants (as in 74LS00N, 74S00N,...). + - The CHANGE command has the new options PACKAGE and TECHNOLOGY, which + can be used to select from the packages and/or technologies a device + set defines. This can be done from within the schematic or board. + - The new command DESCRIPTION can be used to provide detailed textual + information about a device, package or library. + - The CONNECT dialog now allows copying pin/pad connections from an other + package variant. Only those package variants are offered in the "Copy from" + combo box that have the same pad names as the current package variant + (only connected pads are checked). + - The CONNECT dialog now asks the user if he want's to discard any changes + before canceling the dialog. + - The CONNECT command can now handle gate names that contain periods. + - The device editor now displays a list of package variants, a preview of the + current package and the description of the device. + - Since it is now possible to "completely" define a device with all + package and technology variants, the default setting of the "Value" + parameter has been changed to "Off". + - The meaning of the "Value" parameter in a device set is now as follows: + + "Value Off" means there is no user definable value, i.e. the value of + a part is defined by the dievice name (including, if present, technology + and package variant). A device like "74LS00N" would be an example. + + "Value On" means this device needs a user defined value to be fully + specified. A resistor is an example. + Even in the "value off" case the user can (after a confirmation dialog) + change a part's value to handle any special cases that might otherwise + cause problems. Any CHANGE TECHNOLOGY or CHANGE PACKAGE command that is + executed after such a change will set the value back to the device name. + +* Automatic Library update: + + - If a library has been modified after parts or packages from it have been + added to a schematic or board, the new command UPDATE can be used to + automatically update all used library objects with their latest version + (see "Help Update"). + - The UPDATE command can be selected from the "Library" pulldown menu in a + board or schematic, or from the context menu of a library in the Control + Panel. It is also possible to drag&drop a library from the Control Panel + onto a schematic or board drawing and perform the update that way. + +* Bill Of Material: + + - The User Language Program 'bom.ulp' to generate the "Bill Of Material" + has been rewritten. It now has a dialog in which the user can + interactively generate the BOM, pulling in additional data from a + user defined database file. Use "RUN bom.ulp" and click on the "Help" + button for more information. + +* Generating Outlines for milling prototypes: + + - The User Language Program 'outlines.ulp' can be used to generate the data + necessary to control a milling machine for generating a prototype board. + +* User Language: + + - The User Language now supports user defined dialogs as well as standard + file dialogs and message boxes. + - The RUN command now accepts additional arguments that are available + to the ULP as 'argc' and 'argv' parameters. + - Data can now be read into a ULP. + - The new lookup() function can be used to perform database lookups. + - The new fileglob() function can be used to do a directory search. + - The new fileerror() function can be used check for I/O errors. + - The 'exit()' function can now have a string parameter which is sent + to the editor window and executed as a command string. + - ULPs can now include other ULP files with the new #include directive. + - The new #usage directive can be used to provide information about a ULP. + - The new object UL_DEVICESET is used to access device sets in a library. + - The builtin statement device() has been renamed to deviceset() to conform + with the new library structure. + - UL_POLYGON has a new member 'rank'. + - UL_POLYGON has new members 'contours()' and 'fillings()' to access + the calculated polygon data. The 'dxf.ulp' now uses these new members + to draw the actual shape of calculated polygons. + - The new object UL_CLASS is used to access net classes. + - UL_BOARD and UL_SCHEMATIC have new members 'classes()'. + - UL_NET and UL_SIGNAL have new members 'class'. + - UL_WIRE has new members 'style' and 'pieces()'. + - UL_TEXT has a new member 'font'. + - The data members 'diameter' and 'shape' of UL_PAD and UL_VIA are now layer + dependent and thus require the layer number for which the data shall be + retrieved, because depending on the new Design Rules diameters and shapes + of pads and vias can be different in the various layers. The syntax is + now, e.g., pad.diameter[LAYER_TOP] to get the pad diameter in layer 1. + Existing User Language Programs need to be edited to conform to this new + syntax. See "Help UL_PAD/UL_VIA" for further details. + The 'dxf.ulp' now generates the pads and vias separately in each active + layer, including stopmask layers. + - The data members UL_SMD.dx and UL_SMD.dy can now have an optional layer + index to retrieve the dimensions in the t/bStop and t/bCream mask layers. + The 'dxf.ulp' now generates mask data if those layers are active. + - New builtin constants INT_MAX, INT_MIN, REAL_EPSILON, REAL_MAX and REAL_MIN + (see "Help/User Language/Builtins/Builtin Constants"). + +* Script files: + + - Script files can now call other scripts (as long as no recursive + call is made). + - Script files can now contain comments. Everything after (and uncluding) + a '#' character will be ignored. '#' characters inside quotes have no + special meaning. Note that script labels (e.g. "BRD:") and continuation + characters ("\") must not be followed by anything else than white space, + and therefore can not be followed by comments (otherwise they loose + their special meaning). + - The 'eagle.scr' file is now first searched for in the current project + directory (which is equal to the current working directory in case there + is no project open) and then in the directories listed in the Control + Panel's "Options/Directories/Scripts". + +* Autorouter: + + - The Autorouter can now route "through" signal polygons (this can be + controlled by the new cost factor 'cfPolygon'). A side effect of this + is that a connection that has been made by the polygon before the + Autorouter was started may be lost if a track generated by the Autorouter + "splits" the polygon. Therefore, even if the Autorouter reaches 100%, + the final result (after recalculating the polygon by RATSNEST) may be + below 100%. + - The Autorouter control parameters are now stored inside the board file. + They can be saved to and loaded from external files via the Autorouter + dialog. Existing control files will be automatically read and stored in + the board file when updating files from previous versions (the old *.ctl + file then becomes obsolete and will not be read when the autorouter is + started - any changes made to such a file with a text editor are ignored!). + - The Autorouter and DRC now use the same set of Design Rules. The old + Autorouter parameters are stored in their corresponding DRC parameters, + except for the following: + + + Instead of the separate 'mdWireDimension' and 'mdViaDimension' there is + now only a single 'Copper/Dimension' parameter. This parameter will be + set to the last of the two 'md*' parameters from the *.ctl file (which + typically is 'mdViaDimension'). + + The 'mdWireRestrict' and 'mdViaRestrict' parameters are ignored because + the minimum distance between any copper (except pads and smds) and a + restrict area is now 0. + + The 'tpViaDiameter' parameter is ignored because the actual via diameter + is now generated from the via drill and the restring parameters. + + The 'tpWireWidth' and 'tpViaDrill' parameters are stored in the default + net class 0. + + When saving Autorouter control parameters to disk, the minimum distance + parameters are no longer part of that file. + - There can now be any number of 'Optimize' passes. By default there are + now 4 'Optimize' passes. + - Each pass can be separately activated or deactivated. + - The Autorouter can now route different wire widths and minimum distances + simultaneously by using "Net Classes". + - The minimum distance parameters are no longer defined in the Autorouter + dialog, but rather in the Design Rules dialog. + - The track parameters (wire width and via diameter) are now defined in + the Design Rules dialog (absolute minimums) and the Net Classes dialog. + - The minimum routing grid is now 0.02mm (about 0.8mil). + - The default control parameters and the internal handling of cfChangeDir + have been modified to avoid jagged tracks. + - The value 99 for the cfNonPref parameter now causes the router to + completely avoid traces that are not in the preferred direction of the + respective layer. You should carefully decide if this behaviour is really + what you want. To avoid unexpected effects with existing boards, the value + 99 will be silently changed to 98 when updating older files. + - With very small routing grids the Autorouter sometimes routed a little bit + too close towards round pads/vias. + - Sometimes the autorouter didn't go through a gap where, according to the + actual widths and minimum distances, it should have. + +* ADD command: + + - The ADD command can now be used with wildcards ('*' or '?') to find + a specific device. The ADD dialog offers a tree view of the matching + devices, as well as a preview of the device and package variant. + - 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"). + - If a device or package shall be added, and there is already such an object + (with the same name from the same library) in the drawing, an automatic + library update will be performed which replaces the existing object in + the drawing with the current version from the library. + - The new command UPDATE can be used to update all parts in a board or + schematic with modified library versions (see "Help Update"). + +* CHANGE command: + + - CHANGE LAYER for wires and polygons now works between any layers within + packages and symbols. + +* CONNECT command: + + - Pressing the SPACE key in the CONNECT dialog while a list element has + the focus will now perform the 'connect' or 'disconnect' action, + respectively. + +* DELETE command: + + - If the last supply symbol of a given type is deleted from a net segment + that has the same name as the deleted supply pin, that segment is now given + a newly generated name (if there are no other supply symbols still + attached to that segment) or the name of one of the remaining supply + symbols. + +* DISPLAY command: + + - The new parameters '?' and '??' can be used to control what happens if + a layer that is given in a DISPLAY command does not exist in the current + drawing. See "Help Display" for details. + +* GROUP command: + + - If the selected group is empty, the GROUP command no longer displays + a message box saying "Group is empty". It rather prompts that message + in the status bar (with a beep) and stays active for a new group + definition. + +* ERC command: + + - The ERC now lists the package names when reporting parts/elements with + inconsistent packages. + - The ERC now 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-/backannotation will still + be performed, but the supply pin configuration should be checked! + - The ERC now checks for missing junctions and overlapping wires and pins. + +* ERRORS command: + + - The ERRORS dialog is no longer modal (it stays "on top" of the editor + window) and can be kept open while resuming normal editing in the editor + window. + - The various error types are now listed more detailed. + +* EXPORT command: + + - The EXPORT can now export image files (BMP, PNG, etc.). + See "Help/EXPORT" for details. + +* NET and BUS command: + + - 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 + (in previous versions the user had to click twice to end a net wire). + The same applies to a bus wire that is placed at a point where there + is already another bus wire. 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 a bus 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. + +* PASTE command: + + - When pasting objects into a drawing that already contains earlier + (different) versions of these objects, an automatic library update will be + performed which replaces the existing objects in the drawing with the new + versions from the paste buffer. + +* PRINT command: + + - The PRINT dialog's "Page setup" now allows border values that are smaller + than the initial values derived from the printer driver. To get back to + the original default you can enter '0'. Note, though, that your actual + printer may not be able to print that close to the page limits. + - The printer settings are no longer stored in the project file, but are now + stored in the user parameters ('eaglerc'). + +* REMOVE command: + + - The REMOVE command can now handle device, symbol and package names with + extension (for example REMOVE name.pac). If the name is given without + extension, you have to be in the respective mode to remove an object + (i.e. editing a package if you want to remove packages). + +* RENAME command: + + - The RENAME command now allows '.' in names. + - The RENAME command can now handle device, symbol and package names with + extension (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). + +* REPLACE command: + + - The REPLACE command can no longer be used with active forward- and + backannotation. This is due to the now complete definition of a device + set with all its package variants. Use the CHANGE PACKAGE command to select + one of the defined package variants, or use the UPDATE command to update a + package with a modified version from the same library. + +* SET command: + + - The SET options for Thermal and Annulus parameters as well as the Solder + Stop and Cream mask data have been removed. + These values are now defined in the Design Rules. + - The SET variables DRC_SHOW and DRC_COLOR are now obsolete (progress in the + Design Rule Check is now displayed in a progress bar). + - The SET variable MAX_ERROR_ZOOM is now obsolete. The ERRORS dialog is no + longer modal (it stays "on top" of the editor window) and zooming can be + done with the usual WINDOW commands or buttons. + +* SHOW command: + + - Highlighted objects are now kept highlighted during subsequent window + operations. + - Pressing ESCape in the SHOW command now lowlights the currently highlighted + object. + +* USE command: + + - The USE command is now mainly for use in script files. + - The actually used libraries can now be comfortably selected in the + Control Panel. + +* CAM Processor: + + - The CAM Processor no longer supports matrix printers. Use the PRINT + command to print to the system printer. + - The CAM Processor no longer prints schematics. Use the PRINT command instead. + (As of version 4.03 the CAM Processor can print schematics again). + - The command line option -I is no longer available, since the CAM Processor + can now be used freely in the Freeware version. + - Output is now only possible into files. If data shall be sent to a COM + or LPT port under Windows the UNC filename of a queue attached to that + port has to be used. + - If the "Section" text in a CAM Processor section consists of a string + like "Title: Descriptive text...", the "Title" will appear on the section's + tab, while the "Descriptive text..." will only be visible in the "Section" + field. + - CAM Processor jobs can now have a description. + - The diameter of octagonal pads in RS274-X has been increased by a factor of + 1.08239 to compensate for the different interpretation of pad diameters in + EAGLE and RS274-X. + - Wires are no longer shortened in the CAM Processor in order to keep the + drills open. Only devices that can actually remove pixels from the output + can now keep the drills open (currently only the Postscript devices "PS" + and "EPS" can do this). + - The new CAM Processor device PS_INVERTED can be used to produce inverted + Postscript output. + +* Parameter storage: + + - User specific parameters are now stored in an "eaglerc" file. + At program start, parameters are read (in the given sequence) from the + files + + /eaglerc (Linux and Windows) + /etc/eaglerc (Linux only) + $HOME/.eaglerc (Linux) + $HOME/eaglerc.usr (Windows) + + where means the directory that contains the EAGLE program file. + If no environment variable HOME is defined, the will be used + instead. When the program ends, the current values of all parameters + (if any of them have changed) are written to the eaglerc file in the HOME + directory. + Under Linux "$HOME" stands for the environment variable HOME. + Under Windows "$HOME" is either 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. + - The file 'eagle.cfg' is not read any more. + - Key assignments made with the ASSIGN command are now stored in the user + specific parameters. + +* Command line options: + + - The options '-A' and '-T' are now obsolete (thermal and annulus data + is now defined in the Design Rules). + - The options '-B' and '-M' are now obsolete (solder stop and cream mask + data is now defined in the Design Rules). + - The option '-C' is now obsolete, since the CAM Processor no longer + supports matrix printers (all printing is done with the PRINT command). + - The options '-Z' and '-Y' are now obsolete (drill symbols are + configured in "Options/Set/Drill" and are stored in the user specific + "eaglerc" file). + +* Bugfixes: + + - When printing several sheets at once, the >SHEET always displayed the + number of the currently edited sheet. + - When saving a file with more than one dot in its name the name was + cut off. + +* Miscellaneous: + + - The DOS and OS/2 platforms is no longer supported. + - Due to changes in the file data structure you will most likely be asked + whether to run the ERC when loading a board/schematic pair created with + an earlier version of EAGLE. + - Files from earlier versions of EAGLE may contain library objects with + the same names. This was caused by PASTE or ADD operations with modified + devices or packages. Version 4 no longer allows this to happen, and + therefore needs to make sure updated files do not contain multiple + objects with the same name. In order to assure this, the update routine + adds the '@' character and a number to the names of such library objects. + - The library editor can now edit devices and symbols, even if the user's + license does not contain the schematic module. + - Avoiding multiple 'Save?' prompts for boards and schematics that are + connected via f/b annotation. + - When a file is modified while updating from a previous version the resulting + update report is now presented in a separate text window. + diff --git a/eagle-5.7.0/doc/eagle.1 b/eagle-5.7.0/doc/eagle.1 new file mode 100644 index 0000000..27f014c --- /dev/null +++ b/eagle-5.7.0/doc/eagle.1 @@ -0,0 +1,257 @@ +'\" t +.\" ** The above line should force tbl to be a preprocessor ** +.\" Man page for EAGLE +.\" +.\" Copyright (C) 2010, CadSoft Computer GmbH +.TH EAGLE 1 "EAGLE Layout Editor" "CadSoft" "PCB Design Tool" +.SH NAME +eagle \- Easily Applicable Graphical Layout Editor +.SH SYNOPSIS +.B eagle +[options] [file] [layers] +.SH DESCRIPTION +.B EAGLE +is a printed circuit board (PCB) design tool that combines schematic capture, +layout editing and autorouting. +.SH OPTIONS +Most of the options are intended for use with the CAM Processor in command line +mode. + +Options are either +.I switches +that turn a certain feature on or off, or set a certain +.I parameter +to a given value. +.I Switch +options are followed by a '+' +or '-' sign, which turns the given option 'on' or 'off', respectively. +In the following list of all options +.I switch +options are shown with their +default value. If a switch option is 'off' by default, it can be turned 'on' +by simply using the option character (the '+' sign is implicit). + +With +.I tolerance +options values that have a positive sign define positive tolerances, negative +signs define negative tolerances, and values without a sign define 'plus/minus' +tolerances. +.TP +.BI \-C\ command +Executes the given command in an editor window. +A file name (board, schematic or library) must be given, so that an editor +window will be opened in which the command can be executed. +.TP +.BI \-D\ tolerance +Tolerance for draw type apertures (0.1 = 10%). + +Default: 0 +.TP +.BI \-E\ tolerance +Tolerance for drills (0.1 = 10%). + +Default: 0 +.TP +.BI \-F\ tolerance +Tolerance for flash type apertures (0.1 = 10%). + +Default: 0 +.TP +.BI \-N +No command line prompts. +Turns off the command line message prompts in the CAM Processor. This is mostly +useful for fully automated CAM batch jobs. +.TP +.B \-O+ +Optimize movement for pen plotters, photo plotters and drill stations. + +Default: on +.TP +.BI \-P\ layer=pen +For pen plotters this option defines which layer is to be printed with +which pen (color). +.I layer +can range from 1..255, +.I pen +can range from 1..255. +.TP +.BI \-R\ rackfile +Drill rack file. +.TP +.BI \-S\ scriptfile +Define a different startup script file name. + +Default: eagle.scr +.TP +.BI \-W\ wheelfile +Aperture wheel file. +.TP +.B \-X- +Execute the CAM Processor in command line mode. +.TP +.B \-a- +Emulate annulus apertures. +This option only works if the +.B -e +option is also turned on. + +Default: off +.TP +.B \-c+ +Assert positive coordinates ("auto fit"). +Moves the output data so that everything is located in the +positive coordinate area. + +Default: on +.TP +.BI \-d\ device +CAM Processor output device (\fB-d?\fR for a list of all known devices). +.TP +.B \-e- +Emulate unavailable apertures with smaller ones. Options +.B -a +and +.B -t +can be used to define whether annulus and thermal apertures should also +be emulated. + +Default: off +.TP +.B \-f+ +Fill pads. Defines wehther the drill holes of pads and vias should be +filles or not. + +Default: on +.TP +.BI \-h\ pageheight +Page height (inch) for printers. +.TP +.B \-m- +Mirror output. +Note that this can cause negative coordinates, so you might want to make sure that the +.B -c +option is on. + +Default: off +.TP +.BI \-o\ outputfile +Output filename. +.TP +.BI \-p\ pendiameter +Pen diameter (mm) for pen plotters. + +Default: 0 +.TP +.B \-q- +Quick plot, which draws only the outlines of objects. + +Default: off +.TP +.B \-r- +Rotate output by 90 degrees. +Note that this can cause negative coordinates, so you might want to make sure that the +.B -c +option is on. + +Default: off +.TP +.BI \-s\ scalefactor +Scale factor for the generated output. Values smaller than 1.0 generate a shrinked +output. If +.I scalefactor +has a negative (integer) value, the actual scale factor will be selected automatically +so that the drawing will fit on the number of pages given by the absolute value of +.IR scalefactor . + +Default: 1.0 +.TP +.B \-t- +Emulate thermal apertures. +This option only works if the +.B -e +option is also turned on. + +Default: off +.TP +.B \-u- +Output upside down (i.e. rotate by 180 degrees). +Note that this can cause negative coordinates, so you might want to make sure that the +.B -c +option is on. + +Default: off +.TP +.BI \-v\ penvelocity +Pen velocity (in cm/s, for pen plotters that support this feature). The default value of 0 +selects the plotter's default pen velocity. + +Default: 0 +.TP +.BI \-w\ pagewidth +Page width (inch) for printers. +.TP +.BI \-x\ offset +Offset in x direction (inch). + +Default: 0.0 +.TP +.BI \-y\ offset +Offset in y direction (inch). + +Default: 0.0 +.SH DIRECTORIES +By default, EAGLE is installed in +.B /opt/eagle-5.7.0 +(if installed as user 'root'), or +.B ~/eagle-5.7.0 +(under the user's home directory), +but you can install it into any other directory you might prefer. +.PP +The following subdirectories are located below this directory: +.TS +tab (@); +l l. +\fBbin\fR@Executable programs +\fBcam\fR@CAM Processor files +\fBdoc\fR@Documentation files +\fBdru\fR@Design Rules files +\fBlbr\fR@Part library files +\fBprojects\fR@Example board and schematic files +\fBscr\fR@Script files +\fBulp\fR@User Language Programs +.TE +.SH HELP SYSTEM +Context sensitive online help information is provided as an HTML file. +.PP +EAGLE implements its own help viewer, but the help file can of course also be viewed +with any other HTML viewer. +.SH SIGNALS +.TP +.B SIGTERM +Terminates the program. Any modified files will +.B not +be saved. +.SH EXIT STATUS +.TP +.B 0 +Successful program execution. +.TP +.B 1 +CAM Processor warning. +.TP +.B >1 +An error has occurred. +.SH FILES +.TP +.B ~/.eaglerc +User specific parameters are stored in the file +.I .eaglerc +under the user's home directory. +.SH VERSION +This is EAGLE version 5.7.0. +.SH AUTHOR +.B +EAGLE +is produced by CadSoft Computer GmbH (http://www.cadsoft.de). + +Copyright (c) 1988-2010 CadSoft Computer GmbH. diff --git a/eagle-5.7.0/doc/elektro-tutorial.pdf b/eagle-5.7.0/doc/elektro-tutorial.pdf new file mode 100644 index 0000000..63db19a Binary files /dev/null and b/eagle-5.7.0/doc/elektro-tutorial.pdf differ diff --git a/eagle-5.7.0/doc/library_de.txt b/eagle-5.7.0/doc/library_de.txt new file mode 100644 index 0000000..1ddb8e2 --- /dev/null +++ b/eagle-5.7.0/doc/library_de.txt @@ -0,0 +1,37 @@ +Hinweise zu den aktuellen EAGLE-Bibliotheken +============================================ + +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. + +Vor der Installation einer neuen EAGLE-Version sollten Sie vorsichtshalber +alle bisherigen Bibliotheken sichern, insbesondere wenn Sie eigene +Modifikationen durchgeführt haben. + +Weitere Bibliotheken, die nicht oder noch nicht zum offiziellen +EAGLE-Lieferumfang gehören, finden Sie im Download-Bereich von +CadSofts Internet-Seiten (www.cadsoft.de). + +Bibliotheken lassen sich sehr elegant mit Hilfe der Befehle EXPORT und +SCRIPT bearbeiten. + +Alle Packages sind so angelegt, dass tNames die Bauteilnamen und tPlace +den restlichen Platinenaufdruck enthält. Für den Dokumentationsdruck +wird zusätzlich der Layer tDocu eingeblendet. Er enthält zusätzliche +grafische Elemente, die nicht auf die Platine gedruckt werden sollen. + +Für Bauelemente, die auf der Unterseite der Platine plaziert wurden, +wandern die entsprechenden Informationen automatisch in die jeweiligen +b...-Layer (also bNames usw.). + +Weitere Verwendung von Layern: + +Holes: Montagebohrungen. +t/bFinish: Veredelung, z. B. AT-Slot +t/bStop: Flächen ohne Lötstoplack, z. B. für Lötbrücken +t/bRestrict: Fläche ohne Leiterbahnen, z. B. um Montagebohrung +t/bKeepout: Fläche ohne Bauteile bzw. Begrenzung innerhalb der kein + anderes Bauteil plaziert werden darf (siehe + IPC-Bibliotheken) diff --git a/eagle-5.7.0/doc/library_en.txt b/eagle-5.7.0/doc/library_en.txt new file mode 100644 index 0000000..b1684f8 --- /dev/null +++ b/eagle-5.7.0/doc/library_en.txt @@ -0,0 +1,38 @@ +GENERAL COMMENTS ABOUT EAGLE COMPONENT LIBRARIES +================================================ + +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. + +Please note that libraries are not necessarily identical to former +libraries with the same name. Therefore, it is advisable to back up +your old libraries before installing the new ones. + +Additional new libraries, that have not yet been officially released, +can be found on CadSoft's internet site in the download section +(www.cadsoftusa.com). + +Please note, that libraries can be edited very conveniently with the +commands EXPORT and SCRIPT. + +All packages are defined in such a way, that tNames contains the +names of the components and tPlace contains the additional pc board +print. For the documentation print, tDocu is selected additionally. +This layer contains graphical objects which must not be printed onto +the board. + +If components are placed on the bottom side of the board, the related +information changes from t.. to b.. layers (e.g. from tNames to +bNames). + +Further usage of layers: + +Holes: mounting holes +t/bFinish: finish, e.g. AT-Slot +t/bStop: areas without solder stop mask, e.g. for bridging connections +t/bRestrict: area without tracks, e.g. around mounting holes +t/bKeepout: area without components, e.g. EURO-19" diff --git a/eagle-5.7.0/doc/license_de.txt b/eagle-5.7.0/doc/license_de.txt new file mode 100644 index 0000000..5c16f43 --- /dev/null +++ b/eagle-5.7.0/doc/license_de.txt @@ -0,0 +1,24 @@ +EAGLE LIZENZVEREINBARUNG + +Die folgende Lizenzvereinbarung zwischen der CadSoft Computer GmbH und Ihnen, dem Benutzer des Programms EAGLE, gilt als geschlossen, sobald Sie das Programm installiert haben. + +Nutzungsrecht + +Dem Käufer wird ein Nutzungsrecht für das Programm EAGLE (jedoch kein Eigentumsrecht) entsprechend dem Inhalt des User Labels und dem entsprechenden Eintrag im Programm übertragen. Das Nutzungsrecht beschränkt sich auf die im User-Label und im Programm eingetragene Person, Firma oder Institution. Das Recht der Vervielfältigung von Programm und zugehörigen Handbüchern verbleibt bei der CadSoft Computer GmbH. Eine Abänderung des Programms oder der Handbücher ist nicht gestattet. + +Freeware Lizenz + +Die "Freeware" Version von EAGLE ist beschränkt auf "non-profit" Anwendungen und auf die Programm-Evaluierung. "non-profit" bedeutet, sobald Sie durch die Verwendung von EAGLE Geld verdienen, müssen Sie das Programm registrieren! Dadurch ist jedem die Möglichkeit gegeben, EAGLE Light für seine privaten Zwecke zu verwenden. Ebenso können Schüler und Studenten diese Version für Ausbildungszwecke benutzen. Auch im kommerziellen Umfeld kann diese Version benutzt werden, solange es nur darum geht, die Tauglichkeit des Programms für den vorgesehenen Zweck zu testen. Sobald es aber für kommerzielle Zwecke eingesetzt wird, muß es registriert werden. +Leiterplattenhersteller, die lediglich Produktionsdaten (z.B. Gerber-Dateien) von Board-Dateien erstellen wollen, die sie von EAGLE-Anwendern erhalten haben, können dies ebenfalls mit der Freeware Version tun. + +Garantie + +Die CadSoft Computer GmbH garantiert, daß alles von ihr gelieferte Material in einwandfreiem Zustand ist, und ersetzt defekte Lieferungen, falls innerhalb von 10 Tagen nach Erhalt berechtigte Gewährleistungs-Ansprüche beim Händler geltend gemacht werden. + +Haftung + +Eine Eignung des Vertragsgegenstandes für einen bestimmten Verwendungszweck wird nicht zugesichert. Eine Haftung des Lieferanten für Mangel-Folgeschäden ist ausgeschlossen. + +Vertragsende + +Ein Verstoß des Käufers gegen die Bestimmungen dieses Vertrages zieht die automatische und sofortige Beendigung des Nutzungsrechts nach sich, wobei der Käufer die an ihn gelieferten Programme und Handbücher an den Lieferanten zurückzugeben hat. Außerdem hat der Käufer sämtliche Kopien des Programms auf Datenträgern beliebiger Art nicht-rekonstruierbar zu löschen. diff --git a/eagle-5.7.0/doc/license_en.txt b/eagle-5.7.0/doc/license_en.txt new file mode 100644 index 0000000..2c8bf37 --- /dev/null +++ b/eagle-5.7.0/doc/license_en.txt @@ -0,0 +1,27 @@ +EAGLE LICENSE AGREEMENT + +This is a legal agreement between you, the end user, and CadSoft Computer, which markets software products under the trademark EAGLE. CadSoft Computer, shall be referred to in this Agreement as CadSoft. If you do not agree to the terms of this Agreement, promptly return the disk package and accompanying items (including written materials and containers) to the place you obtained them for a full refund. +USE OF THIS PRODUCT CONSTITUTES YOUR ACCEPTANCE OF THESE TERMS AND CONDITIONS AND YOUR AGREEMENT TO ABIDE BY THEM. + +Grant of License + +CadSoft grants to you the right to use one copy of the accompanying EAGLE software program and any and all updates that you may receive (the Software) on a single computer or workstation. You may, however, install the Software on more than one computer or on a file server provided you do not operate the Software on more than one computer or workstation at a time. Multi user licenses are limited to the given number of concurrent users. + +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. +Board manufacturers ("board houses") who only want to produce production data (like, e.g. Gerber files) from board files they receive from EAGLE users, may also use the Freeware version to do this. + +Copyright + +The Software is owned by CadSoft and is protected by United States copyright laws and international treaty provisions. Therefore, you must treat the Software like any other copyrighted material (e.g., a book or musical recording). You may not copy the written materials accompanying the Software. + +Other Restrictions + +You may not rent or lease the Software, but you may transfer your stand-alone copy of the Software and accompanying written materials on a permanent basis provided you retain no copies and the recipient agrees to the terms of this Agreement. Any such transfer must include all updates and prior versions of the Software and accompanying written materials, and notice must be given by you to CadSoft that such transfer has taken place. You may not reverse engineer, decompile, disassemble, or create derivative works based on the Software for any purpose other than creating an adaptation to the Software as an essential step in its utilization for your own use. You acknowledge Cadsoft's claim that the Software embodies valuable trade secrets proprietary to CadSoft; you may not disclose any information regarding the internal operations of the Software to others. + +Limited Warranty and Liability + +CadSoft warrants that the Software, as updated and when properly used, will operate in all material respects in conformity with the documentation for such Software, and the Software media will be free of defects, for 30 (thirty) days from the date of shipment of such version to you. In the event of a failure to meet the foregoing limited warranty, your sole remedy in the event of nonconformity of the Software, at CadSoft's option, shall be replacement of the defective materials or a refund of the license fees paid for the affected Software. + +CadSoft disclaims all other warranties and conditions, express or implied. No warranty is made regarding the results of any Software or services, or that the Software's functionality will meet your requirements. In no event will CadSoft or its suppliers be liable for any loss or inaccuracy of data or any loss of profits. diff --git a/eagle-5.7.0/doc/manual_de.pdf b/eagle-5.7.0/doc/manual_de.pdf new file mode 100644 index 0000000..d19c176 Binary files /dev/null and b/eagle-5.7.0/doc/manual_de.pdf differ diff --git a/eagle-5.7.0/doc/manual_en.pdf b/eagle-5.7.0/doc/manual_en.pdf new file mode 100644 index 0000000..02fd5c7 Binary files /dev/null and b/eagle-5.7.0/doc/manual_en.pdf differ diff --git a/eagle-5.7.0/doc/tutorial_de.pdf b/eagle-5.7.0/doc/tutorial_de.pdf new file mode 100644 index 0000000..afb21b4 Binary files /dev/null and b/eagle-5.7.0/doc/tutorial_de.pdf differ diff --git a/eagle-5.7.0/doc/tutorial_en.pdf b/eagle-5.7.0/doc/tutorial_en.pdf new file mode 100644 index 0000000..a5d3779 Binary files /dev/null and b/eagle-5.7.0/doc/tutorial_en.pdf differ diff --git a/eagle-5.7.0/dru/DESCRIPTION b/eagle-5.7.0/dru/DESCRIPTION new file mode 100644 index 0000000..18baf44 --- /dev/null +++ b/eagle-5.7.0/dru/DESCRIPTION @@ -0,0 +1,17 @@ + +Design-Regeln +

+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. + + +Design Rules +

+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. + diff --git a/eagle-5.7.0/dru/default.dru b/eagle-5.7.0/dru/default.dru new file mode 100644 index 0000000..e8f4bdd --- /dev/null +++ b/eagle-5.7.0/dru/default.dru @@ -0,0 +1,73 @@ +description[de] = EAGLE Design Rules\n

\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 : + PCA9505.DEV + PCA9506.DEV + TSSOP56-6.PAC + +2009-04-20 + * con-molex.lbr: Eagle 5.4.8 + added: + 71436-XX64.DEV + 71436-XX64.PAC + +2009-04-16 + * linear.lbr: Eagle 5.4.8 + changed description: LM387.DEV + Low Noise Dual Preamplifier + +2009-04-08 + * nanotec.lbr: Eagle 5.4.8 + added: + IMT-901.DEV + SIL25.PAC + +2009-03-23 + * e-elektro-zeichnungsrahmen.lbr: Eagle 5.4.6 + added: + RAHMEN_A3_12Z-28S.DEV + +2009-03-23 + * transistor-neu-to92.lbr: Eagle 5.4.6 + corrected symbol PNP: + BDX54.DEV + +2009-03-23 + * transistor.lbr: Eagle 5.4.6 + corrected symbol PNP: + BDX54.DEV + +2009-03-23 + * ftdichip.lbr: Eagle 5.4.4 + corrected pin directions: FT232R.SYM + +2009-03-11 + * sharp.lbr: Eagle 5.4.4 + added: + IR2D07.DEV + IR2D20U.DEV + IR2E49U6.DEV + IR2E53Y7.DEV + PQ6CB11X1CP.DEV + DIL28-4.PAC + HQFN052.PAC + PQ6CB11X1CP.PAC + VQFN036-P-0606.PAC + WLP035-X-3636.PAC + +2009-03-11 + * led.lbr: Eagle 5.4.4 + added: + GM1BW76340A.DEV + GM1BW78140A.DEV + GM1WA55311A.DEV + GM5BW96385A.DEV + GM5WA94310A.DEV + GM1BW78140A.PAC + GM1WA55311A.PAC + GM5BW96385A.PAC + GM5WA94310A.PAC + +2009-03-09 + * maxim.lbr: Eagle 5.4.3 + added: + MAX10*.DEV + MAX103*.DEV + +2009-03-06 + * con-subd.lbr: Eagle 5.4.1 + added: + M25-HD-20.DEV + M25-HD-20.PAC + +2009-02-27 + * linear.lbr: Eagle 5.4.1 + OPA2*.DEV added technology '134' -> variant: + PA, UA + added description: http://focus.ti.com/lit/ds/symlink/opa2134.pdf + OPA4*.DEV added technology '134' -> variant: + PA, UA + added description: http://focus.ti.com/lit/ds/symlink/opa2134.pdf + +2009-02-26 + * memory-micron.lbr: Eagle 5.4.1 + added: + MT48LC16M16A2.DEV + MT48LC32M8A2.DEV + MT48LC64M4A2.DEV + TSOP54-400.PAC + +2009-02-25 + * linear.lbr: Eagle 5.4.1 + added: + UA78M*.DEV + +2009-02-25 + * texas.lbr: Eagle 5.4.1 + added: + TPS773*.DEV + TPS774*.DEV + TPS6300*.DEV + DGK-R-PDSO-G8.PAC + DRC-S-PVSON-N10.PAC + +2009-02-18 + * davicom.lbr: Eagle 5.4.1 + added: + DM9008.DEV + QF100L-20X14.PAC + +2009-02-18 + * texas.lbr: Eagle 5.4.1 + added: + MSP430F22*2IDA.DEV + MSP430F22*4IDA.DEV + TSSOP38_R-PDSO-G38-DA.PAC + +2009-02-16 + * con-vg.lbr: Eagle 5.4.1 + added: + FABC30.DEV + MABC30.DEV + FABC30.PAC + MABC30.PAC + +2009-02-11 + * burr-brown.lbr: Eagle 5.4.1 + added: + ADS7828.DEV + TSSOP16-PW.PAC + +2009-02-06 + * linear-technology.lbr: Eagle 5.4.1 + added: + LTM8023.DEV + LGA50.PAC + +2009-02-05 + * allegro.lbr: Eagle 5.4.1 + added: + A3901.DEV + DFN10-3X3.PAC + +2009-02-05 + * linear-technology.lbr: Eagle 5.4.1 + added cream frame on SMD: + DFN14-4X3DE.PAC + +2009-02-04 + * microchip.lbr: Eagle 5.4.1 + Description extended: + 25*.DEV + +2009-01-28 + * 74xx-us.lbr: Eagle 5.4.0 + added: + 74C923.DEV + 74C922.DEV + +2009-01-28 + * 74xx-eu.lbr: Eagle 5.4.0 + added: + 74C923.DEV + 74C922.DEV + +2009-01-26 + * renesas.lbr: Eagle 5.4.0 + added: + SH7203.DEV + QFP3232-240CU.PAC + +2009-01-23 + * analog-devices.lbr: Eagle 5.4.0 + added: + ADIS16209.DEV + LGA16.PAC + +2009-01-23 + * avago.lbr: Eagle 5.4.0 + added: + HCPL-7800.DEV + DIL08.PAC + DIP8.PAC + +2009-01-22 + * infineon.lbr: Eagle 5.4.0 + added: + PG-VQFN-108-2.PAC + +2009-01-20 + * atmel.lbr: Eagle 5.4.0 + changed pin AGND to GND@1 in symbol MEGA64.SYM used at: + MEGA64.DEV + changed pin AGND to GND@1 in symbol MEGA64-M.SYM used at: + MEGA64-M.DEV + changed pin AGND to GND@1 in symbol MEGA169.SYM used at: + MEGA169.DEV + changed pin AGND to GND@1 in symbol MEGA169-M.SYM used at: + MEGA169-M.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M8535-A.SYM used at: + MEGA8535.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M8535-P.SYM used at: + MEGA8535-P.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M8535-A_M.SYM used at: + MEGA8535_P.DEV + +2009-01-19 + * lantronix.lbr: Eagle 5.4.0 + Drill corrected: + XPORT.PAC + +2009-01-16 + * atmel.lbr: Eagle 5.4.0 + # + Message added by James Zhao, 15.01.2009 2:20 + Dear customer, + The ATmega 8 16 32 and 128 has no dedicated Analog Ground pin. The AGND in + the Block Diagram is a cut and paste error. It should be GND. + Best Regards, + James Zhao + Atmel Technical Support Team + # + changed pin AGND to GND in symbol 23-I/O.SYM used at: + MEGA8.DEV + changed pin AGND to GND in symbol 23-I/O_MI.SYM used at: + MEGA8-MI.DEV + changed pin AGND to GND in symbol 23-I/O-2.SYM used at: + MEGA8-P.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M16-A.SYM used at: + MEGA16.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M16-A_M.SYM used at: + MEGA16-M.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M16-P.SYM + MEGA16-P.DEV + changed pin AGND to GND@1 in symbol 32-I/O-M32-A.SYM used at: + MEGA32.DEV + changed pin AGND to GND@1 in symbol MEGA32-M.SYM used at: + MEGA32-M.DEV + changed pin AGND to GND@1 in symbol MEGA32-P.SYM used at: + MEGA32-P.DEV + changed pin AGND to GND@1 in symbol MEGA128.SYM used at: + MEGA128.DEV + changed pin AGND to GND@1 in symbol MEGA128-M.SYM used at: + MEGA128-M.DEV + +2009-01-13 + * holtek.lbr: Eagle 5.4.0 + added: + HT600.DEV + HT604L.DEV + HT614.DEV + HT680.DEV + HT692.DEV + HT6207.DEV + DIL18.PAC + DIL20.PAC + SOP18.PAC + SOP20.PAC + +2009-01-13 + * optocoupler.lbr: Eagle 5.4.0 + added: + H11L*M.DEV + +2009-01-08 + * con-molex.lbr: Eagle 5.3.0 + added: + 43160-*02.DEV + 43160-*03.DEV + 43160-*04.DEV + 43160-*05.DEV + 43160-*06.DEV + 43160-XX02.PAC + 43160-XX03.PAC + 43160-XX04.PAC + 43160-XX05.PAC + 43160-XX06.PAC + +2009-01-07 + * mems.lbr: Eagle 5.3.0 + added: + MXR9500.DEV + LCC16.PAC + +2008-12-05 + * con-avx.lbr: Eagle 5.3.5 + added: + 00917?001.DEV + 00917?002.DEV + 00917?003.DEV + 009175002.DEV + 009175003.DEV + 009175002.PAC + 009175003.PAC + 009176002.PAC + 009176003.PAC + 009177001.PAC + 009177002.PAC + 009177003.PAC + +2008-12-04 + * con-tyco.lbr: Eagle 5.3.5 + added: + C-5353652-36-3.DEV + C-5353652-36-3.PAC + +2008-12-04 + * texas.lbr: Eagle 5.3.5 + added: + MSP430F5*.DEV + MSP430F54*.DEV + PN_S-PQFP-G80.PAC + PZ_S-PQFP-G100.PAC + +2008-12-04 + * etx-board.lbr: Eagle 5.3.5 + added: + COMEXPRESS_S.DEV + COMEXRESS.DEV + C-5353652-36-3.PAC + +2008-12-01 + * on-semiconductor.lbr: Eagle 5.3.4 + added: + CAT4101.DEV + TO263_5.PAC + +2008-12-01 + * diode.lbr: Eagle 5.3.4 + added: + CGRM400*-G.DEV + SOD-123_MINI-SMA.PAC + +2008-11-28 + * con-stocko.lbr: Eagle 5.3.4 + added: + MKS1852-6-0-202.DEV + MKS1853-6-0-303.DEV + MKS1854-6-0-404.DEV + MKS1855-6-0-505.DEV + MKS1856-6-0-606.DEV + MKS1857-6-0-707.DEV + MKS1858-6-0-808.DEV + MKS1859-6-0-909.DEV + MKS1860-6-0-1010.DEV + MKS1861-6-0-1111.DEV + MKS1862-6-0-1212.DEV + MKS1863-6-0-1313.DEV + MKS1864-6-0-1414.DEV + MKS1865-6-0-1515.DEV + MKS1866-6-0-1616.DEV + MKS1867-6-0-1717.DEV + MKS1868-6-0-1818.DEV + MKS1870-6-0-2020.DEV + MKS1852-6-0-202.PAC + MKS1853-6-0-303.PAC + MKS1854-6-0-404.PAC + MKS1855-6-0-505.PAC + MKS1856-6-0-606.PAC + MKS1857-6-0-707.PAC + MKS1858-6-0-808.PAC + MKS1859-6-0-909.PAC + MKS1860-6-0-1010.PAC + MKS1861-6-0-1111.PAC + MKS1862-6-0-1212.PAC + MKS1863-6-0-1313.PAC + MKS1864-6-0-1414.PAC + MKS1865-6-0-1515.PAC + MKS1866-6-0-1616.PAC + MKS1867-6-0-1717.PAC + MKS1868-6-0-1818.PAC + MKS1870-6-0-2020.PAC + +2008-11-28 + * texas.lbr: Eagle 5.3.4 + added: + LM4041.DEV + LM4041*I.DEV + DBZ_R-PDSO-G3.PAC + DCK_R-PDSO-G5.PAC + LP_O-PBCY-W3.PAC + +2008-11-27 + * rectifier.lbr: Eagle 5.4.0 + added: + MB*S.DEV + SOIC-4.PAC + +2008-11-26 + * texas.lbr: Eagle 5.3.3 + added: + D_R-PDSO-G08.PAC + D_R-PDSO-G14.PAC + D_R-PDSO-G16.PAC + renamed: + R-PDSO-G08.PAC -> PW_R-PDSO-G08.PAC + R-PDSO-G14.PAC -> PW_R-PDSO-G14.PAC + R-PDSO-G16.PAC -> PW_R-PDSO-G16.PAC + R-PDSO-G20.PAC -> PW_R-PDSO-G20.PAC + R-PDSO-G24.PAC -> PW_R-PDSO-G24.PAC + R-PDSO-G28.PAC -> PW_R-PDSO-G28.PAC + +2008-11-25 + * avago.lbr: Eagle 5.3.3 + added: + HCTL-1100.DEV + HCTL-1100?.DEV + DIL40.PAC + PLCC44.PAC + +2008-11-25 + * transistor.lbr: Eagle 5.3.3 + added: + 2SC458.DEV + 2SC945.DEV + 2SC1740.DEV + 2SC1815.DEV + 2SC3330.DEV + +2008-11-25 + * buzzer.lbr: Eagle 5.3.3 + added: + EFB?.DEV + EFBAA40D101.PAC + EFBRD22C41.PAC + EFBRD22C413.PAC + EFBRD24C411.PAC + +2008-11-13 + * lc-filter.lbr: Eagle 5.3.2 + added: + KN?21.DEV + KNF21.PAC + +2008-11-13 + * diode.lbr: Eagle 5.3.2 + added: + MBR0520LT.DEV + +2008-11-11 + * microchip.lbr: Eagle 5.3.1 + added: + PIC16F62*.DEV + PIC16F628SS.DEV + SS20.PAC + +2008-11-11 + * rf-solutions.lbr: Eagle 5.3.1 + added: + RF600?8.DEV + RF600D.DEV + RF600E.DEV + DIL08.PAC + DIL18.PAC + SO-08.PAC + SO-18W.PAC + +2008-11-10 + * linear.lbr: Eagle 5.3.1 + added: + MCP1703.DEV + MCP1703*.DEV + extended cream mask: + SOT89.PAC + +2008-11-10 + * analog-devices.lbr: Eagle 5.3.1 + added: + ADSP_21367.DEV + ADSP_21367-208.DEV + BP-256.PAC + LQFP208.PAC + +2008-11-10 + * memory-micron.lbr: Eagle 5.3.1 + added: + MT48LC4M32B2.DEV + TSOP86.PAC + +2008-11-10 + * burr-brown.lbr: Eagle 5.3.1 + corrected pin connection: + INA2126 pin 14 <-> 13 swapped + +2008-11-06 + * xilinx-xcv.lbr: Eagle 5.3.1 + added: + XCV50ES_BG256.DEV + XCV50ES_CS144.DEV + XCV50ES_FG256.DEV + XCV50ES_PQ240.DEV + XCV50ES_TQ144.DEV + XCV50E_CS144.DEV + XCV50E_FG256.DEV + XCV50E_PQ240.DEV + XCV50_BG256.DEV + XCV50_CS144.DEV + XCV50_FG256.DEV + XCV50_PQ240.DEV + XCV50_TQ144.DEV + XCV100ES_BG256.DEV + XCV100ES_CS144.DEV + XCV100ES_FG256.DEV + XCV100ES_PQ240.DEV + XCV100ES_TQ144.DEV + XCV100E_BG352.DEV + XCV100E_CS144.DEV + XCV100E_FG256.DEV + XCV100E_PQ240.DEV + XCV100_BG256.DEV + XCV100_CB228.DEV + XCV100_FG256.DEV + XCV100_PQ240.DEV + XCV100_TQ144.DEV + XCV150ES_BG256.DEV + XCV150ES_BG352.DEV + XCV150ES_FG256.DEV + XCV150ES_FG456.DEV + XCV150ES_PQ240.DEV + XCV150_BG256.DEV + XCV150_BG352.DEV + XCV150_FG256.DEV + XCV150_FG456.DEV + XCV150_PQ240.DEV + XCV200ES_BG256.DEV + XCV200ES_BG352.DEV + XCV200ES_FG256.DEV + XCV200ES_FG456.DEV + XCV200ES_PQ240.DEV + XCV200E_BG352.DEV + XCV200E_CS144.DEV + XCV200E_FG256.DEV + XCV200E_FG456.DEV + XCV200E_PQ240.DEV + XCV200_BG256.DEV + XCV200_BG352.DEV + XCV200_FG256.DEV + XCV200_FG456.DEV + XCV200_PQ240.DEV + XCV300ES_BG352.DEV + XCV300ES_BG432.DEV + XCV300ES_FG456.DEV + XCV300ES_PQ240.DEV + XCV300E_BG352.DEV + XCV300E_BG432.DEV + XCV300E_FG256.DEV + XCV300E_FG456.DEV + XCV300E_PQ208.DEV + XCV300E_PQ240.DEV + XCV300E_VQ100.DEV + XCV300_BG352.DEV + XCV300_BG432.DEV + XCV300_CB228.DEV + XCV300_FG456.DEV + XCV300_PQ240.DEV + XCV400ES_BG432.DEV + XCV400ES_BG560.DEV + XCV400ES_FG676.DEV + XCV400ES_HQ240.DEV + XCV400E_BG432.DEV + XCV400E_BG560.DEV + XCV400E_FG676.DEV + XCV400E_PQ240.DEV + XCV400_BG432.DEV + XCV400_BG560.DEV + XCV400_FG676.DEV + XCV400_HQ240.DEV + XCV405E_BG560.DEV + XCV405E_FG676.DEV + XCV600ES_BG432.DEV + XCV600ES_BG560.DEV + XCV600ES_FG676.DEV + XCV600ES_FG680.DEV + XCV600ES_HQ240.DEV + XCV600E_BG432.DEV + XCV600E_BG560.DEV + XCV600E_FG676.DEV + XCV600E_FG680.DEV + XCV600E_FG900.DEV + XCV600E_HQ240.DEV + XCV600E_PQ208.DEV + XCV600E_VQ100.DEV + XCV600_BG432.DEV + XCV600_BG560.DEV + XCV600_CB228.DEV + XCV600_FG676.DEV + XCV600_FG680.DEV + XCV600_HQ240.DEV + XCV800ES_BG432.DEV + XCV800ES_BG560.DEV + XCV800ES_FG676.DEV + XCV800ES_FG680.DEV + XCV800ES_HQ240.DEV + XCV800_BG432.DEV + XCV800_BG560.DEV + XCV800_FG676.DEV + XCV800_FG680.DEV + XCV800_HQ240.DEV + XCV812E_BG560.DEV + XCV812E_FG900.DEV + XCV1000ES_BG560.DEV + XCV1000ES_FG556.DEV + XCV1000ES_FG680.DEV + XCV1000E_BG728.DEV + XCV1000E_FG680.DEV + XCV1000E_FG860.DEV + XCV1000E_FG900.DEV + XCV1000E_FG1156.DEV + XCV1000E_HQ240.DEV + XCV1000E_PQ208.DEV + XCV1000E_VQ100.DEV + XCV1000_BG560.DEV + XCV1000_CG560.DEV + XCV1000_FG556.DEV + XCV1000_FG680.DEV + XCV1600E_BG560.DEV + XCV1600E_FG680.DEV + XCV1600E_FG860.DEV + XCV1600E_FG900.DEV + XCV1600E_FG1156.DEV + XCV2000E_BG560.DEV + XCV2000E_FG680.DEV + XCV2000E_FG860.DEV + XCV2000E_FG1156.DEV + XCV2000E_PQ208.DEV + XCV2000E_VQ100.DEV + XCV2600E_FG1156.DEV + XCV3200E_CG1156.DEV + XCV3200E_FG1156.DEV + BG256.PAC + BG352.PAC + BG432.PAC + BG560.PAC + BG728.PAC + CB228.PAC + CG560.PAC + CG1156.PAC + CS144.PAC + FG256.PAC + FG456.PAC + FG556.PAC + FG676.PAC + FG680.PAC + FG860.PAC + FG900.PAC + FG1156.PAC + HQ240.PAC + PQ208.PAC + PQ240.PAC + TQ144.PAC + VQ100.PAC + +2008-11-06 + * st-microelectronics.lbr: Eagle 5.3.1 + added: + LIS3L02AQ3.DEV + QFN-44-7X7.PAC + +2008-11-06 + * crystal.lbr: Eagle 5.3.1 + added: + SM77H.DEV + SM77H.PAC + TC46.DEV + TC47.DEV + TC48.DEV + TC49.DEV + TC46.PAC + TC47.PAC + TC48.PAC + TC49.PAC + +2008-11-05 + * resistor-dil.lbr: Eagle 5.3.0 + added: + 2R-N.DEV + EXB2HV.PAC + EXB14V.PAC + EXB18V.PAC + EXB24V.PAC + EXB28V.PAC + EXB34V.PAC + EXB38V.PAC + EXBN8V.PAC + EXBS8V.PAC + EXBV4V.PAC + EXBV8V.PAC + +2008-11-03 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 5.3.0 + changed description: + BFT11.DEV + +2008-11-03 librarian@cadsoft.de + * con-neutrik_ag.lbr: Eagle 5.3.0 + changed description: + NC3FBH2.PAC + +2008-11-03 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 5.3.0 + changed description: + R0805.PAC + R0805W.PAC + C0805.PAC + +2008-11-03 librarian@cadsoft.de + * ref-packages.lbr: Eagle 5.3.0 + changed description: + R0805.PAC + R0805W.PAC + C0805.PAC + +2008-11-03 librarian@cadsoft.de + * rcl.lbr: Eagle 5.3.0 + changed description: + R0805.PAC + R0805W.PAC + C0805.PAC + +2008-10-31 + * crystal.lbr: Eagle 5.3.0 + added: + SG-615.DEV + SG-615.PAC + +2008-10-30 + * linear.lbr: Eagle 5.3.0 + added: + MC1350.DEV + TA7358P.DEV + SIP9-P-2.54A.PAC + +2008-10-30 + * transistor-fet.lbr: Eagle 5.3.0 + added: + 2SK241.DEV + 2SK439.DEV + ?548*.DEV + 2SK241.PAC + SPAK.PAC + +2008-10-30 + * texas.lbr: Eagle 5.3.0 + added: + BQ27210.DEV + BQ27010.DEV + DRK_S-PDSO-N10.PAC + +2008-10-30 + * con-stewart.lbr: Eagle 5.3.0 + added: + SI-50170.DEV + SI-50170.PAC + +2008-10-30 + * led.lbr: Eagle 5.3.0 + added: + *W51M-TH.DEV + W51-COOL.PAC + *W51M.DEV + KA-3528ASYC.PAC + W51.PAC + changed stop & cream mask: + WB57B.PAC + +2008-10-28 + * toshiba.lbr: Eagle 5.3.0 + added: + T6963C.DEV + QFP67-P-1420-0.80.PAC + +2008-10-28 + * display-lcd.lbr: Eagle 5.3.0 + added: + MGLS2401280TZ.DEV + MGLS2401280TZ.PAC + +2008-10-27 + * atmel.lbr: Eagle 5.3.0 + changed wire in layer 21 layer to 51: + 8S1.PAC + +2008-10-27 + * texas.lbr: Eagle 5.3.0 + added: + MSP430FW42*.DEV + +2008-10-27 + * atmel.lbr: Eagle 5.3.0 + renamed pins in symbols ATMEGA644.SYM and ATMEGA644E.SYM: + (PCINT26/INT0)PD0 -> (PCINT24/RXD0)PD0 + (PCINT24/RXD0)PD2 -> (PCINT26/INT0)PD2 + +2008-10-24 librarian@cadsoft.de + * switch-alps.lbr: Eagle 5.3.0 + renamed symbol: + GEHÄUSEANSCHLUß => GEHAEUSEANSCHLUSS + deleted layer > 100 + +2008-10-23 librarian@cadsoft.de + * inductors.lbr: Eagle 5.3.0 + added: + CR32.DEV + DR73.DEV + DR74.DEV + DR125.DEV + DR127.DEV + SLF7045.DEV + CR32.PAC + DR73.PAC + DR74.PAC + DR125.PAC + DR127.PAC + SLF7045.PAC + +2008-10-23 librarian@cadsoft.de + * transistor-power.lbr: Eagle 5.3.0 + added: + FDN360P.DEV + SUPER-SOT3.PAC + +2008-10-23 librarian@cadsoft.de + * texas.lbr: Eagle 5.3.0 + added: + TPS770*.DEV + SOT23-DBV.PAC + ISO7220.DEV + ISO7221.DEV + ISO7240.DEV + ISO7241.DEV + ISO7242.DEV + +2008-10-22 librarian@cadsoft.de + * con-sullinselectronics.lbr: Eagle 5.3.0 + added: + 050_610_HF-5/10.PAC + 050_610_HF-6/12.PAC + 050_610_HF-9/18.PAC + 050_610_HF-10/20.PAC + 050_610_HF-13/26.PAC + 050_610_HF-14/28.PAC + 050_610_HF-15/30.PAC + 050_610_HF-20/40.PAC + 050_610_HF-22/44.PAC + 050_610_HF-25/50.PAC + 050_610_HF-30/60.PAC + 050_610_HF-34/68.PAC + 050_610_HF-35/70.PAC + 050_610_HF-40/80.PAC + 050_610_HF-45/90.PAC + 050_610_HF-50/100.PAC + 050_610_HH-5/10.PAC + 050_610_HH-10/20.PAC + 050_610_HH-20/40.PAC + 050_610_HH-25/50.PAC + 050_610_HL-5/10.PAC + 050_610_HN-5/10.PAC + 050_610_?-5/10.DEV + 050_610_?-6/12.DEV + 050_610_?-9/18.DEV + 050_610_?-10/20.DEV + 050_610_?-13/26.DEV + 050_610_?-14/28.DEV + 050_610_?-15/30.DEV + 050_610_?-20/40.DEV + 050_610_?-22/44.DEV + 050_610_?-25/50.DEV + 050_610_?-30/60.DEV + 050_610_?-34/68.DEV + 050_610_?-35/70.DEV + 050_610_?-40/80.DEV + 050_610_?-45/90.DEV + 050_610_?-50/100.DEV + +2008-10-22 librarian@cadsoft.de + * texas.lbr: Eagle 5.3.0 + added: + BQ27500.DEV + BQ27501.DEV + DRZ.PAC + moved pins on grid in symbol: + TLC7226.SYM + +2008-10-20 librarian@cadsoft.de + * solomon-systech.lbr: Eagle 5.3.0 + added: + SSD1926.DEV + SQFP-S-14X14-128.PAC + +2008-10-20 librarian@cadsoft.de + * battery.lbr: Eagle 5.3.0 + renamed variant ' to '': + SL-340/B3.6V.DEV + +2008-10-20 librarian@cadsoft.de + * burr-brown.lbr: Eagle 5.3.0 + corrected package variant: + INA2126U.DEV + +2008-09-30 librarian@cadsoft.de + * microchip.lbr: Eagle 5.3.0 + added: + DSPIC33FJ12GP202.DEV + DSPIC33FJ12MC202.DEV + DSPIC33FJ128GP710.DEV + DSPIC33FJ256MC510.DEV + MRF24J40.DEV + PIC24FJ16GA002.DEV + PIC24FJ16GA002_QFN.DEV + PIC24FJ32GA002.DEV + PIC24FJ32GA002_QFN.DEV + PIC24FJ32GA004.DEV + PIC24FJ48GA002.DEV + PIC24FJ48GA002_QFN.DEV + PIC24FJ48GA004.DEV + PIC24FJ64GA002.DEV + PIC24FJ64GA002_QFN.DEV + PIC24FJ64GA004.DEV + PIC24FJ64GB110.DEV + PIC24FJ256GB106.DEV + PIC24FJ256GB108.DEV + PIC24HJ12GP202.DEV + PIC24HJ64GP506.DEV + PIC32MX320F*H.DEV + PIC32MX320F032H.DEV + PIC32MX320F128L.DEV + PIC32MX340F*H.DEV + PIC32MX360F256L.DEV + PIC32MX360F512L.DEV + PIC32MX420F032H.DEV + PIC32MX440F128L.DEV + PIC32MX440F256H.DEV + PIC32MX460F256L.DEV + PIC32MX460F512L.DEV + QFN40ML6X6MM.PAC + PIC24FJ256GB110.DEV + +2008-09-29 librarian@cadsoft.de + * inductor-neosid.lbr: Eagle 5.3.0 + renamed package variant: + 71T-PIN241-90'; -> 71T-241-90 + +2008-09-26 librarian@cadsoft.de + * diode.lbr: Eagle 5.3.0 + added: + 1N4148.DEV Variant DO35-7 + +2008-09-24 librarian@cadsoft.de + * con-molex.lbr: Eagle 5.2.3 + corrected: + 55091-2009.PAC + 55091-1809.PAC + 55091-1609.PAC + 55091-1409.PAC + 55091-1209.PAC + 55091-1009.PAC + 55091-0909.PAC + 55091-0809.PAC + 55091-0709.PAC + 55091-0609.PAC + 55091-0509.PAC + 55091-0409.PAC + 55091-0309.PAC + 55091-0209.PAC + 55091-6809.PAC + renamed: + 55091-6809.PAC -> 55091-0689.PAC + 55091-6809.DEV -> 55091-0689.DEV + +2008-09-23 librarian@cadsoft.de + * national-semiconductor.lbr: Eagle 5.2.3 + added: + LM5015.DEV + TSSOP14.PAC + deleted: + WIRE on layer 18 in LQA036A.PAC + +2008-09-23 librarian@cadsoft.de + * con-hirose.lbr: Eagle 5.2.2 + deleted: + DF10-31S-2DSA.PAC + +2008-09-22 librarian@cadsoft.de + * con-jst.lbr: Eagle 5.2.2 + added: + ?4B-ZR.DEV + B4B-ZR.PAC + S4B-ZR.PAC + +2008-09-22 librarian@cadsoft.de + * con-amp.lbr: Eagle 5.2.2 + changed description "grid 3.0 mm": + 1445055-2.PAC + 1445055-3.PAC + 1445055-4.PAC + 1445055-5.PAC + 1445055-6.PAC + 1445055-7.PAC + 1445055-8.PAC + 1445055-9.PAC + 1445055-10.PAC + +2008-09-08 librarian@cadsoft.de + * microchip.lbr: Eagle 5.2.0 + added: + MCP3202.DEV + +2008-09-08 librarian@cadsoft.de + * linear.lbr: Eagle 5.2.0 + added: + MCP601.DEV + MCP602.DEV + MCP603.DEV + MCP604.DEV + SOT23-6.PAC + +2008-09-01 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 5.2.0 + corrected tDocu: + 0603-ARV.PAC + +2008-08-29 librarian@cadsoft.de + * relay.lbr: Eagle 5.2.0 + added: + BT-*-S.DEV + FINDER-30.22.DEV + FINDER-43.61.DEV + FTR-K1C.DEV + FTR-LYC.DEV + BT-XX-S.PAC + FINDER-30.22.PAC + FINDER-43.41.PAC + FINDER-43.61.PAC + FTR-K1A.PAC + FTR-K1C.PAC + FTR-LYC.PAC + +2008-08-27 librarian@cadsoft.de + * optocoupler.lbr: Eagle 5.2.0 + changed symbol OK-TRN.SYM and connection, + added variant T, S: + MOC30*.DEV + +2008-08-26 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 5.2.0 + added: + LIS3LV02DQ.DEV + QFPN-28.PAC + +2008-08-26 librarian@cadsoft.de + * altera-cyclone-III.lbr: Eagle 5.2.0 + added: + EP3C120F780.DEV + FBGA780.PAC + +2008-08-26 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 5.2.0 + changed drill size to 1.2mm: + MULTIWATT-11.PAC + MULTIPOWERSO-30.PAC + +2008-08-26 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 5.2.0 + added: + 4X0402ARV341.PAC + deleted package: + 0402-ARV.PAC + +2008-08-22 librarian@cadsoft.de + * con-phoenix-350.lbr: Eagle 5.2.0 + rotated symbol by 180 degrees: + SCHRAUBKLEMME.SYM + +2008-08-19 librarian@cadsoft.de + * fairchild-semic.lbr: Eagle 5.2.0 + added: + FSB50450.DEV + SPM23AA.PAC + +2008-08-19 librarian@cadsoft.de + * austriamicrosystems.lbr: Eagle 5.2.0 + added: + AS8500.DEV + SO16W.PAC + +2008-08-14 librarian@cadsoft.de + * analog-devices.lbr: Eagle 5.1.5 + added: + AD9951.DEV + +2008-08-12 librarian@cadsoft.de + * con-phoenix-508.lbr: Eagle 5.1.5 + added: + MKDSN1,5/2-5,08.DEV + MKDSN1,5/3-5,08.DEV + MKDSN1,5/4-5,08.DEV + MKDSN1,5/5-5,08.DEV + MKDSN1,5/6-5,08.DEV + MKDSN1,5/7-5,08.DEV + MKDSN1,5/8-5,08.DEV + MKDSN1,5/9-5,08.DEV + MKDSN1,5/10-5,08.DEV + MKDSN1,5/2-5,08.PAC + MKDSN1,5/3-5,08.PAC + MKDSN1,5/4-5,08.PAC + MKDSN1,5/5-5,08.PAC + MKDSN1,5/6-5,08.PAC + MKDSN1,5/7-5,08.PAC + MKDSN1,5/8-5,08.PAC + MKDSN1,5/9-5,08.PAC + MKDSN1,5/10-5,08.PAC + +2008-08-11 librarian@cadsoft.de + * con-phoenix-350.lbr: Eagle 5.1.5 + moved origin: + 1751316.PAC + +2008-08-11 librarian@cadsoft.de + * burr-brown.lbr: Eagle 5.1.5 + added: + RCV420.DEV + +2008-08-11 librarian@cadsoft.de + * led.lbr: Eagle 5.1.5 + added: + KA-3528ASYC.PAC + added variant: + LEDKA-3528ASYC + +2008-08-08 librarian@cadsoft.de + * diode.lbr: Eagle 5.1.4 + renamed variant: + '' -> DO35-10 + added variant: + DO35-7 + +2008-08-08 librarian@cadsoft.de + * rectifier.lbr: Eagle 5.1.4 + added: + TO-269AA.PAC + added variant: + RECTIFIER-S40 + RECTIFIER-S80 + RECTIFIER-S125 + RECTIFIER-S250 + RECTIFIER-S380 + RECTIFIER-S500 + +2008-08-07 librarian@cadsoft.de + * quantum-research-group.lbr: Eagle 5.1.3 + added: + QT9701B.DEV + +2008-07-30 librarian@cadsoft.de + * 45xx.lbr: Eagle 5.1.2 + new power gate with second VDD + VSS: + 4521.DEV + +2008-07-29 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 5.1.2 + added new variants: + 4R-N.DEV + added: + YC124.PAC + +2008-07-29 librarian@cadsoft.de + * docu-dummy.lbr: Eagle 5.1.2 + changed description: LCD DISPLAY -> LC DISPLAY + LCD31/2.DEV + +2008-07-28 librarian@cadsoft.de + * con-tycoelectronics.lbr: Eagle 5.1.2 + added: + 6ESRM-P.PAC + 6ESRM-P.DEV + +2008-07-25 librarian@cadsoft.de + * supply1.lbr: Eagle 5.1.2 + changed wire: + GNDIO.SYM + +2008-07-25 librarian@cadsoft.de + * con-phoenix-350.lbr: Eagle 5.1.2 + added: + 1751248.PAC + 1751251.PAC + 1751264.PAC + 1751277.PAC + 1751280.PAC + 1751293.PAC + 1751303.PAC + 1751316.PAC + 1751248.DEV + 1751251.DEV + 1751264.DEV + 1751277.DEV + 1751280.DEV + 1751293.DEV + 1751303.DEV + 1751316.DEV + +2008-07-25 librarian@cadsoft.de + * con-phoenix-3.81.lbr: Eagle 5.1.2 + added: + 1705566.PAC + 1705605.PAC + 1705621.PAC + 1705647.PAC + 1789650.PAC + 1803549.PAC + 1803565.PAC + 1827185.PAC + 1827240.PAC + 1827266.PAC + 1705566.DEV + 1705605.DEV + 1705621.DEV + 1705647.DEV + 1789650.DEV + +2008-07-24 librarian@cadsoft.de + * led.lbr: Eagle 5.1.2 + added: + *_T679-?-1.DEV + +2008-07-23 librarian@cadsoft.de + * supertex.lbr: Eagle 5.1.1 + added: + HV9910B.DEV + SOIC-08LG.PAC + SOIC-16NG.PAC + +2008-07-23 librarian@cadsoft.de + * con-amp.lbr: Eagle 5.1.1 + added: + 213598-2.DEV + 213598-2.PAC + +2008-07-21 librarian@cadsoft.de + * linear.lbr: Eagle 5.1.1 + added: + LM336.DEV + +2008-07-21 librarian@cadsoft.de + * omnivision.lbr: Eagle 5.1.1 + added: + OV6920.DEV + +2008-07-18 librarian@cadsoft.de + * atmel.lbr: Eagle 5.1.1 + renamed: + MLF20-TH.PAC -> MLF20-5X5-TH.PAC + MLF20.PAC -> MLF20-5X5.PAC + added: + T7024.DEV + +2008-07-18 librarian@cadsoft.de + * linear-technology.lbr: Eagle 5.1.1 + renamed: + DFN14-4X3.PAC -> DFN14-4X3DE.PAC + added: + LTC2482.DEV + LTC2486.DEV + DFN14-4X3.PAC + +2008-07-18 librarian@cadsoft.de + * solomon-systech.lbr: Eagle 5.1.1 + added: + SSD1961.DEV + +2008-07-16 librarian@cadsoft.de + * linx.lbr: Eagle 5.1.1 + added: + ANT-XXX-SP.DEV + RXD-XXX-KH2.DEV + RXM-XXX-LR.DEV + TXD-XXX-KH2.DEV + ANT-XXX-SP.PAC + RXD-XXX-KH2.PAC + RXM-XXX-LR.PAC + TXD-XXX-KH2.PAC + +2008-07-15 librarian@cadsoft.de + * texas.lbr: Eagle 5.1.0 + added: + BQ24120.DEV + BQ24123.DEV + BQ24125.DEV + QFN20_3,5X4,5.PAC + +2008-07-08 librarian@cadsoft.de + * con-lumberg.lbr: Eagle 5.0.3 + added: + KLBR4.DEV + +2008-07-04 librarian@cadsoft.de + * triac.lbr: Eagle 5.0.3 + added: + BT136.DEV + TIC206.DEV + +2008-07-04 librarian@cadsoft.de + * maxim.lbr: Eagle 5.0.3 + added: + MAX6520.DEV + SOT23.PAC (copy ref-packages) + +2008-07-04 librarian@cadsoft.de + * optocoupler.lbr: Eagle 5.0.3 + added: + MOC30*M.DEV + +2008-07-04 librarian@cadsoft.de + * con-deutsch.lbr: Eagle 5.0.3 + added: + DRC13-70P-B027.DEV + +2008-07-04 librarian@cadsoft.de + * microchip.lbr: Eagle 5.0.3 + added: + MCP355*.DEV + +2008-07-03 librarian@cadsoft.de + * microchip.lbr: Eagle 5.0.3 + added: + PIC18F6*J5.DEV + PIC18F8*J5.DEV + PIC18F6*J6.DEV + PIC18F8*J6.DEV + PIC18F9*J6.DEV + PIC12F683.DEV + DFN8-4X4.PAC + +2008-07-03 librarian@cadsoft.de + * display-kingbright.lbr: Eagle 5.0.3 + added: + SA39-11SRWA.PAC + +2008-07-03 librarian@cadsoft.de + * led-7-segment.lbr: Eagle 5.0.3 + added: + LA-401*D.DEV + LA-401*N.DEV + LA-401.PAC + S4301B.PAC + +2008-07-03 librarian@cadsoft.de + * texas.lbr: Eagle 5.0.3 + added: + TPS65023.DEV + TPS65020.DEV + QFN40-5X5.PAC + QFN40-6X6.PAC + +2008-07-03 librarian@cadsoft.de + * rcl.lbr: Eagle 5.0.3 + L-EU.DEV & L-US.DEV + new package variants: + IR-2 + IR-4 + IRF-1 + IRF-3 + IRF-24 + IRF-36 + IRF-46 + LAL02 + LAL0 + LAL03KH + LAL04 + LAL04KB + LAN02KR + LAP02KR + TFI0204 + TFI0305 + TFI0307 + TFI0410 + TFI0510 + +2008-07-02 librarian@cadsoft.de + * relay.lbr: Eagle 5.0.3 + added: + G5V-2.DEV + +2008-07-02 librarian@cadsoft.de + * linear.lbr: Eagle 5.0.3 + added: + BA612.DEV + +2008-07-02 librarian@cadsoft.de + * rcl.lbr: Eagle 5.0.3 + CPOL-EU.DEV CPOL-US.DEV + new package variants: + UD-4x5,8.PAC + UD-5x5,8.PAC + UD-6,3x5,8.PAC + UD-6,3x7,7.PAC + UD-8x108.PAC + UD-10x10.PAC + +2008-07-02 librarian@cadsoft.de + * linear-technology.lbr: Eagle 5.0.3 + added: + LTC3610.DEV + LTC3611.DEV + renamed gate G$2 -> 'P' + +2008-06-27 librarian@cadsoft.de + * ref-packages.lbr: Eagle 5.0.3 + added: + QFN40-7X7.PAC + +2008-06-26 librarian@cadsoft.de + * con-dil.lbr: Eagle 5.0.3 + changed text marker R-cables 18P: + IC18P.PAC + +2008-06-25 librarian@cadsoft.de + * led.lbr: Eagle 5.0.3 + added: + ?W5KM.DEV + W5KM.PAC + +2008-06-25 librarian@cadsoft.de + * transistor-power.lbr: Eagle 5.0.3 + added: + IRFI540NPBF.DEV + +2008-06-25 librarian@cadsoft.de + * microchip.lbr: Eagle 5.0.3 + corrected pin name: + PIC18F4455_40.SYM + RA3/AN4/VREF+ -> RA3/AN3/VREF+ + RE2/AN3/OESPP -> RE2/AN7/OESPP + corrected pin name: + PIC18F4455_44QFN.SYM + RA3/AN4/VREF+ -> RA3/AN3/VREF+ + RE2/AN3/OESPP -> RE2/AN7/OESPP + corrected pin name: + PIC18F4455_28.SYM + RA3/AN4/VREF+ -> RA3/AN3/VREF+ + corrected pin name: + PIC18F4455_44TQFP.SYM + RA3/AN4/VREF+ -> RA3/AN3/VREF+ + RE2/AN3/OESPP -> RE2/AN7/OESPP + +2008-06-24 librarian@cadsoft.de + * con-kycon.lbr: Eagle 5.0.3 + added: + KLDVX-0202-.DEV + KLDVX-0202-A.PAC + KLDVX-0202-B.PAC + KLDVX-0202-C.PAC + +2008-06-24 librarian@cadsoft.de + * rectifier.lbr: Eagle 5.0.3 + renamed: + DB?10*G.DEV -> DB?*G.DEV + renamed variant: + "DB" -> "DB10" + "S" -> "S10" + new variant: + "L20" + "LS20" + +2008-06-23 librarian@cadsoft.de + * micrel.lbr: Eagle 5.0.3 + added: + MIC2297.DEV + MLF10.PAC + +2008-06-23 librarian@cadsoft.de + * atmel.lbr: Eagle 5.0.3 + added: + TINY13*.DEV + TINY13.DEV + 10M1.PAC + 20M1.PAC + 8S1.PAC + 8S2.PAC + +2008-06-20 librarian@cadsoft.de + * national-semiconductor.lbr: Eagle 5.0.3 + added: + LMX2531LQ-A.DEV + LMX2531LQ-D.DEV + +2008-06-17 librarian@cadsoft.de + * display-kingbright.lbr: Eagle 5.0.1 + added: + SA52-11.PAC + +2008-06-13 librarian@cadsoft.de + * freescale.lbr: Eagle 5.0.0 + added: + MC9S12XF-64.DEV + MC9S12XF-112.DEV + MC9S12XF-144.DEV + MCF53*.DEV + MCF537*.DEV + MAPGBA196.PAC + QFP160.PAC + SQFP-S-10X10-64.PAC + SQFP-S-20X20-112.PAC + SQFP-S-20X20-144.PAC + +2008-06-12 librarian@cadsoft.de + * led.lbr: Eagle 5.0.1 + added: + *W57B.DEV + W57B.PAC + +2008-06-11 librarian@cadsoft.de + * quantum-sensor.lbr: Eagle 5.0.1 + library deleted, chip discontinued + +2008-06-11 librarian@cadsoft.de + * linear-technology.lbr: Eagle 5.0.1 + added: + LTC3610.DEV + QFN64-9X9.PAC + LT1996.DEV + +2008-06-09 librarian@cadsoft.de + * switch.lbr: Eagle 5.0.1 + renamed gates with '-' delimiter: + 55?-1LED.DEV + 55?-2LED.DEV + +2008-05-27 + * lem.lbr: Eagle 5.0.0 + added: + HTS_10-P/SP1.DEV + HTS_10-P/SP1.PAC + +2008-05-21 librarian@cadsoft.de + * analog-devices.lbr: Eagle 5.0.0 + added: + AD7303B.DEV + +2008-05-15 librarian@cadsoft.de + * infineon.lbr: Eagle 5.0.0 + added: + ITS4880R.DEV + PG-DSO-36.PAC + TCA785.DEV + +2008-05-08 librarian@cadsoft.de + * quantum-research-group.lbr: Eagle 5.0.0 + added: + QT1106.DEV + +2008-05-08 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.92.4 + added: + AD8307.DEV + +2008-05-06 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.92.4 + added: + AD8304.DEV + +2008-04-28 librarian@cadsoft.de + * atmel.lbr: Eagle 4.92.4 + added: + AT93C46A-10SI-2.7.DEV + +2008-04-28 librarian@cadsoft.de + * resistor-net.lbr: Eagle 4.92.4 + added: + 742C083.DEV + +2008-04-28 librarian@cadsoft.de + * murata-filter.lbr: Eagle 4.92.4 + added: + CSTCR.DEV + +2008-04-28 librarian@cadsoft.de + * maxim.lbr: Eagle 4.92.4 + added: + MAX7313.DEV + +2008-04-23 librarian@cadsoft.de + * con-cui.lbr: Eagle 4.92.4 + deleted: + PJ-002AH.PAC + +2008-04-18 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.92.4 + added: + LT1996.DEV + +2008-04-16 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.92.4 + added: + LTC3610.DEV + QFN64-9X9.PAC + +2008-04-08 librarian@cadsoft.de + * marks.lbr: Eagle 4.92.7 + renamed: + PASS-SMD.PAC -> PASSER-SMD.PAC + added: + PASSER.PAC + PASSER-HOLE.PAC + +2008-04-07 librarian@cadsoft.de + * microchip.lbr: Eagle 4.92.7 + added: + PIC18F*3.DEV + PIC18F442.DEV + PIC18F452.DEV + +2008-03-19 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.92.4 + corrected pin connection 19 20: + PCF8574.DEV + SSOP20 + +2008-03-13 librarian@cadsoft.de + * *.lbr: Eagle 4.92.4 + set default layer and color with script + +2008-02-19 librarian@cadsoft.de + * led.lbr: Eagle 4.16r2 + added: + LP2C63-ST-RGB-SR0.DEV + +2008-02-06 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.16r2 + added: + P98LPC935.DEV + HVQFN28.PAC + +2008-02-06 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + SN65176.DEV + SOP-08.PAC + +2008-02-04 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r2 + added exposed thermal pad: + UMAX8.PAC + +2008-02-04 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + added: + 4N*?M.DEV + H11A*M.DEV + +2008-01-30 librarian@cadsoft.de + * con-tyco.lbr: Eagle 4.16r2 + added: + C_1720027_A.DEV + +2008-01-29 librarian@cadsoft.de + * con-phoenix-mkds_5.lbr: Eagle 4.16r2 + added: + MKDS_5/3-.DEV + +2008-01-23 librarian@cadsoft.de + * transistor-npn.lbr: Eagle 4.16r2 + deleted: + BDX54.DEV (is a PNP) + +2008-01-22 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.16r2 + added: + HLLGA48.PAC (SOT863-1) + +2008-01-22 librarian@cadsoft.de + * led.lbr: Eagle 4.16r2 + added: + OVSTRGBBCR8.DEC + +2008-01-21 librarian@cadsoft.de + * switch-dil.lbr: Eagle 4.16r2 + added: + 219-12*.DEV up to 219-02*.DEV + +2008-01-21 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + P-Cannel-HEXFET, moved gate pin down: + MFPD.SYM + +2008-01-21 librarian@cadsoft.de + * led.lbr: Eagle 4.16r2 + added: + LRTB_G6SG.DEV + +2008-01-17 librarian@cadsoft.de + * *.lbr: Eagle 4.16r2 + checked all LBR, changed arc cap ROUND and moved arc + +2008-01-17 librarian@cadsoft.de + * con-lemo.lbr: Eagle 4.16r2 + added: + EZG-00-302.DEV + EZG-00-303.DEV + EZG-0B-302.DEV + EZG-0B-303.DEV + EZG-0B-304.DEV + EZG-0B-305.DEV + EZG-0B-306.DEV + EZG-0B-307.DEV + EZG-0B-309.DEV + EZG-0K-302.DEV + EZG-0K-303.DEV + EZG-0K-304.DEV + EZG-0K-305.DEV + EZG-0K-306.DEV + EZG-0K-307.DEV + EZG-0K-309.DEV + EZG-1B-302.DEV + EZG-1B-303.DEV + EZG-1B-304.DEV + EZG-1B-305.DEV + EZG-1B-306.DEV + EZG-1B-307.DEV + EZG-1B-310.DEV + EZG-1B-314.DEV + EZG-1B-316.DEV + EZG-1K-302.DEV + EZG-1K-303.DEV + EZG-1K-304.DEV + EZG-1K-305.DEV + EZG-1K-306.DEV + EZG-1K-307.DEV + EZG-1K-310.DEV + EZG-1K-314.DEV + EZG-1K-316.DEV + EZG-2B-302.DEV + EZG-2B-303.DEV + EZG-2B-304.DEV + EZG-2B-305.DEV + EZG-2B-306.DEV + EZG-2B-307.DEV + EZG-2B-308.DEV + EZG-2B-312.DEV + EZG-2B-314.DEV + EZG-2B-316.DEV + EZG-2B-318.DEV + EZG-2B-319.DEV + EZG-2B-326.DEV + EZG-2B-332.DEV + EZG-2K-302.DEV + EZG-2K-303.DEV + EZG-2K-304.DEV + EZG-2K-305.DEV + EZG-2K-306.DEV + EZG-2K-307.DEV + EZG-2K-308.DEV + EZG-2K-312.DEV + EZG-2K-314.DEV + EZG-2K-316.DEV + EZG-2K-318.DEV + EZG-2K-319.DEV + EZG-2K-326.DEV + EZG-2K-332.DEV + +2008-01-17 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r2 + corrected description: "Reflow solder" to "reflow solder" + +2008-01-15 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + added: from micro-siemens.lbr (Blümel) + SFH.DEV + +2008-01-15 librarian@cadsoft.de + * micro-siemens.lbr: Eagle 4.16r2 + added: copy from micro-siemens_2.lbr + 8*C535.DEV + BTS428L2.DEV + BTS555.DEV + SA*-C161CS.DEV + SA*-C165-RF.DEV + SA*-C165-RM.DEV + SA*-C167-LM.DEV + SA*-C167CR-LM.DEV + SA*-XC167.DEV + SA*-XC167CI.DEV + SA*C167-CR-LM.DEV + SAF-XC2264.DEV + SAK-TC1100*.DEV + SAK-TC1130*.DEV + SAK-TC1762*.DEV + SAK-TC1796.DEV + SAK-TC1910*.DEV + SAK-TC1920*.DEV + SFH6156.DEV + TC-10.DEV + TC10.DEV + TC11IB.DEV + TC191*.DEV + TC1100.DEV + TC1130.DEV + TC1762.DEV + TC1765.DEV + TC1775.DEV + TC1920.DEV + TDA6060*.DEV + TLE6361G.DEV + XC167.DEV + delete SFH.DEV + +2008-01-15 librarian@cadsoft.de + * minicircuits.lbr: Eagle 4.16r2 + added: + HSWA2-30DR+.DEV + +2008-01-15 librarian@cadsoft.de + * filter.lbr: Eagle 4.16r2 + renamed to minicircuits.lbr + +2008-01-14 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + renamed: + OPA2* -> OPA*? + added: + OPA241 + OPA251 + OPA441 + OPA451 + REF102.DEV + +2008-01-14 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + added: + LS7183.DEV LS7184.DEV + +2008-01-11 librarian@cadsoft.de + * flexipanel.lbr: Eagle 4.16r2 + added: + PIXIE_20DS481.DEV + +2008-01-11 librarian@cadsoft.de + * micro-renesas.lbr: Eagle 4.16r2 + added: + R5F211A.DEV + +2008-01-09 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r2 + added: + MAX1551.DEV + MAX1555.DEV + +2008-01-08 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + added: + AEDR-8300-K.DEV + +2008-01-07 librarian@cadsoft.de + * filter.lbr: Eagle 4.16r2 + added: + PBP-10.7.DEV + PLP-90.DEV + PSC-2-1.DEV + PSCQ-2-.DEV + SRA-1.DEV + +2008-01-07 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + PA94.DEV + +2008-01-07 librarian@cadsoft.de + * microwave.lbr: Eagle 4.16r2 + added: + HMC492.DEV QFN16.PAC + +2008-01-07 librarian@cadsoft.de + * con-subd.lbr: Eagle 4.16r2 + changed wire width in tDocu to 0.8128 mm + +2007-12-18 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + changed pad shape LONG -> OFFSET: + DIL04.PAC + +2007-12-13 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + N-HEXFET_?-*.DEV + IRLL014N.DEV + IRLL2705.DEV + N-HEXFET-2D_?-*.DEV + IRLL014N.DEV + IRLL2705.DEV + +2007-12-12 librarian@cadsoft.de + * supply1.lbr: Eagle 4.16r2 + added: + TH.DEV + +2007-12-12 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + IRF3704.DEV + +2007-12-11 librarian@cadsoft.de + * led-lumiled.lbr: Eagle 4.16r2 + added: + LED.DEV + LUXEON_REBEL.DEV + LUXEON_REBEL+COOLPAD.PAC + +2007-12-10 librarian@cadsoft.de + * diode.lbr: Eagle 4.16r2 + added: + DIODE-.DEV -> variant DO-214AC.PAC + +2007-11-10 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.16r2 + added: + 350428-1.PAC + 350429-1.PAC + 350431-1.PAC + 350432-1.PAC + 350759-4.PAC + 350760-4.PAC + 350762-4.PAC + 350792-1.PAC + 350826-1.PAC + 640466-1.PAC + 641828-1.PAC + 641832-1.PAC + +2007-11-10 librarian@cadsoft.de + * display-kingbright.lbr: Eagle 4.16r2 + added: + SA56-11.DEV + SA56-11.PAC + +2007-10-16 librarian@cadsoft.de + * relay.lbr: Eagle 4.16r2 + added: + S102S01.DEV + +2007-10-15 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + BA728.DEV variant SIP8.PAC + +2007-10-12 librarian@cadsoft.de + * lattice.lbr: Eagle 4.16r2 + added: + FPBGA388.PAC + FPBGA_256.PAC + FPBGA_484.PAC + PLCC44.PAC + PLCC84.PAC + PQFP_208.PAC + TQFP44.PAC + TQFP100.PAC + TQFP128.PAC + TQFP144.PAC + +2007-10-11 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r2 + added: + AT91SAM7X*-CU.DEV + renamed: + AT91SAM7X512.DEV -> AT91SAM7X*-AU.DEV + +2007-10-11 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r2 + changed arc cap FLAT to ROUND + +2007-10-11 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + OPA227.DEV + OPA2277.DEV + OPA4277.DEV + DFN08-4x4.PAC + +2007-10-11 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r2 + added: + LT1168.DEV + +2007-10-09 librarian@cadsoft.de + * switch-alps.lbr: Eagle 4.16r2 + script from news-group + +2007-10-08 librarian@cadsoft.de + * memory-idt.lbr: Eagle 4.16r2 + added: + 72T36135M.DEV + BGA240.PAC + BGA260.PAC + BGA324.PAC + +2007-10-08 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r2 + added: + MAX4948.DEV + QFN24.PAC + MAX4906.DEV + UDFN10.PAC + UDFN8.PAC + +2007-10-05 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r2 + added: + PIC18F9*.DEV + PIC18F86*.DEV + +2007-10-05 librarian@cadsoft.de + * 74xx-us.lbr: Eagle 4.16r2 + added: + 74*190 - variant D, NS, PW + 74*191 - variant D, NS, PW + +2007-10-05 librarian@cadsoft.de + * 74xx-eu.lbr: Eagle 4.16r2 + added: + 74*190 - variant D, NS, PW + 74*191 - variant D, NS, PW + +2007-09-27 librarian@cadsoft.de + * memory-sram.lbr: Eagle 4.16r2 + added: + CY7C1049CV33.DEV + CY7C1059DV33.DEV + CY7C1069AV33-B + CY7C1069AV33Z.DEV + FBGA60-8X20.PAC + TSOPII-54.PAC + FBGA36.PAC + TSOPII-Z44.PAC + SOJV36-400.PAC + +2007-09-27 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r2 + added: + DS1621.DEV + SO08-208.PAC + +2007-09-19 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r2 + added: + AD8353.DEV + LFCSP_VD08.PAC + +2007-09-13 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r2 + added: + PIS2816.PAC variant in L-EU/L-US.DEV + +2007-09-11 librarian@cadsoft.de + * allegro.lbr: Eagle 4.16r2 + added: + SLA7075/76/77/78.DEV + +2007-09-11 librarian@cadsoft.de + * switch.lbr: Eagle 4.16r2 + added: + 55?.DEV + 55?1LED.DEV + 55?2LED.DEV + 5501.PAC + 5511.PAC + +2007-09-04 librarian@cadsoft.de + * led-citizen-electronics.lbr: Eagle 4.16r2 + added: + CL652S.DEV + +2007-09-03 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + LMV321?*.DEV + LMV358?*.DEV + LMV324?*.DEV + +2007-08-28 librarian@cadsoft.de + * csr.lbr: Eagle 4.16r2 + added: + LFBGA96.PAC + BC358239A.DEV + +2007-08-24 librarian@cadsoft.de + * dc-dc-converter.lbr: Eagle 4.16r2 + added: + DFA20E.DEV + DFA20.PAC + DFA20.SYM + +2007-08-23 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r2 + added: + *-NPN-2C-.DEV with 2 x collector pins + *-PNP-2C-.DEV + +2007-08-20 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + TPS3803.DEV + TPS3803.SYM + DCK.PAC (SC70-5) + +2007-08-16 librarian@cadsoft.de + * switch.lbr: Eagle 4.16r2 + added: + TL1105.PAC + TLE1105.PAC + TL1105JA.PAC + TL1105JA.PAC + TL1105T.PAC + TL1105SP.PAC + TL1105L-4,3.PAC + +2007-08-16 librarian@cadsoft.de + * display-lcd.lbr: Eagle 4.16r2 + added: + SBLCDA4.DEV + +2007-08-14 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + MSP430FG4618.DEV + +2007-08-07 librarian@cadsoft.de + * photo-elements.lbr: Eagle 4.16r2 + added: + A1050_09.DEV + A1050_11.DEV + A1050_12.DEV + A1050_13.DEV + A1050_14.DEV + A1060_09.DEV + A1060_11.DEV + A1060_12.DEV + A1060_13.DEV + A1060_14.DEV + A1060_31.DEV + A1060_32.DEV + A1060_33.DEV + A1060_34.DEV + B1060_23.DEV + D1160_12.DEV + D1160_13.DEV + D1172_12.DEV + M9960_11A.DEV + M9960_11B.DEV + PHOTOCELLD11.DEV + PHOTOCELLW55.DEV + U1160.DEV + U1160_12.DEV + U1160_13.DEV + U1160_14.DEV + U1160_32.DEV + U1160_33.DEV + V1060_21.DEV + V1060_31.DEV + V1060_32.DEV + VT20N1.DEV + VT20N2.DEV + VT20N3.DEV + VT20N4.DEV + VT23N1.DEV + VT23N2.DEV + VT23N3.DEV + VT30CT.DEV + VT33CT.DEV + VT43N1.DEV + VT43N2.DEV + VT43N3.DEV + VT43N4.DEV + VT50N1.DEV + VT50N2.DEV + VT50N3.DEV + VT53N1.DEV + VT53N2.DEV + VT53N3.DEV + VT80N1.DEV + VT80N2.DEV + VT83CT.DEV + VT83N1.DEV + VT83N2.DEV + VT83N3.DEV + VT83N4.DEV + VT90N1.DEV + VT90N2.DEV + VT90N3.DEV + VT90N4.DEV + VT93N1.DEV + VT93N2.DEV + VT93N3.DEV + VT93N4.DEV + VT935GA.DEV + VT935GB.DEV + VT935GC.DEV + W5560_11.DEV + W5560_12.DEV + W5560_13.DEV + W5560_14.DEV + +2007-08-06 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r2 + added: + SFH618?*.DEV + +2007-08-03 librarian@cadsoft.de + * con-subd.lbr: Eagle 4.16r2 + added: + M09-182.DEV + M09-182S.DEV + M09.590S.DEV + M15-182.DEV + M15-182S.DEV + M15.590S.DEV + M25-182.DEV + M25-182S.DEV + M25.590S.DEV + M37-182.DEV + M37-182S.DEV + M37.590S.DEV + +2007-07-31 librarian@cadsoft.de + * micron.lbr: Eagle 4.16r2 + added: + MT9P031.DEV + +2007-07-25 librarian@cadsoft.de + * con-cui.lbr: Eagle 4.16r2 + added: + MD-40SV.DEV + +2007-07-25 librarian@cadsoft.de + * led.lbr: Eagle 4.16r2 + placed >NAME and >VALUE: + F50380.PAC + added: + DUOLED-XX-XX + +2007-07-11 librarian@cadsoft.de + * microphon.lbr: Eagle 4.16r2 + added: + ELECTRET_MICROPHON-.DEV + +2007-07-11 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 4.16r2 + deleted wires in layer: + TO268.PAC + +2007-07-11 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r2 + replaced circle with SMD 'M': + 2-10H1A.PAC + +2007-07-10 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r2 + deleted wire in layer Top: + SOT89.PAC + SOT89-BCE.PAC + SOT89-ECB.PAC + TO268.PAC + replaced RECT in layer 1 with SMD 'M1': + HVQFN32.PAC + +2007-07-09 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + TPS6120?.DEV + +2007-07-06 librarian@cadsoft.de + * ir.lbr: Eagle 4.16r2 + added: + IR4426.DEV + IR4427.DEV + IR4428.DEV + +2007-07-06 librarian@cadsoft.de + * cirrus-logic.lbr: Eagle 4.16r2 + added: + CS8413.DEV + CS8414.DEV + +2007-07-06 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r2 + centered package: + SO-28L.PAC + +2007-07-06 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r2 + added: + TC4467.DEV + TC4468.DEV + TC4469.DEV + +2007-07-05 librarian@cadsoft.de + * burr-brown.lbr: Eagle 4.16r2 + added: + PCM1792.DEV + PCM1793.DEV + +2007-06-28 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + 78L*.DEV + SOT89.PAC + +2007-06-27 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + DDC232.DEV + PBGA-N64.PAC + +2007-06-21 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r2 + added: + 679105700.DEV + +2007-06-06 librarian@cadsoft.de + * rectifier.lbr: Eagle 4.16r2 + added: + DB?10*G.DEV + DB.PAC + DBS.PAC + +2007-06-06 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r2 + added: + 53460-0629.DEV + +2007-06-05 librarian@cadsoft.de + * con-samtec.lbr: Eagle 4.16r2 + added: + QSE-020-02.DEV + QSE-040-02.DEV + QTE-020.DEV + QTE-040.DEV + +2007-05-30 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.16r2 + changed pin direction IN -> OUT: + LP2950?*.DEV variant ACZ/AC + +2007-05-25 librarian@cadsoft.de + * con-faston.lbr: Eagle 4.16r2 + added: + 62409-1.PAC + +2007-05-24 librarian@cadsoft.de + * con-subd.lbr: Eagle 4.16r2 + added: + 177-009-FEMALE.PAC + 177-009-MALE.PAC + 177-015-212-FEMALE.PAC + 177-015-MALE.PAC + 177-025-FEMALE.PAC + 177-025-MALE.PAC + 177-037-FEMALE.PAC + 177-037-MALE.PAC + 182-009-MALE.PAC + 182-015-MALE.PAC + 182-025-MALE.PAC + 182-037-MALE.PAC + +2007-05-22 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.16r2 + added: + LD117A?*.DEV + +2007-05-21 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.16r2 + added: + TEA5764HN.DEV + +2007-05-16 librarian@cadsoft.de + * con-hirose.lbr: Eagle 4.16r2 + added: + DF9-51S.DEV/PAC + +2007-05-10 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + MFR4*.DEV + +2007-05-10 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16r2 + added: + 3SK59.DEV + 3SK63.DEV + BF960.DE + BF961.DEV + BF981.DEV + TO50.PAC + TO103.PAC + +2007-05-10 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r2 + added: + 2SC1306.DEV + 2SC1307.DEV + 2SC1944.DEV + T-30.PAC + 2SC1969.DEV + 2SC2098.DEV + 2SC2395.DEV + 2-10H1A.PAC + +2007-05-08 librarian@cadsoft.de + * traco-electronic.lbr: Eagle 4.16r2 + included traco1.lbr + completed description + +2007-05-08 librarian@cadsoft.de + * memory-sram.lbr: Eagle 4.16r2 + added: + CY62256LL-?*.DEV + TSOP1-28.PAC + TSOP1-28-R.PAC + +2007-05-07 librarian@cadsoft.de + * transistor-small-signal.lbr: Eagle 4.16r2 + added: + BC847BS.DEV + +2007-05-03 librarian@cadsoft.de + * allegro.lbr: Eagle 4.16r2 + added: + SLA707*M.DEV + A3967SLB.DEV + A3977.DEV + UNC5804.DEV + SLA7052M.DEV + +2007-05-03 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + IRF?5305.DEV + changed variant 'R' D2PAK.PAC with D-PAK_TO252AA.PAC + +2007-05-02 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r2 + changed direction AREF -> PAS: + 32-I/O-M16-A.SYM + 32-I/O-M16-A_M.SYM + 23-I/O.SYM + 23-I/O_MI.SYM + 23-I/O-2.SYM + 32-I/O-M32-A.SYM + 32-I/O-M32-A_M.SYM + 32-I/O-M32-P.SYM + 48-I/O-1.SYM + +2007-04-25 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.16r2 + copied D2PACK from ref-packages.lbr: + variant BD2T: + LM317?*.DEV + +2007-04-25 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + LM386.DEV + LT1007/1037.DEV + +2007-04-24 librarian@cadsoft.de + * diode.lbr: Eagle 4.16r2 + added: + S6058.DEV + S6695-01.DEV + S7379-01.DEV + +2007-04-23 librarian@cadsoft.de + * relay.lbr: Eagle 4.16r2 + added: + G6J*-2?-Y.DEV + G6J-2P-Y.PAC + G6J-2FS-Y.PAC + G6J-2FL-Y.PAC + +2007-04-12 librarian@cadsoft.de + * con-conrad.lbr: Eagle 4.16r2 + added: + 736880-49.DEV + 736880-49.PAC + +2007-04-12 librarian@cadsoft.de + * con-hirschmann.lbr: Eagle 4.16r2 + added: + TOBU3.DEV + TOBU3.PAC + completed description with "RCA Jack" + +2007-04-11 librarian@cadsoft.de + * ground-junctions.lbr: Eagle 4.16r2 + added: + GND-GNDA.DEV + 3GND.DEV + 3GND-1.27MM.PAC + 3GND-2,54MM.PAC + GND-GNDA-1,27MM.PAC + GND-GNDA-1,27MM-0508.PAC + GND-GNDA-2,54M.PAC + +2007-04-10 librarian@cadsoft.de + * con-erni.lbr: Eagle 4.16r2 + added: + Q-063179.DEV + Q-063209.DEV + Q-063210.DEV + Q-114807.DEV + Q-114808.DEV + Q-154818.DEV + Q-154819.DEV + Q-154820.DEV + Q-154821.DEV + Q-154822.DEV + +2007-04-10 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16r2 + centered origin: + SO-8.PAC + added: + SO08-IRF.PAC + +2007-04-05 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r2 + added: + *3524.DEV + deleted: + LM3524.DEV + LM3524.SYM + LM3525M-L.DEV + LM3525M-H.DEV + +2007-04-04 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + TPS6107*.DEV + TSOT23-6_DDC.PAC + +2007-04-04 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r2 + added: + 87758-0216.DEV + 87758-0416.DEV + 87758-0616.DEV + 87758-0816.DEV + 87758-1016.DEV + 87758-1216.DEV + 87758-1416.DEV + 87758-1616.DEV + 87758-1816.DEV + 87758-2016.DEV + 87758-2216.DEV + 87758-2416.DEV + 87758-2616.DEV + 87758-2816.DEV + 87758-3016.DEV + 87758-3216.DEV + 87758-3416.DEV + 87758-3616.DEV + 87758-3816.DEV + 87758-4016.DEV + 87758-4216.DEV + 87758-4416.DEV + 87758-4616.DEV + 87758-4816.DEV + 87758-5016.DEV + +2007-04-04 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r2 + added: + 75ALS176.DEV + +2007-04-02 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r2 + added: + 93*76C.DEV + 93*76?.DEV + MSOP8.PAC + SOT23-6.PAC + DFN-2X3.PAC + +2007-04-02 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r2 + added: + LTC3549.DEV + DFN6-2X3.PAC + +2007-04-02 librarian@cadsoft.de + * crystal.lbr: Eagle 4.16r2 + added: + ASF*.DEV + +2007-03-28 librarian@cadsoft.de + * memory-micron.lbr: Eagle 4.16r2 + added: + MT29F8G08DAA.DEV + TSOP48.PAC + +2007-03-27 librarian@cadsoft.de + * cypress.lbr: Eagle 4.15r2 + added: + CY7C63001C-?XC*.DEV + CY7C63101CQXC.DEV + +2007-03-22 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r2 + added: + PIC16*F62.DEV + PIC16*F62?SS.DEV + +2007-03-20 librarian@cadsoft.de + * transistor-small-signal.lbr: Eagle 4.16r2 + all P-Channel-MosFet symbols: + Soure - Top, Gate - Top, Drain - Bottom + +2007-03-20 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16r2 + all P-Channel-MosFet symbols: + Soure - Top, Gate - Top, Drain - Bottom + +2007-03-20 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + all P-Channel-MosFet symbols: + Soure - Top, Gate - Top, Drain - Bottom + +2007-03-07 librarian@cadsoft.de + * con-rib.lbr: Eagle 4.16r2 + corrected package: + SH5-4.DEV + +2007-03-07 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16r2 + added: + SPD50P03LG.DEV + BSA2323SP.DEV + BSD223P.DEV + BSL207SP.DEV + BSL307SP.DEV + BSO201SP.DEV + BSV50P03LG.DEV + BSV236SP.DEV + SPB80P06P.DEV + SPD30P06P.DEV + SPP80P06P.DEV + SPW47N60S5.DEV + +2007-03-07 librarian@cadsoft.de + * ic-package.lbr: Eagle 4.16r2 + renamed *SOCKED* -> SOCKET + +2007-03-06 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r2 + deleted technology BC807, deleted variant SOT23-BEC (is a PNP): + *-NPN-.DEV + +2007-03-06 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r2 + swapped pad 4 <-> 5: + SOT457W_PHILIPS.PAC + +2007-03-06 librarian@cadsoft.de + * con-erni.lbr: Eagle 4.16r2 + added: + M-064319.DEV + M-064320.DEV + +2007-03-02 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r2 + updated smd-ipc: + R0805.PAC + C0805.PAC + +2007-03-02 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r2 + updated smd-ipc: + R0805.PAC + C0805.PAC + +2007-03-01 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r2 + added: + LT1021.DEV + +2007-03-01 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r2 + added: + AD620.DEV + +2007-02-26 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r2 + added: + 44520-0001.DEV + 44520-0002.DEV + 44520-0001.DEV + +2007-02-23 librarian@cadsoft.de + * transistor-pnp.lbr: Eagle 4.16r2 + corrected connection: + MPSA56*.DEV + added: + MPSA65*.DEV + *-?.DEV + MPSA56.DEV + MMBTA56.DEV + +2007-02-23 librarian@cadsoft.de + * diode.lbr: Eagle 4.16r2 + copied from info-at-febat-com/diode.lbr: + BY229B.DEV + GF1.DEV + +2007-02-22 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r2 + swapped pin 6 & 7: + MAX309*.DEV + +2007-02-22 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + NTHD3101F.DEV + CHIPFET-1206A.PAC + +2007-02-22 librarian@cadsoft.de + * memory-sram.lbr: Eagle 4.16r2 + centered origin in several packages + added: + CY7C1019CV33.DEV + TSOPII-32.PAC + VFBGA48.PAC + +2007-02-14 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + added: + PH7030L.DEV + +2007-02-06 librarian@cadsoft.de + * switch.lbr: Eagle 4.16r2 + added: + TL32PO.DEV + TL32WO.DEV + TL32YO.DEV + TL36PO.DEV + TL36WO.DEV + TL36YO.DEV + TL37PO.DEV + TL37WO.DEV + TL37YO.DEV + TL38PO.DEV + TL38WO.DEV + TL38YO.DEV + TL39PO.DEV + TL39WO.DEV + TL39YO.DEV + TL42PO.DEV + TL42WO.DEV + TL42YO.DEV + TL46PO.DEV + TL46WO.DEV + TL46YO.DEV + TL47PO.DEV + TL47WO.DEV + TL47YO.DEV + TL48PO.DEV + TL48WO.DEV + TL48YO.DEV + TL49PO.DEV + TL49WO.DEV + TL49YO.DEV + +2007-02-02 librarian@cadsoft.de + * lantronix.lbr: Eagle 4.16r2 + added: + XPORT.DEV + +2007-01-31 librarian@cadsoft.de + * *.lbr: Eagle 4.16r2 + deleted layer 50 DXF (EXPORT SCRIPT): + 40xx.lbr + 45xx.lbr + 74ac-logic.lbr + 74ttl-din.lbr + 74xx-eu.lbr + 74xx-little-us.lbr + 74xx-us.lbr + agilent-technologies.lbr + atmel.lbr + austriamicrosystems.lbr + burr-brown.lbr + con-harting-h.lbr + con-harting-v.lbr + con-phoenix-508.lbr + cypress.lbr + diode.lbr + docu-dummy.lbr + exar.lbr + fairchild-semic.lbr + freescale.lbr + ic-package.lbr + infineon.lbr + ir.lbr + linear-technology.lbr + linear.lbr + micro-motorola.lbr + micro-philips.lbr + micro-samsung.lbr + micro-siemens.lbr + microchip.lbr + micronas.lbr + national-instruments.lbr + quantum-sensor.lbr + ref-packages.lbr + resistor-dil.lbr + semicon-smd-ipc.lbr + silabs.lbr + sipex.lbr + st-microelectronics.lbr + texas.lbr + transistor-fet.lbr + transistor-npn.lbr + transistor-power.lbr + transistor-small-signal.lbr + v-reg.lbr + zetex.lbr + +2007-01-31 librarian@cadsoft.de + * freescale.lbr: Eagle 4.16r2 + added: + 68HC908AP*CB.DEV + 68HC908AP*.DEV + +2007-01-29 librarian@cadsoft.de + * display-lcd.lbr: Eagle 4.16r2 + drew "Pixel" in tDocu: + HDM64GS12_-R.PAC + +2007-01-22 librarian@cadsoft.de + * micro-motorola.lbr: Eagle 4.16r2 + added: + 68HC11F1*.DEV + variant FN3-S (PLCC-SOCKET) + +2007-01-19 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.16r2 + changed symbol HEXFET_N.SYM: + IRFP240.DEV + +2007-01-16 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r2 + added variant: + R-EU/R-US.DEV + VTA52.PAC + VTA53.PAC + VTA54.PAC + VTA55.PAC + VTA56.PAC + VMTA55.PAC + VMTB60.PAC + +2007-01-12 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r2 + added: + 2SA798.DEV + +2007-01-10 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r2 + extended description: Pin compatible with Atmega48, ATMega88, ATMega168: + MEGA8.DEV + MEGA8-MI.DEV + MEGA8-P.DEV + +2006-12-21 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r1 + connected: + ICL762*.DEV + +2006-12-21 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r1 + added: + ATMEGA644.DEV + ATMEGA644*.DEV + +2006-12-08 librarian@cadsoft.de + * uln-udn.lbr: Eagle 4.16r1 + GND and VS-Pin swapped: + UDN2981A.SYM + renamed: + UDN2981A.DEV -> UDN298*.DEV + SMD variant, corrected pin-connection + defined variants 1, 2, 3, and technology + +2006-12-07 librarian@cadsoft.de + * midori-sensor.lbr: Eagle 4.16r1 + added: + UV-1W.DEV + +2006-12-06 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + TLC27L*.DEV + +2006-12-05 librarian@cadsoft.de + * con-deutsch.lbr: Eagle 4.16r1 + extended library description with source + +2006-12-05 librarian@cadsoft.de + * pot.lbr: Eagle 4.16r1 + added: + CIP20C-4MM.PAC + CIP20C-6MM.PAC + +2006-12-05 librarian@cadsoft.de + * con-berg.lbr: Eagle 4.16r1 + added: + PN61729-S.DEV + PN87520-S.DEV + +2006-12-04 librarian@cadsoft.de + * con-pc.lbr: Eagle 4.16r1 + deleted cream mask on SMDs + +2006-11-17 librarian@cadsoft.de + * relay.lbr: Eagle 4.16r1 + added: + S*02S02.DEV + +2006-11-16 librarian@cadsoft.de + * plxtech.lbr: Eagle 4.16r1 + added: + PEX78311.DEV + +2006-11-16 librarian@cadsoft.de + * resistor-net.lbr: Eagle 4.16r1 + PAC/SYM corrected, delete 2 pins: + CTS753DRT16.DEV + CTS753DRT18.DEV + CTS753DRT20.DEV + CTS753DRT24.DEV + +2006-11-08 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r1 + added a Thermal-Pad to all MLF-Packages + +2006-11-08 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r1 + added: + MAX4335.DEV + MAX4336.DEV + MAX4337.DEV + MAX4338.DEV + SOT23-8L.PAC + deleted layer 50 DXF (EXPORT SCRIPT) + +2006-11-07 librarian@cadsoft.de + * relay.lbr: Eagle 4.16r1 + added: + G5SB.DEV + +2006-11-06 librarian@cadsoft.de + * supply2.lbr: Eagle 4.16r1 + set all device prefixes to 'SUPPLY' + added: + +4.1V.DEV -4.1V.DEV + +2006-11-06 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r1 + added: + ICL764*.DEV + ICL763*.DEV + ICL762*.DEV + ICL7611.DEV + ICL7621.DEV + ICL7622.DEV + +2006-11-06 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r1 + added: + CMLT5078E.DEV + CMLT5087E.DEV + CMLT5088E.DEV + +2006-11-06 librarian@cadsoft.de + * piher.lbr: Eagle 4.16r1 + added: + CI-11.DEV + +2006-11-03 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + TL770*.DEV + +2006-11-03 librarian@cadsoft.de + * fox-electronics.lbr: Eagle 4.16r1 + added: + RTC72412 renamed -> RTC72421 + +2006-11-02 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16r1 + added: + AT89C5132.DEV + +2006-10-25 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + LT1166C.DEV + +2006-10-17 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + LP3963?*.DEV + LP3966?-*.DEV + LP3966?-ADJ.DEV + +2006-10-17 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r1 + added: + MAX3233.DEV + MAX338*.DEV + +2006-10-10 librarian@cadsoft.de + * sipex.lbr: Eagle 4.16r1 + added: + SP3223*.DEV + +2006-10-10 librarian@cadsoft.de + * con-cpci.lbr: Eagle 4.16r1 + corrected origin for several packages + +2006-10-10 librarian@cadsoft.de + * chipcard-siemens.lbr: Eagle 4.16r1 + added: + XT55.DEV + +2006-10-10 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r1 + added: + LT1963AET*.DEV + +2006-10-09 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r1 + added: + LT1963AEQ*.DEV + +2006-09-27 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r1 + deleted variant SOT89-BCE: + *-NPN-.DEV + +2006-09-21 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + added: + AD7651.DEV + LFCSP48.PAC + +2006-09-20 librarian@cadsoft.de + * display-hp.lbr: Eagle 4.16r1 + added: + SC39-11SRWA.DEV + +2006-09-19 librarian@cadsoft.de + * switch.lbr: Eagle 4.16r1 + added: + 50-1POLE22,5.DEV + 50-1POLE30.DEV + 50-2POLE22,5.DEV + 50-2POLE30.DEV + 50-3POLE30.DEV + 50-4POLE30.DEV + 71BT-30-A1-30A1.DEV + 71BT-30-A2.DEV + 71BT-30-AB1.DEV + 71BT-30-AB2.DEV + 71BT-36-A1.DEV + 71BT-36-A2.DEV + 71BT-36-AB1.DEV + 71BT-36-AB2.DEV + 75AF36-1-10.DEV + 75AF36-2.DEV + 75AP36-1-10.DEV + 75AP36-2.DEV + 75BF36-1-10.DEV + 75BF36-2.DEV + 75BP36-1-10.DEV + 75BP36-2.DEV + 75CF36-1-10.DEV + 75CF36-2.DEV + 75CP36-1-10.DEV + 24-1POLE36.DEV + ELMA-01-1X6.DEV + ELMA-01-1X10MA.DEV + ELMA-01-1X10OA.DEV + ELMA-01-1X11.DEV + ELMA-01-1X12.DEV + ELMA-01-2X3.DEV + ELMA-01-2X6.DEV + ELMA-01-4X2.DEV + ELMA-01-4X3.DEV + SRRM1C7800.DEV + SRRM262400.DEV + SRRM263700.DEV + SRRM264300.DEV + SRRM254700.DEV + SRRM265900.DEV + SRRM342800.DEV + SRRM433700.DEV + SSRM1C5400.DEV + SSRM1C6200.DEV + TL32PO.DEV + +2006-09-19 librarian@cadsoft.de + * con-vg.lbr: Eagle 4.16r1 + added: + FAE32E.PAC + moved PADs 1.27 mm in Y-coordinate: + FACE48E.PAC + +2006-09-06 librarian@cadsoft.de + * 40xx.lbr: Eagle 4.16r1 + added: + 4098.DEV + +2006-08-29 librarian@cadsoft.de + * led.lbr: Eagle 4.16r1 + added: + F50380.DEV + TLE4242.DEV + +2006-08-25 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.16r1 + added: + TS5205.DEV + +2006-08-25 librarian@cadsoft.de + * led.lbr: Eagle 4.16r1 + added: + NFSG036BT.DEV + +2006-08-21 librarian@cadsoft.de + * con-leotronics.lbr: Eagle 4.16r1 + added: + 1296-T00.DEV + 1296-T08.DEV + 1296-T10.DEV + 1296-T12.DEV + 1296-T14.DEV + 1296-T16.DEV + 1296-T18.DEV + 1296-T20.DEV + 1296-T22.DEV + 1296-T24.DEV + 1296-T26.DEV + 1296-T28.DEV + 1296-T30.DEV + 1296-T32.DEV + 1296-T34.DEV + 1296-T36.DEV + 1296-T38.DEV + 1296-T40.DEV + 1296-T42.DEV + 1296-T44.DEV + 1296-T46.DEV + 1296-T48.DEV + 1296-T50.DEV + 1296-T52.DEV + 1296-T54.DEV + 1296-T56.DEV + 1296-T58.DEV + 1296-T60.DEV + 1296-T62.DEV + 1296-T64.DEV + 1296-T66.DEV + 1296-T68.DEV + 1296-T70.DEV + 1296-T72.DEV + 1296-T74.DEV + 1296-T76.DEV + 1296-T78.DEV + 1296-T80.DEV + 1296-T82.DEV + 1296-T84.DEV + 1296-T86.DEV + 1296-T88.DEV + 1296-T90.DEV + 1296-T92.DEV + 1296-T94.DEV + 1296-T96.DEV + 1296-T98.DEV + 1365-00.DEV + 1365-10.DEV + 1365-12.DEV + 1365-14.DEV + 1365-16.DEV + 1365-18.DEV + 1365-20.DEV + 1365-22.DEV + 1365-24.DEV + 1365-26.DEV + 1365-28.DEV + 1365-30.DEV + 1365-32.DEV + 1365-34.DEV + 1365-36.DEV + 1365-38.DEV + 1365-40.DEV + 1365-42.DEV + 1365-44.DEV + 1365-46.DEV + 1365-48.DEV + 1365-50.DEV + 1365-52.DEV + 1365-54.DEV + 1365-56.DEV + 1365-58.DEV + 1365-60.DEV + 1365-62.DEV + 1365-64.DEV + 1365-66.DEV + 1365-68.DEV + 1365-70.DEV + 1365-72.DEV + 1365-74.DEV + 1365-76.DEV + 1365-78.DEV + 1365-80.DEV + 1365-82.DEV + 1365-84.DEV + 1365-86.DEV + 1365-88.DEV + 1365-90.DEV + 1365-92.DEV + 1365-94.DEV + 1365-96.DEV + 1365-98.DEV + +2006-08-21 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r1 + added: + KK-156-2.DEV -> KK-156-18.DEV + +2006-08-18 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + LM321?*.DEV + +2006-08-08 librarian@cadsoft.de + * con-vg.lbr: Eagle 4.16r1 + generated .DEV for .PAC without devices + +2006-08-03 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r1 + changed DRILL to 1.0mm: + 22-23-2021.DEV + 22-23-2031.DEV + 22-23-2041.DEV + 22-23-2051.DEV + 22-23-2061.DEV + 22-23-2071.DEV + 22-23-2081.DEV + 22-23-2091.DEV + 22-23-2101.DEV + 22-23-2111.DEV + 22-23-2121.DEV + +2006-08-02 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + Layer 50 DXF delete (EXPORT SCRIPT) + added: + AD9859.DEV + QFP-7X7-48.PAC + +2006-07-31 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 4.16r1 + added: + UPSD325*.DEV + UPSD3254*.DEV + +2006-07-31 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 4.16r1 + included: + st-microlectronic-2.lbr + st-microlectronic-3.lbr + st-microlectronic.lbr + +2006-07-31 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r1 + added variant MF, P, SN: + PIC12F6*.DEV + +2006-07-24 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16r1 + moved PADs, Y-coordinate +0.45mm: + 53047-02.DEV + 53047-03.DEV + 53047-04.DEV + 53047-05.DEV + 53047-06.DEV + 53047-07.DEV + 53047-08.DEV + 53047-09.DEV + 53047-10.DEV + 53047-11.DEV + 53047-12.DEV + 53047-13.DEV + 53047-14.DEV + 53047-15.DEV + +2006-07-18 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16r1 + added: + MAX98*.DEV + MAX9*.DEV + MAX99*.DEV + +2006-07-18 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + renamed: + OPA27HT.DEV -> OPA*7.DEV + new symbol OP+OFFSET.SYM: + OPA743.DEV + OPA2743.DEV + OPA4743.DEV + +2006-07-10 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + MC3*164.DEV + MICRO8.PAC + SOIC8.PAC + TO-226AA.PAC + TSOP5.PAC + +2006-07-10 librarian@cadsoft.de + * display-lcd.lbr: Eagle 4.16r1 + added: + HDM64GS12_-R.DEV + +2006-07-03 librarian@cadsoft.de + * diode.lbr: Eagle 4.16r1 + BAS40.DEV & BAS70.DEV copied from christoph.grabka@siemens.com + BAS70-07S, V, VV completed + +2006-06-27 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16r1 + deleted variant SOT89-ECB: + *-NPN-.DEV + new technolgy BCX56: + variant SOT89-BCE + renamed variant: + SOT-98-BCE -> SOT89-BCE + +2006-06-27 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r1 + added: + BQ24120.DEV + changed pad name with '$': + TVSOP48.PAC + +2006-06-27 librarian@cadsoft.de + * diode.lbr: Eagle 4.16r1 + added symbol K2A: + BAS70-06.DEV + added variant POWERMITE.PAC & SOD80C.PAC: + PMLL41xx.DEV + +2006-06-26 librarian@cadsoft.de + * con-hirose.lbr: Eagle 4.16r1 + completed FH28-50S-0.5SH(51).DEV + set PREFIX on all devices + +2006-06-26 librarian@cadsoft.de + * con-coax.lbr: Eagle 4.16r1 + added: + SMA-.DEV + +2006-06-21 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16r1 + added: + MCP23017.DEV + MCP23S17.DEV + +2006-06-21 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16r1 + added: + LTC128*C.DEV + LTC1285.DEV + LTC1288.DEV + +2006-06-21 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + added: + AD421.DEV + +2006-06-20 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + added: + AD7714.DEV + +2006-06-19 librarian@cadsoft.de + * ic-package.lbr: Eagle 4.16r1 + corrected description: "Socked" -> "Socket" + +2006-06-12 librarian@cadsoft.de + * micrel.lbr: Eagle 4.16r1 + added: + S89537.DEV + MLF44.DAC + +2006-06-12 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16r1 + added: + MRF136.DEV + 211-07_SMD.PAC + +2006-06-07 librarian@cadsoft.de + * plxtech.lbr: Eagle 4.16r1 + added: + NET2272.DEV + FBGA64.PAC + variant: + REV1A-LF + REV1A-BCF + +2006-06-06 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16r1 + set PREFIX 'OK': + MOC30*M.DEV + added: + VTL5C*.DEV + +2006-06-02 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + renamed: + AD8076.DEV -> AD8067.DEV + +2006-06-02 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + added: + AD8076.DEV + SOT23-5.PAC + +2006-06-02 librarian@cadsoft.de + * texas.lbr: Eagle 4.16r1 + added: + TPS75003.DEV + R-PQFP-N20.PAC + +2006-06-01 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16r1 + added: + ADSP_BF561_256_MBGA.DEV + +2006-05-29 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 4.16r1 + set value ON: + 4R-N.DEV + 10R-N.DEV + 10R-P.DEV + 19R.DEV + E19R.DEV + +2006-05-19 librarian@cadsoft.de + * con-erni.lbr: Eagle 4.16r1 + completed stop & cream mask: + M-064321.PAC + +2006-05-15 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r1 + updated smd-ipc.lbr: + R0805.PAC + R0805W.PAC + C0805.PAC + +2006-05-15 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r1 + updated smd-ipc.lbr + R0805.PAC + R0805W.PAC + C0805.PAC + +2006-05-15 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 4.16r1 + corrected: + R0805.PAC + R0805W.PAC + C0805.PAC + +2006-04-25 librarian@cadsoft.de + * linear.lbr: Eagle 4.16r1 + added: + LM4995.DEV + +2006-04-24 librarian@cadsoft.de + * led.lbr: Eagle 4.16r1 + added: + NUD4001.DEV + NUD4011.DEV + SO-8.PAC + +2006-04-19 librarian@cadsoft.de + * con-panasonic.lbr: Eagle 4.16r1 + added: + AXR30545 + +2006-04-11 librarian@cadsoft.de + * led.lbr: Eagle 4.16r1 + added: + OSTAR_4-.DEV + OSTAR_6-.DEV + +2006-04-11 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16r1 + deleted layer 50 dxf (EXPORT SCRIPT) + added: + QFP256-28X28.PAC + BGA256.PAC (Hitachi) + +2006-04-11 librarian@cadsoft.de + * rcl.lbr: Eagle 4.16r1 + corrected library decription HTML table 55% + +2006-04-07 librarian@cadsoft.de + * marks.lbr: Eagle 4.16r1 + completed stop mask: + ANGLE-ARROW-SW1.PAC + ANGLE-ARROW-SW1-16.PAC + ANGLE-NE1.PAC + ANGLE-NE1-16.PAC + +2006-04-06 librarian@cadsoft.de + * varistor.lbr: Eagle 4.16r1 + added: + VARISTOR.DEV + CU3225K.PAC + CU4032K.PAC + changed package contour from layer 18 -> 51: + CT/CN0603.PAC + +2006-04-05 librarian@cadsoft.de + * marks.lbr: Eagle 4.16 + completed several packages + layer - tStop - bStop - Top - Button + +2006-04-04 librarian@cadsoft.de + * switch.lbr: Eagle 4.16 + added: + SKHMP*E010.DEV + +2006-04-03 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + U2400B.DEV + +2006-04-03 librarian@cadsoft.de + * pinhead.lbr: Eagle 4.16 + added: + PINHD-2X25_57102-F08-25.DEV + PINHD-1X25_2802S-02G2.DEV + +2006-03-30 librarian@cadsoft.de + * con-cypressindustries.lbr: Eagle 4.16 + added: + USB + FIREWIRE + DVI + +2006-03-30 librarian@cadsoft.de + * con-cpci.lbr: Eagle 4.16 + added: + CPCI-SHIELD_B19.DEV + CPCI-SHIELD_B22.DEV + CPCI_A25-064176.DEV + CPCI_AB19-114529.DEV + CPCI_AB19-134075.DEV + CPCI_AB22-104933.DEV + CPCI_AB22-114809.DEV + CPCI_AB47-3U_AB47.DEV + CPCI_AB47-6U_AB47.DEV + CPCI_AB47-104732.DEV + CPCI_AB47-104733.DEV + CPCI_AB47-104734.DEV + CPCI_AB47_BLOCK-.DEV + CPCI_B19-064784.DEV + CPCI_B19-114133.DEV + CPCI_B19-914794.DEV + CPCI_B22-064785.DEV + CPCI_B22-114134.DEV + CPCI_B22-914797I.DEV + +2006-03-29 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16 + added: + IEEE1394P6-.DEV + 534620621_SD.PAC + +2006-03-29 librarian@cadsoft.de + * con-cypressindustries.lbr: Eagle 4.16 + added: + USB.DEV + MINI-USB.DEV + IEEE1394_4P-85-32006-001-1.DEV + IEEE1394_4P-85-32006-201-1.DEV + IEEE1394_6P-85-32007-00X-1.DEV + IEEE1394_6P-85-32007-10X-1.DEV + IEEE1394_6P-85-32007-20X-1.DEV + IEEE1394_6P-85-32007-50X-1.DEV + IEEE1394_6P-85-32007-60X-1.DEV + IEEE1394_9P-85-32008-00X-1.DEV + IEEE1394_9P-85-32008-10X-1.DEV + +2006-03-22 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + A3977.DEV + A3979.DEV + added exposed pad: + TSSOP28.PAC + +2006-03-22 librarian@cadsoft.de + * con-hirose.lbr: Eagle 4.16 + added: + MINI-USB-.DEV + UX60-MB-5S8.PAC + UX60-MB-5ST.PAC + UX60A-MB-5ST.PAC + FH28-50S-0.5SH(51).PAC + +2006-03-21 librarian@cadsoft.de + * atmel.lbr: Eagle 4.16 + added: + AT89C513*-.DEV + VQFP64.PAC + +2006-03-17 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.16 + added: + PCF8574TS.DEV + SSOP20.PAC + added PLCC-68 Socket variant: + 80C552.DEV + +2006-03-16 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16 + added: + AD7992.DEV + +2006-03-16 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 4.16 + placed pad in the middle as SMD, + deleted POLYGON, WIRE and RECT from tStop/tCream: + SOT89.PAC + +2006-03-15 librarian@cadsoft.de + * led.lbr: Eagle 4.16 + added: + LUMILED.PAC + LUMILED+.PAC + variant with cooling pad: + LED.DEV + +2006-03-15 librarian@cadsoft.de + * con-jack.lbr: Eagle 4.16 + added: + JACK-PLUK.DEV + SPC4077.PAC + SPC4078.PAC + from Robert Siegler + +2006-03-15 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16 + added: + PIC18F2*_28.DEV + PIC18F4*_40.DEV + PIC18F4*_QFN.DEV + PIC18F4*_TQFP.DEV + QFN44ML8X8.PAC + renamed and corrected package size: + SO-28W.PAC -> SO28W.PAC + +2006-03-14 librarian@cadsoft.de + * national-semiconductor.lbr: Eagle 4.16 + added: + USBN960*.DEV + +2006-03-14 librarian@cadsoft.de + * micronas.lbr: Eagle 4.16 + added: + MAS35*9.DEV + +2006-03-14 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16 + changed direction to 'Out' for pin 'INVALID\': + MAX3223.SYM + +2006-03-08 librarian@cadsoft.de + * maxstream.lbr: Eagle 4.16 + added: + XBEE.DEV + XBEE-PRO.DEV + +2006-03-07 librarian@cadsoft.de + * agilent-technologies.lbr: Eagle 4.16 + added: + HCTL-1100-40.DEV + HCTL-1100-44.DEV + +2006-03-07 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + MC1408.DEV + UDN2954W.DEV + UDN2953B.DEV + +2006-03-06 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.16 + added: + LTC4062.DEV + +2006-03-02 librarian@cadsoft.de + * telecontrolli.lbr: Eagle 4.16 + added: + RRFQ1-*.DEV + RTFQ2-*.DEV + +2006-03-02 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + MC14536B.DEV + RF600T.DEV + +2006-03-02 librarian@cadsoft.de + * led.lbr: Eagle 4.16 + changed layer of rectangle tCream -> tStop: + OSRAM-MINI-TOP-LED.PAC + +2006-03-01 librarian@cadsoft.de + * con-neutrik_ag.lbr: Eagle 4.16 + corrected HOLE: + NC5FAH.PAC + changed wire width 0 -> 0.0254mm, + >NAME & >VLAUE in package, + deleted WIRE width 0 in layer 21: + NEUTRIK-LOGO.PAC + +2006-02-27 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16 + added: + 52746-4.DEV + 52746-6.DEV + 52746-7.DEV + 52746-8.DEV + 52746-9.DEV + 52746-10.DEV + 52746-11.DEV + 52746-12.DEV + 52746-13.DEV + 52746-14.DEV + 52746-15.DEV + 52746-16.DEV + 52746-17.DEV + 52746-18.DEV + 52746-19.DEV + 52746-20.DEV + replaced POLYGON with RECT and extended description: + 52559-2192.DEV + +2006-02-22 librarian@cadsoft.de + * con-thomas-betts.lbr: Eagle 4.16 + rotated several packages 180 degrees + +2006-02-22 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.16 + rotated pads 180 degrees: + 71061-0001.PAC + 71061-0003.PAC + +2006-02-21 librarian@cadsoft.de + * 40xx.lbr: Eagle 4.16 + corrected power symbol (3 Pins) VCC, VDD, VSS: + 4010.SYM + +2006-02-20 librarian@cadsoft.de + * relay.lbr: Eagle 4.16 + added: + TXD2-2M-1.5V'3V + TXD2-2M-1.5V + TXD2-2M-3V + TXD2SA-2M-1.5V'3V + TXD2SA-2M-1.5v + TXD2SA-2M-3V + TXD2SL-2M-1.5V'3V + TXD2SL-2M-1.5V + TXD2SL-2M-3V + TXD2SS-2M-1.5V'3V + TXD2SS-2M-1.5V + TXD2SS-2M-3V + +2006-02-17 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16 + renamed pin INT2/PB1/RB2 -> INT2/P1B/RB2: + PIC18F1320.SYM + PIC18F1220.SYM + deleted variant SSOP18, new variant SO & P (SO18/DIP18): + PIC18F1*20.DEV + +2006-02-17 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16 + added: + AD7142*.DEV + LFCSP32.PAC + +2006-02-17 librarian@cadsoft.de + * cypress.lbr: Eagle 4.16 + added: + CY7C6801*A-56.DEV + CY7C6801*A-100.DEV + CY7C6801*A-128.DEV + +2006-02-16 librarian@cadsoft.de + * wirepad.lbr: Eagle 4.16 + added: + WIREPAD.DEV + +2006-02-16 librarian@cadsoft.de + * led.lbr: Eagle 4.16 + added: + PLH006*.DEV + +2006-02-16 librarian@cadsoft.de + * zetex.lbr: Eagle 4.16 + added: + ZXSC300.DEV + FMMT6*.DEV + FMMT7*.DEV + +2006-02-15 librarian@cadsoft.de + * texas.lbr: Eagle 4.16 + added: + PCM3006.DEV + +2006-02-14 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.16 + added: + UC384*.DEV + UC384*D.DEV + +2006-02-13 librarian@cadsoft.de + * ftdichip.lbr: Eagle 4.16 + renamed variant RL RQ -> R Q: + FT232R.DEV + +2006-02-09 librarian@cadsoft.de + * con-yamaichi.lbr: Eagle 4.16 + added: + FPS009-30*.DEV + FPS009-300*.DEV + FPS009-3004.DEV + +2006-02-09 librarian@cadsoft.de + * ftdichip.lbr: Eagle 4.16 + added: + FT232R.DEV + +2006-02-09 librarian@cadsoft.de + * relay.lbr: Eagle 4.16 + added: + G6D?*.DEV + +2006-02-08 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.16 + rotatedt pad row by 180 degrees: + 10X04MTA.PAC + +2006-02-07 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + ERA-1.DEV + ERA-8.DEV + +2006-02-06 librarian@cadsoft.de + * microwave.lbr: Eagle 4.16 + added: + HMC394LP4.DEV + HMC439QS16G.DEV + +2006-02-02 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16 + added: + AD8367.DEV + AD8611.DEV + AD8612.DEV + +2006-01-27 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16 + added: + 3N2*.DEV + 3N201.DEV + 3N202.DEV + 3N203.DEV + 3N211.DEV + 3N212.DEV + 3N213.DEV + 3SK45.DEV + RCA3N187.DEV + RCA40673.DEV + +2006-01-27 librarian@cadsoft.de + * linear.lbr: Eagle 4.16 + added: + LM2574?-*.DEV + +2006-01-24 librarian@cadsoft.de + * 19inch.lbr: Eagle 4.16 + renamed: + 6HE-VG64AC -> 6HE-?-VG64AC + added new variant 160mm + +2006-01-24 librarian@cadsoft.de + * microchip.lbr: Eagle 4.16 + added: + PIC18F8*.DEV + PIC18F6*.DEV + +2006-01-23 librarian@cadsoft.de + * fairchild-semic.lbr: Eagle 4.16 + added: + ML4425*.DEV + +2006-01-23 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.16 + moved bottom row +.127 mm, package balanced: + SO-28W.PAC + +2006-01-17 librarian@cadsoft.de + * con-3m.lbr: Eagle 4.16 + added: + 214-3339-00-0602J.DEV + 216-3340-00-0602J.DEV + 218-3341-00-0602J.DEV + 220-3342-00-0602J.DEV + 222-3343-00-0602J.DEV + 224-1275-00-0602J.DEV + 224-5248-00-0602J.DEV + 228-1277-00-0602J.DEV + 228-4817-00-0602J.DEV + 232-1271-00-1102JH.DEV + 232-1285-00-0602J.DEV + 240-1280-00-0602J.DEV + 240-3639-00-0602J.DEV + 242-1281-00-0602J.DEV + 248-1282-00-0602J.DEV + 264-4493-00-0602J.DEV + +2006-01-12 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.16 + added: + TLP283.DEV + TLP283-4.DEV + +2006-01-11 librarian@cadsoft.de + * con-conrad.lbr: Eagle 4.16 + renamed: + 733989-5.DEV -> 73398?.DEV + added: + 733980-62.DEV + 733989-5.DEV + +2005-12-21 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.16 + added source to description: + BF245.DEV + J201.DEV + J202.DEV + J204.DEV + SST.DEV + +2005-12-21 librarian@cadsoft.de + * transistor-small-signal.lbr: Eagle 4.16 + added source to description: + BFR96.DEV + BF245.DEV + +2005-12-21 librarian@cadsoft.de + * transistor.lbr: Eagle 4.16 + added: + *-NPN-.DEV + SOT37.PAC + BFR96-NPN-SOT-37.DEV + +2005-12-20 librarian@cadsoft.de + * maxim.lbr: Eagle 4.16 + added: + MAX3766*.DEV + +2005-12-20 librarian@cadsoft.de + * national-instruments.lbr: Eagle 4.16 + added: + TNT4882.DEV + +2005-12-15 librarian@cadsoft.de + * trafo.lbr: Eagle 4.16 + added: + BV054*.DEV + BV054-*.DEV + +2005-12-15 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.16 + changed layer 254 to layer tFinish: + SO8-COOL.PAC + added: + ADUC7019.DEV + ADUC7020.DEV + ADUC7021.DEV + ADUC7022.DEV + ADUC7024.DEV + ADUC7025.DEV + ADUC7026.DEV + ADUC7027.DEV + +2005-12-06 librarian@cadsoft.de + * con-erni.lbr: Eagle 4.15r08 + corrected pads, swapped row A B + +2005-12-06 librarian@cadsoft.de + * linear.lbr: Eagle 4.15r08 + EXPORT SCRIPT, deleted layer: + 50 dxf + 250 Description + 251 SMD-Round + +2005-12-06 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + SLA7052MLF87.DEV + +2005-12-05 librarian@cadsoft.de + * crystal.lbr: Eagle 4.15 + renamed: + CRYTAL.DEV -> CRYSTAL.DEV + +2005-12-02 librarian@cadsoft.de + * maxim.lbr: Eagle 4.15 + snapped symbol to grid: + MAX76*.DEV + added: + MAX12527.DEV + 68LQFN.PAC + +2005-11-24 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.15 + added: + IRF6648.DEV + DIRECTFET.PAC + +2005-11-21 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.15 + rotated pad row by 180 degrees: + 53047-07.PAC + added: + 5566-2.DEV + 5566-4.DEV + 5566-6.DEV + 5566-8.DEV + 5566-10.DEV + 5566-12.DEV + 5566-14.DEV + 5566-16.DEV + 5566-18.DEV + 5566-20.DEV + 5566-22.DEV + 5566-24.DEV + 52559-0692.DEV + 52559-0890.DEV + 52559-0992.DEV + 52559-1092.DEV + 52559-1292.DEV + 52559-1390.DEV + 52559-1492.DEV + 52559-1592.DEV + 52559-1692.DEV + 52559-1792.DEV + 52559-1890.DEV + 52559-2092.DEV + 52559-2192.DEV + 52559-2290.DEV + 52559-2492.DEV + 52559-2590.DEV + 52559-2692.DEV + 52559-2892.DEV + 52559-3092.DEV + 52559-3292.DEV + 52559-3390.DEV + 52559-3692.DEV + 52559-4092.DEV + +2005-11-18 librarian@cadsoft.de + * maxim.lbr: Eagle 4.15 + renamed: + MAX4137EWG -> MAX413*EWG + +2005-11-18 librarian@cadsoft.de + * display-lcd.lbr: Eagle 4.15 + added: + EADIP128-6.DEV + +2005-11-17 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.15 + corrected description "Pastic" -> "Plastic" + +2005-11-17 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 4.15 + added: + 4R-N.DEV + 0402-ARV.PAC + 0603-ARC.PAC + 0603-ARV.PAC + CAT16.PAC + CAY16.PAC + +2005-11-15 librarian@cadsoft.de + * rcl.lbr: Eagle 4.15 + added: + SANYO elco + +2005-11-14 librarian@cadsoft.de + * micro-siemens.lbr: Eagle 4.15 + added: + DPC31.DEV + +2005-11-10 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.15 + deleted user-defined layer + +2005-11-10 librarian@cadsoft.de + * micro-siemens.lbr: Eagle 4.15 + deleted user-defined layer + +2005-11-10 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.15 + deleted user-defined layer + +2005-11-10 librarian@cadsoft.de + * chipcard-siemens.lbr: Eagle 4.15 + deleted user-defined layer + +2005-11-10 librarian@cadsoft.de + * amd-mach.lbr; am29-memory.lbr: Eagle 4.15 + deleted user-defined layer + +2005-11-10 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.15 + changed wire width to .1524 mm: + XC27B13.PAC + changed layer 254 Cool-Pad to tDocu: + SO8-COOL.PAC + various packages: + deleted TEXT in Layer 250, deleted Layer 250 + +2005-11-10 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.15 + deleted Bitmap-Layer (200) + +2005-11-09 librarian@cadsoft.de + * dc-dc-converter.lbr: Eagle 4.15 + added: + VA-D01.DEV + VA_*?.DEV + +2005-11-07 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + SA612A.DEV + +2005-11-07 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + TSSOP38.PAC + +2005-11-04 librarian@cadsoft.de + * resistor-dil.lbr: Eagle 4.15 + added: + SOMC14.PAC + SOMC16.PAC + SOMC20.PAC + +2005-11-03 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + PA241.DEV + PSOP24.PAC + SIP-10.PAC + +2005-11-02 librarian@cadsoft.de + * crystal.lbr: Eagle 4.15 + added: + CTS406.PAC + +2005-10-18 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + AD6624A.DEV + PBGA196.PAC + +2005-10-17 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + ADSP_535.DEV + PBGA_B260.PAC + +2005-10-17 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 4.15 + added: + M68AW128M.DEV + TSOP44-II.PAC + TFBGA48.PAC + +2005-10-04 librarian@cadsoft.de + * con-omron.lbr: Eagle 4.15 + added: + FPC-Connector + +2005-10-04 librarian@cadsoft.de + * triac.lbr: Eagle 4.15 + added: + BTA26.DEV + +2005-10-04 librarian@cadsoft.de + * rcl.lbr: Eagle 4.15 + added: + C0201.PAC + HPC0201.PAC + L0201.PAC + R0201.PAC + +2005-10-04 librarian@cadsoft.de + * 45xx.lbr: Eagle 4.15 + changed function = NONE, pin INHIBIT: + 4512.SYM + +2005-10-04 librarian@cadsoft.de + * v-reg.lbr: Eagle 4.15 + added: + LM317?*.DEV + DPAK.PAC + SOT223.PAC + +2005-09-29 librarian@cadsoft.de + * 19inch.lbr: Eagle 4.15 + added: + VME/VXI_A_SIZE_3U.PAC + VME/VXI_B_SIZE_6U.PAC + VME/VXI_C_SIZE_6U.PAC + VME/VXI_D_SIZE-9U.PAC + 6HE-VG64AC.DEV + +2005-09-28 librarian@cadsoft.de + * atmel.lbr: Eagle 4.15 + copied from avr.lbr: + ATMEGA8.DEV + ATMEGA8P.DEV + ATMEGA16.DEV + ATMEGA16P.DEV + ATMEGA32.DEV + ATMEGA32P.DEV + ATMEGA64.DEV + ATMEGA128.DEV + ATMEGA169.DEV + ATMEGA323.DEV + ATMEGA323P.DEV + ATMEGA8515.DEV + ATMEGA8515P.DEV + ATMEGA8535.DEV + ATMEGA8535P.DEV + +2005-09-26 librarian@cadsoft.de + * microchip.lbr: Eagle 4.15 + renamed: + PIC12F629.DEV -> PIC12F6*.DEV + added: + PIC18F2*80.DEV + QFN28-ML_6X6MM.PAC + +2005-09-20 librarian@cadsoft.de + * con-chipcard-iso7816.lbr: Eagle 4.15 + added: + ISO-7816.PAC + AFNOR-CHIPCARD.PAC + +2005-09-19 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + CP-64-1.PAC + +2005-09-19 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + OPA*.DEV + OPA2*.DEV + OPA4*.DEV + OPA*-SOT23.DEV + MSOP08.PAC + SOT23-5.PAC + +2005-09-19 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.15 + added: + HCPL772*.DEV + SO8-GW300.PAC + SO-8.PAC + +2005-09-16 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + PA85*.DEV + PA85.SYM + TO3-8.PAC + +2005-09-16 librarian@cadsoft.de + * microchip.lbr: Eagle 4.15 + added: + PIC12F629.DEV + DFN-S.PAC + +2005-09-16 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + ADD8704.DEV + LFCSP16.PAC + TSSOP14.PAC + +2005-08-29 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.15 + new symbol: + IRF9530.DEV -> MFPD.SYM + corrected description: + P-Channel + corrected symbol: + MFP.SYM + +2005-08-25 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 4.15 + added: + L9637D.DEV + +2005-08-22 librarian@cadsoft.de + * transistor.lbr: Eagle 4.15 + corrected connection: + BD239.DEV + +2005-08-18 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.15 + added: + MIC4420.DEV + MIC4429.DEV + +2005-08-17 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.15 + added: + DE*.DEV (from IXYS) + DE.PAC + DE_X.PAC + +2005-08-17 librarian@cadsoft.de + * texas.lbr: Eagle 4.15 + added: + THS4211.DEV + +2005-08-16 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added variant: + LM340?-*.DEV -> MP S + +2005-08-09 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.15 + corrected symbol: + JFET-P.SYM + corrected connection: + 2N3820.DEV + 2N5116.DEV + BFT11.DEV + +2005-08-05 librarian@cadsoft.de + * infineon.lbr: Eagle 4.15 + added: + BTS555.DEV + TO220-51.PAC + TO220-52.PAC + +2005-08-02 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.15 + added: + ILD2*.DEV + +2005-07-28 librarian@cadsoft.de + * st-microelectronics.lbr: Eagle 4.15 + added: + PSO36.PAC + +2005-07-18 librarian@cadsoft.de + * atmel.lbr: Eagle 4.15 + added: + ATF16V8B.DEV + +2005-07-12 librarian@cadsoft.de + * wuerth-elektronik.lbr: Eagle 4.15 + exchanged: + wuerth-elektronik_v4.lbr + +2005-07-12 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + added: + ADSP_BF537.DEV + BGA_208.PAC + MINI-BGA-182.PAC + +2005-07-05 librarian@cadsoft.de + * con-conrad.lbr: Eagle 4.15 + added: + 736880-49.DEV + 736880-49.PAC + CINCH.SYM + +2005-07-04 librarian@cadsoft.de + * telefunken.lbr: Eagle 4.15 + added: + TSOP17*TB1.DEV + TSOP17_TB1.PAC + TSOP17_TB1.SYM + +2005-07-04 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.15 + added: + SI5902DC.DEV + N-MOSFET-G2DS-D.SYM + 1206-8CHIP-FET.PAC + P-MOSFET-G2DS-D.SYM + +2005-06-28 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.15 + corrected: + ADSP_BF533.DEV -> MBGA_160.PAC + added: + ADSP_BF531.DEV + ADSP_BF532.DEV + MBGA_160.PAC + +2005-06-23 librarian@cadsoft.de + * microchip.lbr: Eagle 4.15 + added: + PIC18F1*20?.DEV + PIC18F1*20.DEV + QFN28.PAC + SSOP18.PAC + +2005-06-22 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + AN7161.DEV + +2005-06-20 librarian@cadsoft.de + * linear.lbr: Eagle 4.15 + added: + TA8210?*.DEV + +2005-06-14 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.13r1 + added: + MSOP10.PAC + +2005-06-09 librarian@cadsoft.de + * micro-samsung.lbr: Eagle 4.14r04 + added: + S3C72N2.DEV + S3C72N4.DEV + S3P72N4.DEV + 64-QFP-1420F.PAC + (QFP64_SOT393.PAC copy from ref-packages.lbr) + +2005-05-03 librarian@cadsoft.de + * con-neutrik_ag.lbr: Eagle 4.14r02 + swapped pads 2 and 3: + NCJ10FI-H.PAC + NCJ10FI-H-0.PAC + +2005-04-08 librarian@cadsoft.de + * led.lbr: Eagle 4.14r01 + added: + LED-2AC-.DEV + SUPERFLUX-7.6X7.6.PAC + SUPERFLUX-SMD-7.6X7.6.PAC + +2005-04-07 librarian@cadsoft.de + * varistor.lbr: Eagle 4.13r13 + added: + VARISTOR.DEV + variants: + CT/CN0402 + CT/CN0603 + CT/CN0805 + CT/CN1206 + CT/CN1210 + CT/CN1812 + CT/CN2220 + +2005-04-04 librarian@cadsoft.de + * rcl.lbr: Eagle 4.14r01 + added variant CEP125.PAC: + L-EU.DEV + L-US.DEV + +2005-04-01 librarian@cadsoft.de + * microchip.lbr: Eagle 4.14r01 + changed package 28-6 -> 28-3: + PIC16*873.DEV + PIC16*876.DEV + +2005-03-23 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.13r1 + added: + ADSP_BF533.DEV + BGA_160.PAC + BGA_169.PAC + LQFP176-1.PAC + AD8133.DEV + AD8133.SYM + LFCSP24.PAC + moved gates to default grid: + ADSP21161.DEV + +2005-03-22 librarian@cadsoft.de + * texas.lbr: Eagle 4.13r1 + added: + HTSSOP28DCP.PAC + HTSSOP48DCA.PAC + HTSSOP48DFD.PAC + HTSSOP48DHD.PAC + HTSSOP56DCA.PAC + HTSSOP56DFD.PAC + HTSSOP56DHD.PAC + HTSSOP64DCA.PAC + HTSSOP64DFD.PAC + HTSSOP28DAP.PAC + HTSSOP30DAP.PAC + HTSSOP32DAP.PAC + HTSSOP38DAP.PAC + +2005-03-17 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.13r1 + N-MOSFET-SO8.DEV P-MOSFET-SO8.DEV + copied SO8.PAC <- ref-packages.lbr + FDS7760A.DEV + +2005-03-16 librarian@cadsoft.de + * rcl.lbr: Eagle 4.13r1 + added variants to CPOL-EU.DEV: + SMC_A.PAC + SMC_B.PAC + SMC_C.PAC + SMC_D.PAC + SMC_D.PAC + SMC_P.PAC + SMC_Z.PAC + +2005-03-16 librarian@cadsoft.de + * 40xx.lbr: Eagle 4.13r1 + new PWR3.SYM (VCC/VDD/VSS): + 4009.DEV + +2005-03-16 librarian@cadsoft.de + * rcl.lbr: Eagle 4.13r14 + added variants to L-EU.DEV: + 2200-12.7.PAC + 2200-15.24.PAC + +2005-03-15 librarian@cadsoft.de + * diode.lbr: Eagle 4.13r14 + added: + SUPPRESSOR-.DEV + SMBJ.PAC + SMBG.PAC + +2005-03-15 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.13r1 + added: + LTC1709-7.DEV + LTC1709-7.SYM + SSOP36.PAC + +2005-03-14 librarian@cadsoft.de + * diode.lbr: Eagle 4.13r1 + added variants to DIODE-.DEV: + DO214AA + DO214AC + DO214BA + renamed variant & package DO-214BA -> GF1 + +2005-03-11 librarian@cadsoft.de + * maxim.lbr: Eagle 4.13r1 + added: + MAX346*.DEV + MAX3467.DEV + MAX34*.DEV + MAX309*.DEV + +2005-03-09 librarian@cadsoft.de + * texas.lbr: Eagle 4.13r1 + added: + HTQFP-64-PAP.PAC + HTQFP-64-EXP.PAC + +2005-03-09 librarian@cadsoft.de + * texas.lbr: Eagle 4.13r1 + renamed: + SOP28WP.PAC -> HTSSOP28PWP.PAC + SOP24WP.PAC -> HTSSOP24PWP.PAC + SOP20WP.PAC -> HTSSOP20PWP.PAC + SOP16WP.PAC -> HTSSOP16PWP.PAC + SOP14WP.PAC -> HTSSOP14PWP.PAC + +2005-03-09 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.13r1 + added: + AD7568.DEV + AD7524*.DEV + +2005-03-08 librarian@cadsoft.de + * con-rib.lbr: Eagle 4.13r1 + extended several DEV/PAC descriptions: "Flachstecker / Faston" + +2005-03-07 librarian@cadsoft.de + * con-3m.lbr: Eagle 4.13r1 + added: + 2100-6310.PAC + 2100-6310-F.PAC + 2121-6311.PAC + 2121-6311-F.PAC + 2169-6313.PAC + 2169-6313-F.PAC + 2225-6315.PAC + 2225-6315-F.PAC + 2289-6317.PAC + 2289-6317-F.PAC + 2361-6319.PAC + 2361-6319-F.PAC + 2441-6321.PAC + 2441-6321-F.PAC + 2625-6325.PAC + 2625-6325-F.PAC + +2005-03-02 librarian@cadsoft.de + * texas.lbr: Eagle 4.13r1 + added: + SOP28WP.PAC + SOP24WP.PAC + SOP20WP.PAC + SOP16WP.PAC + SOP14WP.PAC + +2005-03-01 librarian@cadsoft.de + * plxtech.lbr: Eagle 4.13r1 + added: + NET2272.DEV + TQFP64.PAC + +2005-03-01 librarian@cadsoft.de + * diode.lbr: Eagle 4.13r1 + added variant SOD523: + DIODE_CAPACITANCE-.DEV + +2005-02-15 librarian@cadsoft.de + * microchip.lbr: Eagle 4.13r1 + added (877 with PLCC-Socket): + PIC16F87*.DEV + +2005-02-04 librarian@cadsoft.de + * rectifier.lbr: Eagle 4.13r1 + added variant B40S.PAC: + RECTIFIER.DEV + +2005-01-27 librarian@cadsoft.de + * con-vg.lbr: Eagle 4.13r1 + added: + STV-CD_128-M-ABCD.DEV + STV-CD_128-F-ABCD.DEV + +2005-01-26 librarian@cadsoft.de + * burr-brown.lbr: Eagle 4.13r1 + corrected package: + OPA4340.DEV + OPA4336.DEV + OPA4237.DEV + renamed: + SSOP16DB.PAC -> SSOP16BU.PAC + +2005-01-11 librarian@cadsoft.de + * *: Eagle 4.13r1 + updated libraries with ref-packages.lbr: + 40xx.lbr + atmel.lbr + micro-philips.lbr + supply1.lbr + analog-devices.lbr + transistor-small-signal.lbr + fuse.lbr + con-shiua-chyuan.lbr + exar.lbr + ic-package.lbr + linear.lbr + maxim.lbr + motorola-sensor-driver.lbr + rcl.lbr + resistor-dil.lbr + texas.lbr + 74xx-us.lbr + diode.lbr + smd-special.lbr + 74xx-eu.lbr + burr-brown.lbr + 74ac-logic.lbr + 74ttl-din.lbr + 45xx.lbr + ref-packages.lbr + +2005-01-11 librarian@cadsoft.de + * plxtech.lbr: Eagle 4.13r1 + added: + PCI9056.DEV + PBGA256.PAC + +2005-01-10 librarian@cadsoft.de + * atmel.lbr: Eagle 4.13r1 + added: + AT91RM9200.DEV + LFBGA256_A_291X326.PAC + +2004-12-21 librarian@cadsoft.de + * atmel.lbr: Eagle 4.13r1 + renamed pin (NOSI/DI/SDA/OC1A\)PB0 -> (MOSI/DI/SDA/OC1A\)PB0: + TINY26.SYM + +2004-12-16 librarian@cadsoft.de + * 74xx-us.lbr: Eagle 4.13 + added: + 74LS47.DEV + +2004-12-16 librarian@cadsoft.de + * 74xx-eu.lbr: Eagle 4.13 + added: + 74LS47.DEV + +2004-12-14 librarian@cadsoft.de + * maxim.lbr: Eagle 4.13 + copied MQFP80.PAC from refpackages.lbr: + MAX1150*.DEV + +2004-12-14 librarian@cadsoft.de + * atmel.lbr: Eagle 4.13 + added: + T89C51CC02*-TDSIM.DEV + T89C51CC02*-?IM.DEV + PLCC25.PAC + SO28W.PAC + SO24W.PAC + VQFP32.PAC + +2004-12-09 librarian@cadsoft.de + * micro-intel.lbr: Eagle 4.13 + set value OFF: + 8051.DEV + +2004-12-08 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + extended description with source, variant L: + 78*.DEV + +2004-12-06 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + MC33269-SO8.DEV + +2004-12-06 librarian@cadsoft.de + * motorola-sensor-driver.lbr: Eagle 4.13 + changed description HTML-Tag >b> to : + MC33395D.DEV + +2004-12-06 librarian@cadsoft.de + * led.lbr: Eagle 4.13 + added: + SA08.DEV + SC08.DEV + FX08.DEV + +2004-11-29 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.13 + Layer 254 cooling, applied + +2004-11-26 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + TDF8704.DEV + +2004-11-22 librarian@cadsoft.de + * micro-intel.lbr: Eagle 4.13 + added: + IXP4XXB-533.DEV (generate with BSDL file) + IXP425.DEV + +2004-11-19 librarian@cadsoft.de + * con-vg.lbr: Eagle 4.13 + added: + FACE48E.DEV + +2004-11-18 librarian@cadsoft.de + * atmel.lbr: Eagle 4.13 + added: + AT89C51*.DEV + AT89S51*.DEV + +2004-11-16 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + LM747H.DEV + LM747*.DEV + +2004-11-12 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.13 + added: + AD650.DEV with PLLC20.PAC from 74XXX.lbr + +2004-10-27 librarian@cadsoft.de + * rcl.lbr: Eagle 4.13 + corrected description 2.032mm: + E2-5.PAC + +2004-10-20 librarian@cadsoft.de + * ir.lbr: Eagle 4.13 + added: + IP2002.DEV + BGA-IP2002.PAC + +2004-10-20 librarian@cadsoft.de + * smd-special.lbr: Eagle 4.13 + renamed: + SWS001.DEV -> SWS010.DEV + DIP01.SYM -> DIP10.SYM + +2004-10-19 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + TO263-3.PAC + MC33215.DEV + TQFP52.PAC + placed >NAME and >VALUE: + SLA706.SYM + set PREFIX: + TDA1516BQ.DEV + +2004-10-19 librarian@cadsoft.de + * analog-devices.lbr: Eagle 4.13 + added: + ADXL202E.DEV + LCC8.PAC + +2004-10-15 librarian@cadsoft.de + * led.lbr: Eagle 4.13 + added: + MSA5*C.DEV + MSA5XXX.PAC + +2004-10-13 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + LM9044.DEV + +2004-10-07 librarian@cadsoft.de + * fuse.lbr: Eagle 4.13 + added: + FUSE_HOLDER_5X20MM.PAC + FUSE_HOLDER_MENTOR-1821.PAC + FUSE_HOLDER_SCHURTER-FAS.PAC + FUSE_HOLDER_WICKMANN-19596.PAC + FUSE.DEV + +2004-10-07 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.13 + changed layer Bottom SMD 62: + SLOT-1376408-1_1.8V.PAC + SLOT-1376408-1_2.5V.PAC + +2004-10-07 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.13 + new variant 827001.PAC: + FLOP-4W.DEV + new variant 350211.PAC: + FLOPPY4.DEV + +2004-10-07 librarian@cadsoft.de + * maxim.lbr: Eagle 4.13 + added: + MAX2323*.DEV (4 variants) + +2004-10-05 librarian@cadsoft.de + * micro-intel.lbr: Eagle 4.13 + added: + 8251A.DEV + +2004-09-27 librarian@cadsoft.de + * transistor-npn.lbr: Eagle 4.13 + updated with ref-packages SOT89 + +2004-09-27 librarian@cadsoft.de + * zetex.lbr: Eagle 4.13 + added: + NPNSOT89 (2 Collector-Pins) + PNPSOT89 (2 Collector-Pins) + +2004-09-27 librarian@cadsoft.de + * semicon-smd-ipc.lbr: Eagle 4.13 + updated with ref-packages.lbr + NPN-PRANSISTOR-2COL.DEV variant SOT98 + PNP-PRANSISTOR-2COL.DEV variant SOT98 + +2004-09-27 librarian@cadsoft.de + * transistor.lbr: Eagle 4.13 + updated with ref-packages.lbr + corrected pad name: + SOT89-ECB.PAC + new variant SOT89-BCE: + *-NPN.DEV + +2004-09-24 librarian@cadsoft.de + * ref-packages.lbr: Eagle 4.13 + SMD with Roundness, deleted wires on pad: + SOT89.PAC + SOT89-ECB.PAC + SOT89-BCE.PAC + deleted RECT on pad 3 and 4, pad 3 -> LONG, define mask: + SOT89-R.PAC + SOT89R.PAC + SOT89-W.PAC + SOT89R_INFINEON.PAC + renamed: + SOT89-ECB PAD + renamed (info from J105 Fairchild): + TO92R D-S-G PAD + changed pad sequence 321 -> 123: + TO92.PAC + copied from transistor-power.lbr: + MICRO3.PAC + +2004-09-24 librarian@cadsoft.de + * transistor.lbr: Eagle 4.13 + SMD with roundness, deleted wires on pad C + C@1: + SOT89-ECB.PAC + SOT89-BCE.PAC + +2004-09-22 librarian@cadsoft.de + * lattice.lbr: Eagle 4.13 + device 2064VET.DEV pin swapped: + 15 ispEN + 16 TDI/IN 0 + 37 TMS/IN 1 + 87 TDO/IN 2 + 59 TCK/IN 3 + +2004-09-21 librarian@cadsoft.de + * con-pc.lbr: Eagle 4.13 + added: + AGP.DEV + AGP_UC.DEV + +2004-09-17 librarian@cadsoft.de + * con-shiua-chyuan.lbr: Eagle 4.13 + added: + SCD-014-A.DEV + +2004-09-15 librarian@cadsoft.de + * con-pc.lbr: Eagle 4.13 + PCI-LONG-PAC SMD-Pads 2mm longer, + moved 0.635mm down + +2004-09-06 librarian@cadsoft.de + * silabs.lbr: Eagle 4.13 + C8051F30*.DEV + MLP11.PAC + +2004-08-31 librarian@cadsoft.de + * microchip.lbr: Eagle 4.13 + pin inverted WE, CE, OE: + 28C04.SYM + 28C16.SYM + 28C17.SYM + 28C64.SYM + +2004-08-25 librarian@cadsoft.de + * smd-special.lbr: Eagle 4.13 + added PLCC Socket + +2004-08-24 librarian@cadsoft.de + * linear.lbr: Eagle 4.13 + added: + SLA706*M.DEV + ZIP21.PAC + +2004-08-19 librarian@cadsoft.de + * zetex.lbr: Eagle 4.13 + renamed: + PN_MOSOP8.DEV-> PN_MOSFET-.DEV + corrected variant connection, swapped gate "-A" <-> "-B": + MSOP8 + SO8 + +2004-08-18 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.13 + added: + 1376408.DEV + 1-1376408-1.PAC + 1-1376408-4.PAC + 6-1376408-1.PAC + SLOT-1376408-1_1.8V.PAC + SLOT-1376408-1_2.5V.PAC + +2004-08-18 librarian@cadsoft.de + * etx-board.lbr: Eagle 4.13 + added: + FX8-100S-SV.PAC + ETC-BOARD.PAC + +2004-08-12 librarian@cadsoft.de + * con-ptr500.lbr: Eagle 4.12 + renamed device & package: + AK505/2,GRAU -> AK500/2-5.0-H-GRAU + AK505/2DS,GRAU -> AK500/2DS-5.0-H-GRAU + AKZ505/2,GRAU -> AKZ500/2-5.08-H-GRAU + AK505/x ->AK500/x-H + +2004-08-12 librarian@cadsoft.de + * linear-technology.lbr: Eagle 4.12 + renamed gate G$1 -> NC: + LT1129CS8.DEV + +2004-08-11 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.12 + added: + 52745-0490.DEV + 52745-0690.DEV + 52745-0790.DEV + 52745-0890.DEV + 52745-0990.DEV + 52745-1090.DEV + 52745-1190.DEV + 52745-1290.DEV + 52745-1390.DEV + 52745-1490.DEV + 52745-1590.DEV + 52745-1690.DEV + 52745-1790.DEV + 52745-1890.DEV + 52745-1990.DEV + 52745-2090.DEV + 52745-2190.DEV + 52745-2290.DEV + 52745-2390.DEV + 52745-2490.DEV + 52745-2590.DEV + 52745-2690.DEV + 52745-2790.DEV + 52745-2890.DEV + 52745-2990.DEV + 52745-3090.DEV + 52559-0692.DEV + 52559-0890.DEV + 52559-0992.DEV + 52559-1092.DEV + 52559-1292.DEV + 52559-1390.DEV + 52559-1492.DEV + 52559-1592.DEV + 52559-1692.DEV + 52559-1792.DEV + 52559-1890.DEV + 52559-2092.DEV + 52559-2192.DEV + 52559-2290.DEV + 52559-2492.DEV + 52559-2590.DEV + 52559-2692.DEV + 52559-2892.DEV + 52559-3092.DEV + 52559-3292.DEV + 52559-3390.DEV + 52559-3692.DEV + 52559-4092.DEV + +2004-07-09 librarian@cadsoft.de + * trafo-xicon.lbr: Eagle 4.12 + added: + 42TL.DEV + 42TC.DEV + 42TM.DEV + +2004-07-01 librarian@cadsoft.de + * infineon.lbr: Eagle 4.12 + added: + BTS428L2.DEV + TO252-5-11.PAC + +2004-06-30 librarian@cadsoft.de + * ir.lbr: Eagle 4.12 + added: + IR2520D.DEV + +2004-06-30 librarian@cadsoft.de + * rectifier.lbr: Eagle 4.12 + collected all packages with 4 pads: + RECTIFIER-.DEV + +2004-06-17 librarian@cadsoft.de + * con-phoenix-508.lbr: Eagle 4.12 + corrected package: + MKKDS02.DEV + MKKDS03.DEV + MKKDS04.DEV + MKKDS05.DEV + MKKDS06.DEV + MKKDS07.DEV + MKKDS08.DEV + MKKDS09.DEV + MKKDS10.DEV + MKKDS11.DEV + MKKDS12.DEV + +2004-06-14 librarian@cadsoft.de + * diode.lbr: Eagle 4.12 + new device, added variants: + DIODE-.DEV + +2004-05-26 librarian@cadsoft.de + * transistor-npn.lbr: Eagle 4.12 + deleted, is PNP: + BC807.DEV + BC808.DEV + +2004-05-25 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.12 + deleted 0.0380mm holes: + FTOP20.PAC + MTOP20.PAC + SMDTOP20.PAC + +2004-05-24 librarian@cadsoft.de + * transistor-npn.lbr: Eagle 4.12 + deleted: + BD244.DEV + +2004-05-24 librarian@cadsoft.de + * transistor-pnp.lbr: Eagle 4.12 + added: + BD244.DEV + +2004-05-24 librarian@cadsoft.de + * transistor.lbr: Eagle 4.12 + added: + BD244.DEV + +2004-05-13 librarian@cadsoft.de + * led.lbr: Eagle 4.12 + generated tStop tCream mask: + OSRAM-SIDELED.PAC + +2004-05-04 librarian@cadsoft.de + * 19inch.lbr: Eagle 4.12 + addad: + 6HE-VG64AC.DEV + +2004-04-07 librarian@cadsoft.de + * micro-motorola.lbr: Eagle 4.12 + added: + 68HC908GP32*FB.DEV + TQFP44.PAC + 68HC908GP32*B.DEV + 68HC908GP32*.DEV + +2004-03-31 librarian@cadsoft.de + * micro-intel.lbr: Eagle 4.11 + added PLCC(Socked) + PQFP44 variant: + 8051.DEV + 8052.DEV + +2004-03-31 librarian@cadsoft.de + * relay.lbr: Eagle 4.11 + added: + S202S12.DEV + +2004-03-23 librarian@cadsoft.de + * infineon.lbr: Eagle 4.11 + replaced package: + C167.PAC <- P-TQFP-144-19.PAC + +2004-03-22 librarian@cadsoft.de + * led.lbr: Eagle 4.11 + all Osram-LED: SMD and PAD tStop & tCream off + +2004-03-22 librarian@cadsoft.de + * transistor.lbr: Eagle 4.11 + corrected variants ECB --> BCE: + DB243.DEV + DB244.DEV + +2004-03-22 librarian@cadsoft.de + * frames.lbr: Eagle 4.11 + extended symbol: + A3L-LOC.SYM + +2004-03-19 librarian@cadsoft.de + * frames.lbr: Eagle 4.11 + changed wire width: + A3L-LOC.SYM + corrected symbol: + PORT.SYM + +2004-03-10 librarian@cadsoft.de + * am29-memory.lbr: Eagle 4.11 + added: + AM29L640M*.DEV + TSOP56.PAC + TSOP56R.PAC + +2004-03-08 librarian@cadsoft.de + * atmel.lbr: Eagle 4.11 + added: + AT8*C51SND1C.DEV + PLCC.PAC + TQFP80.PAC + BGA81.PAC + +2004-03-05 librarian@cadsoft.de + * 40xx.lbr: Eagle 4.11 + swapped pins 3/14 VDD/VSS: + 4045.DEV + +2004-02-26 librarian@cadsoft.de + * linear.lbr: Eagle 4.11 + added: + LM334.DEV + LM134.DEV + LM234.DEV + TO46.PAC + +2004-02-25 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.11 + set display Pad layer + +2004-02-23 librarian@cadsoft.de + * 40xx.lbr: Eagle 4.11 + added: + 4045.DEV + +2004-02-23 librarian@cadsoft.de + * micro-philips.lbr: Eagle 4.11 + added: + SOT639-2.PAC + +2004-02-23 librarian@cadsoft.de + * con-lsta.lbr: Eagle 4.11 + swapped pads 35 <-> 36: + FE18-2W.PAC + +2004-02-11 librarian@cadsoft.de + * ftdichip.lbr: Eagle 4.11 + wrong grid, copied from exar.lbr and corrected: + LQFP32.PAC + +2004-02-11 librarian@cadsoft.de + * exar.lbr: Eagle 4.11 + centered origin: + QFP32.PAC + +2004-01-26 librarian@cadsoft.de + * rcl.lbr: Eagle 4.11 + added: + POWER-CHOKE_WE-TPC.PAC + +2004-01-19 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.11 + extended technology with 10, 11, 12, 20, 21, 22, 23: + MOC30*M.DEV + +2004-01-19 librarian@cadsoft.de + * triac.lbr: Eagle 4.11 + renamed: + BRX44.DEV -> BRX4*.DEV + added variants: + BRX44.DEV + BRX47.DEV + BRX49.DEV + added: + BT138.DEV + +2004-01-19 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.11 + added: + IFRP240.DEV + +2003-12-01 librarian@cadsoft.de + * relay.lbr: Eagle 4.11 + 2 pads (4+5 & 9+10) overlapped, pad 6 to 9 renamed 6 to 8: + AQW27-DIL08.PAC + +2003-12-01 librarian@cadsoft.de + * relay.lbr: Eagle 4.11 + 2 pads (4+5) overlapped, pad 5 deleted: + AQY27.PAC + +2003-11-21 librarian@cadsoft.de + * transistor-fet.lbr: Eagle 4.11 + added: + SSOT6.PAC (SuperSOT-6) + +2003-11-18 librarian@cadsoft.de + * linear.lbr: Eagle 4.11 + added: + TDA1516BQ.DEV + MULTIWAT-SIL13.PAC + +2003-11-14 librarian@cadsoft.de + * xilinx.lbr: Eagle 4.11 + 3rd part - collected all Xilinx-Library LBR + SCR from download + +2003-11-02 librarian@cadsoft.de + * atmel.lbr: Eagle 4.11 + deleted: + TQFP48-0762.PAC + corrected pad coordinate: + TQPF64.PAC + +2003-10-28 librarian@cadsoft.de + * texas.lbr: Eagle 4.11 + added: + MSP430F1*.DEV + copied from smd-ipc.lbr: + SQFP-S-10X10-64.PAC + +2003-10-21 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 4.11 + changed layer of wire segments 21 -> 51: + SO16.PAC + +2003-10-21 librarian@cadsoft.de + * smd-ipc.lbr: Eagle 4.11 + renamed pads 3, 4 -> 2, 3: + SOT23W.PAC + +2003-09-29 librarian@cadsoft.de + * transistor-npn.lbr: Eagle 4.11 + corrected connection of variant BCE: + BD535.DEV + +2003-08-20 librarian@cadsoft.de + * con-pc104.lbr: Eagle 4.11 + changed 4 holes to 4 pads: + PC104-STANDARD.PAC + +2003-08-13 librarian@cadsoft.de + * microchip.lbr: Eagle 4.11 + corrected connection of PLLC variant: + PIC16C74*-44.DEV + +2003-08-08 librarian@cadsoft.de + * con-neutrik_ag.lbr: Eagle 4.11 + added: + MC3FAH-0.DEV + MC3FAH1.DEV + MC3FAHL1.DEV + MC3FAHL1-0.DEV + MC3FAHR1.DEV + MC3FAHR1-0.DEV + MC3FAV1.DEV + MC3FAV1-0.DEV + MC3FBH1.DEV + MC3FBH1-B.DEV + MC3FBHL1.DEV + MC3FBHL1-B.DEV + MC3FBHR1.DEV + MC3FBHR1-B.DEV + MC3FBV1-B.DEV + NC3FAH2.DEV + NC3FAH2-0.DEV + NC3FAHR2.DEV + NC3FAHR2-0.DEV + NC3FAV2.DEV + NC3FAV2-0.DEV + NC3FBH2.DEV + NC3FBH2-B.DEV + NC3FBHR2.DEV + NC3FBHR2-B.DEV + NC3FBV1.DEV + NC3FBV2.DEV + NC3FBV2-B.DEV + NC3FD-H.DEV + NC3FD-H-B.DEV + NC3FD-H-BAG.DEV + NC3FD-V.DEV + NC3FD-V-B.DEV + NC3FD-V-BAG.DEV + NC3MAV.DEV + NC3MBH.DEV + NC3MBH-B.DEV + NC3MBHL.DEV + NC3MBHL-B.DEV + NC3MBHR.DEV + NC3MBHR-B.DEV + NC3MBV.DEV + NC3MBV-B.DEV + NC3MD-H.DEV + NC3MD-H-B.DEV + NC3MD-V.DEV + NC3MD-V-B.DEV + NC3MD-V-BAG.DEV + NC4FAH.DEV + NC4FAH-0.DEV + NC4FAV.DEV + NC4FAV-0.DEV + NC4FBH.DEV + NC4FBH-0.DEV + NC4FBV.DEV + NC4FBV-0.DEV + NC4MAH.DEV + NC4MAV.DEV + NC4MBH.DEV + NC4MBV.DEV + NC5FAH.DEV + NC5FAV.DEV + NC5FBH.DEV + NC5FBH-B.DEV + NC5FBV.DEV + NC5FGV-B.DEV + NC5MAH.DEV + NC5MAV.DEV + NC5MBH.DEV + NC5MBN-B.DEV + NC5MBV.DEV + NCJ10FI-H.DEV + NCJ10FI-H-0.DEV + +2003-08-08 librarian@cadsoft.de + * con-amp.lbr: Eagle 4.11 + added: + 0569564-*.DEV + +2003-08-08 librarian@cadsoft.de + * texas.lbr: Eagle 4.11 + added: + TLC7701D.DEV + TLC7701FK.DEV + TLC7701P.DEV + TLC7701PW.DEV + TLC7703D.DEV + TLC7703FK.DEV + TLC7703P.DEV + TLC7703PW.DEV + TLC7705D.DEV + TLC7705FK.DEV + TLC7705P.DEV + TLC7705PW.DEV + TLC7725D.DEV + TLC7725FK.DEV + TLC7725P.DEV + TLC7725PW.DEV + TLC7733D.DEV + TLC7733FK.DEV + TLC7733P.DEV + TLC7733PW.DEV + +2003-08-05 librarian@cadsoft.de + * holes.lbr: Eagle 4.11 + rotated pin (origin): + MOUNT-PAD.SYM + MOUNT-PAD-SQUARE.SYM + +2003-08-05 librarian@cadsoft.de + * triac.lbr: Eagle 4.11 + extended package descriptions + +2003-08-05 librarian@cadsoft.de + * transistor-power.lbr: Eagle 4.11 + set PREFIX: + IRF?5305.DEV + +2003-08-05 librarian@cadsoft.de + * transistor.lbr: Eagle 4.11 + extended description: + TO264.PAC + TO264V.PAC + +2003-08-05 librarian@cadsoft.de + * texas.lbr: Eagle 4.11 + placed >NAME and >VALUE: + TMS320VC5402.SYM + +2003-08-05 librarian@cadsoft.de + * testpad.lbr: Eagle 4.11 + extended description + +2003-08-05 librarian@cadsoft.de + * special-pad.lbr: Eagle 4.11 + deleted + +2003-08-05 librarian@cadsoft.de + * resistor-sil.lbr: Eagle 4.11 + set PREFIX: + RM-10.DEV + RM-12.EV + +2003-08-05 librarian@cadsoft.de + * relay.lbr: Eagle 4.11 + corrected origin: + AQ-B.PAC + AQE.PAC + SIL13.PAC + V23040201.PAC + +2003-08-05 librarian@cadsoft.de + * opto-vishay.lbr: Eagle 4.11 + set Prefix, placed >NAME and >VALUE in symbol: + TFD?4100.DEV + +2003-08-05 librarian@cadsoft.de + * optocoupler.lbr: Eagle 4.11 + deleted wire in layer 17: + SFH9500 + +2003-08-05 librarian@cadsoft.de + * isd.lbr: Eagle 4.11 + deleted: + 0LIESMIC.SYM + +2003-08-04 librarian@cadsoft.de + * micro-motorola.lbr: Eagle 4.11 + set PREFIX: + DSP56F807.DEV + +2003-08-04 librarian@cadsoft.de + * maxim.lbr: Eagle 4.11 + set PERFIX: + DS2405.DEV + DS2890.DEV + +2003-08-04 librarian@cadsoft.de + * linear.lbr: Eagle 4.11 + set PREFIX: + TL494*.DEV + renamed: + LM331.DEV -> LM331*.DEV + +2003-08-04 librarian@cadsoft.de + * led.lbr: Eagle 4.11 + deleted wire in Layer 17: + CHIPLED_1206.PAC + OSRAM-SIDELED.PAC + +2003-08-04 librarian@cadsoft.de + * exar.lbr: Eagle 4.11 + changed wire width in layer 51, 0 -> 2mil: + PLCC20.PAC + PLCC28.PAC + +2003-08-04 librarian@cadsoft.de + * discrete.lbr: Eagle 4.11 + checked description + checked pad on origin + +2003-08-04 librarian@cadsoft.de + * diode.lbr: Eagle 4.11 + set PREFIX: + BAS70-0x.DEV + extended description: + MINIMELF.PAC + +2003-08-04 librarian@cadsoft.de + * con-wago255.lbr: Eagle 4.11 + extended description: + 255-401-5.PAC + 255-402-5.PAC + 255-402-508.PAC + 255-403-5.PAC + 255-403-508.PAC + 255-404-5.PAC + 255-405-5.PAC + 255-406-5.PAC + 255-407-5.PAC + 255-408-5.PAC + 255-409-5.PAC + 255-410-5.PAC + 255-412-5.PAC + 255-416-5.PAC + 255-424-5.PAC + 255-436-5.PAC + 255-448-5.PAC + deleted (double) text ''1': + 255-402-508.PAC + +2003-08-04 librarian@cadsoft.de + * con-wago.lbr: Eagle 4.11 + set PREFIX: + WAGO1/2/3.DEV + +2003-07-31 librarian@cadsoft.de + * con-neutrik_ag.lbr: Eagle 4.11 + extended library description + +2003-07-31 librarian@cadsoft.de + * con-molex.lbr: Eagle 4.11 + changed layer 52 -> 51: + 87360-SCSI.PAC + +2003-07-31 librarian@cadsoft.de + * con-lumberg.lbr: Eagle 4.11 + extended .DEV & .PAC description + +2003-07-31 librarian@cadsoft.de + * rectifier.lbr: Eagle 4.11 + added symbol GB2.SYM (2 pin connection): + B25A-.DEV diff --git a/eagle-5.7.0/lbr/DESCRIPTION b/eagle-5.7.0/lbr/DESCRIPTION new file mode 100644 index 0000000..58a0a10 --- /dev/null +++ b/eagle-5.7.0/lbr/DESCRIPTION @@ -0,0 +1,38 @@ + +Libraries +

+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. + + +Bibliotheken +

+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. + diff --git a/eagle-5.7.0/lbr/advanced-test-technologies.lbr b/eagle-5.7.0/lbr/advanced-test-technologies.lbr new file mode 100644 index 0000000..d39050b Binary files /dev/null and b/eagle-5.7.0/lbr/advanced-test-technologies.lbr differ diff --git a/eagle-5.7.0/lbr/agilent-technologies.lbr b/eagle-5.7.0/lbr/agilent-technologies.lbr new file mode 100644 index 0000000..4d48f5c Binary files /dev/null and b/eagle-5.7.0/lbr/agilent-technologies.lbr differ diff --git a/eagle-5.7.0/lbr/allegro.lbr b/eagle-5.7.0/lbr/allegro.lbr new file mode 100644 index 0000000..a2ba4b3 Binary files /dev/null and b/eagle-5.7.0/lbr/allegro.lbr differ diff --git a/eagle-5.7.0/lbr/altera-cyclone-II.lbr b/eagle-5.7.0/lbr/altera-cyclone-II.lbr new file mode 100644 index 0000000..41d1456 Binary files /dev/null and b/eagle-5.7.0/lbr/altera-cyclone-II.lbr differ diff --git a/eagle-5.7.0/lbr/altera-cyclone-III.lbr b/eagle-5.7.0/lbr/altera-cyclone-III.lbr new file mode 100644 index 0000000..3c107bf Binary files /dev/null and b/eagle-5.7.0/lbr/altera-cyclone-III.lbr differ diff --git a/eagle-5.7.0/lbr/altera-stratix-iv.lbr b/eagle-5.7.0/lbr/altera-stratix-iv.lbr new file mode 100644 index 0000000..8127472 Binary files /dev/null and b/eagle-5.7.0/lbr/altera-stratix-iv.lbr differ diff --git a/eagle-5.7.0/lbr/altera.lbr b/eagle-5.7.0/lbr/altera.lbr new file mode 100644 index 0000000..e56368a Binary files /dev/null and b/eagle-5.7.0/lbr/altera.lbr differ diff --git a/eagle-5.7.0/lbr/am29-memory.lbr b/eagle-5.7.0/lbr/am29-memory.lbr new file mode 100644 index 0000000..c7f4e01 Binary files /dev/null and b/eagle-5.7.0/lbr/am29-memory.lbr differ diff --git a/eagle-5.7.0/lbr/amd-mach.lbr b/eagle-5.7.0/lbr/amd-mach.lbr new file mode 100644 index 0000000..0abbb36 Binary files /dev/null and b/eagle-5.7.0/lbr/amd-mach.lbr differ diff --git a/eagle-5.7.0/lbr/amd.lbr b/eagle-5.7.0/lbr/amd.lbr new file mode 100644 index 0000000..05221c9 Binary files /dev/null and b/eagle-5.7.0/lbr/amd.lbr differ diff --git a/eagle-5.7.0/lbr/amis.lbr b/eagle-5.7.0/lbr/amis.lbr new file mode 100644 index 0000000..b0fc886 Binary files /dev/null and b/eagle-5.7.0/lbr/amis.lbr differ diff --git a/eagle-5.7.0/lbr/analog-devices.lbr b/eagle-5.7.0/lbr/analog-devices.lbr new file mode 100644 index 0000000..af1e2d4 Binary files /dev/null and b/eagle-5.7.0/lbr/analog-devices.lbr differ diff --git a/eagle-5.7.0/lbr/ase.lbr b/eagle-5.7.0/lbr/ase.lbr new file mode 100644 index 0000000..7b9fc09 Binary files /dev/null and b/eagle-5.7.0/lbr/ase.lbr differ diff --git a/eagle-5.7.0/lbr/atmel.lbr b/eagle-5.7.0/lbr/atmel.lbr new file mode 100644 index 0000000..07adc53 Binary files /dev/null and b/eagle-5.7.0/lbr/atmel.lbr differ diff --git a/eagle-5.7.0/lbr/austriamicrosystems.lbr b/eagle-5.7.0/lbr/austriamicrosystems.lbr new file mode 100644 index 0000000..3460222 Binary files /dev/null and b/eagle-5.7.0/lbr/austriamicrosystems.lbr differ diff --git a/eagle-5.7.0/lbr/avago.lbr b/eagle-5.7.0/lbr/avago.lbr new file mode 100644 index 0000000..a16ccfe Binary files /dev/null and b/eagle-5.7.0/lbr/avago.lbr differ diff --git a/eagle-5.7.0/lbr/axis.lbr b/eagle-5.7.0/lbr/axis.lbr new file mode 100644 index 0000000..8e3be95 Binary files /dev/null and b/eagle-5.7.0/lbr/axis.lbr differ diff --git a/eagle-5.7.0/lbr/battery.lbr b/eagle-5.7.0/lbr/battery.lbr new file mode 100644 index 0000000..775a465 Binary files /dev/null and b/eagle-5.7.0/lbr/battery.lbr differ diff --git a/eagle-5.7.0/lbr/burr-brown.lbr b/eagle-5.7.0/lbr/burr-brown.lbr new file mode 100644 index 0000000..0f86460 Binary files /dev/null and b/eagle-5.7.0/lbr/burr-brown.lbr differ diff --git a/eagle-5.7.0/lbr/busbar.lbr b/eagle-5.7.0/lbr/busbar.lbr new file mode 100644 index 0000000..d321cc4 Binary files /dev/null and b/eagle-5.7.0/lbr/busbar.lbr differ diff --git a/eagle-5.7.0/lbr/buzzer.lbr b/eagle-5.7.0/lbr/buzzer.lbr new file mode 100644 index 0000000..fc6f12f Binary files /dev/null and b/eagle-5.7.0/lbr/buzzer.lbr differ diff --git a/eagle-5.7.0/lbr/c-trimm.lbr b/eagle-5.7.0/lbr/c-trimm.lbr new file mode 100644 index 0000000..5218182 Binary files /dev/null and b/eagle-5.7.0/lbr/c-trimm.lbr differ diff --git a/eagle-5.7.0/lbr/california-micro-devices.lbr b/eagle-5.7.0/lbr/california-micro-devices.lbr new file mode 100644 index 0000000..4693826 Binary files /dev/null and b/eagle-5.7.0/lbr/california-micro-devices.lbr differ diff --git a/eagle-5.7.0/lbr/capacitor-wima.lbr b/eagle-5.7.0/lbr/capacitor-wima.lbr new file mode 100644 index 0000000..e9d9fc9 Binary files /dev/null and b/eagle-5.7.0/lbr/capacitor-wima.lbr differ diff --git a/eagle-5.7.0/lbr/chipcard-siemens.lbr b/eagle-5.7.0/lbr/chipcard-siemens.lbr new file mode 100644 index 0000000..e18bab8 Binary files /dev/null and b/eagle-5.7.0/lbr/chipcard-siemens.lbr differ diff --git a/eagle-5.7.0/lbr/cirrus-logic.lbr b/eagle-5.7.0/lbr/cirrus-logic.lbr new file mode 100644 index 0000000..02854ae Binary files /dev/null and b/eagle-5.7.0/lbr/cirrus-logic.lbr differ diff --git a/eagle-5.7.0/lbr/con-3m.lbr b/eagle-5.7.0/lbr/con-3m.lbr new file mode 100644 index 0000000..fde285a Binary files /dev/null and b/eagle-5.7.0/lbr/con-3m.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp-champ.lbr b/eagle-5.7.0/lbr/con-amp-champ.lbr new file mode 100644 index 0000000..02be76e Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp-champ.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp-micromatch.lbr b/eagle-5.7.0/lbr/con-amp-micromatch.lbr new file mode 100644 index 0000000..f9c191d Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp-micromatch.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp-mt.lbr b/eagle-5.7.0/lbr/con-amp-mt.lbr new file mode 100644 index 0000000..c18bda3 Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp-mt.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp-mt6.lbr b/eagle-5.7.0/lbr/con-amp-mt6.lbr new file mode 100644 index 0000000..edfe06a Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp-mt6.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp-quick.lbr b/eagle-5.7.0/lbr/con-amp-quick.lbr new file mode 100644 index 0000000..c0506ac Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp-quick.lbr differ diff --git a/eagle-5.7.0/lbr/con-amp.lbr b/eagle-5.7.0/lbr/con-amp.lbr new file mode 100644 index 0000000..77208b3 Binary files /dev/null and b/eagle-5.7.0/lbr/con-amp.lbr differ diff --git a/eagle-5.7.0/lbr/con-amphenol.lbr b/eagle-5.7.0/lbr/con-amphenol.lbr new file mode 100644 index 0000000..3b491f1 Binary files /dev/null and b/eagle-5.7.0/lbr/con-amphenol.lbr differ diff --git a/eagle-5.7.0/lbr/con-avx.lbr b/eagle-5.7.0/lbr/con-avx.lbr new file mode 100644 index 0000000..cc23ec9 Binary files /dev/null and b/eagle-5.7.0/lbr/con-avx.lbr differ diff --git a/eagle-5.7.0/lbr/con-berg.lbr b/eagle-5.7.0/lbr/con-berg.lbr new file mode 100644 index 0000000..008e03c Binary files /dev/null and b/eagle-5.7.0/lbr/con-berg.lbr differ diff --git a/eagle-5.7.0/lbr/con-bosch.lbr b/eagle-5.7.0/lbr/con-bosch.lbr new file mode 100644 index 0000000..dbe6351 Binary files /dev/null and b/eagle-5.7.0/lbr/con-bosch.lbr differ diff --git a/eagle-5.7.0/lbr/con-chipcard-iso7816.lbr b/eagle-5.7.0/lbr/con-chipcard-iso7816.lbr new file mode 100644 index 0000000..3a32225 Binary files /dev/null and b/eagle-5.7.0/lbr/con-chipcard-iso7816.lbr differ diff --git a/eagle-5.7.0/lbr/con-coax.lbr b/eagle-5.7.0/lbr/con-coax.lbr new file mode 100644 index 0000000..476f3da Binary files /dev/null and b/eagle-5.7.0/lbr/con-coax.lbr differ diff --git a/eagle-5.7.0/lbr/con-commcon.lbr b/eagle-5.7.0/lbr/con-commcon.lbr new file mode 100644 index 0000000..0290d16 Binary files /dev/null and b/eagle-5.7.0/lbr/con-commcon.lbr differ diff --git a/eagle-5.7.0/lbr/con-conrad.lbr b/eagle-5.7.0/lbr/con-conrad.lbr new file mode 100644 index 0000000..22cb1f4 Binary files /dev/null and b/eagle-5.7.0/lbr/con-conrad.lbr differ diff --git a/eagle-5.7.0/lbr/con-cpci.lbr b/eagle-5.7.0/lbr/con-cpci.lbr new file mode 100644 index 0000000..a0d3447 Binary files /dev/null and b/eagle-5.7.0/lbr/con-cpci.lbr differ diff --git a/eagle-5.7.0/lbr/con-cui.lbr b/eagle-5.7.0/lbr/con-cui.lbr new file mode 100644 index 0000000..4263bba Binary files /dev/null and b/eagle-5.7.0/lbr/con-cui.lbr differ diff --git a/eagle-5.7.0/lbr/con-cypressindustries.lbr b/eagle-5.7.0/lbr/con-cypressindustries.lbr new file mode 100644 index 0000000..bafa2e9 Binary files /dev/null and b/eagle-5.7.0/lbr/con-cypressindustries.lbr differ diff --git a/eagle-5.7.0/lbr/con-deutsch.lbr b/eagle-5.7.0/lbr/con-deutsch.lbr new file mode 100644 index 0000000..eb4ccf7 Binary files /dev/null and b/eagle-5.7.0/lbr/con-deutsch.lbr differ diff --git a/eagle-5.7.0/lbr/con-dil.lbr b/eagle-5.7.0/lbr/con-dil.lbr new file mode 100644 index 0000000..13857a9 Binary files /dev/null and b/eagle-5.7.0/lbr/con-dil.lbr differ diff --git a/eagle-5.7.0/lbr/con-ebyelectro.lbr b/eagle-5.7.0/lbr/con-ebyelectro.lbr new file mode 100644 index 0000000..f0a346f Binary files /dev/null and b/eagle-5.7.0/lbr/con-ebyelectro.lbr differ diff --git a/eagle-5.7.0/lbr/con-elco.lbr b/eagle-5.7.0/lbr/con-elco.lbr new file mode 100644 index 0000000..230d555 Binary files /dev/null and b/eagle-5.7.0/lbr/con-elco.lbr differ diff --git a/eagle-5.7.0/lbr/con-erni.lbr b/eagle-5.7.0/lbr/con-erni.lbr new file mode 100644 index 0000000..046a88c Binary files /dev/null and b/eagle-5.7.0/lbr/con-erni.lbr differ diff --git a/eagle-5.7.0/lbr/con-faston.lbr b/eagle-5.7.0/lbr/con-faston.lbr new file mode 100644 index 0000000..f62746a Binary files /dev/null and b/eagle-5.7.0/lbr/con-faston.lbr differ diff --git a/eagle-5.7.0/lbr/con-fci.lbr b/eagle-5.7.0/lbr/con-fci.lbr new file mode 100644 index 0000000..acf94f7 Binary files /dev/null and b/eagle-5.7.0/lbr/con-fci.lbr differ diff --git a/eagle-5.7.0/lbr/con-friwo.lbr b/eagle-5.7.0/lbr/con-friwo.lbr new file mode 100644 index 0000000..6bdbb67 Binary files /dev/null and b/eagle-5.7.0/lbr/con-friwo.lbr differ diff --git a/eagle-5.7.0/lbr/con-harting-h.lbr b/eagle-5.7.0/lbr/con-harting-h.lbr new file mode 100644 index 0000000..03adf3a Binary files /dev/null and b/eagle-5.7.0/lbr/con-harting-h.lbr differ diff --git a/eagle-5.7.0/lbr/con-harting-ml.lbr b/eagle-5.7.0/lbr/con-harting-ml.lbr new file mode 100644 index 0000000..ad7e55f Binary files /dev/null and b/eagle-5.7.0/lbr/con-harting-ml.lbr differ diff --git a/eagle-5.7.0/lbr/con-harting-v.lbr b/eagle-5.7.0/lbr/con-harting-v.lbr new file mode 100644 index 0000000..246ea58 Binary files /dev/null and b/eagle-5.7.0/lbr/con-harting-v.lbr differ diff --git a/eagle-5.7.0/lbr/con-harting.lbr b/eagle-5.7.0/lbr/con-harting.lbr new file mode 100644 index 0000000..432e9ae Binary files /dev/null and b/eagle-5.7.0/lbr/con-harting.lbr differ diff --git a/eagle-5.7.0/lbr/con-hirose.lbr b/eagle-5.7.0/lbr/con-hirose.lbr new file mode 100644 index 0000000..d489a76 Binary files /dev/null and b/eagle-5.7.0/lbr/con-hirose.lbr differ diff --git a/eagle-5.7.0/lbr/con-hirschmann.lbr b/eagle-5.7.0/lbr/con-hirschmann.lbr new file mode 100644 index 0000000..bcb205f Binary files /dev/null and b/eagle-5.7.0/lbr/con-hirschmann.lbr differ diff --git a/eagle-5.7.0/lbr/con-jack.lbr b/eagle-5.7.0/lbr/con-jack.lbr new file mode 100644 index 0000000..26ed09b Binary files /dev/null and b/eagle-5.7.0/lbr/con-jack.lbr differ diff --git a/eagle-5.7.0/lbr/con-jae.lbr b/eagle-5.7.0/lbr/con-jae.lbr new file mode 100644 index 0000000..69fb46e Binary files /dev/null and b/eagle-5.7.0/lbr/con-jae.lbr differ diff --git a/eagle-5.7.0/lbr/con-jst.lbr b/eagle-5.7.0/lbr/con-jst.lbr new file mode 100644 index 0000000..d35b80a Binary files /dev/null and b/eagle-5.7.0/lbr/con-jst.lbr differ diff --git a/eagle-5.7.0/lbr/con-kycon.lbr b/eagle-5.7.0/lbr/con-kycon.lbr new file mode 100644 index 0000000..4e2f443 Binary files /dev/null and b/eagle-5.7.0/lbr/con-kycon.lbr differ diff --git a/eagle-5.7.0/lbr/con-lemo.lbr b/eagle-5.7.0/lbr/con-lemo.lbr new file mode 100644 index 0000000..3bea226 Binary files /dev/null and b/eagle-5.7.0/lbr/con-lemo.lbr differ diff --git a/eagle-5.7.0/lbr/con-leotronics.lbr b/eagle-5.7.0/lbr/con-leotronics.lbr new file mode 100644 index 0000000..63196f1 Binary files /dev/null and b/eagle-5.7.0/lbr/con-leotronics.lbr differ diff --git a/eagle-5.7.0/lbr/con-lsta.lbr b/eagle-5.7.0/lbr/con-lsta.lbr new file mode 100644 index 0000000..49fbec0 Binary files /dev/null and b/eagle-5.7.0/lbr/con-lsta.lbr differ diff --git a/eagle-5.7.0/lbr/con-lstb.lbr b/eagle-5.7.0/lbr/con-lstb.lbr new file mode 100644 index 0000000..5a383a6 Binary files /dev/null and b/eagle-5.7.0/lbr/con-lstb.lbr differ diff --git a/eagle-5.7.0/lbr/con-lumberg.lbr b/eagle-5.7.0/lbr/con-lumberg.lbr new file mode 100644 index 0000000..fa79369 Binary files /dev/null and b/eagle-5.7.0/lbr/con-lumberg.lbr differ diff --git a/eagle-5.7.0/lbr/con-ml.lbr b/eagle-5.7.0/lbr/con-ml.lbr new file mode 100644 index 0000000..3a55da2 Binary files /dev/null and b/eagle-5.7.0/lbr/con-ml.lbr differ diff --git a/eagle-5.7.0/lbr/con-molex.lbr b/eagle-5.7.0/lbr/con-molex.lbr new file mode 100644 index 0000000..9805fd9 Binary files /dev/null and b/eagle-5.7.0/lbr/con-molex.lbr differ diff --git a/eagle-5.7.0/lbr/con-neutrik_ag.lbr b/eagle-5.7.0/lbr/con-neutrik_ag.lbr new file mode 100644 index 0000000..948e05d Binary files /dev/null and b/eagle-5.7.0/lbr/con-neutrik_ag.lbr differ diff --git a/eagle-5.7.0/lbr/con-omron.lbr b/eagle-5.7.0/lbr/con-omron.lbr new file mode 100644 index 0000000..6d53441 Binary files /dev/null and b/eagle-5.7.0/lbr/con-omron.lbr differ diff --git a/eagle-5.7.0/lbr/con-panasonic.lbr b/eagle-5.7.0/lbr/con-panasonic.lbr new file mode 100644 index 0000000..254616f Binary files /dev/null and b/eagle-5.7.0/lbr/con-panasonic.lbr differ diff --git a/eagle-5.7.0/lbr/con-panduit.lbr b/eagle-5.7.0/lbr/con-panduit.lbr new file mode 100644 index 0000000..289a0ce Binary files /dev/null and b/eagle-5.7.0/lbr/con-panduit.lbr differ diff --git a/eagle-5.7.0/lbr/con-pc.lbr b/eagle-5.7.0/lbr/con-pc.lbr new file mode 100644 index 0000000..65aa120 Binary files /dev/null and b/eagle-5.7.0/lbr/con-pc.lbr differ diff --git a/eagle-5.7.0/lbr/con-pc104.lbr b/eagle-5.7.0/lbr/con-pc104.lbr new file mode 100644 index 0000000..49bbb1c Binary files /dev/null and b/eagle-5.7.0/lbr/con-pc104.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-254.lbr b/eagle-5.7.0/lbr/con-phoenix-254.lbr new file mode 100644 index 0000000..25b641c Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-254.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-3.81.lbr b/eagle-5.7.0/lbr/con-phoenix-3.81.lbr new file mode 100644 index 0000000..487eb1e Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-3.81.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-350.lbr b/eagle-5.7.0/lbr/con-phoenix-350.lbr new file mode 100644 index 0000000..8ac47a5 Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-350.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-500.lbr b/eagle-5.7.0/lbr/con-phoenix-500.lbr new file mode 100644 index 0000000..617b1d8 Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-500.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-508.lbr b/eagle-5.7.0/lbr/con-phoenix-508.lbr new file mode 100644 index 0000000..058c4cd Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-508.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-762.lbr b/eagle-5.7.0/lbr/con-phoenix-762.lbr new file mode 100644 index 0000000..6c8f2c2 Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-762.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-me_max.lbr b/eagle-5.7.0/lbr/con-phoenix-me_max.lbr new file mode 100644 index 0000000..59c6047 Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-me_max.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-mkds_5.lbr b/eagle-5.7.0/lbr/con-phoenix-mkds_5.lbr new file mode 100644 index 0000000..d990757 Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-mkds_5.lbr differ diff --git a/eagle-5.7.0/lbr/con-phoenix-smkdsp.lbr b/eagle-5.7.0/lbr/con-phoenix-smkdsp.lbr new file mode 100644 index 0000000..eff035f Binary files /dev/null and b/eagle-5.7.0/lbr/con-phoenix-smkdsp.lbr differ diff --git a/eagle-5.7.0/lbr/con-ptr500.lbr b/eagle-5.7.0/lbr/con-ptr500.lbr new file mode 100644 index 0000000..9a83459 Binary files /dev/null and b/eagle-5.7.0/lbr/con-ptr500.lbr differ diff --git a/eagle-5.7.0/lbr/con-pulse.lbr b/eagle-5.7.0/lbr/con-pulse.lbr new file mode 100644 index 0000000..e0f64b3 Binary files /dev/null and b/eagle-5.7.0/lbr/con-pulse.lbr differ diff --git a/eagle-5.7.0/lbr/con-rib.lbr b/eagle-5.7.0/lbr/con-rib.lbr new file mode 100644 index 0000000..675d216 Binary files /dev/null and b/eagle-5.7.0/lbr/con-rib.lbr differ diff --git a/eagle-5.7.0/lbr/con-samtec.lbr b/eagle-5.7.0/lbr/con-samtec.lbr new file mode 100644 index 0000000..3ee768d Binary files /dev/null and b/eagle-5.7.0/lbr/con-samtec.lbr differ diff --git a/eagle-5.7.0/lbr/con-shiua-chyuan.lbr b/eagle-5.7.0/lbr/con-shiua-chyuan.lbr new file mode 100644 index 0000000..d90c93a Binary files /dev/null and b/eagle-5.7.0/lbr/con-shiua-chyuan.lbr differ diff --git a/eagle-5.7.0/lbr/con-stewart.lbr b/eagle-5.7.0/lbr/con-stewart.lbr new file mode 100644 index 0000000..4f58105 Binary files /dev/null and b/eagle-5.7.0/lbr/con-stewart.lbr differ diff --git a/eagle-5.7.0/lbr/con-stocko.lbr b/eagle-5.7.0/lbr/con-stocko.lbr new file mode 100644 index 0000000..565d814 Binary files /dev/null and b/eagle-5.7.0/lbr/con-stocko.lbr differ diff --git a/eagle-5.7.0/lbr/con-subd.lbr b/eagle-5.7.0/lbr/con-subd.lbr new file mode 100644 index 0000000..51348b6 Binary files /dev/null and b/eagle-5.7.0/lbr/con-subd.lbr differ diff --git a/eagle-5.7.0/lbr/con-sullinselectronics.lbr b/eagle-5.7.0/lbr/con-sullinselectronics.lbr new file mode 100644 index 0000000..2822e09 Binary files /dev/null and b/eagle-5.7.0/lbr/con-sullinselectronics.lbr differ diff --git a/eagle-5.7.0/lbr/con-thomas-betts.lbr b/eagle-5.7.0/lbr/con-thomas-betts.lbr new file mode 100644 index 0000000..1c7d7a8 Binary files /dev/null and b/eagle-5.7.0/lbr/con-thomas-betts.lbr differ diff --git a/eagle-5.7.0/lbr/con-tyco.lbr b/eagle-5.7.0/lbr/con-tyco.lbr new file mode 100644 index 0000000..33de017 Binary files /dev/null and b/eagle-5.7.0/lbr/con-tyco.lbr differ diff --git a/eagle-5.7.0/lbr/con-tycoelectronics.lbr b/eagle-5.7.0/lbr/con-tycoelectronics.lbr new file mode 100644 index 0000000..02d51ed Binary files /dev/null and b/eagle-5.7.0/lbr/con-tycoelectronics.lbr differ diff --git a/eagle-5.7.0/lbr/con-vg.lbr b/eagle-5.7.0/lbr/con-vg.lbr new file mode 100644 index 0000000..c3f9976 Binary files /dev/null and b/eagle-5.7.0/lbr/con-vg.lbr differ diff --git a/eagle-5.7.0/lbr/con-wago-500.lbr b/eagle-5.7.0/lbr/con-wago-500.lbr new file mode 100644 index 0000000..5647d8a Binary files /dev/null and b/eagle-5.7.0/lbr/con-wago-500.lbr differ diff --git a/eagle-5.7.0/lbr/con-wago-508.lbr b/eagle-5.7.0/lbr/con-wago-508.lbr new file mode 100644 index 0000000..7b2ae9f Binary files /dev/null and b/eagle-5.7.0/lbr/con-wago-508.lbr differ diff --git a/eagle-5.7.0/lbr/con-wago.lbr b/eagle-5.7.0/lbr/con-wago.lbr new file mode 100644 index 0000000..80d096f Binary files /dev/null and b/eagle-5.7.0/lbr/con-wago.lbr differ diff --git a/eagle-5.7.0/lbr/con-wago255.lbr b/eagle-5.7.0/lbr/con-wago255.lbr new file mode 100644 index 0000000..f490bb8 Binary files /dev/null and b/eagle-5.7.0/lbr/con-wago255.lbr differ diff --git a/eagle-5.7.0/lbr/con-weidmueller-sl35.lbr b/eagle-5.7.0/lbr/con-weidmueller-sl35.lbr new file mode 100644 index 0000000..1a97e54 Binary files /dev/null and b/eagle-5.7.0/lbr/con-weidmueller-sl35.lbr differ diff --git a/eagle-5.7.0/lbr/con-yamaichi.lbr b/eagle-5.7.0/lbr/con-yamaichi.lbr new file mode 100644 index 0000000..03c242a Binary files /dev/null and b/eagle-5.7.0/lbr/con-yamaichi.lbr differ diff --git a/eagle-5.7.0/lbr/crystal.lbr b/eagle-5.7.0/lbr/crystal.lbr new file mode 100644 index 0000000..18f34fe Binary files /dev/null and b/eagle-5.7.0/lbr/crystal.lbr differ diff --git a/eagle-5.7.0/lbr/csr.lbr b/eagle-5.7.0/lbr/csr.lbr new file mode 100644 index 0000000..e65cf5e Binary files /dev/null and b/eagle-5.7.0/lbr/csr.lbr differ diff --git a/eagle-5.7.0/lbr/cypress.lbr b/eagle-5.7.0/lbr/cypress.lbr new file mode 100644 index 0000000..d24e2b2 Binary files /dev/null and b/eagle-5.7.0/lbr/cypress.lbr differ diff --git a/eagle-5.7.0/lbr/davicom.lbr b/eagle-5.7.0/lbr/davicom.lbr new file mode 100644 index 0000000..50f443e Binary files /dev/null and b/eagle-5.7.0/lbr/davicom.lbr differ diff --git a/eagle-5.7.0/lbr/dc-dc-converter.lbr b/eagle-5.7.0/lbr/dc-dc-converter.lbr new file mode 100644 index 0000000..718b5dd Binary files /dev/null and b/eagle-5.7.0/lbr/dc-dc-converter.lbr differ diff --git a/eagle-5.7.0/lbr/dimensions.lbr b/eagle-5.7.0/lbr/dimensions.lbr new file mode 100644 index 0000000..8633006 Binary files /dev/null and b/eagle-5.7.0/lbr/dimensions.lbr differ diff --git a/eagle-5.7.0/lbr/diode.lbr b/eagle-5.7.0/lbr/diode.lbr new file mode 100644 index 0000000..1e2cf11 Binary files /dev/null and b/eagle-5.7.0/lbr/diode.lbr differ diff --git a/eagle-5.7.0/lbr/discrete.lbr b/eagle-5.7.0/lbr/discrete.lbr new file mode 100644 index 0000000..a2f6ff0 Binary files /dev/null and b/eagle-5.7.0/lbr/discrete.lbr differ diff --git a/eagle-5.7.0/lbr/display-hp.lbr b/eagle-5.7.0/lbr/display-hp.lbr new file mode 100644 index 0000000..fc4fbc2 Binary files /dev/null and b/eagle-5.7.0/lbr/display-hp.lbr differ diff --git a/eagle-5.7.0/lbr/display-kingbright.lbr b/eagle-5.7.0/lbr/display-kingbright.lbr new file mode 100644 index 0000000..132825c Binary files /dev/null and b/eagle-5.7.0/lbr/display-kingbright.lbr differ diff --git a/eagle-5.7.0/lbr/display-lcd.lbr b/eagle-5.7.0/lbr/display-lcd.lbr new file mode 100644 index 0000000..fc22c06 Binary files /dev/null and b/eagle-5.7.0/lbr/display-lcd.lbr differ diff --git a/eagle-5.7.0/lbr/docu-dummy.lbr b/eagle-5.7.0/lbr/docu-dummy.lbr new file mode 100644 index 0000000..a0285b5 Binary files /dev/null and b/eagle-5.7.0/lbr/docu-dummy.lbr differ diff --git a/eagle-5.7.0/lbr/ecl.lbr b/eagle-5.7.0/lbr/ecl.lbr new file mode 100644 index 0000000..0b70842 Binary files /dev/null and b/eagle-5.7.0/lbr/ecl.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/DESCRIPTION b/eagle-5.7.0/lbr/elektro/DESCRIPTION new file mode 100644 index 0000000..5a68557 --- /dev/null +++ b/eagle-5.7.0/lbr/elektro/DESCRIPTION @@ -0,0 +1,6 @@ + +Libraries for Electrical Schematics + + +Bibliotheken für Elektro-Schaltpläne + diff --git a/eagle-5.7.0/lbr/elektro/e-elektro-zeichnungsrahmen.lbr b/eagle-5.7.0/lbr/elektro/e-elektro-zeichnungsrahmen.lbr new file mode 100644 index 0000000..e34b9de Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-elektro-zeichnungsrahmen.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-elektromechanische-antriebe.lbr b/eagle-5.7.0/lbr/elektro/e-elektromechanische-antriebe.lbr new file mode 100644 index 0000000..2b36202 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-elektromechanische-antriebe.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-halbleiter.lbr b/eagle-5.7.0/lbr/elektro/e-halbleiter.lbr new file mode 100644 index 0000000..9b65ac3 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-halbleiter.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-klemmen.lbr b/eagle-5.7.0/lbr/elektro/e-klemmen.lbr new file mode 100644 index 0000000..6fbb917 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-klemmen.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-kondensatoren.lbr b/eagle-5.7.0/lbr/elektro/e-kondensatoren.lbr new file mode 100644 index 0000000..d3a96bf Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-kondensatoren.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-lampen-signalisation.lbr b/eagle-5.7.0/lbr/elektro/e-lampen-signalisation.lbr new file mode 100644 index 0000000..a380ce6 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-lampen-signalisation.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-messfuehler.lbr b/eagle-5.7.0/lbr/elektro/e-messfuehler.lbr new file mode 100644 index 0000000..63d5356 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-messfuehler.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-messinstrumente.lbr b/eagle-5.7.0/lbr/elektro/e-messinstrumente.lbr new file mode 100644 index 0000000..520fe75 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-messinstrumente.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-motoren.lbr b/eagle-5.7.0/lbr/elektro/e-motoren.lbr new file mode 100644 index 0000000..b959f44 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-motoren.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-motorschutzschalter.lbr b/eagle-5.7.0/lbr/elektro/e-motorschutzschalter.lbr new file mode 100644 index 0000000..21dee55 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-motorschutzschalter.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-schalter.lbr b/eagle-5.7.0/lbr/elektro/e-schalter.lbr new file mode 100644 index 0000000..bf25662 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-schalter.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-schuetze-relais.lbr b/eagle-5.7.0/lbr/elektro/e-schuetze-relais.lbr new file mode 100644 index 0000000..c7f4939 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-schuetze-relais.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-sicherungen.lbr b/eagle-5.7.0/lbr/elektro/e-sicherungen.lbr new file mode 100644 index 0000000..60d3411 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-sicherungen.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-sps.lbr b/eagle-5.7.0/lbr/elektro/e-sps.lbr new file mode 100644 index 0000000..07ed596 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-sps.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-spulen-transformatoren.lbr b/eagle-5.7.0/lbr/elektro/e-spulen-transformatoren.lbr new file mode 100644 index 0000000..ff21146 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-spulen-transformatoren.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-steckverbinder.lbr b/eagle-5.7.0/lbr/elektro/e-steckverbinder.lbr new file mode 100644 index 0000000..5146332 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-steckverbinder.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-stromversorgungselemente.lbr b/eagle-5.7.0/lbr/elektro/e-stromversorgungselemente.lbr new file mode 100644 index 0000000..7577d8d Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-stromversorgungselemente.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/e-symbole.lbr b/eagle-5.7.0/lbr/elektro/e-symbole.lbr new file mode 100644 index 0000000..fc075a4 Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/e-symbole.lbr differ diff --git a/eagle-5.7.0/lbr/elektro/eib-busch-jaeger.lbr b/eagle-5.7.0/lbr/elektro/eib-busch-jaeger.lbr new file mode 100644 index 0000000..e5b219f Binary files /dev/null and b/eagle-5.7.0/lbr/elektro/eib-busch-jaeger.lbr differ diff --git a/eagle-5.7.0/lbr/etx-board.lbr b/eagle-5.7.0/lbr/etx-board.lbr new file mode 100644 index 0000000..cca560d Binary files /dev/null and b/eagle-5.7.0/lbr/etx-board.lbr differ diff --git a/eagle-5.7.0/lbr/exar.lbr b/eagle-5.7.0/lbr/exar.lbr new file mode 100644 index 0000000..ae079f5 Binary files /dev/null and b/eagle-5.7.0/lbr/exar.lbr differ diff --git a/eagle-5.7.0/lbr/fairchild-semic.lbr b/eagle-5.7.0/lbr/fairchild-semic.lbr new file mode 100644 index 0000000..461fbac Binary files /dev/null and b/eagle-5.7.0/lbr/fairchild-semic.lbr differ diff --git a/eagle-5.7.0/lbr/farnell.lbr b/eagle-5.7.0/lbr/farnell.lbr new file mode 100644 index 0000000..6c392cd Binary files /dev/null and b/eagle-5.7.0/lbr/farnell.lbr differ diff --git a/eagle-5.7.0/lbr/fiber-optic-hp.lbr b/eagle-5.7.0/lbr/fiber-optic-hp.lbr new file mode 100644 index 0000000..c0a5277 Binary files /dev/null and b/eagle-5.7.0/lbr/fiber-optic-hp.lbr differ diff --git a/eagle-5.7.0/lbr/fiber-optic-siemens.lbr b/eagle-5.7.0/lbr/fiber-optic-siemens.lbr new file mode 100644 index 0000000..49c7ee3 Binary files /dev/null and b/eagle-5.7.0/lbr/fiber-optic-siemens.lbr differ diff --git a/eagle-5.7.0/lbr/fifo.lbr b/eagle-5.7.0/lbr/fifo.lbr new file mode 100644 index 0000000..2eaa225 Binary files /dev/null and b/eagle-5.7.0/lbr/fifo.lbr differ diff --git a/eagle-5.7.0/lbr/flexipanel.lbr b/eagle-5.7.0/lbr/flexipanel.lbr new file mode 100644 index 0000000..7617d3c Binary files /dev/null and b/eagle-5.7.0/lbr/flexipanel.lbr differ diff --git a/eagle-5.7.0/lbr/fox-electronics.lbr b/eagle-5.7.0/lbr/fox-electronics.lbr new file mode 100644 index 0000000..3165101 Binary files /dev/null and b/eagle-5.7.0/lbr/fox-electronics.lbr differ diff --git a/eagle-5.7.0/lbr/frames.lbr b/eagle-5.7.0/lbr/frames.lbr new file mode 100644 index 0000000..08ba2e4 Binary files /dev/null and b/eagle-5.7.0/lbr/frames.lbr differ diff --git a/eagle-5.7.0/lbr/freescale.lbr b/eagle-5.7.0/lbr/freescale.lbr new file mode 100644 index 0000000..7999205 Binary files /dev/null and b/eagle-5.7.0/lbr/freescale.lbr differ diff --git a/eagle-5.7.0/lbr/ftdichip.lbr b/eagle-5.7.0/lbr/ftdichip.lbr new file mode 100644 index 0000000..dc59291 Binary files /dev/null and b/eagle-5.7.0/lbr/ftdichip.lbr differ diff --git a/eagle-5.7.0/lbr/fuse.lbr b/eagle-5.7.0/lbr/fuse.lbr new file mode 100644 index 0000000..b9772e4 Binary files /dev/null and b/eagle-5.7.0/lbr/fuse.lbr differ diff --git a/eagle-5.7.0/lbr/gennum.lbr b/eagle-5.7.0/lbr/gennum.lbr new file mode 100644 index 0000000..7e57a2d Binary files /dev/null and b/eagle-5.7.0/lbr/gennum.lbr differ diff --git a/eagle-5.7.0/lbr/heatsink.lbr b/eagle-5.7.0/lbr/heatsink.lbr new file mode 100644 index 0000000..0975479 Binary files /dev/null and b/eagle-5.7.0/lbr/heatsink.lbr differ diff --git a/eagle-5.7.0/lbr/holes.lbr b/eagle-5.7.0/lbr/holes.lbr new file mode 100644 index 0000000..946e22c Binary files /dev/null and b/eagle-5.7.0/lbr/holes.lbr differ diff --git a/eagle-5.7.0/lbr/holtek.lbr b/eagle-5.7.0/lbr/holtek.lbr new file mode 100644 index 0000000..fbff367 Binary files /dev/null and b/eagle-5.7.0/lbr/holtek.lbr differ diff --git a/eagle-5.7.0/lbr/ic-package.lbr b/eagle-5.7.0/lbr/ic-package.lbr new file mode 100644 index 0000000..62828e2 Binary files /dev/null and b/eagle-5.7.0/lbr/ic-package.lbr differ diff --git a/eagle-5.7.0/lbr/inductor-coilcraft.lbr b/eagle-5.7.0/lbr/inductor-coilcraft.lbr new file mode 100644 index 0000000..3b8371f Binary files /dev/null and b/eagle-5.7.0/lbr/inductor-coilcraft.lbr differ diff --git a/eagle-5.7.0/lbr/inductor-neosid.lbr b/eagle-5.7.0/lbr/inductor-neosid.lbr new file mode 100644 index 0000000..5b19ddc Binary files /dev/null and b/eagle-5.7.0/lbr/inductor-neosid.lbr differ diff --git a/eagle-5.7.0/lbr/inductor-nkl.lbr b/eagle-5.7.0/lbr/inductor-nkl.lbr new file mode 100644 index 0000000..524603a Binary files /dev/null and b/eagle-5.7.0/lbr/inductor-nkl.lbr differ diff --git a/eagle-5.7.0/lbr/inductors.lbr b/eagle-5.7.0/lbr/inductors.lbr new file mode 100644 index 0000000..502459e Binary files /dev/null and b/eagle-5.7.0/lbr/inductors.lbr differ diff --git a/eagle-5.7.0/lbr/infineon-tricore.lbr b/eagle-5.7.0/lbr/infineon-tricore.lbr new file mode 100644 index 0000000..e138b85 Binary files /dev/null and b/eagle-5.7.0/lbr/infineon-tricore.lbr differ diff --git a/eagle-5.7.0/lbr/infineon.lbr b/eagle-5.7.0/lbr/infineon.lbr new file mode 100644 index 0000000..5e53b98 Binary files /dev/null and b/eagle-5.7.0/lbr/infineon.lbr differ diff --git a/eagle-5.7.0/lbr/intersil.lbr b/eagle-5.7.0/lbr/intersil.lbr new file mode 100644 index 0000000..e98187f Binary files /dev/null and b/eagle-5.7.0/lbr/intersil.lbr differ diff --git a/eagle-5.7.0/lbr/ir.lbr b/eagle-5.7.0/lbr/ir.lbr new file mode 100644 index 0000000..baabccb Binary files /dev/null and b/eagle-5.7.0/lbr/ir.lbr differ diff --git a/eagle-5.7.0/lbr/isd.lbr b/eagle-5.7.0/lbr/isd.lbr new file mode 100644 index 0000000..30540c9 Binary files /dev/null and b/eagle-5.7.0/lbr/isd.lbr differ diff --git a/eagle-5.7.0/lbr/jump-0r-smd.lbr b/eagle-5.7.0/lbr/jump-0r-smd.lbr new file mode 100644 index 0000000..a1cd3c7 Binary files /dev/null and b/eagle-5.7.0/lbr/jump-0r-smd.lbr differ diff --git a/eagle-5.7.0/lbr/jumper.lbr b/eagle-5.7.0/lbr/jumper.lbr new file mode 100644 index 0000000..c152463 Binary files /dev/null and b/eagle-5.7.0/lbr/jumper.lbr differ diff --git a/eagle-5.7.0/lbr/lantronix.lbr b/eagle-5.7.0/lbr/lantronix.lbr new file mode 100644 index 0000000..a77331a Binary files /dev/null and b/eagle-5.7.0/lbr/lantronix.lbr differ diff --git a/eagle-5.7.0/lbr/lattice.lbr b/eagle-5.7.0/lbr/lattice.lbr new file mode 100644 index 0000000..861cafd Binary files /dev/null and b/eagle-5.7.0/lbr/lattice.lbr differ diff --git a/eagle-5.7.0/lbr/lc-filter.lbr b/eagle-5.7.0/lbr/lc-filter.lbr new file mode 100644 index 0000000..6875e8a Binary files /dev/null and b/eagle-5.7.0/lbr/lc-filter.lbr differ diff --git a/eagle-5.7.0/lbr/led-7-segment.lbr b/eagle-5.7.0/lbr/led-7-segment.lbr new file mode 100644 index 0000000..bc2aa22 Binary files /dev/null and b/eagle-5.7.0/lbr/led-7-segment.lbr differ diff --git a/eagle-5.7.0/lbr/led-citizen-electronics.lbr b/eagle-5.7.0/lbr/led-citizen-electronics.lbr new file mode 100644 index 0000000..8eeda09 Binary files /dev/null and b/eagle-5.7.0/lbr/led-citizen-electronics.lbr differ diff --git a/eagle-5.7.0/lbr/led-lumiled.lbr b/eagle-5.7.0/lbr/led-lumiled.lbr new file mode 100644 index 0000000..203d1aa Binary files /dev/null and b/eagle-5.7.0/lbr/led-lumiled.lbr differ diff --git a/eagle-5.7.0/lbr/led.lbr b/eagle-5.7.0/lbr/led.lbr new file mode 100644 index 0000000..47b1986 Binary files /dev/null and b/eagle-5.7.0/lbr/led.lbr differ diff --git a/eagle-5.7.0/lbr/lem.lbr b/eagle-5.7.0/lbr/lem.lbr new file mode 100644 index 0000000..3c54d77 Binary files /dev/null and b/eagle-5.7.0/lbr/lem.lbr differ diff --git a/eagle-5.7.0/lbr/linear-technology.lbr b/eagle-5.7.0/lbr/linear-technology.lbr new file mode 100644 index 0000000..3fecc0d Binary files /dev/null and b/eagle-5.7.0/lbr/linear-technology.lbr differ diff --git a/eagle-5.7.0/lbr/linear.lbr b/eagle-5.7.0/lbr/linear.lbr new file mode 100644 index 0000000..6362268 Binary files /dev/null and b/eagle-5.7.0/lbr/linear.lbr differ diff --git a/eagle-5.7.0/lbr/linx.lbr b/eagle-5.7.0/lbr/linx.lbr new file mode 100644 index 0000000..895bb8b Binary files /dev/null and b/eagle-5.7.0/lbr/linx.lbr differ diff --git a/eagle-5.7.0/lbr/logo.lbr b/eagle-5.7.0/lbr/logo.lbr new file mode 100644 index 0000000..0853ff1 Binary files /dev/null and b/eagle-5.7.0/lbr/logo.lbr differ diff --git a/eagle-5.7.0/lbr/lprs.lbr b/eagle-5.7.0/lbr/lprs.lbr new file mode 100644 index 0000000..2ee45c2 Binary files /dev/null and b/eagle-5.7.0/lbr/lprs.lbr differ diff --git a/eagle-5.7.0/lbr/lumiled.lbr b/eagle-5.7.0/lbr/lumiled.lbr new file mode 100644 index 0000000..46ea493 Binary files /dev/null and b/eagle-5.7.0/lbr/lumiled.lbr differ diff --git a/eagle-5.7.0/lbr/marks.lbr b/eagle-5.7.0/lbr/marks.lbr new file mode 100644 index 0000000..446c303 Binary files /dev/null and b/eagle-5.7.0/lbr/marks.lbr differ diff --git a/eagle-5.7.0/lbr/maxim.lbr b/eagle-5.7.0/lbr/maxim.lbr new file mode 100644 index 0000000..c055609 Binary files /dev/null and b/eagle-5.7.0/lbr/maxim.lbr differ diff --git a/eagle-5.7.0/lbr/maxstream.lbr b/eagle-5.7.0/lbr/maxstream.lbr new file mode 100644 index 0000000..6f2c086 Binary files /dev/null and b/eagle-5.7.0/lbr/maxstream.lbr differ diff --git a/eagle-5.7.0/lbr/melexis.lbr b/eagle-5.7.0/lbr/melexis.lbr new file mode 100644 index 0000000..15bc07a Binary files /dev/null and b/eagle-5.7.0/lbr/melexis.lbr differ diff --git a/eagle-5.7.0/lbr/memory-hitachi.lbr b/eagle-5.7.0/lbr/memory-hitachi.lbr new file mode 100644 index 0000000..57d57d9 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-hitachi.lbr differ diff --git a/eagle-5.7.0/lbr/memory-idt.lbr b/eagle-5.7.0/lbr/memory-idt.lbr new file mode 100644 index 0000000..a97e013 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-idt.lbr differ diff --git a/eagle-5.7.0/lbr/memory-micron.lbr b/eagle-5.7.0/lbr/memory-micron.lbr new file mode 100644 index 0000000..cd05e35 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-micron.lbr differ diff --git a/eagle-5.7.0/lbr/memory-motorola-dram.lbr b/eagle-5.7.0/lbr/memory-motorola-dram.lbr new file mode 100644 index 0000000..f163805 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-motorola-dram.lbr differ diff --git a/eagle-5.7.0/lbr/memory-nec.lbr b/eagle-5.7.0/lbr/memory-nec.lbr new file mode 100644 index 0000000..f5f2e52 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-nec.lbr differ diff --git a/eagle-5.7.0/lbr/memory-samsung.lbr b/eagle-5.7.0/lbr/memory-samsung.lbr new file mode 100644 index 0000000..e0bd37b Binary files /dev/null and b/eagle-5.7.0/lbr/memory-samsung.lbr differ diff --git a/eagle-5.7.0/lbr/memory-sram.lbr b/eagle-5.7.0/lbr/memory-sram.lbr new file mode 100644 index 0000000..98ad8e2 Binary files /dev/null and b/eagle-5.7.0/lbr/memory-sram.lbr differ diff --git a/eagle-5.7.0/lbr/memory.lbr b/eagle-5.7.0/lbr/memory.lbr new file mode 100644 index 0000000..c4dac8d Binary files /dev/null and b/eagle-5.7.0/lbr/memory.lbr differ diff --git a/eagle-5.7.0/lbr/mems.lbr b/eagle-5.7.0/lbr/mems.lbr new file mode 100644 index 0000000..36c973f Binary files /dev/null and b/eagle-5.7.0/lbr/mems.lbr differ diff --git a/eagle-5.7.0/lbr/micrel.lbr b/eagle-5.7.0/lbr/micrel.lbr new file mode 100644 index 0000000..03a75ca Binary files /dev/null and b/eagle-5.7.0/lbr/micrel.lbr differ diff --git a/eagle-5.7.0/lbr/micro-fujitsu.lbr b/eagle-5.7.0/lbr/micro-fujitsu.lbr new file mode 100644 index 0000000..2d3692c Binary files /dev/null and b/eagle-5.7.0/lbr/micro-fujitsu.lbr differ diff --git a/eagle-5.7.0/lbr/micro-harris.lbr b/eagle-5.7.0/lbr/micro-harris.lbr new file mode 100644 index 0000000..ea92373 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-harris.lbr differ diff --git a/eagle-5.7.0/lbr/micro-hitachi.lbr b/eagle-5.7.0/lbr/micro-hitachi.lbr new file mode 100644 index 0000000..8ce00ee Binary files /dev/null and b/eagle-5.7.0/lbr/micro-hitachi.lbr differ diff --git a/eagle-5.7.0/lbr/micro-infineon.lbr b/eagle-5.7.0/lbr/micro-infineon.lbr new file mode 100644 index 0000000..5ba4014 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-infineon.lbr differ diff --git a/eagle-5.7.0/lbr/micro-intel.lbr b/eagle-5.7.0/lbr/micro-intel.lbr new file mode 100644 index 0000000..0da1cf3 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-intel.lbr differ diff --git a/eagle-5.7.0/lbr/micro-mc68000.lbr b/eagle-5.7.0/lbr/micro-mc68000.lbr new file mode 100644 index 0000000..2f11c41 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-mc68000.lbr differ diff --git a/eagle-5.7.0/lbr/micro-motorola.lbr b/eagle-5.7.0/lbr/micro-motorola.lbr new file mode 100644 index 0000000..570cfe1 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-motorola.lbr differ diff --git a/eagle-5.7.0/lbr/micro-philips.lbr b/eagle-5.7.0/lbr/micro-philips.lbr new file mode 100644 index 0000000..8f0e24a Binary files /dev/null and b/eagle-5.7.0/lbr/micro-philips.lbr differ diff --git a/eagle-5.7.0/lbr/micro-renesas.lbr b/eagle-5.7.0/lbr/micro-renesas.lbr new file mode 100644 index 0000000..ba0c527 Binary files /dev/null and b/eagle-5.7.0/lbr/micro-renesas.lbr differ diff --git a/eagle-5.7.0/lbr/micro-samsung.lbr b/eagle-5.7.0/lbr/micro-samsung.lbr new file mode 100644 index 0000000..d2d003f Binary files /dev/null and b/eagle-5.7.0/lbr/micro-samsung.lbr differ diff --git a/eagle-5.7.0/lbr/micro-siemens.lbr b/eagle-5.7.0/lbr/micro-siemens.lbr new file mode 100644 index 0000000..567cddb Binary files /dev/null and b/eagle-5.7.0/lbr/micro-siemens.lbr differ diff --git a/eagle-5.7.0/lbr/microchip.lbr b/eagle-5.7.0/lbr/microchip.lbr new file mode 100644 index 0000000..85f18b0 Binary files /dev/null and b/eagle-5.7.0/lbr/microchip.lbr differ diff --git a/eagle-5.7.0/lbr/micron.lbr b/eagle-5.7.0/lbr/micron.lbr new file mode 100644 index 0000000..4f4c9ca Binary files /dev/null and b/eagle-5.7.0/lbr/micron.lbr differ diff --git a/eagle-5.7.0/lbr/micronas.lbr b/eagle-5.7.0/lbr/micronas.lbr new file mode 100644 index 0000000..ee5fb60 Binary files /dev/null and b/eagle-5.7.0/lbr/micronas.lbr differ diff --git a/eagle-5.7.0/lbr/microphon.lbr b/eagle-5.7.0/lbr/microphon.lbr new file mode 100644 index 0000000..bcab89d Binary files /dev/null and b/eagle-5.7.0/lbr/microphon.lbr differ diff --git a/eagle-5.7.0/lbr/microwave.lbr b/eagle-5.7.0/lbr/microwave.lbr new file mode 100644 index 0000000..9c3b7d0 Binary files /dev/null and b/eagle-5.7.0/lbr/microwave.lbr differ diff --git a/eagle-5.7.0/lbr/midori-sensor.lbr b/eagle-5.7.0/lbr/midori-sensor.lbr new file mode 100644 index 0000000..2852e0b Binary files /dev/null and b/eagle-5.7.0/lbr/midori-sensor.lbr differ diff --git a/eagle-5.7.0/lbr/minicircuits.lbr b/eagle-5.7.0/lbr/minicircuits.lbr new file mode 100644 index 0000000..dcc8602 Binary files /dev/null and b/eagle-5.7.0/lbr/minicircuits.lbr differ diff --git a/eagle-5.7.0/lbr/motorola-sensor-driver.lbr b/eagle-5.7.0/lbr/motorola-sensor-driver.lbr new file mode 100644 index 0000000..d907f6e Binary files /dev/null and b/eagle-5.7.0/lbr/motorola-sensor-driver.lbr differ diff --git a/eagle-5.7.0/lbr/murata-filter.lbr b/eagle-5.7.0/lbr/murata-filter.lbr new file mode 100644 index 0000000..b885ae7 Binary files /dev/null and b/eagle-5.7.0/lbr/murata-filter.lbr differ diff --git a/eagle-5.7.0/lbr/murata-sensor.lbr b/eagle-5.7.0/lbr/murata-sensor.lbr new file mode 100644 index 0000000..53002dc Binary files /dev/null and b/eagle-5.7.0/lbr/murata-sensor.lbr differ diff --git a/eagle-5.7.0/lbr/nanotec.lbr b/eagle-5.7.0/lbr/nanotec.lbr new file mode 100644 index 0000000..3728cbd Binary files /dev/null and b/eagle-5.7.0/lbr/nanotec.lbr differ diff --git a/eagle-5.7.0/lbr/national-instruments.lbr b/eagle-5.7.0/lbr/national-instruments.lbr new file mode 100644 index 0000000..a09ae21 Binary files /dev/null and b/eagle-5.7.0/lbr/national-instruments.lbr differ diff --git a/eagle-5.7.0/lbr/national-semiconductor.lbr b/eagle-5.7.0/lbr/national-semiconductor.lbr new file mode 100644 index 0000000..d10b03f Binary files /dev/null and b/eagle-5.7.0/lbr/national-semiconductor.lbr differ diff --git a/eagle-5.7.0/lbr/nec-lqfp100-pack.lbr b/eagle-5.7.0/lbr/nec-lqfp100-pack.lbr new file mode 100644 index 0000000..c287a23 Binary files /dev/null and b/eagle-5.7.0/lbr/nec-lqfp100-pack.lbr differ diff --git a/eagle-5.7.0/lbr/nrj-semiconductor.lbr b/eagle-5.7.0/lbr/nrj-semiconductor.lbr new file mode 100644 index 0000000..e1dde18 Binary files /dev/null and b/eagle-5.7.0/lbr/nrj-semiconductor.lbr differ diff --git a/eagle-5.7.0/lbr/omnivision.lbr b/eagle-5.7.0/lbr/omnivision.lbr new file mode 100644 index 0000000..3dc8d49 Binary files /dev/null and b/eagle-5.7.0/lbr/omnivision.lbr differ diff --git a/eagle-5.7.0/lbr/on-semiconductor.lbr b/eagle-5.7.0/lbr/on-semiconductor.lbr new file mode 100644 index 0000000..92d7133 Binary files /dev/null and b/eagle-5.7.0/lbr/on-semiconductor.lbr differ diff --git a/eagle-5.7.0/lbr/opto-honeywell-3000.lbr b/eagle-5.7.0/lbr/opto-honeywell-3000.lbr new file mode 100644 index 0000000..4d9fe51 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-honeywell-3000.lbr differ diff --git a/eagle-5.7.0/lbr/opto-honeywell-4000.lbr b/eagle-5.7.0/lbr/opto-honeywell-4000.lbr new file mode 100644 index 0000000..11751d0 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-honeywell-4000.lbr differ diff --git a/eagle-5.7.0/lbr/opto-honeywell.lbr b/eagle-5.7.0/lbr/opto-honeywell.lbr new file mode 100644 index 0000000..8321290 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-honeywell.lbr differ diff --git a/eagle-5.7.0/lbr/opto-micro-linear.lbr b/eagle-5.7.0/lbr/opto-micro-linear.lbr new file mode 100644 index 0000000..9663ed8 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-micro-linear.lbr differ diff --git a/eagle-5.7.0/lbr/opto-trans-siemens.lbr b/eagle-5.7.0/lbr/opto-trans-siemens.lbr new file mode 100644 index 0000000..7beb597 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-trans-siemens.lbr differ diff --git a/eagle-5.7.0/lbr/opto-transmittter-hp.lbr b/eagle-5.7.0/lbr/opto-transmittter-hp.lbr new file mode 100644 index 0000000..f3fbb7a Binary files /dev/null and b/eagle-5.7.0/lbr/opto-transmittter-hp.lbr differ diff --git a/eagle-5.7.0/lbr/opto-vishay.lbr b/eagle-5.7.0/lbr/opto-vishay.lbr new file mode 100644 index 0000000..fd048b8 Binary files /dev/null and b/eagle-5.7.0/lbr/opto-vishay.lbr differ diff --git a/eagle-5.7.0/lbr/optocoupler.lbr b/eagle-5.7.0/lbr/optocoupler.lbr new file mode 100644 index 0000000..64b538c Binary files /dev/null and b/eagle-5.7.0/lbr/optocoupler.lbr differ diff --git a/eagle-5.7.0/lbr/pal.lbr b/eagle-5.7.0/lbr/pal.lbr new file mode 100644 index 0000000..4d9436e Binary files /dev/null and b/eagle-5.7.0/lbr/pal.lbr differ diff --git a/eagle-5.7.0/lbr/photo-elements.lbr b/eagle-5.7.0/lbr/photo-elements.lbr new file mode 100644 index 0000000..fa4b6e5 Binary files /dev/null and b/eagle-5.7.0/lbr/photo-elements.lbr differ diff --git a/eagle-5.7.0/lbr/piher.lbr b/eagle-5.7.0/lbr/piher.lbr new file mode 100644 index 0000000..8361712 Binary files /dev/null and b/eagle-5.7.0/lbr/piher.lbr differ diff --git a/eagle-5.7.0/lbr/pinhead.lbr b/eagle-5.7.0/lbr/pinhead.lbr new file mode 100644 index 0000000..f089f82 Binary files /dev/null and b/eagle-5.7.0/lbr/pinhead.lbr differ diff --git a/eagle-5.7.0/lbr/plcc-socket.lbr b/eagle-5.7.0/lbr/plcc-socket.lbr new file mode 100644 index 0000000..06caf4d Binary files /dev/null and b/eagle-5.7.0/lbr/plcc-socket.lbr differ diff --git a/eagle-5.7.0/lbr/pld-intel.lbr b/eagle-5.7.0/lbr/pld-intel.lbr new file mode 100644 index 0000000..7f42f8b Binary files /dev/null and b/eagle-5.7.0/lbr/pld-intel.lbr differ diff --git a/eagle-5.7.0/lbr/plxtech.lbr b/eagle-5.7.0/lbr/plxtech.lbr new file mode 100644 index 0000000..c234575 Binary files /dev/null and b/eagle-5.7.0/lbr/plxtech.lbr differ diff --git a/eagle-5.7.0/lbr/pot-vitrohm.lbr b/eagle-5.7.0/lbr/pot-vitrohm.lbr new file mode 100644 index 0000000..74010d3 Binary files /dev/null and b/eagle-5.7.0/lbr/pot-vitrohm.lbr differ diff --git a/eagle-5.7.0/lbr/pot-xicor.lbr b/eagle-5.7.0/lbr/pot-xicor.lbr new file mode 100644 index 0000000..fb18cf7 Binary files /dev/null and b/eagle-5.7.0/lbr/pot-xicor.lbr differ diff --git a/eagle-5.7.0/lbr/pot.lbr b/eagle-5.7.0/lbr/pot.lbr new file mode 100644 index 0000000..ce56e55 Binary files /dev/null and b/eagle-5.7.0/lbr/pot.lbr differ diff --git a/eagle-5.7.0/lbr/ptc-ntc.lbr b/eagle-5.7.0/lbr/ptc-ntc.lbr new file mode 100644 index 0000000..ba238ff Binary files /dev/null and b/eagle-5.7.0/lbr/ptc-ntc.lbr differ diff --git a/eagle-5.7.0/lbr/quantum-research-group.lbr b/eagle-5.7.0/lbr/quantum-research-group.lbr new file mode 100644 index 0000000..eea0f0c Binary files /dev/null and b/eagle-5.7.0/lbr/quantum-research-group.lbr differ diff --git a/eagle-5.7.0/lbr/rcl.lbr b/eagle-5.7.0/lbr/rcl.lbr new file mode 100644 index 0000000..e37f59f Binary files /dev/null and b/eagle-5.7.0/lbr/rcl.lbr differ diff --git a/eagle-5.7.0/lbr/rectifier.lbr b/eagle-5.7.0/lbr/rectifier.lbr new file mode 100644 index 0000000..ccf3f7c Binary files /dev/null and b/eagle-5.7.0/lbr/rectifier.lbr differ diff --git a/eagle-5.7.0/lbr/ref-packages-longpad.lbr b/eagle-5.7.0/lbr/ref-packages-longpad.lbr new file mode 100644 index 0000000..130da2e Binary files /dev/null and b/eagle-5.7.0/lbr/ref-packages-longpad.lbr differ diff --git a/eagle-5.7.0/lbr/ref-packages.lbr b/eagle-5.7.0/lbr/ref-packages.lbr new file mode 100644 index 0000000..cf6131f Binary files /dev/null and b/eagle-5.7.0/lbr/ref-packages.lbr differ diff --git a/eagle-5.7.0/lbr/relay.lbr b/eagle-5.7.0/lbr/relay.lbr new file mode 100644 index 0000000..c21dcab Binary files /dev/null and b/eagle-5.7.0/lbr/relay.lbr differ diff --git a/eagle-5.7.0/lbr/renesas.lbr b/eagle-5.7.0/lbr/renesas.lbr new file mode 100644 index 0000000..a07955f Binary files /dev/null and b/eagle-5.7.0/lbr/renesas.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-bourns.lbr b/eagle-5.7.0/lbr/resistor-bourns.lbr new file mode 100644 index 0000000..ffe5c15 Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-bourns.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-dil.lbr b/eagle-5.7.0/lbr/resistor-dil.lbr new file mode 100644 index 0000000..a8ea6a8 Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-dil.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-net.lbr b/eagle-5.7.0/lbr/resistor-net.lbr new file mode 100644 index 0000000..b7b2f8f Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-net.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-power.lbr b/eagle-5.7.0/lbr/resistor-power.lbr new file mode 100644 index 0000000..62e1e15 Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-power.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-ruf.lbr b/eagle-5.7.0/lbr/resistor-ruf.lbr new file mode 100644 index 0000000..48a5a1c Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-ruf.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-shunt.lbr b/eagle-5.7.0/lbr/resistor-shunt.lbr new file mode 100644 index 0000000..e3598e0 Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-shunt.lbr differ diff --git a/eagle-5.7.0/lbr/resistor-sil.lbr b/eagle-5.7.0/lbr/resistor-sil.lbr new file mode 100644 index 0000000..ac5bbd5 Binary files /dev/null and b/eagle-5.7.0/lbr/resistor-sil.lbr differ diff --git a/eagle-5.7.0/lbr/resistor.lbr b/eagle-5.7.0/lbr/resistor.lbr new file mode 100644 index 0000000..d4a1f2f Binary files /dev/null and b/eagle-5.7.0/lbr/resistor.lbr differ diff --git a/eagle-5.7.0/lbr/rf-micro-devices.lbr b/eagle-5.7.0/lbr/rf-micro-devices.lbr new file mode 100644 index 0000000..c7be8da Binary files /dev/null and b/eagle-5.7.0/lbr/rf-micro-devices.lbr differ diff --git a/eagle-5.7.0/lbr/rf-solutions.lbr b/eagle-5.7.0/lbr/rf-solutions.lbr new file mode 100644 index 0000000..c72e75e Binary files /dev/null and b/eagle-5.7.0/lbr/rf-solutions.lbr differ diff --git a/eagle-5.7.0/lbr/rohm.lbr b/eagle-5.7.0/lbr/rohm.lbr new file mode 100644 index 0000000..e34c7e0 Binary files /dev/null and b/eagle-5.7.0/lbr/rohm.lbr differ diff --git a/eagle-5.7.0/lbr/semicon-smd-ipc.lbr b/eagle-5.7.0/lbr/semicon-smd-ipc.lbr new file mode 100644 index 0000000..8d5bfc2 Binary files /dev/null and b/eagle-5.7.0/lbr/semicon-smd-ipc.lbr differ diff --git a/eagle-5.7.0/lbr/sensor-heraeus.lbr b/eagle-5.7.0/lbr/sensor-heraeus.lbr new file mode 100644 index 0000000..dd2c985 Binary files /dev/null and b/eagle-5.7.0/lbr/sensor-heraeus.lbr differ diff --git a/eagle-5.7.0/lbr/sharp.lbr b/eagle-5.7.0/lbr/sharp.lbr new file mode 100644 index 0000000..873b2aa Binary files /dev/null and b/eagle-5.7.0/lbr/sharp.lbr differ diff --git a/eagle-5.7.0/lbr/silabs.lbr b/eagle-5.7.0/lbr/silabs.lbr new file mode 100644 index 0000000..aad8fa1 Binary files /dev/null and b/eagle-5.7.0/lbr/silabs.lbr differ diff --git a/eagle-5.7.0/lbr/sipex.lbr b/eagle-5.7.0/lbr/sipex.lbr new file mode 100644 index 0000000..2e0943b Binary files /dev/null and b/eagle-5.7.0/lbr/sipex.lbr differ diff --git a/eagle-5.7.0/lbr/smd-ipc.lbr b/eagle-5.7.0/lbr/smd-ipc.lbr new file mode 100644 index 0000000..ac38cba Binary files /dev/null and b/eagle-5.7.0/lbr/smd-ipc.lbr differ diff --git a/eagle-5.7.0/lbr/smd-special.lbr b/eagle-5.7.0/lbr/smd-special.lbr new file mode 100644 index 0000000..d5c249c Binary files /dev/null and b/eagle-5.7.0/lbr/smd-special.lbr differ diff --git a/eagle-5.7.0/lbr/solomon-systech.lbr b/eagle-5.7.0/lbr/solomon-systech.lbr new file mode 100644 index 0000000..bc56c7c Binary files /dev/null and b/eagle-5.7.0/lbr/solomon-systech.lbr differ diff --git a/eagle-5.7.0/lbr/solpad.lbr b/eagle-5.7.0/lbr/solpad.lbr new file mode 100644 index 0000000..ec32d3a Binary files /dev/null and b/eagle-5.7.0/lbr/solpad.lbr differ diff --git a/eagle-5.7.0/lbr/special-drill.lbr b/eagle-5.7.0/lbr/special-drill.lbr new file mode 100644 index 0000000..2662747 Binary files /dev/null and b/eagle-5.7.0/lbr/special-drill.lbr differ diff --git a/eagle-5.7.0/lbr/special.lbr b/eagle-5.7.0/lbr/special.lbr new file mode 100644 index 0000000..a357568 Binary files /dev/null and b/eagle-5.7.0/lbr/special.lbr differ diff --git a/eagle-5.7.0/lbr/st-microelectronics.lbr b/eagle-5.7.0/lbr/st-microelectronics.lbr new file mode 100644 index 0000000..249e971 Binary files /dev/null and b/eagle-5.7.0/lbr/st-microelectronics.lbr differ diff --git a/eagle-5.7.0/lbr/supertex.lbr b/eagle-5.7.0/lbr/supertex.lbr new file mode 100644 index 0000000..7adb758 Binary files /dev/null and b/eagle-5.7.0/lbr/supertex.lbr differ diff --git a/eagle-5.7.0/lbr/supply1.lbr b/eagle-5.7.0/lbr/supply1.lbr new file mode 100644 index 0000000..68bd327 Binary files /dev/null and b/eagle-5.7.0/lbr/supply1.lbr differ diff --git a/eagle-5.7.0/lbr/supply2.lbr b/eagle-5.7.0/lbr/supply2.lbr new file mode 100644 index 0000000..3a543b1 Binary files /dev/null and b/eagle-5.7.0/lbr/supply2.lbr differ diff --git a/eagle-5.7.0/lbr/switch-alps.lbr b/eagle-5.7.0/lbr/switch-alps.lbr new file mode 100644 index 0000000..b6ec589 Binary files /dev/null and b/eagle-5.7.0/lbr/switch-alps.lbr differ diff --git a/eagle-5.7.0/lbr/switch-dil.lbr b/eagle-5.7.0/lbr/switch-dil.lbr new file mode 100644 index 0000000..27bf10c Binary files /dev/null and b/eagle-5.7.0/lbr/switch-dil.lbr differ diff --git a/eagle-5.7.0/lbr/switch-misc.lbr b/eagle-5.7.0/lbr/switch-misc.lbr new file mode 100644 index 0000000..f743495 Binary files /dev/null and b/eagle-5.7.0/lbr/switch-misc.lbr differ diff --git a/eagle-5.7.0/lbr/switch-omron.lbr b/eagle-5.7.0/lbr/switch-omron.lbr new file mode 100644 index 0000000..357464c Binary files /dev/null and b/eagle-5.7.0/lbr/switch-omron.lbr differ diff --git a/eagle-5.7.0/lbr/switch.lbr b/eagle-5.7.0/lbr/switch.lbr new file mode 100644 index 0000000..3a617e8 Binary files /dev/null and b/eagle-5.7.0/lbr/switch.lbr differ diff --git a/eagle-5.7.0/lbr/telcom.lbr b/eagle-5.7.0/lbr/telcom.lbr new file mode 100644 index 0000000..fd12ea9 Binary files /dev/null and b/eagle-5.7.0/lbr/telcom.lbr differ diff --git a/eagle-5.7.0/lbr/telecontrolli.lbr b/eagle-5.7.0/lbr/telecontrolli.lbr new file mode 100644 index 0000000..d79a138 Binary files /dev/null and b/eagle-5.7.0/lbr/telecontrolli.lbr differ diff --git a/eagle-5.7.0/lbr/telefunken.lbr b/eagle-5.7.0/lbr/telefunken.lbr new file mode 100644 index 0000000..af44791 Binary files /dev/null and b/eagle-5.7.0/lbr/telefunken.lbr differ diff --git a/eagle-5.7.0/lbr/testpad.lbr b/eagle-5.7.0/lbr/testpad.lbr new file mode 100644 index 0000000..dd64d83 Binary files /dev/null and b/eagle-5.7.0/lbr/testpad.lbr differ diff --git a/eagle-5.7.0/lbr/texas.lbr b/eagle-5.7.0/lbr/texas.lbr new file mode 100644 index 0000000..6fbad84 Binary files /dev/null and b/eagle-5.7.0/lbr/texas.lbr differ diff --git a/eagle-5.7.0/lbr/toshiba.lbr b/eagle-5.7.0/lbr/toshiba.lbr new file mode 100644 index 0000000..ceac1aa Binary files /dev/null and b/eagle-5.7.0/lbr/toshiba.lbr differ diff --git a/eagle-5.7.0/lbr/traco-electronic.lbr b/eagle-5.7.0/lbr/traco-electronic.lbr new file mode 100644 index 0000000..bd0be1f Binary files /dev/null and b/eagle-5.7.0/lbr/traco-electronic.lbr differ diff --git a/eagle-5.7.0/lbr/trafo-bei.lbr b/eagle-5.7.0/lbr/trafo-bei.lbr new file mode 100644 index 0000000..99fef6b Binary files /dev/null and b/eagle-5.7.0/lbr/trafo-bei.lbr differ diff --git a/eagle-5.7.0/lbr/trafo-siemens.lbr b/eagle-5.7.0/lbr/trafo-siemens.lbr new file mode 100644 index 0000000..2cca2b7 Binary files /dev/null and b/eagle-5.7.0/lbr/trafo-siemens.lbr differ diff --git a/eagle-5.7.0/lbr/trafo-xicon.lbr b/eagle-5.7.0/lbr/trafo-xicon.lbr new file mode 100644 index 0000000..a2eee10 Binary files /dev/null and b/eagle-5.7.0/lbr/trafo-xicon.lbr differ diff --git a/eagle-5.7.0/lbr/trafo.lbr b/eagle-5.7.0/lbr/trafo.lbr new file mode 100644 index 0000000..6dc11f5 Binary files /dev/null and b/eagle-5.7.0/lbr/trafo.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-fet.lbr b/eagle-5.7.0/lbr/transistor-fet.lbr new file mode 100644 index 0000000..a491e59 Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-fet.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-neu-to92.lbr b/eagle-5.7.0/lbr/transistor-neu-to92.lbr new file mode 100644 index 0000000..6cccafa Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-neu-to92.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-npn.lbr b/eagle-5.7.0/lbr/transistor-npn.lbr new file mode 100644 index 0000000..77ef2ee Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-npn.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-pnp.lbr b/eagle-5.7.0/lbr/transistor-pnp.lbr new file mode 100644 index 0000000..822336f Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-pnp.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-power.lbr b/eagle-5.7.0/lbr/transistor-power.lbr new file mode 100644 index 0000000..5138f78 Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-power.lbr differ diff --git a/eagle-5.7.0/lbr/transistor-small-signal.lbr b/eagle-5.7.0/lbr/transistor-small-signal.lbr new file mode 100644 index 0000000..a6c9640 Binary files /dev/null and b/eagle-5.7.0/lbr/transistor-small-signal.lbr differ diff --git a/eagle-5.7.0/lbr/transistor.lbr b/eagle-5.7.0/lbr/transistor.lbr new file mode 100644 index 0000000..0535ef1 Binary files /dev/null and b/eagle-5.7.0/lbr/transistor.lbr differ diff --git a/eagle-5.7.0/lbr/triac.lbr b/eagle-5.7.0/lbr/triac.lbr new file mode 100644 index 0000000..2d95066 Binary files /dev/null and b/eagle-5.7.0/lbr/triac.lbr differ diff --git a/eagle-5.7.0/lbr/tripas.lbr b/eagle-5.7.0/lbr/tripas.lbr new file mode 100644 index 0000000..52f426b Binary files /dev/null and b/eagle-5.7.0/lbr/tripas.lbr differ diff --git a/eagle-5.7.0/lbr/u-blox.lbr b/eagle-5.7.0/lbr/u-blox.lbr new file mode 100644 index 0000000..c551a41 Binary files /dev/null and b/eagle-5.7.0/lbr/u-blox.lbr differ diff --git a/eagle-5.7.0/lbr/uln-udn.lbr b/eagle-5.7.0/lbr/uln-udn.lbr new file mode 100644 index 0000000..b526737 Binary files /dev/null and b/eagle-5.7.0/lbr/uln-udn.lbr differ diff --git a/eagle-5.7.0/lbr/v-reg-micrel.lbr b/eagle-5.7.0/lbr/v-reg-micrel.lbr new file mode 100644 index 0000000..78372bc Binary files /dev/null and b/eagle-5.7.0/lbr/v-reg-micrel.lbr differ diff --git a/eagle-5.7.0/lbr/v-reg.lbr b/eagle-5.7.0/lbr/v-reg.lbr new file mode 100644 index 0000000..d45416e Binary files /dev/null and b/eagle-5.7.0/lbr/v-reg.lbr differ diff --git a/eagle-5.7.0/lbr/varistor.lbr b/eagle-5.7.0/lbr/varistor.lbr new file mode 100644 index 0000000..4b84081 Binary files /dev/null and b/eagle-5.7.0/lbr/varistor.lbr differ diff --git a/eagle-5.7.0/lbr/wafer-scale-psd.lbr b/eagle-5.7.0/lbr/wafer-scale-psd.lbr new file mode 100644 index 0000000..238873a Binary files /dev/null and b/eagle-5.7.0/lbr/wafer-scale-psd.lbr differ diff --git a/eagle-5.7.0/lbr/wirepad.lbr b/eagle-5.7.0/lbr/wirepad.lbr new file mode 100644 index 0000000..06acbe4 Binary files /dev/null and b/eagle-5.7.0/lbr/wirepad.lbr differ diff --git a/eagle-5.7.0/lbr/wuerth-elektronik.lbr b/eagle-5.7.0/lbr/wuerth-elektronik.lbr new file mode 100644 index 0000000..2cab547 Binary files /dev/null and b/eagle-5.7.0/lbr/wuerth-elektronik.lbr differ diff --git a/eagle-5.7.0/lbr/xicor.lbr b/eagle-5.7.0/lbr/xicor.lbr new file mode 100644 index 0000000..be33b20 Binary files /dev/null and b/eagle-5.7.0/lbr/xicor.lbr differ diff --git a/eagle-5.7.0/lbr/xilinx-virtex-v5.lbr b/eagle-5.7.0/lbr/xilinx-virtex-v5.lbr new file mode 100644 index 0000000..df07bd0 Binary files /dev/null and b/eagle-5.7.0/lbr/xilinx-virtex-v5.lbr differ diff --git a/eagle-5.7.0/lbr/xilinx-xc18v.lbr b/eagle-5.7.0/lbr/xilinx-xc18v.lbr new file mode 100644 index 0000000..ec87be4 Binary files /dev/null and b/eagle-5.7.0/lbr/xilinx-xc18v.lbr differ diff --git a/eagle-5.7.0/lbr/xilinx-xcv.lbr b/eagle-5.7.0/lbr/xilinx-xcv.lbr new file mode 100644 index 0000000..6ec8d11 Binary files /dev/null and b/eagle-5.7.0/lbr/xilinx-xcv.lbr differ diff --git a/eagle-5.7.0/lbr/zetex.lbr b/eagle-5.7.0/lbr/zetex.lbr new file mode 100644 index 0000000..68748c6 Binary files /dev/null and b/eagle-5.7.0/lbr/zetex.lbr differ diff --git a/eagle-5.7.0/lbr/zilog.lbr b/eagle-5.7.0/lbr/zilog.lbr new file mode 100644 index 0000000..988d5b9 Binary files /dev/null and b/eagle-5.7.0/lbr/zilog.lbr differ diff --git a/eagle-5.7.0/projects/DESCRIPTION b/eagle-5.7.0/projects/DESCRIPTION new file mode 100644 index 0000000..653d1d2 --- /dev/null +++ b/eagle-5.7.0/projects/DESCRIPTION @@ -0,0 +1,18 @@ + +Project Folder +

+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. + + +Projekt-Verzeichnis +

+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. + diff --git a/eagle-5.7.0/projects/examples/DESCRIPTION b/eagle-5.7.0/projects/examples/DESCRIPTION new file mode 100644 index 0000000..4e6932d --- /dev/null +++ b/eagle-5.7.0/projects/examples/DESCRIPTION @@ -0,0 +1,11 @@ + +Examples Folder +

+This folder contains subfolders which contain example projects. + + +Beispiel-Verzeichnis +

+Dieses Verzeichnis enthält verschiedene Unterverzeichnisse mit +Beispiel-Projekten. + diff --git a/eagle-5.7.0/projects/examples/elektro/DESCRIPTION b/eagle-5.7.0/projects/examples/elektro/DESCRIPTION new file mode 100644 index 0000000..9d5ca85 --- /dev/null +++ b/eagle-5.7.0/projects/examples/elektro/DESCRIPTION @@ -0,0 +1,6 @@ + +Examples Folder for Electrical Schematics + + +Beispiel-Verzeichnis für Elektro-Schaltpläne + diff --git a/eagle-5.7.0/projects/examples/elektro/stern-dreieck-anlauf.sch b/eagle-5.7.0/projects/examples/elektro/stern-dreieck-anlauf.sch new file mode 100644 index 0000000..ca14490 Binary files /dev/null and b/eagle-5.7.0/projects/examples/elektro/stern-dreieck-anlauf.sch differ diff --git a/eagle-5.7.0/projects/examples/hexapod/DESCRIPTION b/eagle-5.7.0/projects/examples/hexapod/DESCRIPTION new file mode 100644 index 0000000..03dddbe --- /dev/null +++ b/eagle-5.7.0/projects/examples/hexapod/DESCRIPTION @@ -0,0 +1,10 @@ + +Hexapod Example Project +

+Consists of a consistent pair of schematic and layout files. + + +Hexapod-Beispiel-Projekt +

+Besteht aus einer Schaltplan- und einer Platinen-Datei. Beide sind konsistent. + diff --git a/eagle-5.7.0/projects/examples/hexapod/eagle.epf b/eagle-5.7.0/projects/examples/hexapod/eagle.epf new file mode 100644 index 0000000..3138dab --- /dev/null +++ b/eagle-5.7.0/projects/examples/hexapod/eagle.epf @@ -0,0 +1,34 @@ +[Eagle] +Globals="Globals" +Desktop="Desktop" + +[Globals] +AutoSaveProject=1 + +[Win_1] +Type="Control Panel" +Loc="0 0 550 320" +State=2 +Number=0 + +[Win_2] +Type="Board Editor" +Loc="7 24 811 647" +State=2 +Number=1 +File="hexapod.brd" + +[Win_3] +Type="Schematic Editor" +Loc="14 48 818 671" +State=2 +Number=2 +File="hexapod.sch" +View="-80122 -55229 3966456 2696891" +Sheet=1 + +[Desktop] +Screen="1024 768" +Window="Win_1" +Window="Win_2" +Window="Win_3" diff --git a/eagle-5.7.0/projects/examples/hexapod/hexapod.brd b/eagle-5.7.0/projects/examples/hexapod/hexapod.brd new file mode 100644 index 0000000..a21d59e Binary files /dev/null and b/eagle-5.7.0/projects/examples/hexapod/hexapod.brd differ diff --git a/eagle-5.7.0/projects/examples/hexapod/hexapod.sch b/eagle-5.7.0/projects/examples/hexapod/hexapod.sch new file mode 100644 index 0000000..3cdb76b Binary files /dev/null and b/eagle-5.7.0/projects/examples/hexapod/hexapod.sch differ diff --git a/eagle-5.7.0/projects/examples/singlesided/DESCRIPTION b/eagle-5.7.0/projects/examples/singlesided/DESCRIPTION new file mode 100644 index 0000000..d3c9981 --- /dev/null +++ b/eagle-5.7.0/projects/examples/singlesided/DESCRIPTION @@ -0,0 +1,11 @@ + +Example Project for Singlesided Autorouting +

+Test various Autorouter control files to use the Autorouter in one layer. + + +Beispiel-Projekt für einseitiges Autorouten +

+Testen Sie verschiedene Autorouter-Steuerdateien (*.ctl) um den Autorouter +für einseitige Platinen zu verwenden. + diff --git a/eagle-5.7.0/projects/examples/singlesided/eagle.epf b/eagle-5.7.0/projects/examples/singlesided/eagle.epf new file mode 100644 index 0000000..689cb3b --- /dev/null +++ b/eagle-5.7.0/projects/examples/singlesided/eagle.epf @@ -0,0 +1,98 @@ +[Eagle] +Version="04 11 00" +Globals="Globals" +Desktop="Desktop" + +[Globals] +AutoSaveProject=1 + +[Win_1] +Type="Schematic Editor" +Loc="172 186 921 718" +State=2 +Number=1 +File="singlesided.sch" +View="-38466 -55229 1841984 2696891" +WireWidths=" 0 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 1524" +PadDiameters=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 13970" +PadDrills=" 2540 3048 4064 6096 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 8128" +ViaDiameters=" 2540 3048 4064 6096 8128 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 10160" +ViaDrills=" 2540 3048 4064 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 6096" +HoleDrills=" 2540 3048 4064 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 6096" +TextSizes=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 19304 21844 25400 38100 50800 64516 17780" +PolygonSpacings=" 2540 3048 4064 6096 8128 10160 14224 16764 17780 19304 21844 25400 38100 50800 64516 12700" +PolygonIsolates=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 0" +MiterRadiuss=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 64516 0" +SmdSizes=" 2540 1524 3048 1524 4064 2032 6096 3048 8128 4064 10160 5080 12700 6604 14224 7112 16764 8128 17780 9144 19304 9652 21844 10668 25400 12700 38100 19304 50800 25400 12700 6350" +WireBend=0 +WireBendSet=31 +WireCap=1 +MiterStyle=0 +PadShape=0 +ViaShape=0 +PolygonPour=0 +PolygonRank=7 +PolygonThermals=1 +PolygonOrphans=0 +TextRatio=8 +PinDirection=3 +PinFunction=0 +PinLength=2 +PinVisible=3 +SwapLevel=0 +ArcDirection=0 +AddLevel=2 +PadsSameType=0 +Layer=91 +Sheet=1 + +[Win_2] +Type="Board Editor" +Loc="296 318 1044 850" +State=2 +Number=2 +File="singlesided.brd" +View="-19712 -14310 579326 397028" +WireWidths=" 0 2540 3048 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 64516 4064" +PadDiameters=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 13970" +PadDrills=" 2540 3048 4064 6096 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 8128" +ViaDiameters=" 2540 3048 4064 6096 8128 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 10160" +ViaDrills=" 2540 3048 4064 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 6096" +HoleDrills=" 2540 3048 4064 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 64516 6096" +TextSizes=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 19304 21844 25400 38100 50800 64516 17780" +PolygonSpacings=" 2540 3048 4064 6096 8128 10160 14224 16764 17780 19304 21844 25400 38100 50800 64516 12700" +PolygonIsolates=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 50800 0" +MiterRadiuss=" 2540 3048 4064 6096 8128 10160 12700 14224 16764 17780 19304 21844 25400 38100 64516 0" +SmdSizes=" 2540 1524 3048 1524 4064 2032 6096 3048 8128 4064 10160 5080 12700 6604 14224 7112 16764 8128 17780 9144 19304 9652 21844 10668 25400 12700 38100 19304 50800 25400 12700 6350" +WireBend=0 +WireBendSet=0 +WireCap=1 +MiterStyle=0 +PadShape=0 +ViaShape=0 +PolygonPour=0 +PolygonRank=1 +PolygonThermals=1 +PolygonOrphans=0 +TextRatio=8 +PinDirection=3 +PinFunction=0 +PinLength=2 +PinVisible=3 +SwapLevel=0 +ArcDirection=0 +AddLevel=2 +PadsSameType=0 +Layer=16 + +[Win_3] +Type="Control Panel" +Loc="29 40 849 541" +State=2 +Number=0 + +[Desktop] +Screen="1280 1024" +Window="Win_1" +Window="Win_2" +Window="Win_3" diff --git a/eagle-5.7.0/projects/examples/singlesided/singlesided.brd b/eagle-5.7.0/projects/examples/singlesided/singlesided.brd new file mode 100644 index 0000000..8f31203 Binary files /dev/null and b/eagle-5.7.0/projects/examples/singlesided/singlesided.brd differ diff --git a/eagle-5.7.0/projects/examples/singlesided/singlesided.sch b/eagle-5.7.0/projects/examples/singlesided/singlesided.sch new file mode 100644 index 0000000..d6cbf49 Binary files /dev/null and b/eagle-5.7.0/projects/examples/singlesided/singlesided.sch differ diff --git a/eagle-5.7.0/projects/examples/singlesided/singlesided_h.ctl b/eagle-5.7.0/projects/examples/singlesided/singlesided_h.ctl new file mode 100644 index 0000000..b92ad6f --- /dev/null +++ b/eagle-5.7.0/projects/examples/singlesided/singlesided_h.ctl @@ -0,0 +1,135 @@ +; EAGLE Autorouter Control File + +[Default] + + RoutingGrid = 25mil + + ; Trace Parameters: + + tpViaShape = Round + + ; Preferred Directions: + + PrefDir.1 = | + PrefDir.2 = 0 + PrefDir.3 = 0 + PrefDir.4 = 0 + PrefDir.5 = 0 + PrefDir.6 = 0 + PrefDir.7 = 0 + PrefDir.8 = 0 + PrefDir.9 = 0 + PrefDir.10 = 0 + PrefDir.11 = 0 + PrefDir.12 = 0 + PrefDir.13 = 0 + PrefDir.14 = 0 + PrefDir.15 = 0 + PrefDir.16 = - + + Active = 1 + ; Cost Factors: + + cfVia = 8 + cfNonPref = 50 + cfChangeDir = 2 + cfOrthStep = 2 + cfDiagStep = 3 + cfExtdStep = 0 + cfBonusStep = 1 + cfMalusStep = 1 + cfPadImpact = 4 + cfSmdImpact = 4 + cfBusImpact = 0 + cfHugging = 3 + cfAvoid = 4 + cfPolygon = 10 + + cfBase.1 = 35 + cfBase.2 = 1 + cfBase.3 = 1 + cfBase.4 = 1 + cfBase.5 = 1 + cfBase.6 = 1 + cfBase.7 = 1 + cfBase.8 = 1 + cfBase.9 = 1 + cfBase.10 = 1 + cfBase.11 = 1 + cfBase.12 = 1 + cfBase.13 = 1 + cfBase.14 = 1 + cfBase.15 = 1 + cfBase.16 = 0 + + ; Maximum Number of...: + + mnVias = 20 + mnSegments = 9999 + mnExtdSteps = 9999 + mnRipupLevel = 10 + mnRipupSteps = 100 + mnRipupTotal = 100 + +[Busses] + + @Route + + Active = 1 + cfNonPref = 4 + cfBusImpact = 4 + cfHugging = 0 + cfBase.1 = 30 + mnVias = 0 + +[Route] + + @Default + + Active = 1 + +[Optimize1] + + @Route + + Active = 1 + cfVia = 99 + cfNonPref = 99 + cfExtdStep = 10 + cfHugging = 1 + cfBase.1 = 40 + mnExtdSteps = 1 + mnRipupLevel = 0 + +[Optimize2] + + @Optimize1 + + Active = 1 + cfChangeDir = 6 + cfExtdStep = 0 + cfBonusStep = 2 + cfMalusStep = 2 + cfPadImpact = 2 + cfSmdImpact = 2 + cfHugging = 0 + cfBase.1 = 45 + +[Optimize3] + + @Optimize2 + + Active = 1 + cfNonPref = 90 + cfChangeDir = 8 + cfPadImpact = 0 + cfSmdImpact = 0 + cfBase.1 = 99 + +[Optimize4] + + @Optimize3 + + Active = 1 + cfChangeDir = 10 + diff --git a/eagle-5.7.0/projects/examples/singlesided/singlesided_v.ctl b/eagle-5.7.0/projects/examples/singlesided/singlesided_v.ctl new file mode 100644 index 0000000..b7b4cfe --- /dev/null +++ b/eagle-5.7.0/projects/examples/singlesided/singlesided_v.ctl @@ -0,0 +1,135 @@ +; EAGLE Autorouter Control File + +[Default] + + RoutingGrid = 25mil + + ; Trace Parameters: + + tpViaShape = Round + + ; Preferred Directions: + + PrefDir.1 = - + PrefDir.2 = 0 + PrefDir.3 = 0 + PrefDir.4 = 0 + PrefDir.5 = 0 + PrefDir.6 = 0 + PrefDir.7 = 0 + PrefDir.8 = 0 + PrefDir.9 = 0 + PrefDir.10 = 0 + PrefDir.11 = 0 + PrefDir.12 = 0 + PrefDir.13 = 0 + PrefDir.14 = 0 + PrefDir.15 = 0 + PrefDir.16 = | + + Active = 1 + ; Cost Factors: + + cfVia = 8 + cfNonPref = 50 + cfChangeDir = 2 + cfOrthStep = 2 + cfDiagStep = 3 + cfExtdStep = 0 + cfBonusStep = 1 + cfMalusStep = 1 + cfPadImpact = 4 + cfSmdImpact = 4 + cfBusImpact = 0 + cfHugging = 3 + cfAvoid = 4 + cfPolygon = 10 + + cfBase.1 = 35 + cfBase.2 = 1 + cfBase.3 = 1 + cfBase.4 = 1 + cfBase.5 = 1 + cfBase.6 = 1 + cfBase.7 = 1 + cfBase.8 = 1 + cfBase.9 = 1 + cfBase.10 = 1 + cfBase.11 = 1 + cfBase.12 = 1 + cfBase.13 = 1 + cfBase.14 = 1 + cfBase.15 = 1 + cfBase.16 = 0 + + ; Maximum Number of...: + + mnVias = 20 + mnSegments = 9999 + mnExtdSteps = 9999 + mnRipupLevel = 10 + mnRipupSteps = 100 + mnRipupTotal = 100 + +[Busses] + + @Route + + Active = 1 + cfNonPref = 4 + cfBusImpact = 4 + cfHugging = 0 + cfBase.1 = 30 + mnVias = 0 + +[Route] + + @Default + + Active = 1 + +[Optimize1] + + @Route + + Active = 1 + cfVia = 99 + cfNonPref = 99 + cfExtdStep = 10 + cfHugging = 1 + cfBase.1 = 40 + mnExtdSteps = 1 + mnRipupLevel = 0 + +[Optimize2] + + @Optimize1 + + Active = 1 + cfChangeDir = 6 + cfExtdStep = 0 + cfBonusStep = 2 + cfMalusStep = 2 + cfPadImpact = 2 + cfSmdImpact = 2 + cfHugging = 0 + cfBase.1 = 45 + +[Optimize3] + + @Optimize2 + + Active = 1 + cfNonPref = 90 + cfChangeDir = 8 + cfPadImpact = 0 + cfSmdImpact = 0 + cfBase.1 = 99 + +[Optimize4] + + @Optimize3 + + Active = 1 + cfChangeDir = 10 + diff --git a/eagle-5.7.0/projects/examples/tutorial/DESCRIPTION b/eagle-5.7.0/projects/examples/tutorial/DESCRIPTION new file mode 100644 index 0000000..a4a6818 --- /dev/null +++ b/eagle-5.7.0/projects/examples/tutorial/DESCRIPTION @@ -0,0 +1,12 @@ + +Example Files for the Tutorial Projects +

+This folder contains some files which are used in examples of the +EAGLE Tutorial. + + +Beispiel-Dateien für das Trainings-Handbuch +

+Dieses Verzeichnis enthält einige Dateien, die in den Beispielen im +EAGLE-Trainings-Handbuch verwendet werden. + diff --git a/eagle-5.7.0/projects/examples/tutorial/bus.sch b/eagle-5.7.0/projects/examples/tutorial/bus.sch new file mode 100644 index 0000000..a17da4a Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/bus.sch differ diff --git a/eagle-5.7.0/projects/examples/tutorial/demo1.sch b/eagle-5.7.0/projects/examples/tutorial/demo1.sch new file mode 100644 index 0000000..9e0d783 Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/demo1.sch differ diff --git a/eagle-5.7.0/projects/examples/tutorial/demo2.brd b/eagle-5.7.0/projects/examples/tutorial/demo2.brd new file mode 100644 index 0000000..d5cd779 Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/demo2.brd differ diff --git a/eagle-5.7.0/projects/examples/tutorial/demo2.sch b/eagle-5.7.0/projects/examples/tutorial/demo2.sch new file mode 100644 index 0000000..0689afa Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/demo2.sch differ diff --git a/eagle-5.7.0/projects/examples/tutorial/demo3.brd b/eagle-5.7.0/projects/examples/tutorial/demo3.brd new file mode 100644 index 0000000..aa1d26e Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/demo3.brd differ diff --git a/eagle-5.7.0/projects/examples/tutorial/demo3.sch b/eagle-5.7.0/projects/examples/tutorial/demo3.sch new file mode 100644 index 0000000..d795605 Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/demo3.sch differ diff --git a/eagle-5.7.0/projects/examples/tutorial/hexapodu.brd b/eagle-5.7.0/projects/examples/tutorial/hexapodu.brd new file mode 100644 index 0000000..061c2ed Binary files /dev/null and b/eagle-5.7.0/projects/examples/tutorial/hexapodu.brd differ diff --git a/eagle-5.7.0/projects/examples/tutorial/hexapodu.ctl b/eagle-5.7.0/projects/examples/tutorial/hexapodu.ctl new file mode 100644 index 0000000..8e997ac --- /dev/null +++ b/eagle-5.7.0/projects/examples/tutorial/hexapodu.ctl @@ -0,0 +1,130 @@ +; EAGLE Autorouter Control File + +[Default] + + RoutingGrid = 10mil + + ; Trace Parameters: + + tpViaShape = Round + + ; Preferred Directions: + + PrefDir.1 = | + PrefDir.2 = 0 + PrefDir.3 = 0 + PrefDir.4 = 0 + PrefDir.5 = 0 + PrefDir.6 = 0 + PrefDir.7 = 0 + PrefDir.8 = 0 + PrefDir.9 = 0 + PrefDir.10 = 0 + PrefDir.11 = 0 + PrefDir.12 = 0 + PrefDir.13 = 0 + PrefDir.14 = 0 + PrefDir.15 = 0 + PrefDir.16 = - + + Active = 1 + ; Cost Factors: + + cfVia = 8 + cfNonPref = 5 + cfChangeDir = 2 + cfOrthStep = 2 + cfDiagStep = 3 + cfExtdStep = 0 + cfBonusStep = 1 + cfMalusStep = 1 + cfPadImpact = 4 + cfSmdImpact = 4 + cfBusImpact = 0 + cfHugging = 3 + cfAvoid = 4 + cfPolygon = 10 + + cfBase.1 = 0 + cfBase.2 = 1 + cfBase.3 = 1 + cfBase.4 = 1 + cfBase.5 = 1 + cfBase.6 = 1 + cfBase.7 = 1 + cfBase.8 = 1 + cfBase.9 = 1 + cfBase.10 = 1 + cfBase.11 = 1 + cfBase.12 = 1 + cfBase.13 = 1 + cfBase.14 = 1 + cfBase.15 = 1 + cfBase.16 = 0 + + ; Maximum Number of...: + + mnVias = 20 + mnSegments = 9999 + mnExtdSteps = 9999 + mnRipupLevel = 10 + mnRipupSteps = 100 + mnRipupTotal = 100 + +[Busses] + + @Route + + Active = 1 + cfNonPref = 4 + cfBusImpact = 4 + cfHugging = 0 + mnVias = 0 + +[Route] + + @Default + + Active = 1 + +[Optimize1] + + @Route + + Active = 1 + cfVia = 99 + cfExtdStep = 10 + cfHugging = 1 + mnExtdSteps = 1 + mnRipupLevel = 0 + +[Optimize2] + + @Optimize1 + + Active = 1 + cfNonPref = 0 + cfChangeDir = 6 + cfExtdStep = 0 + cfBonusStep = 2 + cfMalusStep = 2 + cfPadImpact = 2 + cfSmdImpact = 2 + cfHugging = 0 + +[Optimize3] + + @Optimize2 + + Active = 1 + cfChangeDir = 8 + cfPadImpact = 0 + cfSmdImpact = 0 + +[Optimize4] + + @Optimize3 + + Active = 1 + cfChangeDir = 25 + diff --git a/eagle-5.7.0/scr/DESCRIPTION b/eagle-5.7.0/scr/DESCRIPTION new file mode 100644 index 0000000..54917de --- /dev/null +++ b/eagle-5.7.0/scr/DESCRIPTION @@ -0,0 +1,21 @@ + +Script Files +

+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 +

+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. + diff --git a/eagle-5.7.0/scr/defaultcolors.scr b/eagle-5.7.0/scr/defaultcolors.scr new file mode 100644 index 0000000..33cce1e --- /dev/null +++ b/eagle-5.7.0/scr/defaultcolors.scr @@ -0,0 +1,57 @@ +# Set the default colors: + +set palette black; + +set palette 0 0xFF000000; +set palette 1 0xB43232C8; +set palette 2 0xB432C832; +set palette 3 0xB432C8C8; +set palette 4 0xB4C83232; +set palette 5 0xB4C832C8; +set palette 6 0xB4C8C832; +set palette 7 0xB4C8C8C8; +set palette 8 0xB4646464; +set palette 9 0xB40000FF; +set palette 10 0xB400FF00; +set palette 11 0xB400FFFF; +set palette 12 0xB4FF0000; +set palette 13 0xB4FF00FF; +set palette 14 0xB4FFFF00; +set palette 15 0xB4FFFFFF; + +set palette colored; + +set palette 0 0xFFEEEECE; +set palette 1 0xB4000080; +set palette 2 0xB4008000; +set palette 3 0xB4008080; +set palette 4 0xB4800000; +set palette 5 0xB4800080; +set palette 6 0xB4808000; +set palette 7 0xB4808080; +set palette 8 0xB4C0C0C0; +set palette 9 0xB40000FF; +set palette 10 0xB400FF00; +set palette 11 0xB400FFFF; +set palette 12 0xB4FF0000; +set palette 13 0xB4FF00FF; +set palette 14 0xB4FFFF00; +set palette 15 0xB4000000; + +set palette white; + +set palette 1 0xB4000080; +set palette 2 0xB4008000; +set palette 3 0xB4008080; +set palette 4 0xB4800000; +set palette 5 0xB4800080; +set palette 6 0xB4808000; +set palette 7 0xB4808080; +set palette 8 0xB4C0C0C0; +set palette 9 0xB40000FF; +set palette 10 0xB400FF00; +set palette 11 0xB400FFFF; +set palette 12 0xB4FF0000; +set palette 13 0xB4FF00FF; +set palette 14 0xB4FFFF00; +set palette 15 0xB4000000; diff --git a/eagle-5.7.0/scr/delete-signals.scr b/eagle-5.7.0/scr/delete-signals.scr new file mode 100644 index 0000000..479775a --- /dev/null +++ b/eagle-5.7.0/scr/delete-signals.scr @@ -0,0 +1,15 @@ +# Delete all signals in the layout +# +# This script is written for EAGLE 5 and removes all traces and airwires in the layout. +# This script replaces the former DELETE SIGNALS command. + +DISPLAY = _current_layers_ @; +DISPLAY ALL; +RIPUP; +DISPLAY NONE 19; +GRID INCH; +GROUP (-32 -32) (-32 32) (32 32) (32 -32); +DELETE (>0 0); +GRID LAST; +DISPLAY _current_layers_; +DISPLAY = _current_layers_; diff --git a/eagle-5.7.0/scr/eagle.scr b/eagle-5.7.0/scr/eagle.scr new file mode 100644 index 0000000..542fe56 --- /dev/null +++ b/eagle-5.7.0/scr/eagle.scr @@ -0,0 +1,41 @@ +# Configuration Script +# +# This file can be used to configure the editor windows. + +BRD: + +#Menu Add Change Copy Delete Display Grid Group Move Name Quit Rect \ +# Route Script Show Signal Split Text Value Via Window ';' Wire Write Edit; + +SCH: + +Grid Default; +Change Width 0.006; +#Menu Add Bus Change Copy Delete Display Gateswap Grid Group Invoke Junction \ +# Label Move Name Net Pinswap Quit Script Show Split Value Window ';' \ +# Wire Write Edit; + +LBR: + +#Menu Close Export Open Script Write ';' Edit; + +DEV: + +Grid Default; +#Menu Add Change Copy Connect Delete Display Export Grid Move Name Package \ +# Prefix Quit Script Show Value Window ';' Write Edit; + +SYM: + +Grid Default On; +Change Width 0.010; +#Menu Arc Change Copy Cut Delete Display Export Grid Group Move Name Paste \ +# Pin Quit Script Show Split Text Value Window ';' Wire Write Edit; + +PAC: + +Grid Default On; +Change Width 0.005; +Change Size 0.050; +#Menu Add Change Copy Delete Display Grid Group Move Name Pad Quit \ +# Script Show Smd Split Text Window ';' Wire Write Edit; diff --git a/eagle-5.7.0/scr/eagleassign.scr b/eagle-5.7.0/scr/eagleassign.scr new file mode 100644 index 0000000..1a39260 --- /dev/null +++ b/eagle-5.7.0/scr/eagleassign.scr @@ -0,0 +1,40 @@ +# ASSIGN Script +# +# Assigns several function keys to start various ULPs for easy library editing. + + # comment character '#' +LBR: +ASSIGN A+N 'run nextpacdescript.ulp;'; # Control+N edit next Package Description +ASSIGN C+N 'run editnext-dev-sym-pac.ulp;'; # Control+N edit next Sym/Pac/Dev +ASSIGN S+C+N 'run editnext-lbr.ulp;'; # Shift+Control+N edit next LBR +ASSIGN S+A+N 'run nextdevdescript.ulp;'; # Shift+Alt+N edit next Device & Description +ASSIGN A+P 'run prevpacdescript.ulp;'; # Control+P edit previous Package & Description +ASSIGN C+P 'run editprev-dev-sym-pac.ulp;'; # Control+P edit previous Sym/Pac/Dev +ASSIGN C+A+P 'run prevdevdescript.ulp;'; # Control+P edit previous Device & Description +ASSIGN S+C+P 'run editprev-lbr.ulp;'; # Shift+Control+P edit previus LBR +ASSIGN C+R 'run cmd-rename-in-lbr.ulp;'; # Control+R Rename Sym/Pac/Dev +ASSIGN A+S+C+R 'run remove-dev-sym-pac.ulp;'; # Alt+Shift+Control+R remove Device from LBR +ASSIGN C+S 'write;'; # Control+S save file +ASSIGN S+C+S 'write;'; # Shift+Control+S save file +ASSIGN A+S+C+S 'write;'; # Alt+Shift+Control+S save file +ASSIGN C+M 'DESCRIPT' +ASSIGN C+E 'run edit-used-dev-pac-sym.ulp;'; # Control+E edit used Device/Package/Smbol, cross jump + +PAC: +ASSIGN C+A+N 'grid mil; ch size 50; grid last; change lay tname; text >NAME' +ASSIGN C+A+V 'grid mil; ch size 50; grid last; change lay tvalue; text >VALUE' + +SYM: +ASSIGN C+S+N 'grid mil 50 on; ch size 70; change lay names; text >NAME' +ASSIGN C+S+V 'grid mil 50 on; ch size 70; change lay values; text >VALUE' + +SCH: +ASSIGN C+N 'run editnext-sheet.ulp;'; # Control-N edit next +ASSIGN C+P 'run editprev-sheet.ulp;'; # Control-N edit previous +ASSIGN S+C+P 'run cam2printer 1 schematic.cam;' # start ULP +ASSIGN C+D 'run cam2dxf schematic.cam;' # start ULP + +BRD: +ASSIGN S+C+P 'run cam2printer 0 layout2.cam;' # start ULP +ASSIGN C+D 'run cam2dxf layout2.cam;' # start ULP + diff --git a/eagle-5.7.0/scr/elektro-init.scr b/eagle-5.7.0/scr/elektro-init.scr new file mode 100644 index 0000000..aa14414 --- /dev/null +++ b/eagle-5.7.0/scr/elektro-init.scr @@ -0,0 +1,19 @@ +# Diese Scriptdatei trifft Voreinstellungen, die fuer das +# Bearbeiten von Elektro-Schaltplaenen geeignet sind. +# Starten Sie das Script vom Schaltplan-Editor aus. + +GRID INCH 0.1 2 lines on; +GRID ALT INCH 0.01; + +SET AUTO_JUNCTION OFF; +SET WIRE_BEND 2; + + +# Textmenue + +MENU 'Tools {\ + Attribute verwalten : RUN e-attributverwaltung.ulp; | \ + Brueckenverwaltung : RUN e-brueckenverwaltung.ulp; | \ + Klemmenplan : RUN e-klemmenplan.ulp; \ + }'\ +; diff --git a/eagle-5.7.0/scr/euro.scr b/eagle-5.7.0/scr/euro.scr new file mode 100644 index 0000000..c1fd1fd --- /dev/null +++ b/eagle-5.7.0/scr/euro.scr @@ -0,0 +1,24 @@ +# Euro Format Board +# +# Draws the dimension lines of a euro format board (100mm x 160mm). + + +Grid mm 1 off; +Set Wire_Bend 0; +Layer Dimension; +Wire 0 (0 0) (160 100) (0 0); +Layer Top; +wire 2 (20 -1) (-1 20); +wire (140 -1) (161 20); +wire (20 101) (-1 80); +Set Wire_Bend 4; +wire (161 80) (140 101); +Layer Bottom; +Set Wire_Bend 0; +wire 2 (20 -1) (-1 20); +wire (140 -1) (161 20); +wire (20 101) (-1 80); +Set Wire_Bend 4; +wire (161 80) (140 101); +Grid Last; +Window Fit; diff --git a/eagle-5.7.0/scr/fill.scr b/eagle-5.7.0/scr/fill.scr new file mode 100644 index 0000000..7d35cb6 --- /dev/null +++ b/eagle-5.7.0/scr/fill.scr @@ -0,0 +1,9 @@ +# Changes the Fill Style +# +# Simple example to define your own fill styles. + +Set Fill_Layer Top Solid; +Set Fill_Layer Bottom Solid; +Set Fill_Layer tPlace Solid; +Set Fill_Layer bPlace Solid; +Set Display_Mode Real; diff --git a/eagle-5.7.0/scr/menu.scr b/eagle-5.7.0/scr/menu.scr new file mode 100644 index 0000000..2955bbb --- /dev/null +++ b/eagle-5.7.0/scr/menu.scr @@ -0,0 +1,31 @@ +# Command Menu Setup +# +# This is an example that shows how to set up a complex command menu, +# including submenus and command aliases. To display the command menu in +# the editor windows you have to activate the option 'Command texts' +# in the 'Options/User Interface' menu. + +MENU 'Grid {\ + Metric {\ + Fine : Grid mm 0.1; |\ + Coarse : Grid mm 1;\ + } | \ + Imperial {\ + Fine : Grid inch 0.001; |\ + Coarse : Grid inch 0.1;\ + } | \ + On : Grid On; | \ + Off : Grid Off;\ + }'\ + 'Display {\ + Top : Display None Top Pads Vias Dimension; |\ + Bottom : Display None Bottom Pads Vias Dimension; |\ + Placeplan {\ + Top : Display None tPlace Dimension; |\ + Bottom : Display None bPlace Dimension;\ + }\ + }'\ + '---'\ + 'Fit : Window Fit;'\ + 'Add' 'Delete' 'Move' ';' 'Edit' 'Quit'\ + ; diff --git a/eagle-5.7.0/scr/mylayers.scr b/eagle-5.7.0/scr/mylayers.scr new file mode 100644 index 0000000..f546f42 --- /dev/null +++ b/eagle-5.7.0/scr/mylayers.scr @@ -0,0 +1,131 @@ +# Changes the layer colors +# +# This script defines the colors and the fill styles of all layers. +# The 'Set Used_Layers' command determins which layers can be +# selected from the DISPLAY menu. + +SET COLOR_LAYER 1 4; +SET COLOR_LAYER 2 1; +SET COLOR_LAYER 3 4; +SET COLOR_LAYER 4 1; +SET COLOR_LAYER 5 4; +SET COLOR_LAYER 6 1; +SET COLOR_LAYER 7 4; +SET COLOR_LAYER 8 1; +SET COLOR_LAYER 9 4; +SET COLOR_LAYER 10 1; +SET COLOR_LAYER 11 4; +SET COLOR_LAYER 12 1; +SET COLOR_LAYER 13 4; +SET COLOR_LAYER 14 1; +SET COLOR_LAYER 15 4; +SET COLOR_LAYER 16 1; +SET COLOR_LAYER 17 2; +SET COLOR_LAYER 18 2; +SET COLOR_LAYER 19 6; +SET COLOR_LAYER 20 15; +SET COLOR_LAYER 21 7; +SET COLOR_LAYER 22 7; +SET COLOR_LAYER 23 15; +SET COLOR_LAYER 24 15; +SET COLOR_LAYER 25 7; +SET COLOR_LAYER 26 7; +SET COLOR_LAYER 27 7; +SET COLOR_LAYER 28 7; +SET COLOR_LAYER 29 7; +SET COLOR_LAYER 30 7; +SET COLOR_LAYER 31 7; +SET COLOR_LAYER 32 7; +SET COLOR_LAYER 33 6; +SET COLOR_LAYER 34 6; +SET COLOR_LAYER 35 7; +SET COLOR_LAYER 36 7; +SET COLOR_LAYER 37 7; +SET COLOR_LAYER 38 7; +SET COLOR_LAYER 39 4; +SET COLOR_LAYER 40 1; +SET COLOR_LAYER 41 4; +SET COLOR_LAYER 42 1; +SET COLOR_LAYER 43 2; +SET COLOR_LAYER 44 7; +SET COLOR_LAYER 45 7; +SET COLOR_LAYER 46 3; +SET COLOR_LAYER 47 7; +SET COLOR_LAYER 48 7; +SET COLOR_LAYER 49 7; +SET COLOR_LAYER 50 7; +SET COLOR_LAYER 51 7; +SET COLOR_LAYER 52 7; +SET COLOR_LAYER 53 7; + +SET COLOR_LAYER 91 2; +SET COLOR_LAYER 92 1; +SET COLOR_LAYER 93 2; +SET COLOR_LAYER 94 4; +SET COLOR_LAYER 95 7; +SET COLOR_LAYER 96 7; + +#SET FILL_LAYER layer fill; +SET FILL_LAYER 1 1; +SET FILL_LAYER 2 3; +SET FILL_LAYER 3 3; +SET FILL_LAYER 4 4; +SET FILL_LAYER 5 4; +SET FILL_LAYER 6 8; +SET FILL_LAYER 7 8; +SET FILL_LAYER 8 2; +SET FILL_LAYER 9 2; +SET FILL_LAYER 10 7; +SET FILL_LAYER 11 7; +SET FILL_LAYER 12 5; +SET FILL_LAYER 13 5; +SET FILL_LAYER 14 6; +SET FILL_LAYER 15 6; +SET FILL_LAYER 16 1; +SET FILL_LAYER 17 1; +SET FILL_LAYER 18 1; +SET FILL_LAYER 19 1; +SET FILL_LAYER 20 1; +SET FILL_LAYER 21 1; +SET FILL_LAYER 22 1; +SET FILL_LAYER 23 1; +SET FILL_LAYER 24 1; +SET FILL_LAYER 25 1; +SET FILL_LAYER 26 1; +SET FILL_LAYER 27 1; +SET FILL_LAYER 28 1; +SET FILL_LAYER 29 3; +SET FILL_LAYER 30 6; +SET FILL_LAYER 31 4; +SET FILL_LAYER 32 5; +SET FILL_LAYER 33 3; +SET FILL_LAYER 34 6; +SET FILL_LAYER 35 4; +SET FILL_LAYER 36 5; +SET FILL_LAYER 37 1; +SET FILL_LAYER 38 1; +SET FILL_LAYER 39 11; +SET FILL_LAYER 40 11; +SET FILL_LAYER 41 10; +SET FILL_LAYER 42 10; +SET FILL_LAYER 43 10; +SET FILL_LAYER 44 1; +SET FILL_LAYER 45 1; +SET FILL_LAYER 46 1; +SET FILL_LAYER 47 1; +SET FILL_LAYER 48 1; +SET FILL_LAYER 49 1; +SET FILL_LAYER 50 1; +SET FILL_LAYER 51 1; +SET FILL_LAYER 52 1; + +SET FILL_LAYER 91 1; +SET FILL_LAYER 92 1; +SET FILL_LAYER 93 1; +SET FILL_LAYER 94 1; +SET FILL_LAYER 95 1; +SET FILL_LAYER 96 1; +Set Used_Layers 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 \ + 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 \ + 47 48 49 50 51 52 91 92 93 94 95 96; +DISPLAY NONE 1 16 17 21; diff --git a/eagle-5.7.0/scr/nofill.scr b/eagle-5.7.0/scr/nofill.scr new file mode 100644 index 0000000..de1263f --- /dev/null +++ b/eagle-5.7.0/scr/nofill.scr @@ -0,0 +1,10 @@ +# Changes the Fill Style +# +# The fill style for Top and Bottom layer will be switched to 'empty'. +# Use fill.scr to undo this action. + +Set Fill_Layer Top Empty; +Set Fill_Layer Bottom Empty; +Set Fill_Layer tPlace Empty; +Set Fill_Layer bPlace Empty; +Set Display_Mode NoDrill; diff --git a/eagle-5.7.0/ulp/DESCRIPTION b/eagle-5.7.0/ulp/DESCRIPTION new file mode 100644 index 0000000..0f5346c --- /dev/null +++ b/eagle-5.7.0/ulp/DESCRIPTION @@ -0,0 +1,25 @@ + +User Language Programs +

+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:
+http://www.cadsoftusa.com + + +User-Language-Programme +

+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:
+http://www.cadsoft.de + diff --git a/eagle-5.7.0/ulp/bom.ulp b/eagle-5.7.0/ulp/bom.ulp new file mode 100644 index 0000000..796e47b --- /dev/null +++ b/eagle-5.7.0/ulp/bom.ulp @@ -0,0 +1,859 @@ +#require 4.1105 + +#usage "en: Export a Bill Of Material\n" + "

" + "Generates a project's Bill Of Material." + "

" + "A database with additional information like order codes, manufacturers " + "or prices can be created and managed." + "

" + "Author: support@cadsoft.de", + "de: Stückliste exportieren\n" + "

" + "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." + "

" + "Autor: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string HelpTextEN = + "How to generate the Bill Of Material\n" + "

\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"
+  "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" + "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"
+  "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" + "

\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" + , + "


ERROR: No schematic!

\nThis program can only work in the schematic editor.\v" + "


FEHLER: Kein Schaltplan!

\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("


ERROR: No schematic!

\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 += "\n"; + int numHeaders; + for (int l = 0; Lines[l]; l++) { + List += ""; + 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 += ""; + } + List += "\n"; + } + List += "
" + a[i] + "
\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 = "

" + 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" + "

" + "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;';" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// CAM-Job token +string tok_job = "[CAM Processor Job]"; +string tok_Descrition = "Description="; +string description; +string descriptionLine[]; +int descrCnt; +string tok_Section = "Section="; +string tok_Sec_n = "[Sec_"; +string section[]; +string tok_Name = "Name="; +string sec_Name[]; +string tok_Prompt = "Prompt="; +string sec_Prompt[]; +string tok_Out_put = "Output="; +string sec_Out_put[]; + +string tok_Sheet = "Sheet="; +int sec_Sheet[]; +int sheetprint = 0; // 0 = All, 1 = From To, 2 = This section defined, 3 = Actual + +int sheetprint_from[]; +int sheetprint_to[]; +string actualsheet; + +string tok_Layers = "Layers="; +string sec_Layers[]; +string sec_usedlayer[]; +int absolutUsedLayer = 0; + +string lines[]; +int nLines; +string s; +string nu; +int sx = 0; + +int lVisible[]; +int useLayer[]; +string lNames[] = { " " }; +int lastsheet = 0; +string lastSH; + +string Unit = " -u MM"; +string AlwaysVertorFont = " -a"; +string UseWireWidth = " -w"; +string FillArea = " -f"; + +string help = usage+ "This ULP converts a CAM Job to a DXF Export script!

\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."; + +string ulp_path ; +char bkslash = '/'; +int pos = strrchr(argv[0], bkslash); +if (pos >= 0) ulp_path = strsub(argv[0], 0, pos + 1); + +string cmd = ""; +int test = 0; +int Result = 0; + +// File handling +int n = 0; +string text; +string CAMfileName; +int nBytes; +int align; +string CAMfile; + +string Eagle =""; + +// *** functions *** + +void editsec(int sec) { + string num; + sprintf(num, "%d", sec); + dlgDialog("Section Editor") { + dlgLabel("Section " + num); + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; + return; +} + +void commandPrint(string sectab) { + cmd += "RUN dxf -s " + sectab + Unit + AlwaysVertorFont + UseWireWidth + FillArea + ";\n"; + return; + } + +void viewDescript(void) { + string ds; + for (int n = 1 ; n < descrCnt; n++ ) { + if (ds[0] = ' ') { + ds = descriptionLine[n]; + ds[0] = ' '; + descriptionLine[n] = ds; + } + } + descriptionLine[0] = "" + descriptionLine[0] + ""; + ds = strjoin(descriptionLine, '\n'); + dlgMessageBox(ds, "OK"); + return; +} + +void readCam(void) { + sx = 0; + for (int sn = 0; sn < nLines; sn++) { + if( strstr(lines[sn], tok_Descrition) == 0) { + description = strsub(lines[sn], strlen(tok_Descrition) + 1, strlen(lines[sn]) - (strlen(tok_Descrition)+2) ); + descrCnt = strsplit (descriptionLine, description, '\\'); + } + + if( strstr(lines[sn], tok_Sec_n) == 0) { + sx = strtol( strsub(lines[sn], strstr(lines[sn], "_") + 1) ); + sprintf(nu, "%d", sx); + } + + if( strstr(lines[sn], tok_Name ) == 0) {; + sec_Name[sx] = strsub(lines[sn], strlen(tok_Name) + 1, strlen(lines[sn]) - (strlen(tok_Name)+2) ); + sheetprint_from[sx] = 1; + } + + if( strstr(lines[sn], tok_Prompt ) == 0) {; + sec_Prompt[sx] = strsub(lines[sn], strlen(tok_Prompt) + 1, strlen(lines[sn]) - (strlen(tok_Prompt)+2) ); + } + + if( strstr(lines[sn], tok_Out_put ) == 0) { + sec_Out_put[sx] = strsub(lines[sn], strlen(tok_Out_put) + 1, strlen(lines[sn]) - (strlen(tok_Out_put)+2) ); + } + + if( strstr(lines[sn], tok_Sheet ) == 0) { + sec_Sheet[sx] = strtod( strsub(lines[sn], strlen(tok_Sheet) , strlen(lines[sn]) - (strlen(tok_Sheet) ) ) ); + } + + // n Layers (max 255) + if( strstr(lines[sn], tok_Layers ) == 0) { + sec_Layers[sx] = strsub(lines[sn], strlen(tok_Layers) + 2, strlen(lines[sn]) - (strlen(tok_Layers)+3) ); + // hier noch die Layer + } + } + return; +} + +// main +if (argv[1]) { + CAMfileName = argv[1]; + string dir = filedir(CAMfileName); + if (filedir(CAMfileName)) ; + else CAMfileName = path_cam[0] + "/" + argv[1]; + } +else { + CAMfileName = dlgFileOpen("Select CAM File", path_cam[0]+"/*.cam", "*.*"); + } + +if (CAMfileName) { + nLines = fileread(lines, CAMfileName); + readCam(); + } +else exit (0); + +if(lines[0] != tok_job) { + dlgMessageBox(CAMfileName + "\nis not a EAGLE CAM-Job\n" + lines[0], "OK"); + exit (0); + } + +if (schematic) { + schematic(S) { + if (sheet) sheet(SH) sprintf(actualsheet, "%d", SH.number); + } + schematic(S) { + S.sheets(SH) { + if (lastsheet < SH.number) lastsheet = SH.number; + } + S.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + +if (board) { + board(B) { + B.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + + +// tabs menue +Result = dlgDialog("CAM-Job to Print-Command") { + //Define a container for tab pages + dlgTabWidget { + int tpn=1; + sheetprint_to[tpn] = lastsheet; + while (sec_Name[tpn]) { + dlgTabPage(sec_Name[tpn]) { + dlgLabel("JOB Name: " + CAMfileName); + dlgSpacing(10); + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(10); + dlgLabel(Eagle); + dlgSpacing(10); + if (board) { + dlgVBoxLayout { + dlgGroup("Suffix") dlgLabel(sec_Out_put[tpn]); + dlgStretch(1); + } + } + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgVBoxLayout { + if (schematic) { + dlgStretch(0); + dlgGroup("Sheet") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgRadioButton("&All ", sheetprint); + dlgLabel(" "); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&From ", sheetprint); + dlgLabel("S&heet "); + dlgIntEdit(sheetprint_from[tpn], 1, lastsheet); + dlgLabel(" &to "); + dlgIntEdit(sheetprint_to[tpn], sheetprint_from[tpn], lastsheet); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&# ", sheetprint); + string sl; + sprintf(sl, "%d/%d", sec_Sheet[tpn], lastsheet); + dlgLabel(sl + " (def. in section)"); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("Actua&l ", sheetprint); + dlgLabel(actualsheet); + dlgStretch(1); + } + } + } + } // if schematic + dlgStretch(1); + } + // *** 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) { + sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]); + n++; + } + } + } + } + sec_usedlayer[n] = ""; // clear last+1 + absolutUsedLayer = n; + dlgStretch(0); + dlgSpacing(10); + dlgVBoxLayout { + if (absolutUsedLayer) { + dlgHBoxLayout { dlgSpacing(100); } + dlgLabel("Printed layers"); + dlgListBox(sec_usedlayer, Seleclayer); + } + else { + dlgLabel(""); + dlgLabel("no Layers selected\nin this CAM-Job/Section!\nLoad a correct Job."); + } + } + dlgSpacing(10); + } + dlgStretch(1); + } + dlgStretch(1); + tpn++; + } + } // ************ 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], " ") + " '" + CAMfileName + "';\n"); + } + } + dlgStretch(1); + } + }; + +if (Result == 0) exit (0); + +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) { + 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, " %3s", layer[x]); + cmd += s; + if(num == 21) cmd += " -23 -25 -27 -51"; + if(num == 22) cmd += " -24 -26 -28 -52"; + n++; + } + } + } + cmd += ";\n"; + commandPrint(sec_Out_put[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, " %3s", layer[x]); + cmd += s; + n++; + } + } + } + cmd += ";\n"; + string sh; + string shn; + switch (sheetprint) { + case 0 : schematic(S) { + S.sheets(SH) { + sprintf(sh, "EDIT '.s%d';\n", SH.number); + cmd += sh; + sprintf(shn, "_s%d", SH.number); + commandPrint(shn); + } + } + break; + + case 1 : for (int prn = sheetprint_from[tpn]; prn <= sheetprint_to[tpn]; prn++) { + sprintf(sh, "EDIT '.s%d';\n", prn); + cmd += sh; + sprintf(shn, "_s%d", prn); + commandPrint(shn); + } + break; + + case 2 : sprintf(sh, "EDIT '.s%d';\n", sec_Sheet[tpn]); + cmd += sh; + sprintf(shn, "_s%d", sec_Sheet[tpn]); + commandPrint(shn); + break; + + case 3 : sprintf(sh, "EDIT '.s%s';\n", actualsheet); + cmd += sh; + sprintf(shn, ".s%s", actualsheet); + commandPrint(shn); + 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 += ";\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", "ESC") != 0) exit (-1);} +exit (cmd); diff --git a/eagle-5.7.0/ulp/cam2image.ulp b/eagle-5.7.0/ulp/cam2image.ulp new file mode 100644 index 0000000..ab6cf32 --- /dev/null +++ b/eagle-5.7.0/ulp/cam2image.ulp @@ -0,0 +1,556 @@ +#usage "Convert a CAM job to a script to export IMAGE data" + "

" + "Usage: RUN cam2image [ filename monochrome resolution image type]" + "

" + "Tip: Assign a funktion key with" + "
" + "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;';" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// Revision 1. 14.02.2005 Exdendet with .tif format alf@cadsoft.de +// Revision 2. 23.02.2005 Use correct file name in CAM-Job-Section alf@cadsoft.de + + +// CAM-Job token +string tok_job = "[CAM Processor Job]"; +string tok_Descrition = "Description="; +string description; +string descriptionLine[]; +int descrCnt; +string tok_Section = "Section="; +string tok_Sec_n = "[Sec_"; +string section[]; +string tok_Name = "Name="; +string sec_Name[]; +string tok_Prompt = "Prompt="; +string sec_Prompt[]; +string tok_Out_put = "Output="; +string sec_Out_put[]; + +string file_name; + +string tok_Sheet = "Sheet="; +int sec_Sheet[]; +int sheetprint = 0; // 0 = All, 1 = From To, 2 = This section defined, 3 = Actual + +int sheetprint_from[]; +int sheetprint_to[]; +string actualsheet; + +string tok_Layers = "Layers="; +string sec_Layers[]; +string sec_usedlayer[]; +int absolutUsedLayer = 0; + +string lines[]; +int nLines; +string s; +string nu; +int sx = 0; + +int lVisible[]; +int useLayer[]; +string lNames[] = { " " }; +int lastsheet = 0; +string lastSH; + +int Resolution = 75; // DPI +string monochrome = ""; +int sel_monochrome = 0; + + +string filetype[] = { + ".bmp", // Windows-Bitmap-Datei + ".png", // Portable-Network-Graphics-Datei + ".pbm", // Portable-Bitmap-Datei + ".pgm", // Portable-Grayscale-Bitmap-Datei + ".ppm", // Portable-Pixelmap-Datei + ".xbm", // X-Bitmap-Datei + ".xpm", // X-Pixmap-Datei + ".tif" // Tiff-Datei + }; + +int selfiletype = 0; + + +string help = usage+ "This ULP converts a CAM Job to a Export IMAGE!
\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.
"; + +string ulp_path ; +char bkslash = '/'; +int pos = strrchr(argv[0], bkslash); +if (pos >= 0) ulp_path = strsub(argv[0], 0, pos + 1); + +string cmd = ""; +int test = 0; +int Result = 0; + +// File handling +int n = 0; +string text; +string CAMfileName; +int nBytes; +int align; +string CAMfile; + +string Eagle =""; + +// *** functions *** + +void editsec(int sec) { + string num; + sprintf(num, "%d", sec); + dlgDialog("Section Editor") { + dlgLabel("Section " + num); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + }; + return; +} + +void commandPrint(string sectab) { + string h; + string Path = filedir(sectab); + string File_Name = filesetext(filename(sectab), ""); + string Extension = fileext(sectab); + string expfilename; + + if (Path) { // check filename in CAM-Job *** 23.02.2005 alf@cadsoft.de + if (!File_Name) { + expfilename = Path + filesetext(filename(file_name), "") + Extension; + } + else { + expfilename = Path + File_Name + Extension; + } + } + else { + expfilename = file_name + Extension; + } + sprintf(h, "EXPORT IMAGE '%s%s' %s %d;\n", expfilename, filetype[selfiletype], monochrome, Resolution); + cmd += h; + return; + } + +void viewDescript(void) { + string ds; + for (int n = 1 ; n < descrCnt; n++ ) { + if (ds[0] = ' ') { + ds = descriptionLine[n]; + ds[0] = ' '; + descriptionLine[n] = ds; + } + } + descriptionLine[0] = "" + descriptionLine[0] + ""; + ds = strjoin(descriptionLine, '\n'); + dlgMessageBox(ds, "OK"); + return; +} + +void readCam(void) { + sx = 0; + for (int sn = 0; sn < nLines; sn++) { + if( strstr(lines[sn], tok_Descrition) == 0) { + description = strsub(lines[sn], strlen(tok_Descrition) + 1, strlen(lines[sn]) - (strlen(tok_Descrition)+2) ); + descrCnt = strsplit (descriptionLine, description, '\\'); + } + + if( strstr(lines[sn], tok_Sec_n) == 0) { + sx = strtol( strsub(lines[sn], strstr(lines[sn], "_") + 1) ); + sprintf(nu, "%d", sx); + } + + if( strstr(lines[sn], tok_Name ) == 0) {; + sec_Name[sx] = strsub(lines[sn], strlen(tok_Name) + 1, strlen(lines[sn]) - (strlen(tok_Name)+2) ); + sheetprint_from[sx] = 1; + } + + if( strstr(lines[sn], tok_Prompt ) == 0) {; + sec_Prompt[sx] = strsub(lines[sn], strlen(tok_Prompt) + 1, strlen(lines[sn]) - (strlen(tok_Prompt)+2) ); + } + + if( strstr(lines[sn], tok_Out_put ) == 0) { + sec_Out_put[sx] = strsub(lines[sn], strlen(tok_Out_put) + 1, strlen(lines[sn]) - (strlen(tok_Out_put)+2) ); + } + + if( strstr(lines[sn], tok_Sheet ) == 0) { + sec_Sheet[sx] = strtod( strsub(lines[sn], strlen(tok_Sheet) , strlen(lines[sn]) - (strlen(tok_Sheet) ) ) ); + } + + // n Layers (max 255) + if( strstr(lines[sn], tok_Layers ) == 0) { + sec_Layers[sx] = strsub(lines[sn], strlen(tok_Layers) + 2, strlen(lines[sn]) - (strlen(tok_Layers)+3) ); + // hier noch die Layer + } + } + return; +} + +// main +int nt = 0; +do { + if(strlwr(argv[4]) == filetype[nt]) { + selfiletype = nt; + break; + } + nt++; +} while(filetype[nt]); + +if (argv[3]) Resolution = strtol(argv[3]); + +if (strupr(argv[2]) == "MONOCHROME") sel_monochrome = 1; + +if (argv[1]) { + CAMfileName = argv[1]; + string dir = filedir(CAMfileName); + if (filedir(CAMfileName)) ; + else CAMfileName = path_cam[0] + "/" + argv[1]; + } +else { + CAMfileName = dlgFileOpen("Select CAM File", path_cam[0]+"/*.cam", "*.*"); + } + +if (CAMfileName) { + nLines = fileread(lines, CAMfileName); + readCam(); + } +else exit (0); + +if(lines[0] != tok_job) { + dlgMessageBox(CAMfileName + "\nis not a EAGLE CAM-Job\n" + lines[0], "OK"); + exit (0); + } + +if (schematic) { + schematic(S) { + file_name = filesetext(S.name, ""); + if (sheet) sheet(SH) sprintf(actualsheet, "%d", SH.number); + } + schematic(S) { + S.sheets(SH) { + if (lastsheet < SH.number) lastsheet = SH.number; + } + S.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + +if (board) { + board(B) { + file_name = filesetext(B.name, ""); + B.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + + +// tabs menue +Result = dlgDialog("CAM-Job to EXPORT Image-Command") { + //Define a container for tab pages + dlgTabWidget { + int tpn=1; + sheetprint_to[tpn] = lastsheet; + while (sec_Name[tpn]) { + dlgTabPage(sec_Name[tpn]) { + dlgLabel("JOB Name: " + CAMfileName); + dlgSpacing(10); + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(10); + dlgLabel(Eagle); + dlgSpacing(10); + if (board) { + dlgVBoxLayout { + dlgGroup("File name/suffix") dlgLabel(sec_Out_put[tpn]); + dlgStretch(1); + } + } + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgVBoxLayout { + if (schematic) { + dlgStretch(0); + dlgGroup("Sheet") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgRadioButton("&All ", sheetprint); + dlgLabel(" "); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&From ", sheetprint); + dlgLabel("S&heet "); + dlgIntEdit(sheetprint_from[tpn], 1, lastsheet); + dlgLabel(" &to "); + dlgIntEdit(sheetprint_to[tpn], sheetprint_from[tpn], lastsheet); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&# ", sheetprint); + string sl; + sprintf(sl, "%d/%d", sec_Sheet[tpn], lastsheet); + dlgLabel(sl + " (def. in section)"); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("Actua&l ", sheetprint); + dlgLabel(actualsheet); + dlgStretch(1); + } + } + } + } // if schematic + dlgStretch(1); + } + // *** 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) { + sprintf(sec_usedlayer[n], "%3s %s", layer[x], lNames[num]); + n++; + } + } + } + } + sec_usedlayer[n] = ""; // clear last+1 + absolutUsedLayer = n; + dlgStretch(0); + dlgSpacing(10); + dlgVBoxLayout { + if (absolutUsedLayer) { + dlgHBoxLayout { dlgSpacing(100); } + dlgLabel("Printed layers"); + dlgListBox(sec_usedlayer, Seleclayer); + } + else { + dlgLabel(""); + dlgLabel("no Layers selected\nin this CAM-Job/Section!\nLoad a correct Job."); + } + } + dlgSpacing(10); + } + dlgStretch(1); + } + dlgStretch(1); + tpn++; + } + } // ************ 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 { + dlgLabel("FileType"); + dlgComboBox(filetype, selfiletype); + dlgSpacing(15); + dlgCheckBox("Monochrome", sel_monochrome); + dlgSpacing(15); + dlgLabel("Resolution DPI"); + dlgIntEdit(Resolution, 50, 600); + dlgStretch(1); + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgPushButton("&Load CAM-File") { + CAMfileName = dlgFileOpen("select a File", path_cam[0]+"/*.cam", ""); + if (CAMfileName) { + exit ("run '" + filesetext(argv[0], "") + "' '" + CAMfileName + "';\n"); + } + } + dlgStretch(1); + } + }; + +if (Result == 0) exit (0); +if (sel_monochrome) monochrome = "MONOCHROME"; +else monochrome = ""; + +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) { + 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, " %3s", layer[x]); + cmd += s; + if(num == 21) cmd += " -23 -25 -27 -51"; + if(num == 22) cmd += " -24 -26 -28 -52"; + n++; + } + } + } + cmd += ";\n"; + commandPrint(sec_Out_put[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, " %3s", layer[x]); + cmd += s; + n++; + } + } + } + cmd += ";\n"; + string sh; + string shn; + switch (sheetprint) { + case 0 : schematic(S) { + S.sheets(SH) { + sprintf(sh, "EDIT '.s%d';\n", SH.number); + cmd += sh; + sprintf(shn, "_s%d", SH.number); + commandPrint(shn); + } + } + break; + + case 1 : for (int prn = sheetprint_from[tpn]; prn <= sheetprint_to[tpn]; prn++) { + sprintf(sh, "EDIT '.s%d';\n", prn); + cmd += sh; + sprintf(shn, "_s%d", prn); + commandPrint(shn); + } + break; + + case 2 : sprintf(sh, "EDIT '.s%d';\n", sec_Sheet[tpn]); + cmd += sh; + sprintf(shn, "_s%d", sec_Sheet[tpn]); + commandPrint(shn); + break; + + case 3 : sprintf(sh, "EDIT '.s%s';\n", actualsheet); + cmd += sh; + sprintf(shn, ".s%s", actualsheet); + commandPrint(shn); + 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 += ";\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) { dlgMessageBox(cmd, "OK", "Cancel"); exit (0);} +exit (cmd); diff --git a/eagle-5.7.0/ulp/cam2print-box-grey-optimize.bmp b/eagle-5.7.0/ulp/cam2print-box-grey-optimize.bmp new file mode 100644 index 0000000..74d4f3f Binary files /dev/null and b/eagle-5.7.0/ulp/cam2print-box-grey-optimize.bmp differ diff --git a/eagle-5.7.0/ulp/cam2print-box-grey-poscoord.bmp b/eagle-5.7.0/ulp/cam2print-box-grey-poscoord.bmp new file mode 100644 index 0000000..8ce79ca Binary files /dev/null and b/eagle-5.7.0/ulp/cam2print-box-grey-poscoord.bmp differ diff --git a/eagle-5.7.0/ulp/cam2print-box-grey-quickplot.bmp b/eagle-5.7.0/ulp/cam2print-box-grey-quickplot.bmp new file mode 100644 index 0000000..b276d99 Binary files /dev/null and b/eagle-5.7.0/ulp/cam2print-box-grey-quickplot.bmp differ diff --git a/eagle-5.7.0/ulp/cam2print.ulp b/eagle-5.7.0/ulp/cam2print.ulp new file mode 100644 index 0000000..64bcedc --- /dev/null +++ b/eagle-5.7.0/ulp/cam2print.ulp @@ -0,0 +1,741 @@ +#usage "Convert a CAM job to a PRINT command\n" + "

" + "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;';" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* 24.10.2003 add "SET DISPLAY_MODE REAL;\n" on script end : support@cadsoft.de (az) */ +// 01.03.2006 add path and "/" to job file name. alf@cadsoft.de +// CAMfileName = path_cam[0] + "/" + argv[2]; +// 25.03.2008 print also layer 100 + + +// CAM-Job token +string tok_job = "[CAM Processor Job]"; +string tok_Descrition = "Description="; +string description; +string descriptionLine[]; +int descrCnt; +string tok_Section = "Section="; +string tok_Sec_n = "[Sec_"; +string section[]; +string tok_Name = "Name="; +string sec_Name[]; +string tok_Prompt = "Prompt="; +string sec_Prompt[]; +string tok_Device = "Device="; +string sec_Device[]; +string tok_Wheel = "Wheel="; +string sec_Wheel[]; +string tok_Rack = "Rack="; +string sec_Rack[]; +string tok_Scale = "Scale="; +real sec_Scale[]; +string tok_Out_put = "Output="; +string sec_Out_put[]; +string tok_Flags = "Flags="; +string sec_Flags[]; +int mirror[]; +int rotate[]; +int upside[]; +int poscoord[]; +int quickplot[]; +int optimize[]; +int fillpads[]; +int pageLimit[]; +string tok_Emulate = "Emulate="; +string sec_Emulate[]; +string tok_Offset = "Offset="; +string sec_Offset[]; +real offset_x[]; +real offset_y[]; +string tok_Sheet = "Sheet="; +int sec_Sheet[]; +int sheetprint = 3; // 0 = All, 1 = From To, 2 = This section defined, 3 = Actual + +int sheetprint_from[]; +int sheetprint_to[]; +string tok_Tolerance = "Tolerance="; +string sec_Tolerance[]; +string tolerance0[]; +string tolerance1[]; +string tolerance2[]; +string tolerance3[]; +string tolerance4[]; +string tolerance5[]; +string tok_Pen = "Pen"; +string sec_Pen[]; +string tok_Page = "Page="; +string sec_Page[]; +real page_Height[]; +real page_Width[]; +string tok_Layers = "Layers="; +string sec_Layers[]; +string sec_usedlayer[]; +string tok_Colors = "Colors="; +string sec_Colors[]; +int solid[]; +int black[]; + +string actualsheet; + +string lines[]; +int nLines; +string s; +string nu; +int sx = 0; + +int lVisible[]; +int useLayer[]; +string lNames[] = { " " }; +int lastsheet = 0; +string lastSH; + +/* +path_lbr[] Libraries +path_dru[] Design Rules +path_ulp[] User Language Programs +path_scr[] Scripts +path_cam[] CAM Jobs +path_epf[] Projects +*/ + +string help = usage+ "This ULP converts a CAM Job to a PRINT Script!

\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."; + +string ulp_path ; +char bkslash = '/'; +int pos = strrchr(argv[0], bkslash); + if (pos >= 0) { + ulp_path = strsub(argv[0], 0, pos + 1); + } + +string PageLimit_all = argv[1]; + +string cmd = ""; +int test = 0; +int Result = 0; + +// File handling +int n = 0; +string text; +string CAMfileName; +int nBytes; +int align; +string CAMfile; + +string Eagle =""; + +// *** functions *** + +void editsec(int sec) { + string num; + sprintf(num, "%d", sec); + dlgDialog("Section Editor") { + dlgLabel("Section " + num); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; + return; +} + +void commandPrint(int sectab) { + cmd += "PRINT "; + + sprintf(s, " %.2f -%d", sec_Scale[sectab], pageLimit[sectab]); + cmd += s; + + if(black[sectab]) cmd += " BLACK"; + else cmd += " -BLACK"; + if(solid[sectab]) cmd += " SOLID"; + else cmd += " -SOLID"; + if(mirror[sectab]) cmd += " MIRROR"; + else cmd += " -MIRROR"; + if(rotate[sectab]) cmd += " ROTATE"; + else cmd += " -ROTATE"; + if(upside[sectab]) cmd += " UPSIDEDOWN"; + else cmd += " -UPSIDEDOWN"; + /* + if(poscoord[sectab]) ; // not use to print + if(quickplot[sectab]); // not use to print + if(optimize[sectab]); // not use to print + */ + cmd += ";\n"; + return; + } + +void viewDescript(void) { + string ds; + for (int n = 1 ; n < descrCnt; n++ ) { + if (ds[0] = ' ') { + ds = descriptionLine[n]; + ds[0] = ' '; + descriptionLine[n] = ds; + } + } + descriptionLine[0] = "" + descriptionLine[0] + ""; + ds = strjoin(descriptionLine, '\n'); + dlgMessageBox(ds, "OK"); + return; +} + +void readCam(void) { + sx = 0; + for (int sn = 0; sn < nLines; sn++) { + if( strstr(lines[sn], tok_Descrition) == 0) { + description = strsub(lines[sn], strlen(tok_Descrition) + 1, strlen(lines[sn]) - (strlen(tok_Descrition)+2) ); + descrCnt = strsplit (descriptionLine, description, '\\'); + } + + if( strstr(lines[sn], tok_Sec_n) == 0) { + sx = strtol( strsub(lines[sn], strstr(lines[sn], "_") + 1) ); + sprintf(nu, "%d", sx); + } + + if( strstr(lines[sn], tok_Name ) == 0) {; + sec_Name[sx] = strsub(lines[sn], strlen(tok_Name) + 1, strlen(lines[sn]) - (strlen(tok_Name)+2) ); + sheetprint_from[sx] = 1; + } + + if( strstr(lines[sn], tok_Prompt ) == 0) {; + sec_Prompt[sx] = strsub(lines[sn], strlen(tok_Prompt) + 1, strlen(lines[sn]) - (strlen(tok_Prompt)+2) ); + } + + if( strstr(lines[sn], tok_Device ) == 0) { + sec_Device[sx] = strsub(lines[sn], strlen(tok_Device) + 1, strlen(lines[sn]) - (strlen(tok_Device)+2) ); + } + + if( strstr(lines[sn], tok_Wheel ) == 0) { + sec_Wheel[sx] = strsub(lines[sn], strlen(tok_Wheel) + 1, strlen(lines[sn]) - (strlen(tok_Wheel)+2) ); + } + + if( strstr(lines[sn], tok_Rack ) == 0) { + sec_Rack[sx] = strsub(lines[sn], strlen(tok_Rack) + 1, strlen(lines[sn]) - (strlen(tok_Rack)+2) ); + } + + if( strstr(lines[sn], tok_Scale ) == 0) { + sec_Scale[sx] = strtod(strsub(lines[sn], strlen(tok_Scale), strlen(lines[sn]) - (strlen(tok_Scale)+ 2) ) ); + } + + if( strstr(lines[sn], tok_Out_put ) == 0) { + sec_Out_put[sx] = strsub(lines[sn], strlen(tok_Out_put) + 1, strlen(lines[sn]) - (strlen(tok_Out_put)+2) ); + } + + if( strstr(lines[sn], tok_Flags ) == 0) { + sec_Flags[sx] = strsub(lines[sn], strlen(tok_Flags) + 1, strlen(lines[sn]) - (strlen(tok_Flags)+2) ); + string fl[]; + int fn = strsplit(fl, sec_Flags[sx], ' '); + mirror[sx] = strtol(fl[0]); + rotate[sx] = strtol(fl[1]); + upside[sx] = strtol(fl[2]); + poscoord[sx] = strtol(fl[3]); + quickplot[sx] = strtol(fl[4]); + optimize[sx] = strtol(fl[5]); + fillpads[sx] = strtol(fl[6]); + //Mirror Rotate Upside_down pos._Coord Quick_plot Optimize Fill_Pads + } + + if( strstr(lines[sn], tok_Emulate ) == 0) {; + // 3 Flags not used by printer + } + + // 2 real Values + if( strstr(lines[sn], tok_Offset ) == 0) { + sec_Offset[sx] = strsub(lines[sn], strlen(tok_Offset) + 1, strlen(lines[sn]) - (strlen(tok_Offset)+2) ); + offset_x[sx] = strtol(sec_Offset[sx]); + int oy = strstr(lines[sn], " "); + sec_Flags[sx] = strsub(lines[sn], oy + 1, strlen(lines[sn]) - (oy+2) ); + offset_y[sx] = strtol(sec_Offset[sx]); + } + + if( strstr(lines[sn], tok_Sheet ) == 0) { + sec_Sheet[sx] = strtod( strsub(lines[sn], strlen(tok_Sheet) , strlen(lines[sn]) - (strlen(tok_Sheet) ) ) ); + } + + if( strstr(lines[sn], tok_Tolerance ) == 0) { + sec_Tolerance[sx] = strsub(lines[sn], strlen(tok_Tolerance) + 1, strlen(lines[sn]) - (strlen(tok_Tolerance)+2) ); + string tol[] ; + int tn = strsplit(tol, sec_Tolerance[sx], ' '); + tolerance0[sx] = tol[0]; + tolerance1[sx] = tol[1]; + tolerance2[sx] = tol[2]; + tolerance3[sx] = tol[3]; + tolerance4[sx] = tol[4]; + tolerance5[sx] = tol[5]; + } + + if( strstr(lines[sn], tok_Pen ) == 0) { + // n Pen diameters not used by printer + } + + // x y Pages size + if( strstr(lines[sn], tok_Page ) == 0) { + page_Height[sx] = strtod( strsub(lines[sn], strlen(tok_Page) + 1, strlen(lines[sn]) - (strlen(tok_Page)+2) ) ); + int oy = strstr(lines[sn], " "); + page_Width[sx] = strtod( strsub(lines[sn], strlen(tok_Page) + 1, strlen(lines[sn]) - (oy+2) ) ); + } + + // n Layers (max 255) + if( strstr(lines[sn], tok_Layers ) == 0) { + sec_Layers[sx] = strsub(lines[sn], strlen(tok_Layers) + 2, strlen(lines[sn]) - (strlen(tok_Layers)+3) ); + // hier noch die Layer + } + + // n Layers (max 255) + if( strstr(lines[sn], tok_Colors ) == 0) { + sec_Colors[sx] = strsub(lines[sn], strlen(tok_Colors) + 1, strlen(lines[sn]) - (strlen(tok_Colors)+2) ); + string color[] ; + int cn = strsplit(color, sec_Colors[sx], ' '); + // not used by printer + } + solid[sx] = 1; + black[sx] = 1; + + } + return; +} + +// main +if (argv[2]) { + CAMfileName = path_cam[0] + "/" + argv[2]; + } +else { + CAMfileName = dlgFileOpen("select File", path_cam[0]+"/*.cam", "*.*"); + } + +if (CAMfileName) { + nLines = fileread(lines, CAMfileName); + readCam(); + } +else exit (0); + +if(lines[0] != tok_job) { + dlgMessageBox(CAMfileName + "\nis not a EAGLE CAM-Job\n" + lines[0], "OK"); + exit (0); + } + +if (schematic) { + schematic(S) { + if (sheet) sheet(SH) sprintf(actualsheet, "%d", SH.number); + } + schematic(S) { + S.sheets(SH) { + if (lastsheet < SH.number) lastsheet = SH.number; + } + S.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + +if (board) { + board(B) { + B.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + } + } + } + +// tabs menue +Result = dlgDialog("CAM-Job to Print-Command") { + //Define a container for tab pages + dlgTabWidget { //--- + int tpn=1; + sheetprint_to[tpn] = lastsheet; + while (sec_Name[tpn]) { //--- TabPages --- + pageLimit[tpn] = strtod(PageLimit_all); + dlgTabPage(sec_Name[tpn]) { + dlgHBoxLayout { dlgLabel("JOB Name: " + CAMfileName); } + dlgHBoxLayout { + dlgVBoxLayout { + dlgSpacing(10); + dlgHBoxLayout { + dlgGroup("Job section") { + dlgHBoxLayout { + dlgVBoxLayout { dlgLabel("Section"); dlgLabel("Prompt:"); } + dlgSpacing(10); + dlgVBoxLayout { + dlgHBoxLayout { dlgSpacing(250); } // dont delete this line + dlgLabel(sec_Name[tpn]); + dlgLabel(sec_Prompt[tpn]); + } + dlgStretch(1); + } + dlgStretch(1); + } + dlgStretch(1); + } + dlgStretch(0); + dlgSpacing(10); + dlgHBoxLayout { + dlgGroup("Output") { + dlgHBoxLayout { + dlgVBoxLayout { + dlgLabel("Device"); + dlgLabel("Scale"); + dlgLabel("File"); + } + dlgSpacing(10); + dlgVBoxLayout { + dlgHBoxLayout { dlgSpacing(250); } // dont delete this line + dlgHBoxLayout { dlgLabel(sec_Device[tpn]); } + dlgHBoxLayout { sprintf(s, "%g", sec_Scale[tpn]); dlgLabel(s); } + dlgHBoxLayout { dlgLabel(sec_Out_put[tpn]); } + dlgStretch(1); + } + dlgStretch(0); + } + dlgStretch(0); + } + dlgStretch(0); + } + dlgStretch(0); + dlgSpacing(10); + dlgHBoxLayout { + dlgGroup("Offset") { + dlgHBoxLayout { + dlgLabel("X"); + sprintf(s, "%g", offset_x[tpn]); + dlgSpacing(15); + dlgLabel(s); + } + dlgHBoxLayout { + dlgLabel("Y"); + sprintf(s, "%g", offset_y[tpn]); + dlgSpacing(15); + dlgLabel(s); + } + dlgHBoxLayout { + dlgSpacing(100); + } + } + dlgStretch(0); + dlgSpacing(10); + dlgGroup("Page") { + dlgHBoxLayout { + dlgLabel("Height"); + sprintf(s, "%g", page_Height[tpn]); + dlgSpacing(15); + dlgLabel(s); + } + dlgHBoxLayout { + dlgLabel("Width"); + sprintf(s, "%g", page_Width[tpn]); + dlgSpacing(18); + dlgLabel(s); + } + dlgHBoxLayout { + dlgSpacing(100); + } + } + } + dlgLabel(" "); + if (schematic) { + dlgStretch(0); + dlgGroup("Sheet") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgRadioButton("&All ", sheetprint); + dlgLabel(" "); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&From ", sheetprint); + dlgLabel("S&heet "); + dlgIntEdit(sheetprint_from[tpn], 1, lastsheet); + dlgLabel(" &to "); + dlgIntEdit(sheetprint_to[tpn], sheetprint_from[tpn], lastsheet); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&# ", sheetprint); + string sl; + sprintf(sl, "%d/%d", sec_Sheet[tpn], lastsheet); + dlgLabel(sl); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("Actua&l ", sheetprint); + dlgLabel(actualsheet); + dlgStretch(1); + } + } + } + } // if schematic + + dlgStretch(1); + } + + dlgStretch(0); + dlgSpacing(15); + dlgHBoxLayout { + dlgStretch(0); + dlgVBoxLayout { + dlgSpacing(10); + dlgGroup("Style") { + dlgHBoxLayout { + dlgVBoxLayout { + dlgCheckBox("&Mirror", mirror[tpn]); + dlgCheckBox("&Rotate", rotate[tpn]); + dlgCheckBox("&Upside down", upside[tpn]); + dlgLabel(""); + dlgLabel(""); + dlgLabel(""); + dlgCheckBox("&Fill pads (board)", fillpads[tpn]); + dlgCheckBox("&Black", black[tpn]); + dlgCheckBox("Soli&d", solid[tpn]); + } + dlgStretch(1); + dlgLabel(Eagle); + dlgStretch(0); + } + } + dlgStretch(1); + dlgSpacing(10); + dlgHBoxLayout { + dlgLabel("&Scale factor "); + dlgRealEdit(sec_Scale[tpn] , .01, 1000); + dlgStretch(1); + } + dlgHBoxLayout { + dlgLabel("&Page limit *"); + dlgSpacing(8); + dlgIntEdit(pageLimit[tpn] , 0, 100); + dlgStretch(1); + } + dlgLabel("* preset page limit for all pages start this ULP from command line by:
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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED +// Version 4.2 -- 20.04.2004 alf@cadsoft.de +// Version 4.3 -- 04.03.2005 alf@cadsoft.de +// Change Drill gerundet auf 1/10 mm +// wenn angegebenes Toleranzfenster eingehalten wird. +// Change Restring wenn angegebenes Toleranzfenster eingehalten wird. + +string drill_help = "Changes the drill diameter for all pads within the tolerances.
" + + "
"; + +string rounddrill_help = "Rounding the drill diameter to 1/10 mm.
Only for drill diameter of pads that are within the given tolerances.
" + + "
"; + +string restring_help = "Changes the restring of pads that are within the given range.
" + + "
"; + + +if (language() == "de") { + drill_help = "Ändert nur Bohrdurchmesser von PADs deren Wert innerhalb des Toleranzfensters liegt.
" + + "
"; + + rounddrill_help = "Bohrdurchmesser auf 1/10 mm runden.
Rundet nur Bohrdurchmesser von PADs deren Wert innerhalb des Toleranzfensters liegt.
" + + "
"; + + restring_help = "Ändert nur Restringe von Pads deren Wert innerhalb des Bereiches liegt.
" + + "
"; +} + + +string script_change = ""; + +int Result = 0; +string grid = "GRID MM FINEST;\n"; +string cmd, s; + + // *** flags for changes +int change_pac; +int cntPac = 0, cntContact = 0; + +int to_change[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +int begin = - 1; // *** pointer of flags +int P_firstpad = begin + 1; +int P_shape = P_firstpad + 1; +int P_drill = P_shape + 1; +int P_rounddrill = P_drill + 1; +int P_diameter = P_rounddrill + 1; +int P_restring = P_diameter + 1; +int P_stopmask = P_restring + 1; +int P_creammask = P_stopmask + 1; +int last = P_creammask + 1; + +int changefrom = P_drill; +int changeto = last - 1; + + +real change_values[] = { + 0, // Pad-First-Pin + 0, // Pad-Shape + 0, // Pad-Drill + 0, // Pad-Drill round + 0, // Pad-Diameter + 0, // Pad-Restring + 0, // Pad-Stop-Mask + 0, // Pad-Cream-Mask + 0 }; + +string tochange[] = { + "Change pad flag '&First' ", + "Change pad &shape", + "Change pad &drill", + "Round pad drill 1/&10 mm", + "Change pad dia&meter", + "Change pad &restring", + "Change pad s&top mask ON/OFF", + "Change pad &cream mask ON/OFF", + "" }; + +string menuchange[] = { + "Change Pad Flag 'First' ", + "Change Pad Shape", + "Change Pad Drill", + "Rounding Pad Drill 1/10 mm", + "Change Pad Diameter", + "Change Pad Restring", + "Change Pad Stop Mask ON/OFF", + "Change Pad Cream Mask ON/OFF", + "" }; + +real min_val[] = { + 0.0, // Pad-First-Pin + 0.0, // Pad-Shape + 0.0, // Pad-Drill + 0.0, // Pad-Drill round + 0.0, // Pad-Diameter + 0.0, // Pad-Restring + 0.0, // Pad-Stop-Mask + 0.0 // Pad-Cream-Mask + }; + +real max_val[] = { + 0, // Pad-First-Pin + 13.1, // Pad-Shape + 13.1, // Pad-Drill + 13.1, // Pad-Drill round + 13.1, // Pad-Diameter + 13.1, // Pad-Restring + 1, // Pad-Stop-Mask + 1, // Pad-Cream-Mask + 0 + }; + +string min_max[] = { + "", // Pad-First-Pin + "in the range of 0.0...13.1 mm", // Pad-Shape + "in the range of 0.0...13.1 mm", // Pad-Drill + "", // Pad-Drill round + "in the range of 0.0...13.1 mm", // Pad-Diameter + "in the range of 0.0...13.1 mm", // Pad-Restring + "in the range of 0 Off / 1 On", // Pad-Stop-Mask + "in the range of 0 Off / 1 On", // Pad-Cream-Mask + "" + }; + +string fist_pad_name = "1"; // change to A-Z alphabetical (example: for transistor emitter = E) +string first_onoff[] = { "OFF", "ON" }; +int flag_offon = 1; +string stop_onoff = "ON"; +string cream_onoff = "ON"; +int shape = 0; +int shape1 = 0; +int round_drill = 0; // to round pad drills to 1/10 mm +int mpercent = 2, ppercent = 5; +real minrestring = 0.0, maxrestring = 0.3; + +string pad1, padx; + +string shape_form[] = { // change Shape + "NONE", + "SQUARE", + "ROUND", + "OCTAGON", + "" }; + +int cntchrestring = 0; +int cntchdrill = 0; + + + +// *** function *** +void get_changemenue(string lib) { + Result = dlgDialog("Change PAD in Library") { + dlgLabel("(" + lib + ")"); + dlgStretch(0); + dlgHBoxLayout { + dlgGroup("Change") { + dlgCheckBox(tochange[P_firstpad], to_change[P_firstpad]); + dlgCheckBox(tochange[P_shape], to_change[P_shape]); + dlgHBoxLayout { + dlgCheckBox(tochange[P_drill], to_change[P_drill]) if (to_change[P_rounddrill]) to_change[P_rounddrill] = 0; + dlgSpacing(45); + dlgCheckBox(tochange[P_rounddrill], to_change[P_rounddrill]) if (to_change[P_drill]) to_change[P_drill] = 0; + dlgStretch(1); + } + dlgHBoxLayout { + dlgCheckBox(tochange[P_diameter], to_change[P_diameter]) if (to_change[P_restring]) to_change[P_restring] = 0; + dlgSpacing(20); + dlgCheckBox(tochange[P_restring], to_change[P_restring]) if (to_change[P_diameter]) to_change[P_diameter] = 0; + dlgStretch(1); + } + dlgCheckBox(tochange[P_stopmask], to_change[P_stopmask]); + dlgCheckBox(tochange[P_creammask], to_change[P_creammask]); + } + dlgStretch(1); + } + dlgStretch(1); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+Change") dlgAccept(); + dlgStretch(1); + dlgPushButton("-ESC") dlgReject(); + dlgStretch(0); + } + dlgStretch(0); + }; + if (Result == 0) exit (0); + + if (to_change[P_shape] || to_change[P_firstpad]) { + Result = dlgDialog("Change Pad Shape") { + if (to_change[P_firstpad]) { + dlgHBoxLayout { + dlgCheckBox(tochange[0], to_change[P_firstpad]); + dlgLabel(" b&y name "); + dlgStringEdit(fist_pad_name); + dlgLabel("&On/Off"); + dlgComboBox(first_onoff, flag_offon); + dlgStretch(1); + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgGroup("Shape of Pin 1") { + dlgGridLayout { + dlgCell(2, 1) dlgRadioButton(shape_form[0], shape1); + dlgCell(3, 1) dlgRadioButton(shape_form[1], shape1); + dlgCell(4, 1) dlgRadioButton(shape_form[2], shape1); + dlgCell(5, 1) dlgRadioButton(shape_form[3], shape1); + } + } + dlgLabel(pad1); + dlgGroup("Shape of other pin(s)") { + dlgGridLayout { + dlgCell(2, 1) dlgRadioButton(shape_form[0], shape); + dlgCell(3, 1) dlgRadioButton(shape_form[1], shape); + dlgCell(4, 1) dlgRadioButton(shape_form[2], shape); + dlgCell(5, 1) dlgRadioButton(shape_form[3], shape); + } + } + dlgLabel(padx); + dlgStretch(1); + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-ESC") dlgReject(); + dlgStretch(0); + } + }; + if (Result == 0) exit (0); + } + + for (int n = changefrom; n <= changeto; n++) { + if (to_change[n]) { + int todo = 1; + Result = dlgDialog(menuchange[n]) { + if (n == P_drill) { + dlgLabel(drill_help); + dlgHBoxLayout { + dlgGroup("Tolerance") { + dlgHBoxLayout { + dlgLabel(" &- %"); + dlgIntEdit(mpercent); + dlgLabel(" &+ %"); + dlgIntEdit(ppercent); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgLabel("&Drill diameter "); + dlgRealEdit(change_values[n], min_val[n], max_val[n]); + dlgStretch(1); + } + todo = 0; + } + + if( n == P_rounddrill) { + dlgLabel(rounddrill_help); + dlgHBoxLayout { + dlgLabel(" &- %"); + dlgIntEdit(mpercent); + dlgLabel(" &+ %"); + dlgIntEdit(ppercent); + dlgStretch(1); + todo = 0; + } + } + + if( n == P_restring) { + dlgLabel(restring_help); + dlgHBoxLayout { + dlgGroup("Range") { + dlgHBoxLayout { + dlgLabel(" m&in "); + dlgRealEdit(minrestring); + dlgLabel(" m&ax "); + dlgRealEdit(maxrestring); + } + } + dlgLabel(" New &Restring "); + dlgRealEdit(change_values[n], min_val[n], max_val[n]); + dlgStretch(1); + } + todo = 0; + } + + if (todo) { + dlgHBoxLayout { + dlgRealEdit(change_values[n], min_val[n], max_val[n]); + dlgStretch(1); + } + } + + dlgVBoxLayout { + if (min_max[n]) dlgLabel(min_max[n]); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + dlgSpacing(100); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + } + }; + if (Result == 0) exit (0); + } + } + return; +} + + +// change First flag +void change_first(string onoff, int x, int y) { + sprintf(s, "Change FIRST %s (%.4f %.4f);\n", onoff, u2mm(x), u2mm(y)); + cmd += s; + return; +} + + +// change Pad Shape +void change_shape(string shape, int x, int y) { + sprintf(s, "Change SHAPE %s (%.4f %.4f);\n", shape, u2mm(x), u2mm(y)); + cmd += s; + return; +} + + +// change Drill Diameter +void change_prill(real diameter, int x, int y, int drill, string pac) { + real isdrill = u2mm(drill); + if (isdrill >= diameter - (diameter / 100 * mpercent) && isdrill <= diameter + (diameter / 100 * ppercent)) { + if (abs(diameter - isdrill) < 0.000001 ) return; + sprintf(s, "Change DRILL %.4f (%.4f %.4f);\n", diameter, u2mm(x), u2mm(y)); + cmd += s; + cntchdrill++; + } + return; +} + + +// change Drill Diameter rounded 1/10 mm +void change_prillround(real diameter, int x, int y, int drill) { + real isdrill = u2mm(drill); + real rval = round(isdrill * 10.0) / 10.0; + + if (abs(rval - isdrill) < 0.000001 ) return; + + if (isdrill >= rval - ((rval / 100) * mpercent) && isdrill <= rval + ((rval / 100) * ppercent)) { + cntchdrill++; + sprintf(s, "Change DRILL %.4f (%.4f %.4f);\n", rval, u2mm(x), u2mm(y)); + cmd += s; + } + return; +} + + +// change Pad Diameter +void change_pdiameter(real diameter, int x, int y) { + sprintf(s, "Change DIAMETER %.4f (%.4f %.4f);\n", diameter, u2mm(x), u2mm(y)); + cmd += s; + return; +} + + +// change Pad Restring +void change_restring(real mRestring, int diam, int x, int y, int drill) { + real isrestring = u2mm(diam) - u2mm(drill); + if (isrestring) isrestring /= 2; // ** do not device by zerro ** + if (isrestring < 0) isrestring = 0; // negativ parameter not allowed + if (isrestring >= minrestring && isrestring <= maxrestring) { + sprintf(s, "CHANGE DIAMETER %.4f (%.4f %.4f);\n", u2mm(drill) + 2 * mRestring, u2mm(x), u2mm(y)); + cmd += s; + cntchrestring++; + } + return; +} + + +// change Stop mask flag +void change_mask(string onoff, int x, int y) { + sprintf(s, "Change %s (%.4f %.4f);\n", onoff, u2mm(x), u2mm(y)); + cmd += s; + return; +} + + +// ******************************************************** +if (library) { + pad1 = ""; + padx = ""; + int n = 0; + library(L) { + get_changemenue(L.name); + + // *** check if a change parameter activ *** + if (!to_change[P_shape] && + !to_change[P_drill] && + !to_change[P_rounddrill] && + !to_change[P_diameter] && + !to_change[P_restring] && + !to_change[P_stopmask] && + !to_change[P_creammask] && + !to_change[P_firstpad]) exit (0); + + if (change_values[P_stopmask]) stop_onoff = "ON"; + else stop_onoff = "OFF"; + if (change_values[P_creammask]) cream_onoff = "ON"; + else cream_onoff = "OFF"; + + script_change = filesetext(L.name, "~~~.scr"); + + output(script_change, "wtD") { + printf("DISPLAY NONE 1 16 17;\n"); + int firstf = 1; + L.packages(P) { + cntPac++; + change_pac = 0; + cmd = ""; + P.contacts(C) { + cntContact++; + if (C.pad) { + if (to_change[P_shape] && (shape || shape1)){ + if (C.name == "1" && shape1) change_shape(shape_form[shape1], C.pad.x, C.pad.y); + else { if (shape) change_shape(shape_form[shape], C.pad.x, C.pad.y); } + } + if (to_change[P_firstpad]) { + if (C.name == fist_pad_name) { + change_first(first_onoff[flag_offon], C.x, C.y); + } + } + if (to_change[P_drill]) { + change_prill(change_values[P_drill], C.pad.x, C.pad.y, C.pad.drill, P.name); + } + if (to_change[P_rounddrill]) { + change_prillround(change_values[P_drill], C.pad.x, C.pad.y, C.pad.drill); + } + if (to_change[P_diameter]) { + change_pdiameter(change_values[P_diameter], C.pad.x, C.pad.y); + } + if (to_change[P_restring]) { + change_restring(change_values[P_restring], C.pad.diameter[LAYER_BOTTOM], C.pad.x, C.pad.y, C.pad.drill); + } + if (to_change[P_stopmask]) { + change_mask("STOP " + stop_onoff, C.pad.x, C.pad.y); + } + } + else if (C.smd) { + if (to_change[P_stopmask]) { + change_mask("STOP " + stop_onoff, C.smd.x, C.smd.y); + } + if (to_change[P_creammask]) { + change_mask("CREAM " + cream_onoff, C.smd.x, C.smd.y); + } + } + } + if (cmd) { + printf("EDIT %s.PAC;\n", P.name); + printf("%s",grid); + printf("%s",cmd); + } + } + // printf("GRID DEFAULT;\n"); + printf("DISPLAY NONE 1 16 17 20 21 29 31;\n"); + } + } + string sc; + s = ""; + if (cntchdrill) { + sprintf(s, "%d Drills to change!\n", cntchdrill); + sc += s; + } + if (cntchrestring) { + sprintf(s, "%d Pad-Restring to change!", cntchrestring); + sc += s; + } + if (sc) if (dlgMessageBox(sc, "Ok", "Cancel") != 0) exit(0); + + exit ("SCRIPT '" + script_change + "';\n"); +} + +else { + dlgMessageBox("! Start this ULP in a Library"); + exit (0); +} \ No newline at end of file diff --git a/eagle-5.7.0/ulp/clear-layer-in-lbr.ulp b/eagle-5.7.0/ulp/clear-layer-in-lbr.ulp new file mode 100644 index 0000000..ca47e09 --- /dev/null +++ b/eagle-5.7.0/ulp/clear-layer-in-lbr.ulp @@ -0,0 +1,89 @@ +#usage "This ULP generates a script to clear layer(s) in library.

" + "run clear-layer-in-lbr.ulp [YES] layer [layer] [layer] ....
" + "YES = clear without confirmation.
" + "Clear only layer in packages
" + "

" + "Author: support@cadsoft.de" + +// Version 1.01 -- 2008-04-10 changed GROUP ... (>x y); alf@cadsoft.de + +// ---------- parameter section ------------------------------------- + +string clrscript = "~clear~.scr"; +string scriptfile; + +int layer_visible[]; +int clear_layer[]; + +int cnt = 1; +int clear_outo = 0; +string s; + + +// **** main **** +if (library) { + string cmd; + if (argc < 2) { + dlgMessageBox("Start this ulp from command line with parameter

Usage:
" + 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 "This ULP changes the wire width of certain signals and do have " + "a wire width in between the minimum (minwidth) and maximum (maxwidth) values.

" + "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." + +// * 2005-03-02 alf@cadsoft.de +// 2008-06-03 alf@cadsoft.de display the same layers as in the beginning + +string help = usage; +if (language() == "de") help = hilfe; + + +int Gridval = 1; // 1=mm 2=mil 3=inch *** + // choose the value for the units you're working with +string grid_unit; + +real changewidth = 0.3; // gewuenschte Breite in *** + // enter desired width here + +real minwidth = 0.0; // Auswahl-Min-Breite in *** + // minimum width and +real maxwidth = 13.1; // Auswahl-Max-Breite in *** + // maximum width of tracks that will be taken into consideration. + +int NameOff = 0; // 0 = Breite abhaengig vom Netznamen aendern + // 0 = change width by name + // 1 = Breite unabhaengig vom Netznamen aendern + // 1 = change width without name + +string signals[] = { "" }; +string chsignals[] = { "" }; +int chngsig = 0; +int lastSigCh = 0; +int decs; + +string list; + +string grid[] = { "MIC", "MM", "MIL", "INCH" }; +real maxwidthUnit[] = { 13100.0, 13.1, 516.0, 0.516 }; + +string Version = " Version 1.5"; + +int index[]; +int x1[], y1[], x2[], y2[], layer[]; +int usedlayer[]; +int n = 1; + +int lVisible[]; // 2008-06-03 alf@cadsoft.de + + +int found(string fnam) { + int fnd = 0; + do { + if (chsignals[fnd] == fnam) { + return 1; + break; + } + ++fnd; + } while (chsignals[fnd]); + return 0; +} + + +real fwidth(real ww) { + if (ww <= maxwidth && ww >= minwidth) return 1; + return 0; +} + + +void disp(int l) { + printf("DISPLAY NONE %d ;\n", l); + return; +} + +void clearlay() { + for (int ly = 0; ly <= 255; ly++) usedlayer[ly] = 0; + return; +} + + +void clearsig (int selct) { + for (int r = selct; r < lastSigCh; r++) { + chsignals[r] = chsignals[r + 1]; + } + chsignals[r + 1] = ""; + if (lastSigCh) lastSigCh--; + return; +} + + +void AddList (string SigName) { + int found = 0; + for (int r = 0; r < lastSigCh; r++) { + if (chsignals[r] == SigName) { + found = 1; + break; + } + } + if (!found) { + chsignals[r] = SigName; + lastSigCh++; + } + return; +} + + +void menue() { + int cs; + int l; + int Result = dlgDialog("Change wire with") { + string slist[]; + dlgLabel(help); + dlgSpacing(40); + dlgGridLayout { + dlgCell (0, 1) dlgSpacing(200); + dlgCell (0, 5) dlgSpacing(200); + dlgCell (1, 1) dlgLabel("&Signal list"); + dlgCell (2, 1) dlgComboBox(signals, chngsig); + dlgCell (2, 3) dlgPushButton("&Add -->>") { + AddList(signals[chngsig]); + } + dlgCell (1, 5) dlgLabel("Signals &to change"); + dlgCell (2, 5) dlgComboBox(chsignals, decs); + dlgCell (2, 6) dlgPushButton("&Delete") { + clearsig(decs); + } + } + + dlgStretch(1); + dlgCheckBox("&Change without Signal name", NameOff); + + dlgHBoxLayout { + dlgGroup("between wire width : " + grid_unit) { + dlgHBoxLayout { + dlgLabel("Mi&n. "); dlgRealEdit(minwidth, 0.0, maxwidthUnit[Gridval]); + dlgLabel(" Ma&x. "); dlgRealEdit(maxwidth, minwidth, maxwidthUnit[Gridval]); + } + } + dlgLabel(" new wire &width "); + dlgRealEdit(changewidth); + dlgStretch(1); + } + + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("&OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + dlgStretch(0); + }; + if (Result == 0) exit (0); + return; +} + + +if (board) board(B) { + B.layers(L) { + lVisible[L.number] = L.visible; + } + int s = 0; + B.signals(S) { + signals[s] = S.name; + s++; + } + Gridval = B.grid.unit; + grid_unit = "Unit " + grid[Gridval]; + maxwidth = maxwidthUnit[Gridval]; + menue(); + + clearlay(); + string file = filesetext(B.name, "chnwidth.scr"); + output (file, "wtD") { + printf("# %s\n", Version); + printf("# %s\n\n", EAGLE_SIGNATURE); + printf("# exported from %s\n# at %s\n\n", B.name, t2string(time()) ); + printf("# This Script changed Wire Width between %.3f %s and %.3f %s to %.3f %s\n", + minwidth, grid[Gridval], maxwidth, grid[Gridval], changewidth, grid[Gridval]); + + printf("GRID %s FINEST;\n", grid[Gridval]); + + B.signals(S) { + if (found(S.name) || NameOff) { + real Wwidth; + + S.wires(W) { + switch (Gridval) { + case 0: Wwidth = u2mic(W.width); + break; + + case 1: Wwidth = u2mm(W.width); + break; + + case 2: Wwidth = u2mil(W.width); + break; + + case 3: Wwidth = u2inch(W.width); + break; + } + + if(fwidth(Wwidth)) { + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + layer[n] = W.layer; + ++n; + } + } + } + } + + sort(n, index, layer); + int dl = 0; + for (int i = 1; i < n; ++i) { + if(dl != layer[index[i]]) { + dl = layer[index[i]]; + disp(dl); + usedlayer[dl] = 1; + } + switch (Gridval) { + case 0: printf("CHANGE WIDTH %.3f (%.3f %.3f);\n", + changewidth, (u2mic(x1[index[i]]) + u2mic(x2[index[i]])) / 2, + (u2mic(y1[index[i]]) + u2mic(y2[index[i]])) / 2 ); + break; + + case 1: printf("CHANGE WIDTH %.3f (%.3f %.3f);\n", + changewidth, (u2mm(x1[index[i]]) + u2mm(x2[index[i]])) / 2, + (u2mm(y1[index[i]]) + u2mm(y2[index[i]])) / 2 ); + break; + + case 2: printf("CHANGE WIDTH %.3f (%.3f %.3f);\n", + changewidth, (u2mil(x1[index[i]]) + u2mil(x2[index[i]])) / 2, + (u2mil(y1[index[i]]) + u2mil(y2[index[i]])) / 2 ); + break; + + case 3: printf("CHANGE WIDTH %.3f (%.3f %.3f);\n", + changewidth, (u2inch(x1[index[i]]) + u2inch(x2[index[i]])) / 2, + (u2inch(y1[index[i]]) + u2inch(y2[index[i]])) / 2 ); + break; + } + } + printf(";\n"); + printf("DISPLAY NONE "); + for(int l = 1; l < 90; l++) { + if (lVisible[l]) { + printf(" %d", l); + } + } + for(l = 100; l < 256; l++) { + if (lVisible[l]) { + printf(" %d", l); + } + } + printf(";\nSET DISPLAY_MODE REAL;\nGRID LAST;\n"); + } + exit ("SCRIPT '" + file + "';"); +} +else dlgMessageBox("start this ULP in Board", "OK"); + diff --git a/eagle-5.7.0/ulp/cmd-change-class.ulp b/eagle-5.7.0/ulp/cmd-change-class.ulp new file mode 100644 index 0000000..d0d79da --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-change-class.ulp @@ -0,0 +1,117 @@ +#usage "Change Net-Classes in a board\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string grid[] = { "MIC", "MM", "MIL", "INCH" }; +int Gridval = 1; // 0=mic 1=mm 2=mil 3=inch *** + // choose the value for the units you're working with + +string classes[] = { "nu", "nu", "nu", "nu", "nu", "nu", "nu", "nu", "" }; + int isclass; + int toclass; + +int index[]; +int x1[], y1[], layer[]; +int usedlayer[]; +int n = 1; + +string cmd, s; + +void disp(int l) { + sprintf(s, "DISPLAY NONE %d ;\n", l); + cmd += s; + return; + } + +void menue() { + int l; + int Result = dlgDialog("Change wire with") { + string slist[]; + dlgStretch(0); + dlgLabel("Current &Class in Board"); + dlgComboBox(classes, isclass); + dlgLabel("Change Class &to"); + dlgComboBox(classes, toclass); + dlgGroup("&Current Working Grid") { + dlgRadioButton("m&ic", Gridval); + dlgRadioButton("&mm", Gridval); + dlgRadioButton("mi&l", Gridval); + dlgRadioButton("inc&h", Gridval); + } + dlgStretch(1); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+&OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(0); + } + dlgStretch(0); + }; + if (Result == 0) exit (0); + return; + } + +// main +if (board) board(B) { + B.classes(S) { + classes[S.number] = S.name; + } + menue(); + sprintf(s, "GRID %s FINEST;\n", grid[Gridval]); + cmd += s; + sprintf(s, "CHANGE CLASS %d;\n", toclass); + cmd += s; + B.signals(S) { + if (S.class.number == isclass) { + S.wires(W) { + x1[n] = W.x1; + y1[n] = W.y1; + layer[n] = W.layer; + n++; + break; + } + } + } + + sort(n, index, layer); + int dl = 0; + for (int i = 1; i < n; ++i) { + if(dl != layer[index[i]]) { + dl = layer[index[i]]; + disp(dl); + usedlayer[dl] = 1; + } + switch (Gridval) { + case 0: sprintf(s, "CHANGE CLASS %d (%.3f %.3f);\n", toclass, + u2mic(x1[index[i]]), u2mic(y1[index[i]]) ); + break; + + case 1: sprintf(s, "CHANGE CLASS %d (%.3f %.3f);\n", toclass, + u2mm(x1[index[i]]), u2mm(y1[index[i]]) ); + break; + + case 2: sprintf(s, "CHANGE CLASS %d (%.3f %.3f);\n", toclass, + u2mil(x1[index[i]]), u2mil(y1[index[i]]) ); + break; + + case 3: sprintf(s, "CHANGE CLASS %d (%.3f %.3f);\n", toclass, + u2inch(x1[index[i]]), u2inch(y1[index[i]]) ); + break; + } + cmd += s; + } + cmd += "DISPLAY "; + B.layers(L) { + if (L.visible) { + sprintf(s, "%d ",L.number); + cmd += s; + } + } + cmd += ";\nGRID LAST;\n"; + exit (cmd); + } + +else dlgMessageBox("Start this ULP in a Board", "OK"); diff --git a/eagle-5.7.0/ulp/cmd-change-swap-layer.ulp b/eagle-5.7.0/ulp/cmd-change-swap-layer.ulp new file mode 100644 index 0000000..00e3bdc --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-change-swap-layer.ulp @@ -0,0 +1,340 @@ +#usage "Change all objects from one layer to an other\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Help = "\nObjects in copper layers can be exchanged for\n" + + "other copper layers, but not for non-copper layers.\n" + + "Objects in non-copper layers can be exchanged for\n" + + "other non-copper layers, but not for copper layers."; + +string Version = "4.4"; // 2007.03.16 change also Layer 20 + +int isLayer = 1, toLayer = 16 ; +int swap = 0; +string usedLayer[] = { "NONE" }; +int usedLayerN[] = { 0 }; + +string Font[] = { "VECTOR", "PROPORTIONAL", "FIXED" } ; + +string Pour[] = { "SOLID", "HATCH" }; +string Orphans[] = { "OFF", "ON" }; +string Thermals[] = { "OFF", "ON" }; + +enum { type_wire, type_polygon }; + +string c, cmdheader, cmdripup, cmdwire; + +// check problem by crossing layer +int checkLayer(int is1, int to1, int swap) { + if (is1 == 0 || to1 == 0) return 1; + // do not change in Via - Pad - Signal - layer + for (int l = 17; l < 20; l++) { + if (is1 == l || to1 == l ) return l; + } + // you can not swap other to copper layer and back + if ( (is1 > 19 && to1 < 20 || is1 < 20 && to1 > 19) ) return 4; + // do not use duble + if (is1 == to1 ) return 2; + + // not use Originlayer + if (is1 == 23 || to1 == 23 ) return 23; + if (is1 == 24 || to1 == 24 ) return 23; + return 0; +} + +void delete(real x, real y, int type) { + if (isLayer > 16) { + sprintf(c, "DELETE (S%.4f %.4f);\n ", x, y ); + cmdripup += c; + } + else { + if (type == type_polygon) { + sprintf(c, "DELETE (S%.4f %.4f);\n", x, y ); + cmdripup += c; + } + else { + sprintf(c, "RIPUP (%.4f %.4f);\n", x, y ); + cmdripup += c; + } + } + return; +} + + +void ch_layer(int islay, int tolay, int display) { + real dx, dy; + board(B) { + B.signals(S) { + S.wires(W) { + if (W.layer == islay) { + delete(u2mm(W.x1 + W.x2) / 2, u2mm(W.y1 + W.y2) / 2, type_wire); + sprintf(c, "WIRE '%s' %.4f %+.1f (%.4f %.4f) (%.4f %.4f);\n", + S.name, u2mm(W.width), W.curve, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + } + } + S.polygons(P) { + if (P.layer == islay) { + if(islay < 17) { + sprintf(c, "CHANGE RANK %d;\n", P.rank); + cmdwire += c; + sprintf(c, "CHANGE ORPHANS %s;\n", Orphans[P.orphans]); + cmdwire += c; + sprintf(c, "CHANGE ISOLATE %.4f;\n", u2mm(P.isolate)); + cmdwire += c; + sprintf(c, "CHANGE SPACING %.4f;\n", u2mm(P.spacing)); + cmdwire += c; + sprintf(c, "CHANGE THERMAL %s;\n", Thermals[P.thermals]); + cmdwire += c; + sprintf(c, "CHANGE POUR %s;\n", Pour[P.pour]); + cmdwire += c; + } + int first = 1; + P.wires(W) { + if (first) { + dx = u2mm(W.x1); + dy = u2mm(W.y1); + delete(dx, dy, type_polygon); + sprintf(c, "POLYGON '%s' %.4f %+.1f (%.4f %.4f) (%.4f %.4f)\n", + S.name, u2mm(W.width), W.curve, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + first = 0; + } + else { + sprintf(c, " %+.1f (%.4f %.4f)\n", W.curve, u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + } + } + sprintf(c, ";\n"); // close the polygon + cmdwire += c; + } + } + } + B.wires(W) { + if (W.layer == islay) { + delete(u2mm(W.x1 + W.x2) / 2, u2mm(W.y1 + W.y2) / 2, type_wire); + sprintf(c, "WIRE %.1f %+.1f (%.4f %.4f) (%.4f %.4f);\n", + u2mm(W.width), W.curve, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + } + } + B.polygons(P) { + if (P.layer == islay) { + if(islay < 17) { + sprintf(c, "CHANGE RANK %d;\n", P.rank); + cmdwire += c; + sprintf(c, "CHANGE ORPHANS %s;\n", Orphans[P.orphans]); + cmdwire += c; + sprintf(c, "CHANGE ISOLATE %.4f;\n", u2mm(P.isolate)); + cmdwire += c; + sprintf(c, "CHANGE SPACING %.4f;\n", u2mm(P.spacing)); + cmdwire += c; + sprintf(c, "CHANGE THERMAL %s;\n", Thermals[P.thermals]); + cmdwire += c; + sprintf(c, "CHANGE POUR %s;\n", Pour[P.pour]); + cmdwire += c; + } + int first = 1; + P.wires(W) { + if (first) { + dx = u2mm(W.x1); + dy = u2mm(W.y1); + delete(dx, dy, type_polygon); + sprintf(c, "POLYGON %.4f %+.1f (%.4f %.4f) (%.4f %.4f)\n", u2mm(P.width), + W.curve, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + first = 0; + } + else { + sprintf(c, " %+.1f (%.4f %.4f)\n", W.curve, u2mm(W.x2), u2mm(W.y2)); + cmdwire += c; + } + } + sprintf(c, ";\n"); // close the polygon + cmdwire += c; + } + } + B.circles(C) { + if (C.layer == islay) { + dx = u2mm(C.x + C.radius); + dy = u2mm(C.y); + delete(dx, dy, type_polygon); + sprintf(c, "CIRCLE %.4f (%.4f %.4f) (%.4f %.4f);\n", + u2mm(C.width), u2mm(C.x), u2mm(C.y), u2mm(C.x + C.radius), u2mm(C.y)); + cmdwire += c; + } + } + B.rectangles(R) { + if (R.layer == islay) { + dx = u2mm(R.x1); + dy = u2mm(R.y1); + delete(dx, dy, type_polygon); + sprintf(c, "RECT R%.1f (%.4f %.4f) (%.4f) (%.4f);\n", + R.angle, u2mm(R.x1), u2mm(R.y1), u2mm(R.x2), u2mm(R.y2) ); + cmdwire += c; + } + } + B.texts(T) { + if (T.layer == islay) { + dx = u2mm(T.x); + dy = u2mm(T.y); + delete(dx, dy, type_polygon); + string Mirror = ""; + string Spin = ""; + if (T.mirror) Mirror = "M"; + if (T.spin) Spin = "S"; + sprintf(c, "CH SIZE %.4f ;CH RATIO %d;CH FONT %s;\nTEXT '%s' %s%sR%.1f (%.4f %.4f);\n", + u2mm(T.size), T.ratio, Font[T.font], T.value, Spin, Mirror, T.angle, u2mm(T.x), u2mm(T.y)); + cmdwire += c; + } + } + } + return; +} + +void menue(void) { + int err = 0; + int isLay = 0; + int toLay = 0; + int swapLay = 0; + + dlgDialog("Change/Swap Layer to Layer") { + dlgGroup("Change layer") { + dlgHBoxLayout { + dlgLabel("&From A"); + dlgComboBox(usedLayer, isLay); + } + dlgHBoxLayout { + dlgLabel("&to B"); + dlgComboBox(usedLayer, toLay); + } + dlgLabel("\nOnly displayed layers is listed to select!"); + } + dlgCheckBox("Select if you want to SWAP layer A <-> B", swap); + dlgLabel(Help); + dlgLabel("Version "+Version); + dlgHBoxLayout { + dlgPushButton("+OK") { + isLayer = usedLayerN[isLay]; + toLayer = usedLayerN[toLay]; + int error = checkLayer(isLayer, toLayer, swap); + if (error) { + string h; + switch (error) { + case 1 : h = "Error: Select layer"; + break; + + case 2 : h = "Error: Select different layer"; + break; + + case 3 : h = "Error: Select layer"; + break; + + case 4 : h = "Error: Do not mix copper layers with drawing layers"; + break; + + case 5 : h = "Error: Missing Layer"; + break; + + case 6 : h = "Error: Same 'From' layer"; + break; + + case 7 : h = "Error: Same 'To' layer"; + break; + + case 17 : h = "Error: Do not use PAD layer"; + break; + + case 18 : h = "Error: Do not use VIA layer"; + break; + + case 19 : h = "Error: Do not use Signal layer"; + break; + + case 23 : h = "Error: Do not use Origin layer"; + break; + + default : sprintf(h, "Error select layer. #%d", error); + } + dlgMessageBox(h, "OK"); + } + else { + dlgAccept(); + return; + } + } + dlgStretch(1); + dlgPushButton("-&Cancel") { dlgReject(); exit (0);} + } + }; + return; +} + + +// main +if (board) board(B) { + string displayLayer = ";\nDISPLAY NONE "; + int lay = 0; + B.layers(L) { + if (L.number != 17 && L.number != 18 && L.number != 19 && L.number != 23 && L.number != 24) { // select no Pad, Via, Unrouted, tOrigin, bOrign Layer + if (L.visible) { + string l; + lay++; + usedLayer[lay] = L.name; + usedLayerN[lay] = L.number; + sprintf( l, " %d", L.number); + displayLayer += l; + } + } + } + displayLayer += ";\n"; + menue(); + sprintf(c, "GRID mm FINEST;\nSET WIRE_BEND 2;\n"); + cmdheader += c; + sprintf(c, "SET UNDO_LOG OFF;\n"); + cmdheader += c; + if (swap) { + sprintf(c, "DISPLAY NONE %d;\n", isLayer); + cmdripup += c; + cmdwire += c; + sprintf(c, "CHANGE LAYER %d;\n", toLayer); + cmdwire += c; + ch_layer(isLayer, toLayer, isLayer); + + sprintf(c, "DISPLAY NONE %d;\n", toLayer); + cmdripup += c; + cmdwire += c; + sprintf(c, "CHANGE LAYER %d;\n", isLayer); + cmdwire += c; + ch_layer(toLayer, isLayer, toLayer); + } + else { + sprintf(c, "DISPLAY NONE %d;\n", isLayer); + cmdripup += c; + cmdwire += c; + sprintf(c, "CHANGE LAYER %d;\n", toLayer); + cmdwire += c; + ch_layer(isLayer, toLayer, isLayer); + } + sprintf(c, ";\nGRID LAST;\nSET UNDO_LOG ON;\n"); + displayLayer += c; + if (argv[1] == "TEST") { + dlgDialog("test") { + dlgTextEdit(cmdheader); + dlgTextEdit(cmdripup); + dlgTextEdit(cmdwire); + dlgTextEdit(displayLayer); + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("-Cancel") { dlgAccept(); exit(0); } + } + }; + } + exit (cmdheader + cmdripup + cmdwire + displayLayer); +} +else { + dlgMessageBox("Run this ULP from a Board", "OK"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/cmd-draw-group.bmp b/eagle-5.7.0/ulp/cmd-draw-group.bmp new file mode 100644 index 0000000..bd873fd Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-group.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-calcstep.bmp new file mode 100644 index 0000000..f95fa72 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-degstep.bmp new file mode 100644 index 0000000..7ede976 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-calcstep.bmp new file mode 100644 index 0000000..61d2542 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-degstep.bmp new file mode 100644 index 0000000..4df9948 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-ellipse4-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-none-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-none-calcstep.bmp new file mode 100644 index 0000000..c7da8d0 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-none-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-none-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-none-degstep.bmp new file mode 100644 index 0000000..5eab66b Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-none-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-hole-none.bmp b/eagle-5.7.0/ulp/cmd-draw-hole-none.bmp new file mode 100644 index 0000000..57d23f1 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-hole-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-circle-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-circle-match-calcstep.bmp new file mode 100644 index 0000000..54aa656 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-circle-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-circle-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-circle-match-degstep.bmp new file mode 100644 index 0000000..e2545b3 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-circle-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-calcstep.bmp new file mode 100644 index 0000000..14abfa0 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-degstep.bmp new file mode 100644 index 0000000..59308ea Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-circle-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-calcstep.bmp new file mode 100644 index 0000000..68406a8 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-degstep.bmp new file mode 100644 index 0000000..f9ca5fe Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-calcstep.bmp new file mode 100644 index 0000000..d764f79 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-degstep.bmp new file mode 100644 index 0000000..99ca931 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-calcstep.bmp new file mode 100644 index 0000000..640802a Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-degstep.bmp new file mode 100644 index 0000000..65c6c57 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-calcstep.bmp new file mode 100644 index 0000000..b4b8f27 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-degstep.bmp new file mode 100644 index 0000000..995e602 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-ellipse4-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-match-ellipse-none.bmp b/eagle-5.7.0/ulp/cmd-draw-move-match-ellipse-none.bmp new file mode 100644 index 0000000..26725be Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-match-ellipse-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-match-none.bmp b/eagle-5.7.0/ulp/cmd-draw-move-match-none.bmp new file mode 100644 index 0000000..fa765d7 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-match-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-no_match-ellipse-none.bmp b/eagle-5.7.0/ulp/cmd-draw-move-no_match-ellipse-none.bmp new file mode 100644 index 0000000..35abeb3 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-no_match-ellipse-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-move-no_match-none.bmp b/eagle-5.7.0/ulp/cmd-draw-move-no_match-none.bmp new file mode 100644 index 0000000..30f819a Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-move-no_match-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-calcstep.bmp new file mode 100644 index 0000000..b3942a5 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-degstep.bmp new file mode 100644 index 0000000..655d53f Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-calcstep.bmp new file mode 100644 index 0000000..d7ae2d8 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-degstep.bmp new file mode 100644 index 0000000..39fd221 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-ellipse4-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-none-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-none-calcstep.bmp new file mode 100644 index 0000000..fa6b1d8 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-none-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-none-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-none-degstep.bmp new file mode 100644 index 0000000..e5d02a4 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-none-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-pad-none.bmp b/eagle-5.7.0/ulp/cmd-draw-pad-none.bmp new file mode 100644 index 0000000..8467799 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-pad-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-circle-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-circle-calcstep.bmp new file mode 100644 index 0000000..6ca7771 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-circle-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-circle-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-circle-degstep.bmp new file mode 100644 index 0000000..638c7d6 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-circle-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcdeg.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcdeg.bmp new file mode 100644 index 0000000..b2ca08b Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcdeg.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcstep.bmp new file mode 100644 index 0000000..d167196 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-degstep.bmp new file mode 100644 index 0000000..aa2323b Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-none.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-none.bmp new file mode 100644 index 0000000..5ad8bce Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-calcstep.bmp new file mode 100644 index 0000000..826139b Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-degstep.bmp new file mode 100644 index 0000000..398a29c Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-none.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-none.bmp new file mode 100644 index 0000000..b14f727 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-ellipse4-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-none-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-none-calcstep.bmp new file mode 100644 index 0000000..7ed1cf0 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-none-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-polygon-none.bmp b/eagle-5.7.0/ulp/cmd-draw-polygon-none.bmp new file mode 100644 index 0000000..8a1be25 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-polygon-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-calcstep.bmp new file mode 100644 index 0000000..2ee501a Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-degstep.bmp new file mode 100644 index 0000000..b671eb1 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-circle-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-circle-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-circle-no_match-calcstep.bmp new file mode 100644 index 0000000..d11a837 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-circle-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-cricle-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-cricle-no_match-degstep.bmp new file mode 100644 index 0000000..8658461 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-cricle-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-calcstep.bmp new file mode 100644 index 0000000..c321cb6 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-degstap.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-degstap.bmp new file mode 100644 index 0000000..bf8503d Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-match-degstap.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-calcstep.bmp new file mode 100644 index 0000000..57f5ce2 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-degstep.bmp new file mode 100644 index 0000000..ffb7b3f Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-calcstep.bmp new file mode 100644 index 0000000..0f7ad8c Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-degstep.bmp new file mode 100644 index 0000000..4fafc5c Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-calcstep.bmp new file mode 100644 index 0000000..eb8e4f3 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-degstep.bmp new file mode 100644 index 0000000..d172797 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-ellipse4-no_match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-match-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-match-degstep.bmp new file mode 100644 index 0000000..b0386be Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-match-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-match-none.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-match-none.bmp new file mode 100644 index 0000000..b084676 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-match-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-no_match-degsetp.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-no_match-degsetp.bmp new file mode 100644 index 0000000..a274a63 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-no_match-degsetp.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-smd-no_match-none.bmp b/eagle-5.7.0/ulp/cmd-draw-smd-no_match-none.bmp new file mode 100644 index 0000000..2463bc4 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-smd-no_match-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-calc-ellipse.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-calc-ellipse.bmp new file mode 100644 index 0000000..0b7b257 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-calc-ellipse.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-calcstep-none.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-calcstep-none.bmp new file mode 100644 index 0000000..c858135 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-calcstep-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-circle-calcstep.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-circle-calcstep.bmp new file mode 100644 index 0000000..ef597a8 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-circle-calcstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-circle-degstep.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-circle-degstep.bmp new file mode 100644 index 0000000..424ab58 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-circle-degstep.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-clac-ellipse4.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-clac-ellipse4.bmp new file mode 100644 index 0000000..73ec4d1 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-clac-ellipse4.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-degstep-none.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-degstep-none.bmp new file mode 100644 index 0000000..3bca32e Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-degstep-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-ellipse.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-ellipse.bmp new file mode 100644 index 0000000..4e74965 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-ellipse.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-none.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-none.bmp new file mode 100644 index 0000000..5900e04 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-none.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse.bmp new file mode 100644 index 0000000..b0d11e3 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse4.bmp b/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse4.bmp new file mode 100644 index 0000000..e66f8b8 Binary files /dev/null and b/eagle-5.7.0/ulp/cmd-draw-wire-step-ellipse4.bmp differ diff --git a/eagle-5.7.0/ulp/cmd-draw.ulp b/eagle-5.7.0/ulp/cmd-draw.ulp new file mode 100644 index 0000000..6cd3a25 --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-draw.ulp @@ -0,0 +1,1552 @@ +#usage "en: Command draw

Options:

" + "+ distance/radius
" + "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." + "

" + "Author: alf@cadsoft.de ", + + "de: Command draw

Optionen:

" + "+ Distance/Radius
" + "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." + "

" + "Author: alf@cadsoft.de " + +string Help = "" + + "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 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 .
"+ + "

" + + ""; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +#require 5.0000; + +string help_move = "MOVE, PAD, SMD can be used clockwise, too. " + + "In this case Angle step has to be negative. Is Angle start less than " + + "Angle end for negative Angle step, 360° will be added to Angle start." + + "Thus you are allowed to arrange elements clockwise."; + +string mark_info = "If MARK is set coordinates are relativ."; + + +if (language() == "de") { + help_move = "MOVE, PAD, SMD können auch rechtsdrehend benutzt werden. " + + "Dazu muß Angle step negativ sein.
" + + "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 = "Ist MARK gesetzt, dann sind die Koordinaten relativ zu der Marke."; +} + +string label_move = " "; + +int test = 1; + +string Version = " Version 1.05 "; // 2006-08-10 alf@cadsoft.de + // 2008-04-10 changed GROUP ... (>x y); alf@cadsoft.de + // 2008-05-06 SMD generierung mit Name berichtigt + +enum { DrawWIRE, // ** do not change this list ** + DrawPOLYGON, + DrawMOVE, // to place Elements in Board + DrawGROUP, // Group CUT paste, select all in group ** see also >> dlgGroup("Option") << + DrawHOLE, + DrawPAD, + DrawSMD + }; + +int drawtype = DrawWIRE; +string cmd_draw_info = ""; +string draw_info = " "; +string Name_used; +string require = " required "; +string not_used = " not used "; +string can_used = " can be used "; +if (library) Name_used = not_used; +else Name_used = can_used; + + +string para = ""; +string signame = ""; +string width = ""; +string layer = ""; +string Angle_step_used = not_used; +string Angle_end_used = not_used; + +real x1, y1, x2; +real startangle = 0; // start the rotated draw on degree +real anglestep = 0; // angle step in degree to next element or steps at 90° for Ellipse +real endangle = 360.0; // end the rotated draw on degree +enum { None, Degreestep, Calcstep }; +int anglesteptyp = None; // flag to calculate the anglestep from count (anglestep) +int rotateMatch = 0; // rotate element with same angle with rotate + +enum { NONE, CIRCLE, FULL_ELLIPSE, ELLIPSE_4 }; +int placeform = NONE; +real ellipsfactor = 1.0; // ratio x to y radius +real m_ellipsfactor = 1.0; // copy for menue + +//int polygon = 0; // draw ellipse as polygon +//int smd = 0; // place a smd on endpoint +real SMD_dx = 0; // SMD length +real SMD_dy = 0; // SMD width +string PadVia = ""; // draw Pad or Via as used in editor +string PAD_diameter = ""; // pad diameter +string Shapes[]; +int ShapeSelect = PAD_SHAPE_OFFSET+1; + +string drill_hole = ""; // drill diameter + +int grid = 1; +string GridUnit[] = { "MIC", "MM", "MIL", "INCH" }; +int gridunit; +real minx, maxx, miny, maxy; + +string length_distance_radius = " radius "; + + +int PressOk = 0; + +string s; +string h; +string help_err = " "; + +string name1st, nameext; // use as variable Label in Menu + +// ### functions ### +void Set_MinMax_Unit(int Grid) { + switch(Grid) { + case GRID_UNIT_MIC : { // Micron + minx = u2mic(-8000000); + maxx = u2mic( 8000000); + miny = u2mic(-8000000); + maxy = u2mic( 8000000); + break; + } + case GRID_UNIT_MM : { // Millimeter + minx = u2mm(-8000000); + maxx = u2mm( 8000000); + miny = u2mm(-8000000); + maxy = u2mm( 8000000); + break; + } + case GRID_UNIT_MIL : { // Mil + minx = u2mil(-8000000); + maxx = u2mil( 8000000); + miny = u2mil(-8000000); + maxy = u2mil( 8000000); + break; + } + case GRID_UNIT_INCH : { // Inch + minx = u2inch(-8000000); + maxx = u2inch( 8000000); + miny = u2inch(-8000000); + maxy = u2inch( 8000000); + break; + } + } + return; +} + + +real u2u(int val) { + switch (gridunit) { + case GRID_UNIT_MIC : return u2mic(val); + case GRID_UNIT_MM : return u2mm(val); + case GRID_UNIT_MIL : return u2mil(val); + case GRID_UNIT_INCH : return u2inch(val); + } +} + + +void info(void) { + dlgDialog("cmd-draw HELP") { + dlgHBoxLayout { + dlgLabel(usage); + dlgVBoxLayout { + if (language() == "de") dlgLabel("Beispiele:"); + else dlgLabel("Examples:"); + dlgLabel(Help); + dlgStretch(1); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+Ok") dlgAccept(); + dlgStretch(1); + } + } + } + }; + return; +} + + +// *** analysis User Error *** +int error(void) { + int err = 0; + if (strtod(width) >= x2) { help_err = "Width > Radius"; err = -1; } + if (!x2) { help_err = "Radius = 0"; err = -1; } + if (drawtype == DrawSMD) { + if (layer == "1" || layer == "16") ; + else { err = -1; help_err = "Layer for SMD ?"; } + } + if (drawtype == DrawMOVE) { + if (!signame) { help_err = "1.st Element name ?"; err = -1; } + } + if (drawtype == DrawGROUP) { + if (!anglestep || !endangle) { help_err = "Angle step or Angle end = 0"; err = -1; } + } + if (anglesteptyp && anglestep == 0) { + err = -1; help_err = "Missing parameter: Angle step"; + } + return err; +} + + + +// *** set info for Menu *** Pictures and Texts *** +void set_draw_info(void) { + label_move = " "; + if (drawtype == DrawWIRE) { + switch (anglesteptyp) { + case None : + Angle_step_used = not_used; + Angle_end_used = not_used; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + + case Degreestep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + case Calcstep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + } + } + + else if(drawtype == DrawPOLYGON) { + Angle_step_used = require; + Angle_end_used = require; + switch (anglesteptyp) { + case None : switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + case Degreestep : switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + case Calcstep : switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + } + } + + else if(drawtype == DrawMOVE) { + if (library || schematic) { + dlgMessageBox("! MOVE\nYou can use this function ponly in a Board.", "OK"); + } + else { + label_move = help_move; + switch (anglesteptyp) { + case None : + Angle_step_used = not_used; + Angle_end_used = not_used; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + break; + + case Degreestep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + break; + + case Calcstep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + break; + } + } + } + + else if(drawtype == DrawGROUP) { + Angle_step_used = require; + Angle_end_used = require; + cmd_draw_info = ""; + } + + else if(drawtype == DrawPAD) { + label_move = help_move; + switch (anglesteptyp) { + case None : + Angle_step_used = not_used; + Angle_end_used = not_used; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + + case Degreestep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + + case Calcstep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + } + } + + else if(drawtype == DrawSMD) { + label_move = help_move; + switch (anglesteptyp) { + case None : + Angle_step_used = not_used; + Angle_end_used = not_used; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + break; + + case Degreestep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + break; + + case Calcstep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case CIRCLE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case FULL_ELLIPSE : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + case ELLIPSE_4 : if (!rotateMatch) cmd_draw_info = ""; + else cmd_draw_info = ""; + break; + } + } + } + + else if(drawtype == DrawHOLE) { + switch (anglesteptyp) { + case None : + Angle_step_used = not_used; + Angle_end_used = not_used; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + + case Degreestep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + + case Calcstep : + Angle_step_used = require; + Angle_end_used = require; + switch (placeform) { + case NONE : cmd_draw_info = ""; + break; + case CIRCLE : cmd_draw_info = ""; + break; + case FULL_ELLIPSE : cmd_draw_info = ""; + break; + case ELLIPSE_4 : cmd_draw_info = ""; + break; + } + break; + } + } + + if (drawtype == DrawGROUP) { + Angle_step_used = require; + Angle_end_used = require; + cmd_draw_info = ""; + rotateMatch = 1; + } + else if (drawtype != DrawMOVE && PadVia == "VIA") { + rotateMatch = 0; + } + return; +} + + + +// ****** main menu ****** +int menue(void) { + int RESULT; + if (placeform == NONE) length_distance_radius = " radius "; + else length_distance_radius = " radius "; + + name1st = " "; + nameext = " "; + if (board && drawtype == DrawMOVE) { + name1st = " &- 1st. Element "; + nameext = " name"; + } + if (board && drawtype == DrawWIRE) { + name1st = " &- Signal "; + nameext = " name"; + } + if (board && drawtype == DrawPOLYGON) { + name1st = " &- Signal "; + nameext = " name"; + } + if (library && drawtype == DrawPOLYGON) { + name1st = " "; + nameext = " "; + } + if (package && drawtype == DrawPAD) { + name1st = " &- 1st. Pad "; + nameext = " name"; + } + if (board && drawtype == DrawPAD) { + name1st = " &- Signal "; + nameext = " name"; + } + if (package && drawtype == DrawSMD) { + name1st = " &- 1st. Smd "; + nameext = " name"; + } + if (package && drawtype == DrawMOVE || package && drawtype == DrawWIRE) { + name1st = " "; + nameext = " "; + } + if ( schematic) { + name1st = " &- Net name "; + nameext = " "; + } + + RESULT = dlgDialog("Command Draw") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing (8); + dlgLabel (draw_info, 1); + } + dlgHBoxLayout { + dlgGroup("Option") { + set_draw_info(); + dlgGridLayout { + + dlgCell( 1, 1) dlgHBoxLayout dlgSpacing(10); + dlgCell( 1, 4) dlgHBoxLayout dlgSpacing(10); + + if (drawtype == DrawWIRE || drawtype == DrawPOLYGON) { + dlgCell( 5, 2) dlgLabel( "&Width "); + dlgCell( 5, 3) dlgStringEdit( width); + } + if (drawtype == DrawWIRE || drawtype == DrawPOLYGON || drawtype == DrawSMD || drawtype == DrawMOVE) { + dlgCell( 5, 5) dlgLabel(" &Layer"); + dlgCell( 5, 6) dlgStringEdit(layer); + } + + dlgCell( 5, 8) dlgLabel(name1st, 1); + if ( name1st != " ") { + dlgCell( 5, 9) dlgStringEdit(signame); // Signal-, Element-, Net-Name + } + dlgCell( 5, 10) dlgLabel(nameext ,1); + + dlgCell( 7, 2) dlgLabel( "&X center coord. "); + dlgCell( 7, 3) dlgRealEdit( x1, minx, maxx); + dlgCell( 7, 5) dlgLabel( "&Y center coord. "); + dlgCell( 7, 6) dlgRealEdit( y1, miny, maxy); + dlgCell( 7, 8) dlgHBoxLayout { dlgLabel( " &+ "); dlgLabel( length_distance_radius, 1); dlgStretch(1); } + dlgCell( 7, 9) dlgHBoxLayout { dlgRealEdit( x2, 0, maxx); dlgStretch(1); } + + dlgCell( 8, 2) dlgLabel("Angle st&art ° "); + dlgCell( 8, 3) dlgRealEdit( startangle, 0.0, 360.0); + dlgCell( 8, 5) dlgLabel("A&ngle step "); + dlgCell( 8, 6) dlgRealEdit( anglestep, -360.0, 360.0); + dlgCell( 8, 7) dlgSpacing(12); + dlgCell( 8, 8) dlgLabel(" Angle &end ° "); + dlgCell( 8, 9) dlgRealEdit( endangle, 0.0, 720.0); + dlgCell( 8,10) dlgSpacing(50); + dlgCell( 9, 6) dlgLabel(Angle_step_used, 1); + dlgCell( 9, 9) dlgLabel(Angle_end_used, 1); + + dlgCell( 9, 0) dlgVBoxLayout dlgSpacing(12); + + dlgCell( 5, 0) dlgRadioButton("Wire &1 ", drawtype) { + draw_info = " "; + if (library) Name_used = not_used; + else Name_used = " "; + length_distance_radius = " radius "; + dlgReject(); + dlgAccept(); + } + dlgCell( 6, 0) dlgRadioButton("P&olygon ", drawtype) { + draw_info = " "; + if (library) Name_used = not_used; + else Name_used = " "; + length_distance_radius = " radius "; + dlgAccept(); + } + dlgCell( 6, 9) dlgLabel(Name_used, 1); + + dlgCell( 7, 0) dlgRadioButton("&Move ", drawtype) { // 2006.07.06 alf@cadsoft.de + draw_info = "MOVE Elements by Name"; + Name_used = require; + length_distance_radius = " radius "; + dlgAccept(); + } + + dlgCell( 8, 0) dlgRadioButton("&Group *", drawtype) { + draw_info = "GROUP CUT all elements displayed and GROUP MOVE (Rotate) and PASTE."; + Name_used = " "; + length_distance_radius = " distance "; + rotateMatch = 1; + dlgAccept(); + } + + if (board || package) { + dlgCell( 12, 0) dlgRadioButton("&Hole ", drawtype) { + draw_info = " "; + Name_used = " "; + length_distance_radius = " distance "; + dlgAccept(); + } + if (drawtype == DrawPAD || drawtype == DrawHOLE) { + if (drawtype == DrawHOLE) { + dlgCell( 12, 2) dlgLabel( " Hole d&rill "); + } + if (drawtype == DrawPAD) { + if (package) { + dlgCell( 12, 2) dlgLabel( " Pad d&rill "); + } + if (board) { + dlgCell( 12, 2) dlgLabel( " Via d&rill "); + } + } + dlgCell( 12, 3) dlgStringEdit( drill_hole); + } + } + + if (package) { + PadVia = "PAD"; + Shapes[PAD_SHAPE_SQUARE] = "Square"; + Shapes[PAD_SHAPE_ROUND] = "Round"; + Shapes[PAD_SHAPE_OCTAGON] = "Octagon"; + Shapes[PAD_SHAPE_LONG] = "Long"; + Shapes[PAD_SHAPE_OFFSET] = "Offset"; + Shapes[PAD_SHAPE_OFFSET+1] = " "; // last must be empty + + dlgCell( 13, 0) dlgRadioButton("&Pad ", drawtype) { + draw_info = " "; + Name_used = " can be used"; + length_distance_radius = " distance "; + dlgAccept(); + } + if (drawtype == DrawPAD) { + dlgCell( 13, 2) dlgLabel( " PAD &Diameter "); + dlgCell( 13, 3) dlgStringEdit( PAD_diameter); + dlgCell( 13, 5) dlgLabel( " Schape "); + dlgCell( 13, 6) dlgComboBox(Shapes, ShapeSelect); + } + dlgCell( 14, 0) dlgRadioButton("&Smd ", drawtype) { + draw_info = " "; + Name_used = " "; + length_distance_radius = " distance "; + dlgAccept(); + } + if (drawtype == DrawSMD) { + dlgCell( 14, 2) dlgLabel( " &Wide dx "); + dlgCell( 14, 3) dlgRealEdit( SMD_dx); + dlgCell( 14, 5) dlgLabel( " Heigh&t dy "); + dlgCell( 14, 6) dlgRealEdit( SMD_dy); + } + } + + if (board) { + PadVia = "VIA"; + Shapes[PAD_SHAPE_SQUARE] = "Square"; + Shapes[PAD_SHAPE_ROUND] = "Round"; + Shapes[PAD_SHAPE_OCTAGON] = "Octagon"; + Shapes[PAD_SHAPE_OCTAGON+1] = " "; + ShapeSelect = PAD_SHAPE_OCTAGON+1; + + dlgCell( 13, 0) dlgRadioButton("&Via ", drawtype) { // ** Via in Board / Pad in Package ** + draw_info = " "; + Name_used = " can be used"; + length_distance_radius = " distance "; + rotateMatch = 0; + dlgAccept(); + } + if (drawtype == DrawPAD) { + dlgCell( 13, 2) dlgLabel( " VIA &Diameter "); + dlgCell( 13, 3) dlgStringEdit( PAD_diameter); + dlgCell( 13, 5) dlgLabel( " Schape "); + dlgCell( 13, 6) dlgComboBox(Shapes, ShapeSelect); + } + } + } + } + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgLabel(cmd_draw_info, 1); // picture for info + dlgGroup("Angle step type") { + dlgRadioButton("Not used ", anglesteptyp) set_draw_info(); + dlgRadioButton("&° degree step ", anglesteptyp) set_draw_info(); + dlgRadioButton("&/ calc. steps ", anglesteptyp) set_draw_info(); + dlgLabel(" "); + if (drawtype == DrawMOVE || drawtype == DrawSMD ) { + dlgCheckBox("Rotate &item to match ", rotateMatch) { + set_draw_info(); + } + } + } + dlgGroup("Form") { + dlgHBoxLayout { + //set_draw_info(); + dlgRadioButton("Not &Used", placeform) { + set_draw_info(); + if (ellipsfactor != 1.0) { + m_ellipsfactor = ellipsfactor; + ellipsfactor = 1; + } + } + dlgRadioButton("&Circle", placeform) { + set_draw_info(); + if (ellipsfactor != 1.0) { + m_ellipsfactor = ellipsfactor; + ellipsfactor = 1; + } + } + dlgRadioButton("Full ellipse &0", placeform) { + set_draw_info(); + if (ellipsfactor != 1.0) { + m_ellipsfactor = ellipsfactor; + } + else ellipsfactor = m_ellipsfactor; + } + dlgRadioButton("1/&4 ellipse", placeform) { + set_draw_info(); + if (ellipsfactor != 1.0) { + m_ellipsfactor = ellipsfactor; + } + else ellipsfactor = m_ellipsfactor; + } + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgLabel( " Ellipse &factor y = x*f "); + dlgRealEdit( ellipsfactor, +0.01, +50.0); + } + } + dlgStretch(1); + } + } + + dlgHBoxLayout { + dlgLabel("Grid " + GridUnit[grid] + ""); + dlgSpacing(12); + dlgLabel(mark_info); + dlgStretch(1); + } + dlgLabel(label_move, 1); + dlgHBoxLayout { + dlgLabel("" + help_err + "", 1); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+OK") { + dlgAccept(); + PressOk = 1; + } + dlgPushButton("-Cancel") { dlgReject(); exit(0); } + dlgStretch(1); + dlgLabel(Version); + dlgPushButton("Help") info(); + } + }; + return RESULT; +} + + +string getPrefix(string s) { + int l = strlen(s); + string prfx; + for (int n = 0; n <= l; n++) { + if (s[n] < '0' || s[n] > '9'); + else { + prfx = strsub(s, 0, n); + break; + } + } + return prfx; +} + + +int getNumber(string s) { + int l = strlen(s); + for (int n = 0; n <= l; n++) { + if (s[n] < '0' || s[n] > '9'); + else return strtol(strsub(s, n)); + } + return 0; +} + + +// if Element in Project +int exist(string e) { + board(B) { + B.elements(E) { + if (E.name == e) return 1; + } + } + return 0; +} + + +// ** draw wire Ellipse ** +string wireEllipse(void) { + string e; + real rad; + string xystart; + int start = 1; + for (real winkel = startangle; winkel <= endangle; winkel += anglestep) { + rad = PI / 180 * winkel; + sprintf(h, "(R%.4f %.4f)\n", + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + e += h; + if (start) { + xystart = h; + start = 0; + } + } + if (drawtype == DrawPOLYGON && anglesteptyp != None) { + e += xystart; + } + return e; +} + + +// *** generate Script to draw WIRE *** +void drawWire(void) { + if (board && signame) signame = "'"+signame+"'"; + if (library) signame = ""; + + real rad = PI / 180 * startangle; + real a; + + if (anglesteptyp) { + switch(placeform) { + case NONE : + for (a = startangle; a <= endangle; a += anglestep) { + rad = PI / 180 * a; + sprintf(h, "WIRE %s %s (R%.4f %.4f) (R%.4f %.4f);\n", + width, signame, + x1, y1, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + break; + case CIRCLE : + sprintf(h, "WIRE %s %s ", width, signame); + s += h; + for (a = startangle; a <= endangle; a += anglestep) { + rad = PI / 180 * a; + sprintf(h, " (R%.4f %.4f) ", x1 + (cos(rad) * x2), y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + s += ";\n"; + break; + case FULL_ELLIPSE : + sprintf(h, "WIRE %s %s ", width, signame); + s += h; + s += wireEllipse() + ";\n"; + break; + case ELLIPSE_4 : + sprintf(h, "WIRE %s %s ", width, signame); + s += h; + s += wireEllipse() + ";\n"; + break; + } + } + else { + sprintf(h, "WIRE %s %s (R%.4f %.4f) (R%.4f %.4f);\n", + width, signame, + x1, y1, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + return; +} + + +// ** draw Polygon *** +void drawPolygon(void) { + if (board && signame) signame = "'"+signame+"'"; + if (library) signame = ""; + + if((placeform == FULL_ELLIPSE || placeform == ELLIPSE_4) && ellipsfactor == 1.0) { + dlgMessageBox("!Da fehlt der Ellipsfaktor", "OK"); + exit(-2); + } + string ecmd; + + if (anglesteptyp) { + switch(placeform) { + case NONE : + sprintf(ecmd, "POLYGON %s %s ", width, signame ); + s += ecmd; + s += wireEllipse(); + break; + case CIRCLE : + sprintf(ecmd, "POLYG %s %s ", width, signame ); + s += ecmd; + s += wireEllipse(); + s += ";\n"; + break; + case FULL_ELLIPSE : + sprintf(ecmd, "Polygo %s %s ", width, signame ); + s += ecmd; + s += wireEllipse(); + s += ";\n"; + break; + case ELLIPSE_4 : + sprintf(ecmd, "Polygon %s %s ", width, signame ); + s += ecmd; + s += wireEllipse(); + s += ";\n"; + break; + } + } + else { + switch(placeform) { + case NONE : + sprintf(ecmd, "POLy %s %s ", width, signame ); + s += ecmd; + sprintf(ecmd, " (R%.4f %.4f)\n", x1, y1 ); + s += ecmd; + s += wireEllipse(); + s += ecmd +";\n"; + break; + case CIRCLE : + sprintf(ecmd, "POLY %s %s ", width, signame ); + s += ecmd; + sprintf(ecmd, " (R%.4f %.4f)\n", x1, y1 ); + s += ecmd; + s += wireEllipse(); + s += ecmd; + s += ";\n"; + break; + case FULL_ELLIPSE : + sprintf(ecmd, "POlY %s %s ", width, signame ); + s += ecmd; + sprintf(ecmd, " (R%.4f %.4f)\n", x1, y1 ); + s += ecmd; + s += wireEllipse(); + s += ecmd; + s += ";\n"; + break; + case ELLIPSE_4 : + sprintf(ecmd, "pOLYGON %s %s ", width, signame ); + s += ecmd; + sprintf(ecmd, " (R%.4f %.4f)\n", x1, y1 ); + s += ecmd; + s += wireEllipse(); + s += ecmd; + s += ";\n"; + break; + } + } + return ; +} + + +// *** generate Script to MOVE packages *** +void drawMove(void) { + real rad = PI / 180 * startangle; + string Prefix = getPrefix(signame); + int NameCount = getNumber(signame); + string m = ""; + if (layer == "16") { + m = "M"; // to mirror the Element + } + + if (anglesteptyp) { + if (anglestep < 0) { + if (startangle < endangle) startangle+= 360; + for (real a = startangle; a > endangle; a += anglestep) { + string eName; + sprintf(eName, "%s%d", Prefix, NameCount); + if (exist(eName)) { + rad = PI / 180 * a; + sprintf(h, "MOVE '%s' (R%.4f %.4f);\n", eName, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + real ang = 0; + if (rotateMatch) { + if (m) ang = 180.0 - a; + else ang = a; + } + sprintf(h, "ROTATE =%sR%.1f '%s';\n", m, ang, eName); + s += h; + NameCount++; + } + else break; + } + } + else { + for (real a = startangle; a < endangle; a += anglestep) { + string eName; + sprintf(eName, "%s%d", Prefix, NameCount); + if (exist(eName)) { + rad = PI / 180 * a; + sprintf(h, "MOVE '%s' (R%.4f %.4f);\n", eName, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + real ang = 0; + if (rotateMatch) { + if (m) ang = 180.0 - a; + else ang = a; + } + sprintf(h, "ROTATE =%sR%.1f '%s';\n", m, ang, eName); + s += h; + NameCount++; + } + else break; + } + } + } + else { + if (exist(signame)) { + sprintf(h, "MOVE '%s' (R%.4f %.4f);\n", signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + real ang = startangle; + if (rotateMatch) { + if (m) ang = 180.0 - startangle; + else ang = startangle; + } + else ang = 0; + sprintf(h, "ROTATE =%sR%.1f '%s';\n", m, ang, signame); + s += h; + } + } + return; +} + + +// *** generate Script to place SMDs *** +void drawSmd(void) { + if (signame) signame = "'"+signame+"'"; + if (SMD_dx && SMD_dy) { + sprintf(h, "CHANGE SMD %.4f %.4f;\n", SMD_dx, SMD_dy); + s += h; + } + real rad = PI / 180 * startangle; + if (anglestep) { + if (anglestep < 0) { + if (startangle > endangle) startangle+= 360; + for (real a = startangle; a > endangle; a += anglestep) { + rad = PI / 180 * a; + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + string rm = ""; + if (rotateMatch) sprintf(rm, "R%.1f", a); + sprintf(h, "SMD %s %s (R%.4f %.4f);\n", // 2008-05-06 + rm, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s += h; + } + else { + sprintf(h, "SMD (R%.4f %.4f);\n", + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s += h; + } + if (signame) signame = ""; // 2008-05-06 + } + } + else { + for (real a = startangle; a < endangle; a += anglestep) { + rad = PI / 180 * a; + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + string rm; + if (rotateMatch) sprintf(rm, "R%.1f", a); + sprintf(h, "SMD %s %s (R%.4f %.4f);\n", // 2008-05-06 + rm, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s += h; + if (signame) signame = ""; // 2008-05-06 + } + else { + sprintf(h, "SMD (R%.4f %.4f);\n", + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s += h; + } + } + } + } + else { + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + string rm; + if (rotateMatch) sprintf(rm, "R%.1f", startangle); + + sprintf(h, "SMD %s %s (R%.4f %.4f);\n", // 2008-05-06 + rm, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s+= h; + if (signame) signame = ""; // 2008-05-06 + } + else { + sprintf(h, "SMD (R%.4f %.4f);\n", + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) + ); + s+= h; + } + } + return ; +} + + +// *** generate Script to place PADs *** +void drawPad(void) { + if (signame) signame = "'"+signame+"'"; + real rad = PI / 180 * startangle; + if (drill_hole) { + sprintf(h, "CHANGE DRILL %s;\n", drill_hole); + s += h; + } + if (PAD_diameter) { + sprintf(h, "CHANGE DIAMETER %s;\n", PAD_diameter); + s += h; + } + + if (PadVia == "PAD") { + if (ShapeSelect < PAD_SHAPE_OFFSET+1) + s += "CHANGE SHAPE " + Shapes[ShapeSelect] + ";\n"; + } + string Rotate_option = ""; + if (anglestep) { + string h; + if (anglestep < 0) { + if (startangle < endangle) startangle+= 360; + for (real a = startangle; a > endangle; a += anglestep) { + rad = PI / 180 * a; + if (PadVia == "PAD") sprintf(Rotate_option, "R%.1f", a); + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + sprintf(h, "%s %s '%s' (R%.4f %.4f);\n", PadVia, Rotate_option, signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + } + else { + sprintf(h, "%s %s (R%.4f %.4f);\n", PadVia, signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + } + s += h; + signame = ""; + } + } + else { + for (real a = startangle; a < endangle; a += anglestep) { + rad = PI / 180 * a; + if (PadVia == "PAD") sprintf(Rotate_option, "R%.1f", a); + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + sprintf(h, "%s %s '%s' (R%.4f %.4f);\n", + PadVia, + Rotate_option, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + } + else { + sprintf(h, "%s '%s' (R%.4f %.4f);\n", + PadVia, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + } + s += h; + signame = ""; + } + } + } + else { + if (PadVia == "PAD") sprintf(Rotate_option, "R%.1f", startangle); + if (EAGLE_VERSION >= 4 && EAGLE_RELEASE >= 10 || EAGLE_VERSION >= 5) { + sprintf(h, "%s %s '%s' (R%.4f %.4f);\n", + PadVia, + Rotate_option, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s+= h; + } + else { + sprintf(h, "%s '%s' (R%.4f %.4f);\n", + PadVia, + signame, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + } + return ; +} + +// *** generate Script to place HOLEs *** +void drawHole(void) { + real rad = PI / 180 * startangle; + + sprintf(h, "HOLE %s ", drill_hole); + s += h; + if (placeform == ELLIPSE_4) { + s += wireEllipse() + ";\n";; + } + else if (anglestep) { + if (anglestep < 0) { + if (startangle < endangle) startangle+= 360; + for (real a = startangle; a > endangle; a += anglestep) { + rad = PI / 180 * a; + sprintf(h, " (R%.4f %.4f);\n", x1 + (cos(rad) * x2), y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + } + else { + for (real a = startangle; a < endangle; a += anglestep) { + rad = PI / 180 * a; + sprintf(h, " (R%.4f %.4f);\n", x1 + (cos(rad) * x2), y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + s += ";\n"; + } + } + else { + sprintf(h, "HOLE %s (R%.4f %.4f);\n", drill_hole, + x1 + (cos(rad) * x2), + y1 + (sin(rad) * x2 * ellipsfactor) ); + s += h; + } + return ; +} + + +void drawGroup(void) { + real groupdistance, m; + if (board) board(B) { + gridunit = (B.grid.unit); + m = abs(B.area.x2); + if (groupdistance < m) groupdistance = m; + m = abs(B.area.x1); + if (groupdistance < m) groupdistance = m; + m = abs(B.area.y2); + if (groupdistance < m) groupdistance = m; + m = abs(B.area.y1); + if (groupdistance < m) groupdistance = m; + } + if (library) library(L) { + gridunit = (L.grid.unit); + if (package) package(P) { + m = abs(P.area.x2); + if (groupdistance < m) groupdistance = m; + m = abs(P.area.x1); + if (groupdistance < m) groupdistance = m; + m = abs(P.area.y2); + if (groupdistance < m) groupdistance = m; + m = abs(P.area.y1); + if (groupdistance < m) groupdistance = m; + } + } + groupdistance = u2u(8000000); // maximum + string g; + sprintf(g, "GROUP (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (>%.4f %.4f);\n", + -groupdistance, -groupdistance, + groupdistance, -groupdistance, + groupdistance, groupdistance, + -groupdistance, groupdistance, + -groupdistance, -groupdistance + ); + s = g; + sprintf(h, "CUT (>R 0 0);\n"); + s += h; + for (real a = startangle; a < endangle-anglestep; a += anglestep) { + s += g; + sprintf(h, "ROTATE =R%.1f (>R 0.0 0.0);\n", anglestep ); + s += h; + s += "PASTE (R0 0);\n"; + } + return; +} + +void unknown(string m) { + if (dlgMessageBox("unknown parameter\n" + m, "OK", "Cancel" ) != 0) exit(-1); + return; +} + + +// ******* Main *************************************************************** +int n = 1; +if (argc > 1) { + do { + para = strupr(argv[n]); + // *** Order of parameters can changed here *** + // *** Eagle-Parser cut character ' from argument *** + if (para[0] == '+' ) { para[0] = ' '; x2 = strtod(para); } + else if (para[0] == 'A' ) { para[0] = ' '; startangle = strtod(para); } + else if (para[0] == 'N' ) { para[0] = ' '; anglestep = strtod(para); } + else if (para[0] == 'E' ) { para[0] = ' '; endangle = strtod(para); } + else if (para[0] == 'L' ) { layer = strsub(para, 1); } + else if (para[0] == 'W' ) { para[0] = ' '; width = para; drawtype = DrawWIRE; } + else if (para[0] == 'X' ) { para[0] = ' '; x1 = strtod(para); } + else if (para[0] == 'Y' ) { para[0] = ' '; y1 = strtod(para); } + else if (para[0] == 'O' ) { drawtype = DrawPOLYGON; } + else if (para[0] == 'P' ) { PadVia = "PAD"; drawtype = DrawPAD; } + else if (para[0] == 'V' ) { PadVia = "VIA"; drawtype = DrawPAD; } + else if (para[0] == 'S' ) { drawtype = DrawSMD; } + else if (para[0] == 'I' ) { para[0] = ' '; SMD_dx = strtod(para); } + else if (para[0] == 'T' ) { para[0] = ' '; SMD_dy = strtod(para); } + else if (para[0] == '-' ) { signame = strsub(para, 1); } + else if (para[0] == 'D' ) { para[0] = ' '; PAD_diameter = para; } // Pad/Via diameter + else if (para[0] == 'R' ) { para[0] = ' '; drill_hole = para; drawtype = DrawHOLE; } + else if (para[0] == 0xb0) { anglesteptyp = Degreestep; } // ° + else if (para[0] == '/' ) { anglesteptyp = Calcstep; } + else if (para[0] == 'G' ) { drawtype = DrawGROUP; } + else if (strstr(para, "MOVE") == 0) { drawtype = DrawMOVE; } // ** do not change order with next line ** + else if (para[0] == 'M' ) { rotateMatch = 1; } // ** do not change order with prior line ** + else if (para[0] == 'C' ) { placeform = CIRCLE; } + else if (para[0] == '0' ) { para[0] = ' '; placeform = FULL_ELLIPSE; } + else if (para[0] == 'F' ) { para[0] = ' '; ellipsfactor = strtod(para); } + else if (para[0] == '4' ) { placeform = ELLIPSE_4; } + else unknown(para); + n++; + } while (argv[n]); +} +else { + if (board) { + board(B) grid = B.grid.unit; + } + if (schematic) { schematic(S) grid = S.grid.unit; } + if (library) { + if (package || symbol) { + library(L) grid = L.grid.unit; + } + else { + dlgMessageBox("!Start this ULP in a Package or Symbol Editor", "OK"); + exit(0); + } + } + Set_MinMax_Unit(grid); + + int Result; + do { + Result = menue(); + if(PressOk) { + if (error()) { + dlgMessageBox(help_err, "OK"); + PressOk = 0; + } + } + } while(!PressOk); +} + +signame = strupr(signame); + +sprintf(s, "SET Wire_Bend 2;\n"); // *** Script header *** +if (layer) s += "CHANGE LAYER " + layer + ";\n"; +if (PAD_diameter) s += "CHANGE DIAMETER " + PAD_diameter + ";\n"; +if (drill_hole) s += "CHANGE DRILL " + drill_hole + ";\n"; +//if (signame && drawtype == DrawSMD || drawtype == DrawSMD) s += "SMD " + signame + ";\n"; // 2008.05.05 + +if (placeform == ELLIPSE_4) { + if (endangle > 90.0) endangle = 90.0; + if (startangle > endangle) startangle = 0.0; +} + +switch(anglesteptyp) { + case None : if (drawtype != DrawPOLYGON) { + anglestep = 360; + } + break; + case Degreestep : if (!anglestep) anglesteptyp = None; + break; + case Calcstep : anglestep = (endangle - startangle) / anglestep; + break; +} + +switch(drawtype) { + case DrawWIRE : drawWire(); + break; + case DrawPOLYGON : drawPolygon(); + break; + case DrawMOVE : drawMove(); + break; + case DrawGROUP : drawGroup(); + break; + case DrawHOLE : drawHole(); + break; + case DrawPAD : drawPad(); + break; + case DrawSMD : drawSmd(); + break; +} + + +if (test) dlgDialog("Test") { + dlgHBoxLayout dlgSpacing(500); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(500); + dlgTextView(s); + } + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("ESC") { dlgReject(); exit(-1); } + dlgStretch(1); + } + }; + +exit (s); + + diff --git a/eagle-5.7.0/ulp/cmd-net-list2sch.ulp b/eagle-5.7.0/ulp/cmd-net-list2sch.ulp new file mode 100644 index 0000000..519ad97 --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-net-list2sch.ulp @@ -0,0 +1,306 @@ +#usage "Import an EAGLE-Net-List into a schematic\n" + "

" + "Usage:
" + "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." + "

" + "Example:
" + "RUN cmd-net-list2sch hexapod.lst
" + "RUN cmd-net-list2sch IN1 R1 1 C1 2
" + "RUN cmd-net-list2sch clk ic1 9 ic3 15
" + "

" + "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.
" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Hilfe = "

ACHTUNG:
\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."; + +if (argc < 2) dlgMessageBox(usage + Hilfe, "OK"); + +string Version = "1.0.1"; // 2009-12-15 command RUN path/filename option with apostroph while space in path/filename + // check first if part place bevor run script. alf@cadsoft.de + +// Eagle NET-Command definition +string net_name = strupr(argv[1]); +string part_a = strupr(argv[2]); +string pin_a = strupr(argv[3]); +string part_b = strupr(argv[4]); +string pin_b = strupr(argv[5]); + +string cmd = ""; + +string lines[]; +int nLines; +//string s; + +// *** Eagle NET LIST definition *** +string tok_Net = "Net"; +string tok_Part = "Part"; +string tok_Pad = "Pad"; +string netlistLines[]; +string signalName; +int signalCnt = 0; +string NetListfileName; + +int cntP = 0; +string Parts[]; + + +// *** functions *** +int actSheet(UL_SHEET S) { + return S.number; +} + + +int partplaced(string partname) { // 2009-12-15 + for (int n = 0; n < cntP; n++) { + if (Parts[n] == partname) return 1; + } + return 0; +} + + +void readNetList(void) { + int sn = 0; + + for (sn = 0; sn < nLines; sn++) { // search for start line "Net Part Pin" in Eagle Netlist + if( (strstr(lines[sn], tok_Net) == 0) && (strstr(lines[sn], tok_Part) >= 8) && (strstr(lines[sn], tok_Pad) >= 16) ) { + sn++; + break; + } + } + if (sn == nLines) { + dlgMessageBox(NetListfileName + " is not a Eagle-Netlist", "OK"); + exit (0); + } + + string netName; + string par; + string pin; + string par_b; + string pin_b; + + do { + signalCnt = strsplit (netlistLines, lines[sn], ' '); + + if (signalCnt > 1) { + // init NET command + int ncnt = 1; + if (netlistLines[0]) { + netName = netlistLines[0]; + do { + if (netlistLines[ncnt]) { + par = netlistLines[ncnt]; + ncnt++; + break; + } + ncnt++; + } while (ncnt <= signalCnt); + do { + if (netlistLines[ncnt] ) { + pin = netlistLines[ncnt]; + ncnt++; + } + ncnt++; + } while (ncnt <= signalCnt); + } + + else { + do { + if (netlistLines[ncnt]) { + par_b = netlistLines[ncnt]; + ncnt++; + break; + } + ncnt++; + } while (ncnt <= signalCnt); + do { + if (netlistLines[ncnt] ) { + pin_b = netlistLines[ncnt]; + } + ncnt++; + } while (ncnt <= signalCnt); + if (partplaced(par)) { // 2009-12-15 alf@cadsoft.de + cmd += "RUN '" + argv[0] + "' " + netName + " " + par + " " + pin + " "; + cmd += par_b + " " + pin_b + ";\n"; + par = par_b; + pin = pin_b; + par_b = ""; + pin_b = ""; + } + else { + dlgMessageBox("! Part "+ par +" not foud.","OK"); + exit(-2); + } + } + } + sn++; + } while (sn <= nLines); + return; +} + +// *** MAIN *** +if (schematic) { + // run as net command + if (part_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 == part_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 (part_b) { + if (PA.name == part_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 += "part " + part_a + " Pin " + pin_a + "\n"; + if (pinB_sheet == 0) cmd += "part " + part_b + " Pin " + pin_b + "\n"; + cmd += "not fond!"; + dlgMessageBox(cmd, "OK"); + exit (-1); + } + } + + // run as script converter + else { + schematic(S) { + S.parts(P) { + Parts[cntP] = P.name; + cntP++; + } + } + int n = 0; + string text; + int nBytes; + + if (argv[1]) NetListfileName = argv[1]; + else NetListfileName = dlgFileOpen("Select Script File", "*.*", "*.*"); + + if (NetListfileName) { + nLines = fileread(lines, NetListfileName); + readNetList(); + } + output(NetListfileName + "x", "wtD") printf("%s", cmd); // D == temporary file + exit (cmd); + } +} + +else { + dlgMessageBox("Start this ULP from a schematic!", "OK"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/cmd-netscript2sch.ulp b/eagle-5.7.0/ulp/cmd-netscript2sch.ulp new file mode 100644 index 0000000..a69cb72 --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-netscript2sch.ulp @@ -0,0 +1,255 @@ +#usage "Import an EAGLE Netscript into a Schematic\n" + "

" + "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:
" + "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.

" + "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." + "

" + "Author: support@cadsoft.de" + +// 2006-01-26 -- modified #usage -- ric + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* German info + "ACHTUNG

\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)." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +int tNames = 25, bNames = 26; +real distance = 0.2; // distance Wire <> Text in Millimeter. +string cmd; +string h; +string scriptfile; + + +string help = "If the Autorouter shall avoid the NAME and VALUE text area\n" + + "we have to draw the texts as wires in the restrict layers.\n" + + "To let the Autorouter keep a minimum distance to the texts (wires)\n" + + "to avoid short circuits, we have to draw the text wires with a\n" + + "higher width which includes the respective minimum clearance.\n" + + "\n"+ + "German help text inside the ulp file.\n"; + + +/*string German help = "Kopiert die Texte 'Name' und 'Value' in die Restrict-Layer.\n" + + * "Soll der Autorouter unter den NAME- und VALUE-Texten\n" + + * "nicht routen, so muss der Text als Wire in die Restrict-Layer\n" + + * "kopiert werden.\n" + + * "Damit der Autorouter einen Abstand zu den Elementen (Textlinien)\n" + + * "einhaelt, um keine Kurzschluesse zu erzeugen, muss die Linienbreite\n" + + */ "um den entsprechenden Mindestabstand erweitert werden.\n"; + +void header(void) { + sprintf(cmd, "# Exported from %s by %s\n", scriptfile, EAGLE_SIGNATURE ); + sprintf(h, "# Distance = %.3f mm\n", distance); cmd += h; + cmd += "SET UNDO_LOG OFF;\n"; // advisable for speed reasons + cmd += "set wire_bend 2;\n"; + cmd += "GRID mm;\n"; +} + +// Distance menue +int menue(void) { + int d = dlgDialog("Place Text as Wire") { + dlgLabel(usage); + dlgLabel(help); + dlgHBoxLayout { + dlgLabel("&Distance [mm]"); + dlgRealEdit(distance); + } + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; + return d; + } + +if (board) board(B) { + if (!menue()) exit (0); + scriptfile = filesetext(B.name, ".scr"); + header(); + distance *= 2; + B.elements(E) { + + E.texts(T) { // *** smased *** + if (T.layer == 25) { + sprintf(h, "Change Layer %d;\n", 41);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 26) { + sprintf(h, "Change Layer %d;\n", 42);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 27) { + sprintf(h, "Change Layer %d;\n", 41);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 28) { + sprintf(h, "Change Layer %d;\n", 42);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + } + + E.package.texts(T) { // *** non smased + if (T.layer == 25) { + sprintf(h, "Change Layer %d;\n", 41);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 26) { + sprintf(h, "Change Layer %d;\n", 42);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 27) { + sprintf(h, "Change Layer %d;\n", 41);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + if (T.layer == 28) { + sprintf(h, "Change Layer %d;\n", 42);cmd += h; + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width) + distance, u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + } + } + } +} +cmd += "SET UNDO_LOG ON;\n"; +cmd += "GRID LAST;\n"; + +// EditBox +int Result = dlgDialog("Copy Text in Restrict.Layer") { + dlgHBoxLayout { + dlgTextEdit(cmd); + dlgVBoxLayout { + dlgSpacing(300); + } + } + dlgHBoxLayout { + dlgSpacing(500); + } + dlgHBoxLayout { + dlgPushButton("+&Execute") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; +if (Result == 0) exit(0); + +output(scriptfile, "wt") printf("%s", cmd); + +exit("script '" + scriptfile + "';\nREMOVE '" + scriptfile + "';\n"); diff --git a/eagle-5.7.0/ulp/cmd-rename-in-lbr.ulp b/eagle-5.7.0/ulp/cmd-rename-in-lbr.ulp new file mode 100644 index 0000000..11cee8c --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-rename-in-lbr.ulp @@ -0,0 +1,45 @@ +#usage "Rename device/symbol/package in library\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string edit = ""; +string toName = edit; + +if (library) library(L) { + + if (deviceset) deviceset(D) { + edit = D.name; + } + + if (symbol) symbol(S) { + edit = S.name; + } + if (package) package(P) { + edit = P.name; + } + +int Result = dlgDialog("RENAME") { + dlgStretch(0); + string h; + sprintf(h, "Rename

%s

to :", edit); + dlgLabel(h); + dlgStretch(0); + toName = edit; + dlgStringEdit(toName); + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") { + dlgAccept(); + } + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + }; + dlgStretch(1); + }; + if (Result == 0) exit (0); + exit("RENAME '" + edit + "' '" + toName +"'" ); +} diff --git a/eagle-5.7.0/ulp/cmd-renumber.ulp b/eagle-5.7.0/ulp/cmd-renumber.ulp new file mode 100644 index 0000000..9d79ec0 --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-renumber.ulp @@ -0,0 +1,664 @@ +#usage "Renumber board components\n" + "

" + "See Help of the ULP for further instructions." + "

" + "Author: support@cadsoft.de (based on original code from Michel Dagenais, jcmae@sympatico.ca)" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// 16.06.2002 "Scan window"/"Unit" do not take effect in the current instance of the program -- alf@cadsoft.de + +string HelpText = + + "This ULP will renumber a board's components starting from any corner, renaming from suffix 1, either horizontally or vertically." + "

\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" + "The Renumber Script can be saved.\n" + "

\n" + "Preview\n" + "

\n" + "Highlights all components in the order of the currently selected renumbering sequence.
\n" + "Please note that on fast computers Preview might be too fast to watch!\n" + "

\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 + "


ERROR: No board!

\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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string h, cmd = "", sname = ""; +real x, y, zoom_win = 10; +int part = 1, xmin, xmax, ymin, ymax, found = 0; + +zoom_win = zoom_win/2; + +if (board) board(B) { + cmd = "grid mm finest;\n"; + int Result = dlgDialog("Show and zoom in") { + dlgHBoxLayout { + dlgGroup("Include") { + dlgRadioButton("&Signals", part); + dlgRadioButton("&Parts", part); + } + } + dlgLabel("&Enter Name"); + dlgStringEdit(sname); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + if (Result == 0) exit (0); + + if (!part) { // if signals checked + B.signals(S) { + if (strupr(sname)==strupr(S.name)) { + found = 1; + S.wires(W) { + xmin = min(W.x1, W.x2); + ymin = min(W.y1, W.y2); + xmax = max(W.x1, W.x2); + ymax = max(W.y1, W.y2); + break; + } + S.wires(W) { + xmin = min(xmin, W.x1); + xmin = min(xmin, W.x2); + ymin = min(ymin, W.y1); + ymin = min(ymin, W.y2); + xmax = max(xmax, W.x1); + xmax = max(xmax, W.x2); + ymax = max(ymax, W.y1); + ymax = max(ymax, W.y2); + } + xmin = u2mm(xmin); + xmax = u2mm(xmax); + ymin = u2mm(ymin); + ymax = u2mm(ymax); + } + } + h = ""; + sprintf(h, "Window (%f %f)(%f %f);\n", + xmin-zoom_win, ymin-zoom_win, xmax+zoom_win, ymax+zoom_win); + } + + if (part) { // if parts checked + B.elements(E) { + if (strupr(sname)==strupr(E.name)) { + found = 1; + x = u2mm(E.x); + y = u2mm(E.y); + } + } + h = ""; + sprintf(h, "Window (%f %f)(%f %f);\n", + x-zoom_win, y-zoom_win, x+zoom_win, y+zoom_win); + } + + if (!found) { + dlgMessageBox("Name not found!", "&OK"); + exit(1); + } + cmd += h; + cmd += "Show " + sname + ";\n"; + cmd += "grid last;\n"; + exit(cmd); + } +else { + dlgMessageBox("No board loaded!"); + exit(1); + } diff --git a/eagle-5.7.0/ulp/cmd-snap-board.ulp b/eagle-5.7.0/ulp/cmd-snap-board.ulp new file mode 100644 index 0000000..c0a9963 --- /dev/null +++ b/eagle-5.7.0/ulp/cmd-snap-board.ulp @@ -0,0 +1,246 @@ +#usage "Snap objects in a board\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Version = "Version 1.1"; // 2009-01-28 move step by step + // 1. Packages + // 2. Vias + // 3. Wires alf@cadsoft.de + +real GridDist = 25.0; +enum { unitINCH, unitMIL, unitMM, unitMIC }; +string h, cmd = ""; +int unit = unitMIL; // predefined unit, can be changed to unitMM, unitINCH, unitMIC +int Result; +string Status = ""; +string script_name; + +int cntm = 0; // count unsnaped + +int n = 0, x[], y[], l[], UsedLayers[]; + + +real u2unit(int u) { + if (unit == unitMIL) return u2mil(u); + if (unit == unitMM) return u2mm(u); + if (unit == unitINCH) return u2inch(u); + if (unit == unitMIC) return u2mic(u); +} + + +real snap(int n) { // returns next grid point + return round(u2unit(n) / GridDist) * GridDist; +} + + +int isNew(int X, int Y, int L) { + for (int i = 0; i < n; i++) { + if (x[i] == X && y[i] == Y && (l[i] == L || l[i] == LAYER_VIAS )) return 0; + } + return 1; +} + + +void Move(int Layer) { + if (UsedLayers[Layer]) { + sprintf(h, "DISPLAY NONE %d;\n", Layer); + cmd += h; + // Snap the signal wires and vias: + for (int i = 0; i < n; i++) { + if (l[i] == Layer && (u2unit(x[i]) != snap(x[i]) || u2unit(y[i]) != snap(y[i]))) { + sprintf(h, "MOVE (%f %f) (%f %f);\n", u2unit(x[i]), u2unit(y[i]), snap(x[i]), snap(y[i])); + cmd += h; + cntm++; + } + } + } + return; +} + +real check_coord(int x, int y) { + real v1, v2; + v1 = snap(x) - u2unit(x); + v2 = snap(y) - u2unit(y); + if (v1) return v1; + else if(v2) return v2; + else return 0; +} + + +void snap_to_grid(void) { + board(B) { + script_name = filesetext(B.name, "~snap.scr"); + // Remember the active layers: + int ActiveLayers[]; + B.layers(L) { + ActiveLayers[L.number] = L.visible; + } + if (unit == unitMIL) { + sprintf(h, "GRID MIL FINEST;\n"); + cmd += h; + } + if (unit == unitMM) { + sprintf(h, "GRID MM FINEST;\n"); + cmd += h; + } + if (unit == unitINCH) { + sprintf(h, "GRID INCH FINEST;\n"); + cmd += h; + } + if (unit == unitMIC) { + sprintf(h, "GRID MIC FINEST;\n"); + cmd += h; + } + sprintf(h, "SET OPTIMIZING OFF;\n"); // 2009-01-28 + cmd += h; + if (!argv[1]) { // 1. snap elements + // Snap the elements: + B.elements(E) { + status("Element: "+E.name); + if (u2unit(E.x) != snap(E.x) || u2unit(E.y) != snap(E.y)) { + sprintf(h, "MOVE %s (%f %f);\n", E.name, snap(E.x), snap(E.y)); + cmd += h; + cntm++; + } + } + } + // snap check vias + if (argv[1] == "V") { // 2. snap vias + // Collect all (unique!) signal via coordinates: + B.signals(S) { + status("Signal: "+S.name); + S.vias(V) { + UsedLayers[LAYER_VIAS] = 1; + x[n] = V.x; + y[n] = V.y; + l[n] = LAYER_VIAS; + if(check_coord(V.x, V.y)) n++; + } + } + } + if (argv[1] == "E" && n) { + cmd = ""; + for (int vn = 0; vn < n; vn++) { + sprintf(h, "(%.4f %.4f);\n", u2unit(x[vn]), u2unit(y[vn]) ); + } + cmd+=h; + sprintf(h, "Kann %d VIAs nicht snapen\n", n); + dlgMessageBox(h+cmd, "OK"); + exit(-1); + } + // snap check wires + if (argv[1] == "W") { // 3. snap wires + // Collect all (unique!) signal wire coordinates: + B.signals(S) { + status("Signal: "+S.name); + S.wires(W) { + UsedLayers[W.layer] = 1; + if (isNew(W.x1, W.y1, W.layer)) { + x[n] = W.x1; + y[n] = W.y1; + l[n] = W.layer; + if (check_coord(W.x1, W.y1)) n++; + } + if (isNew(W.x2, W.y2, W.layer)) { + x[n] = W.x2; + y[n] = W.y2; + l[n] = W.layer; + if (check_coord(W.x2, W.y2)) n++; + } + } + } + } + + // Go through the used layers (this avoids problems with wires on different + // layers that are selected at the same coordinates): + for (int u = LAYER_TOP; u <= LAYER_BOTTOM; u++) { + Move(u); + } + Move(LAYER_VIAS); + + // Reactivate the active layers: + sprintf(h, "DISPLAY"); + cmd += h; + for (int j = 1; j < 256; j++) { + if (ActiveLayers[j]) { + sprintf(h, " %d", j); + cmd += h; + } + } + sprintf(h, ";\n"); + cmd += h; + if (!argv[1]) { + sprintf(h, "RUN '%s' 'V' %d %.4f;\n", argv[0], unit, GridDist); + } + else if (argv[1] == "V") { + sprintf(h, "RUN '%s' 'W' %d %.4f;\n", argv[0], unit, GridDist); + } + else if (argv[1] == "W") { + sprintf(h, "RUN '%s' 'E' %d %.4f;\n", argv[0], unit, GridDist); + } + else if (argv[1] == "E") { + exit(0); + } + } + return; +} + + +//---- main ---------------------------------------------------------------------- + +if (!board) { + dlgMessageBox(usage + "


ERROR: No board!

\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)." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string h, cmd; +real GridDistH = 50.0, GridDistV = 50.0; +enum {unitINCH, unitMIL, unitMM, unitMIC}; +int unit = unitMIL; // predefined unit, can be changed to unitMM, unitINCH, unitMIC +int show_script; +int Result; +int sym = 1; +int version_4_0 = 0; + +// get project path, if in board or schematic, otherwise library path +string get_project_path() { +string s = "", p = "";; + if (library) { library(L) s = L.name;} + if (board) { board(B) s = B.name;} + if (schematic){ schematic(S) s = S.name;} + char c = '/'; + int pos = strrchr(s, c); + if (pos >= 0) { + p = strsub(s, 0, pos + 1); + } + return p; +} + +real u2unit(int u) { + if (unit == unitMIL) return u2mil(u); + if (unit == unitMM) return u2mm(u); + if (unit == unitINCH) return u2inch(u); + if (unit == unitMIC) return u2mic(u); +} + +real snapH(int n) { // returns next grid point + return round(u2unit(n) / GridDistH) * GridDistH; +} + +real snapV(int n) { // returns next grid point + return round(u2unit(n) / GridDistV) * GridDistV; +} + +void snappads(void) { + + if (unit == unitMIL) {h = ""; sprintf(h, "GRID MIL FINEST;\n"); cmd += h;} + if (unit == unitMM) {h = ""; sprintf(h, "GRID MM FINEST;\n"); cmd += h;} + if (unit == unitINCH) {h = ""; sprintf(h, "GRID INCH FINEST;\n"); cmd += h;} + if (unit == unitMIC) {h = ""; sprintf(h, "GRID MIC FINEST;\n"); cmd += h;} + h = ""; sprintf(h, "DISPLAY NONE TOP PADS;\n"); cmd += h; + + library(L) { + if (package) package(PAC) { + PAC.contacts(C) { + h = ""; + sprintf(h, "MOVE (%f %f) (%f %f);\n", u2unit(C.x), u2unit(C.y), snapH(C.x), snapV(C.y)); + cmd += h; + } + } + else { + dlgMessageBox("No package loaded!", "OK"); + } + } + h = ""; sprintf(h, "GRID LAST;\n"); cmd += h; + +/* left for test purposes + dlgDialog("Edit Commands") { + dlgVBoxLayout { + dlgLabel("Edit only if you are sure what you do!"); + dlgTextEdit(cmd); + dlgPushButton("+Ok") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +*/ + +if (!version_4_0) { + exit(cmd); + } +else { + output(get_project_path()+"$$$.scr", "wt") printf("%s", cmd); + exit("SCRIPT '"+get_project_path()+"$$$.scr';\n"); + } +} + + +//------- main ----------- + +if ((EAGLE_VERSION == 4 && EAGLE_RELEASE == 0) || (EAGLE_VERSION == 3 && EAGLE_RELEASE >96)) + version_4_0 = 1; // used for workaround + +if (!library) { + dlgMessageBox(usage + "


ERROR: No package!

\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 "Copy Wire (Polygon Wire) to any layer

" + "This ULP copies copper wire and/or polygon from layer (1 or 16) of selected signals into " + "any layer in order.

" + "Use:
" + "run copy-wire-to-any-layer.ulp [signalname] [signalname]
" + "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

" + "Options are case sensitive.
" + "$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.
" + "
" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED. + +string Version = "Version 1.5"; // 2008-04-23 check is a polygon placed + // changed menu to copy to any layer + // 2008-05-05 renamed from "copy-wire-to-solder-mask.ulp" to + // "copy-wire-to-any-layer.ulp" + // 2008-10-24 renamed to copy-layer-to-any-layer.ulp + // copy also rect, circle, text and non copper layer + // 2009-01-28 check polygon filling on orphan + + +int NameOff = 0; // 0 = copy by signal name + // 1 = copy without signal name (all) +int PolygonOn = 0; // copy also polygon +int onlyPolygon = 0; +int fillPolygon = 0; // copy only polygon contour or copy polygon filling as wire 2006.01.20 alf +int Player[]; +string poly[]; +int cntp = 0; +string isRatsnest; +string isLayer = "Top/Bottom"; // default layer +int isLayerNb = 0; +string toLayer = "t/bStop"; // default to Stop-Layer + +string fromName[], toName[]; + fromName[0] = "Top/Bottom"; + toName[0] = "t/bStop"; + +int lNumber[]; +int cntLay = 1; +int selisLayer = -1, seltoLayer = -1; + +string signals[] = { "" }; +string chsignals[] = { "" }; +int chngsig = 0; +int lastSigCh = -1; +int decs; + +int index[]; +int x1[], y1[], x2[], y2[], layer[]; +int Wwidth[]; +int n = 1; + +string cmd; +string c; + +// ************************************* +int found(string fnam) { + int fnd = 0; + do { + if (chsignals[fnd] == fnam) { + return 1; + break; + } + ++fnd; + } while (chsignals[fnd]); + return 0; +} + +int getlayernumber(string isL) { + board(B) B.layers(L) if (L.name == isL) return (L.number); + return 0; +} + +void changeLayer(int l) { + if (toLayer == "t/bStop") { + if (isLayer == "Top/Bottom") { + if (l == 1) sprintf(c, "CHANGE LAYER 29;\n"); + if (l == 16) sprintf(c, "CHANGE LAYER 30;\n"); + } + else { + if (l == isLayerNb) sprintf(c, "CHANGE LAYER %d;\n", isLayerNb); + } + } + else { + sprintf(c, "CHANGE LAYER %s;\n", toLayer); + } + cmd+= c; + return; +} + + +int delfromList(int selct) { + if (lastSigCh >= 0) { + lastSigCh--; + for (int r = selct; r <= lastSigCh; r++) { + chsignals[r] = chsignals[r + 1]; + } + chsignals[lastSigCh + 1] = ""; + } + return selct; +} + +void AddList (string SigName) { + int nofound = 1; + for (int r = 0; r <= lastSigCh; r++) { + if (chsignals[r] == SigName) { + nofound = 0; + break; + } + } + if (nofound) { + lastSigCh++; + if (lastSigCh > 0) { + for (int x = lastSigCh; x > 0; x--) { + chsignals[x] = chsignals[x - 1]; + } + } + chsignals[0] = SigName; + } + return; +} + + +void AddArgument(int n) { + do { + AddList(strupr(argv[n])); + n++; + } while(argv[n]); + return; +} + + +void copy_any_layer(void) { + dlgMessageBox("jetzt gehts rund!", "OK"); + exit(-99); +} + + +void collectlayer(void) { + board(B) B.layers(L) { + fromName[cntLay] = L.name; + toName[cntLay] = L.name; + lNumber[cntLay] = L.number; + cntLay++; + } + fromName[cntLay] = ""; + toName[cntLay] = ""; + lNumber[cntLay] = 0; + return; +} + +void menue() { + int srt = 0; + if (argc > 1) { + if (argv[1] == "-p" || argv[1] == "+p" || argv[1] == "$nameoff$") { + if (argv[1] == "-p") PolygonOn = 1; + if (argv[1] == "+p") onlyPolygon = 1; + if (argv[2] == "-f") fillPolygon = 0; // 2006.01.20 alf + if (argv[2] == "+f") fillPolygon = 1; + if (argv[1] == "$nameoff$") { NameOff = 1; AddArgument(2); } + else if (argv[2] == "$nameoff$") { NameOff = 1; AddArgument(3); } + else AddArgument(2); + if (argv[2] == "$nameoff$") { NameOff = 1; AddArgument(3); } + else if (argv[3] == "$nameoff$") { NameOff = 1; AddArgument(4); } + else AddArgument(3); + } + else AddArgument(1); + } + else { + string slist[]; + int Result = dlgDialog(filename(argv[0])) { + dlgHBoxLayout dlgSpacing(250); + dlgHBoxLayout { + dlgCheckBox("&Copy all ", NameOff); + dlgLabel("also without signal name"); + dlgStretch(1); + } + dlgSpacing(10); + dlgStretch(0); + dlgLabel("&Add signal to list"); + dlgComboBox(signals, chngsig) { AddList(signals[chngsig]); dlgRedisplay();} + dlgSpacing(12); + dlgLabel("&Delete signal from list"); + dlgComboBox(chsignals, decs) decs = delfromList(decs); + dlgGroup("Polygon") { + dlgCheckBox("Copy &polygon with signal name", PolygonOn); + dlgCheckBox("Copy &only polygons", onlyPolygon); + dlgHBoxLayout { + dlgRadioButton("Copy conto&ur", fillPolygon); + dlgRadioButton("Copy &filling", fillPolygon); + } + } + dlgHBoxLayout { + dlgListView("from Layer", fromName, selisLayer, srt); + dlgListView("to Layer", toName, seltoLayer, srt); + dlgStretch(1); + } + dlgLabel("If you want to change the default setting, type in the appropriate layer numbers here."); + dlgSpacing(10); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgLabel(Version); + dlgStretch(1); + dlgPushButton("&Help") dlgMessageBox(usage, "OK"); + } + dlgStretch(0); + }; + if (Result == 0) exit (0); + } + isLayerNb = strtol(isLayer); // 2008-04-23 + return; +} + + +// main +if (board) board(B) { + isRatsnest = "! Start RATSNEST first!"; + int cntPoly = 0; + B.signals(S) { + S.polygons(P) { + cntPoly++; + P.fillings(F) { + isRatsnest = ""; + break; + } + if (isRatsnest) { // check a orphan 2009-01-28 alf@cadsoft.de + P.wires(W) { + sprintf(isRatsnest, "Start RATSNEST and check polygon on (%.4f %.4f) mm!", u2mm(W.x1), u2mm(W.y1) ); + dlgMessageBox(isRatsnest, "OK"); + sprintf(isRatsnest, "GRID MM;\nWIN (%.4f %.4f);\nGRID LAST;\n", u2mm(W.x1), u2mm(W.y1) ); + exit(isRatsnest); + } + } + } + } + if (cntPoly) { + if (isRatsnest) { + dlgMessageBox(isRatsnest, "OK"); + exit(0); + } + } + int s = 0; + B.signals(S) { + signals[s] = S.name; + s++; + } + collectlayer(); + menue(); + if (getlayernumber(isLayer) > 16) copy_any_layer(); + else { + sprintf(c, "GRID MM;\nSET WIRE_BEND 2;\nSET UNDO OFF;\n"); + cmd+= c; + B.signals(S) { + if (found(S.name) || NameOff || onlyPolygon) { + if (!onlyPolygon) { + S.wires(W) { + if (!isLayer && (W.layer == 1 || W.layer == 16) || isLayerNb == W.layer) { + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + Wwidth[n] = W.width; + layer[n] = W.layer; + ++n; + } + } + } + if ( (PolygonOn && NameOff) || (onlyPolygon && !NameOff && found(S.name)) || (PolygonOn && !NameOff && found(S.name)) ) { + S.polygons(POL) { + if (!isLayer && (POL.layer == 1 || POL.layer == 16) || isLayerNb == POL.layer) { + string p; + int startx, starty, first = 1; + Player[cntp] = POL.layer; + if (!fillPolygon) { + POL.contours(W) { + if (first) { + first = 0; + startx = W.x1; + starty = W.y1; + sprintf(poly[cntp], "POLYGON %.4f (%.4f %.4f) (%.4f %.4f)", + u2mm(W.width), + u2mm(W.x1), u2mm(W.y1), + u2mm(W.x2), u2mm(W.y2) + ); + } + else { + first = 0; + sprintf(p, " (%.4f %.4f)", u2mm(W.x2), u2mm(W.y2) ); + poly[cntp] += p; + if (startx == W.x2 && starty == W.y2) { + sprintf(p, " (%.4f %.4f);\n", u2mm(startx), u2mm(starty) ); + poly[cntp] += p; + cntp++; + break; + } + } + } + } + else { // Polygon filling with wire + POL.contours(W) { + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + Wwidth[n] = W.width; + layer[n] = W.layer; + ++n; + } + POL.fillings(W) { + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + Wwidth[n] = W.width; + layer[n] = W.layer; + ++n; + } + } + } + } + } + } + } + sort(n, index, layer); + int dl = 0; + for (int i = 1; i < n; ++i) { + if(dl != layer[index[i]]) { + dl = layer[index[i]]; + changeLayer(dl); + } + sprintf(c, "WIRE %.4f (%.4f %.4f) (%.4f %.4f);\n", u2mm(Wwidth[index[i]]), + u2mm(x1[index[i]]), u2mm(y1[index[i]]), u2mm(x2[index[i]]), u2mm(y2[index[i]]) ); + cmd+= c; + } + sort(cntp, index, Player); + for ( i = 0; i < cntp; ++i) { + if(dl != Player[index[i]]) { + dl = Player[index[i]]; + changeLayer(dl); + } + sprintf(c, "WIRE %.4f (%.4f %.4f) (%.4f %.4f);\n", u2mm(Wwidth[index[i]]), + u2mm(x1[index[i]]), u2mm(y1[index[i]]), u2mm(x2[index[i]]), u2mm(y2[index[i]]) ); + cmd+= poly[index[i]]; + } + sprintf(c, "SET UNDO ON;\nGRID LAST;\n"); + cmd+= c; + exit (cmd); + } +} +else dlgMessageBox("! Start this ULP in a Board", "OK"); diff --git a/eagle-5.7.0/ulp/copy-silk-screen.ulp b/eagle-5.7.0/ulp/copy-silk-screen.ulp new file mode 100644 index 0000000..9b5955a --- /dev/null +++ b/eagle-5.7.0/ulp/copy-silk-screen.ulp @@ -0,0 +1,264 @@ +#usage "Generate a copy of Name; Value; Place and Docu layers to user defined layer.\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +int offset = 100; +int tf = 0; +int tNames = 25, bNames = 26; +int tValues = 27, bValues = 28; +int tPlace = 21, tDocu = 51; +int bPlace = 22, bDocu = 52; +string cmd = "SET UNDO_LOG OFF;\n"; // advisable for speed reasons +string h; + +void header(void) { + sprintf(h, "layer %d _tNames;\n", tNames+offset); // here you can change the new + cmd += h; + sprintf(h, "layer %d _bNames;\n", bNames+offset); // layers names + cmd += h; + sprintf(h, "layer %d _tValues;\n", tValues+offset); // here you can change the new + cmd += h; + sprintf(h, "layer %d _bValues;\n", bValues+offset); // layers names + cmd += h; + sprintf(h, "layer %d _tPlace;\n", tPlace+offset); // here you can change the new + cmd += h; + sprintf(h, "layer %d _tDocu;\n", tDocu+offset); // layers names + cmd += h; + sprintf(h, "layer %d _bPlace;\n", bPlace+offset); // here you can change the new + cmd += h; + sprintf(h, "layer %d _bDocu;\n", bDocu+offset); // layers names + cmd += h; + sprintf(h, "set color_layer %d yellow;\n", tNames+offset); // and + cmd += h; + sprintf(h, "set color_layer %d magenta;\n", bNames+offset); // colors + cmd += h; + sprintf(h, "set wire_bend 2;\n"); + cmd += h; + sprintf(h, "\nGRID mil;\n\n"); + cmd += h; +} + +void DrawWire(UL_WIRE W) { + if (W.arc) { + h = ""; sprintf(h, "Arc CCW %.3f (%.3f %.3f) (%.3f %.3f) (%.3f %.3f);\n", + u2mil(W.width), + u2mil(W.arc.x1), u2mil(W.arc.y1), + u2mil(W.arc.xc + W.arc.xc - W.arc.x1), u2mil(W.arc.yc + W.arc.yc - W.arc.y1), + u2mil(W.arc.x2), u2mil(W.arc.y2)); + } + else { + cmd += h; + sprintf(h, "WIRE %.3f (%.3f %.3f) (%.3f %.3f);\n", + u2mil(W.width), u2mil(W.x1), u2mil(W.y1), u2mil(W.x2), u2mil(W.y2) ); + } + cmd += h; +} + + + +void DrawCircle(UL_CIRCLE C) +{ + sprintf(h, "CHANGE LAYER %d;\n", C.layer + offset ); + cmd += h; + sprintf(h, "Circle %f (%f %f) (%f %f);\n", + u2mil(C.width), + u2mil(C.x), u2mil(C.y), + u2mil(C.x + C.radius), u2mil(C.y)); + cmd += h; +} + +void DrawRectangle(UL_RECTANGLE R) +{ + sprintf(h, "CHANGE LAYER %d;\n", R.layer + offset ); + cmd += h; + sprintf(h, "Rect (%f %f) (%f %f);\n", + u2mil(R.x1), u2mil(R.y1), + u2mil(R.x2), u2mil(R.y2)); + cmd += h; +} + +void DrawPolygon(UL_POLYGON PL) +{ + sprintf(h, "CHANGE LAYER %d;\n", PL.layer + offset ); + cmd += h; + sprintf(h, "Change Isolate %f;\n", u2mil(PL.isolate)); + cmd += h; + sprintf(h, "Change Spacing %f;\n", u2mil(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 ", u2mil(PL.width)); + cmd += h; + PL.wires(W) { + sprintf(h, "(%f %f) ", u2mil(W.x1), u2mil(W.y1)); cmd += h; /*start coord.*/ + break; + }; + PL.wires(W) { + sprintf(h, " %+f (%f %f)", W.curve, u2mil(W.x2), u2mil(W.y2)); + cmd += h; + }; + sprintf(h, ";\n"); cmd += h; + return; +} + +void DrawText(UL_TEXT T) { + string mir = ""; + if(T.mirror) mir = "M"; + sprintf(h, "CHANGE LAYER %d;\n", T.layer + offset ); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' %sR%1.0f (%5.3f %5.3f);\n", + T.value, mir, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; +} + +void DrawName(UL_TEXT T) { + string mir = ""; + if(T.mirror) mir = "M"; + sprintf(h, "CHANGE LAYER %d;\n", T.layer + offset ); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' %sR%1.0f (%5.3f %5.3f);\n", + T.value, mir, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; +} + +void DrawValue(UL_TEXT T) { + string mir = ""; + if(T.mirror) mir = "M"; + sprintf(h, "CHANGE LAYER %d;\n", T.layer + offset ); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' %sR%1.0f (%5.3f %5.3f);\n", + T.value, mir, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; +} + +if (board) { + board(B) { + header(); + B.elements(E) { + E.texts(T) { + if (T.layer == 25) { + h = "";sprintf(h, "Change Layer %d;\n", tNames+offset); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' R%1.0f (%5.3f %5.3f);\n", + E.name, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; + } + else if (T.layer == 26) { + h = "";sprintf(h, "Change Layer %d;\n", bNames+offset); + cmd += h; + tf = 0; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' MR%1.0f (%5.3f %5.3f);\n", + E.name, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; + } + else if (T.layer == 27) { + h = "";sprintf(h, "Change Layer %d;\n", tValues+offset); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' R%1.0f (%5.3f %5.3f);\n", + E.value, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; + } + else if (T.layer == 28) { + h = "";sprintf(h, "Change Layer %d;\n", bValues+offset); + cmd += h; + tf = 0; + sprintf(h, "Change Size %5.3f;\n", u2mil(T.size)); + cmd += h; + sprintf(h, "Text '%s' MR%1.0f (%5.3f %5.3f);\n", + E.value, T.angle, u2mil(T.x), u2mil(T.y)); + cmd += h; + } + else if (T.layer == 21 || T.layer == 22 || T.layer == 51 || T.layer == 52 ) { + DrawText(T); + } + } + E.package.wires(W) { + if(W.layer == 21 || W.layer == 22 || W.layer == 51 || W.layer == 52) { + sprintf(h, "CHANGE LAYER %d;\n", W.layer + offset ); + cmd += h; + DrawWire(W); + } + } + E.package.circles(C) { + if(C.layer == 21 || C.layer == 22 || C.layer == 51 || C.layer == 52) { + DrawCircle(C); + } + } + E.package.rectangles(R) { + if(R.layer == 21 || R.layer == 22 || R.layer == 51 || R.layer == 52) { + DrawRectangle(R); + } + } + E.package.polygons(PL) { + if(PL.layer == 21 || PL.layer == 22 || PL.layer == 51 || PL.layer == 52) { + DrawPolygon(PL); + } + } + } + } + cmd += "SET UNDO_LOG ON;\n"; + + // EditBox + int Result = dlgDialog("Descriptions") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+&Execute") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + } + }; + if (Result == 0) exit(0); + + exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/copy-text-as-wire.ulp b/eagle-5.7.0/ulp/copy-text-as-wire.ulp new file mode 100644 index 0000000..e5c96a5 --- /dev/null +++ b/eagle-5.7.0/ulp/copy-text-as-wire.ulp @@ -0,0 +1,120 @@ +#usage "Copy text (Layer) into layer\n" + "

" + "Generates a command sequence which copies the texts-wires " + "of texts of your layout into user layer(s)." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Version = "1.01"; +// 2006.03.07 search text in Board-Layer outside Element alf@cadsoft.de + +int is_layer = 0; +int all_layer = 0; +int to_layer = 100; +string cmd; +string h; +string scriptfile; + +int use_layer[]; + +void header(void) { + sprintf(cmd, "# Exported from %s by %s\n", scriptfile, EAGLE_SIGNATURE ); + cmd += "SET UNDO_LOG OFF;\n"; // advisable for speed reasons + cmd += "set wire_bend 2;\n"; + cmd += "GRID mm;\n"; +} + + +void text(UL_TEXT T) { + T.wires(W) { + sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mm(W.width), u2mm(W.x1), u2mm(W.y1), u2mm(W.x2), u2mm(W.y2) ); + cmd += h; + } + return; +} + +void checklayer(UL_TEXT T) { + int layer = T.layer; + if (all_layer || T.layer == is_layer) { + if(!use_layer[layer]) { + sprintf(h, "Layer %d Text%d;\n", to_layer + layer, to_layer + layer); + cmd += h; + use_layer[layer] = 1; + } + sprintf(h, "Change Layer %d;\n", to_layer + layer); + cmd += h; + text(T); + } + return; +} + +// Distance menue +int menue(void) { + int d = dlgDialog("Place Text as Wire") { + dlgLabel(usage); + dlgHBoxLayout { + dlgLabel("this &Layer"); + dlgSpacing(10); + dlgIntEdit(is_layer); + dlgSpacing(10); + dlgCheckBox("&all Layer", all_layer); + dlgStretch(1); + } + dlgHBoxLayout { + dlgLabel("Layer &offset"); + dlgIntEdit(to_layer); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; + return d; +} + +if (board) board(B) { + if (!menue()) exit (0); + scriptfile = filesetext(B.name, ".scr"); + header(); + B.texts(T) { // Texts // only search in Board 2006.03.07 alf@cadsoft.de + checklayer(T); + } + B.elements(E) { + E.texts(T) { // *** smased *** + checklayer(T); + } + E.package.texts(T) { // *** non smased + checklayer(T); + } + } +} +cmd += "SET UNDO_LOG ON;\n"; +cmd += "GRID LAST;\n"; + +// EditBox +int Result = dlgDialog("Copy TEXT as wire") { + dlgHBoxLayout { + dlgTextEdit(cmd); + dlgVBoxLayout { + dlgSpacing(300); + } + } + dlgHBoxLayout { + dlgSpacing(500); + } + dlgHBoxLayout { + dlgPushButton("+&Execute") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(1); + } + }; +if (Result == 0) exit(0); + +output(scriptfile, "wt") printf("%s", cmd); + +exit("script '" + scriptfile + "';\nREMOVE '" + scriptfile + "';\n"); diff --git a/eagle-5.7.0/ulp/copy-wire-to-solder-mask.ulp b/eagle-5.7.0/ulp/copy-wire-to-solder-mask.ulp new file mode 100644 index 0000000..00f2722 --- /dev/null +++ b/eagle-5.7.0/ulp/copy-wire-to-solder-mask.ulp @@ -0,0 +1,381 @@ +#usage "Copy Wire (Polygon Wire) to any layer

" + "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:
" + "run copy-wire-to-solder-mask.ulp [signalname] [signalname]
" + "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

" + "Options are case sensitive.
" + "$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.
" + "
" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED. + +string Version = "ULP-Version: 1.5"; // 2008-04-23 check is a polygon placed + // changed menu to copy to any layer + // 2009-01-28 check polygon filling on orphan alf@cadsoft.de + // 2009-04-23 check menu parameter + // 2009-06-30 correct polygon export + + +int NameOff = 0; // 0 = copy by signal name + // 1 = copy without signal name (all) +int PolygonOn = 0; // copy also polygon +int onlyPolygon = 0; +int fillPolygon = 0; // copy only polygon contour or copy polygon filling as wire 2006.01.20 alf +int Player[]; +string poly[]; +int cntp = 0; +string isRatsnest; +string isLayer = "Top/Bottom"; // default layer +int isLayerNb = 0; +string toLayer = "t/bStop"; // default do Stop-Layer +int Lused[]; // 2009-04-23 + +string signals[] = { "" }; +string chsignals[] = { "" }; +int chngsig = 0; +int lastSigCh = -1; +int decs; + +int index[]; +int x1[], y1[], x2[], y2[], layer[]; +int Wwidth[]; +int n = 1; + +string cmd; +string c; + +int nbIslayer; +int nbTolayer; + +int test = 0; // 2009-06-30 for test menu + + +// ************************************* +string check(void) { // 2009-04-23 alf@cadsoft.de + int isLfound = 0; + int toLfound = 0; + nbIslayer = strtol(isLayer); + nbTolayer = strtol(toLayer); + + if (isLayer == "Top/Bottom") isLfound = -1; + else { + board(B) B.layers(L) { + if (nbIslayer == L.number || isLayer == L.name) { + isLfound = L.number; + nbIslayer = L.number; + break; + } + } + } + if (toLayer == "t/bStop") toLfound = -1; + else { + board(B) B.layers(L) { + if (nbTolayer == L.number || toLayer == L.name) { + toLfound = L.number; + nbTolayer = L.number; + break; + } + } + } + if (isLfound == -1); + else if (!isLfound) return "!Select a available layer number or name for Copy layer."; + else if (!Lused[isLfound]) return "!Not used layer Copy layer " + isLayer + "."; + + if (toLfound == -1); + else if (!toLfound) return "!Select a available layer number or name for to layer."; + else if (!Lused[toLfound]) return "!Not used layer to layer " + toLayer + "."; + + if (!NameOff && lastSigCh < 0 ) { + return "!No signal selected"; + } + return ""; +} + + +int found(string fnam) { + int fnd = 0; + do { + if (chsignals[fnd] == fnam) { + return 1; + break; + } + ++fnd; + } while (chsignals[fnd]); + return 0; +} + + +void changeLayer(int l) { + if (toLayer == "t/bStop") { + if (l == 1) sprintf(c, "CHANGE LAYER 29;\n"); + if (l == 16) sprintf(c, "CHANGE LAYER 30;\n"); + cmd+= c; + } + if (isLayer == "Top/Bottom") { // 2009-06-30 + if (l == 1) { + sprintf(c, "CHANGE LAYER 29;\n"); + cmd+= c; + } + if (l == 16) { + sprintf(c, "CHANGE LAYER 30;\n"); + cmd+= c; + } + } + else if (l == isLayerNb) { + sprintf(c, "CHANGE LAYER %s;\n", toLayer); // 2009-04-23 + cmd+= c; + } + return; +} + + +int delfromList(int selct) { + if (lastSigCh >= 0) { + lastSigCh--; + for (int r = selct; r <= lastSigCh; r++) { + chsignals[r] = chsignals[r + 1]; + } + chsignals[lastSigCh + 1] = ""; + } + return selct; +} + + +void AddList(string SigName) { + int nofound = 1; + for (int r = 0; r <= lastSigCh; r++) { + if (chsignals[r] == SigName) { + nofound = 0; + break; + } + } + if (nofound) { + lastSigCh++; + if (lastSigCh > 0) { + for (int x = lastSigCh; x > 0; x--) { + chsignals[x] = chsignals[x - 1]; + } + } + chsignals[0] = SigName; + } + return; +} + + +void AddArgument(int n) { + do { + AddList(strupr(argv[n])); + n++; + } while(argv[n]); + return; +} + + +void menue() { + if (argc > 1) { + if (argv[1] == "-p" || argv[1] == "+p" || argv[1] == "$nameoff$") { + if (argv[1] == "-p") PolygonOn = 1; + if (argv[1] == "+p") onlyPolygon = 1; + if (argv[2] == "-f") fillPolygon = 0; // 2006.01.20 alf + if (argv[2] == "+f") fillPolygon = 1; + if (argv[1] == "$nameoff$") { NameOff = 1; AddArgument(2); } + else if (argv[2] == "$nameoff$") { NameOff = 1; AddArgument(3); } + else AddArgument(2); + if (argv[2] == "$nameoff$") { NameOff = 1; AddArgument(3); } + else if (argv[3] == "$nameoff$") { NameOff = 1; AddArgument(4); } + else AddArgument(3); + } + else AddArgument(1); + } + else { + string slist[]; + int Result = dlgDialog("Copy wire to layer") { + dlgLabel(Version); + dlgHBoxLayout dlgSpacing(250); + dlgCheckBox("Copy &all (without signal name)", NameOff); + dlgSpacing(10); + dlgStretch(0); + dlgLabel("Add &signal to list"); + dlgComboBox(signals, chngsig) { AddList(signals[chngsig]); dlgRedisplay();} + dlgSpacing(30); + dlgLabel("&Delete signal from list"); + dlgComboBox(chsignals, decs) decs = delfromList(decs); + dlgGroup("Polygon") { + dlgCheckBox("Copy &polygon with signal name", PolygonOn); + dlgCheckBox("Copy &only polygons", onlyPolygon); + dlgHBoxLayout { + dlgRadioButton("Copy only &contour", fillPolygon); + dlgRadioButton("Copy with &filling", fillPolygon); + } + } + dlgHBoxLayout { + dlgLabel("Copy &layer "); + dlgStringEdit(isLayer); + dlgLabel(" &to layer "); + dlgStringEdit(toLayer); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+OK") { + string error = check(); // 2009-04-23 alf@cadsoft.de + if(error) dlgMessageBox(error); + else dlgAccept(); + } + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgPushButton("&Help") dlgMessageBox(usage, "OK"); + } + dlgStretch(0); + }; + if (Result == 0) exit (0); + } + isLayerNb = nbIslayer; // 2009-04-23 + return; +} + + +// main +if (board) board(B) { + B.layers(L) Lused[L.number] = L.used; + isRatsnest = "! Start RATSNEST first!"; + int cntPoly = 0; + B.signals(S) { + S.polygons(P) { + cntPoly++; + P.fillings(F) { // check if run RATSNEST + isRatsnest = ""; + break; + } + if (isRatsnest) { // check a orphan 2009-01-28 alf@cadsoft.de + P.wires(W) { + sprintf(isRatsnest, "Start RATSNEST and check polygon on (%.4f %.4f) mm!", u2mm(W.x1), u2mm(W.y1) ); + dlgMessageBox(isRatsnest, "OK"); + sprintf(isRatsnest, "GRID MM;\nWIN (%.4f %.4f);\nGRID LAST;\n", u2mm(W.x1), u2mm(W.y1) ); + exit(isRatsnest); + } + } + } + } + if (cntPoly) { + if (isRatsnest) { + dlgMessageBox(isRatsnest, "OK"); + exit(0); + } + } + int s = 0; + B.signals(S) { + signals[s] = S.name; + s++; + } + menue(); + + sprintf(c, "GRID MM;\nSET WIRE_BEND 2;\nSET UNDO OFF;\n"); + cmd+= c; + B.signals(S) { + if (found(S.name) || NameOff || onlyPolygon) { + if (!onlyPolygon) { + S.wires(W) { + if ((isLayer == "Top/Bottom" && (W.layer == 1 || W.layer == 16)) || isLayerNb == W.layer) { // 2009-04-23 alf + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + Wwidth[n] = W.width; + layer[n] = W.layer; + ++n; + } + } + } + if ( (PolygonOn && NameOff) || (onlyPolygon && !NameOff && found(S.name)) || (PolygonOn && !NameOff && found(S.name)) ) { + S.polygons(POL) { + if (isLayer && (POL.layer == 1 || POL.layer == 16) || isLayerNb == POL.layer) { // 2009-06-30 alf + string p; + int startx, starty; + int first = 1; + Player[cntp] = POL.layer; + POL.contours(W) { + if (first) { + first = 0; + startx = W.x1; + starty = W.y1; + sprintf(poly[cntp], "WIRE %.4f (%.4f %.4f) (%.4f %.4f)", // 2009-06-30 + u2mm(W.width), + u2mm(W.x1), u2mm(W.y1), + u2mm(W.x2), u2mm(W.y2) + ); + } + else { + sprintf(p, " (%.4f %.4f)", u2mm(W.x2), u2mm(W.y2) ); + poly[cntp] += p; + if (startx == W.x2 && starty == W.y2) { + sprintf(p, " (%.4f %.4f);\n", u2mm(startx), u2mm(starty) ); + poly[cntp] += p; + cntp++; + break; + } + } + } + if (fillPolygon) { // Polygon filling with wire 2009-06-30 + POL.fillings(W) { + x1[n] = W.x1; + y1[n] = W.y1; + x2[n] = W.x2; + y2[n] = W.y2; + Wwidth[n] = W.width; + layer[n] = W.layer; + ++n; + } + } + } + } + } + } + } + sort(n, index, layer); + int dl = 0; + for (int i = 1; i < n; i++) { + if(dl != layer[index[i]]) { + dl = layer[index[i]]; + changeLayer(dl); + } + sprintf(c, "WIRE %.4f (%.4f %.4f) (%.4f %.4f);\n", u2mm(Wwidth[index[i]]), + u2mm(x1[index[i]]), u2mm(y1[index[i]]), u2mm(x2[index[i]]), u2mm(y2[index[i]]) ); + cmd+= c; + } + sort(cntp, index, Player); + for ( i = 0; i < cntp; ++i) { + if(dl != Player[index[i]]) { + dl = Player[index[i]]; + changeLayer(dl); + } + sprintf(c, "WIRE %.4f (%.4f %.4f) (%.4f %.4f);\n", u2mm(Wwidth[index[i]]), + u2mm(x1[index[i]]), u2mm(y1[index[i]]), u2mm(x2[index[i]]), u2mm(y2[index[i]]) ); + cmd+= poly[index[i]]; + } + sprintf(c, "SET UNDO ON;\nGRID LAST;\n"); + cmd+= c; + if (test) { // 2009-06-30 + dlgDialog("test") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("Cancel") { dlgReject(); exit(-9); } + } + }; + } + exit (cmd); +} + +else dlgMessageBox("! Start this ULP in a Board", "OK"); + diff --git a/eagle-5.7.0/ulp/count.ulp b/eagle-5.7.0/ulp/count.ulp new file mode 100644 index 0000000..e9e0345 --- /dev/null +++ b/eagle-5.7.0/ulp/count.ulp @@ -0,0 +1,71 @@ +#usage "Count Pads, Vias, Smds and Holes of a board\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +int i, j, k, h, l, s ; +i = j = k = h = l = 0; + +if (board) { +board(B) { + B.holes(L) { + h++; + } + + B.elements(E) { + E.package.holes(H) { + h++; + } + E.package.contacts(C) { + + if (C.pad) + i++ ; + if (C.smd && (C.smd.layer == 1)) + j++ ; + if (C.smd && (C.smd.layer == 16)) + l++; + } + } + + B.signals(S) { + S.vias(V) { + k++; + } + } + +string result; + + sprintf(result, + " Number of Pads: %d\n\ + Number of Vias: %d\n\ + Number of Smds: %d\n\ + Smds in Top: %d\n\ + Smds in Bot: %d\n\ + Number of holes: %d\n\ + Total number of drills: %d", i, k, j+l, j, l, h, i+k+h); + + dlgDialog("Layout Information") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(200);} + dlgTextView(result); + dlgPushButton("+Ok") dlgAccept(); + } + }; + + string fileName ; + + fileName = dlgFileSave("Save Statistic File", filesetext(B.name, ".txt"), "*.txt"); + if (fileName == "") exit(0); + + output(fileName) { + printf("%s",result); + } + } +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); + } diff --git a/eagle-5.7.0/ulp/del-devices.ulp b/eagle-5.7.0/ulp/del-devices.ulp new file mode 100644 index 0000000..27dafc1 --- /dev/null +++ b/eagle-5.7.0/ulp/del-devices.ulp @@ -0,0 +1,44 @@ +#usage "Delete devices\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +if (library) { +string cmd = "", h; + +cmd += "set undo_log off;\n"; +library(L) { + L.devicesets(D) { + h = ""; + sprintf(h,"REMOVE %s.dev;\n",D.name); + cmd += h; + } + } +cmd += "set undo_log on;\n"; + +// EditBox +int Result = dlgDialog("Edit and Execute") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (!Result) + exit(0); + +exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Library \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/del-empty-devices.ulp b/eagle-5.7.0/ulp/del-empty-devices.ulp new file mode 100644 index 0000000..779304c --- /dev/null +++ b/eagle-5.7.0/ulp/del-empty-devices.ulp @@ -0,0 +1,50 @@ +#usage "Delete empty devices\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (library) { +int empty; +string cmd = "", h; + +cmd += "set undo_log off;\n"; +library(L) { + L.devicesets(D) { + h = ""; + empty = 1; + D.gates(G) { + empty = 0; + } + if (empty) { // device w/o gates found! + sprintf(h,"REMOVE %s.dev;\n",D.name); + cmd += h; + } + } + } +cmd += "set undo_log on;\n"; + +// EditBox +int Result = dlgDialog("Edit and Execute") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (!Result) + exit(0); + +exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Library \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/del-pack-sym.ulp b/eagle-5.7.0/ulp/del-pack-sym.ulp new file mode 100644 index 0000000..50b87bb --- /dev/null +++ b/eagle-5.7.0/ulp/del-pack-sym.ulp @@ -0,0 +1,94 @@ +#usage "Delete unused packages and symbols\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (library) { +string cmd = "", h; +int Result; + +//////////////// +// Checkboxes in Dialog +int pack = 1; +int sym = 1; + +//--------------------------------------------------- +Result = dlgDialog("Delete Packages/Symbols") { + dlgHBoxLayout { + dlgStretch(0); + dlgGroup("Delete") { + dlgStretch(0); + dlgGridLayout { + dlgCell(1, 1) { dlgSpacing(30); dlgCheckBox("&Packages", pack); }; + dlgCell(2, 1) { dlgSpacing(30); dlgCheckBox("&Symbols", sym); }; + } + } + dlgStretch(0); + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgStretch(1); + }; +if (Result == 0) exit (0); +//--------------------------------------------------- + +cmd += "set undo_log off;\n"; +library(L) { + if (pack) { + L.packages(P) { + h = ""; + sprintf(h,"REMOVE %s.pac;\n",P.name); + cmd += h; + } + } + if (sym) { + L.symbols(S) { + h = ""; + sprintf(h,"remove %s.sym;\n",S.name); + cmd += h; + } + } + } +cmd += "set undo_log on;\n"; + +// EditBox +Result = dlgDialog("edit and execute") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (!Result) exit(0); + +exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Library \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/dif40.ulp b/eagle-5.7.0/ulp/dif40.ulp new file mode 100644 index 0000000..fb75366 --- /dev/null +++ b/eagle-5.7.0/ulp/dif40.ulp @@ -0,0 +1,441 @@ +#usage "Export DIF 4.0 format

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +// 2005-02-28: Corrected output for mirrored components +// Added "File Save" dialog +// by support@cadsoft.de +// 2005-11-09: Corrected Y Coordinate, was always minus +// 2008-05-27: Corrected relativ coordinates if package rotate in 0.1 degree +// by alf@cadsoft.de + + +string REVISION = "2.00"; + +////////////////// user definable parameters //////////////////////////////////////////////// +int pad_layer = 1; // change to 16 if pad parameters should be taken from bottom layer +int nr_of_layers = 2; +int fill_polygons = 1; // set to 0 if polygons are not to be filled + // if set to 1, please make sure the width parameter of the polygons + // is >> 0 + // make also sure the polygon filling is visible in EAGLE +///////////////////////////////////////////////////////////////////////////////////////////// + + +string difversion = "4.0"; +string jobname, pcbname, + shapename[], // package names + t[]; // padtypes + +real ang2, x, y; +int nr_of_nets = 0, nr_of_comps = 0, i, new, sx, dummy_pad_code; + +//----------------------------------------------------- +string validname (string s) { + int i; + for (i = 0; s[i]; i++) { + if (s[i] == ',') s[i] = '_'; + if (s[i] == ';') s[i] = '_'; + if (s[i] == ')') s[i] = '_'; + // add further substitutions here + } + return s; +} +//----------------------------------------------------- +int u2u(int x) { // resolution 1/10000 mm + // return u2mil(x); // mil + return x; +} +//----------------------------------------------------- +int u2x(int x) { + return u2u(x); +} +//----------------------------------------------------- +int u2y(int x) { + return u2u(x); // correct sign, was always minus 2005.11.09 alf@cadsoft.de +} +//----------------------------------------------------- +real deg2arc(int x) { // degree to arc + return x*PI/180; +} +//----------------------------------------------------- +int u2ang(real x) { + if (x > 360) + x = x -360; + return x; +} +//---------------------------------------------------- +void relco (UL_ELEMENT E, int xt, int yt) { // change if finer rotation possible + xt = xt - E.x; yt = yt - E.y; // move part origin to 0,0 + if (E.mirror) { // flip back if mirrored + x = -x; + } + if (E.angle == 0) { // rotate to zero position + x = xt; y = yt; + } + if (E.angle == 90) { + x = yt; y = -xt; + } + if (E.angle == 180) { + x = -xt; y = -yt; + } + if (E.angle == 270) { + x = -yt; y = xt; + } + } +//----------------------------------------------------- +string padtype(UL_PACKAGE P, UL_CONTACT C) { + string s; + int pdi; + if (C.pad) { + pdi = u2u(C.pad.diameter[pad_layer]); + sprintf(s, "pad_%d_%d_%d", C.pad.shape[pad_layer], u2u(C.pad.diameter[pad_layer]), u2u(C.pad.drill)); + } + if (C.smd) { + sprintf(s, "smd_%d_%d", u2x(C.smd.dx), u2y(C.smd.dy)); + } + return s; +} +//----------------------------------------------------- +int padindex(UL_PACKAGE P,UL_CONTACT C) { + int i = 0; + for (i = 0; t[i]; i++) { + if (t[i] == padtype(P,C)) + return i+1; + } + return i; // should not be possible +} +//----------------------------------------------------- +string viatype(UL_VIA V) { + string s; + int pdi; + pdi = u2u(V.diameter[pad_layer]); + sprintf(s, "pad_%d_%d_%d", V.shape[pad_layer], u2u(V.diameter[pad_layer]), u2u(V.drill)); + return s; +} +//----------------------------------------------------- +int viaindex(UL_VIA V) { + int i = 0; + for (i = 0; t[i]; i++) { + if (t[i] == viatype(V)) + return i+1; + } + return i; // should not be possible +} +//----------------------------------------------------- +int realnet(UL_SIGNAL S) { + S.contactrefs(S) + return 1; + return 0; +} + +////////////////////////////////////////////////////// +void create_environment () { + int t = time(); + printf(" { ENVIRONMENT\n"); + printf(" { SOURCE \"EAGLE %d.%02d %s Revision %s\" }\n", EAGLE_VERSION, EAGLE_RELEASE, filename(argv[0]),REVISION); + printf(" { VERSION %s }\n", difversion); + printf(" { DATE %d/%d/%d }\n", t2day(t),t2month(t)+1,t2year(t)); + printf(" { TIME %d:%d:%d }\n", t2hour(t),t2minute(t),t2second(t)); + printf(" { UNITS 1/10000 mm }\n"); + printf(" { LAYER %d }\n", nr_of_layers); + printf(" { TOP_LAYER 1 }\n"); + printf(" { BOTTOM_LAYER 16 }\n"); + printf(" { NO_NET %d }\n", nr_of_nets); + printf(" { NO_COMP %d }\n", nr_of_comps); + printf(" }\n"); +} +////////////////////////////////////////////////////// +void board_data(UL_BOARD B) { + int i = 0; + printf (" { BOARD\n"); + printf (" { F\n"); + B.wires(W) { // if board outline as wires in board + i++; + if (W.layer == LAYER_DIMENSION) { + printf(" { L (%d,%d) (%d,%d) }\n", u2x(W.x1), u2y(W.y1), u2x(W.x2), u2y(W.y2)); + } + } + + if (i == 0) { // board contains no dim wires, try packages + B.elements(E) { + E.package.wires(W) { + if (W.layer == LAYER_DIMENSION) { + printf(" { L (%d,%d) (%d,%d) }\n", u2x(W.x1), u2y(W.y1), u2x(W.x2), u2y(W.y2)); + } + } + } + } + + printf (" }\n"); + printf (" }\n"); +} +////////////////////////////////////////////////////// +void components(UL_BOARD B) { + int i, pic_nr; + string devname = ""; + printf (" { COMPONENTS\n"); + B.elements(E) { + if (E.package) { + printf(" { COMP\n"); + printf(" { COMP_DEF\n"); + printf(" { NAME %s }\n", E.name); + printf(" { PART_NR %s }\n", validname(E.package.name)+"_"+validname(E.package.library)); + printf(" }\n"); + printf(" { PIN_DEF\n"); + int issmd = 0; + E.package.contacts(C) { + printf(" { PIN %s { NET %s } }\n", C.name, C.signal); + if (C.smd) issmd = 1; + } + // find picture code + for (i=0; shapename[i] != validname(E.package.name)+"_"+validname(E.package.library); i++) { + } + pic_nr = i; + printf(" }\n"); + printf(" { PICTURE\n"); + printf(" { ORIGIN (%d,%d) }\n", u2x(E.x), u2y(E.y)); + printf(" { PIC %d }\n", pic_nr); + printf(" { ROTATION %d }\n", u2ang(E.angle)); + int mside = 1; + if (E.mirror) { + mside = 2; + } + printf(" { M_SIDE %d }\n", mside); + if (issmd) { + printf(" { KIND SMD }\n"); + } + + /* implement later if necessary + E.texts(T) { + printf(" { TEXT\n"); + printf(" }\n"); + } + */ + + printf(" }\n"); + printf(" }\n"); + } + } + printf(" }\n"); +} +////////////////////////////////////////////////////// +void pad_symbols(UL_BOARD B) { + int i, j = 0, new; // j+1 = pad index; t[] contains padtypes + printf (" { PAD_DEF\n"); + B.elements(E) { + E.package.contacts(C) { + if (1 /* C.pad */) { + new = 1; // padtype not generated yet + for (i = 0; t[i]; i++) { + if (t[i] == padtype(E.package, C)) + new = 0; // padtype exists + } + if (new) { + t[j] = padtype(E.package, C); + j++; + if (C.pad) + printf(" { PAD %d\n { SIZE %d }\n { DRILL %d }\n }\n", + j,abs(u2u(C.pad.diameter[pad_layer])),abs(u2u(C.pad.drill))); + if (C.smd) + printf(" { PAD %d\n { SIZE %d }\n { DRILL 0 }\n }\n", + j, min(abs(u2x(C.smd.dx)), abs(u2y(C.smd.dy)))); + } + } + } + } + B.signals(S) { + S.vias(V) { + new = 1; + for (i = 0; t[i]; i++) { + if (t[i] == viatype(V)) + new = 0; // padtype exists + } + if (new) { + t[j] = viatype(V); + j++; + + dummy_pad_code = j; // find pad code for dummy pad + + printf(" { PAD %d\n { SIZE %d }\n { DRILL %d }\n }\n", + j,u2u(V.diameter[pad_layer]),u2u(V.drill)); + + + } + } + } + printf (" }\n"); +} + +////////////////////////////////////////////////////// +// 2008-05-27: Corrected relativ coordinates if package rotate in 0.1 degree alf@cadsoft.de + +void picturePackage(UL_PACKAGE P, int ox, int oy) { + real angle, delta = 15; + + P.wires(W) { + if (W.layer == LAYER_TPLACE || W.layer == LAYER_TDOCU || W.layer == LAYER_BPLACE || W.layer == LAYER_BDOCU) { + if (W.arc) { + // process arcs (done with wire segments) + printf(" { L (%d,%d)\n", u2x(W.arc.x1-ox), u2y(W.arc.y1-oy)); + angle = W.arc.angle1 + delta; + while (angle < W.arc.angle2) { + printf(" (%d,%d)\n", + u2x((W.arc.xc-ox+W.arc.radius) * cos(deg2arc(angle))), + u2y((W.arc.yc-oy+W.arc.radius) * sin(deg2arc(angle)))); + angle += delta; + } + + printf(" (%d,%d)\n }\n", u2x(W.arc.x2-ox), u2y(W.arc.y2-oy)); + } + else { + printf(" { Linie (%d,%d) ", u2x(W.x1-ox), u2y(W.y1-oy)); + printf("(%d,%d) }\n", u2x(W.x2-ox), u2y(W.y2-oy)); + } + } + } + P.circles(W) { + if (W.layer == LAYER_TPLACE || W.layer == LAYER_TDOCU || W.layer == LAYER_BPLACE || W.layer == LAYER_BDOCU) { + printf(" { L (%d,%d)\n", u2x(W.x-ox+W.radius), u2y(W.y-oy)); + angle = 0; + while (angle < 360) { + printf(" (%d,%d)\n", u2x((W.x-ox+W.radius) * cos(deg2arc(angle))), u2y((W.y-oy+W.radius) * sin(deg2arc(angle)))); + angle += delta; + } + printf(" (%d,%d)\n }\n", u2x(W.x-ox+W.radius), u2y(W.y-oy)); + } + } + P.rectangles(W) { + if (W.layer == LAYER_TPLACE || W.layer == LAYER_TDOCU || W.layer == LAYER_BPLACE || W.layer == LAYER_BDOCU) { + printf(" { L (%d,%d)\n", u2x(W.x1-ox), u2y(W.y1-oy)); + printf(" (%d,%d)\n", u2x(W.x2-ox), u2y(W.y1-oy)); + printf(" (%d,%d)\n", u2x(W.x2-ox), u2y(W.y2-oy)); + printf(" (%d,%d)\n", u2x(W.x1-ox), u2y(W.y2-oy)); + printf(" (%d,%d)\n }\n", u2x(W.x1-ox), u2y(W.y1-oy)); + } + } + int nr_of_pins = 0; + P.contacts(C) { nr_of_pins++;} + if (nr_of_pins) { + printf(" { PINS %d\n", nr_of_pins); + } + P.contacts(C) { + printf(" (%d,%d) %d\n", u2x(C.x-ox), u2y(C.y-oy), padindex(P, C)); // Pin IDs + } + if (nr_of_pins) { + printf(" }\n"); + } + printf(" { SPECIFIC \"%s\" }\n", validname(P.name)+"_"+validname(P.library)); // PACK.NAME + printf(" }\n"); // end pic n + return; +} + + +////////////////////////////////////////////////////// +void pictures(UL_BOARD B) { + printf ("{ PIC_LIB\n"); + sx=0; + B.elements(E) { + if (E.package) { + new = 1; // padtype not generated yet + for (i = 0; shapename[i]; i++) { + if (shapename[i] == validname(E.package.name)+"_"+validname(E.package.library)) + new = 0; // ident. package exists + } + if (new) { + shapename[sx] = validname(E.package.name)+"_"+validname(E.package.library); + printf(" { PIC %d\n",sx++); // PACKAGE NR + picturePackage(E.package, E.x, E.y); + } + } + } + + printf(" { PIC 999\n"); + printf(" { R (0, 0) }\n"); + printf(" { PINS 1 (0, 0) %d }\n", dummy_pad_code); + printf(" }\n"); + + printf("}\n"); +} + +////////////////////////////////////////////////////// +void nets(UL_BOARD B) { + printf(" { NET_DEF\n"); + B.signals(S) { + if (realnet(S)) { + printf(" { NET %s\n", S.name); + S.wires(W) { + printf(" { W (%d, %d) %d %d (%d %d) %d %d }\n", u2x(W.x1), u2y(W.y1), W.layer, u2u(W.width), u2x(W.x2), u2y(W.y2), W.layer, u2u(W.width)); + } + + S.polygons(P) { + P.contours(W) { + printf(" { W (%d, %d) %d %d (%d %d) %d %d }\n", u2x(W.x1), u2y(W.y1), W.layer, u2u(W.width), u2x(W.x2), u2y(W.y2), W.layer, u2u(W.width)); + } + if (fill_polygons) { + P.fillings(W) { + printf(" { W (%d, %d) %d %d (%d %d) %d %d }\n", u2x(W.x1), u2y(W.y1), W.layer, u2u(W.width), u2x(W.x2), u2y(W.y2), W.layer, u2u(W.width)); + } + } + } + + S.vias(V) { + printf(" { V (%d, %d) %d 1, 15 }\n", u2x(V.x), u2y(V.y), viaindex(V)); + } + printf(" }\n"); + } + } + printf(" }\n"); +} + +////////////////////////////////////////////////////// +void net_comp_count(UL_BOARD B) { + nr_of_nets = 0; + nr_of_comps = 0; + B.signals(S) { + if (realnet(S)) { + nr_of_nets++; + } + } + B.elements(E) { + if (E.package) { + nr_of_comps++; + } + } +} + +////////////////////////////////////////////////////// + +if (board) board(B) { + jobname = filename(filesetext(B.name, "")); + pcbname = filename(filesetext(B.name, "")); + + string fileName = dlgFileSave("Save DIF 4.0 File", filesetext(B.name, ".dif"), "*.dif"); + if (fileName == "") exit(0); + + output(fileName) { + printf("{ JOB %s\n", jobname); + printf(" { PCB %s\n", pcbname); + net_comp_count(B); + create_environment(); + board_data(B); + pad_symbols(B); + pictures(B); + nets(B); + components(B); + printf(" }\n"); + printf("}\n"); + } + } + + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); + } diff --git a/eagle-5.7.0/ulp/dose-pro.ulp b/eagle-5.7.0/ulp/dose-pro.ulp new file mode 100644 index 0000000..ec1403a --- /dev/null +++ b/eagle-5.7.0/ulp/dose-pro.ulp @@ -0,0 +1,187 @@ +#usage "Export data for SMD solder cream dispenser\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* + Mit uval = 0 - 3 kann die Einheit ** der Daten eingestellt werden. + + ** 0: 1/10 mil + ** 1: 1 mil + ** 2: 0.025 mm + ** 3: 0.01 mm + + *06.12.2001 az +*/ + +int uval = 3; + +string Version = "1.0.4"; + +int smdx[], smdy[]; // size of smd +int x[], y[]; // coordinate of SMD +int tb[]; // top or bottom side +int index[]; +int c = 0; // counter + +void header(void) { + switch (uval) { + case 0 : + printf("1/10 mil\n%%\n"); + break; + + case 1 : + printf("1 mil\n%%\n"); + break; + + case 2 : + printf("0.025 mm\n%%\n"); + break; + + case 3 : + printf("0.01 mm\n%%\n"); + break; + } +} + +real value (int v) { + switch (uval) { + case 0 : + return (u2mil(v) * 10); + + case 1 : + return (u2mil(v)); + + case 2 : + return (u2mm(v) * 40); + + case 3 : + return (u2mm(v) * 100); + } +} + +void genfiles(string file) { + sort(c, index, tb, smdx, smdy, x, y); // sortiere top/bottom, groesse, coord. + + int tool = 0; + int ox =0; + int oy =0; + + for (int n = 0; n < c; n++) { + if (smdx[index[n]] == ox && smdy[index[n]] ==oy) { + ; + } + else { // *** change tool # + ox = smdx[index[n]]; + oy = smdy[index[n]]; + tool++; + + printf("T%02d\n", tool); // print tool change in file #1 + + output(filesetext(file, ".plb"), "at") { + printf("T%02d\n", tool); // print tool change in file #2 + } + + output(filesetext(file, ".dod"), "at") { // print in file #3 + printf("T%02d X%06.0f Y%06.0f\t| %06.2f\n", tool, + value(smdx[index[n]]), value(smdy[index[n]]), + u2mm(smdx[index[n]]) * u2mm(smdy[index[n]]) ); + } + } + + if (tb[index[n]]) { + printf("X%06.0fY%06.0f\n", + value(x[index[n]]), value(y[index[n]]) ); + } + else { + output(filesetext(file, ".plb"), "at") { + printf("X%06.0fY%06.0f\n", + value(x[index[n]]), value(y[index[n]]) ); + } + } + } + } + +void trailer(void) { printf("M30\n"); } + +void menue(void) { + dlgDialog("Dose pro") { + dlgLabel (usage); + int align = 1; + dlgHBoxLayout { + dlgGroup("Data resolution") { + dlgRadioButton("1/10 mil", uval); + dlgRadioButton("1 mil", uval); + dlgRadioButton("0.025 mm", uval); + dlgRadioButton("0.01 mm", uval); + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgPushButton("-&Cancel") exit (0); + dlgStretch(1); + } + }; + return; + } + +// main +if (board) { + board(B) { + menue(); + output(filesetext(B.name, ".dod"), "wt") { + printf("This file is generated by %s %s, exported from:\n", filename(argv[0]), Version); + printf("%s at %s;\n", B.name, t2string(time())); + printf("%s;\n\n", EAGLE_SIGNATURE); + } + output(filesetext(B.name, ".plb"), "wt") { + header(); + } + output(filesetext(B.name, ".plt"), "wt") { + header(); + B.elements(E) { + E.package.contacts(C) { + if (C.smd) { + + // collect SMD-Pads + smdx[c] = C.smd.dx; + smdy[c] = C.smd.dy; + x[c] = C.smd.x; + y[c] = C.smd.y; + + if (E.mirror) { + tb[c] = 0; + } + else { + tb[c] = 1; + } + c++; + } + } + } + + output(filesetext(B.name, ".dod"), "at") { + printf("%d SMD-Pads\n\n", c); + header(); + printf("Tool Pad-X Pad-Y Square mm^2\n"); + } + genfiles(B.name); + trailer(); + output(filesetext(B.name, ".plb"), "at") { trailer(); } + } + } +} + +else dlgMessageBox("Start this ULP from a Board!", "OK"); diff --git a/eagle-5.7.0/ulp/drill-aid.ulp b/eagle-5.7.0/ulp/drill-aid.ulp new file mode 100644 index 0000000..8ed937e --- /dev/null +++ b/eagle-5.7.0/ulp/drill-aid.ulp @@ -0,0 +1,75 @@ +#usage "Limit drill diameter of pads, vias and holes for easier manual drilling.\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +real drilcent = 0.3; // center drill diameter + +string cmd = "GRID mm;\nLayer 116 centerDrill;\nchange layer 116;\n"; + +void center(int x, int y, int drill) { + real width = (u2mm(drill) - drilcent) / 2 + 0.05; // overlap 0.05mm 2008-09-01 alf + real radius = width / 2 + (drilcent / 2); + if (radius < (drilcent / 2 + 0.025) ) return; + string h; + sprintf(h, "circle %.3f (%.3f %.3f) (%.3f %.3f) ;\n", + width, + u2mm(x), u2mm(y), u2mm(x) + radius, u2mm(y) ); + cmd += h; + return; +} + +if (board) board(B) { + if (argv[1]) drilcent = strtod(argv[1]); + else { + int Result = dlgDialog("Drill AID V2") { + dlgLabel(usage); + dlgLabel("&Drill center diameter mm"); + dlgHBoxLayout { + dlgRealEdit(drilcent); + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-&Cancel") dlgReject(); + } + }; + if (!Result) exit (0); + } + + B.holes(L) { + center(L.x, L.y, L.drill); + } + B.elements(E) { + E.package.holes(H) { + center(H.x, H.y, H.drill); + } + E.package.contacts(C) { + if (C.pad) { + center(C.pad.x, C.pad.y, C.pad.drill); + } + } + } + B.signals(S) { + S.vias(V) { + center(V.x, V.y, V.drill); + } + } + exit (cmd); +} + +else dlgMessageBox("Start this ULP in a Board!", "OK"); +exit (0); diff --git a/eagle-5.7.0/ulp/drillcfg.ulp b/eagle-5.7.0/ulp/drillcfg.ulp new file mode 100644 index 0000000..119aed5 --- /dev/null +++ b/eagle-5.7.0/ulp/drillcfg.ulp @@ -0,0 +1,118 @@ +#usage "Export drill configuration\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* + * This EAGLE User Language Program generates + * a drill configuration file for the current + * board. + * + * Units can be switched between mm and inch. + */ + +string unitName[] = { "mm", "in" }; +int Unit, unitPrec[] = { 2, 3 }, RoundFactor = pow(10, unitPrec[Unit]), + Result = 0, imax = 0; +real Drilling[]; +string s, fileName, conf = ""; +enum { unitMM, unitINCH}; + + int getunit (void) { + string s; + int Unit = unitMM; // preset unit + Result = dlgDialog("Drill Configuration") { + dlgHBoxLayout { + dlgStretch(0); + dlgGroup("Select unit for output file") { + dlgStretch(0); + dlgGridLayout { + dlgCell(1, 0) dlgRadioButton("&mm", Unit); + dlgCell(2, 0) dlgRadioButton("&inch", Unit); + } + } + dlgStretch(0); + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("-Quit") dlgReject(); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgStretch(1); + }; + RoundFactor = pow(10, unitPrec[Unit]); + return Unit; +} + +void AddDrilling(int Size) +{ + real x; + + switch (Unit) { + case unitMM: x = round(u2mm(Size) * RoundFactor) / RoundFactor; + break; + case unitINCH: x = round(u2inch(Size) * RoundFactor) / RoundFactor; + break; + } + + for (int i = imax; --i >= 0; ) + if (Drilling[i] == x) + return; + Drilling[imax++] = x; +} + +Unit = getunit(); +if (Result == 0) exit(0); +board(B) { + B.holes(H) AddDrilling(H.drill); + B.signals(S) S.vias(V) AddDrilling(V.drill); + B.elements(E) { + E.package.contacts(C) { + if (C.pad) + AddDrilling(C.pad.drill); + } + E.package.holes(H) AddDrilling(H.drill); + } + sort(imax, Drilling); + + for (int i = 0; i < imax; ++i) { + sprintf(s, "T%02d %5.*f%s\n", i + 1, unitPrec[Unit], Drilling[i], unitName[Unit]); + conf += s; + } + + dlgDialog("Edit Drill Configuration") { + dlgVBoxLayout { + dlgLabel("Edit only if you are sure what you do!"); + dlgTextEdit(conf); + dlgPushButton("+Ok") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + + + fileName = dlgFileSave("Save Configuration File", filesetext(B.name, ".drl"), "*.drl"); + if (fileName == "") exit(0); + + output(fileName) { + printf("%s",conf); + } + } diff --git a/eagle-5.7.0/ulp/drillegend.ulp b/eagle-5.7.0/ulp/drillegend.ulp new file mode 100644 index 0000000..4d808a0 --- /dev/null +++ b/eagle-5.7.0/ulp/drillegend.ulp @@ -0,0 +1,1166 @@ +#usage "Drill Legend for Eagle Board.

" + "This ULP add a drill legend in a board in Layer 144 (default).
" + "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.

" + "Author: c.bohrer@m6net.fr>
" + "


" + "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.
" + "support@cadsoft.de" + +/**************************************************** + * DRILEGEND 2.01 for Eagle 4.04 (12/04/2002) * + * By Christian BOHRER (PCB Designer) * + * c.bohrer@m6net.fr * + **************************************************** + + * THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY FOR POSSIBLE DAMAGE */ + +string Version = "2.04"; // 2008-09-04 "_DL.scr" extension lower case +// 2.03 // 2008-07-30 place correct symbol alf@cadsoft.de +// 2.02 // 2005-09-14 Place also the symbols of drills on board. alf@cadsoft.de + + +#require 4.1106; + + /************** DEFAULT SETTINGS ***********************/ + +int Legend = 1; // ** mode for drawing drill-symbol 2005-09-14 ** +int SymbolLayer = 144; +string SymbolLayerName = "DrillLegend"; +string Legend_layer ; sprintf(Legend_layer, "LAYER %d %s;\n", SymbolLayer, SymbolLayerName) ; // ** the layer of drill symbols are drawing 2005-09-14 ** +int SymbolSize = 70; /*Symbol diameter*/ +int SymbolWidth = 4; /*Symbol wire width*/ +int drl_cnt = 0; // drill count for array +int drilSymbol[]; // symbol number of drill +int drillDiam[]; +int drl_x[], drl_y[]; // coordinate of drill ** 2005-09-14 alf@cadsoft.de + +string TextFont[] = {"Vector", "Proportional", "fixed"}; +int TextSize = 70; +int TextRatio = 5; +int IdxFnt = 0; //Vector + +int decMM = 2; /*number of decimal for milimeters*/ +int decMIL = 0; /*number of decimal fol mils*/ +int SortHoles = 1; /* 0= alternate, 1= mixed, 2= non-plated last*/ +string TolPlated = "0.02"; +string TolNonPlated = "0.03"; +int VerticalChart = 1; /* if 0 : Horizontal chart*/ +real HighCellFactor = 1.1; /* 1.0 minimum*/ +real WideCellFactor = 1.1; /* 1.0 minimum*/ +int CellOutline = 4; +int TitleOutline = 4; +int TableOutline = 8; + +string LField[] = {"&Symbols","&Tools N°","&MM","M&ils","Mi&crons","&Quantity","&Plated","Tole&rance"}; +string LTitle[] = {"Sym","N°","MM","Mils","Mic","Qty","Plated","Tol"}; +int LRank[] = {1,2,4,3,0,5,6,0}; //Rank = from 1 to 8. ( 0 = unselect) +string Rank[] = {"0","1","2","3","4","5","6","7","8"}; +string PlatedStatus[] = {"NOT", "BOTH", "YES"}; + +int OutputDrillRack = 0; +string DrillRackFile = "DRILLRACK.DRL"; /* drill rack file name */ +enum { unitMM, unitINCH }; +int Unit = unitMM; /* set this to the desired unit! */ + +int OutputUserCfg = 1; +int InputUserCfg = 1; +string UserCfgFile = "DRILEGEND.CFG"; /* drill legend user config */ +int AbsoluteLibPath = 1; +int i, j, k, Dcnt = 0, Lcnt = 1, nlines, LayerSel; +int index[]; +int Drills[], Pcnt[], Hcnt[], Ptype[], Htype[]; +string ScrName, ProjectPath, UserSettings[], LList[], LayerName[]; +int Lpos[], Cell[], LCell[], Hcell[], Bcell[], LayerNbr[]; + +int EV = EAGLE_VERSION; +int ER = EAGLE_RELEASE; + +string BoardName; +int Bx, By; + +string str_symbols; // place the symbols on board on all drills 2005-09-14 alf@cadsoft.de + +/******* DRILL RACK FOR THE CAM PROCESSOR (DRILLCFG.ULP) *******/ +string unitName[] = { "mm", "in" }; +int unitPrec[] = { 2, 3 }; +int RoundFactor = pow(10, unitPrec[Unit]); +real Drilling[]; +int imax = 0; + + +/**************ADD OR UPDATE DRILL LEGEND***********************/ + +int replace = 0; +int rename = 0; +string lay; +int laycnt = 0; + +board(B) { + int leglaynew = 1; // 2008-07-30 alf@cadsoft.de + BoardName = B.name; + Bx = B.area.x1; + By = B.area.y1; + B.elements(E) { + if(E.name == "DRILEGEND"){ + replace = 1; + leglaynew = 0; + } + } + ScrName = filesetext(B.name, "_DL.scr"); // 2008-09-04 extension lower case + ProjectPath = filedir(B.name); + + B.layers(L) { + if(L.used == 1) { + if (L.number == SymbolLayer) { + Legend_layer = ""; + leglaynew = 0; + } + sprintf(lay,"%d %s", L.number, L.name); + LayerName[laycnt] = lay; + LayerNbr[laycnt] = L.number; + laycnt++; + } + } + if (leglaynew) { + sprintf(lay,"%d %s", SymbolLayer, SymbolLayerName); + LayerName[laycnt] = lay; // 2005-09-14 alf@cadsoft.de + LayerNbr[laycnt] = SymbolLayer; + laycnt++; + } +} + +string LbrPath; +string UlpLbrPath; + +if(AbsoluteLibPath == 1) { + sprintf(LbrPath,"'%sdrilegend.lbr'",ProjectPath); //With '' for path in script command + //Script command dont work without '' if the path contain a space like 'program Files' + sprintf(UlpLbrPath,"%sdrilegend.lbr",ProjectPath); //Without '' for path in fileglob +} +else { + LbrPath = "./drilegend.lbr"; + UlpLbrPath = "./drilegend.lbr"; +} + +string ok[]; +rename = fileglob(ok, UlpLbrPath); //Rename package if lbr exist + +int CreateCfgFile = 0; +string CfgPath; +sprintf(CfgPath,"%s\%s",ProjectPath,UserCfgFile); +string cfg[]; +CreateCfgFile = fileglob(cfg, CfgPath); + +/*********** SAVE USER'S SETTINGS *************************/ + +void OutputUserCfgFile() { + output(CfgPath) { + printf("InputUserCfg = %d\n", InputUserCfg); + printf("SymbolLayer = %d\n", SymbolLayer); + printf("SymbolSize = %d\n", SymbolSize); + printf("SymbolWidth = %d\n", SymbolWidth); + + printf("TextSize = %d\n", TextSize); + printf("TextRatio = %d\n", TextRatio); + printf("IdxFnt = %d\n", IdxFnt); + + printf("decMM = %d\n", decMM); + printf("decMIL = %d\n", decMIL); + printf("SortHoles = %d\n", SortHoles); + printf("TolPlated = %s\n", TolPlated); + printf("TolNonPlated = %s\n", TolNonPlated); + printf("PlatedStatusNot = %s\n", PlatedStatus[0]); + printf("PlatedStatusBoth = %s\n", PlatedStatus[1]); + printf("PlatedStatusYes = %s\n", PlatedStatus[2]); + + printf("VerticalChart = %d\n", VerticalChart); + printf("HighCellFactor = %-.2f\n", HighCellFactor); + printf("WideCellFactor = %-.2f\n", WideCellFactor); + printf("CellOutline = %d\n", CellOutline); + printf("TitleOutline = %d\n", TitleOutline); + printf("TableOutline = %d\n", TableOutline); + + printf("SymbTitle = %s\n", LTitle[0]); + printf("ToolTitle = %s\n", LTitle[1]); + printf("MMTitle = %s\n", LTitle[2]); + printf("MilTitle = %s\n", LTitle[3]); + printf("MicTitle = %s\n", LTitle[4]); + printf("QtyTitle = %s\n", LTitle[5]); + printf("TypeTitle = %s\n", LTitle[6]); + printf("ToleTitle = %s\n", LTitle[7]); + + printf("SymbRank = %d\n", LRank[0]); + printf("ToolRank = %d\n", LRank[1]); + printf("MMRank = %d\n", LRank[2]); + printf("MilRank = %d\n", LRank[3]); + printf("MicRank = %d\n", LRank[4]); + printf("QtyRank = %d\n", LRank[5]); + printf("TypeRank = %d\n", LRank[6]); + printf("ToleRank = %d\n", LRank[7]); + + printf("OutputDrillRack = %d\n", OutputDrillRack); + printf("DrillRackFile = %s\n", DrillRackFile); + printf("Unit = %d\n", Unit); + + printf("OutputUserCfg = %d\n", OutputUserCfg); + printf("UserCfgFile = %s\n", UserCfgFile); + } + return; +} + +/********* LOAD USER'S SETTINGS *********************/ + +string LoadSettings(string var) { +string a[], b; char c = ' '; + for(i = 0; i < nlines; i++){ + b = UserSettings[i]; + if (strsplit(a, b, c) == 3) { + if(var == a[0]) { return a[2]; + } + } + } + return var; +} + +void LoadUserCfgFile() { + InputUserCfg = strtol(LoadSettings("InputUserCfg")); + if(InputUserCfg == 1) { + SymbolLayer = strtol(LoadSettings("SymbolLayer")); + SymbolSize = strtol(LoadSettings("SymbolSize")); + SymbolWidth = strtol(LoadSettings("SymbolWidth")); + + TextSize = strtol(LoadSettings("TextSize")); + TextRatio = strtol(LoadSettings("TextRatio")); + IdxFnt = strtol(LoadSettings("IdxFnt")); + + decMM = strtol(LoadSettings("decMM")); + decMIL = strtol(LoadSettings("decMIL")); + SortHoles = strtol(LoadSettings("SortHoles")); + TolPlated = LoadSettings("TolPlated"); + TolNonPlated = LoadSettings("TolNonPlated"); + PlatedStatus[0] = LoadSettings("PlatedStatusNot"); + PlatedStatus[1] = LoadSettings("PlatedStatusBoth"); + PlatedStatus[2] = LoadSettings("PlatedStatusYes"); + + VerticalChart = strtol(LoadSettings("VerticalChart")); + HighCellFactor = strtod(LoadSettings("HighCellFactor")); + WideCellFactor = strtod(LoadSettings("WideCellFactor")); + CellOutline = strtod(LoadSettings("CellOutline")); + TitleOutline = strtod(LoadSettings("TitleOutline")); + TableOutline = strtod(LoadSettings("TableOutline")); + + LTitle[0] = LoadSettings("SymbTitle"); + LTitle[1] = LoadSettings("ToolTitle"); + LTitle[2] = LoadSettings("MMTitle"); + LTitle[3] = LoadSettings("MilTitle"); + LTitle[4] = LoadSettings("MicTitle"); + LTitle[5] = LoadSettings("QtyTitle"); + LTitle[6] = LoadSettings("TypeTitle"); + LTitle[7] = LoadSettings("ToleTitle"); + + LRank[0] = strtol(LoadSettings("SymbRank")); + LRank[1] = strtol(LoadSettings("ToolRank")); + LRank[2] = strtol(LoadSettings("MMRank")); + LRank[3] = strtol(LoadSettings("MilRank")); + LRank[4] = strtol(LoadSettings("MicRank")); + LRank[5] = strtol(LoadSettings("QtyRank")); + LRank[6] = strtol(LoadSettings("TypeRank")); + LRank[7] = strtol(LoadSettings("ToleRank")); + + OutputDrillRack = strtol(LoadSettings("OutputDrillRack")); + DrillRackFile = LoadSettings("DrillRackFile"); + Unit = strtol(LoadSettings("Unit")); + + OutputUserCfg = strtol(LoadSettings("OutputUserCfg")); + UserCfgFile = LoadSettings("UserCfgFile"); + } + return; +} + + +if(CreateCfgFile == 0) { OutputUserCfgFile(); } +if(CreateCfgFile == 1) { + nlines = fileread(UserSettings, CfgPath); + LoadUserCfgFile(); +} + + +/****************** HELP *************************/ + + string HelpLegend = "

Legend


Drill legend Settings" + + "

" + + "" + + ""+ + "" + + "
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.

" + + "

Drill legend Orientation

"+ + "" + + ""+ + "" + + "
Horizontal
Choose this option for horizontal drill legend.
Vertical
Choose this option for vertical drill legend.
"; + + string HelpSymbols = "

Symbols


Symbols Settings

" + + "" + + "" + + "" + + "" + + "" + + "
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).

" + + "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."; + + string HelpTexts = "

Texts


Texts Settings

" + + "" + + "" + + "" + + "" + + "
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 %).

" + + "Nota: For printer output choose the font what you want but " + + "for gerber output keep VECTOR."; + + string HelpTable = "

Table


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.

" + + "" + + "" + + "" + + "
Horizontal
Horizontal space between texts and border cells.
Vertical
Vertical space between texts and border cells.

" + + "Outline Width

" + + "" + + "" + + "" + + "" + + "
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).
"; + + string HelpHoles = "

Holes


Non-Plated

" + + "All holes diameters (plated or not plated) are sorted in ascending mode.

" + + "" + + "" + + "" + + "" + + "" + + "
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.

" + + "Plated Status

" + + "" + + "" + + "" + + "" + + "" + + "
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\".

" + + "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." + + "" + + "" + + "
Mils
Unit of precision for mils.
MM
Unit of precision for millimeters.

Holes Tolerance

" + + "" + + "" + + "" + + "
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.

" + + "Nota: Tolerance field is String type, so you can enter anything like: 0,02 or +/- 0.03"; + + string HelpOutputs = "

Outputs


Drill Rack File for CAM Processor

" + + "" + + "
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.
"; + + +/******** ARRAY OF EAGLE DRILL SYMBOLS ********/ +// Y +// 4 + + + + + +// 3 + + + + + +// 2 + + + + + +// 1 + + + + + +// 0 + + + + + +// 0 1 2 3 4 X + +string Symbol[] = { + "W 24 20,W 02 42", // 1 + "W 04 40,W 44 00", // 2 + "W 22 24 44 40 00 04 24", // 3 + "W 22 24 42 20 02 24", // 4 + "W 04 44 00 40 04", // 5 + "W 04 40 44 00 04", // 6 + "W 02 42 24 20 02", // 7 + "W 24 20 42 02 24", // 8 + "W 04 40,W 44 00,W 24 20", // 9 + "W 04 40,W 44 00,W 02 42", // 10 + "W 04 44 22 04,W 22 20", // 11 + "W 24 22 40 00 22", // 12 + "W 02 22 44 40 22", // 13 + "W 42 22 04 00 22", // 14 + "W 24 20,W 02 42,C 22 42", // 15 + "C 22 42,C 22 32,W 24 20,W 02 42", // 16 + "W 04 24 44 42 40 20 00 02 04,W 24 20,W 02 42", // 17 + "W 04 02 00 20 40 42 44 24 04,W 13 11 31 33 13,W 24 20,W 02 42", // 18 + + "W 02 24,W 24 42,W 42 02,W 22 20", // 19 new 2005-09-14 + "W 00 22,W 22 40,W 02 24,W 24 42", // 20 + "C 33 34,C 11 12", // 21 + "C 33 34,W 00 20,W 20 22,W 22 02,W 02 00", // 22 + "C 22 24,W 00 40,W 40 44,W 44 04,W 04 00", // 23 + "C 22 24,W 02 24,W 24 42", // 24 + "C 22 24,W 24 42,W 42 20", // 25 + "C 22 24,W 42 20,W 20 02", // 26 + "C 22 24,W 20 02,W 02 24", // 27 + "C 22 24,C 13 23", // 28 + "C 22 24,C 23 33", // 29 + "C 22 24,C 33 43", // 30 + "C 22 24,C 32 42", // 31 + "C 22 24,C 31 41", // 32 + "C 22 24,C 21 31", // 33 + "C 22 24,C 11 21", // 34 + "C 22 24,C 12 22", // 35 + "C 12 22,W 44 22,W22 40", // 36 + "C 23 33,W 40 22,W22 00", // 37 + "C 32 42,W 00 22,W22 04", // 38 + "C 21 32,W 44 22,W22 44", // 39 + + "C 22 42,W 00 44", // default ** + "" + }; + +string DrawSymbol(int No, int Xs, int Ys, int Mode) { + Xs = Xs - (SymbolSize/2); + Ys = Ys - (SymbolSize/2); + string a[], c[], tmps, cmd, hs; + int b = 0, d = 0, U = SymbolSize/4, sx, sy, m, p; + sprintf(tmps, "# place Symbol Nb: %d;\n", No); + if (Symbol[No]) { // check if Symbol string defined + b = strsplit(a, Symbol[No], ','); + for(m=0; m SymbolSize*0.7) { haut = TextSize * 1.5 * HighCellFactor;} + else { haut = SymbolSize * HighCellFactor;} + int org = (haut - TextSize)/2, WideMax = 0; + + for(int i = 0; i < Lcnt; ++i) { + + for(k = 0; k < 8; k++){ + if(LRank[k] > 0) { + if((k == 0) && (i > 0)) { + printf(DrawSymbol(strtol(LList[i]), Lpos[LRank[k]]+(LCell[k]/2), bas +(haut/2), Legend)); + } + else { + printf("Text '%s' R0 (%d %d);\n", LList[(k*100)+i], + CenterText(LList[(k*100)+i], LCell[k], Lpos[LRank[k]]), bas + org); + } + printCell(Lpos[LRank[k]], Lpos[LRank[k]] + LCell[k], haut, bas, CellOutline); + if(i == 0) { WideMax = WideMax + LCell[k];} + } + } + + bas = bas - haut; + } + printCell(0, WideMax, haut, 0, TitleOutline); + printCell(WideMax, 0, 0, haut, TitleOutline); + printCell(0, WideMax, haut, bas + haut, TableOutline); + printCell(WideMax, 0, bas + haut, haut, TableOutline); + return; +} + + +void DrillChartHorizontal(int gauche) { + int bas, org, WideMax = 0; + + for(int i = 0; i < Lcnt; ++i) { + + for(k = 0; k < 8; k++){ //k = 8 Fields + if(LRank[k] > 0) { + + bas = Bcell[LRank[k]]; + if(Cell[i] < Hcell[0]) { Cell[i] = SymbolSize * 1.3 * WideCellFactor;} + org = (Hcell[k] - TextSize)/2; + if(bas < WideMax) { WideMax = bas;} + if((k == 0) && (i > 0)) { // if symbol field but not title field + printf(DrawSymbol(strtol(LList[i]),gauche+(Cell[i]/2), bas +(Hcell[k]/2), Legend)); + printCell(gauche, gauche + Cell[i], bas + Hcell[k], bas, CellOutline); + } + + else { + printf("Text '%s' R0 (%d %d);\n", LList[(k*100)+i], + CenterText(LList[(k*100)+i], Cell[i], gauche), bas + org); + printCell(gauche, gauche + Cell[i], bas + Hcell[k], bas, CellOutline); + } + } + } + + gauche = gauche + Cell[i]; + + printCell(0, Cell[0], 0, WideMax, TitleOutline); + printCell( Cell[0], 0, WideMax, 0, TitleOutline); + + } + printCell(0, gauche, 0, WideMax, TableOutline); + printCell(gauche, 0, WideMax, 0, TableOutline); +} + + +void defHigh() { // for horizontal table + if(TextSize > SymbolSize) { Hcell[0] = TextSize * 1.5 * HighCellFactor;} + else { Hcell[0] = SymbolSize * 1.5 * HighCellFactor;} + for(i = 1; i < 8; i++) { + Hcell[i] = TextSize * 1.5 * HighCellFactor; + } + + int tmp[]; + for(i = 0; i < 8; i++) { + tmp[LRank[i]] = Hcell[i]; + } + + for(i = 1; i < 9; i++) { + Bcell[i] = Bcell[i-1] - tmp[i]; + } +} + + +void defPos() { //for vertical table + if(LCell[0] < SymbolSize*1.2) { LCell[0] = SymbolSize * 1.2 * WideCellFactor;} + int tmp[]; + for(i = 0; i < 8; i++) { + tmp[LRank[i]] = LCell[i]; + } + + for(i = 1; i < 8; i++) { + Lpos[i+1] = Lpos[i] + tmp[i]; + } +} + + +int CellLarge(string txt, int old) { + int new = (round((TextSize * 0.1 * WideCellFactor)*strlen(txt)))*10; + if( new > old) {return new;} + else { return old;} +} + +void TitleList() { + for(i=0;i<8;i++){ + LList[i*100] = LTitle[i]; + LCell[i] = CellLarge(LList[i*100], LCell[i]); + Cell[0] = CellLarge(LList[i*100], Cell[0]); + } +} + + +void List(int No, int Diam, int Qty, int Type, int cnt, string Tol) { + sprintf(LList[cnt], "%d",No); + sprintf(LList[100+cnt], "%d",No + 1); + if(decMM == 0) {sprintf( LList[200+cnt], "%-.0f", round(Diam/1000)/10 );} + if(decMM == 1) {sprintf( LList[200+cnt], "%-.1f", round(Diam/100)/100 );} + if(decMM == 2) {sprintf( LList[200+cnt], "%-.2f", round(Diam/10)/1000 );} + if(decMM == 3) {sprintf( LList[200+cnt], "%-.3f", round(Diam)/10000 );} + if(decMIL == 0) {sprintf(LList[300+cnt], "%-.0f", round((Diam/25.4)/10));} + if(decMIL == 1) {sprintf(LList[300+cnt], "%-.1f", round(Diam/25.4)/10 );} + if(decMIL == 2) {sprintf(LList[300+cnt], "%-.2f", round(Diam/2.54)/100 );} + if(decMIL == 3) {sprintf(LList[300+cnt], "%-.3f", round(Diam/0.254)/1000 );} + sprintf( LList[400+cnt], "%-.0f", round(Diam/10) ); + sprintf( LList[500+cnt], "%d", Qty); + sprintf( LList[600+cnt], "%s", PlatedStatus[Type]); + sprintf( LList[700+cnt], "%s", Tol); + + for(k=1;k<8;k++){ + LCell[k] = CellLarge(LList[(k*100)+cnt], LCell[k]); //Vertical table + if(LRank[k] > 0) {Cell[cnt] = CellLarge(LList[(k*100)+cnt], Cell[cnt]); } //Horizontal table + } + return; +} + + +int DrillsCapture(int Size, int Plated) { + for(i = 0; i < Dcnt; i++) { + if(Drills[i] == Size) { + if(Plated == 1) { + Ptype[i] = 1; + Pcnt[i]++; + return i; + } + if(Plated == 0) { + Htype[i] = 0; + Hcnt[i]++; + return i; + } + } + } + + Drills[Dcnt] = Size; + Htype[Dcnt] = 1; + + if(Plated == 1) { + Ptype[Dcnt] = 1; + Pcnt[Dcnt]++; + } + if(Plated == 0) { + Htype[Dcnt] = 0; + Hcnt[Dcnt]++; + } + Dcnt++; + return i; // 2008-07-30 +} + + + +void SortHolesMode(int Mode) { + if(Mode == 0) { //ALTERNATE + for( i = 0; i < Dcnt; i++) { + if(Ptype[index[i]] == 1) { + List(i, Drills[index[i]], Pcnt[index[i]], Ptype[index[i]] + 1, Lcnt, TolPlated); + Lcnt++; + } + if(Htype[index[i]] == 0) { + List(i, Drills[index[i]], Hcnt[index[i]], Htype[index[i]] + 0, Lcnt, TolNonPlated); + Lcnt++; + } + } + } + + if(Mode == 1) { //MIXED + string tol; + for( i = 0; i < Dcnt; i++) { + if(Ptype[index[i]] + Htype[index[i]] == 0) {tol = TolNonPlated;} + else {tol = TolPlated;} + List(i, Drills[index[i]], Pcnt[index[i]] + Hcnt[index[i]], Ptype[index[i]] + Htype[index[i]], Lcnt, tol); + Lcnt++; + } + } + if(Mode == 2) { //AT END + for( i = 0; i < Dcnt; i++) { + if(Ptype[index[i]] == 1) { + List(i, Drills[index[i]], Pcnt[index[i]], Ptype[index[i]] + 1, Lcnt, TolPlated); + Lcnt++; + } + } + for( i = 0; i < Dcnt; i++) { + if(Htype[index[i]] == 0) { + List(i, Drills[index[i]], Hcnt[index[i]], Htype[index[i]] + 0, Lcnt, TolNonPlated); + Lcnt++; + } + } + } +} + + +void AddDrilling(int Size) { + real x; + switch (Unit) { + case unitMM: x = round(u2mm(Size) * RoundFactor) / RoundFactor; + break; + case unitINCH: x = round(u2inch(Size) * RoundFactor) / RoundFactor; + break; + } + for (int i = imax; --i >= 0; ) + if (Drilling[i] == x) + return; + Drilling[imax++] = x; +} + + +void OutDrillRack() { + board(B) { + B.holes(H) AddDrilling(H.drill); + B.signals(S) S.vias(V) AddDrilling(V.drill); + B.elements(E) { + E.package.contacts(C) { + if (C.pad) + AddDrilling(C.pad.drill); + } + E.package.holes(H) AddDrilling(H.drill); + } + sort(imax, Drilling); + output(DrillRackFile) { + for (int i = 0; i < imax; ++i) + printf("T%02d %5.*f%s\n", i + 1, unitPrec[Unit], Drilling[i], unitName[Unit]); + } + } +} + + +void OutDriLegend() { + output(ScrName) { + printf("OPEN %s;\n",LbrPath); + int ttime = time(); + string ftime; + sprintf(ftime,"%d",ttime); + string tfile = strsub(ftime, 2, 9); + + if(rename == 1) { + printf("Rename drilegend.pac dl%s.pac\n",tfile); + } + printf("Edit drilegend.pac\n"); + if (Legend_layer) printf("%s", Legend_layer); // is legend-layer defined? 2005-09-14 alf@cadsoft.de + printf("Display none;\n"); + printf("Display %d;\n", SymbolLayer); + printf("Set Wire_Bend 2;\n"); + printf("Grid mil 25 1 mil;\n"); + + for(j = 0; j < laycnt; j++) { + printf("Layer %s;\n",LayerName[j]); + } + printf("Change layer %d;\n", SymbolLayer); + printf("Change Size %d;\n", TextSize); + printf("Change Ratio %d;\n", TextRatio); + printf("Change Font %s;\n", TextFont[IdxFnt]); + printf("MARK;\n"); // *** clear MARK 2005-09-14 alf@cadsoft.de *** + + if(VerticalChart == 1) { + defPos(); + DrillChartVertical(0); + } + if(VerticalChart == 0) { + defHigh(); + DrillChartHorizontal(0); + } + + printf("WRITE %s;\n",LbrPath); + printf("CLOSE;\n"); + printf("EDIT '%s';\n", BoardName); // use always ' ' for 'path/name' 2005-09-14 alf@cadsoft.de + + if (Legend_layer) printf("%s", Legend_layer); // is legend-layer defined? 2005-09-14 alf@cadsoft.de + printf("DISPLAY 23 44 45 %d;\n",SymbolLayer); + printf("GRID MIL 25 1 ;\n"); + printf("SET WIRE_BEND 2;\n"); + printf("USE %s\n",LbrPath); + + if (replace == 0) { + printf("ADD 'DRILEGEND' DRILEGEND R0 (%.3f %.3f);\n", u2mil(Bx), u2mil(By)-150 ); + printf("%s", str_symbols); + } + if (replace == 1) { + printf("UPDATE %s;\n",LbrPath); + } + printf("DISPLAY -23 -44 -45;\n"); // 2008-07-30 + printf("WIN FIT;\n"); + printf("GRID LAST;\n"); + } +} + + +void infoHelp( string info, string help, int b, int h) { + int Result = dlgDialog(info) { + dlgHBoxLayout dlgSpacing(b); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(h); + dlgTextView(help); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+Ok") dlgAccept(); + dlgStretch(1); + } + }; + return; +} + + +/********************DIALOG***************************/ +void menu(void) { + int Result = dlgDialog("DRILL LEGEND") { + dlgHBoxLayout { + dlgTabWidget { + dlgTabPage("&Legend") { + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1, 0, 5) dlgGroup("Drill Legend Settings") { + dlgGridLayout { + + dlgCell(0, 0) dlgLabel("Field"); + dlgCell(0, 1) dlgStretch(0); + dlgCell(0, 2) dlgLabel("Title"); + dlgCell(0, 3) dlgStretch(0); + dlgCell(0, 4) dlgLabel("Rank"); + + + dlgCell(1, 0) dlgLabel(LField[0]); + dlgCell(1, 2) dlgStringEdit(LTitle[0]); + int SymbSel = LRank[0]; + dlgCell(1, 4) dlgComboBox(Rank, SymbSel) LRank[0] = strtol(Rank[SymbSel]); + + dlgCell(2, 0) dlgLabel(LField[1]); + dlgCell(2, 2) dlgStringEdit(LTitle[1]); + int ToolSel = LRank[1]; + dlgCell(2, 4) dlgComboBox(Rank, ToolSel) LRank[1] = strtol(Rank[ToolSel]); + + dlgCell(3, 0) dlgLabel(LField[2]); + dlgCell(3, 2) dlgStringEdit(LTitle[2]); + int MMSel = LRank[2]; + dlgCell(3, 4) dlgComboBox(Rank, MMSel) LRank[2] = strtol(Rank[MMSel]); + + dlgCell(4, 0) dlgLabel(LField[3]); + dlgCell(4, 2) dlgStringEdit(LTitle[3]); + int MilSel = LRank[3]; + dlgCell(4, 4) dlgComboBox(Rank, MilSel) LRank[3] = strtol(Rank[MilSel]); + + dlgCell(5, 0) dlgLabel(LField[4]); + dlgCell(5, 2) dlgStringEdit(LTitle[4]); + int MicSel = LRank[4]; + dlgCell(5, 4) dlgComboBox(Rank, MicSel) LRank[4] = strtol(Rank[MicSel]); + + dlgCell(6, 0) dlgLabel(LField[5]); + dlgCell(6, 2) dlgStringEdit(LTitle[5]); + int QtySel = LRank[5]; + dlgCell(6, 4) dlgComboBox(Rank, QtySel) LRank[5] = strtol(Rank[QtySel]); + + dlgCell(7, 0) dlgLabel(LField[6]); + dlgCell(7, 2) dlgStringEdit(LTitle[6]); + int TypeSel = LRank[6]; + dlgCell(7, 4) dlgComboBox(Rank, TypeSel) LRank[6] = strtol(Rank[TypeSel]); + + dlgCell(8, 0) dlgLabel(LField[7]); + dlgCell(8, 2) dlgStringEdit(LTitle[7]); + int ToleSel = LRank[7]; + dlgCell(8, 4) dlgComboBox(Rank, ToleSel) LRank[7] = strtol(Rank[ToleSel]); + + } + } + dlgCell(0, 6) dlgSpacing(20); + dlgCell(1, 0) dlgLabel(""); + dlgCell(2, 1, 2, 3) dlgGroup("Drill Legend Orientation") { + dlgGridLayout { + dlgCell(0, 0) dlgRadioButton("Hori&zontal", VerticalChart); + dlgCell(0, 1) dlgLabel(" "); + dlgCell(0, 2) dlgRadioButton("&Vertical", VerticalChart); + } + } + dlgCell(2, 5) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpLegend, 400, 400); + } + dlgSpacing(20); + } + + dlgTabPage("&Holes") { + string dec[] = {"0","1","2","3"}; + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1) dlgGroup("Non-Plated") { + dlgRadioButton("Alte&rnate ", SortHoles); + dlgRadioButton("Mix&ed", SortHoles); + dlgRadioButton("La&st", SortHoles); + } + dlgCell(0, 2) dlgSpacing(10); + + dlgCell(0, 3, 0, 6) dlgGroup("Plated Status") { + dlgGridLayout { + dlgCell(0, 0) dlgLabel("&Not Plated "); + dlgCell(0, 1) dlgStringEdit(PlatedStatus[0]); + dlgCell(1, 0) dlgLabel("Mixe&d"); + dlgCell(1, 1) dlgStringEdit(PlatedStatus[1]); + dlgCell(2, 0) dlgLabel("&Plated"); + dlgCell(2, 1) dlgStringEdit(PlatedStatus[2]); + } + } + dlgCell(0, 7) dlgSpacing(20); + dlgCell(1, 1) dlgLabel(""); + + dlgCell(2, 1) dlgGroup("Unit Precision") { + dlgGridLayout { + dlgCell(0, 0) dlgLabel("M&ils "); + dlgCell(0, 1) dlgComboBox(dec, decMIL); + dlgCell(1, 0) dlgLabel("&MM"); + dlgCell(1, 1) dlgComboBox(dec, decMM); + } + } + + dlgCell(2, 3, 2, 6) dlgGroup("Holes Tolerance") { + dlgGridLayout { + dlgCell(0, 0) dlgLabel("Pl&ated "); + dlgCell(0, 1) dlgStringEdit(TolPlated); + dlgCell(1, 0) dlgLabel("Non-Pla&ted "); + dlgCell(1, 1) dlgStringEdit(TolNonPlated); + } + } + dlgCell(3, 1) dlgStretch(0); + + dlgCell(4, 6) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpHoles, 800, 600); + } + dlgSpacing(20); + } + + + dlgTabPage("S&ymbols") { + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1, 0, 4) dlgGroup("Symbol Settings") { + dlgLabel(""); + dlgGridLayout { + dlgCell(0, 0) dlgLabel("L&ayer "); + dlgCell(0, 1, 0, 2) dlgComboBox(LayerName, LayerSel) SymbolLayer = LayerNbr[LayerSel]; + + dlgCell(0, 3) dlgStretch(0); + dlgCell(1, 0) dlgLabel(""); + dlgCell(2, 0) dlgLabel("&Size "); + dlgCell(2, 1) dlgSpinBox(SymbolSize, 1, 500); + dlgCell(2, 2) dlgLabel(" mils"); + dlgCell(2, 3) dlgStretch(0); + dlgCell(3, 0) dlgLabel(""); + dlgCell(4, 0) dlgLabel("&Width "); + dlgCell(4, 1) dlgSpinBox(SymbolWidth, 0, 20); + dlgCell(4, 2) dlgLabel(" mils"); + dlgCell(4, 3) dlgSpacing(100); + } + dlgLabel(""); + } + dlgCell(0, 5) dlgSpacing(20); + dlgCell(1, 1) dlgStretch(0); + dlgCell(2, 4) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpSymbols, 720, 400); + } + dlgSpacing(20); + } + + dlgTabPage("Te&xts") { + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1, 0, 4) dlgGroup("Texts Settings") { + dlgLabel(""); + dlgGridLayout { + int TfontSel = IdxFnt; + dlgCell(0, 0) dlgLabel("&Font "); + dlgCell(0, 1, 0, 3) dlgComboBox(TextFont, TfontSel) IdxFnt = TfontSel; + dlgCell(0, 4) dlgLabel("\t\t "); + dlgCell(1, 0) dlgLabel(""); + dlgCell(2, 0) dlgLabel("&Size "); + dlgCell(2, 1) dlgSpinBox(TextSize, 1, 500); + dlgCell(2, 2) dlgLabel(" mils\t "); + dlgCell(3, 0) dlgLabel(""); + dlgCell(4, 0) dlgLabel("&Ratio "); + dlgCell(4, 1) dlgSpinBox(TextRatio, 0, 20); + dlgCell(4, 2) dlgLabel(" %"); + } + dlgLabel(""); + } + dlgCell(0, 5) dlgSpacing(20); + dlgCell(1, 1) dlgStretch(0); + dlgCell(2, 4) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpTexts, 500, 300); + } + dlgSpacing(20); + } + + dlgTabPage("Ta&ble") { + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1, 0, 4) dlgGroup("Cell Margin Factor") { + dlgGridLayout { + dlgCell(0, 0) dlgLabel("Hori&zontal "); + dlgCell(0, 1) dlgRealEdit(WideCellFactor, 1.0, 5.0); + dlgCell(0, 2) dlgLabel("\t\t "); + dlgCell(0, 3) dlgStretch(0); + dlgCell(2, 0) dlgLabel("&Vertical "); + dlgCell(2, 1) dlgRealEdit(HighCellFactor, 1.0, 5.0); + } + } + dlgCell(0, 5) dlgSpacing(20); + dlgCell(1, 1) dlgLabel(" "); + dlgCell(2, 1, 2, 4) dlgGroup("Outline Width") { + dlgGridLayout { + dlgCell(0, 0) dlgLabel("&Cell "); + dlgCell(0, 1) dlgSpinBox(CellOutline, 1, 50); + dlgCell(0, 2) dlgLabel(" mils\t\t"); + dlgCell(0, 3) dlgStretch(0); + dlgCell(1, 0) dlgLabel("T&itle "); + dlgCell(1, 1) dlgSpinBox(TitleOutline, 1, 50); + dlgCell(1, 2) dlgLabel(" mils"); + dlgCell(2, 0) dlgLabel("T&able "); + dlgCell(2, 1) dlgSpinBox(TableOutline, 1, 50); + dlgCell(2, 2) dlgLabel(" mils"); + } + } + + dlgCell(3, 1) dlgStretch(0); + dlgCell(4, 4) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpTable, 600, 450); + } + dlgSpacing(20); + } + + + dlgTabPage("&Files") { + dlgSpacing(20); + dlgGridLayout { + dlgCell(0, 0) dlgSpacing(20); + dlgCell(0, 1, 0, 4) dlgGroup("Drill Rack File for CAM Processor") { + dlgGridLayout { + dlgCell(0, 0) dlgCheckBox("&Generating ", OutputDrillRack); + dlgCell(0, 1) dlgLabel("&Rack file "); + dlgCell(0, 2) dlgStringEdit(DrillRackFile); + int unit = Unit; + dlgCell(1, 0) dlgRadioButton("Unit &MM", unit) Unit = unitMM; + dlgCell(2, 0) dlgRadioButton("Unit &Inch", unit) Unit = unitINCH; + } + } + dlgCell(0, 5) dlgSpacing(20); + + + + dlgCell(2, 1, 2, 4) dlgGroup("Drill Legend User Settings") { + dlgGridLayout { + dlgCell(0, 0) dlgCheckBox("&Save File ", OutputUserCfg); + dlgCell(1, 0) dlgCheckBox("Lo&ad File ", InputUserCfg); + dlgCell(0, 1) dlgSpacing(30); + dlgCell(0, 2) dlgLabel(UserCfgFile); + } + } + dlgCell(2, 5) dlgSpacing(20); + dlgCell(3, 1) dlgStretch(0); + dlgCell(4, 4) dlgPushButton("Help") infoHelp("Drill Legend Help", HelpOutputs, 400, 200); + } + dlgSpacing(20); + } + } + dlgSpacing(8); + dlgVBoxLayout { + dlgLabel(usage); + dlgStretch(1); + } + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") { + dlgAccept(); + if(OutputUserCfg == 1) { OutputUserCfgFile(); } + if(OutputDrillRack == 1) {OutDrillRack(); } + TitleList(); + SortHolesMode(SortHoles); + OutDriLegend(); + exit("; SCR '" + ScrName + "';\n"); + } + + dlgStretch(0); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgLabel("Version "+Version); + } + }; +} + + + + +/*** ************* Main ************* ***/ +board(B) { + drl_cnt = 0; + B.holes(H) { + drilSymbol[drl_cnt] = DrillsCapture(H.drill, 0); + drillDiam[drl_cnt] = H.drill; + drl_x[drl_cnt] = H.x; drl_y[drl_cnt] = H.y; + drl_cnt++; + } + B.signals(S) { + S.vias(V) { + drilSymbol[drl_cnt] = DrillsCapture(V.drill, 1); + drillDiam[drl_cnt] = V.drill; + drl_x[drl_cnt] = V.x; drl_y[drl_cnt] = V.y; + drl_cnt++; + } + } + B.elements(E) { + E.package.contacts(C) { + if (C.pad) { + drilSymbol[drl_cnt] = DrillsCapture(C.pad.drill, 1); + drillDiam[drl_cnt] = C.pad.drill; + drl_x[drl_cnt] = C.pad.x; drl_y[drl_cnt] = C.pad.y; + drl_cnt++; + } + } + E.package.holes(H) { + drilSymbol[drl_cnt] = DrillsCapture(H.drill, 0); + drillDiam[drl_cnt] = H.drill; + drl_x[drl_cnt] = H.x; drl_y[drl_cnt] = H.y; + drl_cnt++; + } + } +} + +sort(Dcnt, index, Drills); // sortiere die Drills-Liste +string s; +sprintf(s, "%d Drills sortiert", Dcnt); + +if (Legend_layer) { + str_symbols = Legend_layer; + sprintf(s, "CHANGE LAYER %d;\n", SymbolLayer); // change Layer for drawing symbols 2005-09-14 alf@cadsoft.de + str_symbols += s; +} +else { + sprintf(s, "CHANGE LAYER 144;\n"); // change Layer for drawing symbols 2005-09-14 alf@cadsoft.de + str_symbols += s; +} + +for (int n = 0; n < drl_cnt; n++) { + sprintf(s, "MARK (%.4f %.4f);\n", u2mil(drl_x[n]), u2mil(drl_y[n]) ); + str_symbols += s; + str_symbols += DrawSymbol(getDrill(drillDiam[n]), 0, 0, 0); // 2008-07-30 alf +} + +/*******OUTPUT DRILL LEGEND FILE****************/ + +for(j = 0; j < laycnt; j++) { + if(LayerNbr[j] == SymbolLayer) LayerSel = j; +} + +menu(); diff --git a/eagle-5.7.0/ulp/dxf.ulp b/eagle-5.7.0/ulp/dxf.ulp new file mode 100644 index 0000000..1110da9 --- /dev/null +++ b/eagle-5.7.0/ulp/dxf.ulp @@ -0,0 +1,1527 @@ +#require 4.5702 + +#usage "en: Export DXF data\n" + "

" + "Converts a board or schematic into a DXF file." + "

" + "Usage: RUN dxf [ -s suffix ] [ -u mm|inch ] [ -a ] [ -w ] [ -f ]" + "

" + "Options:
" + "" + "" + "" + "" + "" + "" + "
-s suffixdefine 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
" + "Example:" + "

" + "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
" + "
" + "Der DXF-Standard
" + "By Dietmar Rudolph
" + "Publisher: Dr. L. Rossipaul Verlagsgesellschaft m.b.H.
" + "München, 1993
" + "ISBN 3-87686-246-9" + "
" + "Author: support@cadsoft.de", + "de: DXF Daten exportieren\n" + "

" + "Konvertiert ein Board oder einen Schaltplan in eine DXF-Datei." + "

" + "Aufruf: RUN dxf [ -s suffix ] [ -u mm|inch ] [ -a ] [ -w ] [ -f ]" + "

" + "Optionen:
" + "" + "" + "" + "" + "" + "" + "
-s suffixdefiniert 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
" + "Beispiel:" + "

" + "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
" + "
" + "Der DXF-Standard
" + "Von Dietmar Rudolph
" + "Herausgeber: Dr. L. Rossipaul Verlagsgesellschaft m.b.H.
" + "München, 1993
" + "ISBN 3-87686-246-9" + "
" + "Autor: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string I18N[] = { + "en\v" + "de\v" + , + "Can't fill polygon with Width = 0\v" + "Polygon mit Width = 0 kann nicht gefüllt werden\v" + , + "+OK\v" + "+OK\v" + , + "-Cancel\v" + "-Abbrechen\v" + , + "


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!

\nThis program can only work in the board or schematic editor.\v" + "


FEHLER: Kein Board oder Schaltplan!

\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("


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!

\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:
" + "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.

" + "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.
" + "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.

" + "Das ULP kann auch in einer Bibliothek im Device-Editor zum einfachen " + "erstellen und bearbeiten von lokalen Attributen verwendet werden.

" + "Benutzung des ULP:
" + "RUN e-attributverwaltung [+L | -L]
" + "" + "Option +L setzt die Attribute aus einer definierbaren Liste im Deviceset (direkt ohne nachfragen)
" + "Option -L löscht die Attribute aus einer definierbaren Liste im Deviceset (direkt ohne nachfragen)
" + "
" + "support@cadsoft.de" + + +string Version = "Version 2.1.0"; // 1.0.0 - 2008-04-17 support@cadsoft.de + +// 2.0.0 | 2008-11-07 - Globale Attribute von SCH -> BRD oder BRD -> SCH übertragen +// bzw. zwischen SCH und BRD angleichen. +// Technologien und Package-Varianten werden berücksichtigt +// 2.0.1 | 2009-11-27 - Menü-Button mit ALT-Option +// +// 2.1.0 | 2009-12-17 - Es kann eine Liste von Attribute-Namen verwaltet werden, +// um in Devices in der Bibliothek diese Attribute zu definieren. +// Option +L setzt die Attribute aus der Liste ohne nachfragen +// Option -L löscht die Attribute aus der Liste ohne nachfragen +// + + +string cmd, s; +string Pname[], Psheet[]; +int cntP = 0; +int cntA = 0; +string AttribPart[]; +string AttribWert[]; +string ListAttrib[]; +string Platzhalter[]; +string LPlatzhalter[]; +string variant[]; +string techno[]; + + +string setze[] = { "nicht ändern", "ja", "löschen" }; +enum { nein, ja, loeschen } +string Edit[] = { "Device", "Part", "Element" }; +enum { Device, Part, Element }; +string aType[] = { "Lokale", "Globale" }; +enum { Lokal, Global }; +enum { neu, bearbeiten }; + +// 2008-09-02 +enum { DEVeditor, SCHeditor, BRDeditor }; +int isBoard = 0; +int isSchematic = 0; +string Ename[]; +int cntE = 0; +int cntEA = 0; +string AttribElement[]; +string EAttribWert[]; +string EListAttrib[]; +string EPlatzhalter[]; + +string sch_attributte[], brd_attributte[]; +string sch_attributteValue[], brd_attributteValue[]; +int cnt_schattr, cnt_brdattr; +int in_brd_sch = 0; + +string attdiff_sch[], attdiff_brd[], attdiff_val[]; +int cntdiffs = 0; +int cntdiffb = 0; +int cntdiffval = 0; + +// 2009-12-15 +string attribute_list_datei = filesetext(argv[0], ".lst"); +string attribute_liste[]; +int cntattributelist = 0; + + +// ############## Funktionen ################ +string AttribT(string s) { + if (s[0] == '>') { // folgende Textplatzhalter sind keine Attribute + if (s == ">NAME" || + s == ">PART" || + s == ">GATE" || + s == ">VALUE" || + s == ">XREF" || + s == ">SHEET" || + s == ">CONTACT_XREF" || + s == ">DRAWING_NAME" || + s == ">LAST_DATE_TIME" || + s == ">PLOT_DATE_TIME " + ) s = ""; + else s = strsub(s, 1); + } + else s = ""; // kein Attribut-Platzhalter, nur Text. + return s; +} + + +// ========== Unter-Menu Ändern ========== // +string changeAttrib(string att, int Objekt, int newchange) { + string s[]; + int setAttrib = -1; + int cnt = strsplit(s, att, '\t'); + if (s[1] == setze[1]) setAttrib = ja; + int Result = dlgDialog("Attribut") { + dlgLabel(s[0]); + dlgHBoxLayout { + dlgLabel("&Wert "); + dlgStringEdit(s[2]); + } + if (newchange == bearbeiten) { + dlgGroup("Attribut bearbeiten") { + dlgRadioButton("&nicht ändern", setAttrib); + dlgRadioButton("&ja", setAttrib); + dlgRadioButton("&löschen", setAttrib); + } + } + else { + dlgGroup("Attribut anlegen") { + dlgRadioButton("&nein", setAttrib); + dlgRadioButton("&ja", setAttrib); + } + } + dlgHBoxLayout { + dlgPushButton("+OK") { + if (setAttrib < 0) { + if (newchange == bearbeiten) dlgMessageBox("Wählen Sie eine Option,\nnein, ja, löschen", "OK"); + else dlgMessageBox("Wählen Sie eine Option,\nnein, ja", "OK"); + } + else { + att = s[0] + "\t" + setze[setAttrib] + "\t" + s[2]; + for (int n = 3; n < cnt; n++) att += "\t" + s[n]; + dlgAccept(); + } + } + dlgPushButton("-Abbruch") dlgReject(); + dlgStretch(1); + } + }; + return att; +} + + +void setzealle(int nein_ja) { + string s[]; + for (int a = 0; a < cntP; a++) { + int cnt = strsplit(s, ListAttrib[a], '\t'); + ListAttrib[a] = s[0] + "\t" + setze[nein_ja] + "\t" + s[2]; + for (int n = 3; n < cnt; n++) ListAttrib[a] += "\t" + s[n]; + } + return; +} + + +void setze_attribut(int nein_ja, int sel) { +//stop + string s[]; + for (int n = 0; n < cntP; n++) { + if (AttribPart[n] == AttribPart[sel]) { + strsplit(s, ListAttrib[n], '\t'); + ListAttrib[n] = s[0] + "\t" + setze[nein_ja] + "\t" + s[2] + "\t" + s[3] + "\t" + s[4]; + } + } + return; +} + + + +void setze_variant(int nein_ja, int sel) { + string s[]; + for (int n = 0; n < cntP; n++) { + if (variant[n] == variant[sel]) { + strsplit(s, ListAttrib[n], '\t'); + ListAttrib[n] = s[0] + "\t" + setze[nein_ja] + "\t" + s[2] + "\t" + s[3] + "\t" + s[4]; + } + } + return; +} + + +void setze_techno(int nein_ja, int sel) { + string s[]; + for (int n = 0; n < cntP; n++) { + if (techno[n] == techno[sel]) { + strsplit(s, ListAttrib[n], '\t'); + ListAttrib[n] = s[0] + "\t" + setze[nein_ja] + "\t" + s[2] + "\t" + s[3] + "\t" + s[4]; + } + } + return; +} + + +void copyPlatzhalterList(int L) { + for (int n = 0; n < L; n++) { + ListAttrib[n] = LPlatzhalter[n] + "\t" + setze[ja] + "\t"; + } + ListAttrib[L] = ""; // letzter Eintrag löschen + cntP = L; + return; +} + + +void generateAttribScript(int Objekt, int Editor, string PartName, string Sheet) { + string a[]; + int cnt; + sprintf(cmd, "EDIT %s;\n", Sheet); + if (deviceset) cmd = ""; + + for (int n = 0; n < cntP; n++) { + cnt = strsplit(a, ListAttrib[n], '\t'); + if (a[1] == setze[ja]) { + if (deviceset) { + sprintf(s, "PACKAGE %s;\n", a[3]); + cmd += s; + sprintf(s, "TECHNOLOGY %s;\n", a[4]); + cmd += s; + sprintf(s, "ATTRIBUTE %s '%s';\n", a[0], a[2]); + } + else if (Objekt == Global) { + sprintf(s, "ATTRIBUTE * %s '%s';\n", a[0], a[2]); + } + else if (Objekt == Lokal) { + cmd += "CHANGE DISPLAY OFF;\n"; // | VALUE | NAME | BOTH + sprintf(s, "ATTRIBUTE %s %s '%s';\n", PartName, a[0], a[2]); + } + else { + cmd += "CHANGE DISPLAY OFF;\n"; + sprintf(s, "ATTRIBUTE %s %s '%s';\n", PartName, a[0], a[2]); + } + cmd+=s; + } + else if (a[1] == setze[loeschen]) { + if (deviceset) { + sprintf(s, "PACKAGE %s;\n", a[3]); + cmd += s; + sprintf(s, "TECHNOLOGY %s;\n", a[4]); + cmd += s; + sprintf(s, "ATTRIBUTE %s DELETE;\n", a[0]); + } + else if (Objekt == Global) { + sprintf(s, "ATTRIBUTE * %s DELETE;\n", a[0]); + } + else { + sprintf(s, "ATTRIBUTE %s '%s' DELETE;\n", PartName, a[0]); + } + cmd+=s; + } + } + // if (dlgMessageBox(cmd, "OK", "esc") != 0) exit(-1); + exit(cmd); +} + + +void getTextPlatzhalterDS(UL_DEVICESET DS) { + cntP = 0; + DS.devices(D) { + string t[]; + int n = strsplit(t, D.technologies, ' '); + n = 1; /************** nur eine Technologie behandeln, ******** + ************** alle Technologien haben die gleichen Attribute ********/ + for (int na = 0; na < n; na++) { + string la[]; // lokales attribute + int cntla = 0; + D.attributes(A, t[na]) { + la[cntla] = A.name; + cntla++; + } + D.gates(G) { + G.symbol.texts(T) { + string s = AttribT(strupr(T.value)); // keine reservierten Textplatzhalter >NAME >VALUE >PART >GATE ... + for (int n = 0; n < cntla; n++) { + if (s == la[n]) { + s = ""; // Textplatzhalter schon benutzt + break; + } + } + if (s) { // sammle Platzhalter + AttribPart[cntP] = s; // zum selektieren eines Attribut + Platzhalter[cntP] = s; + ListAttrib[cntP] = s + "\t" + setze[ja] + "\t" + "" + "\t" + D.name + "\t" + t[na] ; + techno[cntP] = t[na]; + variant[cntP] = D.name; + cntP++; + } + } + } + } + } + ListAttrib[cntP] = ""; + return; +} + + +void getAttributeDS(UL_DEVICESET DS) { + cntP = 0; + cntA = 0; + DS.devices(D) { + string t[]; + int n = strsplit(t, D.technologies, ' '); + for (int na = 0; na < n; na++) { + D.attributes(A, t[na]) { + AttribPart[cntA] = A.name; + AttribWert[cntA] = A.value; + ListAttrib[cntA] = A.name + "\t" + setze[ja] + "\t" + A.value + "\t" + D.name + "\t" + t[na] ; + techno[cntA] = t[na]; + variant[cntA] = D.name; + cntA++; + AttribPart[cntA] = ""; + ListAttrib[cntA] = ""; + } + } + cntP = cntA; + } + return; +} + + +void clear_list(void) { // zurück aus Untermenu löscht die Einträge aller Listen + cntP = 0; + cntA = 0; + cntE = 0; + ListAttrib[0] = ""; + AttribPart[0] = ""; + AttribWert[0] = ""; + Platzhalter[0] = ""; + EListAttrib[0] = ""; + AttribElement[0] = ""; + EAttribWert[0] = ""; + EPlatzhalter[0] = ""; + return; +} + + +int diff_attr_sch_brd(int menu_on) { + int notfound, n; + for (n = 0; n < cnt_schattr; n++) { + notfound = 1; + for (int x = 0; x < cnt_brdattr; x++) { + if (sch_attributte[n] == brd_attributte[x]) { + notfound = 0; + if (sch_attributteValue[n] != brd_attributteValue[x]) { + sprintf(attdiff_val[cntdiffval], "%s\t%s\t%s", sch_attributte[n], sch_attributteValue[n], brd_attributteValue[x]); + cntdiffval++; + } + break; + } + } + if (notfound) { + sprintf(attdiff_sch[cntdiffs], "%s\t'%s'", sch_attributte[n], sch_attributteValue[n]); + cntdiffs++; + attdiff_sch[cntdiffs] = ""; // letzen markieren + } + } + for (n = 0; n < cnt_brdattr; n++) { + notfound = 1; + for (int x = 0; x < cnt_schattr; x++) { + if (brd_attributte[n] == sch_attributte[x]) { + notfound = 0; + break; + } + } + if (notfound) { + sprintf(attdiff_brd[cntdiffb], "%s\t'%s'", brd_attributte[n], brd_attributteValue[n]); + cntdiffb++; + attdiff_brd[cntdiffb] = ""; // letzen markieren + } + } + if (!menu_on) return cntdiffs + cntdiffb; + return 0; +} + + +// ======== Unter-Menu ======== // +// ### Attribute Menu zum Anlgen bzw. Ändern ### +int menu(int Objekt, int Editor, string PartName, string Sheet, int newchange) { + int sel = -1; + int selp = -1; + int alle_setzen = -1; + string cnt_selAttrib = ""; + string InfoCnt = " "; + string attmsg = " "; + + switch(Editor) { + case Device : if (newchange == neu) sprintf(InfoCnt, "%d Textplatzhalter in %s %s verfügbar", cntP, Edit[Editor], PartName); + else sprintf(InfoCnt, "%d Attribute in %s %s", cntP, Edit[Editor], PartName); + break; + case Part : if (newchange == neu) sprintf(InfoCnt, "%d Textplatzhalter in %s %s sheet %s verfügbar", cntP, Edit[Editor], PartName, Sheet); + else sprintf(InfoCnt, "%d Attribute in %s %s sheet %s", cntP, Edit[Editor], PartName, Sheet); + attmsg = "Attribute auch in Board übertragen."; + break; + case Element : if (newchange == neu) sprintf(InfoCnt, "%d Textplatzhalter in %s %s verfügbar", cntE, Edit[Editor], PartName); + else sprintf(InfoCnt, "%d Attribute in %s %s", cntE, Edit[Editor], PartName); + attmsg = "Attribute auch in Schaltplan übertragen."; + break; + } + int srt = 0; + int RESULT = dlgDialog(aType[Objekt]+" Attribute") { + dlgHBoxLayout dlgSpacing(300); + dlgLabel(InfoCnt, 1); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(500); + switch(Editor) { + case Device : dlgListView("Attribute\tDefiniert\tWert\tVariant\tTechnologie", ListAttrib, sel, srt) { + ListAttrib[sel] = changeAttrib(ListAttrib[sel], Objekt, newchange); + } + sprintf(InfoCnt, "DEVICE %d Attribute", cntP); + break; + case Part : dlgListView("Attribute\tDefiniert\tWert", ListAttrib, sel, srt) { + ListAttrib[sel] = changeAttrib(ListAttrib[sel], Objekt, newchange); + } + break; + case Element : dlgListView("Attribute\tDefiniert\tWert", ListAttrib, sel, srt) { + ListAttrib[sel] = changeAttrib(ListAttrib[sel], Objekt, newchange); + } + break; + } + } + + dlgHBoxLayout { + if (newchange == bearbeiten) { + dlgGroup("Alle Attribute ändern") { + 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); } + 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" + "

" + "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.

" + "Author: support@cadsoft.de" + + +numeric string PinCount[], PinNames[], SymName[]; +numeric string Lines[], DevLines[]; +numeric string DevRang[], DevPinCount[], DevPinNames[], DevSymName[]; +numeric string s; +int NumAllPins = 0, NumSyms = 0; +int Selected, SelectedDev = -1; +int OutputFormat = 1; +int SymDisplay = 1; +int RangDev = 0; +string NewDeviceName = ""; +string DeviceDescription = ""; +string MakePackCmd, MakeDevCmd; +string DevicePrefix = ""; +string DevPinNamesAll = ""; +string f; +// Benutzerspezifische Einstellungen +int PadOffset = 100; +int SpulenOffset = -400; +int XrefOffset = 200; +int ZeicheSymbolOffset = -500; + +// + +string HelpAllgemein = +"Bauteil (Device) für Elektro-Pläne erstellen

" +"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.

" + +"Author: support@cadsoft.de" + +///////////////////////////////////////////////////////////////////////////////// +// Vom Benutzer zu ändern: +// Wenn verdrahteten Verbindungen keine Verweise bekommen sollen, setzen Sie den +// Wert für ExcludeDrahtverbindungen in der folgenden Zeile auf 1; +int ExcludeDrahtverbindungen = 0; +///////////////////////////////////////////////////////////////////////////////// + +string s, cmd, f, LogCmd, DoCmd, ListCmd; +string PartDatabase[], CurrentPart; +numeric string ChangeString, SheetsUsedInEdit[]; +int maxklemmen, LogOn, ErrOn, CurrentPartIndex; + +string scrfile, listfile, errorfile, pinfile, vbdfile, klpfile, kapfile, brpfile, pfad; +numeric string sh, PartPin, SigName, col, row, PartName, PinName; +numeric string pindatabase[], b[]; +string PartPinSep = " "; +int YRef[]; +int distY, netnr, n, i; +// Debug +string DebugString; +// Variablen für main +int SelAll = -1, SelConnected = -1, Sort = 0, SortAll = 0, NrLinesListAll; +numeric string listall[], listsel[], listundo[], listundoOben[]; +string h[]; +// Header-Variablen ------------------------------------------------------------------------------------------- +string head [], SelParam[], ChangeParam[]; +int NrHeader; // Zahl der Rubriken +// head [] enthält ListHeader-Einträge: +// head[Draehte].. v +enum {Draehte, Bruecken}; +numeric string ListHeader = "Drähte \tBrücken"; + +enum {Name, Anz, Verwendet, Verdrahtet}; +numeric string ListHeaderMain = "Name\tAnz.\tVerwendet\tVerdrahtet"; +// Ende Header-Variablen -------------------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////////////////////////// +string HelpText = + + +"Brückenklemmen-Verwaltung: Brücken eintragen und ändern

" + +"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.

" + +"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.

" +"Author: support@cadsoft.de" + +string s, cmd, f, ErrCmd; +string tmpfile, listfile, errorfile, pinfile, vbdfile, klpfile, kapfile, brpfile, pfad; +numeric string sh, PartPin, SigName, col, row, PartName, PinName; +numeric string pindatabase[], b[]; +string PartPinSep = " "; +int YRef[]; +int distY, netnr, n, i; +// Debug +string DebugString; +// Variablen für main +int SelAll = -1, SelConnection = -1, Sort = 0, SortAll = 0, NrLinesListAll; +numeric string listall[], listsel[], listundo[], listundoOben[]; +string h[]; +// Header-Variablen ------------------------------------------------------------------------------------------- +string head [], SelParam[], ChangeParam[]; +int NrHeader; // Zahl der Rubriken +enum {Nummer, Von, Quelle, Ziel, Nach, Art}; +// head [] enthält ListHeader-Einträge: head[Farbe].. +// head[Nummer].. v +numeric string ListHeader = "Nummer\tVon\tQuelle\tZiel\tNach\tArt\tBrücke\tFarbe\tQuerschnitt\tKabeltyp\tFunktion"; +// Ende Header-Variablen -------------------------------------------------------------------------------------- + +//////////////////////////////////////////////////////////////////////////////////////////////////// +string HelpText = + +"Erstellen des Klemmenplans mit diesem User-Language-Programm (ULP)

" + +"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:
" +"\td = Drahtverbindung (intern, im Schaltschrank)
" +"\tk = Kabelverbindung (extern, außerhalb des Schaltschranks)
" +"\tx = Brücke (Klemme zu Klemme im gleichen Klemmenblock)

" + +"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 *.
" +"Ein Doppelklick auf einen Eintrag in der Verbindungsliste bringt diese " +"eine Verbindung in die Auswahlliste.

" + +"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.

" + +"Author: support@cadsoft.de" + +int NrLines, i, j, np, maxlen[], PrintOff[], xstart, ystart, xtextpos, ypos, size; +int shnr, linedist, layer, lowmargin, linelength, fieldmarginchar, width, width_head; +int x_margin, y_margin, xright, MaxSize, linemil, delpage; +numeric string lines[], head[], item[]; +string FileName, FileTmp, Cmd, s, t, headline, fext, MaxSizeStr, CmdDel; + +/////////////////////////////////////////////////////////////////////////////////////// +// Folgende Parameter können vom Benutzer angepasst werden +// Alle Maße in mil = 1/1000 Zoll; 40 mil ist ca. 1 mm +fext = ".vbd"; +xstart = 150; // Trennlinien-Abstand vom linken Rand +xright = 11200; // x-Koordinate für Trennlinie rechts +ystart = 7750; // y-Koordinate für erste (obere) Trennlinie +lowmargin = 435; // y-Koordinate für letztmögliche (unterste) Trennlinie +linedist = 200; // Zeilenabstand +fieldmarginchar = 2; // zusätzliche Zeichen pro Feld (Abstand) +size = 140; // Texthöhe (wird intern optimiert) +width = 7; // Strichstärke für Trennlinien +width_head = 10; // Strichstärke für Trennlinien der Kopfzeile +layer = 94; // wenn ein anderer Layer angegeben wird, muss er definiert sein +/////////////////////////////////////////////////////////////////////////////////////// + +xtextpos = xstart + size; +ypos = ystart; +x_margin = size * fieldmarginchar/2; // Abstand zu Linien in mil +y_margin = (linedist - size)/2; // Versatz der Linien gegen Text vertikal +// shnr wird in SetFileNames auf höchste Seitennummer + 1 gesetzt + +string HelpText = + +"Erstellen von Listen auf EAGLE-Schaltplanseiten (nicht mit EAGLE Light)

" + +"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.

" + "Author: support@cadsoft.de" + + +string cmd, concmd, s; +string f; +string PadName; +string CurrentDevice; +int PackagePresent = 0; +int PADname; + +if (library) { + library(L) { + f = filename(L.name); + f = filesetext(f, "$$$.scr"); + f = path_scr[0] + '/' + f; // verwende Script-Pfad + if (deviceset) { + deviceset(DS) { + CurrentDevice = DS.name; + DS.devices(D) { + if (!D.package && CurrentDevice == DS.name) { + sprintf(s, "EDIT %s.PAC;\n", DS.name); + cmd += s; + sprintf(s, "DESCRIPTION 'Dummy';\n"); + cmd += s; + sprintf(s, "GRID MM; CHANGE DRILL 0.5; CHANGE DIAMETER 1.0;\n"); + cmd += s; + sprintf(s, "EDIT %s.DEV;\n", DS.name); + concmd += s; + sprintf(s, "PAC '%s' '';\n", DS.name); + concmd += s; + DS.gates(G) { + G.symbol.pins(P) { + PadName = (P.name); + sprintf(s, "PAD '%s' (%.4f %.4f);\n", PadName, u2mm(P.x), u2mm(P.y)-7.62 ); // Pin-Offset im Device in Y-Richtung + cmd += s; + sprintf(s, "CONNECT %s.%s %s;\n", G.name, P.name, PadName); + concmd += s; + } + } + } + } + } + } + L.packages(P) { + if (CurrentDevice == P.name) PackagePresent = 1; + } + } + cmd += concmd; + if (cmd && !PackagePresent) { + dlgDialog("Check") { + dlgHBoxLayout dlgSpacing(500); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(500); + dlgTextEdit(cmd); + } + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("Abbrechen") { dlgReject(); exit(-1); } + } + }; + output(f, "wtD") printf("%s", cmd); // temporäre Script-Datei erzeugen + exit("SCRIPT '"+ f +"'"); + } + else dlgMessageBox("Device hat schon ein Package oder Package mit dem Namen des Device schon vorhanden.", "OK"); + } + + else dlgMessageBox("Das ULP kann nur vom Bibliothekseditor aus geladen werden!", "OK"); \ No newline at end of file diff --git a/eagle-5.7.0/ulp/eagle.bmp b/eagle-5.7.0/ulp/eagle.bmp new file mode 100644 index 0000000..a016d3a Binary files /dev/null and b/eagle-5.7.0/ulp/eagle.bmp differ diff --git a/eagle-5.7.0/ulp/edit-used-dev-pac-sym.ulp b/eagle-5.7.0/ulp/edit-used-dev-pac-sym.ulp new file mode 100644 index 0000000..b7b6743 --- /dev/null +++ b/eagle-5.7.0/ulp/edit-used-dev-pac-sym.ulp @@ -0,0 +1,229 @@ +#usage "Offers a selection to open (one of) the respective Library Editor window(s) of the currently edited DEVice/PACkage/SYMbol.

" + "It is also possible to edit a DEVice, PACkage, or SYMbol from Schematic or Board directly.

" + "Example:
" + "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.

" + "Attention: If the used Library is not available in the given path, see - Options - Directory - Library - in the Control Panel,
" + "a new Schematic/Bord with the Device/Symbole/Package name will be opened!
" + "Author: support@cadsoft.de
" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +string Help = "Öffnet in der Bibliothek das Editorfenster das mit dem gerade editierten DEVice/SYMbol/PACkage verknüpft ist.

" + + "Vom Schaltplan bzw. Board muss es mit den Optionen Bauteilname Gatename aufgerufen werden.

" + + "Beispiel:
" + + "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.
" + + "Author: support@cadsoft.de
"; + +// Version 1.0 -- 19.05.2005 support@cadsoft.de +// 1.1 -- 29.06.2006 support@cadsoft.de + +if (language() != "de") Help = usage; + +string devList[]; +string pacList[]; +string symList[]; +string pac_name; +string sym_name; +int cntDev, cntPac, cntSym; + +string use_in; + +string Object = strupr(argv[1]); // use in schematic (Device) or board (Element) +string Gate = strupr(argv[2]); // only in schematic can use + +int newDevice(string DS_name) { + int new = 1; + for (int n = 0; n < cntDev; n++) { + if (devList[n] == DS_name) { + new = 0; + break; + } + } + return new; +} + + +int newSymbol(string S_name) { + int new = 1; + for (int n = 0; n < cntSym; n++) { + if (symList[n] == S_name) { + new = 0; + break; + } + } + return new; +} + + +if (schematic) { + schematic(SCH) { + SCH.sheets(S) { + S.parts(PA) { + if (PA.name == Object) { + if (Gate) { + int foundgates = 0; + PA.instances(I) { + foundgates++; + if (Gate == "@") { + exit("OPEN " + PA.deviceset.library + ";\nEDIT '" + I.gate.symbol.name + ".SYM'"); + } + if (I.name == Object+Gate) { + exit("OPEN " + PA.deviceset.library + ";\nEDIT '" + I.gate.symbol.name + ".SYM'"); + } + } + if (foundgates) + if (dlgMessageBox("! Gate '" + Gate + "' from Device '" + Object + "' not found.\n" + + "Use INVOKE to see available Gates.", "Yes", "No") != 0) exit(0); + exit("INVOKE " + Object); + } + else { + exit("OPEN '" + PA.deviceset.library + "';\nEDIT '" + PA.deviceset.name + ".DEV'"); + } + } + } + } + } + dlgMessageBox(Help, "OK"); +} + +else if (board) board(B) { + B.elements(E) { + if (E.name == Object) { + exit("OPEN " + E.package.library + "; EDIT '" + E.package.name + ".PAC'"); + } + } + dlgMessageBox(Help, "OK"); +} + +else if (library) { + + if (deviceset) { + deviceset(DS) { + DS.devices(D) { + if (D.package) { + pacList[cntPac] = D.package.name; + cntPac++; + } + } + DS.gates(G) { + if (newSymbol(G.symbol.name)) { + symList[cntSym] = G.symbol.name; + cntSym++; + } + } + } + dlgDialog("EDIT selected Package or Symbol") { + int selectPac = cntPac+1, selectSym = cntSym+1; + dlgHBoxLayout dlgSpacing(400); + dlgHBoxLayout { + dlgVBoxLayout { + dlgLabel("Used p&ackages"); + dlgListView("Packages", pacList, selectPac) { + dlgAccept(); + exit("EDIT '" + pacList[selectPac] + ".PAC'"); + } + dlgHBoxLayout { + dlgPushButton("Edit &Package") { + dlgAccept(); + exit("EDIT '" + pacList[selectPac] + ".PAC'"); + } + dlgStretch(1); + } + } + dlgVBoxLayout { + dlgLabel("Used s&ymbols"); + dlgListView("Symbols", symList, selectSym) { + dlgAccept(); + exit("EDIT '" + symList[selectSym] + ".SYM'"); + } + dlgHBoxLayout { + dlgPushButton("Edit &Symbol") { + dlgAccept(); + exit("EDIT '" + symList[selectSym] + ".SYM'"); + } + dlgStretch(1); + } + } + dlgVBoxLayout dlgSpacing(200); + } + dlgLabel("Double click on listed Package or Symbol to edit."); + dlgHBoxLayout { + dlgPushButton("-Cancel") { dlgReject(); exit(0); } + dlgStretch(1); + } + }; + exit(0); + } + + if (package || symbol) { + if (package) { + package(P) pac_name = P.name; + devList[0] = "!No Devices use this package"; + use_in = "Package used in"; + library(L) { + L.devicesets(DS) { + DS.devices(D) { + if (D.package) { + if (D.package.name == pac_name) { + devList[cntDev] = DS.name; + cntDev++; + } + } + } + } + } + } + + if (symbol) { + symbol(S) sym_name = S.name; + devList[0] = "!No Devices use this symbol"; + use_in = "Symbol used in"; + library(L) { + L.devicesets(DS) { + DS.gates(G) { + if (G.symbol.name == sym_name) { + if (newDevice(DS.name)) { + devList[cntDev] = DS.name; + cntDev++; + } + } + } + } + } + } + } + if (cntDev) { + if (cntDev > 1) { // 2006.06.29 + dlgDialog("EDIT selected Device") { + int select; + dlgLabel(use_in); + dlgHBoxLayout { + dlgListView("Devices", devList, select) { + dlgAccept(); + exit("EDIT '" + devList[select] + ".DEV';"); + } + dlgVBoxLayout dlgSpacing(200); + } + dlgLabel("Double click on listed device to edit."); + dlgHBoxLayout { + dlgPushButton("+OK") { dlgAccept(); exit("EDIT '" + devList[select] + ".DEV';"); } + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + }; + } + else exit("EDIT '" + devList[0] + ".DEV';"); + } + else dlgMessageBox(devList[0], "Ok"); +} \ No newline at end of file diff --git a/eagle-5.7.0/ulp/editnext-dev-sym-pac.ulp b/eagle-5.7.0/ulp/editnext-dev-sym-pac.ulp new file mode 100644 index 0000000..1434598 --- /dev/null +++ b/eagle-5.7.0/ulp/editnext-dev-sym-pac.ulp @@ -0,0 +1,71 @@ +#usage "Edit next device, symbol, or package in library\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string sym[]; +string pac[]; +string edit = ""; +int scount = 0; +int dcount = 0; +int pcount = 0; +int n = 0; + +if (library) library(L) { + L.devicesets(D) { + dcount++; + dev[dcount] = D.name; + } + L.symbols(S) { + scount++; + sym[scount] = S.name; + } + L.packages(P) { + pcount++; + pac[pcount] = P.name; + } + + if (deviceset) deviceset(D) { + edit = D.name; + for (n = 1; n < dcount; n++) { + if (edit == dev[n]) { + break; + } + } + + if (n < dcount) { + cmd += "EDIT " + dev[n + 1] + ".dev;\n" ; + } + else exit (0); + } + if (symbol) symbol(S) { + edit = S.name; + for (n = 1; n < scount; n++) { + if (edit == sym[n]) { + break; + } + } + + if (n < scount) { + cmd += "EDIT " + sym[n + 1] + ".sym;\n" ; + } + else exit (0); + } + if (package) package(P) { + edit = P.name; + for (n = 1; n < pcount; n++) { + if (edit == pac[n]) { + break; + } + } + + if (n < pcount) { + cmd += "EDIT " + pac[n + 1] + ".pac;\n" ; + } + else exit (0); + } + exit(cmd); + } diff --git a/eagle-5.7.0/ulp/editnext-lbr.ulp b/eagle-5.7.0/ulp/editnext-lbr.ulp new file mode 100644 index 0000000..240ad39 --- /dev/null +++ b/eagle-5.7.0/ulp/editnext-lbr.ulp @@ -0,0 +1,29 @@ +#usage "Edit next library in current directory\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (library) { + library(L) { + string a[], cmd; + string Lname = L.name; + string lbr_path = filedir(L.name); + int n = fileglob(a, lbr_path + "*.lbr"); + if (n) { + for (int xl = 0; xl < n; xl++) { + if (Lname == a[xl]) { + if (xl < n-1) { + string h; + sprintf(h, "OPEN '" + a[xl + 1] + "';"); + cmd += h; + exit (cmd); + } + } + } + } + } + exit (0); + } + +else dlgMessageBox("Start this ULP from a Library", "OK"); diff --git a/eagle-5.7.0/ulp/editnext-sheet.ulp b/eagle-5.7.0/ulp/editnext-sheet.ulp new file mode 100644 index 0000000..17c9e08 --- /dev/null +++ b/eagle-5.7.0/ulp/editnext-sheet.ulp @@ -0,0 +1,23 @@ +#usage "Edit next sheet\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; + +if (schematic) { + int scnt = 0; + int s; + schematic(SH) { + sheet(SH) s = SH.number; + SH.sheets(S) { + scnt = S.number; + } + if (s < scnt) { + s++; + sprintf(cmd, "EDIT .s%d;\n", s); + } + } + exit(cmd); + } diff --git a/eagle-5.7.0/ulp/editprev-dev-sym-pac.ulp b/eagle-5.7.0/ulp/editprev-dev-sym-pac.ulp new file mode 100644 index 0000000..6ab3600 --- /dev/null +++ b/eagle-5.7.0/ulp/editprev-dev-sym-pac.ulp @@ -0,0 +1,71 @@ +#usage "Edit previous device, symbol, or package in library\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string sym[]; +string pac[]; +string edit = ""; +int scount = 0; +int dcount = 0; +int pcount = 0; +int n = 0; + +if (library) library(L) { + L.devicesets(D) { + dcount++; + dev[dcount] = D.name; + } + L.symbols(S) { + scount++; + sym[scount] = S.name; + } + L.packages(P) { + pcount++; + pac[pcount] = P.name; + } + + if (deviceset) deviceset(D) { + edit = D.name; + for (n = 1; n < dcount; n++) { + if (edit == dev[n]) { + break; + } + } + if (n > 0) { + cmd += "EDIT " + dev[n - 1] + ".dev;\n" ; + } + else exit (0); + } + + if (symbol) symbol(S) { + edit = S.name; + for (n = 1; n < scount; n++) { + if (edit == sym[n]) { + break; + } + } + if (n > 0) { + cmd += "EDIT " + sym[n - 1] + ".sym;\n" ; + } + else exit (0); + } + + if (package) package(P) { + for (n = 1; n < pcount; n++) { + edit = P.name; + if (edit == pac[n]) { + break; + } + } + + if (n > 0) { + cmd += "EDIT " + pac[n - 1] + ".pac;\n" ; + } + else exit (0); + } + exit(cmd); + } diff --git a/eagle-5.7.0/ulp/editprev-lbr.ulp b/eagle-5.7.0/ulp/editprev-lbr.ulp new file mode 100644 index 0000000..2ead863 --- /dev/null +++ b/eagle-5.7.0/ulp/editprev-lbr.ulp @@ -0,0 +1,29 @@ +#usage "Edit previous library in current directory\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (library) { + library(L) { + string a[], cmd; + string Lname = L.name; + string lbr_path = filedir(L.name); + int n = fileglob(a, lbr_path + "*.lbr"); + if (n) { + for (int xl = 0; xl <= n; xl++) { + if (Lname == a[xl]) { + if (xl > 0) { + string h; + sprintf(h, "OPEN '" + lbr_path + filename(a[xl - 1]) + "';"); + cmd += h; + exit (cmd); + } + } + } + } + } + exit (0); + } + +else dlgMessageBox("Start this ULP from a Library", "OK"); diff --git a/eagle-5.7.0/ulp/editprev-sheet.ulp b/eagle-5.7.0/ulp/editprev-sheet.ulp new file mode 100644 index 0000000..564a431 --- /dev/null +++ b/eagle-5.7.0/ulp/editprev-sheet.ulp @@ -0,0 +1,19 @@ +#usage "Edit previous sheet\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; + +if (schematic) { + int s; + schematic(SH) { + sheet(SH) s = SH.number; + if (s > 1) { + s--; + sprintf(cmd, "EDIT .s%d;\n", s); + } + } + exit(cmd); + } diff --git a/eagle-5.7.0/ulp/ex-argv-path.ulp b/eagle-5.7.0/ulp/ex-argv-path.ulp new file mode 100644 index 0000000..52f6663 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-argv-path.ulp @@ -0,0 +1,17 @@ +#usage "Example: Usage of argv\n" + "

" + "Returns the path of the ULP." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +void main(void) { + string ulp_path = ""; + char c = '/'; + int pos = strrchr(argv[0], c); + if (pos >= 0) { + ulp_path = strsub(argv[0], 0, pos + 1); + } + dlgMessageBox(ulp_path , "+OK"); +} diff --git a/eagle-5.7.0/ulp/ex-dialogs.ulp b/eagle-5.7.0/ulp/ex-dialogs.ulp new file mode 100644 index 0000000..a6df330 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-dialogs.ulp @@ -0,0 +1,653 @@ +#usage "Example: Dialogs\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// Revision 1 : Path for bitmap corrected 2005.12.21 support@cadsoft.de + +string cmd = ""; +int Value = 42; +int Wert = 7; +int Val = 0; +string st = ""; +int Result = 0; +string msg = ""; + +string Colors[] = { "red" + , "green", "blue", "pink" + , "yellow", "cyan", "magenta" + , "brown", "white", "black" + , "gray", "orange" + }; + +int Selected = 2; // initially selects "blue" + +string Text = "example text"; + +int Lines = 0; + +// Checkboxes in Dialog +int mirror = 0; +int rotate = 1; +int flip = 0; +int black = 1; +int swap = 1; +int solid = 0; +int scaled = 0; +int align = 0; + +//use dlgRadioButton only in dlgGroup! + +Result = dlgDialog("EAGLE Version 4 / ULP Demonstration") { + dlgHBoxLayout { + dlgStretch(0); + dlgGroup("Use RadioButton only in dlgGroup!") { + dlgStretch(0); + dlgGridLayout { + dlgCell(1, 1) dlgRadioButton("&Top", align); + dlgCell(2, 0) dlgRadioButton("&Left ", align); + dlgCell(2, 1) dlgRadioButton("&Center", align); + dlgCell(2, 2) dlgRadioButton("&Right ", align); + dlgCell(3, 1) dlgRadioButton("&Bottom", align); + // 30 pixels fixed distance + dlgCell(1, 6) { dlgSpacing(30); dlgCheckBox("R&otate", rotate); }; + dlgCell(2, 6) { dlgSpacing(30); dlgCheckBox("&Mirror", mirror); }; + dlgCell(3, 6) { dlgSpacing(30); dlgCheckBox("&Flip", flip); }; + } + } + dlgStretch(0); + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(20); + dlgStretch(0); + dlgPushButton("-ESC") dlgReject(); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgStretch(1); + }; +if (Result == 0) exit (0); + +// a complex menu +// default is VBoxLayout + +Text += "\nextend example text with Text+=..."; +align = 0; +Result = dlgDialog("Version 4 - ULP test"){ + + string fbmp; + sprintf(fbmp, "", filedir(argv[0]) ); // make absolute path for bitmap file 2005.12.21 alf@cadsoft.de + dlgStretch(0); // no dynamic distance on top + dlgHBoxLayout { + dlgStretch(0); // no dynamic distance on left border + dlgLabel(fbmp); // display a BMP file + dlgStretch(0); // no dynamic distance to next object + dlgGroup("ULP-Test Edit") { // start a group + dlgHBoxLayout dlgSpacing(600); // make 600 pixel spacing + dlgHBoxLayout { // horizontal direction in horizontal direction + dlgVBoxLayout dlgSpacing(300); // a vertical Box 300 pixels high + dlgTextEdit(Text); // editor window 600 x 300 pixels + } + } + dlgStretch(1); // dynamic distance to the right border + } + dlgHBoxLayout { + dlgStretch(0); // no dynamic distance allowed + dlgGroup("ULP-Test Radio") { // start a frame for a group + dlgHBoxLayout dlgSpacing(100); // a horizontle box min. 100 pixels wide + // Minimum is 80 pixels (by Windows/Microsoft) + // is the displayed Text in Combobox larger than 80 pixels + // then the Box width is automatically extended + + dlgLabel("&Color"); // the & character marks the ALT-Key + dlgComboBox(Colors, Selected); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + } + dlgSpacing(20); + dlgStretch(0); + dlgVBoxLayout { + dlgStretch(1); + dlgCheckBox("&Mirror", mirror); + dlgStretch(0); + dlgCheckBox("&Rotate", rotate); + dlgStretch(1); + } + dlgSpacing(10); + dlgStretch(0); + dlgLabel("Enter a &Number between 0 and 99"); + dlgSpacing(5); + dlgStretch(0); + dlgHBoxLayout { + dlgIntEdit(Value, 0, 99); + } + dlgSpacing(10); + dlgStretch(0); + dlgGroup("Reset") { + dlgStretch(0); + dlgLabel("change values, press reset and look"); + dlgStretch(1); + dlgPushButton("Reset") dlgReset(); + dlgStretch(1); + } + dlgStretch(1); + } + dlgStretch(0); + dlgSpacing(10); + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(550); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + dlgSpacing(25); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + dlgStretch(1); + }; +if (Result == 0) exit (0); + +// Dialog window with Button + +align = 0; +Text = "\n\nCELL example\ndefine cells\n"; + +Result = dlgDialog(" EAGLE Version 4 / GRID/CELL Demonstration"){ + dlgGridLayout { // Grid & Cell + dlgCell(0, 0) dlgLabel("Cell 0,0"); + dlgCell(0, 1) dlgLabel("Cell 0,1"); + dlgCell(0, 2) dlgLabel("Cell 0,2"); + dlgCell(0, 3) dlgLabel("Cell 0,3"); + dlgCell(0, 4) dlgLabel("Cell 0,4"); + dlgCell(0, 5) dlgLabel("Cell 0,5"); + dlgCell(0, 6) dlgLabel("Cell 0,6"); + dlgCell(0, 7) dlgLabel("Cell 0,7"); + dlgCell(0, 8) dlgLabel("Cell 0,8"); + dlgCell(0, 9) dlgLabel("Cell 0,9"); + dlgCell(0, 10) dlgLabel("Cell 0,10"); + dlgCell(0, 11) dlgLabel("Cell 0,11"); + + dlgCell(1, 0) dlgLabel("Cell 1,0"); + dlgCell(2, 0) dlgLabel("Cell 2,0"); + dlgCell(3, 0) dlgLabel("Cell 3,0"); + dlgCell(4, 0) dlgLabel("Cell 4,0"); + dlgCell(5, 0) dlgLabel("Cell 5,0"); + dlgCell(6, 0) dlgLabel("Cell 6,0"); + dlgCell(7, 0) dlgLabel("Cell 7,0"); + dlgCell(8, 0) dlgLabel("Cell 8,0"); + dlgCell(9, 0) dlgLabel("Cell 9,0"); + dlgCell(10, 0) dlgLabel("Cell 10,0"); + dlgCell(11, 0) dlgLabel("Cell 11,0"); + + dlgCell(1, 2, 4, 6) dlgTextEdit(Text); + dlgCell(1, 8) dlgComboBox(Colors, Selected); + dlgCell(2, 8) dlgCheckBox("&Mirror", mirror); + dlgCell(3, 8) dlgCheckBox("&Rotate", rotate); + + dlgCell(4, 8, 4, 8) dlgGroup("Gruop") { + dlgGridLayout { + dlgCell(6, 8) dlgRadioButton("&Top", align); + dlgCell(7, 8) dlgRadioButton("&Center", align); + dlgCell(8, 8) dlgRadioButton("&Bottom", align); + } + } + + dlgCell(6, 4) dlgPushButton("+OK") dlgAccept(); + dlgCell(7, 4) dlgPushButton("-CANCEL\n\nStop ULP\nand\nExit") dlgReject(); + dlgCell(7, 2) dlgPushButton("Reset") dlgReset(); + dlgCell(1, 1) dlgLabel(""); // this is a absolute path 2005.12.21 alf@cadsoft.de + dlgCell(1, 8) dlgLabel(""); // this is a relativ path 2005.12.21 alf@cadfsoft.de + dlgCell(9, 1) dlgLabel(""); + dlgCell(9, 8) dlgLabel(""); + + } + dlgLabel("a small example for Grid & Cell"); + }; +if (Result == 0) exit (0); + +Result = dlgDialog("Checkbox Demonstration"){ + dlgGroup("Orientation and Print") { + dlgCheckBox("&Mirror", mirror); + dlgCheckBox("&Rotate", rotate); + dlgCheckBox("&Flip", flip); + dlgCheckBox("&Black", black); + dlgCheckBox("&Solid", solid); + dlgCheckBox("S&caled", scaled); + } + dlgVBoxLayout { + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + } + }; +if (Result == 0) exit (0); + + +// Comboboxes +Result = dlgDialog("Combobox"){ + dlgComboBox(Colors, Selected); + dlgVBoxLayout { + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + } + }; +if (Result == 0) exit (0); + +// GridLayout - define cell by cell content + +Result = dlgDialog("Grid Layout"){ + dlgGridLayout { + dlgCell(0, 0) dlgLabel("Row 0/Col 0"); + dlgCell(1, 0) dlgLabel("Row 1/Col 0"); + dlgCell(0, 4) dlgLabel("Row 0/Col 4"); + dlgCell(5, 5) dlgLabel("Row 5/Col 5"); + dlgCell(10, 20) dlgPushButton("+OK") dlgAccept(); + dlgCell(10, 24) dlgPushButton("-Cancel") dlgReject(); + } + }; +if (Result == 0) exit (0); + +// input a Integer-Value +Result = dlgDialog("IntEdit"){ + dlgHBoxLayout { + dlgLabel("Enter a &Number between 0 and 99"); + dlgIntEdit(Value, 0, 99); + } + dlgVBoxLayout { + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + } + }; +if (Result == 0) exit (0); + +// List box selection field +Result = dlgDialog("List Box") { + dlgListBox(Colors, Selected) + dlgAccept(); + }; +dlgMessageBox("selected Color " + Colors[Selected]); +if (Result == 0) exit (0); + + +//Multi column list view selection field +string Colours[] = { "red\tThe color RED", "green\tThe color GREEN", "blue\tThe color BLUE" }; + +Selected = 1; +Result = dlgDialog("ListView") { + dlgListView("Name\tDescription", Colours, Selected) dlgAccept(); + dlgPushButton("+OK") dlgAccept(); + }; +dlgMessageBox("last selected\n" + Colours[Selected]); +if (Result == 0) exit (0); + + +// Predefined Button OK +Result = dlgDialog("Hello") { + dlgLabel("Hello world"); + dlgPushButton("+OK") dlgAccept(); + // look at the '+' character + }; + +// Radio Button +// can be used only in a dglGroup +align = 0; + +Result = dlgDialog("RadioButton") { + dlgGroup("Alignment") { + dlgRadioButton("&Top", align); + dlgRadioButton("&Center", align); + dlgRadioButton("&Bottom", align); + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (Result == 0) exit (0); + +// Input a real value + +real rValue = 33.333; +Result = dlgDialog("RealEdit"){ + dlgHBoxLayout { + dlgLabel("Enter a &Number between 0.0 and 99.0"); + dlgRealEdit(rValue, 0.0, 99.0); + dlgVBoxLayout { + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + } + } + }; +if (Result == 0) exit (0); + +sprintf(st, "%f", rValue); +dlgMessageBox("last real value = " + st); + +// Define additional space in a box layout context +// space is given in pixels +Result = dlgDialog("Spacing V-Box"){ + dlgVBoxLayout { + dlgLabel("Label V1"); + dlgSpacing(70); + dlgLabel("Label V2"); + } + }; +if (Result == 0) exit (0); + +Result = dlgDialog("Spacing HBox"){ + dlgHBoxLayout { + dlgLabel("Label H1"); + dlgSpacing(100); + dlgLabel("Label H2"); + } + }; +if (Result == 0) exit (0); + +// Select two values +Result = dlgDialog("Spinbox - select value for X and Y") { + dlgVBoxLayout { + dlgLabel("select &X"); // character & mark selected by ALT+Key + dlgSpinBox(Value, 0, 99); + dlgLabel("select &Y"); + dlgSpinBox(Wert, -99, 99); + dlgPushButton("+OK") dlgAccept(); + // + is the Default-Button [ENTER] + dlgPushButton("-throw away") dlgReject(); + // - is the Cancel-Button [ESC] + }; + }; +if (Result == 0) exit (0); + +dlgMessageBox("ATTENTION:\ndrag the next menu border line!", "OK"); + +// Define an empty stretchable space in a box layout context +Result = dlgDialog("Stretch horizontal") { + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(5); + dlgPushButton("Key B"); + dlgStretch(15); + dlgPushButton("Key C"); + dlgStretch(40); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(5); + } + }; + +if (Result == 0) exit (0); + +dlgMessageBox(" ATTENTION:\ndrag the next menu border line!", "OK"); + +Result = dlgDialog("Stretch vertical") { + dlgVBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(5); + dlgPushButton("Key 2"); + dlgStretch(15); + dlgPushButton("Key 3"); + dlgStretch(40); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + }; +if (Result == 0) exit (0); + +// Defines a string entry field +// define fixed length by dlgSpacing + +string Name = "Linus Torvalds"; +Result = dlgDialog("dlgStringEdit") { + dlgHBoxLayout dlgSpacing(400); + dlgStretch(0); + dlgLabel("Enter &Name"); + dlgStretch(0); + dlgStringEdit(Name); + dlgVBoxLayout { + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + dlgStretch(10); + }; + dlgStretch(1); + }; +if (Result == 0) exit (0); +dlgMessageBox("the last selected \n" + Name); + +// Define a tab page +align = 0; +int p_align = 0; + +Result = dlgDialog("Container for tab pages") { + //Define a container for tab pages + dlgTabWidget { + dlgTabPage("&Video") { + dlgHBoxLayout { + dlgLabel(""); + } + dlgHBoxLayout { + dlgLabel("Video mode"); + dlgGroup("Gruppe") { + dlgRadioButton("&Black and White", align); + dlgRadioButton("&White and Black", align); + } + } + } + dlgTabPage("&Printer") { + dlgLabel("Printer setup"); + dlgGroup("Gruppe") { + dlgRadioButton("&Top", p_align); + dlgRadioButton("&Center", p_align); + dlgRadioButton("&Bottom", p_align); + } + } + dlgTabPage("&Memory") { + dlgLabel("Memory setup"); + dlgCheckBox("R&otate", rotate); + dlgCheckBox("Mi&rror", mirror); + dlgCheckBox("&Flip", flip); + dlgCheckBox("&Swap", swap); + } + dlgTabPage("&Export") { + dlgLabel("select a file name for WRITE"); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("&File") { + string fileName; + fileName = dlgFileOpen("select a File", "*.*", "*.BRD\n*.SCH\n*.SCH\n*.ULP"); + }; + dlgStretch(1); + } + } + dlgTabPage("&Input") { + dlgLabel("select a file for read"); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("&File") { + string fileName; + fileName = dlgFileOpen("select a File", "*.*", ""); + }; + dlgStretch(1); + } + } + dlgTabPage("&Help") { + dlgLabel(""); + dlgLabel("Copyright (c) 1988-2000 CadSoft Computer GmbH"); + } + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + dlgLabel(" <--------> "); + dlgStretch(0); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + }; +if (Result == 0) exit (0); + +string sresult; +sprintf(sresult, "%d", Value); +cmd = "selected X = " + sresult + ".\n"; +sprintf(sresult, "%d", Wert); +cmd += "selected Y = " + sresult + ".\n"; + +Result = dlgDialog("Editor Window") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (Result == 0) exit (0); + +dlgMessageBox(cmd); + +//Define a multiline text viewer field +Text = "This is some text.\nLine 2\nLine 3"; +string Text2 = "This is the 2nd text.\nLine 2\nLine 3"; +Text2 += "\n...\n...\n...\n...\nScroll-\nbars\non?\n"; +Text2 += "OK\nEnd."; + +Result = dlgDialog("List Window") { + dlgVBoxLayout { + dlgLabel("&View the text"); + dlgTextView(Text); + + dlgLabel("Vie&w the text"); + dlgTextView(Text2); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + } + }; +if (Result == 0) exit (0); + +// Button +int haveButton = 1; +Result = dlgDialog("Test") { + dlgLabel("Start"); + if (haveButton) + dlgPushButton("Here") dlgAccept(); + }; +if (Result == 0) exit (0); + +Result = dlgDialog("'3 Boxes close by ESC") { + dlgHBoxLayout { + dlgLabel("Box 1"); + dlgLabel("Box 2"); + dlgLabel("Box 3"); + dlgPushButton("+OK") dlgAccept(); + } + }; +if (Result == 0) exit (0); + +Result = dlgDialog("selected Color") { + dlgVBoxLayout { + dlgLabel("selected Color"); + dlgLabel(Colors[Selected]); + } + }; +if (Result == 0) exit (0); + +// Redisplays the dialog after changing values +string Status[] = { "Idle", "1st run", "2nd run", "3rd run", "Finished" } ; +int stat = 0; +string labstr = Status[0]; + +Result = dlgDialog("Test") { + dlgLabel(labstr); + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(-3); + dlgPushButton("Run") { + if (stat < 4) stat++; + labstr = Status[stat]; + dlgRedisplay(); + // some program action here... + } + dlgPushButton("Reset") { + dlgReset(); + stat = 0; + labstr = Status[stat]; + dlgRedisplay(); + } + }; +if (Result == 0) exit (0); + +sprintf(cmd, "%d", Result); +dlgMessageBox(cmd); + +int Number = 99; +string dlgStr = "Empty"; +real rVal = 9.99; + +Result = dlgDialog("Reset Int & Real to 0") { + dlgIntEdit(Number); + dlgRealEdit(rVal); + dlgStringEdit(dlgStr); + dlgPushButton("+OK") dlgAccept(42); + dlgPushButton("Cancel") dlgReject(); + dlgPushButton("Reset") dlgReset(); + }; +if (Result == 0) exit (0); + +// File handling +int n = 0; +char b[]; + +string fileName = dlgFileOpen("select File", "*.*", "*.BRD\n*.SCH\n*.SCH\n*.ULP"); + + int nBytes = fileread(b, fileName); + for (int x = 0; x < nBytes; x++) { + cmd += b[x]; + } +dlgMessageBox(fileName +"\nread", "OK"); diff --git a/eagle-5.7.0/ulp/ex-dlglist.ulp b/eagle-5.7.0/ulp/ex-dlglist.ulp new file mode 100644 index 0000000..743f570 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-dlglist.ulp @@ -0,0 +1,25 @@ +#usage "Example: Two multiline text viewer fields\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Text = "This is some text.\nLine 2\nLine 3"; +string Text2 = "This is text number 2\nLine 2\nLine 3"; +Text2 += "\n...\n...\n...\n...\n...\n...\n...\n...\n"; +Text2 += "end of text2."; + +int Result = dlgDialog("List-Fenster") { + dlgVBoxLayout { + dlgLabel("&View text 1"); + dlgTextView(Text); + + dlgLabel("Vie&w text 2"); + dlgTextView(Text2); + } + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + } + }; +if (Result == 0) exit (0); diff --git a/eagle-5.7.0/ulp/ex-file-copy.ulp b/eagle-5.7.0/ulp/ex-file-copy.ulp new file mode 100644 index 0000000..a2f6045 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-file-copy.ulp @@ -0,0 +1,30 @@ +#usage "Example: Copy a file\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string fileName; +string test = ""; +int Result = 0; +int nBytes = 0; +int start = 0; +char c[]; + +fileName = dlgFileOpen("Select a file", "*.*"); + +nBytes = fileread(c, fileName); + +sprintf(test, "%d = &%x", nBytes, nBytes); +dlgMessageBox("Length of File = " + test); + +dlgMessageBox("Write " + fileName + "?"); +fileName += ".copy"; +output(fileName, "wb") { + for (int z = 0; z < nBytes; z++) { + printf("%c", c[z]); + Result = z+1; + } + } +sprintf(test, "%d = $%x", Result, Result); +dlgMessageBox("Length of File = " + test, "OK"); diff --git a/eagle-5.7.0/ulp/ex-include.ulp b/eagle-5.7.0/ulp/ex-include.ulp new file mode 100644 index 0000000..0c586bf --- /dev/null +++ b/eagle-5.7.0/ulp/ex-include.ulp @@ -0,0 +1,22 @@ +#usage "Example: Usage of include file\n" + "

" + "Demonstrates how to use the include file 'useful-routines.ulp'." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +#include "useful-routines.ulp" + +int Result; +string s1, s2, h; + +s1 = "DISLAY ALL;\n"; +s2 = get_ulp_name(); +Result = edit_save_execute(s1, s2); +sprintf(h, "Result: %d", Result); +dlgMessageBox(h, "OK"); + +dlgMessageBox("ULP path: "+get_ulp_path(),"OK"); + +dlgMessageBox("Project path: "+get_project_path(),"OK"); diff --git a/eagle-5.7.0/ulp/ex-input-file.ulp b/eagle-5.7.0/ulp/ex-input-file.ulp new file mode 100644 index 0000000..69499d3 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-input-file.ulp @@ -0,0 +1,75 @@ +#usage "Example: Input file dialog\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +int n = 0; // global counter +char b[]; +string fileName = ""; + +fileName = dlgFileOpen("Select a File", ""); +int nBytes = fileread(b, fileName); + + for (n; n < nBytes; n++) { + switch (b[n]) { + case 0: break; + + case 1: cmd += "Device\n"; + break; + + case 2: cmd += "\nEND - HEADER\n"; + break; + + case 3: cmd += "\nEND - 3\n"; + break; + + case 4: cmd += "4"; + break; + + case 5: break; + + case 6: break; + + case 7: break; + + case 8: break; + + case 9: cmd += "\t"; + break; + + + case 10: cmd += "Line Feed\n"; + break; + + case 12: cmd += "\nNew Page\n"; + break; + + case 13: cmd += "Carriage Return\n"; + break; + + case 27: cmd += "\nEscape\n"; + break; + + case 32: cmd += ".space." + b[n]; + break; + + default: cmd += b[n]; + break; + } + } + // Demo Text Editor Box + dlgDialog("Text Editor Box") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Ok") { + dlgAccept(); + output("test.txt", "wt") { + printf(cmd); + } + }; + dlgPushButton("-Cancel") dlgReject(); + } + }; + exit(0); diff --git a/eagle-5.7.0/ulp/ex-loop-lbrs.ulp b/eagle-5.7.0/ulp/ex-loop-lbrs.ulp new file mode 100644 index 0000000..a2a5450 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-loop-lbrs.ulp @@ -0,0 +1,67 @@ +#usage "Example: Check all libraries in a directory\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string a[], par, lbr_path, dest, cmd = "", s, progname; +int lbrpnt, x; + +//-------------------------------------------------- +string checklbr (UL_LIBRARY L) { + int errflag = 0; + string h; + L.devices(D) { + h = ""; + sprintf(h,"%s",D.description); + h = strlwr(h); + if (strstr(h, "") >= 0 && !errflag) { + cmd += L.name+"\n"; + errflag = 1; + } + } + if (errflag) return "***"; + else return ""; + } + + +//-------- main program -------------------------------------------------- +progname = filesetext(filename(argv[0]), ""); +library(L) { + lbr_path = filedir(L.name); + } +dest = lbr_path+"error.txt"; + +lbrpnt = strtod(argv[1]); +int n = fileglob(a, lbr_path+"*.lbr"); + +if (n) { + if (lbrpnt < 1) { // first run +// initial actions, e.g. headline +//------------------------------------------------------------------------ + output(dest, "wt") printf("Faulty Libraries marked with ***\n\n"); +//------------------------------------------------------------------------ + exit("OPEN '"+lbr_path+filename(a[0])+"';\nRUN '"+progname+"' 1"); + } + else { // next runs + library(L) { +// insert here whatever you want to do with the current library +//------------------------------------------------------------------------ + s = checklbr(L); + output(dest, "at") printf("%s%s\n",L.name, s); +//------------------------------------------------------------------------ + lbrpnt++; + sprintf(par, "%d", lbrpnt); + if (lbrpnt == n) exit(0); + exit("OPEN '"+lbr_path+filename(a[lbrpnt])+"';\nRUN '"+progname+"' "+par+"\n"); + } + } + } diff --git a/eagle-5.7.0/ulp/ex-run-script.ulp b/eagle-5.7.0/ulp/ex-run-script.ulp new file mode 100644 index 0000000..c8d2e10 --- /dev/null +++ b/eagle-5.7.0/ulp/ex-run-script.ulp @@ -0,0 +1,32 @@ +#usage "Example: Export a script and execute it\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev = ""; + +cmd += "OPEN TEST.LBR;\n"; +cmd += "Edit testxx.pac;\n"; +cmd += "change Layer tPlace;\n"; +cmd += "Grid MIL ON;\n"; +cmd += "; WIRE 1 (-100 -100) (230 360);\n"; +cmd += "; WIRE 20 (-10 -50) (130 60);\n"; +cmd += "WIN FIT;\n;"; + +string ulp_path; + +// ** always use '/' as path delimiter to keep ULPs platform independent ** + +char bkslash = '/'; +int pos = strrchr(argv[0], bkslash); +if (pos >= 0) { // split path from filename + ulp_path = strsub(argv[0], 0, pos + 1); + } + +output(ulp_path + "v4test.scr", "wt") { + printf(cmd); +} + +exit("; SCR '" + ulp_path + "v4test.scr';\n"); diff --git a/eagle-5.7.0/ulp/exp-descr-html.ulp b/eagle-5.7.0/ulp/exp-descr-html.ulp new file mode 100644 index 0000000..e6b6d17 --- /dev/null +++ b/eagle-5.7.0/ulp/exp-descr-html.ulp @@ -0,0 +1,90 @@ +#usage "Export descriptions of devices and packages to HTML\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string descript[]; +int count = 0; +int n = 0; + +// find some path names --------- +string ulp_path = ""; +string eagle_path = ""; // certain only for EAGLE standard installation +string doc_path = ""; // certain only for EAGLE standard installation +string direntry[]; +char c = '/'; +int dirnr, j; + int pos = strrchr(argv[0], c); + if (pos >= 0) { + ulp_path = strsub(argv[0], 0, pos + 1); + eagle_path = ulp_path; + eagle_path = strsub(eagle_path, 0, pos); + int pos = strrchr(eagle_path, c); + if (pos >= 0) { + eagle_path = strsub(eagle_path, 0, pos + 1); + dirnr = fileglob(direntry, eagle_path+"*"); + doc_path = eagle_path; + for (j; j<= dirnr; j++) { + if (strrstr(direntry[j], "doc/") > 0) { + doc_path = direntry[j]; + } + } + } + } + +// find string s2 in s1, and replace with s3 +string replace_string(string s1, string s2, string s3) { +int i, pos = 1; + string a = s1; + while (pos >= 0) { + pos = strstr(a, s2); + if (pos < 0) break; + string st1 = strsub(a, 0, pos); + string st2 = strsub(a, pos + strlen(s2)); + a = st1+s3+st2; + } + return a; + } + +if (library) library(L) { + L.devicesets(D) { + count++; + dev[count] = D.name; + descript[count] = replace_string(D.description, "

", "
"); + + 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

\n", dev[count], descript[count]); + cmd += h; + } + + L.packages(P) { + count++; + dev[count] = P.name; + descript[count] = replace_string(P.description, "

", "
"); + 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

\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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string descript[]; +string dest; +int count = 0; +int n = 0; + +// Find some path names --------- +string ulp_path = ""; +string eagle_path = ""; // certain only for EAGLE standard installation +string scr_path = ""; // certain only for EAGLE standard installation +string direntry[]; +char c = '/'; +int dirnr, j; + int pos = strrchr(argv[0], c); + if (pos >= 0) { + ulp_path = strsub(argv[0], 0, pos + 1); + eagle_path = ulp_path; + eagle_path = strsub(eagle_path, 0, pos); + int pos = strrchr(eagle_path, c); + if (pos >= 0) { + eagle_path = strsub(eagle_path, 0, pos + 1); + dirnr = fileglob(direntry, eagle_path+"*"); + scr_path = eagle_path; + for (j; j<= dirnr; j++) { + if (strrstr(direntry[j], "scr/") > 0) { + scr_path = direntry[j]; + } + } + } + } +//-------------------------------- + +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; + } + + if (library) library(L) { + L.devicesets(D) { + count++; + dev[count] = D.name; + descript[count] = replacenewline(D.description); + string h = ""; + sprintf(h, "EDIT %s.dev ;\nDESCRIPT '%s'\n", dev[count], descript[count]); + cmd += h; + } + + L.packages(P) { + count++; + dev[count] = P.name; + descript[count] = replacenewline(P.description); + + string h = ""; + + int l = strlen(dev[count]); + string s = strsub(dev[count], 0, 2); + string t = strsub(dev[count], 3, l); + + sprintf(h, "EDIT %s.pac ;\nDESCRIPT '%s'\n", dev[count], descript[count]); + cmd += h; + } + + cmd = "SET UNDO_LOG OFF;\n" + cmd + "SET UNDO_LOG ON;\n"; + + // EditBox + dlgDialog("Descriptions") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Ok") dlgAccept(); + dlgPushButton("-Cancel Changes") dlgReject(); + } + }; + +// define destination path name +// for a fixed destination, delete next line, uncomment the one after +// the next line and edit it + dest = dlgFileSave("Save Description File", scr_path+"descript.scr", "*.scr"); +//dest = "c:/eagle/scr/descript.scr"; + + if (dest == "") exit(0); + output(dest, "wt") { + printf(cmd); + } + } diff --git a/eagle-5.7.0/ulp/exp-project-lbr.ulp b/eagle-5.7.0/ulp/exp-project-lbr.ulp new file mode 100644 index 0000000..7bf9b19 --- /dev/null +++ b/eagle-5.7.0/ulp/exp-project-lbr.ulp @@ -0,0 +1,961 @@ +#usage "Create library or libraries from schematic/board

\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.
" + "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

" + "Author: support@cadsoft.de" + + +string Version = "4.2.2"; // 2008-09-11 support@cadsoft.de + +// 2006-02-27 - Function DisplayHelp() header line changed support@cadsoft.de +// 2006-10-27 - corrected rotation of RECT, draw always vertical +// 2007-01-08 - correct Apostroph in Pin and Pad names +// 2007-01-17 - correct function addApostroph() +// 2008-09-11 - change command ARC (x y) (x y) (x y) to WIRE (x y) +-curve (x y), +// if a short wire a arc from a wide circle + +int trash_layer = 250; // put anything here which is in wrong layers + +string PrevName = ""; +string x[] = { " " }; +string CurrentLbrName = ""; +string EditName; +string h, cmd = "", logf = ""; +string ScriptName, PureScriptName; +string LogName, PureLogName; +string WorkPath; +string Status = ""; +int n; +int NameIndex = 0; +int IsPackage = 1; +int onelib = 0, show_script = 0, save_log = 1; +int in_board; +enum {no_mode, in_symbol, in_package}; +int mode = no_mode; +int generate_lbrname = 1; +string edit_names[]; +int cnt_edit = 0; + + +string HelpText = + "Create project library from schematic or board

\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" + "   SET USED_LAYERS ALL

\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.
" + "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 0) { + s = strsub(s, 0, pos); + } + return change_at(s); +} + + +int exist_file(string FileName) { + string a[]; + int n = fileglob(a, FileName); + if (n == 0) return 0; + else return 1; +} + +void CreateLBRdescription(string project_name) { + sprintf(h, "DESCRIPTION 'Generated from %s

\\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, "To many Technologies %d in Device %s.DEV (Library: %s.lbr), max. 254 allowed!", n, dev, lib); + if (dlgMessageBox(s, "OK", "Cancel") != 0)exit(0); + } + return; +} + +string separate(string techno) { + string t[]; + int n = strsplit(t, techno, ' '); + string tec = ""; + for (int nx = 0; nx < n; nx++) { + if (t[nx] == "''") tec += t[nx] + " "; + else tec += "'"+t[nx]+"' "; + } + return tec; +} + + +// ************************************************ +// see also *** export-schematic_mil-board_mm-script.ulp *** +// ************************************************ +string checkGateName(string name) { + if (name == "") name = "_"; + else { + for (int x = 0; x < strlen(name); x++) { + if (name[x] == ' ') name[x] = '-'; + } + } + return name; +} + +void DrawDevice(UL_DEVICESET D, UL_LIBRARY LBR) { + string GateAddlevel; + string symname; + cmd += "DESCRIPTION "+replacenewline(D.description)+";\n"; + cmd += "PREFIX '"+D.prefix+"';\n"; + cmd += "VALUE "+D.value+";\n"; + D.gates(G) { + switch (G.addlevel) { + case GATE_ADDLEVEL_NEXT : GateAddlevel = "Next"; break; + case GATE_ADDLEVEL_MUST : GateAddlevel = "Must"; break; + case GATE_ADDLEVEL_CAN : GateAddlevel = "Can"; break; + case GATE_ADDLEVEL_REQUEST : GateAddlevel = "Request"; break; + case GATE_ADDLEVEL_ALWAYS : GateAddlevel = "Always"; + }; + sprintf(h, "CHANGE Addlevel %s;\n", GateAddlevel); cmd += h; + sprintf(h, "CHANGE Swaplevel %d;\n", G.swaplevel); cmd += h; + + if (onelib && generate_lbrname) + symname = strip_at_num(LBR.name) + "_" + strip_at_num(G.symbol.name); + + else + symname = strip_at_num(G.symbol.name); + + sprintf(h, "ADD %s '%s' (%f %f);\n", symname, checkGateName(G.name), u2mic(G.x), u2mic(G.y)); cmd += h; + } + D.devices(DV) { + if (DV.package) { + if (onelib && generate_lbrname) + cmd += "PACKAGE '" + strip_at_num(LBR.name) + "_"+ strip_at_num(DV.package.name) + "' " + strip_at_num(DV.name) + ";\n"; + + else + cmd += "PACKAGE '" + strip_at_num(DV.package.name) + "' " + strip_at_num(DV.name) + ";\n"; + + string techno = DV.technologies; + checktechno(techno, D.name, D.library); + techno = separate(techno); // set allways in ' 2006.02.27 support@cadsoft.de + // to allow '(' + ')' character in technology + cmd += "TECHNOLOGY "+techno+";\n"; + } + DV.gates(G) { + G.symbol.pins(P) { + if (DV.package) { + if (P.contact) { + sprintf(h, "CONNECT '%s.%s' '%s';\n", checkGateName(G.name), addApostroph(P.name), addApostroph(P.contact.name) ); cmd += h; + } + } + } + } + } + return; +} + +//---------------- +void OutputUnmistakablePackages(UL_LIBRARY LBR) { + PrevName = ""; + if (exist_file(WorkPath+CurrentLbrName+".lbr")) { + sprintf(h, "REMOVE '%s';\n", WorkPath+CurrentLbrName+".lbr"); cmd += h; // delete existing lbr + } + sprintf(h, "OPEN '%s.lbr';\n", WorkPath+CurrentLbrName); cmd += h; + CreateHeader(LBR); + LBR.packages(P) { + if (PrevName != strip_at_num(P.name)) { + logf += " PAC: "+ strip_at_num(P.name) + "\n"; Status = " PAC: " + strip_at_num(P.name); dlgRedisplay(); + NameIndex = 0; + sprintf(h, "Edit %s.PAC;\n", strip_at_num(P.name)); cmd += h; + DrawPackage(P); + } + else { + NameIndex++; + sprintf(h, "Edit %s$%02d.PAC;\n", strip_at_num(P.name), NameIndex); cmd += h; + //logfile + sprintf(h, " PAC: %s renamed to %s$%02d\n", strip_at_num(P.name), strip_at_num(P.name), NameIndex); logf += h; Status = h; dlgRedisplay(); + // end logfile + DrawPackage(P); + // cmd += "WIN FIT;\n"; + } + PrevName = P.name; + cmd += "DESCRIPTION "+replacenewline(P.description)+";\n"; + } + return; +} + +// ---------------------------------------------------------------------------------------- +int is_new(void) { // n = nr of entries + int i; + if (n == 0) return 1; + for (i = 0; i < n; i++) { + if (x[n] == x[i]) { + return(0); + } + } + return 1; +} + +// --------- +void CreateOneLibHeader(UL_LIBRARY LBR, string project_name) { + if (exist_file(WorkPath+CurrentLbrName+".lbr")) { + sprintf(h, "REMOVE '%s';\n", WorkPath+CurrentLbrName+".lbr"); cmd += h; // delete exitsting lbr + } + sprintf(h, "OPEN '%s.lbr';\n", WorkPath+CurrentLbrName); cmd += h; + CreateHeader(LBR); + CreateLBRdescription(project_name); +} + +// --------- +void OutputPackages(UL_LIBRARY LBR) { + string pacname; + LBR.packages(P) { + if (!generate_lbrname && at_num(P.name) ) ; + else { + if (onelib && generate_lbrname) + pacname = strip_at_num(LBR.name) + "_" + strip_at_num(P.name); + + else + pacname = strip_at_num(P.name); + + n++; + x[n] = pacname; + if (is_new()) { + logf += " PAC: "+pacname+"\n"; Status = " PAC: "+P.name; dlgRedisplay(); + sprintf(h, "Edit %s.PAC;\n", strip_at_num(pacname)); cmd += h; + DrawPackage(P); + cmd += "DESCRIPTION "+replacenewline(P.description)+";\n"; + // cmd += "WIN FIT;\n"; + } + } + } + return; +} + +void OutputSymbols(UL_LIBRARY LBR) { + string symname; + LBR.symbols(S) { + if (!generate_lbrname && at_num(S.name) ) ; + else { + if (onelib && generate_lbrname) + symname = strip_at_num(LBR.name) + "_" + S.name; + + else + symname = strip_at_num(S.name); + + n++; + x[n] = symname; + if (is_new()) { + logf += " SYM: " + symname + "\n"; Status = " SYM: " + S.name; dlgRedisplay(); + sprintf(h, "Edit %s.SYM;\n", symname); cmd += h; + DrawSymbol(S); + // cmd += "WIN FIT;\n"; + } + } + } + return; +} + +void OutputDevices(UL_LIBRARY LBR) { + string dname; + LBR.devicesets(D) { + if (!generate_lbrname && at_num(D.name) ) ; + else { + if (onelib && generate_lbrname) + dname = strip_at_num(LBR.name) + "_" + strip_at_num(D.name); + + else + dname = strip_at_num(D.name); + + n++; + x[n] = dname; + if (is_new()) { + logf += " DEV: " + dname+"\n"; Status = " DEV: " + strip_at_num(D.name); dlgRedisplay(); + NameIndex = 0; + sprintf(h, "Edit %s.DEV;\n", dname); cmd += h; + DrawDevice(D, LBR); + // cmd += "WIN FIT;\n"; + } + } + } + return; +} + +// ------------ +void createMechanical(void) { + if (dlgMessageBox("Eport also only mechanical packages from board?", "Yes", "No") != 0) return; + + if (project.board) { + project.board(B) { // extract also ONLY mechanical packages (without pads/smds) + + B.libraries(LBR) { + CurrentLbrName = strip_at_num(LBR.name); + LBR.packages(PAC) { + + int k; + PAC.contacts(C) { + k++; + } + if (!k) { + + logf += "LIBRARY: "+CurrentLbrName+".lbr\n"; + + PrevName = ""; + sprintf(h, "OPEN '%s.lbr';\n", WorkPath+CurrentLbrName); cmd += h; + + LBR.packages(P) { + + + int kontakt; + P.contacts(C) { + kontakt++; + } + if (!kontakt) { + if (PrevName != strip_at_num(P.name)) { + logf += " PAC: "+ strip_at_num(P.name) + "\n"; Status = " PAC: " + strip_at_num(P.name); dlgRedisplay(); + NameIndex = 0; + sprintf(h, "Edit %s.PAC;\n", strip_at_num(P.name)); cmd += h; + cmd += "SET WIRE_BEND 2;\n"; + DrawPackage(P); + } + else { + NameIndex++; + sprintf(h, "Edit %s$%02d.PAC;\n", strip_at_num(P.name), NameIndex); cmd += h; + //logfile + sprintf(h, " PAC: %s renamed to %s$%02d\n", strip_at_num(P.name), strip_at_num(P.name), NameIndex); logf += h; Status = h; dlgRedisplay(); + // end logfile + cmd += "SET WIRE_BEND 2;\n"; + DrawPackage(P); + // cmd += "WIN FIT;\n"; + } + PrevName = P.name; + cmd += "DESCRIPTION "+replacenewline(P.description)+";\n"; + } + } + } + cmd += "WRITE;\n"; + break; + } + } + } + } + return; +} + + +void make_lbr(void) { + if (board) board(B) { + in_board = 1; + B.libraries(LBR) { + CurrentLbrName = strip_at_num(LBR.name); + LBR.packages(PAC) { + logf += "LIBRARY: "+CurrentLbrName+".lbr\n"; + OutputUnmistakablePackages(LBR); + cmd += "WRITE;\n"; + break; + }; + } + } + if (schematic) schematic(SCH) { + in_board = 0; + SCH.libraries(LBR) { + CurrentLbrName = strip_at_num(LBR.name); + LBR.devices(DEV) { + logf += "LIBRARY: "+CurrentLbrName+".lbr\n"; + OutputUnmistakablePackages(LBR); + n=0; + OutputSymbols(LBR); + n=0; + OutputDevices(LBR); + cmd += "WRITE;\n"; + break; + }; + } + createMechanical(); + } + CreateTrailer(); +} + +//------------------- +void make_one_lbr(void) { + if (board) board(B) { + in_board = 1; + B.libraries(LBR) { + CurrentLbrName = strip_at_num(filesetext(EditName, "")); + logf += "LIBRARY: "+CurrentLbrName+".lbr\n"; + CreateOneLibHeader(LBR, B.name); + break; + } + n = 0; + B.libraries(LBR) { + OutputPackages(LBR); + } + cmd += "WRITE;\n"; + createMechanical(); + CreateTrailer(); + } + + if (schematic) schematic(SCH) { + in_board = 0; + SCH.libraries(LBR) { + CurrentLbrName = strip_at_num(filesetext(EditName, "")); + logf += "LIBRARY: "+CurrentLbrName+".lbr\n"; + CreateOneLibHeader(LBR, SCH.name); + break; + } + n = 0; + SCH.libraries(LBR) { + OutputPackages(LBR); + } + n = 0; + SCH.libraries(LBR) { + LBR.devices(DEV) { + OutputSymbols(LBR); + } + } + n = 0; + SCH.libraries(LBR) { + LBR.devices(DEV) { + OutputDevices(LBR); + } + } + cmd += "WRITE;\n"; + createMechanical(); + CreateTrailer(); + } + return; +} + +// ----------- +void show_save_log_file(string cm) { + if(show_script) { + int R = dlgDialog("Save Log File") { + dlgVBoxLayout { + dlgLabel("Edit only if you are sure what you do!"); + dlgTextEdit(cm); + dlgHBoxLayout { + dlgPushButton("+Ok") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + } + }; + if (R) { + LogName = dlgFileSave("Save Script File", WorkPath+PureLogName, "*.log"); + if (LogName != "") output(LogName, "wtD") printf("%s", cm); + } + } + else { + output(WorkPath+PureLogName, "wtD") printf("%s", cm); + } + return; +} + +// ----------- + +void show_save_script_file(string cm) { + if (show_script) { + int R = dlgDialog("Save Script File") { + dlgVBoxLayout { + dlgLabel("Edit only if you are sure what you do!"); + dlgTextEdit(cm); + dlgHBoxLayout { + dlgPushButton("+Ok") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + } + }; + if (R) { + ScriptName = dlgFileSave("Save Script File", WorkPath+PureScriptName, "*.scr"); + if (ScriptName != "") output(ScriptName, "wtD") printf("%s", cm); + } + } + else { + ScriptName = WorkPath+PureScriptName; + output(ScriptName, "wtD") printf("%s", cm); + } + return; +} + +//------------ main ---------------------------------------- + +if (library) { + dlgMessageBox(usage + "ERROR


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

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

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

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

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +#require 5.0200; + +string Version = "1.1"; // 2008-10-24 export Matrix - alf@cadsoft.de + +string grid[] = { "MIC", "MM", "MIL", "INCH" }; +int Gridval = 1; // 0=mic 1=mm 2=mil 3=inch *** + // choose the value for the units you're working with + +string cmd, s; +string projectm; + +real u2u(int val) { + switch(Gridval) { + case 0 : return u2mic(val); + case 1 : return u2mm(val); + case 2 : return u2mil(val); + case 3 : return u2inch(val); + } +} + +void savescr(string projectname) { + string file = dlgFileSave("save CLASS script", filesetext(projectname, "-class.scr"), "*.scr"); + if (file) { + output(file, "wt" ) printf("%s", cmd); + exit(0); + } + else return; +} + +void menue(string projectname) { + int Result = dlgDialog("Export Net CLASSes") { + dlgHBoxLayout dlgSpacing(600); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(400); + dlgTextEdit(cmd); + } + dlgHBoxLayout { + dlgPushButton("+&Cancel") dlgAccept(); + dlgPushButton("&Save script") savescr(projectname); + dlgStretch(1); + } + }; + if (Result == 0) exit (0); + return; + } + +void class(UL_CLASS C) { + int classn = C.number; + for (int n = 0; n <= C.number; n++) { + if (C.name) { + sprintf(s, "CLASS %d '%s' %.4f %d:%.4f %.4f;\n", C.number, C.name, u2u(C.width), n, u2u(C.clearance[n]), u2u(C.drill) ); + cmd += s; + } + } +} + +// main +if (board) board(B) { + projectm = B.name; + sprintf(cmd, "# export from %s\n# at %s with %s Version %s\nGRID %s\n;", B.name, t2string(time()), EAGLE_SIGNATURE, Version, grid[Gridval]); + B.classes(C) class(C); +} + +else if (schematic) schematic(S) { + projectm = S.name; + sprintf(cmd, "# export from %s\n# at %s with %s Version %s\nGRID %s;\n", S.name, t2string(time()), EAGLE_SIGNATURE, Version, grid[Gridval]); + S.classes(C) class(C); +} + +else if (library) dlgMessageBox("start this ULP in Board or Schematic", "OK"); + +cmd += "GRID LAST;\nCLASS"; +menue(projectm); diff --git a/eagle-5.7.0/ulp/fabmaster.ulp b/eagle-5.7.0/ulp/fabmaster.ulp new file mode 100644 index 0000000..b5080a0 --- /dev/null +++ b/eagle-5.7.0/ulp/fabmaster.ulp @@ -0,0 +1,1351 @@ +#usage "Generate EAGLE Output in Fabmaster Format FATF REV 11.1

\n" + "See program text for more information

" + "ULP Rev. 1.42
" + "Author: support@cadsoft.de" + +string ULPversion = "V1.42"; + +/////////////////////////////////////////////////////////////////////////////////////////// +// ASCII Transfer Format (FATF) FABmaster software V8.E - 11 August 2000 // +// FABMASTER FATF REV 11.1 // +// // +// // +// Rev. 1.42: quick find pin-name part-name // +// 2009-12-04 by support@cadsoft.de // +// // +// Rev. 1.41: Corrected LAYER_NAMES definition for BPLACE // +// March 2007 by support@cadsoft.de // +// // +// Revision 1.4: Export Layer 51/52 (Layer table expanded) // +// Febr. 2007 support@cadsoft.de // +// // +// Revision 1.3: Export Wires with Arc, rotated Pads, Pad Shape Long & Offset // +// rotated Packages in 0.1 degree // +// export rectangle and circle on layer 1, 16, 21, 22 // +// export polygon filling on klayer 1, 16 // +// export text on layer 1,16,21,22 as wire (**vector font**) // +// Mai 2004 by support@cadsoft.de // +/////////////////////////////////////////////////////////////////////////////////////////// +// Revision 1.2: Slightly changed in the output statement, so that the Fabmaster file // +// will be written in the same directory as the brd file is. // +// November 2001 by support@cadsoft.de // +/////////////////////////////////////////////////////////////////////////////////////////// +// Revision 1.1: Runs with EAGLE version >= 4; top pad shape assumed for all layers; +// fixed bug in EAGLE version output +/////////////////////////////////////////////////////////////////////////////////////////// +// Rudi Hofer, CadSoft, rudi.hofer@cadsoft.de, 9/99 +// +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESSED OR IMPLIED. +// +// This ULP generates output for FABMASTER software which is able to convert the +// data for automatic mounting and test equipment. The resolution is fixed to 1 mil. +// +// To generate the output, load the board and run this ULP from the board window. +// +// Restrictions and prerequisites: +// - Board outline must be defined as wires in dimension layer (directly in +// board or in a package). +// - All coordinates must be positive!!! Please move the board accordingly!!! +// - Do not use different packages with the same name (avoid REPLACE command). +// - Padtypes octagon, xlongoct, ylongoct are realized with round shapes. +// - For polygons no output is generated. +// - Inner layer Route2..5 may contain tracks. +// - Inner layer Route6 may contain a power plain (no output generated yet!). +// - For all other inner layers no output is generated. +// - On the top and bottom layers only wires and smd pads are output. +// Exception: Circles defined in a package are output as filled circles +// but do not belong to a signal. +// +/////////////////////////////////////////////////////////////////////////////////////////// + +if (EAGLE_VERSION * 100 + EAGLE_RELEASE < 411) { + string h; + sprintf(h, "Eagleversion %d %d ", EAGLE_VERSION, EAGLE_RELEASE); + dlgMessageBox(h + "This ULP does not run in Eagle Versions older than 4.11", "OK"); + exit(0); +} + + +string jobname, + layer_name[], + padshape[] = {"P_ROUND","P_ROUND","P_ROUND","P_ROUND","P_ROUND"},// if long/offset subst. by round + viashape[] = {"P_BLOCK","P_ROUND","P_ROUND","P_ROUND","P_ROUND"},// if long/offset subst. by round + padname, + shapename[], // package names + t[], // padtypes + pst[]; // padstacktypes + +real cx, cy, rx, ry, x, y, x1, x2, y1, y2, r, a1, a2;; +real delta = 5; + +int i, new, sx, + padcount, + pad_is_numeric, + // eagle to fabmaster layer conversion + // eagle 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 ** Feb. 2007 ** + flayer[] = {0, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0,16,16,17, 0, 0,18,19,20,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,16,17}; + +string partnumname[]; // 2009-12-03 quick find pin-name part-name +int cntnumname = 0; + +numeric string areaEname[]; +int indexareaEname[]; +int cntindex = 1; + // create pad number index list +numeric string areaEpadname[]; +int areaPadNumber[]; // the number of pad in FATF format +int cntEpad = 1; + + +int sizes[], ratio[]; // Text fonts +int cntt = 0; +int boardroundness = 100; // global roundness (design rules) + +int xmin = 32000, xmax = 0, ymin = 32000, ymax = 0; + +int ht = time(); + +//----------------------------------------------------- +string validname (string s) { + int i; + for (i = 0; s[i]; i++) { + if (s[i] == ',') s[i] = '_'; + if (s[i] == ';') s[i] = '_'; + if (s[i] == ')') s[i] = '_'; + // add further substitutions here + } + return s; +} +//----------------------------------------------------- +int fablayer(int l) { + return flayer[l]; +} + +//----------------------------------------------------- +int u2u(int x) { // resolution 1/1000 inch + return u2mil(x); // mil +} + +//----------------------------------------------------- +real deg2arc(int x) { // degree to arc + return x*PI/180; +} + +//----------------------------------------------------- +int u2ang(real x, int mirror) { + if (mirror) { + real m = 360 - x; + if (m > 180) m -= 180; + else m += 180; + x = round((360 - m) * 10); // clockwise in FABMASTER!!! + } + else { + x = round((360 - x) * 10); // clockwise in FABMASTER!!! + } + return x; +} + +//---------------------------------------------------- +real Xneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } +} + +real Yneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } +} + + +//----------------------------------------------------- +string padtype(UL_ELEMENT E, UL_CONTACT C) { + string s; + int pdi, x1, y1, x2, y2, r, d; + if (C.pad) { + pdi = u2u(C.pad.diameter[16]); + if (C.pad.shape[16] == PAD_SHAPE_ROUND || C.pad.shape[16] == PAD_SHAPE_OCTAGON || C.pad.shape[16] == PAD_SHAPE_SQUARE) { + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + // if long subst. by round use this code + else if (C.pad.shape[16] == PAD_SHAPE_LONG) { // substitute y/xlongoct by round + pdi = pdi/2; + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + // if offset subst. by round use this code + else if (C.pad.shape[16] == PAD_SHAPE_OFFSET) { // substitute offset by round + pdi = pdi/2; + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + } + return s; +} + +void get_roundness(UL_ELEMENT E) { + E.package.contacts(C) { + if (C.smd) { + if (C.smd.roundness < boardroundness) boardroundness = C.smd.roundness; + } + } + return; +} + +//----------------------------------------------------- +int padindex(UL_ELEMENT E,UL_CONTACT C) { + int i = 0; + for (i = 0; t[i]; i++) { + if (t[i] == padtype(E,C)) + return i+1; + } + return i; // should not be possible +} + +//----------------------------------------------------- +string padstacktype(UL_ELEMENT E, UL_CONTACT C) { + int px, d; + string s; + px = padindex(E,C); + d = u2u(C.pad.drill); + sprintf(s, "P_%d_%d", d, px); + return s; +} + +//----------------------------------------------------- +string PAC_padtype(UL_PACKAGE P, UL_CONTACT C) { + string s; + int pdi, x1, y1, x2, y2, r, d; + if (C.pad) { + pdi = u2u(C.pad.diameter[16]); + if (C.pad.shape[16] == PAD_SHAPE_ROUND || C.pad.shape[16] == PAD_SHAPE_OCTAGON || C.pad.shape[16] == PAD_SHAPE_SQUARE) { + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + // if long subst. by round use this code + else if (C.pad.shape[16] == PAD_SHAPE_LONG) { // substitute y/xlongoct by round + pdi = pdi/2; + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + // if offset subst. by round use this code + else if (C.pad.shape[16] == PAD_SHAPE_OFFSET) { // substitute offset by round + pdi = pdi/2; + sprintf(s, "%s (%d);", padshape[C.pad.shape[16]], pdi); + } + } + return s; +} + +//----------------------------------------------------- +int PAC_padindex(UL_PACKAGE P,UL_CONTACT C) { + int i = 0; + for (i = 0; t[i]; i++) { + if (t[i] == PAC_padtype(P,C)) + return i+1; + } + return i; // should not be possible +} + +//----------------------------------------------------- +string PAC_padstacktype(UL_PACKAGE P, UL_CONTACT C) { + int px, d; + string s; + px = PAC_padindex(P,C); + d = u2u(C.pad.drill); + sprintf(s, "P_%d_%d", d, px); + return s; +} + +//----------------------------------------------------- +int padstackindex(UL_PACKAGE P, UL_CONTACT C) { + int i = 0; + for (i = 0; pst[i]; i++) { + if (pst[i] == PAC_padstacktype(P,C)) + return i+1; + } + return i; // should not be possible +} + +//----------------------------------------------------- +string viatype(UL_VIA V) { + string s; + int pdi, x1, y1, x2, y2; + pdi = u2u(V.diameter[16]); + if (V.shape[16] == VIA_SHAPE_ROUND || V.shape[16] == VIA_SHAPE_OCTAGON) { + sprintf(s, "%s (%d);", viashape[V.shape[16]], pdi); + } + if (V.shape[16] == VIA_SHAPE_SQUARE) { + x1 = round(-pdi/2); y1 = round(-pdi/2); + x2 = round(pdi/2); y2 = round(pdi/2); + sprintf(s, "%s (%d,%d,%d,%d);", viashape[V.shape[16]], x1,y1,x2,y2); + } + return s; +} + +//----------------------------------------------------- +int viaindex(UL_VIA V) { + int i = 0; + for (i = 0; t[i]; i++) { + if (t[i] == viatype(V)) + return i+1; + } + return i; // should not be possible +} + +//----------------------------------------------------- +string viastacktype(UL_VIA V) { + int px, d; + string s; + px = viaindex(V); + d = u2u(V.drill); + sprintf(s, "P_%d_%d", d, px); + return s; +} + +//----------------------------------------------------- +int viastackindex(UL_VIA V) { + int i = 0; + for (i = 0; pst[i]; i++) { + if (pst[i] == viastacktype(V)) + return i+1; + } + return i; // should not be possible +} + +//----------------------------------------------------- +string drawpadpoly(int dx, int dy, int xo, int yo, real angle, int roundness, real elong, int padtype) { + string s; + real a = angle; + + if(roundness) { + real r1; + int l, r; + real rad, rad1, x1, x2, y1, y2; + real x_1, y_1, x_2, y_2; + + if (dx <= dy) { + r = dx; + l = dy; + } + else { + r = dy; + l = dx; + } + r1 = r / 200 * roundness; + + if (roundness == 100) { // rounded pad + if (padtype == PAD_SHAPE_OFFSET) { + rad = PI / 180 * a; + rad1 = PI / 180 * (a + 180); + x1 = 0; + y1 = 0; + x2 = u2u(cos(rad) * (r*elong/100) ); + y2 = u2u(sin(rad) * (r*elong/100) ); + } + else if (padtype == PAD_SHAPE_LONG) { + rad = PI / 180 * a; + rad1 = PI / 180 * (a + 180); + x1 = u2u(cos(rad) * ((r*elong/100) /2) ); + y1 = u2u(sin(rad) * ((r*elong/100) /2) ); + x2 = u2u(cos(rad1) * ((r*elong/100) /2) ); + y2 = u2u(sin(rad1) * ((r*elong/100) /2) ); + } + else { // SMD + rad = PI / 180 * a; + rad1 = PI / 180 * (a + 180); + x1 = u2u(cos(rad) * ((l-r) /2) ); + y1 = u2u(sin(rad) * ((l-r) /2) ); + x2 = u2u(cos(rad1) * ((l-r) /2) ); + y2 = u2u(sin(rad1) * ((l-r) /2) ); + } + sprintf(s, "TRACK (%d(%.0f,%.0f)(%.0f,%.0f))", + u2u(r), + u2u(xo) + x1, + u2u(yo) + y1, + u2u(xo) + x2, + u2u(yo) + y2 ); + } + + else { // octagon + r1 = r * 0.56; + sprintf(s, "POLYGON ((%.0f,%.0f)(%.0f,%.0f)\n (%.0f,%.0f)(%.0f,%.0f)\n (%.0f,%.0f)(%.0f,%.0f)\n (%.0f,%.0f)(%.0f,%.0f)\n (%.0f,%.0f))", + u2u(xo) + Xneu( u2u(0+ dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0+ dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0+ (dx-r1) /2 ), u2u(0+ dy /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0+ (dx-r1) /2 ), u2u(0+ dy /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0- (dx-r1) /2 ), u2u(0+ dy /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0- (dx-r1) /2 ), u2u(0+ dy /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0- dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0- dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0- dx /2 ), u2u(0- (dy-r1) /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0- dx /2 ), u2u(0- (dy-r1) /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0- (dx-r1) /2 ), u2u(0- dy /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0- (dx-r1) /2 ), u2u(0- dy /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0+ (dx-r1) /2 ), u2u(0- dy /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0+ (dx-r1) /2 ), u2u(0- dy /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0+ dx /2 ), u2u(0- (dy-r1) /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0+ dx /2 ), u2u(0- (dy-r1) /2 ), 0, 0, a), + u2u(xo) + Xneu( u2u(0+ dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a), + u2u(yo) + Yneu( u2u(0+ dx /2 ), u2u(0+ (dy-r1) /2 ), 0, 0, a) ); + + } + } + else { // rectangle + sprintf(s, "POLYGON ((%.0f,%.0f)(%.0f,%.0f)(%.0f,%.0f)(%.0f,%.0f)(%.0f,%.0f))", + u2u(xo) + Xneu( u2u(0 + dx /2), u2u(0 + dy / 2), 0, 0, a), + u2u(yo) + Yneu( u2u(0 + dx /2), u2u(0 + dy / 2), 0, 0, a), + u2u(xo) + Xneu( u2u(0 + dx /2), u2u(0 - dy / 2), 0, 0, a), + u2u(yo) + Yneu( u2u(0 + dx /2), u2u(0 - dy / 2), 0, 0, a), + u2u(xo) + Xneu( u2u(0 - dx /2), u2u(0 - dy / 2), 0, 0, a), + u2u(yo) + Yneu( u2u(0 - dx /2), u2u(0 - dy / 2), 0, 0, a), + u2u(xo) + Xneu( u2u(0 - dx /2), u2u(0 + dy / 2), 0, 0, a), + u2u(yo) + Yneu( u2u(0 - dx /2), u2u(0 + dy / 2), 0, 0, a), + u2u(xo) + Xneu( u2u(0 + dx /2), u2u(0 + dy / 2), 0, 0, a), + u2u(yo) + Yneu( u2u(0 + dx /2), u2u(0 + dy / 2), 0, 0, a) ); + } + return s; +} + +//----------------------------------------------------- +string drawpad(UL_PACKAGE P, UL_CONTACT C, int l) { + string s = "no pad!"; + int dx, dy, r, d; + if (C.pad) { + + + if (C.pad.shape[l] == PAD_SHAPE_ROUND) { + sprintf(s, "ROUND (%d,%d,%d)", u2u(C.pad.diameter[l]), u2u(C.pad.x), u2u(C.pad.y) ); + } + else if (C.pad.shape[l] == PAD_SHAPE_SQUARE) { + s = drawpadpoly(C.pad.diameter[l], C.pad.diameter[l], C.pad.x, C.pad.y, C.pad.angle, 0, 0, 0); + } + + else if (C.pad.shape[l] == PAD_SHAPE_OCTAGON) { + d = round(d); + s = drawpadpoly(C.pad.diameter[l], C.pad.diameter[l], C.pad.x, C.pad.y, C.pad.angle, 50, C.pad.elongation, PAD_SHAPE_OCTAGON); + } + + else if (C.pad.shape[l] == PAD_SHAPE_LONG) { + r = round(d/2); + s = drawpadpoly(C.pad.diameter[l]*2, C.pad.diameter[l], C.pad.x, C.pad.y, C.pad.angle, 100, C.pad.elongation, PAD_SHAPE_LONG); + } + + else if (C.pad.shape[l] == PAD_SHAPE_OFFSET) { + r = round(d); + s = drawpadpoly(C.pad.diameter[l]*2, C.pad.diameter[l], C.pad.x, C.pad.y, C.pad.angle, 100, C.pad.elongation, PAD_SHAPE_OFFSET); + } + + // PAD_SHAPE_ANNULUS + // PAD_SHAPE_THERMAL + } + else { // smd + int smd_roundnes = C.smd.roundness; + if (smd_roundnes < boardroundness) smd_roundnes = boardroundness; + s = drawpadpoly(C.smd.dx, C.smd.dy, C.smd.x, C.smd.y, C.smd.angle, smd_roundnes, 0, 0); + } + return s; +} + + +//--------------------------------------------------- +string pin_number(UL_ELEMENT E, string pinname) { + int j, pad_is_numeric = 1, padcount; + string s = ""; + E.package.contacts(CT) { + s = CT.name; + for (j = 0; s[j]; ++j) { + if (!isdigit(s[j])) { + pad_is_numeric = 0; + } + } + } + if (pad_is_numeric) { + return pinname; + } + else { + padcount = 0; + E.package.contacts(CT) { + padcount++; + if (CT.name == pinname) { + sprintf(s, "%d", padcount); + return s; + } + } + } + return s; +} + + +//------------------------------------------------------- +string PAC_pin_number(UL_PACKAGE P, string pinname) { + int j, pad_is_numeric = 1, padcount; + string s = ""; + P.contacts(CT) { + s = CT.name; + for (j = 0; s[j]; ++j) { + if (!isdigit(s[j])) { + pad_is_numeric = 0; + } + } + } + if (pad_is_numeric) { + return pinname; + } + else { + padcount = 0; + P.contacts(CT) { + padcount++; + if (CT.name == pinname) { + sprintf(s, "%d", padcount); + return s; + } + } + } + return s; +} + +//--------------------------------------------------- +int realnet(UL_SIGNAL S) { + S.contactrefs(S) return 1; + return 0; +} + +//--------------------------------------------------- +int net_on_layer(UL_SIGNAL S, int layer) { // 1 if a wire of this net is on the given layer + S.wires(W) + if (W.layer == layer) return 1; + S.polygons(P) + if(P.layer == layer) return 1; + return 0; +} + +////////////////////////////////////////////////////// +void create_header () { + printf (";EAGLE %d.%02d %s %s FATF OUTPUT FILE FABmaster(R) ", EAGLE_VERSION, EAGLE_RELEASE, filename(argv[0]), ULPversion); + printf ("%02d.%02d.%02d %02d:%02d:%02d\n\n", + t2day(ht),t2month(ht)+1,t2year(ht),t2hour(ht),t2minute(ht),t2second(ht)); + printf (":FABMASTER FATF REV11.1;\n\n"); + printf (":UNITS = 1/1000 INCH\n"); + printf (":NOAUTOROTATE\n"); + return; +} + + +////////////////////////////////////////////////////// +void board_data(UL_BOARD B) { + int t = time(); + printf ("\n:BOARD_DATA\n"); + printf ("1,JOB(\"%s\",,%02d-%02d-%02d,);\n", jobname,t2day(t),t2month(t),t2year(t)); + + B.wires(W) { // if board outline as wires in board + if (W.layer == LAYER_DIMENSION) { + xmin = min(u2u(W.x1), xmin); xmin = min(u2u(W.x2), xmin); + ymin = min(u2u(W.y1), ymin); ymin = min(u2u(W.y2), ymin); + xmax = max(u2u(W.x1), xmax); xmax = max(u2u(W.x2), xmax); + ymax = max(u2u(W.y1), ymax); ymax = max(u2u(W.y2), ymax); + + if (W.curve) { + // process arcs (done with wire segments) + x = W.arc.x1; + y = W.arc.y1; + + printf ("2,CONTOUR ("); + printf("(%d,%d,0)", u2u(x), u2u(y)); + real angle = W.arc.angle1 + delta; + + while (angle < W.arc.angle2) { + i++; + if (i==1) { + printf(","); + } + else if (i==2){ + printf(");\n2,CONTOUR ("); + i = 0; + } + x = W.arc.xc + W.arc.radius * cos(deg2arc(angle)); + y = W.arc.yc + W.arc.radius * sin(deg2arc(angle)); + printf("(%d,%d)", u2u(x), u2u(y)); + xmin = min(u2u(x), xmin); xmin = min(u2u(x), xmin); + ymin = min(u2u(y), ymin); ymin = min(u2u(y), ymin); + xmax = max(u2u(x), xmax); xmax = max(u2u(x), xmax); + ymax = max(u2u(y), ymax); ymax = max(u2u(y), ymax); + angle += delta; + } + if (!i) { + printf("(%d,%d,0));\n", u2u(W.arc.x2), u2u(W.arc.y2)); + } + else { + printf(");\n2,CONTOUR ((%d,%d,0)", u2u(x), u2u(y)); + printf(",(%d,%d,0));\n", u2u(W.arc.x2), u2u(W.arc.y2)); + } + i=0; + } + else { + printf ("2,CONTOUR ("); + printf("(%d,%d,0),(%d,%d,0)", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + printf(");\n"); + } + } + } + B.elements(E) { + E.package.wires(W) { + if (W.layer == LAYER_DIMENSION) { + xmin = min(u2u(W.x1), xmin); xmin = min(u2u(W.x2), xmin); + ymin = min(u2u(W.y1), ymin); ymin = min(u2u(W.y2), ymin); + xmax = max(u2u(W.x1), xmax); xmax = max(u2u(W.x2), xmax); + ymax = max(u2u(W.y1), ymax); ymax = max(u2u(W.y2), ymax); + + if (W.curve) { + // process arcs (done with wire segments) + x = W.arc.x1; + y = W.arc.y1; + + printf ("2,CONTOUR ("); + printf("(%d,%d,0)", u2u(x), u2u(y)); + real angle = W.arc.angle1 + delta; + + while (angle < W.arc.angle2) { + i++; + if (i==1) { + printf(","); + } + else if (i==2){ + printf(");\n2,CONTOUR ("); + i = 0; + } + x = W.arc.xc + W.arc.radius * cos(deg2arc(angle)); + y = W.arc.yc + W.arc.radius * sin(deg2arc(angle)); + printf("(%d,%d)", u2u(x), u2u(y)); + xmin = min(u2u(x), xmin); xmin = min(u2u(x), xmin); + ymin = min(u2u(y), ymin); ymin = min(u2u(y), ymin); + xmax = max(u2u(x), xmax); xmax = max(u2u(x), xmax); + ymax = max(u2u(y), ymax); ymax = max(u2u(y), ymax); + angle += delta; + } + if (!i) { + printf("(%d,%d,0));\n", u2u(W.arc.x2), u2u(W.arc.y2)); + } + else { + printf(");\n2,CONTOUR ((%d,%d,0)", u2u(x), u2u(y)); + printf(",(%d,%d,0));\n", u2u(W.arc.x2), u2u(W.arc.y2)); + } + i=0; + } + else { + printf ("2,CONTOUR ("); + printf("(%d,%d,0),(%d,%d,0)", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + printf(");\n"); + } + } + } + } + printf("3,WORK_SPACE (%d,%d,%d,%d);\n", xmin, xmax, ymin, ymax); + printf (":EOD\n"); + printf ("\n:NOTRACE\n"); + return; +} + +////////////////////////////////////////////////////// +void parts(UL_BOARD B) { + int i = 1; + printf ("\n:PARTS\n"); + B.elements(E) { + partnumname[i] = E.name; // 2009-12-03 + printf("%d,",i++); // PART ID + printf("%s,",E.name); // PART NAME (not as in definition!) + printf("\"%s\",",E.value); // DEVICE NAME = Value + printf("%s,",validname(E.package.name + "__" + E.package.library)); // PACKAGE NAME + printf("%d,%d,",u2u(E.x), u2u(E.y)); // X,Y + printf("%d,",u2ang(E.angle, E.mirror)); // ROTATION + if (E.mirror) // ASSEMBLY SIDE + printf("B;"); + else + printf("T;"); + printf("\n"); + } + cntnumname = i; // 2009-12-03 + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void pad_symbols(UL_BOARD B) { + int i, j = 0, new; // j+1 = pad index; t[] contains padtypes + printf ("\n:PAD_SYMBOLS\n\n"); + B.elements(E) { + E.package.contacts(C) { + if (C.pad) { + new = 1; // padtype not generated yet + for (i = 0; t[i]; i++) { + if (t[i] == padtype(E,C)) + new = 0; // padtype exists + } + if (new) { + t[j] = padtype(E,C); + printf("%d,%s\n", j+1, padtype(E,C)); + j++; + } + } + } + } + B.signals(S) { + S.vias(V) { + new = 1; + for (i = 0; t[i]; i++) { + if (t[i] == viatype(V)) + new = 0; // padtype exists + } + if (new) { + t[j] = viatype(V); + printf("%d,%s\n", j+1, viatype(V)); + j++; + } + } + } + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void layer_names(UL_BOARD B) { + int i; + string layers[] = { + "\"DRILL PAD\",COMMON,0,ELECTRICAL;" // layer 1 + ,"\"TOP\",TOP,3,ELECTRICAL;" + ,"\"BOTTOM\",BOTTOM,2,ELECTRICAL;" + ,"\"ROUTE2\",TRANSPARENT,0,ELECTRICAL;" + ,"\"ROUTE3\",TRANSPARENT,0,ELECTRICAL;" + ,"\"ROUTE4\",TRANSPARENT,0,ELECTRICAL;" + ,"\"ROUTE5\",TRANSPARENT,0,ELECTRICAL;" + ,"\"POWER1\",TRANSPARENT,0,ELECTRICAL;" + ,"\"DRILLH\",TRANSPARENT,0,DOCUMENTATION;" //layer 9 + ,"\"POWER2\",TRANSPARENT,0,DOCUMENTATION;" + + ,"\"DRILL\",TRANSPARENT,0,DOCUMENTATION;" + ,"\"THERMAL_2\",TRANSPARENT,0,DOCUMENTATION;" + ,"\"FORMAT\",TRANSPARENT,0,BOARD_CUTOUT;" + ,"\"THERMAL_1\",TRANSPARENT,0,DOCUMENTATION;" + ,"\"THERMAL\",TRANSPARENT,0,DOCUMENTATION;" + + + ,"\"TPLACE\",TOP,17,ASSEMBLY;" // 16 + ,"\"BPLACE\",BOTTOM,16,ASSEMBLY;" + + ,"\"TNAMES\",TOP,19,DOCUMENTATION;" + ,"\"BNAMES\",BOTTOM,18,DOCUMENTATION;" + + ,"\"TVALUES\",TOP,21,DOCUMENTATION;" + ,"\"BVALUES\",BOTTOM,20,DOCUMENTATION;" + }; + printf("\n:LAYER_NAMES\n"); + for (i=0; layers[i]; i++) { + printf("%d,%s\n", i+1, layers[i]); + } + printf(":EOD\n"); + printf("\n:LAYER_SETS\n"); //layer sets + printf("1,\"ALL\",(1"); + for (i=1; layers[i]; i++) { + printf(",%d", i+1); + } + printf(");\n"); + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void pad_stacks(UL_BOARD B) { + int new, i, j; + printf ("\n:PAD_STACKS\n"); + B.elements(E) { + E.package.contacts(C) { + if (C.pad) { + new = 1; // padstacktype not generated yet + for (i = 0; pst[i]; i++) { + if (pst[i] == padstacktype(E, C)) + new = 0; // padstacktype exists + } + if (new) { + pst[j] = padstacktype(E, C); + printf("%d,\"%s\",%d,P,((1,%d));\n", + j+1, + padstacktype(E,C), + u2u(C.pad.drill), + padindex(E,C) + ); + j++; + } + } + } + } + B.signals(S) { + S.vias(V) { + new = 1; + for (i = 0; pst[i]; i++) { + if (pst[i] == viastacktype(V)) + new = 0; // viastacktype exists + } + if (new) { + pst[j] = viastacktype(V); + printf("%d,\"%s\",%d,P,((1,%d));\n", + j+1, + viastacktype(V), + u2u(V.drill), + viaindex(V) + ); + j++; + } + } + } + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void pads(UL_BOARD B) { + int i = 0; + printf ("\n:PADS\n"); + B.signals(S) { + if (realnet(S)) { // vias belonging to real net + i++; + S.vias(V) { + printf("%d,%d,((%d,%d));\n", i, viastackindex(V), u2u(V.x), u2u(V.y)); + } + } + else { // other vias + S.vias(V) { + printf("0,%d,((%d,%d));\n", viastackindex(V), u2u(V.x), u2u(V.y)); + } + } + } + printf(":EOD\n"); + return; +} + + +int searchfont(int tsize, int tratio) { + int found = -1; + for (int n = 0; n < cntt; n++) { + if (sizes[n] == tsize && ratio[n] == tratio) { + found = n; + break; + } + } + return found; +} + +////////////////////////////////////////////////////// +void fonts(UL_BOARD B) { + int n; + printf ("\n:FONTS\n"); + printf ("1,\"STANDARD\",96,60,72,0;\n"); + B.texts(T) { + if (searchfont(T.size, T.ratio) < 0) { + sizes[cntt] = T.size; + ratio[cntt] = T.ratio; + cntt++; + } + } + B.elements(E) { + E.package.texts(T) { + if (searchfont(T.size, T.ratio) < 0) { + sizes[cntt] = T.size; + ratio[cntt] = T.ratio; + cntt++; + } + } + } + for (n = 0; n < cntt; n++) { + printf("%d,\"FONT_%d\",%d,%.0f,%.0f,%.d;\n", n+2, n+2, u2u(sizes[n]), u2u(sizes[n])*.6, u2u(sizes[n])*.72, u2u(sizes[n]*ratio[n])/100); + } + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void packages(UL_BOARD B) { + int i = 1, j, k, l, xll,yll, textlayer; + real tangle, angle; + string dp, jst; + printf ("\n:PACKAGES\n"); + B.libraries(LBR) { + LBR.packages(P) { + new = 1; // padstacktype not generated yet + for (i = 0; shapename[i]; i++) { + if (shapename[i] == validname(P.name + "__" + P.library)) + new = 0; // package name exists + } + if (new) { + shapename[sx] = validname(P.name + "__" + P.library); + sx++; + + printf("%d,",i++); // PACKAGE ID + printf("\"%s\",",validname(P.name + "__" + P.library)); // PACK.NAME + printf(",,,\n"); // xmin etc. left blank + j = 0; k = 0; + P.contacts(C) { + if (k == 0) printf(" (PINS "); // only if contacts present + k++; + printf("(%s,,%d,%d,", PAC_pin_number(P, C.name), u2u(C.x), u2u(C.y)); // Pin IDs + if (C.pad) printf("D)"); // ASSEMBLY SIDE + else printf("T)"); + j++; + if (j > 2) { // max. 3 pins in one line + printf("\n "); + j = 0; + } + } + if (k != 0) printf(")\n"); // only if contacts present close PINS section + j = 0; + printf(" ("); // corresponds to ); before next package + P.contacts(C) { + if (C.pad) { + if (j > 0) { + printf(" "); + } + printf("%s,PAD (%d ((%d,%d)))\n", // PAD + PAC_pin_number(P, C.name), padstackindex(P,C), u2u(C.x), u2u(C.y)); + j++; + } + } // close PIN-ID,PAD section + j = 0; + P.contacts(C) { + if (C.pad) { + dp = drawpad(P, C, 1); + printf(" %s,LAYER (%d (\n", PAC_pin_number(P, C.name), fablayer(1)); // top side + printf(" %s))\n", dp); + dp = drawpad(P, C, 16); + printf(" %s,LAYER (%d (\n", PAC_pin_number(P, C.name), fablayer(16)); // bottom side + printf(" %s))\n", dp); + } + else { // smd, always on top layer + if (j > 0) printf(" "); + if (C.smd.layer == 1) { + printf("%s,LAYER (%d (\n", PAC_pin_number(P, C.name), fablayer(1)); + printf(" %s))\n", drawpad(P, C, 1)); + } + else { + printf("%s,LAYER (%d (\n", PAC_pin_number(P, C.name), fablayer(16)); + printf(" %s))\n", drawpad(P, C, 16)); + } + } + j++; + } // close PIN-ID,LAYER section + + // process circles etc. on top and bottom side + P.circles(C) { + if (C.layer == 1 || C.layer == 16) { + printf("\n 0,LAYER (%d (\n", fablayer(C.layer)); + int RminRmax = C.radius - C.width; + if (!C.width || RminRmax < 0) { + RminRmax = C.width/2; + printf(" ROUND (%d,%d,%d)", u2u((C.radius + RminRmax)*2), + u2u(C.x), u2u(C.y)); + } + else { + printf(" CIRCLE (%d,%d,%d,%d)", u2u(C.radius) + u2u(C.width)/2, + u2u(C.radius) - u2u(C.width)/2, + u2u(C.x), u2u(C.y)); + } + printf("))\n"); + } + } + P.rectangles(W) { + if (W.layer == 1 || W.layer == 16) { + printf("\n 0,LAYER (%d (\n", fablayer(W.layer)); + xll = W.x1; yll = W.y1; + int rectcenterx = (W.x1 + W.x2) /2; + int rectcentery = (W.y1 + W.y2) /2; + int rectx = W.x2 - W.x1; + int recty = W.y2 - W.y1; + printf(" %s", drawpadpoly(rectx, recty, rectcenterx, rectcentery, W.angle, 0, 0, 0)); + printf("))\n"); + } + } + P.texts(T) { + if (T.layer == 1 || T.layer == 16) { + printf(" 0,LAYER (%d (\n", fablayer(T.layer)); + T.wires(W) { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + /* + printf(" TEXT (%d,%d,%d,%s,%.1f,%s,%s)))\n", + searchfont(T.size, T.ratio)+2, + u2u(T.x), u2u(T.y), jst, T.angle, Mirror, T.value); + */ + printf("))\n"); + } + } + + // end circles etc. on top and bottom + P.wires(W) { + if (W.layer == 1 || W.layer == 16 || W.layer == 21 || W.layer == 22 || W.layer == 51 || W.layer == 52) { + printf(" 0,LAYER (%d (\n", fablayer(W.layer)); // tplace layer + if (W.curve) { + // process arcs (done with wire segments) + printf(" TRACK (%d,(%d,%d),", u2u(W.width), u2u(W.arc.x1), u2u(W.arc.y1)); + angle = W.arc.angle1 + delta; + while (angle < W.arc.angle2) { + printf("\n (%d,%d),", + u2u(W.arc.xc + W.arc.radius * cos(deg2arc(angle))), + u2u(W.arc.yc + W.arc.radius * sin(deg2arc(angle))) ); + angle += delta; + } + printf("(%d,%d))", u2u(W.arc.x2), u2u(W.arc.y2) ); + } + else { + printf(" TRACK (%d,(%d,%d),", u2u(W.width), u2u(W.x1), u2u(W.y1)); + printf("(%d,%d))", u2u(W.x2), u2u(W.y2)); + } + printf("))\n"); + } + } + + P.rectangles(W) { + if (W.layer == 21 || W.layer == 22 || W.layer == 51 || W.layer == 52) { + printf(" 0,LAYER (%d (\n", fablayer(W.layer)); // tplace layer + xll = W.x1; yll = W.y1; + int rectcenterx = (W.x1 + W.x2) /2; + int rectcentery = (W.y1 + W.y2) /2; + int rectx = W.x2 - W.x1; + int recty = W.y2 - W.y1; + printf("%s", drawpadpoly(rectx, recty, rectcenterx, rectcentery, W.angle, 0, 0, 0)); + printf("))\n"); + } + } + + P.circles(C) { + if (C.layer == 21 || C.layer == 22 || C.layer == 51 || C.layer == 52) { + printf(" 0,LAYER (%d (\n", fablayer(C.layer)); // tplace layer + int RminRmax = C.radius - C.width; + if (!C.width || RminRmax < 0) { + RminRmax = C.width/2; + printf(" ROUND (%d,%d,%d)\n", u2u((C.radius + RminRmax)*2), + u2u(C.x), u2u(C.y)); + } + else { + printf(" CIRCLE (%d,%d,%d,%d)\n", u2u(C.radius) + u2u(C.width)/2, + u2u(C.radius) - u2u(C.width)/2, + u2u(C.x), u2u(C.y)); + } + printf("))\n"); + } + } + + P.texts(T) { + if (T.layer == 1 || T.layer == 16 || T.layer == 21 || T.layer == 22 || T.layer == 51 || T.layer == 52) { + printf(" 0,LAYER (%d (\n", fablayer(T.layer)); + T.wires(W) { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + printf("))\n"); + } + /* + if (T.layer == 51 || T.layer == 52) { + printf(" 0,LAYER (%d (\n", fablayer(T.layer - 30)); // tplace layer + if (!T.mirror) { + jst = "BOTTOM_LEFT"; + } + else { + jst = "TOP_RIGHT"; + } + printf(" TEXT (1,%d,%d,%s,%3.0f, ,%s)\n", + u2u(x), u2u(y), jst, T.angle, T.value); + } + */ + } + printf(");\n"); + } + } + } + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void layer(UL_BOARD B) { + int textlayer; + string jst, mir; + real tangle, angle; + printf ("\n:LAYERS\n"); + int i = 0, lay; + B.signals(S) { + if (realnet(S)) { + ++i; + for (lay = 1; lay <= 16; lay++) { + if (net_on_layer(S, lay) && fablayer(lay) > 0) { + printf("%d,LAYER (%d, (\n", i, fablayer(lay)); + S.wires(W) { + if (lay == W.layer) { + + if (W.curve) { + // process arcs (done with wire segments) + x = W.arc.x1; + y = W.arc.y1; + printf(" TRACK (%d,(%d,%d)", u2u(W.width), u2u(x), u2u(y)); + angle = W.arc.angle1 + delta; + while (angle < W.arc.angle2) { + x = W.arc.xc + W.arc.radius * cos(deg2arc(angle)); + y = W.arc.yc + W.arc.radius * sin(deg2arc(angle)); + printf(",\n (%d,%d)", u2u(x), u2u(y)); + angle += delta; + } + printf("\n (%d,%d))", u2u(W.arc.x2), u2u(W.arc.y2)); + } + else { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", + u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + } + } + + S.polygons(P) { // 13.05.2004 polygon + if (lay == P.layer) { + P.contours(W) { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", + u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + P.fillings(W) { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", + u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + } + } + printf(" ));\n"); + } + } + } + } + + // process name texts + B.elements(E) { + if (E.package) { + tangle = 0; + if (!E.mirror) { + textlayer = 25; + mir = ""; + } + else { + textlayer = 26; + mir = "M"; + } + jst = "CENTER"; + x = E.x; y = E.y; + printf("0,LAYER (%d (\n", fablayer(textlayer)); // tnames layer + printf(" TEXT (1,%d,%d,%s,0,%s,%s)));\n", u2u(x), u2u(y), jst, mir, E.name); + } + } + B.texts(T) { + if (T.layer == 1 || T.layer == 16 || T.layer == 21) { + printf(" 0,LAYER (%d (\n", fablayer(T.layer)); + T.wires(W) { + printf(" TRACK (%d,(%d,%d),(%d,%d))\n", u2u(W.width), u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + printf("))\n"); + } + } + printf(":EOD\n"); +} + + +// //////////// 2009-12-03 ///////////////// +void creat_pad_number_index(UL_BOARD B) { + B.elements(E) { + int iscontact = 0; + E.package.contacts(C) { + iscontact = 1; + break; + } + if (!iscontact) { + sprintf(areaEname[cntindex], "%s", E.name); // index of element without contacts + indexareaEname[cntindex] = 0; + cntindex++; + } + else { + int j = 0; + E.package.contacts(C) { + if (!j) { + j++; + sprintf(areaEname[cntindex], "%s", E.name); // index to start of pad names in package-pad-list + indexareaEname[cntindex] = cntEpad; + cntindex++; + } + // create pad number index list 2009-12-03 + sprintf(areaEpadname[cntEpad], "%s~%s", E.name, C.name); + areaPadNumber[cntEpad] = strtol(pin_number(E, C.name)); // *** the number of pad in FATF format + cntEpad++; + j++; + } + } + } + return; +} + +//------------------------------------- +int getpadnbr(int i, string epname) { + for (int n = i; n < cntEpad; n++) { + if (areaEpadname[n] == epname) return areaPadNumber[n]; + } + return 0; +} + +int getpinr(string ename, string pname) { + string ep = ename + "~" + pname; + for (int i = 1; i < cntindex; i++) { + if (areaEname[i] == ename) return getpadnbr(indexareaEname[i], ep); + } + return 0; +} + +int getelnr(string ename) { + for (int i = 1; i < cntindex; i++) { + if (areaEname[i] == ename) return i; + } + return 0; +} + + +////////////////////////////////////////////////////// +void nets(UL_BOARD B) { + int i = 0, itemcnt, elnr, j; + string pin; + printf("\n:NETS\n"); + B.signals(S) { + if (realnet(S)) { + printf("%d,\"%s\",S,\n (", ++i, S.name); // NET NR, NET NAME, STYPE + itemcnt = 0; + + S.contactrefs(C) { + elnr = getelnr(C.element.name); // Part ID 2009-12-03 + sprintf(pin, "%d", getpinr(C.element.name, C.contact.name)); // Pin ID 2009-12-03 + //} + /* + //S.contactrefs(C) { + j = 0; + B.elements(E) { + j++; + if (E.name == C.element.name) { + elnr = j; // find Part ID + pin = pin_number(E, C.contact.name); // find Pin ID +if (dlgMessageBox(h + " <~> " + pin, "ok", "esc") != 0) exit(-999); + } + } + */ + if (itemcnt) { + printf(","); + } + if (itemcnt > 5) { + printf("\n "); + itemcnt = 0; + } + itemcnt++; + printf("(%d,%s)", elnr, pin); // PART ID, PIN ID + } + printf(");\n"); + } + } + printf(":EOD\n"); + return; +} + +////////////////////////////////////////////////////// +void create_pcboard_section(UL_BOARD B) { + B.elements(E) get_roundness(E); + board_data(B); + parts(B); + nets(B); + pad_symbols(B); + layer_names(B); + pad_stacks(B); + pads(B); + fonts(B); + packages(B); + layer(B); + return; +} + +////////////////////////////////////////////////////// +if (board) board(B) { + jobname = filename(B.name); + jobname = strsub(jobname, 0, strlen(jobname) - 4); + output(filesetext(B.name, ".fab")) { + create_header(); + creat_pad_number_index(B); + create_pcboard_section(B); + /* option to count run time + printf (";start %02d.%02d.%02d %02d:%02d:%02d : ", + t2day(ht),t2month(ht)+1,t2year(ht),t2hour(ht),t2minute(ht),t2second(ht)); + int t = time(); + printf (";end %02d.%02d.%02d %02d:%02d:%02d\n", + t2day(t),t2month(t)+1,t2year(t),t2hour(t),t2minute(t),t2second(t)); + */ + } +} diff --git a/eagle-5.7.0/ulp/fill-via4vacuum.ulp b/eagle-5.7.0/ulp/fill-via4vacuum.ulp new file mode 100644 index 0000000..a3792a0 --- /dev/null +++ b/eagle-5.7.0/ulp/fill-via4vacuum.ulp @@ -0,0 +1,84 @@ +#usage "Generate a mask to fill vias for vacuum adapter.\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +int userlayer = 101; +if (argv[1]) userlayer = strtol(argv[1]); +if (!userlayer) { + int Result = dlgDialog("Fill mask for vacuum") { + dlgLabel(usage); + dlgHBoxLayout { + dlgIntEdit(userlayer); + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + } + }; + if (!Result) exit (0); +} + +string cmd; +sprintf(cmd, "SET WIRE_BEND 2;\nGRID mm;\nLayer %d FillVia;\nchange layer %d;\n", userlayer, userlayer); + +void center(int x, int y, int diameter, int shape) { + real radius = u2mm(diameter) / 2; + string h; + switch (shape) { + case VIA_SHAPE_SQUARE : sprintf(h, "RECT (%.4f %.4f) (%.4f %.4f) ;\n", + u2mm(x) - radius, u2mm(y) - radius, u2mm(x) + radius, u2mm(y) + radius ); + break; + + case VIA_SHAPE_ROUND : sprintf(h, "CIRCLE 0 (%.4f %.4f) (%.4f %.4f) ;\n", + u2mm(x), u2mm(y), u2mm(x) + radius, u2mm(y) ); + break; + + case VIA_SHAPE_OCTAGON : real pwidth = 0.2032; + real frame = radius - pwidth/2; + sprintf(h, "CHANGE STYLE 0;\nPOLYGON %.4f (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + pwidth, + u2mm(x) - frame, + u2mm(y) - frame * 0.4139, + u2mm(x) - frame * 0.4139, + u2mm(y) - frame, + u2mm(x) + frame * 0.4139, + u2mm(y) - frame, + u2mm(x) + frame, + u2mm(y) - frame * 0.4139, + u2mm(x) + frame, + u2mm(y) + frame * 0.4139, + u2mm(x) + frame * 0.4139, + u2mm(y) + frame, + u2mm(x) - frame * 0.4139, + u2mm(y) + frame, + u2mm(x) - frame, + u2mm(y) + frame * 0.4139, + u2mm(x) - frame, + u2mm(y) - frame * 0.4139 + ); + break; + } + cmd += h; + return; +} + +if (board) board(B) { + B.signals(S) { + S.vias(V) { + if(V.start == 1 && V.end == 16) { + center(V.x, V.y, V.diameter[1], V.shape[1]); + } + } + } + exit (cmd); +} + +else dlgMessageBox("Start this ULP in a Board!", "OK"); +exit (0); diff --git a/eagle-5.7.0/ulp/find-single-ended-wire.ulp b/eagle-5.7.0/ulp/find-single-ended-wire.ulp new file mode 100644 index 0000000..713e8a3 --- /dev/null +++ b/eagle-5.7.0/ulp/find-single-ended-wire.ulp @@ -0,0 +1,397 @@ +#usage "en: Find single-ended wires (wire stubs)" + "

" + "Find single-ended wires that don't start or end at another wire, via or pad.
" + "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." + "
" + "RUN find-single-ended-wire [+] [-] [M] [=]" + "" + "" + "" + "" + "" + "
+ 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
" + "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.
" + "For recognizing the wire stubs it is necessary to set the fill style of the respective layer " + "to not filled (dotted or hatched).

" + "NOTE: WIREs or VIAs that end in a polygon's area, are recognized as single-ended!
" + "To avoid mistake use RATSNEST to calculate the polygons before. Now you can start the ULP!
" + "

" + "Autor: support@cadsoft.de" + , + "de: Find single ended wire." + "

" + "Findet WIREs die nicht an einem Pad, Via oder einem anderen Wire beginnen bzw. enden (Stummel).
" + "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." + "
" + "RUN find-single-ended-wire [+] [-] [M] [=]" + "" + "" + "" + "" + "" + "
+ 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
" + "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.
" + "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.

" + "ACHTUNG: WIREs oder VIAs, die in einer Polygonfläche enden, werden ebenfalls als Single-Ended erkannt!
" + "Um Verwechslungen auszuschliessen lassen Sie mit RATSNEST zuerst die Polygonflächen berechnen und starten dann das ULP!
" + "

" + "Autor: support@cadsoft.de" + +string Version = "1.01"; // 2007-04-03 alf@cadsoft.de + // 2008-04-10 changed GROUP ... (>x y); alf@cadsoft.de + +#require 4.1600; + + +int test = 0; + +enum { typeW, typeS, typeP, typeV }; +string Typ[] = { "Wire", "Smd", "Pad", "Via" }; +int sameL[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int sameS[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int padL[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int viaL[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int viaStackS[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; +int viaStackE[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + +int ncoord = 0; +int wx[]; // X coordinate +int wy[]; // Y coordinate +int wl[]; // Layer +int ws[]; // Start Layer for Via & Pad, Smd and Wire +int we[]; // End Layer for Via & Pad, Smd and Wire == Start Layer +int wt[]; // Type +int index[]; + +string cmd, s; + +string h; +string file, memory; +string cmdr[]; + + +// ### ---------------- functions ------------------- ### +void set_layer(int lay, int s_lay, int e_lay, int type) { + switch(type) { + case typeW : // Wire + sameL[lay]++; + break; + case typeS : // Smd + sameL[lay]++; + sameS[lay]++; + break; + + case typeP : // Pad + for (int pl = 1; pl < 18; pl++) { + padL[pl]++; + } + sameL[17]++; + break; + case typeV : // Via + for (int vl = s_lay; vl <= e_lay; vl++) { + viaL[vl]++; + } + viaStackS[viaL[18]] = s_lay; + viaStackE[viaL[18]] = e_lay; + viaL[18]++; + break; + } + return; +} + + +// ### claer counter ### +void clear_same_counter(void) { + for (int n = 0; n < 19; n++) { + viaL[n] = 0; + padL[n] = 0; + sameS[n] = 0; + sameL[n] = 0; + viaStackS[n] = 0; + viaStackE[n] = 0; + } + return; +} + + +// #*#*#* check via stack and if via routet on more as 1 layer *#*#*# +void check_via(int k, string sigName) { + int cntViaOverLap[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + string usedWireLayer = ""; + int nV = 0; + for (nV = 0; nV < viaL[18]; nV++) { // ### Via Stack + usedWireLayer = ""; + int wire_on_stack_via = 0; + for (int n = viaStackS[nV]; n <= viaStackE[nV]; n++) { + cntViaOverLap[n]++; + if (sameL[n]) { + sprintf(s, " %d", n); + usedWireLayer += s; + wire_on_stack_via++; + } + } + if (wire_on_stack_via < 2) { + if (!wire_on_stack_via) { + if (language() == "de") sprintf(s, "WINDOW (%.4f %.4f);\t %d %d 18\tNur VIA von Layer %d - %d, Signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + viaStackS[nV], viaStackE[nV], + viaStackS[nV], viaStackE[nV], + sigName + ); + + else sprintf(s, "WINDOW (%.4f %.4f);\t %d %d 18\tOnly VIA from layer %d - %d, signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + viaStackS[nV], viaStackE[nV], + viaStackS[nV], viaStackE[nV], + sigName + ); + } + else { + if (language() == "de") sprintf(s, "WINDOW (%.4f %.4f);\t %s 18\tZu wenig WIRE: Nur in Layer %s an VIA von Layer %d - %d geroutet, Signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + usedWireLayer, + usedWireLayer, + viaStackS[nV], viaStackE[nV], + sigName + ); + + else sprintf(s, "WINDOW (%.4f %.4f);\t %s 18\tOnly WIRE on layer %s on VIA from layer %d - %d, signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + usedWireLayer, + usedWireLayer, + viaStackS[nV], viaStackE[nV], + sigName + ); + } + cmd += s; + } + } + if (viaL[18]) { // ### check via layer overlap ### + string ViaOverlap = ""; + int cnt; + for (cnt = 1; cnt < 17; cnt++) { + if (cntViaOverLap[cnt] > 1) { + sprintf(s, " %d", cnt); + ViaOverlap += s; + } + } + if (ViaOverlap) { + if (language() == "de") sprintf(s, "WINDOW (%.4f %.4f);\t %s 18\tVIAs Stack-Überlappung in Layer %s, Signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + ViaOverlap, + ViaOverlap, + sigName + ); + + else sprintf(s, "WINDOW (%.4f %.4f);\t %s 18\tVIAs stack overlap on layer %s, signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + ViaOverlap, + ViaOverlap, + sigName + ); + cmd += s; + } + } + return; +} + + +// ### check count of elements on coordinate ### +void check_same(int k, string sigName) { + if (!sameL[17]) { // ### Pads können kein Single-Ended-Wire sein ### + if (viaL[18]) { + check_via(k, sigName); + } + else { + for (int n = 1; n <= 16; n++) { + if (sameL[n]) { + if (sameL[n] + viaL[n] + sameS[n] < 2) { + if (language() == "de") sprintf(s, "WINDOW (%.4f %.4f);\t %d \tNur 1 WIRE im Layer %d von Signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + n, n, sigName); + + else sprintf(s, "WINDOW (%.4f %.4f);\t %d \tFew WIRE on layer %d at signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + n, n, sigName); + cmd += s; + } + } + } + } + } + + if (padL[17] && viaL[18]) { + if (language() == "de") sprintf(s, "WINDOW (%.4f %.4f);\t %d %d 17 18\tPAD und VIA an gleicher Koordinate, Signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + ws[index[k]], we[index[k]], + sigName); + else sprintf(s, "WINDOW (%.4f %.4f);\t %d %d 17 18\tPAD and VIA on same coordinate, signal %s\n", + u2mm(wx[index[k]]), u2mm(wy[index[k]]), + ws[index[k]], we[index[k]], + sigName); + cmd += s; + } + return; +} + + + +// check multiple coordinates or one coordinate on this Signal +void checkcoord(string sigName) { + int n = 0; + h = ""; + sort(ncoord, index, wx, wy, wl, wt); // in Order - Coordinates - Layer - Type + n = 0; + clear_same_counter(); + + if (ncoord > 1) { + // ### loop ### + do { + set_layer(wl[index[n]], ws[index[n]], we[index[n]], wt[index[n]]); + if (wx[index[n+1]] == wx[index[n]] && wy[index[n+1]] == wy[index[n]] ) { + n++; + } + else { + check_same(n, sigName); + clear_same_counter(); + n++; + } + } while (n < ncoord); + check_same(n, sigName); + } + else check_same(n, sigName); + return; +} + + +// collect coordinates +void add(int x, int y, int lay, int l_start, int l_end, int type) { + wx[ncoord] = x; + wy[ncoord] = y; + wl[ncoord] = lay; + ws[ncoord] = l_start; + we[ncoord] = l_end; + wt[ncoord] = type; + ncoord++; + return; +} + + +// ### main ### +if (board) { + board(B) { + string trace_file = filesetext(B.name, "~~.sew"); // single endet wire + string memory_file = filesetext(B.name, "~~.mlc"); // memory line counter + + if (!argv[1]) { + dlgMessageBox(usage, "OK"); + B.signals(S) { + status(" check "+S.name); + ncoord = 0; + S.wires(W) { + if (W.layer < 17) { + add(W.x1, W.y1, W.layer, W.layer, W.layer, typeW); + add(W.x2, W.y2, W.layer, W.layer, W.layer, typeW); + } + } + S.contactrefs(C) { + if (C.contact.smd) { + add(C.contact.x, C.contact.y, C.contact.smd.layer, C.contact.smd.layer, C.contact.smd.layer, typeS); + } + else { + add(C.contact.pad.x, C.contact.pad.y, 17, 1, 16, typeP); + } + } + S.vias(V) { + add(V.x, V.y, 18, V.start, V.end, typeV); + } + checkcoord(S.name); + } + output(trace_file, "wtD") printf("%s", cmd); + output(memory_file, "wtD") printf("-1"); + exit("RUN '" + argv[0] + "' +\n"); + } + + // ### trace listed points by key "+" "-" + else { + string m_cmd[]; + int n = fileread(m_cmd, memory_file); // memory line counter + int cnt = strtol(m_cmd[0]); + string lines[]; + n = fileread(lines, trace_file); // single endet wire + + if (!n) { + dlgMessageBox("No single ended WIRE found!", "OK"); + exit(0); + } + + else if (argv[1] == "+" || argv[1] == "-" || argv[1] == "=" || strupr(argv[1]) == "M") { + if (argv[1] == "+") { + if (cnt < n-1) cnt++; + else { + if (language() == "de") dlgMessageBox("Letze Position!", "OK"); + else dlgMessageBox("The last position in list!", "OK"); + } + } + else if (argv[1] == "-") { + if(cnt) cnt--; + else { + if (language() == "de") dlgMessageBox("Erste Position!", "OK"); + else dlgMessageBox("The first position in list!", "OK"); + } + } + else if (strupr(argv[1]) == "M") { + n = strsplit(cmdr, lines[cnt], '('); + string Display = ""; + n = strsplit(m_cmd, cmdr[1], ')'); + n = strsplit(cmdr, m_cmd[0], ' '); + real x = strtod(cmdr[0]); + real y = strtod(cmdr[1]); + sprintf(Display, "GROUP (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (>%.4f %.4f);\nMOVE (>%.4f %.4f)", + x-0.0001, y-0.0001, + x+0.0001, y-0.0001, + x+0.0001, y+0.0001, + x-0.0001, y+0.0001, + x-0.0001, y-0.0001, + x, y + ); + exit(Display); + } + else if (argv[1] == "="); + } + + else { + if (language() == "de") dlgMessageBox("Unbekannter Parameter!", "OK"); + else dlgMessageBox("Unknown parameter!", "OK"); + exit(0); + } + + n = strsplit(cmdr, lines[cnt], '\t'); + string Display = ""; + if (m_cmd[1] != cmdr[1]) { + sprintf(Display, "DISPLAY NONE %s ;\n", cmdr[1]); + } + output(memory_file, "wtD") printf("%d\n%s", cnt, m_cmd[1]); // save the last pointer + exit("GRID mm;\n"+Display+cmdr[0]+"RUN ulpmessage '"+cmdr[2]+"';"+"MOVE"); // activate th move command + } + } +} + +else { + if (language() == "de") dlgMessageBox("Starten Sie das ULP in einem Board", "OK"); + else dlgMessageBox("Start this ULP in a Board", "OK"); +} \ No newline at end of file diff --git a/eagle-5.7.0/ulp/find.ulp b/eagle-5.7.0/ulp/find.ulp new file mode 100644 index 0000000..759ff34 --- /dev/null +++ b/eagle-5.7.0/ulp/find.ulp @@ -0,0 +1,1180 @@ +#usage "en: nobrFind elements in schematic/board and zoom in\n" + "

" + "Centers the object and zooms into the drawing." + "

" + "

You can also run this ULP from the command line:

" + "Usage: RUN find [ name [ pin | pad | [value CH new_value] [ count | * ]]" + "

" + "RUN find
" + "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)
" + "" + "Search string is the name of the Device/Package/Net/Bus/Pin/Pad/Signal/Value

" + "counter specifies the number of elements that shall be found before ending the search
" + "* sets the counter to 1000

" + "PIN | PAD | DEV | GATE additionally searches for PIN, PAD, GATE, DEVICE names
" + "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:
" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
Schematic: Board:
1. Part name 1. Element
2. Net name 2. Signal/Wires/Vias
3. Bus name 3. Pads
4. Value 4. ValueSearching for values is not case sensitive.
5. Device ** 5. Polygon width **
6. Gate ** 6. Drill
7. Pin ** 7. Via stack
8. Pad **
" + "** 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.

" + "" + "In symbol editor you can search at PIN name, in package editor you can search at PAD/SMD name
" + "Author: support@cadsoft.de" + , + "de: Findet Elemente in Schaltplan und Board
" + "

" + "Zoomt das gefundene Element in die Fenstermitte" + "

" + "

Sie können das ULP auch aus der Kommandozeile starten mit:

" + "RUN find [ name [ pin | pad | value [CH new_value] [ count | * ]]" + "
" + "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:
" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
Schematic: Board:
1. Part name 1. Element
2. Net name 2. Signal/Wires/Vias
3. Bus name 3. Pads
4. Value 4. ValueKeine Unterscheidung der Groß-/Kleinschreibung.
5. Device ** 5. Polygon width **
6. Gate ** 6. Drill
7. Pin ** 7. Via stack
8. Pad **
" + "** nach Device-, Gate-, Pin-, Pad-Namen, Polygon-Width und Drill-Durchmesser wird gesucht, falls DEV, GATE, PIN, PAD, POLYGON oder DRILL gesetzt ist.
" + "
" + "Im Symbol-Editor kann nach Pin-Name, im Package-Editor kann nach Pad/Smd-Name gesucht werden.

" + "Author: support@cadsoft.de"; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +// Version 1.1 2005.06.15 - CH : search and replace Value / Suchen und ersetzen das Value alf@cadsoft.de +// Zuweisung von vfind berichtigt, es konnten nur Values mit Großschreibung gefunden werden. +// durchsuchen von Netz-Namen in Bussen berichtigt. +// Version 1.2 2005.07.19 - Search also in Polygon - contour - wire +// +// Version 1.3 2005.11.14 - Search Part_Name +// +// Version 1.4 2006.04.25 - Show all parts with same Value in Board +// +// Version 1.5 2006.05.08 - Clip zoom coordinate for show to maximum +// +// Version 1.6 2006.09.26 - Find also (Device+)GATE-name +// +// Version 1.7 2006.11.09 - +/- Trace step by step with value +// ein neuer Suchbegriff setzt den Trace-counter auf 0 +// +// Version 1.8 2007.02.13 - Find Net without Segment-Wire, but with Pinref +// +// Version 1.9 2007.02.23 - Find Polygons with Wire-Width +// Zuweisung von vfind als Kommadozeileneingabe berichtigt +// In Bus-Namen werden jetzt auch Netze in der Schreibweise "D[0..7],A[0..15]" gefunden +// Falls der Layer des gefundenen Element nicht Visible ist wird er eingeschaltet +// +// Version 2.0 2007.04.23 - Find Drills (Pad, Via, Hole - Diameter) +// GATE +// VIA stack, sucht Vias von Layer bis Layer +// +// Version 2.1 2007.06.27 - Erst die Anzahl der gefundenen Elemente anzeigen, dann mit SHOW markieren, +// damit man anschliessend mit WINDOW bzw. Scroll-Rad zoomen kann ohne daß die +// Markierung (highlighten) aufgehoben wird. +// Abfrage des Zähler argc für die zu suchende Anzahl berichtigt. +// +// Version 2.2 2007.07.05 - Hilfe in #usage en: de: integriert. +// +// Version 2.3 2007.10.16 - Find PIN in Symbol +// - Find PAD/SMD in Package +// +// Version 2.4 2008.06.10 - Window-Befehl für SCH angepasst, +// Zoomfenster in SCH über Area berechnet +// Zähler für Option PAD/PIN/DEV berichtigt +// require 5.0.1 +// + + +#require 5.0001; +string Version = "Version 2.4"; +string find; +string vfind; +string NewValue; +string ChangeValue; +int change_value = 0; +string again; +string fpin; +string fndpin = "Element"; +string foundelement = ""; + +enum { sNull, sPin, sPad, sDevice, sGate, sValue }; +string SCHfPinPad[] = { "", "PIN", "PAD", "DEV", "GATE", "VALUE"}; + +enum { bNull, bPad, bValue, bPolygon, bDrill, bVia }; +string BRDfPinPad[] = { "", "PAD", "VALUE", "POLYGON", "DRILL", "VIA" }; + // for "POLYGON", "DRILL", "VIA" see also function returnfind() and function show_B() + +string Invoke[] ; // invoke list of not placed gates + +int Vstart; +int Vend; + +int fcnt = 0; +int cntstep = 0; +string stepfile = ""; +int all; +int cnt; +int StepMode = 0; // for trace vorward/backward of elements for show +int Result; +real lastZoom = 0; +int lastSheet = 0; +real PolyWidth = 0; +real DrillDiam = 0; + +int optshow = 0; // Only board. Option to manually placing 2006.04.25 +int display_layer[]; + + +int test = 0; + +string fileName = argv[0]; +string scriptfile = filesetext(fileName, "$$$.scr"); + +int gridunit; +string unit[] = { "Micron", "mm", "Mil", "Inch" }; + +string repeat = ""; + +// ### Functions ### +real u2u(int val) { + switch (gridunit) { + case GRID_UNIT_MIC : return u2mic(val); + case GRID_UNIT_MM : return u2mm(val); + case GRID_UNIT_MIL : return u2mil(val); + case GRID_UNIT_INCH : return u2inch(val); + } +} + +string dpbacksl(string fs) { + int l = 0; + do { + if (fs[l] == '\\') { + string fs1 = strsub(fs, 0 , l + 1); + string fs2 = strsub(fs, l + 1 ); + fs = fs1 + "\\" + fs2; + l += 2; + } + l++; + } while (fs[l]); + return fs; +} + + +string check_layer(void) { + board(B) { + B.layers(L) { + display_layer[L.number] = L.visible; + string s; + if (L.number == 21 || L.number == 22 || L.number == 25 || L.number == 26 || L.number == 27 || L.number == 28 || L.number == 51 || L.number == 52 ) { + if (L.visible) return "DISPLAY NONE 21 -23 25 27 51 22 -24 26 28 52;\n"; // display only Top layer + } + else if (L.visible) return "DISPLAY NONE 21 -23 25 27 51 22 -24 26 28 52;\n"; // display only Top layer + } + } + return ""; +} + + +void showrepeat(string text) { + dlgDialog("FIND.ULP") { + dlgHBoxLayout dlgSpacing(600); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(300); + dlgTextEdit(text); + } + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgStretch(1); + } + }; + return; +} + + +string returnfind(void) { + string rs; + if (!fpin) fndpin = "Element"; + + if (fpin == "POLYGON") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin); + else if (fpin == "DRILL") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin); + else if (fpin == "VIA") sprintf(rs, "run ulpmessage.ulp '%d %s found!';\n", fcnt, fndpin); + else if (StepMode){ + if (StepMode == fcnt) exit(repeat); + else repeat = ""; // no message while step mode + return ""; + } + else sprintf(rs, "run ulpmessage.ulp '%d %s(s) %s found!' '%s';\n", fcnt, fndpin, find, foundelement); // 2007.03.23 alf + + if (find) { + if (cntstep) { + if (cntstep > fcnt) { + output(stepfile, "wt") printf("%d\n%s\n%d", fcnt, vfind, cntstep); // write actual counter in file + } + else return ""; // for Trace step by step disply no message + } + } + return dpbacksl(rs); +} + + +void check(string repeat) { + if (optshow) { + if (test) showrepeat(repeat); + if (fcnt) { + exit(repeat); + } + return; + } + repeat = returnfind() + repeat; + if (test) showrepeat(repeat); + exit (repeat); // first messagebox than show 2007.06.27 alf +} + + +void helpULP(void) { + dlgDialog("find.ulp") { + dlgHBoxLayout dlgSpacing(550); + dlgLabel(usage); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + }; + return; +} + + +string getfind() { + real Dmin = 0.0, Dmax = u2u(13100); + string f; + all = 0; + int sel_m = 0; + int findpoly = 0; + Result = dlgDialog("Find Element"){ + dlgHBoxLayout { + dlgVBoxLayout { + dlgHBoxLayout { + dlgLabel("&Name "); + dlgStringEdit(f); + dlgLabel(" (Value) "); + dlgSpacing(30); + dlgStretch(1); + dlgPushButton("&Help") helpULP(); + } + dlgHBoxLayout { + dlgLabel("&Counts"); + dlgIntEdit(all, 0, 10000); + dlgSpacing(200); + dlgStretch(1); + dlgLabel(Version); + dlgSpacing(12); + } + dlgHBoxLayout { + if (schematic) { + dlgGroup("Find options") { + dlgRadioButton("&...", sel_m) fpin = ""; + dlgRadioButton("P&IN", sel_m) { fpin = "PIN"; } + dlgRadioButton("P&AD", sel_m) { fpin = "PAD"; } + dlgRadioButton("&DEV", sel_m) { fpin = "DEV"; } + dlgRadioButton("&GATE", sel_m) { fpin = "GATE"; } + dlgHBoxLayout { + dlgRadioButton("&VALUE", sel_m) fpin = ""; + dlgSpacing(22); + dlgCheckBox(" &change to ", change_value); + dlgLabel(" Val&ue "); + dlgStringEdit(NewValue); + dlgStretch(1); + } + } + } + if (board) { + dlgGroup("Find options") { + dlgRadioButton("&...", sel_m) fpin = ""; + dlgRadioButton("P&AD", sel_m) fpin = "PAD"; + dlgHBoxLayout { + dlgRadioButton("&VALUE", sel_m) fpin = ""; + dlgSpacing(12); + dlgCheckBox(" &change to", change_value) if (change_value) optshow = 0; + dlgLabel("Val&ue "); + dlgStringEdit(NewValue); + dlgSpacing(32); + dlgCheckBox("Sh&ow all ", optshow) if (optshow) change_value = 0; + } + dlgHBoxLayout { + dlgRadioButton("POL&YGON", sel_m) fpin = "PPOLYGON"; + dlgSpacing(65); + dlgLabel(" &Width "); + dlgRealEdit(PolyWidth, 0, 10000); + dlgSpacing(90); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("&DRILL", sel_m) fpin = "DRILL"; + dlgSpacing(73); + dlgLabel(" Diamete&r "); + dlgRealEdit(DrillDiam, Dmin, Dmax); + dlgSpacing(90); + dlgStretch(1); + } + dlgHBoxLayout { + dlgRadioButton("V&IA layer stack", sel_m) fpin = "VIA"; + dlgSpacing(50); + dlgLabel(" &Start "); + dlgIntEdit(Vstart, 0, 16); + dlgSpacing(12); + dlgLabel(" &End "); + dlgIntEdit(Vend, 0, 16); + dlgSpacing(90); + dlgStretch(1); + } + } + dlgStretch(1); + } + } + dlgStretch(0); + dlgHBoxLayout { + dlgPushButton("+&Find") { + dlgAccept(); + all--; + } + dlgStretch(1); + dlgPushButton("-Cancel") { dlgReject(); exit(-1); } + } + dlgStretch(1); + } + } + }; + if (!f && fpin == "GATE") f = "0"; + return f; +} + + +real clip_zoom(real v) { // clip value to max. coordinate 2006.05.08 + switch (gridunit) { + case GRID_UNIT_MIC : if (v > 838200) return 838200; + if (v < -838200) return -838200; + break; + case GRID_UNIT_MM : if (v > 838.2) return 838.2; + if (v < -838.2) return -838.2; + break; + case GRID_UNIT_MIL : if (v > 33000.0) return 33000; + if (v < -33000.0) return -33000; + break; + case GRID_UNIT_INCH : if (v > 33.0) return 33; + if (v < -33.0) return -33; + break; + } + return v; +} + + +// #### make script line for show in board #### +string show_B(real x, real y, real zoom1, real zoom2, string findb, int fist, int layer) { + fcnt++; + string cmd = ""; + string cmd_show; +// sprintf(cmd_show, "SHOW '%s';\n", findb); + sprintf(cmd_show, ";SHOW '%s' ", findb); // 2007.06.27 alf + if (fpin == "PAD") cmd_show = ""; // can not show pads + if (fpin == "POLYGON") sprintf(cmd_show, ";SHOW (%.4f %.4f);\n", x, y); // do not show polygons + // ### can not show drills ### + if (fpin == "DRILL") cmd_show = ""; // do not change this line + // ### can not show vias, only complete signal ### + if (fpin == "VIA") { cmd_show = ""; layer = 0; } // do not change this line + + if (optshow) { + sprintf(cmd, "%s", cmd_show); + } + else { + if (lastZoom) { + if (StepMode) { + sprintf(cmd, "\n;WINDOW (%.6f %.6f) ;\n%s", + x, y, + cmd_show + ); + } + else { + sprintf(cmd, "\n;WINDOW (%.6f %.6f) (%.6f %.6f) (%.6f %.6f);\n%s;\n", + x, y, + x, y, + x, y, + cmd_show + ); + } + } + else { + if (StepMode) { + sprintf(cmd, + ";\nWINDOW (%.6f %.6f);\n%s", + x, y, + cmd_show + ); + } + else { + sprintf(cmd, ";WINDOW FIT;\n" + ";WINDOW (%.6f %.6f) (%.6f %.6f) (%.6f %.6f);\n%s", + x, y, + clip_zoom(x + zoom1), y, + clip_zoom(x + zoom2), y, + cmd_show + ); + lastZoom = zoom2; + } + } + if (ChangeValue == "CH") { + string chval; + sprintf(chval, "VALUE %s '%s';\n", findb, NewValue); + cmd += chval; + } + } + if (!display_layer[layer] && layer != 0) { + sprintf(cmd_show, "DISPLAY %d;\n%s", layer, cmd); + cmd += cmd_show; + } + if (fpin == "VIA") { + sprintf(cmd_show, "DISPLAY %d %d 18;\n", Vstart, Vend); + cmd += cmd_show; + } + return cmd; +} + + +// #### make script line for show in schematic #### +string show_S(int s, real x1area, real y1area, real x2area, real y2area, string finds) { + fcnt++; + string cmd_show; + sprintf(cmd_show, ";SHOW '%s' ", finds); // 2007.06.27 alf + string cmd = ""; + if (s != lastSheet) { + lastSheet = s; + if (StepMode) { + sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s, + x1area, y1area, + x2area, y2area, + cmd_show + ); + } + else { + sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s, + x1area, y1area, + x2area, y2area, + cmd_show + ); + } + } + else { + if (StepMode) { + sprintf(cmd, ";\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s, + x1area, y1area, + x2area, y2area, + cmd_show + ); + } + else { + sprintf(cmd, ";\nEDIT .s%d;\nWINDOW (%.6f %.6f) (%.6f %.6f);\n%s", s, + x1area, y1area, + x2area, y2area, + cmd_show + ); + } + } + if (ChangeValue == "CH") { + string chval; + sprintf(chval, "VALUE %s '%s';\n", finds, NewValue); + cmd += chval; + } + + if (StepMode) { + if (cntstep != fcnt) cmd = ""; + } + return cmd; +} + + +real zfactor(real x1, real y1, real x2, real y2) { + return sqrt( pow(x2 - x1, 2) + pow(y2 - y1, 2) ); +} + + + +// *** split bus-name from net-name *** +int findBus(string name, string sfind) { + string bn[]; + int b; + b = strsplit(bn, name, ':'); + string nn[]; + if (b == 2) { + b = strsplit(nn, bn[1], ','); + } + else { + b = strsplit(nn, name, ','); + } + for (int x = 0; x < b; x++) { + if(nn[x] == sfind) return 1; + } + // *** search for name[n..n] *** + string nm; + for (x = 0; x < b; x++) { + int pos1 = strchr(nn[x], '['); + int pos2 = strchr(nn[x], '.'); + int pos3 = strchr(nn[x], ']'); + string Pref = strsub(nn[x], 0 , pos1); + string n1 = strsub(nn[x], pos1+1, pos2-pos1-1); + string n2 = strsub(nn[x], pos2+2, pos3-pos2-2); + for (int n = strtol(n1); n <= strtol(n2); n++) { + sprintf(nm, "%s%d", Pref, n); + if (nm == sfind) return 1; + } + } + return 0; +} + + + +// *** trace elemete step by step *** +string get_step(int step) { + StepMode = 1; + cntstep = 0; + string s = ""; + string lastvalue; + stepfile = filesetext(argv[0], ".stp"); + string sf[]; + int isfile = fileglob(sf, stepfile); + if (isfile) { + string t[]; + int ct = fileread(t, stepfile); + cntstep = strtod(t[0]); + if (vfind != t[1]) cntstep = 0; + } + cntstep += step; + if (cntstep < 1) { + cntstep = 1; + dlgMessageBox("!This is the first Element", "OK"); + } + output(stepfile, "wt") printf("%d\n%s", cntstep, vfind); // write actual counter in file + sprintf(s, "%d", cntstep); + return s; +} + + +string get_invoke(void) { + int sel; + int Result = dlgDialog("Invoke unused gates") { + dlgListView("Gates to Invoke", Invoke, sel) { dlgAccept(); return Invoke[sel]; } + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + }; + if (Result) return Invoke[sel]; + return ""; +} + + + +// ****** Main ****** + +vfind = argv[1]; +if (argc > 2) again = strupr(argv[argc-1]); // 2007.06.27 alf +if (argv[2] == "+") { again = get_step(1); StepMode = strtod(again); } +if (argv[2] == "-") { again = get_step(-1); StepMode = strtod(again); } + +if (symbol) symbol(S) { // 2007.10.16 + vfind = strupr(argv[1]); + if (!vfind) { + dlgMessageBox(usage + "
" + 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
LayerDiameterRestring
Top%.4f%.4f
Inner%.4f%.4f
Bottom%.4f%.4f
Drill%.4f
", + 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, "
PAD %s on (%.4f %.4f) %s [Element %s]
LayerDiameterRestring
Top%.4f%.4f
Inner%.4f%.4f
Bottom%.4f%.4f
Drill%.4f
", + 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, "
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!"; + if (fpin == "VIA") sprintf(StepFound, " %d-%d not found!", Vstart, Vend); + if (StepMode) { + get_step(-1); // do not count upper while not found + StepFound = " no more found!"; + } + dlgMessageBox("" + dpbacksl(find) + StepFound, "OK"); + exit (0); +} + + +// *** search and find in Schematic *** +if (schematic) { + lastSheet = 0; + schematic(S) { + gridunit = (S.grid.unit); + if (fpin == "GATE" && find == "0" || fpin == "GATE" && find == "*") { // 2007.04.03 find not placed GATEs + S.parts(PA) { + PA.instances(I) { + if (!I.sheet) { + if (find == "0") { + sprintf(repeat, "INVOKE %s %s\n", PA.name, I.gate.name); + exit(repeat); + } + else { + sprintf(Invoke[fcnt], "INVOKE %s %s\n", PA.name, I.gate.name); + fcnt++; + } + } + } + } + exit(get_invoke()); + } + + S.sheets(SH) { + SH.parts(PA) { + if (fpin == "DEV") { + if (PA.device.name == find) { // 2005.11.14 alf@cadsoft.de + PA.instances(IN) { + IN.gate.symbol.pins(P) { + fndpin = "Dev"; + sprintf(foundelement, "DEVice %s : sheet %d on (%.4f %.4f)", IN.name , IN.sheet, u2u(IN.x), u2u(IN.y) ); + repeat += show_S(IN.sheet, + u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1), + u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2), + PA.name + ); + if (all <= 0) check(repeat); + all--; + break; + } + break; + } + } + } + else if (fpin == "GATE") { + PA.instances(IN) { + if (PA.name+IN.gate.name == find || IN.gate.name == find) { + fndpin = "Gate"; + sprintf(foundelement, "GATE %s : sheet %d on (%.4f %.4f)", IN.gate.name , IN.sheet, u2u(IN.x), u2u(IN.y) ); + repeat += show_S(IN.sheet, + u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1), + u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2), + PA.name + ); + if (all <= 0) check(repeat); + all--; + break; + } + } + } + else if (fpin == "PIN") { + PA.instances(IN) { + status("Pin:"+PA.name); + IN.gate.symbol.pins(P) { // Pin + if (P.name == find) { + fndpin = "Pin"; + sprintf(foundelement, "PIN %s : sheet %d on (%.4f %.4f)", P.name , IN.sheet, u2u(P.x), u2u(P.y) ); + repeat += show_S(IN.sheet, + u2u(P.x)-u2u(50000), u2u(P.y)-u2u(50000), + u2u(P.x)+u2u(50000), u2u(P.y)+u2u(50000), + PA.name + ); + if (all <= 0) check(repeat); + all--; + break; + } + } + } + } + else if (fpin == "PAD") { + status("Pad:"+PA.name); + PA.instances(IN) { + IN.gate.symbol.pins(P) { + if (P.contact) { + if (P.contact.name == find) { + fndpin = "Pad"; + sprintf(foundelement, "PAD %s (PIN %s) : sheet %d on (%.4f %.4f)", PA.name, P.name , IN.sheet, u2u(IN.x), u2u(IN.y) ); + repeat += show_S(IN.sheet, + u2u(P.x)-u2u(100000), u2u(P.y)-u2u(100000), + u2u(P.x)+u2u(100000), u2u(P.y)+u2u(100000), + PA.name + ); + if (all <= 0) check(repeat); + all--; + break; + } + } + } + } + } + } + SH.nets(N) { + status("Net:"+N.name); + if (N.name == find) { + fndpin = "Net"; + N.segments(SEG) { + SEG.wires(W) { + real ox, oy; // 2008.06.10 alf neue Berechnung des Zoomausschnitt + if (W.x1 < W.x2) { + ox = -0.1 * (u2u(W.x1 + W.x2) / 2); + } + else { + ox = 0.1 * (u2u(W.x1 + W.x2) / 2); + } + if (W.y1 < W.y2) { + oy = -0.1 * (u2u(W.y1 + W.y2) / 2); + } + else { + oy = 0.1 * (u2u(W.y1 + W.y2) / 2); + } + repeat += show_S(SH.number, + u2u(W.x1) - ox, u2u(W.y1) - oy, + u2u(W.x2) + ox, u2u(W.y2) + oy, + find + ); + if (all <= 0) check(repeat); + all--; + } + } + } + } + } + S.sheets(SH) { + SH.parts(PA) { + status("Part:"+PA.name); + if (PA.name == find) { + PA.instances(IN) { // Gate + if (IN.sheet) { + fndpin = "Part"; + sprintf(foundelement, "Device %s : sheet %d on (%.4f %.4f)", PA.name , IN.sheet, u2u(IN.x), u2u(IN.y) ); + repeat += show_S(IN.sheet, + u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1), + u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2), + PA.name + ); + if (all <= 0) check(repeat); + all--; + } + } + } + } + SH.busses(B) { + status("Bus:"+B.name); + if (findBus(B.name, find)) { + fndpin = "Bus"; + B.segments(SEG) { + SEG.wires(W) { + real ox, oy; // 2008.06.10 alf neue Berechnung des Zoomausschnitt + if (W.x1 < W.x2) { + ox = -0.1 * (u2u(W.x1 + W.x2) / 2); + } + else { + ox = 0.1 * (u2u(W.x1 + W.x2) / 2); + } + if (W.y1 < W.y2) { + oy = -0.1 * (u2u(W.y1 + W.y2) / 2); + } + else { + oy = 0.1 * (u2u(W.y1 + W.y2) / 2); + } + repeat += show_S(SH.number, + u2u(W.x1) - ox, u2u(W.y1) - oy, + u2u(W.x2) + ox, u2u(W.y2) + oy, + find + ); + if (all <= 0) check(repeat); + all--; + } + } + } + } + SH.parts(PA) { + status("Value:" + PA.name); + PA.instances(IN) { // Gate + if (PA.value == vfind) { + fndpin = "Value"; + sprintf(foundelement, "Value %s | %s : sheet %d on (%.4f %.4f)", PA.value, PA.name , IN.sheet, u2u(IN.x), u2u(IN.y) ); + repeat += show_S(IN.sheet, + u2u(IN.gate.symbol.area.x1), u2u(IN.gate.symbol.area.y1), + u2u(IN.gate.symbol.area.x2), u2u(IN.gate.symbol.area.y2), + PA.name + ); + if (all <= 0) check(repeat); + all--; + } + } + } + } + } + check(repeat); +} +else { + dlgMessageBox("Start this ULP from schematic or board!", "OK"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/gluemark.ulp b/eagle-5.7.0/ulp/gluemark.ulp new file mode 100644 index 0000000..13aaee5 --- /dev/null +++ b/eagle-5.7.0/ulp/gluemark.ulp @@ -0,0 +1,145 @@ +#usage "Export data for SMD glue dispenser equipment\n" + "

" + "

    " + "
  • Define glue points in library as circles on tGlue layer. Use as many circles" + " per package as you like. If no circle is defined, one default point is used" + " (center of wires in tPlace layer)." + "
  • Run gluemark.ulp to generate circles on layers 111 and 112, indicating glue points" + " for smd packages on top or bottom layers." + "
  • Edit 111 + 112 if necessary (you can also add or delete circles) and then use" + " glueout4.ulp to generate data for glue dispenser. glueout.ulp has to be changed to" + " get the data format wanted." + "
  • Use gluetop.dat and gluebot.dat for your dispenser." + "
" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +//******* workaround due to beta version error +//all min function calls changed to minm, max changed to maxm +real minm(real a, real b) { + if (a <= b) return a; + else return b; + } +real maxm(real a, real b) { + if (a >= b) return a; + else return b; + } +//******* + +int issmd, gluedef, ontop; +real xmin , xmax, ymin, ymax, x, y; +string h, cmd; + +void setgluepoint(UL_ELEMENT E){ + gluedef = 0; + E.package.circles(CI){ + if (CI.layer == LAYER_TGLUE) { + x = u2inch(CI.x); y = u2inch(CI.y); + h = ""; + sprintf(h,"Layer tGTest;\nCircle 0.016 (%f %f) (%f %f);\n", x, y, x+0.016, y); + cmd += h; + gluedef = 1; + } + if (CI.layer == LAYER_BGLUE) { + x = u2inch(CI.x); y = u2inch(CI.y); + h = ""; + sprintf(h,"Layer bGTest;\nCircle 0.016 (%f %f) (%f %f);\n", x, y, x+0.016, y); + cmd += h; + gluedef = 1; + } + } + + xmin = u2inch(E.x); xmax = xmin; + ymin = u2inch(E.y); ymax = ymin; + if (gluedef == 0){ + E.package.wires(W){ + if (W.layer == LAYER_TPLACE) { + ontop = 1; + xmin = min(u2inch(W.x1),xmin);output("test.scr") {printf("u2iW.x%f\n",u2inch(W.x1));} + xmin = min(u2inch(W.x2),xmin); + ymin = min(u2inch(W.y1),ymin); + ymin = min(u2inch(W.y2),ymin); + xmax = max(u2inch(W.x1),xmax); + xmax = max(u2inch(W.x2),xmax); + ymax = max(u2inch(W.y1),ymax); + ymax = max(u2inch(W.y2),ymax); + } + if (W.layer == LAYER_BPLACE) { + ontop = 0; + xmin = min(u2inch(W.x1),xmin); + xmin = min(u2inch(W.x2),xmin); + ymin = min(u2inch(W.y1),ymin); + ymin = min(u2inch(W.y2),ymin); + xmax = max(u2inch(W.x1),xmax); + xmax = max(u2inch(W.x2),xmax); + ymax = max(u2inch(W.y1),ymax); + ymax = max(u2inch(W.y2),ymax); + } + } + x = (xmin+xmax)/2; y = (ymin+ymax)/2; + if (ontop == 1) { + h = ""; + sprintf(h,"LAYER tGTest;\nCircle 0.016 (%f %f) (%f %f);\n", x, y, x+0.016, y); + cmd += h; + } + if (ontop == 0) { + h = ""; + sprintf(h,"LAYER bGTest;\nCircle 0.016 (%f %f) (%f %f);\n", x, y, x+0.016, y); + cmd += h; + } + } +} + +cmd = ""; +h = ""; +sprintf(h,"Layer 111 tGTest;\n"); +cmd += h; +h = ""; +sprintf(h,"Layer 112 bGTest;\n"); +cmd += h; +h = ""; +sprintf(h,"Set Color_Layer 111 red;\n"); +cmd += h; +h = ""; +sprintf(h,"Set Color_Layer 112 blue;\n"); +cmd += h; +h = ""; +sprintf(h,"Grid inch;\n"); +cmd += h; + +if (board){ +board(B){ + B.elements(E) { + issmd = 0; + E.package.contacts(C) { + if (C.smd) { + issmd = 1; + break; + } + } + if (issmd) { + setgluepoint(E); + } + + } +} +// EditBox +int Result = dlgDialog("Edit and Execute") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; +if (!Result) exit(0); + +exit(cmd); + +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/glueout.ulp b/eagle-5.7.0/ulp/glueout.ulp new file mode 100644 index 0000000..c521dd2 --- /dev/null +++ b/eagle-5.7.0/ulp/glueout.ulp @@ -0,0 +1,53 @@ +#usage "Export data for SMD glue dispenser equipment\n" + "

" + "This program is used in conjunction with gluemark.ulp.
" + "It generates top and bottom glue data from circles on layers 111 and 112." + "

" + "Define output format in function outputdata." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string top_data_filename = "gluetop.dat"; +string bottom_data_filename = "gluebot.dat"; + +void outputdata (UL_CIRCLE C){ + +//**** change the following line to adjust the output format ****** + printf("Gluepoint coordinates: %f %f\n", u2inch(C.x),u2inch(C.y)); +} + +void header (UL_BOARD B){ + printf("#%s\n\n", EAGLE_SIGNATURE); + printf("#Gluepoints exported from %s\n#at %s\n\n", B.name, t2string(time())); +} + +if (board) { +output(top_data_filename) { + board(B){ + header(B); + B.circles(C){ + if (C.layer == 111) { + outputdata(C); + } + } + } +} + +output(bottom_data_filename) { + board(B){ + header(B); + B.circles(C){ + if (C.layer == 112) { + outputdata(C); + } + } + } +} +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/hyperlynx.ulp b/eagle-5.7.0/ulp/hyperlynx.ulp new file mode 100644 index 0000000..41317c0 --- /dev/null +++ b/eagle-5.7.0/ulp/hyperlynx.ulp @@ -0,0 +1,1600 @@ +#usage "nobr>Exports the board to HyperLynx Signal-Integrity Transfer Format (.HYP)

" + "* HyprLynx.ULP Written by Frank Hoffman of LLOYD I/O INC
" + "* Copyright (c) 1997, All Rights Reserved by LLOYD I/O INC
" + "* 503/222-0702 frankh@lloydio.com www.lloydio.com" + "

" + "* 1 sided boards use layer 16
" + "* 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 0 ) { + ICreflib = "74" + strsub( ICvalue, 2, ICccnt ) + ".PML"; + } + else { + ICreflib = "74TTL.PML"; + } + } else + if ( strstr( ICvalue, "40" ) == 0 ) { + unknownIC = no; + ICreflib = "74HC.PML"; + ICvalue = "74HC" + ICvalue; + } + if ( unknownIC == no ) { + printf("%s, %s, %s",ICname,ICreflib,ICvalue); + ICpn =E.package.name; + if ( strstr( ICpn,"TSSOP" ) != -1 ) { + printf("_TSSOP"); + } + else if ( strstr( ICpn,"TQFP" ) != -1 ) { + printf("_TQFP"); + } + else if ( strstr( ICpn,"SSOP" ) != -1 ) { + printf("_SSOP"); + } + else if ( strstr( ICpn,"PLCC" ) != -1 ) { + printf("_PLCC"); + } + else if ( strstr( ICpn,"LCC" ) != -1 ) { + printf("_LCC"); + } + else if ( strstr( ICpn,"DIP" ) != -1 ) { + printf("_DIP"); + } + else if ( strstr( ICpn,"QFP" ) != -1 ) { + printf("_QFP"); + } + else if ( strstr( ICpn,"BGA" ) != -1 ) { + printf("_BGA"); + } + else if ( strstr( ICpn,"PGA" ) != -1 ) { + printf("_PGA"); + } + else if ( strstr( ICpn,"DIL" ) != -1 ) { + printf("_DIP"); + } + else if ( strstr( ICpn,"DIP" ) != -1 ) { + printf("_DIP"); + } + else if ( strstr( ICpn,"SO" ) != -1 ) { + printf("_SSOP"); + } + printf("\n"); + } + } + } + } + } + + if ( GenerateHyperlynxFile == no ) { + exit( EXIT_SUCCESS ); + } + output( filesetext( B.name, ".HYP" ) ) { + printdivider(); + printf("%s\n", headerline); // 03.05.2005 alf@cadsoft.de + printf("* %s\n*\n", Version); + printf("* %s\n*\n", EAGLE_SIGNATURE); + printf("* HyperLynx Board exported from:\n"); + printf("* %s\n", B.name); + printf("* At %s\n*\n", t2string(time())); + + if (project.schematic) { + printf("* Schematic is loaded.\n"); + } + else { + printf("* Schematic NOT is loaded.\n"); + } + printf("*\n\n"); + printf("{VERSION=2.10} Compatible with Hyperlynx version 2.10.\n"); + printf("{UNITS=ENGLISH WEIGHT}\n\n"); + + // BOARD OVERALL AREA DIMENSIONS + // Writes the board dimensions found on layer 20 + printheader("Board Dimensions"); + printf("{BOARD\n"); + // wires on the dimension layer + B.wires(W) { + if (W.layer == 20 ) { + if (W.curve) { + // arcs in the dimension layer + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Arcs: Board Outline Arc is CCW\n", + precision_of_nets,u2inch(W.arc.x1),precision_of_nets,u2inch(W.arc.y1), + precision_of_nets,u2inch(W.arc.x2),precision_of_nets,u2inch(W.arc.y2), + precision_of_nets,u2inch(W.arc.xc),precision_of_nets,u2inch(W.arc.yc), + precision_of_nets,u2inch(W.arc.radius) ); + } + else { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Wires: From Board\n", + precision_of_perimeter,u2inch(W.x1),precision_of_perimeter,u2inch(W.y1), + precision_of_perimeter,u2inch(W.x2),precision_of_perimeter,u2inch(W.y2)); + } + } + } + // rectangles on the dimension layer + B.rectangles(R) { + if (R.layer == 20 ) { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Board : Bottom\n", + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y1), + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y1) ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Board : Right\n", + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y1), + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y2) ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Board : Top\n", + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y2), + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y2) ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Board : Left\n", + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y2), + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y1) ); + } + } + // polygons on the dimension layer + B.polygons(P) { + if (P.layer == 20 ) { + P.wires(W) { + if (W.layer == 20 ) { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Polygon Wires: From Board\n", + precision_of_perimeter,u2inch(W.x1),precision_of_perimeter,u2inch(W.y1), + precision_of_perimeter,u2inch(W.x2),precision_of_perimeter,u2inch(W.y2)); + } + } + } + } + // circles in the dimension layer + B.circles(C) { + if (C.layer == 20 ) { + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Circles: Board Outline Arc is CCW\n", + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y), + precision_of_nets,u2inch(C.radius) ); + } + } + // holes in the board + int halfdrilldiameter; + B.holes(H) { + halfdrilldiameter = H.drill / 2; + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Holes: Board Outline Arc is CCW\n", + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y+halfdrilldiameter), + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y+halfdrilldiameter), + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y), + precision_of_nets,u2inch(halfdrilldiameter) ); + } + // package wires on the dimension layer + B.elements(E) { + E.package.wires(W) { + if (W.layer == 20 ) { + if (W.curve) { + // package arcs in the dimension layer + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Arcs: Board Outline Arc is CCW Package %s in %s.LBR\n", + precision_of_nets,u2inch(W.arc.x1),precision_of_nets,u2inch(W.arc.y1), + precision_of_nets,u2inch(W.arc.x2),precision_of_nets,u2inch(W.arc.y2), + precision_of_nets,u2inch(W.arc.xc),precision_of_nets,u2inch(W.arc.yc), + precision_of_nets,u2inch(W.arc.radius), + E.package.name,E.package.library ); + } + else { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Wires: From Package %s in %s.LBR\n", + precision_of_perimeter,u2inch(W.x1),precision_of_perimeter,u2inch(W.y1), + precision_of_perimeter,u2inch(W.x2),precision_of_perimeter,u2inch(W.y2), + E.package.name,E.package.library); + } + } + } + // package rectangles on the dimension layer + E.package.rectangles(R) { + if (R.layer == 20 ) { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Package %s in %s.LBR : Bottom\n", + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y1), + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y1), + E.package.name,E.package.library ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Package %s in %s.LBR : Right\n", + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y1), + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y2), + E.package.name,E.package.library ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Package %s in %s.LBR : Top\n", + precision_of_perimeter,u2inch(R.x2),precision_of_perimeter,u2inch(R.y2), + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y2), + E.package.name,E.package.library ); + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Rectangles: From Package %s in %s.LBR : Left\n", + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y2), + precision_of_perimeter,u2inch(R.x1),precision_of_perimeter,u2inch(R.y1), + E.package.name,E.package.library ); + } + } + // package polygons on the dimension layer + E.package.polygons(P) { + if (P.layer == 20 ) { + P.wires(W) { + if (W.layer == 20 ) { + printf("(PERIMETER_SEGMENT X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f) Polygon Wires: From Package %s in %s.LBR\n", + precision_of_perimeter,u2inch(W.x1),precision_of_perimeter,u2inch(W.y1), + precision_of_perimeter,u2inch(W.x2),precision_of_perimeter,u2inch(W.y2), + E.package.name,E.package.library); + } + } + } + } + // package circles in the dimension layer + E.package.circles(C) { + if (C.layer == 20 ) { + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Circles: Board Outline Arc is CCW Package %s in %s.LBR\n", + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y), + precision_of_nets,u2inch(C.radius), + E.package.name,E.package.library ); + } + } + // package holes + int halfdrilldiameter; + E.package.holes(H) { + halfdrilldiameter = H.drill / 2; + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f) Holes: Board Outline Arc is CCW Package %s in %s.LBR\n", + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y+halfdrilldiameter), + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y+halfdrilldiameter), + precision_of_nets,u2inch(H.x),precision_of_nets,u2inch(H.y), + precision_of_nets,u2inch(halfdrilldiameter), + E.package.name,E.package.library ); + } + } + printf("}\n\n"); + + // LAYER INFORMATION + printheader("Thickness of Copper and Dielectric Layer Data"); + if ( UseBoardStackUp == yes ) { + printf("{STACKUP\n"); + layer_counter = 0; + B.layers(L) CountLayers(L); + Total_Layers = layer_counter; // remember active layers + layer_counter = 0; + B.layers(L) PrintLayer(L); + printf("}\n"); + // TOTAL BOARD THICKNESS + printf("* Total Board Thickness %6.4f inch\n\n",Total_Board_Thickness); + } + else { + printf("* No PCB Thickness Data Generated !!! \n*\n\n"); + } + + // PACKAGES ON THE BOARD + printheader("Components"); + printf("{DEVICES\n"); + int unknowncomponenttype, pincount, componentspace; + string componentname; + string componentvalue; + B.elements(E) { + // get the number of pins + pincount = 0; + E.package.contacts(C) { + pincount++; + } + // set component as unknown + unknowncomponenttype = yes; + // remember component reference designator + componentname = E.name; + // truncate component values at the first space + // ? ASK HYPERLYNX : what about something like .1u 50v + componentvalue = E.value; + if ( TruncateComponentValues == yes ) + if ( ( componentspace = strchr( componentvalue, ' ' ) ) != -1 ) + componentvalue = strsub( componentvalue, 0, componentspace ); + // parse reference designators ? + if ( UseComponentTypes == yes ) { + if ( strstr( componentname, "IC" ) == 0 ) { + if ( isdigit( componentname[2] ) ) { + printf("(IC REF=%s NAME=%s L=%s",componentname,componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + saypackagetype(E.package.name); + unknowncomponenttype = no; + } + } + else if ( strstr( componentname, "BD" ) == 0 ) { + if ( isdigit( componentname[2] ) ) { + printf("(BD REF=%s NAME=%s L=%s",componentname,componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + } + else if ( strstr( componentname, "BEAD" ) == 0 ) { + if ( isdigit( componentname[4] ) ) { + printf("(BD REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + } + else if ( isdigit( componentname[1] ) ) { + if ( strchr( componentname, 'U' ) == 0 ) { + printf("(IC REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + saypackagetype(E.package.name); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'C' ) == 0 ) { + printf("(C REF=%s VAL=",componentname); + ConvertCapValue(componentvalue); + printf(" L=%s",E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'R' ) == 0 ) { + printf("(R REF=%s VAL=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'L' ) == 0 ) { + printf("(L REF=%s VAL=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'D' ) == 0 ) { + printf("(CR REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'J' ) == 0 ) { + printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'Q' ) == 0 ) { + printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + else if ( strchr( componentname, 'T' ) == 0 ) { + printf("(J REF=%s NAME=%s L=%s",componentname, componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + unknowncomponenttype = no; + } + } + } + + // handle unknown component types + if ( ( unknowncomponenttype == yes ) || ( UseComponentTypes == no ) ) { + printf("(? REF=%s NAME=%s L=%s",componentname,componentvalue, + E.mirror ? LayerNames[16] : LayerNames[1] ); + saypackagetype(E.package.name); + } + + // append comment field + printf(") R%03.0f X=%5.*f Y=%5.*f : ",E.angle,precision_of_nets,u2inch(E.x), + precision_of_nets,u2inch(E.y) ); + printf(" Lib: %s : %s : ", E.package.library, E.package.name); + printf("Pins %d", pincount); + printf("\n"); + } + printf("}\n\n"); + + + // PADSTACK CREATION OF PADS, SMDS, AND VIAS + // create list of all the different pads and smds (vias are pads) + printheader("Pads, Smds, and Via Library"); + // handle all net contacts and vias + B.signals(S) { + S.vias(V) { + Insert_A_Pad( ISAPAD, ISAVIA, + V.shape[1], V.shape[2], V.shape[16], + V.end, + V.diameter[1], V.diameter[2], V.diameter[16], + V.start, + V.drill ); + } + } + // handle all package pins + B.elements(E) { + E.package.contacts(C) { + if (C.pad) { + Insert_A_Pad( ISAPAD, ISAPAD, + C.pad.shape[1], C.pad.shape[2], C.pad.shape[16], + C.pad.angle, + C.pad.diameter[1], C.pad.diameter[2], C.pad.diameter[16], + C.pad.elongation, + C.pad.drill ); + } + else if (C.smd) { + if ( !C.smd.dx || !C.smd.dy) { + string h; + sprintf(h, "!
Found a SMD-Pad with dx or dy = 0 (Zerro)
Pad %s'
Layer %d
Coordinate (%.4f %.4f) mil
Package %s.PAC
Element %s
Library %s.lbr

ULP aborted.", + C.name, + C.smd.layer, + u2mil(C.x), u2mil(C.y), + E.package.name, + E.name, + E.package.library + ); + dlgMessageBox( h, "OK"); + exit(0); + } + else { + Insert_A_Pad( ISASMD, C.smd.layer, + SmdRoundness(C.smd.roundness), 0, 0, + C.smd.angle, + C.smd.dx, 0, 0, + C.smd.dy, + 0 ); + } + } + } + } + + // write out sorted list of the pads and smds + if (Total_Pads) { + /* *** Hyperlynx documentation ************************************* + {PADSTACK=padstack_name, // ** maximum of 32 characters an cannot contain white space + [drill_size] + (layer_name, + pad_shape, // '0' means oval or round (pad_sx=pad_sy if round) + // '1' means rectangular or square (pad_sx=pad_sy if square) + // '2' means oblong (oblong shape is a rectangular with rounded corners) + pad_sx, + pad_sy, + pad_angle, // is the counter-clockwise rotation angle of the pad in degree; + // rotation angle can range from 0.0 to +/-359.999; + // valid angular resolution is 0.001 degree; + // 0 (without a decimal point) is th recommended way of specifying 'no rotation' + [thermal_clear_shape], + [thermal_clear_sx], + [thermal_clear_sy], + [thermal_clear_angle], + [pad_type]) + ***************************************************************** */ + + string s; + for (int i = 1; i <= Total_Pads; i++) { // *** 17.08.2005 count from 1 *** + if (pad_layer[i] == 0) s = "ISAPAD"; + if (pad_layer[i] == 1 || pad_layer[i] == 16) s = "ISASMD"; + if (pad_layer[i] == 18) s = "ISAVIA"; + if (pad_type[i] == ISASMD) { + printf("{PADSTACK=SMD%03d\n",i); // **** 17.08.2005 alf@cadsoft.de *** + // smds are square, round or oblong + + // * if you wish layer name for layer number remark * + // * this next 2 lines und mark the second 2 lines * + // printf("(%s,%d,%5.*f,%5.*f,%.1f) Shape was Smd and is now Smd\n", + // LayerNames[pad_layer[i]], // Layer name + + printf("(%d,%d,%5.*f,%5.*f,%.1f) %s Shape was Smd and is now Smd\n", + pad_layer[i], // Layer number + pad_shape_Top_rnds[i], + precision_of_pads, u2inch(pad_diameter_Top_or_dx[i]), + precision_of_pads, u2inch(pad_dy_elong_start[i]), + pad_angle_end[i], + s ); + } + else if (pad_type[i] == ISAPAD) { + + /* *** HyperLynx Signal-Integrity Transfer Format ****** + {PADSTACK=padstack_name, [drill_size] + (layer_name, pad_shape, pad_sx, pad_sy, pad_angle, + [thermal_clear_shape], + [thermal_clear_sx], + [thermal_clear_sy], + [thermal_clear_angel], + [pad_type]) [comment] + ** [pad_type]!M=metal-pad A=anti-pad ** + ******* HyperLynx Signal-Integrity Transfer Format *** */ + printf("{PADSTACK=THR%03d,%5.3f\n", i, u2inch(pad_drill[i])); // *** 17.08.2005 count from 1 *** + // pads are on all layers, and have various shapes + if (pad_layer[i] == ISAPAD) { + + // Pad layer Top + if (pad_shape_Top_rnds[i] == OBLONG) { + printf("(1,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Top_rnds[i]], + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i] * pad_dy_elong_start[i]), + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]), + pad_angle_end[i], + s, + EaglePadShapes[pad_shape_Top_rnds[i]], + HypPadShapes[pad_shape_Top_rnds[i]] ); + } + else { // OVALROUND or RECTSQUARE + printf("(1,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Top_rnds[i]], + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]), + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]), + pad_angle_end[i], + s, + EaglePadShapes[pad_shape_Top_rnds[i]], + HypPadShapes[pad_shape_Top_rnds[i]] ); + } + + // Pad layer Inner + printf("(MDEF,%s,%5.*f,%5.*f,0) %s\n", + PadShapes[pad_shape_Inner[i]], + precision_of_pads,u2inch(pad_diameter_Inner[i]), + precision_of_pads,u2inch(pad_diameter_Inner[i]), + s); + + // Pad layer Bottom + if (pad_shape_Bott[i] == OBLONG) { + printf("(16,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Bott[i]], + precision_of_pads,u2inch(pad_diameter_Bott[i] * pad_dy_elong_start[i]), + precision_of_pads,u2inch(pad_diameter_Bott[i]), + pad_angle_end[i], + s, + EaglePadShapes[pad_shape_Bott[i]], + HypPadShapes[pad_shape_Bott[i]]); + } + else { // OVALROUND or RECTSQUARE + printf("(16,%s,%5.*f,%5.*f,%.1f) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Bott[i]], + precision_of_pads,u2inch(pad_diameter_Bott[i]), + precision_of_pads,u2inch(pad_diameter_Bott[i]), + pad_angle_end[i], + s, + EaglePadShapes[pad_shape_Bott[i]], + HypPadShapes[pad_shape_Bott[i]]); + } + } + + else if (pad_layer[i] == ISAVIA) { + // Top - Inner(schleife) - Bottom + for (int vlay = pad_dy_elong_start[i]; vlay <= pad_angle_end[i]; vlay++) { + // layer used and allowed? + if (copp_used_layer[vlay]) { // layer used for copper an visible + if (vlay == 1) + printf("(1,%s,%5.*f,%5.*f,0) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Top_rnds[i]], + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i] * pad_dy_elong_start[i]), + precision_of_pads,u2inch(pad_diameter_Top_or_dx[i]), + s, + EaglePadShapes[pad_shape_Top_rnds[i]], + HypPadShapes[pad_shape_Top_rnds[i]] ); + + else if (vlay == 16) + printf("(16,%s,%5.*f,%5.*f,0f) %s Shape was %s and is now %s\n", + PadShapes[pad_shape_Bott[i]], + precision_of_pads,u2inch(pad_diameter_Bott[i] * pad_dy_elong_start[i]), + precision_of_pads,u2inch(pad_diameter_Bott[i]), + s, + EaglePadShapes[pad_shape_Top_rnds[i]], + HypPadShapes[pad_shape_Top_rnds[i]] ); + + else printf("(%d,0,%5.*f,%5.*f,0) %s always round in inner layer\n", + vlay, + precision_of_pads,u2inch(pad_diameter_Inner[i]), + precision_of_pads,u2inch(pad_diameter_Inner[i]), + s ); + } + } + } + } + printf("}\n\n"); + } + } + + // SIGNALS + printheader("Nets"); + int Pad_ID, Xpad, Ypad, EpadX, EpadY, TLaylimit, Blaylimit; + B.signals(S) { + printf("{NET=%s\n",S.name); + S.contactrefs(C) { + + if (C.contact.pad) { + Pad_ID = Find_A_Pad( ISAPAD, 0, + C.contact.pad.shape[1], C.contact.pad.shape[2], C.contact.pad.shape[16], + C.contact.pad.angle, + C.contact.pad.diameter[1], C.contact.pad.diameter[2], C.contact.pad.diameter[16], + C.contact.pad.elongation, + C.contact.pad.drill ); + if ( Pad_ID ) { // *** 17.08.2005 Pad count from 1 to total_pad *** + Xpad = C.contact.pad.x; + EpadX = Xpad; + Ypad = C.contact.pad.y; + EpadY = Ypad; + TLaylimit = 1; + Blaylimit = 16; + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=THR%03d", + precision_of_nets,u2inch(Xpad), precision_of_nets,u2inch(Ypad), + C.element.name, C.contact.pad.name, Pad_ID); // ** correct number while listing count from 1 + // ** 17.08.2005 alf@cadsoft.de *** + + SayUPinFunction( C.element.name, C.contact.pad.name ); + printf(") %s, Pad Diameter: %5.*f Drill: %5.*f\n", + S.name, precision_of_nets, u2inch(C.contact.pad.diameter[16]), + precision_of_nets, u2inch(C.contact.pad.drill) ); + } + else { + printf("Unregistered Pin Size!\n"); + } + } + if (C.contact.smd) { + Pad_ID = Find_A_Pad( ISASMD, C.contact.smd.layer, + SmdRoundness(C.contact.smd.roundness), 0, 0, + C.contact.smd.angle, + C.contact.smd.dx, 0, 0, + C.contact.smd.dy, + 0 ); + if ( Pad_ID ) { // *** 17.08.2005 count from 1 *** + Xpad = C.contact.smd.x; + EpadX = Xpad; + Ypad = C.contact.smd.y; + EpadY = Ypad; + TLaylimit = C.contact.smd.layer; + Blaylimit = C.contact.smd.layer; + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=SMD%03d", + precision_of_nets,u2inch(Xpad), precision_of_nets,u2inch(Ypad), + C.element.name, C.contact.smd.name, Pad_ID); // ** correct number while listing count from 1 + // ** 17.08.2005 alf@cadsoft.de *** SayUPinFunction( C.element.name, C.contact.smd.name ); + printf(") %s, Smd Dx: %5.*f Dy: %5.*f\n", + S.name, precision_of_nets, u2inch(C.contact.smd.dx), + precision_of_nets, u2inch(C.contact.smd.dy) ); + } + else { + printf("Unregistered Smd Size!\n"); + } + } + // if a pad/smd was located for this contact + // and a copper segment starts at this contact's x,y location, + // then the copper segment is included on this net. + if ( Pad_ID ) { // *** 17.08.2005 count from 1 *** + // Package element copper information + // circles + C.element.package.circles(A) { + if ( ( A.layer >= 1 ) && ( A.layer <= 16 ) ) { + printf("* %s has metal circles or isolation circles\n",C.element.name); + } + } + // polygons + C.element.package.polygons(P) { + if ( ( P.layer >= 1 ) && ( P.layer <= 16 ) ) { + printf("* %s has metal polygons\n",C.element.name); + } + } + // rectangles + C.element.package.rectangles(R) { + if ( ( R.layer >= 1 ) && ( R.layer <= 16 ) ) { + printf("* %s has metal rectangles\n",C.element.name); + } + } + // Find any wires that connect to this pin/pad that are internal to the package + // 1. build a table of all wires on the accepted layer + int AnyPackageWiresCount = 0; + int Wx1[], Wy1[], Wx2[], Wy2[], Wwid[], Wusedflag[], + Wcurve[], Warcx1[], Warcx2[], Warcxc[], Warcy1[], Warcy2[], Warcyc[], Warcradius[], + Wlayer ; + C.element.package.wires(W) { + // find all wires on the correct layer. + if ( ( W.layer >= TLaylimit ) && ( W.layer <= Blaylimit ) ) { + Wx1[AnyPackageWiresCount] = W.x1; + Wy1[AnyPackageWiresCount] = W.y1; + Wx2[AnyPackageWiresCount] = W.x2; + Wy2[AnyPackageWiresCount] = W.y2; + Wwid[AnyPackageWiresCount] = W.width; + Wcurve[AnyPackageWiresCount] = W.curve; + if (W.curve) { // 21.04.2005 alf@cadsoft.de + Warcx1[AnyPackageWiresCount] = W.arc.x1; + Warcx2[AnyPackageWiresCount] = W.arc.x2; + Warcxc[AnyPackageWiresCount] = W.arc.xc; + Warcy1[AnyPackageWiresCount] = W.arc.y1; + Warcy2[AnyPackageWiresCount] = W.arc.y2; + Warcyc[AnyPackageWiresCount] = W.arc.yc; + Warcradius[AnyPackageWiresCount] = W.arc.radius; + } + Wusedflag[AnyPackageWiresCount] = no; + TLaylimit = W.layer; // fix layer to first found layer on an accepted first layer + Blaylimit = W.layer; // fix layer to first found layer on an accepted first layer + Wlayer = W.layer; // fix the layer + AnyPackageWiresCount++; // count one segment + } + } + // 2. search for physically connected copper segments, even if out of order + if ( AnyPackageWiresCount != 0 ) { + for ( int woi = 0; woi < AnyPackageWiresCount; woi++ ) { + if ( Wusedflag[woi] == no ) { + // check either end of the segment + if ( ( Wx1[woi] == Xpad ) && ( Wy1[woi] == Ypad ) ) { + Xpad = Wx2[woi]; // remember the end of this segment + Ypad = Wy2[woi]; // which must be the start of the next segment + Wusedflag[woi] = yes; + woi = 0; // start searching list from the beginning again + } + else if ( ( Wx2[woi] == Xpad ) && ( Wy2[woi] == Ypad ) ) { + Xpad = Wx1[woi]; // remember the end of this segment + Ypad = Wy1[woi]; // which must be the start of the next segment + Wusedflag[woi] = yes; + woi = 0; // start searching list from the beginning again + } + } + } + } + // 3. write out all segments attached to the contact + if ( AnyPackageWiresCount != 0 ) { + for ( int woi = 0; woi < AnyPackageWiresCount; woi++ ) { + if ( Wusedflag[woi] == yes ) { + // write the segment + if ( Wlayer >= 1 && Wlayer <= 16 ) { + if (Wcurve[woi]) { + printf("(PERIMETER_ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f W=%5.*f L=%s) Arcs: Board Outline Arc is CCW\n", + precision_of_nets,u2inch(Warcx1[woi]), precision_of_nets,u2inch(Warcy1[woi]), + precision_of_nets,u2inch(Warcx2[woi]), precision_of_nets,u2inch(Warcy2[woi]), + precision_of_nets,u2inch(Warcxc[woi]), precision_of_nets,u2inch(Warcyc[woi]), + precision_of_nets,u2inch(Warcradius[woi]), + precision_of_nets,u2inch(Wwid[woi]), + LayerNames[Wlayer] ); + } + else { + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) %s Internal Package Wire\n", + precision_of_nets,u2inch(Wx1[woi]), + precision_of_nets,u2inch(Wy1[woi]), + precision_of_nets,u2inch(Wx2[woi]), + precision_of_nets,u2inch(Wy2[woi]), + precision_of_nets,u2inch(Wwid[woi]), + LayerNames[Wlayer], + S.name); + } + } + // write any contact pins or smds + int OtherPad_ID; + C.element.package.contacts(Q) { + // don't write out contacts at the original element contact location + if ( ( Q.x != EpadX ) || ( Q.y != EpadY ) ) { + // check if this element contact is at either end of the wire segment + if ( ( ( Q.x == Wx1[woi] ) && ( Q.y == Wy1[woi] ) ) || + ( ( Q.x == Wx2[woi] ) && ( Q.y == Wy2[woi] ) ) ) { + // if a through hole pad + if (Q.pad) { + // find a pad on any layer + OtherPad_ID = Find_A_Pad( ISAPAD, 0, + Q.pad.shape[1], Q.pad.shape[2], Q.pad.shape[16], + Q.pad.angle, + Q.pad.diameter[1], Q.pad.diameter[2], Q.pad.diameter[16], + Q.pad.elongation, + Q.pad.drill ); + if ( OtherPad_ID ) { // *** 17.08.2005 count from 1 *** + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=THR%03d", + precision_of_nets, u2inch(Q.pad.x), precision_of_nets, u2inch(Q.pad.y), + C.element.name, Q.pad.name, OtherPad_ID); + SayUPinFunction( C.element.name, Q.pad.name ); + printf(") %s, Internal Package Pad Diameter: %5.*f Drill: %5.*f\n", + S.name, precision_of_nets,u2inch(Q.pad.diameter[16]), + precision_of_nets, u2inch(Q.pad.drill) ); + InsertAssocatedPin( C.element.name, Q.pad.name ); + } + else { + printf("Unregistered Internal Package Pin Size!\n"); + } + } + // if a smd pad + if (Q.smd) { + // smd pad must be on this layer + if ( Q.smd.layer == Wlayer ) { + // find a smd that matches + OtherPad_ID = Find_A_Pad( ISASMD, Q.smd.layer, + SmdRoundness(Q.smd.roundness), 0, 0, + Q.smd.angle, + Q.smd.dx, 0, 0, + Q.smd.dy, + 0 ); + if ( OtherPad_ID ) { // *** 17.08.2005 count from 1 *** + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=SMD%03d", + precision_of_nets,u2inch(Q.smd.x), precision_of_nets,u2inch(Q.smd.y), + C.element.name, Q.smd.name, OtherPad_ID); + SayUPinFunction( C.element.name, Q.smd.name ); + printf(") %s, Smd Dx: %5.*f Dy: %5.*f\n", + S.name,precision_of_nets,u2inch(Q.smd.dx), + precision_of_nets,u2inch(Q.smd.dy) ); + InsertAssocatedPin( C.element.name, Q.smd.name ); + } + else { + printf("Unregistered Smd Size!\n"); + } + } + } + } + } + } + } + } + } + } + } + S.vias(V) { + Pad_ID = Find_A_Pad( ISAPAD, 18, + V.shape[1], V.shape[2], V.shape[16], + V.end, + V.diameter[1], V.diameter[2], V.diameter[16], + V.start, + V.drill ); + + if ( Pad_ID ) { // 17.08.2005 count from 1 *** + printf("(VIA X=%5.*f Y=%5.*f P=THR%03d) %s\n", + precision_of_nets,u2inch(V.x), precision_of_nets, u2inch(V.y), + Pad_ID, S.name); // ** correct number while listing count from 1 + // ** 17.08.2005 alf@cadsoft.de *** + } + else { + printf("Unregistered Via Size!\n"); + } + } + S.wires(W) { + if (W.layer >= 1 && W.layer <= 16 ) { + if (W.curve) { + printf("(ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f W=%5.*f L=%s)\n", + precision_of_nets,u2inch(W.arc.x1), precision_of_nets,u2inch(W.arc.y1), + precision_of_nets,u2inch(W.arc.x2), precision_of_nets,u2inch(W.arc.y2), + precision_of_nets,u2inch(W.arc.xc), precision_of_nets,u2inch(W.arc.yc), + precision_of_nets,u2inch(W.arc.radius), + precision_of_nets,u2inch(W.width), + LayerNames[W.layer] ); + } + else { + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) %s\n", + precision_of_nets,u2inch(W.x1), precision_of_nets,u2inch(W.y1), + precision_of_nets,u2inch(W.x2), precision_of_nets,u2inch(W.y2), + precision_of_nets,u2inch(W.width), LayerNames[W.layer], S.name); + } + } + } + S.polygons(P) { + printf("* POLYGONS NOT Allowed in HYP as of BoardSimm 2.2 Build 70. "); + printf("Hopefully someday they will!\n"); + printf("* I=Isolate S=Spacing W=Width O=Orphins_On/Off P=Pour_SOLID/HATCH T=Thermals_On/Off L=Layer) Polygon Format\n"); + printf("*(PLG I=%5.*f S=%5.*f W=%5.*f O=%s P=%s T=%s L=%s) Polygon %s Data\n", + precision_of_nets,u2inch(P.isolate),precision_of_nets,u2inch(P.spacing), + precision_of_nets,u2inch(P.width),P.orphans ? "On" : "Off", + P.pour == POLYGON_POUR_SOLID ? "SOLID" : "HATCH", + P.thermals ? "On" : "Off",LayerNames[P.layer],S.name); + P.wires(W) { + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Polygon %s\n", + precision_of_nets,u2inch(W.x1),precision_of_nets,u2inch(W.y1), + precision_of_nets,u2inch(W.x2),precision_of_nets,u2inch(W.y2), + precision_of_nets,u2inch(W.width),LayerNames[W.layer],S.name); + } + } + printf("}\n\n"); + } + + // Unconnected Component Pins are on their own special net "HYP$xPy" + // where x=element name and y=pin name + + // handle all unconnected package pins + B.elements(E) { + E.package.contacts(C) { + if ( strlen(C.signal) == 0 ) { + if (C.pad) { + Pad_ID = Find_A_Pad( ISAPAD, 0, + C.pad.shape[1], C.pad.shape[2], C.pad.shape[16], + C.pad.angle, + C.pad.diameter[1], C.pad.diameter[2], C.pad.diameter[16], + C.pad.elongation, + C.pad.drill ); + if ( Pad_ID ) { // *** 17.08.2005 count from 1 *** + if ( FindAssocatedPin( E.name, C.pad.name ) == 0 ) { + Xpad = C.pad.x; + Ypad = C.pad.y; + printf("{NET=HYP$%s.%s\n",E.name,C.pad.name); + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=THR%03d", + precision_of_nets,u2inch(Xpad), precision_of_nets,u2inch(Ypad), + E.name, C.pad.name, Pad_ID); + printf(") Pad Diameter: %5.*f Drill: %5.*f\n", + precision_of_nets, u2inch(C.pad.diameter[16]), + precision_of_nets, u2inch(C.pad.drill) ); + printf("}\n\n"); + } + else { + printf("* PIN %s.%s is part of an internal package net.\n",E.name,C.pad.name); + } + } + else { + printf("* Unregistered Pin Size!\n"); + } + } + if (C.smd) { + Pad_ID = Find_A_Pad( ISASMD, C.smd.layer, + SmdRoundness(C.smd.roundness), 0, 0, + C.smd.angle, + C.smd.dx, 0, 0, + C.smd.dy, + 0 ); + if ( Pad_ID ) { // *** 17.08.2005 count from 1 *** + if ( FindAssocatedPin( E.name, C.smd.name ) == 0 ) { + Xpad = C.smd.x; + Ypad = C.smd.y; + printf("{NET=HYP$%s.%s\n",E.name,C.smd.name); + printf("(PIN X=%5.*f Y=%5.*f R=%s.%s P=SMD%03d", + precision_of_nets,u2inch(Xpad), precision_of_nets,u2inch(Ypad), + E.name, C.smd.name, Pad_ID); + printf(") Smd Dx: %5.*f Dy: %5.*f\n", + precision_of_nets, u2inch(C.smd.dx), + precision_of_nets, u2inch(C.smd.dy) ); + printf("}\n\n"); + } + else { + printf("* PIN %s.%s is part of an internal package net.\n",E.name,C.smd.name); + } + } + else { + printf("* Unregistered Smd Size!\n"); + } + } + } + } + } + + // NETS that aren't signals but are copper are exported as a net named "N$ComNet" + // Search for any common nets + int AnyNets = no; + // B.arcs(A) if ( ( A.layer >= 1 ) && ( A.layer <= 16 ) ) AnyNets = yes; + B.circles(C) if ( ( C.layer >= 1 ) && ( C.layer <= 16 ) ) AnyNets = yes; + B.rectangles(R) if ( ( R.layer >= 1 ) && ( R.layer <= 16 ) ) AnyNets = yes; + B.wires(W) if ( ( W.layer >= 1 ) && ( W.layer <= 16 ) ) AnyNets = yes; + + if ( AnyNets == yes ) { + printf("{NET=N$ComNet\n"); + + // CIRCLES + B.circles(C) { + if ( ( C.layer >= 1 ) && ( C.layer <= 16 ) ) { + printf("(ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f W=%5.*f L=%s) Circle\n", + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y+C.radius), + precision_of_nets,u2inch(C.x),precision_of_nets,u2inch(C.y), + precision_of_nets,u2inch(C.radius),precision_of_nets,u2inch(C.width), + LayerNames[C.layer]); + } + } + + // RECTANGLES + B.rectangles(R) { + if ( ( R.layer >= 1 ) && ( R.layer <= 16 ) ) { + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Rectangle Segment Bottom\n", + precision_of_nets,u2inch(R.x1),precision_of_nets,u2inch(R.y1), + precision_of_nets,u2inch(R.x2), precision_of_nets,u2inch(R.y1), + precision_of_nets,RectOutlineWireWidth,LayerNames[R.layer]); + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Rectangle Segment Right\n", + precision_of_nets,u2inch(R.x2),precision_of_nets,u2inch(R.y1), + precision_of_nets,u2inch(R.x2),precision_of_nets,u2inch(R.y2), + precision_of_nets,RectOutlineWireWidth,LayerNames[R.layer]); + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Rectangle Segment Top\n", + precision_of_nets,u2inch(R.x2),precision_of_nets,u2inch(R.y2), + precision_of_nets,u2inch(R.x1),precision_of_nets,u2inch(R.y2), + precision_of_nets,RectOutlineWireWidth,LayerNames[R.layer]); + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Rectangle Segment Left\n", + precision_of_nets,u2inch(R.x1),precision_of_nets,u2inch(R.y2), + precision_of_nets,u2inch(R.x1),precision_of_nets,u2inch(R.y1), + precision_of_nets,RectOutlineWireWidth,LayerNames[R.layer]); + } + } + + // WIRES + B.wires(W) { + if ( ( W.layer >= 1 ) && ( W.layer <= 16 ) ) { + if (W.curve) { + // ARCS + printf("(ARC X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f XC=%5.*f YC=%5.*f R=%5.*f W=%5.*f L=%s) Arc is CCW\n", + precision_of_nets,u2inch(W.arc.x2),precision_of_nets,u2inch(W.arc.y2), + precision_of_nets,u2inch(W.arc.x1),precision_of_nets,u2inch(W.arc.y1), + precision_of_nets,u2inch(W.arc.xc),precision_of_nets,u2inch(W.arc.yc), + precision_of_nets,u2inch(W.arc.radius),precision_of_nets,u2inch(W.width), + LayerNames[W.layer]); + } + else { + printf("(SEG X1=%5.*f Y1=%5.*f X2=%5.*f Y2=%5.*f W=%5.*f L=%s) Wire Segment\n", + precision_of_nets,u2inch(W.x1),precision_of_nets,u2inch(W.y1), + precision_of_nets,u2inch(W.x2),precision_of_nets,u2inch(W.y2), + precision_of_nets,u2inch(W.width),LayerNames[W.layer]); + } + } + } + printf("}\n\n"); + } // end of copper as common net + + // END OF RUN + printheader("End of data"); + printf("{END}\n\n"); + printf("{KEY=028-015E-4E5D}\n\n"); + } // end of output() {} + +} // end of board() {} + + diff --git a/eagle-5.7.0/ulp/import-bmp-c16.bmp b/eagle-5.7.0/ulp/import-bmp-c16.bmp new file mode 100644 index 0000000..aff8eaf Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c16.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c2.bmp b/eagle-5.7.0/ulp/import-bmp-c2.bmp new file mode 100644 index 0000000..9875cd4 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c2.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-0.bmp b/eagle-5.7.0/ulp/import-bmp-c256-0.bmp new file mode 100644 index 0000000..dd13927 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-0.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-1.bmp b/eagle-5.7.0/ulp/import-bmp-c256-1.bmp new file mode 100644 index 0000000..0d1b1fe Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-1.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-2.bmp b/eagle-5.7.0/ulp/import-bmp-c256-2.bmp new file mode 100644 index 0000000..a57d65f Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-2.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-3.bmp b/eagle-5.7.0/ulp/import-bmp-c256-3.bmp new file mode 100644 index 0000000..73673ee Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-3.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-4.bmp b/eagle-5.7.0/ulp/import-bmp-c256-4.bmp new file mode 100644 index 0000000..093a1bf Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-4.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-5.bmp b/eagle-5.7.0/ulp/import-bmp-c256-5.bmp new file mode 100644 index 0000000..02ae599 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-5.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-6.bmp b/eagle-5.7.0/ulp/import-bmp-c256-6.bmp new file mode 100644 index 0000000..93efffb Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-6.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256-7.bmp b/eagle-5.7.0/ulp/import-bmp-c256-7.bmp new file mode 100644 index 0000000..8865e51 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256-7.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-c256.bmp b/eagle-5.7.0/ulp/import-bmp-c256.bmp new file mode 100644 index 0000000..9088534 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-c256.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-dpi.bmp b/eagle-5.7.0/ulp/import-bmp-dpi.bmp new file mode 100644 index 0000000..e4cf8be Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-dpi.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-ratio.bmp b/eagle-5.7.0/ulp/import-bmp-ratio.bmp new file mode 100644 index 0000000..106aee5 Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-ratio.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp-scale.bmp b/eagle-5.7.0/ulp/import-bmp-scale.bmp new file mode 100644 index 0000000..35271ea Binary files /dev/null and b/eagle-5.7.0/ulp/import-bmp-scale.bmp differ diff --git a/eagle-5.7.0/ulp/import-bmp.ulp b/eagle-5.7.0/ulp/import-bmp.ulp new file mode 100644 index 0000000..8b172ce --- /dev/null +++ b/eagle-5.7.0/ulp/import-bmp.ulp @@ -0,0 +1,763 @@ +#usage "en:Import a BitMaP image into an EAGLE drawing" + "

" + "This ULP generates a SCRIPT file that draws rectangles of successional pixels with identical color.
" + "These rectangles serve as templates in order to draw the image with EAGLE commands like POLYGON, WIRE, CIRCLE, TEXT.
" + "Please note: If the generated rectangles are smaller than the half of the resolution of the output device, " + "(depending on the scale factor: screen: pixel, printer: diameter of the laser beam or ink jet dropplet), it is " + "not possible to display the result. Therefore use the EAGLE commands mentioned above to reduce the number of " + "elements (rectangles). Each element has to be drawn and calculated by the display device driver. The more elements " + "the slower the display will be.
" + "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." + "

" + "Author: support@cadsoft.de" + , + "de:Importiert ein BitMaP-Bild als Vorlage in eine EAGLE-Zeichnung" + "

" + "Das ULP erzeugt eine SCRIPT-Datei, in der zusammenhängende gleichfarbige Pixel als Rechteck generiert werden.
" + "Diese Rechtecke dienen als Vorlage, um das Bild mit EAGLE-Werkzeugen wie POLYGON, WIRE, CIRLE, TEXT zu definieren.
" + "Bedenken Sie: Wenn die erzeugten Rechtecke kleiner sind als die Hälfte der Auflösung des Ausgabegerätes" + "(je nach Skalierungsfaktor: Bildschirm-Pixel, Drucker-Laserstrahlbreite oder Düsendurchmesser), kann das Ergebnis " + "nicht dargestellt werden. Definieren Sie deshalb feine Strukturen mit den oben erwähnten Werkzeugen, um die " + "Anzahl der Elemente (Rechtecke) zu reduzieren. Jedes Element muss vom Grafikkartentreiber gezeichnet und " + "berechnet werden. Bei sehr vielen Elementen wird die Anzeige entsprechend verlangsamt.
" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + +// 1.0.3 - 2006.05.11 *** corrected for 4 bit (16 colors) *** alf@cadsoft.de +// only the first 4 of 16 colors was generated +// set cselmax to maximal included colors of BitMaP +// +// 1.0.4 - 2007.03.30 --- Coral Draw sets wrong Byte Address Range, check length with address range. +// + +string Version = "1.0.4"; + +string script_path; +string bmpcolor[]; +string bmps[]; + +string run_info = " "; +string fileName; +int nBytes = 0; // count bytes of file (fileName) +int ColorBits = 0; // used bits for color +int AdrStart, AdrEnd = 0; // Start & End of BITMAP-Data +int length = 0; // length of bmp-Data +int Byte4Group = 0; // bmp-Data organized as 4-byte groups +int Layer = 200; // 1st used layer +real xScale = 1; // scale x +real yScale = 1; // scale y +int X = 0; // count pixels x +int Y = 0; // count pixels y +string xy = ""; +int colorscan = 0; // flag for color scanning +int cselmax = 32; // max 32 colors selectable +int Result = 0; + +real Offset = .5; // offset Wire width + +int mBit[]; // bit line for operating + +string grid[] = { "INCH", // grid units + "MIL", + "MM", + "MIC" + }; +int unit = 1; // default unit = mil +int scaled = 1; // flag for DPI Scale Ratio +real vmin[] = { 0.00001, 0.001, 0.0001, 0.1 }; +real vmax[] = { 30.0, 3000.0, 800.0, 800000.0 } ; + +string Grid = grid[unit]; // default grid + + // get parameter PDI, Scale, Aspect Ratio, mic, mm, mil INCH ... + string menuedlg[] = { + "Dots Per INCH", + "Scale factor for a pixel", + "Aspect/Ratio m" + } ; + string menuval0[] = { + "&Value between 1 and 10000 dots", + "&Value between 0.01 and 30.0 Inch", + "&Value between 0.01 and 30.0 Inch" + }; + + string menuval1[] = { + "&Value between 1 and 10000 dots", + "&Value between 0.001 and 3000.0 mil", + "&Value between 0.001 and 3000.0 mil" + }; + string menuval2[] = { + "&Value between 1 and 10000 dots", + "&Value between 0.0001 and 800.0 mm", + "&Value between 0.0001 and 800.0 mm" + }; + string menuval3[] = { + "&Value between 1 and 10000 dots", + "&Value between 0.1 and 800000.0 micron", + "&Value between 0.1 and 800000.0 micron" + }; +string menulbl = menuedlg[1]; +string menuinfo = menuval1[1]; +string ratiologo ; + + +// table of used colors in BitMaP +int colorUsed[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + +int colorSelect[] ; +char c[]; // the file as Byte-Array + +// set / clear all colorUsed flags +void setall(int set) { + for(int n = 0; n < pow(2, ColorBits); n++) { + colorUsed[n] = set; + } + return; +} + +void ScriptLine(int Line) { + // *** corrected for 4 bit (16 colors) *** 2006.05.11 alf@cadsoft.de + for(int cs = 0; cs < cselmax; cs++) { // extract max 32 colors + sprintf(run_info, "%d Line %d Color #%d ", Y, Line, cs); + dlgRedisplay(); + if(colorSelect[cs] > -1) { // -1 color not used + int lineColor = colorSelect[cs]; // extraction color + int line = 0; + printf("change layer %d;\n", Layer + cs); + for(int z = 0; z < X; z++) { + if(mBit[z] == lineColor) { // if color used + if(line == 0) { // start of line in script (rectangle) + printf("RECT (%.5f ", (z - Offset) * xScale); + printf("%.5f)", (Line - Offset) * yScale); + line = 1; + } + } + else { + if(line == 1) { + printf( "(%.5f ", (z - Offset) * xScale); + // end of line in script (rectangle) + printf( "%.5f);\n", (Line + Offset) * yScale); + line = 0; + } + } + } + if(line == 1) { + printf( "(%.5f ", (z - Offset) * xScale); + // end of line in script(rectangle) + printf( "%.5f);\n", (Line + Offset) * yScale); + line = 0; + } + } + } + return; +} + +// Generate Script from BitMaP +void GenScript(void) { + int xByte = 4 * Byte4Group; // organised by groups of 4 bytes + int bmpBits; + + for(int yRead = 0; yRead < Y; yRead++) { // counter for lines / Y + for(int xRead = 0; xRead < xByte; xRead ++) { + bmpBits = c[AdrStart + yRead * xByte + xRead]; + + switch (ColorBits) { + case 1 : for(int bitcnt = 7; bitcnt > -1; bitcnt--) { + mBit[(xRead * 8) + (7 - bitcnt)] = bmpBits; + mBit[(xRead * 8) + (7 - bitcnt)] >>= bitcnt; + mBit[(xRead * 8) + (7 - bitcnt)] &= 0X1; + } + break; + + case 4 : mBit[xRead * 2 ] = bmpBits; + mBit[xRead * 2 + 1] = bmpBits; + mBit[xRead * 2 ] >>= 4; + mBit[xRead * 2 + 1] &= 0x0f; + break; + + case 8 : mBit[xRead] = bmpBits; + break; + } + } + + if(colorscan) { + for(int z = 0; z < X; z++) { + colorUsed[mBit[z]]++; // set flag for used color + } + } + else { + ScriptLine(yRead); // generate Eagle Script line + } + } + return; +} + +// bmp file info +string bmpDaten(void) { // diagnostics + string st = ""; + string cmd = ""; + printf( "BitMaP Start \t = %d\n", AdrStart); + cmd = st; + printf( "BitMaP End \t = %d\n", AdrEnd); + cmd += st; + printf( "BitMaP length \t = %d\n", length); + cmd += st; + printf( "high / pixel - Y \t = %d\n", Y); + cmd += st; + printf( "wide / pixel - X \t = %d\n", X); + cmd += st; + printf( "4-Byte Group(s) \t = %d\n", Byte4Group); + cmd += st; + printf( "Bits / Color \t = %d (Colors %.0f)\n", ColorBits, pow(2, ColorBits)); + cmd += st; + printf( "File length \t = %d\n", nBytes); + cmd += st; + return cmd; +} + +// Select menu for 2 color BitMaP +void Cselect2(void) { + Result = dlgDialog("Select used colors in " + fileName) { + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(3); + for(int colum = 0 ; colum < 2; colum++) { + dlgCheckBox("", colorUsed[colum]); + } + dlgSpacing(6); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(3); + dlgStretch(0); + dlgLabel(""); + dlgStretch(1); // stretch bottom + } + dlgStretch(0); + dlgSpacing(20); + dlgLabel(" Select up to 2 colors "); + dlgStretch(0); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgPushButton("&Set all") setall(1); + dlgPushButton("&Clear all") setall(0); + } + dlgStretch(1); + }; + if (Result == 0) exit (0); + return; +} + +// Select menu for 16 color BitMaP +void Cselect16(void) { + Result = dlgDialog("Select used colors" + fileName) { + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(3); + for(int colum = 0 ; colum < 16; colum++) { + dlgCheckBox("", colorUsed[colum]); + } + dlgSpacing(6); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(3); + dlgStretch(0); + dlgLabel(""); + dlgStretch(1); // stretch bottom + } + dlgStretch(0); + dlgSpacing(20); + dlgLabel(" Select up to 16 colors "); + dlgStretch(0); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgPushButton("&set all") { setall(1); dlgRedisplay();} + dlgPushButton("&clear all") { setall(0); dlgRedisplay();} + } + dlgStretch(1); + }; + if (Result == 0) exit (0); + return; +} + +// Select menu for 256 color BitMaP +void Cselect256(void) { +// dlgMessageBox("please be patient\nif you have a slow computer!", "OK"); + + Result = dlgDialog("Select used colors " + fileName) { + dlgVBoxLayout { + // ********* 550 DO NOT CHANGE THIS VALUE ********* + dlgHBoxLayout dlgSpacing(550); + // ********* 550 DO NOT CHANGE THIS VALUE ********* + for(int row = 0 ; row < 8; row++) { + dlgHBoxLayout { + dlgVBoxLayout { + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgSpacing(3); + for(int colum = 0 ; colum < 32; colum++) { + dlgCheckBox("", colorUsed[row * 32 + colum]); + } + dlgSpacing(6); + dlgStretch(1); + } + dlgHBoxLayout { + dlgSpacing(3); + dlgStretch(0); + dlgLabel(bmps[row]); + dlgStretch(1); + } + } + dlgStretch(1); // stretch right + } + dlgStretch(1); // stretch bottom + } + dlgStretch(1); + } + dlgVBoxLayout { + dlgStretch(0); + dlgSpacing(20); + string hc; + sprintf( hc, " Select up to %d colors ", cselmax); + dlgLabel(hc); + dlgStretch(0); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(0); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + dlgPushButton("&set all") setall(1); + dlgStretch(0); + dlgPushButton("&clear all") setall(0); + dlgStretch(0); + } + dlgStretch(1); + } + dlgStretch(1); + }; + if (Result == 0) exit (0); + return; +} + +// select colors +int selectColors(void) { + switch (ColorBits) { + case 1 : cselmax = 2; // 2006.05.11 set max color for 2 colors + Cselect2(); + break; + case 4 : cselmax = 16; // 2006.05.11 set max color for 16 colors + Cselect16(); + break; + case 8 : Cselect256(); + break; + } + for(int n = 0; n < cselmax; n++) { + colorSelect[n] = -1; // reset selected colors + } + int cs; + for(int s = 0; s < 256; s++) { + if(colorUsed[s]) { + colorSelect[cs] = s; + cs++; + } + } + return cs; +} + +// select colors by scan array +void selectMenue() { + int cs; + do { + cs = selectColors(); + string hx; + if (cs > cselmax) { + sprintf( hx, "Do not use more than %d colors!", cselmax); + dlgMessageBox(hx, "OK"); + } + if (cs < 1) { + sprintf( hx, "No colors selected!"); + cs = 1; + if (dlgMessageBox(hx, "OK", "Cancel") != 0) break; + } + } while (cs > cselmax || cs == 0); + return; +} + +// header from Script, define Layer +void scriptheader(void) { + printf("# generated with %s %s\n", argv[0], Version); + printf("# from %s\n", fileName); + printf("Grid %s %.6f ON;\n", Grid, xScale); + + for(int cs = 0; cs < cselmax; cs++) { // max 32 color extract + if(colorSelect[cs] > -1) { + if(Layer + cs > 99){ // user defined layer + printf( "LAYER %d %dbmp;\n", Layer + cs, Layer + cs); + printf( "SET FILL_LAYER %d 10;\n", Layer + cs); + printf( "SET COLOR_LAYER %d %d;\n", Layer + cs, cs + 1); + } + } + } + printf( "CHANGE LAYER %d;\n", Layer); + printf("SET UNDO_LOG OFF;\n"); + return; +} + +// get flag for scan colors +int scan(void) { + if (ColorBits == 1) return 0; + return (dlgDialog(filename(argv[0])) { + string st; + sprintf(st, "%s:

is a %.0f color BitMaP : ist eine %.0f-Farben-BitMaP

", fileName, pow(2, ColorBits), pow(2, ColorBits)); + dlgHBoxLayout { + dlgStretch(0); + dlgVBoxLayout { + dlgGroup("Info") { + dlgLabel(st); + dlgSpacing(10); + dlgLabel(bmpcolor[ColorBits]); + } + dlgLabel(" ULP-Version " + Version); + dlgGroup("") { + dlgStretch(1); + dlgHBoxLayout { + dlgPushButton("+Scan used colors") dlgAccept(); + dlgStretch(1); + dlgPushButton("-No scan") dlgReject(); + dlgStretch(1); + dlgPushButton("Cancel") { dlgReject(); exit(0); } + } + dlgStretch(0); + } + dlgStretch(1); + } + dlgStretch(1); + } + dlgStretch(1); + } ); +} + +void colors24(void) { + string st = "bmp file contains more than 256 colors, reduce colors before use.\n\n" + + "Die benutzte Anzahl der Farben in der bmp-Datei ist groesser 256.\n" + + "Verringern Sie zuerst die Anzahl der Farben in der bmp-Datei.\n\n"; + dlgMessageBox(st, "&OK"); + return; +} + +void menuchange(void) { + menulbl = menuedlg[scaled]; + switch (scaled) { + case 0 : ratiologo = ""; + break; + case 1 : ratiologo = ""; + break; + case 2 : ratiologo = ""; + break; + } + + switch (unit) { + case 0 : menuinfo = menuval0[scaled]; + break; + case 1 : menuinfo = menuval1[scaled]; + break; + case 2 : menuinfo = menuval2[scaled]; + break; + case 3 : menuinfo = menuval3[scaled]; + break; + } + return ; +} + +//--------------------------------- +void set_scale(void) { + switch(scaled) { + case 0 : Grid = grid[0]; + yScale = 1 / xScale; // Dots Per Inch + xScale = yScale; + break; + + case 1 : Grid = Grid = grid[unit]; + yScale = xScale; + break; + + case 2 : Grid = Grid = grid[unit]; + yScale = xScale / X; // Aspect Ratio = Width / Pixel X + xScale = yScale; + break; + } + return; +} + + +void imp_bmp(void) { + colorscan = 0; // reset scanning mode + menuinfo = "Dot scale"; + scriptheader(); + GenScript(); // generate script string + + printf("SET UNDO_LOG ON;\n"); + printf("WINDOW FIT;\n"); + printf( "Change Size %.3f;\n", yScale * 2); + printf("CHANGE FONT VECTOR;\n"); + printf( "TEXT '" + fileName + "' (0 %.3f);\n", -5 * yScale ); + return; +} + + +void runscript(void) { + string script; + int s = fileread(script, script_path + "bmp.scr"); + Result = dlgDialog("Accept Script?") { + dlgHBoxLayout dlgSpacing(300); + dlgHBoxLayout { + dlgVBoxLayout dlgSpacing(300); + dlgTextEdit(script); + } + dlgLabel(" ULP-Version " + Version); + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+Run script") dlgAccept(); + dlgStretch(1); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(0); + } + }; + + if (Result == 1) exit ("script '" + script_path + "bmp.scr'"); + else exit (0); +} + + +void showbmp() { + if ( X < 1000 && Y < 1000) { + dlgMessageBox("File: '" + fileName + "'
", "OK"); + } + else dlgMessageBox("The BMP-File ist to big to print complete on screen!", "OK"); + return; +} + + +if (schematic) { + schematic(S) { + script_path = filedir(S.name); + } +} +if (board) { + board(B) { + script_path = filedir(B.name); + } +} +if (library) { + library(L) { + script_path = filedir(L.name); + } +} + + +int check_max(void) { + if (X * xScale > vmax[unit] || Y * yScale > vmax[unit]) { + string e; + sprintf(e, "The Value of X (%.4f) or Y (%.4f) is grater then EAGLE maximum coordinate range %.4f %s", X * xScale, Y * yScale, vmax[unit], grid[unit]); + dlgMessageBox(e, "OK"); + return 0; + } + return 1; +} + +// ***************** main **************** +dlgMessageBox(usage, "OK"); + +void main(void) { + ratiologo = ""; + + bmpcolor[1] = ""; + bmpcolor[4] = ""; + bmpcolor[8] = ""; + + bmps[0] = ""; + bmps[1] = ""; + bmps[2] = ""; + bmps[3] = "", + bmps[4] = ""; + bmps[5] = ""; + bmps[6] = ""; + bmps[7] = ""; + + fileName = dlgFileOpen("Select a bmp file", "", "*.bmp"); + if (fileName == "") exit (0); + run_info = "Import File : " + filename(fileName); + nBytes = fileread(c, fileName); // read file in array + + // up to 31 bytes - not all used + if(c[0] != 'B') { + dlgMessageBox(fileName + ":\nis not a bmp file.\n\nist keine bmp-Datei.", "OK"); + exit(0); + } + if(c[1] != 'M') { + dlgMessageBox(fileName + ":\nis not a bmp file.\n\nist keine bmp-Datei.", "OK"); + exit(0); + } + if(c[21] > 0) { + dlgMessageBox(fileName + ":\nToo many pixels in x direction\n" + + "\nAnzahl der Pixel in X zu gross\n", "OK"); + exit (0); + } + if(c[25] > 0) { + dlgMessageBox(fileName + ":\nToo many pixels y direction\n" + + "\nAnzahl der Pixel in Y zu gross\n", "OK"); + exit (0); + } + // case 6 TO 9, 14 TO 17 not used + + ColorBits = c[28]; // counter of ColorBits + + if(ColorBits > 8) { + colors24(); // to many colors, break + exit(0); + } + + AdrEnd = c[2] + c[3] * 256 + c[4] * 256 * 256 + c[5] * 256 * 256 * 256; + AdrStart = c[10]+ c[11] * 256 + c[12] * 256 * 256 + c[13] * 256 * 256 * 256; + X = c[18] + c[19] * 256 + c[20] * 65536 + c[21] * 256 * 256 * 256; + Y = c[22] + c[23] * 256 + c[24] * 65536 + c[25] * 256 * 256 * 256; + sprintf(xy, " X = %5d Pixel\n Y = %5d Pixel", X, Y); + + length = AdrEnd - AdrStart; // BitMaP length + Byte4Group = length / Y / 4; + + /*** 2007.03.30 Coral-Draw sets wrong address range in Byte upper Byte 18 (22 = $14) ***/ + if (X > length || Y > length) { + dlgMessageBox("!BitMaP Format Error in Adress-Range (Byte 18+19+20 and 22+23+24) from:\n" + fileName + + "\n\nCheck this bytes or load the BMP-File in Windows Paint-Brush and save it.", + "OK"); + exit(-1); + } + + if(scan()) { // first scan used colors + colorscan = 1; + GenScript(); + } + + selectMenue(); + + //--------------------------------- + int d = 1; + while(d) { + dlgDialog("Info "+ fileName) { + dlgLabel(" ULP-Version " + Version); + dlgHBoxLayout { + dlgVBoxLayout { + dlgGroup("File data") { + dlgLabel(xy, 1); + } + dlgLabel(ratiologo, 1); + dlgStretch(1); + } + dlgVBoxLayout { + dlgGroup("Format") { + dlgRadioButton("&DPI", scaled) { unit = 0; menuchange(); } + dlgRadioButton("&Scaled", scaled) {menuchange(); } + dlgRadioButton("&Aspect/Ratio m ", scaled) { menuchange(); } + } + dlgGroup("Unit") { + dlgRadioButton("&Inch", unit) { menuchange(); dlgRedisplay();} + dlgRadioButton("Mi&l", unit) { if ( scaled == 0) scaled = 1; menuchange(); } + dlgRadioButton("&MM", unit) { if ( scaled == 0) scaled = 1; menuchange(); } + dlgRadioButton("Mi&cron", unit) { if ( scaled == 0) scaled = 1; menuchange(); } + } + dlgPushButton("S&elected colors") selectMenue(); + dlgStretch(1); + } + } + dlgHBoxLayout { + dlgVBoxLayout { + dlgLabel(menulbl, 1); + dlgLabel(menuinfo, 1); + dlgHBoxLayout { + dlgRealEdit(xScale, vmin[unit], vmax[unit]); + dlgSpacing(100); + } + dlgSpacing(10); + dlgLabel("Choose start layer for &1st selected color"); + dlgHBoxLayout { + dlgSpinBox(Layer, 1, 255); + dlgSpacing(100); + } + } + dlgStretch(1); + } + dlgStretch(1); + dlgLabel(run_info, 1); + dlgHBoxLayout { + dlgPushButton("+OK") { + set_scale(); + if (check_max()) { // check of maximum EAGLE coodinates + dlgAccept(); + output(script_path + "bmp.scr", "wtD") { + d = 0; + imp_bmp(); + } + runscript(); + } + } + dlgStretch(1); + dlgPushButton("-Cancel") exit(0); + dlgPushButton("show &BitMaP") showbmp(); + } + }; + } +} + diff --git a/eagle-5.7.0/ulp/import-ultiboard-ddf.ulp b/eagle-5.7.0/ulp/import-ultiboard-ddf.ulp new file mode 100644 index 0000000..9a93e9d --- /dev/null +++ b/eagle-5.7.0/ulp/import-ultiboard-ddf.ulp @@ -0,0 +1,1502 @@ +#usage "Import ULTIBOARD PCB Design Data File format (DDF)\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string InfoUS = + "Confirm the message:

\n" + + "connect Signals

\n" + + " S$nn

\n" + + " S$nn

\n" + + " with OK.

" + + "


" + + "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 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

" + + "


" + + "ULTIBOARD Version 5, Revision 50

" + + " 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

" + + "


" + + "ULTIBOARD is a registered trademark of Electronics Workbench"; + +string InfoDE = + "Bestätigen sie die Meldung:

\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.

" + + "


" + + "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.

\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.

" + + "


" + + "Die Warnung: No forward-/backannotation will be performed!

" + + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* German description: + "Dieses ULP berechnet alle Signallaengen eines Layouts

" + "(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

\n" + "run length [name | name* | *name | *name*]
" + "run length name [name name ...]

" + "EXAMPLE:
" + "run length +D -D
" + "run length d0 d2 d7 A*
" + "run length d*

" + "Wires in layers 1 to 16 will be added, airwires will be shown separately.
" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +#require 4.1106 + +// ** German description: ** +string hilfe = "Dieses ULP berechnet die Signallängen von Leiterbahnen eines Layouts.

" + + "run length [name | name* | *name | *name*]
" + + "run length name [name name ...]

" + + "Beispiel:
" + + "run length +D -D
" + + "run length d0 d2 d7 d6 A*
" + + "run length d*

" + + "Die Wire in den Layern 1 bis 16 werden addiert, die Airwire werden gesondert angegeben.
" + + "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.

" + + "Author: support@cadsoft.de" + ""; + +// 2008-09-11 Ohne Parameter wird erst die Hilfe aufgerufen. alf@cadsoft.de +// Wird keines der gesuchten Signale gefunden, +// wird eine entsprechnede Nachricht angezeigt. +// 2005-02-10 alf@cadsoft.de + +string Help = usage; +string HButton = "&Help"; +string SButton = "&Save"; + +real f, WLtotal; +int index[]; + + +real Length[]; +string signal_list[]; +int sig_n = 0; + +real route_length[]; +real Unroute_length[]; +int Unroute_cnt[]; + +int t; +numeric string data[]; + +string h; +string header; + +data[1] = "No signals found."; + +if (language() == "de") { + data[1] = "Keines der Signale gefunden."; // 2008-09-11 + Help = hilfe; + HButton = "&Hilfe"; + SButton = "&Sichern"; +} + + +void help(void) { + dlgMessageBox(Help, "Ok"); + return; +} + + +void dialog(void) { + int select = 0; + int ssort = 0; + if (argc < 2) ssort = 1; + + int Result = dlgDialog("Wire length of Layout") { + dlgListView("", data, select, ssort); + dlgHBoxLayout { + dlgPushButton("+Ok") dlgReject(); + dlgPushButton(SButton) { + 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]); + } + } + } + } + dlgStretch(1); + dlgPushButton(HButton) help(); + } + }; + 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); +} + + +int found(string signame) { + if (argc < 2) return 1; + int f = 0; + int sig = 0; + for (int n = 0; n <= sig_n; n++) { + + if (strchr(signal_list[n], '*') >= 0) { // wildcard * in name + int l = strlen(signal_list[n]); + string s; + + if (signal_list[n][0] == '*' && signal_list[n][l-1] == '*') { // *name* + s = strsub(signal_list[n], 1, l-2 ); + if(strstr(signame, s) > 0) { + f = 1; + break; + } + } + + else if (signal_list[n][l-1] == '*') { // name* + s = strsub(signal_list[n], 0, l-1); + if(strstr(signame, s) == 0) { + f = 1; + break; + } + } + + else if (signal_list[n][0] == '*') { // *name + s = strsub(signal_list[n], 1); + if(strstr(signame, s) > 0) { + f = 1; + break; + } + } + } + else if (signame == signal_list[n]) { + f = 1; + break; + } + } + return f; +} + +// *** different length to shortesd signals in percent *** +string percent( real length, real length100) { + string s; + if (length100) sprintf(s, "%.2f", (length - length100) / (length100 / 100)); + else s = "--"; + return s; +} + +// *** Unroutet length *** +string unroute(real l, int cnt) { + string s; + if (cnt) sprintf(s, "%.2f", l); + else s = "--"; + return s; +} + + + +// *** main *** +if (board) board(B) { + if (argc < 2) { // 2008-09-11 alf@cadsoft.de + help(); + } + else { + string h; + int n; + string list; + + // *** check only by signal name *** + sig_n = argc -2; + for (n = 1; n < argc; n++) { + signal_list[sig_n] = strupr(argv[n]); + list += signal_list[sig_n] + "\n"; + sig_n++; + } + } + + sprintf(h, "%s\n", EAGLE_SIGNATURE); + header += h; + sprintf(h, "List of signals with length"); + header += h; + + string Signal[]; + int n = 0; + B.signals(S) { + if (found(S.name)) { + WLtotal = 0; + int cntUnroute = 0; + real unroute = 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)); + } + } + if (W.layer == 19) { // unrouted Layer + unroute += WireLength(u2mm(W.x2), u2mm(W.x1), u2mm(W.y2), u2mm(W.y1)); + cntUnroute++; + } + } + Signal[n] = S.name; + Length[n] = WLtotal; + Unroute_length[n] = unroute; + Unroute_cnt[n] = cntUnroute; + ++n; + } + } + + sort(n, index, Length); + sprintf(h, "Signal\tl [mm]\tdiff. [mm]\tdiff. [%%]\tunrouted [mm]"); + data[0] = h; + t = 1; + real null_length = Length[index[0]]; + + for (int i = 0; i < n; ++i) { + sprintf(h, "%s\t%10.2f\t%3.2f\t%s\t%s", + Signal[index[i]], + Length[index[i]], + Length[index[i]] - null_length, + percent(Length[index[i]], null_length), + unroute(Unroute_length[index[i]], Unroute_cnt[index[i]]) + ); + data[t] = h; + t++; + } + dialog(); +} + +else { + dlgMessageBox("Start this ULP in a Board"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/make-symbol-device-package-bsdl.ulp b/eagle-5.7.0/ulp/make-symbol-device-package-bsdl.ulp new file mode 100644 index 0000000..098bd5f --- /dev/null +++ b/eagle-5.7.0/ulp/make-symbol-device-package-bsdl.ulp @@ -0,0 +1,3295 @@ +#usage "Make Symbol, Device, Package or use Package in LBR\n" + "

" + "Generates Symbol and Device from a text file containing a list of pin names.
" + "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.
" + "

" + "Author: ed@anuff.com / librarian@cadsoft.de" + +#require 4.1600 + +/* + * Copyright (c) 2004 Ed Anuff . All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * +*/ + +// Rev: 1 (Eagle 4.12r04) - 2004-08-13 alf@cadsoft.de +// ***************************************************************** +// Rev: 2 (Eagle 4.13) - 2004-14-09 alf@cadsoft.de +// special sorting for Pad names with 2-Alpha-Character +// *** Xilix BSM-Files without ";" in line ************************* +// Xilinx = "linkage bit_vector (" and ": inout bit -- " +// BSDL = "linkage bit_vector; (" and ": inout bit; -- " +// ***************************************************************** +// Rev: 3 (Eagle 4.13) - 2004-11-23 alf@cadsoft.de +// corrected parse line with "port" +// *** Xilinx BSM-Files +// "port (" - without spaces +// *** Intel .bsdl-Files +// " port (" - with spaces +// corrected Function: [Replace] character string +// ***************************************************************** +// Rev: 4 (Eagle 4.13) - 2005-01-10 alf@cadsoft.de +// port: trim left spaces from string +// pars_map() corrected counter +// ***************************************************************** +// Rev: 5 (Eagle 4.13) - 2005-01-27 alf@cadsoft.de +// AnalogDevice uses Tabulator not Space characters and +// some times places no space before use direction +// ***************************************************************** +// Rev: 6 (Eagle 4.13) - 2005-03-23 alf@cadsoft.de +// Device and Package description font bold/italic +// ***************************************************************** +// Rev: 7 (Eagle 4.14) - 2005-06-06 alf@cadsoft.de +// Accept comment "--" in line +// ***************************************************************** +// Rev: 8 (Eagle 4.15) - 2005-06-28 alf@cadsoft.de +// Corrected grid and Package outlines +// allways set grid to 1.0 mm (default) +// ***************************************************************** +// Rev: 9 (Eagle 4.15) - 2005-08-02 alf@cadsoft.de +// change TAB with SPACE "\t" --> " " +// Improved search end of "port" list for Xilinx-BSDL-Files +// ***************************************************************** +// Rev: 10 (Eagle 4.15) - 2005-08-19 alf@cadsoft.de +// Menu to generate quad and dual pin packages +// correct port-end-parse with ");" and for AnalogDevice == "));" +// ***************************************************************** +// Rev: 11 (Eagle 4.15) - 2005-10-18 alf@cadsoft.de +// new parse end of port, counts open-close Bracked +// BSDL can use multiple packages, now can select one, if more than one defined +// Also generate Symbol only +// Generate Package variant +// Scan "BSDL" in text to set BSDL-Parse-Option if any file extension +// ***************************************************************** +// Rev: 12 (Eagle 4.15) - 2005-12-01 alf@cadsoft.de +// If !file use lbrname for path/script +// Correct package_name handling +// Change bit-map if select quad or dual package +// Use also thrue hole PADs for Packages +// ***************************************************************** +// Rev: 13 (Eagle 4.16r1) - 2006-06-01 alf@cadsoft.de +// round coordinates to 0.1 inch in symbol +// Menu BGA: [] Accept copy local parameter to global parameter +// ***************************************************************** +// Rev: 14 (Eagle 4.16r1) - 2006-06-09 alf@cadsoft.de +// Menu BGA: add Cream-Mask Parameter +// ***************************************************************** +// Rev: 15 (Eagle 4.16r1) - 2006-07-06 alf@cadsoft.de +// more at 1 Pin-Pad definition in Xilinx-BSDL Files, at +// constant CP56 : PIN_MAP_STRING := +// "TCK : K10, TDI : J10, TDO : A6, TMS : K9, " & +// ***************************************************************** +// Rev: 16 (Eagle 14.16r1) - 2006-10-19 alf@cadsoft.de +// Plus menu entry: delete Pad-Prefix in BSDL-List +// Example: Xilinx - xcs20_PQ208.bsd +// Check if exist Pad names +// ***************************************************************** +// Rev: 17 (Eagle 14.16r1) - 2006-11-09 alf@cadsoft.de +// Delete Lines with Textstring extendet to EXACT / INCLUDE +// ***************************************************************** +// Rev: 18 (Eagle 14.16r1) - 2006-12-05 alf@cadsoft.de +// Pad-Names to upper case +// on linkage, check by pin-name (VDD, VCC, VSS, VDD) if the pin really power-pin +// Set direction on all pins of a group of pins in a text-block +// Generate a new symbol! +// If more es 160 pins used, placed the pins as stripes by max (64) pins. +// This make no large symbol if too much pins in device. +// ***************************************************************** +// Rev: 19 (Eagle 4.16r2) - 2007-01-10 alf@cadsoft.de +// Start argument "edit-no-description" to switch of red marker in desciption; +// ***************************************************************** +// Rev: 20 (Eagle 4.16r2) - 2007-10-15 alf@cadsoft.de +// Button: SortPin (List) +// ***************************************************************** +// Rev: 21 (Eagle 4.16r2) - 2008-04-02 alf@cadsoft.de +// Button: Delete Column in Text field +// Button: Delete double pad number in pin-pad-direction list if copy +// text from a document like pdf ... +// ***************************************************************** +// Rev: 22 (Eagle 5.0) - 2008-05-20 alf@cadsoft.de +// [Save text as] [Load Text] in Text-Menu +// Rev: 23 (Eagle 5.0) - 2008-06-16 Texas BSDL files are use UPPER-CASE for "PORT" +// Rev: 24 (Eagle 5.0) - 2008-06-19 no check for PIN-coordinates if not symbol generated +// Rev: 25 (Eagle 5.0) - 2008-07-03 numbering pins, set Pin-Direction +// ***************************************************************** +// Rev: 26 (Eagle 5.3) - 2008-11-07 Text-Options [Rename PAD] +// Check pin list with pad names if package generated with option Package +// Generate Device-Descriptin also by Text-Option +// New changeable parameter GRID for Package generation, +// if measurements in data sheet in inch, mil, mm. +// remember last bsdl-file path +// +// Rev: 27 (Eagle 5.3) - 2008-12-03 alf@cadsoft.de +// Option for Padname use as in list, or generate by counter +// ***************************************************************** +// Rev: 28 (Eagle 5.4) - 2009-02-18 alf@cadsoft.de +// check if list sorted by pad name, to generate correct symbol +// by ascending pad namnes. +// - correct edit option delte x th. line +// ***************************************************************** +// Rev: 29 (Eagle 5.4.3) - 2009-03-09 alf@cadsoft.de +// no pad sorting if used bsdl file to generate symbol +// +// Rev: 30 (Eagle 5.6.1) - 2009-10-12 alf@cadsoft.de +// check if exist package definition in bsdl file +// +// Rev: 31 (Eagle 5.6.1) - 2009-10-16 alf@cadsoft.de +// generate only BGAs without file +// +// Rev: 32 (Eagle 5.6.1) - 2009-11-12 alf@cadsoft.de +// change character ';' ',' to '_' in parse function +// +// + + +string Revision = "Rev. 32"; + +string HelpDE = "Dieses ULP unterstützt die Generierung von Symbolen, Devices und Packages.
" + + "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ß.

"+ + "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:
" + + "

    " + + "
  • Split with word separator: Damit wird im Text an der Stelle an der sich ein nicht druckbares Zeichen befindet ein NewLine eingefügt." + + "
  • Split with Character: An der Stelle im Text an der sich dieses druckbare Zeichen befindet, wird ein NewLine eingefügt." + + "
  • Merge: Es werden, entsprechend dem angegebenen Wert, so viele Zeilen zu einer Zeile zusammengefügt.
    " + + "Als Trennzeichen zwischen den Wörtern wird der gewählte word separator benutzt." + + "
  • Replace character string .. with .. : Zeichenketten im Text, die exakt der angegebenen Definition entsprechen, werden ausgetauscht." + + "
  • Delete lines with text: Zeilen, die exakt den angegebenen Text enthalten, werden entfernt.
    " + + "
  • Delete every x th line [x], Start at line [n] - Löscht jede X-te Zeile ab der n-ten Zeile im Text.
    " + + "
  • Delete empty lines: Zeilen, die leer sind bzw. nur nicht druckbare Zeichen enthalten, werden entfernt."+ + "
  • " + + "
  • Parse übersetzt den Text (Tabelle) in die Pin-Pad-Direction-Tabelle.
    " + + "
  • Copy kopiert die Tabelle wieder in den Text(-Editor).
    " + + " Als Trennzeichen zwischen den Wörtern wird der gewählte word separator benutzt.
    " + + "
  • Swap Pin-Pad tauscht in der Liste die Pin-Pad-Spalten.
    " + + "
  • Sort sortiert die Liste nach Pad-Namen.

    " + + "

" + + "Durch Anwenden der einzelnen Möglichkeiten kann ein beliebiger Text zu einer brauchbaren Tabelle umgestaltet werden.
" + + "Es ist auch möglich einen Text aus der Zwischenablage einzufügen." + + "

" + + "Bei Text-Dateien kann ein Package aus der vorhandenen Use-Liste der geladenen LBR gewählt, oder über Package automatisch generiert werden.
" + + "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.
" + + "

" + + "BGA-Package generieren (BSDL): Es wird davon ausgegangen, daß das Gehäuse symmetrisch aufgebaut ist.
" + + " - 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.

" + + "Author: librarian@cadsoft.de"; + ""; + +string HelpEN = "This ULP supports the generation of Symbols, Devices, and Packages.
" + + "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).

"+ + "The number of separators in the text file determins and presets the word separator.

" + + "There are the following possibilities to edit text files (spreadsheets):
" + + "

    " + + "
  • Split with word separator: Insert NewLine at the position of a non-printable character." + + "
  • Split with Character: Insert NewLine in the text at the position of the given printable character." + + "
  • Merge: Joins the given number of lines to one common line.
    " + + "The given word separator is used as separator between words." + + "
  • Replace character string with: For replacing the given string." + + "
  • Delete lines with text: For deleting lines that contain exactly the given text.
    " + + "
  • Delete every x th line [x], Start at line [n]: Deletes every x th line, beginning with line number n.
    " + + "
  • Delete empty lines: For deleting lines that do not contain characters or contain non-printable characters only.
    " + + "

    " + + "

  • Parse: Transfers the text (spreadsheet) into the Pin-Pad-Direction spreadsheet." + + "
  • Copy: Copies the spreadsheet into the text editor again. The given word separator will be used between words." + + "
  • Swap Pin-Pad: Exchanges the pin and pad coloumn." + + "
  • Sort: The list will be sorted by pad names." + + "
" + + "These tools allow to make a usable spreadsheet from any text." + + "It is also possible to insert text from the operating sytem's clipboard.
" + + "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.
" + + "

" + + "Generate a package (BSDL files only): The package is assumed to be designed symmetrically.
" + + " - Package width: The dimension of the (plastic) case .
" + + " - PAD grid: The distance between the smds.
" + + " - PAD diameter: The diameter of the smds." + + "

" + + "Author: librarian@cadsoft.de"; + ""; + + +string Help; +if (language() == "de") Help = HelpDE; +else Help = HelpEN; + +string editMode = " edit this description"; +string infile, Source_file = "DESCRIPTION '';\n"; +string symbol_file, symbol_name; +string device_file, device_name; +string packagefile; +string package_name; +string pac_variant_name = ""; +string packages[]; +int n_packages = 0; +int package_selected = 0; +real package_wire_width = 0.1016; // to create a new package from BSDL file +real pac_width = 17.0; // to create a quad package from BSDL file +real textsize = 1.27; +real grid_val = 1.0; // for BallGridArea packages +real SMD_diameter = 0.5; // for BallGridArea packages +real MaskRestring = 0.0; // for BallGridArea packages +real CreamDiameter = 0.0; // for BallGridArea packages 2006-06-09 +string genpac_grid = "MM"; // 2008-11-07 default grid to generate package, can change in menu to mil, inch, mic. + +int smd_pad = 0; // use SMD or PAD for generate Package 2005-12-01 +// PAD_SHAPE_SQUARE, PAD_SHAPE_ROUND, PAD_SHAPE_OCTAGON, PAD_SHAPE_LONG, PAD_SHAPE_OFFSET +string PadShape[] = { "SQUARE", "ROUND", "OCTAGON" }; +int pad_shape = PAD_SHAPE_ROUND; +string packinfomess = ""; + +// new Menu Paramter to auto generate +int pad_layout; +int Pad_Count = 1; // the pads of package +int cnt_side = 0; // calculated pads on one side of package +real xA_pac = 14.0; // width of the metall pins +real yA_pac = 14.0; // width of the metall pins for quad package +real xD_pac = 12.0; // width of the plastic package in x +real yD_pac = 12.0; // width of the plastic package in y +real basic_pad_grid = 0.65; // the Basic grid Pad to Pad +real pad_width = 0.35; // the width of solder pin +real pad_stand_out = 0.5; // stand out the pad over the metall pin +real ypad_length = 0.4; // the pad width +real xpad_length = 0.9; // the pad length +real mark_length = 0.6; // length of corner edge to mark pad 1 +real roundness_restring = 0; // the SMD roundness for QFP/LCC/DualInline +string round_restring = "Roundness %"; +int packageparameter_accept; // if all parameter Ok for QFP/LCC/DualInline +int BGAparameter_accept; // if BGA parameter accept for generate package +string paccmd; // the script to generate qfp/lcc/Dual-Inline + +int pin_map_cnt = 0; // count the maps in the file +string pin_map_name; // the name of actual pin map + + +char w_separator[] = { ' ' , '\b', '\f', + '\n', '\r', '\t', + '\v', 0 }; + +string separator[] = { "SPACE", "Backspace", "Form Feed", + "New Line", "Carriage Return", "Horizontal tab", + "Vertical tab", "" }; + +int select_separ = 0; +char Word_separator = w_separator[select_separ]; +string String_separator; + +string Vector_name[]; +int sVector[], eVector[]; +int cnt_vector; +string up_down; + +string text; +string lines[]; +int n_lines; + +numeric string pin_names[]; +int n_pin_names = 0; +numeric string pad_names[]; +int n_pad_names = 0; +int use_pad_names = 0; +enum { useNONE, useBGA, usePACwithPrefix } // for use Padnames to generate Device +string pad_prefix; +string old_pad_prefix; +string checkPadname = ""; + + +numeric string pins_pads_direc[]; +numeric string pins[]; +numeric string pads[]; +string pin_direc[]; +int suffix[]; +int suffix_cnt, suffix_point; +int suffix_s, suffix_e; + +int n_pins = 0; +int n_pads = 0; + +int maxPinCnt = 100; +int maxStripeCnt = 64; // maximum of pins on a stripe in symbol +string pinCntInfo = " "; // Info if more as maxPinCnt pins used in one Symbol 2006-12-05 + + +// extend this list to set pin direction on power by linkage 2006-12-05 +string PowerName[] = { + "GND", + "VCC", + "VDD", + "VSS", + "VEE", + "+5V", + "-5V", + "" // the last must be empty "" + } ; + +enum { k_single, k_dual, k_dual2, k_quad , k_stripe }; +int pin_layout = k_dual; + + +int is_bsdl = 0; +int pars_mode; + +int breacked_status = 0; +enum { mode_null, mode_port, mode_map }; + +string bsdl_map_pin; // the actual map pin name + // more as one pins can named as the same + +string bsdl_pin_name[]; +string bsdl_pin_dir[]; +int cnt_bsdl_port; +string parsed_pins = " "; +string bsdl_package_name; +int make_Package; // generate Package by generated script + + +char port_separator = ':'; +char PIN_MAP_separator = ':'; + +string tinfo = " "; +string MakePacInfo = " "; +int select = 0; +int sorting = 0; // view list + +int index[]; +string used_pad_number[]; // 2008-11-07 +enum { e_symbol, bga_pac, e_pac }; // editor type to check max value of grid + +string rememberBSDLpath; // 2008-11-07 +string rememberLastPathFile = "~remember-make-bsdl~.mem"; + + // 2009-10-16 +string bga_pad_name[] = { "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "T", "U", "V", "W", "Y", "" }; +int cntBGApadX = 44; +int cntBGApadY = 44; +int only_generate_bga = 0; + +/**************************************** + ########## Functions ########### + ****************************************/ + +// 2008-11-07 check if exist package, but do not generate +int check_exist_pac(string pacname) { + int exist = 0; + library(L) { + L.packages(PAC) { + if (PAC.name == pacname) return 1; + } + } + return 0; +} + + +int check_Coordinate(string name, real x, real y, string grid_unit, int edit_type) { // 2008-11-07 new, grid unit, editor type + string s; + real maxminxy; + if (grid_unit == "MM") maxminxy = u2mm(8382000); // 2008-11-07 check max x-y by used grid + else if (grid_unit == "INCH") maxminxy = u2inch(8382000); + else if (grid_unit == "MIL") maxminxy = u2mil(8382000); + else if (grid_unit == "MIC") maxminxy = u2mic(8382000); + else { + if (edit_type == bga_pac) dlgMessageBox("Check grid parameter in BGA menu!", "OK"); + else if (edit_type == e_pac) dlgMessageBox("Check grid parameter in Package menu!", "OK"); + return -1; + } + if (x > maxminxy || x < -maxminxy ) { + sprintf(s, "Too much pins to generate symbol in X
Coordinate (%.4f) %s out of range %.4f %s

", x, grid_unit, maxminxy, grid_unit); + } + if (y > maxminxy || y < -maxminxy) { + sprintf(s, "Too much pins to generate symbol in Y
Coordinate (%.4f) %s out of range %.4f %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"; + else if (edit_type == bga_pac) s += "Check pad names in BSDL file
" + 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, "%d words replaced", ct); + dlgRedisplay(); + return; +} + + +void gen_viewlist(int cnt) { + status ("generate list"); // 2008-11-07 display working + for (int i = 0; i < cnt; i++) { + sprintf( pins_pads_direc[i], "%s\t%s\t%s", pin_names[i], pad_names[i], pin_direc[i]); + } + pins_pads_direc[i] = ""; // 2008-04-02 + return; +} + + +string clear_textline(string line, char c) { + int pos; + do { + pos = strchr(line, c); + if (pos >= 0) line[pos] = '_'; // 2009-11-12 alf@cadsoft.de + } while (pos >= 0); + return line; +} + + +void filter_pin_pad( int use_pad_names) { + for (int d = 0; d <= n_pins; d++) { + pins_pads_direc[d] = ""; + pin_names[d] = ""; + pad_names[d] = ""; + pins[d] = ""; + pads[d] = ""; + pin_direc[d] = ""; + suffix[d] = 0; + } + n_pins = 0; + for (int i = 0; i < n_lines; i++) { + lines[i] = clear_textline(lines[i], ';'); + string pin_name = cleanName(lines[i]); + string pad_name = ""; + int n; + string items[]; + n = strsplit(items, lines[i], Word_separator); + if (n > 0) { + pin_name = cleanName(items[0]); + if (use_pad_names = useBGA) { // ## useNONE, useBGA, usePACwithPrefix, isePACwithoutPrefix ## + pad_name = cleanName(items[1]); + } + + if (strlen(pin_name) > 0) { + pins[n_pins] = pin_name; + if (use_pad_names) pads[n_pads++] = pad_name; + + if (n > 2) pin_direc[n_pins] = items[2]; // 2008-04-02 + pin_names[n_pins] = pin_name; + pad_names[n_pins] = pad_name; + n_pins++; + } + } + } + pins[n_pins] = ""; + pads[n_pins] = ""; + pin_names[n_pins] = ""; + pad_names[n_pins] = ""; + pins_pads_direc[n_pins] = ""; + pin_direc[n_pins] = ""; + pin_direc[n_pins] = ""; + suffix[n_pins] = 0; + gen_viewlist(n_pins); + return; +} + + +void filter_text( int use_pad_names) { + n_lines = strsplit(lines, text, '\n'); + filter_pin_pad( use_pad_names); + sprintf( parsed_pins, "%d pins parsed", n_pins); // 2008-11-07 + Pad_Count = n_pins; // set pin counter for package option on text + return; +} + + +// ** scratch line after position n ** +string scratch(string p, char c, int n) { + int pos = strchr(p, c, n); + if (pos > 0) return strsub(p, 0, pos); + else return p; +} + + +/* ****************************************************** + Analog-Device use "linkage" also for signal pins!! + Example: + CLKIN: linkage bit; + XTAL: linkage bit; + VROUT: linkage bit_vector(0 to 1)); + ******************************************************* + + http://www.actel.com/documents/BSDLformat.pdf + 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). + ******************************************************** */ + +string pin_direction( string bsdldir) { + string pin_dir; + bsdldir = scratch( bsdldir, ' ', 1); // for Xilinx BSM-Files 14.09.2004 alf + bsdldir = scratch( bsdldir, ';', 1); + + if (bsdldir == "inout") pin_dir = "I/O"; + else if (bsdldir == "out") pin_dir = "OUT"; + else if (bsdldir == "in") pin_dir = "IN"; + else if (bsdldir == "linkage") pin_dir = "PWR"; + else if (bsdldir == "buffer") pin_dir = "HIZ"; + else { + bsdldir = scratch( bsdldir, '(', 0); + } + if (bsdldir == "linkage bit_vector") pin_dir = "PWR"; + // ** 09.09.2004 place a ';' in Xilinx BSD-Files ** + // ** to separate " linkage bit_vector" ! ** + return pin_dir; +} + + +string get_dir( string name) { // ** direction of pin ** + for (int i = 0; i < cnt_bsdl_port; i++) { + if (bsdl_pin_name[i] == name) { + return bsdl_pin_dir[i]; + break; + } + } + return ""; +} + + +string getVector(string v) { // ** count up or down ** + string Vname, vs[]; + int pos; + pos = strsplit(vs, v, ':'); + pos = strsplit(vs, vs[0], ' '); + for (int n = pos; pos; n--) { + if (vs[n]) break; + } + if (vs[n][0] == '(') vs[n] = strsub(vs[n], 1); + return vs[n]; +} + + +void parse_bit_vector(string l) { + /* EXAMPLE ************************************************** + XILINX-BSM-File + VCCAUX: linkage bit_vector; (1 to 16); + VCCINT: linkage bit_vector; (1 to 16); + + INTEL-BSDL-File + port (pci_ad : inout bit_vector(31 downto 0); + pci_cbe_n : inout bit_vector(3 downto 0); + ** ^ ^ ** + ** counter direction up = to / down = downto. ** + ********************************************************** */ + + int pos = strstr(l, "bit_vector", 0); + if (pos > 0) { + Vector_name[cnt_vector] = getVector(l); + status(Vector_name[cnt_vector]); // 2008-11-07 display working + string s, v, vs[]; + s = strsub(l, pos); + int n = strsplit(vs, s, '(' ); // cut up to ( + s = vs[1]; + n = strsplit(vs, s, ')' ); // cut ) + s = vs[0]; + n = strsplit(vs, s, ' ' ); + sVector[cnt_vector] = strtol(vs[0]); + eVector[cnt_vector] = strtol(vs[2]); + up_down = vs[1]; + cnt_vector++; + } + return; +} + + +// search & count breackeds for parse end 05.10.2005 +void brackeds(string l) { + string br[]; + int open_breacked = strsplit(br, l, '('); + int close_breacked = strsplit(br, l, ')'); + breacked_status += (open_breacked - close_breacked); + return; +} + + +// ** BSDL parser ** +void pars_port(string l) { + status("parse port"); + brackeds(l); + if (!breacked_status) { // end of port list 2005-10-05 + pars_mode = mode_null; + } + string k[]; + // if more as 1 port in line, it's a group of ports in line! 2006-12-05 + int cntk = strsplit(k, l, ','); + for (int nk = 0; nk < cntk; nk++) { + string p[]; + int n = strsplit(p, k[nk], port_separator); // ':' + if (n > 1) { + bsdl_pin_name[cnt_bsdl_port] = trimString(p[0]); + bsdl_pin_dir[cnt_bsdl_port] = pin_direction(trimString(p[1])); + if (bsdl_pin_dir[cnt_bsdl_port] == "PWR") { // check if realy a power pin by name 2006-12-05 + int cntpwr = 0, np = 0; + do { + cntpwr += strstr(bsdl_pin_name[cnt_bsdl_port], PowerName[np])+1; // to check more names, extend the line PowerName[]... + if (cntpwr) break; + np++; + } while (PowerName[np]); + if (!cntpwr) bsdl_pin_dir[cnt_bsdl_port] = "PAS"; // no powerpin 2006-12-05 + } + parse_bit_vector(l); + cnt_bsdl_port++; + } + } + return; +} + + +int get_suffix(string vector) { + int n; + for (n = cnt_vector; n >= 0; n--) { + if (vector == Vector_name[n]) break; + } + return n; +} + + +void pars_map(string l) { + status("parse maping"); + + if (strstr(l, ";") >= 0 ) { // semikolon marks end of map list + pars_mode = mode_null; // set parse mode + } + l = clear_line(l); // replace '"' and '(' and ')' with space, and replace ';' with ',' + l = cleanWhitespace(l); + + string lq[]; + int nlq = strsplit(lq, l, ','); // 2006-07-06 more as 1 Pin-Pad-Definition in Xilinx-BSDL files + // Example : xc2c32a_cp56.bsd + // constant CP56 : PIN_MAP_STRING := + // "TCK : K10, TDI : J10, TDO : A6, TMS : K9, " & + for (int nq = 0; nq <= nlq; nq++) { + l = lq[nq]; + string p[]; + string pad_map; + int n = strsplit(p, l, PIN_MAP_separator); // ':' + + if (n > 1) { // pin name + string ps[]; + int nn = strsplit(ps, trimString(p[0]), ' '); + bsdl_map_pin = ps[0]; // a new pin name + pad_map = p[1]; // pad name(s) + status(pad_map); // 2008-11-07 display working + suffix_point = get_suffix(bsdl_map_pin); + if (suffix_point < 0) { + suffix_cnt = -1; // set counter negativ -1 + } + else { + suffix_s = sVector[suffix_point]; + suffix_e = eVector[suffix_point]; + suffix_cnt = suffix_s; + } + } + else { // only pad names + pad_map = p[0]; + } + pad_map = spaceCharacter(pad_map, ','); + pad_map = cleanWhitespace(pad_map); + n = strsplit(p, pad_map, ' '); + for (int i = 0; i <= n; i++) { + if (p[i]) { // ** 2005-01-10 + // line can start with ", ..." + // line can end with ...," + pins[n_pins] = bsdl_map_pin; + pads[n_pins] = strupr(trimString(p[i])); // upper case ** 2006-12-05 + suffix[n_pins] = suffix_cnt; + if (suffix_cnt >= 0) { + if (up_down == "to") suffix_cnt++; + else if (up_down == "downto") suffix_cnt--; + } + n_pins++; + } + } + pins[n_pins] = ""; // clear +1 + pads[n_pins] = ""; + pin_names[n_pins] = ""; + pad_names[n_pins] = ""; + suffix[n_pins] = 0; + } + return; +} + + +string get_devName(string l) { + l = cleanWhitespace(l); + string s[]; + int n = strsplit(s, l, ' '); + if (n > 1) return strupr(s[1]); + return "--"; +} + + +string get_pacName(string l) { + string s[]; + int n = strsplit(s, l, '"'); + if (n > 1) return strupr(s[1]); + return ""; +} + + +string get_pin_map_name(string l) { + l = cleanWhitespace(l); + string s[]; + int n = strsplit(s, l, ' '); + n = strsplit(s, s[1], ':'); + return s[0]; +} + + +/* EXAMPLE ************************************************ +entity IXP4XX is + generic(PHYSICAL_PIN_MAP : string:= "BGA"); + port (pci_ad : inout bit_vector(31 downto 0); + pci_cbe_n : inout bit_vector(3 downto 0); + pci_par : inout bit; + pci_frame_n : inout bit; + .... + ... + .. + constant BGA:PIN_MAP_STRING := + "pci_ad : (D3, C2, J6, B1, A1, C1, D1, G3,"& + " E1, J4, G1, F1, K5, H2, K3, H1,"& + " N5, P2, P3, P5, N1, R1, R3, U1,"& + " U4, T1, V1, R5, V3, T4, W1, U3),"& + "pci_cbe_n : (H4, K1, M1, P1),"& + "pci_par : M2,"& +******************************************************** */ +void filter_bsdl(void) { + n_lines = strsplit(lines, text, '\n'); + int n; + /** counter and strings reset **/ + suffix_cnt = 0; + pars_mode = mode_null; + cnt_bsdl_port = 0; + pin_map_cnt = 0; // use multiple PIN_MAP_STRING: in BSDL + n_pins = 0; + package_name = ""; + package_selected = 0; + + + for ( n = 0; n < n_lines; n++) { + string line = lines[n]; + + if (strstr(line, "--") == 0); // comment + + else { + switch(pars_mode) { + case mode_port: /*** parse port lines pin-names and function ***/ + pars_port(trimString(line)); // 2005-01-10 trim spaces on left side of string + break; + + case mode_map: /*** parse pad-name ***/ + pars_map(line); + break; + + default : int pos = strstr(strlwr(line), "port"); // 2008-06-16 Texas BSDL files are UPPER-CASE for "PORT" + if (pos >= 0) { + brackeds(line); + pars_mode = mode_port; + pos = strstr(line, "(", pos); + string p = strsub(line, pos+1); + pars_port(trimString(p)); + } + + else if (strstr(line, "constant") >= 0 && strstr(line, "PIN_MAP_STRING") > 8) { + if (!pin_map_cnt) { + package_name = strupr(get_pin_map_name(line)); + pin_map_cnt++; + pars_mode = mode_map; + package_selected = 0; + } + else { + string next_pin_map = get_pin_map_name(line); + pin_map_cnt++; + if (dlgMessageBox("found next MAP list " + next_pin_map + " (Package), last Map list " + package_name + " (Package)

Use MAP?", next_pin_map, package_name) != 0) ; + else { + package_name = strupr(next_pin_map); + pars_mode = mode_map; + suffix_cnt = 0; // reset counter an arrays 06.10.2005 + n_pins = 0; // reset pin list counter + } + } + } + + if (strstr(line, "entity") == 0) { + device_name = get_devName(line); // 23.11.2004 alf + } + + if (strstr(line, "generic") >= 0) { + package_name = strupr(get_pacName(line)); // 23.11.2004 alf + package_selected = 0; + } + break; + } + } + } + status ("generate direction"); // 2008-11-07 display working + for ( n = 0; n < n_pins; n++) { + pin_direc[n] = get_dir( pins[n]); + if (suffix[n] >= 0) { + if (pin_direc[n] == "PWR") { + sprintf( pin_names[n], "%s@%d", pins[n], suffix[n]); + } + else { + sprintf( pin_names[n], "%s%d", pins[n], suffix[n]); + } + pins[n] = pin_names[n]; + } + else pin_names[n] = pins[n]; + pad_names[n] = pads[n]; + } + // ** in a text block, only the last line define the direction ** + // ** fill down the pindirection in list 2006-12-05 ** + for ( n = n_pins - 1; n; n--) { + if (!pin_direc[n-1] && pin_direc[n]) pin_direc[n-1] = pin_direc[n]; + } + pins_pads_direc[n_pins] = ""; // make shure the last in the list is empty! + pin_names[n_pins] = ""; + pad_names[n_pins] = ""; + Pad_Count = n_pins; // 2008-11-07 set pad counter + sprintf( parsed_pins, "%d pins parsed", n_pins); + dlgRedisplay(); + if (n_pins > 160) { // 2008-11-07 + sprintf(pinCntInfo, "Too many pins for a small symbol. Tip: Generate symbol with stripes of max pins in line."); // 2006-12-05 + pin_layout = k_stripe; + } + else if (n_pins > maxPinCnt) { + sprintf(pinCntInfo, "Too many pins for a small symbol. Generate symbol with four sides."); + pin_layout = k_quad; // 2008-11-07 + } + sprintf( bsdl_package_name, "Used package in BSDL file: %s", package_name ); + gen_viewlist(n_pins); + return; +} + + +void check_separator(void) { + string tx[]; + int scnt = 0; + int n = -1; + do { + n++; + int i = strsplit(tx, text, w_separator[n]); + if (scnt < i) { + scnt = i; + select_separ = n; + Word_separator = w_separator[select_separ]; + sprintf(String_separator, "%c", Word_separator); + } + } while(w_separator[n]); + return; +} + + +// is in Text "BSDL" then mark Text as BSDL 2005-10-18 +int scan_isbsdl(void) { + int bsdl = 0; + bsdl = strstr(text, "BSDL"); + if (bsdl > 0) return 1; + return 0; +} + + +void readText( string file) { + string base_file = filename(file); + string base_name = cleanName(strsub(filename(file), 0, strrchr(base_file, '.'))); + symbol_name = base_name; + device_name = base_name; + + // reset all counters + for (int d = 0; d <= n_pins; d++) { + pins_pads_direc[d] = ""; + pin_names[d] = ""; + pad_names[d] = ""; + pins[d] = ""; + pads[d] = ""; + pin_direc[d] = ""; + suffix[d] = 0; + } + n_pins = 0; + n_pads = 0; + n_pin_names = 0; + n_pad_names = 0; + package_name = ""; + + int n = fileread(text, file); + status("parse ..."); // 2008-11-07 display, im working + is_bsdl = scan_isbsdl(); + string f = strlwr(fileext(file)); + if (f == ".bsm" || f == ".bsd" || f == ".bsdl" || is_bsdl) { + // ** clear tabulator in text ** + tinfo = "Parsing BSDL file, please wait!"; + parsed_pins = "Please wait!"; + dlgRedisplay(); + int i; + do { + i = strchr(text, '\t'); + if(i > 0) { + text[i] = ' '; + } + } while (i > 0); + + use_pad_names = useBGA; + pad_prefix = ""; + filter_bsdl(); // file parse + is_bsdl = 1; + } + if (!is_bsdl) check_separator(); + sprintf(tinfo, "[text length %d character]", strlen(text) ); + dlgRedisplay(); + return; +} + + +string split_row_column(string p, int type) { + int n; + for (n = 0; n < strlen(p); n++) { + if (p[n] > '@'); + else break; + } + if (type) return strsub(p, n); + return strsub(p, 0, n); +} + + +// *** BGAs can use 2 Alpha-Character for Pad-Name *** +void padsort(void) { + int n; + for (n = 0; n < n_pins; n++) { + if(isalpha(pad_names[n][1])) { + pad_names[n] = "~" + pad_names[n]; + } + } + sort(n_pins, index, pad_names); + for (n = 0; n < n_pins; n++) { + if(pad_names[n][0] == '~') { + pad_names[n] = strsub(pad_names[n], 1); + } + } +} + + +void makePackage(string file) { + real maxcolumn; + packagefile = filesetext(file, "~package.scr"); + output(packagefile, "wtD") { + if(packageparameter_accept) printf("%s", paccmd); /** generate QFP/LCC/DUAL-Line **/ + else if (BGAparameter_accept) { /** generate BGA **/ + printf("EDIT %s.PAC;\n", package_name); + printf("GRID %s %.4f ON;\n", genpac_grid, grid_val/2); // 2008-11-07 set actual grid to generate package + printf("SET WIRE_BEND 2;\n"); + printf("CHANGE ROUNDNESS 100;\n"); + printf("CHANGE LAYER 1;\n"); + printf("CHANGE SMD %.4f %.4f;\n", SMD_diameter, SMD_diameter); + padsort(); + int cntrow, column, cntcolumn; // Zeile/Spalte + string row_name, last_name; + + for (int n = n_pins-1; n >= 0; n--) { + row_name = split_row_column(pad_names[index[n]], 0); + column = strtol(split_row_column(pad_names[index[n]], 1)); + if(maxcolumn < column) maxcolumn = column; + if (last_name != row_name) { + cntrow++; + last_name = row_name; + } + if (check_Coordinate(pad_names[index[n]], grid_val*column, grid_val*cntrow, genpac_grid, bga_pac)) exit(0); // 2008-11-07 grid from bga + printf("CHANGE LAYER 1;\n"); + printf("SMD NOSTOP NOCREAM '%s' (%.4f %.4f);\n", pad_names[index[n]], grid_val*column, grid_val*cntrow ); + printf("CHANGE LAYER 29;\n"); // tStop + printf("CIRCLE 0 (%.4f %.4f) (%.4f %.4f);\n", grid_val*column, grid_val*cntrow, grid_val*column + SMD_diameter/2+MaskRestring, grid_val*cntrow); + if (CreamDiameter) { + printf("CHANGE LAYER 31;\n"); // tCream + printf("CIRCLE 0 (%.4f %.4f) (%.4f %.4f);\n", grid_val*column, grid_val*cntrow, grid_val*column + CreamDiameter/2, grid_val*cntrow); + } + } + printf("GROUP (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (>%.4f %.4f);\n", + -1.0 * grid_val, -1.0 * grid_val, + grid_val * (maxcolumn+1), -1.0 * grid_val, + grid_val * (maxcolumn+1), grid_val * (cntrow+1), + -1.0 * grid_val, grid_val * (cntrow+1), + -1.0 * grid_val, -1.0 * grid_val ); + + real centerx, centery; + centerx = (grid_val * (maxcolumn+1)) / 2; + centery = (grid_val * (cntrow+1)) / 2; + printf("MOVE (>%.4f %.4f) (0 0);\n", centerx, centery); + + printf("SET WIRE_BEND 0;\n"); + printf("CHANGE LAYER 21;\n"); + printf("WIRE .2032 (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + -pac_width /2 + package_wire_width, -pac_width /2 + package_wire_width, + pac_width /2 - package_wire_width, pac_width /2 - package_wire_width, + -pac_width /2 + package_wire_width, -pac_width /2 + package_wire_width); + // *** mark edge on pin 1 *** + printf("SET WIRE_BEND 2;\n"); + printf("WIRE .2032 (%.4f %.4f) (%.4f %.4f);\n", + -pac_width /2 + package_wire_width, pac_width /2 - grid_val, + -pac_width /2 + grid_val, pac_width /2 - package_wire_width); + + printf("CHANGE SIZE %.2f;\n", textsize); + printf("CHANGE LAYER 25;\n"); + printf("TEXT >NAME (%.4f %.4f);\n", + -pac_width/2, pac_width/2 + textsize*0.5); + + printf("CHANGE LAYER 27;\n"); + printf("TEXT >VALUE (%.4f %.4f);\n", + -pac_width/2, -pac_width/2 - textsize*1.5); + printf("%s\n", Source_file); + } + } + return; +} + + +int device_exist(string dev_name) { + library(L) { + L.devicesets(DEV) { + if (DEV.name == dev_name) { + return 1; + } + } + } + return 0; +} + + +string makeSymbol_Device(string Libfile, int pin_layout, string pac_name, int use_pad_names, string pad_prefix) { + symbol_file = filesetext(Libfile, "~symbol.scr"); + device_file = filesetext(Libfile, "~device.scr"); + string partlib = "EDIT " + symbol_name + ".sym;\nGRID INCH 0.1;\n"; + partlib += "CHANGE LENGTH MIDDLE;\n"; + partlib += "CHANGE DIRECTION PAS;\n"; // ** default direction + + string devicelib = "EDIT " + device_name + ".dev;\n"; + devicelib += "GRID INCH 0.1 ON;\n"; + devicelib += "PACKAGE " + pac_name + " '" + pac_variant_name + "';\n"; + devicelib += "Technology '';\n"; + if (device_exist(device_name)) return "Device " + device_name + "exist!\nPlease use a different name for tis device."; // 2008-11-07 check existing devices and return error + else { + // 2008-11-07 generate always description + sprintf(Source_file, "DESCRIPTION '%s%s

\\n\\\nAuto generated by %s %s
\\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, "%d characters changed.", cc); + return; +} + + +string check_space(string s) { + int a; + for (int i = 0; i < strlen(s); i++) { + a = (isgraph(s[i])); + if (a) break; + } + if (a) return s; + else return ""; +} + + + +void delete_x_line(int start, int x) { + if (x < 2) { + dlgMessageBox("!The value of the counter must be greater 1", "Ok"); + tinfo = "It is absurd to delete all lines! Check the value of x. line"; + return; + } + if (start > 1) start--; // 2009-02-18 counts from zero + string xt[]; + int cntst = strsplit(xt, text, '\n'); + text = ""; + int cdel = 0; + for (int s = start; s < cntst; s+=x) { + xt[s] = ""; + } + for (int n = 0; n < cntst; n++) { + if (xt[n]) text += xt[n] + "\n"; + else cdel++; + } + text[strlen(text)-1] = 0; + if (x > 2) sprintf(tinfo, "%d %d. lines deleted", cdel, x); + else sprintf(tinfo, "%d second lines deleted", cdel); + return; +} + + +void delete_empty_lines(void) { + if(!text) { + tinfo = "List is empty!"; + return; + } + string st[]; + int cntst = strsplit(st, text, '\n'); + text = ""; + int cc = 0; + for (int n = 0; n < cntst; n++) { + st[n] = check_space(st[n]); + if (st[n]) text += st[n] + "\n"; + else cc++; + } + text[strlen(text)-1] = 0; + sprintf(tinfo, "%d empty lines deleted", cc); + return; +} + + +void delete_column(int del_column) { // 2008-04-02 + if (!text) { + tinfo = "List is empty!"; + return; + } + if (!del_column) { + tinfo = "First set the number of column to delete!"; + return; + } + string lines[]; + string columns[]; + int cntl = strsplit(lines, text, '\n'); + text = ""; + for (int n = 0; n < cntl; n++) { + int cntc = strsplit(columns, lines[n], Word_separator); + columns[del_column -1] = ""; + lines[n] = ""; + for (int c = 0; c < cntc; c++) { + lines[n] += columns[c]; + if (c < cntc -1 && columns[c]) lines[n] += " "; + } + text += lines[n] += "\n"; + } + return; +} + + +void sorting_pad(int cnt) { + numeric string sort_pad[], sort_pin[], sort_dir[]; + int index[], i; + for (i = 0; i < cnt; i++) { + pins[i] = pads[i]; + sort_pin[i] = pin_names[i]; + sort_pad[i] = pad_names[i]; + sort_dir[i] = pin_direc[i]; + } + sort(cnt, index, sort_pad, sort_pin); + for (i = 0; i < cnt; i++) { + pin_names[i] = sort_pin[index[i]]; + pad_names[i] = sort_pad[index[i]]; + pin_direc[i] = sort_dir[index[i]]; + pins[i] = pin_names[i]; + pads[i] = pin_names[i]; + } + return; +} + + +void sorting_pin(int cnt) { + numeric string sort_pad[], sort_pin[], sort_dir[]; + int index[], i; + for (i = 0; i < cnt; i++) { + pins[i] = pads[i]; + sort_pin[i] = pin_names[i]; + sort_pad[i] = pad_names[i]; + sort_dir[i] = pin_direc[i]; + } + sort(cnt, index, sort_pin, sort_pad); + for (i = 0; i < cnt; i++) { + pin_names[i] = sort_pin[index[i]]; + pad_names[i] = sort_pad[index[i]]; + pin_direc[i] = sort_dir[index[i]]; + pins[i] = pin_names[i]; + pads[i] = pin_names[i]; + } + return; +} + + +int check_pad_sorting(int cnt, int mkpac) { // 2009-02-18 + int sortflagPAD = 0; + int RESULT = 0; + if (!mkpac && use_pad_names == useBGA) sortflagPAD = 1; // option for use existing BGA 2009-03-09 + + else if (!mkpac && package_name) { + for (int n = 0; n < cnt; n++) { + if (strtol(pad_names[n]) != n+1) { + sortflagPAD++; + string h; + sprintf(h, "Missing Pad number (%d) or sort list by pad number", n+1); + if (dlgMessageBox(h, "OK", "Cancel") != 0) return -1; + } + } + if (sortflagPAD) { + RESULT = dlgDialog("Make PAC/SYM/DEV") { + dlgLabel("To generate a correct symbol by counte pad name, the list must sorted by pad number!"); + dlgLabel("Check if Pin/Pad/Direction list sorted by PADs?"); + dlgHBoxLayout { + dlgPushButton("Yes/Ignore") dlgAccept(); + dlgPushButton("Sort") { + sorting_pad(cnt); + gen_viewlist(cnt); + dlgAccept(); + } + dlgPushButton("Cancel") dlgReject(); + } + }; + } + } + return RESULT; +} + + +string clear_z(string s) { // delete leading zero + parsed_pins = s; + if (isalpha(s[0]) && isalpha(s[1]) && s[2] == '0') s = strsub(s, 0, 2) + strsub(s, 3); + else if (isalpha(s[0]) && s[1] == '0') s = strsub(s, 0, 1) + strsub(s, 2); + else if (s[0] == '0') s = strsub(s, 1); + return s; +} + + +void clear_leading_z(int cnt) { + for (int i = 0; i < cnt; i++) { + pad_names[i] = clear_z(pad_names[i]); + } + gen_viewlist(cnt); + parsed_pins = "Finsh clear leading zeros"; + return; +} + + +int del_double_pad(int cnt) { // 2008-04-02 delete double pad names if parsed from text + sorting_pad(cnt); + string npad = ""; + string npin_names[]; + string npad_names[]; + string npin_direc[]; + + int newcnt = 0; + for (int i = 0; i < cnt; i++) { + if (npad == pad_names[i]) { + ; // is double + } + else { + npad = pad_names[i]; + npin_names[newcnt] = pin_names[i]; + npad_names[newcnt] = pad_names[i]; + npin_direc[newcnt] = pin_direc[i]; + newcnt++; + } + } + sprintf(parsed_pins, "Finsh delete double (%d) pad name, new count %d", cnt-newcnt, newcnt); + for (int n = 0; n < newcnt; n++) { + pin_names[n] = npin_names[n]; + pad_names[n] = npad_names[n]; + pin_direc[n] = npin_direc[n]; + } + cnt = newcnt; + gen_viewlist(cnt); + return cnt; +} + + +// 2008-11-07 rename pad in parsed list +void rename_pad(int cnt, string search, string replace) { + int cntrenamed = 0; + if (!search) { + dlgMessageBox("First define search string!
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\\\nAuto generated by %s %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 = "Tip: Use split-device-symbol.ulp to generate a Device with multiple small symbols! Read HELP."; // 2006-12-05 + dlgCell(0, 9) dlgLabel(""); + dlgCell(0, 10) dlgVBoxLayout { + dlgStretch(1); + dlgLabel("Ma&x.\nPins\nper\nStripe"); + dlgHBoxLayout { + dlgIntEdit(maxStripeCnt); + dlgStretch(1); + } + } + } + dlgStretch(1); + dlgLabel(pinCntInfo, 1); + dlgStretch(1); + } + dlgStretch(1); + } + dlgStretch(1); + dlgHBoxLayout { dlgSpacing(8); dlgLabel(MakePacInfo, 1); } // info what package parameter in use + + dlgStretch(1); + dlgHBoxLayout { + dlgSpacing(8); + dlgPushButton("Ok") { + string error = ""; + string Libfile; + if (!Libfile) { + library(L) Libfile = L.name; + } + if (make_Symbol) { // 2008-11-07 + if (check_pad_sorting(n_pins, make_Package)) { // 2009-02-18 check if pads sorted ascending + error = "Cancelt by check pad number!"; + } + if (check_exist_sym(strupr(symbol_name))) { + error = "Check symbol name, symbol exist!"; + } + if (!error) error = makeSymbol_Device(Libfile, pin_layout, package_name, use_pad_names, pad_prefix); + if (!error) { + int sympincount = getSymbolPinCount(strupr(symbol_name)); + if (sympincount >= 0) { // ** symbol exist, do not change or add pins ** + string s; sprintf(s, "Symbol %s has %d pins", symbol_name, sympincount); + error = "Symbol " + symbol_name + " exists, use another name for this new symbol!"; + // make_Symbol = 0; // 2008-11-07 reset/set this option by hand + } + } + } + else { + if (!only_generate_bga) { // 2009-10-19 + if (!check_exist_sym(strupr(symbol_name))) error = "Check symbol, symbol NOT exist!"; + } + } + if (make_Package) { // do not generate package while exist 2008-11-07 + if (check_exist_pac(package_name)) make_Package = 0; // reset flag + } + else PadCount = ""; + if (make_Device && !error) { + if (!make_Package && package_name) ; + else if (make_Package && BGAparameter_accept || make_Package && packageparameter_accept) ; // 2005-12-01 + else { + package_selected = 0; + error = "Accept Package parameter to generate a Package,
" + + "or accept BGA parameter,
or Use an existing Package.
"; + PadCount = " "; + } + } + if (!error) { + if ((package_name && !make_Package) && (make_Device && !make_Package)) { + // 2008-11-07 if use a existing package, + // first check padnames in used package + + if (!check_exist_pac(strupr(package_name))) error = "Package not exit " + package_name; + else PadCount = getPackagePadCount(package_name); // generate pad list from used package, used_pad_number[] + if (!error) error += check_pin_pad_list(n_pins, strtol(PadCount)); // 2008-11-07 + } + + if (make_Package) { + if (BGAparameter_accept || packageparameter_accept) ; + else { + error = "Accept BGA or Package parameter."; + } + if (BGAparameter_accept && !n_pins) { + error = "No BSDL file has parsed."; + } + if (package_name) { + m_pac_width = pac_width; + m_grid_val = grid_val; + m_SMD_diameter = SMD_diameter; + m_MaskRestring = MaskRestring; + m_CreamDiameter = CreamDiameter; + } + else { + error = "Define a Package name"; + } + } + } + if (!error) { + pac_width = m_pac_width; + grid_val = m_grid_val; + SMD_diameter = m_SMD_diameter; + MaskRestring = m_MaskRestring; + CreamDiameter = m_CreamDiameter; + dlgAccept(); { + // *** make package after set parameter (grid & diameter) 2005-06-28 *** + if (make_Package) { + pac_width = m_pac_width; + grid_val = m_grid_val; + SMD_diameter = m_SMD_diameter; + MaskRestring = m_MaskRestring; + CreamDiameter = m_CreamDiameter; + if (!infile) { library(L) infile = L.name; } // set default path for temporary script 2005-11-03 + makePackage(infile); + cmd += "SCRIPT '" + packagefile + "';\nWIN FIT;\n"; + } + } + } + else { + display_error(error); // 2008-11-07 + } + } + dlgSpacing(8); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + dlgSpacing(8); + } + + dlgTabPage("BG&A") { // ####################################### + dlgSpacing(8); + dlgHBoxLayout { + dlgSpacing(8); + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(8); + dlgLabel("Use only for BSDL file "); + } + dlgGroup("Generate Ball Grid Area") { + dlgGridLayout { + dlgCell(2,5) dlgLabel("Body &Width "); + dlgCell(2,6) dlgRealEdit(m_pac_width); + + dlgCell(3,5) dlgLabel("PAD &Grid "); + dlgCell(3,6) dlgRealEdit(m_grid_val); + + dlgCell(4,5) dlgLabel("PAD &Diameter "); + dlgCell(4,6) dlgRealEdit(m_SMD_diameter); + + dlgCell(5,5) dlgLabel("&Stop Mask +/- "); + dlgCell(5,6) dlgRealEdit(m_MaskRestring); + + dlgCell(6,5) dlgLabel("&Cream Mask Diam. "); + dlgCell(6,6) dlgRealEdit(m_CreamDiameter); + dlgCell(6,7) dlgLabel(" 0 = OFF"); + } + dlgHBoxLayout { + dlgLabel("Drawing grid "); + dlgStringEdit(genpac_grid); + dlgStretch(1); + } + } + dlgStretch(1); + dlgHBoxLayout { // 2009-10-16 + dlgStretch(2); + dlgLabel("Generate only BGA pad names, to generate BGA package without a BSDL- or a TEXT-file "); + dlgPushButton("Generate PAD list") genBGA_PadList(); // 2009-10.16 + dlgStretch(1); + } + } + dlgLabel(""); + dlgStretch(1); + } + dlgStretch(1); + dlgHBoxLayout { + dlgSpacing(8); + dlgCheckBox("Accept para&meter ", BGAparameter_accept) { + genpac_grid = strupr(genpac_grid); // 2008-11-07 use always in upper case + pac_width = m_pac_width; // 2006-06-01 + grid_val = m_grid_val; + SMD_diameter = m_SMD_diameter; + MaskRestring = m_MaskRestring; + CreamDiameter = m_CreamDiameter; // 2006-06-09 + if (BGAparameter_accept) { + if (!n_pins) { + dlgMessageBox("No BSDL file has parsed.", "OK"); + BGAparameter_accept = 0; + } + else { + use_pad_names = useBGA; + packageparameter_accept = 0; // *** only one parameter can accept *** + package_name = strupr(package_name); + gen_package(package_name); // 2005-08-02 + make_Package = 1; + MakePacInfo = "Use BGA parameter to generate Package"; + } + } + else { + MakePacInfo = " "; + } + } + dlgStretch(1); + } + dlgSpacing(8); + } + + dlgTabPage("&Package") { // ####################################### + packageparameter_accept = 0; + dlgSpacing(8); + dlgHBoxLayout { + dlgSpacing(8); + dlgVBoxLayout { + dlgGroup("Parameter (generate new package)") { + dlgGridLayout { + dlgCell( 1,0) dlgLabel(" &L "); + dlgCell( 1,1) dlgRealEdit(xA_pac); + dlgCell( 1,2) dlgSpacing(10); + + dlgCell( 2,0) dlgLabel(" L1 "); + dlgCell( 2,1) dlgRealEdit(yA_pac); + + dlgCell( 4,0) dlgLabel(" &D "); + dlgCell( 4,1) dlgRealEdit(xD_pac); + + dlgCell( 5,0) dlgLabel(" D1 "); + dlgCell( 5,1) dlgRealEdit(yD_pac); + + dlgCell( 1,4) dlgLabel(" &m "); + dlgCell( 1,5) dlgRealEdit(mark_length); + + dlgCell( 2,4) dlgLabel(" &b "); + dlgCell( 2,5) dlgRealEdit(pad_width); + + dlgCell( 3,4) dlgLabel(" &e "); + dlgCell( 3,5) dlgRealEdit(basic_pad_grid); + + dlgCell( 4,4) dlgLabel(" &w "); + dlgCell( 4,5) dlgRealEdit(pad_stand_out); + + dlgCell( 5,4) dlgLabel(" &x "); + dlgCell( 5,5) dlgRealEdit(xpad_length); + + dlgCell( 6,4) dlgLabel(" &y"); // 2008-05-20 + dlgCell( 6,5) dlgRealEdit(ypad_length); + + dlgCell( 7,1) dlgLabel(round_restring, 1); // 2005-12-01 + dlgCell( 7,4) dlgLabel(" &r "); + dlgCell( 7,5) dlgRealEdit(roundness_restring, 0, 100); + + } + dlgHBoxLayout { + dlgLabel("&Grid "); + dlgStringEdit(genpac_grid); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgLabel(packinfo, 1); + dlgLabel(packinfomess, 1); // 2005-12-01 + dlgVBoxLayout { + dlgGroup("Package PAD Layout") { + dlgGridLayout { + dlgCell(0, 1) dlgLabel(""); + dlgCell(0, 3) dlgLabel(""); + dlgCell(0, 5) dlgLabel(""); + dlgCell(1, 1) dlgRadioButton("Quad &1", pad_layout) packinfo = ""; + dlgCell(1, 3) dlgRadioButton("Quad &2", pad_layout) packinfo = ""; + dlgCell(1, 5) dlgRadioButton("Dual &3", pad_layout) packinfo = ""; + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgGroup("Contact") { // 2005-12-01 + dlgGridLayout { + dlgCell( 1,0) dlgRadioButton("SMD", smd_pad) { + packinfomess = ""; + round_restring = "Roundness %"; + } + dlgCell( 2,0) dlgRadioButton("PAD", smd_pad) { + round_restring = "Restring"; + switch(pad_shape) { + case PAD_SHAPE_SQUARE : packinfomess = ""; + break; + case PAD_SHAPE_ROUND : packinfomess = ""; + break; + case PAD_SHAPE_OCTAGON : packinfomess = ""; + break; + } + } + } + } + dlgSpacing(8); + dlgGroup("Shape") { + dlgGridLayout { + dlgCell( 1,0) { + dlgVBoxLayout { + dlgStretch(1); + dlgHBoxLayout { + dlgRadioButton("Square", pad_shape) if (smd_pad) packinfomess = ""; + dlgRadioButton("Round", pad_shape) if (smd_pad) packinfomess = ""; + dlgRadioButton("Oct.", pad_shape) if (smd_pad) packinfomess = ""; + } + } + } + } + } + } + } + dlgStretch(1); + } + dlgStretch(1); + dlgHBoxLayout { + dlgSpacing(8); + dlgCheckBox("A&ccept parameter ", packageparameter_accept) { + genpac_grid = strupr(genpac_grid); // 2008-11-07 use always in upper case + switch (pad_layout) { // check Package PAD placement + case 0 : // quad package with Pin 1 on left side + cnt_side = Pad_Count / 4; + break; + case 1 : // quad package with Pin 1 on middle of top + cnt_side = Pad_Count / 4; + break; + case 2 : // dual in line package + cnt_side = Pad_Count / 2; + break; + } + if (packageparameter_accept) { + string e; + // ** if no package_name defined the script, can not edit a package ".PAC" ** 2005-12-01 + if (!package_name) { + sprintf(e, "Error: No Package name defined!\nCheck in TAB Make"); + packageparameter_accept = 0; + } + if (pad_layout == 0 || pad_layout == 1) { + int chkpad = Pad_Count % 4; // modulo 4 + if (chkpad) { + sprintf(e, "Error: Number of Pads %d can't be devided by 4", Pad_Count); + packageparameter_accept = 0; + } + if (!e) { + int middle = cnt_side % 2; + if (!middle && pad_layout == 1) { + sprintf(e, "Error: Pad layout middle can only be used for an odd number of pads at a side."); + packageparameter_accept = 0; + } + } + } + else if (pad_layout == 2) { + int chkpad = Pad_Count % 2; // modulo 2 + if (chkpad) { + sprintf(e, "Error: Number of Pads %d can't be devided by 2", Pad_Count); + packageparameter_accept = 0; + } + } + if (!e) { + if (packageparameter_accept) { + BGAparameter_accept = 0; + use_pad_names = usePACwithPrefix; + package_name = strupr(package_name); + gen_package(package_name); // 2005-08-02 + make_Package = 1; + MakePacInfo = "Use package parameter"; + } + } + else { + // show error message + MakePacInfo = " "; + dlgMessageBox(e, "OK"); + } + } + } + dlgLabel(" not for BGA "); + dlgSpacing(8); + + dlgLabel(" Pads Cou&nt "); + dlgIntEdit(Pad_Count, 1, 2000); + + dlgSpacing(400); + dlgStretch(1); + } + dlgSpacing(8); + } + + dlgTabPage("&Use Package") { // ####################################### + dlgSpacing(8); + dlgHBoxLayout { + dlgSpacing(12); + dlgVBoxLayout { + dlgHBoxLayout { + dlgGroup("Package options ") { + dlgRadioButton(" &None", use_pad_names) { + package_selected = 0; + package_name = ""; + old_pad_prefix = strupr(pad_prefix); + pad_prefix = ""; + } + dlgRadioButton(" Use PAD Na&mes supplied with BSDL file (for BGA parts) ", use_pad_names) { + old_pad_prefix = strupr(pad_prefix); + pad_prefix = ""; + } + dlgRadioButton(" Use PAD Prefi&x if existing package is used ", use_pad_names) { + old_pad_prefix = strupr(pad_prefix); + pad_prefix = old_pad_prefix; + } + } + dlgSpacing(8); + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgLabel(" Use &existing package "); + dlgComboBox(packages, package_selected) { + PadCount = "check pad names, please wait.. "; // 2008-11-07 + dlgRedisplay(); + package_name = packages[package_selected]; + if (!package_selected) { + pad_prefix = getPackagePadPrefix(packages[package_selected]); + package_name = ""; + } + else package_name = packages[package_selected]; // 2008-11-07 + status("generate pad list from package"); + PadCount = getPackagePadCount(package_name); // generate pad list from used package, used_pad_number[] + dlgRedisplay(); + status(""); + if (package_selected) make_Package = 0; // if use a package do not generate package + } + dlgLabel(PadCount, 1); + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgLabel(" Pad prefi&x "); + dlgStringEdit(pad_prefix); + dlgSpacing(560); + dlgStretch(1); + } + dlgSpacing(8); + } + } + dlgStretch(1); + } + + dlgTabPage("&Text Options") { // ####################################### + if (is_bsdl) { + dlgLabel("BSDL file in use! Do not change this text!"); + } + else { + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Swap PIN <-> PAD") { + if (is_bsdl) { + dlgMessageBox("!Do not swap Pin - Pad if a BSDL file is used!", "Ok"); + } + else { + for (int i = 0; i < n_pins; i++) { + string tt; + tt = pins[i]; + pins[i] = pads[i]; + pads[i] = tt; + tt = pin_names[i]; + pin_names[i] = pad_names[i]; + pad_names[i] = tt; + } + gen_viewlist(n_pins); + } + } + + dlgPushButton("Swap PAD <&-> DIR") { + if (is_bsdl) { + dlgMessageBox("!Do not swap PAD - DIR if a BSDL file is used!", "Ok"); + } + else { + for (int i = 0; i < n_pins; i++) { + string tt; + tt = pad_names[i]; + pad_names[i] = pin_direc[i]; + pin_direc[i] = tt; + pads[i] = pad_names[i]; + } + gen_viewlist(n_pins); + } + } + + dlgPushButton("Del&. Direct.") { + if (is_bsdl) { + dlgMessageBox("!Do not delete DIR if a BSDL file is used!", "Ok"); + } + else { + for (int i = 0; i < n_pins; i++) { + pin_direc[i] = ""; + } + gen_viewlist(n_pins); + } + } + } + dlgHBoxLayout { + dlgSpacing(8); + dlgGroup("Use with text only, not with a BSDL file") { + dlgVBoxLayout { + dlgHBoxLayout { + dlgSpacing(160); + dlgLabel("** use also for Parse -->>"); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("Spl&it") { + change_char_text(w_separator[select_separ], '\n', 0); + } + dlgLabel(" with word &separator "); + dlgComboBox(separator, select_separ) { + Word_separator = w_separator[select_separ]; + sprintf(String_separator, "%c", Word_separator); + } + dlgSpacing(16); + dlgLabel("Split with "); + dlgPushButton("&Character ") { + if (strlen(c_separator) == 1) + change_char_text(c_separator[0], '\n', 0); + else if (c_separator) + dlgMessageBox("!Split with character.\nMore than 1 character in this field.", "Ok"); + else + dlgMessageBox("!Split with character\nNo character defined.", "Ok"); + } + dlgLabel(" separator "); + dlgStringEdit(c_separator); + } + + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("&Merge") { + if (separator_counter > 1) { + int cntnl = strsplit(st, text, '\n'); + text = ""; + cc = 0; + int cnt = 0; + for (int n = 0; n < cntnl; n++) { + text += st[n]; + if (cnt < separator_counter-1) { + text += String_separator; + cnt++; + } + else { + text += "\n"; + cnt = 0; + cc++; + } + } + if(strlen(text) > 0) { + text[strlen(text)-1] = 0; + sprintf(tinfo, "shrink %d to %d lines", cntnl, cc); + } + } + else { + dlgMessageBox("Counter must be >= 2", "ok"); + } + } + dlgSpacing(4); + dlgIntEdit(separator_counter); + dlgLabel(" lines with word separator"); + dlgSpacing(190); + dlgStretch(1); + } + + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("&Replace" ) replaceWord(search, replace); + dlgLabel(" character strin&g "); + dlgStringEdit(search); + dlgLabel(" &with "); + dlgStringEdit(replace); + } + + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("D&elete") { + int cntst = strsplit(st, text, '\n'); + text = ""; + for (int n = 0; n < cntst; n++) { + if (exact_include) { + if (strstr(st[n], del_line) < 0) text += st[n] + "\n"; + } + else if (st[n] != del_line) text += st[n] + "\n"; + } + } + dlgLabel(" lines with te&xt string "); + dlgStringEdit(del_line); + dlgSpacing(8); + dlgRadioButton("Exact", exact_include); + dlgRadioButton("Include", exact_include); + dlgStretch(1); + } + + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("&Delete") delete_x_line(start_line, x_line); + dlgLabel(" e&very "); + dlgIntEdit(x_line); + dlgLabel("th. line. Start at &line "); + dlgIntEdit(start_line); + dlgStretch(1); + } + + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("Delete empt&y lines") delete_empty_lines(); + dlgStretch(1); + } + dlgSpacing(4); + dlgHBoxLayout { + dlgPushButton("Delete column") delete_column(delColumn); // 2008-04-02 + dlgLabel(" column &# "); + dlgIntEdit(delColumn, 1, 100); + dlgLabel(" (count from 1) "); + dlgStretch(1); + } + } + } + dlgStretch(1); + dlgVBoxLayout { + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Clear leading zeros in BGA-Pad") clear_leading_z(n_pins); + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Change direction") change_dir(n_pins); // 2008-04-02 + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Set pin direction") { + set_pin_direction(n_pins); // 2008-07-03 + } + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Delete double pad number") { + n_pins = del_double_pad(n_pins); // 2008-04-02 + } + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Rename PAD") { + rename_pad(n_pins, search, replace); // 2008-11-07 + } + dlgStretch(1); + } + dlgSpacing(8); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("Numbering pins for pad number") { + number_pins(n_pins); // 2008-07-03 + } + dlgStretch(1); + } + dlgStretch(1); + dlgLabel("


"); + 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 "Make SCH/BRD consistent by values." + "

" + "Start this ULP in the editor which contains the source values.
" + "Author: support@cadsoft.de
" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED +string Version = "1.1"; // 2006.10.17 + +numeric string sch_name[], sch_value[]; +numeric string sch_package[]; +int sch_sheet[]; +int sch_Index[]; +int sch_cnt = 0; +numeric string s_name[]; +numeric string DeviceList[]; + +numeric string brd_name[], brd_value[]; +numeric string brd_package[]; +int brd_Index[]; +int brd_cnt = 0; +string ElementList[]; + +numeric string sch_name_no_pac[], sch_value_no_pac[], sch_package_no_pac[]; +numeric string DeviceList_no_pac[]; +int sch_sheet_no_pac[]; +int sch_cnt_no_pac = 0; + + +numeric string brd_name_only_pac[], brd_value_only_pac[], brd_package_only_pac[]; +numeric string ElementList_only_pac[]; +int brd_Index_only_pac[]; +int brd_cnt_only_pac; + + +string lines[]; +int lines_cnt; + +string diff_values[]; +string command; +int runcount = 0; + +string notfound[]; +int cnt_nf= 0; + +string changeValue = ""; + +string readfile, readfile_only_pac, readfile_no_pac; +string ext = ".~cv"; // extension for temp file + +string emptySchList[], emptyBrdList[]; +int cnt_SCHempty = 0, cnt_BRDempty = 0; + +int n; + + +// ### Functions ### +if (board) { + board(B) { + readfile = filesetext(B.name, ext); + readfile_only_pac = filesetext(B.name, "_only_pac"+ext); + readfile_no_pac = filesetext(B.name, "_no_pac"+ext); + } +} +if (schematic) { + schematic(S) { + readfile = filesetext(S.name, ext); + readfile_only_pac = filesetext(S.name, "_only_pac"+ext); + readfile_no_pac = filesetext(S.name, "_no_pac"+ext); + } +} + + +int genscript(void) { + int xcnt = 0; + numeric string ch_name[], ch_value[]; + int ch_sheet[]; + int bIndex[], sIndex[]; + sort(brd_cnt, bIndex, brd_name); // sort by name + sort(sch_cnt, sIndex, sch_name); // sort by name + for (int x = 0; x < sch_cnt; x++) { + if ( sch_value[sIndex[x]] != brd_value[bIndex[x]]) { // change only values are different + if (board) { + ch_name[xcnt] = brd_name[bIndex[x]]; + ch_value[xcnt] = sch_value[sIndex[x]]; + ch_sheet[xcnt] = 0; // no sheet in bard + } + if (schematic) { + ch_name[xcnt] = sch_name[sIndex[x]]; + ch_value[xcnt] = brd_value[bIndex[x]]; + ch_sheet[xcnt] = sch_sheet[sIndex[x]]; + } + xcnt++; + } + } + string s; + int actualsheet = 0; + if (xcnt) { + for (int n = 0; n < xcnt; n++) { + if (actualsheet != ch_sheet[n]) { + sprintf(s, "EDIT .s%d;\n", ch_sheet[n]); + command += s; + actualsheet = ch_sheet[n]; + } + sprintf( s, "VALUE %s '%s';\n", ch_name[n], ch_value[n] ); + command += s; + } + } + return xcnt; +} + + +void checkdiff(void) { + int n1, n2, found; + for (n1 = 0; n1 < brd_cnt; n1++) { + found = 0; + for (n2 = 0; n2 < sch_cnt; n2++) { + if(brd_name[n1] == sch_name[n2]) { + found = 1; + break; + } + } + if (!found) { + sprintf(notfound[cnt_nf], "%s\t%s", ElementList[n1],".brd"); + cnt_nf++; + } + } + for (n1 = 0; n1 < sch_cnt; n1++) { + found = 0; + for (n2 = 0; n2 < brd_cnt; n2++) { + if(sch_name[n1] == brd_name[n2]) { + found = 1; + break; + } + } + if (!found) { + sprintf(notfound[cnt_nf], "%s\t%s", DeviceList[n1], ".sch"); + cnt_nf++; + } + } + return; +} + + +string getBrdValue(string name) { + for (int n = 0; n < brd_cnt; n++) { + if (name == brd_name[n]) if (brd_value[n]) return brd_value[n]; + } + return ""; +} + + +string getSchValue(string name) { + for (int n = 0; n < sch_cnt; n++) { + if (name == sch_name[n]) if (sch_value[n]) return sch_value[n]; + } + return ""; +} + + +void checkSCHempty(void) { + for (int n = 0; n < sch_cnt; n++) { + if (!sch_value[n]) { + emptySchList[cnt_SCHempty] = sch_name[n] + "\t" + getBrdValue(sch_name[n]); + cnt_SCHempty++; + } + } + return; +} + + +void checkBRDempty(void) { + for (int n = 0; n < brd_cnt; n++) { + if (!brd_value[n]) { + emptyBrdList[cnt_BRDempty] = brd_name[n] + "\t" + getSchValue(brd_name[n]); + cnt_BRDempty++; + } + } + return; +} + + +void setVal(string namev) { + string s[], cmd; + int cnt = strsplit(s, namev, '\t'); + if (board) { + for (int n = 0; n < sch_cnt; n++) { + if (s[0] == sch_name[n]) { + sprintf(cmd, "EDIT .S%d;\n", sch_sheet[n]); + break; + } + } + } + if (schematic) sprintf(cmd, "EDIT .brd;"); + cmd += "VALUE " + s[0]; + int Result = dlgDialog("Value for " + s[0]) { + dlgLabel("Change VALUE for "+s[0]+""); + dlgStringEdit(s[1]); + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + if (!Result) return; + cmd += " '"+s[1]+"';\nRUN '"+argv[0]+"';"; + exit(cmd); +} + + +void cmd_exit(string t) { + string s[]; + string f; + string cmd; + int cnts = strsplit(s, t, '\t'); + if (board && s[4] == ".brd" || schematic && s[4] == ".sch") { + sprintf(cmd, "RUN find '%s';\n", s[0]); + } + else { + f = filesetext(readfile, s[4]); + sprintf(cmd, "EDIT '%s';\nRUN find '%s';\n", f, s[0]); + } + exit(cmd); + return; +} + + +void show_no_contact(void) { + int sel_onlypac, sel_nopac; + dlgDialog(argv[0]) { + dlgHBoxLayout { + dlgVBoxLayout { + dlgLabel("Devices without Contacts"); + dlgListView("Name\tValue\tPackage\tSheet", DeviceList_no_pac, sel_onlypac); + } + dlgVBoxLayout { + dlgLabel("Elements without Contacts"); + dlgListView("Name\tValue\tPackage", ElementList_only_pac, sel_nopac); + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + }; + return; +} + + +void menue(void) { + int devsel = -1, pacsel = -1; + string Error = ""; + string InfoSch, InfoBrd; + sprintf(InfoSch, "&Schematic : %d Devices", sch_cnt); + sprintf(InfoBrd, "&Board : %d Elements", brd_cnt); + checkdiff(); + if (board) checkSCHempty(); + if (schematic) checkBRDempty(); + int dif = genscript(); // generate SCRIPT + + if (cnt_nf || cnt_SCHempty || cnt_BRDempty) { + if (cnt_nf || sch_cnt != brd_cnt) { + sprintf( Error, "STOP

Different counts of parts

%5d Devices/SCH
%5d Packages/BRD

STOP
", sch_cnt, brd_cnt); + if(sch_cnt > brd_cnt) Error += "
Place Package in BRD or
delete Device in SCH
"; + else Error += "Place Device in SCH or delete Package in BRD!
"; + } + int Result = dlgDialog("Make Value Consistent") { + int sel_nf, sell = -1, ssort = -2 ,dsl = 1 , psl = 1; + dlgHBoxLayout { + dlgGridLayout { + if (Error) { + dlgCell( 0, 0) { + dlgLabel(Error); + } + if (cnt_nf) { + dlgCell( 0, 1) { + dlgVBoxLayout { + dlgLabel("To many Devices respectively Elements in Editor, see list."); + dlgLabel("&For show selected Device/Element, double-click in list"); + dlgListView("Name\tValue\tPackage\tSheet\tEditor", notfound, sel_nf) cmd_exit(notfound[sel_nf]); + } + } + } + } + else { + if (board) { + if (cnt_SCHempty) { + dlgCell( 1, 0) { + dlgVBoxLayout { + dlgLabel("Do not use empty values when use this ULP!"); + dlgLabel(" First set VALUE in SCHEMATIC "); + dlgLabel(" (double-click in list)"); + dlgStretch(1); + } + } + dlgCell( 1, 1) { + dlgVBoxLayout { + string evSch; sprintf(evSch, "%d empty &Values in Schematic!", cnt_SCHempty); + dlgLabel(evSch); + dlgListView("NAME\tValue in BRD", emptySchList, sell, ssort) setVal(emptySchList[sell]); + } + } + } + } + if (schematic) { + if (cnt_BRDempty) { + dlgCell( 1, 0) { + dlgVBoxLayout { + dlgLabel("Do not use empty values when use this ULP!"); + dlgLabel(" First set VALUE in BOARD "); + dlgLabel(" (double-click in list)"); + dlgStretch(1); + } + } + dlgCell( 1, 1) { + dlgVBoxLayout { + string evBrd; sprintf(evBrd, "%d empty &Values in Board!", cnt_BRDempty); + dlgLabel(evBrd); + dlgListView("Name\tValue in SCH", emptyBrdList, sell, ssort) setVal(emptyBrdList[sell]); + } + } + } + } + } + + dlgCell( 1, 2) { + dlgHBoxLayout { + dlgSpacing(12); + dlgPushButton("Show Device and Package without Contacts") show_no_contact(); + } + } + } + dlgStretch(1); + } + if (!command) { + dlgSpacing(8); + dlgLabel("VALUES are consistent"); + } + + dlgLabel("


"); + 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 "Draw a Microstrip Radial Stub

" + "RUN microstrip-radial-stub" + "

" + "Author: support@cadsoft.de " + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +int grid = 1; +string GridUnit[] = { "MIC", "MM", "MIL", "INCH" }; +real GridWidth[] = { 10.2, 0.0102, 0.4, 0.0004 }; // default by grid +if (board) { board(B) grid = B.grid.unit; } +if (library) { library(L) grid = L.grid.unit; } + +real width = GridWidth[grid]; +string layer = "1"; +string gridstr = ""; +real D = 0.01; +real L = 0.99; + +real angle = 30.0; // angle of Stub +int arcres = angle / 3; // resolution of angle in steps +real angle_offset = 0.0; // rotate the complete stub +int polygon = 1; // draw as polygon +real arcsinXa; +real arcsinYa; +real arcsinXe; +real arcsinYe; +real ox, oy; // offset X Y +string signame = ""; + +string cmd_draw_info = ""; +string s; +string h; +string err = " "; + +int rank = 0; +if (board) rank = 1; +string polyinit; +sprintf (polyinit, "CHANGE ORPHANS ON;\nCHANGE POUR SOLID;\nCHANGE RANK %d;\n", rank); + +real wwidth2; +real RadiusL; +real angleL; + +int test = 0; + +// ******************** Functions **************************** +string esigname(string sig) { + if (sig) sig = "'" + sig + "'"; + return sig; +} + +// ************************************************************************ +string xy_arc( real ang, real radius, real offx, real offy) { + string xy; + real rad = PI / 180 * ang; + sprintf(xy, "(%.4f %.4f)\n", + offx + (cos(rad) * radius), + offy + (sin(rad) * radius) ); + return xy; +} + +real bogenY2( real ang, real radius) { + real rad = PI / 180 * (ang/2); + return sin(rad) * radius; +} + +real bogenX( real ang, real radius) { + real rad = PI / 180 * (ang/2); + return cos(rad) * radius; +} + + +// *** +real Xneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); } +} + +real Yneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); } +} + + +real radiusY(real ang, real rry) { + real r = (rry*2) / sin(PI / 180 * ang) / 2; + return r; +} + + +string check_values(void) { + string error = ""; + wwidth2 = width/2; + RadiusL = D + L - wwidth2; + angleL = angle - (width / ((RadiusL * 2 * PI) / 360)); + arcsinXa = bogenX( angle, D) + wwidth2; + arcsinYa = bogenY2( angle, D + wwidth2) - wwidth2; + arcsinXe = arcsinXa; + arcsinYe = -arcsinYa; + if (arcsinYa < 0) { + sprintf(error, "Set D to %.4f while W %.4f < wire width %.4f", + radiusY(angle/2, wwidth2), bogenX( angle, D), width ); + } + return error; +} + + +// *** draw arc *** +string draw_arc(int draw_resol, real draw_radius, real draw_arc_degree, real draw_ang_off, real offx, real offy) { + real start_arc_degree = draw_ang_off - draw_arc_degree/2; + if (start_arc_degree < 0) start_arc_degree += 360; + real end_arc_degree = start_arc_degree + draw_arc_degree; + real arcstep = (end_arc_degree - start_arc_degree) / draw_resol; + string e; + for (real winkel = start_arc_degree; winkel < end_arc_degree + 0.0001; winkel += arcstep) { + e += xy_arc(winkel, draw_radius, offx, offy) ; + } + return e; +} + + +// ************************************************************* +void menue(void) { + dlgDialog("Radial Stub") { + dlgHBoxLayout { + dlgSpacing(150); + dlgLabel("Measures in " + GridUnit[grid] + " (Grid)"); + dlgStretch(1); + dlgGroup(" Draw as") { + dlgVBoxLayout { + dlgRadioButton("W&ire", polygon); + dlgRadioButton("&Polygon", polygon); + dlgHBoxLayout { + dlgLabel("&Width"); + dlgSpacing(15); + dlgRealEdit(width); + dlgStretch(1); + } + } + } + } + dlgHBoxLayout { + dlgLabel(cmd_draw_info, 1); + dlgGridLayout { + dlgCell( 1, 1) dlgLabel(" "); + dlgCell( 2, 1) dlgLabel("Lay&er"); + dlgCell( 2, 2) dlgStringEdit(layer); + dlgCell( 2, 3) dlgSpacing(8); + if (board) { + dlgCell( 2, 4) dlgLabel("&Signal name"); + dlgCell( 2, 5) dlgStringEdit(signame); + } + dlgCell( 6, 1) dlgLabel("&L"); + dlgCell( 6, 2) dlgRealEdit(L, 0, +1600); + dlgCell( 7, 1) dlgLabel("&D"); + dlgCell( 7, 2) dlgRealEdit(D, 0, +1600); + dlgCell( 9, 1) dlgLabel("&Angle"); + dlgCell( 9, 2) dlgRealEdit(angle, 0.0, 180.0); + dlgCell( 9, 4) dlgLabel("Angle &offset °"); + dlgCell( 9, 5) dlgRealEdit(angle_offset, 0.0, 360.0); + dlgCell( 10, 1) dlgLabel("A&rc res."); + dlgCell( 10, 2) dlgIntEdit(arcres, 6, 180); + dlgCell( 11, 2) dlgLabel(" (steps)"); + + dlgCell( 14, 4) dlgLabel("&X offset"); + dlgCell( 14, 5) dlgRealEdit(ox, -800.0, +800.0); + dlgCell( 15, 4) dlgLabel("&Y offset"); + dlgCell( 15, 5) dlgRealEdit(oy, -800.0, +800.0); + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgVBoxLayout { + dlgSpacing(50); + } + dlgLabel(err, 1); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+OK") { + err = check_values(); + if (err) { + if (dlgMessageBox(err, "Accept", "No") == 0) { + D = radiusY(angle/2, wwidth2); + err = ""; + } + else if (dlgMessageBox("Confirm (the values) ?", "Yes", "No") == 0) dlgAccept(); + } + else dlgAccept(); + } + dlgPushButton("-Cancel") { dlgReject(); exit(0); } + dlgStretch(1); + } + }; + return; +} + +// ***** Main ****** +void main(void) { + if (library) signame = ""; + menue(); + if (angle_offset) { + real nX = Xneu(arcsinXa, arcsinYa, 0, 0, angle_offset); + real nY = Yneu(arcsinXa, arcsinYa, 0, 0, angle_offset); + arcsinXa = nX; + arcsinYa = nY; + nX = Xneu(arcsinXe, arcsinYe, 0, 0, angle_offset); + nY = Yneu(arcsinXe, arcsinYe, 0, 0, angle_offset); + arcsinXe = nX; + arcsinYe = nY; + } + esigname(signame); + gridstr = GridUnit[grid]; + + sprintf(s, "SET WIRE_BEND 2;\n"); + if (gridstr) s += "GRID " + gridstr + ";\n"; + if (layer) s += "CHANGE LAYER " + layer + ";\n"; + sprintf(h, "CHANGE WIDTH %.4f;\n", width); + s += h; + if (polygon) { + s += polyinit; + sprintf(h, "POLY %s ", signame ); + } + else sprintf(h, "WIRE %s ", signame ); + s += h; + sprintf(h, " (%.4f %.4f)", arcsinXa + ox, arcsinYa + oy); // *** draw sinw *** + s += h; + sprintf(h, " (%.4f %.4f)", arcsinXe + ox, arcsinYe + oy); + s += h; + s += draw_arc(arcres, RadiusL, angleL, angle_offset, ox, oy); // *** draw arc *** + sprintf(h, " (%.4f %.4f)", arcsinXa + ox, arcsinYa +oy); + s += h; + if (gridstr) { + sprintf(h, ";\nGRID LAST;\n"); + s += h; + } + if (test) if (dlgMessageBox(s, "OK", "ESC") != 0) exit (-1); + exit (s); +} diff --git a/eagle-5.7.0/ulp/mill-outlines-bott.bmp b/eagle-5.7.0/ulp/mill-outlines-bott.bmp new file mode 100644 index 0000000..23c5901 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-bott.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-cnc.bmp b/eagle-5.7.0/ulp/mill-outlines-cnc.bmp new file mode 100644 index 0000000..00f2245 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-cnc.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-coppdim.bmp b/eagle-5.7.0/ulp/mill-outlines-coppdim.bmp new file mode 100644 index 0000000..802ff0a Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-coppdim.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-drc-info.bmp b/eagle-5.7.0/ulp/mill-outlines-drc-info.bmp new file mode 100644 index 0000000..c6566f9 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-drc-info.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-drill.bmp b/eagle-5.7.0/ulp/mill-outlines-drill.bmp new file mode 100644 index 0000000..bbf8457 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-drill.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-eagle.bmp b/eagle-5.7.0/ulp/mill-outlines-eagle.bmp new file mode 100644 index 0000000..2abf5f0 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-eagle.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-free.bmp b/eagle-5.7.0/ulp/mill-outlines-free.bmp new file mode 100644 index 0000000..515cf1f Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-free.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-hole.bmp b/eagle-5.7.0/ulp/mill-outlines-hole.bmp new file mode 100644 index 0000000..24d1c85 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-hole.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-hpgl.bmp b/eagle-5.7.0/ulp/mill-outlines-hpgl.bmp new file mode 100644 index 0000000..ab60d25 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-hpgl.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-isol-pour.bmp b/eagle-5.7.0/ulp/mill-outlines-isol-pour.bmp new file mode 100644 index 0000000..09cfd71 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-isol-pour.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-mildimension.bmp b/eagle-5.7.0/ulp/mill-outlines-mildimension.bmp new file mode 100644 index 0000000..d1562bd Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-mildimension.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-mirror.bmp b/eagle-5.7.0/ulp/mill-outlines-mirror.bmp new file mode 100644 index 0000000..a6c160c Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-mirror.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-no-blowup.bmp b/eagle-5.7.0/ulp/mill-outlines-no-blowup.bmp new file mode 100644 index 0000000..26f18cc Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-no-blowup.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-nomir.bmp b/eagle-5.7.0/ulp/mill-outlines-nomir.bmp new file mode 100644 index 0000000..b0e64b2 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-nomir.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-null_reference.bmp b/eagle-5.7.0/ulp/mill-outlines-null_reference.bmp new file mode 100644 index 0000000..e7c7559 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-null_reference.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-ovrlpfp.bmp b/eagle-5.7.0/ulp/mill-outlines-ovrlpfp.bmp new file mode 100644 index 0000000..8eb4e96 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-ovrlpfp.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-ovrlppp.bmp b/eagle-5.7.0/ulp/mill-outlines-ovrlppp.bmp new file mode 100644 index 0000000..7e85b30 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-ovrlppp.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-pour.bmp b/eagle-5.7.0/ulp/mill-outlines-pour.bmp new file mode 100644 index 0000000..09cfd71 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-pour.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-script.bmp b/eagle-5.7.0/ulp/mill-outlines-script.bmp new file mode 100644 index 0000000..a180365 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-script.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-sec-isolate.bmp b/eagle-5.7.0/ulp/mill-outlines-sec-isolate.bmp new file mode 100644 index 0000000..f5e3c14 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-sec-isolate.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-spacing.bmp b/eagle-5.7.0/ulp/mill-outlines-spacing.bmp new file mode 100644 index 0000000..a2aa8d4 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-spacing.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-top.bmp b/eagle-5.7.0/ulp/mill-outlines-top.bmp new file mode 100644 index 0000000..12d690b Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-top.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines-via.bmp b/eagle-5.7.0/ulp/mill-outlines-via.bmp new file mode 100644 index 0000000..32d66c4 Binary files /dev/null and b/eagle-5.7.0/ulp/mill-outlines-via.bmp differ diff --git a/eagle-5.7.0/ulp/mill-outlines.ulp b/eagle-5.7.0/ulp/mill-outlines.ulp new file mode 100644 index 0000000..acddaa1 --- /dev/null +++ b/eagle-5.7.0/ulp/mill-outlines.ulp @@ -0,0 +1,1689 @@ +#usage "Export milling data for a board layout\n" + "
" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED +// 08.05.2002 alf@cadsoft.de - reverse milling +// 23.06.2002 alf@cadsoft.de - Polygon:CHANGE THERMAL OFF +// 14.05.2003 alf@cadsoft.de - With REFERENCE-Drill to mirror for drilling machine +// - Switch On/Off 2. isolate/cupper pouring +// 02.09.2003 - Switch On/Off drills +// 24.04.2004 alf@cadsoft.de - String ulp_path no longer necessary +// 26.07.2006 alf@cadsoft.de - Generate separatet layer +100 +101 +102 for milling tools +// - check Polygons of Rank 6 +// - Use Rank 1 of polygon to generate real outline contour +// to milling out from holder +// - Correct Rank on all generated Polygons +// 01.08.2006 alf@cadsoft.de - Check if POLYGON placed. If Yes, check if CLASS-Clearance 0.005mm > Tool#1 +// but if problem with routet WIRE out of 0 45 90 Degree. +// Es kann vorkommen, dass durch math. Rundung der Koordinaten das Polygon +// nicht in die Isolationskanäle fliessen kann. +// 21.09.2007 alf@cadsoft.de - Berichtigung von großen Bohrungen in Packages +// 08.10.2007 alf@cadsoft.de - Fräserbreiten ab 5 micron zulassen wg. Laser +// 05.05.2008 alf@cadsoft.de - Delete von Polygon mit SHIFT und Via mit Ripup + +#require 4.16000 + +string Version = "Outlines generator for PCB milling. ULP-Version 4.1.1"; + +/* + Complete the following steps to add a new output device definition: + + 1. Add a new member to the 'enum { devScript = 1, ...' + 2. Add the new (unique!) device name to 'DeviceNames[]' + 3. Add the necessary 'case dev...' branches to + 'DeviceInit()', + 'DeviceReInit()', + 'DeviceDraw()', + 'CircleDraw()', + 'ArcDraw()' + and 'DeviceEnd()' + + 4. Add also new Tool values to + 'toolFiles()' + and 'ValueInit()' +*/ + +string DRCinfo = "Distance info:
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!

" + "Press button Reference to generate a reference Package to place
" + "refernece holes on PCB for exact mirroring the bottom side of PCB on milling machine.
" + ""; + +string infoREFERENCE = "
Generate a special package with
" + + "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).

"; + + +// +// 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("After reference package placing start the
" + + 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, "\n", PadDrill, DrillPad); + pen_assign += t; + sprintf(t, "\n", ViaDrill, DrillVia); + pen_assign += t; + sprintf(t, "\n", Contour, MillToolOutl); + pen_assign += t; + sprintf(t, "\n", BlowUp_RubOut, MillToolFree); + pen_assign += t; + sprintf(t, "\n", HoleDrill, DrillHole); + pen_assign += t; + sprintf(t, "\n", DimensionLine, DimensionMillTool); + pen_assign += t; + pen_assign += "
PadDrill:PEN %d%.1f mm
ViaDrill:PEN %d%.1f mm
Contour:PEN %d%.1f mm
BlowUp/RubOut:PEN %d%.1f mm
HoleDrill:PEN %d%.1f mm
Mill outline (Dimension):PEN %d%.1f mm
"; + 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 = "
Tool diameter for Blow-Up/Rub-Out
If value set to 0, no Blow-Up (second isolate)
and Rub-Out (free milling) is generated.
"; + } + else { + info = showpic[20]; + infotext = "Rub-Out is off!
Tool diameter for sec. isolate
If value set, Blow-Up (second isolate) is generated.
"; + } + } + else { + if (millfreeyes) { + info = showpic[19]; + infotext = "You must set value to Blow-Up."; + } + else { + info = showpic[19]; + infotext = "No blow up and Rub-Out is generated while value is set to 0."; + } // 14.05.2002 alf + } + return; +} + + +// +// Main program: +// +// get Command-Line parameter if use RUN +if (argv[1]) { + Device = argv[1]; + if (argv[2]) { + MillToolOutl = strtod(argv[2]); + if (MillToolOutl <= 0) + Fatal("Illegal diameter for milling tool #1: " + argv[2], "The diameter must be greater than zero."); + MillToolIsolate = strtod(argv[3]); + MillToolFree = strtod(argv[4]); + if (argv[4]) { + Layer = strtol(argv[5]); + sprintf(lOutl, "outmil%d", Layer); + sprintf(lOutl1, "outmil%d", Layer+1); + sprintf(lOutl2, "outmil%d", Layer+2); + + if (Layer < 0 || Layer > 16) + Fatal("Illegal layer: " + argv[5], "The layer must be one of 1..16 or 0 to use the current layer."); + + if (argv[6]) { + FileName = argv[6]; + DrillFile = argv[7]; + } + Mirror = strtod(argv[9]); + if (Mirror == 0) + Fatal("Illegal mirror value: " + argv[9], "The mirror must be -1 or 1."); + DrillPad = strtod(argv[10]); + if (DrillPad <= 0) + Fatal("Illegal diameter for Pad drill tool: " + argv[10], "The diameter must be greater than zero."); + DrillVia = strtod(argv[11]); + if (DrillVia <= 0) + Fatal("Illegal diameter for Via drill tool: " + argv[11], "The diameter must be greater than zero."); + DrillHole = strtod(argv[12]); + if (DrillHole <= 0) + Fatal("Illegal diameter for Hole drill tool: " + argv[12], "The diameter must be greater than zero."); + OverlapOutlPercent = strtol(argv[13]); + OverlapRubOut = strtol(argv[14]); + Distance_Copper_Dimension = strtod(argv[15]); + DimensionMillTool = strtod(argv[16]); + millfreeyes = strtol(argv[17]); + Holder_Spacing = strtod(argv[18]); + onlydrill = strtol(argv[19]); + generatedrills = strtol(argv[20]); + trueOutline_coordinate = (argv[21]); + } + } +} + +if (!FileName) board(B) FileName = filesetext(B.name, DefaultSuffix); +if (!DrillFile) board(B) DrillFile = filesetext(B.name, DrlDefaultSuffix); +if (Device) { + ValueInit(); + int n; + while (DeviceNames[n]) { // upper case + if (strupr(DeviceNames[n]) == strupr(Device)) { + SelectedDevice = n; + break; + } + n++; + } + if (!SelectedDevice) + Fatal("Illegal device: " + Device, "Please select one of the known devices."); +} + +if (argv[8] == PassDimensionPoly) InPassDimensionPoly = argv[8]; // generate true outlines +if (argv[8] == Pass2) InPass2 = argv[8]; +if (argv[8] == PassPour) InPassPour = argv[8]; +if (argv[8] == PassOutmill) InPassOutmill = argv[8]; + +// *** run passes *** +if ( !InPass2 && !InPassPour && !InPassOutmill && !InPassDimensionPoly) { + showpic[0] = ""; + showpic[1] = ""; + showpic[2] = ""; + showpic[3] = ""; + showpic[4] = ""; + showpic[5] = ""; + showpic[6] = ""; + showpic[7] = ""; + showpic[8] = ""; + showpic[9] = ""; + showpic[10] = ""; + showpic[11] = ""; + showpic[12] = ""; + showpic[13] = ""; + showpic[14] = ""; + showpic[15] = ""; + showpic[16] = ""; + showpic[17] = ""; + showpic[18] = ""; + showpic[19] = ""; + showpic[20] = ""; + info = showpic[10]; + infotext = DRCinfo + usage + "
"; + 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 = "Generate Layer+100 to read isolate milling,
" + + "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 = "Generate only drill file if HPGL selected."; + } + else { + infotext = ""; + } + } + dlgCell(0, 4) dlgPushButton("Pen &Assignment") { penAssign(); }; + dlgCell(1, 0) dlgLabel("&Layer"); + dlgCell(1, 1) dlgComboBox(Layers, SelectedLayer) { + if (SelectedLayer == 0) info = showpic[8]; + if (SelectedLayer == 1) info = showpic[9]; + infotext = ""; + } + dlgCell(1, 3) dlgCheckBox("&Mirror", mir) { + if (mir) { + info = showpic[12]; + infotext = "Milling BOTTOM side (set mirror)."; + Mirror = -1.0; + } + else { + info = showpic[11]; + infotext = "Milling TOP side."; + Mirror = 1.0; + } + } + dlgCell(1, 4) dlgPushButton("Refere&nce") { + info = showpic[17]; + infotext = infoREFERENCE; + setZerroReference(); + } + dlgCell(2, 0) dlgLabel("tool#&1 Isolate"); + dlgCell(2, 1) dlgRealEdit(MillToolOutl, 0.005, 10); // 08.10.2007 min. 5 micron wg. Laser + dlgCell(2, 2) dlgLabel("mm"); + dlgCell(2, 4) dlgPushButton("Isolate info") { + info = showpic[1];infotext = "Tool diameter for isolate."; + } + dlgCell(3, 0) dlgLabel("&Overlap\nisolate/blow-up"); + dlgCell(3, 1) dlgIntEdit(OverlapOutlPercent, 0, 99); + dlgCell(3, 2) dlgLabel("%"); + dlgCell(3, 4) dlgPushButton("Overlap info") { + info = showpic[2]; + infotext = "Overlap isolate - blow up in percent %."; + } + dlgCell(4, 0) dlgLabel("tool#&2 blow-up"); + dlgCell(4, 1) dlgRealEdit(MillToolFree, 0.0, 10); + dlgCell(4, 2) dlgLabel("mm"); + dlgCell(4, 3) dlgCheckBox("Rub ou&t", millfreeyes) setblowinfo(); + dlgCell(4, 4) dlgPushButton("Blow up/Rub out info") { + info = showpic[18]; + setblowinfo(); + } + dlgCell(5, 0) dlgLabel("Overlap rub-o&ut"); + dlgCell(5, 1) dlgIntEdit(OverlapRubOut, 0, 99); + dlgCell(5, 2) dlgLabel("%"); + dlgCell(5, 4) dlgPushButton("Overlap info") { + info = showpic[4]; + infotext = "Overlap rub-out diameter in percent %."; + } + dlgCell(6, 0) dlgLabel("&Pad drill"); + dlgCell(6, 1) dlgRealEdit(DrillPad, 0.005, 10); // 08.10.2007 min. 5 micron wg. Laser + dlgCell(6, 2) dlgLabel("mm"); + dlgCell(6, 3) dlgCheckBox("Gen. drills", generatedrills) { + if (generatedrills) { + infotext = "Generate drill data."; + } + else { + infotext = "Drills (PAD, VIA, HOLE) are disabled.
"; + } + } + 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 = "
Mill diameter for cut out.
Set value 0 for switch OFF this function.
"; + } + else { + infotext = "Mill diameter for cut out.
Set value for switch ON this function.
"; + } + } + dlgCell(11, 0) dlgLabel("Holder spac&ing"); + dlgCell(11, 1) dlgRealEdit(Holder_Spacing, 0.1, 500); + dlgCell(11, 2) dlgLabel("mm"); + dlgCell(11, 4) dlgPushButton("Spacing info") { + info = showpic[15]; + infotext = "This value determins the minimum length of a edge where a spacer will be set.

" + + "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("The value for Copper/Dimension " + "is greater than the mill tool (free pouring) diameter.

" + "Check/change Distance Copper/Dimension in Design Rules DRC

" + "or accept a distance of " + d + + "mm to board dimension.", + "Accept", "Cancel"); + } + } + if (SelectedDevice != devHPGL && onlydrill) { + Error("only drill (HPGL)", "used without HPGL device"); + fault = 1; + } + if (!MillToolOutl) { + Error("Illegal diameter: 0", "The Isolate diameter must be greater than zero."); + fault = 1; + } + if (!fault) { + FileName = File; + if (test) output(filesetext(B.name, "-cmd.txt"), "at"); + DrillFile = DrFile; + sprintf(lOutl, "%d", SelectedLayer + 100); + sprintf(lOutl1, "%d", SelectedLayer + 101); + sprintf(lOutl2, "%d", SelectedLayer + 102); + if (mir) Mirror = -1; + dlgAccept(); + } + } + } + dlgStretch(0); + dlgPushButton("-Cancel") { dlgReject(); exit(1); } + dlgStretch(1); + } + }; + } + Device = DeviceNames[SelectedDevice]; + Layer = strtol(Layers[SelectedLayer]); + fileerror(); + output(FileName, "wt"); // creat new file + if (fileerror()) exit (1); + output(filesetext(B.name, "_display$tmp-.scr"), "wt") { + printf("DISPLAY NONE 17 "); + board(B) { + B.layers(L) { + if (L.visible) printf("%d ",L.number); + } + } + switch (SelectedDevice) { + case devScript: + printf(" %d;\n", Layer + 100); + break; + case devHPGL: + output(filesetext(FileName,".pli"), "wt") { + printf("# Plot info generated by %s\n# from %s\n# at %s\n# Used tools\n", argv[0], B.name, t2string(time()) ); + } + break; + } + } + toolFiles(); // generate Rack and Wheel file + generateTruePolygonOutlines(); // generate the true Dimension outline as polygon. + } +} + +// *** pass runs **** + +setMillOffset(); // get info of special package if placed + +if (InPassDimensionPoly) { + GenerateOutlines(); // for milling isolate +} + +if (InPass2) { + board(B) { + real x1 = u2mm(B.area.x1) - MillToolFree/4 , y1 = u2mm(B.area.y1) - MillToolFree/2 ; + output(FileName, "at") { + DeviceInit(Contour); + switch (SelectedDevice) { + case devScript: + scriptHeader(); + output(DrillFile, "wt") { + DeviceInit(PadDrill); + WriteDrills(); + } + break; + case devHPGL: + if (generatedrills) WriteDrills(); + break; + } + printf("%s", WriteOutlines(OutlinesSignalName)); // the isolated contour + } + if (MillToolFree < 0) MillToolFree = 0.2; + real overlapfree = MillToolFree * OverlapRubOut / 100; + real overlapoutl = MillToolOutl * OverlapOutlPercent / 100; + string Cmd; + B.signals(S) { + if (S.name == OutlinesSignalName) { // 2008.05.05 + S.polygons(POL) { + POL.wires(W) { + sprintf(Cmd, "CHANGE WIDTH %.4f (%.4f %.4f);\n" + "CHANGE ISOLATe %.4f (%.4f %.4f);\n" + "RATSNEST;\n", + MillToolFree - overlapfree, u2mm(W.x1), u2mm(W.y1), + MillToolOutl + ( (overlapfree / 2 ) - overlapoutl), u2mm(W.x1), u2mm(W.y1) ); + break; + } + break; + } + break; + } + } + Cmd += RUN_pass(PassPour); + if (test) output(filesetext(B.name, "-cmd.txt"), "at") printf("%s", Cmd); + if (test) viewtest(Cmd); + exit (Cmd); + } +} + + +if (InPassPour) { + board(B) { + output(FileName, "at") { + if (SelectedDevice == devScript) printf("# 2. isolate\n"); + printf("%s", WriteOutlines( OutlinesSignalName)) ; + switch (SelectedDevice) { + case devScript: + output(DrillFile, "at") WriteHoles(); + break; + case devHPGL: + if(generatedrills) WriteHoles(); + break; + default: + DeviceEnd(); + break; + } + } + real x1 = u2mm(B.area.x1) - MillToolFree/4, y1 = u2mm(B.area.y1) - MillToolFree/2; + real x2 = u2mm(B.area.x2) + MillToolFree/4, y2 = u2mm(B.area.y2) + MillToolFree/2; + // *** delete special polygon with signal name '_OUTLINES_' *** + string Cmd; + string millout; + sprintf(Cmd, "DISPLAY NONE 17 %d;\nDELETE ", Layer); // Delete Outline Polygon + string deloutline[]; + int n = strsplit(deloutline, trueOutline_coordinate, ' '); + string s; + deloutline[1][0] = 'S'; + sprintf(s, "(%s %s;\n", deloutline[1], deloutline[2]); // 2008.05.05 delete the complete polygon with shift + Cmd += s; + // *** make virtual Net for Normal Polygon Orphan OFF *** + // *** to define real board outline of dimension layer 20 *** + Cmd += "SET WIRE_BEND 2;\n"; + sprintf(millout, "VIA '%s' (%.4f %.4f);\n", OutlineMillSignal, x1 - Distance_Copper_Dimension, y1 - Distance_Copper_Dimension); + Cmd += millout; + real distanceDimension = DimensionMillTool / 2 - Distance_Copper_Dimension; + if (distanceDimension < 0.0) { + distanceDimension = 0.001; + } + // Width = MillFree-Diameter/2 minus "Distance Copper/Dimension" + sprintf(millout, "CHANGE ISOLATE %.4f;\n", distanceDimension); + Cmd += millout; + + if (test) { // 26.07.2006 + string s; + sprintf(s, "The calculated value:\nIsolate of true outline = %.4f\n\nDimension milling tool = %.4f mm\nDistance copper dimension = %.4f", + distanceDimension, + DimensionMillTool, + Distance_Copper_Dimension); + if (dlgMessageBox(s, "OK", "Cancel") != 0) exit(0); + } + sprintf(millout, "CHANGE ORPHANS OFF;\n"); + Cmd += millout; + Cmd += "SET WIRE_BEND 0;\n"; + Cmd += "CHANGE RANK 1;\n"; // 26.07.2006 + real dimensionwidth = DimensionMillTool - 2*distanceDimension; + if (dimensionwidth < 0) dimensionwidth = 0.1; + sprintf(millout, "POLyGON '%s' %.4f (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\nRATSNEST;\n", OutlineMillSignal, dimensionwidth, + x1 - DimensionMillTool - Distance_Copper_Dimension, + y1 - DimensionMillTool - Distance_Copper_Dimension, + x2 + DimensionMillTool + Distance_Copper_Dimension, + y2 + DimensionMillTool + Distance_Copper_Dimension, + x1 - DimensionMillTool - Distance_Copper_Dimension, + y1 - DimensionMillTool - Distance_Copper_Dimension); + Cmd += millout; + Cmd += RUN_pass(PassOutmill); + if (test) output(filesetext(B.name, "-cmd.txt"), "at") printf("%s", Cmd); + if (test) viewtest(Cmd); + exit (Cmd); + } +} + +if (InPassOutmill) { + board(B) { + string Cmd; + real x1 = u2mm(B.area.x1) - DimensionMillTool/4, y1 = u2mm(B.area.y1) - MillToolFree/2, + x2 = u2mm(B.area.x2) + DimensionMillTool/4, y2 = u2mm(B.area.y2) + MillToolFree/2; + + // delete Virtual Polygon and VIA + sprintf(Cmd, "DELETE (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + x1, y1, x2, y2, x1, y1 ); + output(FileName, "at") { + if (SelectedDevice == devScript) printf("# milling dimension\n"); + printf("%s", WriteOutlines( OutlineMillSignal)) ; + } + switch (SelectedDevice) { + case devScript: + Cmd += "SCRIPT '" + FileName + "';\n"; // execute script + Cmd += "SCRIPT '" + filesetext(B.name, "_display$tmp-.scr") + "';\n"; + string s; + sprintf(s, "DISPLAY %d;\n", Layer + 101); // 26.07.2006 + Cmd += s; + sprintf(s, "DISPLAY %d;\n", Layer + 102); + Cmd += s; + break; + case devHPGL: + Cmd += "script '" + filesetext(B.name, "_display$tmp-.scr") + "';\n"; + break; + } + if (test) output(filesetext(B.name, "-cmd.txt"), "at") printf("%s", Cmd); + Cmd += "GRID LAST;\nSET UNDO_LOG ON;\nSET OPTIMIZING ON;\nWIN;\n"; + switch (SelectedDevice) { + case devScript: + break; + case devHPGL: + if (test) showHPGLinfo(); + break; + } + // if (test) showRackFile(); + if (test) viewtest(Cmd); + exit (Cmd); + } +} diff --git a/eagle-5.7.0/ulp/mirror-board.ulp b/eagle-5.7.0/ulp/mirror-board.ulp new file mode 100644 index 0000000..e623a3c --- /dev/null +++ b/eagle-5.7.0/ulp/mirror-board.ulp @@ -0,0 +1,280 @@ +#usage "Mirror board (with all Layers)

" + "Author: support@cadsoft.de" + +#require 5.0600 + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED +// Version 1.01 -- 2006-09-15 alf@cadsoft.de +// 2008-04-10 changed GROUP ... (>x y); alf@cadsoft.de +// +// Version 1.02 -- 2009-12-01 unlock and lock emlements, swap layer colors and fill alf@cadsoft.de +// check via stack for blind or micro vias + +string Version = "1.02"; +int test = 0; + +string cmd; +int lVisible[]; +int useLayer[]; +int lcolor[]; +int lfill[]; +string lNames[] = { " " }; + +string lockName[]; +int cntlock = 0; + +int maxX = INT_MIN; +int minX = INT_MAX; +int maxY = INT_MIN; +int minY = INT_MAX; +int bminx, bmaxx, bminy, bmaxy; + +int uval = 1; + +if (board) board(B) uval = B.grid.unit; +string unit[] = { "Micron", "mm", "Mil", "Inch" }; +int unitPrec[] = { 0, 1, 1, 3 }, RoundFactor = pow(10, unitPrec[uval]); + +real u2u(int v) { + switch (uval) { + case GRID_UNIT_MIC : return u2mic(v); + break; + + case GRID_UNIT_MM : return u2mm(v); + break; + + case GRID_UNIT_MIL : return u2mil(v); + break; + + case GRID_UNIT_INCH : return u2inch(v); + break; + } +} + + +void checkmaxmin(int x1, int x2, int y1, int y2) { + if (x1 > maxX) maxX = x1; + if (x2 > maxX) maxX = x2; + if (y1 > maxY) maxY = y1; + if (y2 > maxY) maxY = y2; + if (x1 < minX) minX = x1; + if (x2 < minX) minX = x2; + if (y1 < minY) minY = y1; + if (y2 < minY) minY = y2; + return; +} + +void checkarc( int x1, int x2, int y1, int y2, int xc, int yc, real angle1, real angle2, real radius) { + checkmaxmin( x1, x2, y1, y2 ); + if ( angle2 > angle1 + 270.0) { + if ( angle1 < 90 ) checkmaxmin( x1 , xc - radius, yc + radius, yc - radius ); + else if( angle1 < 180 ) checkmaxmin( xc - radius, xc + radius, y1 , yc - radius ); + else if( angle1 < 270 ) checkmaxmin( x1 , xc + radius, yc - radius, yc + radius ); + else if( angle1 < 360 ) checkmaxmin( xc + radius, xc - radius, y1 , yc + radius ); + } + else if( angle2 > angle1 + 180.0) { + if ( angle1 < 90 ) checkmaxmin( x1 , xc - radius, yc + radius, y2 ); + else if( angle1 < 180 ) checkmaxmin( x1 , xc - radius, yc - radius, y2 ); + else if( angle1 < 270 ) checkmaxmin( x1 , xc + radius, yc - radius, y2 ); + else if( angle1 < 360 ) checkmaxmin( x1 , xc + radius, yc + radius, y2 ); + } + else if( angle2 > angle1 + 90.0 ) { + if ( angle1 < 90 ) checkmaxmin( x1 , x2 , yc + radius, y2 ); + else if( angle1 < 180 ) checkmaxmin( x1 , xc - radius, y1 , y2 ); + else if( angle1 < 270 ) checkmaxmin( x1 , x2 , yc - radius, y2 ); + else if( angle1 < 360 ) checkmaxmin( x1 , xc + radius, y1 , y2 ); + } + 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)); +} + + +void lock_elements(void) { + for (int lc = 0; lc < cntlock; lc++) { + cmd += "LOCK " + lockName[lc] + ";\n"; + } + return; +} + +void setcolor(void) { + string s; + sprintf(s, "SET COLOR_LAYER 1 %d;\n", lcolor[16]); // 2009-12-01 shwap layer color and fill + cmd += s; + sprintf(s, "SET FILL_LAYER 1 %d;\n", lfill[16]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 16 %d;\n", lcolor[1]); + cmd += s; + sprintf(s, "SET FILL_LAYER 16 %d;\n", lfill[1]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 21 %d;\n", lcolor[22]); + cmd += s; + sprintf(s, "SET FILL_LAYER 21 %d;\n", lfill[22]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 22 %d;\n", lcolor[21]); + cmd += s; + sprintf(s, "SET FILL_LAYER 22 %d;\n", lfill[21]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 23 %d;\n", lcolor[24]); + cmd += s; + sprintf(s, "SET FILL_LAYER 23 %d;\n", lfill[24]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 24 %d;\n", lcolor[23]); + cmd += s; + sprintf(s, "SET FILL_LAYER 24 %d;\n", lfill[23]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 25 %d;\n", lcolor[26]); + cmd += s; + sprintf(s, "SET FILL_LAYER 25 %d;\n", lfill[26]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 26 %d;\n", lcolor[25]); + cmd += s; + sprintf(s, "SET FILL_LAYER 26 %d;\n", lfill[25]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 27 %d;\n", lcolor[28]); + cmd += s; + sprintf(s, "SET FILL_LAYER 27 %d;\n", lfill[28]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 28 %d;\n", lcolor[27]); + cmd += s; + sprintf(s, "SET FILL_LAYER 28 %d;\n", lfill[27]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 29 %d;\n", lcolor[30]); + cmd += s; + sprintf(s, "SET FILL_LAYER 29 %d;\n", lfill[30]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 30 %d;\n", lcolor[29]); + cmd += s; + sprintf(s, "SET FILL_LAYER 30 %d;\n", lfill[29]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 31 %d;\n", lcolor[32]); + cmd += s; + sprintf(s, "SET FILL_LAYER 31 %d;\n", lfill[32]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 32 %d;\n", lcolor[31]); + cmd += s; + sprintf(s, "SET FILL_LAYER 32 %d;\n", lfill[31]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 51 %d;\n", lcolor[52]); + cmd += s; + sprintf(s, "SET FILL_LAYER 51 %d;\n", lfill[52]); + cmd += s; + sprintf(s, "SET COLOR_LAYER 52 %d;\n", lcolor[51]); + cmd += s; + sprintf(s, "SET FILL_LAYER 52 %d;\n", lfill[51]); + cmd += s; + return; +} + +int checkVia(UL_VIA V) { + if (V.start != 1 || V.end != 16) return 1; + return 0; +} + +// main +if (board) { + board(B) { + int verror = 0; + B.signals(S) S.vias(V) verror += checkVia(V); + if (verror) { + dlgMessageBox("!Do not use this ULP if used blind or micro via(s)!", "OK"); + exit(-1); + } + bminx = B.area.x1; + bmaxx = B.area.x2; + bminy = B.area.y1; + bmaxy = B.area.y2; + B.layers(L) { + lNames[L.number] = L.name; + lVisible[L.number] = L.visible; + useLayer[L.number] = L.used; + lcolor[L.number] = L.color; + lfill[L.number] = L.fill; + } + B.wires(W) { + if (W.layer == 20) { + 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); + } + else { + checkmaxmin( W.x1, W.x2, W.y1, W.y2 ); + } + } + } + B.circles(C) { + if (C.layer == 20) { + checkmaxmin( C.x - C.radius, C.x + C.radius, C.y - C.radius, C.y + C.radius ); + } + } + B.elements(E) { + E.package.wires(W) { + if (W.layer == 20) { + // *** Dimension in Packages *** + 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); + } + else { + checkmaxmin( W.x1, W.x2, W.y1, W.y2 ); + } + } + } + E.package.circles(C) { + if (C.layer == 20) { + checkmaxmin( C.x - C.radius, C.x + C.radius, C.y - C.radius, C.y + C.radius ); + } + } + } + string s; + sprintf(s, "DISPLAY ALL;\n"); + cmd += s; + sprintf(s, "GROUP ALL;\n"); + cmd += s; + cmd += "LOCK (>S 0 0);\n"; // unlock all 2009-11-01 + + sprintf(s, "GRID FINEST;\nMIRROR (>%.4f %.4f);\nGRID LAST;\n", + (u2u(maxX) + u2u(minX)) / 2, u2u(minY) ); + cmd += s; + cmd += "DISPLAY NONE "; + for(int l = 1; l < 256; l++) { + if (lNames[l]) { // Layer defined + if (lVisible[l]) { + if (l == 1 || l == 16 || l == 21 || l == 22 || l == 23 || l == 24 || l == 25 || l == 26 || l == 27 || l == 28 || l == 29 || l == 30 || l == 31 || l == 32 || l == 51 || l == 52 ) { + if (l == 1) sprintf(s, " %d", 16); // 2009-12-01 shwap visible layers + else if (l == 16) sprintf(s, " %d", 1); + else if (l == 21) sprintf(s, " %d", 22); + else if (l == 22) sprintf(s, " %d", 21); + else if (l == 23) sprintf(s, " %d", 24); + else if (l == 24) sprintf(s, " %d", 23); + else if (l == 25) sprintf(s, " %d", 26); + else if (l == 26) sprintf(s, " %d", 25); + else if (l == 27) sprintf(s, " %d", 28); + else if (l == 28) sprintf(s, " %d", 27); + else if (l == 29) sprintf(s, " %d", 30); + else if (l == 30) sprintf(s, " %d", 29); + else if (l == 31) sprintf(s, " %d", 32); + else if (l == 32) sprintf(s, " %d", 31); + else if (l == 51) sprintf(s, " %d", 52); + else if (l == 52) sprintf(s, " %d", 51); + } + else sprintf(s, " %d", l); + cmd += s; + } + } + } + cmd += ";\n"; + B.elements(E) if (E.locked) cmd += "LOCK " + E.name + ";\n"; // 2009-12-01 + setcolor(); + } +} + +if (test) dlgDialog("Test") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("ok") dlgAccept(); + dlgPushButton("esc") { dlgReject(); exit(-1); } + } +}; +exit(cmd); \ No newline at end of file diff --git a/eagle-5.7.0/ulp/mount-trace.ulp b/eagle-5.7.0/ulp/mount-trace.ulp new file mode 100644 index 0000000..ee96746 --- /dev/null +++ b/eagle-5.7.0/ulp/mount-trace.ulp @@ -0,0 +1,251 @@ +#usage "MOUNT TRACE shows all parts on the top layer with the same values of a board for manual assembling.

" + "RUN mount-trace (this help page)
" + "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.)

" + "Tip: Define function key(s) with ASSIGN for easier use of this ULP.

" + "Author: support@cadsoft.de" + +string Hilfe = "MOUNT RRACE zeigt alle Bauteile auf der Top-Seite mit gleichem Value für manuelles Bestücken.

" + + "RUN mount-trace (diese Hilfeseite)
" + + "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.)

" + + "Tip: Setzen Sie sich Funktionstasten [ASSIGN] mit den Optionen für eine einfachere Bedienung.

" + + "Author: support@cadsoft.de"; + +#require 5.0300; + +string Version = "Version 1.20"; // 2006-04-27 + // 2008-04-10 changed GROUP ... (>x y); alf@cadsoft.de + // 2008-11-03 correct SHOW comand Version 5.x + +numeric string nshow[], nvalue[]; +int cnt; +int lcnt; +string empty = "~/empty/~"; + +int optshow = 0; // Only board. Option to manually placing 2006.04.25 +int optmirror = 0; // Only board- Option to mirror the complete board + // to see the Bottom side of Top +string mirrorext = "-~~mirror"; // file extension if Board mirrored + +string traceext = "~~trace.trc"; +string tracefile = "~~trace.cnt"; +string fname, mname, ftrace; +string cmd; + + +void test(void) { + dlgDialog("test") { + int sel = 0; + dlgListView("Element", nshow, sel); + dlgPushButton("+OK") dlgAccept(); + }; + return; +} + + +void add_list(string name, string value) { + if (!value) { + string s; + sprintf(s, "!Element %s has no value.
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("Board ist gespiegelt! Siehe Dateiname.
Möchten Sie das nicht-gespiegelte Board laden?
", "JA", "NEIN") != 0) exit(0); + set_trace_zero(); + sprintf(cmd, "EDIT '%s.brd';\nDISPLAY NONE 21 -23 25 27;\n", strsub(mname, 0, pos)); + exit(cmd); + } + else { + if (dlgMessageBox("Board is mirrored! See file name.
Do you want load the non-mirrored board?
", "YES", "NO") != 0) exit(0); + } + set_trace_zero(); + sprintf(cmd, "EDIT '%s';\nDISPLAY NONE 21 -23 25 27;\n", mname); + exit(cmd); + } + else { + fname = filesetext(mname, mirrorext+".brd"); + string f[]; + int cnt = fileglob(f, fname); + if (cnt) { + set_trace_zero(); + sprintf(cmd, "EDIT '%s';\nDISPLAY NONE 21 -23 25 27;\n", fname); + } + else { + if (language() == "de") { + if (dlgMessageBox("
Das Board wird mit der Namenserweiteung " + mirrorext + " gespiegelt gespeichert!", "OK" , "ABBRUCH") != 0) exit(0); + } + else { + if (dlgMessageBox("Save board with extended name " + mirrorext + "!", "OK" , "CANCEL") != 0) exit(0); + } + set_trace_zero(); + sprintf(cmd, "WRITE '%s';\nEDIT '%s';\n" + + "DISPLAY ALL;\n" + + "GRID MM;\n" + + "GROUP (-800 -800) (800 -800) (800 800) (-800 800) (>-800 -800);\n" + + "MIRROR (> 0 0);\n" + + "WIN FIT;\n" + + "DISPLAY NONE 21 -23 25 27;\nWRITE;\nRUN '%s' -L;\n", fname, fname, argv[0]); + } + exit(cmd); + } +} + + + +if (board) { + board(B) { + mname = B.name; + fname = filesetext(B.name, traceext); + ftrace = filesetext(B.name, tracefile); + } + if (!argv[1]) { + if (language() == "de") { + dlgMessageBox(Hilfe + Version, "OK"); + } + else { + dlgMessageBox(usage + Version, "OK"); + } + exit(0); + } + if (argv[1] == "-M") opt_Mirror(); // Mirror option + if (argv[1] == "-L") generate_list(); + checkfile(); + read(); + if (argv[1] == "+") traceplus(); + if (argv[1] == "-") traceminus(); + if (argv[1] == "0") { + set_trace_zero(); + exit(";"); // view nothing + } + if (argv[1] == "++") { + set_trace_zero(); + traceplus(); + } +} + +else dlgMessageBox("!Start this ULP from a Board", "OK"); \ No newline at end of file diff --git a/eagle-5.7.0/ulp/mount.ulp b/eagle-5.7.0/ulp/mount.ulp new file mode 100644 index 0000000..8990f4e --- /dev/null +++ b/eagle-5.7.0/ulp/mount.ulp @@ -0,0 +1,50 @@ +#usage "Data generation for mounting machines\n" + "

" + "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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (board) board(B) { + + // Get filename + string fileName = dlgFileSave("Save File", filesetext(B.name, ".mnt"), "*.mnt"); + if (fileName == "") exit(0); + + output(fileName) { + + B.elements(E) { + + int xmax =-2147483648, + xmin = 2147483647, + ymax = xmax, + ymin = xmin; + + E.package.contacts(C) { + + if (C.x > xmax) xmax = C.x; + if (C.y > ymax) ymax = C.y; + if (C.x < xmin) xmin = C.x; + if (C.y < ymin) ymin = C.y; } + + + printf("%s;%5.0f;%5.0f;%3.0f;%s \n", + E.value, u2mil((xmin + xmax)/2), u2mil((ymin + ymax)/2), + E.angle, E.name ); + } + } +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/mountsmd.ulp b/eagle-5.7.0/ulp/mountsmd.ulp new file mode 100644 index 0000000..ba68bad --- /dev/null +++ b/eagle-5.7.0/ulp/mountsmd.ulp @@ -0,0 +1,92 @@ +#usage "Data generation for mounting machines\n" + "

" + "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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (board) board(B) { + + // Get filename + string fileName = dlgFileSave("Save File", filesetext(B.name, ".mnt"), "*.mnt"); + if (fileName == "") exit(0); + + output(fileName) { + + B.elements(E) { + + int wasSmd, + xmax =-2147483648, + xmin = 2147483647, + ymax = xmax, + ymin = xmin; + + wasSmd = 0; + + E.package.contacts(C) { + if (C.smd && C.smd.layer == 1) { + wasSmd = 1; + + if (C.x > xmax) xmax = C.x; + if (C.y > ymax) ymax = C.y; + if (C.x < xmin) xmin = C.x; + if (C.y < ymin) ymin = C.y; + } + } + + if (wasSmd) + printf("%s %5.2f %5.2f %3.0f %s %s\n", + E.name, u2mm((xmin + xmax)/2), u2mm((ymin + ymax)/2), + E.angle, E.value, E.package.name); + } + } + + // Get filename + fileName = dlgFileSave("Save File", filesetext(B.name, ".mnb"), "*.mnb"); + if (fileName == "") exit(0); + + output(fileName) { + + B.elements(E) { + + int wasSmd, + xmax =-2147483648, + xmin = 2147483647, + ymax = xmax, + ymin = xmin; + + wasSmd = 0; + + E.package.contacts(C) { + if (C.smd && C.smd.layer == 16) { + wasSmd = 1; + + if (C.x > xmax) xmax = C.x; + if (C.y > ymax) ymax = C.y; + if (C.x < xmin) xmin = C.x; + if (C.y < ymin) ymin = C.y; + } + } + + if (wasSmd) + printf("%s %5.2f %5.2f %3.0f %s %s\n", + E.name, u2mm((xmin + xmax)/2), u2mm((ymin + ymax)/2), + E.angle, E.value, E.package.name); + } + } +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/nextdevdescript.ulp b/eagle-5.7.0/ulp/nextdevdescript.ulp new file mode 100644 index 0000000..78508fb --- /dev/null +++ b/eagle-5.7.0/ulp/nextdevdescript.ulp @@ -0,0 +1,43 @@ +#usage "Edit next device description\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string edit = ""; +int count = 0; +int n = 0; + +if (library) library(L) { + L.devicesets(D) { + count++; + dev[count] = D.name; + cmd += D.name + "\n"; + } + } + +if (deviceset) deviceset(D) { + edit = D.name; + } + +for (n = 1; n < count; n++) { + if (edit == dev[n]) { + break; + } + } + +if (n < count) { + cmd = "EDIT " + dev[n + 1] + ".dev;\n DESCRIPT\n" ; + // ************************************************** + // a ";" must not follow DESCRIPT + // otherwise the description is overwritten + // with an empty string + // ************************************************** + + } +else + cmd = "EDIT " + dev[1] + ".dev;\n DESCRIPT\n" ; + +exit(cmd); diff --git a/eagle-5.7.0/ulp/nextpacdescript.ulp b/eagle-5.7.0/ulp/nextpacdescript.ulp new file mode 100644 index 0000000..61011dc --- /dev/null +++ b/eagle-5.7.0/ulp/nextpacdescript.ulp @@ -0,0 +1,44 @@ +#usage "Edit next package description\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string pac[]; +string edit = ""; +int count = 0; +int n = 0; + +if (library) library(L) { + L.packages(P) { + count++; + pac[count] = P.name; + cmd += P.name + "\n"; + } + } + +if (package) package(P) { + edit = P.name; + } + +for (n = 1; n < count; n++) { + if (edit == pac[n]) { + // dlgMessageBox(dev[n+1], "+Ok", "-Cancel"); + break; + } + } + +if (n < count) { + cmd = "EDIT " + pac[n + 1] + ".pac;\n DESCRIPT\n" ; + // ************************************************** + // a ";" must not follow DESCRIPT + // otherwise the description is overwritten + // with an empty string + // ************************************************** + + } +else + cmd = "EDIT " + pac[1] + ".pac;\n DESCRIPT\n" ; + +exit(cmd); diff --git a/eagle-5.7.0/ulp/normalize-text.ulp b/eagle-5.7.0/ulp/normalize-text.ulp new file mode 100644 index 0000000..628720a --- /dev/null +++ b/eagle-5.7.0/ulp/normalize-text.ulp @@ -0,0 +1,245 @@ +#usage "Normalize silkscreen text sizes


\n" + "

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.

" + "Author: Tennessee Carmel-Veilleux (veilleux@ameth.org)" + +/**************************************************************************************** +* * +* Normalize silkscreen text sizes * +* * +* Filename: normalize-text.ulp * +* Version: 1.0 * +* Author: Tennessee Carmel-Veilleux * +* Date: March 31st 2005 * +* Company: Entreprises Ten Tech * +* * * +* 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. * +* * +****************************************************************************************/ + +#require 5.0300; + +string VERSION = "1.1"; // 2008-11-07 alf@cadsoft.de + +int result = 0; // Dialog result + +string str; // Temporary string +string cmd = "SET UNDO_LOG OFF;\n"; // Script command to execute +real text_size = 40.0; // Text size for all texts +real text_thickness = 8.0; // Text thickness for all texts +int text_ratio; // Calculated text ratio + +int silk_screen_layers[] = {LAYER_TPLACE, LAYER_BPLACE, LAYER_TNAMES, + LAYER_BNAMES, LAYER_TVALUES, LAYER_BVALUES, + LAYER_TDOCU, LAYER_BDOCU, 125, 126 }; + // 2008-11-07 Layer 125, 126 is created by panalize.ulp. + +enum {UNIT_MIL, UNIT_MM}; +int units = UNIT_MM; +int lastunit = units; +text_size = 1.0; +text_thickness = 0.1; + +int visibleLayer[]; +int actualvisible = 0; + + +/* ------------- UTILITY FUNCTIONS --------------- */ + +// +// Redisplays the layers that were visible when the ULP was started +// + +void ResetVisible(UL_BOARD B) { + sprintf(str, "DISP NONE;\nDISP "); + cmd += str; + B.layers(L) { + if (L.visible) { + sprintf(str, "%d ", L.number); + cmd += str; + } + } + cmd += ";\n"; +} + +// +// Returns 1 if a layer is a silkscreen layer +// + +int SilkScreenText(int layer) { + int i = 0; + int found = 0; + do { // 2008-11-07 + if (layer == silk_screen_layers[i]) { + found = 1; + if (actualvisible != layer) { // display only the layer with text to change + // in a script can not select texts by thew same coodiante + sprintf(str, "DISPLAY NONE %d;\n", layer); + cmd += str; + } + break; + } + i++; + } while(silk_screen_layers[i]); + + return found; +} + +// +// Resizes a text element to the specified size and ratio +// +void ResizeText(UL_TEXT T, real size, int ratio) { + if (SilkScreenText(T.layer)) { + switch (units) { + case UNIT_MIL: + sprintf(str,"CHANGE SIZE %.4f (%.4f %.4f);\nCHANGE RATIO %d (%.4f %.4f);\n", + size, u2mil(T.x), u2mil(T.y), ratio, u2mil(T.x), u2mil(T.y)); + break; + case UNIT_MM: + sprintf(str,"CHANGE SIZE %.4f (%.4f %.4f);\nCHANGE RATIO %d (%.4f %.4f);\n", + size, u2mm(T.x), u2mm(T.y), ratio, u2mm(T.x), u2mm(T.y)); + break; + } + cmd += str; + } +} + +// +// Smashes all parts that have an associated package on the board and resize +// all text to SIZE and RATIO. +// +void ProcessTexts(real size, int ratio) { + // Display the origins of components + switch (units) { + case UNIT_MIL: + sprintf(str,"GRID MIL 1;\n"); + break; + case UNIT_MM: + sprintf(str,"GRID MM 0.1;\n"); + break; + } + cmd += str; + + cmd += "DISPLAY NONE 23 24;\n"; + + board(B) { + B.elements(E) { + if (E.package) { + // Smash the package to make sure text is CHANGE-able + sprintf(str,"SMASH %s;\n", E.name); + cmd += str; + // Change smashed texts + E.texts(T) { + ResizeText(T, size, ratio); + } + + // Change unsmashed texts + E.package.texts(T) { + ResizeText(T, size, ratio); + } + } + } + + // Change all manually-added texts + B.texts(T) { + ResizeText(T, size, ratio); + } + + ResetVisible(B); + } + cmd += "GRID LAST;\nSET UNDO_LOG ON;\n"; +} + +/* ------------- MAIN ROUTINE --------------- */ +if (board) { + int actsize; + result = dlgDialog("Normalize silkscreen text sizes") { + sprintf(str,"

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.

", VERSION); + dlgLabel(str); + + // Options + dlgHBoxLayout { + dlgGroup("Output units") { + dlgRadioButton("m&il",units) { + if (lastunit != units) { + actsize = text_size*10000; // 2008-11-07 calculate the value in changed unit + text_size = u2mil(actsize); + actsize = text_thickness*10000; + text_thickness = u2mil(actsize); + lastunit = units; + } + } + dlgRadioButton("&mm",units) { + if (lastunit != units) { + actsize = text_size*(1/39.3701)*10000; + text_size = u2mm(actsize); + actsize = text_thickness*(1/39.3701)*10000; + text_thickness = u2mm(actsize); + lastunit = units; + } + } + } + dlgSpacing(20); + dlgGridLayout { + dlgCell(0,0) dlgLabel("Text size:"); + dlgCell(0,1) dlgRealEdit(text_size,0.1,2000.0); + + + dlgCell(1,0) dlgLabel("Text Thickness:"); + dlgCell(1,1) dlgRealEdit(text_thickness,0.01,500.0); + } + } + + // Buttons + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+Normalize") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + + if (!result) exit(0); + + text_ratio = int(round((text_thickness / text_size) * 100.0)) + 1; + if (text_ratio > 31) { + text_ratio = 31; + dlgMessageBox("!

Ratio clipped to 31 !

"+ + "

Make sure that text thickness is not too large for proper ratio.

"); + } + if (units == UNIT_MM) { + if (text_size > 5.0) { + text_size = 5.0; + dlgMessageBox("!

Text size clipped to 5.0mm !

"); + } + } + ProcessTexts(text_size, text_ratio); + + + // EditBox + result = dlgDialog("Edit and execute script") { + dlgHBoxLayout { + dlgSpacing(500); // Force width of dialog to 500 + } + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + + // Execute script if it was accepted + if (!result) + exit(0); + else + exit(cmd); +} else { + dlgMessageBox(":You must run this ULP in board !"); + exit(1); +} \ No newline at end of file diff --git a/eagle-5.7.0/ulp/outlines.ulp b/eagle-5.7.0/ulp/outlines.ulp new file mode 100644 index 0000000..bf86c78 --- /dev/null +++ b/eagle-5.7.0/ulp/outlines.ulp @@ -0,0 +1,430 @@ +#require 4.1105 + +#usage "en: Export outlines data\n" + "

" + "Generates outlines data for a board layout." + "

" + "Usage: RUN outlines [ device [ width [ layer [ filename ]]]]" + "

" + "" + "" + "" + "" + "" + "
device:Script | HPGL
width:outlines width [mm]
layer:1..16 (0 = active layer)
filename:output file name
" + "

" + "Author: support@cadsoft.de", + "de: Konturdaten exportieren\n" + "

" + "Erzeugt Konturdaten für ein Platinenlayout." + "

" + "Aufruf: RUN outlines [ device [ width [ layer [ filename ]]]]" + "

" + "" + "" + "" + "" + "" + "
device:Script | HPGL
width:Breite der Konturlinien [mm]
layer:1..16 (0 = aktiver Layer)
filename:Ausgabedatei
" + "

" + "Autor: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* + Complete the following steps to add a new output device definition: + + 1. Add a new member to the 'enum { devScript = 1, ...' + 2. Add the new (unique!) device name to 'DeviceNames[]' + 3. Add the necessary 'case dev...' branches to 'DeviceInit()', 'DeviceDraw()' and 'DeviceEnd()' +*/ + +string I18N[] = { + "en\v" + "de\v" + , + "ERROR: \v" + "FEHLER: \v" + , + "No board!\v" + "Kein Board!\v" + , + "This program can only work in the board editor.\v" + "Dieses Programm kann nur im Board-Editor angewendet werden.\v" + , + "Illegal width: \v" + "Ungültige Breite: \v" + , + "The width must be greater than zero.\v" + "Die Breite muß größer als 0 sein.\v" + , + "Illegal layer: \v" + "Ungültiger Layer: \v" + , + "The layer must be one of 1..16 or 0 to use the current layer.\v" + "Der Layer muß im Bereich 1..16 liegen, oder 0 sein um den aktuellen Layer zu wählen.\v" + , + "Select a device\v" + "Wählen Sie ein Ausgabegerät\v" + , + "There is already a signal named \v" + "Es existiert bereits ein Signal namens \v" + , + " in this board!\v" + " in diesem Board!\v" + , + "Please make sure that there is no such signal in this board.\v" + "Bitte sorgen Sie dafür, daß es kein solches Signal in diesem Board gibt.\v" + , + "Illegal device: \v" + "Ungültiges Ausgabegerät: \v" + , + "Please select one of the known devices.\v" + "Bitte wählen Sie eines der bekannten Ausgabegeräte aus.\v" + , + "No signal layer active!\v" + "Kein Signal-Layer aktiv!\v" + , + "Please activate the signal layer to generate outlines for.\v" + "Bitte aktivieren den Signal-Layer für den Konturdaten generiert werden sollen.\v" + , + "Invalid layer: \v" + "Ungültiger Layer: \v" + , + "The layer was not found or is not active.\v" + "Der Layer konnte nicht gefunden werden oder ist nicht aktiv.\v" + , + "Outlines Generator\v" + "Konturdaten-Generator\v" + , + "&Width\v" + "&Breite\v" + , + "&Layer\v" + "&Layer\v" + , + "&Output file\v" + "&Ausgabedatei\v" + , + "&Browse\v" + "&Durchsuchen\v" + , + "Save Outlines file\v" + "Konturdaten speichern\v" + , + "+OK\v" + "+OK\v" + , + "No device selected!\v" + "Kein Ausgabegerät ausgewählt!\v" + , + "Please select a device.\v" + "Bitte wählen Sie ein Ausgabegerät.\v" + , + "Illegal width: 0\v" + "Ungültige Breite: 0\v" + , + "The width must be greater than zero.\v" + "Die Breite muß größer als Null sein.\v" + , + "-Cancel\v" + "-Abbrechen\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; +} + +void Fatal(string Message, string Details) +{ + dlgMessageBox(usage + "


" + tr("ERROR: ") + Message + "

\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! " + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +#require 4.1106; + +// 6.12.2004 Text with Spin-Flag support@cadsoft.de +// 28.06.2006 accept Sigle-Quote on end of name of element support@cadsoft.de + +int offset = 100; +string tcolor = "yellow"; +string bcolor = "magenta"; +int used_name_layers[]; +string used_name_[]; + +string cmd_header; +string cmd = "\nSET UNDO_LOG OFF;\nGRID MIL;\n"; // advisable for speed reasons +string h; + +string check_single_quote(string s) { // 2006.06.28 + int l = strlen(s); + if (s[l-1] == '\'') s+="'"; + return s; +} + +void test(void) { + string txt = "Used Layers for >NAME\n"; + for (int n = 0; n < 256; n++) { + if(used_name_layers[n]) { + sprintf(h, "Layer %3d count %d\t%s\n", n, used_name_layers[n], used_name_[n]); + txt += h; + } + } + if (dlgMessageBox(txt, "OK", "Cancel") != 0) exit(-1); + return; +} + +void header(void) { + for (int n = 0; n < 256; n++) { + if(used_name_layers[n]) { + sprintf(h, "layer %d _%s;\n", n + offset, used_name_[n]); + cmd_header += h; + if (n & 1) sprintf(h, "set color_layer %d %s;\n", n + offset, tcolor); + else sprintf(h, "set color_layer %d %s;\n", n + offset, bcolor); + cmd_header += h; + } + } +} + +void Text(string Ename, int Tlayer, int Tx, int Ty, int Tsize, real Tangle, int Tratio, int Tmirror, int Tspin) { + sprintf(h, "Change Layer %d;\n", Tlayer + offset); + cmd += h; + sprintf(h, "Change Size %5.3f;\n", u2mil(Tsize)); + cmd += h; + sprintf(h, "Change Ratio %d;\n", Tratio); + cmd += h; + string mirr, spin; + if (Tmirror) mirr = "M"; + else mirr = ""; + if (Tspin) spin = "S"; + else spin = ""; + sprintf(h, "Text '%s' %s%sR%.1f (%5.3f %5.3f);\n", check_single_quote(Ename), spin, mirr, Tangle, u2mil(Tx), u2mil(Ty)); + cmd += h; + return; +} + + + +if (board) { + board(B) { + B.layers(L) { + used_name_[L.number] = L.name; + } + header(); + B.elements(E) { // smashed texts + E.texts(T) { + if (T.value == E.name) { + used_name_layers[T.layer]++; + Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, T.mirror, T.spin); + } + } + E.package.texts(T) { // unsmashed texts + if (T.value == E.name) { + used_name_layers[T.layer]++; + Text(E.name, T.layer, T.x, T.y, T.size, T.angle, T.ratio, T.mirror, T.spin); + } + } + } + } + // test(); + + cmd += "SET UNDO_LOG ON;\nGRID LAST;\n"; + header(); + cmd_header += cmd; + cmd = cmd_header; + + // EditBox + int Result = dlgDialog("Descriptions") { + dlgHBoxLayout { + dlgVBoxLayout { dlgSpacing(500); } + dlgTextEdit(cmd); + } + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgSpacing(100); + dlgPushButton("-Cancel") dlgReject(); + } + }; + if (Result == 0) exit(0); + exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/part2html.ulp b/eagle-5.7.0/ulp/part2html.ulp new file mode 100644 index 0000000..545c993 --- /dev/null +++ b/eagle-5.7.0/ulp/part2html.ulp @@ -0,0 +1,58 @@ +#usage "Export an HTML partlist\n" + "

" + "Generates an HTML file of a board's partlist for publishing on an intranet." + "

" + "Author: Sean D. Alcorn (SYD)
Extended by support@cadsoft.de
" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +if (board) board(B) { + string fileName = dlgFileSave("Save File", filesetext(B.name, ".htm"), "*.htm"); + if (fileName == "") exit(0); + output(fileName) { + printf("\n\n"); + printf("\n"); + printf("\n"); + printf("\n"); + printf("Parts Listing for %s\n", B.name); + printf("\n\n"); + printf("\n\n"); + printf("

Parts List for

\n\n"); + printf("

%s

\n", B.name); + printf("
\n\n"); + printf("
\n"); + printf("

Parts Listing

\n"); + printf("
\n"); + printf("
\n\n"); + printf("\n"); + printf(" \n"); + printf(" \n"); + printf(" \n"); + printf(" \n"); + printf(" \n"); + printf(" \n"); + + B.elements(E) { + + printf(" \n"); + printf("\n", E.name); + printf("\n", E.value); + printf("\n", E.package.name); + printf("\n", E.package.library); + printf(" \n"); + } + printf("
PartValuePackageLibrary
%s%s%s%s
\n"); + printf("
\n\n"); + printf("

\n\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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string edit = ""; +int count = 0; +int n = 0; + +if (library) library(L) { + L.devicesets(D) { + count++; + dev[count] = D.name; + cmd += D.name + "\n"; + } + } + +if (deviceset) deviceset(D) { + edit = D.name; + } + +for (n = 1; n < count; n++) { + if (edit == dev[n]) { + break; + } + } + +if (n > 1) { + cmd = "EDIT " + dev[n - 1] + ".dev; DESCRIPT\n" ; + // ************************************************** + // a ";" must not follow DESCRIPT + // otherwise the description is overwritten + // with an empty string + // ************************************************** + } +else + cmd = "EDIT " + dev[1] + ".dev; DESCRIPT\n" ; + +exit(cmd); diff --git a/eagle-5.7.0/ulp/prevpacdescript.ulp b/eagle-5.7.0/ulp/prevpacdescript.ulp new file mode 100644 index 0000000..002cb43 --- /dev/null +++ b/eagle-5.7.0/ulp/prevpacdescript.ulp @@ -0,0 +1,43 @@ +#usage "Edit previous package description\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string pac[]; +string edit = ""; +int count = 0; +int n = 0; + +if (library) library(L) { + L.packages(P) { + count++; + pac[count] = P.name; + cmd += P.name + "\n"; + } + } + +if (package) package(P) { + edit = P.name; + } + +for (n = 1; n < count; n++) { + if (edit == pac[n]) { + break; + } + } + +if (n > 1) { + cmd = "EDIT " + pac[n - 1] + ".pac;\n DESCRIPT\n" ; + // ************************************************** + // a ";" must not follow DESCRIPT + // otherwise the description is overwritten + // with an empty string + // ************************************************** + } + +else + cmd = "EDIT " + pac[0] + ".pac;\n DESCRIPT\n" ; + +exit(cmd); diff --git a/eagle-5.7.0/ulp/print-inductor.ulp b/eagle-5.7.0/ulp/print-inductor.ulp new file mode 100644 index 0000000..e8b09f7 --- /dev/null +++ b/eagle-5.7.0/ulp/print-inductor.ulp @@ -0,0 +1,587 @@ +#usage "This ULP calculates and place a coil with and with out ferrit kernel.

" + "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
" + " -- 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.
" + "Author: support@cadsoft.de,
"; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESSED OR IMPLIED. + + +// **************----- german description -------------*************** +string deHelp = + "Dieses ULP berechnet eine Spiralspule mit oder ohne Ferritkern.

" + + "Dieses ULP kann in der Libary ebenso wie im Board benutzt werden.
" + + "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.
" + + "Author: support@cadsoft.de,
"; + +string Help = usage; + +if (language() == "de") Help = deHelp; + +// 05.06.2002 alf@cadsoft.de +// 24.01.2005 alf@cadsoft.de + +// *** all Parameter generated in MM *** +// parameter section + +real n = 9.0; // turns +real wireWidth_mm = 0.2; // track width +real wireDistance_mm = 0.3; // min. distance between tracks +real distance_e = 0.3; // distance first wound to Ferrit +real PVdiameter = 0.5; // pad/via diameter +real PVdrill = 0.4; // drill diameter +real ferrit_length_L = 5.5; +real ferrit_length_K = 2.0; +real ferrit_length_K1 = 2.0; +real distance_h = 5.3; +real offx = 0.0; +real offy = 0.0; +int Layer = 1; +string Shape = "ROUND"; // Pad/Via shape do not change !!! +string solderpoint = ""; +string dimlayer = ";\nChange Layer 20;\n"; + +int undo_off_on = 1; +string file; + +real ferrit_old_L = ferrit_length_L; +real ferrit_old_K = ferrit_length_K; +real ferrit_old_K1 = ferrit_length_K1; // with of outher ferrit kernel + +int arcresolution = 10; // Arc resolution +real turn_degree = 90; +int degree_resol = turn_degree / arcresolution; // *** Degree° resolution + +string Spiral_H = ""; +string cmd = ""; +string s; +int cflag = 0; +int fullturn = 0; // Flag + +// ********* functions ******************************* +void show(string s) { + dlgDialog("Show CMD") { + dlgHBoxLayout dlgSpacing(300); + dlgHBoxLayout { + dlgVBoxLayout { + dlgSpacing(500); + } + dlgTextEdit(s); + } + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") { dlgReject(); exit(0); } + dlgStretch(1); + } + }; + return; +} + +// *** calculate arc coordinate *** +string xyArc(real angle, real radiusx, real radiusy, real offsetx, real offsety) { + string tmp; + real rad = PI / 180 * angle; + sprintf(tmp, "(%.4f %.4f)\n", + cos(rad) * radiusx + offsetx, + sin(rad) * radiusy + offsety ); + return tmp; +} + +// *** interpolate arc coodinates from startarc to endarc *** +string spiral(real sRadius, real eRadius, real startArc, real endArc, real aresolution, real ox, real oy ) { + string e = ""; + if (startArc > endArc) { dlgMessageBox("Start ARC > End ARC", "OK"); return ""; } + real stepangle = aresolution; // (endArc - startArc) / aresolution; + real ellips = 0; + if (aresolution) ellips = (eRadius - sRadius) / ((endArc - startArc) / aresolution); + int step = 0; + for (real angle = startArc; angle <= endArc; angle += stepangle) { + e += xyArc(angle, sRadius + ellips * step, sRadius + ellips * step, ox, oy); + step++; + } + if (angle != endArc) { + step--; + e += xyArc(endArc, sRadius + ellips * step, sRadius + ellips * step, ox, oy); + } + return e + "\n"; +} + + + // place a Pad (Via) on startpoint +string PadViaS(string command, real x1, real y1, real angle, real g, real ox, real oy) { + real p = x1 + (wireWidth_mm / 2) - (PVdiameter / 2); // + sprintf( s, "%s %s", command, xyArc(angle, p, 0.0, ox, oy) ); + return s; +} + + + // place a Pad (Via) on endpoint +string PadViaE(string command, real x1, real y1, real angle, real g, real ox, real oy) { + real pRadius = y1 + ((x1 - y1) / 180 * g) + (PVdiameter / 2) - (wireWidth_mm / 2) ; + sprintf( s, "%s %s", solderpoint, xyArc(angle, pRadius, pRadius, ox, oy) ); + return s; +} + + + +void doit(void) { + real Ndist = (wireDistance_mm + wireWidth_mm ) ; // distance ARC to ARC + int fullwind = trunc(n); // count of full turns + real lastwind = n - fullwind; // reminder Turn + real startarc = 0; + real endarc = 360; + real startRadius = distance_e + Ndist; + real endRadius = startRadius + Ndist; + real sArc; + real eArc; + // script header + if (!undo_off_on) cmd += "SET UNDO_LOG OFF;\n"; + sprintf( s, "GRID mm;\n"); + cmd += s; + sprintf( s, "Change dia %.4f;\n", PVdiameter); + cmd += s; + sprintf( s, "Change shape %s;\n", Shape); + cmd += s; + sprintf( s, "Change drill %.4f;\n", PVdrill); + cmd += s; + sprintf( s, "change width %.4f;\n", wireWidth_mm); + cmd += s; + sprintf( s, "Change layer %d;\n", Layer); + cmd += s; + cmd += "SET WIRE_BEND 2;\n"; + + // **** Long coil with Ferrit kernel ********** + if (PVdiameter < wireWidth_mm) PVdiameter = wireWidth_mm; + real startradius = distance_e + wireWidth_mm/2; + real radius = startradius; + real ky = ferrit_length_K/2; + real kx1 = ferrit_length_L/2 + (distance_e + PVdiameter - wireWidth_mm/2 - startradius); + real kx2 = -ferrit_length_L/2; + + if (ferrit_length_L || ferrit_length_K) { + // *** place PAD/VIA *************************** + cmd += PadViaS( solderpoint, kx1 + radius, 0.0, kx1 + radius, ky, offx, offy); + cmd += PadViaS( ";WIRE ", kx1 + radius, 0.0, kx1 + radius, ky, offx, offy); + sprintf( s, " (%.4f %.4f) (%.4f %.4f)\n", + kx1 + radius + offx, 0.0 + offy, kx1 + radius + offx, ky + offy); // rechts anfang + cmd += s; + + for (int q = 1; q <= fullwind; q++) { + sprintf( s, ";WIRE (%.4f %.4f) (%.4f %.4f)\n", // right start + kx1 + radius + offx, 0.0 + offy, kx1 + radius + offx, ky + offy); + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, 0.0, 90.0, degree_resol, kx1 + offx, ky + offy ); + sprintf( s, ";WIRE (%.4f %.4f) (%.4f %.4f)\n", // top + kx1 + offx, ky + radius + offy, kx2 + offx, ky + radius + offy); + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, 90.0, 180.0, degree_resol, kx2 + offx, ky + offy ); + sprintf( s, ";WIRE (%.4f %.4f) (%.4f %.4f)\n", // left + kx2 - radius + offx, ky + offy, kx2 - radius + offx, -ky + offy); + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, 180.0, 270.0, degree_resol, kx2 + offx, -ky + offy ); + sprintf( s, ";WIRE (%.4f %.4f) (%.4f %.4f)\n", // bottom + kx2 + offx, -ky - radius + offy, kx1 + Ndist + offx, -ky - radius + offy); + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, 270.0, 360.0, degree_resol, kx1 + Ndist + offx, -ky + offy ); + sprintf( s, ";WIRE (%.4f %.4f) (%.4f %.4f)\n", // right end + kx1 + radius + Ndist + offx, -ky + offy, kx1 + radius + Ndist + offx, 0.0 + offy ); + cmd += s; + radius += Ndist; + } + // **************************************** + // **** if last wound < 360 degree ******** + eArc = 360 * lastwind; + real lastStartArc = 0;; + real lastEndArc = 90.0; + real lastPadViaX = kx1; + real lastPadViaY = ky; + if (eArc) { + // *** 0 - 90 degree ******************************************************** + if (eArc < 90) { + lastEndArc = eArc; + } + sprintf( s, ";\nWIRE (%.4f %.4f) (%.4f %.4f)\n", + kx1 + radius + offx, 0.0 + offy, kx1 + radius + offx, ky + offy); // rechts anfang + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, lastStartArc, lastEndArc, degree_resol, kx1 + offx, ky + offy ); + // *** 90 - 180 degree ******************************************************** + if (eArc > 90 ) { + lastStartArc = 90;; + lastEndArc = 180; + lastPadViaX = kx2; + lastPadViaY = ky; + if (eArc < 180) { + lastEndArc = eArc; + } + sprintf( s, ";\nWIRE (%.4f %.4f) (%.4f %.4f)\n", + kx1 + offx, ky + radius + offy, kx2 + offx, ky + radius + offy); // oben + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, lastStartArc, lastEndArc, degree_resol, kx2 + offx, ky + offy ); + } + // *** 180 - 270 degree ******************************************************** + if (eArc > 180) { + lastStartArc = 180;; + lastEndArc = 270; + lastPadViaX = kx2; + lastPadViaY = -ky; + sprintf( s, ";\nWIRE (%.4f %.4f) (%.4f %.4f)\n", + kx2 - radius + offx, ky + offy, kx2 - radius + offx, -ky + offy); // links + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, lastStartArc, lastEndArc, degree_resol, kx2 + offx, -ky + offy ); + } + sprintf( s, ";\nWIRE (%.4f %.4f) (%.4f %.4f)\n", + kx2 + offx, -ky - radius + offy, kx1 + Ndist + offx, -ky - radius + offy); // unten + + // *** 270 - 359.9 degree ******************************************************** + if (eArc > 270) { + lastStartArc = 270; + lastEndArc = eArc; + lastPadViaX = kx1 + Ndist; + lastPadViaY = -ky; + cmd += s; + cmd += ";\nWIRE " + spiral(radius, radius, lastStartArc, lastEndArc, degree_resol, kx1 + Ndist + offx, -ky + offy ); + } + // *** set PAD/VIA to end of coil *** + cmd += xyArc(lastEndArc, radius + PVdiameter / 2 - wireWidth_mm / 2, radius + PVdiameter / 2 - wireWidth_mm / 2, lastPadViaX + offx, lastPadViaY + offy); + cmd += solderpoint + xyArc(lastEndArc, radius + PVdiameter / 2 - wireWidth_mm / 2, radius + PVdiameter / 2 - wireWidth_mm / 2, lastPadViaX + offx, lastPadViaY + offy); + } + // *********************************************** + // *** place PAD/VIA to end of full turn coil **** + else { + sprintf( s, "\n(%.4f %.4f)\n", + kx1 + radius + PVdiameter / 2 - wireWidth_mm / 2 + offx, 0.0 + offy ); // rechts ende + cmd += s; + sprintf( s, ";\n%s (%.4f %.4f)\n", solderpoint, + kx1 + radius + PVdiameter / 2 - wireWidth_mm / 2 + offx, 0.0 + offy ); // rechts ende + cmd += s; + + } + // **** Ferrit kernel dimesion **** + cmd += dimlayer; + cmd += "SET WIRE_BEND 0;\n"; + sprintf( s, "WIRE 0 (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + -ferrit_length_L/2 + offx, -ferrit_length_K/2 + offy, + ferrit_length_L/2 + offx, -ferrit_length_K/2 + offy, + ferrit_length_L/2 + offx, ferrit_length_K/2 + offy, + -ferrit_length_L/2 + offx, ferrit_length_K/2 + offy, + -ferrit_length_L/2 + offx, -ferrit_length_K/2 + offy ); + cmd += s; + sprintf( s, "WIRE (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + -ferrit_length_L/2 + offx, -ferrit_length_K/2 - distance_h + offy, + ferrit_length_L/2 + offx, -ferrit_length_K/2 - distance_h + offy - ferrit_length_K1, + -ferrit_length_L/2 + offx, -ferrit_length_K/2 - distance_h + offy ); + cmd += s; + sprintf( s, "WIRE (%.4f %.4f) (%.4f %.4f) (%.4f %.4f);\n", + ferrit_length_L/2 + offx, ferrit_length_K/2 + distance_h + offy, + -ferrit_length_L/2 + offx, ferrit_length_K/2 + distance_h + offy + ferrit_length_K1, + ferrit_length_L/2 + offx, ferrit_length_K/2 + distance_h + offy ); + + cmd += s; + cmd += "WINDOW FIT;\n"; + } + // ************************************** + // **** Rounded coil without Ferrit **** + else { + cmd += PadViaS( solderpoint, distance_e + Ndist, Ndist, 0, 0, offx, offy); + if (wireWidth_mm < PVdiameter) { + cmd += PadViaS( ";WIRE ", distance_e + Ndist, Ndist, 0, 0, offx, offy); + } + else cmd += ";WIRE "; + // *** full turns *** + sArc = startarc; + eArc = endarc; + degree_resol = 90 / arcresolution ; // *** ° angle-resolution + for (int x = 1; x <= fullwind; x++) { + cmd += spiral( startRadius, endRadius, sArc, eArc, degree_resol, offx, offy ) + ";WIRE "; + startRadius = endRadius; + endRadius = startRadius + Ndist; + } + // *** last turn < 360 degtee *** + eArc = 360 * lastwind; + if (eArc) { + endRadius = startRadius + Ndist * lastwind; + cmd += spiral( startRadius, endRadius, sArc, eArc, degree_resol, offx, offy ); + } + if (!lastwind) endRadius -= Ndist; + cmd += ";WIRE " + xyArc(eArc, endRadius, endRadius, offx, offy); + cmd += xyArc(eArc, endRadius + PVdiameter / 2 - wireWidth_mm / 2, endRadius + PVdiameter / 2 - wireWidth_mm / 2, offx, offy); + cmd += solderpoint + xyArc(eArc, endRadius + PVdiameter / 2 - wireWidth_mm / 2, endRadius + PVdiameter / 2 - wireWidth_mm / 2, offx, offy); + } + sprintf( s, ";\nWIN (%.3f %.3f);\n", offx, offy); + cmd += s; + output(file, "wtD") printf("%s", cmd); + sprintf(cmd, "SCRIPT '%s';", file); + exit (cmd); +} + +// *** calculate turns *** +real calcturn(int sw) { + real turn = (distance_h - 2*distance_e - wireWidth_mm) / (wireWidth_mm + wireDistance_mm) + 1; + real full = trunc(turn); + real partial = turn - full; + if(sw) { + if (partial > 0.0001) { + turn = full + 1; + } + } + return turn; +} + + +// **** calculatings *********************** +void calculates(int cf) { + switch (cf) { + case 0 : n = calcturn(fullturn); + break; + + case 1 : wireWidth_mm = (distance_h - 2 * distance_e - wireDistance_mm * (n-1)) / n; + break; + + case 2 : wireDistance_mm = (distance_h - 2 * distance_e - wireWidth_mm * n) / (n-1); + break; + + case 3 : distance_h = 2 * distance_e + wireWidth_mm + ((wireWidth_mm + wireDistance_mm) * (n-1)); + break; + } + return; +} + +real check_calculates(int cf) { + real cw; + switch (cf) { + case 0 : cw = calcturn(fullturn); + break; + + case 1 : cw = (distance_h - 2 * distance_e - wireDistance_mm * (n-1)) / n; + break; + + case 2 : cw = (distance_h - 2 * distance_e - wireWidth_mm * n) / (n-1); + break; + + case 3 : cw = 2 * distance_e + wireWidth_mm + ((wireWidth_mm + wireDistance_mm) * (n-1)); + break; + } + return cw; +} + +void set_spiral(void) { + ferrit_old_L = ferrit_length_L; + ferrit_old_K = ferrit_length_K; + ferrit_old_K1 = ferrit_length_K1; + ferrit_length_K1 = ferrit_length_K = ferrit_length_L = 0; + Spiral_H = ""; + return; +} + +void set_inductor(void) { + ferrit_length_L = ferrit_old_L; + ferrit_length_K = ferrit_old_K; + ferrit_length_K1 = ferrit_old_K1; + Spiral_H = ""; + return; +} + + +// *** main *** +if (board) { + board(B) file = filesetext(B.name, ".scr"); + solderpoint = ";\nVIA "; +} +else if (package) { + library(L) file = filesetext(L.name, ".scr"); + solderpoint = ";\nPAD "; +} +else { + dlgMessageBox("Start this ULP in a Board- or Package-Editor!", "OK"); + exit(0); +} + +if (!ferrit_length_K && !ferrit_length_L) set_spiral(); + +// ************ DIALOG ******************************** +dlgDialog(filename(argv[0])) { + dlgHBoxLayout { + dlgVBoxLayout { + dlgLabel(" All measures in mm "); + dlgLabel(Spiral_H, 1); + dlgHBoxLayout { + dlgPushButton("with Fe&rrit") set_inductor(); + dlgPushButton("only S&piral") set_spiral(); + dlgSpacing(12); + dlgGroup("UNDO Buffer") { + dlgHBoxLayout { + dlgRadioButton(" Off", undo_off_on); // UNDO Buffer off/on + dlgRadioButton(" On", undo_off_on); // UNDO Buffer off/on + } + } + dlgStretch(1); + } + dlgStretch(1); + } + dlgVBoxLayout { + dlgGridLayout { + dlgCell(1, 2) dlgLabel("Arc resolution"); + dlgCell(2, 1) dlgLabel("Steps at &90°"); // Step at 90 Degree + dlgCell(2, 2) dlgIntEdit(arcresolution, 1, 90); + + dlgCell(3, 1) dlgSpacing(10); + + dlgCell(4, 1) dlgLabel("Tur&ns"); // number of turns (Wound) + dlgCell(4, 2) dlgRealEdit(n, 1.0, 100.0); + + dlgCell(5, 1) dlgLabel("Width '&w'"); // track width + dlgCell(5, 2) dlgRealEdit(wireWidth_mm, 0.01, 25.0); + + dlgCell(6, 1) dlgLabel("Distance '&d'"); // track distance + dlgCell(6, 2) dlgRealEdit(wireDistance_mm, 0.0, 25.0); + + dlgCell(7, 1) dlgSpacing(10); + + dlgCell(8, 1) dlgLabel("Distance '&e'"); // distance between ferrit kernel an wound + dlgCell(8, 2) dlgRealEdit(distance_e, 0.0, 25.0); + + dlgCell(9, 1) dlgLabel("Via/Pad Dia&meter"); // pad/via diameter + dlgCell(9, 2) dlgRealEdit(PVdiameter, 0.01, 10.0); + dlgCell(10, 1) dlgLabel("&Via/Pad Drill"); // drill diameter + dlgCell(10, 2) dlgRealEdit(PVdrill, 0.05, 10.0); + dlgCell(11, 1) dlgLabel("L&ayer"); // Layer number + dlgCell(11, 2) dlgIntEdit(Layer, 1, 255); + + dlgCell(13, 1) dlgSpacing(8); + + dlgCell(14, 2) dlgLabel("Ferrit"); + + dlgCell(15, 1) dlgLabel("Distance '&h'"); // distance between ferrit kernel + dlgCell(15, 2) dlgRealEdit(distance_h, 0.0, 25.0); + + dlgCell(16, 1) dlgLabel("Length '&L'"); // Ferrit lenth + dlgCell(16, 2) dlgRealEdit(ferrit_length_L, 0.0, 200.0); + + dlgCell(17, 1) dlgLabel("Width '&K'"); // Ferrit width + dlgCell(17, 2) dlgRealEdit(ferrit_length_K, 0.0, 200.0); + + dlgCell(18, 1) dlgLabel("Width 'K&1'"); // Ferrit width + dlgCell(18, 2) dlgRealEdit(ferrit_length_K1, 0.0, 200.0); + + dlgCell(19, 2) dlgLabel("Center/offset"); + + dlgCell(20, 1) dlgLabel("&X"); // place with offset X + dlgCell(20, 2) dlgRealEdit( offx, -800.0, 800.0 ); + dlgCell(21, 1) dlgLabel("&Y"); // place with offset Y + dlgCell(21, 2) dlgRealEdit( offy, -800.0, 800.0 ); + + } + dlgStretch(1); + } + dlgSpacing(8); + dlgVBoxLayout { + dlgSpacing(10); + dlgGroup("Calculate") { + // dlgSpacing(2); + dlgCheckBox("&Full turns", fullturn); // calculate full turns + // dlgSpacing(2); + dlgRadioButton("T&urns", cflag); + dlgSpacing(4); + dlgRadioButton("W&idth", cflag); + dlgSpacing(4); + dlgRadioButton("Di&st. d", cflag); + dlgSpacing(130); + dlgRadioButton("Dis&t. h", cflag); + dlgSpacing(16); + dlgPushButton("&Calculate") calculates(cflag); + } + + dlgStretch(1); + } + } + dlgHBoxLayout { + dlgPushButton("OK") { + int ok = 1; + if (PVdiameter > wireWidth_mm + wireDistance_mm + distance_e) { + sprintf(s, "Invalid Parameter:

Pad/Via-Diameter %.f mm > Distance 'e' + 'w' + 'd' %.f mm", + PVdiameter, wireWidth_mm + wireDistance_mm + distance_e); + dlgMessageBox(s, "OK"); + ok = 0; + } + if (PVdrill > wireWidth_mm + wireDistance_mm + distance_e) { + sprintf(s, "Invalid Parameter:

Pad/Via-Drill %.f mm > Distance 'e' + 'w' + 'd' %.f mm", + PVdrill, wireWidth_mm + wireDistance_mm + distance_e); + dlgMessageBox(s, "OK"); + ok = 0; + } + + if (ferrit_length_L && ferrit_length_K) { + ok = 0; + if (distance_h) { + real check_h = (distance_e * 2 + wireWidth_mm * calcturn(1) + wireDistance_mm * (calcturn(1)-1) ); + real check_diff = distance_h - check_h; + if (check_diff < -0.0001) { + sprintf(s, " Invalid Parameter:


%.4f mm 'e' + ('d'+'w'*n)
%.4f mm distance 'h'

%.4f mm difference at %.f full turns (%.1f turns)", + check_h, distance_h, check_diff, calcturn(1), n ); + if (dlgMessageBox(s, "Cancel", "Accept" ) == 0); + else ok = 1; + } + else { + ok = 1; + } + } + if (distance_h < check_calculates(3)) { + sprintf(s, "Invalid Parameter:

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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd = ""; +string dev[]; +string sym[]; +string pac[]; +string edit = ""; +int scount = 0; +int dcount = 0; +int pcount = 0; +int n = 0; + +if (library) library(L) { + L.devicesets(D) { + dcount++; + dev[dcount] = D.name; + } + L.symbols(S) { + scount++; + sym[scount] = S.name; + } + L.packages(P) { + pcount++; + pac[pcount] = P.name; + } + + if (deviceset) deviceset(D) { + edit = D.name; + cmd = "REMOVE " + D.name + ";\n" ; + + for (n = 1; n < dcount; n++) { + if (edit == dev[n]) { + break; + } + } + + if (n < dcount) { + cmd += "EDIT " + dev[n + 1] + ".dev;\n" ; + } + else { + if (dcount > 0) { + cmd += "EDIT " + dev[n - 1] + ".dev;\n" ; + } + else exit (0); + } + } + if (symbol) symbol(S) { + edit = S.name; + cmd = "REMOVE " + S.name + ";\n" ; + + for (n = 1; n < scount; n++) { + if (edit == sym[n]) { + break; + } + } + + if (n < scount) { + cmd += "EDIT " + sym[n + 1] + ".sym;\n" ; + } + else { + if (scount > 0) { + cmd += "EDIT " + sym[n - 1] + ".sym;\n" ; + } + else exit (0); + } + } + if (package) package(P) { + edit = P.name; + cmd = "REMOVE " + P.name + ";\n" ; + + for (n = 1; n < pcount; n++) { + if (edit == pac[n]) { + break; + } + } + + if (n < dcount) { + cmd += "EDIT " + pac[n + 1] + ".pac;\n" ; + } + else { + if (pcount > 0) { + cmd += "EDIT " + pac[n - 1] + ".pac;\n" ; + } + else exit (0); + } + } + exit(cmd); + } diff --git a/eagle-5.7.0/ulp/rename-signal.ulp b/eagle-5.7.0/ulp/rename-signal.ulp new file mode 100644 index 0000000..fbf292c --- /dev/null +++ b/eagle-5.7.0/ulp/rename-signal.ulp @@ -0,0 +1,43 @@ +#usage "Rename SIGNALSs in a board with Suffix

" + "RUN rename-signals [suffix]
" + "Author: support@cadsoft.de"; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESSED OR IMPLIED. + + +string Version = "Version 1.1"; // check if schematic editor window open + +string fileName; + +string suffix = argv[1]; + +// ### Functions ### + + +if (project.schematic) { + dlgMessageBox(argv[0]+ "\n" + Version + "\nFirst close the schematic editor!", "OK"); + exit(-1); +} + +// ** MAIN ** +if (board) { + board(B) { + fileName = filesetext(B.name, "rename-signal-suffix~~~.scr"); + int cntsig = 0; + output(fileName, "wtD") { + printf("# 'This file is generated by %s, exported from;\n", Version); + printf("# '%s at %s;\n", fileName, t2string(time())); + printf("# '%s;\n\n", EAGLE_SIGNATURE); + B.signals(S) { + S.contactrefs(C) { + printf("SIGNAL 'S$S_0%d%s' %s %s;\n", cntsig, suffix, C.element.name, C.contact.name); + cntsig++; + break; + } + } + } + exit ("SCRIPT '" + fileName + "';"); + } +} +else dlgMessageBox("Start this ULP in Board!", "OK"); diff --git a/eagle-5.7.0/ulp/renamnet-suffix.ulp b/eagle-5.7.0/ulp/renamnet-suffix.ulp new file mode 100644 index 0000000..2509d6a --- /dev/null +++ b/eagle-5.7.0/ulp/renamnet-suffix.ulp @@ -0,0 +1,122 @@ +#usage "Rename NETs in a schematic with NET name suffix

" + "Author: support@cadsoft.de"; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESSED OR IMPLIED. + +string Help = + "Wird ein Netz umbenannt, dass aus mehreren Segmenten besteht,\n" + + "bzw. auf mehrere Sheets verteilt ist, muss die Abfrage:\n" + + " Change Name of:\n" + + " This Segment\n" + + " Every Segment on this Sheet\n" + + " All Segments on all Sheets\n\n" + + "immer mit 'Every Segment on this Sheet' bzw.\n" + + "'All Segments on all Sheets' beantwortet werden.\n\n"; + + + +string Version = "Version 1.0"; + + // ********************************************* +string Suffix = ""; // **** Anhang an den Netznamen, **** + // **** kann nach belieben geändert werden. **** + // ********************************************* + +real Grid = 100; // in 100 Mil + + +int index[]; +int s = 0, pg = 0; + +numeric string n[]; // P.name; + int is[]; // I.sheet; + int ix[]; + int iy[]; + +string fileName; + +// ### Functions ### +void setgridmil (void) { + printf("GRID mil 100;\n"); + return; +} + +void editsheet(int i) { + if (s != is[i]) { // Sheet wechseln + s = is[i]; + printf("EDIT .S%d;\n",s); + } + return; +} + +void namescript(void) { + for (int i = 0; i < pg; i++) { + editsheet(i); // ** Change Sheet + printf("NAME '%s%s' (%.2f %.2f);\n", n[i], Suffix, u2mil(ix[i]), u2mil(iy[i])); + } + return; +} + +int found (string f) +{ + for (int i = 0; i < pg; i++) { + if (n[i] == f) return i; + } + return -1; +} + +// ** MAIN ** +if (schematic) { + schematic(SCH) { + fileName = filesetext(SCH.name, "renamenet-suffix~~~.scr"); + + int Result = dlgDialog("Rename NET in Schematic") { + dlgLabel(Help); + dlgHBoxLayout { + dlgLabel("Net &suffix"); + dlgStringEdit(Suffix); + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgStretch(1); + } + }; + if (!Result) exit(0); + + output(fileName, "wtD") { + + printf("# 'This file is generated by %s, exported from;\n", Version); + printf("# '%s at %s;\n", SCH.name, t2string(time())); + printf("# '%s;\n\n", EAGLE_SIGNATURE); + setgridmil(); + printf("DISPLAY NONE 91;\n"); + + // collect all Nets + SCH.sheets(SH) { + SH.nets(N) { + N.segments(SEG) { + SEG.wires(W) { + n[pg] = N.name; + ix[pg] = W.x1; + iy[pg] = W.y1; + is[pg] = SH.number; + if (found(n[pg]) == -1) pg++; + break; + } + break; + } + } + } + namescript(); + + printf("GRID INCH;\n"); + printf("GRID 0.1;\n"); + printf("DISPLAY ALL -93;\n"); + } + exit ("SCRIPT '" + fileName + "';"); + } +} +else dlgMessageBox("Start this ULP in Schematic!", "OK"); diff --git a/eagle-5.7.0/ulp/renumber-sch.ulp b/eagle-5.7.0/ulp/renumber-sch.ulp new file mode 100644 index 0000000..9ac728d --- /dev/null +++ b/eagle-5.7.0/ulp/renumber-sch.ulp @@ -0,0 +1,363 @@ +#usage "Renumber the parts of a schematic\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Info = "ATTENTION

\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).
" + "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 ...
" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string Version = "ULP Version 4.3.0"; // 2006.08.23 alf@cadsoft.de + // correct counter if crossing page by same prefix + +string Info = "ATTENTION

\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])
" + + " 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, "
More parts with prefix '%s' than starting point %d on sheet %d
Start the ulp with numerical order >= %d
", + memprefix, numerical_order, sh[i[n]], numerical_order*10); + dlgMessageBox(h, "Break"); + exit(0); + } + } + } + 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. + + string ScratchName; + int sch = 0; + int n; + for ( 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; + } + sprintf( ScratchName, "$%d_%d_$", sch, n); + Rename(x[i[n]],y[i[n]], ScratchName); + } + for ( 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; + } + Rename(x[i[n]],y[i[n]], NewNames[i[n]]); + } + return; +} + +// *** check collision before 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 is a $ on Symbolname + error += "# Do not use $ character at first position in device names\n"; + sprintf(h, "# RENAME %s at (%.2f %.2f) - sheet %d before running 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 of symbol name and device name (eg. Frames, Supply ...)\n"; + sprintf(h, "# Rename PREFIX of Device %s at (%.2f %.2f) - sheet %d before renaming %s at (%.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 + // ## at 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); + } + dlgSpacing(8); + dlgGroup("Do not renumber parts with") { + dlgHBoxLayout { + dlgLabel("&Prefix "); + dlgStringEdit(NoRenumber); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgGroup("Sheet") { + dlgLabel("Start numbering for sheet at:"); + dlgLabel(" - 0 numeration R1...Rn"); + dlgLabel(" - 100 sheet 1: R101..R199, sheet 2: R201..R299, ..."); + dlgLabel(" - 1000 sheet 1: R1001..R1999, sheet 2: R2001..R2999, ..."); + dlgSpacing(10); + dlgHBoxLayout { + dlgLabel("&Numerical order "); + dlgIntEdit(numerical_order, 0, 10000); + dlgStretch(1); + } + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+&OK") dlgAccept(); + dlgSpacing(15); + dlgPushButton("-&Cancel") dlgReject(); + dlgSpacing(15); + dlgLabel(Version); + dlgStretch(1); + } + }; + if (!Result) exit (0); + return ; +} + +if (schematic) { + schematic(S) { + menue(); + int l = 1; + int chk; + S.sheets(SH) { + SH.parts(P) { + int n = GetNumberIndex(P.name); + if (n > 0) { + + if (P.device.package) { // **** only Devices with Packages + // **** without Supply symbol Frames ect... + + // **** DO NOT RENUMBER Elements with this PREFIX + if (prefix(P.name) == NoRenumber); + + else { + 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; + Prefix[nrNames] = prefix(P.name); + ++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; + } + } + } + P.instances(I) { + ckx[chk] = u2mil(I.x); // cannot use E.x/y directly because of + cky[chk] = u2mil(I.y); // sort() problem with integers > 32767 + ckname[chk] = I.name; + cksh[chk] = I.sheet; + chk++; + } + } + } + + CheckSameOrigin(chk); + 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); + + string fname = filesetext(S.name, "~renumsch.scr"); + output(fname, "wtD") printf("%s", cmd); + exit ("SCRIPT '" + fname + "';"); + } +} + +else { + dlgMessageBox("\n Start this ULP in a Schematic \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/run-loop-all-devicesets-script.ulp b/eagle-5.7.0/ulp/run-loop-all-devicesets-script.ulp new file mode 100644 index 0000000..7df72a1 --- /dev/null +++ b/eagle-5.7.0/ulp/run-loop-all-devicesets-script.ulp @@ -0,0 +1,21 @@ +#usage "Run a SCRIPT through all devicesets in a library

\n" + "RUN run-loop-all-devicesets-script [SCRIPT]
" + "Author: librarian@cadsoft.de

" + +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.

" + "Author: librarian@cadsoft.de

" + +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.

" + "Author: support@cadsoft.de

" + +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]
" + "Author: librarian@cadsoft.de

" + +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]
" + "Author: librarian@cadsoft.de

" + +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 script must conform to the following syntax:
" + "ATTRIBUTE name 'value'
" + "ATTRIBUTE name DELETE

" + "The words may be separated by one single space character only.
" + "In case the value DELETE is used, the attribute will be deleted.

" + "Value must be included in two single quotes, otherwise special " + "characters, like + - space can cause error messages in the script file.
" + "If there is no value given or this attribute is already defined in the Device Set " + "the attribute remains unchanged.

" + "Author: librarian@cadsoft.de

" + , + "de:Startet ein SCRIPT um in allen Devicesets (Technologien) in einer Bibliothek ATTRIBUTE zu definieren.

\n" + "RUN set-all-devices-attribute [SCRIPT]
" + "Das Script muß nach folgenden Regeln erstellt sein:
" + "ATTRIBUTE Name 'Wert'
" + "ATTRIBUTE Name DELETE

" + "Die Wörter dürfen mit nur einem Leerzeichen (Space) getrennt sein.
" + "Ist der Wert DELETE zugewiesen, wird das Attribute gelöscht

" + "Der Wert muß in zwei Apostrophen eingeschlossen sein, da es sonst bei " + "Sonderzeichen + - Space etc. im erzeugten Script zu Fehlermeldungen kommen kann.
" + "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.

" + "Author: librarian@cadsoft.de

" + +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:

Highlights all net with a given CLASS.

\n" + "This ULPs works from within a board or a schematic.
" + "

Author: alf@cadsoft.de", + "de:

Hebt Signale der gegebenen CLASS hervor.

\n" + "Dieses ULP arbeitet aus Boards oder Schematics heraus.
" + "

Author: alf@cadsoft.de" + +#require 5.0300 + +string strTexts[] = { + "en\v" + "de\v" + , + ";This ULP requires a board or a schematic.\v" + ";Dieses Ulp funktioniert nur in Boards und Schematics.\v" + , + "Please type in the CLASS you want to highlight.\v" + "Geben Sie dei hervorzuhebende CLASS ein.\v" + , + ";No Nets/Signals found with CLASS \"%s\".\v" + ";Es wurden keine Signale der CLASS \"%s\" gefunden.\v" +}; + +string strMessage; +string strScript, s; +int nCount; +string strValue; + +/*** functions ***/ +string Translate(string src) { + string strLoc = lookup(strTexts, src, strstr(strTexts[0], language()) / 3, '\v'); + return((strLoc != "") ? strLoc : src); +} + +string InputBox(string strPrompt, string strTitle, string strDefault) { + string strReturn = strDefault; + int nResult = dlgDialog(strTitle) { + dlgGridLayout { + dlgCell(1, 0) dlgStringEdit(strReturn); + dlgCell(0, 0) dlgHBoxLayout { + dlgLabel(strPrompt); + dlgSpacing(20); + dlgVBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("Cancel") dlgReject(); + } + } + } + }; + return((nResult > 0) ? strReturn : ""); +} + + +if (argv[1]) { + strValue = argv[1]; +} + + +if(board) board(B) { + if (!strValue) { + strValue = InputBox(Translate("Please type in the CLASS you want to highlight."), filename(argv[0]), B.name); + } + if(!strValue) exit(EXIT_SUCCESS); + sprintf(strScript, "WINDOW;\n SHOW "); // 2008-11-03 + B.signals(S) { + if(S.class.number == strtol(strValue)) { + sprintf(s, " %s ", S.name); + strScript += s; + ++nCount; + } + } + strScript +=" "; + + if(!nCount) { + sprintf(strMessage, Translate(";No Nets/Signals found with CLASS \"%s\"."), strValue); + dlgMessageBox(strMessage); + exit(EXIT_FAILURE); + } + else { + exit(strScript); + } +} + +else if(sheet) sheet(S) { + string strName; + schematic(SCH) { + strName = SCH.name; + } + if (!strValue) { + strValue = InputBox(Translate("Please type in the value you want to highlight."), filename(argv[0]), ""); + } + if(!strValue) exit(EXIT_SUCCESS); + + sprintf(strScript, "WINDOW;\nSHOW "); + S.nets(N) { + if(N.class.number == strtol(strValue)) { + sprintf(s, " %s", N.name); + strScript += s; + ++nCount; + } + } + strScript += " "; + if(!nCount) { + sprintf(strMessage, Translate(";No Nets/Signals found with CLASS \"%s\"."), strValue); + dlgMessageBox(strMessage); + exit(EXIT_FAILURE); + } + else { + exit(strScript); + } +} +else { + dlgMessageBox(Translate(";This ULP requires a board or a schematic.")); +} + diff --git a/eagle-5.7.0/ulp/silk.ulp b/eagle-5.7.0/ulp/silk.ulp new file mode 100644 index 0000000..ac6763c --- /dev/null +++ b/eagle-5.7.0/ulp/silk.ulp @@ -0,0 +1,172 @@ +#usage "Generate a wider silk screen\n" + "

" + "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." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + + // Define your own silk screen width here +real Silkwidth = 8.0 ; // in mil +int NewTextRatio = 16 ; // and the new text ratio + +int source, newlay, tplace = 21, + bplace = 22, + offset = 100; + +string TextOrientation; +string cmd = "SET UNDO_LOG OFF;\n"; // advisable for speed reasons +string h; + +void header(void) { + h = "";sprintf(h, "layer %d _tplace;\n", tplace+offset);cmd += h; // here you can change the new + h = "";sprintf(h, "layer %d _bplace;\n", bplace+offset);cmd += h; // layers names + h = "";sprintf(h, "set color_layer %d yellow;\n", tplace+offset);cmd += h; // and + h = "";sprintf(h, "set color_layer %d yellow;\n", bplace+offset);cmd += h; // colors + h = "";sprintf(h, "set wire_bend 2;\n");cmd += h; + h = "";sprintf(h, "\nGRID mil;\n\n");cmd += h; +} + +void searchelements(UL_ELEMENT E) { + newlay = source + offset; + E.package.wires(W) { + if (W.arc) { + if (W.layer == source && u2mil(W.width) <= Silkwidth) { + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "ARC %5.3f ccw (%5.3f %5.3f) (%5.3f %5.3f) (%5.3f %5.3f);\n", + Silkwidth, u2mil(W.arc.x1), u2mil(W.arc.y1), u2mil(2*(W.arc.xc)-W.arc.x1), + u2mil(2*(W.arc.yc) - W.arc.y1), u2mil(W.arc.x2), u2mil(W.arc.y2));cmd += h; + } + if (W.layer == source && u2mil(W.width) > Silkwidth) { + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "ARC %5.3f ccw (%5.3f %5.3f) (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mil(W.arc.width), u2mil(W.arc.x1), u2mil(W.arc.y1), u2mil(2*(W.arc.xc)-W.arc.x1), + u2mil(2*(W.arc.yc) - W.arc.y1), u2mil(W.arc.x2), u2mil(W.arc.y2));cmd += h; + } + } + else { + if (W.layer == source && u2mil(W.width) <= Silkwidth) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + Silkwidth, u2mil(W.x1), u2mil(W.y1), u2mil(W.x2), u2mil(W.y2));cmd += h; + } + if (W.layer == source && u2mil(W.width) > Silkwidth) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "WIRE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mil(W.width), u2mil(W.x1), u2mil(W.y1), u2mil(W.x2), u2mil(W.y2));cmd += h; + } + } + } + E.package.circles(C) { + if (C.layer == source && u2mil(C.width) <= Silkwidth && u2mil(C.width) != 0) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "CIRCLE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + Silkwidth, u2mil(C.x), u2mil(C.y), u2mil(C.x + C.radius), u2mil(C.y));cmd += h; + } + if (C.layer == source && (u2mil(C.width) > Silkwidth || u2mil(C.width) == 0)) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "CIRCLE %5.3f (%5.3f %5.3f) (%5.3f %5.3f);\n", + u2mil(C.width), u2mil(C.x), u2mil(C.y), u2mil(C.x + C.radius), u2mil(C.y));cmd += h; + } + } + E.package.rectangles(R) { + if (R.layer == source) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "RECT (%5.3f %5.3f) (%5.3f %5.3f);\n", u2mil(R.x1), u2mil(R.y1), + u2mil(R.x2), u2mil(R.y2));cmd += h; + } + } + E.package.polygons(P) { + if (P.layer == source && u2mil(P.width) <= Silkwidth) { + P.wires(WP) { + h = "";sprintf(h, "POLYGON %5.3f (%5.3f %5.3f)\n ",Silkwidth, u2mil(WP.x1), u2mil(WP.y1));cmd += h; + break; + } + P.wires(WP) { + h = "";sprintf(h, " %+f (%5.3f %5.3f)", WP.curve, u2mil(WP.x2), u2mil(WP.y2));cmd += h; + } + h = "";sprintf(h, ";\n");cmd += h; + } + if (P.layer == source && u2mil(P.width) > Silkwidth) { + P.wires(WP) { + h = "";sprintf(h, "POLYGON %5.3f (%5.3f %5.3f)\n ",u2mil(P.width), + u2mil(WP.x1), u2mil(WP.y1));cmd += h; + break; + } + P.wires(WP) { + h = "";sprintf(h, " (%5.3f %5.3f)", u2mil(WP.x2), u2mil(WP.y2));cmd += h; + } + h = "";sprintf(h, ";\n");cmd += h; + } + } + E.package.texts(T) { + if (T.layer == source && T.ratio < NewTextRatio) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "Change Ratio %d;\n", NewTextRatio);cmd += h; + h = "";sprintf(h, "Change Size %5.3f;\n", u2mil(T.size));cmd += h; + h = "";sprintf(h, "TEXT '%s' %s%1.0f (%5.3f %5.3f);\n", + T.value, TextOrientation, T.angle, u2mil(T.x), u2mil(T.y));cmd += h; + } + if (T.layer == source && T.ratio >= NewTextRatio) { + + h = "";sprintf(h, "Layer %d;\n", newlay);cmd += h; + h = "";sprintf(h, "Change Size %5.3f;\n", u2mil(T.size));cmd += h; + h = "";sprintf(h, "TEXT '%s' %s%1.0f (%5.3f %5.3f);\n", + T.value, TextOrientation, T.angle, u2mil(T.x), u2mil(T.y));cmd += h; + } + } +} + +if (board) { + board(B) { + + header(); + + B.elements(E) { + source = tplace; + TextOrientation = "R"; + searchelements(E); + + source = bplace; + TextOrientation = "MR"; + searchelements(E); + } + } + +cmd += "SET UNDO_LOG ON;\n"; + +// Dialog +int Result = dlgDialog("Script to generate the new silk screen") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+Execute") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + } + }; + +if (Result == 0) exit(0); + +exit(cmd); +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/smash-all-sch.ulp b/eagle-5.7.0/ulp/smash-all-sch.ulp new file mode 100644 index 0000000..d76d37f --- /dev/null +++ b/eagle-5.7.0/ulp/smash-all-sch.ulp @@ -0,0 +1,55 @@ +#usage "Smash all gates of a schematic\n" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +string cmd; +string c; + +void visible(UL_SCHEMATIC S) { + sprintf(c, "DISP NONE;\nDISP "); + cmd += c; + S.layers(L) { + if (L.visible) { + sprintf(c, "%d ", L.number); + cmd += c; + } + } + cmd += ";\n"; + return; +} + +if (schematic) { + schematic(S) { + cmd = "DISPLAY NONE 94;\n"; + cmd += "GRID MIL 1;\n"; + S.sheets(SH) { + sprintf(c, "EDIT .s%d;\n", SH.number); + cmd += c; + SH.parts(P) { + if (P.device.package) { // **** only Devices with Package + // **** without Supply symbol Frames ect... + P.instances(I) { + if (I.sheet != 0) { + sprintf(c, "SMASH (%.2f %.2f);\n", u2mil(I.x), u2mil(I.y) ); + cmd += c; + } + } + } + } + } + + 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/smd-coordinate.ulp b/eagle-5.7.0/ulp/smd-coordinate.ulp new file mode 100644 index 0000000..8677cc4 --- /dev/null +++ b/eagle-5.7.0/ulp/smd-coordinate.ulp @@ -0,0 +1,104 @@ +#usage "Print SMD coordinates for Top and Bottom\n" + "

" + "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. " + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/* SMD-coordinate.ulp erzeugt eine Datei "boardname.smt" fuer die Koordinaten + der SMD-Pads auf der Bestueckungsseite (TOP)und eine Datei + "boardname.smb" fuer die Koordinaten der SMD-Pads auf der + Loetseite (BOTTOM). + 08.02.2001 alf@cadsoft.de + */ + +int uval = 3; + +string Version = "1.0.1"; + +int smdx[], smdy[]; // size of smd +int x[], y[]; // coordinate of SMD +int tb[]; // top or bottom side +int index[]; +int c = 0; // counter +string Boardname; +string fileTop; +string fileBottom; + +void header(void) { + printf("This file was generated by %s %s, exported from:\n", filename(argv[0]), Version); + printf("%s at %s;\n", Boardname, t2string(time())); + printf("%s;\n\n", EAGLE_SIGNATURE); + printf("%%\n"); +} + + +real value (int v) { + return u2mm(v) ; +} + +void smdxy(int x, int y) { + printf("X%06.3f Y%06.3f mm\n", value(x), value(y) ); + return; +} + +void genfiles(string file) { + sort(c, index, tb, smdx, smdy, x, y); // sortiere top/bottom, groesse, coord. + + for (int n = 0; n < c; n++) { + if (tb[index[n]]) { + smdxy(x[index[n]], y[index[n]]); + } + else { + output(fileTop, "at") { + smdxy(x[index[n]], y[index[n]]); + } + } + } + } + +void trailer(void) { printf("end\n"); } + +// main + +if (board) { + board(B) { + Boardname = B.name; + + fileTop = dlgFileSave("Save SMD coordinate for Top side", filesetext(B.name, ".smt"), "*.smt"); + if (fileTop == "") exit(0); + + fileBottom = dlgFileSave("Save SMD coordinate for Bottom side", filesetext(B.name, ".smb"), "*.smb"); + if (fileBottom == "") exit(0); + + output(fileTop, "wt") { header(); printf("Top\n"); } + output(fileBottom, "wt") { header(); printf("Bottom\n"); + B.elements(E) { + E.package.contacts(C) { + if (C.smd) { + + // collect SMD-Pads + smdx[c] = C.smd.dx; + smdy[c] = C.smd.dy; + x[c] = C.smd.x; + y[c] = C.smd.y; + tb[c] = E.mirror; + c++; + } + } + } + + genfiles(B.name); + trailer(); + output(fileTop, "at") { trailer(); } + } + } +} + +else { + dlgMessageBox("\n Start this ULP in a Board \n"); + exit (0); +} diff --git a/eagle-5.7.0/ulp/snap-on-grid-sch.ulp b/eagle-5.7.0/ulp/snap-on-grid-sch.ulp new file mode 100644 index 0000000..1803720 --- /dev/null +++ b/eagle-5.7.0/ulp/snap-on-grid-sch.ulp @@ -0,0 +1,319 @@ +#usage "Snap objects in schematic to default grid\n" + "

" + "Snaps symbols, junctions, nets and busses to the " + "given grid (default: 0.1 inch)." + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// English Description +string eHelp = "This EAGLE User Language Program can be used to " + "snap the symbols, the nets, and the busses of the current " + "schematic to default grid (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


"; + +// * ---------------------------------------------------------- + +// Deutsche Anleitung: +string dHelp = "Dieses EAGLE ULP verschiebt Symbole, " + "Netz-Linien und Bus-Linien im aktuellen Schaltplan auf " + "das Default-Grid (0.1 Inch).

" + "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.


"; + + +string Version = "1.0.4"; + +int Grid = strtol(argv[2]); // default 100 Mil + +int pass = strtol(argv[3]) + 1; + +real snap(int n) // returns next grid point +{ + return round(u2mil(n) / Grid) * Grid; +} + +void setgridmil (void) +{ + printf("GRID mil finest;\n"); +} + +real onGrid(int g) +{ + return ((u2mil(g)/Grid) - round(u2mil(g)/Grid)) * Grid; + +} + +void move_w(int x, int y) +{ + printf("MOVE (%.4f %.4f)\n", u2mil(x), u2mil(y)); + printf("(%.4f %.4f);\n", snap(x), snap(y)); +} + +// main +if (!schematic) { + dlgMessageBox("This program can only work in the schematic editor.", "OK"); + exit (0); + } + +if (Grid == 0) { + Grid = 100; + int Result = dlgDialog("SNAP Elements on Grid") { + dlgHBoxLayout { + dlgLabel("&Grid"); + dlgIntEdit(Grid); + dlgLabel("mil"); + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("&Help") dlgMessageBox(eHelp, "OK"); + dlgStretch(1); + dlgPushButton("H&ilfe") dlgMessageBox(dHelp, "OK"); + dlgStretch(0); + } + dlgHBoxLayout { + dlgStretch(0); + dlgPushButton("+&OK") dlgAccept(); + dlgStretch(1); + dlgPushButton("-&Cancel") dlgReject(); + dlgStretch(0); + } + }; + if (!Result) exit(-1); + } + +schematic(S) { + string fileName; + fileName = filesetext(S.name, "_snap.scr"); + + int shift = 0; + + output(fileName) { + printf("# This file is generated by %s %s, exported from;\n", filename(argv[0]), Version); + printf("# %s at %s;\n", S.name, t2string(time())); + printf("# %s;\n\n", EAGLE_SIGNATURE); + setgridmil (); // *** switch grid to finest + int snapshift = 0; + + S.sheets(SH) { + printf("EDIT .S%d;\n", SH.number); + printf("Text '#Symbol snap\nDISPLAY NONE 94 -95 -96;\n"); + SH.parts(PA) { + PA.instances(S) { + + // *** check Grid + real xoff = onGrid(S.x); + real yoff = onGrid(S.y); + + if (xoff || yoff) { + move_w(S.x,S.y); + snapshift =1 ; // flag for non Wire-Snap + shift = 1; + } + } + } + + printf("Text '#Junction snap\nDISPLAY NONE 91;\n"); + SH.nets(N) { + N.segments(SEG) { + SEG.junctions(J) { + real xoff = onGrid(J.x); + real yoff = onGrid(J.y); + if (xoff || yoff) { + move_w(J.x,J.y); + snapshift =1 ; // flag for non Wire-Snap + shift = 1; + } + } + } + } + + // * zuerst die Devices und Junctions verschieben * + // * damit werden alle Wire die an Pins angeschlossen * + // * sind, auch gleich mitverschoben. * + // * Jeder weitere Durchlauf verschieb dann nur noch * + // * die Netzsegmente die immer noch nicht auf dem * + // * Default-Grid liegen * + + if (snapshift == 0) { + // *** check Net-Wire on Grid + // 2. snap all Wires + printf("Text '#Net snap\nDISPLAY NONE 91;\n"); + SH.nets(N) { + real x[], y[]; + int countw = 0; + N.segments(SEG) { + SEG.wires(W) { + int notfoundx = 1; + int notfoundy = 1; + int cnt = 0; + // * alle mehrfach vorhandenen Koordinaten ausfiltern + // * mehrere Segmentverbindungen muessen als + // * eine Koordinate behandelt werden, + // * um ein mehrfaches verschieben zu vermeiden + for (cnt = 0; cnt < countw; cnt ++) { + if (W.x1 == x[cnt] && W.y1 == y[cnt] ) { // 1. Segmentende + notfoundx = 0; + break; + } + } + for (cnt = 0; cnt < countw; cnt ++) { + if (W.x2 == x[cnt] && W.y2 == y[cnt] ) { // 2. Segmentende + notfoundy = 0; + break; + } + } + if (notfoundx) { + x[countw] =W.x1; + y[countw]= W.y1; + countw++; + real x1off = onGrid(W.x1); + real y1off = onGrid(W.y1); + + if (x1off || y1off) { + move_w(W.x1,W.y1); + shift = 1; + } + } + if (notfoundy) { + x[countw] =W.x2; + y[countw]= W.y2; + countw++; + real x2off = onGrid(W.x2); + real y2off = onGrid(W.y2); + + if (x2off || y2off) { + move_w(W.x2,W.y2); + shift = 1; + } + } + } + } + } + + // 2. snap all busses + printf("Text '#Bus snap\nDISPLAY NONE 92;\n"); + SH.busses(B) { + real x[], y[]; + int countw = 0; + B.segments(SEG) { + SEG.wires(W) { + int notfoundx = 1; + int notfoundy = 1; + int cnt = 0; + // * alle mehrfach vorhandenen Koordinaten ausfiltern + // * mehrere Segmentverbindungen muessen als + // * eine Koordinate behandelt werden, + // * um ein mehrfaches verschieben zu vermeiden + for (cnt = 0; cnt < countw; cnt ++) { + if (W.x1 == x[cnt] && W.y1 == y[cnt] ) { // 1. Segmentende + notfoundx = 0; + break; + } + } + for (cnt = 0; cnt < countw; cnt ++) { + if (W.x2 == x[cnt] && W.y2 == y[cnt] ) { // 2. Segmentende + notfoundy = 0; + break; + } + } + if (notfoundx) { + x[countw] =W.x1; + y[countw]= W.y1; + countw++; + real x1off = onGrid(W.x1); + real y1off = onGrid(W.y1); + + if (x1off || y1off) { + move_w(W.x1,W.y1); + shift = 1; + } + } + if (notfoundy) { + x[countw] =W.x2; + y[countw]= W.y2; + countw++; + real x2off = onGrid(W.x2); + real y2off = onGrid(W.y2); + + if (x2off || y2off) { + move_w(W.x2,W.y2); + shift = 1; + } + } + } + } + } + } + } + printf("GRID INCH;\n"); + printf("GRID 0.1;\n"); + printf("DISPLAY 91 92 94 95 96 -93;\n"); + } + string h = ""; + if (shift) { + sprintf(h, "run '%s' '%d' '%d' '%d';\n", argv[0], shift, Grid, pass); + + if (pass == 4) { + sprintf(h, "# nach 3 Durchlaeufen muessen alle Elemente gesnapt sein,\n" + "# ueberpruefen Sie den Schaltplan auf doppelt vorkommende,\n" + "# oder sich überlappende Net-Wires, bzw. Junctions\n" + "# in der untenstehenden Liste.\n"); + string text; + int nChars = fileread(text, fileName); + + dlgDialog(fileName) { + dlgTextView(h + text); + dlgHBoxLayout { + dlgPushButton("&OK") dlgAccept(); + dlgSpacing(300); + } + exit (-1); + }; + } + + exit ("script '" + fileName + "';" + h); // do it + } + int Result =(dlgMessageBox("Nothing to do

" + 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]" + "Author: librarian@cadsoft.de" + +string cmd; +real Grid = 100; // default 100 Mil +string s; + +real xoff, yoff; +if (argv[1]) Grid = strtod(argv[1]); + +real snap(int n) { // returns next grid point + return round(u2mil(n) / Grid) * Grid; +} + +int move = 0; +if (library) { + if (symbol) symbol(S) { + string name = S.name; + S.pins(P) { + xoff = snap(P.x) - u2mil(P.x); + yoff = snap(P.y) - u2mil(P.y); + if (xoff || yoff) { + move = 1; + sprintf( s, "MOVE (%.5f %.5f) (%.1f %.1f);\n", u2mil(P.x), u2mil(P.y), snap(P.x), snap(P.y)); + cmd += s; + } + } + if (move) { + if (dlgMessageBox(cmd, "OK", "Cancel") != 0) exit (-1);; + exit("GRID MIL FINEST;\n" + cmd + "GRID MIL 100 1 ON;"); + } + else dlgMessageBox("PINs in " + name + ".SYM on Grid", "OK"); + } + else dlgMessageBox("Start this ULP in a Symbol-Editor", "OK"); +} +else dlgMessageBox("Start this ULP in Library (Symbol)", "OK"); + diff --git a/eagle-5.7.0/ulp/spiral-coil.ulp b/eagle-5.7.0/ulp/spiral-coil.ulp new file mode 100644 index 0000000..10bc501 --- /dev/null +++ b/eagle-5.7.0/ulp/spiral-coil.ulp @@ -0,0 +1,373 @@ +#usage "This ULP calculates and place a coil.

" + "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
" + " -- 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.
" + "Author: support@cadsoft.de,
"; + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESSED OR IMPLIED. + +#require 4.1106 + +string Help = usage; + +// **************----- german description -------------*************** +// ---------------------------------------------------------------- +string deHelp = + "Dieses ULP berechnet eine Spiralspule.

" + + "Dieses ULP kann in der Libary ebenso wie im Board benutzt werden.
" + + "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.
" + + "Author: support@cadsoft.de,
"; + +if (language() == "de") Help = deHelp; + +// 05.06.2002 alf@cadsoft.de +// 24.01.2005 alf@cadsoft.de + +// ****************************************************************** + +// Parameterliste -- parameter section + +real n = 4.0; // number of turns +real Wirewidth_mm = 0.2; // track width +real Wiredistance_mm = 0.2; // min. distance between tracks +real Diameter = 0.6; // pad/via diameter +real Drill = 0.4; // drill diameter +real offx = 0.0; +real offy = 0.0; + +real UserArc; +int windn; +int wind1; // count of total turns +real windlast; // reminder Turn +real Ndist; // distance between turns + +string Shape = "ROUND"; // Pad/Via-Form nicht veraendern +string direction = "CCW"; // *** Drehrichtung der Spirale nicht veraendern *** + // *** Direction do not change *** +string solderpoint; + +string cmd = ""; +string s; +int Layer = 1; + + + /* calculate X coordinate by Radius */ + +real Xneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserArc) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real NewArc; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + { + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + NewArc = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + NewArc = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + NewArc = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + NewArc = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + NewArc = (Xalt - Xorigin) + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + NewArc = (Xalt - Xorigin + 90) + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + NewArc = (Xalt - Xorigin + 270)+ UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * cos(rad)); + } + } +} + + + /* calculate Y coordinate by Radius */ + +real Yneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserArc) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real NewArc; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + { + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + NewArc = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + NewArc = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + NewArc = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + NewArc = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + NewArc = (Xalt - Xorigin) + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + NewArc = (Xalt - Xorigin + 90) + UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + NewArc = (Xalt - Xorigin + 270)+ UserArc; + real rad = PI / 180 * NewArc; + return (RADIUS * sin(rad)); + } + } +} + + + /* place a Pad (Via) on startpoint */ +void PadViaS(real x1, real x2, real w, real g) { + real p = x1 + (Wirewidth_mm / 2) - (Diameter / 2); // + sprintf( s, "%s (%4.2f %4.2f);\n", solderpoint , p + offx , 0.0 + offy); + cmd += s; + } + + + /* place a Pad (Via) on endpoint */ +void PadViaE(real x1, real x2, real w, real g) { + real pRadius = x2 + ((x1 - x2) / 180 * g) + (Diameter / 2) - (Wirewidth_mm / 2) ; + real px = Xneu(pRadius, 0, 0, 0, w); + real py = Yneu(pRadius, 0, 0, 0, w); + sprintf( s, "%s (%4.2f %4.2f);\n", solderpoint, px + offx, py + offy); + cmd += s; + } + +void doit(void) { + Ndist = (Wiredistance_mm + Wirewidth_mm ) ; // distance ARC to ARC + windn = round(n); // liefert x gerundet auf den nächsten Integer-Wert. + wind1 = trunc(n); // liefert den ganzzahligen Teil von n. + windlast = n - wind1; // rest der letzten Windung + UserArc = 360 * windlast; + real startarc = 0; + real endarc = 0; + real end2arc = 0; + real Y = 0; + int x = 0; + real ewx ; + real ewy ; + + sprintf( s, "GRID mm;\n"); + cmd += s; + sprintf( s, "Change dia %4.2f;\n", Diameter); + cmd += s; + sprintf( s, "Change shape %s;\n", Shape); + cmd += s; + sprintf( s, "Change drill %4.2f;\n", Drill); + cmd += s; + PadViaS( Ndist, Ndist, 0, 0); + sprintf( s, "change width %4.3f;\n", Wirewidth_mm); + cmd += s; + sprintf( s, "Change layer %d;\n", Layer); + cmd += s; + + // full turns + for (x = 1; x <= wind1; x++) { + // first ARC -|- erster Halbbogen + startarc = x * Ndist; + endarc = -(x * Ndist + (Ndist / 2)); + sprintf( s, "ARC '%s' (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + direction, startarc + offx, Y + offy, endarc + offx, Y + offy, endarc + offx, Y + offy); + cmd += s; + // second ARC -|- zweiter Halbbogen + end2arc = (x + 1) * Ndist; + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + endarc + offx, Y + offy, end2arc + offx, Y + offy, end2arc + offx, Y + offy); + cmd += s; + } + + // last turn + if (UserArc >= 270) { // ***** 270° - 359° + // first ARC -|- erster Halbbogen + startarc = (x ) * Ndist; + endarc = -((x * Ndist) + (Ndist / 2)); + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + startarc + offx, Y + offy, endarc + offx, Y + offy, endarc + offx, Y + offy); + cmd += s; + // finish ARC -|- letzter Halbbogen + end2arc = (x + 1) * Ndist + (Ndist / 8); + ewx = Xneu(end2arc, 0, 0, 0, UserArc); + ewy = Yneu(end2arc, 0, 0, 0, UserArc); + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + endarc + offx, Y + offy, end2arc + offx, Y + offy, ewx + offx, ewy + offy); + cmd += s; + PadViaE( end2arc, -endarc, UserArc, UserArc - 180); + UserArc = 0; + } + + else if (UserArc >= 180) { // ***** 180° - 270° + // finish ARC -|- letzter Halbbogen + startarc = (x ) * Ndist; + endarc = -((x * Ndist) + (Ndist / 2)); + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + startarc + offx, Y + offy, endarc + offx, Y + offy, endarc + offx, Y + offy); + cmd += s; + // finish ARC -|- letzter Halbbogen + end2arc = (x + 1) * Ndist + (Ndist / 2); + ewx = Xneu(end2arc, 0, 0, 0, UserArc); + ewy = Yneu(end2arc, 0, 0, 0, UserArc); + + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + endarc + offx, Y + offy, end2arc + offx, Y + offy, ewx + offx, ewy + offy); + cmd += s; + PadViaE(end2arc, -endarc, UserArc, UserArc - 180); + UserArc = 0; + } + + else if (UserArc >= 90) { // ***** 90° - 180° + // finish ARC -|- letzter Halbbogen + startarc = (x ) * Ndist; + endarc = -((x * Ndist) + (Ndist / 2)); + ewx = Xneu(startarc, 0, 0, 0, UserArc); + ewy = Yneu(startarc, 0, 0, 0, UserArc); + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + startarc + offx, Y + offy, endarc + offx, Y + offy, ewx + offx, ewy + offy); + cmd += s; + PadViaE(-endarc, startarc , UserArc, UserArc); + UserArc = 0; + } + + else if (UserArc > 0) { // ***** 0° - 90° + // finish ARC -|- letzter Halbbogen + startarc = (x ) * Ndist; + endarc = -((x * Ndist) + (Ndist / 2)); + ewx = Xneu(startarc, 0, 0, 0, UserArc); + ewy = Yneu(startarc, 0, 0, 0, UserArc); + sprintf( s, "ARC (%6.3f %6.3f) (%6.3f %6.3f) (%6.3f %6.3f);\n", + startarc + offx, Y + offy, endarc + offx, Y + offy, ewx + offx, ewy + offy); + cmd += s; + PadViaE(-endarc, startarc ,UserArc, UserArc ); + } + + else if (UserArc == 0) { + startarc = (x ) * Ndist; + endarc = -((x * Ndist) + (Ndist / 2)); + PadViaE(-endarc, startarc ,UserArc, UserArc ); + } + + sprintf( s, "Change Layer tPlace;\n"); + + sprintf( s, "window (%6.3f %6.3f);\n", offx, offy); + cmd += s; + exit (cmd); +} + + +// *** main *** + +if (board) board(B) { solderpoint = "VIA"; }; +if (library) library(L) {solderpoint = "PAD"; }; + +string ulp_path = filedir(argv[0]); +string Spiral_H = ""; + +dlgDialog("Copper Spiral") { + dlgHBoxLayout { + dlgVBoxLayout { + dlgHBoxLayout { + dlgLabel("&Turns"); // number of turns (Windungen) + dlgRealEdit( n, 1.0, 100.0); + dlgStretch(1); + } + dlgLabel(Spiral_H); + dlgHBoxLayout { + } + } + dlgVBoxLayout { + dlgGridLayout { + dlgCell(1, 1) dlgLabel("wire &width 'w'"); // track width + dlgCell(1, 2) dlgRealEdit(Wirewidth_mm, 0.01, 25.0); + dlgCell(2, 1) dlgLabel("wire &distance 'd'"); // min. distance between tracks + dlgCell(2, 2) dlgRealEdit(Wiredistance_mm, .01, 25.0); + dlgCell(3, 1) dlgLabel("Via/Pad di&ameter"); // pad/via diameter + dlgCell(3, 2) dlgRealEdit(Diameter, 0.1, 10.0); + dlgCell(4, 1) dlgLabel("Via/Pad d&rill"); // drill diameter + dlgCell(4, 2) dlgRealEdit(Drill, .1, 10.0); + dlgCell(5, 1) dlgLabel("&Layer"); // Layer number + dlgCell(5, 2) dlgIntEdit(Layer, 1, 255); + dlgCell(6, 1) dlgLabel("


"); + 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("All measures in mm"); + dlgHBoxLayout { + dlgPushButton("+&OK") { dlgAccept(); doit(); } + dlgPushButton("-&Cancel") { dlgReject(); exit(0); } + dlgStretch(1); + dlgPushButton("&Help") dlgMessageBox(Help, "Ok"); + } +}; + + diff --git a/eagle-5.7.0/ulp/split-device-symbol.ulp b/eagle-5.7.0/ulp/split-device-symbol.ulp new file mode 100644 index 0000000..77efb35 --- /dev/null +++ b/eagle-5.7.0/ulp/split-device-symbol.ulp @@ -0,0 +1,215 @@ +#usage "en: This ULP generates the CONNECT list for a new Device, that consists of several Symbols (Gates),
" + "which have been extracted from one big Symbol by GROUP; CUT; and PASTE.

" + "Example:
" + "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'.

" + "Please note:
" + "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..). " + "

" + "librarian@cadsoft.de" + , + "de: Dieses ULP erstellt die CONNECT-Liste für ein neues Device, das aus mehreren Symbolen (Gates) besteht,
" + "die wiederum durch GROUP; CUT; und PASTE aus einem großen Symbol erstellt wurden.

" + "Beispiel:
" + "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.

" + "ACHTUNG:
" + "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." + "

" + "librarian@cadsoft.de" + + + +string Version = "1.0"; // 2006.12.01 alf@cadsoft.de + + +string DeviceVariant, Pin_Name[], Pad_Name[]; +string DeviceSet; +string Device_Sets[]; +string Variant[]; +string Package[]; +string Device_Variant[], Device_Package[]; +int cntD = 0; +int cntConnect = 0; + +string actualpackage = " "; + +string cmd; +string DeviceDescription; + +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 checkVariant(string s) { + if (s == "''") s = "''''"; + return s; +} + + +void getPackage(int x) { + actualpackage = Device_Package[x]+".PAC"; + return; +} + + +void getVariant(int x) { + string p[], v[]; + int cnt; + cnt = strsplit(p, Package[x], ' '); + cnt = strsplit(v, Variant[x], ' '); + for (int n = 0; n < cnt; n++) { + Device_Variant[n] = v[n]; + Device_Package[n] = p[n]; + } + return; +} + + +string getPadName(string name) { + for (int n = 0; n < cntConnect; n++) { + if (name == Pin_Name[n]) return Pad_Name[n]; + } + return ""; +} + + +if (library) { + string file; + if (deviceset) { + deviceset(DEV) { + DeviceSet = DEV.name; + DEV.devices(D) { + cntConnect = 0; + D.gates(G) { + G.symbol.pins(P) { + cntConnect++; // count all pins + } + } + } + } + if (!cntConnect) { + dlgMessageBox("!This Deviceset use no Symbol(s)", "OK"); + exit(0); + } + + int selD = -1; + int selV = -1; + library(L) { + L.devicesets(DEV) { // collect only devicesets with the same counts of connects as the actual deviceset + int cntC; + if (DEV.name != DeviceSet) { + DEV.devices(D) { + cntC = 0; + D.gates(G) { + G.symbol.pins(P) cntC++; + } + if (cntC == cntConnect) { + Device_Sets[cntD] = DEV.name; + Variant[cntD] += D.name + " "; // Package Variant + Package[cntD] += D.package.name + " "; + } + } + if (cntC == cntConnect) cntD++; + } + } + string use_Device; + int listsel = 0; + do { + int RESULT = dlgDialog(filename(argv[0])) { + dlgHBoxLayout { + dlgLabel(DeviceSet+".DEV"); + //dlgLabel(" Variant:"+DeviceVariant); + } + dlgSpacing(8); + + dlgHBoxLayout { + dlgGridLayout { + dlgCell(0, 1) dlgLabel("Select a &Device\nto get Connect list"); + dlgCell(1, 1) dlgListView("DeviceSet", Device_Sets, selD, listsel) { getVariant(selD); actualpackage = " "; } + dlgCell(0, 2) dlgLabel("Select a Package &Variant") ; + dlgCell(1, 2) dlgListView("Variant", Device_Variant, selV) getPackage(selV); + dlgCell(2, 2) dlgLabel(actualpackage, 1); + } + dlgStretch(1); + } + dlgHBoxLayout { + dlgPushButton("+OK") dlgAccept(); + dlgPushButton("-Cancel") dlgReject(); + dlgPushButton("&Help") dlgMessageBox(usage); + } + }; + if (!RESULT) exit(0); + + if (selD < 0) dlgMessageBox("no device selected!", "OK"); + } while (selD < 0); + } + library(L) { + file = filesetext(L.name, "~connect.scr"); + L.devicesets(DEV) { + if (DEV.name == Device_Sets[selD]) { + DEV.devices(D) { + if (D.name == Device_Variant[selV]) { + int n = 0; + D.gates(G) { + G.symbol.pins(P) { + Pin_Name[n] = P.name; + Pad_Name[n] = P.contact.name; + n++; + } + } + } + } + DeviceDescription = DEV.description; + } + } + } + deviceset(DEV) { + int variant_not_used = 1; + DEV.devices(D) { + if (D.name == Device_Variant[selV]) { + variant_not_used = 0; + dlgMessageBox("This Package-Variant are used, select a unused variant!", "OK"); + exit(0); + } + } + if (variant_not_used) { + output(file, "wtD") { + DEV.devices(D) { + printf("PACKAGE %s %s;\n", Device_Package[selV], Device_Variant[selV]); + D.gates(G) { + G.symbol.pins(P) { + string pad = getPadName(P.name); + if (!pad) dlgMessageBox("No PAD found for "+ P.name +"\nCheck Pinname of Symbols", "OK"); + printf("CONNECT %s.%s %s;\n", G.name, P.name, pad); + } + } + string t[]; + printf("DESCRIPTION %s;\n", replacenewline(DeviceDescription+"
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 "Statistic Table of Elements in the Layout

\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" + "Author: alf@cadsoft.de" + +#require 5.0400 + +// 2005-01-12 - Check if layer Top or Bottom used as Power-Plane *** alf@cadsoft.de +// 2005-07-05 - Calculate used area of packages. Use pads, smds and elements in +// Layer 21/51 to calculate the used area of package. +// Rotation of packages are not consider +// 2005-07-19 - Polygon-Rank +// 2005-11-17 - List all defined Layers +// 2005-12-01 - List same Values && Packages && Layer +// 2005-12-08 - List Signals without connection (PAD/SMD) as False-Signals +// 2006-04-28 - Mask Layer +// 2006-09-26 - Circle in Copper-Layer and Text in Place-Layer +// 2006-10-05 - List first Wire coordinate of Flase Signals if exist +// 2007-12-04 - Corrected Class handling to select net-list if classes empty +// 2007-12-19 - Locked & Unlocked Packages +// 2009-02-11 - save also false signals, and rudimentarily signal name in report +// # rudimentary signal names can produced by older eagle version +// 2009-07-15 - Check Polygon in Supply-Layer $name +// 2009-10-15 - separate drill statistic by via stack +// 2009-12-02 - separate packages with and without contacts +// + +string Version = "Version 1.2.1"; // 2009-12-02 + +int uval = 1; +string unit[] = { "Micron", "mm", "Mil", "Inch" }; +int unitPrec[] = { 0, 1, 1, 3 }, RoundFactor = pow(10, unitPrec[uval]); + +string minvalfile = filesetext(argv[0], "-checkmin.val"); +real checkMinWire = 0.3; +real checkMinArc = checkMinWire; +real checkMinCirc = checkMinWire; +real checkMinPoly = checkMinWire; +real checkMinRestringP = checkMinWire; +real checkMinRestringV = checkMinWire; +real checkMinClearance = 0.3; +real checkMinIsol = checkMinClearance; +real checkMinPadDrill = 0.6; +real checkMinViaDrill = checkMinPadDrill; +real checkMinHoleDrill = checkMinPadDrill; +string checkSupplyLayerPolygon = ""; // 2009-07-15 +string SupplyLayerName[]; +int SupplyLayers[]; +int SupplyLayersUsedPolygons[]; +string showminValWidth; +string showminValOther; + +string LabelcntRECT; +string LabelcntCIRCLE; +string LabelcntTextSize; +string LabelcntTextWidth; +string LabelcntPlaceTextSize; +string LabelcntPlaceTextWidth; + +int maxX = INT_MIN; +int minX = INT_MAX; +int maxY = INT_MIN; +int minY = INT_MAX; + +string wireWidthInternal = " * Wire width are saved in 0.2 micron resolution.\n"; + +int WireWidth[]; +int cWireWidth[]; +int cntWire = 0; + +int ArcWidth[]; +int cArcWidth[]; +int cntArc = 0; + +// ****************************************************************** +// *** WIRE WIDTH wird nur geradzahlig gespeichert, wegen Teilung *** az +// ****************************************************************** +string PolygonLayer[] = { "" , ""}; +int cPolygonL = 0; +int PolygonWidth[]; +int cPolygonWidth[]; +int cntPolyW = 0; + +string PolygonSignalName[]; +int PolygonIsolate[]; +int PolygonRank[]; +int cPolygonIsolate[]; +int cntPolyIso = 0; +int PolyWidthError = 0; +string PolygonError = ""; + +int cntLayer = 0; +string usedLayer; +int cntalllay; +string allLayers[]; +string layerError; +string displayLayerError; +real outlines = 0; +string brdoutline; +string brdmaximum = "max. Board length ?\n(layer 20 empty)"; + +string NetClassName[]; +int NetClassWidth[]; +int NetClassClear[]; +int NetClassDrill[]; +int NetClassNr[]; +int selNetClassNr[]; +int cNetClass[]; + +string SignalName[]; +int SignalClass[]; +string SignalClassList[]; +int SignalClassSelect = 0; +int SignalCnt = 0; +int SignalUnrouted = 0; +string Unrouted = ""; + +string falseSignalList[]; // only signal if connected to pad or smd is a true signal 2005-12-08 alf@cadsoft.de +string FalsWxy[]; // 2006-10-05 coordiante of 1. wire segment if false signal +int falseSignalCnt = 0; +int cntfalseSignalVias[]; +int cntfalseSignalWires[]; // 2009-02-11 +string deleteRudimentalSignalName = ""; // 2009-02-12 + +int cnt_pad_on_signal = 0; + +int SMDx[], SMDy[]; +int cSMD[]; +int cntSMDt = 0; +int cntSMDb = 0; +int cntSMD = 0; + +int CirclWidth[]; +int cCirclWidth[]; +int cntCircl = 0; +int CirclDiam[]; +int cCirclDiam[]; +int cntCirclDiam = 0; + +int RECTx[]; +int RECTy[]; +int cRECT[]; +int cntRECT = 0; + +int CIRCLEx[]; +int CIRCLEy[]; +int cCIRCLE[]; +int cntCIRCLE = 0; + + +int TextWidth[]; +int cTextWidth[]; +int cntTextWidth = 0; +int TextSize[]; +int cTextSize[]; +int cntTextSize = 0; + +int PlaceTextWidth[]; +int cPlaceTextWidth[]; +int cntPlaceTextWidth = 0; +int PlaceTextSize[]; +int cPlaceTextSize[]; +int cntPlaceTextSize = 0; + + +int PadDrill[]; +int cPadDrill[]; +int cntPDril = 0; + +int PadDiameterTOP[]; +int cPadDiameterTOP[]; +int cntPDiamTOP = 0; +int PadDiameterBOT[]; +int cPadDiameterBOT[]; +int cntPDiamBOT = 0; +int iPadDiameter[]; // inner Layer +int ciPadDiameter[]; +int cntiPDiam = 0; + +int PadRestringTOP[]; +int cPadRestringTOP[]; +int cntPringTOP; +int PadRestringBOT[]; +int cPadRestringBOT[]; +int cntPringBOT; +int PadRestringI[]; +int cPadRestringI[]; +int cntPringI = 0; + +int ViaDrill[]; +int cViaDrill[]; +int cntVDril = 0; + +int ViaDiameter[]; +int cViaDiameter[]; +int cntVDiam = 0; + +int ViaDiameterI[]; +int cViaDiameterI[]; +int cntVDiamI = 0; + +int ViaRestringO[], ViaRestringI[]; +int cViaRestringO[], cViaRestringI[]; +int cntVringO = 0, cntVringI = 0; + +int ViaStackCnt[]; +string ViaStack[]; +int cntStack = 0; +string StackDrills[]; // 2009-10-15 +string showStackDrills[]; + +int Hole[]; +int cHole[]; +int cntHole = 0; + +string drillRack[]; +real Drilling[]; +int imax = 0; + +string Lbr[]; +int cLbr[]; +int cntLbr = 0; + +string PacName[]; +int cPacName[]; +int cntPacName = 0; +// --- same Value and Package and Layer --- 2005-12-01 alf@cadsoft.de +int cntEVPL = 0; +string EVALpac[]; +string EvalPAC[]; +int cEVPL[], cEVPL1[], cEVPL16[]; + + +int emptyValue = 0; +string empty = "~/-empty-/~"; + +int cntElement = 0; +string Ename[]; +int ELocked[]; +int cntLocked = 0; +real eUsedArea[]; // calculate over xPlace/xDocu/PAD/SMD 12.05.2005 alf@cadsoft.de +int eUsedLayer[]; +real summary_area = 0; + +string EContact[]; // 2009-12-02 +int cntCont = 0; +string EnoContact[]; +int cntNoCont = 0; + + +int art_selected = 0; +int LBRselected; +int PACselected; +int pac_drill[], cntpac_drill[], cnt_d; +int pac_hole[], cntpac_hole[], cnt_h; +int VALselected; +string Element_info = " \n \n \n"; +string linfo = " Double click in listings
for detailed info
"; + +string sum; + int sumSignals = 0; + int sumWires = 0; + int minWires = INT_MAX; + int sumARCw = 0; + int minARCw = INT_MAX; + int sumCIRCw = 0; + int minCIRCw = INT_MAX; + int sumCIRCdiam = 0; + int minCIRCdiam = INT_MAX; + int sumRECT = 0; + int minRECTx = INT_MAX; + int minRECTy = INT_MAX; + int minClearance = INT_MAX; + int sumPOLYw = 0; + int minPOLYw = INT_MAX; + int sumISOL = 0; + int minISOL = INT_MAX; + int sumSMD = 0; + int minSMDx = INT_MAX; + int minSMDy = INT_MAX; + int sumPADdril = 0; + int minPADdril = INT_MAX; + int sumPADdia = 0; + int minPADdia = INT_MAX; + int sumPADdiaI = 0; + int minPADdiaI = INT_MAX; + int sumPADrest = 0; + int minPADrest = INT_MAX; + int sumPADrestI = 0; + int minPADrestI = INT_MAX; + int sumVIAdril = 0; + int minVIAdril = INT_MAX; + int sumVIAdiam = 0; + int minVIAdiam = INT_MAX; + int sumVIAdiamI = 0; + int minVIAdiamI = INT_MAX; + int sumVIArest = 0; + int minVIArest = INT_MAX; + int sumVIArestI = 0; + int minVIArestI = INT_MAX; + int sumHOLE = 0; + int minHOLE = INT_MAX; + int sumTEXTw = 0; + int minTEXTw = INT_MAX; + int sumPlaceTEXTw = 0; + int minPlaceTEXTw = INT_MAX; + + + int padlSTOP[]; // Mask in Package 2006-04-28 + int smdlSTOP[]; // Mask in Package + int smdlCREAM[]; // Mask in Package + int lSTOPpac[]; // Mask in Package + int lSTOPbrd[]; // Mask in Board + int lCREAMpac[]; // Mask in Package + int lCREAMbrd[]; // Mask in Board + int msort = 0; + +int indexWire[], + indexPolygonWidth[], + indexPolygonIsolate[], + indexSMD[], + indexPadDrill[], + indexPadDia[], + indexiPadDia[], + indexPadRestring[], + indexPadRestringI[], + indexViaDrill[], + indexViaRestringO[], + indexViaRestringI[], + indexViaDiameter[], + indexViaDiameterI[], + indexHole[], + indexArcW[], + indexCirclW[], + indexTextWidth[], + indexPlaceTextWidth[]; + +numeric string statisticWirew[]; +numeric string statisticPolyw[]; +numeric string statisticPoliso[]; +numeric string statisticCLASS[]; +numeric string statisticFalseSignals[]; +numeric string statisticSMD[]; +numeric string statisticPADdril[]; +numeric string statisticPADdiaTOP[]; +numeric string statisticPADdiaBOT[]; +numeric string statisticPADdiaI[]; +numeric string statisticPADrestTOP[]; +numeric string statisticPADrestBOT[]; +numeric string statisticPADrestI[]; +numeric string statisticVIAdril[]; +numeric string statisticVIAdia[]; +numeric string statisticVIAdiaI[]; +numeric string statisticVIArest[]; +numeric string statisticVIArestI[]; +numeric string statisticVIAstack[]; +numeric string statisticHOLE[]; +numeric string statisticARCw[]; +numeric string statisticCIRw[]; +numeric string statisticCIRdiam[]; +numeric string statisticRECT[]; +numeric string statisticTEXTw[]; +numeric string statisticTEXTsize[]; +numeric string statisticPlaceTEXTw[]; +numeric string statisticPlaceTEXTsize[]; +numeric string statisticLBR[]; +numeric string statisticPAC[]; +//numeric string statisticVALUE[]; 2005.12.02 gecancelt +numeric string statisticValPacLay[]; + +string statisticLocked; +string statisticSTOP_CREAM[]; + +string Text; + +string ulp_path; +char bkslash = '/'; +int pos = strrchr(argv[0], bkslash); +if (pos >= 0) ulp_path = strsub(argv[0], 0, pos + 1); + +string attention = ""; + +string brdfile; + + +// Functions + +real u2u(int v) { + switch (uval) { + case GRID_UNIT_MIC : return u2mic(v); + break; + + case GRID_UNIT_MM : return u2mm(v); + break; + + case GRID_UNIT_MIL : return u2mil(v); + break; + + case GRID_UNIT_INCH : return u2inch(v); + break; + } +} + + +string value(int v, string is) { + if (v == INT_MAX) return "not used " + is; + string sv; + switch (uval) { + case GRID_UNIT_INCH : sprintf(sv, "%.6f %s", u2inch(v), is); + break; + + case GRID_UNIT_MIL : sprintf(sv, "%.3f %s", u2mil(v), is); + break; + + case GRID_UNIT_MM : sprintf(sv, "%.4f %s", u2mm(v), is); + break; + + case GRID_UNIT_MIC : sprintf(sv, "%.1f %s", u2mic(v), is); + break; + } + return sv; +} + + +string min_value(int v, real minv) { + string sv = "

"; + 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, "
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 = "" + displayLayerError + "
" + + "
Only use layer 2 - 15 for power planes.
"; + dlgMessageBox(displayLayerError, "Ok"); + } + sprintf(usedLayer, "used layers %d\n\n%s", cntLayer, usedLayers); + + status("Elements"); + B.elements(E) { + // calculate over xPlace/xDocu/PAD/SMD 12.05.2005 alf@cadsoft.de + if (E.locked) cntLocked++; + cntElement++; + Ename[cntElement] = E.name; + ELocked[cntElement] = E.locked; + eUsedLayer[cntElement] = E.mirror; + eUsedArea[cntElement] = used_area(E); // berechne für jedes Element(Package) den benötigten Platz + summary_area += eUsedArea[cntElement]; + int cont = 0; // 2009-12-02 package with or without contacts + E.package.contacts(C) { + if (C.pad) list_pac_drills(C.pad.drill); + cont = 1; + } + if (cont) { + EContact[cntCont] = E.name; + cntCont++; + } + else { + sprintf(EnoContact[cntNoCont], "%s\t%s", E.name, E.package.name); + cntNoCont++; + } + } + + resetMaxMin(); + status("Wires"); + B.wires(W) { + if (W.layer == 20) { + if (W.arc) { + outlines += ArcLength(W.arc.angle1, W.arc.angle2, u2u(W.arc.radius)); + 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 { + outlines += WireLength(W.x1, W.x2, W.y1, W.y2); + checkmaxmin( W.x1, W.x2, W.y1, W.y2, W.width ); + } + } + } + status("Circles"); + B.circles(C) { + if (C.layer == 20) { + outlines += WireLengthCircle(C.radius); + checkmaxmin( C.x - C.radius, C.x + C.radius, C.y - C.radius, C.y + C.radius, C.width ); + } + } + B.elements(E) { + status("Element:"+E.name); + +/* zombie + if (E.name == "U$1") { + string hh; + sprintf(hh, "%s = %s : %.4f %.4f", E.name, E.value, u2u(E.x), u2u(E.y) ); + if (dlgMessageBox(hh, "OK", "Cancel") != 0) exit(-999); + } +zombie */ + + E.package.wires(W) { + if (W.layer == 20) { + // *** Dimension in Packages *** + outlines += WireLength(W.x1, W.x2, W.y1, W.y2); + checkmaxmin( W.x1, W.x2, W.y1, W.y2, W.width ); + } + } + E.package.circles(C) { + if (C.layer == 20) { + outlines += WireLengthCircle(C.radius); + checkmaxmin( C.x - C.radius, C.x + C.radius, C.y - C.radius, C.y + C.radius, C.width ); + } + if (C.layer == 29) lSTOPpac[0]++; // count rect in Stop-Layer 2006-04-28 + if (C.layer == 30) lSTOPpac[1]++; + if (C.layer == 31) lCREAMpac[0]++; // count rect in Cream-Layer + if (C.layer == 32) lCREAMpac[1]++; + } + E.package.polygons(P) { + if (!P.width) PolyWidthError = 1; + P.wires(W) { + if (W.width < 10) { + sprintf(PolygonLayer[cPolygonL], "Package\t%s.PAC \t%d\t%d\t%.4f", E.package.name, W.layer, P.rank, u2mm(P.width)); + cPolygonL++; + } + break; + } + if (P.layer == 29) lSTOPpac[0]++; // count rect in Stop-Layer 2006-04-28 + if (P.layer == 30) lSTOPpac[1]++; + if (P.layer == 31) lCREAMpac[0]++; // count rect in Cream-Layer + if (P.layer == 32) lCREAMpac[1]++; + } + E.package.rectangles(R) { + if (R.layer == 29) lSTOPpac[0]++; // count rect in Stop-Layer 2006-04-28 + if (R.layer == 30) lSTOPpac[1]++; + if (R.layer == 31) lCREAMpac[0]++; // count rect in Cream-Layer + if (R.layer == 32) lCREAMpac[1]++; + } + } + + if (outlines) { + sprintf(brdoutline, "Outline contour = %.2f", outlines); + sprintf(brdmaximum, "max. Board length (Layer 20)\nX = %.2f\nY = %.2f", WireLength(minX, maxX, 0,0), WireLength(minY, maxY, 0, 0) ); + } + + B.classes(CL) { + // Net classes ******************** + NetClassNr[CL.number] = CL.number; + NetClassName[CL.number] = CL.name; + NetClassWidth[CL.number] = CL.width; + NetClassClear[CL.number] = CL.clearance; + NetClassDrill[CL.number] = CL.drill; + cNetClass[CL.number] = 0; + } + B.signals(S) { + status("Signal:"+S.name); + int true = 0; // only signal if connected to pad or smd is a true signal 2005-12-08 alf@cadsoft.de + S.contactrefs(C) { + true = 1; + break; + } + if (true) { + cNetClass[S.class.number]++; + sumSignals++; + SignalName[SignalCnt] = S.name; + SignalClass[SignalCnt] = S.class.number; + SignalCnt++; + SignalClassList[S.class.number] += S.name + "\n"; + } + else { + S.vias(V) { + cntfalseSignalVias[falseSignalCnt]++; + sprintf(FalsWxy[falseSignalCnt], "(%.4f %.4f) L %d-%d", u2mm(V.x), u2mm(V.y), V.start, V.end); + + } + S.wires(W) { + cntfalseSignalWires[falseSignalCnt]++; + sprintf(FalsWxy[falseSignalCnt], "(%.4f %.4f) L %d", u2mm(W.x1), u2mm(W.y1), W.layer); + } + if (cntfalseSignalWires[falseSignalCnt] || cntfalseSignalVias[falseSignalCnt]) { // 2009-02-12 + falseSignalList[falseSignalCnt] = S.name; // only signal if connected to pad or smd is a true signal + falseSignalCnt++; + } + else { + string s; + sprintf(s, "WIRE '%s' (%.4f %.4f) (%.4f %.4f);DELETE (%.4f %.4f);\n", + S.name, + u2mm(B.area.x1)-1.0, u2mm(B.area.y1)-1.0, + u2mm(B.area.x1)-2.0, u2mm(B.area.y1)-1.0, + u2mm(B.area.x1)-1.0, u2mm(B.area.y1)-1.0 + ); + deleteRudimentalSignalName+=s; + } + } + + // Wires ******************** + S.wires(W) { + if (W.layer < 19) { + if (W.arc) { + for (int n = 0; n <= cntArc; n++) { + if (ArcWidth[n] == W.arc.width) { + cArcWidth[n]++; + break; + } + } + if (n > cntArc) { + cntArc++; + ArcWidth[cntArc] = W.arc.width; + cArcWidth[cntArc]++; + } + } + else { + for (n = 0; n <= cntWire; n++) { + if (WireWidth[n] == W.width) { + cWireWidth[n]++; + break; + } + } + if (n > cntWire) { + cntWire++; + WireWidth[cntWire] = W.width; + cWireWidth[cntWire]++; + } + } + } + else { + SignalUnrouted++; + } + } + + // Polygone ********************* + S.polygons(P) { + // Polygon Wire width ********* + if (SupplyLayers[P.layer]) { + SupplyLayersUsedPolygons[P.layer]++; + } + if (!P.width) PolyWidthError = 1; + P.wires(W) { + sprintf(PolygonLayer[cPolygonL], "Signal\t%s\t%d\t%d\t%.3f", S.name, P.layer, P.rank, u2mm(W.width) ); + // Polygon Rank 19.07.2005 alf + cPolygonL++; + break; + } + for (n = 0; n <= cntPolyW; n++) { + if (PolygonWidth[n] == P.width) { + cPolygonWidth[n]++; + break; + } + } + if (n > cntPolyW) { + cntPolyW++; + PolygonWidth[cntPolyW] = P.width; + cPolygonWidth[cntPolyW]++; + } + // Polygon isolate ********* + for (n = 0; n <= cntPolyIso; n++) { + if (PolygonIsolate[n] == P.isolate) { + cPolygonIsolate[n]++; + break; + } + } + if (n > cntPolyIso) { + cntPolyIso++; + PolygonIsolate[cntPolyIso] = P.isolate; + cPolygonIsolate[cntPolyIso]++; + } + } + + // Vias ********************* + S.vias(V) { + // Vias Drill ********************* + for (int n = 0; n <= cntVDril; n++) { + if (ViaDrill[n] == V.drill) { + cViaDrill[n]++; + break; + } + } + if (n > cntVDril) { + cntVDril++; + ViaDrill[cntVDril] = V.drill; + cViaDrill[cntVDril]++; + } + + // Vias Diameter TOP ********************* + for (n = 0; n <= cntVDiam; n++) { + if (ViaDiameter[n] == V.diameter[LAYER_BOTTOM]) { + cViaDiameter[n]++; + break; + } + } + if (n > cntVDiam) { + cntVDiam++; + ViaDiameter[cntVDiam] = V.diameter[LAYER_BOTTOM]; + cViaDiameter[cntVDiam]++; + } + + // Vias Diameter Inner Layer ********************* + for (n = 0; n <= cntVDiamI; n++) { + if (ViaDiameterI[n] == V.diameter[2]) { + cViaDiameterI[n]++; + break; + } + } + if (n > cntVDiamI) { + cntVDiamI++; + ViaDiameterI[cntVDiamI] = V.diameter[2]; + cViaDiameterI[cntVDiamI]++; + } + + // Vias Restring Top Bottom ********************* + int VRestringO = (V.diameter[LAYER_BOTTOM] - V.drill ) / 2; + for (n = 0; n <= cntVringO; n++) { + if (ViaRestringO[n] == VRestringO) { + cViaRestringO[n]++; + break; + } + } + if (n > cntVringO) { + cntVringO++; + ViaRestringO[cntVringO] = VRestringO; + cViaRestringO[cntVringO]++; + } + // Vias Restring Inner Layer ********************* + int VRestringI = (V.diameter[2] - V.drill ) / 2; + for (n = 0; n <= cntVringI; n++) { + if (ViaRestringI[n] == VRestringI) { + cViaRestringI[n]++; + break; + } + } + if (n > cntVringI) { + cntVringI++; + ViaRestringI[cntVringI] = VRestringI; + cViaRestringI[cntVringI]++; + } + viaStackRack(V.start, V.end, u2mm(V.drill)); + } + S.contactrefs(C) { + cnt_pad_on_signal++; + } + } + + B.holes(H) { + // Holes Board ********************* + for (int n = 0; n <= cntHole; n++) { + if (Hole[n] == H.drill) { + cHole[n]++; + break; + } + } + if (n > cntHole) { + cntHole++; + Hole[cntHole] = H.drill; + cHole[cntHole]++; + } + } + B.circles(C) { + if (C.layer < 19) { + for (int n = 0; n <= cntCircl; n++) { + if (CirclWidth[n] == C.width) { + cCirclWidth[n]++; + break; + } + } + if (n > cntCircl ) { + cntCircl++; + CirclWidth[cntCircl] = C.width; + cCirclWidth[cntCircl]++; + } + for (n = 0; n <= cntCirclDiam; n++) { + if (CirclDiam[n] == C.radius*2) { + cCirclDiam[n]++; + break; + } + } + if (n > cntCirclDiam ) { + cntCirclDiam++; + CirclDiam[cntCircl] = C.radius*2; + cCirclDiam[cntCirclDiam]++; + } + } + if (C.layer == 29) lSTOPbrd[0]++; // count circle in Stop-Layer 2006-04-28 + if (C.layer == 30) lSTOPbrd[1]++; + if (C.layer == 31) lCREAMbrd[0]++; // count circle in Cream-Layer + if (C.layer == 32) lCREAMbrd[1]++; + } + + B.rectangles(R) { + if (R.layer < 19) { + int r_x = R.x2 - R.x1; + int r_y = R.y2 - R.y1; + for (int n = 0; n <= cntRECT; n++) { + if ( RECTx[n] == r_x && RECTy[n] == r_y ) { + cRECT[n]++; + break; + } + } + if (n > cntRECT ) { + cntRECT++; + RECTx[cntRECT] = r_x; + RECTy[cntRECT] = r_y; + cRECT[cntRECT]++; + } + } + if (R.layer == 29) lSTOPbrd[0]++; // count rect in Stop-Layer 2006-04-28 + if (R.layer == 30) lSTOPbrd[1]++; + if (R.layer == 31) lCREAMbrd[0]++; // count rect in Cream-Layer + if (R.layer == 32) lCREAMbrd[1]++; + } + status("Text"); + B.texts(T) { + if (T.layer < 19) { + for (int n = 0; n <= cntTextSize; n++) { + if (TextSize[n] == T.size) { + cTextSize[n]++; + break; + } + } + if (n > cntTextSize) { + cntTextSize++; + TextSize[cntTextSize] = T.size; + cTextSize[cntTextSize]++; + } + T.wires(W) { + for (int n = 0; n <= cntTextWidth; n++) { + if (TextWidth[n] == W.width) { + cTextWidth[n]++; + break; + } + } + if (n > cntTextWidth) { + cntTextWidth++; + TextWidth[cntTextWidth] = W.width; + cTextWidth[cntTextWidth]++; + } + break; + } + } + if (T.layer >= 21 && T.layer <= 27) { + for (int n = 0; n <= cntPlaceTextSize; n++) { + if (PlaceTextSize[n] == T.size) { + cPlaceTextSize[n]++; + break; + } + } + if (n > cntPlaceTextSize) { + cntPlaceTextSize++; + PlaceTextSize[cntPlaceTextSize] = T.size; + cPlaceTextSize[cntPlaceTextSize]++; + } + T.wires(W) { + for (int n = 0; n <= cntPlaceTextWidth; n++) { + if (PlaceTextWidth[n] == W.width) { + cPlaceTextWidth[n]++; + break; + } + } + if (n > cntPlaceTextWidth) { + cntPlaceTextWidth++; + PlaceTextWidth[cntPlaceTextWidth] = W.width; + cPlaceTextWidth[cntPlaceTextWidth]++; + } + break; + } + } + } + + B.polygons(P) { + if (P.layer == 29) lSTOPbrd[0]++; // count polygon in Stop-Layer 2006-04-28 + if (P.layer == 30) lSTOPbrd[1]++; + if (P.layer == 31) lCREAMbrd[0]++; // count polygon in Cream-Layer + if (P.layer == 32) lCREAMbrd[1]++; + } + + B.elements(E) { + status("Package:"+E.package.name); + E.package.holes(H) { + // Holes Board ********************* + for (int n = 0; n <= cntHole; n++) { + if (Hole[n] == H.drill) { + cHole[n]++; + break; + } + } + if (n > cntHole) { + cntHole++; + Hole[cntHole] = H.drill; + cHole[cntHole]++; + } + } + + E.package.contacts(C) { + if (C.smd) { + if (C.smd.layer == LAYER_TOP) cntSMDt++; + else cntSMDb++; + for (int n = 0; n <= cntSMD; n++) { + if ( (SMDx[n] == C.smd.dx && SMDy[n] == C.smd.dy) ) { + cSMD[n]++; + break; + } + } + if (n > cntSMD) { + cntSMD++; + SMDx[cntSMD] = C.smd.dx; + SMDy[cntSMD] = C.smd.dy; + cSMD[cntSMD]++; + } + } + + if (C.pad) { + // Drills + viaStackRack(1, 16, u2mm(C.pad.drill)); // 2009-10-15 pads use also in layer rack + for ( n = 0; n <= cntPDril; n++) { + if (PadDrill[n] == C.pad.drill) { + cPadDrill[n]++; + break; + } + } + if (n > cntPDril) { // a new drill + cntPDril++; + PadDrill[cntPDril] = C.pad.drill; + cPadDrill[cntPDril]++; + } + // Bottom layer + for ( n = 0; n <= cntPDiamBOT; n++) { + if (PadDiameterBOT[n] == C.pad.diameter[LAYER_BOTTOM]) { + cPadDiameterBOT[n]++; + break; + } + } + if (n > cntPDiamBOT) { + cntPDiamBOT++; + PadDiameterBOT[cntPDiamBOT] = C.pad.diameter[LAYER_BOTTOM]; + cPadDiameterBOT[cntPDiamBOT]++; + } + // Top layer + for (n = 0; n <= cntPDiamTOP; n++) { + if (PadDiameterTOP[n] == C.pad.diameter[LAYER_TOP]) { + cPadDiameterTOP[n]++; + break; + } + } + if (n > cntPDiamTOP) { + cntPDiamTOP++; + PadDiameterTOP[cntPDiamTOP] = C.pad.diameter[LAYER_TOP]; + cPadDiameterTOP[cntPDiamTOP]++; + } + // Inner layer + for ( n = 0; n <= cntiPDiam; n++) { + if (iPadDiameter[n] == C.pad.diameter[2]) { + ciPadDiameter[n]++; + break; + } + } + if (n > cntiPDiam) { + cntiPDiam++; + iPadDiameter[cntiPDiam] = C.pad.diameter[2]; + ciPadDiameter[cntiPDiam]++; + } + // Top-Restring ************************* + int Trestring = (C.pad.diameter[LAYER_TOP] - C.pad.drill) / 2; + for ( n = 0; n <= cntPringTOP; n++) { + if (PadRestringTOP[n] == Trestring) { + cPadRestringTOP[n]++; + break; + } + } + if (n > cntPringTOP) { + cntPringTOP++; + PadRestringTOP[cntPringTOP] = Trestring; + cPadRestringTOP[cntPringTOP]++; + } + + // Bottom-Restring ************************* + int Brestring = (C.pad.diameter[LAYER_BOTTOM] - C.pad.drill) / 2; + for ( n = 0; n <= cntPringBOT; n++) { + if (PadRestringBOT[n] == Brestring) { + cPadRestringBOT[n]++; + break; + } + } + if (n > cntPringBOT) { + cntPringBOT++; + PadRestringBOT[cntPringBOT] = Brestring; + cPadRestringBOT[cntPringBOT]++; + } + + // Inner-Restring ************************* + int Irestring = (C.pad.diameter[2] - C.pad.drill) / 2; + for ( n = 0; n <= cntPringI; n++) { + if (PadRestringI[n] == Irestring) { + cPadRestringI[n]++; + break; + } + } + if (n > cntPringI) { + cntPringI++; + PadRestringI[cntPringI] = Irestring; + cPadRestringI[cntPringI]++; + } + int schape = C.pad.shape[LAYER_TOP]; + schape = C.pad.shape[LAYER_BOTTOM]; + schape = C.pad.shape[2]; + } + } + // Texte in Package [copper] + E.package.texts(T) { + if (T.layer < 19) { + T.wires(W) { + for (int n = 0; n <= cntTextWidth; n++) { + if (TextWidth[n] == W.width) { + cTextWidth[n]++; + break; + } + } + if (n > cntTextWidth) { + cntTextWidth++; + TextWidth[cntTextWidth] = W.width; + cTextWidth[cntTextWidth]++; + } + break; + } + } + if (T.layer >= 21 && T.layer <= 27) { + for (int n = 0; n <= cntPlaceTextSize; n++) { + if (PlaceTextSize[n] == T.size) { + cPlaceTextSize[n]++; + break; + } + } + if (n > cntPlaceTextSize) { + cntPlaceTextSize++; + PlaceTextSize[cntPlaceTextSize] = T.size; + cPlaceTextSize[cntPlaceTextSize]++; + } + T.wires(W) { + for (int n = 0; n <= cntPlaceTextWidth; n++) { + if (PlaceTextWidth[n] == W.width) { + cPlaceTextWidth[n]++; + break; + } + } + if (n > cntPlaceTextWidth) { + cntPlaceTextWidth++; + PlaceTextWidth[cntPlaceTextWidth] = W.width; + cPlaceTextWidth[cntPlaceTextWidth]++; + } + break; + } + } + } + + // Wires in Package [copper] + E.package.wires(W) { + if (W.layer < 19) { + for (n = 0; n <= cntWire; n++) { + if (WireWidth[n] == W.width) { + cWireWidth[n]++; + break; + } + } + if (n > cntWire) { + cntWire++; + WireWidth[cntWire] = W.width; + cWireWidth[cntWire]++; + } + } + } + + // Polygon wires in Package [copper] + E.package.polygons(P) { + if (P.layer < 19) { + for (n = 0; n <= cntPolyW; n++) { + if (PolygonWidth[n] == P.width) { + cPolygonWidth[n]++; + break; + } + } + if (n > cntPolyW) { + cntPolyW++; + PolygonWidth[cntPolyW] = P.width; + cPolygonWidth[cntPolyW]++; + } + // Polygon isolate ********* + for (n = 0; n <= cntPolyIso; n++) { + if (PolygonIsolate[n] == P.isolate) { + cPolygonIsolate[n]++; + break; + } + } + if (n > cntPolyIso) { + cntPolyIso++; + PolygonIsolate[cntPolyIso] = P.isolate; + cPolygonIsolate[cntPolyIso]++; + } + } + } + + // Rectangles in Package [copper] + E.package.rectangles(R) { + if (R.layer < 19) { + int r_x = R.x2 - R.x1; + int r_y = R.y2 - R.y1; + for (int n = 0; n <= cntRECT; n++) { + if ( RECTx[n] == r_x && RECTy[n] == r_y ) { + cRECT[n]++; + break; + } + } + if (n > cntRECT ) { + cntRECT++; + RECTx[cntRECT] = r_x; + RECTy[cntRECT] = r_y; + cRECT[cntRECT]++; + } + } + } + + // Circles in Package [copper] + E.package.circles(C) { + if (C.layer < 19) { + for (int n = 0; n <= cntCircl; n++) { + if (CirclWidth[n] == C.width) { + cCirclWidth[n]++; + break; + } + } + if (n > cntCircl ) { + cntCircl++; + CirclWidth[cntCircl] = C.width; + cCirclWidth[cntCircl]++; + } + for (n = 0; n <= cntCirclDiam; n++) { + if (CirclDiam[n] == C.radius*2) { + cCirclDiam[n]++; + break; + } + } + if (n > cntCirclDiam ) { + cntCirclDiam++; + CirclDiam[cntCircl] = C.radius*2; + cCirclDiam[cntCirclDiam]++; + } + } + if (C.layer == 29) lSTOPbrd[0]++; // count circle in Stop-Layer 2006-04-28 + if (C.layer == 30) lSTOPbrd[1]++; + if (C.layer == 31) lCREAMbrd[0]++; // count circle in Cream-Layer + if (C.layer == 32) lCREAMbrd[1]++; + } + + // Masks in in Package + E.package.contacts(C) { + if (C.pad) { + if (C.pad.flags && PAD_FLAG_STOP) { + padlSTOP[0]++; // top + padlSTOP[1]++; // bottom + } + } + if (C.smd) { + if (C.smd.flags && SMD_FLAG_STOP) smdlSTOP[E.mirror]++; + if (C.smd.flags && SMD_FLAG_CREAM) smdlCREAM[E.mirror]++; + } + } + + // Element Libraries ********* + for (n = 0; n <= cntLbr; n++) { + if (Lbr[n] == E.package.library) { + cLbr[n]++; + break; + } + } + if (n > cntLbr) { + cntLbr++; + Lbr[cntLbr] = E.package.library; + cLbr[cntLbr]++; + } + // Element Package ********* + for (n = 0; n <= cntPacName; n++) { + if (PacName[n] == E.package.name) { + cPacName[n]++; + break; + } + } + if (n > cntPacName) { + cntPacName++; + PacName[cntPacName] = E.package.name; + cPacName[cntPacName]++; + } + + // Element Value ********* 2005-12-01 alf@cadsoft.de +/* + // -------- List by Value ------------ + for (n = 0; n <= cntEValue; n++) { + if (EValue[n] == Ev) { + cEValue[n]++; + break; + } + } + if (n > cntEValue) { + cntEValue++; + EValue[cntEValue] = Ev; + cEValue[cntEValue]++; + } +*/ + // ----- List by Value/Package/Layer ----------- + string Ev = E.value; + if (Ev == "") { + Ev = empty + E.name; + emptyValue++; + } + for (n = 0; n <= cntEVPL; n++) { + if (EVALpac[n] == Ev && EvalPAC[n] == E.package.name ) { + cEVPL[n]++; + if (E.mirror) cEVPL16[n]++; + else cEVPL1[n]++; + break; + } + } + if (n > cntEVPL) { + cntEVPL++; + EVALpac[cntEVPL] = Ev; + EvalPAC[cntEVPL] = E.package.name; + cEVPL[cntEVPL]++; + if (E.mirror) cEVPL16[cntEVPL]++; + else cEVPL1[cntEVPL]++; + } + } + status("creat list"); + + if (PolyWidthError) PolygonError = "! *** Do not use WIRE WIDTH 0 for Polygon if generate Gerber-Data *** !"; + int x = 0; + // Statistic tabels + // Net Class ******************** + statisticCLASS[x] = "# \tName\tmin. Width\tClearance\tmin. Drill\tUsed"; + for (n = 0; n < 8; n++) { + if (NetClassName[n]) { + if(minClearance > NetClassClear[n]) minClearance = NetClassClear[n]; + x++; + sprintf(statisticCLASS[x], "%1d\t%s\t%s\t%s\t%s\t%-4d", + NetClassNr[n], + NetClassName[n], + value(NetClassWidth[n], ""), + value(NetClassClear[n], ""), + value(NetClassDrill[n], ""), + cNetClass[n] + ); + selNetClassNr[x] = NetClassNr[n]; + } + } + + x = 0; + // false Signals ******************** 2005-12-08 alf@cadsoft.de + statisticFalseSignals[x] = "Signal-Name\tVias\tCoordinate Layer"; + for (n = 0; n < falseSignalCnt; n++) { + x++; + sprintf( statisticFalseSignals[x], "%s\t%d\t%s", + falseSignalList[n], // only signal if connected to pad or smd is a true signal 2005-12-08 alf@cadsoft.de + cntfalseSignalVias[n], + FalsWxy[n] + ); + } + + // ************* Wire statistic ***************** + x = 0; + statisticWirew[x] = "WIRE\tQ."; + for (n = 0; n <= cntWire; n++) { + if (cWireWidth[n]) { + sumWires += cWireWidth[n]; + if(minWires > WireWidth[n]) minWires = WireWidth[n]; + x++; + sprintf(statisticWirew[x], "%s\t%-4d", value(WireWidth[n], ""), cWireWidth[n] ); + } + } + + x = 0; + statisticARCw[x] = "ARC\tQ."; + for ( n = 0; n <= cntArc; n++) { + if (cArcWidth[n]) { + sumARCw += cArcWidth[n]; + if(minARCw > ArcWidth[n]) minARCw = ArcWidth[n]; + x++; + sprintf(statisticARCw[x], "%s\t%-4d", value(ArcWidth[n], ""), cArcWidth[n] ); + } + } + + x = 0; + statisticCIRw[x] = "CIRCLE (width)\tQ."; + for ( n = 0; n <= cntCircl; n++) { + if (cCirclWidth[n]) { + sumCIRCw += cCirclWidth[n]; + if(minCIRCw > CirclWidth[n]) minCIRCw = CirclWidth[n]; + x++; + sprintf(statisticCIRw[x], "%s\t%-4d", value(CirclWidth[n], ""), cCirclWidth[n] ); + } + } + + x = 0; + statisticCIRdiam[x] = "CIRCLE diam.\tQ."; + for ( n = 0; n <= cntCirclDiam; n++) { + if (cCirclDiam[n]) { + sumCIRCdiam += cCirclDiam[n]; + if(minCIRCdiam > CirclDiam[n]) minCIRCdiam = CirclDiam[n]; + x++; + sprintf(statisticCIRdiam[x], "%s\t%-4d", value(CirclDiam[n], ""), cCirclDiam[n] ); + } + } + + x = 0; + statisticPolyw[x] = "POLY. width\tQ."; + for ( n = 0; n <= cntPolyW; n++) { + if (cPolygonWidth[n]) { + sumPOLYw += cPolygonWidth[n]; + if(minPOLYw > PolygonWidth[n]) minPOLYw = PolygonWidth[n]; + x++; + sprintf(statisticPolyw[x], "%s\t%-4d", value(PolygonWidth[n], ""), cPolygonWidth[n]); + // ATTENTION : Width saved in .2 Micron + } + } + + x = 0; + statisticPoliso[x] = "POLY. Isol.\tQ."; + for ( n = 0; n <= cntPolyIso; n++) { + if (cPolygonIsolate[n]) { + sumISOL += cPolygonIsolate[n]; + if(minISOL > PolygonIsolate[n]) minISOL = PolygonIsolate[n]; + x++; + sprintf(statisticPoliso[x], "%s\t%-4d", value(PolygonIsolate[n], ""), cPolygonIsolate[n]); + } + } + + x = 0; + statisticRECT[x] = "RECT x\tRECT y\tQ."; + for ( n = 0; n <= cntRECT; n++) { + if (cRECT[n]) { + sumRECT += cRECT[n]; + if(minRECTx > RECTx[n]) minRECTx = RECTx[n]; + if(minRECTy > RECTy[n]) minRECTy = RECTy[n]; + x++; + sprintf(statisticRECT[x], "%s\t%s\t%-4d", value(RECTx[n], ""), value(RECTy[n], ""), cRECT[n]); + } + } + + x = 0; + statisticSMD[x] = "SMD x\tSMD y\tQ."; + for ( n = 0; n <= cntSMD; n++) { + if (cSMD[n]) { + sumSMD += cSMD[n]; + if(minSMDx > SMDx[n]) minSMDx = SMDx[n]; + if(minSMDy > SMDy[n]) minSMDy = SMDy[n]; + x++; + sprintf(statisticSMD[x], "%s\t%s\t%-4d", value(SMDx[n], ""), value(SMDy[n], ""), cSMD[n]); + } + } + + x = 0; + statisticPADdril[x] = "PAD drill\tQ."; + for (n = 0; n <= cntPDril; n++) { + if (cPadDrill[n]) { + sumPADdril += cPadDrill[n]; + if(minPADdril > PadDrill[n]) minPADdril = PadDrill[n]; + x++; + sprintf(statisticPADdril[x], "%s\t%-4d", value(PadDrill[n], ""), cPadDrill[n]); + } + } + + x = 0; + statisticPADdiaTOP[x] = "PAD tDiam\tQ."; + for ( n = 0; n <= cntPDiamTOP; n++) { + if (cPadDiameterTOP[n]) { + sumPADdia += cPadDiameterTOP[n]; + if(minPADdia > PadDiameterTOP[n]) minPADdia = PadDiameterTOP[n]; + x++; + sprintf(statisticPADdiaTOP[x], "%s\t%-4d", value(PadDiameterTOP[n], ""), cPadDiameterTOP[n]); + } + } + + x = 0; + statisticPADdiaBOT[x] = "PAD bDiam\tQ."; + for ( n = 0; n <= cntPDiamBOT; n++) { + if (cPadDiameterBOT[n]) { + sumPADdia += cPadDiameterBOT[n]; + if(minPADdia > PadDiameterBOT[n]) minPADdia = PadDiameterBOT[n]; + x++; + sprintf(statisticPADdiaBOT[x], "%s\t%-4d", value(PadDiameterBOT[n], ""), cPadDiameterBOT[n]); + } + } + + x = 0; + statisticPADdiaI[x] = "PAD iDiam\tQ."; + for ( n = 0; n <= cntiPDiam; n++) { + if (ciPadDiameter[n]) { + sumPADdiaI += ciPadDiameter[n]; + if(minPADdiaI > iPadDiameter[n]) minPADdiaI = iPadDiameter[n]; + x++; + sprintf(statisticPADdiaI[x], "%s\t%-4d", value(iPadDiameter[n], ""), ciPadDiameter[n]); + } + } + + x = 0; + statisticPADrestTOP[x] = "PAD tRestring\tQ."; + for ( n = 0; n <= cntPringTOP; n++) { + if (cPadRestringTOP[n]) { + sumPADrest += cPadRestringTOP[n]; + if(minPADrest > PadRestringTOP[n]) minPADrest = PadRestringTOP[n]; + x++; + sprintf(statisticPADrestTOP[x], "%s\t%-4d", value(PadRestringTOP[n], ""), cPadRestringTOP[n]); + } + } + + x = 0; + statisticPADrestBOT[x] = "PAD bRestring\tQ."; + for ( n = 0; n <= cntPringBOT; n++) { + if (cPadRestringBOT[n]) { + sumPADrest += cPadRestringBOT[n]; + if(minPADrest > PadRestringBOT[n]) minPADrest = PadRestringBOT[n]; + x++; + sprintf(statisticPADrestBOT[x], "%s\t%-4d", value(PadRestringBOT[n], ""), cPadRestringBOT[n]); + } + } + + x = 0; + statisticPADrestI[x] = "PAD iRestring\tQ."; + for ( n = 0; n <= cntPringI; n++) { + if (cPadRestringI[n]) { + sumPADrestI += cPadRestringI[n]; + if(minPADrestI > PadRestringI[n]) minPADrestI = PadRestringI[n]; + x++; + sprintf(statisticPADrestI[x], "%s\t%-4d", value(PadRestringI[n], ""), cPadRestringI[n]); + } + } + + x = 0; + statisticVIAdril[x] = "VIA drill\tQ."; + for ( n = 0; n <= cntVDril; n++) { + if (cViaDrill[n]) { + sumVIAdril += cViaDrill[n]; + if(minVIAdril > ViaDrill[n]) minVIAdril = ViaDrill[n]; + x++; + sprintf(statisticVIAdril[x], "%s\t%-4d", value(ViaDrill[n], ""), cViaDrill[n] ); + } + } + + x = 0; + statisticVIAdia[x] = "VIA Outer-Diam\tQ."; + for ( n = 0; n <= cntVDiam; n++) { + if (cViaDiameter[n]) { + sumVIAdiam += cViaDiameter[n]; + if(minVIAdiam > ViaDiameter[n]) minVIAdiam = ViaDiameter[n]; + x++; + sprintf(statisticVIAdia[x], "%s\t%-4d", value(ViaDiameter[n], ""), cViaDiameter[n] ); + } + } + + x = 0; + statisticVIAdiaI[x] = "VIA Inner-Diam.\tQ."; + for ( n = 0; n <= cntVDiamI; n++) { + if (cViaDiameterI[n]) { + sumVIAdiamI += cViaDiameterI[n]; + if(minVIAdiamI > ViaDiameterI[n]) minVIAdiamI = ViaDiameterI[n]; + x++; + sprintf(statisticVIAdiaI[x], "%s\t%-4d", value(ViaDiameterI[n], ""), cViaDiameterI[n] ); + } + } + + x = 0; + statisticVIArest[x] = "VIA Outer-Restring \tQ."; + for ( n = 0; n <= cntVringO; n++) { + if (cViaRestringO[n]) { + sumVIArest += cViaRestringO[n]; + if(minVIArest > ViaRestringO[n]) minVIArest = ViaRestringO[n]; + x++; + sprintf(statisticVIArest[x], "%s\t%-4d", value(ViaRestringO[n], ""), cViaRestringO[n]); + } + } + + x = 0; + statisticVIArestI[x] = "VIA Inner-Restring\tQ."; + for ( n = 0; n <= cntVringI; n++) { + if (cViaRestringI[n]) { + sumVIArestI += cViaRestringI[n]; + if(minVIArestI > ViaRestringI[n]) minVIArestI = ViaRestringI[n]; + x++; + sprintf(statisticVIArestI[x], "%s\t%-4d", value(ViaRestringI[n], ""), cViaRestringI[n]); + } + } + + x = 0; + statisticVIAstack[x] = "VIA Stack\tQ."; + for ( n = 0; n < cntStack; n++) { + x++; + sprintf(statisticVIAstack[x], "%s\t%-4d", ViaStack[n], ViaStackCnt[n]); + } + + x = 0; + statisticHOLE[x] = "HOLE drill\tQ."; + for ( n = 0; n <= cntHole; n++) { + if (cHole[n]) { + sumHOLE += cHole[n]; + if(minHOLE > Hole[n]) minHOLE = Hole[n]; + x++; + sprintf(statisticHOLE[x], "%s\t%-4d", value(Hole[n], ""), cHole[n]); + } + } + + x = 0; + statisticTEXTw[x] = "TEXT (w)\tQ."; + for ( n = 0; n <= cntTextWidth; n++) { + if (cTextWidth[n]) { + sumTEXTw += cTextWidth[n]; + if(minTEXTw > TextWidth[n]) minTEXTw = TextWidth[n]; + x++; + sprintf(statisticTEXTw[x], "%s\t%-4d", value(TextWidth[n], ""),cTextWidth[n] ); + } + } + + x = 0; + statisticTEXTsize[x] = "TEXT (s)\tQ."; + for ( n = 0; n <= cntTextSize; n++) { + if (cTextSize[n]) { + x++; + sprintf(statisticTEXTsize[x], "%s\t%-4d", value(TextSize[n], ""),cTextSize[n] ); + } + } + + x = 0; + statisticPlaceTEXTw[x] = "TEXT \tQ."; + for ( n = 0; n <= cntPlaceTextWidth; n++) { + if (cPlaceTextWidth[n]) { + sumPlaceTEXTw += cPlaceTextWidth[n]; + if(minPlaceTEXTw > PlaceTextWidth[n]) minPlaceTEXTw = PlaceTextWidth[n]; + x++; + sprintf(statisticPlaceTEXTw[x], "%s\t%-4d", value(PlaceTextWidth[n], ""),cPlaceTextWidth[n] ); + } + } + + x = 0; + statisticPlaceTEXTsize[x] = "TEXT \tQ."; + for ( n = 0; n <= cntPlaceTextSize; n++) { + if (cPlaceTextSize[n]) { + x++; + sprintf(statisticPlaceTEXTsize[x], "%s\t%-4d", value(PlaceTextSize[n], ""),cPlaceTextSize[n] ); + } + } + + x = 0; + statisticLBR[x] = "LIBRARY\tQ."; + for ( n = 0; n <= cntLbr; n++) { + if (cLbr[n]) { + x++; + sprintf(statisticLBR[x], "%s\t%-4d", Lbr[n], cLbr[n] ); + } + } + + x = 0; + statisticPAC[x] = "PACKAGE\tQ."; + for ( n = 0; n <= cntPacName; n++) { + if (cPacName[n]) { + x++; + sprintf(statisticPAC[x], "%s\t%-4d", PacName[n], cPacName[n] ); + } + } + + x = 0; + statisticValPacLay[x] = "VALUE\tPAC\tQ.\tTop\tBot"; + for ( n = 0; n <= cntEVPL; n++ ) { + if (cEVPL[n]) { + x++; + sprintf(statisticValPacLay[x], "%s\t%s\t%d\t%d\t%d", + EVALpac[n], EvalPAC[n], cEVPL[n], cEVPL1[n], cEVPL16[n] ); + } + } + sprintf(statisticLocked, "%d Elements: %d locked %d unlocked", cntElement, cntLocked, cntElement-cntLocked); + + x = 0; + // Drill Rack statistic + status("Drill/Rack"); + B.holes(H) AddDrilling(H.drill); + B.signals(S) S.vias(V) AddDrilling(V.drill); + B.elements(E) { + E.package.contacts(C) { + if (C.pad) + AddDrilling(C.pad.drill); + } + E.package.holes(H) AddDrilling(H.drill); + } + sort(imax, Drilling); + + drillRack[0] = "RACK"; + for (int i = 0; i < imax; ++i) { + string s; + sprintf(s, "T%02d %5.*f", i + 1, unitPrec[uval], Drilling[i]); + drillRack[i + 1] = s; + } + status("Unroutet"); + if (SignalUnrouted) { + sprintf(displayUnrouted, "%d    unroutet (airwire)", SignalUnrouted ); + sprintf(Unrouted, "%d", SignalUnrouted); + } + status("Generate statistic list"); // 2007-12-19 alf@cadsoft.de + + // Stop/Cream mask statistic 2006-04-28 + sprintf(statisticSTOP_CREAM[0], "%d\t tStop Pad", padlSTOP[0]); + sprintf(statisticSTOP_CREAM[1], "%d\t tStop Smd", smdlSTOP[0]); + sprintf(statisticSTOP_CREAM[2], "%d\t tStop Pac", lSTOPpac[0]); // tMask in Board/Package + sprintf(statisticSTOP_CREAM[3], "%d\t tStop Brd", lSTOPbrd[0]); // tMask in Board/Package + sprintf(statisticSTOP_CREAM[4], "%d\t tStop", padlSTOP[0] + smdlSTOP[0] + lSTOPpac[0] + lSTOPbrd[0]); + + sprintf(statisticSTOP_CREAM[5], "%d\t bStop Pad", padlSTOP[1]); + sprintf(statisticSTOP_CREAM[6], "%d\t bStop Smd", smdlSTOP[1]); + sprintf(statisticSTOP_CREAM[7], "%d\t bStop Pac", lSTOPpac[1]); // tMask in Board/Package + sprintf(statisticSTOP_CREAM[8], "%d\t bStop Brd", lSTOPbrd[1]); // tMask in Board/Package + sprintf(statisticSTOP_CREAM[9], "%d\t bStop", padlSTOP[1] + smdlSTOP[1] + lSTOPpac[1] + lSTOPbrd[1]); + + sprintf(statisticSTOP_CREAM[10], "%d\t tCream Smd", smdlCREAM[0]); + sprintf(statisticSTOP_CREAM[11], "%d\t tCream Pac", lCREAMpac[0]); // tCream in Board/Package + sprintf(statisticSTOP_CREAM[12], "%d\t tCream Brd", lCREAMbrd[0]); // tCream in Board/Package + sprintf(statisticSTOP_CREAM[13], "%d\t tCream", smdlCREAM[0] + lCREAMpac[0] + lCREAMbrd[0]); // tCream in Board/Package + + sprintf(statisticSTOP_CREAM[14], "%d\t bCream Smd", smdlCREAM[1]); + sprintf(statisticSTOP_CREAM[15], "%d\t bCream Pac", lCREAMpac[1]); // bCream in Board/Package + sprintf(statisticSTOP_CREAM[16], "%d\t bCream Brd", lCREAMbrd[1]); // bCream in Board/Package + sprintf(statisticSTOP_CREAM[17], "%d\t bCream", smdlCREAM[1] + lCREAMpac[1] + lCREAMbrd[1]); // bCream in Board/Package + + + // summary ****************** + string Tsummary_area; + sprintf(Tsummary_area, "~ %.2f mm² (%.3f dm²)", summary_area, summary_area/10000.0); + + sprintf(sum, "%-6d\t Wire(s) incl. Arc(s)\n%-6d\t Polygon(s)\n_________________________\n" + + "%-6d\t SMD(s) top\n%-6d\t SMD(s) bottom\n===================\n%-6d\t SMD(s) total\n\n" + + "%-6d\t PAD(s)\n_________________________\n" + + "%-6d\t Via\n%-6d\t Hole\n===================\n" + + "%-6d\t Drills total\n_________________________\n"+ + "%s\n%s\n_________________________\n" + + "Routing Info: \n%-6d\t Signal(s) \n" + + "%-6d\t PAD/SMD total\n===================\n" + + "%-6d\t PAD/SMD on Signal\n_________________________\n"+ + "Packages used area:\n%s\n_________________________\n", + sumWires + sumARCw, + sumPOLYw, + cntSMDt, + cntSMDb, + sumSMD, + sumPADdril, + sumVIAdril, + sumHOLE, + sumPADdril + sumVIAdril + sumHOLE, + statisticSTOP_CREAM[13], // 2006-04-28 + statisticSTOP_CREAM[17], + sumSignals, + sumSMD + sumPADdril, + cnt_pad_on_signal, + Tsummary_area + ); + + sprintf(LabelcntRECT, "%d RECT (copper)", cntRECT); + sprintf(LabelcntTextSize, "%d TEXT size (copper)", cntTextSize); + sprintf(LabelcntTextWidth, "%d TEXT wire width (copper)", cntTextWidth); + sprintf(LabelcntPlaceTextSize, "%d TEXT size (place)", cntPlaceTextSize); + sprintf(LabelcntPlaceTextWidth, "%d TEXT wire width (place)", cntPlaceTextWidth); + sprintf(LabelcntCIRCLE, "%d CICLE (copper)", cntCIRCLE); + for (int ln = 1; ln < 16; ln++) { + if (SupplyLayersUsedPolygons[ln]) { + string sl; + sprintf(sl, "%d:%s:(%d) ", ln, SupplyLayerName[ln], SupplyLayersUsedPolygons[ln]); + checkSupplyLayerPolygon += sl; + } + } + int Selected = 0; + int StopCreamSelected = 0; + int MCselected = 0; + int ECselected = 0; + // ********************************************************************* + dlgDialog("Statistic of " + B.name) { + showminValWidth = check_min_ValueWidth(); + showminValOther = check_min_ValueOther(); + dlgHBoxLayout dlgSpacing(850); + dlgHBoxLayout { + dlgTabWidget { // *** Board *** + dlgTabPage("&BOARD") { + dlgHBoxLayout { + dlgSpacing(10); + dlgVBoxLayout { + dlgSpacing(10); + dlgLabel(brdmaximum); + dlgSpacing(5); + dlgLabel(brdoutline); + dlgLabel("


"); + 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("Packages used area "+Tsummary_area+""); + } + + dlgTabPage("&MASK") { // *** Stop & Cream MASK *** + dlgHBoxLayout { + dlgListView("Count\tLayer", statisticSTOP_CREAM, StopCreamSelected, msort); + dlgStretch(1); + } + } + + dlgTabPage("&RECT CIRCLE") { // *** Rect / Circle *** + dlgHBoxLayout { + dlgVBoxLayout { + dlgListView("", statisticRECT, Selected); + dlgLabel(LabelcntRECT); + } + dlgSpacing(8); + dlgVBoxLayout { + dlgListView("", statisticCIRw, Selected); + dlgLabel(LabelcntCIRCLE); + } + dlgVBoxLayout { + dlgListView("", statisticCIRdiam, Selected); + dlgLabel(LabelcntCIRCLE); + } + dlgStretch(1); + } + } + + dlgTabPage("&TEXT") { // *** Text *** + dlgHBoxLayout { + dlgVBoxLayout { + dlgListView("", statisticPlaceTEXTw, Selected); + dlgLabel(LabelcntPlaceTextWidth); + } + dlgVBoxLayout { + dlgListView("", statisticPlaceTEXTsize, Selected); + dlgLabel(LabelcntPlaceTextSize); + } + dlgStretch(1); + } + } + } + } + if (checkSupplyLayerPolygon) dlgLabel("Polygon(s) in SUPPLY-LAYER, please check! :
" + 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" + "

" + "Author: support@cadsoft.de" + +string Revision = "1.07"; + // 1.02 2005.12.11 alf@cadsoft.de + // 1.03 2006.05.18 Delete unused PAC/SYM + // 1.04 2006.09.25 Check/Delete empty user layer + // Edit selected element + // 1.05 2007.02.07 Check defined User layer also < 100 + // 1.06 2007.02.08 check apostroph in Pac- Sym-Name vor Delete + // 1.07 2007.11.26 correct Text in function del_unused_sym(void) "Delete all unused symbols?" + + +string src_dev[]; +string src_pac[]; +string src_sym[]; +string src_tec[]; +string src_var[]; +string src_pref[]; + +int cnt_variant[]; + +string srt_dev[]; +string srt_pac[]; +string srt_sym[]; +string srt_tec[]; +string srt_var[]; +string srt_pref[]; + + +string srt_drills[]; + +int index_dev[]; +int index_pac[]; +int index_sym[]; +int index_tec[]; +int index_var[]; +int index_pref[]; +int index_dril[]; + +int drills[]; +int cntdril[]; + +int cntdev = 0; +int cntpac = 0; +int cntsym = 0; +int cnttec = 0; +int cntvar = 0; +int cntpref = 0; +int cntdrills = 0; + +int used_pac[]; +int used_sym[]; + +string unUsed_pac[]; +string unUsed_sym[]; + +string usedlabel = " "; +string used[] = { "used in Deviceset\tcnt" }; + +int cntclearused = 0; // Error in dlgListView, + // clear all strings in array befor use dlgListView + // if used a second time less string entry + + +int cntUnUsed_pac = 0; +int cntUnUsed_sym = 0; + +int us, up; +string PackInfo = " \n \n \n "; +string SymbolInfo = " \n \n"; + +string defined_layers[] = {"" }; +int cnt_deflayer = 0; + +string used_layers[] = {"" }; +int cnt_used_layers = 0; + +string user_layers[] = {"" }; +int cnt_user_layers = 0; + +string usedTechno[]; +int nusedTecno; + +string usedVar[]; +int nusedVar; + +string Empty = "~empty~"; +int nusedPrefix; + +string edittype; + + +// *** --- Functions --- *** + +void checkprefix(string prefix) { + if (!prefix) prefix = Empty; + int f = 0; + for (int n = 0; n <= cntpref; n++) { + if (src_pref[n] == prefix) { + f = 1; + break; + } + } + if (f) return; + src_pref[cntpref] = prefix; + cntpref++; + return; +} + +void checkVariant(string var) { + int f = 0; + for (int n = 0; n <= cntvar; n++) { + if (src_var[n] == var) { + f = 1; + break; + } + } + if (f) return; + src_var[cntvar] = var; + cntvar++; + return; +} + +void checkTechno(string tech) { + string techno[]; + int t = strsplit(techno, tech, ' '); + for (int xt = 0; xt < t; xt++) { + int notf = 1; + for (int n = 0; n <= cnttec; n++) { + if (src_tec[n] == techno[xt]) { + notf = 0; + break; + } + } + if (notf) { + src_tec[cnttec] = techno[xt]; + cnttec++; + } + } + return; +} + + +void TecInfo(string tec) { + library(L) { + usedlabel = "Used Technoligies "; + used[0] = "Deviceset"; + used[1] = ""; + nusedTecno = 1; + L.devicesets(DS) { + DS.devices(D) { + string techno[]; + int cnt = strsplit(techno, D.technologies, ' '); + for (int n = 0; n <= cnt; n++) { + if (techno[n] == tec) { + + sprintf(used[nusedTecno], "%s", DS.name); + nusedTecno++; + used[nusedTecno] = ""; + break; + } + } + } + } + } + return; +} + + +void VarInfo(string var) { + library(L) { + usedlabel = "Used Variants "; + used[0] = "Deviceset"; + used[1] = ""; + nusedVar = 1; + L.devicesets(DS) { + DS.devices(D) { + if (D.name == var) { + sprintf(used[nusedVar], "%s", DS.name); + nusedVar++; + used[nusedVar] = ""; + } + } + } + } + return; +} + +void PrefInfo(string pref) { + if (!pref) pref = Empty; + library(L) { + usedlabel = "Used Prefix " + pref; + used[0] = "Deviceset"; + used[1] = ""; + nusedPrefix = 1; + L.devicesets(DS) { + string pfx = DS.prefix; + if (!pfx) pfx = Empty; + if(pfx == pref) { + sprintf(used[nusedPrefix], "%s", DS.name); + nusedPrefix++; + used[nusedPrefix] = ""; + } + } + } + return; +} + + +void checkUsedPac(string pac) { + int f = 0; + for (int n = 0; n <= cntpac; n++) { + if (src_pac[n] == pac) { + used_pac[n]++; + return; + } + } + dlgMessageBox("Pac not found!", "OK"); +} + + +void checkUsedSym(string sym) { + int f = 0; + for (int n = 0; n <= cntsym; n++) { + if (src_sym[n] == sym) { + used_sym[n]++; + return; + } + } + dlgMessageBox("Sym not found!", "OK"); +} + + +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; +} + + +void del_unused_pac(void) { // 2006.05.09 + if (dlgMessageBox("Delete all unused packages?", "YES", "NO") != 0) return; + string cmd, s; + for (int n = 0; n < cntUnUsed_pac; n++) { + sprintf(s, "REMOVE '%s.PAC';\n", addApostroph(unUsed_pac[n])); + cmd += s; + } + sprintf(s, "RUN '%s';\n", argv[0]); + cmd += s; + exit(cmd); +} + + +void del_unused_sym(void) { // 2007.11.26 + if (dlgMessageBox("Delete all unused symbols?", "YES", "NO") != 0) return; + string cmd, s; + for (int n = 0; n < cntUnUsed_sym; n++) { + sprintf(s, "REMOVE '%s.SYM';\n", addApostroph(unUsed_sym[n])); + cmd += s; + } + sprintf(s, "RUN '%s';\n", argv[0]); + cmd += s; + exit(cmd); +} + + +// ** ------------------------ ** +void checkDrill(int drill) { + int nof = 1; + for (int n = 0; n < cntdrills; n++) { + if (drills[n] == drill) { + nof = 0; + cntdril[n]++; + break; + } + } + if (nof) { + drills[cntdrills] = drill; + cntdril[cntdrills]++; + cntdrills++; + } + return; +} + + +int countPAD(UL_PACKAGE P) { + int Pads; + P.contacts(C) { + if (C.pad) { + Pads++; + } + } + return Pads; +} + + +int countSMD(UL_PACKAGE P) { + int Smds; + P.contacts(C) { + if (C.smd) { + Smds++; + } + } + return Smds; +} + +int countHOLE(UL_PACKAGE P) { + int Holes; + P.holes(H) { + Holes++; + } + return Holes; +} + + +int countPIN(UL_SYMBOL S) { + int Pins; + S.pins(P) { + Pins++; + } + return Pins; +} + + +int newUsed(string use_name) { + int new = 1; + int n = 0; + do { + if (used[n] == use_name) { + new = 0; + break; + } + n++; + } while(used[n]); + return new; +} + + +void syminfo(string Name_and_count) { + string symbolname[]; + int n = strsplit(symbolname, Name_and_count, '\t'); + usedlabel = "" + symbolname[0]+".SYM"; + 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.symbols(S) { + if (S.name == symbolname[0]) { + sprintf(SymbolInfo, "%s
%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 "Statistic Table of Parts in the Schematic

\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" + "Author: alf@cadsoft.de" + +#require 4.1106 + + +string Version = "1.0.1"; + +int uval = 1; +string unit[] = { "Micron", "mm", "Mil", "Inch" }; +int unitPrec[] = { 0, 1, 1, 3 }, RoundFactor = pow(10, unitPrec[uval]); + +int maxX = INT_MIN; +int minX = INT_MAX; +int maxY = INT_MIN; +int minY = INT_MAX; + +string wireWidthInternal = " * Wire width are saved in 0.2 micron!\n"; +// ****************************************************************** +// *** WIRE WIDTH wird nur geradzahlig gespeichert, wegen Teilung *** az +// ****************************************************************** + + +int cntLayer = 0; +string usedLayer; +int cntalllay; +string allLayers[]; +string layerError; +string displayLayerError; + +string NetClassName[]; +int NetClassWidth[]; +int NetClassClear[]; +int NetClassDrill[]; +int NetClassNr[]; +int cNetClass[]; +int minClearance = 0; + +int sumNets = 0; +string NetName[]; +int NetClass[]; +string NetClassList[]; +int NetClassSelect = 0; +int NetCnt = 0; + +string falseNetList[]; +string falseNetSheet[]; +int falseNetCnt; + +numeric string statisticWirew[]; +numeric string statisticCLASS[]; +numeric string statisticFalseNets[]; +numeric string statisticLBR[]; +numeric string statisticPAC[]; +numeric string statisticDevice[]; +numeric string statisticVariant[]; + + + + +string onlyNetList[]; // only signal if connected to pad or smd is a true signal 2005.12.08 alf@cadsoft.de +int onlyNetCnt = 0; + +int cnt_Pin_on_net = 0; + + + +string Lbr[]; +int cLbr[]; +int cntLbr = 0; + +string PacName[]; +int cPacName[]; +int cntPacName = 0; + +string Device[]; +int cDevice[]; +int cntDevice = 0; + +string VDevice[]; +string Value[]; +string Variant[]; +string VPart[]; // Partname of same Value +int cVariant[]; +int cntVariant = 0; +int cntNewLine[]; + + +numeric string nPart[] = { "PART" }; +int cntnPart; + +numeric string InstanceGate[]; +int cntGate; +numeric string nGate[]; +int cntnGate; + +string Symbol[]; +int cSymbol[]; +int cntSymbol = 0; + + +// --- same Value and Package and Layer --- 2005.12.01 alf@cadsoft.de +int cntEVPL = 0; +string EVALpac[]; +string EvalPAC[]; +int cEVPL[]; + + +int emptyValue = 0; +string empty = "~/-empty-/~"; + +int cntPart = 0; +string Ename[]; + +int art_selected = 0; +int LBRselected; +int PACselected; +int DEVselected; +int VARselected; +int VALselected; +int NPselect; + +string Part_info = " \n \n \n"; +string linfo = " Double click in listings for detailed info."; +string Val_info = " Double click in listings for detailed info."; + +string sum; +int sumSignals = 0; + +string used_pac[], used_pac_lbr[]; +int cntusedpac = 0; +string unused_pac[], unused_pac_lbr[]; +int cntunusedpac = 0; + +string Text; + +string ulp_path = filedir(argv[0]); + + +string schfile; + + +// Functions + +real u2u(int v) { + switch (uval) { + case GRID_UNIT_MIC : return u2mic(v); + break; + + case GRID_UNIT_MM : return u2mm(v); + break; + + case GRID_UNIT_MIL : return u2mil(v); + break; + + case GRID_UNIT_INCH : return u2inch(v); + break; + } +} + + +string value(int v, string is) { + if (v == INT_MAX) return "not used " + is; + string sv; + switch (uval) { + case GRID_UNIT_INCH : sprintf(sv, "%.6f %s", u2inch(v), is); + break; + + case GRID_UNIT_MIL : sprintf(sv, "%.3f %s", u2mil(v), is); + break; + + case GRID_UNIT_MM : sprintf(sv, "%.4f %s", u2mm(v), is); + break; + + case GRID_UNIT_MIC : sprintf(sv, "%.1f %s", u2mic(v), is); + break; + } + return sv; +} + + + + +string saveReport(void) { + int t = time(); + int n; + string report = "Data Expoted from: "; + report += schfile + "\n"; + report += "with: " + argv[0] + "\n"; + report += "at: " + t2string(t) + "\n"; + report += EAGLE_SIGNATURE + "\n\n"; + report += usedLayer + "_________________________\n\n"; + report += layerError; + report += "\n"; + report += sum + "\n"; + report += "\n============================\n"; n=0; + + 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"; n=0; + 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 (statisticDevice[n]) { + report += statisticDevice[n] + "\n"; + n++; + } + + report += "\n"; n=0; + report += "\n----------------------------\n"; n=0; + report += "\n"; + report += "End report"; + return report; +} + + +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 infoLBR( string lbr) { + linfo = " Part : Device : Value : Package "; + string s, M; + schematic(S) { + S.parts(P) { + if (P.device.library == lbr) { + if (P.device.package) { + sprintf(s, "%s \t: %s\t: %s\t: %s\n", P.name, P.device.name, isempty(P.value), P.device.package.name); + Part_info += s; + } + else { + Part_info += P.name + "\t - \tDevice has no Package\n"; + } + } + } + } + return; +} + + +void infoPAC( string pac) { + linfo = " Part : Device : Value : Library "; + string s, M; + int getdrill = 0; + schematic(S) S.parts(P) { + if (P.device.package) { + if (P.device.package.name == pac) { + sprintf(s, "%s \t: %s\t: %s\t:%s\n", P.name, P.device.name, isempty(P.value), P.device.package.library); + Part_info += s; + } + } + } + return; +} + + +void infoDEV( string dev) { + string s; + linfo = " Part : Value : Package : Library "; + schematic(S) S.parts(P) if (P.device.name == dev) { + if (P.device.package) { + sprintf(s, "%s\t: %s\t: %s\t: %s\n", P.name, isempty(P.value), P.device.package.name, P.device.package.library); + Part_info += s; + } + } + return; +} + + +void get_Info(int art, string val) { + Part_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 : infoDEV(val); + break; + + default : break; + } + return; +} + + +string checkNet(string Net) { + string Sheetn = ""; + string separator = ""; + schematic(SCH) { + SCH.sheets(SH) { + SH.nets(N) { + if (Net == N.name) { + string s; + sprintf(s, "%d,", SH.number); + Sheetn += s; + separator = ","; + break; + } + } + } + } + if (!Sheetn) Sheetn = "Layer 0 ?"; + return Sheetn; +} + + +// main +if (schematic) { + int n; + schematic(SCH) { + schfile = SCH.name; + string usedLayers; + status(" Layers"); + SCH.layers(L) { + string sl; + sprintf(sl, "%3d\t%s\t%d", L.number, L.name, L.used); + allLayers[cntalllay] = sl; + cntalllay++; + if (L.used && L.number >=90 && L.number <= 99) { + cntLayer++; + sprintf(sl, "%2d %s\n", L.number, L.name); + usedLayers += sl; + } + } + sprintf(usedLayer, "used layers %d\n\n%s", cntLayer, usedLayers); + + SCH.classes(CL) { + // Net classes ******************** + NetClassNr[CL.number] = CL.number; + NetClassName[CL.number] = CL.name; + NetClassWidth[CL.number] = CL.width; + NetClassClear[CL.number] = CL.clearance; + NetClassDrill[CL.number] = CL.drill; + cNetClass[CL.number] = 0; + } + SCH.nets(N) { + status(" Nets "+N.name); + int true = 0; // only signal if connected to pad or smd is a true signal 2005.12.08 alf@cadsoft.de + N.pinrefs(PR) { + true = 1; + break; + } + if (true) { + cNetClass[N.class.number]++; + sumNets++; + NetName[NetCnt] = N.name; + NetClass[NetCnt] = N.class.number; + NetCnt++; + NetClassList[N.class.number] += N.name + "\n"; + } + else { + falseNetList[falseNetCnt] = N.name; // only signal if connected to pad or smd is a true signal + falseNetSheet[falseNetCnt] = checkNet(N.name); + falseNetCnt++; + } + } + + SCH.parts(P) { + P.instances(I) { + status(" Instance "+I.name); + if (!I.sheet) { + sprintf(nGate[cntnGate], "%s\t%s\t%s\t%s", P.name, I.gate.name, P.value, P.device.library); + cntnGate++; + } + else { + sprintf(InstanceGate[cntGate], "%s\t%s\t%d\t%s", P.name, I.gate.name, I.sheet, P.device.library); + cntGate++; + } + } + + // Part Libraries ********* + for (n = 0; n <= cntLbr; n++) { + if (Lbr[n] == P.device.library) { + cLbr[n]++; + break; + } + } + if (n > cntLbr) { + cntLbr++; + Lbr[cntLbr] = P.device.library; + cLbr[cntLbr]++; + } + + // Part Package ********* + if (P.device.package) { // nur Parts mit Package sonst Symbol wie Frame/Supply etc. + status(" Package "+P.name); + + for (n = 0; n <= cntPacName; n++) { + if (PacName[n] == P.device.package.name) { + cPacName[n]++; + break; + } + } + if (n > cntPacName) { + cntPacName++; + PacName[cntPacName] = P.device.package.name; + cPacName[cntPacName]++; + } + + for (n = 0; n <= cntDevice; n++ ) { + if (Device[n] == P.device.name) { + cDevice[n]++; + break; + }; + } + if (n > cntDevice) { + cntDevice++; + Device[n] = P.device.name; + cDevice[cntDevice]++; + } + + // Value & Variant 2006.03.16 alf + string Pval = P.value; + if (!Pval) Pval = empty; + cntnPart++; + nPart[cntnPart] = P.name; + for (n = 0; n <= cntVariant; n++) { + if (VDevice[n] == P.device.package.name && Value[n] == Pval && Variant[n] == P.device.name) { + VPart[n] += ";"; + cVariant[n]++; + cntNewLine[n]++; + if (cntNewLine[n] == 29) { + cntNewLine[n] = 0; + VPart[n] += "\n"; + } + VPart[n] += P.name; + break; + } + } + if (n > cntVariant) { + cntVariant++; + VDevice[cntVariant] = P.device.package.name; + Value[cntVariant] = Pval; + Variant[cntVariant] = P.device.name; + VPart[n] += P.name; + cVariant[cntVariant]++; + } + } + else { + for (n = 0; n <= cntSymbol; n++ ) { + if (Symbol[n] == P.device.name) { + cSymbol[n]++; + break; + }; + } + if (n > cntSymbol) { + cntSymbol++; + Symbol[n] = P.device.name; + cSymbol[cntSymbol]++; + } + } + + + // Part Value ********* 2005.12.01 alf@cadsoft.de + // ----- List by Value/Package/Layer ----------- + string Pv = P.value; + if (Pv == "") { + Pv = empty + P.name; + emptyValue++; + } + for (n = 0; n <= cntEVPL; n++) { + if (P.device.package) { + if (EVALpac[n] == Pv && EvalPAC[n] == P.device.package.name ) { + cEVPL[n]++; + break; + } + } + } + if (n > cntEVPL) { + cntEVPL++; + EVALpac[cntEVPL] = Pv; + if (P.device.package) { + EvalPAC[cntEVPL] = P.device.package.name; + } + else { + EvalPAC[cntEVPL] = "-- only Symbol --"; + } + cEVPL[cntEVPL]++; + } + } + SCH.libraries(L) { // 2006.05.09 check unused packages + L.devicesets(DS) { + status(" Devicesets "+DS.name); + DS.devices(D) { + if (D.package) { + int n; + for (n = 0; n <= cntPacName; n++) { + if (D.package.name == PacName[n]) { + used_pac[cntusedpac] = D.package.name + "\t" + DS.name + L.name; + cntusedpac++; + break; + } + } + if (n > cntPacName) { + unused_pac[cntunusedpac] = D.package.name + "\t" + DS.name + L.name; + cntunusedpac++; + } + } + else { + ; // only Symbol (Supply) + } + } + } + } + } + + status(" Generate listings"); + int x = 0; + // Statistic tabels + // Net Class ******************** + statisticCLASS[x] = "# - Name\tmin. Width\tClearance\tmin. Drill\tUsed"; + for (n = 0; n <= 7; n++) { + if (NetClassName[n]) { + if(minClearance > NetClassClear[n]) minClearance = NetClassClear[n]; + x++; + sprintf(statisticCLASS[x], "%1d - %s\t%s\t%s\t%s\t%-4d", + NetClassNr[n], + NetClassName[n], + value(NetClassWidth[n], ""), + value(NetClassClear[n], ""), + value(NetClassDrill[n], ""), + cNetClass[n] + ); + } + } + + + x = 0; + // flase Signals ******************** 2005.12.08 alf@cadsoft.de + statisticFalseNets[x] = "Net-Name\tSheet"; + for (n = 0; n < falseNetCnt; n++) { + x++; + sprintf( statisticFalseNets[x], "%s\t%s", + falseNetList[n], // only net if connected to pin is a true Net + falseNetSheet[n] + ); + } + + + x = 0; + statisticLBR[x] = "LIBRARY\tQuant."; + for ( n = 0; n <= cntLbr; n++) { + if (cLbr[n]) { + x++; + sprintf(statisticLBR[x], "%s\t%-4d", Lbr[n], cLbr[n] ); + } + } + + x = 0; + statisticPAC[x] = "PACKAGE\tQuant."; + for ( n = 0; n <= cntPacName; n++) { + if (cPacName[n]) { + x++; + sprintf(statisticPAC[x], "%s\t%-4d", PacName[n], cPacName[n] ); + } + } + + x = 0; + statisticDevice[x] = "DEVICE\tQuant."; + for ( n = 0; n <= cntDevice; n++) { + if (cDevice[n]) { + x++; + sprintf(statisticDevice[x], "%s\t%-4d", Device[n], cDevice[n] ); + } + } + x = 0; + statisticVariant[0] = "VALUE\tDEVICE\tVARIANT\tQuant."; + for ( n = 0; n <= cntVariant; n++) { + if (cDevice[n]) { + x++; + sprintf(statisticVariant[x], "%s\t%s\t%s\t%-4d", Value[n], VDevice[n], Variant[n], cVariant[n] ); + } + } + + + int Selected = 0; + // ********************************************************************* + dlgDialog("Statistic of " + schfile) { + dlgHBoxLayout { + dlgTabWidget { // *** schematic *** + dlgTabPage("&SCHEMATIC") { + dlgHBoxLayout { + dlgSpacing(10); + dlgVBoxLayout { + dlgSpacing(10); + dlgLabel("


"); + 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(" No placed Gates "); + dlgListView(" Part\tGate\tValue\tLibrary", nGate, Gselect); + } + dlgStretch(1); + } + } + + dlgTabPage("&Value") { // *** Value *** + dlgHBoxLayout { + dlgVBoxLayout { + dlgHBoxLayout { + dlgListView("", statisticVariant, VALselected) { + art_selected = 3; + Val_info = VPart[VALselected]; + dlgRedisplay(); + } + dlgStretch(1); + } + } + } + dlgSpacing(8); + dlgHBoxLayout { + dlgSpacing(8); + dlgLabel(Val_info, 1); + } + dlgSpacing(8); + } + + dlgTabPage("P&ackage") { // *** Unused Packages *** + int unusedselected, usedselected; + int lsort = 0; + dlgHBoxLayout { + dlgVBoxLayout { + dlgHBoxLayout { + dlgListView("Used Package-Variant\tLibrary", used_pac, usedselected, lsort); + dlgListView("Unused Package-Variant\tLibrary", unused_pac, unusedselected, lsort); + dlgStretch(1); + } + } + } + } + + } + } + + dlgHBoxLayout { + dlgPushButton("-&Quit") dlgAccept(); + dlgPushButton("&Save report") { + string fileName = dlgFileSave("Select a file", filesetext(schfile,".rep"), "*.rep"); + if (fileName) { + output(fileName, "wt") { + printf("%s", saveReport()); + } + } + } + dlgSpacing(50); + dlgLabel("All Units = " + unit[uval]); + dlgSpacing(50); + dlgStretch(1); + } + dlgHBoxLayout { + dlgLabel("Database:"); + dlgLabel(schfile, 1); + dlgStretch(1); + } + }; + exit (0); +} + + + +else dlgMessageBox("Start this ULP from a Schematic", "OK"); + diff --git a/eagle-5.7.0/ulp/statistic_attention_min_value.bmp b/eagle-5.7.0/ulp/statistic_attention_min_value.bmp new file mode 100644 index 0000000..4b36bb5 Binary files /dev/null and b/eagle-5.7.0/ulp/statistic_attention_min_value.bmp differ diff --git a/eagle-5.7.0/ulp/trace-layer.ulp b/eagle-5.7.0/ulp/trace-layer.ulp new file mode 100644 index 0000000..9c19cda --- /dev/null +++ b/eagle-5.7.0/ulp/trace-layer.ulp @@ -0,0 +1,122 @@ +#usage "Trace layer, to display layers step by step.

" + "RUN trace-layer +
" + "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" + "

" + "Usage: RUN ulpmessage text" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +dlgMessageBox("" + argv[1] + "
" + argv[2] + "
", "OK"); exit(0); + diff --git a/eagle-5.7.0/ulp/unidat.ulp b/eagle-5.7.0/ulp/unidat.ulp new file mode 100644 index 0000000..8051d99 --- /dev/null +++ b/eagle-5.7.0/ulp/unidat.ulp @@ -0,0 +1,1021 @@ +#usage "Export UNIDAT format\n" + "

" + "Author: support@cadsoft.de" + +#require 4.1106 + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +/////////////////////////////////////////////////////////////////////////////////////////// +// Rudi Hofer, CadSoft, rudi.hofer@cadsoft.de, 9/1999 +// +// Revision 1.1: shape names derived from element names instead of package names (unique!) +// Revision 1.2: output limited to elements with package in routine "component" +// Revision 1.3: output of round pads corrected +// Revision 2.0: shape names again derived from package names (seems to be the only +// solution which makes sense) +// +// Revision 3.0: include Crossref.ULP with Pin_Name from Sheet -- alf@cadsoft.de +// Revision 4.0: for EAGLE Version 4.0 with Dialog -- alf@cadsoft.de +// Revision 5.0: exports Polygon of signals -- alf@cadsoft.de +// Revision 6.0: exports Fiducial if placed from MAKRS.lbr -- alf@cadsoft.de 30.03.2004 +// Source: unidat.format.91010.doc from +// +// Revision 7.0: correct rotation in rot() function 16.02.2005 alf@cadsoft.de +// Revision 8.0: Display status of ULP in any function -- alf@cadsoft.de 31.03.2005 +// Function rot() : correct rotation for any angle +// Pad/Smd-Rotation consider in Eagle 4.1 +// resolution in 1/1000 +// +/////////////////////////////////////////////////////////////////////////////////////////// +// Since version 2.0 all packages with the same name must be identical (avoid REPLACE!) +/////////////////////////////////////////////////////////////////////////////////////////// +// This ULP generates output for UNICAM software which is able to convert the +// data for automatic mounting and test equipment. The resolution is fixed to 1/100 mm. +// +// To generate the output, load the board and run this ULP. +// +// You can provide properties like "partnumber", "tolerance" etc. in the +// component library: +// +// - define a user layer named UNIDAT +// - add texts in the form "propertyname=value" to this layer, e.g. +// partnumber=12345 +// pos_tolerance=0.05 +// - see array property[] below for predefined property names +// - by changing the array contents you can change the property names +// (do not change the number of array entries!) +// +// OUTPUT OF PROPERTIES IS ONLY POSSIBLE IF FORWARD & BACK ANNOTATION IS USED AND +// IF THE SCHEMATIC AND THE BOARD ARE LOADED! +// THE PROGRAM HAS TO BE EXECUTED FROM THE BOARD WINDOW! +// +// +// Pads of the shape type OCTAGON are changed to round, if the following variable +// is set to 1 (otherwise set to 0) + + int disp_oct_as_round = 1; + +// +/////////////////////////////////////////////////////////////////////////////////////////// + +/* Dieses ULP erzeugt eine Cross-Referenzliste zwischen Pad und Pin *** + * Dabei wird eine Liste generiert, in der die Koordinaten + * der Pads/Netze im Board, in Bezug zu den Pins/Netze im + * Schaltplan(Sheet Nr.) stehen. + * A. Zaffran CadSoft 07.09.1999 + */ + +/* + +%COMPONENT +C1|N$5|sheet2|15.240,8.890|mm| +C1|1|N$5|sheet2|15.240,8.890|mm| +| | | | | | +| | | | X Y +| | | Seite +| | Netzname +| Pad-Name +Bauteil + +%PINS +IC1|IC1A|FILTER|1|I0|sheet1|25.40,22.86|mm| +| | | | | | | | +| | | | | | X Y +| | | | | Seite +| | | | Symbolischer Pin-Name +| | | Numerischer Pin-Name +| | Netzname +| Gate-Name +Bauteil + +*/ + +string _MARKER_ = "marks"; // the library name for fiducials + +int px[], py[], ps[], PinPoints = 0; // Pin: x, y, sheet, counter +string pa[], pg[], pc[], pn[], pnn[]; + // Part-name, gate-name, contact-name, pinname, pin-netname + +int padx[], pady[], pads[], PadPoints = 0; // Pad: x, y, sheet, counter +string padd[], padn[], padnn[]; // devicename, padname, pad-netname + +int sheetload = 0; +string proz = "%"; +string Pad_Pin = ""; + +enum { bottom = 16 }; + +string reffile; +string unifile; + +string ULPversion = filename(argv[0]); + +//----------------------------------------------------- + +string user_layer_name = "unidat", // layer name for property definitions (lower case!) + jobname, +// jobrevision = "1.0", + layer_name[], + property_assign_char = "=", + property[] = {"partnumber" // propterty[0] is partnumber and so on + ,"parttype" + ,"description" + ,"pos_tolerance" + ,"neg_tolerance" + ,"user1" + ,"user2" + ,"user3" + }, + property_value[], + /* + 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) + */ + padshape[] = {"S","R","O","L","T"}, // shapes - square, round, oct, long, offset + padname, + shapename[]; + +real ang2, cx, cy, rx, ry, x, y, x1, x2, y1, y2, r, a1, a2;; + +int i, + padcount, + pad_is_numeric, + max_property = 7, + new, + sx = 0; + +// -------------------------------------------------------------------- + +void test(void) { + string ref; + int nr = fileread(ref, reffile); + string uni; + int nu = fileread(uni, unifile); + dlgDialog("UNIDAT File export") { + dlgLabel("UNIDAT File: " + unifile); + dlgTextView(uni); + dlgLabel("Cross reference file: " + reffile); + dlgTextView(ref); + dlgHBoxLayout { dlgSpacing(400); } + dlgLabel("Fiducial library = '" + _MARKER_ + "'"); + dlgHBoxLayout { + dlgStretch(1); + dlgPushButton("+OK") dlgAccept(); + dlgStretch(1); + } + }; + return; +} + +void Header(string name) { + printf(";This file is generated by %s from:\n", ULPversion); + printf(";%s';\n", name); +} + +int search_Pad_Pin(string name, string pad) { + for (int pin = 0; pin < PinPoints; pin++) { + if (pa[pin] == name && pc[pin] == pad){ + break; + } + } + if (pin == PinPoints) pin = -2; + return pin; +} + +// -------------------------------------------------------------------- + +real u2u(int x) { // resolution 1/100 mm + x = round(x * 100)/100; + return u2mm(x); // if mm +} + +real u2ang(real x) { + if (x > 360) + x = x -360; + x = round(x * 10)/10; + return x; +} + +//----------------------------------------------------- +real Xneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * cos(rad)); + } +} + +//----------------------------------------------------- +real Yneu(real Xalt, real Yalt, real Xorigin, real Yorigin, real UserWinkel) { + real RADIUS = sqrt(((Xalt - Xorigin) * (Xalt - Xorigin)) + ((Yalt - Yorigin) * (Yalt - Yorigin))); + real WinkelNeu; /* alter Cosinus Winkel = (Xalt - Xorigin) / RADIUS; */ + + if ((Xalt > Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 1 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt >= Yorigin)) { /* Quadrant 2 */ + WinkelNeu = acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt < Xorigin) && (Yalt < Yorigin)) { /* Quadrant 3 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt > Xorigin) && (Yalt < Yorigin)) { /* Quadrant 4 */ + WinkelNeu = 360 - acos((Xalt - Xorigin) / RADIUS) * 57.29578 + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt == Yorigin)) { /* Ursprung */ + WinkelNeu = (Xalt - Xorigin) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt > Yorigin)) { /* 90° */ + WinkelNeu = (Xalt - Xorigin + 90) + UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } + if ((Xalt == Xorigin) && (Yalt < Yorigin)) { /* 270° */ + WinkelNeu = (Xalt - Xorigin + 270)+ UserWinkel; + real rad = PI / 180 * WinkelNeu; + return (RADIUS * sin(rad)); + } +} + + + + +//----------------------------------------------------- +void rot(real alfa, real xt, real yt) { // change if finer rotation possible + // 30.03.2005 alf@cadsoft.de + if (alfa == 0) { + x = xt; y = yt; + } + else if (alfa == 90) { + x = yt; y = -xt; + } + else if (alfa == 180) { + x = -xt; y = -yt; + } + else if (alfa == 270) { + x = -yt; y = xt; + } + else { + x = Xneu(xt, yt, 0.0, 0.0, 360 - alfa); + y = Yneu(xt, yt, 0.0, 0.0, 360 - alfa); + } + x = round(x * 1000)/1000; + y = round(y * 1000)/1000; // resolution 1/1000 mm + return; +} + +//----------------------------------------------------- +string padtype(UL_CONTACT C) { // name contains shape SROXY or SM for SMD + string s; // diam_drill (in 1/100mm) or smdx_y in (1/100 mm) + real pdi, pdr, sx, sy; // e.g. SR_140_80 or SM_100_120 + if (C.pad) { + pdi = round(u2u(C.pad.diameter[bottom]) * 100); + pdr = round(u2u(C.pad.drill) * 100); // not used + sprintf(s, "P%s_%03.0f", padshape[C.pad.shape[bottom]], pdi); // pdr could be used, too + } + if (C.smd) { + sx = round(u2u(C.smd.dx) * 100); + sy = round(u2u(C.smd.dy) * 100); + sprintf(s, "SM_%03.0f_%03.0f", sx, sy); + } + return s; +} + +//----------------------------------------------------- +real padrotation(UL_CONTACT C) { + if (C.pad) return C.pad.angle; + if (C.smd) return C.smd.angle; +} + +//----------------------------------------------------- +int padelongation(UL_CONTACT C) { + int e = 0; + if (C.pad) e = C.pad.elongation; + return e; +} + +//----------------------------------------------------- +string viatype(UL_VIA V) { + string s; // diam_drill (in 1/100mm) + real pdi, pdr, sx, sy; // e.g. SR_140_80 or SM_100_120 + pdi = round(u2u(V.diameter[bottom]) * 100); + pdr = round(u2u(V.drill) * 100); // not used + sprintf(s, "P%s_%03.0f", padshape[V.shape[bottom]], pdi); // pdr could be used, too + return s; +} +//----------------------------------------------------- +void print_pad_shape(string s, real r, int e) { + real x, y, w, wx, wy, a, b, c, d, elong = e/100; + + string s1; + sprintf(s1, "%s.%s", strsub(s, 3, 1), strsub(s, 4, 2)); + x = strtod(s1); + if (strsub(s, 1, 1) == padshape[0]) { // look for padshape S|R|O|L|T + w = x/2; + printf("L (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g)\n", + w, w, w,-w, -w,-w, -w, w, w, w); + } + if (strsub(s, 1, 1) == padshape[1]) { + printf("C 0,0,%s.%s\n", strsub(s, 3, 1), strsub(s, 4, 2)); + } + if (strsub(s, 1, 1) == padshape[2]) { + if (!disp_oct_as_round) { + x = x/2; + w = x/2; + printf("L (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g)\n", + w, x, x, w, x,-w, w,-x, -w,-x, -x,-w, -x, w, -w, x, w, x); + } + else { + printf("C 0,0,%s.%s\n", strsub(s, 3, 1), strsub(s, 4, 2)); + } + } + if (strsub(s, 1, 1) == padshape[3]) { // long + a = 3*x/8; b = x/2*elong; c = x/8; d = x/4; // dimension ratio x:y = elong + printf("L (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g)\n", + a,d, b,c, b,-c, a,-d, -a,-d, -b,-c, -b,c, -a,d, a,d); + } + if (strsub(s, 1, 1) == padshape[4]) { // offset + a = 3*x/8; b = x/2*elong; c = x/8; d = x/4; // dimension ratio x:y = elong + printf("L (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g)\n", + a,d, b,c, b,-c, a,-d, -a,-d, -b,-c, -b,c, -a,d, a,d); + } + if (strsub(s, 1, 1) == "M") { // look for padshape M = SMD + sprintf(s1, "%s.%s", strsub(s, 7, 1), strsub(s, 8, 2)); + y = strtod(s1); + wx = x/2; wy = y/2; + printf("L (%g,%g) (%g,%g) (%g,%g) (%g,%g) (%g,%g)\n", + wx, wy, wx,-wy, -wx,-wy, -wx, wy, wx, wy); + } + return; +} + +//----------------------------------------------------- +void center(UL_ELEMENT E) { // returns cx, cy + real xmin, xmax, ymin, ymax; + xmin = u2u(E.x); xmax = xmin; + ymin = u2u(E.y); ymax = ymin; + E.package.wires(W){ + if (W.layer == LAYER_TPLACE || W.layer == LAYER_BPLACE) { + xmin = min(u2u(W.x1),xmin); + xmin = min(u2u(W.x2),xmin); + ymin = min(u2u(W.y1),ymin); + ymin = min(u2u(W.y2),ymin); + xmax = max(u2u(W.x1),xmax); + xmax = max(u2u(W.x2),xmax); + ymax = max(u2u(W.y1),ymax); + ymax = max(u2u(W.y2),ymax); + } + } + cx = (xmin+xmax)/2; cy = (ymin+ymax)/2; + return; +} + +//----------------------------------------------------- +string smd_info(UL_ELEMENT E) { + E.package.contacts(C) { + if (C.pad) return "THT"; + else return "SMD"; + } + return "SMD"; // in case it has no electrical connection (e.g. fiducial) +} + +//--------------------------------------------------- +void get_user_parameters(UL_ELEMENT E) { // assign property_values[] + string s, pname, pvalue; + int pos, len; + if (project.schematic) { + project.schematic(S) { + S.parts(P) { + if (P.name == E.name) { + P.instances(I) { + for (i = 0; i <= max_property; i++) { // clear properties + property_value[i] = ""; + } + I.gate.symbol.texts(T) { + if (strlwr(layer_name[T.layer]) == user_layer_name) { + s = T.value; + len = strlen(s); + pos = strstr(s, property_assign_char); + if (pos > 0) { + pname = strsub(s, 0, pos); + pvalue = strsub(s, pos+1, len - pos); + i = 0; + while (i <= max_property) { + if (property[i] == strlwr(pname)) { + property_value[i] = pvalue; + } + i++; + } + } + } + } + } + } + } + } + } + else { // no schematic -> no properties + for (i = 0; i <= max_property; i++) { // clear properties + property_value[i] = ""; + } + } + return; +} + +//--------------------------------------------------- +string signame(string elname, string padname) { + string s = ""; + board(B) { + B.signals(S) { + S.contactrefs(C) { + if (C.element.name == elname) { + if (C.contact.name == padname) { + s = S.name; + } + } + } + } + } + return s; +} + +////////////////////////////////////////////////////// +void create_info() { + status("Info"); + int t = time(); + printf ("%%%%%%INFO\n"); + printf ("DATE=%02d.%02d.%02d %02d:%02d:%02d\n", + t2day(t),t2month(t)+1,t2year(t),t2hour(t),t2minute(t),t2second(t)); + printf ("DELIMITER=|\n"); + printf ("UNITS=MM\n"); + printf ("UNIDAT_VERSION=1.2\n"); // Unidat Software Version + printf ("JOB_NAME=%s\n", jobname); +//printf ("JOB_REVISION=%s\n", jobrevision); // get from somewhere + printf ("NR_OF_PCBOARDS=1\n"); + printf ("TOP_LAYER=1\n"); + printf ("BOTTOM_LAYER=16\n"); + printf ("CADSOFTWARE=EAGLE %d.%d\n", EAGLE_VERSION, EAGLE_RELEASE); + // schematic information could be added here + // e.g. create script file which creates a postscript schematic file + return; +} + +////////////////////////////////////////////////////// +void outline(UL_BOARD B) { + printf ("\n%%%%OUTLINE\n"); + printf ("%%GRAFITEM\n"); + B.wires(W) { + if(W.curve) { + if (W.layer == LAYER_DIMENSION) { + printf("A %g,%g,%g,%.1f,%.1f\n", + u2u(W.arc.xc),u2u(W.arc.yc),u2u(W.arc.radius),u2ang(W.arc.angle1),u2ang(W.arc.angle2 - W.arc.angle1)); + } + } + else { + if (W.layer == LAYER_DIMENSION) { + printf("L (%g,%g) (%g,%g)\n", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + } + } + B.circles(C) { + if (C.layer == LAYER_DIMENSION) { + printf("C %g,%g,%g\n", u2u(C.x), u2u(C.y), u2u(C.radius)); + } + } + B.elements(E) { + E.package.wires(W) { + if(W.curve) { + if (W.layer == LAYER_DIMENSION) { + printf("A %g,%g,%g,%.1f,%.1f\n", + u2u(W.arc.xc),u2u(W.arc.yc),u2u(W.arc.radius),u2ang(W.arc.angle1),u2ang(W.arc.angle2 - W.arc.angle1)); + } + } + else { + if (W.layer == LAYER_DIMENSION) { + printf("L (%g,%g) (%g,%g)\n", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + } + } + } + printf ("%%ENDGRAFITEM\n"); + return; +} + +////////////////////////////////////////////////////// +void fiducials(UL_BOARD B) { + printf ("\n%%%%FIDUCIALS\n"); + B.elements(E) { + if (E.package.library == _MARKER_) { + printf("%s|||",E.name); // NAME + printf("%g|%g|",u2u(E.x), u2u(E.y)); // X,Y + printf("%.1f|",u2ang(E.angle)); // ROTATION + if (E.mirror) printf("bottom|"); // ASSEMBLY SIDE + else printf("top|"); + printf("%s|",E.package.name); // SHAPE (e.g. SH_IC1) // special version + printf("\n"); + } + } + return; +} + +////////////////////////////////////////////////////// +void component(UL_BOARD B) { + printf ("\n%%%%COMPONENT\n"); + B.elements(E) { // add exclusion for el. w/o package!!! + if (E.package.library != _MARKER_) { + if (E.package) { + status("Component " + E.name); + get_user_parameters(E); // get user defined prop. from spec. layer + printf("%s|",E.name); // NAME + printf("%s|",property_value[0]); // PARTNUMBER + printf("|"); // PARTCODE not used + printf("%s|",property_value[1]); // PARTTYPE + printf("%s|",property_value[2]); // PARTDESCRIPTION + printf("%s|",E.package.name); // SHAPE (e.g. SH_IC1) // special version + printf("%.1f|",u2ang(E.angle)); // ROTATION + if (E.mirror) printf("bottom|"); // ASSEMBLY SIDE + else printf("top|"); + printf("%g|%g|",u2u(E.x), u2u(E.y)); // X,Y + center(E); + printf("%g|%g|",cx, cy); // X,Y of center point + printf("%s|", smd_info(E)); // SMD or Through-hole + printf("|0|"); // VALUE = 0 + printf("%s|",property_value[3]); // POS TOLERANCE + printf("%s|",property_value[4]); // NEG TOLERANCE + printf("%s|",property_value[5]); // USER1 + printf("%s|",property_value[6]); // USER2 + printf("%s",property_value[7]); // USER3 + printf("\n"); + } + } + } + return; +} + +////////////////////////////////////////////////////// +void other_drillings(UL_BOARD B) { + printf ("\n%%%%OTHER_DRILLINGS\n"); + return; +} + +////////////////////////////////////////////////////// +void component_pin(UL_BOARD B) { + printf ("\n%%%%COMPONENT_PIN\n"); + B.elements(E) { + if (E.package.library != _MARKER_) { + status("Component pin " + E.package.name); + pad_is_numeric = 1; + E.package.contacts(C) { // test if name numeric + padname = C.name; + for (i = 0; padname[i]; ++i) { + if (!isdigit(padname[i])) { + pad_is_numeric = 0; + } + } + } + padcount = 1; + rx = u2u(E.x); ry = u2u(E.y); // origin of package + E.package.contacts(C) { + status("Comp-Pin " + E.package.name); // 29.03.2005 alf@cadsoft.de + printf("%s|",E.name); // COMP. NAME + if (pad_is_numeric) { + printf("%s|", C.name); // PADNR + } + else { + printf("%d|", padcount); + padcount++; + } + int pin = search_Pad_Pin(E.name, C.name); + if (sheetload) { + if (pin < 0) { + printf("|"); // Gate not placed + } + else { + printf("%s|", pn[pin]); // PIN NAME + } + } + else { + printf("no-sheet|"); + } + + printf("%s|", signame(E.name, C.name)); // NET NAME + x1 = u2u(C.x)-rx; y1 = u2u(C.y)-ry; + rot(E.angle, x1, y1); // get x,y + printf("%g|%g|", x, y); // REL. POSITION OF PADS + if (C.pad) { + printf("%s|", padtype(C)); // PADTYPE TOP + printf("%.1f|", u2ang(E.angle)); // PAD ORIENTATION TOP + printf("%s|", padtype(C)); // PADTYPE BOTTOM + printf("%.1f", u2ang(E.angle)); // PAD ORIENTATION BOTTOM + } + if (C.smd) { + if (C.smd.layer == LAYER_TOP) { + printf("%s|", padtype(C)); // PADTYPE TOP + printf("%.1f|", u2ang(E.angle)); // PAD ORIENTATION TOP + printf("|"); // BOTTOM empty + } + else { + printf("||"); // TOP empty + printf("%s|", padtype(C)); // PADTYPE BOTTOM + printf("%.1f", u2ang(E.angle)); // PAD ORIENTATION BOTTOM + } + } + printf("\n"); + } + } + } + return; +} + +////////////////////////////////////////////////////// +void pad(UL_BOARD B) { + string t[]; + int i, j = 0, new; + printf ("\n%%%%PAD\n"); + status("Pads"); + B.elements(E) { + if (E.package.library != _MARKER_) { + E.package.contacts(C) { + new = 1; // padtype not generated yet + for (i = 0; t[i]; i++) { + if (t[i] == padtype(C)) new = 0; // padtype exists + } + if (new) { + t[j] = padtype(C); + j++; + printf("PAD=%s\n", padtype(C)); + printf("%%GRAFITEM\n"); + printf("FC 9,0,0,0\n"); + print_pad_shape(padtype(C), padrotation(C), padelongation(C)); + printf("%%ENDGRAFITEM\n"); + } + } + } + } + B.signals(S) { + status("Vias"); + S.vias(V) { + new = 1; + for (i = 0; t[i]; i++) { + if (t[i] == viatype(V)) new = 0; // padtype exists + } + if (new) { + t[j] = viatype(V); + j++; + printf("PAD=%s\n", viatype(V)); + printf("%%GRAFITEM\n"); + printf("FC 9,0,0,0\n"); + print_pad_shape(viatype(V), 0, 0); + printf("%%ENDGRAFITEM\n"); + } + } + } + return; +} + +////////////////////////////////////////////////////// +void shape(UL_BOARD B) { // what if mirrored? + sx = 0; + printf ("\n%%%%SHAPE\n"); + B.elements(E) { + if (E.package.library != _MARKER_) { + new = 1; // padstacktype not generated yet + for (i = 0; shapename[i]; i++) { + if (shapename[i] == E.package.name) new = 0; // shapename exists + } + if (new) { + status("Shape " + E.package.name); // 29.03.2005 + shapename[sx] = E.package.name; + sx++; + printf ("SHAPE=%s\n", E.package.name); + printf ("%%SHAPEOUTLINE\n"); + printf ("%%GRAFITEM\n"); + rx = u2u(E.x); ry = u2u(E.y); // origin for rot function + E.package.wires(W) { + if (W.curve) { + if (W.arc.layer == LAYER_TPLACE || W.arc.layer == LAYER_BPLACE) { + x1 = u2u(W.arc.xc)-rx; y1 = u2u(W.arc.yc)-ry; + rot(E.angle, x1, y1); // new coord x,y + printf("A %g,%g,%g,%.1f,%.1f\n", + x, y, u2u(W.arc.radius),u2ang(W.arc.angle1 - E.angle),u2ang(W.arc.angle2 - W.arc.angle1)); + } + } + else { + if (W.layer == LAYER_TPLACE || W.layer == LAYER_BPLACE) { + x1 = u2u(W.x1)-rx; y1 = u2u(W.y1)-ry; x2 = u2u(W.x2)-rx; y2 = u2u(W.y2)-ry; + rot(E.angle, x1, y1); x1 = x; y1 = y; + rot(E.angle, x2, y2); x2 = x; y2 = y; + printf("L (%g,%g) (%g,%g)\n", x1, y1, x2, y2); + } + } + } + E.package.circles(C) { + if (C.layer == LAYER_TPLACE || C.layer == LAYER_BPLACE) { + x1 = u2u(C.x)-rx; y1 = u2u(C.y)-ry; + rot(E.angle, x1, y1); + printf("C %g,%g,%g\n", x, y, u2u(C.radius)); + } + } + printf ("%%ENDGRAFITEM\n"); + printf ("%%PACKAGEDIMENSION\n"); + printf ("%%PINLIST\n"); + pad_is_numeric = 1; + E.package.contacts(C) { // test if name numeric + padname = C.name; + for (i = 0; padname[i]; ++i) { + if (!isdigit(padname[i])) { + pad_is_numeric = 0; + } + } + } + padcount = 1; + E.package.contacts(C) { + if (pad_is_numeric) { + printf("%s|", C.name); // PADNR + } + else { + printf("%d|", padcount); + padcount++; + } + x1 = u2u(C.x)-rx; y1 = u2u(C.y)-ry; + rot(E.angle, x1, y1); // get x,y + printf("%g|%g|", x, y); // REL. POSITION OF PADS + if (C.pad) { + printf("%s|", padtype(C)); // PADTYPE TOP + printf("%.1f|", u2ang(E.angle)); // PAD ORIENTATION TOP + printf("%s|", padtype(C)); // PADTYPE BOTTOM + printf("%.1f", u2ang(E.angle)); // PAD ORIENTATION BOTTOM + } + if (C.smd) { + if (C.smd.layer == LAYER_TOP) { + printf("%s|", padtype(C)); // PADTYPE TOP + printf("%.1f|", u2ang(E.angle)); // PAD ORIENTATION TOP + printf("|"); // BOTTOM empty + } + else { + printf("||"); // TOP empty + printf("%s|", padtype(C)); // PADTYPE BOTTOM + printf("%.1f", u2ang(E.angle)); // PAD ORIENTATION BOTTOM + } + } + printf("\n"); + } + } + } + } + return; +} + +////////////////////////////////////////////////////// +void via(UL_BOARD B) { + int i; + printf("\n%%%%VIA\n"); + B.signals(S) { + status("S-Via " + S.name); + S.vias(V) { + i++; + printf("VIA%d|%s|%g|%g|1|16|%s|0|%s|0|Y|Y\n", + i, S.name, u2u(V.x), u2u(V.y), viatype(V), viatype(V)); + } + } + return; +} + +////////////////////////////////////////////////////// +void track(UL_BOARD B) { + printf("\n%%%%TRACK\n"); + B.signals(S) { + status("Track " + S.name); + printf("NET=%s\n", S.name); + printf("%%GRAFITEM\n"); + S.wires(W) { + printf("N %d\n", W.layer); + printf("W %g\n", u2u(W.width)); + printf("FC 0,0,0,0\n"); + printf("L (%g,%g) (%g,%g)\n", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + S.polygons(POL) { + POL.contours(W) { + printf("N %d\n", W.layer); + printf("W %g\n", u2u(W.width)); + printf("FC 0,0,0,0\n"); + printf("L (%g,%g) (%g,%g)\n", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + POL.fillings(W) { + printf("N %d\n", W.layer); + printf("W %g\n", u2u(W.width)); + printf("FC 0,0,0,0\n"); + printf("L (%g,%g) (%g,%g)\n", u2u(W.x1), u2u(W.y1), u2u(W.x2), u2u(W.y2)); + } + } + printf("%%ENDGRAFITEM\n"); + } + return; +} + +////////////////////////////////////////////////////// +void create_pcboard_section(UL_BOARD B) { + // printf ("\n%%%%%%PCBOARDIdentifier\n"); + outline(B); + //panelstructure(); + fiducials(B); + component(B); + other_drillings(B); + component_pin(B); + //subcomponent(); + //testpad(); + pad(B); + shape(B); + via(B); + track(B); + //summary(); + return; +} + +////////////////////////////////////////////////////// + +//main +// *** Board coord. *** +if (board) board(B) { + reffile = filesetext(B.name, ".ref"); + output(reffile, "wt") { + Header(B.name); + printf("%sCOMPONENT\n", proz); + + // *** collect all pads *** + B.elements(E) { + if (E.package.library != _MARKER_) { + status("Package " + E.package.name); // 29.03.2005 alf@cadsoft.de + E.package.contacts(C) { + if (C.pad) { + padx[PadPoints] = C.pad.x; + pady[PadPoints] = C.pad.y; + padd[PadPoints] = E.name; + padn[PadPoints] = C.name; + padnn[PadPoints] = "*nc*"; // *** default not connected *** + PadPoints++; + } + } + } + } + B.signals(S) { + // *** if pad connected to net *** + S.contactrefs(C) { + status("B-Signal " + S.name + "/" + C.element.package.name); // 29.03.2005 alf@cadsoft.de + for (int pad = 0; pad < PadPoints; pad++) { + if (padx[pad] == C.contact.x && pady[pad] == C.contact.y) { + padnn[pad] = S.name; // *** connectad to net-name *** + // default *nc* = not connected + break; + } + } + } + } + + // **** Sheet coord. **** + if (project.schematic) { + sheetload = 1; + project.schematic(S) { + // *** collect all Pins *** + S.sheets(SH) { + SH.parts(PA) { // *** IC1 *** + status("Part " + PA.name); // 29.03.2005 alf@cadsoft.de + int gate = 0; + PA.device.gates(G) { + gate++; + } + int dir = 5; // Dirction PWR + int Pinn = 0; // Pin counter for Gate + PA.instances(IN) { // *** IC1A *** + IN.gate.symbol.pins(P) { + if (P.contact) { + if (P.direction != 5) { // only PWR-Pins in Gate ? + dir = P.direction; + } + pc[PinPoints] = P.contact.name; // PAD name von Connect/Pad + px[PinPoints] = P.x; + py[PinPoints] = P.y; + ps[PinPoints] = IN.sheet; // SHEET# + pa[PinPoints] = PA.name; // PART name + pg[PinPoints] = IN.name; // Part+GATE name + pn[PinPoints] = P.name; // PIN name + PinPoints++; + Pinn ++; + } + else { + gate = 0; // Reset Gate counter - Supply Symbol has no Gates + // pc[PinPoints] = " no pac."; // kein Pad-Name nur Symbol!! + } + } + } + if (PinPoints > 0) { + switch (gate) { + case 2 : if (dir == 5) { + // Gate-Name wird angezeigt + break; + } + if (dir != 5) { + pg[PinPoints -1] = pa[PinPoints - 1]; // Gatename wird nicht angezeigt + break; + } + case 1 : for (int gp = 0; gp < Pinn; gp++) { + pg[PinPoints - gp -1] = ""; // clear all Pin-Gate-name + } + case 0 : // printf("no Gates (Supply?) =%d\n", gate); + } + } + } + } + } + // *** print all Pad ccord. + for (int pad = 0; pad < PadPoints; pad++) { + for (int p = 0; p < PinPoints; p++) { + if (padd[pad] == pa[p] && padn[pad] == pc[p]) { + pads[pad] = ps[p]; // copy Sheet# to Pad + pnn[p] = padnn[pad]; // Signal name to Pin + } + } + printf("%s|%s|%s|sheet%d|", padd[pad], padn[pad], padnn[pad], pads[pad]); + printf("%.3f,%.3f|mm|\n", u2mm(padx[pad]), u2mm(pady[pad])); + } + // *** %PINS *** + printf("%sPINS\n", proz); + // *** print all Pin sheet/coord. *** + for (int pin = 0; pin < PinPoints; pin++) { + status("Pins " + pa[pin]); // 29.03.2005 alf@cadsoft.de + printf("%s|%s|%s|%s|%s|sheet%d|%.2f,%.2f|mm|\n", + pa[pin], pg[pin], pnn[pin], pc[pin], pn[pin], ps[pin], u2mm(px[pin]), u2mm(py[pin])); + } + } + else { + dlgMessageBox("Please load Schematic first! No data generated!", "OK"); + exit (-1); + } + } +} + +if (board) board(B) { + jobname = filename(B.name); + jobname = strsub(jobname, 0, strlen(jobname) - 4); + unifile = filesetext(B.name, ".uni"); + output(unifile, "wt") { + create_info(); + create_pcboard_section(B); + } + test(); + exit (0); +} + +else { + dlgMessageBox("Start " + ULPversion + " from a Board", "OK"); + exit (-2); +} diff --git a/eagle-5.7.0/ulp/update-packages.ulp b/eagle-5.7.0/ulp/update-packages.ulp new file mode 100644 index 0000000..c127572 --- /dev/null +++ b/eagle-5.7.0/ulp/update-packages.ulp @@ -0,0 +1,11 @@ +#usage "update current libary with reference package library

" + "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" + "

" + "Author: support@cadsoft.de" + +// THIS PROGRAM IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED + +// EditBox with Execute/Save filename +int edit_save_execute(string cmd, string f_name) { +int R; + R = dlgDialog("Edit and execute") { + dlgTextEdit(cmd); + dlgHBoxLayout { + dlgPushButton("+&Execute") dlgAccept(); + dlgPushButton("-&Cancel") dlgReject(); + dlgPushButton("+Save") { + string dest = dlgFileSave("Save Script File", f_name+".scr", "*.scr"); + if (dest != "") output(dest, "wt") {printf(cmd);} + } + } + }; +return R; // 1 = Execute, 0 = Cancel +} + +// get ULP program name +string get_ulp_name(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; +} + +// get ULP path +string get_ulp_path(void) { + string ulp_path = ""; + char c = '/'; + int pos = strrchr(argv[0], c); + if (pos >= 0) { + ulp_path = strsub(argv[0], 0, pos + 1); + } + return ulp_path; +} + +// get project path, if in board or schematic, otherwise library path +string get_project_path() { +string s = "", p = "";; + if (library) { library(L) s = L.name;} + if (board) { board(B) s = B.name;} + if (schematic){ schematic(S) s = S.name;} + char c = '/'; + int pos = strrchr(s, c); + if (pos >= 0) { + p = strsub(s, 0, pos + 1); + } + return p; +} + +// returns 1 if FileName exists (including path) +int exist_file(string FileName) { +string a[]; + int n = fileglob(a, FileName); + if (n == 0) return 0; + else return 1; +} diff --git a/eagle-5.7.0/ulp/warning.bmp b/eagle-5.7.0/ulp/warning.bmp new file mode 100644 index 0000000..a554214 Binary files /dev/null and b/eagle-5.7.0/ulp/warning.bmp differ

\n"); + printf("

Generated by PART2HTM v0.4 by Sean D. Alcorn
\n"); + printf(" © 1997
Avion\n"); + printf(" International Co. Ltd.
\n"); + printf(" Bangkok • Sydney • Taipei

\n"); + printf("