3Dテキストを追加[obsolute]

さて、Blenderpythonを使って何かモノを追加してみましょう。テキストがいいですかね。

では早速追加するには何を用意すればいいのか調査してみましょう。まずは、実際の操作で何をやっているかから確認するのが早そうです。

  1. blenderを起動

  2. スクリーンに Scripting を指定して、レイアウトを変更します。これで、操作ログが見えるようになっています。

  3. 3Dビュー中央の立方体を削除します。

  4. オブジェクトモードで、[Shift]+[A]でテキストオブジェクトを追加します。

  5. 操作ログに bpy.ops.object.text_add() の行があることが確認できます。

  6. テキストを編集します。"Hello world!"とかにしておきましょうか。

さて、操作ログについてですが、これ自体がPythonスクリプトとして動きます。が、スクリプトとしてちゃんと実行させようとすると、「操作する前の状況を毎回再現しておく必要がある」「無駄が多すぎる」などの欠点があります。

操作時のログから見ていきましょう。(1)テキストを追加、(2)文字を"Hello world!"に変更、という2つです。

bpy.ops.object.text_add(view_align=False, enter_editmode=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)) bpy.ops.object.editmode_toggle() bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION') bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION') bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION') bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION') bpy.ops.font.text_insert(text="H") bpy.ops.font.text_insert(text="e") bpy.ops.font.text_insert(text="l") bpy.ops.font.text_insert(text="l") bpy.ops.font.text_insert(text="o") bpy.ops.font.text_insert(text=" ") bpy.ops.font.text_insert(text="w") bpy.ops.font.text_insert(text="o") bpy.ops.font.text_insert(text="r") bpy.ops.font.text_insert(text="l") bpy.ops.font.text_insert(text="d") bpy.ops.font.text_insert(text="!") bpy.ops.object.editmode_toggle()

これを単純化します。オブジェクトはbpy.data.objects[<オブジェクト名>]で取得出来るので、まずはこんな感じでしょうか。"data.body"はテキストオブジェクトの文字列を格納しています。

bpy.ops.object.text_add() bpy.data.objects['Text'].data.body = "Hello world!"

この2行でテキストが"Hello world!"と3Dビューに表示されたはずです。オブジェクト名は "Text"ですね。そのオブジェクトに対して文字列を変更しているんだな、ということがなんとなくわかります。

では、上記2行を再度実行してみるとどうなるでしょう?

"Text.001"というテキストオブジェクトができましたが、そのオブジェクトのテキストは"Hello world!"ではなく、"Text"になっています。これは、「同じオブジェクト名のものを追加しようとした場合、".001"のような文字列を付与して、オブジェクト名が重複しないようにする」Blenderの機能です。

bpy.data.objects['Text'] で指定したのは、先に追加したテキストオブジェクトになるので、次に追加したテキストオブジェクトが変更の対象となっていないことになります。

ではどうするか。「オブジェクトを追加する時、追加したオブジェクトがアクティブになる」ことに注目します。アクティブなオブジェクトを選択するには、bpy.context.object を使用します。

>>> bpy.context.object bpy.data.objects['Text.001']

bpy.data.objects[<オブジェクト名>]はbpy.context.objectに置き換えができることが分かったので、こう、ですね。

bpy.ops.object.text_add() bpy.context.object.data.body = "Hello world!"

では前やったのと同じように、上記の2行を実行します。今度はちゃんと"Hello world"になっているでしょうか。確認します。

>>> bpy.context.object.name 'Text.002' >>> bpy.context.object.data.body 'Hello world!'

きちんと変更されていました。

まとめると、以下の通り。

  1. オブジェクト追加は bpy.ops.object.text_add()

  2. オブジェクト追加時、追加したオブジェクトがアクティブ状態となるので、 bpy.context.object で「アクティブなオブジェクトを取得

  3. bpy.context.object.data.body に "Hello world!" を代入することで、追加したオブジェクトのテキストを変更

OS X Yosemiteでバックスラッシュを入力できない

テキストオブジェクトの文字列は"\n"で改行できます。ただ、OS X Yosemiteの場合は、"\"は、[Alt]+[¥]で入力するので注意しましょう。 "¥n"と入力してもエスケープされません。