/* BAE_NEW (STD) -- BAE New Element Action */ /* BAE_NEW (STD) -- BAE Neues Element-Aktion */ /* -- EXECUTED AFTER CREATING SOME BAE ELEMENT -- */ /* // Copyright (c) 2003-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 (091104) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (070524) ENHANCEMENT: // Added dynamic element boundary set option. // rl (060829) RELEASED FOR BAE V6.8. // rl (051128) ENHANCEMENT: // Added first page header group name extension support. // rl (050906) RELEASED FOR BAE V6.6. // rl (050330) ENHANCEMENT: // Added various schematic macro settings. // rl (040811) RELEASED FOR BAE V6.4. // rl (031216) ORIGINAL CODING: // // DESCRIPTION // // The bae_new User Language program is automatically activated // after creating an element. bae_new sets default parameters // for the new element. */ // Includes #include "baeparam.ulh" // User Language BAE param. access #include "scm.ulh" // User Language SCM utilities #include "lay.ulh" // User Language layout utilities // Enforce editor caller type #pragma ULCALLEREDT // INI file parameter name definitions #define PAR_USERNPROG "USERNPROG_STD" // User defined new program name #define PAR_DEFBUSDISP "DEFBUSDISP_SCM"// Default bus display mode #define PAR_DEFSYMNUM "DEFSYMNUM_SCM" // Default symbol numbering mode #define PAR_DEFSYMTMM "DEFSYMTMM_SCM" // Default symbol text move mode #define PAR_DEFTXTCDIS "DEFTXTCDIS_SCM"// Default text class disable mask #define PAR_CONSPLIT "CONSPLIT_SCM" // Connection split mode #define PAR_SCONSPLIT "SCONSPLIT_SCM" // Symbol connection split mode #define PAR_DEFCONMODE "DEFCONMODE_SCM"// Default connectivity mode #define PAR_DEFBUSTMODE "DEFBUSTMODE_SCM"// Default bus tap mode #define PAR_DEFPINDRC "DEFPINDRC_SCM" // Default pin DRC mode #define PAR_DEFPINPLT "DEFPINPLT_SCM" // Default pin marker plot mode #define PAR_DEFSIGROUTE "DEFSIGROUT_SCM"// Default signal router mode #define PAR_DEFSIGGROUT "DEFSIGGROUT_SCM"// Default signal group router mode #define PAR_UNROUTELINE "UNROUTELINE_SCM"// Unroute line draw mode #define PAR_CSEGMOVM "CSEGMOVM_SCM" // Connection segment move mode #define PAR_SCMDEFLIB "DEFLIB_SCM" // Default schematic library #define PAR_SCMDEFPIN "DEFPINMAC_SCM" // Default pin marker macro #define PAR_SCMDEFJCT "DEFJCTMAC_SCM" // Default junction marker macro #define PAR_SCMDEFLAB "DEFLABMAC_SCM" // Default standard label macro #define PAR_SCMDEFTAP "DEFTAPMAC_SCM" // Default bus tap label macro #define PAR_DEFDYNBSCM "DEFDYNBOUND_SCM"// Default dyn. elem. boundary classes #define PAR_PLTAUTOROT "PLTAUTOROT_SCM"// Automatic plot rotation flag #define PAR_PLTPXOFF "PLTPXOFF_SCM" // Portrait plan x offset #define PAR_PLTPYOFF "PLTPYOFF_SCM" // Portrait plan y offset #define PAR_PLTLXOFF "PLTLXOFF_SCM" // Landscape plan x offset #define PAR_PLTLYOFF "PLTLYOFF_SCM" // Landscape plan y offset #define PAR_SCMHEADLIB "SCMHEADLIB_SCM"// Plan header library #define PAR_SCMHEADA0P "SCMHEADA0P_SCM"// A0 portrait plan header name #define PAR_SCMHEADA0L "SCMHEADA0L_SCM"// A0 landscape plan header name #define PAR_SCMHEADA1P "SCMHEADA1P_SCM"// A1 portrait plan header name #define PAR_SCMHEADA1L "SCMHEADA1L_SCM"// A1 landscape plan header name #define PAR_SCMHEADA2P "SCMHEADA2P_SCM"// A2 portrait plan header name #define PAR_SCMHEADA2L "SCMHEADA2L_SCM"// A2 landscape plan header name #define PAR_SCMHEADA3P "SCMHEADA3P_SCM"// A3 portrait plan header name #define PAR_SCMHEADA3L "SCMHEADA3L_SCM"// A3 landscape plan header name #define PAR_SCMHEADA4P "SCMHEADA4P_SCM"// A4 portrait plan header name #define PAR_SCMHEADA4L "SCMHEADA4L_SCM"// A4 landscape plan header name #define PAR_SCMHEADLP "SCMHEADLP_SCM" // Letter portrait plan header name #define PAR_SCMHEADLL "SCMHEADLL_SCM" // Letter landscape plan header name #define PAR_SCMHEADTP "SCMHEADTP_SCM" // Tabloid portrait plan header name #define PAR_SCMHEADTL "SCMHEADTL_SCM" // Tabloid landscape plan header name #define PAR_SCMHEAD1ST "SCMHEAD1ST_SCM"// Header first plan name extension #define PAR_DEFVIA "DEFVIA_GED" // Default layout via name #define PAR_DEFTRCDISP "DEFTRCDISP_GED"// Default trace edit display mode #define PAR_DEFVIACRNG "DEFVIACRNG_GED"// Default via check range #define PAR_DEFBRDMODE "DEFBRDMODE_GED"// Default board outline check mode #define PAR_DEFBRDENL "DEFBRDENL_GED" // Default board outline enlargement #define PAR_DEFDYNBGED "DEFDYNBOUND_GED"// Default dyn. elem. boundary classes #define PAR_DEFLIBDRC "DEFLIBDRC_GED" // Default library DRC mode // Globals static string usernprog = bae_inistrval(PAR_USERNPROG,"") /* User definied new prog. name */; static int ddbcl = bae_planddbclass() /* DDB class */; #define UL_CEDSETUP "cedsetup" // CED startup setup program #define UL_GEDSETUP "gedsetup" // GED startup setup program #define UL_SCMSETUP "scmsetup" // SCM startup setup program #define SMALLVAL 0.0000001 // Small compare value #define A0W 0.841 // A0 paper width #define A0H 1.189 // A0 paper height #define A1W 0.594 // A1 paper width #define A1H 0.841 // A1 paper height #define A2W 0.420 // A2 paper width #define A2H 0.594 // A2 paper height #define A3W 0.297 // A3 paper width #define A3H 0.420 // A3 paper height #define A4W 0.210 // A4 paper width #define A4H 0.297 // A4 paper height #define LW 0.2159 // Letter paper width #define LH 0.2794 // Letter paper height #define TW 0.2794 // Tabloid paper width #define TH 0.4318 // Tabloid paper height #define ELIMVXRNG 0.35 // Workspace x-dir. economy limit #define ELIMVYRNG 0.2 // Workspace y-dir. economy limit #define LLIMVXRNG 0.18 // Workspace x-dir. light limit #define LLIMVYRNG 0.12 // Workspace y-dir. light limit // Main program void main() { // Test the interpreter type switch (uliptype()) { /* SCM */ case ULIPSCM : new_scm(); break; /* GED */ case ULIPGED : new_ged(); break; /* CED */ case ULIPCED : new_ced(); break; // Ignore on default default : break; } // Check if extra user specific ULC program call requested if (usernprog!="") ulsystem(usernprog,0); } void new_scm() /* // Set default parameters of new schematic element */ { string libdir /* Library directory name */; string libname /* Plan header library name */; string macname /* Macro name */; string headgrp = "" /* Header group name */; string headext = "" /* Header group name extension */; int pn = 0 /* Plan count */; string grulel[] /* Global rule list */; int grulen = 0 /* Global rule count */; string prulel[] /* Plan rule list */; int prulen = 0 /* Plan rule count */; int symnum /* Symbol numbering mode */; int txtclassdis /* Text class disable mask */; int conmode /* Connectivity mode */; int bustapmode /* Bus tap mode */; int oldwarnmode /* Old warning mode */; int dynbound = bae_iniintval(PAR_DEFDYNBSCM,0) /* Dynamic boundary bits */; double xoff, yoff /* Plan origin offset */; double w /* Plan width */; double h /* Plan height */; int grpldis /* Group load disable */; int i /* Loop control variable */; // Check the requested library name bae_clriactqueue(); if ((libname=bae_inistrval(PAR_SCMDEFLIB,""))=="") // Use library defined in setup libname=scm_deflibname(); bae_storetextiact(1,libname); bae_callmenu(MNU_SCMPARSLIB); // Set the symbol text move mode scm_setintpar(2,bae_iniintval(PAR_DEFSYMTMM,0)); // Check the element class switch (ddbcl) { // Schematic sheet case DDBCLSCM : // Check the standard label name if ((macname=bae_inistrval(PAR_SCMDEFLAB,""))!="") { bae_storetextiact(1,macname); bae_callmenu(809); } // Check the bus tap label name if ((macname=bae_inistrval(PAR_SCMDEFTAP,""))!="") { bae_storetextiact(1,macname); bae_callmenu(810); } // Check the junction marker name if ((macname=bae_inistrval(PAR_SCMDEFJCT,""))!="") { bae_storetextiact(1,macname); bae_callmenu(805); } if (bae_iniintval(PAR_DEFBUSDISP,0)!=0) { grulel[grulen]="scm_bus_fill"; grulen++; } if ((symnum=bae_iniintval(PAR_DEFSYMNUM,-1))!=(-1)) { sprintf(prulel[prulen],":%s:%s=%d;", RS_SCMSUBJ,RS_SYMSTART,symnum); prulen++; } if ((txtclassdis=bae_iniintval(PAR_DEFTXTCDIS,0))!=0) { sprintf(grulel[grulen],":%s:%s=%d;", RS_SCMSUBJ,RS_TXTCDIS,txtclassdis); grulen++; } if (bae_iniintval(PAR_DEFPINDRC,0)!=0) { grulel[grulen]="scm_pin_drc"; grulen++; } if ((conmode=bae_iniintval(PAR_DEFCONMODE,0))!=0) { sprintf(grulel[grulen],":%s:%s=%d;", RS_SCMSUBJ,RS_CONMODE,conmode); grulen++; } scm_setintpar(41,bae_iniintval(PAR_CONSPLIT,0)); scm_setintpar(42,bae_iniintval(PAR_SCONSPLIT,0)); if ((bustapmode=bae_iniintval(PAR_DEFBUSTMODE,3))!=3) { sprintf(grulel[grulen],":%s:%s=%d;", RS_SCMSUBJ,RS_BUSTAPMODE,bustapmode); grulen++; } if (bae_iniintval(PAR_DEFPINPLT,0)!=0) { grulel[grulen]="scm_pin_marker_plot"; grulen++; } if (grulen) // Attach rule(s) cap_ruleplanatt(grulel,1); if (prulen) // Attach rule(s) cap_ruleplanatt(prulel,0); // Set the signal router mode scm_setintpar(1,bae_iniintval(PAR_DEFSIGROUTE,1)); // Set the signal router group mode scm_setintpar(17,bae_iniintval(PAR_DEFSIGGROUT,1)); // Set the signal router unroute line draw mode scm_setintpar(36,bae_iniintval(PAR_UNROUTELINE,0)); // Set the connection segment move mode scm_setintpar(29,bae_iniintval(PAR_CSEGMOVM,0)); // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x01) ? 1 : 0); // Check if automatic plot orientation change if (bae_iniintval(PAR_PLTAUTOROT,1)) { bae_clriactqueue(); bae_storemenuiact(1,2,LMB); bae_callmenu(MNU_SCMPLTROT); } else { // Reset plot rotation bae_clriactqueue(); bae_storemenuiact(1,0,LMB); bae_callmenu(MNU_SCMPLTROT); } // Get plan size w=bae_planwsux()-bae_planwslx(); h=bae_planwsuy()-bae_planwsly(); if (w>h) { // Use landscape origin offset xoff=bae_inidblval(PAR_PLTLXOFF,0.018); yoff=bae_inidblval(PAR_PLTLYOFF,0.018); } else { // Use portrait origin offset xoff=bae_inidblval(PAR_PLTPXOFF,0.018); yoff=bae_inidblval(PAR_PLTPYOFF,0.018); } // Set plan origin if (bae_planwsnx()==bae_planwslx() && bae_planwsny()==bae_planwsly() && xoff>=bae_planwslx() && xoff<=bae_planwsux() && yoff>=bae_planwsly() && yoff<=bae_planwsuy()) { bae_clriactqueue(); bae_storemouseiact(1,xoff,yoff,2,LMB); call(MNU_SCMPARORIG); } ulsystem(UL_SCMSETUP,0); if (varget(VAR_GROUPLDIS,grpldis)!=0) grpldis=0; // Check if automatic plan header import if (grpldis || (libname=bae_inistrval(PAR_SCMHEADLIB,"stdsym"))=="") break; // Check standard paper sizes if (fabs(w-A0W)<=SMALLVAL && fabs(h-A0H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA0P,"a0p"); else if (fabs(h-A0W)<=SMALLVAL && fabs(w-A0H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA0L,"a0l"); else if (fabs(w-A1W)<=SMALLVAL && fabs(h-A1H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA1P,"a1p"); else if (fabs(h-A1W)<=SMALLVAL && fabs(w-A1H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA1L,"a1l"); else if (fabs(w-A2W)<=SMALLVAL && fabs(h-A2H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA2P,"a2p"); else if (fabs(h-A2W)<=SMALLVAL && fabs(w-A2H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA2L,"a2l"); else if (fabs(w-A3W)<=SMALLVAL && fabs(h-A3H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA3P,"a3p"); else if (fabs(h-A3W)<=SMALLVAL && fabs(w-A3H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA3L,"a3l"); else if (fabs(w-A4W)<=SMALLVAL && fabs(h-A4H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA4P,"a4p"); else if (fabs(h-A4W)<=SMALLVAL && fabs(w-A4H)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADA4L,"a4l"); else if (fabs(w-LW)<=SMALLVAL && fabs(h-LH)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADLP,"letterp"); else if (fabs(h-LW)<=SMALLVAL && fabs(w-LH)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADLL,"letterl"); else if (fabs(w-TW)<=SMALLVAL && fabs(h-TH)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADTP,"tabloidp"); else if (fabs(h-TW)<=SMALLVAL && fabs(w-TH)<=SMALLVAL) headgrp=bae_inistrval(PAR_SCMHEADTL,"tabloidl"); // Check if plan header group name found if (headgrp=="") break; // Check if front page name extension if ((headext=bae_inistrval(PAR_SCMHEAD1ST,""))!="") { macname=""; while (scanddbenames( bae_planfname(),DDBCLSCM,macname)==1) { pn++; if (pn>1) break; } if (pn<=1) headgrp+=headext; } // Get the standard library path if ((libdir=strgetvarfilename(scm_deflibname()))=="") libdir=bae_planfname(); for (i=strlen(libdir)-1;i>=0;i--) if (libdir[i]=='/' || libdir[i]=='\\') { libdir[i+1]='\0'; break; } libname=libdir+libname+DDBEXT; if (!existddbelem(libname,DDBCLSCM,headgrp)) break; // Disable symbole rename warnings scm_getintpar(7,oldwarnmode); scm_setintpar(7,oldwarnmode|0x08); bae_clriactqueue(); bae_storetextiact(1,libname); bae_storetextiact(1,headgrp); bae_storemouseiact(1,bae_planwsnx(),bae_planwsny(),2,LMB); bae_callmenu(MNU_SCMLOADGRP); bae_callmenu(MNU_SCMGRPRESE); scm_setintpar(7,oldwarnmode); break; // Schematic symbol case DDBCLSSYM : // Check the pin marker name if ((macname=bae_inistrval(PAR_SCMDEFPIN,""))!="") { bae_storetextiact(1,macname); bae_callmenu(806); } // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x02) ? 1 : 0); break; // Schematic marker case DDBCLSMRK : // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x04) ? 1 : 0); break; // Schematic label case DDBCLSLAB : // Check the pin marker name if ((macname=bae_inistrval(PAR_SCMDEFPIN,""))!="") { bae_storetextiact(1,macname); bae_callmenu(806); } // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x08) ? 1 : 0); break; default : ; } // Done } void new_ged() /* // Set default parameters of new layout element */ { string vianame /* Default via name */; string rulel[] /* Rule list */; int rulen = 0 /* Rule count */; int trcdisp /* Trace display mode */; int viachkrng /* Via check range */; int dynbound = bae_iniintval(PAR_DEFDYNBGED,0) /* Dynamic boundary bits */; double bel /* Boundary enlarge size */; switch (ddbcl) { // Layout case DDBCLLAY : if ((trcdisp=bae_iniintval(PAR_DEFTRCDISP,4))!=0) { sprintf(rulel[rulen],":%s:%s=%d;", RS_PCBSUBJ,RS_EDITWIDE,trcdisp); rulen++; } if ((viachkrng=bae_iniintval(PAR_DEFVIACRNG,0))!=0) { sprintf(rulel[rulen],":%s:%s=%d;", RS_PCBSUBJ,RS_VIACHKRANGE,viachkrng); rulen++; } if (rulen) // Attach rule(s) lay_ruleplanatt(rulel); if ((vianame=bae_inistrval(PAR_DEFVIA,""))!="") { bae_clriactqueue(); if (vianame!="?" && (ddbcheck(bae_planfname(),DDBCLLSTK,vianame)==0 || ddbcheck(lay_libfname(),DDBCLLSTK,vianame)==0)) { bae_storetextiact(1,vianame); bae_storetextiact(1,""); } call(MNU_GEDSELVIA); } // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x01) ? 1 : 0); if (bae_iniintval(PAR_DEFBRDMODE,1)) { bae_clearpoints(); bae_storepoint(bae_planwslx(),bae_planwsly(),0); bae_storepoint(bae_planwsux(),bae_planwsly(),0); bae_storepoint(bae_planwsux(),bae_planwsuy(),0); bae_storepoint(bae_planwslx(),bae_planwsuy(),0); ged_storepoly(-2,L_POLYBRDOUT,"",0); if ((bel=bae_inidblval(PAR_DEFBRDENL,0.00635))>0.0) { // Check if Light version restriction if (bae_swconfig(4) && ((bae_planwsux()-bae_planwslx()+ 2.0*bel)>=LLIMVXRNG || (bae_planwsuy()-bae_planwsly()+ 2.0*bel)>=LLIMVYRNG)) // Resize would violate size limit break; // Check if Economy version restriction if (bae_swconfig(2) && ((bae_planwsux()-bae_planwslx()+ 2.0*bel)>=ELIMVXRNG || (bae_planwsuy()-bae_planwsly()+ 2.0*bel)>=ELIMVYRNG)) // Resize would violate size limit break; baewsresize(bel,1); } } ged_setintpar(6,bae_iniintval(PAR_DEFLIBDRC,0)); break; // Layout part case DDBCLLPRT : // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x02) ? 1 : 0); break; // Layout padstack case DDBCLLSTK : // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x04) ? 1 : 0); break; // Layout padstack case DDBCLLPAD : // Set dynamic element boundaries bae_setintpar(0,(dynbound&0x08) ? 1 : 0); break; default : ; } ulsystem(UL_GEDSETUP,0); // Done } void new_ced() /* // Set default parameters of new chip element */ { ulsystem(UL_CEDSETUP,0); // Done } // User Language program end