プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

CLIP STUDIO PAINTのレイヤ名を親フォルダと同じにするプログラムをRustで作った

五月蠅いから結論だけ言え

「レイヤ 番号」になっているレイヤを「親フォルダ名 番号」に変更するプログラムをRustで作った。

  1. Gitをインストール
  2. Rustをインストール
  3. コマンドプロンプトなどを立ち上げる
  4. git clone https://github.com/nodamushi/clip_layer_rename.git を実行
  5. cd clip_layer_rename を実行
  6. cargo build --release を実行
  7. clip_layer_rename/target/release に実行ファイルが出来てるのでclipファイルをドラッグアンドドロップ

何か要求やバグ等があったら、GitHubにIssueを立てて

レイヤがどれだかわからん

どうも

久しぶりに絵を描いてます。残念ながらnodamushi垢ではありませんが。ソフトはCLIP STUDIO PAINT Exです。

で、私はレイヤはフォルダ分けして管理してますが、レイヤ名は付けてないことが多いです。

そうしてると、レイヤ xだらけになって、何処表示してるのか分からなくなるんですよね。

f:id:nodamushi:20211003203031p:plain

この位ならまだ見えるけど、もっと多くなると画面に表示しきれなくなって、スクロールバーが出てきて辛くなってきます。

ちゃんとレイヤ名を付ければ良いんだけど、面倒臭いです。自動的に親フォルダ名+連番にしてくれればなぁ…

clipファイルのフォーマット

何とかなんねぇかなぁーと、「clip file format」とかで調べても出てこない。情報が公開されていないっぽい。

はっきり言って、情報がオープンになってないファイルフォーマットって危険って思ってるんだけど(データ移行できないから2000年代の日本製プログラムを未だに使ってる企業のおっさん共チーーッス☺)。

まぁその辺は良いとして、どうしよう。とりあえず、バイナリエディタで覗いてみよう。

f:id:nodamushi:20211003204038p:plain

バイナリエディタで先頭に見えるマジックナンバーらしき物「CSFCHUNK」で取りあえず検索してみると、なんと解析してる人が居た。ありがたい。

github.com

氏によると、中身にSQLite3が入っているらしい。バイナリエディタで見ると、確かにSQLite3のマジックナンバーが入ってる。

f:id:nodamushi:20211003204644p:plain

その前にある CHNKSQLiはチャンクの開始マジックナンバーで、続く8byteがチャンクのサイズ(マジックナンバーとこの8byteは含まない)になってる模様。なお、サイズはビッグエンディアン。

チャンクからSQLiteのデータだけを抜き出してファイルを保存し、DB Browser for SQLiteで中身を確認してみる。データベース構造は以下の様になっていた。

f:id:nodamushi:20211003210127p:plain

たぶん、見たまんまLayerがそれっぽい。レイヤの画像としての生データはOffscreenかなぁ…(今回は名前を変えるだけなので必要ないケド)。

というわけで、Layerのテーブルを覗いてみる。

f:id:nodamushi:20211003210950p:plain

大分わかりやすい構造で助かった。LayerFolder が0だとレイヤで、0以外だとフォルダになっている。(1以外の場合もあった)

各フォルダは LayerFirstChildIndex で指定した数値と MainIdが一致したレイヤから内容がスタートする。

レイヤの次のレイヤはLayerNextIndex で決まる。0なら終了だ。

LayerTypeが256の無名フォルダは、全体のルートフォルダって意味だと思う。

これでレイヤとフォルダ構造を復元できるので、後は名前を変更するだけだ。

Rustで開発してみた

さて、道筋は出来たのでC++で実装………いや、ちょっと待てよ、私もそろそろいい年こいたおっさんだ。いい加減Rustをやってみるべきではないのだろうか。

よし、Rustの入門書すら真面目に読んでないけど、取りあえず書いてみるか!

というわけで、作ったのがこちら。初めてのRustなのでつたないのは勘弁。誰か鉞を投げて切断して下さい。

github.com

このプログラムを使うと、以下の様に「レイヤー 番号」のレイヤが「親フォルダ名 番号」に変換されます。

f:id:nodamushi:20211003212620p:plain

やったね!

バイナリは公開してないので、使いたい人は自力でビルドして下さい。単にクロスプラットフォームでビルドする方法が分からなかっただけです。

いやー、それにしても。Rust全然分かんねぇ。とくに、エラー周りが分からねぇ………。

何か調べるとみんな言ってることが違う………。お前らはJavaScriptでも書いてるのか…?

こう、C++みたいにサクッと色んな型の例外を返せるといいんだけど、そんなのなさそうだし。

メソッドを使うためにuseしなきゃならんのも、C++以上に面倒臭い。自動でuseしてくれぇ。

今回はライフタイム出てこないから、Rustを使った意味は全くなかったね。

まとめ

よい子のみんなはC++の方が圧倒的に楽で簡単で超便利なので、C++を完全に理解してからRustを始めよう!

ていうか、clipファイルのフォーマット公開して!あと、オートアクションをPythonか何かで書かけるようにして!SDKもフィルタ以外を開発できるようにして!