2011-01-20 124 views
0

我有一个AppleScript,我试图转换为ScriptingBridge。由于我的应用程序是一个C++/Obj-C应用程序,ScriptingBridge使用起来更容易,而且速度更快(更不用说我讨厌动态构建AppleScript)。使用ScriptingBridge打开文件

AppleScript向Photoshop发送信息以打开文件。文件参数作为alias发送,但ScriptingBridge将该参数导入为id。我不知道我应该传入什么Obj-C对象?

我试过传递一个NSURL和一个NSString(可能不正确:-P),但无济于事。关于我应该传递给文件别名的任何建议?

回答

1

简而言之,您无法使用Scripting Bridge在Photoshop中打开文档。

苹果的文档真的拼出来就像它一样。所有的类必须具有容器,该容器是一个可变的阵列,它们需要被添加到它们可被作用之前,如图生成的头...

@interface photoshopCS4Application : SBApplication 

- (SBElementArray *) documents; 
- (SBElementArray *) fonts; 
- (SBElementArray *) notifiers; 

...,这是我们提供的顶级容器的完整列表。要生成并填充open命令需要 a photoshopCS4OpenOptions。由于API不公开阵列以存储新创建的photoshopCS4OpenOptions对象,因此我们无法使用新创建的photoshopCS4OpenOptions对象。因此,我们无法创建目标文档,并且扩展名不能在脚本桥中使用open命令。所有需要某种选项对象的命令都可以这样说。

我已经解决的唯一解决方法是打开一个文本,其中包含从Cocoa或objc-appscript调用的本地AppleScript,然后解析documents阵列寻找刚才打开的文件。这并不理想,但之后也不是Scripting Bridge,因为它要求应用程序开发人员以非OSA框架本身的特定方式编写脚本API。

1

如果你的程序是这样的:打开Photoshop文档可以在你的AppleScript脚本/脚本桥码外被执行,可可提供与特定的应用程序中打开文件的方法:

[[NSWorkspace sharedWorkspace] openFile:@"/Users/bavarious/Desktop/test.psd" withApplication:@"Adobe Photoshop CS4"]; 

,或者,如果你想要使用处理该文件类型的默认应用程序,可以完全删除应用程序名称:

[[NSWorkspace sharedWorkspace] openFile:@"/Users/bavarious/Desktop/test.psd"]; 
+0

很酷,这是另一种可以说比我提出的更好的方式。需要注意的是,如果打开成功,OP仍然需要通过`documents`数组来查找刚才打开的文件。 – 2011-01-21 15:31:17

0

考虑使用Appscript。 http://appscript.sourceforge.net/

下面是一个使用该代码:

APApplication * adobePhotoshopCs4 = [APApplication applicationWithName:@ “Adobe公司的Photoshop CS4”]; id result = [[adobePhotoshopCs4 open_] send]; (注意,我不是Cocoa程序员 - 我主要在Python中使用Appscript,但Appscript带有ASTranslate,它将AppleScript转换为Python,Ruby或Obj-C,这就是输出 - 但我发现它有微妙的变化过去的错误有时与译者)