The following is a very full featured script, it allows additional controls such as rotation and scaling… However the most notable feature is an “increment” feature, which allows each stepped and repeated object to contain a number that is automatically incremented, such as used in a raffle ticket for example (with optional zero padding and prefix/suffix).
/*
* @Description: Increment number featured explained by http://tinypic.com/view.php?pic=512fpc&s=8
* @Description: Increment summary: Name the textframe containing the value you wish to increment as "increment" - the textframe must contain only the value that needs increment
* @Description: Works by selecting a group item / clipping mask - does not support multiple selections atm but can be extended to do that too
* @Tip: The script should be easier to use with a script panel (google for "script panel illustrator" - there should be an extension by script bay that does that that)
* @Tip: If you're on a Mac, the excellent FastScripts app can be used to assign a shortcut to the script
* @Version: 0.4
* @Supported: CS3/CS4
* @Author: culori.media@gmail.com
*/
#target illustrator
if(app.activeDocument.selection.length == 0) {
alert("No selection!");
} else {
var Utils = {
_frames: [],
getFrames: function(e) {
if(!e.hasOwnProperty('pageItems') && e.typename == 'TextFrame') Utils._frames.push(e);
if(e.hasOwnProperty('pageItems')) {
for(var i=0;i<e.pageItems.length;i++) {
if(e.typename == 'TextFrame') Utils._frames.push(e);
else Utils.getFrames(e.pageItems);
}
}
return Utils._frames;
},
init: function() {
Utils._frames = [];
},
getParentLayer: function(e) {
if(e.parent.typename != 'Layer') return Utils.getParent(e.parent);
}
}
var dlg = new Window('dialog', 'Step and Repeat (and maybe increment ;))');
var selFrames = Utils.getFrames(app.activeDocument.selection[0]);
dlg.alignChildren = ['fill', 'center'];
dlg.measPnl = dlg.add('panel', undefined, 'Measurement unit');
dlg.measPnl.grpLabel = dlg.measPnl.add('group');
dlg.measPnl.grpLabel.orientation = 'row';
dlg.measPnl.grpLabel.titleMeas = dlg.measPnl.grpLabel.add('statictext', undefined, 'Used to express values below:');
dlg.measPnl.grpSel = dlg.measPnl.add('group');
dlg.measPnl.grpSel.orientation = 'row';
dlg.measPnl.grpSel.valueMeas = dlg.measPnl.grpSel.add('DropDownList', undefined, ['Inches','Feet','Yards','Millimeters','Centimeters','Meters','Points','Picas','Pixels']);
dlg.measPnl.grpSel.valueMeas.selection = dlg.measPnl.grpSel.valueMeas.items[3];
dlg.copyPnl = dlg.add('panel', undefined, 'Grid settings');
dlg.copyPnl.orientation = 'column';
dlg.copyPnl.grpXDir = dlg.copyPnl.add('group');
dlg.copyPnl.grpXDir.orientation = 'row';
dlg.copyPnl.grpXDir.titleDirX = dlg.copyPnl.grpXDir.add('statictext', undefined,'Move X:');
dlg.copyPnl.grpXDir.textboxDirX = dlg.copyPnl.grpXDir.add('dropdownlist', undefined,['Left', 'Right']);
dlg.copyPnl.grpXDir.textboxDirX.selection = dlg.copyPnl.grpXDir.textboxDirX.items[1];
dlg.copyPnl.grpXDir.titleDirY = dlg.copyPnl.grpXDir.add('statictext', undefined,'Move Y:');
dlg.copyPnl.grpXDir.textboxDirY = dlg.copyPnl.grpXDir.add('dropdownlist', undefined,['Up', 'Down']);
dlg.copyPnl.grpXDir.textboxDirY.selection = dlg.copyPnl.grpXDir.textboxDirY.items[1];
dlg.copyPnl.grpDirWhere = dlg.copyPnl.add('group');
dlg.copyPnl.grpDirWhere.orientation = 'row';
dlg.copyPnl.grpDirWhere.titleDirWhere = dlg.copyPnl.grpDirWhere.add('statictext', undefined,'Strategy:');
dlg.copyPnl.grpDirWhere.textboxDirWhere = dlg.copyPnl.grpDirWhere.add('dropdownlist', undefined,['Horizontal', 'Vertical']);
dlg.copyPnl.grpDirWhere.textboxDirWhere.selection = dlg.copyPnl.grpDirWhere.textboxDirWhere.items[0];
dlg.copyPnl.grpCopiesX = dlg.copyPnl.add('group');
dlg.copyPnl.grpCopiesX.orientation = 'row';
dlg.copyPnl.grpCopiesX.titleCopiesX = dlg.copyPnl.grpCopiesX.add('statictext', undefined,'Copies X:');
dlg.copyPnl.grpCopiesX.textboxCopiesX = dlg.copyPnl.grpCopiesX.add('edittext', undefined,'2');
dlg.copyPnl.grpCopiesX.textboxCopiesX.characters = 12;
dlg.copyPnl.grpCopiesY = dlg.copyPnl.add('group');
dlg.copyPnl.grpCopiesY.orientation = 'row';
dlg.copyPnl.grpCopiesY.titleCopiesY = dlg.copyPnl.grpCopiesY.add('statictext', undefined,'Copies Y:');
dlg.copyPnl.grpCopiesY.textboxCopiesY = dlg.copyPnl.grpCopiesY.add('edittext', undefined,'2');
dlg.copyPnl.grpCopiesY.textboxCopiesY.characters = 12;
dlg.copyPnl.grpOffsetX = dlg.copyPnl.add('group');
dlg.copyPnl.grpOffsetX.orientation = 'row';
dlg.copyPnl.grpOffsetX.titleoffsetX = dlg.copyPnl.grpOffsetX.add('statictext', undefined,'Offset X(unit):');
dlg.copyPnl.grpOffsetX.textboxOffsetX = dlg.copyPnl.grpOffsetX.add('edittext', undefined,'10');
dlg.copyPnl.grpOffsetX.textboxOffsetX.characters = 12;
dlg.copyPnl.grpOffsetY = dlg.copyPnl.add('group');
dlg.copyPnl.grpOffsetY.orientation = 'row';
dlg.copyPnl.grpOffsetY.titleoffsetY = dlg.copyPnl.grpOffsetY.add('statictext', undefined,'Offset Y(unit):');
dlg.copyPnl.grpOffsetY.textboxOffsetY = dlg.copyPnl.grpOffsetY.add('edittext', undefined,'10');
dlg.copyPnl.grpOffsetY.textboxOffsetY.characters = 12;
dlg.copyPnl.grpScaleX = dlg.copyPnl.add('group');
dlg.copyPnl.grpScaleX.orientation = 'row';
dlg.copyPnl.grpScaleX.titleScaleX = dlg.copyPnl.grpScaleX.add('statictext', undefined,'Scale X(%):');
dlg.copyPnl.grpScaleX.textboxScaleX = dlg.copyPnl.grpScaleX.add('edittext', undefined,'100');
dlg.copyPnl.grpScaleX.textboxScaleX.characters = 12;
dlg.copyPnl.grpScaleY = dlg.copyPnl.add('group');
dlg.copyPnl.grpScaleY.orientation = 'row';
dlg.copyPnl.grpScaleY.titleScaleY = dlg.copyPnl.grpScaleY.add('statictext', undefined,'Scale Y(%):');
dlg.copyPnl.grpScaleY.textboxScaleY = dlg.copyPnl.grpScaleY.add('edittext', undefined,'100');
dlg.copyPnl.grpScaleY.textboxScaleY.characters = 12;
dlg.copyPnl.grpScaleHow = dlg.copyPnl.add('group');
dlg.copyPnl.grpScaleHow.orientation = 'row';
dlg.copyPnl.grpScaleHow.titleScaleHow = dlg.copyPnl.grpScaleHow.add('statictext', undefined,'Scale from:');
dlg.copyPnl.grpScaleHow.textboxScaleHow = dlg.copyPnl.grpScaleHow.add('DropDownList', undefined, ['BOTTOM','LEFT','BOTTOMLEFT','RIGHT','BOTTOMRIGHT','TOP','CENTER','TOPLEFT','DOCUMENTORIGIN','TOPRIGHT']);
dlg.copyPnl.grpScaleHow.textboxScaleHow.selection = dlg.copyPnl.grpScaleHow.textboxScaleHow.items[7];
dlg.copyPnl.grpRotation = dlg.copyPnl.add('group');
dlg.copyPnl.grpRotation.orientation = 'row';
dlg.copyPnl.grpRotation.titleRotate = dlg.copyPnl.grpRotation.add('statictext', undefined,'Rotate(angle):');
dlg.copyPnl.grpRotation.textboxRotate = dlg.copyPnl.grpRotation.add('edittext', undefined,'15');
dlg.copyPnl.grpRotation.textboxRotate.characters = 12;
dlg.copyPnl.grpRotationEvery = dlg.copyPnl.add('group');
dlg.copyPnl.grpRotationEvery.orientation = 'row';
dlg.copyPnl.grpRotationEvery.titleRotateEvery = dlg.copyPnl.grpRotationEvery.add('statictext', undefined,'Rotate every(0 to ignore):');
dlg.copyPnl.grpRotationEvery.textboxRotateEvery = dlg.copyPnl.grpRotationEvery.add('edittext', undefined,'1');
dlg.copyPnl.grpRotationEvery.textboxRotateEvery.characters = 12;
dlg.copyPnl.grpRotationOrigin = dlg.copyPnl.add('group');
dlg.copyPnl.grpRotationOrigin.orientation = 'row';
dlg.copyPnl.grpRotationOrigin.titleRotOrig = dlg.copyPnl.grpRotationOrigin.add('statictext', undefined,'Rotation origin:');
dlg.copyPnl.grpRotationOrigin.rotOrigin = dlg.copyPnl.grpRotationOrigin.add('DropDownList', undefined, ['BOTTOM','LEFT','BOTTOMLEFT','RIGHT','BOTTOMRIGHT','TOP','CENTER','TOPLEFT','DOCUMENTORIGIN','TOPRIGHT']);
dlg.copyPnl.grpRotationOrigin.rotOrigin.selection = dlg.copyPnl.grpRotationOrigin.rotOrigin.items[6];
dlg.copyPnl.grpRotationDirection = dlg.copyPnl.add('group');
dlg.copyPnl.grpRotationDirection.orientation = 'row';
dlg.copyPnl.grpRotationDirection.titleRotDir = dlg.copyPnl.grpRotationDirection.add('statictext', undefined,'Rotation direction:');
dlg.copyPnl.grpRotationDirection.rotDir = dlg.copyPnl.grpRotationDirection.add('DropDownList', undefined, ['CLOCKWISE', 'COUNTERCLOCKWISE']);
dlg.copyPnl.grpRotationDirection.rotDir.selection = dlg.copyPnl.grpRotationDirection.rotDir.items[0];
dlg.incPnl = dlg.add('panel', undefined, 'Increment settings');
dlg.incPnl.orientation = 'column';
dlg.incPnl.grpIncrementFrom = dlg.incPnl.add('group');
dlg.incPnl.grpIncrementFrom.titleIncrementFrom = dlg.incPnl.grpIncrementFrom.add('statictext', undefined,'Increment start:');
dlg.incPnl.grpIncrementFrom.textboxIncrementFrom = dlg.incPnl.grpIncrementFrom.add('edittext', undefined,'100');
dlg.incPnl.grpIncrementFrom.textboxIncrementFrom.characters = 12;
dlg.incPnl.grpIncrementStep = dlg.incPnl.add('group');
dlg.incPnl.grpIncrementStep.titleIncrementStep = dlg.incPnl.grpIncrementStep.add('statictext', undefined,'Increment step:');
dlg.incPnl.grpIncrementStep.textboxIncrementStep = dlg.incPnl.grpIncrementStep.add('edittext', undefined,'1');
dlg.incPnl.grpIncrementStep.textboxIncrementStep.characters = 12;
dlg.incPnl.grpIncrementPrepend = dlg.incPnl.add('group');
dlg.incPnl.grpIncrementPrepend.titleIncrementPrepend = dlg.incPnl.grpIncrementPrepend.add('statictext', undefined,'Prepend:');
dlg.incPnl.grpIncrementPrepend.textboxIncrementPrepend = dlg.incPnl.grpIncrementPrepend.add('edittext', undefined,'');
dlg.incPnl.grpIncrementPrepend.textboxIncrementPrepend.characters = 12;
dlg.incPnl.grpIncrementAppend = dlg.incPnl.add('group');
dlg.incPnl.grpIncrementAppend.titleIncrementAppend = dlg.incPnl.grpIncrementAppend.add('statictext', undefined,'Append:');
dlg.incPnl.grpIncrementAppend.textboxIncrementAppend = dlg.incPnl.grpIncrementAppend.add('edittext', undefined,'');
dlg.incPnl.grpIncrementAppend.textboxIncrementAppend.characters = 12;
dlg.incPnl.grpIncrementFilter = dlg.incPnl.add('group');
dlg.incPnl.grpIncrementFilter.titleIncrementFilter = dlg.incPnl.grpIncrementFilter.add('statictext', undefined,'Pad number to (0 for no padding):');
dlg.incPnl.grpIncrementFilter.textboxIncrementFilter = dlg.incPnl.grpIncrementFilter.add('edittext', undefined,'4');
dlg.incPnl.grpIncrementFilter.textboxIncrementFilter.characters = 12;
dlg.incPnl.grpIncVal = dlg.incPnl.add('group');
dlg.incPnl.grpIncVal.titleIncVal = dlg.incPnl.grpIncVal.add('statictext', undefined,'Target frame:');
//get values for box
var incValues = ['default (increment)'];
for(var j =0; j<selFrames.length;j++){
if(selFrames .name == "") selFrames .name = "<TextFrame " + j.toString() + ">";
incValues.push(selFrames .name);
}
dlg.incPnl.grpIncVal.textboxIncVal = dlg.incPnl.grpIncVal.add('dropdownlist', undefined, incValues);
dlg.incPnl.grpIncVal.textboxIncVal.selection = dlg.incPnl.grpIncVal.textboxIncVal.items[0];
dlg.btnPnl = dlg.add('panel', undefined, '');
dlg.btnPnl.orientation = 'row';
dlg.btnPnl.okBtn = dlg.btnPnl.add('button', undefined, 'Generate', {name:'ok'});
dlg.btnPnl.cancelBtn = dlg.btnPnl.add('button', undefined, 'Cancel', {name:'cancel'});
var x = dlg.show();
var IncHelper = {
_keep: null,
find: function(e,n) {
if(!e.hasOwnProperty('pageItems') && e.name == n && e.typename == 'TextFrame') IncHelper._keep = e;
if(e.hasOwnProperty('pageItems')) {
for(var i=0;i<e.pageItems.length;i++) {
if(e.name == n && e.typename == 'TextFrame') IncHelper._keep=e;
else IncHelper.find(e.pageItems,n);
}
}
},
update: function(dupItem, from, step, loop, prepPad, appendPad, incPadding) {
IncHelper._keep = null;
var findNm = (dlg.incPnl.grpIncVal.textboxIncVal.selection.toString()!='default (increment)') ? dlg.incPnl.grpIncVal.textboxIncVal.selection.toString() : 'increment';
IncHelper.find(dupItem, findNm);
if(IncHelper._keep != null && typeof IncHelper._keep == 'object') {
IncHelper._keep.contents = prepPad + IncHelper.padder(from + step * loop, incPadding) + appendPad;
}
},
padder: function(s,n,d) {
d = d || '0';
s = s.toString();
if(n==0) return s;
var l = s.length;
return n.length >= n ? n : new Array(n-s.length+1).join(d) + s;
}
}
var UnitHelper = {
_nm: ['Inches','Feet','Yards','Millimeters','Centimeters','Meters','Points','Picas','Pixels'],
_nmv: ['in', 'ft', 'yd', 'mm', 'cm', 'm', 'pt', 'pc', 'px'],
getUnitByName: function(n) {
if(n==undefined) n = '';
for(var i=0; i < UnitHelper._nm.length; i++) {
if(UnitHelper._nm.toLowerCase() == n.toLowerCase()) return UnitHelper._nmv;
}
return 'pt';
}
}
if(x==1 && app.activeDocument.selection.length > 0) {
var doc = app.activeDocument;
var docUnit = UnitHelper.getUnitByName(doc.rulerUnits.toString().substr(doc.rulerUnits.toString().indexOf(".")+1));
var unitOfChoice = UnitHelper.getUnitByName(dlg.measPnl.grpSel.valueMeas.selection.toString());
var item = doc.selection[0];
var itemResizeX = parseFloat(dlg.copyPnl.grpScaleX.textboxScaleX.text);
var itemResizeY = parseFloat(dlg.copyPnl.grpScaleY.textboxScaleY.text);
var isClockWise = (dlg.copyPnl.grpRotationDirection.rotDir.selection.toString() == 'CLOCKWISE') ? true : false;
var strategyToLeft = (dlg.copyPnl.grpDirWhere.textboxDirWhere.selection.toString() == 'Horizontal') ? true : false;
var strategyXToLeft = (dlg.copyPnl.grpXDir.textboxDirX.selection.toString() == 'Left') ? true : false;
var strategyYUpwards = (dlg.copyPnl.grpXDir.textboxDirY.selection.toString() == 'Up') ? true : false;
var incPadding = (dlg.incPnl.grpIncrementFilter.textboxIncrementFilter.text == '0') ? 0 : parseInt(dlg.incPnl.grpIncrementFilter.textboxIncrementFilter.text);
var appendPad = dlg.incPnl.grpIncrementAppend.textboxIncrementAppend.text;
var prepPad = dlg.incPnl.grpIncrementPrepend.textboxIncrementPrepend.text;
if(itemResizeX != 100 || itemResizeY != 100) {
item.resize(itemResizeX, itemResizeY, undefined, undefined, undefined, undefined, undefined, eval('Transformation.' + dlg.copyPnl.grpScaleHow.textboxScaleHow.selection.toString()));
}
var itemStartLeft = item.position[0];
var itemStartTop = item.position[1];
var copiesX = parseInt(dlg.copyPnl.grpCopiesX.textboxCopiesX.text);
var copiesY = parseInt(dlg.copyPnl.grpCopiesY.textboxCopiesY.text);
var rotate = parseInt(dlg.copyPnl.grpRotation.textboxRotate.text);
var rotateEvery = parseInt(dlg.copyPnl.grpRotationEvery.textboxRotateEvery.text);
var offsetX = new UnitValue(parseInt(dlg.copyPnl.grpOffsetX.textboxOffsetX.text), unitOfChoice);
var offsetY = new UnitValue(parseInt(dlg.copyPnl.grpOffsetY.textboxOffsetY.text), unitOfChoice);
var incFrom = parseInt(dlg.incPnl.grpIncrementFrom.textboxIncrementFrom.text);
var incStep = parseInt(dlg.incPnl.grpIncrementStep.textboxIncrementStep.text);
var loop = 0;
var rotCount = 0;
var lastRotAmm = 0;
for(var j=0;j<copiesY;j++) {
for(var i=0;i<copiesX;i++) {
if(i==0 && j==0) { loop++; IncHelper.update(item, incFrom, 0, 0, prepPad, appendPad, incPadding); continue; }
var theNewItem = item.duplicate(doc,ElementPlacement.PLACEATBEGINNING);
var transX = (strategyToLeft) ? i * item.width + offsetX.as("pt") * i : j * item.width + offsetX.as("pt") * j;
var transY = (strategyToLeft) ? -(j * item.height + offsetY.as("pt") * j) : -(i * item.height + offsetY.as("pt") * i);
transX = (!strategyXToLeft) ? transX : -transX;
transY = (!strategyYUpwards ) ? transY : -transY;
theNewItem.translate(transX, transY);
if(rotateEvery > 0) {
if((loop + 1) % rotateEvery == 0) {
var rotAmm = (lastRotAmm + rotate > 360) ? lastRotAmm + rotate - 360 : lastRotAmm + rotate;
theNewItem.rotate(((isClockWise) ? -rotAmm : rotAmm), undefined, undefined, undefined, undefined, eval('Transformation.' + dlg.copyPnl.grpRotationOrigin.rotOrigin.selection.toString()));
lastRotAmm = rotAmm;
rotCount++;
}
}
IncHelper.update(theNewItem, incFrom, incStep, loop, prepPad, appendPad, incPadding);
loop++;
}
}
}
}
... View more