原文: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視圖的上下文成員與控制台不同,因此在訪問用戶狀態所知道的上下文屬性時要小心。
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 面板例
注意,額外的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 內部類型
數據包含自己的屬性組/網格/骨頭/場景……等等
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