Skip to main content
Inspiring
July 3, 2015
Question

How to get user input for Auto-Align Layers

  • July 3, 2015
  • 1 reply
  • 707 views

Anyone know how to get user input when auto-aligning layers? 

Setting DialogModes.ALL from the ScriptListener code does not appear to work (as shown below). 


RunMenuItem(app.charIDToTypeID("Algn")); does not seem to be a supported option either.

var idAlgn = charIDToTypeID( "Algn" );

    var desc7 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref3 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref3.putEnumerated( idLyr, idOrdn, idTrgt );

    desc7.putReference( idnull, ref3 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc7.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idAuto = charIDToTypeID( "Auto" );

    desc7.putEnumerated( idAply, idprojection, idAuto );

    var idvignette = stringIDToTypeID( "vignette" );

    desc7.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc7.putBoolean( idradialDistort, false );

executeAction( idAlgn, desc7, DialogModes.ALL );

This topic has been closed for replies.

1 reply

JJMack
Community Expert
Community Expert
July 7, 2015

It seems to be the nature of that Photoshop feature.  I can not even record and interactive action that can display the auto align steps dialog..  I tried using insert menu item and chose menu edit>Auto-Align Layers.. when the action was played the step was not interactive no dialog was displayed.  I also tried recording using edit>Auto-Align Layers to get the dialog and chose an option..    I then turn on that the recorded step dialog in the action.  The step changes in the action indicating the dialog would be displayed.  However when I played the action no dialog was displayed

I was able to record action manager code for the different Auto-Align Layer options. So you can give the  user an option to chose the type of auto align to do.

// ======================Auto =================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc33 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref26 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref26.putEnumerated( idLyr, idOrdn, idTrgt );

    desc33.putReference( idnull, ref26 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc33.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idAuto = charIDToTypeID( "Auto" );

    desc33.putEnumerated( idAply, idprojection, idAuto );

    var idvignette = stringIDToTypeID( "vignette" );

    desc33.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc33.putBoolean( idradialDistort, true );

executeAction( idAlgn, desc33, DialogModes.NO );

// =====================perspective==================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc37 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref30 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref30.putEnumerated( idLyr, idOrdn, idTrgt );

    desc37.putReference( idnull, ref30 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc37.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idPrsp = charIDToTypeID( "Prsp" );

    desc37.putEnumerated( idAply, idprojection, idPrsp );

    var idvignette = stringIDToTypeID( "vignette" );

    desc37.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc37.putBoolean( idradialDistort, true );

executeAction( idAlgn, desc37, DialogModes.NO );

// ======================collage=================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc40 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref33 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref33.putEnumerated( idLyr, idOrdn, idTrgt );

    desc40.putReference( idnull, ref33 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc40.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idsceneCollage = stringIDToTypeID( "sceneCollage" );

    desc40.putEnumerated( idAply, idprojection, idsceneCollage );

    var idvignette = stringIDToTypeID( "vignette" );

    desc40.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc40.putBoolean( idradialDistort, false );

executeAction( idAlgn, desc40, DialogModes.NO );

// ======================cylindrical=================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc43 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref36 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref36.putEnumerated( idLyr, idOrdn, idTrgt );

    desc43.putReference( idnull, ref36 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc43.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idcylindrical = stringIDToTypeID( "cylindrical" );

    desc43.putEnumerated( idAply, idprojection, idcylindrical );

    var idvignette = stringIDToTypeID( "vignette" );

    desc43.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc43.putBoolean( idradialDistort, true );

executeAction( idAlgn, desc43, DialogModes.NO );

// ======================sphericial=================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc46 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref39 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref39.putEnumerated( idLyr, idOrdn, idTrgt );

    desc46.putReference( idnull, ref39 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc46.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idSph = charIDToTypeID( "Sph " );

    desc46.putEnumerated( idAply, idprojection, idSph );

    var idvignette = stringIDToTypeID( "vignette" );

    desc46.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc46.putBoolean( idradialDistort, true );

executeAction( idAlgn, desc46, DialogModes.NO );

// =======================reposition================================

var idAlgn = charIDToTypeID( "Algn" );

    var desc49 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref42 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref42.putEnumerated( idLyr, idOrdn, idTrgt );

    desc49.putReference( idnull, ref42 );

    var idUsng = charIDToTypeID( "Usng" );

    var idADSt = charIDToTypeID( "ADSt" );

    var idADSContent = stringIDToTypeID( "ADSContent" );

    desc49.putEnumerated( idUsng, idADSt, idADSContent );

    var idAply = charIDToTypeID( "Aply" );

    var idprojection = stringIDToTypeID( "projection" );

    var idtranslation = stringIDToTypeID( "translation" );

    desc49.putEnumerated( idAply, idprojection, idtranslation );

    var idvignette = stringIDToTypeID( "vignette" );

    desc49.putBoolean( idvignette, false );

    var idradialDistort = stringIDToTypeID( "radialDistort" );

    desc49.putBoolean( idradialDistort, false );

executeAction( idAlgn, desc49, DialogModes.NO );

JJMack
gregbenzAuthor
Inspiring
July 7, 2015

Yeah, I see the same behavior.  If I run just that code, I can align layers.  But if I take other actions (in my case combining multiple documents into a multi-layered file) and then try to run the same code, it basically ignores the code.  No error message, but does not align either.  So I could create a panel where the user presses two buttons (or the same one twice) to complete the script, just odd that I can't do it in one shot.  It's as if auto-align is looking at the starting point of the image (ie, ignoring the changes made by previous steps in the script). 

JJMack
Community Expert
Community Expert
July 8, 2015

Yes in your Scripts UI you can give the user options like in auto align dialog and act accordingly in your script.  Remember the Auto align dialog was design for a single manual use not batch mode.  IMO if you will be working on a batch of image files the have some number  of layers to be aligned I would thing only the auto option may be approbate.  Of a batch process with user intervention which would not actually be batch because human interaction is required. In you script before the align you could use application refresh so the current composite can be see by the user then prompt the user to select the align process type.

JJMack