///////////////////////////////////////////////////////////////// //Arc Twister v2.0 -- CS, CS2, CS3, CS4 //>=-------------------------------------- // // This script will twist an objects selected control handles // by the same amounts. // // Current tweakable options are: // 1) Left handles only // 2) Right handles only // 3) Mirror Angles (i.e.; rotates left handle x deg, right handle -x deg.) // 4) Rotate Angles (Fixed relative to each other) // 5) Change angles to Smooth (180 deg) and rotate. // // Please Note: // I've created 3 interfaces for this script, and this is the most flexible and functional. // The first was using a kludgy basic 'prompt' dialog, // The second version used a swf interface that was slick, but encountered various issues during install. // This version uses Adobes JXS UI tools, so you get a dialog widget that is both easy to use, and works. // If you're using pre CS2, this script will gracefully fall back on the "prompt" interface. // // //>=-------------------------------------- // JS code (c) copyright: John Wundes ( john@wundes.com ) www.wundes.com // copyright full text here: http://www.wundes.com/js4ai/copyright.txt // ////////////////////////////////////////////////////////////////// //#includepath "C:/Program Files/Adobe/Adobe Illustrator CS3/Presets/Scripts/_includes/" //#include "runWith.jsxinc" function runWith(){ // var aLen = arguments.length; var cmd=arguments[0]; var a=cmd.toString().split(" "); var selLimit = a[0]; var obj = a[1]; var precision = a[2]; if (precision == undefined) { precision= "="; }else { precision=precision.toLowerCase(); } if (selLimit == undefined) { selLimit = "0"; } if (obj == undefined) { obj = "object"; } //================== if (precision == "max") { prec= "less than"; } else if (precision == "min") { prec="at least"; } else { prec = "exactly" }; //=======Define messages======= var contents = prec+" "+selLimit+" "+obj; var noDocs = "Please open a document containing "+contents; var selectProb = "Please select "+contents; //========Handle Situation============ try{ if (documents.length<1) { throw(noDocs); } // === set globals === doc = activeDocument; sel = doc.selection; selLen = sel.length; //=== test== //alert(selLen+","+selLimit+","+precision); if ((selLen < selLimit && precision == "min") || (selLen > selLimit && precision == "max") || (selLen != selLimit && precision == "=")) { // If below max, abov min, or not exactly selLimit, then complain... throw(selectProb); } } catch(e){ alert(e) return; } main(); } //Convenient Global vars... var doc = undefined; var sel = undefined; var selLen = undefined; var versionNum=app.version.split(".")[0] ; //set up global vars: var testmode=0; var dchange=0; var achange=0; var changed=0; //var mod = 'M'; var modUI= 'M'; var chUI='""' ; runWith("1 object min"); function main(){ if (versionNum >= 13){ var dlg = new Window('dialog', 'ArcTwister',[100,100,460,260]); dlg.radioPnl = dlg.add('panel', [15,15,100,150], 'Handle Types'); dlg.sliderPnl = dlg.add('group', [105,15,375,115], ''); dlg.btnPnl = dlg.add('group', [105,120,375,155]); // ------------- Radio Panel --------------------------------- //dlg.radioPnl.orientation = 'column'; //dlg.radioPnl.alignChildren='left'; dlg.radioPnl.leftHandRb = dlg.radioPnl.add('radiobutton', [5,25,95,45], 'Left'); dlg.radioPnl.rightHandRb = dlg.radioPnl.add('radiobutton', [5,45,95,65], 'Right'); dlg.radioPnl.mirrorHandRb = dlg.radioPnl.add('radiobutton', [5,65,95,85], 'Mirror'); dlg.radioPnl.fixedHandRb = dlg.radioPnl.add('radiobutton', [5,85,95,105], 'Fixed'); dlg.radioPnl.smoothHandRb = dlg.radioPnl.add('radiobutton', [5,105,95,125], 'Smooth'); dlg.radioPnl.mirrorHandRb.value = true; // -------------Slider Panel------------------- dlg.sliderPnl.add ('statictext', [15,5,200,25], 'Adjust Handle Lengths (by Pixels)'); dlg.sliderPnl.lengthSlider = dlg.sliderPnl.add ('slider', [5,25,195,45], 0, -100, 100); dlg.sliderPnl.lengthSlider_txt = dlg.sliderPnl.add ('edittext', [200,20,245,40], '0'); dlg.sliderPnl.add ('statictext', [15,55,200,75], 'Adjust Handle Angles (by Degrees)'); dlg.sliderPnl.angleSlider = dlg.sliderPnl.add ('slider', [5,75,195,95], 0,-90,90); dlg.sliderPnl.angleSlider_txt = dlg.sliderPnl.add ('edittext', [200,70,245,90], '0'); // -------------Buttton Panel------------------- //dlg.btnPnl.cancelBtn = dlg.btnPnl.add('button', [35,3,85,27], 'Cancel', {name:'cancel'}); dlg.btnPnl.buildBtn = dlg.btnPnl.add('button', [100,3,145,27], 'Done', {name:'ok'}); //-----------------event Handlers:---------------------------- dlg.radioPnl.leftHandRb.onClick = radioSwitch; dlg.radioPnl.rightHandRb.onClick = radioSwitch; dlg.radioPnl.mirrorHandRb.onClick = radioSwitch; dlg.radioPnl.fixedHandRb.onClick = radioSwitch; dlg.radioPnl.smoothHandRb.onClick = radioSwitch; //=== dlg.sliderPnl.lengthSlider.onChanging = sliderLength; dlg.sliderPnl.lengthSlider.onChange = sliderLengthReset; // dlg.sliderPnl.angleSlider.onChanging = sliderAngle; dlg.sliderPnl.angleSlider.onChange = sliderAngleReset; //dlg.msgPnl.titleSt = dlg.msgPnl.add('statictext', [15,15,105,35], 'Alert box title:'); //dlg.msgPnl.msgSt = dlg.msgPnl.add('statictext', [15,65,105,85], 'Alert message:'); dlg.center(); dlg.show(); dchange = -dlg.sliderPnl.lengthSlider_txt.text; achange = dlg.sliderPnl.angleSlider_txt.text; } else { // pre CS2 var mod = 0; modUI= prompt('(L)eft Only, (R)ight Only, (F)ixed angle,(M)irror angle or (S)mooth 180 deg.:',mod).toUpperCase(); chUI= prompt('change angle,distance:',achange+','+dchange); var chUI_arr = chUI.split(','); if(chUI_arr.length==2){ achange = Number(chUI_arr[0]); dchange = -Number(chUI_arr[1]); }else{ achange = Number(chUI); } } processUI(); //--------------JSX UI functions function radioSwitch(){ modUI = this.text.substr(0,1); //alert ( this.text+":"+modUI); } function sliderLength(){ //alert("slider Length called"); dlg.sliderPnl.lengthSlider_txt.text = Math.round(this.value); } function sliderLengthReset(){ //alert("slider Length called"); var val = this.value; dchange = -val; achange = dlg.sliderPnl.angleSlider_txt.text ; processUI(); redraw(); this.value=0; dlg.sliderPnl.lengthSlider_txt.text = Math.round(this.value); //alert(this+" set to "+val); } function sliderAngle(){ //alert("slider Length called"); dlg.sliderPnl.angleSlider_txt.text = Math.round(this.value); } function sliderAngleReset(){ //alert("slider Length called"); var val = this.value; achange = val; dchange = dlg.sliderPnl.lengthSlider_txt.text; processUI(); redraw(); this.value=0; dlg.sliderPnl.angleSlider_txt.text = Math.round(this.value); //alert(this+" set to "+val); } };// end Main function processUI(){ var solen = activeDocument.selection.length; //for each item in selection for (var so=0;so