A way to scale multiple smart objects to fit set boundary with their first non-empty pixels?

Contributor ,
Apr 11, 2022 Apr 11, 2022

Copy link to clipboard

Copied

I have a lot of work to do where i have many different smart objects, that dont always fill their entire document sizes (have a lot of empty space inside them). My workflow requires putting them all inside the document on different layers, and then moving and scaling them to fit the set boundaries. What I am missing is a way to automatically scale them all up, to individually optimal sizes, so their content (not entire smart object) scales to fit set boundary area inside PSD or at least the document they are placed in, so i can then scale them all together in standard way (right now placed PSDs as smart objects automatically try to fit the document dimensions they are placed in, but take into calculation also the unwanted empty space inside them).

In short, something similar to centering multiple smart objects vertically and horizontally (which takes into account only non-empty pixels to determine the object's real content), but something that would also scale to fit into area i set for it or at least scale it up to fit document they were placed into, disregarding the empty space inside them.

Does anyone know any script that would do that?

 

edit: Functionality like Photoshop's "resize image during place" in general settings is what would help, if only there was a way to make it ignore empty pixels of placed objects.

 

edit2: Current workaround for me is to first run through the documents that i am goign to place into my main PSD, and automatically export them with "trim" enabled. Then after placing them, they are all placed with the default "fit" to document size. Would prefer a way at least without that step, as it seems pretty easy to script, considering the photoshop's centering vertically/horizontally already ignores empty pixels in smart objects.

 

Thanks a lot in advance!

TOPICS
Actions and scripting

Views

174

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Adobe Community Professional , Apr 12, 2022 Apr 12, 2022
You can give this a try.  // place smart objects and scale them to selection or document bounds; // 2022, use it at your own risk; if (app.documents.length > 0) { var theFiles = selectFile(true); // set to pixels; var originalRulerUnits = app.preferences.rulerUnits; app.preferences.rulerUnits = Units.PIXELS; //////////////////////////////////// if (hasSelection() == true) { var selBounds = activeDocument.selection.bounds; var docWidth = selBounds[2] - selBounds[0]; var docHeight = selBounds[3] -...

Likes

Translate

Translate
Adobe Community Professional ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

By grouping a Smart Object and transforming the Group one can get at the Bounding Box of the SO’s pixel content. 

 

How frequent is the issue for you? 

How familiar are you with JavaScript and Photoshop’s DOM? 

 

Edit: How exactly doe you want to automate the task in your workflow? 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

edited

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

Thank you. I will try to play with it in next free moment (cant test right now).

I am not very familiar with Photoshop DOM or the scripting. I mean i somewhat understund the script when i read it, and i am already using some PS scripts in my work, but i am no programmer.

 

To answer your question about how would i like the automated workflow to work at this step (i will write the close-to-perfect solution here):

- I would drag multiple images with varied sizes and empty space inside them into photoshop document

- I would select all these new layers with placed images

- I would select box on the document

- I would like to use script to make these images fit into the selected box (or a rectangular shape on different layer if thats easier to script), ignoring empty space of these smart objects. So basically center non-empty pixels content for each selected layer's inside the box (PS can do that already) and scale them individually inside that box to touch closest border, be it vertical or horizontal (to fit with maximum possible size of each smartobject, but dont go beyond selected box or rectangular boundary with objects' non-empty pixels)

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

You can give this a try. 

// place smart objects and scale them to selection or document bounds;
// 2022, use it at your own risk;
if (app.documents.length > 0) {
var theFiles = selectFile(true);
// set to pixels;
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
////////////////////////////////////
if (hasSelection() == true) {
var selBounds = activeDocument.selection.bounds;
var docWidth = selBounds[2] - selBounds[0];
var docHeight = selBounds[3] - selBounds[1];
var theX = selBounds[0] + docWidth/2;
var theY = selBounds[1] + docHeight/2;
}
else {
var docWidth = activeDocument.width;
var docHeight = activeDocument.height;
var theX = docWidth/2;
var theY = docHeight/2;
};
////////////////////////////////////
for (var x = 0; x < theFiles.length; x++) {
placeScaleRotateFile (theFiles[x], 0, 0, 100, 100, 0, false);
////////////////////////////////////
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var layerDesc = executeActionGet(ref);
var isSmartObject = layerDesc.hasKey(stringIDToTypeID("smartObject"));
if (isSmartObject == true) {
var theBounds = layerDesc.getObjectValue(stringIDToTypeID("bounds"));
var theseBounds = [theBounds.getUnitDoubleValue(stringIDToTypeID("left")), theBounds.getUnitDoubleValue(stringIDToTypeID("top")), theBounds.getUnitDoubleValue(stringIDToTypeID("right")), theBounds.getUnitDoubleValue(stringIDToTypeID("bottom"))];
var theW = theBounds.getUnitDoubleValue(stringIDToTypeID("right")) - theBounds.getUnitDoubleValue(stringIDToTypeID("left"));
var theH = theBounds.getUnitDoubleValue(stringIDToTypeID("bottom")) - theBounds.getUnitDoubleValue(stringIDToTypeID("top"));
var horCenter = theseBounds[0] + theW / 2;
var verCenter = theseBounds[1] + theH / 2;
layerBounds = [theseBounds, theW, theH, horCenter, verCenter];
////////////////////////////////////
if (docWidth / docHeight < layerBounds[1] / layerBounds[2]) {var theScale = docWidth / layerBounds[1] * 100}
else {var theScale = docHeight / layerBounds[2] * 100};
var xOffset = theX - layerBounds[3];
var yOffset = theY - layerBounds[4];
////////////////////////////////////
var idtransform = stringIDToTypeID( "transform" );
var idpixelsUnit = stringIDToTypeID( "pixelsUnit" );
var idpercentUnit = stringIDToTypeID( "percentUnit" );
var idoffset = stringIDToTypeID( "offset" );
var desc5 = new ActionDescriptor();
    desc5.putEnumerated( stringIDToTypeID( "freeTransformCenterState" ), stringIDToTypeID( "quadCenterState" ), stringIDToTypeID( "QCSAverage" ) );
        var desc6 = new ActionDescriptor();
        desc6.putUnitDouble( stringIDToTypeID( "horizontal" ), idpixelsUnit, xOffset );
        desc6.putUnitDouble( stringIDToTypeID( "vertical" ), idpixelsUnit, yOffset );
    desc5.putObject( idoffset, idoffset, desc6 );
    desc5.putUnitDouble( stringIDToTypeID( "width" ), idpercentUnit, theScale );
    desc5.putUnitDouble( stringIDToTypeID( "height" ), idpercentUnit, theScale );
executeAction( idtransform, desc5, DialogModes.NO );
};
};
// reset;
app.preferences.rulerUnits = originalRulerUnits;
};
////////////////////////////////////
////// bounds of active layer //////
function getBounds () {
    var ref = new ActionReference();
    ref.putProperty (stringIDToTypeID ("property"), stringIDToTypeID ("bounds"));
	ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
    var layerDesc = executeActionGet(ref);
    var theseBounds = [theBounds.getUnitDoubleValue(stringIDToTypeID("left")), theBounds.getUnitDoubleValue(stringIDToTypeID("top")), theBounds.getUnitDoubleValue(stringIDToTypeID("right")), theBounds.getUnitDoubleValue(stringIDToTypeID("bottom"))];
    var theW = theBounds.getUnitDoubleValue(stringIDToTypeID("right")) - theBounds.getUnitDoubleValue(stringIDToTypeID("left"));
    var theH = theBounds.getUnitDoubleValue(stringIDToTypeID("bottom")) - theBounds.getUnitDoubleValue(stringIDToTypeID("top"));
    var horCenter = theseBounds[0] + theW / 2;
    var verCenter = theseBounds[1] + theH / 2;
    return ([theseBounds, theW, theH, horCenter, verCenter])
};
////// place //////
function placeScaleRotateFile (file, xOffset, yOffset, theXScale, theYScale, theAngle, linked) {
    var idPxl = charIDToTypeID( "#Pxl" );
    var idPrc = charIDToTypeID( "#Prc" );
    var idPlc = charIDToTypeID( "Plc " );
        var desc5 = new ActionDescriptor();
        var idnull = charIDToTypeID( "null" );
        desc5.putPath( idnull, new File( file ) );
        var idFTcs = charIDToTypeID( "FTcs" );
        var idQCSt = charIDToTypeID( "QCSt" );
        var idQcsa = charIDToTypeID( "Qcsa" );
        desc5.putEnumerated( idFTcs, idQCSt, idQcsa );
        var idOfst = charIDToTypeID( "Ofst" );
            var desc6 = new ActionDescriptor();
            var idHrzn = charIDToTypeID( "Hrzn" );
            desc6.putUnitDouble( idHrzn, idPxl, xOffset );
            var idVrtc = charIDToTypeID( "Vrtc" );
            desc6.putUnitDouble( idVrtc, idPxl, yOffset );
        var idOfst = charIDToTypeID( "Ofst" );
        desc5.putObject( idOfst, idOfst, desc6 );
        var idWdth = charIDToTypeID( "Wdth" );
        desc5.putUnitDouble( idWdth, idPrc, theYScale );
        var idHght = charIDToTypeID( "Hght" );
        desc5.putUnitDouble( idHght, idPrc, theXScale );
        var idAngl = charIDToTypeID( "Angl" );
        var idAng = charIDToTypeID( "#Ang" );
        desc5.putUnitDouble( idAngl, idAng,theAngle );	
    if (linked == true) {
        var idLnkd = charIDToTypeID( "Lnkd" );
        desc5.putBoolean( idLnkd, true );
        };
    executeAction( idPlc, desc5, DialogModes.NO );
// get layerid;
    var ref = new ActionReference();
    ref.putProperty (stringIDToTypeID ("property"), stringIDToTypeID ("layerID"));
    ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") ); 
    var layerDesc = executeActionGet(ref);
    var layerID = layerDesc.getInteger (stringIDToTypeID ("layerID"));
    return layerID;
    };
////// select file //////
function selectFile (multi) {
    if (multi == true) {var theString = "please select files"}
    else {var theString = "please select one file"};
    if ($.os.search(/windows/i) != -1) {var theFiles = File.openDialog (theString, '*.jpg;*.tif;*.psd;*.png', multi)}
    else {var theFiles = File.openDialog (theString, getFiles, multi)};
////// filter files  for mac //////
function getFiles (theFile) {
    if (theFile.name.match(/\.(jpg|tif|psd|png)$/i) || theFile.constructor.name == "Folder") {
        return true
        };
    };
return theFiles
};
////// check for selection //////
function hasSelection(){
    var ref10 = new ActionReference();
    ref10.putProperty(stringIDToTypeID("property"), stringIDToTypeID("selection"));
    ref10.putEnumerated( charIDToTypeID( "Dcmn" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
    var docDesc = executeActionGet(ref10);
    return docDesc.hasKey(stringIDToTypeID("selection"));
    };

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

Daaamn! Initial quick tests' results are perfect!! Not only it works, but also you managed to come up with it so quickly! Will try to test it further, and will get back to you if I will encounter problems. So far it works perfectly!

Thank you so much! Kudos to you!

I can imagine usefullness of it's side feature, that if you already have some objects on layers and would like to do exact same thing, without placing new ones. But even without it its glorious time saver for me as it is now! 🙂 Thanks again!

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 12, 2022 Apr 12, 2022

Copy link to clipboard

Copied

Edit: After some more tests I noticed an unintended offset for some of the Smart Objects; edited the Script so it should be a bit slower but resolve that issue. 

 

Edited 2022-04-15:

 

// scale selected smart objects to selection or document bounds;
// 2022, use it at your own risk;
if (app.documents.length > 0) {
var theLayers = collectSelectedSmartObjectsBounds ();
// set to pixels;
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
////////////////////////////////////
if (hasSelection() == true) {
var selBounds = activeDocument.selection.bounds;
var docWidth = selBounds[2] - selBounds[0];
var docHeight = selBounds[3] - selBounds[1];
var theX = selBounds[0] + docWidth/2;
var theY = selBounds[1] + docHeight/2;
activeDocument.selection.deselect();
}
else {
var docWidth = activeDocument.width;
var docHeight = activeDocument.height;
var theX = docWidth/2;
var theY = docHeight/2;
};
// process the selected smart objects;
for (var x = 0; x < theLayers.length; x++) {
selectLayerByID(theLayers[x][1], false);
layerBounds = [theLayers[x][2], theLayers[x][3], theLayers[x][4], theLayers[x][2][0]+theLayers[x][3]/2, theLayers[x][2][1]+theLayers[x][4]/2];
// determine scale;
if (docWidth / docHeight < layerBounds[1] / layerBounds[2]) {var theScale = Number(docWidth / layerBounds[1] * 100)}
else {var theScale = Number(docHeight / layerBounds[2] * 100)};
var xOffset = theX - layerBounds[3];
var yOffset = theY - layerBounds[4];
////////////////////////////////////
var idtransform = stringIDToTypeID( "transform" );
var idpixelsUnit = stringIDToTypeID( "pixelsUnit" );
var idpercentUnit = stringIDToTypeID( "percentUnit" );
var idoffset = stringIDToTypeID( "offset" );
var idfreeTransformCenterState = stringIDToTypeID( "freeTransformCenterState" );
var idquadCenterState = stringIDToTypeID( "quadCenterState" );
var idQCSAverage = stringIDToTypeID( "QCSAverage" );
// scale;
var desc5 = new ActionDescriptor();
    desc5.putEnumerated( idfreeTransformCenterState, idquadCenterState, idQCSAverage );
    desc5.putUnitDouble( stringIDToTypeID( "width" ), idpercentUnit, theScale );
    desc5.putUnitDouble( stringIDToTypeID( "height" ), idpercentUnit, theScale );
executeAction( idtransform, desc5, DialogModes.NO );
// move;
var newBounds = getBounds ();
var desc7 = new ActionDescriptor();
    desc7.putEnumerated( idfreeTransformCenterState, idquadCenterState, idQCSAverage );
        var desc8 = new ActionDescriptor();
        desc8.putUnitDouble( stringIDToTypeID( "horizontal" ), idpixelsUnit, theX - newBounds[3] );
        desc8.putUnitDouble( stringIDToTypeID( "vertical" ), idpixelsUnit, theY - newBounds[4] );
    desc7.putObject( idoffset, idoffset, desc8 );
executeAction( idtransform, desc7, DialogModes.NO );
// reselect layers;
selectLayerByID(theLayers[0][1], false);
for (var y = 1; y < theLayers.length; y++) {selectLayerByID(theLayers[y][1], true)};
};
// reset;
app.preferences.rulerUnits = originalRulerUnits;
};
////////////////////////////////////
////// collect bounds of selected layers //////
function collectSelectedSmartObjectsBounds () {
    // set to pixels;
        var originalRulerUnits = app.preferences.rulerUnits;
        app.preferences.rulerUnits = Units.PIXELS;
    // get selected layers;
        var selectedLayers = new Array;
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
        var desc = executeActionGet(ref);
        if (desc.getBoolean(stringIDToTypeID("hasBackgroundLayer")) == true) {var theAdd =0}
        else {var theAdd = 1};
        if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
        desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
        var c = desc.count;
        var selectedLayers = new Array();
        // run through selected layers;
        for(var i=0;i<c;i++){
        var theIndex = desc.getReference( i ).getIndex()+theAdd;
        // get id for solid color layers;
        try {
        var ref = new ActionReference();
        ref.putIndex( charIDToTypeID("Lyr "), theIndex ); 
        var layerDesc = executeActionGet(ref);
        var theName = layerDesc.getString(stringIDToTypeID('name'));
        var theIdentifier = layerDesc.getInteger(stringIDToTypeID ("layerID"));
        var theBounds = layerDesc.getObjectValue(stringIDToTypeID("bounds"));
        var isSmartObject = layerDesc.hasKey(stringIDToTypeID("smartObject"));
        var theseBounds = [theBounds.getUnitDoubleValue(stringIDToTypeID("left")), theBounds.getUnitDoubleValue(stringIDToTypeID("top")), theBounds.getUnitDoubleValue(stringIDToTypeID("right")), theBounds.getUnitDoubleValue(stringIDToTypeID("bottom"))];
        if (isSmartObject == true) {
            selectedLayers.push([theName, theIdentifier, theseBounds, theseBounds[2]-theseBounds[0], theseBounds[3]-theseBounds[1]])
        }
        } catch (e) {};
        };
        // if only one:
        }else{
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
        var layerDesc = executeActionGet(ref);
        try {
        var theName = layerDesc.getString(stringIDToTypeID('name'));
        var theIdentifier = layerDesc.getInteger(stringIDToTypeID ("layerID"));
        var isSmartObject = layerDesc.hasKey(stringIDToTypeID("smartObject"));
        var theBounds = layerDesc.getObjectValue(stringIDToTypeID("bounds"));
        var theseBounds = [theBounds.getUnitDoubleValue(stringIDToTypeID("left")), theBounds.getUnitDoubleValue(stringIDToTypeID("top")), theBounds.getUnitDoubleValue(stringIDToTypeID("right")), theBounds.getUnitDoubleValue(stringIDToTypeID("bottom"))];
        if (isSmartObject == true) {
            selectedLayers.push([theName, theIdentifier, theseBounds, theseBounds[2]-theseBounds[0], theseBounds[3]-theseBounds[1]])
        }
        } catch (e) {};
        };
// reset;
         app.preferences.rulerUnits = originalRulerUnits;
        return selectedLayers;
    };
// based on code by mike hale, via paul riggott;
function selectLayerByID(id,add){ 
    add = undefined ? add = false:add 
    var ref = new ActionReference();
        ref.putIdentifier(charIDToTypeID("Lyr "), id);
        var desc = new ActionDescriptor();
        desc.putReference(charIDToTypeID("null"), ref );
           if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) ); 
          desc.putBoolean( charIDToTypeID( "MkVs" ), false ); 
       try{
        executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
    }catch(e){
    alert(e.message); 
    }
    };
////// bounds of active layer //////
function getBounds () {
    var ref = new ActionReference();
    ref.putProperty (stringIDToTypeID ("property"), stringIDToTypeID ("bounds"));
	ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
    var layerDesc = executeActionGet(ref);
    var theBounds = layerDesc.getObjectValue(stringIDToTypeID("bounds"));
    var theseBounds = [theBounds.getUnitDoubleValue(stringIDToTypeID("left")), theBounds.getUnitDoubleValue(stringIDToTypeID("top")), theBounds.getUnitDoubleValue(stringIDToTypeID("right")), theBounds.getUnitDoubleValue(stringIDToTypeID("bottom"))];
    var theW = theBounds.getUnitDoubleValue(stringIDToTypeID("right")) - theBounds.getUnitDoubleValue(stringIDToTypeID("left"));
    var theH = theBounds.getUnitDoubleValue(stringIDToTypeID("bottom")) - theBounds.getUnitDoubleValue(stringIDToTypeID("top"));
    var horCenter = theseBounds[0] + theW / 2;
    var verCenter = theseBounds[1] + theH / 2;
    return ([theseBounds, theW, theH, horCenter, verCenter])
};
////// check for selection //////
function hasSelection(){
    var ref10 = new ActionReference();
    ref10.putProperty(stringIDToTypeID("property"), stringIDToTypeID("selection"));
    ref10.putEnumerated( charIDToTypeID( "Dcmn" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );
    var docDesc = executeActionGet(ref10);
    return docDesc.hasKey(stringIDToTypeID("selection"));
    };

 

 

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 13, 2022 Apr 13, 2022

Copy link to clipboard

Copied

Nice, glad to see you are improving it, even tho i didnt notice the issue myself yet. 🙂 Tested new script, but there seems to be some issue right now. It happens when i lunch the script.

Zrzut ekranu 2022-04-13 164930.png

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 13, 2022 Apr 13, 2022

Copy link to clipboard

Copied

Could you please post screenshots with the pertinent Panels (Toolbar, Layers, Options Bar, …) visible? 

 

Runs without problems here. 

scaleSmartObjectsToSelectionScr.gif

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 14, 2022 Apr 14, 2022

Copy link to clipboard

Copied

Thanks! Oh, I was testing it with importing new ones, just like the one before. Will try to test it again later today with objects already in document, maybe that was the reason. (Not sure if its relevant but was testing on Windows - will mention it here just in case).

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 14, 2022 Apr 14, 2022

Copy link to clipboard

Copied

I found the problem; I had put the reselction of the selected Smart Objects one closing-bracket too late. 

I updated the code. 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 15, 2022 Apr 15, 2022

Copy link to clipboard

Copied

Thank you! Will surely test is soon!

Sorry, I have assumed quickly, but didnt asked: Can i use your script in my workflow on commercial projects?

edit: Tested the 2nd script for moving the already present, selected layers into the selection and it also works like a charm! Awesome stuff! 🙂

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Apr 16, 2022 Apr 16, 2022

Copy link to clipboard

Copied


Can i use your script in my workflow on commercial projects?

Yes.

As far as I can tell people post Scripts here as open code with the understanding others may amend them, distribute them to colleagues etc.

Basically only selling the code other people created as one’s own creation would be a problem, I guess. 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Apr 16, 2022 Apr 16, 2022

Copy link to clipboard

Copied

LATEST

Thanks a lot! 🙂 I have had same impression, but wanted to make sure that you won't mind. Great work and thanks for reply to my question!

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines