/* BAE_SAVE (STD) -- BAE Save Action */ /* BAE_SAVE (STD) -- BAE Speicher-Aktion */ /* -- EXECUTED BEFORE SAVING SOME BAE ELEMENT -- */ /* // Copyright (c) 1997-2013 Bartels System GmbH, Muenchen // Author: Roman Ludwig // Changes History: // rl (131029) RELEASED FOR BAE V8.0. // rl (130108) ENHANCEMENT: // Added pin number sequence check. // rl (120427) RELEASED FOR BAE V7.8. // rl (120302) BUGFIX: // Fixed problem with design view window store. // rl (101019) RELEASED FOR BAE V7.6. // rl (100311) ENHANCEMENT: // Added edit batch call support. // rl (091020) 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 (041015) BUGFIX: // Fixed problem with erroneous design view window store. // rl (040811) RELEASED FOR BAE V6.4. // rl (030904) RELEASED FOR BAE V6.2. // rl (030818) ENHANCEMENT: // Added history support. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (020125) ENHANCEMENT: // Added user specific program call support. // rl (010625) RELEASED FOR BAE V5.0. // rl (000809) RELEASED FOR BAE V4.6. // rl (000809) BUGFIX: // Fixed problem with predefined class name entries. // rl (990625) RELEASED FOR BAE V4.4. // rl (981019) CHANGE // Set Toolbar attachment mode job specific for non-layout // class elements. // rl (980910) RELEASED FOR BAE V4.2. // rl (980910) ENHANCEMENT: // Changed to V4.2 general access program. // mb (980710) ENHANCEMENT: // Dynamic multi-language support introduced. // mb (980707) CHANGE: // sql.ulh included to avoid errors on standard compilation. // rl (980626) IMPROVEMENT: // Added toolbar attachment store. // rl (971125) ORIGINAL CODING. // // DESCRIPTION // // The bae_save User Language program is automatically // activated before saving an element to the corresponding // User Language Interpreter environment. bae_save saves // the design view management windows of the currently // loaded element. */ // Includes #include "sql.ulh" // User Language SQL utilities #include "scm.ulh" // User Language SCM utilities #include "lay.ulh" // User Language layout utilities // Enforce standard caller type #pragma ULCALLERSTD // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRBATCALL = M("Edit-Batch '%s' ausfuehren ? ", "Call Edit Batch '%s' ? "); string REPNUMGAP = M("Nummerierungsluecke zwischen '%s' und '%s'!", "Number gap between '%s' and '%s'!"); string ERRDBCREA = M("SQL/DB-Datei '%s' kann nicht angelegt werden!", "Error creating SQL/DB file '%s'!"); string ERRROTEXP = M("Das Symbol ist noch expandiert!", "Symbol is expanded!"); // INI file parameter name definitions #define PAR_USERSPROG "USERSPROG_STD" // User defined save program name #define PAR_HISTCNT "HISTCOUNT_STD" // History item count #define PAR_HISTSAVE "HISTSAVE_STD" // History save mode #define PAR_HISTPLAN "HISTPLAN_STD" // History plan mode #define PAR_TOOLBAR "TOOLBAR_STD" // Toolbar activation flag #define PAR_TBPALPREF "TB_PALPREF_LAY"// Toolbar color table name prefix #define PAR_CHECKPVIS "NOPLCCHK_SCM" // SCM part $noplc consistency check #define PAR_AUTOSHRSCM "AUTOSHRINK_SCM"// Autoshrink element boundary classes #define PAR_AUTOSHRGED "AUTOSHRINK_GED"// Autoshrink element boundary classes #define PAR_SYMPINNCHK "SYMPINNCHK_SCM"// Symbol pin name check flag #define PAR_PRTPINNCHK "PRTPINNCHK_GED"// Layout pin name check flag #define PAR_SCMBATNAME "SCMSAVEBAT_SCM"// Schematic save batch name #define PAR_SYMBATNAME "SYMSAVEBAT_SCM"// Symbol save batch name #define PAR_LABBATNAME "LABSAVEBAT_SCM"// Label save batch name #define PAR_MRKBATNAME "MRKSAVEBAT_SCM"// Marker save batch name #define PAR_SLIBBAT "LIBBATCALL_SCM"// Schematic library batch call flag #define PAR_LAYBATNAME "LAYSAVEBAT_GED"// Layout save batch name #define PAR_PRTBATNAME "PRTSAVEBAT_GED"// Part save batch name #define PAR_STKBATNAME "STKSAVEBAT_GED"// Padstack save batch name #define PAR_PADBATNAME "PADSAVEBAT_GED"// Pad save batch name #define PAR_LLIBBAT "LIBBATCALL_GED"// Layout library batch call flag #define PAR_NETVISSAV "NETVISSAVE_LAY"// Net visibility save flag #define PAR_NETCOLSAV "NETCOLSAVE_LAY"// Net coloring save flag // Global design view variable name patterns #define GV_VIEW_FN "VIEW_FN" // File name variable name pattern #define GV_VIEW_CL "VIEW_CL" // DDB class variable name pattern #define GV_VIEW_EN "VIEW_EN" // Element name variable name pattern #define GV_VIEW_LX "VIEW_LX" // Lower X variable name pattern #define GV_VIEW_LY "VIEW_LY" // Lower Y variable name pattern #define GV_VIEW_UX "VIEW_UX" // Upper X variable name pattern #define GV_VIEW_UY "VIEW_UY" // Upper Y variable name pattern #define GV_VIEW_MD "VIEW_MD" // Mirror display variable name pattern #define GV_VIEW_CO "VIEW_CO" // Color table name var. name pattern #define GV_TB_ATTACH "tb_attach" // Toolbar attachment variable name #define GV_TB_DVN "tb_dvn" // Toolbar window count #define GV_SAVECALL "save_call" // Save call flag variable name #define VAR_EMDIM "scm_rv_md" // Element maximum dimension // SQL command definitions #define Z_CREATE0 "create table zoominfo (class integer,ename string," #define Z_CREATE1 "lx float,ly float,ux float,uy float);" #define Z_DELETE "delete from zoominfo where class=%d AND ename=%s;" #define Z_INSERT "insert into zoominfo values(%d,%s,%f,%f,%f,%f);" #define D_CREATE0 "create table dvninfo (class integer,ename string," #define D_CREATE1 "lx float,ly float,ux float,uy float,colname string," #define D_CREATE2 "view integer,fn string,en string,cl integer);" #define D_DELETEO "delete from dvinfo where class=%d AND ename=%s;" #define D_DELETE "delete from dvninfo where class=%d AND ename=%s;" #define D_INSERT1 "insert into dvninfo values(%d,%s,%f,%f,%f,%f," #define D_INSERT2 "%s,%d,%s,%s,%d);" #define T_CREATE0 "create table toolinfo (class integer,ename string," #define T_CREATE1 "attach integer);" #define T_DELETE "delete from toolinfo where class=%d AND ename=%s;" #define T_INSERT "insert into toolinfo values(%d,%s,%d);" #define H_CREATE0 "create table historyinfo (ptyp integer,class integer," #define H_CREATE1 "ename string,fname string,modidx integer);" #define H_DELETE "delete from historyinfo where ptyp=%d AND modidx=%d;" #define H_INSERT "insert into historyinfo values(%d,%d,%s,%s,%d);" #define H_SELECT1 "select class,ename,fname from historyinfo where " #define H_SELECT2 "ptyp=%d AND modidx=%d;" #define I_CREATE "create table historyindex (ptyp integer,sidx integer);" #define I_INSERT "insert into historyindex values(%d,%d);" #define I_DELETE "delete from historyindex where ptyp=%d;" #define I_SELECT "select sidx from historyindex where ptyp=%d;" #define C_CREATE0 "create table colprefix (class integer,ename string," #define C_CREATE1 "prefix string);" #define C_DELETE "delete from colprefix where class=%d AND ename=%s;" #define C_INSERT "insert into colprefix values(%d,%s,%s);" #define M_CREATE0 "create table modvarinfo (" #define M_CREATE1 "variant integer,modtype string,ename string);" #define M_DELETE "delete from modvarinfo where modtype=%s AND ename=%s;" #define M_INSERT "insert into modvarinfo values(%d,%s,%s);" string sqlcommand /* SQL command string */; // Global User Language program variables #define UL_SYMEDBAT "symedbat" // ULP: Symbol Edit Batch #define UL_LAYEDBAT "layedbat" // ULP: Layout Edit Batch #define UL_NETSTAT "netstat" // ULP: Net status Management // Globals static string usersprog = bae_inistrval(PAR_USERSPROG,"") /* User definied save prog. name */; static int histcnt = bae_iniintval(PAR_HISTCNT,32) /* History item count */; static int histsave = bae_iniintval(PAR_HISTSAVE,1) /* History save mode */; static int histplan = bae_iniintval(PAR_HISTPLAN,0) /* History plan mode */; static string BAEHISTDB = strgetconffilename(HISTVNAME,HISTFNAME,2); static string TBPALPREF = bae_inistrval(PAR_TBPALPREF,"toolbar") /* Toolbar color table name pattern */; static double wslx,wsly /* Workspace lower corner */; static double wsux,wsuy /* Workspace upper corner */; static int mirrdisp /* Mirror display mode */; static string coltname /* Color table name */; static string fname /* DDB file name */; static string ename /* DDB element name */; static string entname /* Info entry name */; static string hfname /* History last DDB file name */; static string hename /* History last DDB element name */; static int hddbcl = DDBCLUNDEF /* History last DDB class */; static int callertype=uliptype() /* Calling environment type */; static int histidx=(-1) /* History start index */; static int vddbcl /* View DDB class */; static int dstddbcl = bae_planddbclass() /* Destination DDB class */; static string dstfname = bae_plansfname() /* Destination DDB file name */; static string dstename = bae_plansename() /* Destination DDB element name */; #define CTOL 0.00000001 /* Coordinate tolerance */ // Main program void main() { string prompt /* Prompt string */; string batname /* Edit batch name */; int batmode /* Batch mode */; int tbattach /* Toolbar attachment mode */; int viewidx /* Design view index */; int palflag = 0 /* Color palette environment */; int varnum = 0 /* Active variant number */; int dvn /* Design view window count */; int autoshrink /* Autoshrink element bits */; double wscx,wscy /* Workspace middle point */; double wsxdim,wsydim /* Workspace dimensions */; // Abort if invalid plan class if (dstddbcl==DDBCLUNDEF) return; // Check if element is still expanded if (varget(VAR_EMDIM,0.0)==0) bae_msgbox(3,ERRROTEXP,""); // Check if extra user specific ULC program call requested if (usersprog!="") { varset(GV_SAVECALL,1); ulsystem(usersprog,0); vardelete(GV_SAVECALL); } // Perform the $noplc consistency check if (dstddbcl==DDBCLSCM && (bae_iniintval(PAR_CHECKPVIS,0)&1)!=0) { varset(GV_SAVECALL,1); ulsystem("scmpart:sl17",0); vardelete(GV_SAVECALL); } entname= callertype==ULIPSCM ? "[plan]" : dstddbcl==DDBCLLAY ? dstename : "[part]" ; // Init. database dbinit(); // Get entry name switch (callertype) { case ULIPSCM : autoshrink=bae_iniintval(PAR_AUTOSHRSCM,0); bae_getintpar(22,batmode); switch (dstddbcl) { case DDBCLSCM : // Query the current active variant if (cap_rulequery( 3,0,RS_SCMSUBJ,RS_VARIANT,"?d",varnum)<1) // Set default variant varnum=0; // Delete the old active variant entry sprintf(sqlcommand,M_DELETE, sql_quotestr("scm"),sql_quotestr(entname)); sqlcmd(dstfname,sqlcommand,NULL); // Insert the new active variant definition sprintf(sqlcommand,M_INSERT, varnum,sql_quotestr("scm"),sql_quotestr(entname)); sqlcmd(dstfname,sqlcommand,NULL); autoshrink= (autoshrink&1) ? 1 : 0 ; batname=bae_inistrval(PAR_SCMBATNAME,""); break; case DDBCLSSYM : autoshrink= (autoshrink&2) ? 1 : 0 ; batname=bae_inistrval(PAR_SYMBATNAME,""); break; case DDBCLSMRK : autoshrink= (autoshrink&4) ? 1 : 0 ; batname=bae_inistrval(PAR_MRKBATNAME,""); break; case DDBCLSLAB : autoshrink= (autoshrink&8) ? 1 : 0 ; batname=bae_inistrval(PAR_LABBATNAME,""); break; default : autoshrink=0; batname=""; } if (bae_iniintval(PAR_SLIBBAT,0)!=0 && libcmp(scm_deflibname(),bae_planfname())!=0) batname=""; if (batname!="") { if (batname[0]=='?') { batname=strextract(batname,1,strlen(batname)); sprintf(prompt,UPRBATCALL,batname); if (bae_msgboxverify(prompt,"")!=1) batname=""; } if (batname!="" && batmode==0) { bae_clriactqueue(); bae_storetextiact(1,"call"); bae_storetextiact(1,batname); ulsystem(UL_SYMEDBAT,0); } } if (autoshrink) { // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact( 1,bae_planwsnx(),bae_planwsny(),2,LMB); call(MNU_SCMPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact( 1,bae_planwsnx(),bae_planwsny(),2,LMB); call(MNU_SCMPARLBND); if (dstddbcl!=DDBCLSMRK) { // Ceil upper boundary to mm grid bae_clriactqueue(); bae_storemouseiact(1, ceil((bae_planwsux()-CTOL)*1000.0)/1000.0, ceil((bae_planwsuy()-CTOL)*1000.0)/1000.0, 0,LMB); call(MNU_SCMPARUBND); // Floor lower boundary to mm grid bae_clriactqueue(); bae_storemouseiact(1, floor((bae_planwslx()+CTOL)*1000.0)/1000.0, floor((bae_planwsly()+CTOL)*1000.0)/1000.0, 0,LMB); call(MNU_SCMPARLBND); } // Call the Zoom All command call(MNU_BAEZOOMALL); } if (!batmode && dstddbcl==DDBCLSSYM && bae_iniintval(PAR_SYMPINNCHK,1)!=0) spinchk(); break; case ULIPGED : autoshrink=bae_iniintval(PAR_AUTOSHRGED,0); bae_getintpar(22,batmode); switch (dstddbcl) { case DDBCLLAY : autoshrink= (autoshrink&1) ? 1 : 0 ; batname=bae_inistrval(PAR_LAYBATNAME,""); break; case DDBCLLPRT : autoshrink= (autoshrink&2) ? 1 : 0 ; batname=bae_inistrval(PAR_PRTBATNAME,""); break; case DDBCLLSTK : autoshrink= (autoshrink&4) ? 1 : 0 ; batname=bae_inistrval(PAR_STKBATNAME,""); break; case DDBCLLPAD : autoshrink= (autoshrink&8) ? 1 : 0 ; batname=bae_inistrval(PAR_PADBATNAME,""); break; default : autoshrink=0; batname=""; } if (bae_iniintval(PAR_LLIBBAT,0)!=0 && libcmp(lay_deflibname(),bae_planfname())!=0) batname=""; if (batname!="") { if (batname[0]=='?') { batname=strextract(batname,1,strlen(batname)); sprintf(prompt,UPRBATCALL,batname); if (bae_msgboxverify(prompt,"")!=1) batname=""; } if (batname!="" && batmode==0) { bae_clriactqueue(); bae_storetextiact(1,"call"); bae_storetextiact(1,batname); ulsystem(UL_LAYEDBAT,0); } } if (autoshrink) { // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact( 1,bae_planwsnx(),bae_planwsny(),2,LMB); call(MNU_GEDPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact( 1,bae_planwsnx(),bae_planwsny(),2,LMB); call(MNU_GEDPARLBND); // Call the Zoom All command call(MNU_BAEZOOMALL); } if (!batmode && dstddbcl==DDBCLLPRT && bae_iniintval(PAR_PRTPINNCHK,1)!=0) lpinchk(); case ULIPAR : case ULIPCAM : palflag=1; if (dstddbcl==DDBCLLAY) { // Query the current active variant if (lay_rulequery( 0,0,RS_PCBSUBJ,RS_VARIANT,"?d",varnum)<1) // Set default variant varnum=0; // Delete the old active variant entry sprintf(sqlcommand,M_DELETE, sql_quotestr("lay"),sql_quotestr(entname)); sqlcmd(dstfname,sqlcommand,NULL); // Insert the new active variant definition sprintf(sqlcommand,M_INSERT, varnum,sql_quotestr("lay"),sql_quotestr(entname)); sqlcmd(dstfname,sqlcommand,NULL); } // Set history caller type if (callertype&ULIPLAY) callertype=ULIPGED; break; case ULIPCV : default : return; } // Check if net visibility/coloring save if (dstddbcl==DDBCLLAY) { if (callertype==ULIPGED) { if (bae_iniintval(PAR_NETCOLSAV,0)) { bae_clriactqueue(); bae_storemenuiact(1,1,LMB); bae_storetextiact(1,dstfname); bae_storetextiact(1,dstename); ulsystem(UL_NETSTAT,0); } if (bae_iniintval(PAR_NETVISSAV,0)) { bae_clriactqueue(); bae_storemenuiact(1,4,LMB); bae_storetextiact(1,dstfname); bae_storetextiact(1,dstename); ulsystem(UL_NETSTAT,0); } } else if (callertype==ULIPAR) { if (bae_iniintval(PAR_NETVISSAV,0)) { bae_clriactqueue(); bae_storemenuiact(1,1,LMB); bae_storetextiact(1,dstfname); bae_storetextiact(1,dstename); ulsystem(UL_NETSTAT,0); } } } // Store current zoom window wslx=bae_wswinlx(); wsly=bae_wswinly(); wsux=bae_wswinux(); wsuy=bae_wswinuy(); // Get the window center point wscx=0.5*(wslx+wsux); wscy=0.5*(wsly+wsuy); // Get the workspace dimensions wsxdim=wsux-wslx; wsydim=wsuy-wsly; // Do some zoom reduction wsxdim*=0.95; wsydim*=0.95; // Ajust the workspace size wslx=wscx-0.5*wsxdim; wsux=wscx+0.5*wsxdim; wsly=wscy-0.5*wsydim; wsuy=wscy+0.5*wsydim; // Store the current zoom window sprintf(sqlcommand,Z_INSERT,dstddbcl,sql_quotestr(dstename), wslx,wsly,wsux,wsuy); if (sqlcmd(dstfname,sqlcommand,NULL)) sql_dberror(0); if (palflag) { // Store the current color table prefix sprintf(sqlcommand,C_INSERT,dstddbcl, sql_quotestr(dstename),sql_quotestr(TBPALPREF)); if (sqlcmd(dstfname,sqlcommand,NULL)) sql_dberror(0); } // Store the toolbar attachment mode if (bae_iniintval(PAR_TOOLBAR,1)!=2 && varget(GV_TB_ATTACH,tbattach)==0) { sprintf(sqlcommand,T_INSERT,dstddbcl, sql_quotestr(entname),tbattach); if (sqlcmd(dstfname,sqlcommand,NULL)) sql_dberror(0); } // Get the design view zoom window count if (varget(GV_TB_DVN,dvn)) dvn=0; // Loop for all zoom windows for (viewidx=0;viewidx0 && histsave && (!histplan || dstddbcl==DDBCLSCM || dstddbcl==DDBCLLAY || dstddbcl==DDBCLILAY)) { // Get the history index sprintf(sqlcommand,I_SELECT,callertype); sqlcmd(BAEHISTDB,sqlcommand,idxselfunc); sprintf(sqlcommand,H_SELECT1+H_SELECT2,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,histselfunc); if (dstddbcl==hddbcl && dstename==hename && dstfname==hfname) exit(0); // Delete last index sprintf(sqlcommand,I_DELETE,callertype); sqlcmd(BAEHISTDB,sqlcommand,NULL); // Store data to next index histidx++; if (histidx>=histcnt) histidx=0; sprintf(sqlcommand,I_INSERT,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); // Delete last index data sprintf(sqlcommand,H_DELETE,callertype,histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); sprintf(sqlcommand,H_INSERT,callertype,dstddbcl, sql_quotestr(dstename),sql_quotestr(dstfname),histidx); sqlcmd(BAEHISTDB,sqlcommand,NULL); } } int viewgetwsdata(int viewidx) /* // Get the design view workspace data // Return value : // zero if done or (-1) on variable access error // Parameters : // int viewidx : Design view index */ { string viewid = itoa(viewidx) /* Design view id */; // Get the design view workspace data variables if (varget(GV_VIEW_FN+viewid,fname) || varget(GV_VIEW_CL+viewid,vddbcl) || varget(GV_VIEW_EN+viewid,ename) || varget(GV_VIEW_LX+viewid,wslx) || varget(GV_VIEW_LY+viewid,wsly) || varget(GV_VIEW_UX+viewid,wsux) || varget(GV_VIEW_UY+viewid,wsuy) || wsuy<=wsly || wsux<=wslx) // Data query failed return(-1); // Check if save as of current element if (vddbcl==dstddbcl && ename==bae_planename() && fname==bae_planfname()) { // Set destination names fname=dstfname; ename=dstename; } // Check if destination file element if (fname==dstfname) fname="*"; // Color table not always available. Ignore errors. coltname=""; varget(GV_VIEW_CO+viewid,coltname); // Mirrored display not always available. Ignore errors. mirrdisp=0; varget(GV_VIEW_MD+viewid,mirrdisp); // Done return(0); } void dbinit() /* // Initialize databases */ { string msg /* Message buffer */; if (callertype==ULIPCV) return; // Create database file if (sqlinit(dstfname,1)==(-1)) { // SQL/DB creation error sprintf(msg,ERRDBCREA,dstfname); bae_msgbox(2,msg,""); } // Create zoom window info table in database sprintf(sqlcommand,Z_CREATE0+Z_CREATE1); if (sqlcmd(dstfname,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create design view data table in database sprintf(sqlcommand,D_CREATE0+D_CREATE1+D_CREATE2); if (sqlcmd(dstfname,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create toolbar attachment data table in database sprintf(sqlcommand,T_CREATE0+T_CREATE1); if (sqlcmd(dstfname,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create color prefix info table in database sprintf(sqlcommand,C_CREATE0+C_CREATE1); if (sqlcmd(dstfname,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create active variant info table in database sprintf(sqlcommand,M_CREATE0+M_CREATE1); if (sqlcmd(dstfname,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Delete old element entries sprintf(sqlcommand,Z_DELETE,dstddbcl,sql_quotestr(dstename)); sqlcmd(dstfname,sqlcommand,NULL); sprintf(sqlcommand,D_DELETE,dstddbcl,sql_quotestr(dstename)); sqlcmd(dstfname,sqlcommand,NULL); sprintf(sqlcommand,D_DELETEO,dstddbcl,sql_quotestr(dstename)); sqlcmd(dstfname,sqlcommand,NULL); sprintf(sqlcommand,T_DELETE,dstddbcl,sql_quotestr(entname)); sqlcmd(dstfname,sqlcommand,NULL); sprintf(sqlcommand,C_DELETE,dstddbcl,sql_quotestr(dstename)); sqlcmd(dstfname,sqlcommand,NULL); // Create/init history database file if (sqlinit(BAEHISTDB,0)==(-1) && sqlinit(BAEHISTDB,1)==(-1)) { // SQL/DB creation error sprintf(msg,ERRDBCREA,BAEHISTDB); bae_msgbox(2,msg,""); } // Create history start index table in database if (sqlcmd(BAEHISTDB,I_CREATE,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); // Create history data table in database sprintf(sqlcommand,H_CREATE0+H_CREATE1); if (sqlcmd(BAEHISTDB,sqlcommand,NULL)) // SQL/DB error (ignore table already defined error) sql_dberror(25); } static int idxselfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Macro selection 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 */ { histidx=dint; // Return without errors return(0); } static int histselfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // History data selection 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 */ { // Store the current entry switch (didx) { // Class case 1 : hddbcl=dint; break; // Element name case 2 : hename=dstr; break; // File name case 3 : hfname=dstr; break; } // Return without errors return(0); } static int libcmp(string fn1,string fn2) /* // Library file name compare function // Return value : // zero if equal file, else one // Parameters : // string fn1 : 1st library file name // string fn2 : 2nd library file name */ { string cn1, cn2 /* Compare names */; int i /* Loop control variable */; // Expand environment variables in file names cn1=strgetvarfilename(fn1); catextadv(cn1,DDBEXT,0); for (i=strlen(cn1)-1;i>=0;i--) if (cn1[i]=='\\') cn1[i]='/'; cn2=strgetvarfilename(fn2); catextadv(cn2,DDBEXT,0); for (i=strlen(cn2)-1;i>=0;i--) if (cn2[i]=='\\') cn2[i]='/'; if (bae_swconfig(3)==BAE_WinStd || bae_swconfig(3)==BAE_WinPulldwn) { strlower(cn1); strlower(cn2); } return(cn1==cn2 ? 0 : 1); } void spinchk() /* // Check symbol pin names */ { index C_NREF nref /* Named reference index */; // Build pin name list bae_nameclr(); forall (nref where nref.MACRO.CLASS!=DDBCLSLAB) bae_nameadd(nref.NAME,"","","",2); // Check pin name list pinchk(); } void lpinchk() /* // Check part pin names */ { index L_NREF nref /* Named reference index */; // Build pin name list bae_nameclr(); forall (nref) bae_nameadd(nref.NAME,"","","",2); // Check pin name list pinchk(); } void pinchk() /* // Check pin names */ { string msg /* Message buffer */; string curname /* Current pin name */; string lastname /* Last pin name */; int clen, llen /* String length values */; int cnum, lnum /* Compare numbers */; int cidx, lidx /* Compare index values */; int idx = 1 /* Name list index */; if (bae_nameget(0,lastname,"","","",0)) return; while (bae_nameget(idx,curname,"","","",0)==0) { clen=strlen(curname); llen=strlen(lastname); if (isdigit(curname[clen-1]) && isdigit(lastname[llen-1])) { for (cidx=clen-2;cidx>=0;cidx--) if (!isdigit(curname[cidx])) break; for (lidx=llen-2;lidx>=0;lidx--) if (!isdigit(lastname[lidx])) break; if (lidx==cidx && (lidx<0 || strextract( curname,0,cidx)==strextract(lastname,0,lidx))) { cnum=atoi(strextract(curname,cidx+1,clen)); lnum=atoi(strextract(lastname,lidx+1,llen)); if (cnum!=(lnum+1)) { sprintf(msg,REPNUMGAP,lastname,curname); bae_msgbox(1,msg,""); return; } } } lastname=curname; idx++; } } // User Language program end