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で簡単な文字をプリントアウトしなさい、と言うのと同じようなレベルですがこうやってちょとずつプログラムを覚えていくんでしょうね~必要だったらですけど

スポンサーサイト

コメントの投稿

非公開コメント

No title

こんばんは!スクリプト始められたんですねe-342
Pythonはまだ使ったことがないですけど、私も学生の時にBASIC・C言語・Javaでプログラミングしていました。e-348

import bpy
このbpyは関数のセットでしょうね。
for文にあるbpy.context.object.data.bonesを使うために、この関数を持つbpyをインポートする必要があります。

ちなみに*のアスタリスクはワイルドカードといって、
Pythonでは使えるかどうかわからないですけどUnixには*(文字数制限無し)の他にも?(1文字のみ)がありました。

[]の数字は配列ですね!懐かしいです(笑)

文字の置き換え方を調べてみました。

import bpy

for x in bpy.context.object.data.bones:
x.name = x.name.replace('ABC','abcde')



この文を実行するとボーン名の'ABC'が'abcde'に置き換わります。
簡単なスクリプトでもいろいろ使えそうですね。ちょっと興味がわいてきましたe-465

解説ありがとうございます(^^

助け舟を出していただきましてありがとうございますv-411
かなり適当な解説だったので、こんな紹介で大丈夫かな?と思ってましたので…v-388
スクリプト…ご存知なんですね。引き出し多いですね~v-411
良かったら基本を教えて下さいv-364

初められた~なんて大層なものではありませんが、できるだけ楽をして操作をしたいと言う希望があり、どうしたものかな?と調べている内に、こういうやり方が有るというのを知りまして、やってみようと思った訳ですv-410

で、やってみたら思ったような文字の置き換えにならずに…そう言えばプログラムって「パソコンは間違えない、間違えているのはあなたの方」と言う風に習った記憶があります。どこか意味の違う命令文が有るんだろうと思って探してみたら記事のようになった訳です。

しかし、もっとダイレクトに文字を置換えちゃう方法があるんですねv-405
なんかこちらの方が分かりやすいですね。早速使わせて頂きたく思いますv-411

ちょっとずつ昔のことを思い出してきましたが、プログラムって実行するような命令文はほんの少しだったりするんですよね。それよりも見た目のプログラムの方がよほど大変だったというのを記憶しています。

今回のように文字の置き換えはたった数行ですが、これをBlenderでウィンドウ表示にしようと思ったら、文字入力サイズやボタンサイズ等どういう位置に配置するか?とかグラフィック的な物のほうが大変だったと思います。

相当前ですが、インターネット黎明期の頃(20年位前?)個人がホームページを持つのがステータスだった時代、何とか自分のホームページを見てもらおうと色々と試行錯誤していた頃に流行ったCGIを使ってメールフォーム、カウンター等を作っていたのを思い出しましたv-411

普段はAdd-onとしてフリープログラムを利用させて頂いていますが、こうしたプログラムは縁の下の力持ち的な存在で、作られている方を本当に尊敬してますv-425

Shadeも徐々にサードパーティの方が頑張ってきて、機能が充実してきてます。段々どっちが本体かわからなくなりそうな感じですv-398

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
プロフィール

喜多川春望

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

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

この人とブロともになる

QRコード
QR