├── Shared Smart Object ├── parent.psb ├── assets │ ├── so_child01.psb │ ├── so_child02.psb │ └── so_child03.psb ├── readme.txt └── Replace Smart Layers.jsx ├── README.md ├── Create Fill Grid └── Create Fill Grid.jsx ├── Rename Selected Layers └── Rename Selected Layers.jsx ├── Move Layer by Pixels └── Move Layer by Pixels.jsx ├── Layer Edge to Guide └── Layer Edge to Guide.jsx ├── Android DIP Calc └── Android DIP Calc.jsx ├── Merge Layers └── Marge Layers with Same Prefix.jsx ├── Create Slice Grid └── Create Slice Grid.jsx ├── Change Colors of Multiple Shape Layers └── Change Colors of Multiple Shape Layers.jsx └── Create Rounded Rect └── Create Rounded Rect.jsx /Shared Smart Object/parent.psb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kynd/photoshopScripts/HEAD/Shared Smart Object/parent.psb -------------------------------------------------------------------------------- /Shared Smart Object/assets/so_child01.psb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kynd/photoshopScripts/HEAD/Shared Smart Object/assets/so_child01.psb -------------------------------------------------------------------------------- /Shared Smart Object/assets/so_child02.psb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kynd/photoshopScripts/HEAD/Shared Smart Object/assets/so_child02.psb -------------------------------------------------------------------------------- /Shared Smart Object/assets/so_child03.psb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kynd/photoshopScripts/HEAD/Shared Smart Object/assets/so_child03.psb -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | photoshopScripts 2 | ================ 3 | 4 | Repo for .jsx scripts for Adobe Photoshop 5 | 6 | To install scripts place the .jsx file in the Scripts folder (Photoshop CS/Presets/Scripts) and restart the application. 7 | The script appears in the Scripts menu (File > Scripts). 8 | 9 | Scripts are tested only on Mac OSX. 10 | -------------------------------------------------------------------------------- /Shared Smart Object/readme.txt: -------------------------------------------------------------------------------- 1 | 1. Install the script, place the .jsx file in the Scripts folder (Photoshop CS/Presets/Scripts) and restart the application. The script appears in the Scripts menu (File > Scripts) 2 | 3 | 2. Create the graphical assets as .psb files and save them in a folder named “assets” 4 | The file names must start with the prefix “so_” and end with “.psb”. (the folder name and the prefix can be altered in the variables in the beginning of the code.) 5 | 6 | 3. In the psd(b) files in which you want to use these assets, create Smart Object layers that have the same names as .psb files without the extension, e.g. a layer named “so_mail_icon” links to assets/so_mail_icon.psb. 7 | Run the script. The smart layers will be replaced with the .psb files. -------------------------------------------------------------------------------- /Shared Smart Object/Replace Smart Layers.jsx: -------------------------------------------------------------------------------- 1 | var prefix = "so_"; var assetPath = "assets/" var count = 0; listLayersets(app.activeDocument); listLayers(app.activeDocument); var path; function listLayersets(pointer) { for (var i = 0; i < pointer.layerSets.length; i++) { var layerset = pointer.layerSets[i]; listLayers (layerset); } } function listLayers(pointer) { for (var i = 0; i < pointer.artLayers.length; i++) { var layer = pointer.artLayers[i]; if (layer.name.indexOf(prefix) == 0) { if (layer.kind == "LayerKind.SMARTOBJECT") { app.activeDocument.activeLayer = layer; replaceSO (app.activeDocument.path + "/" + assetPath + layer.name + ".psb"); } } } } function replaceSO (newFile) { var id = stringIDToTypeID( "placedLayerReplaceContents" ); var desc = new ActionDescriptor(); var idn = charIDToTypeID("null"); desc.putPath( idn, new File(newFile)); var idp = charIDToTypeID("PgNm"); desc.putInteger(idp, 1); executeAction(id, desc, DialogModes.NO); return app.activeDocument.activeLayer }; -------------------------------------------------------------------------------- /Create Fill Grid/Create Fill Grid.jsx: -------------------------------------------------------------------------------- 1 | 2 | // ======================================================= 3 | 4 | var str = prompt("top-left-x, top-left-y, width, height, horizontal repeat, vertical repeat (comma-delimited)", "x, y, w, h, hr, vr"); 5 | var val = str.split(","); 6 | var valid = true; 7 | 8 | if (val.length < 6) { 9 | alert("insufficient parameters"); valid = false; 10 | } else { 11 | for (var i = 0; i < val.length; i ++) { 12 | if (isNaN(val[i])) { 13 | valid = false; 14 | } else { 15 | val[i] = parseFloat(val[i]); 16 | } 17 | } 18 | 19 | if (!valid) { 20 | alert("non-numeric parameter(s)"); 21 | } 22 | } 23 | 24 | if (valid) { 25 | CreateGrid(val[0], val[1], val[2], val[3], val[4], val[5]); 26 | } 27 | 28 | // ======================================================= 29 | function CreateGrid(x, y, w, h, hr, vr) { 30 | for (var j = 0; j < vr; j ++) { 31 | for (var i = 0; i < hr; i ++) { 32 | 33 | var left = x + i * w; 34 | var top = y + j * h; 35 | var right = left + w; 36 | var bottom = top + h; 37 | var region = [[left, top], [right, top], [right, bottom], [left, bottom]]; 38 | app.activeDocument.selection.select(region); 39 | 40 | app.activeDocument.selection.fill(((i + j) % 2 == 0) ? app.foregroundColor : app.backgroundColor); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /Rename Selected Layers/Rename Selected Layers.jsx: -------------------------------------------------------------------------------- 1 | var newName = prompt("layer name", "new name"); 2 | 3 | var layers = getSelectedLayers(); 4 | for (var i = 0; i < layers.length; i ++){ 5 | layers[i].name = newName; 6 | } 7 | 8 | 9 | //get the list of multiple selected layers 10 | //http://www.nekomataya.info/nekojyarashi/wiki.cgi?photoshop%CA%A3%BF%F4%A5%BB%A5%EC%A5%AF%A5%C8 11 | 12 | function getSelectedLayers(){ 13 | var idGrp = stringIDToTypeID( "groupLayersEvent" ); 14 | var descGrp = new ActionDescriptor(); 15 | var refGrp = new ActionReference(); 16 | refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" )); 17 | descGrp.putReference(charIDToTypeID( "null" ), refGrp ); 18 | executeAction( idGrp, descGrp, DialogModes.ALL ); 19 | var resultLayers=new Array(); 20 | for (var ix=0;ix= 2) { 10 | mergeLayers(); 11 | } 12 | 13 | var path; 14 | 15 | function listLayersets(pointer) { 16 | for (var i = 0; i < pointer.layerSets.length; i++) { 17 | var layerset = pointer.layerSets[i]; 18 | //alert("layer set: " + layerset.name); 19 | listLayers (layerset); 20 | } 21 | } 22 | 23 | function listLayers(pointer) { 24 | for (var i = 0; i < pointer.artLayers.length; i++) { 25 | var layer = pointer.artLayers[i]; 26 | //alert("layer: " + layer.name); 27 | if (layer.name.indexOf(prefix) == 0) { 28 | //alert(layer.name); 29 | layerSelection(layer.name, "addToSelection"); 30 | layer.selected = true; 31 | layerNames.push(layer.name); 32 | } 33 | } 34 | } 35 | 36 | function mergeLayers() { 37 | var str = layerNames.length + " layers have been merged\n"; 38 | for (var i = 0; i < layerNames.length; i++) { 39 | str += layerNames[i] + "\n"; 40 | } 41 | 42 | function cTID(s) { return app.charIDToTypeID(s); }; 43 | executeAction(cTID('Mrg2'), undefined, DialogModes.NO); 44 | alert(str); 45 | } 46 | 47 | function layerSelection(layerRef, addRef) { 48 | function cTID(s) { return app.charIDToTypeID(s); }; 49 | function sTID(s) { return app.stringIDToTypeID(s); }; 50 | var desc01 = new ActionDescriptor(); 51 | var ref01 = new ActionReference(); ref01.putName(cTID('Lyr '), layerRef); 52 | desc01.putReference(cTID('null'), ref01); 53 | desc01.putEnumerated(sTID('selectionModifier'), sTID('selectionModifierType'), sTID(addRef)); 54 | desc01.putBoolean(cTID('MkVs'), false); 55 | executeAction(cTID('slct'), desc01, DialogModes.NO); 56 | } 57 | 58 | 59 | function deselectLayers() { 60 | function cTID(s) { return app.charIDToTypeID(s); }; 61 | function sTID(s) { return app.stringIDToTypeID(s); }; 62 | var desc01 = new ActionDescriptor(); 63 | var ref01 = new ActionReference(); 64 | ref01.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt') ); 65 | desc01.putReference( cTID('null'), ref01); 66 | executeAction(sTID('selectNoLayers'), desc01, DialogModes.NO); 67 | } 68 | -------------------------------------------------------------------------------- /Create Slice Grid/Create Slice Grid.jsx: -------------------------------------------------------------------------------- 1 | 2 | // ======================================================= 3 | 4 | var str = prompt("top-left-x, top-left-y, width, height, horizontal repeat, vertical repeat (comma-delimited)", "x, y, w, h, hr, vr"); 5 | var val = str.split(","); 6 | var valid = true; 7 | 8 | if (val.length < 6) { 9 | alert("insufficient parameters"); valid = false; 10 | } else { 11 | for (var i = 0; i < val.length; i ++) { 12 | if (isNaN(val[i])) { 13 | valid = false; 14 | } else { 15 | val[i] = parseFloat(val[i]); 16 | } 17 | } 18 | 19 | if (!valid) { 20 | alert("non-numeric parameter(s)"); 21 | } 22 | } 23 | 24 | 25 | if (valid) { 26 | CreateSlice(val[0], val[1], val[2], val[3], val[4], val[5]); 27 | } 28 | 29 | // ======================================================= 30 | function CreateSlice(x, y, w, h, hr, vr) { 31 | 32 | for (var j = 0; j < vr; j ++) { 33 | for (var i = 0; i < hr; i ++) { 34 | 35 | var tx = x + i * w; 36 | var ty = y + j * h; 37 | 38 | 39 | var idMk = charIDToTypeID( "Mk " ); 40 | var desc12 = new ActionDescriptor(); 41 | var idnull = charIDToTypeID( "null" ); 42 | var ref6 = new ActionReference(); 43 | var idslice = stringIDToTypeID( "slice" ); 44 | ref6.putClass( idslice ); 45 | 46 | desc12.putReference( idnull, ref6 ); 47 | var idUsng = charIDToTypeID( "Usng" ); 48 | var desc13 = new ActionDescriptor(); 49 | var idType = charIDToTypeID( "Type" ); 50 | var idsliceType = stringIDToTypeID( "sliceType" ); 51 | var iduser = stringIDToTypeID( "user" ); 52 | desc13.putEnumerated( idType, idsliceType, iduser ); 53 | var idAt = charIDToTypeID( "At " ); 54 | var desc14 = new ActionDescriptor(); 55 | var idTop = charIDToTypeID( "Top " ); 56 | var idPxl = charIDToTypeID( "#Pxl" ); 57 | desc14.putUnitDouble( idTop, idPxl, ty ); 58 | var idLeft = charIDToTypeID( "Left" ); 59 | var idPxl = charIDToTypeID( "#Pxl" ); 60 | desc14.putUnitDouble( idLeft, idPxl, tx ); 61 | var idBtom = charIDToTypeID( "Btom" ); 62 | var idPxl = charIDToTypeID( "#Pxl" ); 63 | desc14.putUnitDouble( idBtom, idPxl, ty + h ); 64 | var idRght = charIDToTypeID( "Rght" ); 65 | var idPxl = charIDToTypeID( "#Pxl" ); 66 | desc14.putUnitDouble( idRght, idPxl, tx + w ); 67 | 68 | var idRctn = charIDToTypeID( "Rctn" ); 69 | desc13.putObject( idAt, idRctn, desc14 ); 70 | var idslice = stringIDToTypeID( "slice" ); 71 | desc12.putObject( idUsng, idslice, desc13 ); 72 | executeAction( idMk, desc12, DialogModes.NO ); 73 | 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /Change Colors of Multiple Shape Layers/Change Colors of Multiple Shape Layers.jsx: -------------------------------------------------------------------------------- 1 | 2 | var newColor = prompt("color(r,g,b - e.g. 255,255,255 or Hex - e.g. FFFFFF)", "255,255,255"); 3 | 4 | var r = 0, g = 0, b = 0; 5 | if (newColor.indexOf(",") > 0) { 6 | var list = newColor.split(","); 7 | r = parseFloat(list[0]); 8 | g = parseFloat(list[1]); 9 | b = parseFloat(list[2]); 10 | } else { 11 | r = parseInt(newColor.substr(0, 2), 16); 12 | g = parseInt(newColor.substr(2, 2), 16); 13 | b = parseInt(newColor.substr(4, 2), 16); 14 | } 15 | 16 | 17 | var layers = getSelectedLayers(); 18 | for (var i = 0; i < layers.length; i ++){ 19 | app.activeDocument.activeLayer = layers[i]; 20 | changeColor(r,g,b); 21 | } 22 | 23 | 24 | //get the list of multiple selected layers 25 | //http://www.nekomataya.info/nekojyarashi/wiki.cgi?photoshop%CA%A3%BF%F4%A5%BB%A5%EC%A5%AF%A5%C8 26 | 27 | function getSelectedLayers(){ 28 | var idGrp = stringIDToTypeID( "groupLayersEvent" ); 29 | var descGrp = new ActionDescriptor(); 30 | var refGrp = new ActionReference(); 31 | refGrp.putEnumerated(charIDToTypeID( "Lyr " ),charIDToTypeID( "Ordn" ),charIDToTypeID( "Trgt" )); 32 | descGrp.putReference(charIDToTypeID( "null" ), refGrp ); 33 | executeAction( idGrp, descGrp, DialogModes.ALL ); 34 | var resultLayers=new Array(); 35 | for (var ix=0;ix