二、Blender/Python API總覽


原文:https://docs.blender.org/api/blender_python_api_current/info_overview.html

 


 

    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

    看起來很明顯,但重要的是要注意直接執行腳本或將腳本導入模塊的區別。

    擴展Blender的腳本——定義在腳本執行之外的類,這使得將來對這些類的訪問(例如取消注冊)比導入模塊更困難,因為在模塊中保存類實例,之后可以通過導入該模塊來訪問這些類。

    出於這個原因,最好只使用直接執行腳本,而不是通過注冊類來擴展Blender。

    下面是一些在Blender中直接運行腳本的方法

    •   加載到文本編輯器中,然后 Run Script.

    •   輸入或粘貼到python控制台中.

    •   在命令行中執行python文件:

        blender --python /home/me/my_script.py

    作為模塊運行:

    •   很明顯的方法, 在文本編輯器或者Python終端中輸入 import some_module .
    •   打開一個文本塊並標記 “注冊”選項, 這將和blend文件一起加載.
    •   復制到目錄 scripts/startup中, 那么他們將在啟動時自動加載.
    •   定義為插件, 啟用的插件將作為Python模塊使用.

    一些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腳本調用的。

        在啟動時加載的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 args, found 3

        使用類型 bl_idname 1 將會提示.

        TypeError: validating class error: Operator.bl_idname expected 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的時候,你可能想要把自己的設置組合在一起,畢竟,它們可能必須與其他腳本共存。為了將屬性組合起來,你需要定義一些類,

          對於一些組內組或組內集合,你發現你需要處理他們注冊和取消注冊的順序。

            自定義屬性組本身是需要注冊的類。

                                   Manipulating Classes  操作類

            Blender運行時,屬性可以添加和刪除,這通常發生在類注冊和取消注冊時,但是在一些特殊的情況中,在腳本運行時修改屬性類型是很有用的。

                                   Dynamic Defined-Classes (Advanced)  動態定義類(高級)

            在某些情況下,數據的指示符可能不屬於Blender,例如renderman着色器的定義,它可能有助於定義類型並快速地刪除它們。


免責聲明!

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



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