/* SIZE (STD) -- Resize Current Element */ /* SIZE (STD) -- Groessenaenderung aktuelles Element */ /* -- INTENDED FOR KEY-CALL USE (:Size Change) -- */ /* // Copyright (c) 1995-2012 Oliver Bartels F+E, Muenchen // Author: Roman Ludwig // Changes History: // rl (120427) RELEASED FOR BAE V7.8. // rl (120327) ENHANCEMENT: // Added dimension table support. // 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 (050906) RELEASED FOR BAE V6.6. // rl (040811) RELEASED FOR BAE V6.4. // rl (040708) ENHANCEMENT: // Added size tables configuration through bae.ini. // rl (040705) ENHANCEMENT: // Added manual size set functions with input preservation. // rl (030904) RELEASED FOR BAE V6.2. // rl (030808) ENHANCEMENT: // Added manual size input option. // rl (021209) RELEASED FOR BAE V6.0. // rl (020618) RELEASED FOR BAE V5.4. // rl (010625) RELEASED FOR BAE V5.0. // rl (001108) ORIGINAL CODING. // // DESCRIPTION // // The size User Language program designates the currently // active BAE menu function, queries a new size value offering // a list with predefined values and performs a submenu interaction // for resizing the currently processed object // (if an object is picked and if resizing is permitted). This // program must be configured for implicit hotkey program call // (e.g. or ). */ // Includes #include "baeparam.ulh" // User Language BAE param. access // Enforce standard caller type #pragma ULCALLERSTD // Disable undo state request #pragma ULCALLERNOUNDO // Messages string UPRABORT = M_UPRABORT(); string UPRINPUTE = M("%Manuell &Aendern","%Manual &Edit"); string UPRINPUTS = M("Manuell &Setzen","Manual &Set"); string UPRINPUTD = M("%&Dimension abrufen","Use Stored &Dimension"); string UPRTEXTSIZE = M("Textgroesse ? ","Text Size ? "); string UPRTRCSIZE = M("Bahnbreite ? ","Trace Width ? "); string UPRGRPSCALE = M("Skalierung ? ","Scale ? "); string UPRDIMSRC = M("Quelle selektieren!","Select Source!"); string UPRDIMSRC1 = M("&Datei","&File"); string UPRDIMSRC2 = M("&Zwischenablage","&Clipboard"); string UPRDIMFILE = M("Dimensionsdefinitionen Eingabedatei ? ", "Dimension Definition Input File ? "); string UPRDIMNAME = M("Dimension ? ","Dimension ? "); string UPRDIMFCT = M("Sprungfunktion selektieren!", "Select Jump Function!"); string UPRDIMFCT1 = M("Sprung &links","Jump &Left"); string UPRDIMFCT2 = M("Sprung &rechts","Jump &Right"); string UPRDIMFCT3 = M("Sprung nach &oben","Jump &Up"); string UPRDIMFCT4 = M("Sprung nach &unten","Jump &Down"); string UPRDIMFCT5 = M("%90 Grad &Bogen","%90 Degree &Arc"); string UPRDIMFCT6 = M("180 Grad Bogen (&Radius)", "&180 Degree Arc (Radius)"); string UPRDIMFCT7 = M("180 Grad Bogen (&Durchmesser)", "1&80 Degree Arc (Diameter)"); string REPDIMREAD = M("%d Dimensionsdefinitionen gelesen.", "%d dimension definitions read."); string ERRNODIM = M("Keine Dimensionen hinterlegt!", "No dimensions stored!"); // INI file parameter name definitions #define PAR_STXTSIZE "TEXTSIZEL_SCM" // Schematic text size table #define PAR_LTXTSIZE "TEXTSIZEL_GED" // Layout text size table #define PAR_LTRCSIZE "TRACEWIDTHL_GED"// Layout trace size table #define PAR_LGRPSCALE "GRPSCALEL_GED" // Layout group scale table #define PAR_ITXTSIZE "TEXTSIZEL_CED" // IC Design text size table #define PAR_ITRCSIZE "TRACEWIDTHL_CED"// IC Design trace size table // Global definitions #define GV_SIZETXT "size_txt" // Last man. text size variable #define GV_SIZETRC "size_trc" // Last man. trace size variable #define GV_SCALEGRP "scale_grp" // Last man. group scale variable #define GV_DIMCNT "dim_cnt" // Dimension value count variable #define GV_DIMNAME "dim_name%d" // Dimension name list variable #define GV_DIMVAL "dim_val%d" // Dimension value list variable #define LAYERINV (-0x4000) // Invalid layer code #define SMALLVAL 0.00000001 // Small compare value double PI = cvtangle(180.0,1,2) /* PI-value */; // Global variables double px, py /* Pick coordinate */; double ix1, iy1 /* 1st input coordinate */; int ilay1 /* 1st input layer */; int ilay2 /* 2nd input layer */; double ix2, iy2 /* 2nd input coordinate */; int it2 /* 2nd input point type */; double ix3, iy3 /* 3rd input coordinate */; int inpmode /* Input mode */; string clipb /* Clipboard contents */; int dimcnt = 0 /* Dimension count */; // Main program void main() { // Get the current mouse position bae_wsmouse(px,py,0); // Test the interpreter type switch (uliptype()) { /* SCM */ case ULIPSCM : resize_scm(); break; /* GED */ case ULIPGED : resize_ged(); break; /* CED */ case ULIPCED : resize_ced(); break; // Ignore on default default : break; } // Done } void resize_scm() /* // Left rotate picked SCM object */ { STRINGS deftextsizel = { // Text size list "&1.0 mm", "&2.0 mm", "&3.0 mm", "&4.0 mm", "&5.0 mm", "1&0.0 mm" }; STRINGS sizel /* Size list */; int sizen /* Size list count */; double size /* Size value */; int idx /* Size index */; // Check if standalone call if (ulproginfo("",0,0)<=1 && bae_getactmenu()<0) { readdim(); exit(0); } // Get the currently active menu switch (bae_getactmenu()) { // Text movement functions case MNU_SCMADDTEXT : case MNU_SCMMOVETEXT : case MNU_SCMCOPYTEXT : case MNU_SCMMOVENAME : case MNU_SCMMOVEATTR : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_STXTSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default text size table sizel=deftextsizel; sizen=arylength(deftextsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETXT,size)) size=baepar_dblval(SCMPAR_DEFTEXTSIZE); if (askdist(size,UPRTEXTSIZE,0)) error_abort(); varset(GV_SIZETXT,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,7,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,2),5)+" mm"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Polygon edit functions case 500 : case 501 : case 502 : case 503 : case 507 : case 508 : case MNU_SCMGRPPOLY : // Check if input data available ilay1=LAYERINV; if (scm_getinputdata(ix1,iy1,0.0,ilay1,0.0,0.0,0.0, ilay2,inpmode,ix3,iy3,ix2,iy2,it2,0.0,0.0,0.0,0.0,0)!=0) ilay1=LAYERINV; jumpdim(3,5,(ilay1==LAYERINV || it2==(-1)) ? 0 : 1); break; // Ignore on default default : break; } // Done } void resize_ged() /* // Left rotate picked GED object */ { STRINGS deftextsizel = { // Text size list "&1.0 mm", "&2.0 mm", "&3.0 mm", "&4.0 mm", "&5.0 mm", "1&0.0 mm"}; STRINGS deftrcsizel = { // Trace size list "0.1 mm", "0.&2 mm", "0.&3 mm", "0.&4 mm", "0.&5 mm", "&1.0 mm"}; STRINGS defgrpsizel = { // Group scale list "0.5", "&2.0", "&3.0", "&4.0", "&5.0", "1&0.0"}; STRINGS sizel /* Size list */; int sizen /* Size list count */; double size /* Size value */; int idx /* Size index */; // Check if standalone call if (ulproginfo("",0,0)<=1 && bae_getactmenu()<0) { readdim(); exit(0); } // Get the currently active menu switch (bae_getactmenu()) { // Trace edit functions case MNU_GEDADDTRC : case MNU_GEDADDFTRC : case MNU_GEDTRCINSC : case MNU_GEDTRCMDC : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_LTRCSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default trace width table sizel=deftrcsizel; sizen=arylength(deftrcsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRINPUTD; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Check if input data available ilay1=LAYERINV; if (ged_getinputdata(ix1,iy1,0.0,ilay1,0.0,0.0,0.0, ilay2,inpmode,0,ix3,iy3,ix2,iy2,it2, 0.0,0.0,0.0,0.0,0)==0) { if (ilay2!=LAYERINV) // Swap the edit direction ged_getinputdata(0.0,0.0,0.0,ilay2, ix1,iy1,0.0,ilay1,inpmode,0, 0.0,0.0,0.0,0.0,0,ix3,iy3,ix2,iy2,it2); } else { ilay1=LAYERINV; } jumpdim(lay_menulaylinecnt()+10,lay_menulaylinecnt()+12, (ilay1==LAYERINV || it2==(-1)) ? 0 : 1); break; } if (idx==sizen-3) { // Get default parameters if (varget(GV_SIZETRC,size)) ged_getpathwidth(size,0.0); if (askdist(size,UPRTRCSIZE,0)) error_abort(); varset(GV_SIZETRC,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,lay_menulaylinecnt()+9,LMB); if (idx==sizen-3) bae_storetextiact(1, ftoa(cvtlength(size,0,2),5)+" mm"); else if (idx!=sizen-4) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Trace segment edit functions case 403 : case 404 : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_LTRCSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default trace width table sizel=deftrcsizel; sizen=arylength(deftrcsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETRC,size)) ged_getpathwidth(size,0.0); if (askdist(size,UPRTRCSIZE,0)) error_abort(); varset(GV_SIZETRC,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,lay_menulaylinecnt()+6,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,2),5)+" mm"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); 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 : // Check if input data available ilay1=LAYERINV; if (ged_getinputdata(ix1,iy1,0.0,ilay1,0.0,0.0,0.0, ilay2,inpmode,0,ix3,iy3,ix2,iy2,it2, 0.0,0.0,0.0,0.0,0)!=0) ilay1=LAYERINV; jumpdim(3,5,(ilay1==LAYERINV || it2!=0) ? 0 : 1); break; // Text movement functions case MNU_GEDADDTEXT : case MNU_GEDMOVETEXT : case MNU_GEDCOPYTEXT : case MNU_GEDMOVENAME : case MNU_GEDMOVEATTR : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_LTXTSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default text size table sizel=deftextsizel; sizen=arylength(deftextsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETXT,size)) size=baepar_dblval(LAYPAR_DEFTEXTSIZE); if (askdist(size,UPRTEXTSIZE,0)) error_abort(); varset(GV_SIZETXT,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,7,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,2),5)+" mm"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Group movement functions case MNU_GEDMOVEGRP : case MNU_GEDCOPYGRP : case MNU_GEDLOADGRP : case MNU_BAEGRPPASTE : case 415 : case 416 : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_LGRPSCALE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default group scale table sizel=defgrpsizel; sizen=arylength(defgrpsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SCALEGRP,size)) size=1.0; if (askdbl(size,UPRGRPSCALE,10)) error_abort(); varset(GV_SCALEGRP,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,12,LMB); if (idx==sizen-2) bae_storetextiact(1,ftoa(size,5)); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Ignore on default default : break; } // Done } void resize_ced() /* // Left rotate picked CED object */ { STRINGS deftextsizel = { // Text size list "&1.0 um", "&2.0 um", "&3.0 um", "&4.0 um", "&5.0 um", "1&0.0 um"}; STRINGS deftrcsizel = { // Trace size list "&1.0 um", "1.&2 um", "1.&8 um", "2.&4 um"}; STRINGS sizel /* Size list */; int sizen /* Size list count */; double size /* Size value */; int idx /* Size index */; // Check if standalone call if (ulproginfo("",0,0)<=1 && bae_getactmenu()<0) { readdim(); exit(0); } // Get the currently active menu switch (bae_getactmenu()) { // Trace edit functions case 400 : case 401 : case 402 : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_ITRCSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default trace width table sizel=deftrcsizel; sizen=arylength(deftrcsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETRC,size)) ced_getpathwidth(size,0.0); if (askdist(size,UPRTRCSIZE,0)) error_abort(); varset(GV_SIZETRC,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,11,LMB); bae_storemenuiact(1,3,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,4),5)+" um"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Trace segment edit functions case 403 : case 404 : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_ITRCSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default trace width table sizel=deftrcsizel; sizen=arylength(deftrcsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETRC,size)) ced_getpathwidth(size,0.0); if (askdist(size,UPRTRCSIZE,0)) error_abort(); varset(GV_SIZETRC,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,9,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,4),5)+" um"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Text movement functions case MNU_CEDADDTEXT : case MNU_CEDMOVETEXT : case MNU_CEDCOPYTEXT : case MNU_CEDMOVENAME : for (sizen=0;sizen<20;sizen++) { if ((sizel[sizen]=bae_inistrval( bae_iniarrayvarname(PAR_ITXTSIZE,sizen),""))=="") { // Check if list defined at all if (sizen==0) { // Use default text size table sizel=deftrcsizel; sizen=arylength(deftextsizel); } break; } } sizel[sizen++]=UPRINPUTE; sizel[sizen++]=UPRINPUTS; sizel[sizen++]=UPRABORT; bae_clriactqueue(); if ((idx=bae_askmenu(sizen,sizel[0],sizel[1],sizel[2], sizel[3],sizel[4],sizel[5],sizel[6],sizel[7],sizel[8], sizel[9],sizel[10],sizel[11],sizel[12],sizel[13], sizel[14],sizel[15],sizel[16],sizel[17],sizel[18], sizel[19],sizel[20],sizel[21],sizel[22]))<0 || idx>=sizen-1) break; if (idx==sizen-2) { // Get default parameters if (varget(GV_SIZETXT,size)) size=baepar_dblval(ICDPAR_DEFTEXTSIZE); if (askdist(size,UPRTEXTSIZE,0)) error_abort(); varset(GV_SIZETXT,size); } bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,6,LMB); if (idx==sizen-2) bae_storetextiact(1, ftoa(cvtlength(size,0,4),5)+" um"); else if (idx!=sizen-3) bae_storetextiact(1,bae_plainmenutext(sizel[idx])); break; // Ignore on default default : break; } // Done } void readdim() /* // Read dimension definition file */ { string infname /* Input file name */; int ifh /* Input file handle */; string readbuf /* Input buffer */; STRINGS lines /* Text lines */; int linen /* Line count */; string msg /* Message buffer */; int i /* Loop control variable */; if (bae_getstrpar(10,clipb)==0 && clipb!="") { bae_promptdialog(UPRDIMSRC); switch (bae_askmenu(3,UPRDIMSRC1,UPRDIMSRC2,UPRABORT)) { // Read file case 0 : break; // Read clipboard case 1 : linen=splitstring(clipb,lines); for (i=0;i=cnt) error(ERRNODIM); } bae_promptdialog(UPRDIMFCT); if (arcflag) { if ((mode=bae_askmenu(8,UPRDIMFCT1,UPRDIMFCT2,UPRDIMFCT3, UPRDIMFCT4,UPRDIMFCT5,UPRDIMFCT6,UPRDIMFCT7,UPRABORT))==7) error_abort(); if (mode==6) dimval*=0.5; } else { if ((mode=bae_askmenu(5,UPRDIMFCT1,UPRDIMFCT2,UPRDIMFCT3, UPRDIMFCT4,UPRABORT))==4) error_abort(); } switch (mode) { // Horizontal left case 0 : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,jumpitem,LMB); bae_storetextiact(1,ftoa(cvtlength(-dimval,0,2),5)+" mm"); bae_storetextiact(1,"0.0"); break; // Horizontal right case 1 : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,jumpitem,LMB); bae_storetextiact(1,ftoa(cvtlength(dimval,0,2),5)+" mm"); bae_storetextiact(1,"0.0"); break; // Vertical up case 2 : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,jumpitem,LMB); bae_storetextiact(1,"0.0"); bae_storetextiact(1,ftoa(cvtlength(dimval,0,2),5)+" mm"); break; // Vertical down case 3 : bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,jumpitem,LMB); bae_storetextiact(1,"0.0"); bae_storetextiact(1,ftoa(cvtlength(-dimval,0,2),5)+" mm"); break; // 90 degree arc case 4 : // 180 degree arc case 5 : case 6 : // Get segment angles wx=px-ix1; wy=py-iy1; if (fabs(wx)<=SMALLVAL && fabs(wy)<=SMALLVAL) exit(0); ang1=atan2(wy,wx); wx=ix1-ix2; wy=iy1-iy2; if (fabs(wx)<=SMALLVAL && fabs(wy)<=SMALLVAL) exit(0); ang2=atan2(wy,wx); ang=ang1-ang2; while (ang>PI) ang-=2.0*PI; while (ang<-PI) ang+=2.0*PI; bae_storemouseiact(1,0.0,0.0,1,RMB); bae_storemenuiact(1,arcitem+(ang>0.0 ? 0 : 1),LMB); wl=dimval/sqrt(wx*wx+wy*wy); wx*=wl; wy*=wl; if (ang>0.0) { bae_storemouseiact(1,ix1-wy,iy1+wx,2,LMB); if (mode==4) bae_storemouseiact(1,ix1-wy+wx,iy1+wx+wy,2,LMB); else bae_storemouseiact(1, ix1-2.0*wy,iy1+2.0*wx,2,LMB); } else { bae_storemouseiact(1,ix1+wy,iy1-wx,2,LMB); if (mode==4) bae_storemouseiact(1,ix1+wy+wx,iy1-wx+wy,2,LMB); else bae_storemouseiact(1, ix1+2.0*wy,iy1-2.0*wx,2,LMB); } break; default : error_abort(); } } int splitstring(string s,STRINGS ssl) /* // Split string into lines // Return value : // number of substrings // Parameters : // string s : Input string // STRINGS ssl : Substring list */ { int ssn = 0 /* Substring count */; int sl = strlen(s) /* String length */; int pos1 = 1 /* String position buffer 1 */; int pos2 /* String position buffer 2 */; int i /* Loop controo variable */; // Repetively scan string while ((pos2=strscannext(s,"\n",pos1,1))pos1 ? strextract(s,pos1-1,pos2-2) : ""; // Update the scan start position pos1=pos2+1; } // Extract last substring if last char not delimiter if (pos1