使用 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 中使用符号断点获取参数

使用 Objective-C 获取 Photoshop 的动作列表

在 Objective-C 中无法使用 CoreLocation 获取纬度和经度

在 Objective-C 中使用身份验证获取 JSON 令牌

使用objective-c从url获取网络摄像头图像

如何在 Objective-C 中获取用户的语言环境?