/* SCM_PLC (SCM) -- SCM Symbol Placement Action */ /* SCM_PLC (SCM) -- SCM Symbolplatzierungsaktion */ /* -- EXECUTED AFTER SYMBOL PLACEMENT -- */ /* // Copyright (c) 2004-2013 Bartels System GmbH, Muenchen // Author: Roman Ludwig // Changes History: // rl (131029) RELEASED FOR BAE V8.0. // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (050118) ENHANCEMENT // Added $pageref shift option. // rl (040811) RELEASED FOR BAE V6.4. // rl (040604) ORIGINAL CODING. // // DESCRIPTION // // The scm_plc User Language program is automatically activated after // a symbol is placed to update the symbol placement pool. */ // Includes #include "scm.ulh" // User Language SCM utilities #include "sql.ulh" // User Language SQL utilities // INI file parameter name definitions #define PAR_PAGEREFOFF "PAGEREFOFF_SCM"// $pageref relativ offset #define GV_SYMPDIS "sp_sympooldis" // Symbol pool query disable flag #define GV_SYMBID "sp_symbaskid" // Symbol pool basket ID #define GV_SYMNAME "sp_symname" // Symbol pool symbol name #define GV_LIBNAME "sp_libname" // Symbol pool library name #define GV_RLNAME "sp_rlname" // Symbol pool $rlname value #define GV_MAPID "sp_symmapid" // Symbol pool mapping attribute ID #define GV_FILENAME "sp_filename" // Symbol pool file name #define GV_BOXID "sp_boxid" // Symbol pool item list index #define GV_SBOXID "s_boxid" // Symbol selection box ID // SQL command definitions #define SB_INSERT "insert into msymbasket values(%d,%d,%s,%s,%s,%d);" #define SB_SELECT "select symbol,basketid,cnt,library,rlname,mapid from msymbasket;" #define SB_DELETE1 "delete from msymbasket where basketid=%d AND symbol=%s " #define SB_DELETE2 " AND library=%s AND rlname=%s AND mapid=%d;" #define SE_SELECT "select basketid from msymbasket where basketid=%d AND mapid=%d;" #define BV_SELECT1 "select attrname,attrval from mbasketattr where " #define BV_SELECT2 "basketid=%d AND mapid=%d;" #define BA_DELETE "delete from mbasketattr where basketid=%d AND mapid=%d;" string sqlcommand /* SQL command string */; struct symdes { // Symbol pool descriptor int cnt /* Symbol count */; int id /* Symbol basket ID */; string name /* Symbol name */; string libname /* Library name */; string rlname /* Requested library name */; int mapid /* Mapping attributes ID */; } syml[] /* Symbol pool list */; int symn /* Symbol pool count */; int cursym /* Current symbol pool index */; struct attrdef { // Attribute assignment descriptor string name /* Attribute name */; string val /* Attribute value */; } vall[] /* Attribute value list */; int valn /* Attribite value count */; int curid /* Current ID */; string ddbfname = bae_planfname() /* Current project file name */; double PAGEREFOFF = bae_inidblval(PAR_PAGEREFOFF,-1.0); // $pageref relativ offset #define FONTASP (2.0/3.0) // Font aspect ratio index C_FIGURE scanfig /* Scan figure list index */; double pagerefsize /* $pageref text size */; // Main program void main() { int id /* Symbol basket ID */; int mapid /* Mapping attributes ID */; string rlname /* Requested library name */; string filename /* File name */; string lastmacname /* Last placed macro name */; string lastrefname /* Last placed reference name */; int disflag /* Symbol pool query disable flag */; int plctyp /* Last placed element type */; int i /* Current loop control variable */; // Abort if invalid plan class if (bae_planddbclass()!=DDBCLSCM) error_class(); scm_getintpar(3,plctyp); // Check if label placement if (plctyp>0) { if (PAGEREFOFF>=0.0 && cap_nrefsearch("",scanfig)==0) { // Scan the text characteristics pagerefsize=(-1.0); if (cap_scanfelem(scanfig,0.0,0.0,0.0,1, macfunc,NULL,NULL,pagereffunc)!=0) error_scan(); // Check if $pageref found if (pagerefsize>=0.0) // Shift $pageref if (cap_scanfelem(scanfig,0.0,0.0,0.0,1, macfunc,NULL,NULL,shiftfunc)!=0) error_scan(); } exit(0); } // Check if symbol pool query disabled if (varget(GV_SYMPDIS,disflag)==0 && disflag) // Symbol pool update disabled exit(0); // Update autoname control element text if (varget(GV_SBOXID,i)==0) ulsystem("symsel:'nameupdate'",0); // Get last placed symbol data if (scm_getstrpar(0,lastmacname) || scm_getstrpar(1,lastrefname) || lastrefname=="" || lastmacname=="") // Symbol data not known exit(0); // Query symbol pool symn=0; sqlcmd(ddbfname,SB_SELECT,symfunc); if (symn==0) // Symbol pool empty exit(0); // Get last placed basket id if (varget(GV_SYMBID,id) || varget(GV_RLNAME,rlname) || varget(GV_FILENAME,filename) || varget(GV_MAPID,mapid) || ddbfname!=filename) { id=(-2); rlname=filename=""; } // Check if basket contains further symbols of last placed kind for (cursym=(id==(-1) ? symn : 0);cursym=symn) { // Data not matched // Check if same basket id symbol available for (cursym=0;cursym=symn) { // Check if same symbol macro in basket for (cursym=0;cursym=symn) // Symbol pool not matched exit(0); } } // Get symbol attributes valn=0; sprintf(sqlcommand,BV_SELECT1+BV_SELECT2,syml[cursym].id,0); if (sqlcmd(ddbfname,sqlcommand,attrassfunc)) // SQL/DB error ) sql_dberror(0); // Get gate specific attributes if (syml[cursym].mapid!=0) { sprintf(sqlcommand,BV_SELECT1+BV_SELECT2, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,attrassfunc)) // SQL/DB error sql_dberror(0); } // Transfer attributes for (i=0;i1) { sprintf(sqlcommand,SB_INSERT,syml[cursym].id, syml[cursym].cnt-1,sql_quotestr(syml[cursym].name), sql_quotestr(syml[cursym].libname), sql_quotestr(syml[cursym].rlname),syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(0); } else { // Last entry of this kind, check if orphant attribute set curid=(-1); sprintf(sqlcommand,SE_SELECT, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,idfunc)!=0) // SQL/DB error sql_dberror(0); if (curid==(-1)) { // Delete orphant attribute set sprintf(sqlcommand,BA_DELETE, syml[cursym].id,syml[cursym].mapid); if (sqlcmd(ddbfname,sqlcommand,NULL)!=0) // SQL/DB error sql_dberror(29); } } if (varget(GV_BOXID,i)==0) ulsystem("symsel:'poolupdate'",0); } int symfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Symbol pool 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 */ { switch (didx) { // Symbol name case 1 : // Store sorted to list for (cursym=symn;cursym>0;cursym--) if (syml[cursym-1].name>dstr) syml[cursym]=syml[cursym-1]; else break; syml[cursym].name=dstr; break; // Symbol basket ID case 2 : syml[cursym].id=dint; break; // Symbol count case 3 : syml[cursym].cnt=dint; break; // Library name case 4 : syml[cursym].libname=dstr; break; // Requested library name case 5 : syml[cursym].rlname=dstr; break; // Mapping attribute ID case 6 : syml[cursym].mapid=dint; symn++; break; } // Return without errors return(0); } int attrassfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Symbol attribute 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 */ { switch (didx) { // Attribute name case 1 : vall[valn].name=dstr; break; // Attribute value case 2 : vall[valn].val=dstr; valn++; break; } // Return without errors return(0); } int idfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Any ID 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 */ { // Get ID curid=dint; // Return without errors return(0); } int macfunc(index C_MACRO macro,index C_POOL pool,int macinws, string refname,index C_LEVEL level,index C_LEVEL buslevel) /* // Macro scan function // Return value : // 0 if out of workspace, 1 if inside, 2 if unknown, or (-1) on error // Parameters : // index C_MACRO macro : Macro index // index C_POOL pool : Macro pool index // int macinws : Macro in workspace flag // string refname : Macro reference name // index C_LEVEL level : Macro level // index C_LEVEL buslevel : Macro bus level */ { return(macro.CLASS==DDBCLSLAB ? 1 : 0); } int pagereffunc(index C_TEXT textp,double tx,double ty,double tangle, int mirrflag,double tsize,string tstr,int textinws,int macclass,int varattr) /* // Get the text characteristics // Return value : // zero if done or (-1) on error // Parameters : // index C_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text 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 */ { if (textp.STR=="$pageref") pagerefsize=textp.SIZE; // Return without errors return(0); } int shiftfunc(index C_TEXT textp,double tx,double ty,double tangle, int mirrflag,double tsize,string tstr,int textinws,int macclass,int varattr) /* // Get the text characteristics // Return value : // zero if done or (-1) on error // Parameters : // index C_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text 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 vx, vy /* Shift vector */; int tlen /* Text length */; if (textp.STR=="$") { // Get the text length tlen=strlen(tstr); if (tstr[0]=='/') tlen--; // Get the text angle vector vx=cos(tangle)*tsize*FONTASP*(tlen+PAGEREFOFF); vy=sin(tangle)*tsize*FONTASP*(tlen+PAGEREFOFF); // Shift text scm_attachtextpos(scanfig,"$pageref", tx+vx,ty+vy,tangle,pagerefsize,mirrflag); } // Return without errors return(0); } // User Language program end