原文:https://docs.blender.org/api/blender_python_api_current/info_overview.html
- Python in Blender Blender中的Python
Blender嵌入了一個Python解釋器,它由Blender啟動並保持活躍。這個解釋器運行腳本以繪制用戶界面,並用於一些Blender的內部工具。
這是一個典型的Python環境,因此關於如何編寫Python腳本的教程也將在Blender中運行腳本。Blender為Python解釋器提供了bpy模塊。可以將這個模塊
導入一個腳本,並提供對Blender數據、類和函數的訪問。處理Blender數據的腳本需要導入這個模塊。
在開發自己的腳本時,它可能有助於理解Blender如何設置Python環境。許多Python腳本都是與Blender綁定的,可以作為參考,因為它們使用腳本作者編
寫工具的相同API。腳本的典型用法包括:用戶界面、導入/導出、場景操作、自動化、定義您自己的工具集和自定義。
在啟動Blender時,掃描Python模塊的scripts/startup/ 目錄並導入它們。這個目錄的確切位置取決於您的安裝。See the directory layout docs
- Script Loading 腳本加載
看起來很明顯,但重要的是要注意直接執行腳本或將腳本導入模塊的區別。
擴展Blender的腳本——定義在腳本執行之外的類,這使得將來對這些類的訪問(例如取消注冊)比導入模塊更困難,因為在模塊中保存類實例,之后可以通過導入該模塊來訪問這些類。
出於這個原因,最好只使用直接執行腳本,而不是通過注冊類來擴展Blender。
下面是一些在Blender中直接運行腳本的方法
-
加載到文本編輯器中,然后 Run Script.
-
輸入或粘貼到python控制台中.
-
在命令行中執行python文件:
blender --python /home/me/my_script.py
作為模塊運行:
-
- 很明顯的方法, 在文本編輯器或者Python終端中輸入
import some_module. - 打開一個文本塊並標記 “注冊”選項, 這將和blend文件一起加載.
- 復制到目錄
scripts/startup中, 那么他們將在啟動時自動加載. - 定義為插件, 啟用的插件將作為Python模塊使用.
- 很明顯的方法, 在文本編輯器或者Python終端中輸入
- Addons 插件
一些Blender的功能最好是根據個人需要可選擇的,他們保存在scripts/addons/目錄中,只有在用戶設置選擇他們的時候才會自動啟動。
插件和內置Python模塊之間的唯一區別是,插件必須包含一個bl_info變量,該變量用於將名稱、作者、類別和URL等元數據讀取。
用戶選項的插件清單使用bl_info來顯示關於每個插件的信息。See Addons 有關更詳細的bl_info 變量。
在文本編輯器中運行Python腳本對於測試非常有用,但是您需要擴展Blender,使工具與其他內置功能一樣可訪問。
Blender Python api允許集成:
這是故意有限。目前,對於更高級的特性,如網格修改器、對象類型或着色節點,必須使用C/C++。
對於Python 集成Blender,它定義了所有類型都通用的方法。這是通過創建一個包含由父類指定的變量和函數的一個Python子類來實現的,它被預
先定義為與Blender的接口。
例如:
import bpy class SimpleOperator(bpy.types.Operator): bl_idname = "object.simple_operator" bl_label = "Tool Name" def execute(self, context): print("Hello World") return {'FINISHED'} bpy.utils.register_class(SimpleOperator)
首先,我們定義了一個bpy.types的子類,這在所有可以與Blender結合使用的類中都很常見,所以我們知道如果這是一個操作符,而不是在注冊一個面板。
兩個類屬性都以bl_前綴開頭。這是一個慣例用來區分Blender定義的變量和你自己添加的。
接下來查看execute函數,它接受一個操作符和當前上下文的實例。常用的前綴不用於函數。
最后,注冊函數被調用,它將類並載入到Blender。See Class Registration.
關於繼承,Blender沒有對使用的類繼承施加限制,注冊檢查將使用父類中定義的屬性和函數。
混合類實例: import bpy class BaseOperator: def execute(self, context): print("Hello World BaseClass") return {'FINISHED'} class SimpleOperator(bpy.types.Operator, BaseOperator): bl_idname = "object.simple_operator" bl_label = "Tool Name" bpy.utils.register_class(SimpleOperator)
注意,這些類沒有定義__init__(self)函數。如果定義了__init__()和__del__(),那么類實例的生命周期只會跨越執行。例如,一個面板將為每次重繪提供
一個新實例,因此很少有理由在面板實例中存儲變量。相反,應該將持久變量存儲在Blenders data中,以便在重新啟動Blender時恢復狀態。
一旦這個類注冊了Blender,就會將類實例化,並將函數調用為Blender。實際上,您不能像大多數Python API那樣,從腳本中實例出這些類。
為了調用你定義的運算,你必須通過ops API來調用:
import bpy bpy.ops.object.simple_operator()
用戶接口是在一個指定的上下文中,其中可以繪制、按鈕窗口、文件頭、工具欄等,然后在顯示該區域時繪制它們,所以它們是不會直接被Python腳本調用的。
- Registration 注冊
- Module Registration 模塊注冊
在啟動時加載的Blender模塊需要注冊()和unregister()函數。這些都是您的代碼中唯一可以調用的函數,否則就是一個常規的Python模塊。
一個簡單的Blender/Python 模塊有這樣的形式:
import bpy class SimpleOperator(bpy.types.Operator): """ See example above """ def register(): bpy.utils.register_class(SimpleOperator) def unregister(): bpy.utils.unregister_class(SimpleOperator) if __name__ == "__main__": register()
這些函數通常出現在包含類注冊的腳本的底部,有時添加菜單項。您還可以在內部為您自己的工具設置數據時使用它們,但要注意,因為在加載新
的blend文件時,注冊器不會重新運行。
因為有了register和unregister的調用,所以在Blender運行時可以切換插件和重載腳本。如果注冊調用被放置在腳本的主體中,導入時就會調用注冊,這意味着導
入模塊或將其加載到Blender中是沒有區別的。
當一個腳本從另一個模塊導入類時,很難管理加載了哪些類並且是何時加載的,這就會產生問題。
最后兩行僅僅是為了測試:
if __name__ == "__main__": register()
這允許在文本編輯器中直接運行腳本以測試更改。由於__main__是為直接執行保留的,所以這個register()導入時不會直接運行。
用Blender注冊一個類,將類定義加載到Blender中,並與現有功能一起使用。
加載此類后,您可以從bpy.type訪問它。類型,使用bl_idname而不是類原來的名稱。
當加載一個類時,Blender對確保所有必需的屬性和函數進行了完整性檢查,這些屬性具有正確的類型,並且函數的參數數量正確。
大多數情況下,你不需要關心這個問題,但是如果這個類定義有問題的話,它會在注冊時提出:
使用函數參數時 def execute(self, context, spam), 會報錯:
ValueError: expected Operator, SimpleOperator class "execute" function to have 2 args, found 3
使用類型 bl_idname = 1 將會提示.
TypeError: validating class error: Operator.bl_idname expected a string type, not int
Multiple-Classes 多重類
向Blender中加載簡單的類,使用bpy.utils.register_class就可以完成,但是當你導入的模塊中有很多類時,
可以使用bpy.utils.register_module (module) and bpy.utils.unregister_module (module)
當一個腳本定義了很多自己的操作和菜單面板時:
def register(): bpy.utils.register_module(__name__) def unregister(): bpy.utils.unregister_module(__name__)
內部Blender在可注冊類型上收集子類,將其存儲在定義它們的模塊中。通過將模塊名傳遞給bpy. utils.register_module
Blender可以注冊這個模塊及其子模塊創建的所有類。
Inter Classes Dependencies 類依賴
在定制Blender的時候,你可能想要把自己的設置組合在一起,畢竟,它們可能必須與其他腳本共存。為了將屬性組合起來,你需要定義一些類,
對於一些組內組或組內集合,你發現你需要處理他們注冊和取消注冊的順序。
自定義屬性組本身是需要注冊的類。
Blender運行時,屬性可以添加和刪除,這通常發生在類注冊和取消注冊時,但是在一些特殊的情況中,在腳本運行時修改屬性類型是很有用的。
Dynamic Defined-Classes (Advanced) 動態定義類(高級)
在某些情況下,數據的指示符可能不屬於Blender,例如renderman着色器的定義,它可能有助於定義類型並快速地刪除它們。
