#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();