neingeist
/
arduinisten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

1167 lines
42 KiB
Plaintext

#usage "<b>Drill Legend for Eagle Board.</b><p>"
"This ULP add a drill legend in a board in Layer 144 (default).<br>"
"Sort both drill tools and drill diameters in the same ascending order as the drill legend.<br>"
"You could also generate the drill configuration for the CamProcessor.<p>"
"<author>Author: c.bohrer@m6net.fr></author><br>"
"<hr> "
"Place also the symbols of drills on board.<br>"
"Do not use the Option - Set - Drill set,<br>"
"while drills are roundet in diameter in this ULP!<br>"
"<font color = \"blue\">You can extend the symbol list below the line:</font><br>"
"<b><i>ARRAY OF EAGLE DRILL SYMBOLS</<i></b><br><font color = \"blue\">in the source text of this ULP. </font><br>"
"<author>support@cadsoft.de</author>"
/****************************************************
* 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 = "<qt bgcolor=wheat><h1>Legend</h1><hr><p><font size=5 color=blue><b>Drill legend Settings</b></font>" +
"<p><table><tr><td width=20></td><td><font color=red><b>Title</b></font></td></tr>" +
"<tr><td></td><td>Enter here the name of your choice for the title field.</td></tr>" +
"<tr><td></td><td><font color=red><b>Rank</b></font></td></tr><tr><td></td>"+
"<td>Choose here a number (from 1 to 8) for the position of each field in the drill legend. 0 = unselected.</td>" +
"</tr></table><p>" +
"<p><font size=5 color=blue><b>Drill legend Orientation</b></font><p><table><tr><td width=20></td>"+
"<td><font color=red><b>Horizontal</b></font></td></tr><tr><td></td>" +
"<td>Choose this option for horizontal drill legend.</td></tr><tr><td></td>"+
"<td><font color=red><b>Vertical</b></font></td></tr><tr><td></td>" +
"<td>Choose this option for vertical drill legend.</td></tr></table></qt>";
string HelpSymbols = "<qt bgcolor=wheat><h1>Symbols</h1><hr><p><font size=5 color=blue><b>Symbols Settings</b></font><p>" +
"<table><tr><td width=20></td><td><font color=red><b>Symbol Layer</b></font></td></tr><tr><td></td>" +
"<td>Choose in this field the layer in which you want draw this drill legend.</td></tr><tr><td></td>" +
"<td><font color=red><b>Symbol Size</b></font></td></tr><tr><td></td>" +
"<td>Enter in this field the symbol diameter (in mils).</td></tr><tr><td></td>" +
"<td><font color=red><b>Symbol Width</b></font></td></tr><tr><td></td>" +
"<td>Enter in this field the symbol line width (in mils).</td></tr></table><p>" +
"<font color=darkgreen><b>Nota: </b></font>" +
"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.<p>" +
"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.<p>" +
"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.</qt>";
string HelpTexts = "<qt bgcolor=wheat><h1>Texts</h1><hr><p><font size=5 color=blue><b>Texts Settings</b></font><p>" +
"<table><tr><td width=20></td><td><font color=red><b>Text Font</b></font></td></tr><tr><td></td>" +
"<td>Choose a text font in the list.</td></tr><tr><td></td><td><font color=red><b>Text Size</b></font></td></tr>" +
"<tr><td></td><td>Enter in this field the font size (in mils).</td></tr>" +
"<tr><td></td><td><font color=red><b>Text Ratio</b></font></td></tr>" +
"<tr><td></td><td>Enter in this field the font ratio (in %).</td></tr></table><p>" +
"<font color=darkgreen><b>Nota: </b></font>For printer output choose the font what you want but " +
"for gerber output keep VECTOR.</qt>";
string HelpTable = "<qt bgcolor=wheat><h1>Table</h1><hr><p><font size=5 color=blue><b>Cell Margin Factor</b></font><p>" +
"Enter in theses fields a value (from 1.0 to 9.9) for increase or decrease the space between texts and border cells.<p>" +
"<table><tr><td width=20></td><td><font color=red><b>Horizontal </b></font></td></tr><tr><td></td>" +
"<td>Horizontal space between texts and border cells.</td></tr>" +
"<tr><td></td><td><font color=red><b>Vertical</b></font></td></tr><tr><td></td>" +
"<td>Vertical space between texts and border cells.</td></tr></table><p><p>" +
"<font size=5 color=blue><b>Outline Width</b></font><p><table><tr><td width=20></td>" +
"<td><font color=red><b>Cell</b></td></tr><tr><td></td><td>Enter in this field the outline width of a cell (in mils).</td></tr>" +
"<tr><td></td><td><font color=red><b>Title</b></td></tr><tr><td></td>" +
"<td>Enter in this field the outline width of the title (in mils).</td></tr>" +
"<tr><td></td><td><font color=red><b>Table</b></td></tr><tr><td></td>" +
"<td>Enter in this field the outline width of the table (in mils).</td></tr></table></qt>";
string HelpHoles = "<qt bgcolor=wheat><h1>Holes</h1><hr><p><font size=5 color=blue><b>Non-Plated</b></font><p>" +
"All holes diameters (plated or not plated) are sorted in ascending mode.<p><p>" +
"<table><tr><td width=20></td><td><font color=red><b>Alternate</b></font></td></tr><tr><td></td>" +
"<td>For each diameter, non-plated holes are treated after plated holes but before the following diameter.</td></tr>" +
"<tr><td></td><td><font color=red><b>Mixed</b></font></td></tr><tr><td></td>" +
"<td>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\".</td></tr><tr><td></td>" +
"<td><font color=red><b>Last</b></font></td></tr><tr><td></td>" +
"<td>All plated holes diameter are treated first, then all non-plated are treated last.</td></tr></table><p><p>" +
"<font size=5 color=blue><b>Plated Status</b></font><p><table><tr><td width=20></td>" +
"<td><font color=red><b>Not Plated</b></td></tr><tr><td></td>" +
"<td>Enter in this field a string meaning: not plated hole. Default: \"NOT\".</td></tr><tr><td></td>" +
"<td><font color=red><b>Mixed</b></td></tr><tr><td></td>" +
"<td>Enter in this field a string meaning: plated and not plated use the same drill tool. Default: \"BOTH\".</td></tr>" +
"<tr><td></td><td><font color=red><b>Plated</b></td></tr><tr>" +
"<td></td><td>Enter in this field a string meaning: plated hole. Default: \"YES\".</td></tr></table><p>" +
"<font color=darkgreen><b>Nota: </b></font>Avoid to use the same diameter for plated an non-plated holes.<p><p>" +
"<font size=5 color=blue><b>Unit Precision</b></font><p>" +
"Choose here the number of unit after the decimal point." +
"<table><tr><td width=20></td><td><font color=red><b>Mils</b></font></td></tr><tr><td></td>" +
"<td>Unit of precision for mils.</td></tr><tr><td></td><td><font color=red><b>MM</b></font></td></tr><tr><td></td>" +
"<td>Unit of precision for millimeters.</td></tr></table><p><p><font size=5 color=blue><b>Holes Tolerance</b></font><p><table>" +
"<tr><td width=20></td><td><font color=red><b>Plated Holes</b></font></td></tr><tr><td></td>" +
"<td>Enter in this field your value for plated holes tolerance.</td></tr><tr><td></td>" +
"<td><font color=red><b>Non-Plated Holes</b></font></td></tr><tr><td></td>" +
"<td>Enter in this field your value for non-plated holes tolerance.</td></tr></table><p>" +
"<font color=darkgreen><b>Nota: </b></font>Tolerance field is String type, so you can enter anything like: 0,02 or +/- 0.03</qt>";
string HelpOutputs = "<qt bgcolor=wheat><h1>Outputs</h1><hr><p><font size=5 color=blue><b>Drill Rack File for CAM Processor</b></font><p>" +
"<table><tr><td width=20></td><td><font color=red><b>Create file</b></font></td></tr><tr><td></td>" +
"<td>Click on this check button for create the drill rack file used in the cam processor. " +
"Choose the output unit: milimeters or inches.</td></tr></table></qt>";
/******** 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<b; m++) {
d = strsplit(c, a[m], ' ');
if(c[0] == "W") {cmd = "Wire";}
if(c[0] == "C") {cmd = "Circle";}
sprintf(hs,"%s %d", cmd, SymbolWidth);
tmps += hs;
for(p=1;p<d;p++) {
sx = strtol(strsub(c[p], 0, 1));
sy = strtol(strsub(c[p], 1, 1));
if (Mode == Legend) {
sx = (sx*U) + Xs;
sy = (sy*U) + Ys;
}
else {
sx = sx*U - (SymbolSize/2);
sy = sy*U - (SymbolSize/2);
}
sprintf(hs," (R%d %d)", sx, sy); // relativ coordinates 2005-09-14 alf@cadsoft.de
tmps += hs;
}
hs=""; sprintf(hs,";\n");
tmps += hs;
}
return tmps;
}
else {
int n;
for (n = 0; Symbol[n]; n++);
sprintf(hs, "!%d differnt drills used.\nOnly %d Symbols are defined.\nProgram aborted.", Dcnt, n);
dlgMessageBox(hs, "OK");
exit(0);
}
}
int getDrill(int Size) { // 2008-07-30
for (int n = 0; n < Dcnt; n++) {
if (Drills[index[n]] == Size) return n;
}
return -1;
}
/*****************************************************/
int CenterText(string txt, int cell, int pos) {
return pos + (round((cell-((TextSize* 0.85)*strlen(txt)))/2));
}
void printCell(int left, int right, int top, int bottom, int width) {
printf("Wire %d (%d %d) (%d %d) (%d %d);\n", width,
left, bottom, right, bottom, right, top);
}
void DrillChartVertical(int bas) {
int haut;
if(TextSize > 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();