0

私はOSX、Xcode 8.2で作業しています。目標-C。 私はAdobe InDesignのアドレッシングにスクリプトブリッジを使用しています。私はかなり長いAppleScriptを持っています。私はScripting-BridgeでObjective-Cに翻訳して、そのバックグラウンドタスクの可能性を利用したいと思っています。NSAppleEventDescriptorがスクリプトブリッジからアンラップされた問題を返しました

より良く理解するために、私は前にあなたのAppleScriptから一部お見せしましょう:AppleScriptでは

tell application "Adobe InDesign CC 2017" 
    tell active document 
     -- grep setup done before 
     find grep 
    end tell 
end tell 

に結果を:

{ 
text from character 294 to character 298 of story id 1354 of document id 5 of application "Adobe InDesign CC 2017", 
text from character 140 to character 144 of story id 1377 of document id 5 of application "Adobe InDesign CC 2017" 
} 

私はAppleScriptでは、文字列を取得したい場合、私は(実行気づきます"文字列として"):

text from character 294 to character 298 of story id 1354 of document id 5 of 
    application "Adobe InDesign CC 2017" as string 
--> "Test1" 

目的語-cの翻訳方法:

// document is an instance of the SBApplication indesign 
[document findGrepReverseOrder:NO]; 

結果が読み:

(
"<AdobeInDesignCC2017TextCtxt @0x608020a442f0: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':294, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':298, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1354 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>", 
"<AdobeInDesignCC2017TextCtxt @0x608020a44140: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':140, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':144, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1377 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>" 
) 

各AdobeInDesignCC2017TextCtxtオブジェクトは、単語の位置や長さをマークする2 appleeventdescriptorsが含まれているように見えます。私は情報を抽出するためにそれらにアクセスする必要があります。私はhをチェックした。ファイルとして "文字列として" applescriptのようなテキストを抽出するメソッドを見つけることができません。ディスクリプタにどのようにアクセスできますか?任意のアイデアが評価されます

+1

'get'を呼び出しますか? ' - [SBObject get]' 'レシーバの評価を強制し、実際のオブジェクトを即座に返すようにします。 – Willeke

+0

それはトリックでした!ありがとうございました。 –

答えて

1

AppleScript-ObjCブリッジを使用することをお勧めします。これは、AppleScriptハンドラをObjCから直接呼び出し、Cocoaメソッドと同じように呼び出すことができます。 Scripting Bridgeは機能が不足していて機能が不足しているため、アプリケーションの互換性が非常に悪く、特にAdobeのような古いCarbonベースのアプリケーションでは問題があります。それは一点まで働き、それからあなたはうんざりです。 (すべてのAdobeスクリプトをSBに変換しようとした1人の男が、マイナーなアップデートの作業を中止するために突然大ローンになった。)

py-appscript/SwiftAutomation py3-appscript)を使用していましたが、アップルの悩みのために公的支援を提供しなくなりました。 AppleScriptはひどい言語ですが、少なくとも公式にはサポートされていますが、Appleのイベントブリッジは誰にも匹敵しません。 Here's a quick how-to on calling AS from ObjC。 AppleScriptハンドラを1つのスレッドで呼び出す限り、プログラムのObjC部分はスレッド、GCDなどを利用することができます。これは非常に簡単で、ほとんど無痛であり、各言語が最良のことをすることができます。

+0

それは私が恐れることです。アドビはマイナーな更新をドライブし、私のヘッダーファイルはもはや有効ではありません。私はそのような実装を知っていて、それを以前に使っていました。しかし、メモリ管理はかなり悪いです。このソリューションでは、スクリプトブリッジがほぼ500 MBを消費し、読み込みに非常に時間がかかる一方で、それは地獄として高速に読み込まれます。だから、私は間に挟まれている。あなたの答えは良いですが、私が求めたものの答えではありません。アイデアはまだ+1 –

関連する問題