/* GEDRULE (GED) -- Layout Rule Definition Utility */ /* GEDRULE (GED) -- Layout Regelzuweisungsutility */ /* // Copyright (c) 1998-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (100308) ENHANCEMENT: // Added PDF layer group functions. // rl (091027) RELEASED FOR BAE V7.4. // rl (081208) ENHANCEMENT: // Added layer stackup output file name extension support. // rl (081014) RELEASED FOR BAE V7.2. // rl (080424) BUGFIX: // Fixed problem with layer stackup layer move/delete functions. // rl (080306) ENHANCEMENT: // Added predicate set functions. // rl (071029) RELEASED FOR BAE V7.0. // rl (070812) ENHANCEMENT: // Added layer display order swap option. // rl (061107) ENHANCEMENT: // Added pattern button to rule name selection box. // rl (060926) RELEASED FOR BAE V6.8. // rl (060721) ENHANCEMENT: // Added page preselection for picked predicate attribute on // multipage predicate attribute lists. // rl (060620) ENHANCEMENT: // Added part predicate default values edit function. // rl (060222) ENHANCEMENT: // Added element specific DRC block number functions. // rl (060110) ENHANCEMENT: // Added element info to rule edit box. // rl (050906) RELEASED FOR BAE V6.6. // rl (050906) ENHANCEMENT: // Added part predicate edit function. // rl (040811) RELEASED FOR BAE V6.4. // rl (040330) ENHANCEMENT: // Added glue support functions. // rl (040313) ENHANCEMENT: // Added layer stackup layer comment field. // Added layer stackup export function. // rl (030912) RELEASED FOR BAE V6.2. // rl (030520) ENHANCEMENT: // Added layer stackup parameter function. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (020611) ENHANCEMENT: // Introduced enhanced rule selection dialog box. // rl (011213) ENHANCEMENT: // Added group rule manipulation functions. // rl (010625) RELEASED FOR BAE V5.0. // rl (000509) RELEASED FOR BAE V4.6. // rl (990803) RELEASED FOR BAE V4.4. // rl (980910) RELEASED FOR BAE V4.2. // mb (980710) ENHANCEMENT: // Pulldown menu delimiters introduced. // mb (980711) ENHANCEMENT: // Dynamic multi-language support introduced. // mb (980420) CHANGE: // Inline documentation changed. // rl (980310) ORIGINAL CODING. // // DESCRIPTION // // The gedrule User Language program is used to attach/detach rules // to/from layout figure list elements. The rules should be defined // using the RULECOMP Neural Rule System Compiler in order to avoid // undefined rule system errors. */ // Includes #include "pop.ulh" // User Language popup utilities #include "lay.ulh" // User Language layout utilities #include "sql.ulh" // User Language SQL utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRDONE = M("&Fertig","D&one"); string UPRTOGGLE = M("&Setzen/Loeschen","Set/Rese&t"); string UPRPATTERN = M("&Muster","&Pattern"); string UPRPREDICATE = M("Predikate :","Predicates :"); string UPRNPRED = M("Neuer Wert fuer Predikat '%s' von %s ?", "New Value for Predicate '%s' ?"); string UPRPREDSTR = M("String","String"); string UPRPREDDBL = M("Double","Double"); string UPRPREDINT = M("Integer","Integer"); string UPRPREDFSET = M("ein","on"); string UPRPREDFUSET = M("aus","off"); string UPRPREDBITS = M("Bitmaske ","Bit mask"); string UPRDPREDSTR = M("Stringpredikat fuer %s selektieren", "Select string predicate for %s"); string UPRDPREDDBL = M("Doublepredikat fuer %s selektieren", "Select double predicate for '%s'"); string UPRDPREDINT = M("Integerpredikat fuer %s selektieren", "Select integer predicate for '%s'"); string UPRSELETYP = M("Elementtyp selektieren!","Select element type!"); string UPRSELE0 = M("&Flaechen","P&olygons"); string UPRSELE1 = M("&Leiterbahnen","T&races"); string UPRSELE2 = M("Bauteile/&Pins","&Parts/Pins"); string UPRSELE3 = M("&Vias/Pads","&Vias/Pads"); string UPRSELE4 = M("&Texte","&Texts"); string UPRSELE5 = M("&Bohrungen","&Drills"); string UPRSELE6 = M("%Pla&n","%Pla&n"); string UPRSELE7 = M("%&Gruppe","%&Group"); string UPRSELE8 = M("%Veran&kerung","%Gl&ue"); string UPRSELE9 = M("%L&agenaufbau","%&Layer Stackup"); string UPRSELE10 = M("%Ba&uteilattribute","%P&art Attributes"); string UPRSELE11 = M("%Kontext&funktionen","%Context &Functions"); string UPRSELE12 = M("%&Regelupdate","%Rul&e Update"); string UPRSELPOLY = M("Flaeche selektieren!","Select polygon!"); string UPRSELPATH = M("Leiterbahn selektieren!","Select trace!"); string UPRSELPART = M("Bauteil selektieren!","Select part!"); string UPRSELNREF = M("Bauteil/Pin selektieren!","Select part/pin!"); string UPRSELUREF = M("Via/Pad selektieren!","Select via/pad!"); string UPRSELTEXT = M("Text selektieren!","Select text!"); string UPRSELDRILL = M("Bohrung selektieren!","Select drill!"); string UPRSELRULE0 = M("Regel setzen/loeschen (","Rule set/reset ("); #define UPRSELRULE1 ") ? " string UPRDRULEH = M("Regeln fuer %s setzen/loeschen", "%s rules set/reset"); string UPRDRTEXT = M("Text '%s' %s","Text '%s' %s"); string UPRDRPATH = M("Leiterbahn %s","Trace %s"); string UPRDRPART = M("Bauteil '%s'/'%s'","Part '%s'/'%s'"); string UPRDRPIN = M("Pin '%s'/'%s'","Pin '%s'/'%s'"); string UPRDRVIA = M("Via '%s'","Via '%s'"); string UPRDRPAD = M("Pad '%s' %s","Pad '%s' %s"); string UPRDRPTYPPC = M("Kupferflaeche %s","Passive Copper %s"); string UPRDRPTYPKO = M("Sperrflaeche %s","Keep Out Area %s"); string UPRDRPTYPDL = M("Dokumentarlinie %s","Documentary Line %s"); string UPRDRPTYPDA = M("Dokumentarflaeche %s","Documentary Area %s"); string UPRDRPTYPAC = M("Potentialflaeche %s","Active Copper %s"); string UPRDRPTYPSP = M("Geteilte Versorgungslage %s","Split Power Plane %s"); string UPRDRPTYPCF = M("Fuellbereich %s","Copper Fill Area %s"); string UPRDRPTYPBO = M("Umrandung","Board Outline"); string UPRDRDRILL = M("Bohrung Klasse '%c'","Drill Class '%c'"); string UPRRULENAME = M("Regelname :","Rule Name :"); string UPRRULESET = M("Gesetzte Regeln :","Rules set :"); string UPRRULEPROJ = M("Regeln in Projektdatei :", "Rules in Project File :"); string UPRRULEDB = M("Regeln in Datenbank :","Database Rules :"); string UPRRULE = M("Regel ? ","Rule ? "); string UPRRULEPAT = M("Regelnamen(smuster) (:Liste) ? ", "Rule Name Pattern (:Liste) ? "); string UPRSELRG = M("Regeln Gruppenfunktion selektieren!", "Select rule group function!"); string UPRSELRG0 = M("Regeln &setzen","&Set Rules"); string UPRSELRG1 = M("Regeln &loeschen","&Delete Rules"); string UPRSELRG2 = M("Regeln sele&ktieren","Se&lect Rules"); string UPRSELRG3 = M("%PD&F-Farbe setzen","%Set PDF &Color"); string UPRSELRG4 = M("&PDF-Farbe selektieren","Select &PDF Color"); string UPRSELRG5 = M("PDF-&Ebene setzen","Set PDF La&yer"); string UPRSELRG6 = M("PDF-E&bene selektieren","S&elect PDF Layer"); string UPRSELGL = M("Regeln Gruppenfunktion selektieren!", "Select rule group function!"); string UPRSELGL0 = M("Bauteil(e) &verankern","&Glue Part(s)"); string UPRSELGL1 = M("Bauteil(e) &freigeben","&Unglue Part(s)"); string UPRSELGL2 = M("%Gruppenelemente v&erankern","%G&lue Group Elements"); string UPRSELGL3 = M("Gruppenelemente f&reigeben","U&nglue Group Elements"); string UPRSELGL4 = M("%&Selektieren verankert","%&Select Glued"); string UPRSELGL5 = M("&Deselektieren verankert","&Deselect Glued"); string UPRPDFCOLOR = M("PDF-Farbe ? ","PDF Color ? "); string UPRPDFLAY = M("PDF-Ebene ? ","PDF Layer ? "); string UPRBRWCOLOR = M("BAE-Auswahl","BAE-Selection"); string UPRBRWCOLORP = M("PDF-Farbe selektieren!","Select PDF Color!"); string UPRLAYSET = M("Lagenaufbau [um]","Layer Stackup [um]"); string UPRLAYEPSR = M("Epsilon r","Epsilon r"); string UPRLAYTAND = M("tan delta","tan delta"); string UPRLAYTHICK = M("Metall.","Metall"); string UPRLAYISO = M("Isolation","Isolation"); string UPRLAYSUM = M("Gesamtdicke","Total Thickness"); string UPRLAYSUMB = M("Summe ->","Sum ->"); string UPRLAYSURF = M("Oberflaeche","Surface"); string UPRLAYMAT = M("Material","Material"); string UPRLAYNOMAT = M("spezial","special"); string UPRLAYTOL = M("Toleranz [%]","Tolerance [%]"); string UPRLAYCORE = M("core","core"); string UPRLAYFILL = M("Masse","Ground"); string UPRLAYCOMM = M("Kommentar","Comment"); string UPRLAYFROM = M("von","from"); string UPRLAYTO = M("zu","to"); string UPRLAYMOVE = M("&Verschieben","Mo&ve"); string UPRLAYADD = M("&Hinzufuegen","&Add"); string UPRLAYDEL = M("&Loeschen","&Delete"); string UPRLAYEXP = M("&Export","&Export"); string UPRLAYIMP = M("&Import","&Import"); string UPRLAYDUMP = M("&Dump","Dum&p"); string UPRSELLAY = M("Neue Lage auswaehlen","Select New Layer"); string UPRDELLAY = M("Lage loeschen","Delete Layer"); string UPRDFILE = M("!Zieldateiname ? ","!Destination File Name ? "); string UPRSFILE = M("Quelldateiname ? ","Source File Name ? "); string UPRFEXISTS = M("Ausgabedatei '%s' existiert bereits. Ueberschreiben ?", "Output file '%s' already exits. Overwrite ?"); string UPRNEWTHICK = M("Neue Gesamtdicke %sum eintragen ?", "Use new total thickness %s um ?"); string UPRDIALFFUNC = M("Kontextfunktionen","Context Functions"); string UPRITEMMOVDST = M("Neue Position fuer Kontextfunktion '%s' selektieren", "Select new position for context function '%s'"); string UPRDIALFEDIT = M("Kontextfunktion %d","Context Function %d"); string UPRDFCTNAME = M("Name :","Name :"); string UPRDFCTPROG = M("Aufrufsequenz :","Calling sequence :"); string UPRULCPROG = M("Programmname :","Program Name :"); string UPRMACSEL = M("Makroauswahl","Macro Selection"); string UPRDEDIT = M("&Aendern","&Edit"); string UPRDADDF = M("Neue Menu&funktion","Add Menu &Item"); string UPRDADDM = M("Neues &Makro","Add Ma&cro"); string UPRDADDU = M("Neue &Anwenderfunktion ","Add &User Script"); string UPRDDEL = M("&Loeschen","Dele&te"); string UPRDDELA = M("Alle l&oeschen","Delete All"); string UPRDMOVE = M("&Verschieben","&Move"); string UPRDDONE = M("Fer&tig","&Done"); string UPRDADD = M("&Hinzufuegen","&Add"); string UPRLOCK = M("Sperren","Lock"); string UPRDEFAULT = M("Default","Default"); string UPRBROWSE = M("Browse","Browse"); string UPRLISTADD = M("Liste anlegen","Add List"); string UPRLISTEDIT = M("Liste aendern","Edit List"); string UPRATTRVAL = M("Attributwert ? ","Attribut Value ? "); string UPRDIALVALL = M("Werte fuer '%s'","Values of '%s'"); string UPRVALMOVDST = M("Neue Position fuer Wert '%s' selektieren", "Select new position for value '%s'"); string UPRNEXTDIAL = M("&>","&>"); string UPRPREVDIAL = M("&<","&<"); string UPRSELATEXT = M("Attributtext selektieren!", "Select Attribute Text!"); string UPRDEFVAL = M("Defaultwert fuer '%s' ? ", "Default Value for '%s' ? "); string UPRATTRVDIAL = M("Defaultattributwerte von '%s':", "Default attribute values of '%s'"); string UPRNOVAL = M("&Kein Wert","N&o Value"); string UPRALLRES = M("Alle &ruecksetzen","&Reset All"); string UPRALLDEF = M("&Alle Default","Default &All"); string UPRPRED = M("Predikatattribute von '%s' :", "Predicate attributes of '%s' :"); string UPRPFILE = M("Projektdateiname ? ","Project File Name ? "); string UPRBRWFILENAME = M("Browse","Browse"); string UPRLINKFILE = M("Dokumentationsdatei/link:", "Documentation file/link:"); string REPRULECOPY = M("%d Regeln kopiert.","%d rules copied."); string REPDBLLAY = M("%s bereits verwendet!","%s already used!"); string REPCOLORSET = M("PDF-Farbe '%s' %d Elementen zugewiesen.", "Assigned PDF color '%s' to %d elements."); string REPPDFLAYSET = M("PDF-Ebene '%s' %d Elementen zugewiesen.", "Assigned PDF layer '%s' to %d elements."); string REPLAYL = M("Lagenauswahl :","Layer Selection :"); string REPEXPDONE = M("Lagenaufbau in Datei '%s' geschrieben.", "Layer setup written to file '%s'."); string REPIMPDONE = M("Lagenaufbau aus Datei '%s' importiert.", "Layer setup imported from file '%s'."); string REPELEMSEL = M("%d Element(e) hinzuselektiert. Jetzt %d Elemente in Gruppe.", "%d element(s) selected. Now %d elements in group."); string REPELEMDSEL = M("%d Element(e) deselektiert. Jetzt %d Elemente in Gruppe.", "%d element(s) deselected. Now %d elements in group."); string REPGLUED = M("%d Element(e) verankert.","%d element(s) glued."); string REPUNGLUED = M("%d Elementverankerungen geloest.", "%d element(s) unglued."); string REPPGLUED = M("Bauteil/Pin '%s' verankert. Bauteil/Pin selektieren!", "Part/Pin '%s' glued. Select part/pin!"); string REPPUNGLUED = M("Bauteil/Pin '%s' Verankerung geloest. Bauteil/Pin selektieren!", "Part '%s' unglued. Select part/pin!"); string REPDEFVAL = M("Werte fuer Predikat %s:", "Values for Predicate %s:"); string REPNILATT = M("!nicht_gesetzt!","!not_set!"); string REPRULESET = M("Regel '%s' an %d Elemente angehaengt.", "Attached rule '%s' to %d elements."); string REPRULEDEL = M("Regel(n) '%s' von %d Elementen entfernt.", "Detacged rule(s) '%s' from %d elements."); string REPRULEREM = M("Regeln von %d Elementen entfernt.", "Detached rules from %d elements."); string ERRNORULE = M("Regel '%s' nicht definiert!", "Rule '%s' not defined!"); string ERRNOATT = M("Bauteil '%s' besitzt keine Predikatattribute!", "Bauteil '%s' has no predicate attributes!"); string ERRNOMACRO = M("Keine Makros definiert!","No Macros defined!"); string ERRNOMOVITEM = M("Keine Kontextfunktion fuer die Verschiebung selektiert!", "No move source context function selected!"); string ERRNOMOVVAL = M("Kein Wert fuer die Verschiebung selektiert!", "No move source value selected!"); string ERRPARTGLUED = M("Bauteil '%s' ist verankert!", "Part '%s' is glued!"); string ERRNOPRED = M("Bauteil '%s' ('%s') besitzt keine Predikatattribute!", "Part '%s' ('%s') has no predicate attributes!!"); string ERRINVCOLOR = M("Ungueltige Farbauswahl!", "Invalid color selection!"); string ERRBASELAY = M("Abbruch: Signallage 1 ist nicht als Basislage verwendet!", "Abort: Singal layer 1 is not used as base layer!"); string ERRNOPICK = M_ERRNOPICK(); string ERRNOWIN = M("Nur in Windowsumgebungen verfuegbar!", "Windows Environment needed!"); string FMTHEADER = M("Lagenaufbau\n\n","Layer Setup\n\n"); string FMTFILE = M("Projekt ...: %s\n","Project ...: %s\n"); string FMTBOARD = M("Platine ...: %s\n\n","Board .....: %s\n\n"); string FMTMETALL = M("Lage '%s' Metallisierung %s %.1f um", "Layer '%s' Metall %s %.1f um"); string FMTSHIELD = M(" Masse"," Shield"); string FMTISOL = M("Dielektrikum %.1f um, Epsr %.1f, tan delta %.3f\n", "Isolation %.1f um, Epsr %.1f, tan delta %.3f\n"); #define FMTLAYENTRY "%s%s%s%s%.1f%s%d%s%s%s%.1f%s%s%s%.2f%s%.3f%s%.1f%s%d\n" #define FMTLAYDENTRY "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n" // INI file parameter name definitions #define PAR_LAYIML "LAYIMATL_LAY" // Layer material list #define PAR_LAYITL "LAYITOLL_LAY" // Layer isolation tolerance list #define PAR_LAYS "LAYSURF_LAY" // Default layer surface #define PAR_LAYT "LAYTHICK_LAY" // Default layer thickness #define PAR_LAYI "LAYISO_LAY" // Default layer isolation #define PAR_ISOM "LAYISOM_LAY" // Default layer isolation material #define PAR_ISOT "LAYISOT_LAY" // Default layer isolation tolerance #define PAR_ISOC "LAYISOC_LAY" // Default layer isolation core flag #define PAR_EPSR "LAYEPSR_LAY" // Default epsilon r #define PAR_TAND "LAYTAND_LAY" // Default tangens delta #define PAR_LAYF "LAYFILL_LAY" // Default layer fill flag #define PAR_LAYSTKEXT "LAYSTKEXT_LAY" // Layer stackup file name extension #define PAR_LAYSTKORD "LAYSTKORD_LAY" // Layer stackup file layer order #define PAR_LAYSPROG "LAYSPROG_LAY" // User def. layer stackup program name #define PAR_LISTDCNT "MACRODCNT_STD" // Max. dialog list items count #define PAR_ATTRCOMMP "ATTR_%s_STD" // Attribute comment pattern #define PAR_ATTRORDP "ATTR_ORD_%s_STD" // Attribute order pattern #define PAR_DBAFEXT "DBAFEXT_LAY" // DBase ASCII file name ext. #define PAR_DBFFSEP "DBFFSEP_LAY" // DBase ASCII file field seperator // SQL command definitions #define MN_SELECT "select macname from macrotab where ptyp=%d AND midx=0;" // Dialog box definitions #define ED_WIDTHF 40.0 // Favorite param. edit field width #define CCOLOFFFL 87.0 // Fav. list 2nd ctrl. column offset #define CCOLOFFF 20.0 // Fav. param. 2nd ctrl. column offset #define SELBOXWIDTHLS 70.0 // Value selection box width #define MBUTWIDTH 8.0 // Menu action button width #define MBUTXSTEP 10.0 // Menu action button x step #define CCOLOFFPL 60.0 // Values 2nd ctrl. column offset double BUTXSTEP = bae_swconfig(3)==2 ? 2.0 : 0.0 /* Menu action button x spacing */; #define SELBOXWIDTHFS 95.0 // Favorite selection box width int MAXMENULIST = bae_iniintval(PAR_LISTDCNT,12) /* Max. menu list length */; #define MAXMENUITEM 28 // Max. menu item count // Globals #define GV_PROPCALL "propcall" // Property function call flag #define GV_PROPX "propx" // Property query x coordinate #define GV_PROPY "propy" // Property query y coordinate #define UL_MACRO "macro" // ULP: Macro Management double DEF_EPSR = bae_inidblval(PAR_EPSR,4.5); // Default epsilon r double DEF_TAND = bae_inidblval(PAR_TAND,0.02); // Default tangens delta double DEF_LAYT = bae_inidblval(PAR_LAYT,0.000070); // Default layer thickness double DEF_LAYI = bae_inidblval(PAR_LAYI,0.0003); // Default layer isolation int DEF_LAYF = bae_iniintval(PAR_LAYF,0); // Default layer fill flag string DEF_LAYS = bae_inistrval(PAR_LAYS,"Cu"); // Default layer surface int DEF_ISOC = bae_iniintval(PAR_ISOC,1); // Default core flag value double DEF_ISOT = bae_inidblval(PAR_ISOT,0.0); // Default isolation tolerance string DEF_ISOM = bae_inistrval(PAR_ISOM,""); // Default isolation material string LAYSTKEXT = bae_inistrval(PAR_LAYSTKEXT,""); // Layer stackup file name extension int LAYSTKORD = bae_iniintval(PAR_LAYSTKORD,0); // Layer stackup file layer order string CSVEXT = bae_inistrval(PAR_DBAFEXT,".csv"); // CSV ASCII output file name ext. string CSVFSEP = bae_inistrval(PAR_DBFFSEP,";"); // CSV ASCII out. file field seperator static string laysprog = bae_inistrval(PAR_LAYSPROG,"") /* Layer stackup done program call */; static string BAEMACRODB = strgetconffilename(MACROVNAME,MACROFNAME,1); static int IPTYP = uliptype() /* UL interpreter type */; static string sqlcommand /* SQL command string */; static string macl[] /* Macro name list */; static int macn /* Macro name count */; struct cfctdes { // Context function descriptor string menu /* Menu text */; string seq /* Function call sequence */; } cfctl[] /* Context function list */; int cfctn /* Context function count */; struct attrdes { // Attribute descriptor string defvall[] /* Attribute default value list */; int defvaln /* Attribute default value count */; string val /* Attribute value */; string valbak /* Attribute value backup */; string name /* Attribute name */; string disp /* Attribute display name */; int ord /* Attribute order */; int lock /* Attribute locked flag */; } attl[] /* Attribute data list */; int attn = 0 /* Attribute count */; double ax, ay /* Attribute pick search coord. */; double amindist /* Attribute pick min. distance */; string aminname = "" /* Attribute pick min. name */; STRINGS headl /* Header string list */; int headn = 2 /* Header string count */; struct laysdes { // Layer stackup descriptor string comm /* Layer commentary text */; int layer /* Layer code */; double epsr /* Epsilon r */; double tand /* Tangens delta */; double cu /* Copper thickness */; double iso /* Isolation */; double tol /* Isolation tolerance */; int core /* Layer isolation core flag */; string surf /* Layer surface type */; string mat /* Layer isolation material type */; int fill /* Layer fill flag */; }; struct laysdes layspl[] /* Layer stackup parameter list */; int layscnt = 0 /* Layer stackup count */; double thickness /* PCB total thickness */; struct matdes { // Layer isolation material descriptor string name /* Isolation material name */; double epsr /* Epsilon r */; double tand /* Tangens delta */; } matpl[] /* Isolation material list */; struct matdes defmatpl[] = { // Default isolation material list {"FR4" , 4.50,0.02 }, {"RO 3003", 3.00,0.0013}, {"RO 3203", 3.02,0.0016}, {"RO 3006", 6.15,0.0025}, {"RO 3010",10.20,0.0035}, {"RO 4003", 3.38,0.0020}, {"RO 4350", 3.48,0.0040}, {"RO 4403", 3.20,0.0050} }; int matpn /* Isolation material param. count */; double tolpl[] /* Isolation tolerance list */; int tolpn /* Isolation tolerance param. count */; #define TYPINT 0x01 // Integer data type #define TYPDBL 0x02 // Double data type #define TYPSTR 0x03 // String data type #define TYPINTBITS 0x01 // Bitmask data sub type #define TYPINTSEL 0x02 // Selection data sub type #define TYPDBLDIM 0x01 // Dimension data sub type #define TYPSTRNAME 0x01 // Name data sub type #define TYPSTRFILE 0x02 // File name data sub type #define TYPSTRLINK 0x03 // Link/file name data sub type #define LAYBIT 0x01 // Layout class mask bit #define PRTBIT 0x02 // Layout part class mask bit #define STKBIT 0x04 // Layout padstack class mask bit #define PADBIT 0x08 // Layout pad class mask bit #define POLYBIT (1<=0) // Query plot color predicate if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_PLOTRGB,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); if (bae_dialclr()) { // Select color bae_setintpar(16,3103); if (bae_askname(scolor,UPRPDFCOLOR,MAXKEYLEN)) // Aborted error_abort(); } else { baseheight=DIAL_TOPMARG+DIAL_BUTVSTEP+ DIAL_CTRVSTEP+DIAL_SEPVSTEP; do { bae_dialclr(); dial_getboxsizemin(3103,dialwidth,dialheight, DIAL_LEFTMARG+40.0+DIAL_RIGHTSMARG, baseheight+16.0,DIAL_LEFTMARG+25.0+ DIAL_RIGHTSMARG,baseheight+1.0); cy=DIAL_TOPMARG; // Store the OK and abort button bae_dialaddcontrol(PA_OK,0,0,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG,cy,0.0,""); bae_dialaddcontrol(PA_ABORT,0,0,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+5.0,cy,0.0,""); bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+12.0,cy,0.0,UPRBRWCOLOR); cy+=DIAL_BUTVSTEP; edtidx=bae_dialaddcontrol(PA_STR|PA_HBRDREL,0,0, 0,0.0,0.0,0.0,scolor,MAXKEYLEN,DIAL_LEFTMARG, cy,DIAL_RIGHTSMARG,""); cy+=DIAL_CTRVSTEP; // Store list box bae_dialadvcontrol( PA_LB|PA_OKSEL|PA_HBRDREL|PA_VBRDREL, edtidx,0,(-1),0.0,0.0,0.0,"",0,DIAL_LEFTMARG, cy,DIAL_RIGHTEMARG,DIAL_SEPVSTEP,""); // Store list box entries cnt=0; while (bae_nameget(cnt,scolor,"","","",0)==0) { bae_dialaddcontrol(PA_LBE,0,0,cnt,0.0, 0.0,0.0,"",0,0.0,0.0,0.0,scolor); cnt++; } cy+=dialheight-baseheight+DIAL_SEPVSTEP; bae_setintpar(16,3103); switch (bae_dialaskparams( "!"+UPRPDFCOLOR,0,dialwidth,cy)) { // Done case 0 : bae_dialgetdata(edtidx,0,0.0,scolor); repflag=0; break; // Palette selection case 1 : // Process any redraw event bae_wsmouse(0.0,0.0,0); // Temp. use layer 90 for color query ged_setstrpar(8,UPRBRWCOLORP); oldcol=bae_getcolor(89); bae_setcolor(89,0); bae_clriactqueue(); bae_storetextiact(1,"90"); bae_storemouseiact(0,0.0,0.0,0,LMB); bae_storetextiact(1,""); bae_callmenu(108); ged_setstrpar(8,""); if ((newcol=bae_getcolor(89))>=0 && newcol<=15) { scolor=colstrings[newcol]; } else if (newcol&32) { scolor=bae_numstring( ((newcol&0x0F0000)>>16)/15.0,3)+ " "+bae_numstring( ((newcol&0x0F000)>>12)/15.0,3)+ " "+bae_numstring( ((newcol&0x0F00)>>8)/15.0,3); } else { error(ERRINVCOLOR); } // Restore layer 90 color bae_setcolor(89,oldcol); break; // Resize case (-2) : bae_dialgetdata(edtidx,0,0.0,scolor); break; default : error_abort(); } // Stop if no further repeat requests } while (repflag); } cnt=0; forall (fig where fig.GROUP) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element color predicate rule rs_assfigstrpred(fig,RS_PLOTRGB,scolor,"",""); cnt++; } sprintf(selmsg,REPCOLORSET,scolor,cnt); bae_prtdialog(selmsg); break; // Select PDF color case 4 : bae_nameclr(); // Loop for all elements forall (fig where fig.RULEOBJID>=0) // Query plot color predicate if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_PLOTRGB,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select color bae_setintpar(16,3103); if (bae_askname(scolor,UPRPDFCOLOR,MAXKEYLEN)) // Aborted error_abort(); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && !fig.GROUP) { // Query plot color predicate if (fig.RULEOBJID<0 || lay_rulequery(RS_OCFIG, fig,RS_PCBSUBJ,RS_PLOTRGB,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { ged_elemgrpchg(fig,1); cnt++; } } // Report changes prtgrpcount(cnt,1); break; // Set PDF layer case 5 : bae_nameclr(); // Loop for all elements forall (fig where fig.RULEOBJID>=0) // Query plot color predicate if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_PDFLAY,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select layer bae_setintpar(16,3124); if (bae_askname(scolor,UPRPDFLAY,MAXKEYLEN)) // Aborted error_abort(); cnt=0; forall (fig where fig.GROUP) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element PDF layer predicate rule rs_assfigstrpred(fig,RS_PDFLAY,scolor,"",""); cnt++; } sprintf(selmsg,REPPDFLAYSET,scolor,cnt); bae_prtdialog(selmsg); break; // Select PDF layer case 6 : bae_nameclr(); // Loop for all elements forall (fig where fig.RULEOBJID>=0) // Query plot color predicate if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_PDFLAY,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select layer bae_setintpar(16,3124); if (bae_askname(scolor,UPRPDFLAY,MAXKEYLEN)) // Aborted error_abort(); // Loop for all elements forall (fig where !fig.GROUP) { // Query PDF layer predicate if (fig.RULEOBJID<0 || lay_rulequery(RS_OCFIG, fig,RS_PCBSUBJ,RS_PDFLAY,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { ged_elemgrpchg(fig,1); cnt++; } } // Report changes prtgrpcount(cnt,1); break; // Abort case 7 : default : error_abort(); } exit(0); // Glue functions case 8 : bae_defmenusel(-1); bae_promptdialog(UPRSELGL); switch (bae_askmenu(7,UPRSELGL0,UPRSELGL1,g_dis+UPRSELGL2, g_dis+UPRSELGL3,UPRSELGL4,g_dis+UPRSELGL5,UPRABORT)) { // Glue selectable parts case 0 : if (ddbclass!=DDBCLLAY && ddbclass!=DDBCLLPRT) error_class(); setglue(1,0); break; // Unglue selectebale parts case 1 : if (ddbclass!=DDBCLLAY && ddbclass!=DDBCLLPRT) error_class(); setglue(0,0); break; // Glue group elements case 2 : setglue(1,1); break; // Unglue group elements case 3 : setglue(0,1); break; // Select glued elements case 4 : prtgrpcount(ged_groupselect(10,2,1),1); break; // Deselect glued elements case 5 : prtgrpcount(ged_groupselect(10,2,0),0); break; // Abort case 6 : default : error_abort(); } exit(0); // Layer stackup case 9 : if (h_dis=="") layerstackup(); exit(0); // Part predicate definitions case 10 : switch (ddbclass) { case DDBCLLAY : partpredicates(); exit(0); case DDBCLLPRT : preddefvalset(); exit(0); default : ; } error_class(); // Edit element context functions case 11 : elementfunctions(); exit(0); // Rule update case 12 : updrules(); exit(0); // Abort case 13 : default : exit(0); } // Check if plan rule if (seltyp==PLANTYP) { // Get the plan rules rulen=rs_getplanrules(rulel); // Edit the rules subtyp=0; editrules("",""); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Attach/detach the rule list if (rulen) { if (lay_ruleplanatt(rulel)) rs_error(-1); } else if (lay_getrulecnt(RS_OCPLAN,0)>0) { if (lay_ruleplandet()) rs_error(-1); } // Redraw the screen bae_callmenu(MNU_BAEREDISPL); } else { // Loop while element picked bae_prtdialog(selmsg); while (ged_pickelem(rulefig,seltyp)==0) { // Get the rule count name1=name2=""; rulen=rs_getfigrules(rulefig,rulel); switch (seltyp) { case L_FIGTEXT : subtyp= (rulefig.TEXT.STR[0]=='$' ? ATXTBIT : 0); name1=rulefig.NAME; laytyp=getlaytyp(rulefig.LAYER); // Query the multiline text status if (rulefig.RULEOBJID<0 || lay_rulequery( RS_OCFIG,rulefig,RS_PCBSUBJ,RS_MTEXTID, "?s",mtextid)<=0) mtextid=""; break; case L_FIGPATH : subtyp=0; laytyp=getlaytyp(rulefig.LAYER); break; case L_FIGPOLY : switch (rulefig.POLY.TYP) { case L_POLYDOCLINE : subtyp=DLINEBIT; break; case L_POLYDOCAREA : subtyp=DAREABIT; break; case L_POLYKEEPOUT : subtyp=KOUTABIT; break; case L_POLYCOPPASS : subtyp=COPABIT; break; case L_POLYCOPACT : subtyp=ACOPABIT; break; case L_POLYSPPAREA : subtyp=SPPOWBIT; break; case L_POLYBRDOUT : subtyp=OUTLBIT; break; case L_POLYCOPFILL : default : subtyp=COPFABIT; } laytyp=getlaytyp(rulefig.LAYER); break; case L_FIGNREF : switch (rulefig.NREF.MACRO.CLASS) { case DDBCLLAY : subtyp=LAYBIT; break; case DDBCLLPRT : subtyp=PRTBIT; break; case DDBCLLSTK : subtyp=STKBIT; break; case DDBCLLPAD : subtyp=PADBIT; break; default : subtyp=0; } name1=rulefig.NAME, name2=rulefig.NREF.MACRO.NAME; laytyp=0; break; case L_FIGUREF : switch (rulefig.UREF.MACRO.CLASS) { case DDBCLLAY : subtyp=LAYBIT; break; case DDBCLLPRT : subtyp=PRTBIT; break; case DDBCLLSTK : subtyp=STKBIT; break; case DDBCLLPAD : subtyp=PADBIT; break; default : subtyp=0; } name1=rulefig.UREF.MACRO.NAME; laytyp=getlaytyp(rulefig.UREF.LAYOFF); break; case L_FIGDRILL : subtyp=1<0) { if (lay_rulefigdet(rulefig)) rs_error(-1); } // Check if multiline text rule transfer if (mtextid!="") { // Get the base rules mrulen=4; sprintf(mrulel[0],":%s:%s='%s';", RS_PCBSUBJ,RS_MTEXTID,mtextid); for (i=0;i=0 && lay_rulequery(RS_OCFIG,rulefig,RS_PCBSUBJ, RS_MTEXTID,"?s",textid)>0 && textid==mtextid) { // Get multiline text data if (lay_rulequery(RS_OCFIG,rulefig, RS_PCBSUBJ,RS_MTEXTCOL,"?d",col)<1 || lay_rulequery(RS_OCFIG,rulefig, RS_PCBSUBJ,RS_MTEXTROW,"?d",row)<1 || lay_rulequery(RS_OCFIG,rulefig, RS_PCBSUBJ,RS_MTEXTLS,"?f",linespc)<1) continue; sprintf(mrulel[1],":%s:%s=%d;", RS_PCBSUBJ,RS_MTEXTCOL,col); sprintf(mrulel[2],":%s:%s=%d;", RS_PCBSUBJ,RS_MTEXTROW,row); sprintf(mrulel[3],":%s:%s=%.2f;", RS_PCBSUBJ,RS_MTEXTLS,linespc); if (lay_rulefigatt(rulefig,mrulel)) rs_error(-1); } } // Redraw the screen bae_callmenu(MNU_BAEREDISPL); // Prompt for next element bae_prtdialog(selmsg); } } } static void grpsetrules() // Set group element rules { index L_FIGURE fig /* Figure list index */; string rulename = "" /* Rule name */; string rn = "" /* Rule scan name */; string msg /* Message buffer */; int cnt = 0 /* Change count */; char c /* Rule name character buffer */; int i,j /* Loop control variables */; // Build rule name list bae_nameclr(); while (scanddbenames(rsdatabase,DDBCLRULE,rn)==1) if (!strmatch(rn,"scm_*") && !strmatch(rn,"lay_variant*")) // Add the commented rule name bae_nameadd( ddbcelemname(rsdatabase,rn,DDBCLRULE,1),"","","",2); // Get the rule name bae_setintpar(16,3125); if (bae_askname(rulename,UPRRULE,MAXKEYLEN)) // Aborted error_abort(); for (i=0;(c=rulename[i])!='\0';i++) if (c==' ') break; if (c==' ') rulename=strextract(rulename,0,i-1); // Loop for all group elements forall (fig where fig.GROUP) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Get the rule count rulen=rs_getfigrules(fig,rulel); // Clear any previous rule definition for (i=rulen-1;i>=0;i--) if (rulel[i]==rulename) { // Delete the old rule for (j=i;j=0) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if (lay_rulefigdet(fig)) rs_error(-1); cnt++; } // Report process count sprintf(msg,REPRULEREM,cnt); bae_prtdialog(msg); } else { // Loop for all group elements forall (fig where fig.GROUP && fig.RULEOBJID>=0) { // Get the rule count rulen=rs_getfigrules(fig,rulel); // Clear any previous rule definition for (i=rulen-1;i>=0;i--) if (strmatch(rulel[i],rulename)) { // Delete the old rule for (j=i;j=0) { // Get the rule count rulen=rs_getfigrules(fig,rulel); // Search for given rule for (i=0;i=0 ? predl[predidx].delpat : ""); // Check if default value if (predidx>=0 && predl[predidx].defsval==strval) continue; // Insert new predicate rule sprintf(nrn,":%s:%s='%s';",RS_PCBSUBJ,predname,strval); insrule(nrn); continue; // Double predicate case 3 : valtyp=TYPDBL; if ((predname=getpredname())=="") continue; dblval=getpreddval(predname); if (editpreddval(predname,dblval)) continue; // Delete old value rule delpred(predname, predidx>=0 ? predl[predidx].delpat : ""); // Check if default value if (predidx>=0 && predl[predidx].defdval==dblval) continue; // Insert new predicate rule if (floor(dblval)==ceil(dblval)) sprintf(nrn,":%s:%s=%.1f;",RS_PCBSUBJ, predname,dblval); else sprintf(nrn,":%s:%s=%.9g;",RS_PCBSUBJ, predname,dblval); insrule(nrn); continue; // Integer predicate case 4 : valtyp=TYPINT; if ((predname=getpredname())=="") continue; intval=getpredival(predname); if (editpredival(predname,intval)) continue; // Delete old value rule delpred(predname, predidx>=0 ? predl[predidx].delpat : ""); // Check if default value if (predidx>=0 && predl[predidx].defival==intval) continue; // Insert new predicate rule sprintf(nrn,":%s:%s=%d;",RS_PCBSUBJ,predname,intval); insrule(nrn); continue; // Resize case (-2) : continue; // Abort case (-1) : error_abort(); // Done case 5 : default : return; } } // Scan the rule list for (i=0;i=rulen) { // Check if rule exists if (!rs_isrule(nrn)) { // Issue rule not defined message sprintf(msg,ERRNORULE,nrn); bae_msgbox(2,msg,""); continue; } insrule(nrn); } else { // Delete the old rule for (;i=0) predval=predl[predidx].comm+" : "+predval; bae_dialsetdata(labidx,PA_LAB|PA_HBRDREL,0,0.0,predval); // Return without errors return(0); } void insrule(string rulename) /* // Insert rule name sorted into rule name list // Parameter : // string name : New rule name */ { int i /* Loop control variable */; // Insert new rule sorted into list for (i=rulen;i>0;i--) if (rulel[i-1]>rulename) rulel[i]=rulel[i-1]; else break; rulel[i]=rulename; rulen++; } void delpred(string name,string delpat) /* // Delete predicate definition from rule name list // Parameter : // string name : Predicate name // string delpat : Old rule deletion name pattern */ { string pdefprefix /* Predicate def. prefix */; int pdefend /* Predicate def. end */; int i /* Loop control variable */; // Get predicate rule definition prefix sprintf(pdefprefix,":%s:%s=",RS_PCBSUBJ,name); pdefend=strlen(pdefprefix)-1; for (i=0;i=0) predval+=" : "+predl[predidx].comm; bae_dialsetdata(labidx,PA_LAB|PA_HBRDREL,0,0.0,predval); // Return without errors return(0); } static string getpredval(string name) /* // Get predicate value string for current element // Parameter : // string name : Predicate name */ { string strbuf = "" /* String result buffer */; double dblval /* Double value */; int intval /* Integer value */; int bitcnt /* Bit count */; int bitmask /* Current bit mask */; int i /* Loop control variable */; switch (valtyp) { case TYPSTR : return(getpredsval(name)); case TYPDBL : dblval=getpreddval(name); if (predidx>=0 && predl[predidx].valstyp==TYPDBLDIM) dblval=cvtlength(dblval,0,2); if (floor(dblval)==ceil(dblval)) sprintf(strbuf,"%.1f",dblval); else sprintf(strbuf,"%.9g",dblval); if (predidx>=0 && predl[predidx].valstyp==TYPDBLDIM) strbuf+="mm"; break; case TYPINT : default : intval=getpredival(name); if (predidx>=0) { if (predl[predidx].valstyp==TYPINTBITS) { if (arylength(predl[predidx].namel)==1) return( intval ? UPRPREDFSET : UPRPREDFUSET); strbuf=UPRPREDBITS+itoa(intval)+" ("; bitmask=1; bitcnt=arylength(predl[predidx].namel); for (i=bitcnt-1;i>=0;i--) { strbuf+= ((intval&bitmask)!=0) ? "1" : "0"; bitmask<<=1; } strbuf+=")"; return(strbuf); } if (predl[predidx].valstyp==TYPINTSEL) { if (predl[predidx].defival<0 && intval>=predl[predidx].defival & intval<(predl[predidx].defival+ arylength(predl[predidx].namel))) return(bae_plainmenutext( predl[predidx].namel[intval- predl[predidx].defival])); else if (intval>=0 && intval=0 && predl[predidx].valstyp==TYPINTBITS && !bae_dialclr()) { // Perform the input loop do { bae_dialclr(); cy=DIAL_TOPMARG; bitmask=1<MAXMENULIST) { // Previous menu item set bae_dialaddcontrol(PA_ACT| (bits==0 ? PA_GRAYED : 0),0,1,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+12.0,cy,0.0,UPRPREVDIAL); // Next menu item set bae_dialaddcontrol(PA_ACT| (i>=bitcnt ? PA_GRAYED : 0),0,2,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+12.0+bae_dialgettextlen( 0,UPRPREVDIAL),cy,0.0,UPRNEXTDIAL); } dial_okabort(cy); // Call the dialog function bae_setintpar(16,3097); switch (res=bae_dialaskparams(prompt,0, DIAL_LEFTMARG+45.0,cy)) { case 0 : case 1 : case 2 : bitmask=1<=bitcnt) bits=bitcnt-MAXMENULIST; break; case 0 : default : return(0); } break; default : repflag=0; } // Stop if no further repeat requests } while (repflag); return(-1); } // Check if selection input else if (predidx>=0 && predl[predidx].valstyp==TYPINTSEL && !bae_dialclr()) { if (predl[predidx].defival<0) val-=predl[predidx].defival; bitcnt=arylength(predl[predidx].namel); if (bitcnt<17) { for (i=0;i=0) bae_defmenusel(val); // Get element selection bae_promptdialog(prompt); if ((val=bae_askmenu(bitcnt+1,eleml[0],eleml[1], eleml[2],eleml[3],eleml[4],eleml[5],eleml[6], eleml[7], eleml[8],eleml[9],eleml[10],eleml[11], eleml[12],eleml[13],eleml[14],eleml[15],eleml[16], UPRABORT))<0 || val>=bitcnt) return(-1); } else { dial_selbox(val,0.0,cy); for (i=0;i=0 && predl[predidx].valstyp==TYPDBLDIM) return(askdist(val,prompt,1)); return(askdbl(val,prompt,20)); } static double getpreddval(string name) /* // Get double predicate value for current element // Parameter : // string name : Predicate name */ { double dblval /* Double value */; string pdefprefix /* Pred. definition prefix */; int pdeflen /* Pred. def. length */; int i /* Loop control variable */; // Get predicate rule definition prefix sprintf(pdefprefix,":%s:%s=",RS_PCBSUBJ,name); pdeflen=strlen(pdefprefix); // Scan the rule name list for (i=0;i=0 && predl[predidx].valstyp==TYPSTRFILE) return((bae_askfilename(val,"",prompt) || name=="") ? 1 : 0); if (predidx>=0 && predl[predidx].valstyp==TYPSTRLINK && bae_dialclr()==0) { // Init. the y coordinate cy=DIAL_TOPMARG; // Store file controls dial_label(0.0,cy,UPRLINKFILE); cy+=DIAL_CTRVSTEP; outfidx=dial_string(val,MAXPATHLEN,0.0,cy); bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,0.0,UPRBRWFILENAME); cy+=DIAL_CTRVSTEP; // Store the OK and abort button with seperator dial_hsep(cy); dial_okabort(cy); // Call the dialog function bae_setintpar(16,3139); switch (bae_dialaskparams(prompt,0, DIAL_LEFTMARG+60.0+DIAL_RIGHTSMARG,cy)) { // Done case 0 : bae_dialgetdata(outfidx,0,0.0,val); return(val); // Browse file name case 1 : return( (bae_askfilename(val,"",prompt) || name=="") ? 1 : 0); } error_abort(); } return((val=bae_readedittext(prompt,val,predidx>=0 && predl[predidx].valstyp==TYPSTRNAME ? MAXKEYLEN : MAXTEXTLEN))== UINPOPABORT ? (-1) : 0); } static string getpredsval(string name) /* // Get string predicate value for current element // Parameter : // string name : Predicate name */ { string strval /* String value */; string pdefprefix /* Pred. definition prefix */; int pdeflen /* Pred. def. length */; int i /* Loop control variable */; // Get predicate rule definition prefix sprintf(pdefprefix,":%s:%s=",RS_PCBSUBJ,name); pdeflen=strlen(pdefprefix); // Scan the rule name list for (i=0;i=0;laysidx--) { cy+=DIAL_CTRVSTEP; dial_label(0.0,cy,layername(layspl[laysidx].layer)); if (opmode) continue; lsidx[laysidx]=bae_dialaddcontrol(PA_STR,0,0,0,0.0,0.0,0.0, layspl[laysidx].surf,MAXTEXTLEN,DIAL_LEFTMARG+ SURFOFF,cy,SURFWIDTH,""); ctidx[laysidx]=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 2,0,0.0,0.0,layspl[laysidx].cu,"",0, DIAL_LEFTMARG+METOFF,cy,METWIDTH,""); if (laysidx=matpn) matidx=(-1); imidx[laysidx]=bae_dialaddcontrol(PA_SB,0,0,matidx,0.0, 0.0,0.0,"",0,DIAL_LEFTMARG+MATOFF,cy,mlen,""); dial_sbentry(4,(-1),UPRLAYNOMAT); for (i=0;i=tolpn) tolidx=0; toidx[laysidx]=bae_dialaddcontrol(PA_SB,0,0, tolidx,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+TOLOFF+mlen,cy,TOLWIDTH,""); for (i=0;i=0;laysidx--) { cy+=DIAL_CTRVSTEP; if (laysidx==0 || (laysidx==(layscnt-1) && layspl[laysidx].layer==lay_plantoplay())) continue; if (firstflag) { fbidx=bae_dialaddcontrol(PA_RBF, laysidx,0,layscnt-2,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+LAYSPACE,cy,0.0,""); firstflag=0; } else { bae_dialaddcontrol(PA_RBN,laysidx,0, 0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+LAYSPACE,cy,0.0,""); } } cy=DIAL_TOPMARG; firstflag=1; for (laysidx=layscnt-1;laysidx>=0;laysidx--) { cy+=DIAL_CTRVSTEP; if (laysidx==0 || (laysidx==(layscnt-1) && layspl[laysidx].layer==lay_plantoplay())) continue; if (firstflag) { tbidx=bae_dialaddcontrol(PA_RBF, laysidx,0,layscnt-3,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+LAYSPACE+4.0,cy,0.0,""); firstflag=0; } else { bae_dialaddcontrol(PA_RBN,laysidx,0, 0,0.0,0.0,0.0,"",0,DIAL_LEFTMARG+ LAYSPACE+4.0,cy,0.0,""); } } } else { cy+=DIAL_CTRVSTEP; dial_label(0.0,cy,UPRLAYSUM); // Summarize thickness bae_dialaddcontrol(PA_ACT,0,8,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+METOFF-1.0,cy,0.0,UPRLAYSUMB); tsidx=bae_dialaddcontrol(PA_DBL|PA_DIST|PA_CHKLL,0, 2,0,0.0,0.0,thickness,"",0,DIAL_LEFTMARG+ISOOFF, cy,ISOWIDTH,""); } cy+=DIAL_BUTVSTEP; // Store the separator dial_hsep(cy); // Store the OK and abort button dial_okabort(cy); // Store function buttons if (!opmode) { cy-=DIAL_SEPVSTEP+DIAL_BUTVSTEP; // Store symbol pool button butx=DIAL_LEFTMARG+LAYSPACE; // Add layer bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0,"",0, butx,cy,0.0,UPRLAYADD); butx+=bae_dialgettextlen(0,UPRLAYADD); butx+=ABUTXSTEP; // Delete layer bae_dialaddcontrol(PA_ACT|(layscnt>2 ? 0 : PA_GRAYED), 0,2,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRLAYDEL); butx+=bae_dialgettextlen(0,UPRLAYDEL); butx+=ABUTXSTEP; // Move layer bae_dialaddcontrol(PA_ACT|((layscnt>3 || layspl[ layscnt-1].layer!=lay_plantoplay()) ? 0 : PA_GRAYED), 0,3,0,0.0,0.0,0.0,"",0,butx,cy,0.0,UPRLAYMOVE); butx+=bae_dialgettextlen(0,UPRLAYMOVE); butx+=ABUTXSTEP+5.0; // Dump layer setup selection bae_dialaddcontrol(PA_ACT,0,5,0,0.0,0.0,0.0,"",0, butx,cy,0.0,UPRLAYDUMP); butx+=bae_dialgettextlen(0,UPRLAYDUMP); butx+=ABUTXSTEP; // Import layer setup selection bae_dialaddcontrol(PA_ACT,0,6,0,0.0,0.0,0.0,"",0, butx,cy,0.0,UPRLAYIMP); butx+=bae_dialgettextlen(0,UPRLAYIMP); butx+=ABUTXSTEP; // Export layer setup selection bae_dialaddcontrol(PA_ACT,0,7,0,0.0,0.0,0.0,"",0, butx,cy,0.0,UPRLAYEXP); cy+=DIAL_SEPVSTEP+DIAL_BUTVSTEP; } // Call the dialog function bae_setintpar(16,3016); res=bae_dialaskparams(UPRLAYSET,3,DIAL_LEFTMARG+(opmode ? LAYSPACE+8.3 : COMMOFF+COMMWIDTH+mlen)+DIAL_RIGHTSMARG,cy); // Get all layer data if (!opmode) { for (i=0;i=0) { layspl[i].mat=matpl[matidx].name; layspl[i].epsr=matpl[matidx].epsr; layspl[i].tand=matpl[matidx].tand; } else { layspl[i].mat=""; } if (tolpn) layspl[i].tol=tolpl[tolidx]; bae_dialgetdata(ctidx[i],0,layspl[i].cu,""); if (layspl[i].layerto) for (i=from;i>to;i--) layspl[i]=layspl[i-1]; else for (i=from;i=0 && layer=POWLAYBASE && layer<(POWLAYBASE+POWLAYMAX))) { for (i=0;i0;i--) { namel[namen]=layername(layspl[i].layer); namen++; } // Build the layer selection popup menu hl[0]=REPLAYL; hl[1]=""; hn=2; // Select layer to be deleted bae_setintpar(16,3066); if ((layname=popupmenu(4,UPRDELLAY,hl,hn,namel,namen, UINPOPABORT,0,-1,-1,0,0,0,UINPOPABORT))=="" || layname==UINPOPABORT) break; // Search selected layer for (i=0;i=namen) break; i=layscnt-i-2; if (layspl[layscnt-1].layer!=lay_plantoplay()) i++; // Remove the layer entry from list layscnt--; for (;i=0;i--) { fprintf(dfh,FMTMETALL,layername(layspl[i].layer)+ (layspl[i].layer0) { fprintf(dfh,FMTISOL,cvtlength(layspl[i].iso,0,4), layspl[i].epsr,layspl[i].tand); } } } else { for (i=0;i=0;i--) fprintf(dfh,FMTLAYENTRY, layspl[i].layer0 ? layspl[i].iso : thickness ,0,4),CSVFSEP, i>0 ? layspl[i].mat : "",CSVFSEP, i>0 ? layspl[i].epsr : 0.0,CSVFSEP, i>0 ? layspl[i].tand : 0.0,CSVFSEP, i>0 ? layspl[i].tol : 0.0,CSVFSEP, i>0 ? layspl[i].core : 0); } else { for (i=0;i0 && ((c=readbuf[len-1])==0x0a || c==0x0d)) len--; readbuf[len]='\0'; // Split line into semicolon-separated strings if ((strn=splitstring(readbuf,strl))<11 || strl[0]=="") continue; for (i=0;i<11;i++) setl[setn][i]=strtrim(strl[i]); setn++; } fclose(fh); fseterrmode(1); // Check if valid base layer if (setl[0][0]=="1") { start=0; end=setn; step=1; } else if (setl[setn-1][0]=="1") { start=setn-1; end=(-1); step=(-1); } else { error(ERRBASELAY); } layscnt=0; for (i=start;i!=end;i+=step) { if (isdigit(setl[i][0][0])) layspl[layscnt].layer=atoi(setl[i][0])-1; else layspl[layscnt].layer=POWLAYBASE+ atoi(strextract(setl[i][0],6,strlen(setl[i][0])))-1; layspl[layscnt].surf=setl[i][1]; layspl[layscnt].cu=cvtlength(atof(setl[i][2]),4,0); layspl[layscnt].fill=atoi(setl[i][3]); layspl[layscnt].comm=setl[i][4]; if (layscnt<(setn-1)) { layspl[layscnt].iso=cvtlength(atof(setl[i][5]),4,0); layspl[layscnt].mat=setl[i][6]; layspl[layscnt].epsr=atof(setl[i][7]); layspl[layscnt].tand=atof(setl[i][8]); layspl[layscnt].tol=atof(setl[i][9]); layspl[layscnt].core=atoi(setl[i][10]); } else { thickness=cvtlength(atof(setl[i][5]),4,0); layspl[layscnt].mat=""; layspl[layscnt].epsr=0.0; layspl[layscnt].tand=0.0; layspl[layscnt].tol=0.0; layspl[layscnt].core=0; } layscnt++; } sprintf(msg,REPIMPDONE,fname); bae_prtdialog(msg); } int splitstring(string s,STRINGS ssl) /* // Split string // Return value : // number of substrings // Parameters : // string s : Input string // STRINGS ssl : Substring list */ { int ssp = 0 /* Substring position */; int ssn = 0 /* Substring count */; int sl = strlen(s) /* String length */; int pos = 1 /* String scan position */; int fs /* Field seperator character */; int c /* Scan character */; // Get the field seperator charachter */ fs=CSVFSEP[0]; // Scan input string for (pos=0;pos0) { ssl[ssn][ssp]='\0'; ssn++; } // Remove field quotation marks for (pos=0;pos=0 && isspace(s[i])) ; // Extract and return substring return(i<0 ? "" : strextract(s,0,i)); } string strtrim(string s) /* // Trim string (skip leading and trailing white spaces) // Return value : // string without leading and trailing white spaces // Parameters : // string s : Input string */ { // Extract and return substring return(strrtrim(strltrim(s))); } string powlayertext(int layer) /* // Get power layer net description text // Return value : // power layer net description string // Parameters : // int layer : Layer number */ { index L_POWLAYER pl /* Power layer index */; index L_POLY poly /* Polygon index */; index L_CNET cnet /* Connection net index */; string laytext = "" /* Layer description text */; STRINGS netnames /* Net names */; int netcnt = 0 /* Net count */; int layidx /* Layer index */; // Scan the power layer list forall (pl) { if ((layidx+POWLAYBASE)==layer) { laytext= pl.CNET.NAME=="" ? "-" : pl.CNET.NAME; break; } layidx++; } // Scan all used net names forall (poly where poly.LAYER==layer && poly.TYP==L_POLYSPPAREA && poly.TREE>=0) { // Find the net with given tree number if (lay_gettreeidx(poly.TREE,cnet)!=0) continue; for (layidx=0;layidx=netcnt) { netnames[netcnt]=cnet.NAME; netcnt++; } } // Add split power plane net names if (netcnt>0) { laytext+=" ("; for (layidx=0;layidx0) laytext+=","; laytext+=netnames[layidx]; } laytext+=")"; strupper(laytext); } // Return the layer net description text return(laytext); } static void updrules() /* // Update project rules from rule database */ { string msg /* Message string */; string fn /* Project file name */; string rn = "" /* Rule name */; int cnt = 0 /* Rule count */; // Select project file name if (bae_askddbfname(fn,1,UPRPFILE)) // Abort error_abort(); // Scan project rules while (scanddbenames(fn,DDBCLRULE,rn)==1) if (ddbcopyelem(rsdatabase,fn,DDBCLRULE,rn,1)==0) cnt++; sprintf(msg,REPRULECOPY,cnt); bae_prtdialog(msg); } void setglue(int glue,int grpflag) /* // Set glue mode // Parameters : // int glue : Glue mode // int grpflag : Group process flag */ { index L_FIGURE fig /* Pick element */; string msg /* Message buffer */; int changes = 0 /* Change count */; if (grpflag) { if (glue) forall (fig where fig.GROUP && !(fig.FIXED&2)) { // Save current state for undo if (changes==0) bae_callmenu(MNU_BAESAVESTATE); rs_assfigintpred(fig,RS_GLUED,glue,0,""); changes++; } else forall (fig where fig.GROUP && (fig.FIXED&2)) { // Save current state for undo if (changes==0) bae_callmenu(MNU_BAESAVESTATE); rs_assfigintpred(fig,RS_GLUED,glue,0,""); changes++; } sprintf(msg,glue ? REPGLUED : REPUNGLUED,changes); bae_prtdialog(msg); } else { // Loop while element picked bae_prtdialog(UPRSELNREF); while (ged_pickelem(fig,L_FIGNREF)==0) { // Save current state for undo if (changes==0) bae_callmenu(MNU_BAESAVESTATE); sprintf(msg,glue ? REPPGLUED : REPPUNGLUED,fig.NAME); rs_assfigintpred(fig,RS_GLUED,glue,0,""); bae_prtdialog(msg); changes++; } bae_prtdialog(""); } } static void partpredicates() /* // Part predicate edit functions */ { index L_FIGURE fig /* Figure list element */; string msg /* Message buffer */; double cy /* Current y value */; double defoff = 0.0 /* Default button offset */; int avidxl[] /* Attribute value index list */; int lockidx = (-1) /* Lock toggle index */; int menuact /* Menu action */; int mlsidx = 0 /* Menu attr. list start idx. */; int menuoff /* Menu item offset */; int menuidx /* Menu item index */; int defidx /* Default value index */; int repflag = 1 /* Repeat flag */; int lock = 0 /* Lock attributes flag */; int lockflag = 0 /* Locked attributes exists flag */; string partname /* Part name */; string attrvalue /* Attribute value */; int attidx /* Attribute list index */; int gridlock /* Grid lock flag */; int anglock /* Angle lock flag */; int i /* Loop control variable */; // Pick part if (bae_peekiact() || varget(GV_PROPCALL,i)==0) { if (varget(GV_PROPX,ax)==0 && varget(GV_PROPY,ay)==0) { vardelete(GV_PROPX); vardelete(GV_PROPY); bae_storemouseiact(3,ax,ay,2,LMB); } else { // Get the old grid and angle lock gridlock=bae_getgridlock(); anglock=bae_getanglelock(); // Release grid and angle lock bae_setgridlock(0); bae_setanglelock(0); if (bae_inpoint(bae_planwsnx(),bae_planwsny(),ax,ay,0)) bae_promptdialog(UPRSELPART); else bae_storemouseiact(3,ax,ay,2,LMB); // Restore the old grid and angle lock bae_setgridlock(gridlock); bae_setanglelock(anglock); } if (ged_pickelem(fig,L_FIGNREF)!=0) error(ERRNOPICK); } else { bae_prtdialog(UPRSELPART); if (ged_pickelem(fig,L_FIGNREF)!=0) error(ERRNOPICK); bae_wsmouse(ax,ay,0); } partname=fig.NAME; if (fig.FIXED&2) errormsg(ERRPARTGLUED,partname); // Check for dialog support if (bae_dialclr()) error(ERRNOWIN); // Init. attribute name list attn=0; // Scan the attributes if (lay_scanpool(fig.POOL, 0.0,0.0,0.0,0,0,amacfunc,NULL,NULL,atextfunc,NULL,NULL,NULL)) error_scan(); // Check if attributes found if (attn==0) { sprintf(msg,ERRNOPRED,partname,fig.NREF.MACRO.NAME); error(msg); } // Check if multipage attribute list if (attn>MAXMENULIST) { // Scan the picked attribute if (lay_scanfelem(fig, 0.0,0.0,0.0,0,0,amacfunc,NULL,NULL,aptextfunc,NULL,NULL,NULL)) error_scan(); if (aminname!="") for (attidx=0;attidx1) { // Search current entry index defidx=0; for (i=0;i1) && !(lock && attl[attidx].lock)) { bae_dialaddcontrol(PA_ACT,0,menuidx+6,0,0.0, 0.0,0.0,"",0,DIAL_LEFTMARG,cy,10.0,UPRNOVAL); if (attl[attidx].defvaln!=0) // Store attribute default value button bae_dialaddcontrol(PA_ACT,0, menuidx+MAXMENULIST+6,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+11.0,cy,8.0, UPRDEFAULT); // Store attribute browse button if (attl[attidx].defvaln>1) bae_dialaddcontrol(PA_ACT,0, menuidx+2*MAXMENULIST+6,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+61.0+defoff, cy,0.0,UPRBROWSE); } else { // Store attribute default button if (attl[attidx].defvaln>1) bae_dialaddcontrol(PA_ACT,0,menuidx+ MAXMENULIST+6,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+11.0,cy,8.0,UPRDEFAULT); } // Store the attribute name control sprintf(msg,": %s",attl[menuidx+mlsidx].disp); dial_label(32.0+defoff,cy,msg); cy+=DIAL_BUTVSTEP; } cy+=DIAL_SEPVSTEP; if (mlsidx>0) bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+20.0,cy,0.0,UPRPREVDIAL); if ((mlsidx+MAXMENULIST)=2*MAXMENULIST) { attidx=menuoff-2*MAXMENULIST+mlsidx; if ((attrvalue=attl[attidx].val)==PA_NILVAL) attrvalue=""; // Build the list header sprintf(headl[0],REPDEFVAL,attl[attidx].disp); headl[1]=""; // Perform the selection popup sprintf(msg,UPRDEFVAL,attl[attidx].disp); bae_setintpar(16,3068); if ((attrvalue=popupmenu( 1,UPRDEFVAL,headl,headn, attl[attidx].defvall,attl[attidx].defvaln, attrvalue,0,0,1,0,0,0, UINPOPABORT))==UINPOPABORT) break; attl[attidx].val=attrvalue; } else if (menuoff>=MAXMENULIST) { attidx=menuoff-MAXMENULIST+mlsidx; // Set default attribute value attl[attidx].val=attl[attidx].defvall[0]; } else if (menuoff>=0 && menuoff=0;i--) if (valstr[i]=='\'') valstr[i]='`'; } // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the default value predicate rule rs_assfigstrpred(fig,RS_INIVAL,valstr,PA_NILVAL,""); // Perform screen redraw screenredraw(); cnt++; } // No pick if (cnt) bae_prtdialog(ERRNOPICK); else perror(ERRNOPICK); return; } // Loop for all attribute texts forall (fig where fig.TYP==L_FIGTEXT) { // Check if valid part predicate reference text name=fig.NAME; if (name[0]!='$' || name[1]!='?' || name[2]!='s' || name[3]!=':') // No valid part predicate reference name continue; name=strextract(name,4,strlen(name)); // Query the current active default value if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ,RS_INIVAL, "?s",vall[0])<1) { // Clear default attribute value vall[0]=PA_NILVAL; valn=0; } else { valn=1; for (i=1;i<100;i++) { if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ, RS_INIVAL+itoa(i),"?s",vall[valn])<1) break; valn++; } } // Query the current active lock flag if (lay_rulequery(RS_OCFIG,fig,RS_PCBSUBJ,RS_ATTADIS, "?d",lock)<1) // Clear lock flag lock=0; // Store the attribute name and value to lists for (attidx=0;attidx=an) { // Get upper case attribute attrname=name; strupper(attrname); // Build order variable name sprintf(attrname,PAR_ATTRORDP, strextract(attrname,1,strlen(attrname))); // Query order variable if (varget(attrname,attrord)!=0) // No order id available attrord=9999; attrname=name; for (j=an;j>0;j--) if (al[j-1].order>attrord || (al[j-1].order==attrord && al[j-1].name>attrname)) al[j]=al[j-1]; else break; // Store new attribute al[j].name=attrname; al[j].order=attrord; al[j].vall=vall; al[j].valn=valn; al[j].maxvaln=valn; al[j].lock=lock; strupper(attrname); // Build comment variable name sprintf(attrname,PAR_ATTRCOMMP, strextract(attrname,1,strlen(attrname))); // Query comment variable if (varget(attrname,valstr)!=0 || valstr=="") // No comment available al[j].dispname=name; else // Attach comment to variable name sprintf(al[j].dispname, "%s %s",fig.NAME,valstr); an++; } // Check if attribute set else if (vall[0]!=PA_NILVAL) { al[attidx].vall=vall; al[attidx].valn=valn; if (valn>al[attidx].maxvaln) al[attidx].maxvaln=valn; } } // Check if attributes defined if (an==0) errormsg(ERRNOATT,bae_planename()); do { bae_dialclr(); cy=DIAL_TOPMARG; // Create the dialog box controls // Build the attribute table menu for (menuidx=0;menuidx1 ? UPRLISTEDIT : UPRLISTADD); // Store attribute lock toggle atidxl[menuidx]=bae_dialaddcontrol(PA_TOGGLE,0,0, al[attidx].lock,0.0,0.0,0.0,"", 0,DIAL_LEFTMARG+44.0,cy,0.0,UPRLOCK); // Store the attribute name control sprintf(msg,": %s",al[attidx].dispname); dial_label(52.5,cy,msg); cy+=DIAL_BUTVSTEP; } cy+=0.4; // Check for previous and next page menu items if (mlsidx>0) bae_dialaddcontrol(PA_ACT,0,1,0,0.0,0.0,0.0,"", 0,20.0,cy,0.0,UPRPREVDIAL); if ((mlsidx+MAXMENULIST)=0;i--) if (vall[0][i]=='\'') vall[0][i]='`'; } // Assign the attribute default value predicate rule rs_assfigstrpred(fig,RS_INIVAL,vall[0],PA_NILVAL,""); for (i=1;i1) { bae_dialaddcontrol(PA_ACT,0,3,0,0.0,0.0,0.0, "",0,butx,cy,MBUTWIDTH,UPRDMOVE); butx+=MBUTXSTEP; } // Store done button bae_dialaddcontrol(PA_ACT,0,(-1),0,0.0,0.0,0.0,"",0, butx,cy,MBUTWIDTH,UPRDDONE); cy+=DIAL_BUTVSTEP; // Store list box lbidx=bae_dialadvcontrol(PA_LB|PA_OKSEL|PA_HBRDREL|PA_VBRDREL, (-1),0,(-1),0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); // Store list box entries for (i=0;i=0 && i=0 && i=valn) { bae_msgbox(2,ERRNOMOVVAL,""); break; } baseheight=DIAL_TOPMARG+DIAL_SEPVSTEP+DIAL_BUTVSTEP; do { bae_dialclr(); cy=DIAL_TOPMARG; dial_getboxsizemin(3019,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTHLS+DIAL_RIGHTSMARG, baseheight+16.0,DIAL_LEFTMARG+50.0, baseheight+1.0); // Store the OK and abort button with seperator dial_okabort(cy); cy-=DIAL_SEPVSTEP; // Store list box lbidx=bae_dialadvcontrol(PA_LB|PA_OKSEL| PA_HBRDREL|PA_HSCROLL|PA_VBRDREL,(-1),0,(-1), 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy, DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); // Store list box entries for (i=0;ito) for (i=from;i>to;i--) vall[i]=vall[i-1]; else for (i=from;i=attn) { // Get upper case attribute attrcommv=str; strupper(attrcommv); // Query the attribute lock state if (lay_rulequery(RS_OCPOOL,textp,RS_PCBSUBJ,RS_ATTADIS, "?d",lock)<1) // Clear attribute locked flag lock=0; // Build order variable name sprintf(attrcommn,PAR_ATTRORDP,attrcommv); // Query order variable if (varget(attrcommn,attrord)!=0) // No order id available attrord=9999; for (i=attn;i>0;i--) if (attl[i-1].ord>attrord || (attl[i-1].ord==attrord && attl[i-1].name>str)) attl[i]=attl[i-1]; else break; // Store the attribute to the list attl[i].name=lstr; attl[i].ord=attrord; attl[i].lock=lock; attl[i].defvall[0]=PA_NILVAL; attl[i].defvaln=0; // Build comment variable name sprintf(attrcommn,PAR_ATTRCOMMP,attrcommv); // Query comment variable if (varget(attrcommn,attrcommv)!=0 || attrcommv=="") // No comment available attl[i].disp=str; else // Attach comment to variable name sprintf(attl[i].disp,"%s %s",str,attrcommv); attn++; } // Check if default value assigned if (attl[i].defvaln==0) { // Query the attribute default value if (lay_rulequery(RS_OCPOOL,textp,RS_PCBSUBJ,RS_INIVAL, "?s",attl[i].defvall[0])<1) { // Clear default attribute value attl[i].defvall[0]=PA_NILVAL; attl[i].defvaln=0; } else { attl[i].defvaln=1; for (j=1;j<100;j++) { if (lay_rulequery(RS_OCPOOL,textp,RS_PCBSUBJ, RS_INIVAL+itoa(j),"?s",attl[i].defvall[j])<1) break; attl[i].defvaln++; } } } // Return without errors return(0); } int aptextfunc(index L_TEXT textp,double tx,double ty,double tangle, int mirrflag,int layer,double tsize,string tstr,int textinws) /* // Scan a text data block for predicate attribute pick // Return value : // zero if done or (-1) on error // Parameters : // index L_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text rotation angle // int mirrflag : Text mirror flag // int layer : Text layer code // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag */ { double flen /* Text frame length */; double vx,vy /* Text angle vector */; double ftx,fty /* Text frame top vector */; double frx,fry /* Text frame right vector */; double dist /* Pick point distance */; string lstr /* Lower case text string */; string str /* Text string */; // Check if predicate attribute string if (strextract(textp.STR,0,3)!="$?s:") return(0); // Get the predicate name str=strextract(textp.STR,4,strlen(textp.STR)); strlower(lstr=str); // Check if internal predicate name if (lstr==RS_VARNAME || lstr==RS_PARTDRCEXC || lstr==RS_GROUPNAME) return(0); // Get the text length flen=strlen(tstr); // Get the text angle vector vx=cos(tangle); vy=sin(tangle); // Get the frame coordinates frx=vx*tsize*FONTASP*flen; fry=vy*tsize*FONTASP*flen; ftx=(-vy*tsize); fty=vx*tsize; bae_clearpoints(); bae_cleardistpoly(); bae_storepoint(tx,ty,0); bae_storepoint(tx+frx,ty+fry,0); bae_storepoint(tx+frx+ftx,ty+fry+fty,0); bae_storepoint(tx+ftx,ty+fty,0); // Get the pick point distance if (bae_storedistpoly() || bae_querydist(ax,ay,dist)) return(0); // Check if new min. distance if (dist<0.5*tsize && (aminname=="" || dist1) { bae_dialaddcontrol(PA_ACT,0,4,0,0.0,0.0,0.0, "",0,butx,cy,0.0,UPRDMOVE); butx+=BUTXSTEP+bae_dialgettextlen(0,UPRDMOVE); } // Store done button bae_dialaddcontrol(PA_ACT,0,(-1),0,0.0,0.0,0.0,"",0, butx,cy,0.0,UPRDDONE); cy+=DIAL_BUTVSTEP; // Store list box lbidx=bae_dialadvcontrol(PA_LB|PA_OKSEL|PA_HBRDREL|PA_VBRDREL, (-1),0,(-1),0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); // Store list box entries for (i=0;i=0 && i=0;i--) if (cfctl[cfctn].menu[i]==' ' && cfctl[cfctn].menu[i+1]=='-' && cfctl[cfctn].menu[i+2]=='>' && cfctl[cfctn].menu[i+3]==' ') { cfctl[cfctn].menu=strextract( cfctl[cfctn].menu,i+4,strlen( cfctl[cfctn].menu)); break; } for (i=strlen(cfctl[cfctn].seq)-1;i>=0;i--) if (cfctl[cfctn].seq[i]=='\'') cfctl[cfctn].seq[i]='"'; } else { cfctl[cfctn].menu=cfctl[cfctn].seq=""; } // Edit menu item data if (menuitemedit(cfctn)==0) cfctn++; break; // Add menu item macro case 2 : macn=0; sprintf(sqlcommand,MN_SELECT,IPTYP); if (sqlcmd(BAEMACRODB,sqlcommand,macselfunc)!=0) // SQL/DB error sql_dberror(0); if (macn==0) { bae_msgbox(1,ERRNOMACRO,""); break; } bae_setintpar(16,3069); if ((cfctl[cfctn].menu=popupmenu(1,UPRMACSEL,macl,0, macl,macn,UINPOPABORT,0,1,1,macn+2,0,0,""))=="" || cfctl[cfctn].menu==UINPOPABORT) error_abort(); cfctl[cfctn].seq= UL_MACRO+":\""+cfctl[cfctn].menu+"\""; // Edit menu item data if (menuitemedit(cfctn)==0) cfctn++; break; // Delete menu item case 3 : bae_dialgetdata(lbidx,i,0.0,""); if (i>=0 && i=cfctn) { bae_msgbox(2,ERRNOMOVITEM,""); break; } baseheight=DIAL_TOPMARG+DIAL_SEPVSTEP+DIAL_BUTVSTEP; do { bae_dialclr(); dial_getboxsizemin(3020,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTHFS+DIAL_RIGHTSMARG, baseheight+16.0,DIAL_LEFTMARG+87.0, baseheight+1.0); cy=DIAL_TOPMARG; // Store the OK and abort button with seperator dial_okabort(cy); cy-=DIAL_SEPVSTEP; // Store list box lbidx=bae_dialadvcontrol(PA_LB|PA_OKSEL| PA_HBRDREL|PA_HSCROLL|PA_VBRDREL,(-1),0,(-1), 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy, DIAL_RIGHTSMARG,DIAL_SEPVSTEP,""); // Store list box entries for (i=0;ito) for (i=from;i>to;i--) cfctl[i]=cfctl[i-1]; else for (i=from;i0;i--) if (macl[i-1]>dstr) macl[i]=macl[i-1]; else break; macl[i]=dstr; macn++; // Return without errors return(0); } static int getlaytyp(int layer) /* // Get layer type bit mask for given layer // Return value : // Layer type bit mask */ { // Check for signal layers */ if ((layer>=0 && layer=POWLAYBASE && layer=DOCLAYBASE) return(DLAYBIT); // Check for board outline layer if (layer==LAYERBRD) return(OLAYBIT); // Unknown layer type return(0); } static void prtgrpcount(int changes,int selectmode) /* // Print group selection/deselection statistics // Parameters : // int changes : Change count // int selectmode : Select mode */ { index L_FIGURE fig /* Figure list index */; string msg /* Message buffer */; int grpelemn = 0 /* Group element count */; // Count group elements forall (fig where fig.GROUP) grpelemn++; if (selectmode) sprintf(msg,REPELEMSEL,changes,grpelemn); else sprintf(msg,REPELEMDSEL,changes,grpelemn); bae_prtdialog(msg); } // User Language program end