Skip to main content
Inspiring
August 23, 2016
Answered

How to detect linked smart objects in Photoshop?

  • August 23, 2016
  • 2 replies
  • 1851 views

Hi,

I need to detect smart objects linked to local files in specific locations from javascript in HTML5 extension. How can I do this?

Consider this pseudocode:

  if (app.documents.length)

  {

    var doc = app.activeDocument;

    for (var ilayer = 0; ilayer < doc.artLayers.length; ilayer++)

    {

      var layer = doc.artLayers[ilayer];

      if (LAYER_IS_LINKED_SMART_OBJECT(layer))

      {

        var localFilePath = GET_SMART_OBJECT_REFERENCED_FILEPATH(layer);

      }

    }

  }

Here I need implementations of two functions:

1. LAYER_IS_LINKED_SMART_OBJECT()

2. GET_SMART_OBJECT_REFERENCED_FILEPATH()

Thank you in advance!

This topic has been closed for replies.
Correct answer vadim pashaev

Here's the final solution (without error checking):

  1.   if (app.documents.length) 
  2.   { 
  3.     var doc = app.activeDocument; 
  4.     for (var ilayer = 0; ilayer < doc.artLayers.length; ilayer++) 
  5.     { 
  6.       var layer = doc.artLayers[ilayer]; 
  7.       if (layer.kind == LayerKind.SMARTOBJECT) 
  8.       { 

        var ref = new ActionReference();

        ref.putIdentifier(charIDToTypeID('Lyr '), layer.id );

   

        var desc = executeActionGet(ref);

        var smObj = desc.getObjectValue(stringIDToTypeID('smartObject'));

  1.         var localFilePath = smObj.getPath(stringIDToTypeID('link')); 
  2.       } 
  3.     }
  4.   }

2 replies

vadim pashaevAuthorCorrect answer
Inspiring
August 24, 2016

Here's the final solution (without error checking):

  1.   if (app.documents.length) 
  2.   { 
  3.     var doc = app.activeDocument; 
  4.     for (var ilayer = 0; ilayer < doc.artLayers.length; ilayer++) 
  5.     { 
  6.       var layer = doc.artLayers[ilayer]; 
  7.       if (layer.kind == LayerKind.SMARTOBJECT) 
  8.       { 

        var ref = new ActionReference();

        ref.putIdentifier(charIDToTypeID('Lyr '), layer.id );

   

        var desc = executeActionGet(ref);

        var smObj = desc.getObjectValue(stringIDToTypeID('smartObject'));

  1.         var localFilePath = smObj.getPath(stringIDToTypeID('link')); 
  2.       } 
  3.     }
  4.   }
Known Participant
June 10, 2020

You are not detecting if the SO is linked SO: you just directly call the path of the linked file instead supposing the SO is linked - quite a difference, isn't it? So how can this be signed as solution is beyond me, sorry.

Inspiring
August 24, 2016

I found how to check if the layer is a smart object:

function LAYER_IS_LINKED_SMART_OBJECT(layer) {

  return layer.kind == LayerKind.SMARTOBJECT;

}

Still looking for the way to implement GET_SMART_OBJECT_REFERENCED_FILEPATH