なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ

書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

2022/09/08

CLIP STUDIO PAINT SDK でプロパティに文字列型を扱いたい

カテゴリー:C++

CLIP STUDIO PAINT EX ではプラグインが使えるんですが、プラグイン開発するには僅かな公式情報と、数件しかないインターネット上の情報に頼むしかなく、ハードルが高い状態です。
ということで、先陣の方にも倣って、わたしも今回のプラグイン開発で得た知識を放流していこうと思います。

なお、プラグイン SDK は 2021/09/09 時点に更新されている SDK を前提にしており、今後の更新で壊れる可能性があります。

文字列を扱うプロパティの実装には、 StringService を使用します。
基本的にはこれ経由で、既存の std::u16string などに変換し、使用する感じになります。

プロパティの定義は以下のようにすることでできます:

const auto hostObject = (*pPropertyService).hostObject;

TriglavPlugInPropertyObject propertyObject = nullptr;
(*pPropertyService).createProc(&propertyService);

TriglavPlugInStringObject caption = nullptr;
(*pStringService).createWithStringIDProc(&caption, stringId, hostObject);

(*pStringService).addItemProc(propertyObject, ITEM_KEY, kTriglavPlugInPropertyValueTypeString, kTriglavPlugInPropertyInputKindDefault, kTriglavPlugInPropertyInputKindDefault, caption, SHORTCUT_KEY);

こう定義することで、ユーザーはダイアログから任意の文字列を入力することが可能になります。
で、取得は以下の要領で出来ます:

// ここでの propertyObject, itemKey は、 Callback にて降ってきたものを使用する想定
TriglavPlugInStringObject stringObject = nullptr;
(*pPropertyService2).getStringValueProc(&stringObject, propertyObject, itemKey);

TriglavPlugInInt len = 0;
(*pStringService).getUnicodeLengthProc(&len, stringObject);

TriglavPlugInUniChar* str[];
(*pStringService).getUnicodeCharsProc(&str, stringObject);

const auto value = std::u16string(reinterpret_cast<const char16_t*>(str), static_cast<size_t>(len));

これで、最後の変数 value には、 CLIP STUDIO PAINT EX でユーザーが入力した文字列が入っています。
ということで、メモでした。