// Distribute Layers Horizontally - Adobe Photoshop Script // Description: distributes selected layers horizontally // Requirements: Adobe Photoshop CS2, or higher // Version: 0.1.4, 9/July/2009 // Author: Trevor Morris (trevor@morris-photographics.com) // Website: http://morris-photographics.com/ // ============================================================================ // Installation: // 1. Place script in 'C:\Program Files\Adobe\Adobe Photoshop CS#\Presets\Scripts\' // 2. Restart Photoshop // 3. Choose File > Scripts > Distribute Layers Horizontally // ============================================================================ // enable double-clicking from Mac Finder or Windows Explorer // this command only works in Photoshop CS2 and higher #target photoshop // bring application forward for double-click events app.bringToFront(); /////////////////////////////////////////////////////////////////////////////// // main - distributes selected layers horizontally /////////////////////////////////////////////////////////////////////////////// function main() { // declare local variables var doc = activeDocument; // group selected layers groupSelectedLayers(); // initialize local variables var selectedLayers = new Array(); var groupLayers = doc.activeLayer.layers; var len = groupLayers.length; // get layer id of grouped layers for (var i = 0; i < len; i++) { doc.activeLayer = groupLayers[i]; selectedLayers.push(getActiveLayerID()); } // undo layer group executeAction(cTID('undo'), undefined, DialogModes.NO); // display alert for less than two layers len = selectedLayers.length; if (len <= 2) { alert('This command requires three or more selected layers.', 'Too Few Layers Selected', false); return; } // initialize local variables var min = Number(doc.width); var max = 0, width = 0, left = 0, right = 0; var bounds; var sortArray = new Array(); var leftArray = new Array(); // get layer bounds and store into arrays for (var i = 0; i < len; i++) { selectLayerById(selectedLayers[i]); bounds = doc.activeLayer.bounds; left = Number(bounds[0]); right = Number(bounds[2]); min = Math.min(min, left); max = Math.max(max, right); leftArray.push(left); sortArray.push([selectedLayers[i], left]); width += right - left; } // number sort left position array leftArray.sort(numberorder); function numberorder(a, b) {return a - b;} // re-sort selected layers array to match left position array selectedLayers = new Array(); for (var i = 0; i < len; i++) { for (var j = 0; j < len; j++) { if (leftArray[i] == sortArray[j][1]) { selectedLayers.push(sortArray[j][0]); } } } // distributes selected layers horizontally for (var i = 0; i < (len - 1); i++) { // determine spacing between layers if (!gap) { var gap = (max - min - width) / (len - 1); selectLayerById(selectedLayers[i]); i++; } bounds = doc.activeLayer.bounds; right = Number(bounds[2]) + gap; // select and reposition layer selectLayerById(selectedLayers[i]); layer = doc.activeLayer; bounds = layer.bounds; left = Number(bounds[0]); layer.translate(right - left, 0); } // reselect layers for (var i = 0; i < len; i++) { selectLayerById(selectedLayers[i], true); } } /////////////////////////////////////////////////////////////////////////////// // isCorrectVersion - check for Adobe Photoshop CS2 (v9) or higher /////////////////////////////////////////////////////////////////////////////// function isCorrectVersion() { if (parseInt(version, 10) >= 9) { return true; } else { alert('This script requires Adobe Photoshop CS2 or higher.', 'Wrong Version', false); return false; } } /////////////////////////////////////////////////////////////////////////////// // isOpenDocs - ensure at least one document is open /////////////////////////////////////////////////////////////////////////////// function isOpenDocs() { if (documents.length) { return true; } else { alert('There are no documents open.', 'No Documents Open', false); return false; } } /////////////////////////////////////////////////////////////////////////////// // showError - display error message if something goes wrong /////////////////////////////////////////////////////////////////////////////// function showError(err) { if (confirm('An unknown error has occurred.\n' + 'Would you like to see more information?', true, 'Unknown Error')) { alert(err + ': on line ' + err.line, 'Script Error', true); } } /////////////////////////////////////////////////////////////////////////////// // groupSelectedLayers - from Paul MR // http://www.ps-scripts.com/bb/viewtopic.php?t=2339 /////////////////////////////////////////////////////////////////////////////// function groupSelectedLayers() { var ref = new ActionReference(); ref.putClass(sTID('layerSection')); var desc = new ActionDescriptor(); desc.putReference(cTID('null'), ref); var ref2 = new ActionReference(); ref2.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt')); desc.putReference(cTID('From'), ref2); executeAction(cTID('Mk '), desc, DialogModes.NO); } /////////////////////////////////////////////////////////////////////////////// // xtools functions // Copyright: (c)2009, xbytor // License: http://creativecommons.org/licenses/LGPL/2.1 // Contact: xbytor@gmail.com /////////////////////////////////////////////////////////////////////////////// function getActiveLayerID() { var d = getActiveLayerDescriptor(); return d.getInteger(cTID('LyrI')); } function getActiveLayerDescriptor() { var ref = new ActionReference(); ref.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt')); return executeActionGet(ref); } // function modified by Trevor Morris function selectLayerById(id, add) { var ref = new ActionReference(); ref.putIdentifier(cTID('Lyr '), id); var desc = new ActionDescriptor(); desc.putReference(cTID('null'), ref); if (add) { desc.putEnumerated(sTID('selectionModifier'), sTID('selectionModifierType'), sTID('addToSelection')); } //desc.putBoolean(cTID('MkVs'), false); executeAction(cTID('slct'), desc, DialogModes.NO); } function cTID(s) {return app.charIDToTypeID(s);} function sTID(s) {return app.stringIDToTypeID(s);} /////////////////////////////////////////////////////////////////////////////// // test initial conditions prior to running main function /////////////////////////////////////////////////////////////////////////////// if (isCorrectVersion() && isOpenDocs()) { // remember unit settings; switch to pixels displayDialogs = DialogModes.NO; var originalRulerUnits = preferences.rulerUnits; preferences.rulerUnits = Units.PIXELS; try { // suspend history for CS3 (v10) or higher if (parseInt(version, 10) >= 10) { activeDocument.suspendHistory('Distribute Horizontally', 'main()'); } // just run main for CS2 (v9) else { main(); } } catch(e) { // don't report error on user cancel if (e.number != 8007) { showError(e); } } // restore original ruler units displayDialogs = DialogModes.NO; preferences.rulerUnits = originalRulerUnits; }