调整一个photoshop智能对象JavaScript

时间:2014-04-18 14:25:45

标签: javascript photoshop photoshop-script

我找到了一个JavaScript,它将使Photoshop中的每一层都成为一个智能对象,这很棒,但我想知道是否有人可以为我调整它。我在AppleScript中使用这个禁令。由于对Javascript了解不多,我希望有些人可以通过调整来选择所有图层,并在当前文件的所有图层中创建一个智能对象。

我正在使用的代码:

// MAIN

var doc = app.activeDocument;
var layers = doc.layers; //array of parent layer/layersets present in active document

for(var i = 0; i < layers.length; i++)
{
   if(!layers[i].isBackgroundLayer) createSmartObject(layers[i]);
}


//FUNCTIONS 

// create smartobject from specified layer (default is active layer)
function createSmartObject(layer)
{
   var doc = app.activeDocument;
   var layer = layer != undefined ? layer : doc.activeLayer;

   if(doc.activeLayer != layer) doc.activeLayer = layer;

   try
   {
      var idnewPlacedLayer = stringIDToTypeID( "newPlacedLayer" );
      executeAction( idnewPlacedLayer, undefined, DialogModes.NO );
      return doc.activeLayer;
   }
   catch(e)
   {
      return undefined;
   }
}// JavaScript Document

更新 - 澄清

上面的脚本会将每个图层和一个图层一次性更改为智能对象。我想让它选择文档中的每一层,并将其组合成一个智能对象,而不会展平它。

所以,如果我亲自动手做一个例子。我会根据自己的需要制作一个PS文档。为了论证,可以说有3层。我将选择3个图层(这是文档中的所有图层)并右键单击并选择make smart object。现在我有一个智能对象,里面有一层。

1 个答案:

答案 0 :(得分:3)

我已经重新编写了代码,因为我知道你不希望这些图层被展平。这应该做的伎俩!

app.preferences.rulerUnits = Units.PIXELS;

getThoseLayers();
createSmartObject();

function getThoseLayers ()
{
  var srcDoc = app.activeDocument;
  var numOfLayers = srcDoc.layers.length;

  // get the top layer
  srcDoc.activeLayer = srcDoc.layers[0];

  for (var i = numOfLayers -1; i >= 0; i--)
  {
    if(!srcDoc.layers[i].isBackgroundLayer)
    {
      addToSelection(srcDoc.layers[i].name)
    }
  }
}

function addToSelection (alayername)
{
  if (alayername == null) return

  try
  {
    var id66 = charIDToTypeID( "slct" );
    var desc14 = new ActionDescriptor();
    var id67 = charIDToTypeID( "null" );
    var ref12 = new ActionReference();
    var id68 = charIDToTypeID( "Lyr " );
    ref12.putName( id68, alayername );
    desc14.putReference( id67, ref12 );
    var id69 = stringIDToTypeID( "selectionModifier" );
    var id70 = stringIDToTypeID( "selectionModifierType" );
    var id71 = stringIDToTypeID( "addToSelection" );
    desc14.putEnumerated( id69, id70, id71 );
    var id72 = charIDToTypeID( "MkVs" );
    desc14.putBoolean( id72, false );
    executeAction( id66, desc14, DialogModes.NO );
  }
  catch(e)
  {
      alert("Whoops! Problem getting layer " + alayername)
  }
}

// create smartobject
function createSmartObject()
{
   try
   {
      var id325 = stringIDToTypeID( "newPlacedLayer" );
      executeAction( id325, undefined, DialogModes.NO );
   }
   catch(e)
   {
      alert("Whoops! Failed to make smart object " + e)
   }
}

它可以抓取所有图层(除了背景)并选择这些图层。我没有广泛测试它,但它似乎在组内工作,即使你有两个相同的层。如果确实失败了,它会告诉你。 希望你觉得它很有用。