2012-11-09 91 views

回答

2

有一个办法。

您必须使用ActionManager:

var ref = new ActionReference(); 
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
var desc = executeActionGet(ref).getObjectValue(stringIDToTypeID('layerEffects')).getObjectValue(stringIDToTypeID('dropShadow')); 
desc.getUnitDoubleValue(stringIDToTypeID('distance')) 

其中“阴影效果”是你想读和例如“距离”是将要返回的参数layereffect。其他的层状效应和参数只被称为eventids。如果你需要其他的eventids,请查看文档(记录错误)。

下一个AM-代码会检查是否有layerstyle阴影。

var res = false; 
var ref = new ActionReference(); 
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
var hasFX = executeActionGet(ref).hasKey(stringIDToTypeID('layerEffects')); 
if (hasFX){ 
var ref = new ActionReference(); 
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt")); 
res = executeActionGet(ref).getObjectValue(stringIDToTypeID('layerEffects')).hasKey(stringIDToTypeID('dropShadow')); 
    } 
return res; 

这将解释http://forums.adobe.com/thread/714406更多。

如果你找到一个方法来设置阴影,不设置其他参数,可以让我知道...

+0

感谢您的帮助,它的效果非常好! 现在我试图找到''DropShadow''的数值名称(例如''distance'')... P.S.当然,我会让你知道的 –

1

也许不是你要找的,但实在是没有办法从extendscript访问的图层样式的各个属性的答案。引用图层样式的API中的唯一方法(截至CS6)为ArtLayer.applyStyle(name)。实际上,您必须在Photoshop中创建样式并按名称保存到调色板才能使用此样式。

我唯一能想到的就是用C/C++解析adobe/Adobe Photoshop/presets/styles/中找到的.asl文件。这些文件包含以专有格式保存的几种图层样式。我还没有找到任何库来解析这些文件,但它们可能存在。

+0

谢谢。你确认了我发现的信息......这很让人伤心。 我会等待24小时以上的答案(希望仍然存在),然后我会发送奖励。 –

0

如果你的Photoshop CS6.1(或更高版本),你可以检查出的实施“将CSS复制到剪贴板“功能,查看如何访问投影参数。

在Windows中,此源代码是在

Adobe Photoshop CS6\Required\CopyCSSToClipboard.jsx 

在Mac上,源代码是:

Adobe Photoshop CS6/Adobe Photoshop CS6.app/Contents/Required/CopyCSSToClipboard.jsx 

(如果你正在寻找在Finder在Mac上,您需要按住Control键并点击Photoshop应用程序图标,然后选择“显示包装内容”以进入内容/必需文件夹)。

查找日常cssToClip.addDropShadow对于如何提取信息的例子。如果你想使用CopyCSSToClipboard.jsx程序在自己的代码,下面的代码片段添加到您的JSX文件:

runCopyCSSFromScript = true; 
if (typeof cssToClip == "undefined") 
    $.evalFile(app.path + "/" + localize("$$$/ScriptingSupport/Required=Required") + "/CopyCSSToClipboard.jsx"); 

而且,在CopyCSSToClipboard.jsx底部,有到cssToClip.dumpLayerAttr样品通话。这是探索您可能想要从脚本访问的参数的有用方法,这些参数无法从Photoshop DOM访问。

事先警告中所需的文件夹的代码有可能在未来版本中的更改。

0

我能够制作一个ActionPrinter方法,该方法使用C#和photoshop COM包装器转储出一个操作中的所有数据树。

PrintCurrentLayer方法将转储图层中的所有数据,包括所有图层效果数据。

static void PrintCurrentLayer(Application ps) 
    { 
     var action = new ActionReference(); 
     action.PutEnumerated(ps.CharIDToTypeID("Lyr "), ps.CharIDToTypeID("Ordn"), ps.CharIDToTypeID("Trgt")); 
     var desc = ps.ExecuteActionGet(action);//.GetObjectValue(ps.StringIDToTypeID("layerEffects"));//.getObjectValue(ps.StringIDToTypeID('dropShadow')); 
     ActionPrinter(desc); 
    } 

    static void ActionPrinter(ActionDescriptor action) 
    { 
     for (int i = 0; i < action.Count; i++) 
     { 
      var key = action.GetKey(i); 

      if (action.HasKey(key)) 
      { 
       //var charId = action.Application.TypeIDToCharID((int)key); 
       //Debug.WriteLine(charId); 

       switch (action.GetType(key)) 
       { 
        case PsDescValueType.psIntegerType: 
         Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetInteger(key)); 
         break; 
        case PsDescValueType.psStringType: 
         Debug.WriteLine("{0}: \"{1}\"", (PSConstants)key, action.GetString(key)); 
         break; 
        case PsDescValueType.psBooleanType: 
         Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetBoolean(key)); 
         break; 
        case PsDescValueType.psDoubleType: 
         Debug.WriteLine("{0}: {1}", (PSConstants)key, action.GetDouble(key)); 
         break; 
        case PsDescValueType.psUnitDoubleType: 
         Debug.WriteLine("{0}: {1} {2}", (PSConstants)key, action.GetUnitDoubleValue(key), (PSConstants)action.GetUnitDoubleType(key)); 
         break; 
        case PsDescValueType.psEnumeratedType: 
         Debug.WriteLine("{0}: {1} {2}", (PSConstants)key, (PSConstants)action.GetEnumerationType(key), (PSConstants)action.GetEnumerationValue(key)); 
         break; 
        case PsDescValueType.psObjectType: 
         Debug.WriteLine($"{(PSConstants)key}: {(PSConstants)action.GetObjectType(key)} "); 
         Debug.Indent(); 
         ActionPrinter(action.GetObjectValue(key)); 
         Debug.Unindent(); 
         break; 
        case PsDescValueType.psListType: 
         var list = action.GetList(key); 
         Debug.WriteLine($"{(PSConstants)key}: List of {list.Count} Items"); 
         Debug.Indent(); 
         for (int count = 0; count < list.Count; count++) 
         { 
          var type = list.GetType(count); 
          Debug.WriteLine($"{count}: {type} "); 
          Debug.Indent(); 
          switch (type) 
          { 
           case PsDescValueType.psObjectType: 
            ActionPrinter(list.GetObjectValue(count)); 
            break; 
           case PsDescValueType.psReferenceType: 
            var reference = list.GetReference(count); 
            Debug.WriteLine(" Reference to a {0}", (PSConstants)reference.GetDesiredClass()); 
            break; 
           case PsDescValueType.psEnumeratedType: 
            Debug.WriteLine(" {0} {1}", (PSConstants)list.GetEnumerationType(count), (PSConstants)list.GetEnumerationValue(count)); 
            break; 
           default: 
            Debug.WriteLine($"UNHANDLED LIST TYPE {type}"); 
            break; 
          } 
          Debug.Unindent(); 
         } 
         Debug.Unindent(); 
         break; 
        default: 
         Debug.WriteLine($"{(PSConstants)key} UNHANDLED TYPE {action.GetType(key)}"); 
         break; 
       } 
      } 
     } 
    }