一、Blender/Python 快速入門


原文:https://docs.blender.org/api/blender_python_api_current/info_quickstart.html#native-types

 


 

1 前言

  可以做的:

    ~可以編輯所有數據

    ~可以修改用戶設置,快捷鍵和主題

    ~可以使用自己定義的工具

    ~可以創建用戶接口,例如,菜單,標題,面板

    ~。。。

  不可以做的:

    ~創建新的空間類型

    ~

2 開始之前

  運行腳本

    1、使用內建的文本編輯器

    2、使用Pyhton控制台

    這兩者都是區域的一種類型,都可以在標題欄中進行切換

3 關鍵概念

  3.1 使用數據

    使用數據塊

        Python使用數據的方式與動畫系統與用戶界面使用數據的方式一樣,也就是說你可以通過按鈕更改的設置,同時也可以使用Python來更改。

      使用bpy.data模塊來操作當前打開的blend文件。

    關於集合

        您會注意到,索引和字符串都可以用來訪問集合的成員。

>>> bpy.data.objects['Cube']
bpy.data.objects["Cube"] >>> bpy.data.objects[0] bpy.data.objects["Cube"]

    獲取屬性

        當獲取一個數據塊后,就可以通過訪問它的屬性來進行操作,就像在圖形界面中一樣。事實上,每個工具提示框中都顯示了你在Python中如何訪問到這個屬性

      可以使用“控制台”來測試你要訪問哪些數據,這是它自己的空間類型。這個支持自動完成,給你一個快速的方法,在你的文件中挖掘不同的數據。

    新建數據和移除

        新的數據塊不能通過調用它的類來創建,這對熟悉其他Python API的人來說或許有些詫異。這在API設計中是有意義的,Blender/Python API不能

      在主要的Blender數據庫之外創建Blender數據(通過bpy.data訪問),因為這個數據是由Blender(save /load/undo/ append)管理的。等等)。通過

      bpy. Data中的集合的方法來添加和刪除數據。

>>> mesh = bpy.data.meshes.new(name="MyMesh")
>>> print(mesh) <bpy_struct, Mesh("MyMesh.001")>
>>> bpy.data.meshes.remove(mesh)

    自定義屬性

        如果數據塊有自己的ID,那么Python就能訪問它的屬性。當指定一個新的屬性時,它將被創建或是重寫原來的同名屬性。這些數據將會隨着blend文件

      一起保存,隨着對象一起被復制。

      注意:這些屬性只能被指定為基礎Python數據類型:

        · int, float, string

        · array of ints/floats

        · dictionary (only string keys are supported, values must be basic types too)

      這些屬性在Python之外是有效的。它們可以通過曲線或在驅動路徑中使用。

  3.2 上下文

      雖然直接通過名稱或列表訪問數據非常有用,但在用戶的選擇上進行具體操作更為常見。上下文始終可以從bpy獲得。上下文,可用於獲取活動對象、

    場景、工具設置以及其他許多屬性。

      注意,上下文是只讀的。這些值不能直接修改,盡管它們可以通過運行API函數或使用bpy.data API來改變。

      上下文屬性根據被訪問的位置而變化。3D視圖的上下文成員與控制台不同,因此在訪問用戶狀態所知道的上下文屬性時要小心。

      參見bpy.context

  3.3 運算符(工具)

      操作符是用戶通過按鈕、菜單項或快捷鍵訪問的工具。從用戶的角度來看,它們是一個工具,但Python可以通過  bpy.ops  模塊來運行這些設置。

    poll()

      通過提前調用poll(),可以避免使用try/catch語句,從而可以檢查是否在合適的上下文中執行ops操作

4 結合

  Python腳本可以通過下面的方式來與Blender結合:

    · 定義一個渲染引擎

    · 定義一系列操作

    · 定義菜單,標題欄和面板

    · 向已有的菜單,標題欄和面板中插入新的按鈕

  這可以通過定義一個已經存在類型的子類來完成。

  4.1 自定義運算操作腳本

import bpy


def main(context): for ob in context.scene.objects: print(ob) class SimpleOperator(bpy.types.Operator): """Tooltip""" bl_idname = "object.simple_operator" bl_label = "Simple Object Operator" @classmethod def poll(cls, context): return context.active_object is not None def execute(self, context): main(context) return {'FINISHED'} def register(): bpy.utils.register_class(SimpleOperator) def unregister(): bpy.utils.unregister_class(SimpleOperator) if __name__ == "__main__": register() # test call bpy.ops.object.simple_operator()

  4.2 面板例

     bpy.types.Panel

    注意,額外的bl_變量用於設置它們所顯示的上下文。

import bpy


class HelloWorldPanel(bpy.types.Panel): """Creates a Panel in the Object properties window""" bl_label = "Hello World Panel" bl_idname = "OBJECT_PT_hello" bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "object" def draw(self, context): layout = self.layout obj = context.object row = layout.row() row.label(text="Hello world!", icon='WORLD_DATA') row = layout.row() row.label(text="Active object is: " + obj.name) row = layout.row() row.prop(obj, "name") row = layout.row() row.operator("mesh.primitive_cube_add") def register(): bpy.utils.register_class(HelloWorldPanel) def unregister(): bpy.utils.unregister_class(HelloWorldPanel) if __name__ == "__main__": register()

5 類型

  5.1 原生類型   

    1)Blender float/int/boolean -> float/int/boolean

    2)Blender enumerator -> string

      >>> C.object.rotation_mode 'AXIS_ANGLE'

    3)Blender enumerator (multiple) -> set of strings

      # setting multiple camera overlay guides

      bpy.context.scene.camera.data.show_guide {'GOLDEN''CENTER'}

      # passing as an operator argument for report types

      self.report({'WARNING''INFO'}, "Some message!")

  5.2 內部類型

      bpy.types.bpy_struct

      數據包含自己的屬性組/網格/骨頭/場景……等等

  5.3 Mathutils類型(數學工具)

      用於矢量,四元數,歐拉,矩陣和顏色類型  mathutils

6 動畫

    在Python中有兩種方法來添加關鍵幀,一種是直接通過key屬性來添加,就像通過界面中按鈕添加一樣。還可以手動創建曲線和關鍵幀數據,

  然后設置該屬性的路徑。

#Simple example:

obj = bpy.context.object obj.location[2] = 0.0 obj.keyframe_insert(data_path="location", frame=10.0, index=2) obj.location[2] = 1.0 obj.keyframe_insert(data_path="location", frame=20.0, index=2)

 #Using Low-Level Functions:

obj = bpy.context.object obj.animation_data_create() obj.animation_data.action = bpy.data.actions.new(name="MyAction") fcu_z = obj.animation_data.action.fcurves.new(data_path="location", index=2) fcu_z.keyframe_points.add(2) fcu_z.keyframe_points[0].co = 10.0, 0.0 fcu_z.keyframe_points[1].co = 20.0, 1.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM