「Doc:JA/2.6/Manual/Extensions/Python/Console」の版間の差分
細 (moved Doc:JA/2.5/Manual/Extensions/Python/Console to Doc:JA/2.6/Manual/Extensions/Python/Console) |
細 (1版 をインポートしました) |
(相違点なし)
|
2018年6月29日 (金) 04:43時点における最新版
コンソール・エディター・タイプ
Blender 2.5 における対話型コンソールは進化を遂げました。オート・コンプリート機能 ( Auto Complete )、Python のリポート機能などの機能が追加されました。コンソールにおけるワンライナー ( one-liners ) のテストは Python API を学習する上で有効な方法です。
内蔵された Python コンソールにアクセスする
マウスを利用してコンソールを起動してください。
Blender 上で ( 3D ビュー、タイムライン等の ) エディター・タイプ ( Editor Type ) であるウィンドウ上で ⇧ ShiftF4 というショートカットを利用すると、そのウィンドウ・タイプをコンソール・エディターに変更する事が出来ます。
上図を参照すると、操作に利用していたホットキーが通常とは異なり、CtrlSpace というホットキーを利用するとオート・コンプリート (Auto-complete) が利用できる事に気づかれるかと思います。
Blender 2.5 は Python 3.1 を利用しており、そのインタプリタがロードされて>>> というプロンプトにコマンドが入力されるのを待っている状態になります。
初めてのコンソール環境
インタプリンタ環境に読み込まれているファイルを確認するために、プロンプトで dir() と入力して実行してください。
出力される結果の大まかな形は以下の通りです。
- 'C'
- Blender にハンドルされた動作に必要な各種情報
- '__builtins__'
- Python 3.1 のビルトイン (クラス、関数、変数)
- 'bpy'
- トップレベルの Blender Python API モジュール
オート・コンプリート機能
続いて bpy. と入力してください。そして CtrlSpace を押すと実際にオート・コンプリート機能がコンソール上で動作するのを確認できます。
bpy 内のサブ・モジュールの一覧が表示されます。これらのモジュールは私達が Blender Python API で出来ることをカプセル化した物で非常に有力なツールになっています。
bpy.app モジュールの内容を表示してみましょう。
上図に表示された緑色の出力はオート・コンプリートを利用したときの物である事に注意してください。ここで表示されているのはオートコンプリートによる一覧表示の結果です。一覧上に表示されたのはモジュールの属性名ですが、 括弧 '(' で終わっている名称は関数名です。
この機能を利用することが Blender の API をより早く習得する上で大きな助けになります。ここまでの説明でコツは掴めたはずです。bpy 内のモジュールについてさらに調べてみましょう。
モジュールで試行錯誤する前に
Blender において初期状態の 3D ビューポートを見ると、3つのオブジェクトがある事に気づきます。立方体、ランプそしてカメラです。
- 全てのオブジェクトはコンテクスト上に存在し、操作されている状態に応じた多数のモードを持っています。
- いつもただ1つのオブジェクトのみがアクティブであり、1つ以上のオブジェクトが選択され得ます。
- 全てのオブジェクトは Blender ファイル内のデータです。
- bpy モジュールにはこれらのオブジェクトを作成あるいは調整するオペレーターや関数が含まれています。
上に示した状況 (示されてないものも存在します) では bpy モジュールがデータにアクセスして修正する機能を提供します。
例
bpy.context
- Note
- 以下に示すコマンドによって適切な出力を行うために、3D ビューで選択されているオブジェクトを確認しておいてください。
やってみよう!
- bpy.context.mode
- 現在の 3D View の (Object、Edit、Sculpt 等の)モードを出力します。
- bpy.context.object および bpy.context.active_object
- 3D View でアクティブなオブジェクトを返します。
>>> bpy.context.object.location.x = 1
アクティブなオブジェクトの X 座標を 1 に変更します。
>>> bpy.context.object.location.x += 0.5
アクティブなオブジェクトの X 座標を 0.5 ユニットだけ移動させます。
>>> bpy.context.object.location = [1, 2, 3]
アクティブなオブジェクトの X、Y、Z 座標を変更します。
>>> bpy.context.object.location.xyz = [1, 2, 3]
上に同じです。
>>> type(bpy.context.object.location)
アクティブなオブジェクトのデータ型を出力します。
>>> dir(bpy.context.object.location)
表示されるのはアクセスできる大量のデータです。
- bpy.context.selected_objects
- (アクティブなオブジェクトを含んだ) 選択されている全てのオブジェクトの一覧を返します。
>>> bpy.context.selected_objects ( ここで {{Shortcut|Ctrl|Space}} を押す )
>>> bpy.context.selected_objects[0]
対象となる一覧の中で最初のオブジェクトの名前を出力します。
>>> [object for object in bpy.context.selected_objects if object != bpy.context.object]
分かりにくいのですが、選択されたオブジェクトの内アクティブでないもの全ての一覧を出力します。
bpy.data
bpy.data は Blender のファイル内の全てのデータにアクセスする多くの関数と変数からなります。
開かれている Blender ファイルの以下のデータにアクセスすることができます: オブジェクト (Object) 、メッシュ (Mesh) 、マテリアル (Material) 、テクスチャ、シーン (Scene) 、スクリーン (Screen) 、音源 (Sound) 、スクリプト、テキスト、カメラ、カーブ (Curve) 、ランプ、ブラシ、アーマチャ (Armature) 、画像 (image) 、ラティス (Lattice) 、ライブラリ、ワールド (World) 、グループ、メタボール、パーティクル、ノード・グループ (Node_group) 等の多くのデータです。
やってみよう!
エクササイズ
>>> for object in bpy.data.scenes['Scene'].objects: print(object.name)
上記のように入力し、↵ Enter を2回押します。 'Scene' という名前を持った Blender のシーンに属する全てのオブジェクトの名前を出力します。
>>> bpy.data.scenes['Scene'].objects.unlink(bpy.context.active_object)
'Scene' という名前を持った Blender のシーンでアクティブなオブジェクトのリンクを解除します。
>>> bpy.data.materials['Material'].shadows
>>> bpy.data.materials['Material'].shadows = False
(要編集)
bpy.ops
Blender 2.5 におけるオペレータ (Operator) となるように開発されたツールあるいは機能のシステムです。これらのオペレータはコンソールから直接、もしくはボタンをクリックする、あるいは Python スクリプトのパッケージから呼び出すことが出来ます。これらは非常に強力です。
オペレータが扱うカテゴリの一覧を閲覧するには、ここをクリックしてください。
3D ビューポート ( Viewport ) 上に5つの立方体の集まりを作成してみましょう。最初に、標準で存在する立方体オブジェクトを選択して X を押し、削除してください。
やってみよう!
以下に示すコマンドはレイヤー 1 に作成されたオブジェクトを指示する物です。まず後に参照するための配列を定義します。
>>> mylayers = [False]*20
>>> mylayers[0] = True
オペレータが基本メッシュである立方体を作成する参照元を作成します。
>>> add_cube = bpy.ops.mesh.primitive_cube_add
ループ内で下のように記述し5つのオブジェクトを作成します。 (スクリーンショットの上部では下に示すのとは異なるメソッドが用いられています。) コンソールのシェル・プロンプトにコマンドを入力 (2行目の頭の空白も入力) した後、2回エンターキーを押してください。
>>> for index in range(0, 5):
... add_cube(location=(index*3, 0, 0), layers=mylayers)