/* SMALLER (STD) -- Reduce Current Element Size/Width */ /* SMALLER (STD) -- Pickelement verkleinern/verschmaelern */ /* -- INTENDED FOR KEY-CALL USE (:Reduce) -- */ /* // Copyright (c) 2003-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // 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 (060829) RELEASED FOR BAE V6.8. // rl (051212) ENHANCEMENT: // Added fixed width/height lists support. // rl (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (031127) ORIGINAL CODING. // // DESCRIPTION // // The smaller User Language program designates the currently // active BAE menu function and performs a submenu interaction // for reducing the currently processed object size (if an object is picked // and if reducing is permitted). This program must be configured for // implicit hotkey program call // (e.g. ). */ // Includes #include "std.ulh" // User Language standard include // Enforce editor caller type #pragma ULCALLEREDT // Disable undo state request #pragma ULCALLERNOUNDO // INI file parameter name definitions #define PAR_GEDTRCL "PATHENLARGE_GED" // Layout path enlarge value #define PAR_GEDTRCWL "PATHWIDTHL_GED" // Layout path width list #define PAR_GEDTXTL "TEXTENLARGE_GED" // Layout text enlarge value #define PAR_GEDTXTHL "TEXTHEIGHTL_GED" // Layout text height list #define PAR_GEDGRPL "GRPENLARGE_GED" // Layout group enlarge value #define PAR_CEDTRCL "PATHENLARGE_CED" // IC path enlarge value #define PAR_CEDTRCWL "PATHWIDTHL_CED" // IC path width list #define PAR_CEDTXTL "TEXTENLARGE_CED" // IC text enlarge value #define PAR_CEDTXTHL "TEXTHEIGHTL_CED" // IC text height list #define PAR_CEDGRPL "GRPENLARGE_CED" // IC group enlarge value #define PAR_CEDMACL "MACENLARGE_CED" // IC macro enlarge value // Globals #define GV_STARTW "enlarge_swidth" // Enlarge start width variable #define GV_STARTX "enlarge_sx" // Enlarge start x variable #define GV_STARTY "enlarge_sy" // Enlarge start y variable #define GV_CURW "enlarge_cwidth" // Enlarge current width var. #define SMALLVAL 0.000000001 // Small compare value // Main program void main() { // Test the interpreter type switch (uliptype()) { /* SCM */ case ULIPSCM : break; /* GED */ case ULIPGED : reduce_ged(); break; /* CED */ case ULIPCED : reduce_ced(); break; // Ignore on default default : break; } // Done } void reduce_ged() /* // Reduce picked GED objects size */ { double lastsize /* Last size */; double lastx, lasty /* Last coordinates */; double oldsize /* Old element size */; double oldx, oldy /* Old element coordinates */; double cx, cy /* Current mouse coordinates */; double cursize /* Current set element size */; double newsize /* New element size */; double drcsize /* DRC size */; double enlarge /* Enlarge value */; double sizel[] /* Size list */; int sizen /* Size count */; int sidx /* Size scan index */; index L_TEXT text /* Text index */; index L_LEVEL lev /* Path level index */; int layer /* Path layer */; int expertmode /* Expert mode */; // Get the currently active menu switch (bae_getactmenu()) { // Text movement functions case MNU_GEDADDTEXT : case MNU_GEDMOVETEXT : case MNU_GEDCOPYTEXT : case MNU_GEDMOVENAME : case MNU_GEDMOVEATTR : if (ged_getinputdata(0.0,0.0,0.0,0,0.0,0.0,0.0,0,text,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0) { oldsize=text.SIZE; for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_GEDTXTHL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_GEDTXTL,0.0005); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx(-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,7,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); } break; // Trace corner functions case MNU_GEDADDTRC : case MNU_GEDADDFTRC : case MNU_GEDTRCINSC : case MNU_GEDTRCMDC : if ((ged_getinputdata(oldx,oldy,oldsize,layer,0.0,0.0,0.0,0,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0,lev)==0 && oldsize!=0.0) || (ged_getinputdata(0.0,0.0,0.0,0,oldx,oldy,oldsize,layer,0,lev, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0)) { // Query last data if (varget(GV_STARTW,lastsize)) lastsize=0.0; if (varget(GV_CURW,cursize)) lastsize=0.0; if (varget(GV_STARTX,lastx)) lastx=0.0; if (varget(GV_STARTY,lasty)) lasty=0.0; if (fabs(oldsize-cursize)<=SMALLVAL && (fabs(oldx-lastx)>SMALLVAL || fabs(oldy-lasty)>SMALLVAL) && oldsize>lastsize) { newsize=lastsize; } else { for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_GEDTRCWL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_GEDTRCL, 0.0001); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx (-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } lastsize=oldsize; // Get the current mouse position bae_wsmouse(cx,cy,0); // Put mouse position to input grid bae_storemouseiact(3,cx,cy,0,LMB); bae_inpoint(cx,cy,cx,cy,0); // Set the expert mode expertmode=101; bae_storepoint(0.0,0.0,expertmode); bae_clearpoints(); bae_storepoint(cx,cy,0); bae_storepoint(oldx,oldy,0); // Search maximum path size drcsize=newsize; if (sizen==0) { do { if (ged_drcpath( layer,drcsize,lev,1)==0) break; drcsize-=enlarge; } while (drcsize>0.0); } else { sidx--; while (sidx>=0) { if (ged_drcpath( layer,sizel[sidx],lev,1)==0) break; sidx--; } drcsize= sidx<0 ? sizel[0] : sizel[sidx]; } if (drcsize>=0.0) newsize=drcsize; // Reset the expert mode expertmode++; bae_storepoint(0.0,0.0,expertmode); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,lay_menulaylinecnt()+9,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); // Store settings for next call if (fabs(oldx-lastx)>SMALLVAL || fabs(oldy-lasty)>SMALLVAL || fabs(oldsize-cursize)>SMALLVAL) varset(GV_STARTW,oldsize); varset(GV_STARTX,oldx); varset(GV_STARTY,oldy); varset(GV_CURW,newsize); } break; // Trace segment edit functions case 403 : case 404 : if ((ged_getinputdata(oldx,oldy,oldsize,layer,0.0,0.0,0.0,0,0, lev,0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0) || (ged_getinputdata(0.0,0.0,0.0,0,oldx,oldy,oldsize,layer,0,lev, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0)) { // Query last data if (varget(GV_STARTW,lastsize)) lastsize=0.0; if (varget(GV_CURW,cursize)) lastsize=0.0; if (varget(GV_STARTX,lastx)) lastx=0.0; if (varget(GV_STARTY,lasty)) lasty=0.0; if (fabs(oldsize-cursize)<=SMALLVAL && (fabs(oldx-lastx)>SMALLVAL || fabs(oldy-lasty)>SMALLVAL) && oldsize>lastsize) { newsize=lastsize; } else { for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_GEDTRCWL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_GEDTRCL, 0.0001); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx (-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } lastsize=oldsize; // Get the current mouse position bae_wsmouse(cx,cy,0); // Set the expert mode expertmode=101; bae_storepoint(0.0,0.0,expertmode); bae_clearpoints(); bae_storepoint(cx,cy,0); bae_storepoint(oldx,oldy,0); // Search maximum path size drcsize=newsize; if (sizen==0) { do { if (ged_drcpath( layer,drcsize,lev,1)==0) break; drcsize-=enlarge; } while (drcsize>0.0); } else { sidx--; while (sidx>=0) { if (ged_drcpath( layer,sizel[sidx],lev,1)==0) break; sidx--; } drcsize= sidx<0 ? sizel[0] : sizel[sidx]; } if (drcsize>=0.0) newsize=drcsize; // Reset the expert mode expertmode++; bae_storepoint(0.0,0.0,expertmode); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,lay_menulaylinecnt()+6,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); // Store settings for next call if (fabs(oldx-lastx)>SMALLVAL || fabs(oldy-lasty)>SMALLVAL || fabs(oldsize-cursize)>SMALLVAL) varset(GV_STARTW,oldsize); varset(GV_STARTX,oldx); varset(GV_STARTY,oldy); varset(GV_CURW,newsize); } break; // Group movement functions case MNU_GEDMOVEGRP : case MNU_GEDCOPYGRP : case MNU_GEDLOADGRP : case MNU_BAEGRPPASTE : case 415 : case 416 : if ((enlarge=bae_inidblval(PAR_GEDGRPL,2.0))<=0.0) break; bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,12,LMB); bae_storetextiact(1,ftoa(1.0/enlarge,10)); break; // Ignore on default default : break; } // Done } void reduce_ced() /* // Reduce picked CED objects size */ { double newsize /* New element size */; double oldsize /* Old element size */; double enlarge /* Enlarge value */; double sizel[] /* Size list */; int sizen /* Size count */; int sidx /* Size scan index */; index I_NREF nref /* Named reference index */; index I_TEXT text /* Text index */; // Get the currently active menu switch (bae_getactmenu()) { // Macro movement functions case MNU_CEDADDMAC : case MNU_CEDMOVEMAC : case MNU_CEDNEXTMAC : if (ced_getinputdata(0.0,0.0,0.0,0,0.0,0.0,0.0,0,nref,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0) { if ((enlarge=bae_inidblval(PAR_CEDMACL,2.0))<=0.0) break; bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,6,LMB); bae_storetextiact( 1,ftoa(nref.SCALE/enlarge,10)); } break; // Trace corner functions case 400 : case 401 : case 402 : if ((ced_getinputdata(0.0,0.0,oldsize,0,0.0,0.0,0.0,0,0,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0) || (ced_getinputdata(0.0,0.0,0.0,0,0.0,0.0,oldsize,0,0,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0)) { for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_CEDTRCWL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_CEDTRCL,0.000001); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx(-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,11,LMB); bae_storemenuiact(1,3,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); } break; // Trace segment edit functions case 403 : case 404 : if ((ced_getinputdata(0.0,0.0,oldsize,0,0.0,0.0,0.0,0,0,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0) || (ced_getinputdata(0.0,0.0,0.0,0,0.0,0.0,oldsize,0,0,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0 && oldsize!=0.0)) { for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_CEDTRCWL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_CEDTRCL,0.000001); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx(-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,9,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); } break; // Text movement functions case MNU_CEDADDTEXT : case MNU_CEDMOVETEXT : case MNU_CEDCOPYTEXT : case MNU_CEDMOVENAME : if (ced_getinputdata(0.0,0.0,0.0,0,0.0,0.0,0.0,0,text,0, 0.0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0)==0) { oldsize=text.SIZE; for (sizen=0;sizen<1000;sizen++) if ((sizel[sizen]=bae_inidblval( bae_iniarrayvarname(PAR_CEDTXTHL, sizen),0.0))==0.0) break; if (sizen==0) { enlarge=bae_inidblval(PAR_CEDTXTL,0.000005); if (enlarge>oldsize) break; newsize=oldsize-enlarge; } else { // Scan to size in list for (sidx=0;sidx(-SMALLVAL)) break; if (sidx>0) newsize=sizel[sidx-1]; else break; } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,6,LMB); bae_storetextiact(1,ftoa(cvtlength(newsize,0,2),10)); } break; // Group movement functions case MNU_CEDMOVEGRP : case MNU_CEDCOPYGRP : case MNU_CEDLOADGRP : if ((enlarge=bae_inidblval(PAR_CEDGRPL,2.0))<=0.0) break; bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,12,LMB); bae_storetextiact(1,ftoa(1.0/enlarge,10)); break; // Ignore on default default : break; } // Done } // User Language program end