/* LROTATE (STD) -- Left Rotate Pick Element, Change Angle Direction */ /* LROTATE (STD) -- Pickelement Linksdrehung, Winkelrichtung wechseln */ /* -- INTENDED FOR KEY-CALL USE (:Left Rotate) -- */ /* // Copyright (c) 1995-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 (100427) ENHANCEMENT: // Added angle direction vector rotation. // rl (091021) RELEASED FOR BAE V7.4. // rl (091009) ENHANCEMENT: // Added trace/polygon edit angle direction toggle option. // rl (081014) RELEASED FOR BAE V7.2. // rl (080915) ENHANCEMENT: // Added any element rotate option. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (050906) RELEASED FOR BAE V6.6. // rl (050303) ENHANCEMENT: // Activating step angle configuration for menu idle call. // 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. // mb (010323) BUGFIX: // Allow for program call in other than Layout Editor. // rl (001109) ENHANCEMENT: // Arbitrary Layout Editor part and text rotation angle // support added. // rl (000509) RELEASED FOR BAE V4.6. // rl (991013) RELEASED FOR BAE V4.4. // rl (980910) RELEASED FOR BAE V4.2. // rl (970929) RELEASED FOR BAE V4.0. // mb (960919) RELEASED FOR BAE V3.4. // mb (95) RELEASED FOR BAE V3.2. // mb (950103) ORIGINAL CODING. // // DESCRIPTION // // The lrotate User Language program designates the currently // active BAE menu function and performs a submenu interaction // for 90 degree left-rotate on the currently processed object // (if an object is picked and if rotation is permitted). This // program must be configured for implicit hotkey program call // (e.g. or ). */ // Includes #include "pop.ulh" // User Language popup utilities // Enforce standard caller type #pragma ULCALLERSTD // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRFCT = M("Funktion selektieren!","Select Function!"); string UPRGFCT1 = M("&Bauteile links drehen","Left Rotate &Parts"); string UPRGFCT2 = M("&Texte links drehen","Left Rotate &Texts"); string UPRGFCT3 = M("&Elemente links drehen","Left Rotate &Elements"); string UPRGFCT4 = M("&Gruppenbauteile links drehen", "Left Rotate &Group Parts"); string UPRGFCT5 = M("Gruppenbauteile &Winkel setzen", "Set Group Parts Ang&le"); string UPRGFCT6 = M("Gruppente&xte links drehen", "Left Rotate Group Te&xts"); string UPRGFCT7 = M("Gruppentexte W&inkel setzen", "&Set Group Texts Angle"); string UPRGFCT8 = M("%L/R &Drehwinkel","%L/R Rotation A&ngle"); string UPRSFCT1 = M("&Symbole/Labels links drehen", "Left Rotate &Symbols/Labels"); string UPRSFCT2 = M("&Texte links drehen","Left Rotate &Texts"); string UPRSFCT3 = M("&Elemente links drehen","Left Rotate &Elements"); string UPRSFCT4 = M("&Gruppensymbole/-labels links drehen", "Left Rotate &Group Symbols/Labels"); string UPRSFCT5 = M("Gruppensymbole/-labels &Winkel setzen", "Set Group Symbols/Labels Ang&le"); string UPRSFCT6 = M("Gruppente&xte links drehen", "Left Rotate Group Te&xts"); string UPRSFCT7 = M("Gruppentexte W&inkel setzen", "Set G&roup Texts Angle"); string UPRROTMODE = M("Hotkey-Rotationschrittweite auswaehlen!", "Select Hotkey Rotation Step Angle!"); string UPRROT1 = M(" &0 Grad"," &0 Degrees"); string UPRROT2 = M(" &90 Grad"," &90 Degrees"); string UPRROT3 = M("&180 Grad","&180 Degrees"); string UPRROT4 = M("&270 Grad","&270 Degrees"); string UPRROT5 = M("Anderer &Winkel","&Other Angle"); string UPRANG = M("Winkel ? ","Angle ? "); string UPRSELELEM = M("Element fuer Linksdrehung selektieren!", "Pick element to rotate left!"); string UPRSELTEXT = M("Text fuer Linksdrehung selektieren!", "Pick text to rotate left!"); string UPRSELPART = M("Bauteil fuer Linksdrehung selektieren!", "Pick part to rotate left!"); string UPRSELSYMBOL = M("Symbol fuer Linksdrehung selektieren!", "Pick symbol to rotate left!"); string REPSYMROT = M("%d Gruppensymbole/labels gedreht.", "Rotated %d group symbols/labels."); string REPPARTROT = M("%d Gruppenbauteile gedreht.", "Rotated %d group parts."); string REPTEXTROT = M("%d Gruppentexte gedreht.", "Rotated %d group texts."); string ERRELEMGLUED = M("Element '%s' ist verankert!", "Element '%s' is glued!"); string ERRROTATE = M("Element '%s' konnte nicht gedreht werden!", "Error rotating element '%s'!"); string ERRNOPICK = M_ERRNOPICK(); // Globals #define UL_GEDPART "gedpart" // GED part utilities program double PI = cvtangle(180.0,1,2) /* PI-value */; int ddbclass = bae_planddbclass() /* Plan DDB class */; // Main program void main() { // Test the interpreter type switch (uliptype()) { /* SCM */ case ULIPSCM : rotate_scm(); break; /* GED */ case ULIPGED : rotate_ged(); break; /* AR */ case ULIPAR : break; /* CAM */ case ULIPCAM : break; /* CED */ case ULIPCED : rotate_ced(); break; /* CV */ case ULIPCV : break; // Ignore on default default : ; } // Done } void rotate_scm() /* // Left rotate picked SCM object */ { index C_FIGURE fig /* Figure index */; index C_NREF nref /* Named reference index */; index C_TEXT text /* Text index */; index C_CONSEG conseg /* Connection segment index */; index C_BUSTAP bustap /* Bus tap index */; string s_dis = "," /* Symbol function disable */; string t_dis = "," /* Text function disable */; string gs_dis = "," /* Group symbol function disable */; string gt_dis = "," /* Group text function disable */; string e_dis = "," /* Element function disable */; double rotang = cvtangle(90.0,1,0) /* Rotation angle */; double eang /* Element angle */; string elemmsg /* Element pick message */; int elemtyp /* Element type */; int cnt = 0 /* Element count */; // Check if standalone call if (ulproginfo("",0,0)<=1 && bae_getactmenu()<0) { // Check if element type scan if (bae_iniintval(PAR_METYPSCAN,1)==1 && !bae_peekiact()) { forall (text) { t_dis=e_dis=""; break; } forall (nref) { s_dis=e_dis=""; break; } forall (fig where fig.GROUP && fig.TYP==C_FIGNREF) { gs_dis=""; break; } forall (fig where fig.GROUP && fig.TYP==C_FIGTEXT) { gt_dis=""; break; } } else { // Enable all menu items t_dis=s_dis=e_dis=gt_dis=gs_dis=""; } bae_promptdialog(UPRFCT); switch (bae_askmenu(8,s_dis+UPRSFCT1,t_dis+UPRSFCT2, e_dis+UPRSFCT3,gs_dis+UPRSFCT4,gs_dis+UPRSFCT5, gt_dis+UPRSFCT6,gt_dis+UPRSFCT7,UPRABORT)) { // Rotate symbols case 0 : // Abort if invalid plan class if (ddbclass==DDBCLUNDEF || ddbclass==DDBCLSMRK) error_class(); elemmsg=UPRSELSYMBOL; elemtyp=1<=2.0*PI) eang-=2.0*PI; if (scm_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPSYMROT,cnt); bae_prtdialog(elemmsg); exit(0); // Set group symbols/labels angle case 4 : rotang=getangle(); forall (fig where fig.GROUP && fig.TYP==C_FIGNREF) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if (scm_elemangchg(fig,rotang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPSYMROT,cnt); bae_prtdialog(elemmsg); exit(0); // Left rotate group texts case 5 : forall (fig where fig.GROUP && fig.TYP==C_FIGTEXT) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if ((eang=fig.ANGLE+rotang)>=2.0*PI) eang-=2.0*PI; if (scm_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPTEXTROT,cnt); bae_prtdialog(elemmsg); exit(0); // Set group symbols/labels angle case 6 : rotang=getangle(); forall (fig where fig.GROUP && fig.TYP==C_FIGTEXT) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if (scm_elemangchg(fig,rotang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPSYMROT,cnt); bae_prtdialog(elemmsg); exit(0); default : error_abort(); } // Repetitively pick elements bae_prtdialog(elemmsg); while (scm_pickanyelem(fig,conseg,bustap,0,elemtyp)==0) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if ((eang=fig.ANGLE+rotang)>=2.0*PI) eang-=2.0*PI; // Rotate the picked element if (scm_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); bae_postprocess(); cnt++; } // No pick if (cnt) bae_prtdialog(ERRNOPICK); else perror(ERRNOPICK); exit(0); } // Get the currently active menu switch (bae_getactmenu()) { // Symbol movement functions case MNU_SCMADDSYM : case MNU_SCMADDLAB : case MNU_SCMADDPORT : case MNU_SCMNEXTSYM : case MNU_SCMMOVESYM : case MNU_SCMMOVEPIN : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,4,LMB); break; // Polygon edit functions case 500 : case 501 : case 502 : case 503 : case 507 : case 508 : case MNU_SCMGRPPOLY : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,8,LMB); break; // Polygon movement functions case MNU_SCMMOVEPOLY : case MNU_SCMCOPYPOLY : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,4,LMB); break; // Text movement functions case MNU_SCMADDTEXT : case MNU_SCMMOVETEXT : case MNU_SCMCOPYTEXT : case MNU_SCMMOVENAME : case MNU_SCMMOVEATTR : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,4,LMB); break; // Group movement functions case MNU_SCMMOVEGRP : case MNU_SCMCOPYGRP : case MNU_SCMLOADGRP : case MNU_BAEGRPPASTE : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,4,LMB); break; // Ignore on default default : ; } // Done } void rotate_ged() /* // Left rotate picked GED object */ { index L_FIGURE fig /* Figure index */; index L_NREF nref /* Named reference index */; index L_TEXT text /* Text index */; string p_dis = "," /* Part function disable */; string t_dis = "," /* Text function disable */; string gp_dis = "," /* Group part function disable */; string gt_dis = "," /* Group text function disable */; string e_dis = "," /* Element function disable */; double oldang /* Old rotation angle */; double rotang = cvtangle(90.0,1,0) /* Rotation angle */; double eang /* Element angle */; string elemmsg /* Element pick message */; int elemtyp /* Element type */; int cnt = 0 /* Element count */; // Check if standalone call if (ulproginfo("",0,0)<=1 && bae_getactmenu()<0) { // Check if element type scan if (bae_iniintval(PAR_METYPSCAN,1)==1 && !bae_peekiact()) { forall (text) { t_dis=e_dis=""; break; } forall (nref) { p_dis=e_dis=""; break; } forall (fig where fig.GROUP && fig.TYP==L_FIGNREF) { gp_dis=""; break; } forall (fig where fig.GROUP && fig.TYP==L_FIGTEXT) { gt_dis=""; break; } } else { // Enable all menu items t_dis=p_dis=e_dis=gt_dis=gp_dis=""; } bae_promptdialog(UPRFCT); switch (bae_askmenu(9,p_dis+UPRGFCT1,t_dis+UPRGFCT2, e_dis+UPRGFCT3,gp_dis+UPRGFCT4,gp_dis+UPRGFCT5, gt_dis+UPRGFCT6,gt_dis+UPRGFCT7,UPRGFCT8,UPRABORT)) { // Rotate parts case 0 : // Abort if invalid plan class if (ddbclass!=DDBCLLAY && ddbclass!=DDBCLLPRT) error_class(); elemmsg=UPRSELPART; elemtyp=1<=2.0*PI) eang-=2.0*PI; if (ged_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPPARTROT,cnt); bae_prtdialog(elemmsg); exit(0); // Set group parts angle case 4 : rotang=getangle(); forall (fig where fig.GROUP && fig.TYP==L_FIGNREF) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if (ged_elemangchg(fig,rotang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPPARTROT,cnt); bae_prtdialog(elemmsg); exit(0); // Left rotate group texts case 5 : forall (fig where fig.GROUP && fig.TYP==L_FIGTEXT) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if ((eang=fig.ANGLE+rotang)>=2.0*PI) eang-=2.0*PI; if (ged_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPTEXTROT,cnt); bae_prtdialog(elemmsg); exit(0); // Set group texts angle case 6 : rotang=getangle(); forall (fig where fig.GROUP && fig.TYP==L_FIGTEXT) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if (ged_elemangchg(fig,rotang)) errormsg(ERRROTATE,fig.NAME); cnt++; } sprintf(elemmsg,REPTEXTROT,cnt); bae_prtdialog(elemmsg); exit(0); // Set L/R angle case 7 : bae_clriactqueue(); bae_storemenuiact(1,12,LMB); ulsystem(UL_GEDPART,0); exit(0); default : error_abort(); } if (varget(VAR_ROTANGLE,oldang)!=0) oldang=90.0; rotang=cvtangle(oldang,1,0); // Repetitively pick elements bae_prtdialog(elemmsg); while (ged_pickanyelem(fig,elemtyp)==0) { if (fig.FIXED&2) errormsg(ERRELEMGLUED,fig.NAME); // Save current state for undo if (cnt==0) bae_callmenu(MNU_BAESAVESTATE); if ((eang=fig.ANGLE+rotang)>=2.0*PI) eang-=2.0*PI; // Rotate the picked element if (ged_elemangchg(fig,eang)) errormsg(ERRROTATE,fig.NAME); bae_postprocess(); cnt++; } // No pick if (cnt) bae_prtdialog(ERRNOPICK); else perror(ERRNOPICK); exit(0); } // Get the currently active menu switch (bae_getactmenu()) { // Part movement functions case MNU_GEDADDPART : case MNU_GEDMOVEPART : case MNU_GEDNEXTPART : case MNU_GEDMOVEPIN : bae_storemouseiact(1,0.0,0.0,1,RMB); if (varget(VAR_ROTANGLE,rotang)!=0 || ged_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) { bae_storemenuiact(1,4,LMB); } else { bae_storemenuiact(1,6,LMB); bae_storetextiact( 1,ftoa(rotang+cvtangle(nref.ANGLE,0,1),5)); } break; // Trace edit functions case MNU_GEDADDTRC : case MNU_GEDADDFTRC : case MNU_GEDTRCINSC : case MNU_GEDTRCMDC : if (rotdir()==0) break; // Toggle angle direction bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,lay_menulaylinecnt()+6,LMB); break; // Polygon edit functions case 500 : case 501 : case 502 : case 503 : case MNU_GEDADDDLINE : case 505 : case MNU_GEDPOLYINSC : case MNU_GEDPOLYMDC : case MNU_GEDGRPPOLY : case 5007 : case 5014 : if (rotdir()==0) break; bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,8,LMB); break; // Polygon movement functions case MNU_GEDMOVEPOLY : case MNU_GEDCOPYPOLY : bae_storemouseiact(1,0.0,0.0,1,RMB); if (varget(VAR_ROTANGLE,rotang)!=0) { bae_storemenuiact(1,4,LMB); } else { bae_storemenuiact(1,6,LMB); bae_storetextiact(1,ftoa(rotang,5)); } break; // Text movement functions case MNU_GEDADDTEXT : case MNU_GEDMOVETEXT : case MNU_GEDCOPYTEXT : case MNU_GEDMOVENAME : case MNU_GEDMOVEATTR : bae_storemouseiact(1,0.0,0.0,1,RMB); if (varget(VAR_ROTANGLE,rotang)!=0 || 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) { bae_storemenuiact(1,4,LMB); } else { bae_storemenuiact(1,6,LMB); bae_storetextiact( 1,ftoa(rotang+cvtangle(text.ANGLE,0,1),5)); } break; // Group movement functions case MNU_GEDMOVEGRP : case MNU_GEDCOPYGRP : case MNU_GEDLOADGRP : case MNU_BAEGRPPASTE : case 415 : case 416 : bae_storemouseiact(1,0.0,0.0,1,RMB); if (varget(VAR_ROTANGLE,rotang)!=0 || ged_getgroupdata(0.0,0.0,oldang,0.0,0,0.0,0.0,0,0)!=0) { bae_storemenuiact(1,4,LMB); } else { bae_storemenuiact(1,6,LMB); bae_storetextiact( 1,ftoa(rotang+cvtangle(oldang,0,1),5)); } break; // Ignore on default default : ; } // Done } void rotate_ced() /* // Left rotate picked CED object */ { // Get the currently active menu switch (bae_getactmenu()) { // Macro movement functions case MNU_CEDADDMAC : case MNU_CEDMOVEMAC : case MNU_CEDNEXTMAC : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,3,LMB); break; // Text movement functions case MNU_CEDADDTEXT : case MNU_CEDMOVETEXT : case MNU_CEDCOPYTEXT : case MNU_CEDMOVENAME : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,3,LMB); break; // Group movement functions case MNU_CEDMOVEGRP : case MNU_CEDCOPYGRP : case MNU_CEDLOADGRP : case MNU_BAEGRPPASTE : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,4,LMB); break; // Ignore on default default : ; } // Done } int rotdir() /* // Rotate direction vector // Return value : // 0 if vector rotated // (-1) if no direction vector */ { double vx, vy /* Direction vector */; double angsin, angcos /* Angle trig. values */; double rotang /* Rotation angle */; // Check if fixed angle editing bae_getdblpar(4,vx); bae_getdblpar(5,vy); if (vx==0.0 && vy==0.0) return(-1); if (varget(VAR_ROTANGLE,rotang)!=0) rotang=90; rotang=cvtangle(rotang,1,0); // Get rotation angle data angsin=sin(rotang); angcos=cos(rotang); // Store rotated direction angle bae_setdblpar(4,angcos*vx-angsin*vy); bae_setdblpar(5,angsin*vx+angcos*vy); return(0); } double getangle() /* // Get some rotation angle angle // Return value : // angle */ { int menuitem = 0 /* Default menu item */; double ang = 1.0 /* Angle */; bae_defmenusel(menuitem); bae_promptdialog(UPRROTMODE); switch (bae_askmenu(6, UPRROT1,UPRROT2,UPRROT3,UPRROT4,UPRROT5,UPRABORT)) { // 0 degrees case 0 : ang=0.0; break; // 90 degrees case 1 : ang=90.0; break; // 180 degrees case 2 : ang=180.0; break; // 270 degrees case 3 : ang=270.0; break; // Other angle case 4 : if (askdbl(ang,UPRANG,10)!=0 || ang<=0.0 || ang>=360.0) error_abort(); break; default : } return(cvtangle(ang,1,0)); } // User Language program end