Skip to main content
Innotex Nico Tanne
Inspiring
March 7, 2025
Answered

Delete specific or last smartfilter

  • March 7, 2025
  • 3 replies
  • 755 views

Hello everyone,

 

is there a way to delete the last smart filter from a smart object via script? 

 

🙂

Correct answer Stephen Marsh

With thanks to @c.pfaffenbichler for the code to get the smart filter count.

 

if (app.documents.length > 0) {
    var doc = app.activeDocument;
    if (doc.activeLayer.kind == LayerKind.SMARTOBJECT) {
        // Get the number of filters applied to the currently selected layer, by c.pfaffenbichler
        var ref = new ActionReference();
        ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var layerDesc = executeActionGet(ref);
        var soDesc = layerDesc.getObjectValue(stringIDToTypeID('smartObject'));
        var soMoreDesc = layerDesc.getObjectValue(stringIDToTypeID('smartObjectMore'));
        var filterFXcount = soDesc.getList(stringIDToTypeID('filterFX')).count
        // Delete the last filter
        var iddelete = stringIDToTypeID("delete");
        var desc30193 = new ActionDescriptor();
        var idnull = stringIDToTypeID("null");
        var ref10120 = new ActionReference();
        var idfilterFX = stringIDToTypeID("filterFX");
        ref10120.putIndex(idfilterFX, filterFXcount); // The last filter
        var idlayer = stringIDToTypeID("layer");
        var idordinal = stringIDToTypeID("ordinal");
        var idtargetEnum = stringIDToTypeID("targetEnum");
        ref10120.putEnumerated(idlayer, idordinal, idtargetEnum);
        desc30193.putReference(idnull, ref10120);
        executeAction(iddelete, desc30193, DialogModes.NO);
    } else {
        alert("Please select a smart object layer.");
    }
} else {
    alert("Please open a document first.");
}

 

3 replies

Stephen Marsh
Community Expert
Stephen MarshCommunity ExpertCorrect answer
Community Expert
March 7, 2025

With thanks to @c.pfaffenbichler for the code to get the smart filter count.

 

if (app.documents.length > 0) {
    var doc = app.activeDocument;
    if (doc.activeLayer.kind == LayerKind.SMARTOBJECT) {
        // Get the number of filters applied to the currently selected layer, by c.pfaffenbichler
        var ref = new ActionReference();
        ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var layerDesc = executeActionGet(ref);
        var soDesc = layerDesc.getObjectValue(stringIDToTypeID('smartObject'));
        var soMoreDesc = layerDesc.getObjectValue(stringIDToTypeID('smartObjectMore'));
        var filterFXcount = soDesc.getList(stringIDToTypeID('filterFX')).count
        // Delete the last filter
        var iddelete = stringIDToTypeID("delete");
        var desc30193 = new ActionDescriptor();
        var idnull = stringIDToTypeID("null");
        var ref10120 = new ActionReference();
        var idfilterFX = stringIDToTypeID("filterFX");
        ref10120.putIndex(idfilterFX, filterFXcount); // The last filter
        var idlayer = stringIDToTypeID("layer");
        var idordinal = stringIDToTypeID("ordinal");
        var idtargetEnum = stringIDToTypeID("targetEnum");
        ref10120.putEnumerated(idlayer, idordinal, idtargetEnum);
        desc30193.putReference(idnull, ref10120);
        executeAction(iddelete, desc30193, DialogModes.NO);
    } else {
        alert("Please select a smart object layer.");
    }
} else {
    alert("Please open a document first.");
}

 

Innotex Nico Tanne
Inspiring
March 7, 2025

Many thanks to you and Pfaffenbichler! You are the best

Stephen Marsh
Community Expert
Community Expert
March 7, 2025
quote

Many thanks to you and Pfaffenbichler! You are the best ♥️


By @Innotex Nico Tanne


You're welcome, the critical part came from @c.pfaffenbichler 

Inspiring
March 7, 2025

Hi @Innotex Nico Tanne 

 

You can use the following script in Photoshop:

 

var doc = app.activeDocument;

var smartObject = doc.activeLayer;

smartObject.activeLayer.appliedSmartFilters[0].remove();

 

Ensure the smart object has a smart filter before running.

 

Thankyou!

 

Innotex Nico Tanne
Inspiring
March 7, 2025

Thanks for your quick reply, but unfortunately smartObject.appliedSmartFilters seems to be no longer available and is undefined 😞

Stephen Marsh
Community Expert
Community Expert
March 7, 2025

@Innotex Nico Tanne 

 

Here is the raw action manager recording to delete a specific index number filter, unlike many scripting index number which start at zero, this starts at 1, which makes it easy to delete a specific smart filter (in this example, the 2nd filter)..

 

That's the easy bit. The challenge is working out the length of the idfilterFX index.

 

 

var iddelete = stringIDToTypeID( "delete" );
    var desc30193 = new ActionDescriptor();
    var idnull = stringIDToTypeID( "null" );
        var ref10120 = new ActionReference();
        var idfilterFX = stringIDToTypeID( "filterFX" );
        ref10120.putIndex( idfilterFX, 2 ); // Index # starting at 1
        var idlayer = stringIDToTypeID( "layer" );
        var idordinal = stringIDToTypeID( "ordinal" );
        var idtargetEnum = stringIDToTypeID( "targetEnum" );
        ref10120.putEnumerated( idlayer, idordinal, idtargetEnum );
    desc30193.putReference( idnull, ref10120 );
executeAction( iddelete, desc30193, DialogModes.NO );