#usage "de:NET/BUS LABEL platzieren

" "Um Netze automatisch mit einem Label zu versehen, muß man eine Gruppe um den Bereich " "der NET/BUS-Wire definieren, an denen ein LABEL platziert werden soll. " "Es wird an jedem selektierten Ende eines NET/BUS-Wire in der Gruppe ein LABEL platziert. " "Man sollte also die Gruppe so wählen, daß nur eine Ende des Wire groupiert wird." "Das LABEL wird bei einem NET mit einem Offset von 10 Mil, bei einem BUS mit einem Offset 20 Mil " "über die waagrechte Linie gestellt, bzw. bei einer senkrechten Linie links daneben. " "Ein zweiter Offset sorgt dafür, daß das LABEL um ein halbes GRID (50 Mil) vom Beginn des Wire, " "in der selben Richtung wie sich der Wire erstreckt, platziert wird. " "Das LABEL wird entsprechend der Ausrichtung des Wire gedreht. " "Die Textgröße des LABEL wird auc 70 Mil gesetzt." "

" "Author alf@cadsoft.de" , "en:NET/BUS labeling

" "For labeling nets automatically you have to draw a GROUP around the area you want to " "have labels placed. " "There can be labels at net/bus bends only. Which is usually the location where " "two bus or net coordinates converge." "A label for a net will be placed with an offset of 10 mil, for a bus with an offset of 20 mils " "above a horizontal wire, or left of a vertical wire. A second offset places the label half the " "grid (50 mil) from the beginning in wire direction. The label will be placed in the " "same rotation the wire has. The text size of the label is 70 mil. " "

" "Author alf@cadsoft.de" #require 5.1200 string Version = "1.0.0"; // 2013-05-28 real NetLabelOffset = 10.0; // offset zur Netlinie in MIL real BusLabelOffset = 25.0; // offset zur Buslinie in MIL real LabelLineOffset = 50.0; // in Mil real LabelSize = 70.0; // Mil int cntS = 0; int SegWireX1[], SegWireY1[], SegWireX2[], SegWireY2[], WireDirection[], WireType[], SegWireSide[]; int GroupSelect = 0; int islabelgen = 0; enum { None, Buswire, Netwire, Horizontal, Vertical, Diagonal, Left, Right, Up, Down, Cross }; string Cmd; string s; int test = 0; /*** Functions ***/ void header(void) { sprintf(s, "DISPLAY NONE 91 92;\n"); Cmd+=s; sprintf(s, "CHANGE Size %.4fmil;\n", LabelSize); Cmd+=s; return; } void trailer(void) { sprintf(s, "DISPLAY LAST;\n"); Cmd+=s; return; } void gencmd(int index1, int direction, int side) { // Jetzt muß nur ermittelt werden, // in welche Richtung der Wire steht, // und ob das Label verschoben werden muß, // wenn der weiterführende Wire senkrecht und auf der // rechten oder linken Seite des Wire steht. int x, y; string mirror = ""; real lxoffset, lyoffset; int wirealignment, rotateangle = 0; real labeloffset; if (WireType[index1] == Buswire) labeloffset = BusLabelOffset; else if (WireType[index1] == Netwire) labeloffset = NetLabelOffset; else if (dlgMessageBox("WireType?", "OK", "CANCEL") != 0) exit(-65); if (direction == Horizontal) { // also eine waagrechte Linie if (side == 1) { x = SegWireX1[index1]; y = SegWireY1[index1]; if (SegWireX1[index1] < SegWireX2[index1]) { wirealignment = Right; } else { wirealignment = Left; } } else if (side == 2) { x = SegWireX2[index1]; y = SegWireY2[index1]; if (SegWireX2[index1] < SegWireX1[index1]) { wirealignment = Right; } else { wirealignment = Left; } } else { if (dlgMessageBox("Error horizontal", "OK", "Cancel") != 0) exit(-96); return; } } else if (direction == Vertical) { // also eine senkrechte Linie if (side == 1) { x = SegWireX1[index1]; y = SegWireY1[index1]; if (SegWireY1[index1] < SegWireY2[index1]) { wirealignment = Up; } else { wirealignment = Down; } } else if (side == 2) { x = SegWireX2[index1]; y = SegWireY2[index1]; if (SegWireY2[index1] < SegWireY1[index1]) { wirealignment = Up; } else { wirealignment = Down; } } else { if (dlgMessageBox("Error vertical", "OK") != 0) exit(-123); return; } } else { dlgMessageBox("Error cross", "ok"); } if (wirealignment == Right) { lyoffset = labeloffset; // oberhalb der Linie lxoffset = LabelLineOffset; // nach rechts versetzt mirror = ""; } if (wirealignment == Left) { lyoffset = labeloffset; // oberhalb der Linie lxoffset = LabelLineOffset * -1.0; // nach links versetzt mirror = "M"; } if (wirealignment == Up) { lxoffset = labeloffset * -1.0; // links von der Linie lyoffset = LabelLineOffset; // nach oben versetzt mirror = ""; rotateangle = 90; } if (wirealignment == Down) { lxoffset = labeloffset * -1.0; // links von der Linie lyoffset = LabelLineOffset * -1.0; // nach unten versetzt mirror = "M"; rotateangle = 270; } sprintf(s, "LABEL (%.4fmil %.4fmil) (%.4fmil %.4fmil);\n", u2mil(x), u2mil(y), u2mil(x)+lxoffset, u2mil(y)+lyoffset ); Cmd+=s; sprintf(s, "ROTATE =R0 (%.4fmil %.4fmil);\n", u2mil(x)+lxoffset, u2mil(y)+lyoffset); // stelle rotate wieder auf 0 Cmd+=s; if (!rotateangle && mirror) { sprintf(s, "MIRROR (%.4fmil %.4fmil);\n", u2mil(x)+lxoffset, u2mil(y)+lyoffset); Cmd+=s; } if (rotateangle) { sprintf(s, "ROTATE =%sR%d (%.4fmil %.4fmil);\n", mirror, rotateangle, u2mil(x)+lxoffset, u2mil(y)+lyoffset); Cmd+=s; } islabelgen++; return; } void genlabel(void) { for (int n = 0; n < cntS; n++) { gencmd(n, WireDirection[n], SegWireSide[n]); } return; } void addwireseg(UL_WIRE W, string wname, int type, int side) { SegWireX1[cntS] = W.x1; SegWireY1[cntS] = W.y1; SegWireX2[cntS] = W.x2; SegWireY2[cntS] = W.y2; WireType[cntS] = type; SegWireSide[cntS] = side; if (SegWireX1[cntS] == SegWireX2[cntS] || SegWireY1[cntS] == SegWireY2[cntS]) { if (SegWireX1[cntS] == SegWireX2[cntS]) { WireDirection[cntS] = Vertical;// wire senkrecht } else if (SegWireY1[cntS] == SegWireY2[cntS]) { WireDirection[cntS] = Horizontal;// wire waagrecht } cntS++; } return; } /*** main ***/ if (sheet) { sheet(S) { S.nets(N) { status(N.name); N.segments(SEG) { SEG.wires(W) { int side = ingroup(W); if (side == 1 || side == 2) { // Wire bei denen beide Seiten in der Group sind, werden nicht benutzt GroupSelect = 1; addwireseg(W, N.name, Netwire, side); } } } } S.busses(B) { status(B.name); B.segments(SEG) { SEG.wires(W) { int side = ingroup(W); if (side == 1 || side == 2) { // Wire bei denen beide Seiten in der Group sind, werden nicht benutzt GroupSelect = 1; addwireseg(W, B.name, Buswire, side); } } } } } if (!GroupSelect) { dlgMessageBox("!Selektieren Sie zuerst mit GROUP die NET/BUS-Wire.", "OK"); exit(0); } else { header(); genlabel(); trailer(); } if (test) { string scmd; sprintf(scmd, "%d Wire gefunden", cntS); dlgDialog("test") { dlgLabel(scmd); dlgHBoxLayout dlgSpacing(800); dlgHBoxLayout { dlgVBoxLayout dlgSpacing(600); dlgTextEdit(Cmd); } dlgHBoxLayout { dlgPushButton("+OK") dlgAccept(); dlgPushButton("-ESC") { dlgReject(); exit(-99); } } }; } if (!islabelgen) { dlgMessageBox("!No wire (horizontal/vertical) for LABEL found, check GROUP.

"+usage, "OK"); exit(-1); } exit(Cmd); } else dlgMessageBox("Starten Sie das ULP in einem Schaltplan", "OK");