/* SCMRULE (SCM) -- Schematic Rule Definition Utility */ /* SCMRULE (SCM) -- Schematic Regelzuweisungsutility */ /* // Copyright (c) 1999-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 (091029) RELEASED FOR BAE V7.4. // rl (091012) ENHANCEMENT: // Added pin marker mode group set function. // rl (081014) RELEASED FOR BAE V7.2. // rl (080828) ENHANCEMENT: // Added text pick element control to symbol expand/combine. // rl (080306) ENHANCEMENT: // Added predicate set functions. // rl (071029) RELEASED FOR BAE V7.0. // rl (070226) ENHANCEMENT: // Added connectivity update mode. // rl (061107) ENHANCEMENT: // Added pattern button to rule name selection box. // rl (060829) RELEASED FOR BAE V6.8. // rl (060120) BUGFIX: // Fixed problem with nongrid element boundaries symbol expansion. // rl (060110) ENHANCEMENT: // Added element info to rule edit box. // rl (050906) RELEASED FOR BAE V6.6. // rl (041012) ENHANCEMENT: // Fixed problem with 90/270 degree rotated mirrored symbols. // rl (040824) RELEASED FOR BAE V6.4. // rl (040526) ENHANCEMENT: // Added symbol text mirror visibility support functions. // rl (040513) ENHANCEMENT: // Added glueing for rotation visibility texts. // rl (040112) ENHANCEMENT: // Added connectivity mode. // rl (031001) ENHANCEMENT: // Added various new spice models. // rl (030904) RELEASED FOR BAE V6.2. // rl (030707) ENHANCEMENT: // Added warning for symbols without $noplc. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (020611) ENHANCEMENT: // Introduced enhanced rule selection dialog box. // rl (020228) ENHANCEMENT: // Added text rotation visibility class attachment in // symbol rotation combine function. // rl (010625) RELEASED FOR BAE V5.0. // rl (010606) ENHANCEMENT: // Added general rule support for connections. // rl (010314) ENHANCEMENT: // Added spice model support functions. // rl (000525) RELEASED FOR BAE V4.6. // rl (000315) ENHANCEMENT: // Added symbol text rotation visibility support functions. // rl (991222) ENHANCEMENT: // Added rule group functions. // rl (990803) RELEASED FOR BAE V4.4. // rl (990507) ORIGINAL CODING. // // DESCRIPTION // // The scmrule User Language program is used to attach/detach rules // to/from schematic 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 "scm.ulh" // User Language SCM 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 UPRFCT = M("Regelfunktion waehlen!","Select rule function!"); string UPRFCT0 = M("&Einzelelemente","Single &Elements"); string UPRFCT1 = M("&Gruppe setzen","Set &Group Rules"); string UPRFCT2 = M("Elemente &selektieren","&Select Elements"); string UPRFCT3 = M("%Rotation &aufloesen","%&Disolve Rotations"); string UPRFCT4 = M("Rotation &zusammenfassen","&Combine Rotations"); string UPRFCT5 = M("%Spice &Pinabfolge","%Spice &Pin Order"); string UPRFCT6 = M("Spice &Modell","Spice &Model"); string UPRFCT7 = M("%&Connectivity","%Co&nnectivity"); string UPRFCT8 = M("%&Netz-/Bauteilbereich","%Net/Part &Area"); string UPRFCT9 = M("%Veran&kerung","%Gl&ue"); string UPRFCT10 = M("%Kontext&funktionen","%Context &Functions"); string UPRFCT11 = M("%&Regelupdate","%&Rule Update"); string UPRSELRULE = M("Regeltyp selektieren!","Select rule type!"); string UPRSELR0 = M("&Benannte Regel","&Named rule"); string UPRSELR1 = M("&Rotationssichtbarkeit","&Rotation visibility"); string UPRSELR2 = M("&Plotsichtbarkeit","&Plot visibility"); string UPRSELR3 = M("PDF-&Farbe","PDF &Color"); string UPRSELR4 = M("PDF-&Ebene","PDF La&yer"); string UPRSELR5 = M("Symbolp&inmodus","Symbol P&in Mode"); string UPRSELR6 = M("%Alle Regeln &loeschen","%&Delete all rules"); string UPRSELROT = M("Rotationssichtbarkeit selektieren!", "Select rotation visibility!"); string UPRROTA = M("&Immer sichtbar","&Always visible"); string UPRROT0 = M(" 0 Grad"," 0 Degrees"); string UPRROT90 = M(" 90 Grad"," 90 Degrees"); string UPRROT180 = M(" 180 Grad"," 180 Degrees"); string UPRROT270 = M(" 270 Grad"," 270 Degrees"); string UPRROT0_180 = M(" 0/180 Grad"," 0/180 Degrees"); string UPRROT90_270 = M("90/270 Grad","90/270 Degrees"); string UPRSELPVIS = M("Plotsichtbarkeit selektieren!", "Select plot visibility!"); string UPRPVISON = M("&Plotten","&Plot"); string UPRPVISOFF = M("&Nicht Plotten","&Disable Plotting"); string UPRSELCONMODE = M("Connectivitymodus selektieren!", "Select connectivity mode!"); string UPRCON0 = M("&Standard","&Standard"); string UPRCON1 = M("&Voller Pincheck","&Full Pin Check"); string UPRCON2 = M("%Projekt&update","%Project &Update"); string UPRSELETYP = M("Elementtyp selektieren!","Select element type!"); string UPRSELE0 = M("Sym&bole/Labels/Pins","Symbols/Labels/&Pins"); string UPRSELE1 = M("&Verbindungen","&Connections"); string UPRSELE2 = M("&Grafik","&Graphic"); string UPRSELE3 = M("&Texte","&Texts"); string UPRSELE4 = M("%Pla&n","%&Sheet/Macro"); string UPRSELE5 = M("A&lle Plaene","&All Sheets"); string UPRSELMODEL = M("Modelltyp selektieren!","Select model type!"); string UPRSELMOD0 = M("&R (Widerstand)","&R (Resistor)"); string UPRSELMOD1 = M("&C (Kondensator)","&C (Capacitor)"); string UPRSELMOD2 = M("&L (Spule)","&L (Inductor)"); string UPRSELMOD3 = "&S (Voltage controlled Switch)"; string UPRSELMOD4 = "&W (Current controlled Switch)"; string UPRSELMOD5 = "&V (Voltage Source)"; string UPRSELMOD6 = "&I (Current Source)"; string UPRSELMOD7 = "&G (Voltage controlled Current Source)"; string UPRSELMOD8 = "&E (Voltage controlled Voltage Source)"; string UPRSELMOD9 = "&H (Current controlled Current Source)"; string UPRSELMOD10 = "&B (Current controlled Voltage Source)"; string UPRSELMOD11 = "&T (Lossless Transmission Line)"; string UPRSELMOD12 = "&O (Lossy Transmission Line)"; string UPRSELMOD13 = "&U (Uniform distributed RC Lines)"; string UPRSELMOD14 = "&D (Junction Diode)"; string UPRSELMOD15 = "&Q (Bipolar Transistor)"; string UPRSELMOD16 = "&J (JFET)"; string UPRSELMOD17 = "&M (MOSFET)"; string UPRSELMOD18 = "&Z (MESFET)"; string UPRSELMOD19 = "&X (Subcircuit)"; string UPRSELNREF = M("Symbol/Label/Pin selektieren!", "Select symbol/label/pin!"); string UPRSELCON = M("Verbindungen selektieren!","Select connections!"); string UPRSELPOLY = M("Flaeche selektieren!","Select polygon!"); string UPRSELTEXT = M("Text selektieren!","Select text!"); string UPRSELNAREA = M("Netz-/Bauteilbereichsflaeche selektieren!", "Select net/part area polygon!"); string UPRSELRULE0 = M("Regel setzen/loeschen (","Rule set/reset ("); #define UPRSELRULE1 ") ? " string UPRDRULEH = M("Regeln fuer %s setzen/loeschen", "%s rules set/reset"); string UPRDRSTEXT = M("Standardtext '%s'","Standard text '%s'"); string UPRDRCTEXT = M("Kommentartext '%s'","Commentary text '%s'"); string UPRDRCON = M("Verbindung","Connection"); string UPRDRBUS = M("Busverbindung","Bus connection"); string UPRDRPTYPGL = M("Grafiklinie","Graphic Line"); string UPRDRPTYPDL = M("Punktlinie","Dot Line"); string UPRDRPTYPGA = M("Grafikflaeche","Graphic Area"); string UPRDRPTYPCA = M("Kontaktbereich","Contact Area"); string UPRDRLAB = M("Label '%s'/'%s'","Label '%s'/'%s'"); string UPRDRSYM = M("Symbol '%s'/'%s'","Symbol '%s'/'%s'"); string UPRDRPIN = M("Pin '%s'/'%s'","Pin '%s'/'%s'"); 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) ? ","Rule Name (Pattern) ? "); string UPRSELPIN = M("Spice-Modell Pin Nummer %d selektieren!", "Select Spice Model Pin Number %d!"); string UPRSELGL = M("Regeln Gruppenfunktion selektieren!", "Select rule group function!"); string UPRSELGL0 = M("Symbol(e) &verankern","&Glue Symbol(s)"); string UPRSELGL1 = M("Symbol(e) &freigeben","&Unglue Symbol(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 UPRCONWRN1 = M("WARNUNG: Der volle Pincheck birgt die Gefahr unbeabsichtigt ", "WARNUNG: Full pin check connectivity may cause "); string UPRCONWRN2 = M("Verbindungen zu Pins herzustellen!\nModus dennoch wechseln?", "unintentional pin connections! Perform mode change?"); string UPRCONUPD1 = M("Bei Aenderung des Connectivitymodus muessen alle ", "Changing the connectivity mode requires new processing"); string UPRCONUPD2 = M("Projektblaetter bearbeitet werden.\nAenderung durchfuehren?", "of all project sheets.\nPerform change?"); string UPRNETAREA = M("Bereichsnamen ? ","Area Name ? "); string UPRPDFCOLOR = M("PDF-Farbe ? ","PDF Color ? "); string UPRPDFLAY = M("PDF-Ebene ? ","PDF Layer ? "); string UPRBRWCOLOR = M("BAE-Auswahl","BAE-Selection"); string UPRDPINMODE = M("Symbolpinmodus","Symbol Pin Mode"); string UPRPINMOVE = M("Freigabe Pinbewegung","Permit Pin Movement"); string UPRPINMODE = M("Markermodus :","Marker Mode :"); string UPRPINNMIRR = M("Nicht spiegeln","No Mirroring"); string UPRPINNROT = M("Nicht drehen","No Rotation"); string UPRTXTLEFT = M("Zum Zusammenfassen hier links klicken", "Left click here to combine"); string UPRTXTRIGHT = M("Zum Zusammenfassen hier rechts klicken", "Right click here to combine"); 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 UPRNEXTDIAL = M("&Weitere","&Next"); string UPRPREVDIAL = M("&Vorherige","&Previous"); 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 REPNPWARN = M("Warnung - Symbolmakros ohne $noplc-Attribut betroffen :", "Warning - Symbol Macros without $noplc-Attribute processed :"); string REPNETSCAN = M("Scannen Bereichsnamen...", "Scanning area names..."); 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 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 REPRULESET = M("Regel '%s' %d Elementen zugewiesen.", "Assigned rule '%s' to %d elements."); string ERRINVCOLOR = M("Ungueltige Farbauswahl!", "Invalid color selection!"); string ERRNORULE = M("Regel '%s' nicht definiert!", "Rule '%s' not defined!"); string ERRNOEXP = M("Element ist nicht expandiert!", "Element isn't expanded!"); string ERRALREXP = M("Element ist bereits expandiert!", "Element is already expanded!"); string ERRTEXT = M("Fehler beim Erzeugen des Textes '%s'!", "Error creating text '%s'!"); 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 ERRNOWIN = M("Nur in Windowsumgebungen verfuegbar!", "Windows Environment needed!"); // INI file parameter name definitions #define PAR_NOPLCVAL "NOPLCVAL_SCM" // $noplc value for unplaced parts #define PAR_NOPLCPVIS "NOPLCPVIS_SCM" // $noplc/plot visibilty relationship #define PAR_ROTVISTCL "ROTVISTCL_SCM" // Rot. visibility text class #define PAR_LISTDCNT "MACRODCNT_STD" // Max. dialog list items count // Rule definitions #define ROTVISPREF "scm_rot_vis_" // Rotation visibility prefix // Variable name definitions #define VAR_EWIDTH "scm_rv_w" // Element width #define VAR_EHEIGHT "scm_rv_h" // Element height #define VAR_EMDIM "scm_rv_md" // Element maximum dimension #define VAR_EXOFF "scm_rv_xo" // Element x offset #define VAR_EYOFF "scm_rv_yo" // Element y offset #define VAR_ELX "scm_rv_lx" // Element x lower boundary #define VAR_ELY "scm_rv_ly" // Element y lower boundary #define VAR_EUX "scm_rv_ux" // Element x upper boundary #define VAR_EUY "scm_rv_uy" // Element y upper boundary #define VAR_ETYP "scm_rv_et" // Pick element types #define GV_PINMODE "scm_pinmmode" // Pin marker mode // SQL command definitions #define MN_SELECT "select macname from macrotab where ptyp=%d AND midx=0;" #define ELEMSPC 0.005 // Element spacing #define HELPSIZE 0.002 // Help text size // 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 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 UL_MACRO "macro" // ULP: Macro Management string NOPLCVAL = bae_inistrval(PAR_NOPLCVAL,"NP") /* $noplc value for unplaced parts */; int NOPLCPVIS = bae_iniintval(PAR_NOPLCPVIS,3) /* $noplc/plot vis. relationship */; int ROTVISTCLASS = bae_iniintval(PAR_ROTVISTCL,0x40000000) /* Rot. visibility text class */; 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 */; string rulel[] /* Rule list */; string emptyrulel[] /* Empty rule list */; int rulen /* Rule count */; string npsyml[] /* Symbol macros without $noplc */; int npsymn = 0 /* $noplc symbol macro count */; struct cfctdes { // Context function descriptor string menu /* Menu text */; string seq /* Function call sequence */; } cfctl[] /* Context function list */; int cfctn /* Context function count */; double elemw, elemh /* Element size */; double elemxo, elemyo /* Element offset */; double elemmdim /* Element max. dimension */; double wslx, wsly /* Workspace lower boundaries */; double wsux, wsuy /* Workspace upper boundaries */; #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 SCMBIT 0x01 // Schematic plan class mask bit #define SYMBIT 0x02 // Schematic symbol class mask bit #define MRKBIT 0x04 // Schematic marker class mask bit #define LABBIT 0x08 // Schematic label class mask bit #define POLYBIT (1<=PLANTYP) { // Get the rule count rulen=rsc_getplanrules(rulel,objclass==RS_OCSCMDB ? 1 : 0); // Edit the rules subtyp=0; editrules("",""); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Attach/detach the rule list if (rulen) { if (cap_ruleplanatt(rulel,seltyp==PLANTYP ? 0 : 1)) rsc_error(-1); } else if (cap_getrulecnt(objclass,0)>0) { if (cap_ruleplandet(seltyp==PLANTYP ? 0 : 1)) rsc_error(-1); } // Redraw the screen bae_callmenu(MNU_BAEREDISPL); } else if (seltyp==C_FIGCON) { // Loop while element picked bae_prtdialog(selmsg); while (scm_pickconseg(ruleconseg)==0) { // Get the rule count rulen=rsc_getconrules(ruleconseg,rulel); // Edit the rules subtyp=ruleconseg.BUSFLAG; editrules("",""); // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } // Attach/detach the rule list if (rulen) { if (cap_ruleconatt(ruleconseg,rulel)) rsc_error(-1); } else if (cap_getrulecnt(RS_OCCON,ruleconseg)>0) { if (cap_rulecondet(ruleconseg)) rsc_error(-1); } // Redraw the screen bae_callmenu(MNU_BAEREDISPL); // Prompt for next element bae_prtdialog(selmsg); } } else { // Loop while element picked bae_prtdialog(selmsg); while (scm_pickelem(rulefig,seltyp)==0) { // Get the rule count name1=name2=""; rulen=rsc_getfigrules(rulefig,rulel); switch (seltyp) { case C_FIGTEXT : subtyp= ((rulefig.TEXT.MODE&1)!=0 ? CTXTBIT : STXTBIT)| (rulefig.TEXT.STR[0]=='$' ? ATXTBIT : 0); name1=rulefig.NAME; // Query the multiline text status if (rulefig.RULEOBJID<0 || cap_rulequery( RS_OCFIG,rulefig,RS_SCMSUBJ,RS_MTEXTID, "?s",mtextid)<=0) mtextid=""; break; case C_FIGPOLY : switch (rulefig.POLY.TYP) { case C_POLYDOCLINE : subtyp=LINEBIT; break; case C_POLYDOCAREA : subtyp=AREABIT; break; case C_POLYCONAREA : subtyp=CAREABIT; break; case C_POLYDOTLINE : subtyp=DLINEBIT; break; default : subtyp=0; } break; case C_FIGNREF : switch (rulefig.NREF.MACRO.CLASS) { case DDBCLSCM : subtyp=SCMBIT; break; case DDBCLSSYM : subtyp=SYMBIT; break; case DDBCLSLAB : subtyp=LABBIT; break; case DDBCLSMRK : subtyp=MRKBIT; break; default : subtyp=0; } name1=rulefig.NAME, name2=rulefig.NREF.MACRO.NAME; break; default : subtyp=0; } // Edit the rules editrules(name1,name2); // Save current state for undo if (cflag==0) { bae_callmenu(MNU_BAESAVESTATE); cflag=1; } // Attach/detach the rule list if (rulen) { if (cap_rulefigatt(rulefig,rulel)) rsc_error(-1); } else if (cap_getrulecnt(RS_OCFIG,rulefig)>0) { if (cap_rulefigdet(rulefig)) rsc_error(-1); } // Check if multiline text rule transfer if (mtextid!="") { // Get the base rules mrulen=4; sprintf(mrulel[0],":%s:%s='%s';", RS_SCMSUBJ,RS_MTEXTID,mtextid); for (i=0;i=0 && cap_rulequery(RS_OCFIG,rulefig,RS_SCMSUBJ, RS_MTEXTID,"?s",textid)>0 && textid==mtextid) { // Get multiline text data if (cap_rulequery(RS_OCFIG,rulefig, RS_SCMSUBJ,RS_MTEXTCOL,"?d",col)<1 || cap_rulequery(RS_OCFIG,rulefig, RS_SCMSUBJ,RS_MTEXTROW,"?d",row)<1 || cap_rulequery(RS_OCFIG,rulefig, RS_SCMSUBJ,RS_MTEXTLS,"?f",linespc)<1) continue; sprintf(mrulel[1],":%s:%s=%d;", RS_SCMSUBJ,RS_MTEXTCOL,col); sprintf(mrulel[2],":%s:%s=%d;", RS_SCMSUBJ,RS_MTEXTROW,row); sprintf(mrulel[3],":%s:%s=%.2f;", RS_SCMSUBJ,RS_MTEXTLS,linespc); if (cap_rulefigatt(rulefig,mrulel)) rsc_error(-1); } } // Redraw the screen bae_callmenu(MNU_BAEREDISPL); // Prompt for next element bae_prtdialog(selmsg); } } } static void grpsetrules() // Set group element rules { index C_FIGURE fig /* Figure list index */; index C_CONSEG conseg /* Connection segment index */; string msg /* Message string */; string ecomm /* Element comment */; string rulename = "" /* Rule name */; string rn = "" /* Rule scan name */; string symname /* Current symbol name */; string lastname = "" /* Last name */; string macname /* Symbol macro name */; STRINGS headl /* Menu header string list */; int headn /* Menu header string count */; int plotdis /* Plot disable flag */; string rotvis /* Rotation visibility */; string ecolor /* Element color string */; string scolor = "" /* Selection color string */; int oldcol /* Old color index */; int newcol /* New color index */; int oldpinmove /* Old pin move mode */; int newpinmove1 /* New pin move 1st bit */; int newpinmove2 /* New pin move 2nd bit */; int newpinmove3 /* New pin move 3rd bit */; int newpinmove /* New pin move mode */; double pcol = 12.0 /* Parameter column */; double cy = DIAL_TOPMARG /* Current y value */; double dialwidth /* Dialog box width */; double dialheight /* Dialog box height */; double baseheight /* Dialog box base height */; int repflag = 1 /* Repeat flag */; int mo1idx /* Pin move 1st parameter index */; int mo2idx /* Pin move 2nd parameter index */; int mo3idx /* Pin move 3rd parameter index */; int edtidx /* Color edit field item index */; int cflag = 0 /* Change flag */; int cnt = 0 /* Change count */; char c /* Rule name character */; int i,j /* Loop control variables */; string colstrings[] = { // Color index to red col. transform. "0 0 0", "0 0 0.6", "0 0.6 0", "0 0.6 0.6", "0.6 0 0", "0.6 0 0.6", "0.6 0.6 0", "0.8 0.8 0.8", "0.4 0.4 0.4", "0 0 1", "0 1 0", "0 1 1 ", "1 0 0", "1 0 1", "1 1 0", "1 1 1" }; // Select the element type bae_promptdialog(UPRSELRULE); switch (bae_askmenu(8,UPRSELR0,UPRSELR1,UPRSELR2,UPRSELR3,UPRSELR4, (ddbclass==DDBCLSSYM ? "" : ",")+UPRSELR5,UPRSELR6,UPRABORT)) { // Named rule case 0 : bae_nameclr(); while (scanddbenames(rscdatabase,DDBCLRULE,rn)==1) if (!strmatch(rn,"lay_*") && !strmatch(rn,"cam*") && !strmatch(rn,"var_doc*") && !strmatch(rn,"scm_variant*")) // Add the rule name bae_nameadd(ddbcelemname(rscdatabase,rn, DDBCLRULE,1),"","","",2); // Get the rule name bae_setintpar(16,3138); 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 && fig.TYP!=C_FIGCON) { // Get the rule count rulen=rsc_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;i--) if (rulel[i]==rulename) { // Delete the old rule for (j=i;j=0;i--) if (strlen(rulel[i])>strlen(ROTVISPREF) && strextract(rulel[i],0,strlen(ROTVISPREF)-1) ==ROTVISPREF) { // Delete the old rule for (j=i;j0) { if (cap_rulefigdet(fig)) rsc_error(-1); } } break; // Variant dependant plot visibility case 2 : // Select the plot visibility mode bae_promptdialog(UPRSELPVIS); if ((plotdis=bae_askmenu(3,UPRPVISON,UPRPVISOFF,UPRABORT))<0 || plotdis>1) error_abort(); // Query the current active variant if (ddbclass!=DDBCLSCM || cap_rulequery( RS_OCSCMDB,0,RS_SCMSUBJ,RS_VARIANT,"?d",act_var)<1) // Set default variant act_var=0; sprintf(rulename,":%s:%s%d=1;", RS_SCMSUBJ,RS_VARPLOTDIS,act_var); if (act_var==0) { // Select all variant table entries varn=0; act_flag=0; sqlcmd(bae_planfname(),V_SELECTA,datafunc); // Check if active variant defined if (!act_flag) { for (i=varn;i>0;i--) if (varl[i-1]0;i--) varl[i]=varl[i-1]; // Insert variant data varl[0]=0; varn++; } } // Loop for all group elements forall (fig where fig.GROUP && fig.TYP!=C_FIGCON) { symname=fig.NAME; // Get the rule count rulen=rsc_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;j0) { if (cap_rulefigdet(fig)) rsc_error(-1); } // Check if symbol attribute set if ((NOPLCPVIS&1)==1 && fig.TYP==C_FIGNREF && fig.NREF.MACRO.CLASS==DDBCLSSYM) // Try to set $noplc attribute if (lastname!=symname) { if (scm_setpartattrib(symname, "$noplc",plotdis ? NOPLCVAL : "", 3)==(-4)) { // Search macro name macname=fig.NREF.MACRO.NAME; for (i=0;i=npsymn) { npsyml[npsymn]= macname; npsymn++; } } lastname=fig.NAME; } if (act_var==0 && (NOPLCPVIS&2)==2) for (i=1;i=0;i--) if (rulel[i]==rulename) { // Delete the old rule for (j=i;j0) { if (cap_rulecondet(conseg)) rsc_error(-1); } } // Check if symbols without $noplc encountered if (npsymn) { // Print the report header headl[0]=REPNPWARN; headn=2; // Activate the popup menu bae_setintpar(16,3076); popupmenu(0,"",headl,headn,npsyml,npsymn, "",0,1,-1,headn+npsymn+2,0,0,""); } break; // Set PDF color case 3 : bae_nameclr(); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ,RS_PLOTRGB, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); forall (conseg where conseg.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ,RS_PLOTRGB, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); if (bae_dialclr()) { // Select color bae_setintpar(16,3110); if (bae_askname(scolor,UPRPDFCOLOR,MAXKEYLEN)) // Aborted error_abort(); } else { baseheight=DIAL_TOPMARG+DIAL_BUTVSTEP+ DIAL_CTRVSTEP+DIAL_SEPVSTEP; do { bae_dialclr(); dial_getboxsizemin(3110,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_RIGHTEMARG,""); 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_RIGHTSMARG,DIAL_SEPVSTEP,""); cy+=dialheight-baseheight+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++; } bae_setintpar(16,3110); 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 tag links for color query oldcol=bae_getcolor(13); bae_setcolor(13,0); bae_clriactqueue(); bae_storemenuiact(1,11,LMB); bae_storemouseiact(0,0.0,0.0,0,LMB); bae_storemenuiact(1,13,LMB); bae_callmenu(107); if ((newcol=bae_getcolor(13))>=0 && newcol<=15) scolor=colstrings[newcol]; else error(ERRINVCOLOR); // Restore tag link color bae_setcolor(13,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 && fig.TYP!=C_FIGCON) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element color predicate rule rsc_assfigstrpred(fig,RS_PLOTRGB,scolor,"",""); cnt++; } // Loop for all group elements forall (conseg where conseg.GROUP) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element color predicate rule rsc_assconstrpred(conseg,RS_PLOTRGB,scolor,"",""); cnt++; } sprintf(msg,REPCOLORSET,scolor,cnt); bae_prtdialog(msg); break; // Set PDF layer case 4 : bae_nameclr(); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0) // Query PDF layer predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, RS_PDFLAY,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); forall (conseg where conseg.RULEOBJID>=0) // Query PDF layer predicate if (cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ,RS_PDFLAY, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select layer bae_setintpar(16,3139); if (bae_askname(scolor,UPRPDFLAY,MAXKEYLEN)) // Aborted error_abort(); cnt=0; forall (fig where fig.GROUP && fig.TYP!=C_FIGCON) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element PDF layer predicate rule rsc_assfigstrpred(fig,RS_PDFLAY,scolor,"",""); cnt++; } // Loop for all group elements forall (conseg where conseg.GROUP) { // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); // Assign the element color predicate rule rsc_assconstrpred(conseg,RS_PDFLAY,scolor,"",""); cnt++; } sprintf(msg,REPPDFLAYSET,scolor,cnt); bae_prtdialog(msg); break; // Set pin marker mode case 5 : // Check the plan class if (ddbclass!=DDBCLSSYM) error_class(); // Check if dialog box support if (bae_dialclr()) error(ERRNOWIN); if (varget(GV_PINMODE,oldpinmove)) oldpinmove=0; mo1idx=bae_dialaddcontrol(PA_TOGGLE,0,0, (oldpinmove&0x01)!=0 ? 1 : 0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+pcol,cy,0.0,UPRPINMOVE); cy+=DIAL_CTRVSTEP; dial_label(0.0,cy,UPRPINMODE); mo2idx=bae_dialaddcontrol(PA_TOGGLE,0,0, (oldpinmove&0x02)!=0 ? 1 : 0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+pcol,cy,0.0,UPRPINNMIRR); mo3idx=bae_dialaddcontrol(PA_TOGGLE,0,0, (oldpinmove&0x04)!=0 ? 1 : 0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+25.0,cy,0.0,UPRPINNROT); cy+=DIAL_CTRVSTEP; // Store the OK and abort button with seperator dial_hsep(cy); // Store OK button dial_okabort(cy); // Call the dialog function bae_setintpar(16,3114); if (bae_dialaskparams(UPRDPINMODE,0, DIAL_LEFTMARG+pcol+25.0+DIAL_RIGHTSMARG,cy)) error_abort(); bae_dialgetdata(mo1idx,newpinmove1,0.0,""); bae_dialgetdata(mo2idx,newpinmove2,0.0,""); bae_dialgetdata(mo3idx,newpinmove3,0.0,""); newpinmove= (newpinmove1 ? 1 : 0)|(newpinmove2 ? 2 : 0)| (newpinmove3 ? 4 : 0); varset(GV_PINMODE,newpinmove); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Loop for all group elements forall (fig where fig.GROUP && fig.TYP==C_FIGNREF) // Assign the pin movement status rsc_assfigintpred( fig,RS_PINMOVE,newpinmove,0,"scm_pin_move"); break; // Delete all rules case 6 : // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Loop for all group elements forall (fig where fig.GROUP) // Get the rule count if ((rulen=rsc_getfigrules(fig,rulel))>0) if (cap_rulefigdet(fig)) rsc_error(-1); forall (conseg where conseg.GROUP) // Get the rule count if ((rulen=rsc_getconrules(conseg,rulel))>0) if (cap_rulecondet(conseg)) rsc_error(-1); break; default : error_abort(); } } string getvarvalue(string symname,string attrname,int varnum) /* // Get variant attribute value // Return value : // Attribute value // Parameters : // string symname : Symbol name // string attrname : Attribute name // int varnum : Variant number */ { index C_FIGURE fig /* Figure list element */; index C_NREF nref /* Named reference */; index C_ATTRIBUTE attr /* Attribute index */; string vattrname /* Variant attribute name */; if (cap_nrefsearch(symname,fig)) return(PA_NILVAL); vattrname=varattrname(attrname,varnum); nref=fig.NREF; // Scan attribute values forall (attr of nref where attr.NAME==vattrname) return(attr.VALUE); return(PA_NILVAL); } void setpvis(string symname,int plotdis,int varnum) /* // Set symbol plot visibility // Parameters : // string symname : Symbol name // string attrval : $noplc attribute value // int plotdis : Plot disable flag // int varnum : Variant number */ { index C_FIGURE fig /* Figure list element */; string rulel[] /* Rule list */; int rulen /* Rule count */; string rulename /* Rule name */; int i, j /* Loop control variables */; if (cap_nrefsearch(symname,fig)) return; // Build the plot disable rule name sprintf(rulename,":%s:%s%d=1;",RS_SCMSUBJ,RS_VARPLOTDIS,varnum); // Get the rule count rulen=rsc_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;j0) { if (cap_rulefigdet(fig)) rsc_error(-1); } } int datafunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Data query callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { int i /* Loop control variable */; // Search the insert position for (i=varn;i>0;i--) if (varl[i-1] strlen(ROTVISPREF) && strextract(rulel[i],0, strlen(ROTVISPREF)-1) ==ROTVISPREF) break; // Check if no visibility rule found if (i>=rulen) { scm_elemgrpchg(fig,1); cnt++; } } else { // Search for given rule for (i=0;i1) error_abort(); // Query the current active variant if (ddbclass!=DDBCLSCM || cap_rulequery( RS_OCSCMDB,0,RS_SCMSUBJ,RS_VARIANT,"?d",varnumber)<1) // Set default variant varnumber=0; sprintf(rulename,":%s:%s%d=1;", RS_SCMSUBJ,RS_VARPLOTDIS,varnumber); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && !fig.GROUP) { // Get the rule count rulen=rsc_getfigrules(fig,rulel); // Search for given rule for (i=0;i=i) { scm_elemgrpchg(fig,1); cnt++; } } forall (conseg) { // Get the rule count rulen=rsc_getconrules(conseg,rulel); // Search for given rule for (i=0;i=i) { scm_conseggrpchg(conseg,1); cnt++; } } break; // PDF color case 3 : bae_nameclr(); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ,RS_PLOTRGB, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); forall (conseg where conseg.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ,RS_PLOTRGB, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select color bae_setintpar(16,3110); 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 || cap_rulequery( RS_OCFIG,fig,RS_SCMSUBJ,RS_PLOTRGB,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { scm_elemgrpchg(fig,1); cnt++; } } forall (conseg where !conseg.GROUP) { // Query plot color predicate if (conseg.RULEOBJID<0 || cap_rulequery( RS_OCCON,conseg,RS_SCMSUBJ,RS_PLOTRGB,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { scm_conseggrpchg(conseg,1); cnt++; } } break; // Select PDF layer case 4 : bae_nameclr(); // Loop for all elements forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, RS_PDFLAY,"?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); forall (conseg where conseg.RULEOBJID>=0) // Query plot color predicate if (cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ,RS_PDFLAY, "?s",ecolor)>0 && ecolor!="") bae_nameadd(ecolor,"","","",2); // Select layer bae_setintpar(16,3139); if (bae_askname(scolor,UPRPDFLAY,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 || cap_rulequery( RS_OCFIG,fig,RS_SCMSUBJ,RS_PDFLAY,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { scm_elemgrpchg(fig,1); cnt++; } } forall (conseg where !conseg.GROUP) { // Query plot color predicate if (conseg.RULEOBJID<0 || cap_rulequery( RS_OCCON,conseg,RS_SCMSUBJ,RS_PDFLAY,"?s",ecolor)<1) ecolor=""; if (ecolor==scolor) { scm_conseggrpchg(conseg,1); cnt++; } } // Report changes prtgrpcount(cnt,1); break; default : error_abort(); } // Report changes prtgrpcount(cnt,1); } static void editrules(string name1,string name2) /* // Add/delete rule to/from the current rule list // Parameters : // string name1 : Element major name // string name2 : Element secondary name */ { string msg /* Message string */; string ecomm /* Element comment */; string predname /* Predicate name */; string pattern = "" /* Pattern string */; char c /* Pattern character */; string nrn /* New rule name buffer */; string rn /* Rule name buffer */; string fn /* File name buffer */; double pcol /* Parameter column */; double butx /* Current button position */; double cy /* Dialog box current y coordinate */; double dialwidth /* Dialog box width */; double dialheight /* Dialog box height */; double baseheight /* Dialog box base height */; string strval /* String value */; double dblval /* Double value */; int intval /* Integer value */; int i /* Loop control variable */; switch (seltyp) { case C_FIGCON : ruleprompt= subtyp ? UPRDRBUS : UPRDRCON ; break; case C_FIGTEXT : sprintf(ruleprompt,subtyp ? UPRDRCTEXT : UPRDRSTEXT,name1); break; case C_FIGPOLY : switch (subtyp) { case LINEBIT : ruleprompt=UPRDRPTYPGL; break; case DLINEBIT : ruleprompt=UPRDRPTYPDL; break; case CAREABIT : ruleprompt=UPRDRPTYPCA; break; case AREABIT : default : ruleprompt=UPRDRPTYPGA; } break; case C_FIGNREF : switch (subtyp) { case MRKBIT : sprintf(ruleprompt,UPRDRPIN,name1,name2); break; case LABBIT : sprintf(ruleprompt,UPRDRLAB,name1,name2); break; case SYMBIT : default : sprintf(ruleprompt,UPRDRSYM,name1,name2); } break; case PLANTYP : ruleprompt=bae_plainmenutext(UPRSELE4); break; case PROJTYP : ruleprompt=bae_plainmenutext(UPRSELE5); break; default : ruleprompt=""; } // Do the rule input loop bae_prtdialog(""); while (1) { // Check if dialog box support if (bae_dialclr()) { // Build the query message string msg=UPRSELRULE0; 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_SCMSUBJ,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_SCMSUBJ, predname,dblval); else sprintf(nrn,":%s:%s=%.9g;",RS_SCMSUBJ, 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_SCMSUBJ,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 (!rsc_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_SCMSUBJ,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(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,3103); 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_SCMSUBJ,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,3147); 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_SCMSUBJ,name); pdeflen=strlen(pdefprefix); // Scan the rule name list for (i=0;ielemh ? elemw : elemh; // Get old grid and angle lock flags gridlock=bae_getgridlock(); anglock=bae_getanglelock(); // Free grid and angle bae_setgridlock(0); bae_setanglelock(0); // Set new element boundaries bae_clriactqueue(); bae_storemouseiact(1,elemxo+4*elemmdim+3*ELEMSPC+ELEMSPC, elemyo+2.0*elemmdim+ELEMSPC+ELEMSPC,0,LMB); bae_callmenu(MNU_SCMPARUBND); bae_clriactqueue(); bae_storemouseiact(1,elemxo-ELEMSPC,elemyo-ELEMSPC,0,LMB); bae_callmenu(MNU_SCMPARLBND); // Reset the group bae_callmenu(MNU_SCMGRPRESE); sprintf(predname,RS_FCTSEQ,0); bae_getintpar(3,msmmode); scm_storetext((msmmode&2) ? UPRTXTRIGHT : UPRTXTLEFT, elemxo+2.0*(elemmdim+ELEMSPC)-0.5*ELEMSPC, elemyo+2.0*elemmdim+2.0*ELEMSPC,0.0,HELPSIZE,0,TEXTHCENT|TEXTFRM1); if (cap_lastfigelem(nfig)==0) rsc_assfigstrpred(nfig,predname,"scmrule:sl4","",""); // Zoom overview bae_callmenu(MNU_BAEZOOMALL); // Select all non-text elements to group forall (fig where fig.TYP!=C_FIGTEXT) scm_elemgrpchg(fig,1); // Copy all directions for (curmirr=0;curmirr<=1;curmirr++) for (curdir= curmirr ? 0 : 1;curdir<4;curdir++) { if (curmirr) { switch (curdir) { case 0 : x=elemxo; y=elemyo+2.0*elemmdim+ELEMSPC; break; case 1 : x=elemxo+elemmdim+ELEMSPC; y=elemyo+elemmdim+ELEMSPC; break; case 2 : x=elemxo+3.0*elemmdim+2.0*ELEMSPC; y=elemyo+elemmdim+ELEMSPC; break; case 3 : x=elemxo+4.0*elemmdim+3.0*ELEMSPC; y=elemyo+2.0*elemmdim+ELEMSPC; break; } } else { switch (curdir) { case 1 : x=elemxo+2*elemmdim+ELEMSPC; y=elemyo; break; case 2 : x=elemxo+3*elemmdim+2*ELEMSPC; y=elemyo+elemmdim; break; case 3 : x=elemxo+3*elemmdim+3*ELEMSPC; y=elemyo+elemmdim; break; } } bae_clriactqueue(); bae_storemouseiact(1,elemxo,elemyo,0,LMB); rotcnt=curdir; for (i=0;i0) // Scan the rule name list for (i=0;i=2.0*PI) ang-=2.0*PI; // Store the text if (scm_storetext(fig.NAME,x,y,ang,fig.SIZE, curmirr==0x10 ? 1-fig.MIRROR : fig.MIRROR, fig.TEXT.MODE)) { // Restore old grid and angle lock flags bae_setgridlock(gridlock); bae_setanglelock(anglock); errormsg(ERRTEXT,fig.NAME); } // Transfer rules if (curdir==0 && curmirr==0x20 && cap_lastfigelem(nfig)==0 && rulen>0) { if (textclass!=0) sprintf(rulel[rulen],":%s:%s=%d;", RS_SCMSUBJ,RS_TXTCLASS,textclass); if (cap_rulefigatt(nfig,rulel)) rsc_error(-1); } } // Delete the old text dfig=fig; scm_delelem(dfig); } // Restore old grid and angle lock flags bae_setgridlock(gridlock); bae_setanglelock(anglock); // Set the expansion data varset(VAR_EMDIM,elemmdim); varset(VAR_EWIDTH,elemw); varset(VAR_EHEIGHT,elemh); varset(VAR_EXOFF,elemxo); varset(VAR_EYOFF,elemyo); // Zoom overview bae_callmenu(MNU_BAEZOOMALL); } static void symrotcombine() // Combine rotated symbols to single symbol with text rotation visibility ass. { index C_FIGURE fig /* Figure list index */; index C_FIGURE dfig /* Delete figure list element */; index C_FIGURE nfig /* New figure list index */; string rn /* Rule name buffer */; int rnc /* Rule name count */; string cpdefprefix /* Class pred. definition prefix */; int cpdeflen /* Class pred. def. length */; int rvpdeflen /* Rot. vis. pred. def. length */; int textclass /* Text class */; double x, y /* Current position */; double tx, ty /* Text offset vector */; double ang /* Current angle */; int curdir /* Current direction */; int curmirr /* Current mirroring */; int rotvis /* Rotation visibility mask */; int gridlock /* Grid lock mode */; int anglock /* Angle lock mode */; int oldfigdis /* Old figure list disable bits */; int i /* Loop control variable */; // Check the plan class if (ddbclass!=DDBCLSSYM) error_class(); // Get the element data if (varget(VAR_EWIDTH,elemw) || varget(VAR_EHEIGHT,elemh) || varget(VAR_EXOFF,elemxo) || varget(VAR_EYOFF,elemyo) || varget(VAR_ELX,wslx) || varget(VAR_ELY,wsly) || varget(VAR_EUX,wsux) || varget(VAR_EUY,wsuy) || varget(VAR_EMDIM,elemmdim) || varget(VAR_ETYP,oldfigdis)) error(ERRNOEXP); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Delete help text forall (fig where fig.TYP==C_FIGTEXT && (fig.NAME==UPRTXTLEFT || fig.NAME==UPRTXTRIGHT)) { dfig=fig; scm_delelem(dfig); break; } // Select all text elements forall (fig where fig.TYP==C_FIGTEXT) scm_elemgrpchg(fig,1); // Get predicate rule definition prefix sprintf(cpdefprefix,":%s:%s=",RS_SCMSUBJ,RS_TXTCLASS); cpdeflen=strlen(cpdefprefix); rvpdeflen=strlen(ROTVISPREF); // Scan the texts forall (fig where fig.GROUP && fig.TYP==C_FIGTEXT) { // Query the text class mask if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, RS_TXTCLASS,"?d",textclass)<1) // Set default mask textclass=0; // Get the rule count rulen=0; rulel=emptyrulel; if ((rnc=cap_getrulecnt(RS_OCFIG,fig))>0) // Scan the rule name list for (i=0;i(elemyo+elemmdim+0.5*ELEMSPC) ? 1 : 0 ; // Get the text base position and angle if (curmirr) { // Get the new text position tx=fig.X-elemxo; ty=fig.Y-elemyo; switch (curdir) { case 0 : x=elemxo+tx; y=elemyo+2.0*elemmdim+ELEMSPC-ty; ang=fig.ANGLE; rotvis=0x11; break; case 1 : x=elemxo-elemmdim-ELEMSPC+ty; y=elemyo+(tx-elemmdim-ELEMSPC); ang=fig.ANGLE+(fig.MIRROR ? PI2 : -PI2); rotvis=0x12; break; case 2 : x=elemxo-(tx-3.0*elemmdim-2.0*ELEMSPC); y=elemyo-elemmdim-ELEMSPC+ty; ang=fig.ANGLE-PI; rotvis=0x14; break; case 3 : x=elemxo+2.0*elemmdim+ELEMSPC-ty; y=elemyo-(tx-4.0*elemmdim-3.0*ELEMSPC); ang=fig.ANGLE+(fig.MIRROR ? -PI2 : PI2); rotvis=0x18; break; } } else { // Get the new text position tx=fig.X-elemxo; ty=fig.Y-elemyo; switch (curdir) { case 0 : x=elemxo+tx; y=elemyo+ty; ang=fig.ANGLE; rotvis=0x21; break; case 1 : x=elemxo+ty; y=elemyo-(tx-2.0*elemmdim-ELEMSPC); ang=fig.ANGLE+(fig.MIRROR ? PI2 : -PI2); rotvis=0x22; break; case 2 : x=elemxo-(tx-3.0*elemmdim-2.0*ELEMSPC); y=elemyo+elemmdim-ty; ang=fig.ANGLE-PI; rotvis=0x24; break; case 3 : x=elemxo+elemmdim-ty; y=elemyo+(tx-3.0*elemmdim-3.0*ELEMSPC); ang=fig.ANGLE+(fig.MIRROR ? -PI2 : PI2); rotvis=0x28; break; } } // Adjust angle to [0,2*PI[ while (ang<0.0) ang+=2.0*PI; while (ang>=2.0*PI) ang-=2.0*PI; // Store the text if (scm_storetext(fig.NAME,x,y,ang,fig.SIZE, curmirr ? 1-fig.MIRROR : fig.MIRROR,fig.TEXT.MODE) || cap_lastfigelem(nfig)) errormsg(ERRTEXT,fig.NAME); // Attach the rotation visibility rules sprintf(rulel[rulen],":%s:%s=%d;",RS_SCMSUBJ,RS_ROTVIS,rotvis); rulen++; if (curdir!=0 && curmirr==0) textclass|=ROTVISTCLASS; if (textclass!=0) { sprintf(rulel[rulen],":%s:%s=%d;", RS_SCMSUBJ,RS_TXTCLASS,textclass); rulen++; } sprintf(rulel[rulen],":%s:%s=1;",RS_SCMSUBJ,RS_GLUED); if (cap_rulefigatt(nfig,rulel)) rsc_error(-1); // Delete the old text dfig=fig; scm_delelem(dfig); } // Get old grid and angle lock flags gridlock=bae_getgridlock(); anglock=bae_getanglelock(); // Free grid and angle bae_setgridlock(0); bae_setanglelock(0); // Delete the non-base directions bae_clriactqueue(); bae_storemenuiact(1,4,LMB); bae_storemenuiact(1,0,LMB); bae_storemouseiact(1,elemxo+elemw,elemyo-0.5*ELEMSPC,0,LMB); bae_storemouseiact(1,bae_planwsux()-0.25*ELEMSPC, elemyo-0.5*ELEMSPC,0,LMB); bae_storemouseiact(1,bae_planwsux()-0.25*ELEMSPC, bae_planwsuy()-0.25*ELEMSPC,0,LMB); bae_storemouseiact(1,bae_planwslx()+0.25*ELEMSPC, bae_planwsuy()-0.25*ELEMSPC,0,LMB); bae_storemouseiact(1,bae_planwslx()+0.25*ELEMSPC,elemyo+elemh,0,LMB); bae_storemouseiact(1,elemxo+elemw,elemyo+elemh,0,LMB); bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,0,LMB); bae_callmenu(MNU_SCMGRPPOLY); bae_callmenu(MNU_SCMDELGRP); // Restore old element boundaries bae_clriactqueue(); bae_storemouseiact(1,wsux,wsuy,0,LMB); bae_callmenu(MNU_SCMPARUBND); bae_clriactqueue(); bae_storemouseiact(1,wslx,wsly,0,LMB); bae_callmenu(MNU_SCMPARLBND); // Restore old grid and angle lock flags bae_setgridlock(gridlock); bae_setanglelock(anglock); // Restore old pick element set varset(VAR_MSFIGDIS,oldfigdis); // Zoom overview bae_callmenu(MNU_BAEZOOMALL); // Delete the expansion data vardelete(VAR_EMDIM); vardelete(VAR_EWIDTH); vardelete(VAR_EHEIGHT); vardelete(VAR_EXOFF); vardelete(VAR_EYOFF); vardelete(VAR_ELX); vardelete(VAR_ELY); vardelete(VAR_EUX); vardelete(VAR_EUY); vardelete(VAR_ETYP); } static void sympinorder() // Set the spice model symbol pin order { index C_FIGURE fig /* Figure list index */; string msg /* Message buffer */; int pinn = 0 /* Pin count */; int cflag = 0 /* Change flag */; int i /* Loop control variable */; // Check the plan class if (ddbclass!=DDBCLSSYM) error_class(); // Reset group bae_callmenu(MNU_SCMGRPRESE); // Select all pin elements forall (fig where fig.TYP==C_FIGNREF) { scm_elemgrpchg(fig,1); pinn++; } // Scan the pin order for (i=0;i2) error_abort(); // Check if mode change if (oldconmode!=newconmode) { if (newconmode==1 && bae_msgboxverify(UPRCONWRN1+UPRCONWRN2,"")==0) error_abort(); // Count project pages while (scanddbenames(bae_planfname(),DDBCLSCM,ename)==1) { // Add the element name el[en]=ename; en++; } if (en>1 && newconmode!=2 && bae_msgboxverify(UPRCONUPD1+UPRCONUPD2,"")==0) error_abort(); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Assign the connectivity mode predicate rule if (newconmode!=2) rsc_assplanintpred(1,RS_CONMODE,newconmode,0,""); // Process other schematic sheets if (en>1) { // Buffer current element name ename=bae_planename(); // Save current element call(MNU_SCMSAVELEM); for (i=0;i=0) { // Query net area name predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ,RS_TNETAREA, "?s",netarea)<1) continue; bae_nameadd(netarea,"","","",2); } // Select net area name netarea=""; bae_setintpar(16,3137); if (bae_askname(netarea,UPRNETAREA,MAXKEYLEN)) // Aborted error_abort(); bae_prtdialog(UPRSELNAREA); if (scm_pickelem(fig,C_FIGPOLY)==0) { // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Assign the net area name predicate rule rsc_assfigstrpred(fig,RS_TNETAREA,netarea,"",""); // Redraw the screen bae_callmenu(MNU_BAEREDISPL); } } 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(rscdatabase,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 C_FIGURE fig /* Pick element */; index C_CONSEG conseg /* Connection segment index */; if (grpflag) { forall (fig where fig.GROUP && fig.TYP!=C_FIGCON) rsc_assfigintpred(fig,RS_GLUED,glue,0,""); // Loop for all group elements forall (conseg where conseg.GROUP) rsc_assconintpred(conseg,RS_GLUED,glue,0,""); } else { // Loop while element picked bae_prtdialog(UPRSELNREF); while (scm_pickelem(fig,C_FIGNREF)==0) rsc_assfigintpred(fig,RS_GLUED,glue,0,""); bae_prtdialog(""); } } static void elementfunctions() // Edit element functions { index C_FIGURE fig /* Figure list index */; string selmsg /* Selection message string */; int seltyp /* Selection element type */; string predname /* Predicate name */; int lfctn /* Last function count */; int cflag = 0 /* Change flag */; int i /* Loop control variable */; if (ddbclass!=DDBCLSCM && ddbclass!=DDBCLSSYM && ddbclass!=DDBCLSLAB) error_class(); // Select the element type bae_promptdialog(UPRSELETYP); switch (bae_askmenu(5,(ddbclass==DDBCLSLAB ? "," : "")+UPRSELE0, UPRSELE2,UPRSELE3,(ddbclass==DDBCLSCM ? "," : "")+UPRSELE4, UPRABORT)) { // Named references case 0 : if (ddbclass==DDBCLSLAB) error_class(); seltyp=C_FIGNREF; selmsg=UPRSELNREF; break; // Areas case 1 : seltyp=C_FIGPOLY; selmsg=UPRSELPOLY; break; // Texts case 2 : seltyp=C_FIGTEXT; selmsg=UPRSELTEXT; break; // Plan case 3 : if (ddbclass==DDBCLSCM) error_class(); seltyp=(-1); break; // Abort case 4 : default : error_abort(); } // Check if plan rule if (seltyp<0) { // Get old functions for (cfctn=0;cfctn1) { 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,3075); 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(3029,dialwidth,dialheight, DIAL_LEFTMARG+SELBOXWIDTHFS+DIAL_RIGHTSMARG, baseheight+16.0, DIAL_LEFTMARG+87.0+DIAL_RIGHTSMARG, 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 void prtgrpcount(int changes,int selectmode) /* // Print group selection/deselection statistics // Parameters : // int changes : Change count // int selectmode : Select mode */ { index C_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); } // Data conversion routines double mmceil(double val) /* // Round meter input value up to next mm // Return value : // rounded value in meters // Parameters : // double val : Input value */ { // Calculate result and return it return(ceil(val*1000.0)/1000.0); } double mmfloor(double val) /* // Round meter input value down to next mm // Return value : // rounded value in meters // Parameters : // double val : Input value */ { // Calculate result and return it return(floor(val*1000.0)/1000.0); } // User Language program end