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

Miq*_*lla 2 c++ photoshop applescript objective-c

我正在使用 C++ 和 Obj-C 编写一个与 Photoshop 交互的 OSX 应用程序。

我一直在使用NSAppleScript动态构建的 AppleScripts 来驱动 Photoshop(是的,这有点可怕......)我希望能够以不同的方式驱动 Photoshop,所以如果有人知道更好的方法,我愿意接受!不幸的是,我无法使用ScriptingBridge,因为我无法将我的用户绑定到 Leopard。

就在前几天晚上,当我从 Photoshop 查询操作列表以向用户显示时,出现了大问题。显然,Photoshop 的脚本集成不会向 AppleScript 公开动作列表 API。这是我不能使用的第二个原因ScriptingBridge

有谁知道如何在 Obj-C/C++ 程序中访问 Photoshop 的动作列表?额外问题:有谁知道我可以与 Photoshop 交互的更好方法吗?!

dou*_*ton 5

不确定如何使用 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;
}
Run Code Online (Sandbox Code Playgroud)