/* LBROWSE (LAY) -- Layout Part Browser */ /* LBROWSE (LAY) -- Layoutbauteilbrowser */ /* // Copyright (c) 1997-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (110329) ENHANCEMENT: // Added reference display option. // rl (101019) RELEASED FOR BAE V7.6. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080221) ENHANCEMENT: // Changed to permanent symbol list/preview dialog box. // rl (071029) RELEASED FOR BAE V7.0. // rl (070430) BUGFIX: // Fixed problems with invalid part name input. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (050419) ENHANCEMENT: // Added autoskip to last browsed element. // rl (040811) RELEASED FOR BAE V6.4. // rl (040510) ENHANCEMENT: // Added previous and next symbol buttons to dialog box. // rl (030904) RELEASED FOR BAE V6.2. // rl (030326) ENHANCEMENT: // Added dialog box support. // rl (021209) RELEASED FOR BAE V6.0. // rl (021112) BUGFIX: // Fixed erroneous outline plot of split power plane // full isolation areas. // rl (020618) RELEASED FOR BAE V5.4. // rl (010625) RELEASED FOR BAE V5.0. // rl (010602) BUGFIX: // Fixed problem with disabled place and load buttons. // rl (010320) ENHANCEMENT: // Added optional parameter settings from bae.ini file. // rl (000509) RELEASED FOR BAE V4.6. // rl (991126) RELEASED FOR BAE V4.4. // mb (981008) RELEASED FOR BAE V4.2. // mb (981008) IMPROVEMENT: // Provided two-line symbol popup header for library/symbol. // Symbol popup buttons modified and rearranged. // Symbol popup width to match required buttons space. // mb (980805) ENHANCEMENT: // Part place button disabled if part already defined in current // DDB file. // mb (980711) ENHANCEMENT: // Dynamic multi-language support introduced. // mb (980531) CHANGE: // Inline documentation changed to indicate LAY // compatibility. ged.ulh include directive removed. // rl (971118) ORIGINAL CODING. // // DESCRIPTION // // The lbrowse User Language program is a graphical layout // symbol browser. */ // Includes #include "pop.ulh" // User Language popup utilities #include "popdraw.ulh" // User Language popup draw. util. #include "baeparam.ulh" // User Language BAE param. access #include "lay.ulh" // User Language layout utilities // Enforce layout caller type #pragma ULCALLERLAY // Disable undo state request #pragma ULCALLERNOUNDO // INI file parameter name definitions #define PAR_DISPTEXT "DISPTEXT_LAY" // Display text flag #define PAR_BRWWIDTH "BRWDISPW_LAY" // Part browse bitmap width #define PAR_BRWHEIGHT "BRWDISPH_LAY" // Part browse bitmap height #define PAR_LSTHEIGHT "BRWLISTH_LAY" // Part browse listbox height #define PAR_ESELREF "ESELREF_STD" // Element selection ref. display mode // Messages string UPRASKFCT = M("Function selektieren!","Select function!"); string UPRASKREF = M("Bauteilname ? ","Part Name ? "); string UPRASKBASE = M("Basisname :","Base Name :"); string UPRASKSYM = M("Bibliotheksbauteil in '%s' ? ", "Library Part Name in '%s' ? "); string UPRPARTLIB = M("Bauteilbrowser","Part Browser"); string UPRPOPNLIB = M("[Library]","[Library]"); string UPRPOPNPART = M("[Bauteil]","[Part]"); string UPRPOPPLACE = M("[Platzieren]","[Place]"); string UPRPOPLOAD = M("[Laden]","[Load]"); string UPRPOPPREV = M("[<]","[<]"); string UPRPOPNEXT = M("[>]","[>]"); string UPRDNLIB = M("Li&brary","Li&brary"); string UPRDPLACE = M("&Platzieren","&Place"); string UPRDLOAD = M("&Laden","&Load"); string UPRPATTERN = M("&Muster","&Pattern"); string UPRREF = M("&Referenzen","&References"); string UPRPARTDEL = M("Bauteil '%s' bereits vorhanden. Bauteil loeschen ?", "Part name conflict. Delete old part '%s' ?"); string REPDIRCONT = M("Bibliotheksverzeichnis :","Library Files :"); string REPLIB = M("Library '%s'","Library '%s'"); string REPPART = M("Bauteil '%s'","Part '%s'"); string REPLIBPART = M("%s / %s","%s / %s"); string REPLIBN = M("%s","%s"); string REPNOPART = M("Bibliothek '%s' enthaelt keine Bauteile!", "Library '%s' doesn't contain parts!"); string ERRPARTLOAD = M("Bauteil '%s' konnte nicht aus '%s' geladen werden!", "Error loading part '%s'/'%s'!"); string ERRNOLIBS = M("Keine Bauteilbibliothek in Verzeichnis '%s' gefunden!", "Library directory '%s' contains no part library files!"); string ERRNOLIBS2 = M(" Hauptmenue Setup falsche Bibliotheksangabe?", " Main Menu Setup library specification invalid?"); string ERRDBLLBRW = M("Bauteilbrowser ist bereits aktiv!", "Part browser already active!"); int reqcol = // Required popup columns count strlen(UPRPOPNLIB)+1+strlen(UPRPOPNPART)+1+ maxint(strlen(UPRPOPLOAD),strlen(UPRPOPPLACE))+1; // Global definitions int DISPTEXT = bae_iniintval(PAR_DISPTEXT,1) /* Text display mode */; double PICLABWIDTH = bae_inidblval(PAR_BRWWIDTH,30.0) /* Browse display width */; double PICLABHEIGHT = bae_inidblval(PAR_BRWHEIGHT,8.0) /* Browse display height */; double LISTBHEIGHT = bae_inidblval(PAR_LSTHEIGHT,6.0) /* Browse listbox height */; #define UINPOPPLACE "place" // Place command #define UINPOPLOAD "load" // Load command #define UINPOPNPART "newprt" // New part command #define UINPOPNLIB "newlib" // New library command #define UINPOPNEXT "next" // Next symbol command #define UINPOPPREV "prev" // Previous symbol command #define GV_BROWSEPATH "browse_path" // Last browsed path #define GV_BROWSELIB "browse_lib" // Last browsed library #define GV_BROWSEDDB "browse_ddb" // Last browsed library file #define GV_BROWSEELEM "browse_elem" // Last browsed element #define GV_NAMEFIELD "lb_nameidx" // Part name field index #define GV_BNAMEFIELD "lb_bnameidx" // Part base name field index #define GV_REFFIELD "lb_refidx" // Reference display toggle index #define GV_LABFIELD "lb_labidx" // Label field index #define GV_BMLABFIELD "lb_bmlabidx" // Bitmap label field index #define GV_PICW "lb_picw" // Bitmap label width #define GV_PICH "lb_pich" // Bitmap label height double BUTXSTEP = bae_swconfig(3)==2 ? 2.0 : 0.0 /* Menu action button x spacing */; #define BUTWIDTH 8.0 // Selection label width // Globals static int color /* Current color */; // Main program void main() { index L_FIGURE fig /* Figue list index */; string dname /* Directory name buffer */; string newdname /* New directory name buffer */; string libname /* Library name */; string libpname /* Library path name */; string libfname /* Library file name */; string olibname /* Old library name */; string prevname /* Previous symbol name */; string nextname /* Next symbol name */; string refname /* Reference name */; string symname = "" /* Symbol name */; string msg /* Message buffer */; int symquery /* Symbol name query flag */; int dlen /* Library path length */; int newlib = 0 /* New library name request */; STRINGS headl /* Header string list */; int headn = 2 /* Header string count */; STRINGS el /* Entry string list */; int en /* Entry list */; int firstsel = 1 /* First selection flag */; int repflag = 1 /* Name query repeat flag */; int namidx /* Symbol name item field index */; int bnamidx /* Base name item field index */; int bmlabidx /* Bitmap label item index */; int labidx /* Label item index */; int refidx /* Reference display flag item index */; string name /* Dialog box item name */; string varname /* Variable name */; int boxidx /* Dialog box index */; int actcode /* Action code */; int reason /* Callback reason */; int intval /* Dialog box item integer value */; int refflag = (bae_iniintval(PAR_ESELREF,0)&2) ? 1 : 0 /* Reference display flag */; int i /* Loop control variable */; // Check if action call if (varget(VAR_PDBOXIDX,boxidx)==0 && varget(VAR_PDBOXACT,actcode)==0 && varget(VAR_PDBOXREAS,reason)==0 && varget(VAR_PDBOXIVAL,intval)==0 && varget(VAR_PDBOXNAME,name)==0) { // Remove callback parameters vardelete(VAR_PDBOXIDX); vardelete(VAR_PDBOXACT); vardelete(VAR_PDBOXREAS); vardelete(VAR_PDBOXIVAL); vardelete(VAR_PDBOXNAME); varget(GV_NAMEFIELD,namidx); varget(GV_BNAMEFIELD,bnamidx); varget(GV_LABFIELD,labidx); varget(GV_BMLABFIELD,bmlabidx); varget(GV_BROWSEDDB,libfname); varget(GV_REFFIELD,refidx); bae_dialsetcurrent(boxidx); bae_dialgetdata(namidx,0,0.0,symname); bae_dialgetdata(bnamidx,0,0.0,refname); bae_dialgetdata(refidx,refflag,0.0,""); bae_dialsetcurrent(0); switch (actcode) { // Display part case 1 : // Create the part bitmap symboldraw(libfname,symname); if (symname=="") sprintf(msg,REPLIBN,convstring(libfname,2)); else sprintf(msg,REPLIBPART,convstring(libfname,2), ddbcelemname(libfname,symname,DDBCLLPRT,0)); bae_dialsetcurrent(boxidx); bae_dialsetdata(bmlabidx,PA_BMLAB,31,0.0,""); bae_dialsetdata(labidx,PA_LAB,0,0.0,msg); bae_dialsetcurrent(0); exit(0); // Place part case 0 : if (bae_planddbclass()!=DDBCLLAY) error_class(); if (refname=="") { do { // Get new reference name if ((refname=askstr(UPRASKREF,MAXKEYLEN))=="" || refname==UINPOPABORT) error_abort(); if (lay_nrefsearch(refname,fig)!=0) break; if (fig.FIXED&2) continue; // Verify part deletion sprintf(msg,UPRPARTDEL,refname); switch (bae_msgboxverifyquit(msg,"")) { // Yes case 1 : // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); ged_delelem(fig); repflag=0; break; // No case 0 : continue; // Abort default : error_abort(); } // Stop if no further repeat requests } while (repflag); } else { // Get next free name if (ged_getstrpar(4,refname)<0) break; } // Store the old library name olibname=lay_libfname(); mousegrab(1); // Set new library name bae_clriactqueue(); bae_storetextiact(1,libfname); bae_callmenu(MNU_GEDPARSLIB); // Place the part bae_storetextiact(1,refname); bae_storetextiact(1,symname); bae_callmenu(MNU_GEDADDPART); // Restore the old library name bae_clriactqueue(); bae_storetextiact(1,olibname); bae_callmenu(MNU_GEDPARSLIB); exit(0); // Load part case 4 : // Save cur. el. with verification on request verifysave(); // Load the part bae_loadelem(libfname,symname,DDBCLLPRT); exit(0); // Update reference display case 6 : // New library case 2 : symname=""; firstsel=0; // Part name pattern case 5 : // Resize case (-2) : // Abort case (-1) : default : vardelete(GV_NAMEFIELD); vardelete(GV_BNAMEFIELD); vardelete(GV_LABFIELD); vardelete(GV_BMLABFIELD); vardelete(GV_PICW); vardelete(GV_PICH); vardelete(GV_REFFIELD); sprintf(varname,VAR_PDBOXSEQ,boxidx); vardelete(varname); sprintf(varname,VAR_PDBOXMODE,boxidx); vardelete(varname); bae_dialsetcurrent(boxidx); bae_dialclr(); bae_dialsetcurrent(0); bae_clriactqueue(); if (actcode==2) // New library break; else if (actcode==5 || actcode==6) symbolbox(libfname,symname,refflag); else if (actcode==(-2)) symbolbox(libfname,"",refflag); exit(0); } } if (varget(GV_NAMEFIELD,namidx)==0) error(ERRDBLLBRW); // Get the standard library path if ((dname=strgetvarfilename(lay_deflibname()))=="") dname=bae_planfname(); while (1) { libpname=""; dlen=strlen(dname); for (i=dlen-1;i>=0;i--) if (dname[i]=='/' || dname[i]=='\\') { libpname=dname; dname[i]='\0'; libpname[i+1]='\0'; break; } // Clear the file name entry list en=0; // Build the file name list (with abort enabled) if (filelist(el,en,dname,DDBEXT,"",DDBCLLPRT,0,0,0,1,1) || en==0) errormsg(ERRNOLIBS+ERRNOLIBS2,dname); // Init the header list headl[headn-1]=""; // Report the directory list header headl[0]=REPDIRCONT; if (!firstsel || varget(GV_BROWSELIB,libname)!=0 || varget(GV_BROWSEPATH,libpname)!=0) { bae_setintpar(16,4032); // Show the file menu with select disabled if ((libname=popupmenu( 1,"",headl,headn,el,en,UINPOPABORT,1,0,0,headn+en+2, 0,0,UINPOPABORT))==UINPOPABORT || libname=="") break; } if (libname==UINPOPDIR) { // Select directory path newdname=""; bae_askdirname(newdname,"",""); // Ignore directory select errors if (newdname=="") continue; dname=newdname; continue; } // Check if different path specified in file name dlen=strlen(libname); for (i=dlen-1;i>=0;i--) if (libname[i]=='/' || libname[i]=='\\') { libname+=DDBEXT; libpname=libname; libname=strextract(libname,i+1,dlen+4); libpname[i+1]='\0'; break; } // Get the library file name libfname=libpname+libname; catext(libfname,DDBEXT); if (varget(GV_BROWSEELEM,symname)!=0) symname=""; // Clear the new library request flag newlib=0; symquery=(!firstsel || symname=="") ? 1 : 0; firstsel=0; // Check if library file exists if (scanddbenames(libfname,DDBCLLPRT,"")!=1) { // Flush scan cache scanddbenames(libfname,0,""); sprintf(msg,REPNOPART,libfname); bae_msgbox(0,msg,""); continue; } // Check if dialog box support if (!bae_dialclr()) { symbolbox(libfname,"",refflag); varset(GV_BROWSELIB,libname); varset(GV_BROWSEDDB,libfname); varset(GV_BROWSEPATH,libpname); exit(0); } // Do the input loop while (!newlib) { // Check if symbol name query if (symquery && bae_askddbename(symname,libfname,DDBCLLPRT, msgstring(UPRASKSYM,convstring(libfname,1)))!=0) error_abort(); // Check if next symbol available nextname=symname; if (scanddbenames(libfname,DDBCLLPRT,nextname)!=1) nextname=""; // Check if previous symbol available prevname=""; if (scanddbenames(libfname,DDBCLLPRT,prevname)!=1 || prevname==symname) prevname=""; // Flush scan cache scanddbenames(libfname,0,""); varset(GV_BROWSEELEM,symname); varset(GV_BROWSELIB,libname); varset(GV_BROWSEPATH,libpname); // Display the browse picture switch (symboldisp(libfname,libname,symname, (prevname=="" ? 0 : 1)|(nextname=="" ? 0 : 2))) { // Part place case 1 : do { // Get new reference name if ((refname= askstr(UPRASKREF,MAXKEYLEN))=="" || refname==UINPOPABORT) error_abort(); if (lay_nrefsearch(refname,fig)!=0) break; if (fig.FIXED&2) continue; // Verify part deletion sprintf(msg,UPRPARTDEL,refname); switch (bae_msgboxverifyquit(msg,"")) { // Yes case 1 : // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); ged_delelem(fig); repflag=0; break; // No case 0 : continue; // Abort default : error_abort(); } // Stop if no further repeat requests } while (repflag); // Store the old library name olibname=lay_libfname(); // Set new library name bae_clriactqueue(); bae_storetextiact(1,libfname); bae_callmenu(MNU_GEDPARSLIB); // Place the part bae_storetextiact(1,refname); bae_storetextiact(1,symname); bae_callmenu(MNU_GEDADDPART); // Restore the old library name bae_clriactqueue(); bae_storetextiact(1,olibname); bae_callmenu(MNU_GEDPARSLIB); exit(0); // New symbol case 2 : symquery=1; break; // New library case 3 : newlib=1; symquery=1; // Get the standard library path if ((dname= strgetvarfilename(lay_deflibname()))=="") dname=bae_planfname(); break; // Load part case 4 : // Save cur. el. with verification on request verifysave(); // Load the part bae_loadelem(libfname,symname,DDBCLLPRT); exit(0); // Previous part case 5 : // Scan to current part nextname=""; while (scanddbenames(libfname, DDBCLLPRT,nextname)==1) { if (nextname==symname) { // Flush scan cache scanddbenames(libfname,0,""); break; } prevname=nextname; } symname=prevname; symquery=0; break; // Next part case 6 : symname=nextname; symquery=0; break; // Abort default : error_abort(); } } } error_abort(); } int symboldisp(string libfname,string libname,string symname,int buttons) /* // Display a library symbol in a popup window // Return value : // zero if abort or 1 for symbol place, // 2 for new symbol, 3 for new library, 4 for symbol load // 5 for previous library symbol or 6 for next library symbol // Parameters : // string libfname : Library file name // string libname : Library name // string symname : Symbol name // int buttons : Extra button flags */ { index L_POOL pool /* Pool element index */; double mlx,mly,mux,muy /* Popup window boundaries */; int maxcoln,maxrown /* Maximum column/row count */; int coln,rown /* Column/row count */; double wslx,wsly /* Workspace lower corner */; double wsux,wsuy /* Workspace upper corner */; double wsxdim,wsydim /* Workspace dimensions */; double dlx,dly,dux,duy /* Popup draw area */; double dh,dw /* Popup draw dimensions */; double dratio /* Popup draw area aspect ratio */; double xscale /* X scaling factor */; double yscale /* Y scaling factor */; int curcol /* Current column */; int retval /* Return value */; string hd1 /* Popup header string buffer 1 */; string hd2 /* Popup header string buffer 2 */; // Load the symbol macro if (lay_macload(pool,libfname,symname,DDBCLLPRT)<0) { sprintf(hd1,ERRPARTLOAD,symname,libfname); bae_msgbox(2,hd1,""); return(2); } // Get the popup headers sprintf(hd1,REPLIB,libname); sprintf(hd2,REPPART,symname); // Get the workspace dimensions wslx=pool.MACRO.MLX; wsly=pool.MACRO.MLY; wsux=pool.MACRO.MUX; wsuy=pool.MACRO.MUY; wsxdim=wsux-wslx; wsydim=wsuy-wsly; // Get the row and column count bae_mtpsize(maxcoln,maxrown); coln=maxint(minint(reqcol,maxcoln),maxcoln/2); rown=maxrown/2; // Init the popup window boundaries mlx=0.5-0.5*coln/maxcoln; mly=0.5-0.5*rown/maxrown; mux=1.0-mlx; muy=1.0-mly; // Show the browser display popup bae_popshow(rown,coln,mlx,mly,mux,muy); // Calculate the draw area dlx=1.0; dux=coln-1.0; dly=3.0; duy=rown-2.0; dh=duy-dly; dw=dux-dlx; // Check if valid draw area if (dh<=0.0 || dw<=0.0) return(2); // Get the draw area aspect ratio dratio=dw/(dh*pop_aspectratio()); // Display the header strings bae_poptext(0,1,hd1); bae_poptext(1,1,hd2); curcol=1; bae_poptextchoice(rown-1,curcol,UPRPOPNLIB,UINPOPNLIB); curcol+=strlen(UPRPOPNLIB)+1; bae_poptextchoice(rown-1,curcol,UPRPOPNPART,UINPOPNPART); curcol+=strlen(UPRPOPNPART)+1; if (uliptype()==ULIPGED) { if (bae_planddbclass()==DDBCLLAY) { if (existddbelem( bae_planfname(),DDBCLLPRT,symname)!=1) { bae_poptextchoice( rown-1,curcol,UPRPOPPLACE,UINPOPPLACE); curcol+=strlen(UPRPOPPLACE)+1; } } else { bae_poptextchoice(rown-1,curcol,UPRPOPLOAD,UINPOPLOAD); curcol+=strlen(UPRPOPLOAD)+1; } } if (buttons&1) { bae_poptextchoice(rown-1,curcol,UPRPOPPREV,UINPOPPREV); curcol+=strlen(UPRPOPPREV)+1; } if (buttons&2) { bae_poptextchoice(rown-1,curcol,UPRPOPNEXT,UINPOPNEXT); curcol+=strlen(UPRPOPNEXT)+1; } // Get the scaling factor if (wsydim*dratio>wsxdim) { yscale=0.95*dh/wsydim; xscale=yscale*pop_aspectratio(); } else { xscale=0.95*dw/wsxdim; yscale=xscale/pop_aspectratio(); } // Set the draw coord. transformation btp_setcoordtrans(-(dlx+0.5*(dw-xscale*wsxdim))/xscale, (duy-0.5*(dh-yscale*wsydim))/yscale,xscale,-yscale); // Set the design view clipping area bae_popcliparea(1,dly,dlx,dly+dh,dlx+dw); // Set the dash base length bae_setpopdash(0.002*xscale,0.4); // Draw the window background pop_drawrect(dlx,dly,dw,dh,COLOR_BLACK,COLOR_NONE); // Scan object data if (DISPTEXT) { if (lay_scanpool(pool,wslx-pool.MACRO.MNX, wsly-pool.MACRO.MNY,0.0,1,1,NULL,polyfunc,pathfunc, textfunc,NULL,lchkfunc,NULL)!=0) { // Restore the popup area bae_popcliparea(0,0.0,0.0,maxrown,maxcoln); bae_poprestore(); // Release the macro element lay_macrelease(pool); return(2); } } else { if (lay_scanpool(pool,wslx-pool.MACRO.MNX, wsly-pool.MACRO.MNY,0.0,1,1,NULL,polyfunc,pathfunc, NULL,NULL,lchkfunc,NULL)!=0) { // Restore the popup area bae_popcliparea(0,0.0,0.0,maxrown,maxcoln); bae_poprestore(); // Release the macro element lay_macrelease(pool); return(2); } } // Release the macro element lay_macrelease(pool); // Restore the toolbar clipping area bae_popcliparea(0,0.0,0.0,maxrown,maxcoln); switch (bae_readtext(UPRASKFCT,MAXKEYLEN)) { case UINPOPPLACE : retval=1; break; case UINPOPNPART : retval=2; break; case UINPOPNLIB : retval=3; break; case UINPOPLOAD : retval=4; break; case UINPOPPREV : retval=5; break; case UINPOPNEXT : retval=6; break; default : retval=0; } // Restore the popup area bae_poprestore(); // Return selection return((retval<0 || retval>6) ? 0 : retval); } void symbolbox(string libfname,string sympattern,int refflag) /* // Activate a permanent library symbol selection/preview dialog box // Parameters : // string libfname : Library file name // string sympattern : Symbol macro name pattern // int refflag : Reference display flag */ { string msg /* Popup header string buffer 2 */; string varname /* Variable name */; string symname /* Symbol name */; int bmlabidx /* Bitmap label item index */; int labidx /* Label item index */; int namidx /* Symbol name item field index */; int bnamidx /* Base name item field index */; int boxidx /* Dialog box index */; int refidx /* Reference display flag item index */; double cx, cy /* Current dialog coord. values */; double dialwidth /* Dialog box width */; double dialheight /* Dialog box height */; double baseheight /* Dialog box base height */; STRINGS syml /* Symbol makro list */; STRINGS refl /* Reference list */; int symn = 0 /* Symbol makro count */; int refn /* Reference count */; int refclass /* Reference entry class */; string refname /* Reference entry name */; int len /* String length */; int i, j /* Loop control variables */; baseheight= DIAL_TOPMARG+4.0*DIAL_CTRVSTEP+DIAL_BUTVSTEP+2.0*DIAL_SEPVSTEP; dial_getboxsizemin( bae_iniintval(PAR_MODALBOX,0) ? (PA_MODALBOX|4040) : 4040, dialwidth,dialheight,DIAL_LEFTMARG+PICLABWIDTH+DIAL_RIGHTSMARG, baseheight+PICLABHEIGHT+LISTBHEIGHT, DIAL_LEFTMARG+25.0+DIAL_RIGHTSMARG,baseheight+5.0); // Preserve predefined bitmap aspect ratio cx=dialwidth-DIAL_LEFTMARG-DIAL_BMPBUTHO; PICLABHEIGHT=cx*PICLABHEIGHT/PICLABWIDTH; if (PICLABHEIGHT>(dialheight-baseheight-2.0)) PICLABHEIGHT=dialheight-baseheight-2.0; PICLABWIDTH=cx; LISTBHEIGHT=dialheight-PICLABHEIGHT-baseheight; varset(GV_PICW,PICLABWIDTH); varset(GV_PICH,PICLABHEIGHT); // Create the symbol bitmap symboldraw(libfname,""); // Store the symbol name label bae_dialclr(); cy=DIAL_TOPMARG; sprintf(msg,REPLIBN,convstring(libfname,2)); labidx=bae_dialaddcontrol(PA_LAB,0,0,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,PICLABWIDTH,msg); cy+=DIAL_CTRVSTEP; // Store the symbol display label bmlabidx=bae_dialadvcontrol(PA_BMLAB,0,0,31,0.0,0.0,0.0,"",0, DIAL_LEFTMARG,cy,PICLABWIDTH,PICLABHEIGHT,""); // Store the buttons cy+=PICLABHEIGHT+DIAL_SEPVSTEP; cx=DIAL_LEFTMARG+1.0; bae_dialaddcontrol(PA_ACT,0,0,0,0.0,0.0,0.0,"",0,cx,cy,0.0,UPRDPLACE); cx+=bae_dialgettextlen(0,UPRDPLACE)+BUTXSTEP; bae_dialaddcontrol(PA_ACT,0,4,0,0.0,0.0,0.0,"",0,cx,cy,0.0,UPRDLOAD); cx+=bae_dialgettextlen(0,UPRDLOAD)+BUTXSTEP; bae_dialaddcontrol(PA_ACT,0,2,0,0.0,0.0,0.0,"",0,cx,cy,0.0,UPRDNLIB); cy+=DIAL_BUTVSTEP; // Store symbol base name edit field dial_label(0.0,cy,UPRASKBASE); bnamidx=dial_namestring("",MAXKEYLEN,15.0,cy); refidx=bae_dialaddcontrol(PA_TOGGLE,0,6,refflag, 0.0,0.0,0.0,"",0,DIAL_LEFTMARG+1.0,cy,0.0,UPRREF); cy+=DIAL_CTRVSTEP; // Store symbol name edit field namidx=bae_dialaddcontrol(PA_STR|PA_CHKNPAT,0,0,0,0.0,0.0,0.0,"", MAXKEYLEN,DIAL_LEFTMARG,cy, PICLABWIDTH-2.0*BUTXSTEP-bae_dialgettextlen(0,UPRPATTERN),""); bae_dialaddcontrol(PA_ACT,0,5,0,0.0,0.0,0.0,"",0, DIAL_LEFTMARG+PICLABWIDTH-BUTXSTEP-bae_dialgettextlen(0,UPRPATTERN), cy,0.0,UPRPATTERN); cy+=DIAL_CTRVSTEP; // Store list box bae_dialadvcontrol(PA_LB|PA_HBRDREL|PA_MCALLBACK,namidx,1,(-1), 0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,LISTBHEIGHT,""); symname=""; while (scanddbenames(libfname,DDBCLLPRT,symname)==1) // Add the symbol name if (sympattern=="" || strmatch(symname,sympattern)) { syml[symn]=symname; refl[symn]=""; symn++; } if (refflag) { symname=""; while (scanddbenames(libfname,DDBCLLAY,symname)==1) { // Get the DDB element reference count refn=ddbelemrefcount(libfname,DDBCLLAY,symname); for (i=0;i2 && (refl[j][len-1]!=')' || refl[j][len-2]!='.' || refl[j][len-3]!='.')) { refl[j][len-1]='\0'; refl[j]+=",...)"; } } } } for (i=0;iwsydim ? wsxdim : wsydim)*0.05; if (bmp_setsize(wslx-wsbrd,wsuy+wsbrd, wsux+wsbrd,wsly-wsbrd,labwidth,labheight,xoff,yoff) || bae_dialbmpalloc(rlabwidth,rlabheight,31,0,0)!=31) { lay_macrelease(pool); return; } // Draw the picture label bitmap bae_popsetarea(31); // Scan object data if (DISPTEXT) lay_scanpool(pool,xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY,0.0, 1,1,NULL,polyfunc,pathfunc,textfunc,NULL,lchkfunc,NULL); else lay_scanpool(pool,xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY,0.0, 1,1,NULL,polyfunc,pathfunc,NULL,NULL,lchkfunc,NULL); // Release the macro element lay_macrelease(pool); // Switch back to default draw area bae_popsetarea(0); } static int polyfunc(index L_POLY poly,int layer, int polyinws,int tree,index L_LEVEL level) /* // Output an already transformed polygon data block // Return value : // zero if done or (-1) on file error // Parameters : // index L_POLY poly : Polygon // int layer : Polygon layer // int polyinws : Poly in workspace flag // int tree : Polygon tree number // index L_LEVEL level : Polygon level */ { index L_POINT point /* Polygon point */; int fillmode /* Popup polygon fill mode */; int powtree = (-1) /* Power plane tree number */; // Get the polygon fill mode by evaluating the polygon type switch (poly.TYP) { // Open line polygon types case L_POLYDOCLINE : fillmode=PPFM_LINE; break; // Closed line polygon types case L_POLYBRDOUT : case L_POLYKEEPOUT : case L_POLYCOPFILL : fillmode=PPFM_CLINE; break; case L_POLYSPPAREA : // Get the tree number from level if ((powtree=lay_getlevtreenum(level))<0) // Invalid level tree, use supplied tree powtree=tree; fillmode= powtree>=0 ? PPFM_CLINE : PPFM_FILL; break; // Filled polygon types case L_POLYCOPPASS : case L_POLYCOPACT : case L_POLYDOCAREA : fillmode=PPFM_FILL; break; // Ignore others default : return(0); } // Display the polygon bae_clearpoints(); forall (point of poly) btp_storepoint(point.X,point.Y,point.TYP); bae_popdrawpoly(color,DM_SET,fillmode); // Return without errors return(0); } static int pathfunc(index L_LINE path, int layer,int pathinws,index L_LEVEL level) /* // Output an already transformed path data block // Return value : // zero if done or (-1) on file error // Parameters : // index L_LINE path : Path // int layer : Path layer // int pathinws : Path in workspace flag // index L_LEVEL level : Path level */ { index L_POINT point /* Path point */; // Display the trace bae_clearpoints(); forall (point of path) btp_storepoint(point.X,point.Y,point.TYP); bae_popdrawpoly(color,DM_SET,PPFM_LINE); // Return without errors return(0); } static int textfunc(index L_TEXT textp,double tx,double ty,double tangle, int mirrflag,int layer,double tsize,string tstr,int textinws) /* // Vectorize a text data block // Return value : // zero if done or (-1) on error // Parameters : // index L_TEXT textp : Text index // double tx : Text X coordinate // double ty : Text Y coordinate // double tangle : Text rotation angle // int mirrflag : Text mirror flag // int layer : Text layer code // double tsize : Text size // string tstr : Text string // int textinws : Text in workspace flag */ { double vx, vy /* Text line vector coordinates */; // Check if attribute line display if (lay_getsctextdest(vx,vy)==1) // Draw the attribute line if (tlinefunc(tx,ty,vx,vy)) // Line draw failed return(-1); // Vectorize the text (if not empty string) if (tstr && lay_vecttext(tx,ty,tangle,mirrflag,tsize, (textp.MODE&TEXTOMSK)==TEXTPHYS,0,textp.MODE,tstr,tlinefunc)) // Vectorization failed return(-1); // Return without errors return(0); } static int lchkfunc(int layer) /* // Layer output check routine // Return value : // zero on scan stop request, 1 if scan allowed // Parameters : // int layer : Layer code */ { // Stop scan if layer is invisible return((color=bae_getcolor(layer))>0); } static int tlinefunc(double x1,double y1,double x2,double y2) /* // Draw a text line as path // Return value : // zero if done or (-1) on error // Parameters : // double x1 : First line point X coordinate // double y1 : First line point Y coordinate // double x2 : Second line point X coordinate // double y2 : Second line point Y coordinate */ { // Draw the line bae_clearpoints(); btp_storepoint(x1,y1,0); btp_storepoint(x2,y2,0); bae_popdrawpoly(color,DM_SET,PPFM_LINE); // Return without errors return(0); } // User Language program end