2011/04/29

QuartzComposerのカスタムパッチを作る

マニアックネタです。こういうのばかり書いてるから、だんだんWebのアクセス下がってる。。mixiからみてもらってるのがほとんどだから、mixiつながりの人が興味持てない内容だと、アクセスが減るのね。マニアックネタは、逆に検索から来てくれる人の息が長い。興味深い。

さて、QuartzComposerですが、便利なツールですね。
グラフィカルにプログラム的なことができちゃうので、結構重宝しています。
(僕はXCodeで日頃コード書いてるのですが、QCの方が精神的に楽で使ってます)



そういえば、カスタムパッチを作るのは、簡単にできるはずだけど、どうだっけ?
ってことで、試してみました。

まず、XCode4で、新規プロジェクトを選びます。
普通にApplicationPluginというジャンルの中に、Quartz Composer Pluginというのがあります。
これを選んで、適当に名前つけて作成!

とりあえずできたプロジェクトを、ビルドしてみちゃいます。
コマンド押しながらBでビルド。

すると自動的にコンパイルされたpluginが、~/Library/Graphics/Quartz Composer Plug-Ins/ の中に保存されます。

この後QuartzComposerを立ち上げると、なんとすでにパッチが出てきます。
超簡単。

でも中身がない。。これではきっかけがわかりません。
とりあえず、以下のページを読んでちょっとそのまま書いてみました。


まず、ヘッダファイルを以下のような感じにします。
@propertyを付け加えただけです。

#import <Quartz/Quartz.h>

@interface TestPatchPlugIn : QCPlugIn {
@private
    
}

@property (assign) NSString *inputString;
@property (assign) NSString *outputString;

/*
Declare here the properties to be used as input and output ports for the plug-in e.g.
@property double inputFoo;
@property(assign) NSString* outputBar;
You can access their values in the appropriate plug-in methods using self.inputFoo or self.inputBar
*/

@end

次に、ソースコードの方に以下のを加えます。@property加えたら必ずペアで追加するようにします。

@implementation TestPatchPlugIn

@dynamic inputString, outputString;

@implementationの次に書くといいです。
で、肝心のパッチに表示されるインプットとアウトプットを設定するのが以下です。

+ (NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key
{
    if([key isEqualToString:@"inputString"])
        return [NSDictionary dictionaryWithObjectsAndKeys:
                @"input", QCPortAttributeNameKey,
                @"HELLO"QCPortAttributeDefaultValueKey,
                nil];
    
    if([key isEqualToString:@"outputString"])
        return [NSDictionary dictionaryWithObjectsAndKeys:
                @"output", QCPortAttributeNameKey,
                nil];
return nil;
}

みるとわかるように、@propertyで設定したinputStringとoutputStringが書いてあります。
QCPortAttributeNameKeyは、patchの画面に表示される名前で、QCPortAttributeDefaultValueKeyはデフォルトで表示される内容。outputの方にデフォルトの設定がないのは、入力から計算して出力するので必要ないからですね。

あとは、outputの内容を計算するコードを書きます。

- (BOOL)execute:(id <QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary *)arguments
{
self.outputString = [self.inputString lowercaseString];
return YES;
}




サンプルでは、とりあえず大文字があれば小文字にするというだけの内容です。
地味です。すいません。

ちなみに、Patchの名前を決めてるのは、上記のところです。
info.plistですね。
一番下のTestPatchPluginというのが今回表示される名前。

以上のことをやると、無事にパッチが完成しました。


今度もっと便利なパッチを作って公開してみます。
とりあえず、マニアックだけどDoctorMXのパッチを作ります。
照明コントロールのプロトコルであるDMX512を入力したり出力したりする便利なデバイスです。
作るの楽しみ。



0 件のコメント:

コメントを投稿