4 * PCB, interactive printed circuit board design
5 * Copyright (C) 1994,1995,1996 Thomas Nau
7 * This module, drill.c, was written and is Copyright (C) 1997 harry eaton
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * Contact addresses for paper mail and Email:
24 * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
25 * Thomas.Nau@rz.uni-ulm.de
38 #ifdef HAVE_LIBDMALLOC
43 * some local prototypes
45 static void FillDrill (DrillType
*, ElementType
*, PinType
*);
46 static void InitializeDrill (DrillType
*, PinType
*, ElementType
*);
50 FillDrill (DrillType
*Drill
, ElementType
*Element
, PinType
*Pin
)
56 pin
= GetDrillPinMemory (Drill
);
61 for (n
= Drill
->ElementN
- 1; n
!= -1; n
--)
62 if (Drill
->Element
[n
] == Element
)
66 ptr
= GetDrillElementMemory (Drill
);
72 if (TEST_FLAG (HOLEFLAG
, Pin
))
73 Drill
->UnplatedCount
++;
77 InitializeDrill (DrillType
*drill
, PinType
*pin
, ElementType
*element
)
81 drill
->DrillSize
= pin
->DrillingHole
;
85 drill
->UnplatedCount
= 0;
86 drill
->ElementMax
= 0;
87 drill
->Element
= NULL
;
91 ptr
= (void *) GetDrillPinMemory (drill
);
92 *((PinType
**) ptr
) = pin
;
95 ptr
= (void *) GetDrillElementMemory (drill
);
96 *((ElementType
**) ptr
) = element
;
101 if (TEST_FLAG (HOLEFLAG
, pin
))
102 drill
->UnplatedCount
= 1;
106 DrillQSort (const void *va
, const void *vb
)
108 DrillType
*a
= (DrillType
*) va
;
109 DrillType
*b
= (DrillType
*) vb
;
110 return a
->DrillSize
- b
->DrillSize
;
114 GetDrillInfo (DataType
*top
)
116 DrillInfoType
*AllDrills
;
117 DrillType
*Drill
= NULL
;
118 DrillType savedrill
, swapdrill
;
119 bool DrillFound
= false;
122 AllDrills
= (DrillInfoType
*)calloc (1, sizeof (DrillInfoType
));
128 Drill
= GetDrillInfoDrillMemory (AllDrills
);
129 InitializeDrill (Drill
, pin
, element
);
133 if (Drill
->DrillSize
== pin
->DrillingHole
)
134 FillDrill (Drill
, element
, pin
);
138 DRILL_LOOP (AllDrills
);
140 if (drill
->DrillSize
== pin
->DrillingHole
)
143 FillDrill (Drill
, element
, pin
);
146 else if (drill
->DrillSize
> pin
->DrillingHole
)
151 InitializeDrill (&swapdrill
, pin
, element
);
152 Drill
= GetDrillInfoDrillMemory (AllDrills
);
153 Drill
->DrillSize
= pin
->DrillingHole
+ 1;
158 swapdrill
= savedrill
;
162 if (AllDrills
->Drill
[AllDrills
->DrillN
- 1].DrillSize
<
165 Drill
= GetDrillInfoDrillMemory (AllDrills
);
166 InitializeDrill (Drill
, pin
, element
);
177 Drill
= GetDrillInfoDrillMemory (AllDrills
);
178 Drill
->DrillSize
= via
->DrillingHole
;
179 FillDrill (Drill
, NULL
, via
);
183 if (Drill
->DrillSize
!= via
->DrillingHole
)
185 DRILL_LOOP (AllDrills
);
187 if (drill
->DrillSize
== via
->DrillingHole
)
190 FillDrill (Drill
, NULL
, via
);
195 if (Drill
->DrillSize
!= via
->DrillingHole
)
197 Drill
= GetDrillInfoDrillMemory (AllDrills
);
198 Drill
->DrillSize
= via
->DrillingHole
;
199 FillDrill (Drill
, NULL
, via
);
203 FillDrill (Drill
, NULL
, via
);
207 qsort (AllDrills
->Drill
, AllDrills
->DrillN
, sizeof (DrillType
), DrillQSort
);
211 #define ROUND(x,n) ((int)(((x)+(n)/2)/(n))*(n))
214 RoundDrillInfo (DrillInfoType
*d
, int roundto
)
218 while ((d
->DrillN
> 0) && (i
< d
->DrillN
- 1))
220 int diam1
= ROUND (d
->Drill
[i
].DrillSize
, roundto
);
221 int diam2
= ROUND (d
->Drill
[i
+ 1].DrillSize
, roundto
);
227 d
->Drill
[i
].ElementMax
228 = d
->Drill
[i
].ElementN
+ d
->Drill
[i
+1].ElementN
;
229 if (d
->Drill
[i
].ElementMax
)
231 d
->Drill
[i
].Element
= (ElementType
**)realloc (d
->Drill
[i
].Element
,
232 d
->Drill
[i
].ElementMax
*
233 sizeof (ElementType
*));
235 for (ei
= 0; ei
< d
->Drill
[i
+1].ElementN
; ei
++)
237 for (ej
= 0; ej
< d
->Drill
[i
].ElementN
; ej
++)
238 if (d
->Drill
[i
].Element
[ej
] == d
->Drill
[i
+ 1].Element
[ei
])
240 if (ej
== d
->Drill
[i
].ElementN
)
241 d
->Drill
[i
].Element
[d
->Drill
[i
].ElementN
++]
242 = d
->Drill
[i
+ 1].Element
[ei
];
245 free (d
->Drill
[i
+ 1].Element
);
246 d
->Drill
[i
+ 1].Element
= NULL
;
248 d
->Drill
[i
].PinMax
= d
->Drill
[i
].PinN
+ d
->Drill
[i
+ 1].PinN
;
249 d
->Drill
[i
].Pin
= (PinType
**)realloc (d
->Drill
[i
].Pin
,
252 memcpy (d
->Drill
[i
].Pin
+ d
->Drill
[i
].PinN
, d
->Drill
[i
+ 1].Pin
,
253 d
->Drill
[i
+ 1].PinN
* sizeof (PinType
*));
254 d
->Drill
[i
].PinN
+= d
->Drill
[i
+ 1].PinN
;
255 free (d
->Drill
[i
+ 1].Pin
);
256 d
->Drill
[i
+ 1].Pin
= NULL
;
258 d
->Drill
[i
].PinCount
+= d
->Drill
[i
+ 1].PinCount
;
259 d
->Drill
[i
].ViaCount
+= d
->Drill
[i
+ 1].ViaCount
;
260 d
->Drill
[i
].UnplatedCount
+= d
->Drill
[i
+ 1].UnplatedCount
;
262 d
->Drill
[i
].DrillSize
= diam1
;
264 memmove (d
->Drill
+ i
+ 1,
266 (d
->DrillN
- i
- 2) * sizeof (DrillType
));
271 d
->Drill
[i
].DrillSize
= diam1
;
278 FreeDrillInfo (DrillInfoType
*Drills
)
282 free (drill
->Element
);
286 free (Drills
->Drill
);