/* SCMBOUND (SCM) -- Set SCM Workspace/Element Boundary */ /* SCMBOUND (SCM) -- SCM-Arbeitsbereich/Elementgrenzen setzen */ /* -- INTENDED FOR KEY-CALL USE -- */ /* // Copyright (c) 1993-2012 Oliver Bartels F+E, Muenchen // Author: Manfred Baumeister // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091103) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (080620) ENHANCEMENT: // Added new workspace rectangle function. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (051004) ENHANCEMENT: // Added sheet size setting option. // rl (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (030904) RELEASED FOR BAE V6.2. // 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 (000509) RELEASED FOR BAE V4.6. // rl (990625) RELEASED FOR BAE V4.4. // rl (980910) RELEASED FOR BAE V4.2. // mb (980710) ENHANCEMENT: // Dynamic multi-language support introduced. // rl (970929) RELEASED FOR BAE V4.0. // mb (960919) RELEASED FOR BAE V3.4. // mb (95) RELEASED FOR BAE V3.2. // mb (94) RELEASED FOR BAE V3.0. // mb (93) RELEASED FOR BAE V2.6. // mb (93) ORIGINAL CODING. // // DESCRIPTION // // The scmbound User Language program provides functions for // automatically enlarging and/or shrinking the element // boundaries of the currently loaded SCM element. */ // Enforce SCM caller type #pragma ULCALLERSCM // Disable undo state request #pragma ULCALLERNOUNDO // Includes #include "scm.ulh" // User Language SCM utilities // INI file parameter name definitions #define PAR_BOUNDEL "BOUNDEL_SCM" // Boundary enlarge length [m] #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_HSYMBOL2 "HSYMBOL2_SCM" // Alternate header symbol macro name // Messages string UPRABORT = M_UPRABORT(); string UPRBOUNDFCT = M("Workspace-Aenderungsfunktion selektieren!", "Select Workspace Change Function!"); string UPRBOUNDSHR = M("Workspace &kleiner","&Shrink Workspace"); string UPRBOUNDENL = M("Workspace &groesser","&Enlarge Workspace"); string UPRBOUNDSHT = M("%Neue &Blattgroesse","%New S&heet Size"); string UPRBOUNDRCT = M("Neues Workspace &Rechteck", "New Workspace &Rectangle"); string UPRORGSNAP = M("%&Nullpunkt ins Eingaberaster", "%&Origin Snap to Input Grid"); string UPRORGLROT = M("Arbeitsbereich &links drehen", "Rotate Workspace &Left"); string UPRORGRROT = M("Arbeitsbereich r&echts drehen", "Rotate Workspace R&ight"); string UPRSHEETSIZE = M("Blattgroesse waehlen","Select Sheet Size"); string UPRSHET00 = M("A0 Hochformat","A0 Portrait"); string UPRSHET01 = M("A&0 Querformat","A&0 Landscape"); string UPRSHET02 = M("A1 Hochformat","A1 Portrait"); string UPRSHET03 = M("A&1 Querformat","A&1 Landscape"); string UPRSHET04 = M("A2 Hochformat","A2 Portrait"); string UPRSHET05 = M("A&2 Querformat","A&2 Landscape"); string UPRSHET06 = M("A3 Hochformat","A3 Portrait"); string UPRSHET07 = M("A&3 Querformat","A&3 Landscape"); string UPRSHET08 = M("A4 Hochformat","A4 Portrait"); string UPRSHET09 = M("A&4 Querformat","A&4 Landscape"); string UPRSHET10 = M("%Letter Hochformat","%Letter Portrait"); string UPRSHET11 = M("&Letter Querformat","&Letter Landscape"); string UPRSHET12 = M("%Tabloid Hochformat","%Tabloid Portrait"); string UPRSHET13 = M("&Tabloid Querformat","&Tabloid Landscape"); string UPRSELWINS = M("Erste Ecke Workspace-Rechteck waehlen!", "Select 1st Workspace Rectangle Point!"); string UPRSELWINE = M("Zweite Ecke Workspace-Rechteck waehlen!", "Select 2nd Workspace Rectangle Point!"); string ERRINVWIN = M("Ungueltiges Workspace-Rechteck selektiert!", "Invalid Workspace Rectangle Selected!"); // Globals double BEL = bae_inidblval(PAR_BOUNDEL,0.005) /* Boundary enlarge length 5 mm */; // Main program void main() { index C_FIGURE fig /* Figure list index */; index C_CONSEG conseg /* Connection segment index */; index C_NREF nref /* Named reference index */; index C_ATTRIBUTE attr /* Attribute index */; string grpname /* Current group name */; string libdir /* Library directory name */; string libname /* Plan header library name */; string lastname /* Last reference name */; string headgrp /* Header group name */; string headext /* Header group name extension */; string hsymbol2 /* Header symbol alternate macro */; string macname /* Symbol macro name */; int sidx /* Size index */; int rangedis /* Range check disabled flag */; double x1,y1 /* Rectangle first corner */; double x2,y2 /* Rectangle second corner */; int i, j /* Loop control variables */; struct sheetdes { // Sheet descriptor double w, h /* Sheet size */; string defname /* Sheet default name */; string parname /* Sheet name parameter */; }; struct sheetdes stab[] = { // Sheet table { 0.841, 1.189, "a0p", PAR_SCMHEADA0P }, { 1.189, 0.841, "a0l", PAR_SCMHEADA0L }, { 0.594, 0.841, "a1p", PAR_SCMHEADA1P }, { 0.841, 0.594, "a1l", PAR_SCMHEADA1L }, { 0.420, 0.594, "a2p", PAR_SCMHEADA2P }, { 0.594, 0.420, "a2l", PAR_SCMHEADA2L }, { 0.297, 0.420, "a3p", PAR_SCMHEADA3P }, { 0.420, 0.297, "a3l", PAR_SCMHEADA3L }, { 0.210, 0.297, "a4p", PAR_SCMHEADA4P }, { 0.297, 0.210, "a4l", PAR_SCMHEADA4L }, { 0.2159, 0.2794, "letterp", PAR_SCMHEADLP }, { 0.2794, 0.2159, "letterl", PAR_SCMHEADLL }, { 0.2794, 0.4318, "tabloidp", PAR_SCMHEADTP }, { 0.4318, 0.2794, "tabloidl", PAR_SCMHEADTL } }; struct hsymdes { // Header symbol descriptor string macname /* Macro name name */; string anl[] /* Attribute name list */; string avl[] /* Attribute value list */; int an /* Attribute count */; } hsyml[] /* Header symbol list */; int hsymn = 0 /* Header symbol count */; // Abort if not in Schematic Editor if (!(uliptype() & ULIPSCM)) error_class(); // Abort if invalid plan class if (bae_planddbclass()==DDBCLUNDEF) error_class(); // Ask user for boundary set function bae_defmenusel(-1); bae_promptdialog(UPRBOUNDFCT); switch (bae_askmenu(8,UPRBOUNDSHR,UPRBOUNDENL, (bae_planddbclass()==DDBCLSCM ? "" : ",")+UPRBOUNDSHT, UPRBOUNDRCT,UPRORGSNAP,UPRORGLROT,UPRORGRROT,UPRABORT)) { // Workspace shrink case 0 : baewsshrink(1); break; // Workspace enlarge case 1 : baewsresize(BEL,1); break; // Set sheet size case 2 : // Abort if invalid plan class if (bae_planddbclass()!=DDBCLSCM) error_class(); varcheck(); // Ask user for new sheet size bae_promptdialog(UPRSHEETSIZE); // Activate the menu if ((sidx=bae_askmenu(15, UPRSHET00,UPRSHET01,UPRSHET02,UPRSHET03,UPRSHET04,UPRSHET05, UPRSHET06,UPRSHET07,UPRSHET08,UPRSHET09,UPRSHET10,UPRSHET11, UPRSHET12,UPRSHET13,UPRABORT))<0 || sidx>13) error_abort(); bae_clriactqueue(); bae_storemouseiact(1,bae_planwslx()+stab[sidx].w, bae_planwsly()+stab[sidx].h,0,LMB); bae_callmenu(MNU_SCMPARUBND); bae_callmenu(MNU_BAEZOOMALL); // Check if automatic plan header import if ((libname=bae_inistrval(PAR_SCMHEADLIB,"stdsym"))=="") break; if ((headgrp= bae_inistrval(stab[sidx].parname,stab[sidx].defname))=="") break; if ((headext=bae_inistrval(PAR_SCMHEAD1ST,""))!="" && (hsymbol2=bae_inistrval(PAR_HSYMBOL2,"planheadlay"))!="") // Check if alternate header symbol macro forall (fig where fig.TYP==C_FIGNREF && fig.RULEOBJID>=0 && fig.NREF.MACRO.NAME==hsymbol2) // Query group name predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ, RS_GROUPNAME,"?s",grpname)>0 && grpname=="header") { headgrp=headgrp+headext; break; } // 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; bae_callmenu(MNU_SCMGRPRESE); // Select old header group elements forall (fig where fig.TYP!=C_FIGCON && fig.RULEOBJID>=0) { // Query group name predicate if (cap_rulequery(RS_OCFIG,fig,RS_SCMSUBJ,RS_GROUPNAME, "?s",grpname)<1 || grpname!="header") continue; scm_elemgrpchg(fig,1); if (fig.TYP==C_FIGNREF) { nref=fig.NREF; if (nref.MACRO.CLASS!=DDBCLSSYM) continue; // Check if unsupported multiple macro ref. macname=nref.MACRO.NAME; for (i=0;i=0) { // Query group name predicate if (cap_rulequery(RS_OCCON,conseg,RS_SCMSUBJ, RS_GROUPNAME,"?s",grpname)<1 || grpname!="header") continue; scm_conseggrpchg(conseg,1); } bae_callmenu(MNU_SCMDELGRP); bae_clriactqueue(); bae_storetextiact(1,libname); bae_storetextiact(1,headgrp); bae_storemouseiact(1,bae_planwsnx(),bae_planwsny(),0,LMB); bae_callmenu(MNU_SCMLOADGRP); // Transfer header symbol attributes forall (fig where fig.GROUP && fig.TYP==C_FIGNREF && fig.RULEOBJID>=0) { nref=fig.NREF; if (nref.MACRO.CLASS!=DDBCLSSYM || lastname==nref.NAME) continue; lastname=nref.NAME; // Check if unsupported multiple macro ref. macname=nref.MACRO.NAME; for (i=0;ix2 ? x1 : x2,y1>y2 ? y1 : y2,0,LMB); call(MNU_SCMPARUBND); bae_setintpar(0,rangedis); break; // Snap origin to input grid case 4 : moverotelem(0); break; // Left rotate element case 5 : moverotelem(1); break; // Right rotate element case 6 : moverotelem(2); break; } // Clear the dialog line bae_prtdialog(""); } void moverotelem(int mode) /* // Move/rotate current element // Parameter: // int mode : Move/rotate mode */ { double lx, ly /* Old lower boundary */; double ux, uy /* New lower boundary */; double nx, ny /* Origin shift */; int anglock /* Angle lock flag */; int gridlock /* Grid lock flag */; int rangedis /* Range check disabled flag */; int expertmode /* Expert mode */; // Group select all elements gridlock=bae_getgridlock(); anglock=bae_getanglelock(); bae_getintpar(0,rangedis); // Free grid lock bae_setgridlock(0); // Fix angle lock bae_setanglelock(1); // Disable range check bae_setintpar(0,1); // Perform the group polygon call bae_clriactqueue(); bae_storemenuiact(1,4,LMB); bae_storemenuiact(1,0,LMB); bae_storemouseiact(1,bae_planwslx(),bae_planwsly(),0,LMB); bae_storemouseiact(1,bae_planwsux(),bae_planwsly(),0,LMB); bae_storemouseiact(1,bae_planwsux(),bae_planwsuy(),0,LMB); bae_storemouseiact(1,bae_planwslx(),bae_planwsuy(),0,LMB); bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,0,LMB); call(MNU_SCMGRPPOLY); // Restore grid/angle lock bae_setintpar(0,rangedis); bae_setanglelock(0); // Get current origin nx=bae_planwsnx(); ny=bae_planwsny(); // Get current boundaries lx=bae_planwslx(); ly=bae_planwsly(); ux=bae_planwsux(); uy=bae_planwsuy(); if (mode==0) { // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact( 1,(nx<0.0 ? ux-nx : ux)+BEL,(ny<0.0 ? uy-ny : uy)+BEL,0,LMB); call(MNU_SCMPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact( 1,(nx>0.0 ? lx-nx : lx)-BEL,(ny>0.0 ? ly-ny : ly)-BEL,0,LMB); call(MNU_SCMPARLBND); } // Set the expert mode expertmode=101; bae_storepoint(0.0,0.0,expertmode); // Move group bae_clriactqueue(); bae_storemouseiact(1,nx,ny,0,LMB); switch (mode) { // Rotate left case 1 : bae_storemouseiact(1,0.0,0.0,0,RMB); bae_storemenuiact(1,4,LMB); bae_storemouseiact(1,nx,ny,0,LMB); break; // Rotate right case 2 : bae_storemouseiact(1,0.0,0.0,0,RMB); bae_storemenuiact(1,5,LMB); bae_storemouseiact(1,nx,ny,0,LMB); break; case 0 : default : bae_storemouseiact(1,0.0,0.0,0,LMB); } call(MNU_SCMMOVEGRP); // Reset the expert mode expertmode++; bae_storepoint(0.0,0.0,expertmode); switch (mode) { // Rotate left case 1 : // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact(1,nx-(ly-ny),ny+(ux-nx),0,LMB); call(MNU_SCMPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact(1,nx-(uy-ny),ny+(lx-nx),0,LMB); call(MNU_SCMPARLBND); break; // Rotate right case 2 : // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact(1,nx+(uy-ny),ny-(lx-nx),0,LMB); call(MNU_SCMPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact(1,nx+(ly-ny),ny-(ux-nx),0,LMB); call(MNU_SCMPARLBND); break; case 0 : default : // Set origin to grid origin bae_clriactqueue(); bae_storemouseiact(1,0.0,0.0,0,LMB); call(MNU_SCMPARORIG); // Parameter - Set Upper Boundary bae_clriactqueue(); bae_storemouseiact(1,ux-nx,uy-ny,0,LMB); call(MNU_SCMPARUBND); // Parameter - Set Lower Boundary bae_clriactqueue(); bae_storemouseiact(1,lx-nx,ly-ny,0,LMB); call(MNU_SCMPARLBND); nx=ny=0.0; } // Set origin bae_clriactqueue(); bae_storemouseiact(1,nx,ny,0,LMB); call(MNU_SCMPARORIG); // Restore old angle lock bae_setanglelock(anglock); // Restore old grid lock bae_setgridlock(gridlock); // Group deselect all elements call(MNU_SCMGRPRESE); // Zoom all bae_clriactqueue(); call(MNU_BAEZOOMALL); } // User Language program end