Today, my team was working on options for creating a backdrop like you see at red carpet events or press conference with repeating logos. In our case, we wanted something our graduates could stand in front of at a commencement ceremony to take photos with their families.
One of our designers spent a lot of time manually positioning various sizes and colors of our logos to try out how different patterns might look work, and I thought this would be a perfect time to apply programming to get it just right and be able to iterate quickly. Thankfully Adobe has a great scripting library for doing just this sort of thing.
The Code
To make this work, open up Illustrator, create a new 16’x8′ document, make sure you have two images (JPG, SVG, AI, or anything Illustrator can understand) in the directory, then run the following script (File->Scripts->Other Script).
/*************************
Creates a repeating pattern of images on Illustrator
For a logo wall on a 16' x 8' area
John Dyer (http://j.hn/ 2016)
MIT license
**************************/
// variables/settings
var
xRepeat = 9, // how many times the first logo will show on the top row (1 less for the second one)
yRepeat = 5, // how many rows down
xPadding = 0, // space from left and right edge (0 for bleed)
yPadding = 400, // space from top and bottom
item1Width = 650, // size in Illustrator units
item2Width = 400, // size in Illustrator units
item1Filename = 'DTS.seal.white.ai',
item2Filename = 'DTS.logo.white.ai';
/// DO THE APP
if (typeof app != 'undefined') {
runScript();
}
function runScript() {
var
// current document
doc = app.documents[0],
// add a new layer for our stuff
layer = doc.layers.add(),
// script file
thisFile = new File($.fileName),
basePath = thisFile.path,
rootDir = basePath.replace('%20',' ') + '/';
// open files for calculations
file1 = new File(rootDir + item1Filename),
item1 = layer.groupItems.createFromFile( file1 ),
item1Ratio = item1.height / item1.width,
item1Height = item1Width * item1Ratio,
file2 = new File(rootDir + item2Filename),
item2 = layer.groupItems.createFromFile( file2 ),
item2Ratio = item2.height / item2.width,
item2Height = item2Width * item2Ratio,
// calculate image sizes and offsets
largestHeight = Math.max(item1Height, item2Height),
largestWidth = Math.max(item1Width, item2Width),
item1xOffset = largestWidth/2 - item1Width/2,
item1yOffset = largestHeight/2 - item1Height/2,
item2xOffset = largestWidth/2 - item2Width/2,
item2yOffset = largestHeight/2 - item2Height/2,
// calculate gaps
docWidth = doc.width,
docHeight = doc.height,
xGap = (docWidth-largestWidth-xPadding*2) / (xRepeat-1),
yGap = (docHeight-largestHeight-yPadding*2) / (yRepeat-1);
// remove the images used for sizing
item1.remove();
item2.remove();
layer.name = 'Fun new pattern';
// main loop
for (var x=0; x < xRepeat; x++) {
for (var y=0; y < yRepeat; y++) {
// check for the end of the row so we don't create too many
var do1 = true;
var do2 = true;
if (x == xRepeat -1) {
if (y % 2 == 0) {
do1 = false;
} else {
do2 = false;
}
}
if (do1) {
var item1 = layer.groupItems.createFromFile( file1 ),
item1x = xPadding + (x * xGap) + (y % 2 == 0 ? xGap/2 : 0) + item1xOffset,
item1y = - (yPadding + (y * yGap) + item1yOffset);
item1.name = 'logo1 ' + x + 'x' + y;
item1.width = item1Width;
item1.height = item1Height;
item1.position = [item1x, item1y];
}
if (do2) {
var item2 = layer.groupItems.createFromFile( file2 ),
item2x = xPadding + (x * xGap) + (y % 2 != 0 ? xGap/2 : 0) + item2xOffset,
item2y = - (yPadding + (y * yGap) + item2yOffset);
item2.name = 'logo2 ' + x + 'x' + y;
item2.width = item2Width;
item2.height = item2Height;
item2.position = [item2x, item2y];
}
}
}
}
The Results
Here’s a few patterns we created. You can vary the logos, sizes, and spacing to make it work as needed.

