/* ATTRSET (SCM) -- SCM Symbol Attribute Assignment */ /* ATTRSET (SCM) -- SCM-Symbol Attributwertzuweisung */ /* // Copyright (c) 2003-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 (091020) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080129) ENHANCEMENT: // Added alternate variant attribute value control scheme. // rl (071029) RELEASED FOR BAE V7.0. // rl (070705) BUGFIX: // Fixed problem with action buttons in active variant. // rl (070620) ENHANCEMENT: // Added logical definition eval. option for $rpname transfer. // rl (070515) ENHANCEMENT: // Added $rpname companion symbols attribute transfer option. // rl (061122) ENHANCEMENT: // Added project layout macros to $plname browse list. // rl (060926) RELEASED FOR BAE V6.8. // rl (060823) ENHANCEMENT: // Added attribute transfer to external browse program. // rl (060822) BUGFIX: // Fixed problem with browse buttons. // rl (060721) ENHANCEMENT: // Added page preselection for picked attribute on multipage // attribute lists. // rl (060516) ENHANCEMENT: // Added optional extern program call on attribute set. // rl (060505) ENHANCEMENT: // Added variant list attribute setting support. // rl (060109) ENHANCEMENT: // Added extern attribute browse program support. // rl (050916) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (040706) ENHANCEMENT: // Added optional part macro display request to $plname browse. // rl (031001) ENHANCEMENT: // Added attribute lock support. // rl (030904) RELEASED FOR BAE V6.2. // rl (030210) BUGFIX: // Fixed problem with default value buttons. // rl (021209) RELEASED FOR BAE V6.0. // rl (021117) ENHANCEMENT: // Added attribute sorting option. // rl (020704) BUGFIX: // Fixed problem with non-attribute texts. // rl (020618) RELEASED FOR BAE V5.4. // rl (020306) ORIGINAL CODING. // // DESCRIPTION // // The attrset User Language program provides an advanced dialog // box for assignment of attributes to mouse selectable symbols. */ // Includes #include "pop.ulh" // User Language popup utilities #include "scm.ulh" // User Language SCM utilities // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRVALUES = M("Attribute von '%s' ('%s') / '%s' :", "Attributes of '%s' ('%s') / '%s' :"); string UPRVVALUES = M("'%s' ('%s') / '%s' Attribut %s :", "'%s' ('%s') / '%s' Attribute %s:"); string UPRVARIANT = M("Variante","Variant"); string UPRSYMBOL = M("Symbol selektieren!","Select Symbol!"); string UPRPLNAME = M("!Gehaeusename ? ","!Package Name ?"); string UPRVIASTK = M("!Viapadstack ? ","!Via Padstack Name ?"); string UPRNOVAL = M("Kein Wert","No Value"); string UPRDEFAULT = M("Default","Default"); string UPRBROWSE = M("Browse","Browse"); string UPRPICK = M("Pick","Pick"); string UPRVAR = M("V","V"); string UPRLOCK = M("&Sperren","&Lock"); string UPRBVAL = M("Basiswert","Base Value"); string UPRALLRES = M("Alle &ruecksetzen","&Reset All"); string UPRALLDEF = M("&Alle Default","Default &All"); string UPRNEXTDIAL = M("&Weitere","&Next"); string UPRPREVDIAL = M("&Vorherige","&Previous"); string UPRLOGLIB = M("Selektion $rlext","$rlext Selection"); string UPRDEFVAL = M("Selektion %s","Selection %s"); string UPRSELRPSYM = M("Quellsymbol fuer %s selektieren!", "Select source symbol for %s!"); string REPLOGSCAN = M("Scannen logische Definitionen...", "Scanning logical library..."); string REPLOGLIB = M("Logische Definitionen zu Symbol '%s':", "Logical Library Entries for Symbol '%s':"); string REPDEFVAL = M("Werte fuer Attribut %s:", "Values for Attribute %s:"); string REPNILATT = M("!nicht_gesetzt!","!not_set!"); string REPNILVATT = M("!Wert_aus_Basisvariante!","!Base_variant_value!"); string REPNILVATTC2 = M(" !Wert_aus_Basisvariante!", " !Base_variant_value!"); string REPPROJDEF = M("(Projekt)","(Project)"); string REPACTVAR = M(" (aktiv)"," (active)"); string REPATTRSET = M("Wert zuweisen '%s'","Assign Values '%s'"); string ERRSETATT = M("Fehler beim Eintragen des Attributes '%s'!", "Error setting attribute '%s'!"); string ERRNOATT = M("Bauteil '%s' ('%s') besitzt keine Attribute!", "Part '%s' ('%s') has no selectable attributes!!"); string ERRSYMGLUED = M("Symbol '%s' ist verankert!", "Symbol '%s' is glued!"); string ERRNOMULP = M("Symbol '%s' besitzt kein gesetztes %s-Attribut!", "Symbol '%s' doesn't have a %s attribute set!"); string ERRNOPICK = M_ERRNOPICK(); // INI file parameter name definitions #define PAR_ATTRDCNT "ATTRDCNT_SCM" // Attribute max. dialog items count #define PAR_ATTRCOMMP "ATTR_%s_STD" // Attribute comment pattern #define PAR_ATTRORDP "ATTR_ORD_%s_STD" // Attribute order pattern #define PAR_ATTRBRWP "ATTR_BRW_%s_STD" // Attribute browse program #define PAR_ATTRSETP "ATTR_SET_STD" // Attribute set program #define PAR_ATTRUPPER "SATTRUPPER_SCM"// Attribute automatic upper case conv. #define PAR_DISPPLNAME "DISPPLNAME_SCM"// $plname part display flag #define PAR_RPNAMEAUPD "RPNAMEAUPD_SCM"// $rpname attr. transfer mode #define PAR_VATTRMODE "VATTRMODE_SCM" // Variant attribute set mode #define PAR_NOPLCPVIS "NOPLCPVIS_SCM" // $noplc/plot visibilty relationship // SQL command definitions #define V_SELECTA "select from varinfo;" // Attribute definitions struct attrdes { // Attribute descriptor string defvall[] /* Attribute default value list */; int defvaln /* Attribute default value count */; string val /* Attribute value */; string varval /* Attribute variant specific value */; string valbak /* Attribute value backup */; string name /* Attribute name */; string disp /* Attribute display name */; string brwprog /* Attribute browse program name */; int ord /* Attribute order */; int noedit /* Attribute edit disabled flag */; int lock /* Attribute locked flag */; } attl[] /* Attribute data list */; int attn = 0 /* Attribute count */; STRINGS headl /* Header string list */; int headn = 2 /* Header string count */; struct vardesc { // Variant descriptor int varnum /* Variant number */; string varname /* Variant name */; } varl[] /* Variant list */; int varn = 0 /* Variant count */; int act_var = 0 /* Active variant */; int act_flag = 0 /* Active variant defined flag */; int curvarnum /* Current variant number */; string rpold = "" /* Old requested part name */; int rppick = 0 /* $rpname picked flag */; STRINGS rpsyml /* Same $rpname symbol list */; STRINGS rpmacl /* Same $rpname symbol macro list */; int rpsymn = 0 /* Same $rpname symbol count */; int rpaidx = (-1) /* $rpname attr. list idx. */; string rpaname /* $rpname/$rbname */; string symmacro /* Symbol macro name */; int symtyp = 0 /* Sym. type (0 std, 1 main, 2 sub) */; int gatecnt = 0 /* Current gate count */; int attrsetflag = 0 /* Attributes set flag */; double ax, ay /* Attribute pick search coord. */; double amindist /* Attribute pick min. distance */; string aminname = "" /* Attribute pick min. name */; string fname = bae_planfname() /* Project file name */; // Globals #define GV_BATTRNAME "brw_attrname" // Browse attribute name #define GV_BATTRVAL "brw_attrval" // Browse attribute value #define GV_BATTRSYM "brw_attrsym" // Browse attribute symbol name #define GV_BATTRN "brw_attrn" // Browse attribute count #define GV_BATTRNL "brw_attrnl" // Browse attribute name list #define GV_BATTRVL "brw_attrvl" // Browse attribute value list #define GV_SATTRNAME "set_attrname" // Set attribute name #define GV_SATTRSYM "set_attrsym" // Set symbol name #define GV_SOATTRN "set_oattrn" // Set original attribute count #define GV_SOATTRNL "set_oattrnl" // Set original attribute name list #define GV_SOATTRVL "set_oattrvl" // Set original attribute value list #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 FONTASP (2.0/3.0) // Font aspect ratio #define MOFF (7) // Menu list action code offset int MAXMENUATTR = bae_iniintval(PAR_ATTRDCNT,12) /* Max. attribute menu list length */; int ATTRUPPER = bae_iniintval(PAR_ATTRUPPER,0) /* Automatic attr. upper case conv. */; int RPNAMEAUPD = bae_iniintval(PAR_RPNAMEAUPD,0) /* $rpname attr. transfer mode */; int VATTRMODE = bae_iniintval(PAR_VATTRMODE,0) /* Variant attr. set mode */; int NOPLCPVIS = bae_iniintval(PAR_NOPLCPVIS,3) /* $noplc/plot vis. relationship */; // Main program void main() { index C_FIGURE fig /* Figure list element */; index C_NREF nref /* Named reference */; index C_NREF cnref /* Compare named reference */; string msg /* Message buffer */; double x, y /* Mouse position */; double cy /* Current y value */; double defoff = 0.0 /* Default button offset */; double voff = 0.0 /* Variant button offset */; int avidxl[] /* Attribute value index list */; int abvidxl[] /* Attribute base value index list */; string aevall[] /* Attribute edit value list */; int lockidx = (-1) /* Lock toggle index */; int menuact /* Menu action */; int plaidx = (-1) /* $plname attr. list idx. */; int vsaidx = (-1) /* $viastk attr. list idx. */; int rlaidx = (-1) /* $rlname attr. list idx. */; int rleidx = (-1) /* $rlext attr. list idx. */; int mlsidx = 0 /* Menu attr. list start idx. */; int menuoff /* Menu item offset */; int menuidx /* Menu item index */; int attidx /* Attribute index */; int an /* Attribute value return count */; int defidx /* Default value index */; int repflag = 1 /* Repeat flag */; int lock = 0 /* Lock attributes flag */; int lockflag = 0 /* Locked attributes exists flag */; string attrname /* Attribute name */; string attrvalue /* Attribute value */; string varvalstr /* Variant value string */; string actvalstr /* Active variant value string */; string libname /* Library name */; string layname /* Layout part name */; string symname /* Symbol name */; string ename /* Element name */; string pname /* Picked symbol name */; string rpname /* $rpname value */; string oldname /* Old name */; string logldef /* Definition string */; string rlname /* $rlname value */; int lastidx /* Last changed attribute index */; int first = 1 /* First changed attribute flag */; int gridlock /* Grid lock flag */; int anglock /* Angle lock flag */; int alen /* Attribute value length */; int nlen1 /* Nil attribute value 1st length */; int nlen2 /* Nil attribute value 2nd length */; int setfocus /* Dialog item focus flag */; int focus /* Dialog item focus mode */; int i, j /* Loop control variables */; // Abort if invalid plan class if (bae_planddbclass()!=DDBCLSCM) error_class(); // Pick symbol 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(UPRSYMBOL); else bae_storemouseiact(3,ax,ay,2,LMB); // Restore the old grid and angle lock bae_setgridlock(gridlock); bae_setanglelock(anglock); } if (scm_pickelem(fig,C_FIGSREF)!=0) error(ERRNOPICK); } else { bae_promptdialog(UPRSYMBOL); if (scm_pickelem(fig,C_FIGSREF)!=0) error(ERRNOPICK); bae_wsmouse(ax,ay,0); } symname=fig.NAME; if (fig.FIXED&2) errormsg(ERRSYMGLUED,symname); // Check for dialog support if (bae_dialclr()) { // Get the mouse position bae_wsmouse(x,y,0); // Assign value with internal function bae_clriactqueue(); bae_storemouseiact(1,x,y,0,LMB); call(MNU_SCMASSVALUE); return; } // Query the current active variant if (cap_rulequery(RS_OCSCMDB,0,RS_SCMSUBJ,RS_VARIANT,"?d",act_var)<1) // Set default variant act_var=0; act_flag=0; // Select all variant table entries varn=0; sqlcmd(fname,V_SELECTA,datafunc); // Check if active variant defined if (!act_flag) { for (i=varn;i>0;i--) if (varl[i-1].varnum0;i--) varl[i]=varl[i-1]; // Insert variant data varl[0].varnum=0; varl[0].varname=""; varn++; } if (varn>1) voff=3.0; // Set nil attribute compare length values nlen1=strlen(REPNILVATT); nlen2=strlen(REPNILVATTC2); // Get symbol reference nref=fig.NREF; symmacro=rlname=nref.MACRO.NAME; // Init. attribute name list attn=0; // Scan the attributes if (cap_scanpool( nref.MACRO,0.0,0.0,0.0,0,amacfunc,NULL,NULL,atextfunc)) error_scan(); // Check if attributes found if (attn==0) { sprintf(msg,ERRNOATT,symname,symmacro); error(msg); } // Scan the picked attribute if (cap_scanfelem(fig,0.0,0.0,0.0,1,amacfunc,NULL,NULL,aptextfunc)) error_scan(); if (aminname!="") { // Check if multipage attribute list if (attn>MAXMENUATTR) for (attidx=0;attidx1) { // Search current entry index for (i=0;i=attl[attidx].defvaln) defidx= act_var!=0 ? attl[attidx].defvaln : 0 ; else defidx=i; // Store selection box avidxl[menuidx]=bae_dialaddcontrol(PA_SB|focus, 0,0,defidx,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+12.0+defoff+voff,cy,20.0,""); for (i=0;i1) && !(lock && ((attl[attidx].lock&1) || ((attl[attidx].lock&2) && act_var!=0)))) { if (act_var==0 || VATTRMODE==0) bae_dialaddcontrol(PA_ACT,0, menuidx+MOFF,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,10.0,UPRNOVAL); else abvidxl[menuidx]=bae_dialaddcontrol( PA_TOGGLE,0,menuidx+MOFF, attl[attidx].noedit,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG,cy,0.0, UPRBVAL); // Store attribute default value button if (attl[attidx].defvaln!=0 && (act_var==0 || (attl[attidx].lock&2)==0)) bae_dialaddcontrol(PA_ACT,0, menuidx+MAXMENUATTR+MOFF,0,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG+11.0,cy,8.0, UPRDEFAULT); // Store attr. variant values button if (voff!=0.0 && (attl[attidx].lock&2)==0) bae_dialaddcontrol(PA_ACT,0, menuidx+3*MAXMENUATTR+MOFF,0,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG+11.0+defoff,cy, 2.5,UPRVAR); // Store attribute browse button if (attidx==plaidx || attidx==rlaidx || attidx==rleidx || attidx==vsaidx || attl[attidx].brwprog!="" || attl[attidx].defvaln>1) bae_dialaddcontrol(PA_ACT,0, menuidx+2*MAXMENUATTR+MOFF,0,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG+61.0+defoff+ voff,cy,0.0,UPRBROWSE); // Store $rpname/$rbname pick button else if (attidx==rpaidx) { bae_dialaddcontrol(PA_ACT,0,6,0,0.0, 0.0,0.0,"",0,DIAL_LEFTMARG+61.0+ defoff+voff,cy,0.0,UPRPICK); } } else { // Store attribute default value button if (attl[attidx].defvaln>1 && (act_var==0 || (attl[attidx].lock&2)==0)) bae_dialaddcontrol(PA_ACT,0,menuidx+ MAXMENUATTR+MOFF,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+11.0,cy,8.0,UPRDEFAULT); // Store attr. variant values button if (voff!=0.0 && (attl[attidx].lock&2)==0) bae_dialaddcontrol(PA_ACT,0, menuidx+3*MAXMENUATTR+MOFF,0,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG+11.0+defoff, cy,2.5,UPRVAR); // Store attribute browse button if (attl[attidx].brwprog!="") bae_dialaddcontrol(PA_ACT,0, menuidx+2*MAXMENUATTR+MOFF,0,0.0,0.0, 0.0,"",0,DIAL_LEFTMARG+61.0+ defoff+voff,cy,0.0,UPRBROWSE); // Store $rpname/$rbname pick button else if (attidx==rpaidx && (RPNAMEAUPD&4)==0) { bae_dialaddcontrol(PA_ACT,0,6,0,0.0, 0.0,0.0,"",0,DIAL_LEFTMARG+61.0+ defoff+voff,cy,0.0,UPRPICK); } } // Store the attribute name control sprintf(msg,": %s",attl[attidx].disp); dial_label(32.0+defoff+voff,cy,msg); cy+=DIAL_BUTVSTEP; } cy+=DIAL_SEPVSTEP; // Store page flip buttons 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+MAXMENUATTR)=3*MAXMENUATTR) { attidx=menuoff-3*MAXMENUATTR+mlsidx; getvarvalues(symname,layname,symmacro,attidx); } // Check if browse button else if (menuoff>=2*MAXMENUATTR) { attidx=menuoff-2*MAXMENUATTR+mlsidx; if (attl[attidx].brwprog!="") { varset(GV_BATTRNAME,attl[attidx].name); varset(GV_BATTRVAL,attl[attidx].val); varset(GV_BATTRSYM,symname); varset(GV_BATTRN,attn); for (i=0;i=MAXMENUATTR) { attidx=menuoff-MAXMENUATTR+mlsidx; // Set default attribute value attl[attidx].val=attl[attidx].varval= attl[attidx].defvall[0]; } else { attidx=menuoff+mlsidx; if (act_var!=0 && VATTRMODE) { // Edit state toggled attl[attidx].val= getvarvalue(symname,attl[attidx].name,0); attl[attidx].varval= attl[attidx].noedit ? PA_NILVAL : attl[attidx].val; } else { // Reset attribute value if (act_var) attl[attidx].val=getvarvalue(symname, attl[attidx].name,0); else attl[attidx].val=PA_NILVAL; attl[attidx].varval=PA_NILVAL; } } } } // Stop if no further repeat requests while (repflag); // Fetch current attribute value fields for (menuidx=0;menuidx=0 && (RPNAMEAUPD&0x03)!=0) { // Get symbol type if ((RPNAMEAUPD&0x08)!=0) if (con_getlogpart(bae_planfname(), rlname,80,logldef)==0 || con_getlogpart(libname,rlname,80,logldef)==0) // Parse definition synparsestring(logldef); // Get new requested part name attrvalue=attl[rpaidx].val; // Check if picked name if (rppick) { // Rescan companion symbols rpsymn=0; oldname=attrvalue; strlower(oldname); forall (cnref where cnref.MACRO.CLASS==DDBCLSSYM && (pname=cnref.NAME)!=symname) if (cap_getpartattrib(pname,rpaname,rpname)==0) { strlower(rpname); if (rpname==oldname) { rpsyml[rpsymn]=pname; rpmacl[rpsymn]=cnref.MACRO.NAME; rpsymn++; } } } // Check if attribute transfer to companion symbols if ((RPNAMEAUPD&0x03)==2 || rpold==attl[rpaidx].val || rppick) { // Scan attributes for (attidx=0;attidx=0;i--) if (rulel[i]==rulename) { // Delete the old rule for (j=i;j0) { if (cap_rulefigdet(fig)) rsc_error(-1); } } void getvarvalues(string symname,string layname,string symmacro,int attidx) /* // Get variant attribute values // Parameters : // string symname : Symbol name // string layname : Layout part name // string symmacro : Symbol macro name // int attidx : Attribute index */ { index C_FIGURE fig /* Figure list element */; index C_NREF nref /* Named reference */; index C_ATTRIBUTE attr /* Attribute index */; string vvall[] /* Variant value list */; string ovall[] /* Old variant value list */; string attrname /* Attribute name */; string scanattr /* Scan attribute name */; string attrvalue /* Attribute value */; int varnum /* Variant number */; int len /* Attribute name length */; 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 an /* Attribute value return count */; int defidx /* Default value index */; int repflag = 1 /* Repeat flag */; int lock = 0 /* Lock attributes flag */; int lockflag = 0 /* Locked attributes exists flag */; int vidx /* Variant index */; int alen /* Attribute value length */; int nlen1 /* Nil attribute value 1st length */; int nlen2 /* Nil attribute value 2nd length */; int i, j /* Loop control variables */; if (cap_nrefsearch(symname,fig)) return; nref=fig.NREF; // Set nil attribute compare length values nlen1=strlen(REPNILVATT); nlen2=strlen(REPNILVATTC2); // Get attribute name length attrname=attl[attidx].name; len=strlen(attrname); vvall[0]=PA_NILVAL; for (i=1;i1) { // Search current entry index for (i=0;i=attl[attidx].defvaln) defidx= vidx!=0 ? attl[attidx].defvaln : 0 ; else defidx=i; // Store selection box avidxl[menuidx]=bae_dialaddcontrol(PA_SB,0,0, defidx,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+12.0+defoff,cy,20.0,""); for (i=0;i1) && !(lock && ((attl[attidx].lock&1) || ((attl[attidx].lock&2) && vidx!=0)))) { 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+MAXMENUATTR+6,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+11.0,cy,8.0, UPRDEFAULT); // Store attribute browse button if (attl[attidx].brwprog!="" || attl[attidx].defvaln>1) bae_dialaddcontrol(PA_ACT,0, menuidx+2*MAXMENUATTR+6,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+61.0+defoff, cy,0.0,UPRBROWSE); } else { if (attl[attidx].defvaln>1) // Store attribute default value button bae_dialaddcontrol(PA_ACT,0,menuidx+ MAXMENUATTR+6,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+11.0,cy,8.0,UPRDEFAULT); // Store attribute browse button if (attl[attidx].brwprog!="") bae_dialaddcontrol(PA_ACT,0, menuidx+2*MAXMENUATTR+6,0,0.0,0.0,0.0, "",0,DIAL_LEFTMARG+61.0+defoff, cy,0.0,UPRBROWSE); } // Store the attribute name control if (varl[vidx].varname=="") sprintf(msg,": %s %d",UPRVARIANT, varl[vidx].varnum); else sprintf(msg,": %s",varl[vidx].varname); if (act_var==vidx) msg+=REPACTVAR; 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+MAXMENUATTR)=2*MAXMENUATTR) { vidx=menuoff-2*MAXMENUATTR+mlsidx; if (attl[attidx].brwprog!="") { varset(GV_BATTRNAME,attl[attidx].name); varset(GV_BATTRVAL,vvall[vidx]); varset(GV_BATTRSYM,symname); runulprog(attl[attidx].brwprog); vardelete(GV_BATTRNAME); vardelete(GV_BATTRVAL); vardelete(GV_BATTRSYM); if (varget(GV_BATTRN,an)==0) { for (i=0;i=MAXMENUATTR) { vidx=menuoff-MAXMENUATTR+mlsidx; // Set default attribute value vvall[vidx]=attl[attidx].defvall[0]; } else { // Reset attribute value vvall[menuoff+mlsidx]= (menuoff+mlsidx)==0 ? PA_NILVAL : REPNILVATT; } } } // Stop if no further repeat requests while (repflag); // Fetch current variant value fields for (menuidx=0;menuidx=0 && (RPNAMEAUPD&0x03)!=0) for (i=0;i=attn) { // Get upper case attribute name attrcommv=str; strupper(attrcommv); // Query the attribute lock state if (cap_rulequery(RS_OCPOOL,textp,RS_SCMSUBJ,RS_ATTADIS, "?d",lock)<1) // Clear attribute locked flag lock=0; // Query the attribute base variant lock state if (cap_rulequery(RS_OCPOOL,textp,RS_SCMSUBJ,RS_ATTVAR0, "?d",lockbase)<1) // Clear attribute locked in base variant flag lockbase=0; // Build order variable name sprintf(attrcommn,PAR_ATTRORDP, strextract(attrcommv,1,strlen(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 && numstrcmp(attl[i-1].name,str)>0)) attl[i]=attl[i-1]; else break; // Store the attribute to the list attl[i].name=str; attl[i].ord=attrord; attl[i].lock=lock|(lockbase<<1); attl[i].defvall[0]=PA_NILVAL; attl[i].defvaln=0; // Build comment variable name sprintf(attrcommn,PAR_ATTRCOMMP, strextract(attrcommv,1,strlen(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); // Get upper case attribute name attrcommv=str; strupper(attrcommv); // Build browse program variable name sprintf(attrcommn,PAR_ATTRBRWP, strextract(attrcommv,1,strlen(attrcommv))); // Query browse program variable attl[i].brwprog= varget(attrcommn,attrcommv)==0 ? attrcommv : ""; attn++; } // Check if default value assigned if (attl[i].defvaln==0) { // Query the attribute default value if (cap_rulequery(RS_OCPOOL,textp,RS_SCMSUBJ,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 (cap_rulequery(RS_OCPOOL,textp,RS_SCMSUBJ, RS_INIVAL+itoa(j),"?s",attl[i].defvall[j])<1) break; attl[i].defvaln++; } } } // Return without errors return(0); } int aptextfunc(index C_TEXT textp,double tx,double ty,double tangle, int mirrflag,double tsize,string tstr,int textinws,int macclass,int varattr) /* // Scan a text data block for attribute pick // Return value : // zero if done or (-1) on error // index C_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text rotation angle // int mirrflag : Text mirror flag // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag // int macclass : Text macro class // int varattr : Text variant attribute 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 */; // Check if valid attribute text string if (scm_chkattrname(textp.STR)) // No valid attribute name 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=="" || dist0;i--) if (varl[i-1].varnum