今回は、OsiriXに自分の作ったプログラムを実行させるプラグインプログラムを開発する初歩として、「Hello OsiriX!ダイアログ」を開発してみましょう。
プラグインプログラムを作るには、一般的にはOsiriX開発環境が必要です。
まだOsiriX開発環境を構築していない方は、前回の記事を参考にされてください。
プログラミングが初めての方は、ここから先の作業を行う前に、前回までに紹介した書籍などを読み、事前に学習しておかれることをお勧めします。
それでは早速始めていきましょう!
OsiriX Liteを取得する
開発したプラグインのテストのために、新たにOsiriX Liteをインストールしておいてください。すでにインストール済みの方は不要です。OsiriXのインストールは、本ブログの第2回を参考にしてください。
プラグインソースコードを取得する
OsiriXのプラグインのソースコードは、本体と同様に公開されています。全てが公開されているわけではありませんが、参考になるものばかりですので、先に取得しておきましょう。
もう一つ、このプラグインソースコードを取得する理由があります。このプラグインソースコードの中に、プラグインジェネレータという非常に便利なツールが含まれているのです。今回はこのプラグインジェネレータを使ってプラグインを開発していきます。
(このプラグインジェネレータを使わなくとも、Bundleというプロジェクト種別を使ってそのInfo.plistファイルを編集することで、OsiriXのプラグインを開発することもできます。)
プラグインソースコードは、GitHubのosirixpluginリポジトリからZipファイルでダウンロードできます。
https://github.com/pixmeo/osirixplugins
GitをPCにインストールしている方は、ターミナルを使ってコピーします。
例えば、ターミナルからcdコマンドで書類ディレクトリに移動してから、以下の青文字部分をターミナルに貼り付けてenterで実行すると、書類ディレクトリに新たに"osirixplugin"というフォルダができます。)
123456789-no-Mac〜:Documents Users$ git clone https://github.com/pixmeo/osirixplugins.git osirixplugin
プラグインジェネレータを使う
プラグインソースコードを取得したら、その中にある"_help"フォルダを見つけてください。
_helpフォルダの中に、Osirix Plugin GeneratorというApple Scriptが含まれています。
これを使っていきます。
さっそく、Osirix Plugin Generatorをダブルクリックで起動してみましょう。すると、Choose Plugin Nameというポップアップが表示されます。ここで、任意のプラグイン名を入力しましょう。プラグイン名に記号は含めないことをお勧めします。
Choose Plugin Nameが表示された
(例:OsiriXHowToと入力)
プラグイン名を入力して、OKをすると、次は開発者の名前を聞かれますので、ご自分の名前やあだ名などを入力します。
(開発者名を入力)
開発者名を入力し、OKで進むと、自動的に_helpフォルダに新しくプラグインプロジェクトフォルダが作成されます。
(自動的に作られたプラグインプロジェクトフォルダ)
"OsiriXHowTo"
(フォルダの内容)
ここまでくれば、もう今回の目的は果たしたも同然です。
Xcodeでプラグインプロジェクトを起動する
それでは、Xcodeを使って、自動生成されたプラグインプロジェクトを表示してみましょう。
今回の場合は、フォルダ内の"OsiriXHowTo.xcodeproj"をダブルクリックして開いてみました。(.xcodeprojという拡張子のファイルがプロジェクトファイルです。)
起動画面
次にソースコードの構成を見ていきましょう。
左上にあるプロジェクトを選択して、その中身をツリー表示で展開してみます。
左上のプロジェクトを選択して、ツリー表示を展開
もう少し見てみましょう。ソースコードの構成が以下のようになっていることがわかります。
・Classes
ここに、実際の自分のコードを保存していきます。
・Other Sources
ここはあまり変更することはありませんが、Prefix.pchというファイルが保管されています。このファイルは、PreCompiled Headerを指定するもので、事前によく使われるヘッダーファイルをまとめることで同じヘッダーファイルの解析を防ぐ働きをします。
・Resources
この例では、Info.plistや、InfoPlist.stringsという設定ファイルが含まれています。
.plistファイルは、プロジェクトのビルドのセッティングやその他の固有の属性情報が保管されているファイルです。.stringsファイルは、インターフェースのローカライズのためのファイルです。例えば、英語のインターフェースを日本語化するときなどに使います。
・Frameworks and Libraries
開発したアプリケーションを動かすために必要なすべてのフレームワークやライブラリをリンクしているフォルダです。
・Products
開発しているアプリケーションです。実際にリリースするための入れ物になります。
もうお分かりいただけたと思いますが、Osirix Plugin Generatorを使うと、このように、OsiriXプラグインに必要な情報を設定済みのプロジェクトが楽に作れるので、非常に便利です。
最初のソースコード
ソースコードを編集し始めましょう。ソースコードは、Classesの中にあります。
.hはヘッダーファイル、.mはメソッドファイルです。
ヘッダーファイルには、変数やメソッドの定義だけをします。メソッドファイルには実際のメソッドの詳細を書いていきます。詳細は割愛しますね。
今、重要なことは、これらのうち、.mファイルを編集するということです。もっと詳しいことは、この作業を終えてから、想像を膨らませてください。
.mファイルを開くと、以下のようなコードが書いてあります。
//
// OsiriXHowToFilter.m
// OsiriXHowTo
//
// Copyright (c) 2016 Tatsuaki. All rights reserved.
//
#import "OsiriXHowToFilter.h"
@implementation OsiriXHowToFilter
- (void) initPlugin
{
}
- (long) filterImage:(NSString*) menuName
{
ViewerController *new2DViewer;
// In this plugin, we will simply duplicate the current 2D window!
new2DViewer = [self duplicateCurrent2DViewerWindow];
if( new2DViewer) return 0; // No Errors
else return -1;
}
@end
読んだ通りですが、この自動で作成されたメソッドファイルには、"表示している画像を別のウィンドウに表示する"ことができるようになっています。
もし、ソースはいじれない!というビギナーの方は、この部分は斜め読みして、そのままいじらず、次のセクションに進んでください。
少しチャレンジしようという方は、このソースを以下のように書き換えてください。
//
// OsiriXHowToFilter.m
// OsiriXHowTo
//
// Copyright (c) 2016 Tatsuaki. All rights reserved.
//
#import "OsiriXHowToFilter.h"
@implementation OsiriXHowToFilter
- (void) initPlugin
{
}
- (long) filterImage:(NSString*) menuName
{
ViewerController *new2DViewer;
// In this plugin, we will simply duplicate the current 2D window!
new2DViewer = [self duplicateCurrent2DViewerWindow];
//added
NSRunInformationalAlertPanel(@"Welcome", @"Hello OsiriX!", @"OK", nil, nil);
if( new2DViewer) return 0; // No Errors
else return -1;
}
@end
NSRunInformationalAlertPanel(@"Welcome", @"Hello OsiriX!", @"OK", nil, nil);という文章を加えてみました。
このように、自分の考えたコードをどんどん書いていくことができます。
ビルドセッティング
コードが書き終わったら、ビルドするための設定を最終確認します。確認することは、SDKです。SDK?と思った方は、第7回を参照してください。
設定は、画面左上のプロジェクト(この例では、OsiriXHowTo)を選択した状態で、右側に表示されるパネルで確認していきます。
まず、Infoパネルです。ここには、Info.plistファイルの内容が表示されています。
(Info.plistの内容)
このInfoパネルの最下段にpluginTypeという項目があります。ここは非常に重要で、作ったプラグインの種類をOsiriXに認識させるためのものです。この例では、imageFilterとなっています。このプラグインをOsiriXで起動すると、プラグインメニューのイメージフィルターの項目にリストされます。自分のプラグインの種類はここで設定するということを覚えておいてください。
次に、SDKの設定確認です。パネルをBuild Settingに切り替えて、その中のSDKを選択する箇所で、SDKを10.8に設定しておきましょう。あるいは、最新版(latest)にしておいてください。
これで、ビルドする準備ができました。
ビルドしてみよう!
ターゲットを自分のプラグインに合わせて、ビルドをRunします。この例では、32-bitでも64-bitでも大丈夫です。
(Build Succeeded!)
これで、起動する準備ができました。
起動してみよう!
さっそく、プラグインを起動してみましょう。
ビルドが成功すると、Productのバンドル(この例では、OsiriXHowTo.osirixplugin)が黒文字になっているはずです。起動の方法はいくつかありますが、ここでは、デバックの意味も込めて、"Open with External Editor"を使います。
まず、Xcodeのツリー表示上で、OsiriXHowTo.osirixpluginを右クリックで選択して、そのポップアップから"Open with External Editor"を選択します。すると、OsiriX Liteが起動します。
OsiriX Liteが起動すると、自動的にプラグインのインストールウィンドウが開きます。表示に従って順に進めてください。
"Open with External Editor"を起動
OsiriX Liteが起動後に、現れるインストール確認ウィンドウ
プラグインをインストールするためのパスワード入力
OsiriX Lite再起動の確認ウィンドウ
そして、OsiriX Liteを再起動してください。再起動後、プラグインメニューのイメージフィルターに、"OsiriXHowTo"が追加されていることがわかります。
そして、任意の画像を2Dビューアで表示します。
そうすると、プラグインメニューの"OsiriXHowTo"が実行可能になっていることがわかります。※イメージフィルター型のプラグインは、2Dビューアを開かないと実行可能にならないことに注意してください。
実行してみましょう。
選択リストに追加されています
実行すると、以下のように、命令文の通り、OsiriX Liteが"Hello OsiriX!"ウィンドウを表示し、2Dビューアウィンドウを一つ増やしたことがわかります。
うまくできた方、お疲れ様でした。
忘れてはいけない観点:デュプリケート
ここまで読み進めていただいた方は、今からでもOsiriXプラグインの開発に取り掛かることができます。既存のワークステーションにはないあなただけしか知らないアルゴリズムを、ぜひOsiriXプラグインという形で実現させてみてください。
ここで、すごく重要なことをお伝えすると、プログラムは時間があればある程度かけますが、多くの人は時間がないということです。
そこで、一からコードを書く必要のある方以外は、すでに公開されているソースコードから勉強して、それを工夫して自分のソースコードに書き換えるようにしてみてはいかがでしょうか。可能な限り、デュプリケートしましょう。一から全部できる人なんて、世の中そうそういません。オープンな知識や資源は活用して、短期間でアイディアを形にしましょう。
最後に
もし、どうしてもわからない!という方は、ご連絡をいただければ何かしらアドバイスは可能かもしれません。Visionary Imaging Services, Inc.は、イメージング技術サポートを通じて、創薬研究や医療機器開発など、臨床研究(臨床試験)サポートサービスを展開しております。OsiriXシリーズも販売中です!よろしくお願い致します!
ビジョナリーイメージングサービスは、日本(特に神奈川の)ユーザーのニーズにいち早く応えるために、GRAPHYを開発しています。オープンソースです。
神奈川OsiriXユーザ"600"以上を目指してがんばります!
とても勉強になる記事をありがとうございます。Osirix Plugin Generator が現在のバージョンには含まれていないようです。どうやってpluginを作成したら良いのでしょうか?ご教示いただければ助かります。
返信削除ここに残っているようです。
返信削除https://svn.code.sf.net/p/osirixplugins/code/_help/