/* GEDPART2 (GED) -- Advanced/Unreleased GED Part and Placement Functions */ /* GEDPART2 (GED) -- Erweiterte Bauteil- und Plazierungsfunktionen */ /* -- INTENDED FOR KEY-CALL USE -- */ /* // Copyright (c) 1996-2006 Oliver Bartels F+E, Erding // Author: Manfred Baumeister // Changes History: // mb (20060203) [ECR|TODO] Update Parts released to gedpart.ulc // mb (20060203) [ECR|TODO] Package Assignment released to gedpart.ulc. // mb (19980911) [ECN] ADAPTED TO BAE V4.2. // mb (19980713) [ECN] ENHANCEMENT: Pulldown menu delimiters. // mb (19980713) [ECN] ENHANCEMENT: Dynamic multi-language support. // mb (19980707) [ECN] ADAPTED TO BAE V4.0. // mb (19960616) [ECN] ORIGINAL CODING. // // DESCRIPTION // // The gedpart2 User Language program provides advanced/unreleased // GED part and placement utilities such as update/replace part // macros according to netlist, update alternate part package types // of placed parts, delete parts with incomplete macros, fix parts // with value attribute assigments. */ // Includes #include "pop.ulh" // User Language popup utilities // Messages string UPRABORT = M_UPRABORT(); string REPNOCHANGE = M("Es wurden keine Aenderungen durchgefuehrt.", "No change has been made."); string UPRFCT = M("Bauteil-/Plazierungs-Funktion selektieren!", "Select Part/Placement Function!"); string UPRFCT1 = M("&Update Bauteile","&Update Parts"); string UPRFCT2 = M("&Gehaeusezuweisung","&Package Assignment"); string UPRFCT3 = M("&Entf. unref. Mac.","&Del. unref. Macros"); string UPRFCT4 = M("%&Fix. Attr. Parts","%&Fix Attr. Parts"); string REPPARTUPDHD = M("Update Bauteil-Makros entsprechend Netzliste...", "Update part macros according to netlist..."); string REPALTPARTHD = M("Korrektur Alternativ-Gehaeusezuweisungen...", "Correcting alternate part package type assignments..."); string REPUPDPACK = M("Bauteil '%s': Gehaeusezuweisung '%s' durchgefuehrt.", "Part '%s' package type '%s' assigned."); string ERRUPDPACK = M("Bauteil '%s': Gehaeusezuweisung '%s' fehlgeschlagen!", "Error changing part '%s' package type to '%s'!"); string REPDELUMAC = M("Bauteil '%s' (Makro '%s') geloescht.", "Part '%s' (incomplete macro '%s') deleted."); string ERRDELUMAC = M("Fehler beim Loeschen von Bauteil '%s' (Makro '%s')!", "Error deleting part '%s' (incomplete macro '%s')!"); string REPFIXVALPHD = M("Fixieren Bauteile mit Wert-Attributzuweisungen...", "Fixing parts with value attribute assignments..."); string REPFIXVALP = M("Bauteil '%s' fixiert.","Part '%s' fixed."); string ERRFIXVALP = M("Fehler beim Fixieren von Bauteil '%s'.", "Error fixing part '%s'."); // Part update globals string macroname; // Macro name index L_CPART cpart; // Layout connection part // General globals STRINGS hl; // Popup header list int hn = 2; // Popup header count STRINGS el; // Popup entry list int en = 0; // Popup entry count // Main program main() { // Abort if invalid plan class if (bae_planddbclass() != DDBCLLAY) { error_class(); } // Select part/placement function type perror(UPRFCT); switch (bae_askmenu(5, UPRFCT1, UPRFCT2, UPRFCT3, UPRFCT4, UPRABORT)) { // Update parts case 0 : updateparts(); break; // Correct part package type assignments case 1 : altpartpack(); break; // Delete parts with incomplete macros case 2 : delumac(); break; // Fix parts with value attribute assignments case 3 : fixvalp(); break; // Abort on default default : error("\n"); } // Done if no report entries generated if (en <= 0) { error(REPNOCHANGE); } // Show report with popup menu hl[1] = ""; popupmenu(0, "", hl, hn, el, en, UINPOPABORT, 0, -1, -1, hn + en + 2, 100, 0, ""); } //__________________________________________________________________ void updateparts() // Update part macros according to netlist { index L_FIGURE fig; // Part figure list index double x,y; // Coordinates of part double ang; // Angle of part int mirr; // Mirror mode of part string name; // Name of part // Issue proceed message perror(hl[0] = REPPARTUPDHD); // Iterate named references forall (fig where fig.TYP == L_FIGNREF) { // Get macro name macroname= lay_findconpart(fig.NAME,cpart) ? "" : fig.NREF.MACRO.NAME; // Ignore parts with correct macro if (macroname == cpart.MACRO.NAME) { continue; } // Get placement data x = fig.X; y = fig.Y; ang = fig.ANGLE; mirr = fig.MIRROR; name = fig.NAME; // Delete old element and store part with new macro if (ged_delelem(fig) || ged_storepart(name, cpart.MACRO.NAME, x, y, ang, mirr)) { sprintf(el[en], ERRUPDPACK, name, cpart.MACRO.NAME); } else { sprintf(el[en], REPUPDPACK, name, cpart.MACRO.NAME); } en++; } } //__________________________________________________________________ void altpartpack() // Update alternate part package type of placed parts { index L_NREF nref; // Named reference index index L_CPART cpart; // Connection part index // Issue proceed message perror(hl[0] = REPALTPARTHD); // Iterate named references forall (nref where lay_findconpart(nref.NAME, cpart) == 0 && cpart.PLNAME != nref.MACRO.NAME) { // Set alternate package type if (ged_partaltmacro(cpart.NAME, nref.MACRO.NAME)) { sprintf(el[en], ERRUPDPACK, cpart.NAME, nref.MACRO.NAME); } else { sprintf(el[en], REPUPDPACK, cpart.NAME, nref.MACRO.NAME); } en++; } } //__________________________________________________________________ void delumac() // Delete parts placed with incomplete macros // (for recorrecting library by replace deleted parts afterwards) { index L_FIGURE fig; // Figure list index index L_NREF nref; // Named reference index // Issue proceed message perror(hl[0] = REPALTPARTHD); // Iterate named references with uncompleted macros forall (nref where nref.MACRO.COMP & 0x02) { if (lay_nrefsearch(nref.NAME, fig) == 0) { sprintf(el[en], (ged_delelem(fig) ? ERRDELUMAC : REPDELUMAC), nref.NAME, nref.MACRO.NAME); en++; } } } //__________________________________________________________________ void fixvalp() // Fix parts with value attributes set { index L_FIGURE fig; // Figure list element index L_CPART part; // Connection part index index L_ATTRIBUTE att; // Part attribute index // Issue proceed message perror(hl[1] = REPFIXVALPHD); // Scan placed connection parts forall (fig where fig.TYP == L_FIGNREF && lay_findconpart(fig.NAME, part) == 0) { // Scan attributes with value set forall (att of part where att.VALUE) { // Test attribute name if (att.NAME == "$val" || att.NAME == "$value" || att.NAME == "$wert") { // Fix this part if (ged_elemfixchg(fig, 1)) { sprintf(el[en], ERRFIXVALP, part.NAME); } else { sprintf(el[en], REPFIXVALP, part.NAME); } en++; // Done break; } } } } //__________________________________________________________________ // User Language program end