gaintsev
2/4/2016 - 1:13 PM

Demonstration Photoshop script that allows you to quickly make copies of objects and arrange them in the correct order.

Demonstration Photoshop script that allows you to quickly make copies of objects and arrange them in the correct order.

/**
 *
 * Duplicate Me!
 * Copyright: (c)2016. Vladimir Gaintsev, gaintsev@gmail.com. All rights reserved.
 *
 */

/*=============================================
=            Check Active Document            =
=============================================*/
function checkActiveDocument() {
  if (!documents.length) {
    alert('No active documents. First open or create a document.');
    return false;
  }
  return true;
}

/*========================================
=            Check Layer Type            =
========================================*/
function checkLayerSet(layerSet) {
  if (layerSet.typename == 'LayerSet') {
    return true;
  }
  alert('First select a group layer.');
  return false;
}

/*======================================
=            Get Layer Size            =
======================================*/
function getLayerSize(layer) {
  var bounds = layer.bounds;
  var width = bounds[2] - bounds[0];
  var height = bounds[3] - bounds[1];
  var size = [width, height];
  return size;
}

/*===================================
=            Main script            =
===================================*/

if (checkActiveDocument()) {

  // Define variables
  var activeDocument = app.activeDocument;
  var activeLayer = activeDocument.activeLayer;
  var activeLayerSizes = getLayerSize(activeLayer);

  // Default parameters
  var itemAlign        = ['inline', 'column', 'grid'];
  var itemCount        = 6;
  var itemCountInRow   = 3;
  var itemMarginRight  = 1;
  var itemMarginBottom = 1;


  if (checkLayerSet(activeLayer)) {

    // Building dialog window
    var win = new Window('dialog','Duplicate Me!');
    win.alignChildren = 'center';

    var ddlPanel = win.add('panel', undefined, 'Diplicates align style');
    var ddlItemAlign = ddlPanel.add('dropdownlist', undefined, itemAlign);
    ddlItemAlign.selection = 0;

    var panelItemCount = win.add('panel', undefined, 'Duplicates Count');
    var etItemCount = panelItemCount.add('edittext', undefined, itemCount);

    var panelItemCountInRow = win.add('panel', undefined, 'Duplicates in row (only for grid style)');
    var etItemCountInRow = panelItemCountInRow.add('edittext', undefined, itemCountInRow);

    var panelMargins = win.add('panel', undefined, 'Margins');
    panelMargins.orientation = 'row';
    panelMargins.add('statictext', undefined, 'Right margin');
    var etItemMarginRight = panelMargins.add('edittext', undefined, itemMarginRight);
    panelMargins.add('statictext', undefined, 'Bottom margin');
    var etItemMarginBottom = panelMargins.add('edittext', undefined, itemMarginBottom);

    var buttonsGroup = win.add('panel');
    buttonsGroup.orientation = 'row';
    var cancelButton = buttonsGroup.add('button', undefined, 'Cancel');
    var applyButton = buttonsGroup.add('button', undefined, 'Apply');

    cancelButton.onClick = function() {
      return win.close();
    };

    // Main script
    applyButton.onClick = function() {
      var i = 0;
      while (i < etItemCount.text) {
        activeLayer.duplicate();
        switch (ddlItemAlign.selection.text) {
          case 'inline':
            activeLayer.translate(activeLayerSizes[0] + (etItemMarginRight.text * 1), 0);
            break;
          case 'column':
            activeLayer.translate(0, activeLayerSizes[1] + (etItemMarginBottom.text * 1));
            break;
          case 'grid':
            var row = 1;
            var counter = i + 1;
            if (counter % etItemCountInRow.text == 0) {
              activeLayer.translate(-(etItemCountInRow.text * activeLayerSizes[0] + (etItemMarginRight.text * 1) * etItemCountInRow.text), activeLayerSizes[1] * row++ + (etItemMarginBottom.text * 1));
            }
            activeLayer.translate(activeLayerSizes[0] + (etItemMarginRight.text * 1), 0);
        }
        i++;
      }
      activeLayer.visible = false;
      activeLayer.allLocked = true;
      win.close();
    };
    win.show();
  }

}