/* SBROWSE (SCM) -- Schematic Symbol Browser */ /* SBROWSE (SCM) -- Schaltplansymbolbrowser */ /* // 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 (091027) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080220) 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 (030221) ENHANCEMENT: // Enabled autoname request at symbol placement. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (010625) RELEASED FOR BAE V5.0. // rl (010320) ENHANCEMENT: // Added optional parameter settings from bae.ini file. // rl (010107) BUGFIX: // Symbol load button enabled for non-sheet element classes. // 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. // rl (980805) ENHANCEMENT: // Symbol place button disabled if part already defined in current // DDB file. // mb (980711) ENHANCEMENT: // Dynamic multi-language support introduced. // rl (971107) ORIGINAL CODING // // DESCRIPTION // // The sbrowse User Language program is a graphical schematic // symbol browser. */ // Includes #include "pop.ulh" // User Language popup utilities #include "popdraw.ulh" // User Language popup draw. util. #include "scm.ulh" // User Language SCM utilities #include "baeparam.ulh" // User Language BAE param. access // Disable undo state request #pragma ULCALLERNOUNDO // INI file parameter name definitions #define PAR_DISPTEXT "DISPTEXT_SCM" // Display text flag #define PAR_SSELAUTO "SSELAUTO_SCM" // Symbol auto name flag #define PAR_BRWWIDTH "BRWDISPW_SCM" // Symbol browse bitmap width #define PAR_BRWHEIGHT "BRWDISPH_SCM" // Symbol browse bitmap height #define PAR_DEFHEIGHT "BRWDEFH_SCM" // Symbol browse definition box height #define PAR_LSTHEIGHT "BRWLISTH_SCM" // Symbol browse listbox height #define PAR_LINELEN "LLCOLS_SCM" // Logical library edit columns #define PAR_ESELREF "ESELREF_STD" // Element selection ref. display mode // Messages string UPRASKFCT = M("Funktion selektieren!","Select function!"); string UPRASKREF = M("Bauteilname ? ","Part Name ? "); string UPRASKSYM = M("Bibliothekssymbol in '%s' ? ", "Library Symbol Name in '%s' ? "); string UPRSYMLIB = M("Symbolbrowser","Symbol Browser"); string UPRPOPNLIB = M("[Library]","[Library]"); string UPRPOPNSYM = M("[Symbol]","[Symbol]"); 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 UPRLOGDEF = M("Definition","Definition"); string UPRREF = M("&Referenzen","&References"); string REPDIRCONT = M("Bibliotheksverzeichnis :","Library Files :"); string REPLIB = M("Library '%s'","Library '%s'"); string REPSYM = M("Symbol '%s'","Symbol '%s'"); string REPLIBSYM = M("%s / %s %s","%s / %s %s"); string REPLIBN = M("%s","%s"); string REPNOSYM = M("Bibliothek '%s' enthaelt keine Symbole!", "Library '%s' doesn't contain symbols!"); string ERRSYMLOAD = M("Symbol '%s' konnte nicht aus '%s' geladen werden!", "Error loading symbol '%s'/'%s'!"); string ERRNOLIBS = M("Keine Symbolbibliothek in Verzeichnis '%s' gefunden!", "Library directory '%s' contains no symbol library files!"); string ERRNOLIBS2 = M(" Hauptmenue Setup falsche Bibliotheksangabe?", " Main Menu Setup library specification invalid?"); string ERRDBLSBRW = M("Symbolbrowser ist bereits aktiv!", "Symbol browser already active!"); int reqcol = // Required popup columns count strlen(UPRPOPNLIB)+1+strlen(UPRPOPNSYM)+1+ maxint(strlen(UPRPOPLOAD),strlen(UPRPOPPLACE))+1; // Global definitions int DISPTEXT = bae_iniintval(PAR_DISPTEXT,1) /* Text display mode */; int AUTONAME = bae_iniintval(PAR_SSELAUTO,0) /* Symbol auto name flag */; 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 */; double DEFLABHEIGHT = bae_inidblval(PAR_DEFHEIGHT,5.0) /* Browse display height */; int LINELEN = bae_iniintval(PAR_LINELEN,40); // Logical library edit columns #define UINPOPPLACE "place" // Place command #define UINPOPLOAD "load" // Load command #define UINPOPNSYM "newsym" // New symbol 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 "sb_nameidx" // Symbol name field index #define GV_DEFFIELD "sb_defidx" // Definition toggle index #define GV_REFFIELD "sb_refidx" // Reference display toggle index #define GV_TXTFIELD "sb_txtidx" // Definition text index #define GV_LABFIELD "sb_labidx" // Label field index #define GV_BMLABFIELD "sb_bmlabidx" // Bitmap label field index #define GV_PICW "sb_picw" // Bitmap label width #define GV_PICH "sb_pich" // Bitmap label height double BUTXSTEP = bae_swconfig(3)==2 ? 2.0 : 0.0 /* Menu action button x spacing */; #define BUTWIDTH 8.0 // Abort button width // Globals static int color /* Current color */; // Main program void main() { 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 llibfname /* Layout library file name */; string olibname /* Old library name */; string symname = "" /* Symbol name */; string prevname /* Previous symbol name */; string nextname /* Next symbol name */; string refname = "" /* Reference name */; string namepat /* Name pattern */; 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 namidx /* Symbol name item field index */; int bmlabidx /* Bitmap label item index */; int labidx /* Label item index */; int defidx /* Logical def. flag item index */; int refidx /* Reference display flag item index */; int txtidx /* Logical def. text item index */; int defflag = 0 /* Definition flag */; int refflag = (bae_iniintval(PAR_ESELREF,0)&2) ? 1 : 0 /* Reference display flag */; 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 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_LABFIELD,labidx); varget(GV_DEFFIELD,defidx); varget(GV_REFFIELD,refidx); varget(GV_TXTFIELD,txtidx); varget(GV_BMLABFIELD,bmlabidx); varget(GV_BROWSEDDB,libfname); bae_dialsetcurrent(boxidx); bae_dialgetdata(namidx,0,0.0,symname); bae_dialgetdata(defidx,defflag,0.0,""); bae_dialgetdata(refidx,refflag,0.0,""); bae_dialsetcurrent(0); switch (actcode) { // Display symbol case 1 : // Create the symbol bitmap namepat=symboldraw(libfname,symname); if (symname=="") sprintf(msg,REPLIBN,convstring(libfname,2)); else sprintf(msg,REPLIBSYM,convstring(libfname,2), ddbcelemname(libfname,symname,DDBCLSSYM,0)); bae_dialsetcurrent(boxidx); bae_dialsetdata(bmlabidx,PA_BMLAB,31,0.0,""); bae_dialsetdata(labidx,PA_LAB,0,0.0,msg); if (defflag) { llibfname=strgetvarfilename(scm_defloglname()); catext(llibfname,DDBEXT); if (con_getlogpart(llibfname,symname, LINELEN,msg)!=0) msg=""; bae_dialsetdata(txtidx, PA_STR|PA_NOEDIT|PA_HBRDREL,0,0.0,msg); } bae_dialsetcurrent(0); exit(0); // Place symbol case 0 : if (bae_planddbclass()!=DDBCLSCM) error_class(); // Get new reference name if (!AUTONAME && (refname=askstr(UPRASKREF,MAXKEYLEN))==UINPOPABORT) error_abort(); // Store the old library name olibname=scm_libfname(); mousegrab(1); // Set new library name bae_clriactqueue(); bae_storetextiact(1,libfname); bae_callmenu(MNU_SCMPARSLIB); // Place the symbol bae_storetextiact(1,refname); bae_storetextiact(1,symname); bae_callmenu(MNU_SCMADDSYM); bae_clriactqueue(); // Restore the old library name bae_storetextiact(1,olibname); bae_callmenu(MNU_SCMPARSLIB); exit(0); // Load symbol case 4 : // Save cur. el. with verification on request verifysave(); // Load the symbol bae_loadelem(libfname,symname,DDBCLSSYM); exit(0); // Update reference display case 6 : // New library case 2 : symname=""; firstsel=0; // Symbol name pattern case 5 : // Resize case (-2) : // Abort case (-1) : default : vardelete(GV_NAMEFIELD); vardelete(GV_LABFIELD); vardelete(GV_DEFFIELD); vardelete(GV_REFFIELD); vardelete(GV_TXTFIELD); vardelete(GV_BMLABFIELD); vardelete(GV_PICW); vardelete(GV_PICH); 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,defflag,refflag); else if (actcode==(-2)) symbolbox(libfname,"",defflag,refflag); exit(0); } } if (varget(GV_NAMEFIELD,namidx)==0) error(ERRDBLSBRW); // Check if call inside function check_fctactive(); // Get the standard library path if ((dname=strgetvarfilename(scm_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,"",DDBCLSSYM,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) { // Show the file menu with select disabled bae_setintpar(16,4032); 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,DDBCLSSYM,"")!=1) { sprintf(msg,REPNOSYM,libfname); bae_msgbox(0,msg,""); continue; } // Check if dialog box support if (!bae_dialclr()) { symbolbox(libfname,"",defflag,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,DDBCLSSYM, msgstring(UPRASKSYM,convstring(libfname,1)))!=0) error_abort(); // Check if next symbol available nextname=symname; if (scanddbenames(libfname,DDBCLSSYM,nextname)!=1) nextname=""; // Check if previous symbol available prevname=""; if (scanddbenames(libfname,DDBCLSSYM,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))) { // Symbol place case 1 : // Get new reference name if (!AUTONAME && (refname= askstr(UPRASKREF,MAXKEYLEN))==UINPOPABORT) error_abort(); // Store the old library name olibname=scm_libfname(); // Set new library name bae_clriactqueue(); bae_storetextiact(1,libfname); bae_callmenu(MNU_SCMPARSLIB); // Place the symbol bae_storetextiact(1,refname); bae_storetextiact(1,symname); bae_callmenu(MNU_SCMADDSYM); bae_clriactqueue(); // Restore the old library name bae_storetextiact(1,olibname); bae_callmenu(MNU_SCMPARSLIB); exit(0); // New symbol case 2 : symquery=1; break; // New library case 3 : newlib=1; // Get the standard library path if ((dname= strgetvarfilename(scm_deflibname()))=="") dname=bae_planfname(); break; // Symbol load case 4 : // Save cur. el. with verification on request verifysave(); // Load the symbol bae_loadelem(libfname,symname,DDBCLSSYM); exit(0); // Previous symbol case 5 : // Scan to current symbol nextname=""; while (scanddbenames(libfname, DDBCLSSYM,nextname)==1) { if (nextname==symname) { // Flush scan cache scanddbenames(libfname,0,""); break; } prevname=nextname; } symname=prevname; symquery=0; break; // Next symbol 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 C_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 (cap_macload(pool,libfname,symname,DDBCLSSYM)) { sprintf(hd1,ERRSYMLOAD,symname,libfname); bae_msgbox(2,hd1,""); return(2); } // Get the popup headers sprintf(hd1,REPLIB,libname); sprintf(hd2,REPSYM,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; // Calculate the popup margins 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,UPRPOPNSYM,UINPOPNSYM); curcol+=strlen(UPRPOPNSYM)+1; if (bae_planddbclass()==DDBCLSCM) { if (existddbelem(bae_planfname(),DDBCLSSYM,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 (cap_scanpool(pool,wslx-pool.MACRO.MNX, wsly-pool.MACRO.MNY,0.0,1,NULL,NULL,polyfunc,textfunc)!=0) { // Restore the popup area bae_popcliparea(0,0.0,0.0,maxrown,maxcoln); bae_poprestore(); // Release the macro element cap_macrelease(pool); return(2); } } else { if (cap_scanpool(pool,wslx-pool.MACRO.MNX, wsly-pool.MACRO.MNY,0.0,1,NULL,NULL,polyfunc,NULL)!=0) { // Restore the popup area bae_popcliparea(0,0.0,0.0,maxrown,maxcoln); bae_poprestore(); // Release the macro element cap_macrelease(pool); return(2); } } // Release the macro element cap_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 UINPOPNSYM : 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 logdef,int refflag) /* // Activate a permanent library symbol selection/preview dialog box // Parameters : // string libfname : Library file name // string sympattern : Symbol macro name pattern // int logdef : Logical definition flag // int refflag : Reference display flag */ { string msg /* Popup header string buffer 2 */; string varname /* Variable name */; string llibfname /* Layout library file name */; string symname /* Symbol name */; string defstr /* Logical definition string */; int bmlabidx /* Bitmap label item index */; int labidx /* Label item index */; int defidx /* Definition flag item index */; int refidx /* Reference display flag item index */; int txtidx /* Definition text item index */; int namidx /* Symbol name item field index */; int boxidx /* Dialog box 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; if (logdef) baseheight+=DEFLABHEIGHT; dial_getboxsizemin( bae_iniintval(PAR_MODALBOX,0) ? (PA_MODALBOX|3101) : 3101, 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); llibfname=strgetvarfilename(scm_defloglname()); catext(llibfname,DDBEXT); if (con_getlogpart(llibfname,sympattern,LINELEN,defstr)!=0) { defstr=""; // Create the symbol bitmap symboldraw(libfname,""); } else { // Create the symbol bitmap symboldraw(libfname,sympattern); sympattern=""; } // 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; if (logdef) { txtidx=bae_dialadvcontrol(PA_STR|PA_NOEDIT|PA_HBRDREL, 0,0,0,0.0,0.0,0.0,defstr,60000, DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,DEFLABHEIGHT,""); cy+=DEFLABHEIGHT+DIAL_SEPVSTEP; } else { txtidx=(-1); } 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; cx=DIAL_LEFTMARG+1.0; defidx=bae_dialaddcontrol(PA_TOGGLE,0,5,logdef, 0.0,0.0,0.0,"",0,cx,cy,0.0,UPRLOGDEF); cx+=bae_dialgettextlen(0,UPRLOGDEF)+BUTXSTEP+3.0; refidx=bae_dialaddcontrol(PA_TOGGLE,0,6,refflag, 0.0,0.0,0.0,"",0,cx,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|PA_SCALLBACK,namidx,1, (-1),0.0,0.0,0.0,"",0,DIAL_LEFTMARG,cy,DIAL_RIGHTSMARG,LISTBHEIGHT,""); symname=""; while (scanddbenames(libfname,DDBCLSSYM,symname)==1) // Add the symbol name if (sympattern=="" || strmatch(symname,sympattern)) { syml[symn]=symname; refl[symn]=""; symn++; } if (refflag) { symname=""; while (scanddbenames(libfname,DDBCLSCM,symname)==1) { // Get the DDB element reference count refn=ddbelemrefcount(libfname,DDBCLSCM,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) { cap_macrelease(pool); return(namepat); } // Draw the picture label bitmap bae_popsetarea(31); // Set the dash base length btp_setdashlen(0.002,0.4); // Scan object data if (DISPTEXT) cap_scanpool(pool,xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY, 0.0,1,NULL,NULL,polyfunc,textfunc); else cap_scanpool(pool,xoff-pool.MACRO.MNX,yoff-pool.MACRO.MNY, 0.0,1,NULL,NULL,polyfunc,NULL); // Release the macro element cap_macrelease(pool); // Switch back to default draw area bae_popsetarea(0); // Return the macro name pattern return(namepat); } int polyfunc(index C_POLY poly,int polyinws, index C_LEVEL level,int macclass,int bustapidx) /* // Output an already transformed polygon data block to PS file // Return value : // zero if done or (-1) on file error // Parameters : // index C_POLY poly : Polygon // int polyinws : Poly in workspace flag // index C_LEVEL level : Polygon level // int macclass : Polygon macro class // int bustapidx : Polygon bustap index */ { index C_POINT point /* Polygon point */; int fillmode /* Popup polygon fill mode */; // Init the color color=COLOR_NONE; // Test if the polygon type is requested for output switch (poly.TYP) { // Documentary line case C_POLYDOCLINE : // Dotted documentary line case C_POLYDOTLINE : // Documentary area case C_POLYDOCAREA : fillmode=poly.TYP==C_POLYDOCAREA ? 1 : (poly.TYP==C_POLYDOTLINE ? 6 : 2 ); switch (macclass) { case bae_planddbclass() : color=bae_getcolor(0); break; case DDBCLSSYM : case DDBCLSLAB : color=bae_getcolor(2); break; case DDBCLSMRK : color=bae_getcolor(3); break; default : color=bae_getcolor(0); break; } break; // Contact area case C_POLYCONAREA : color=bae_getcolor(7); fillmode=1; break; // Internal case 2 : color=15; fillmode=1; break; case 3 : color=13; fillmode=1; break; // No output area default : return(0); } // Abort if invisible if (color<=0) 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); } int textfunc(index C_TEXT textp,double tx,double ty,double tangle, int mirrflag,double tsize,string tstr,int textinws,int macclass,int varattr) /* // Vectorize a text data block // 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 */ { // Abort scan if empty string if (tstr=="" || tsize<=0.0) return(0); // Test the rotation visibility if (textp.ROTVIS!=100 && !((textp.ROTVIS&1) && (textp.ROTVIS&0x20))) // Don't display, return return(0); // Get the text color if (textp.MODE&TEXTCOMM) // Comment text color=bae_getcolor(11); else { // Standard text // Set color according to macro class switch (macclass) { case DDBCLSSYM : case DDBCLSLAB : color=bae_getcolor(2); break; case DDBCLSMRK : color=bae_getcolor(3); break; default : color=bae_getcolor(0); } } // Ignore if not visible if (color<=0) return(0); if (cap_vecttext( tx,ty,tangle,mirrflag,tsize,textp.MODE,tstr,tlinefunc)==(-1)) // Vectorization failed return(-1); // Return without errors return(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