📄 unidat-fiducials.ulp
字号:
print_pad_shape(viatype(V), 0, 0);
printf("%%ENDGRAFITEM\n");
}
}
}
}
//////////////////////////////////////////////////////
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) {
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");
}
}
}
}
}
//////////////////////////////////////////////////////
void via(UL_BOARD B) {
int i;
printf("\n%%%%VIA\n");
B.signals(S) {
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));
}
}
}
//////////////////////////////////////////////////////
void track(UL_BOARD B) {
printf("\n%%%%TRACK\n");
B.signals(S) {
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");
}
}
//////////////////////////////////////////////////////
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();
}
//////////////////////////////////////////////////////
//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_) {
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) {
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 ***
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++) {
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("<qt>Start <b>" + ULPversion + "</b> from a <b>Board</b></qt>", "OK");
exit (-2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -