jazz-y
Guide
jazz-y
Guide
Activity
Feb 27, 2025
01:57 PM
Hello there. Did you resolve the problem?
... View more
Feb 10, 2025
04:15 PM
It's nearly always better to start a new thread rather than tag onto a thread that was started years ago. Photoshop will be quite different now compared to the version that the OP was using. If you have an issue and would like advice, start the new thread. Tell us your operating system and version. Photoshop version, and describe your issue. In this case I suspect that screen shots would be useful.
... View more
Community Expert
in Photoshop ecosystem Discussions
Feb 08, 2025
04:38 PM
1 Upvote
Feb 08, 2025
04:38 PM
1 Upvote
Wow! Thanks that's awesome.
Exactly what I needed.
Thanks a ton for your work and quick turn around.
By @SandraPL
You're welcome!
... View more
Feb 08, 2025
12:15 PM
I wish cameras would record gyroscope and accelerometer data in photo metadata so that we could quickly level photos with a single click during editing.
... View more
Feb 06, 2025
12:51 PM
Hi! I really don't know how to put the lines of code in photoshop. Is there a jsx. file i could use? Would make it much simpler
By @micha�l_4585
Copy the code text to the clipboard
Open a new blank file in a plain-text editor (not in a word processor)
Paste the code in
Save as a plain text format file – .txt
Rename the saved file extension from .txt to .jsx
Install or browse to the .jsx file to run (see below)
Adobe Photoshop Script Installation Location Scripts are installed in the /Presets/Scripts folder Mac OS Example:
/Applications/Adobe Photoshop CC 2019/Presets/Scripts
/Applications/Adobe Photoshop 2021/Presets/Scripts
(If this path does not match your version, it should be a simple enough process to find the correct folder using this guide) Win OS Example:
C:\Program Files\Adobe\Adobe Photoshop CC 2018\Presets\Scripts
C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts
(If this path does not match your version, it should be a simple enough process to find the correct folder using this guide)
NOTE: If running, Adobe Photoshop must be quit and restarted for newly added scripts to become accessible.
Alternatively, select File > Scripts > Browse and navigate to the script file. Scripts recorded into an Action via the Browse command will record the entire absolute path to the script, often making them unsuitable for use on multiple computers. Installed scripts will only record the script name into an Action, which is the better option for Actions that will be installed on multiple computers.
William Campbell has videos on how to install scripts here:
https://www.marspremedia.com/software/how-to-adobe-cc
Further information at the Adobe site: https://helpx.adobe.com/photoshop/using/scripting.html
... View more
Jan 31, 2025
11:30 PM
Wowsers! My feature request is approaching the 8 year mark! Perhaps a screenshot of PhotoLine might serve as inspiration. Compare Photoshop's tiny Curves editor with PhotoLine's infinitely scalable Curves editor: ...and why is it still not possible to work with LAB or HSV in the curve editor while in RGB image mode? Sigh...
... View more
Community Expert
in Photoshop ecosystem Discussions
Jan 24, 2025
05:53 PM
1 Upvote
Jan 24, 2025
05:53 PM
1 Upvote
Some additional code examples for saving as PSB:
https://community.adobe.com/t5/photoshop-ecosystem-discussions/script-to-automate-load-files-into-stack/m-p/13499068
https://community.adobe.com/t5/photoshop-ecosystem-ideas/photoshop-ability-to-set-default-quot-save-save-as-quot-file-type-to-psb/idc-p/14795865
https://community.adobe.com/t5/photoshop-ecosystem-ideas/save-multilayer-png-jpg-smart-objects-as-psb-and-automatically-replace/idi-p/12504206
... View more
Jan 13, 2025
07:51 PM
Thank you for this answer! I'm receiving the following message- TypeError: undefined is not an object. Any help appreciated
... View more
Dec 10, 2024
09:23 AM
1 Upvote
@Stephen Marsh Indeed, shows how it works, what it does. Great work. He also completely replicated the original version @jazz-y Very interesting method of using Localize, i used a different method where i can all the languages i want. Here's an example of how use an other method // Localized history outputs
// PS version alert
locPhotoshopversionAlert = {
en: "Photoshop versions before CS2 are not supported!",
fr: "Les versions de Photoshop avant CS2 ne sont pas prises en charge!",
nl: "Photoshop-versies v\u00F3\u00F3r CS2 worden niet ondersteund!",
ch: "不支持 CS2 之前的 Photoshop 版本"
};
var PSalertStr = localize(locPhotoshopversionAlert); I used this for an extension called AnimDessign2 which i upgraded with all kinda of extra funcitonality. All the panels have localize, scripts as well. Massive work getting that all to work. Even the HTML CEP panels have localize. Was lots of fun figuring all of this out
... View more
Community Expert
in Photoshop ecosystem Discussions
Nov 13, 2024
12:18 PM
1 Upvote
Nov 13, 2024
12:18 PM
1 Upvote
@Michael35807377lhky
Thank you. I updated the repository the other day, hopefully all are OK now.
... View more
Nov 01, 2024
11:19 AM
Came here to change the color of the text on the ruler. Copied the script. Whiel I did not create a full skin at all, i can say this does work in 2024 with PS Version 26.0.0
... View more
Oct 21, 2024
12:41 AM
@high voltaged53703767
I'd suggest that you start a new topic for visibility and conciseness.
... View more
Sep 30, 2024
08:19 AM
Update for 2024.. I am hoping to get my G13 up and running again for LR primarily. Any ideas? I used to use Padd for Lightroom but sadly unavailable now.
... View more
Sep 17, 2024
11:42 PM
There's nothing to fix. There's nothing Photoshop can do with a corrupt file.
File corruption will happen one fine day to everyone. That's why we save incrementally while working, and always keep backups.
... View more
Sep 14, 2024
10:13 PM
The scripts I create on the forum are often for other users, not my personal use. Stacking files in horizontal or vertical layout layers is something that I do quite often. I have combined my previously separate horizontal and vertical stacker scripts into a single script with an interface:
Note: It is assumed that the stacked files will create a canvas size below the common 30,000 or 300,000 px limits. :]
/*
Files to Horizontally or Vertically Stacked Layers scriptUI GUI.jsx
v1.0, 15th September 2024
Based on:
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-create-one-big-png-image-from-multiple-png-images/td-p/12359415
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-combine-images-horizontally-via-batch/m-p/12716190#M619600
*/
#target photoshop
function showGUI() {
var dlg = new Window('dialog', 'Horizontal or Vertical File Stacker (v1.0)');
dlg.preferredSize = [300, 250];
dlg.orientation = 'column';
dlg.alignChildren = 'center';
// Stack Direction Dropdown
var dropdown = dlg.add('dropdownlist', undefined, ['Horizontal Stack', 'Vertical Stack']);
dropdown.selection = 0; // Default to Horizontal Stack
// Horizontal Alignment Radio Buttons
dlg.add('statictext', undefined, 'Horizontal Stack Alignment:');
var hAlignmentGroup = dlg.add('group');
hAlignmentGroup.orientation = 'row';
var rbtnHCenter = hAlignmentGroup.add('radiobutton', undefined, 'Center Vertical');
var rbtnHTopLeft = hAlignmentGroup.add('radiobutton', undefined, 'Top Left');
rbtnHCenter.value = true; // Default to Center Vertical alignment
// Vertical Alignment Radio Buttons
dlg.add('statictext', undefined, 'Vertical Stack Alignment:');
var vAlignmentGroup = dlg.add('group');
vAlignmentGroup.orientation = 'row';
var rbtnVCenter = vAlignmentGroup.add('radiobutton', undefined, 'Center Horizontal');
var rbtnVTopLeft = vAlignmentGroup.add('radiobutton', undefined, 'Top Left');
rbtnVCenter.value = true; // Default to Center Horizontal alignment
// Reverse Layer Stack Checkbox
var reverseCheckbox = dlg.add('checkbox', undefined, 'Reverse Layer Stack');
reverseCheckbox.value = false; // Default to unchecked
// OK and Cancel Button Group
var buttonGroup = dlg.add('group');
buttonGroup.orientation = 'row';
buttonGroup.alignChildren = 'center';
buttonGroup.margins = 5;
// OK Button
var btnOK = buttonGroup.add('button', undefined, 'OK');
btnOK.onClick = function () {
var inputFiles = selectMultipleFiles();
if (inputFiles) {
dlg.close();
var stackDirection = dropdown.selection.text;
var reverseLayers = reverseCheckbox.value;
if (stackDirection === 'Horizontal Stack') {
var hAlignment = rbtnHCenter.value ? 'center' : 'topLeft';
hStacker(inputFiles, hAlignment, reverseLayers);
} else {
var vAlignment = rbtnVCenter.value ? 'center' : 'topLeft';
vStacker(inputFiles, vAlignment, reverseLayers);
}
}
};
// Cancel Button
var btnCancel = buttonGroup.add('button', undefined, 'Cancel', { name: 'cancel' });
btnCancel.onClick = function () {
dlg.close();
};
// Disable/Enable Alignment Options based on Stack Selection
dropdown.onChange = function () {
if (dropdown.selection.text === 'Horizontal Stack') {
hAlignmentGroup.enabled = true;
vAlignmentGroup.enabled = false;
} else {
hAlignmentGroup.enabled = false;
vAlignmentGroup.enabled = true;
}
};
// Initially disable vertical alignment radio buttons
vAlignmentGroup.enabled = false;
dlg.show();
}
function selectMultipleFiles() {
var inputFiles = File.openDialog('Select image files', true);
if (!inputFiles || inputFiles.length === 0) {
alert('No files selected.');
return null;
}
return inputFiles;
}
if (app.documents.length === 0) {
showGUI();
} else {
alert('Please close all open files before running this script...');
}
function hStacker(inputFiles, alignment, reverseLayers) {
(function () {
var savedDisplayDialogs = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
var origUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
// Sort files alphabetically
inputFiles.sort().reverse();
// Process the first "base" file
var firstFile = app.open(File(inputFiles[0]));
var firstFileName = app.activeDocument.name;
app.activeDocument.duplicate("Horizontal-Stacker", false);
firstFile.close(SaveOptions.DONOTSAVECHANGES);
var docStack = app.documents[0];
app.activeDocument = docStack;
docStack.activeLayer.name = firstFileName;
var baseWidth = app.activeDocument.width.value;
// Process the remaining file layers to the "base" file
for (var i = 1; i < inputFiles.length; i++) {
var remainingFiles = app.open(File(inputFiles[i]));
var fileName = remainingFiles.name;
remainingFiles.activeLayer.name = fileName;
remainingFiles.layers[0].duplicate(docStack, ElementPlacement.PLACEATBEGINNING);
remainingFiles.close(SaveOptions.DONOTSAVECHANGES);
relativeCanvasSizeW(true, baseWidth);
if (alignment === 'center') {
align2SelectAll('AdCV'); // Center Vertical
} else {
align2SelectAll('AdTp'); // Align to Top
}
align2SelectAll('AdLf'); // Left
}
app.runMenuItem(stringIDToTypeID("selectAllLayers"));
if (reverseLayers) {
reverseLayerStack();
}
app.activeDocument.revealAll();
app.beep();
alert(inputFiles.length + ' files stacked horizontally!');
app.displayDialogs = savedDisplayDialogs;
app.preferences.rulerUnits = origUnits;
function relativeCanvasSizeW(relative, width) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
descriptor.putBoolean(s2t("relative"), relative);
descriptor.putUnitDouble(s2t("width"), s2t("pixelsUnit"), width);
descriptor.putEnumerated(s2t("horizontal"), s2t("horizontalLocation"), s2t("top"));
executeAction(s2t("canvasSize"), descriptor, DialogModes.NO);
}
})();
}
function vStacker(inputFiles, alignment, reverseLayers) {
(function () {
var savedDisplayDialogs = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
var origUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
// Sort files alphabetically
inputFiles.sort().reverse();
// Process the first "base" file
var firstFile = app.open(File(inputFiles[0]));
var firstFileName = app.activeDocument.name;
app.activeDocument.duplicate("Vertical-Stacker", false);
firstFile.close(SaveOptions.DONOTSAVECHANGES);
var docStack = app.documents[0];
app.activeDocument = docStack;
docStack.activeLayer.name = firstFileName;
// Process the remaining file layers to the "base" file
for (var i = 1; i < inputFiles.length; i++) {
var remainingFiles = app.open(File(inputFiles[i]));
var fileName = remainingFiles.name;
var baseHeight = activeDocument.height.value;
remainingFiles.activeLayer.name = fileName;
remainingFiles.layers[0].duplicate(docStack, ElementPlacement.PLACEATBEGINNING);
remainingFiles.close(SaveOptions.DONOTSAVECHANGES);
relativeCanvasSizeH(true, baseHeight);
if (alignment === 'center') {
align2SelectAll('AdCH'); // Center Horizontal
} else {
align2SelectAll('AdLf'); // Align to Left
}
align2SelectAll('AdBt'); // Bottom
}
app.runMenuItem(stringIDToTypeID("selectAllLayers"));
if (reverseLayers) {
reverseLayerStack();
}
app.activeDocument.revealAll();
app.beep();
alert(inputFiles.length + ' files stacked vertically!');
app.displayDialogs = savedDisplayDialogs;
app.preferences.rulerUnits = origUnits;
function relativeCanvasSizeH(relative, height) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
descriptor.putBoolean(s2t("relative"), relative);
descriptor.putUnitDouble(s2t("height"), s2t("pixelsUnit"), height);
descriptor.putEnumerated(s2t("vertical"), s2t("verticalLocation"), s2t("top"));
executeAction(s2t("canvasSize"), descriptor, DialogModes.NO);
}
})();
}
// Common Helper functions
function reverseLayerStack() {
var idreverse = stringIDToTypeID("reverse");
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
desc.putReference(stringIDToTypeID("null"), ref);
executeAction(idreverse, desc, DialogModes.NO);
}
function align2SelectAll(method) {
app.activeDocument.selection.selectAll();
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
desc.putReference(charIDToTypeID("null"), ref);
desc.putEnumerated(charIDToTypeID("Usng"), charIDToTypeID("ADSt"), charIDToTypeID(method));
try {
executeAction(charIDToTypeID("Algn"), desc, DialogModes.NO);
} catch (e) {}
app.activeDocument.selection.deselect();
}
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
... View more
Sep 04, 2024
11:57 PM
Thank you soooooo so much! This is pure gold ❤️
... View more
Aug 04, 2024
06:42 AM
Hi Jazz-y Do you remeber me and this script ? I worked with it for a long time but now it isn't working with photoshop 2024 Can you fix it please ? Thanks
... View more
Jul 18, 2024
07:39 PM
Ah, thank you. I do see it bringing in a linked image instead, but I am having difficulty adopting it to script above.
By @Soniku_WSI
Yes, I had problems too. Perhaps @Andre5FA4 or @jazz-y can help.
I would need to rewrite the entire script.
... View more
Jun 20, 2024
02:32 PM
Hello Sir @r-bin . . . Where should I prepare to change this? By @Thiha31203570tbl0 There is no such setting in my Photoshop. Ask someone else who has such Photoshop to research the "currentToolOptions" settings for this tool.
... View more
May 24, 2024
02:43 PM
1 Upvote
I agree, this was a silly feature, or at least the way it was implemented is very juvenile. I honestly can't think of a single scenario where I need to share SO urgently that I need a permanent floating blue button accessible at all times. Yes, Adobe, I saw your very dodgy response suggesting we just change the color of it. That is not a solution and frankly that kind of blatantly dodgy suggestion is frankly annoying. A floating button like that should never be placed in this type of UI. I literally have to minimize the window to see the Accept button in certain scenarios, and it also blocks other tools depending on my layout. This is the type of bush league UX that makes me seriously question what's going on behind the scenes.
... View more
May 18, 2024
01:59 PM
If we can't reproduce it, it's not a 'bug.' 🤔
Does your system meet the min-system requirements?
Windows 11 (64-bit), Windows 10 versions 22H2, 21H2, 21H1;
MacOS 14 (Sonoma), 13 (Ventura, 12 (Monterey), 11 (Big Sur).
- https://helpx.adobe.com/creative-cloud/system-requirements.html - https://helpx.adobe.com/photoshop/system-requirements.html - https://helpx.adobe.com/photoshop/kb/photoshop-cc-gpu-card-faq.html
... View more
Apr 29, 2024
05:25 PM
okay, thank you
... View more
Community Expert
in Photoshop ecosystem Discussions
Apr 24, 2024
05:45 PM
1 Upvote
Apr 24, 2024
05:45 PM
1 Upvote
Here is an edited version with a conditional check for the smart object being embedded. I have performed limited testing and this appears to stop linked smart objects being deleted from disk:
/*
https://community.adobe.com/t5/photoshop-ecosystem-discussions/remove-documentancestors-recursively-for-all-smartobjects-in-a-psd/td-p/13043605
Remove DocumentAncestors recursively for all SmartObjects in a PSD.jsx
Hacked together by m3zli
04.07.2022
Edited by Stephen Marsh
25th April 2024 - Conditional check for embedded smart object added to avoid deleting links smart object files
Interesting posts, which helped me write this script:
https://community.adobe.com/t5/photoshop/inflated-jpg-file-size-photoshop-document-ancestors-metadata/m-p/8055434
https://feedback.photoshop.com/photoshop_family/topics/rasterize_all_smart_objects_in_a_psd_file_to_shrink_down_its_size
https://community.adobe.com/t5/photoshop-ecosystem-discussions/remove-documentancestors-recursively-for-all-smartobjects-in-a-psd/m-p/13047853#M655448
https://prepression.blogspot.com/2017/06/metadata-bloat-photoshopdocumentancestors.html
https://community.adobe.com/t5/framemaker-discussions/directory-manipulation-as-part-of-an-extend-script/m-p/7822479
Adobe Photoshop CC JavaScript Reference 2020
*/
#target photoshop
var count = 0;
var doc = app.activeDocument;
doc.suspendHistory("Delete Ancestors Metadata", "processSOLayers(doc)");
function processSOLayers(theParent)
{
$.writeln("Entering Parent: " + theParent.name );
count++;
$.writeln( "Depth: " + count);
var soLayers = getSmartObjectLayers();
for (var m = 0; m < soLayers.length; m++)
{
var layerID = soLayers[m];
selectById(layerID);
if( layerIsPhotoshopObject(layerID) )
{
$.writeln("Opening SmartObject ID: " + layerID);
var smartObject = openSmartObject();
var path = smartObject.fullName;
if( smartObject.id !== theParent.id)
{
processSOLayers(smartObject);
deleteDocAncestors(smartObject);
smartObject.close(SaveOptions.SAVECHANGES);
$.writeln("Saved SmartObject ID: " + layerID);
// Garbage collection step modified to avoid deleting linked smart objects!
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var layerDesc = executeActionGet(ref);
ref.putProperty(charIDToTypeID("Prpr"), stringIDToTypeID("smartObject"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var so = executeActionGet(ref).getObjectValue(stringIDToTypeID("smartObject"));
var soMoreDesc = layerDesc.getObjectValue(stringIDToTypeID('smartObjectMore'));
if (so.getBoolean(stringIDToTypeID("linked")) === false) {
removePSB(path);
}
}
}
}
$.writeln("Exiting parent: " + theParent.name );
count--;
$.writeln( "Depth: " + count);
return;
}
deleteDocAncestors(doc);
doc.close(SaveOptions.SAVECHANGES);
function selectById(id)
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID('Lyr '), id);
desc.putReference(charIDToTypeID('null'), ref);
executeAction(charIDToTypeID('slct'), desc, DialogModes.NO);
}
function getSmartObjectLayers()
{
var ids = [];
var layers, desc, type, id;
try
{
activeDocument.backgroundLayer;
layers = 0;
}
catch (e)
{
layers = 1;
}
while (true)
{
ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), layers);
try
{
desc = executeActionGet(ref);
}
catch (err)
{
break;
}
type = desc.getInteger(stringIDToTypeID("layerKind"));
id = desc.getInteger(stringIDToTypeID("layerID"));
if (type == 5 ) ids.push(id);
layers++;
}
return ids;
}
function deleteDocAncestors(document)
{
if (ExternalObject.AdobeXMPScript === undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(document.xmpMetadata.rawData);
xmp.deleteProperty(XMPConst.NS_PHOTOSHOP, "DocumentAncestors");
document.xmpMetadata.rawData = xmp.serialize();
$.writeln("Cleaned Ancestors...")
}
function openSmartObject ()
{
try
{
var idplacedLayerEditContents = stringIDToTypeID( "placedLayerEditContents" );
var desc2 = new ActionDescriptor();
executeAction( idplacedLayerEditContents, desc2, DialogModes.NO );
return app.activeDocument;
}
catch(e)
{
alert(e.name + " " + e.message);
return undefined;
}
};
function removePSB(path)
{
var file = new File(path);
if(file.exists)
{
file.remove();
$.writeln("Removed file: " + path);
}
file.close();
}
function getSmartObjectFileExtension(id)
{
try
{
var r = new ActionReference();
r.putProperty(stringIDToTypeID("property"), stringIDToTypeID("smartObject"));
r.putIdentifier(stringIDToTypeID("layer"), id);
var name = executeActionGet(r).getObjectValue(stringIDToTypeID("smartObject")).getString(stringIDToTypeID("fileReference"));
var n = name.lastIndexOf(".");
if (n < 0) return "";
return name.substr(n+1).toLowerCase();
}
catch (e)
{
$.writeln(e);
return "error";
}
}
function layerIsPhotoshopObject(layerID)
{
var ext = getSmartObjectFileExtension(layerID);
$.writeln("Object with ID " + layerID + " Ext: " + ext);
switch (ext)
{
case "psb":
case "psd":
case "png":
return true;
default:
return false;
}
}
... View more
Apr 17, 2024
06:27 PM
Sorry if I am a bit of an idiot, I am very new to adding scripts, but what actual method so you use to switch between the curent layer and all layer? is a a keyboard shortcut? If so what key is it or how to I set the key? I'm sure this is all so super obvious to others but it has confounded me and I really need this tool! Ha
... View more
Mar 27, 2024
07:20 AM
Hi there, Is there any way to apply each pattern like image (layer or smart object) for each letter in the whole layer text? Example: I have 10 different images or patterns and I have a layer text that has 10 letters, so how can I apply each pattern/image for each letter in a certain order and when the last pattern/image in the list was applied then they will start over again with the first pattern/image. Hope for any comment to help!
... View more
Mar 08, 2024
04:16 AM
1 Upvote
I added a control to mantain visibility of the layer, just because the action excecution change it to visible always: function isLayerShape(l) {
var activeDoc = app.activeDocument;
var currentVisiblity = l.visible;
activeDoc.activeLayer = l;
var s2t =stringIDToTypeID;
var r = new ActionReference();
r.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
var d = new ActionDescriptor();
d.putObject(s2t("object"), s2t("object"), executeActionGet(r));
var obj = executeAction(s2t("convertJSONdescriptor"), d).getString(s2t("json"));
l.visible=currentVisiblity;
return obj.indexOf("pathBounds")!=-1;
}
... View more
Feb 25, 2024
03:46 AM
A related script to mark 2 "key" windows/tabs from among many open documents and cycle between them here:
https://community.adobe.com/t5/photoshop-ecosystem-discussions/keyboard-shortcut-for-moving-between-tabs/td-p/14005778
... View more
Feb 15, 2024
08:44 AM
I found that this still doesn't help. The problem turned out to be that if the file was on the C: drive, it couldn't be written to no matter if I launched the script or Photoshop as an administrator. I ended up using `subst` to remap anything on the C: drive to some other drive. I used the following functions to do this: function mapNextAvailableDriveLetter(path) {
var driveLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (var i = 0; i < driveLetters.length; i++) {
var result = app.system("subst " + driveLetters[i] + ': "' + path + '"');
if (result === 0) {
return driveLetters[i];
}
}
alert("Unable to map a drive letter to " + path);
exit();
} And to remove that drive mapping: function removeSubstDriveLetters() {
var driveLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var cmd = "@echo off";
for (var i = 0; i < driveLetters.length; i++) {
cmd = cmd + " & subst " + driveLetters[i] + ": /D >nul 2>nul";
}
app.system(cmd);
} There is more discussion over at StackOverflow: permissions - Access is denied writing to file from ExtendScript - Stack Overflow This is so that I can have external tools generate an output and I can read via ExtendScript. It also allows me to have ExtendScript create batch/Python scripts that I can then call using app.system() to do things outside of Photoshop.
... View more
Feb 08, 2024
02:16 PM
correction: set TURN RIGHT as ESC+ to get out of angle text field...
... View more
Community Expert
in Photoshop ecosystem Discussions
Jan 31, 2024
11:21 AM
1 Upvote
Jan 31, 2024
11:21 AM
1 Upvote
thank you, @Stephen Marsh , @c.pfaffenbichler and @jazz-y for your hints and advices. i made some progress with simplifying my file and layer structure. a pretty interesting finding was that photoshop automatically updates SMO file paths in SMOs living in the top level of the layer stack. tests with moving projects to another folder and even transferring them from mac to windows are promising. i'll do some more tests and will report my results here.
... View more