/////////////////////////////////////////////////////////////////
//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