使用 Objective-C 获取 Photoshop 的动作列表
Posted
技术标签:
【中文标题】使用 Objective-C 获取 Photoshop 的动作列表【英文标题】:Get Photoshop's action list using Objective-C 【发布时间】:2011-04-10 00:50:26 【问题描述】:我正在使用 C++ 和 Obj-C 为 OSX 编写一个与 Photoshop 交互的应用程序。
我一直在使用 NSAppleScript
和动态构建的 AppleScripts 来驱动 Photoshop(是的,这有点吓人......)我希望能够以不同的方式驱动 Photoshop,所以如果有人知道更好的方法,我对此持开放态度!不幸的是,我无法使用 ScriptingBridge
,因为我无法将我的用户绑定到 Leopard。
就在前几天晚上,当我从 Photoshop 查询操作列表以显示给我的用户时,大问题出现了。显然,Photoshop 的脚本集成不会将动作列表 API 暴露给 AppleScript。这是我不能使用ScriptingBridge
的第二个原因。
有谁知道我可以在我的 Obj-C/C++ 程序中访问 Photoshop 的操作列表的方法吗?额外的问题:有人知道我可以与 Photoshop 交互的更好方法吗?!
【问题讨论】:
【参考方案1】:我认为没有“更好”的方式与 Photoshop 交互。 Applescript 就是这样。这就是它的目的。关于获取操作列表,我唯一的建议是操作必须位于硬盘驱动器某处的文件夹中。每个动作不是一个单独的文件吗?我不确定,但这将是一种值得研究的方法。也许您可以找出它们所在的文件夹,并获取操作的文件名,然后通过查询文件夹结构基本上重新创建操作菜单的层次结构。
【讨论】:
实际上,这是一个非常有趣的想法。我什至没有考虑到这一点。我得试一试。 嗯...它们不会存储为单独的操作。它们存储在操作集中(例如,所有“默认操作”都存储在一个文件中)。我可以看看解析动作文件,但我不相信我现在已经准备好了...... 据我所知,除非您能弄清楚如何解释 atn 文件或以某种方式阅读屏幕,否则无法获得操作列表,您将不得不找到另一种方法.. .也许要求用户只在一个集合中放置一个动作,以便该集合与该动作具有相同的名称? idk 希望能以某种方式帮助您让我们保持最新状态【参考方案2】:不确定如何使用 AppleScript 执行此操作,但您可以使用 AppleScript 调用此 javascript 以返回给定操作列表中的名称。我改编自“Image Processor.jsx”。
function GetActionList(folderName)
var setCounter = 1;
var actions = '';
var actionName;
gClassActionSet = charIDToTypeID( 'ASet' );
gClassAction = charIDToTypeID( 'Actn' );
gKeyName = charIDToTypeID( 'Nm ' );
gKeyNumberOfChildren = charIDToTypeID( 'NmbC' );
while ( true )
var ref = new ActionReference();
ref.putIndex( gClassActionSet, setCounter );
var desc = undefined;
try desc = executeActionGet( ref );
catch( e ) break;
actionName = desc.getString( gKeyName );
var numberChildren = 0;
if ( desc.hasKey( gKeyNumberOfChildren ) )
numberChildren = desc.getInteger( gKeyNumberOfChildren );
if ( numberChildren )
if(actionName == folderName)
for ( var i = 1; i <= numberChildren; i++ )
var ref = new ActionReference();
ref.putIndex( gClassAction, i );
ref.putIndex( gClassActionSet, setCounter );
var desc = undefined;
desc = executeActionGet( ref );
if( desc.hasKey( gKeyName ) )
if(actions.length > 0)
actions = actions + ',' + desc.getString( gKeyName );
else
actions = desc.getString( gKeyName );
break;
setCounter++;
return actions;
【讨论】:
以上是关于使用 Objective-C 获取 Photoshop 的动作列表的主要内容,如果未能解决你的问题,请参考以下文章
使用 Objective-C 获取 Photoshop 的动作列表
在 Objective-C 中无法使用 CoreLocation 获取纬度和经度