Pythonの初歩(覚え書き)

これまで意識的に素通りしていたPythonですが、とうとうやらねばならぬ状況になったので、やることにしました。
と言ってもすごく簡単な内容なんですけど、Shadeでは簡単に出来ていた名前の置換えって奴です。

Blenderはとても良く出来たソフトだと思うのですが、Outliner(Shadeではブラウザに該当します)と言うのが便利なところもあれば不便なところもある状態です。無いところはこれまでアドオンを探したり、スクリプトを探したりしてましたが、どうにも名前の置換え(rename replace)と言うようなのがありません。

検索していった所、これくらいならばスクリプトを作れば簡単でっせと言うような事なので、簡単ならばやってみるか~と言う軽い気持ちで挑戦しました。

Blenderでこれまで全く必要のなかったテキストエディタを開いて、お決まり構文を作ることにしました。まず「import bpy」というのが必ず必要なので、これを打ち込みます。所詮、スクリプト初心者です。これが一体何を意味しているか?知る由もないまま、次に向かいます(すごい適当…)

さて、次から置き換えする対象物が何なのか?と言うことになります。メッシュだったりボーンだったりしますが、オブジェクトモードで変更したいのか、エディットモードで変更したいのか?ということでも文章が違うようです。

とりあえず参考にしたスクリプト文がオブジェクトモードでやりましょうとの事だったので、オブジェクトモードでボーンの名前を変更します、と言うことで進めます。
さらにやりたい内容の詳細ですが「a001」「a002」みたいな名前のボーンの頭文字の「a」を「s」に変更するとします。

まず、オブジェクトモードでボーンの名前を変更したいということで…
「for x in bpy.context.object.data.bones:」を打ち込みます。

続いて「a」を「s」に置換えます。と言うことで…
「 if x.name[0] == 'a':
x.name = 's' + x.name[1:]」

となります。これが正解なのですが、もちろんずぶの素人にいきなり正解は導けるわけもなく、この答えを出すまでに少々苦悩します

まず「x」は数式でよくある代入するための仮の記号と言うことです。「もし「x」が’a’と言う値だったら~」というのが初めの文章で、次は「’s’にしなさい、ただし、初めから1文字以降は同じ文字にしなさい」(で良いのかな)と言う事になるようです。

何に悩んだか?と言うと「[0][1:]」と言ったように、どの文字を残す、残さない、のやり方に迷いました

文字を置換えたいわけだから、初めの文字を交換すれば良いんだよなぁ。だったら両方共頭文字を意味する[0]で良いんじゃないか?と思ってたのですが、これだと文字を置き換えるのではなく、文字を追加すると言う結果になりました。
<ちなみに、x.name = 's' + x.name[0:]が初めに思いついた文章です>

あれ~?何がいけないの?なんで追加しちゃうの?と思って、よくよく考えてみたら文字を置き換えると言うことは、文字を入れ替えると言う事になるので、置き換えたい文字は追加で良いのですが、置換えられる文字は削除の対象にならないといけませんよ~と言う事に気がつきました。

この[0]や[1:]についてですが、簡単に解説しますと数字は文字数を示しています。「:」は残したい文字と言う事になりますが、これが[1:]だったり[:1]だったりした場合は意味が異なります。これは検索でもよく使う[*(アスタリスク)]の考え方と同じと思っていただければわかりやすいと思います。

例えばExplorer検索で「*test.*」等と打ち込んで検索した場合、頭文字は何の文字か分からないけど、名前に「test」が入っているデータを探して欲しいというような使い方があると思います。そんなイメージと同じで、数字の後にある場合はその数字以降は同じ文字を使ってください、と言うようにプログラムしているようです。

つまり[1:]ならば、1文字目以降は同じ文字を残してくださいとなります。[:1]ならば、名前の最後の1文字より前の文字を残してくださいとなります。Blenderを使用されている方ならお分かりかと思いますが、[.L][.R]といったように、語尾に左(Left)右(Right)を意味するこれらの省略文字が入っていると、ミラーリングmodifierを使っても左右非対称な動きを可能にしてくれる名前になるので、この文字を入れ替えたい場合等は意識しないといけない事になります。

と言うことで頭文字を入れ替えるスクリプトは次のようになりました。

import bpy

for x in bpy.context.object.data.bones:
if x.name[0] == 'a':
x.name = 's' + x.name[1:]


※頭文字が[a]だったら[s]を入れなさい、ただし1文字目以降は同じ文字を使いなさい。と言うことで、文字を入れ替えるスクリプトは出来ましたちなみに、もし[1:]が[0:]だったらどうなるかというと、0文字目以降は同じ文字にしなさいとなるので、単純に頭文字が追加されるようになります。

大昔にパソコンを触った時に勉強したBASICで簡単な文字をプリントアウトしなさい、と言うのと同じようなレベルですがこうやってちょとずつプログラムを覚えていくんでしょうね~必要だったらですけど

スポンサーサイト
プロフィール

喜多川春望

Author:喜多川春望
3DCG(Shade)や音楽(Cubase)を作っております。興味のある方はどうぞご覧ください。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
バナー付きリンク
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR