/* LLIBDOC (GED) -- Layout Library Documentation */ /* LLIBDOC (GED) -- Layout-Bibliotheksdokumentation */ /* // Copyright (c) 1993-2012 Oliver Bartels F+E, Muenchen // Author: Manfred Baumeister // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091021) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (070618) ENHANCEMENT: // Added element comment creation. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (040330) ENHANCEMENT: // Added Light version paper size. // rl (030904) RELEASED FOR BAE V6.2. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (010626) RELEASED FOR BAE V5.0. // rl (010503) ENHANCEMENT: // Added optional parameter settings from bae.ini file. // rl (010119) ENHANCEMENT: // Optimized symbol placement. // rl (000710) RELEASED FOR BAE V4.6. // rl (991221) ENHANCEMENT: // Symbol numbered naming option introduced. // rl (990630) RELEASED FOR BAE V4.4. // Added layout plan creation for padstacks/pads. // rl (981012) RELEASED FOR BAE V4.2. // mb (980712) ENHANCEMENT: // Pulldown menu delimiters introduced. // mb (980712) ENHANCEMENT: // Dynamic multi-language support introduced. // rl (970929) RELEASED FOR BAE V4.0. // mb (960919) RELEASED FOR BAE V3.4. // mb (960730) IMPROVEMENT: // Changed menu items to support key selection // in Windows/Motif user interfaces. // mb (95) RELEASED FOR BAE V3.2. // mb (941129) IMPROVEMENT: // Introduced feature for program abort on key hit. // mb (94) RELEASED FOR BAE V3.0. // mb (94) ENHANCEMENT: // Introduced Symbol Selection by Name Pattern. // Introduced Padstack and Pad Documentation facilities. // mb (93) RELEASED FOR BAE V2.6. // mb (93) ORIGINAL CODING. // // DESCRIPTION // // The llibdoc User Language program is a layout library management // program intended for documentation purposes. llibdoc automatically // places layout parts, layout padstacks, or layout pads of a freely // selectable DDB file onto superior layout database hierarchy level // elements. Different standard sheet formats are supported including // automatic legend box generation with library file name and sheet // number denotion. The symbols to be included with the library // documentation can be selected by symbol name pattern (wildcard). // Symbols are aligned to horizontal base lines and text is placed with // each symbol in order to denote the symbol name. The layout elements // generated with llibdoc can be plotted (e.g. using the layeps User // Language program) in order to produce library documentation output. */ // Includes #include "mnu.ulh" // User Language menu utilities // Disable undo state request #pragma ULCALLERNOUNDO // INI file parameter name definitions #define PAR_PRTPREFIX "PRTPREFIX_GED" // Parts sheet name prefix #define PAR_STKPREFIX "STKPREFIX_GED" // Patacks sheet name prefix #define PAR_PADPREFIX "PADPREFIX_GED" // Pads sheet name prefix #define PAR_SYMNNAME "SYMNNAME_GED" // Symbol numbered names flag #define PAR_SYMNPREF "SYMNNPREF_GED" // Symbol numbered names prefix #define PAR_FOOTERH "FOOTERH_GED" // Footer height #define PAR_HSHIFT "PHSIFHT_GED" // Part horizontal shift #define PAR_VSHIFT "PVSHIFT_GED" // Part vertical shift #define PAR_FTXTS "FTXTS_GED" // Footer text size #define PAR_STXTS "STXTS_GED" // Symbol name text size #define PAR_BEL "BELDOC_GED" // Boundary enlarge length #define PAR_XPLTOFF "XPLTOFF_GED" // X online plot offset #define PAR_YPLTOFF "YPLTOFF_GED" // Y online plot offset // Messages string UPRABORT = M_UPRABORT(); string UPRPEXIT = M_UPRPEXIT(); string REPSTART = M("Layout-Bibliotheks-Dokumentation:", "Layout Library Documentation:"); string REPSHEET = M("Layout-Bibliothek '%s': %sblatt '%s' erzeugt.", "Layout Library '%s': %s sheet '%s' generated."); string REPSYMCNT = M("%d %s platziert.","%d %s placed."); string REPLSTSYMS = M("Erzeugen der Bauteilmakro-Liste (Abbruch mit Tastendruck)...", "Building the part macro list (hit any key to abort)..."); string REPPLCSYMS = M("Platzieren der Symbole (Abbruch mit Tastendruck)...", "Placing the symbols (hit any key to abort)..."); string UPROVERWR = M("Existierende Elemente ('%s') ueberschreiben ? ", "Overwrite Existing Elements ('%s') ? "); string UPRSELTYP = M("Layout-Datenbank-Hierarchie-Ebene waehlen!", "Select Layout Database Hierarchy Level!"); string UPRSELPRT = M("&Bauteile","&Parts"); string UPRSELSTK = M("Pad&stacks","Pad&stacks"); string UPRSELPAD = M("Pa&ds","Pa&ds"); string UPRSYMPAT = M("Bauteilmakronamens-Pattern (=alle) : ", "Part Macro Name Pattern (=all) : "); string UPRSELLIB = M("Layout-Bibliothek ? ","Layout Library ? "); string UPRSFORMAT = M("Blatt-Format selektieren!", "Select Sheet Format!"); string UPRSFORMAT1 = M("&Hochformat 180*280","&Portrait 180*280"); string UPRSFORMAT2 = M("H&ochformat 160*240","P&ortrait 160*240"); string UPRSFORMAT3 = M("Ho&chformat 140*180","Po&rtrait 140*180"); string UPRSFORMAT4 = M("%&Querformat 420*300","%&Landscape 420*300"); string UPRSFORMAT5 = M("Q&uerformat 300*160","La&ndscape 300*160"); string UPRSFORMAT6 = M("Qu&erformat 200*140","Lan&dscape 200*140"); string UPRSFORMAT7 = M("%&Light-Format 180*120","%L&ight Format 180*120"); string UPRSFORMAT8 = M("%&Plotformat 180*280","%Plo&t Format 180*280"); string UPRDOCLAY = M("Dokumentarlage fuer Rahmen/Kommentare waehlen!", "Select Documentary Layer for Frames/Comments!"); string ERRLOAD = M("Fehler beim Laden von '%s'!", "Error loading '%s'!"); string ERRPOLY = M("Fehler bei Polygonerzeugung!", "Error creating polygon!"); string ERRTEXT = M("Fehler bei Texterzeugung ('%s')!", "Error creating text ('%s)'!"); string ERRDBLDEFSYM = M("Mehrfach definiertes Bauteil '%s'!", "Multiple defined part macro '%s'!"); string WRN = M("WARNUNG: ","WARNING: "); string WRNMACROMIS = WRN+M( "'%s' - Makros fehlen/sind vom falschen Typ!", "'%s' - macros are missing or of wrong type!"); string WRNPRTMISFIT = WRN+M( "Bauteilmakro '%s' zu gross/nicht platziert!", "Part macro '%s' too big/not placed!"); string WRNPARTPLC = WRN+M( "Bauteilmakro '%s' konnte nicht platziert werden!", "Error placing part macro '%s'!"); // Menu items #define MENUITMLAY 0 // Del./cre. layout menu item #define MENUITMPRT 1 // Del./cre. part menu item #define MENUITMSTK 2 // Del./cre. padstack menu item int dcemenuitem /* Del./cre. element menu item */; // Output management definitions string PRTPREFIX = bae_inistrval(PAR_PRTPREFIX,"_parts_") /* Parts sheet name prefix */; string STKPREFIX = bae_inistrval(PAR_STKPREFIX,"_padstacks_") /* Padstacks sheet name prefix */; string PADPREFIX = bae_inistrval(PAR_PADPREFIX,"_pads_") /* Pads sheet name prefix */; int SYMNNAME = bae_iniintval(PAR_SYMNNAME,1) /* Symbol numbered names flag */; string SYMNPREF = bae_inistrval(PAR_SYMNPREF,"n") /* Symbol numbered names prefix */; string SHNPREFIX /* Sheet name prefix */; string ITEMS /* Items denoter */; int DOCLAYER /* Frame/comment doc layer */; #define VISALWAYS 0 // Polygon always visible mode #define FOOTER "%s / %s %d%c" // Footer string double HSHIFT = bae_inidblval(PAR_HSHIFT,0.005) /* Part horizontal shift */; double VSHIFT = bae_inidblval(PAR_VSHIFT,0.005) /* Part vertical shift */; double FOOTERH = bae_inidblval(PAR_FOOTERH,0.01) /* Footer height */; double BEL = bae_inidblval(PAR_BEL,0.015) /* Boundary enlarge length */; #define HTOW 48.0/32.0 // Character height to width double FTCHRH = bae_inidblval(PAR_FTXTS,0.006) /* Footer char. height/text size */; double SYMCHRH = bae_inidblval(PAR_STXTS,0.00254) /* Symbol char. height/text size */; double SYMCHRW = SYMCHRH/HTOW /* Symbol character width */; double XPLTOFF = bae_inidblval(PAR_XPLTOFF,-0.015) /* X online plot offset */; double YPLTOFF = bae_inidblval(PAR_YPLTOFF,-0.010) /* Y online plot offset */; double XLPLT = XPLTOFF-BEL /* X online plot lower boundary */; double YLPLT = YPLTOFF-BEL /* Y online plot lower boundary */; int PLTFMT /* Plot format flag */; double SHW /* Sheet width */; double SHH /* Sheet height */; double curxs /* Current sheet x size */; double curys /* Current sheet y size */; // Globals string LIBFILE /* Library file name */; string LIBFILEX /* Lib. file name (ext.-less) */; string LIBFILEP /* Library file name without path */; int ddbclass /* Symbol DDB class */; int topddbclass /* Top level DDB class */; string symnamepattern /* Symbol name pattern */; int placecount = 0 /* Symbol placement count */; struct sheetdes { // Sheet descriptor string sn /* Sheet name */; int frow /* Sheet first row */; } sheets[] /* Sheet list */; int sheetn = 0 /* Sheet count */; struct rowdes { // Row descriptor int shn /* Row sheet number */; int rfp /* Row first symbol index */; double rh /* Row height */; double rb /* Row base y coordinate */; } rows[] /* Row list */; int rown = 0 /* Row count */; struct symboldes { // Symbol descriptor string pn /* Symbol name */; double wslx,wsly /* Symbol lower boundary */; double wsnx,wsny /* Symbol origin */; double sizex,sizey /* Symbol size */; double plcx,plcy /* Symbol placement coords */; int row /* Symbol row number */; int fitflag /* Symbol fit flag */; } symbols[] /* Symbol list */; int symboln = 0 /* Symbol count */; struct symboldes NULLSP = { // Symbol initialyzer value "", 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, -1, 0 }; STRINGS msgs /* Message list */; int msgn = 0 /* Message count */; // Main program void main() { string ename /* Element name */; // Save current element with verification on request verifysave(); // Select database hierarchy level bae_promptdialog(UPRSELTYP); switch (bae_askmenu(4,UPRSELPRT,UPRSELSTK,UPRSELPAD,UPRABORT)) { // Parts case 0 : ITEMS=UPRSELPRT; ddbclass=DDBCLLPRT; topddbclass=DDBCLLAY; dcemenuitem=MENUITMLAY; SHNPREFIX=PRTPREFIX; break; // Padstacks case 1 : ITEMS=UPRSELSTK; ddbclass=DDBCLLSTK; topddbclass=DDBCLLPRT; dcemenuitem=MENUITMPRT; SHNPREFIX=STKPREFIX; break; // Pads case 2 : ITEMS=UPRSELPAD; ddbclass=DDBCLLPAD; topddbclass=DDBCLLSTK; dcemenuitem=MENUITMSTK; SHNPREFIX=PADPREFIX; break; // Abort on default default : error_abort(); } // Ensure lower case names strlower(SYMNPREF); strlower(SHNPREFIX); // Skip all ampersands from items denoter ITEMS=bae_plainmenutext(ITEMS); // Select library file if ((LIBFILE=askddbfile(UPRSELLIB,ddbclass))=="") error_abort(); // Ask for symbol name pattern bae_setmousetext(""); if ((symnamepattern=bae_readedittext(UPRSYMPAT,"*",MAXKEYLEN))=="") // Set the all match pattern symnamepattern="*"; // Check if abort request if (symnamepattern==UINPOPABORT) error_abort(); // Test if top class elements exist already ename=""; while (scanddbenames(LIBFILE,topddbclass,ename)==1) if (strmatch(ename,SHNPREFIX+'*')) { // Flush scan cache scanddbenames(LIBFILE,0,""); sprintf(ename,UPROVERWR,SHNPREFIX+'*'); if (!verify(ename,0)) error_abort(); break; } if (topddbclass==DDBCLLSTK) { ename=""; while (scanddbenames(LIBFILE,DDBCLLPRT,ename)==1) if (strmatch(ename,SHNPREFIX+'*')) { // Flush scan cache scanddbenames(LIBFILE,0,""); sprintf(ename,UPROVERWR,SHNPREFIX+'*'); if (!verify(ename,0)) error_abort(); break; } } if (topddbclass==DDBCLLSTK || topddbclass==DDBCLLPRT) { ename=""; while (scanddbenames(LIBFILE,DDBCLLAY,ename)==1) if (strmatch(ename,SHNPREFIX+'*')) { // Flush scan cache scanddbenames(LIBFILE,0,""); sprintf(ename,UPROVERWR,SHNPREFIX+'*'); if (!verify(ename,0)) error_abort(); break; } } // Build the extension-less library file name LIBFILEX=convstring(LIBFILE,0); // Get path stripped library file name LIBFILEP=convstring(LIBFILEX,2); // Ask for sheet format bae_promptdialog(UPRSFORMAT); switch (bae_askmenu(9,UPRSFORMAT1,UPRSFORMAT2,UPRSFORMAT3, UPRSFORMAT4,UPRSFORMAT5,UPRSFORMAT6, UPRSFORMAT7,UPRSFORMAT8,UPRABORT)) { /* P 180*280 */ case 0 : SHW=0.18; SHH=0.28; PLTFMT=0; break; /* P 160*240 */ case 1 : SHW=0.16; SHH=0.24; PLTFMT=0; break; /* P 140*180 */ case 2 : SHW=0.14; SHH=0.18; PLTFMT=0; break; /* L 420*300 */ case 3 : SHW=0.42; SHH=0.30; PLTFMT=0; break; /* L 300*160 */ case 4 : SHW=0.30; SHH=0.16; PLTFMT=0; break; /* L 200*140 */ case 5 : SHW=0.20; SHH=0.14; PLTFMT=0; break; /* L 180*120 */ case 6 : SHW=0.18; SHH=0.12; PLTFMT=0; break; /* PP180*280 */ case 7 : SHW=0.18; SHH=0.28; PLTFMT=1; break; // Abort on default default : error_abort(); } // Set default layer DOCLAYER= ged_getlaydefmode()==2 ? ged_getlayerdefault() : ged_getpickpreflay(); // Select frame/comment doc layer bae_promptdialog(UPRDOCLAY); if (ged_asklayer(DOCLAYER,3)) error_abort(); ged_setlayerdefault(DOCLAYER); // Save current state for undo bae_callmenu(MNU_BAESAVESTATE); // Report start msgs[msgn++]=REPSTART; msgs[msgn++]=""; // Build the library contents file buildsymbollist(); // Place the symbols placesymbols(); // Build the sheets buildsheets(); // Report the placement count msgs[msgn++]=""; sprintf(msgs[msgn],REPSYMCNT,placecount,ITEMS); // Display messages with popup menu if (msgn) { bae_setintpar(16,3046); mnu_poptext(msgs,0,0,-1,0,0); } // Done bae_prtdialog(""); } // List management and placement routines void buildsymbollist() /* // Build the symbol list */ { index L_POOL pool /* Pool element index */; string ename = "" /* Current element name */; int i /* Loop control variable */; // Build the symbol list bae_prtdialog(REPLSTSYMS); while (scanddbenames(LIBFILE,ddbclass,ename)==1) { // Test on program abort request if (kbhit()) { getchr(); if (verify(UPRPEXIT,0)) { // Flush scan cache scanddbenames(LIBFILE,0,""); error_abort(); } else { bae_prtdialog(REPLSTSYMS); } } if (strmatch(ename,symnamepattern)) gcsymbol(ename); } // Get the symbols characteristics for (i=0;i strlen(symbols[i].pn)*SYMCHRW) symbols[i].sizex= mmceil(pool.MACRO.MUX-pool.MACRO.MLX); else symbols[i].sizex= mmceil(strlen(symbols[i].pn)*SYMCHRW); symbols[i].sizey=mmceil(pool.MACRO.MUY-pool.MACRO.MLY)+VSHIFT; // Release the macro element lay_macrelease(pool); } // Catch macro load caused setup save request bae_postprocess(); // Clear the dialog line bae_prtdialog(""); } void gcsymbol(string pn) /* // Get or create some symbol list entry // Parameters : // string pn : Part name */ { int idx = (-1) /* Insert index */; int i /* Loop control variable */; // Try to find the symbol if (findsymbol(pn,idx)>=0) // Error; multiple defined symbol errormsg(ERRDBLDEFSYM,pn); // Insert the new entry to the symbol list symboln++; for (i=symboln-2;i>=idx;i--) symbols[i+1]=symbols[i]; symbols[idx]=NULLSP; symbols[idx].pn=pn; } int findsymbol(string pn,int insidx) /* // Binary search symbol in the symbol list // Return value : // symbol list index or (-1) if not found // Parameters : // string pn : Part name // int insidx : Insert index */ { int slb = 0 /* Search lower boundary */; int sub = symboln-1 /* Search upper boundary */; int idx /* Search index */; int compres /* Compare result */; // Init the insert index insidx=(-1); // Loop until search area empty while (slb<=sub) { // Get the search index idx=(slb+sub)>>1; // Get and test the compare result if ((compres=numstrcmp(pn,symbols[idx].pn))==0) return(idx); // Update the search area if (compres<0) sub=idx-1; else slb=idx+1; } // Set the insert index insidx=slb; // Return the not found code return(-1); } void placesymbols() /* // Place all defined symbols to the sheets */ { int i /* Loop control variable */; // Print message bae_prtdialog(REPPLCSYMS); // Init the current x placement coordinate curxs=SHW; curys=SHH-VSHIFT; rows[rown].rh=0.0; // Loop thru all symbols for (i=0;i SHW-HSHIFT || symbols[i].sizey > SHH-VSHIFT-FOOTERH) { sprintf(msgs[msgn],WRNPRTMISFIT,symbols[i].pn); msgn++; continue; } // Set the symbol fit flag symbols[i].fitflag=1; // Check if this symbol fits to current row if (curxs+symbols[i].sizex+HSHIFT > SHW || (rows[rown].rh!=0.0 && rows[rown].rh=FOOTERH)) { if (rows[rown].rh!=0.0 && rows[rown].rh=FOOTERH) { curys=SHH-VSHIFT; } else { if (curys-rows[rown].rh rows[rown].rh) rows[rown].rh=symbols[i].sizey; // Update the current row x size curxs+=symbols[i].sizex+HSHIFT; } // Init the current y placement coordinate curys=0.0; // Loop thru all rows for (i=1;i<=rown;i++) { // Test on program abort request if (kbhit()) { getchr(); if (verify(UPRPEXIT,0)) error_abort(); else bae_prtdialog(REPPLCSYMS); } // Check if this row fits to current sheet if ((curys-=(rows[i].rh+VSHIFT)) < FOOTERH) { // Start new sheet sheetn++; sheets[sheetn].sn=SHNPREFIX+itoa(sheetn); sheets[sheetn].frow=i; strlower(sheets[sheetn].sn); curys=SHH-rows[i].rh-VSHIFT; } // Place the row to the current sheet rows[i].shn=sheetn; rows[i].rb=curys; } // Clear the dialog line bae_prtdialog(""); } void buildsheets() /* // Create and place all sheets */ { string LIBFILEU /* Library file upper case */; string footer /* Footer text */; string firstname, lastname /* Element name range */; string ecomment /* Element comment */; double plcx,plcy /* Placement coords */; int gridlock /* Grid lock flag */; int namelim /* Name length limit */; int i,j,k /* Loop control variables */; // Upper case the library file name strupper(LIBFILEU=LIBFILEP); // Check the footer text length sprintf(footer,FOOTER,LIBFILEU,ITEMS,sheetn,'+'); if (strlen(footer)>MAXKEYLEN) { // Shorten file name namelim=MAXKEYLEN-3-strlen(footer)+strlen(LIBFILEU); LIBFILEU="..."+strextract(LIBFILEU,strlen(LIBFILEU)-namelim, strlen(LIBFILEU)); } // List all sheets for (i=1;i<=sheetn;i++) { // Test on program abort request if (kbhit()) { getchr(); if (verify(UPRPEXIT,0)) error_abort(); } // Delete this element (ignore errors) ddbdelelem(LIBFILE,topddbclass,sheets[i].sn); // Create a new sheet bae_clriactqueue(); bae_storemenuiact(1,dcemenuitem,LMB); bae_storetextiact(1,LIBFILEX); bae_storetextiact(1,sheets[i].sn); if (bae_plannotsaved()) bae_storetextiact(1,M_UINYES()); bae_storetextiact(1,itoa(1000*SHW)); bae_storetextiact(1,itoa(1000*SHH)); bae_setintpar(22,1); call(MNU_GEDCREELEM); bae_setintpar(22,0); firstname=lastname=""; // Enlarge the workspace baewsresize(BEL,0); // Create the grafic frame bae_clearpoints(); if (bae_storepoint(0.0,0.0,0) || bae_storepoint(SHW,0.0,0) || bae_storepoint(SHW,SHH,0) || bae_storepoint(0.0,SHH,0) || bae_storepoint(0.0,0.0,0) || ged_storepoly(DOCLAYER,L_POLYDOCLINE,"",VISALWAYS)) error(ERRPOLY); // Create the footer top line bae_clearpoints(); if (bae_storepoint(0.0,0.01,0) || bae_storepoint(SHW,0.01,0) || ged_storepoly(DOCLAYER,L_POLYDOCLINE,"",VISALWAYS)) error(ERRPOLY); // Generate and place the footer text sprintf(footer,FOOTER,LIBFILEU,ITEMS,i,(ii) break; // Loop thru all symbols of the row for (k=rows[j].rfp;kj) break; // Test if symbol fits if (!symbols[k].fitflag) continue; // Set the placement coordinates plcx=symbols[k].plcx+symbols[k].wsnx -symbols[k].wslx+HSHIFT; plcy=rows[j].rb+symbols[k].wsny -symbols[k].wsly+VSHIFT; lastname=symbols[k].pn; if (firstname=="") firstname=lastname; // Place the symbol if (ddbclass==DDBCLLPRT || ddbclass==DDBCLLSTK) { if (SYMNNAME) { if (ged_storepart(SYMNPREF+ itoa(k),lastname, plcx,plcy,0.0,0)<0) { sprintf(msgs[msgn], WRNPARTPLC,lastname); msgn++; } } else { if (ged_storepart(lastname, lastname,plcx,plcy,0.0,0)<0) { sprintf(msgs[msgn], WRNPARTPLC,lastname); msgn++; } } } else if (ddbclass==DDBCLLPAD) { if (ged_storeuref(lastname, plcx,plcy,0.0,DOCLAYER,0)) { sprintf(msgs[msgn], WRNPARTPLC,lastname); msgn++; } } // Increment the placement count placecount++; // Place the symbol name text strupper(symbols[k].pn); if (ged_storetext(symbols[k].pn, symbols[k].plcx+HSHIFT,rows[j].rb+0.001, 0.0,SYMCHRH,DOCLAYER,0)) errormsg(ERRTEXT,symbols[k].pn); } // Underline the row if top of footer top line if (rows[j].rb>FOOTERH) { bae_clearpoints(); if (bae_storepoint(0.0,rows[j].rb,0) || bae_storepoint(SHW,rows[j].rb,0) || ged_storepoly(DOCLAYER, L_POLYDOCLINE,"",VISALWAYS)) error(ERRPOLY); } } // Test if plot format if (PLTFMT) { // Free the grid lock if not yet free if ((gridlock=bae_getgridlock())!=0) bae_setgridlock(0); // Shift the plan/plot to fit to paper // Set the lower boundary bae_clriactqueue(); bae_storemouseiact(1,XLPLT,YLPLT,0,LMB); call(MNU_GEDPARLBND); // Set the origin bae_clriactqueue(); bae_storemouseiact(1,XPLTOFF,YPLTOFF,0,LMB); call(MNU_GEDPARORIG); // Restore the gridlock bae_setgridlock(gridlock); } // Resize the workspace if (ddbclass==DDBCLLPAD && !PLTFMT) baewsshrink(1); else baewsresize(-BEL,0); // Set element comment ecomment= firstname+(lastname==firstname ? "" : (" - "+lastname)); bae_setstrpar(0,ecomment); // Save the element bae_clriactqueue(); bae_setintpar(22,1); call(MNU_GEDSAVELEM); bae_setintpar(22,0); if (topddbclass==DDBCLLSTK) { // Delete this element (ignore errors) ddbdelelem(LIBFILE,DDBCLLPRT,sheets[i].sn); // Create a new sheet bae_clriactqueue(); bae_storemenuiact(1,MENUITMPRT,LMB); bae_storetextiact(1,LIBFILEX); bae_storetextiact(1,sheets[i].sn); if (bae_plannotsaved()) bae_storetextiact(1,M_UINYES()); bae_storetextiact(1,itoa(1000*SHW)); bae_storetextiact(1,itoa(1000*SHH)); bae_setintpar(22,1); call(MNU_GEDCREELEM); bae_setintpar(22,0); // Enlarge the workspace baewsresize(BEL,0); // Store the sheet part if (ged_storepart(sheets[i].sn, sheets[i].sn,0.0,0.0,0.0,0)<0) { sprintf(msgs[msgn], WRNPARTPLC,sheets[i].sn); msgn++; } baewsresize(-BEL,0); // Set element comment bae_setstrpar(0,ecomment); // Save the element bae_clriactqueue(); bae_setintpar(22,1); call(MNU_GEDSAVELEM); bae_setintpar(22,0); } if (topddbclass==DDBCLLSTK || topddbclass==DDBCLLPRT) { // Delete this element (ignore errors) ddbdelelem(LIBFILE,DDBCLLAY,sheets[i].sn); // Create a new sheet bae_clriactqueue(); bae_storemenuiact(1,MENUITMLAY,LMB); bae_storetextiact(1,LIBFILEX); bae_storetextiact(1,sheets[i].sn); if (bae_plannotsaved()) bae_storetextiact(1,M_UINYES()); bae_storetextiact(1,itoa(1000*SHW)); bae_storetextiact(1,itoa(1000*SHH)); bae_setintpar(22,1); call(MNU_GEDCREELEM); bae_setintpar(22,0); // Enlarge the workspace baewsresize(BEL,0); // Store the sheet part if (ged_storepart(sheets[i].sn, sheets[i].sn,0.0,0.0,0.0,0)<0) { sprintf(msgs[msgn], WRNPARTPLC,sheets[i].sn); msgn++; } baewsresize(-BEL,0); // Set element comment bae_setstrpar(0,ecomment); // Save the element bae_clriactqueue(); bae_setintpar(22,1); call(MNU_GEDSAVELEM); bae_setintpar(22,0); } // Store the report message sprintf(msgs[msgn],REPSHEET,LIBFILE,ITEMS,sheets[i].sn); msgn++; } } // Data conversion routines double mmceil(double val) /* // Round meter input value up to next cm // Return value : // rounded value in meters // Parameters : // double val : Input value */ { // Calculate result and return it return(ceil(val*100.0)/100.0); } // User Language program end