Blender有許多互連數據類型,它們具備自動生成的引用api,它一般具備編寫腳本所需的信息,但可能難以使用。node
本文檔旨在幫助您瞭解如何使用參考API。python
參考API涵蓋bpy.types,存儲經過如下方式訪問的類型bpy.context- 用戶上下文 或bpy.data- 混合文件數據。api
其餘模塊,例如bge,bmesh而且aud沒有使用Blenders數據API,所以本文檔不適用於這些模塊。數組
使用參考API的最多見狀況是找出如何訪問混合文件中的數據。編輯器
在進一步瞭解Blender中的ID數據塊以前,您常常會找到與它們相關的屬性。函數
ID數據塊在Blender中用做頂級數據容器。工具
從用戶界面來看,這不是那麼明顯,但在開發時,您須要瞭解ID數據塊。學習
ID數據類型包括場景,組,對象,網格,屏幕,世界,電樞,圖像和紋理。有關完整列表,請參閱子類bpy.types.ID動畫
如下是ID數據塊共享的一些特徵。code
ID是混合文件數據,所以加載新的混合文件會從新加載一組全新的數據塊。
ID能夠在Python中訪問 bpy.data.*
每一個數據塊都有一個惟一的.name屬性,顯示在界面中。
動畫數據存儲在ID中.animation_data。
ID是惟一能夠在混合文件之間連接的數據類型。
能夠經過Python添加/複製和刪除ID。
ID有本身的垃圾收集系統,能夠在保存時釋放未使用的ID。
當數據塊具備對某些外部數據的引用時,這一般是ID數據塊。
讓咱們從一個簡單的案例開始,說你不是一個python腳原本調整對象的位置。
首先在界面中找到此設置 Properties Window -> Object -> Transform -> Location
從按鈕,您能夠右鍵單擊並選擇在線Python參考,這將連接到: bpy.types.Object.location
做爲API參考,此連接一般提供的信息比工具提示少,但有些頁面包含示例(一般位於頁面頂部)。
此時你可能會說如今是什麼?- 你知道你必須使用.location它的3個浮點數組,但你仍然想知道如何在腳本中訪問它。
因此下一步是找出訪問對象的位置,在頁面底部到References 部分,對於有不少引用的對象,可是訪問對象的最多見的地方之一是經過上下文。
在這一點上很容易被淹沒,由於Object在不少地方引用了它 - 修飾符,函數,紋理和約束。
可是,若是要訪問用戶選擇的任何數據,一般只須要檢查bpy.context引用。
即使如此,在這種狀況下,若是您閱讀這些內容還有至關多的內容 - 大多數都是模式特定的。若是您正在編寫僅在重量塗料模式下運行的工具,那麼使用weight_paint_object 是合適的。可是,要訪問用戶上次選擇的項目,請查找active成員,有權訪問用戶選擇的單個活動成員是Blender中的約定:例如。active_bone, active_pose_bone,active_node...在這種狀況下,咱們可使用- active_object。
因此如今咱們有足夠的信息來查找活動對象的位置。
bpy.context.active_object.location
您能夠在python控制檯中鍵入它以查看結果。
訪問引用中對象的另外一個常見位置是bpy.types.BlendData.objects。
注意 這不是列爲bpy.data.objects,這是由於bpy.data是bpy.types.BlendData類的一個實例,因此文檔指向那裏。
使用bpy.data.objects,這是一組對象,所以您須要訪問其中一個成員。
bpy.data.objects["Cube"].location
前面的示例很是簡單,由於能夠直接從上下文訪問location其屬性Object。
如下是一些更復雜的例子:
# access a render layers samples bpy.context.scene.render.layers["RenderLayer"].samples # access to the current weight paint brush size bpy.context.tool_settings.weight_paint.brush.size # check if the window is fullscreen bpy.context.window.screen.show_fullscreen
正如您所看到的,有時您但願訪問嵌套的數據,這種方式會致使您經歷一些間接。
這些屬性被安排爲匹配數據在內部存儲的方式(在混合器C代碼中),這一般是合乎邏輯的,但並不老是與使用Blender指望的徹底相同。
所以,這須要一些時間來學習,它能夠幫助您瞭解數據在Blender中的組合方式,這對於編寫腳本很是重要。
在開始編寫腳本時,您常常會遇到沒法肯定如何訪問所需數據的問題。
有幾種方法能夠作到這一點。
複製數據路徑<info_data_path_copy>
間接數據訪問<info_data_path_indirect>
Blender能夠將Python字符串計算爲屬性,該屬性顯示在工具提示中,以下所示。這節省了必須使用API引用來單擊備份引用以查找數據的訪問位置。Python: ...
有一個用戶界面功能能夠複製數據路徑,該路徑提供從bpy.types.ID數據塊到其屬性的路徑。
爲了瞭解這是如何工做的,咱們將得到Subdivision-Surface修改器細分設置的路徑。
從默認場景開始,選擇「 修改器」選項卡,而後將「 細分 - 曲面」修改器添加到多維數據集。
如今將鼠標懸停在標記爲View的按鈕上,工具提示包括bpy.types.SubsurfModifier.levels 但咱們想要從對象到此屬性的路徑。
請注意,複製的文本將不包含該bpy.data.collection["name"].組件,由於它假定您不會在每次訪問時進行集合查找,而且一般您但願使用上下文而不是bpy.types.ID按名稱訪問每一個實例。
在Python控制檯中輸入ID路徑bpy.context.active_object。包括尾隨點,但不要點擊「輸入」。
如今,右鍵單擊該按鈕並選擇「 複製數據路徑」,而後將結果粘貼到控制檯中。
因此如今你應該獲得答案:
bpy.context.active_object.modifiers["Subsurf"].levels
按「輸入」,您將得到當前值1.如今嘗試將值更改成2:
bpy.context.active_object.modifiers["Subsurf"].levels = 2
您能夠在Subdivision-Surface修改器的UI和多維數據集中看到值更新。
在這個例子中,咱們將討論更多涉及的內容,顯示訪問活動的雕刻畫筆紋理的步驟。
讓咱們說咱們想經過Python訪問畫筆的紋理,以調整它contrast的例子。
對比度設置未在雕刻工具欄中顯示,所以在屬性面板中查看紋理...
如今,您可使用Python控制檯來造成訪問畫筆紋理對比所需的嵌套屬性,邏輯上咱們如今知道了。
上下文 - >畫筆 - >紋理 - >對比度
因爲每一個屬性都是按照咱們在python控制檯中組成數據路徑的方式給出的:
bpy.context.brush.texture.contrast
能夠有多種方式來訪問相同的數據,您選擇的方法一般取決於任務。
訪問相同設置的備用路徑是......
bpy.context.sculpt.brush.texture.contrast
或者直接訪問畫筆......
bpy.data.brushes["BrushName"].texture.contrast
若是您正在編寫用戶工具,則一般須要使用,bpy.context由於用戶一般但願該工具對他們選擇的內容進行操做。
對於自動化,您更有可能使用,bpy.data由於您但願可以訪問特定數據並對其進行操做,不管用戶當前具備何種視圖集。
Blender中的大多數按鍵和按鈕都會調用一個操做符,該操做符也會暴露給python via bpy.ops,
要查看Python等效項,請將鼠標懸停在按鈕上並查看工具提示,例如,若是沒有工具提示或缺乏行,則此按鈕不使用運算符,沒法從Python訪問。Python: bpy.ops.render.render()Python:
若是要在腳本中使用它,能夠Control-C在鼠標懸停在按鈕上時將其複製到剪貼板。
您也能夠右鍵單擊按鈕並查看在線Python參考,這主要顯示參數及其默認值,可是用Python編寫的運算符顯示其文件和行號,若是您有興趣檢查源代碼,這可能頗有用。
注意 並不是全部運算符均可以從Python中有用地調用,有關詳細信息,請參閱使用運算符。
Blender記錄您運行的運算符並在信息空間中顯示它們。它位於文件菜單上方,能夠向下拖動以顯示其內容。
選擇Blender默認的腳本屏幕以查看其輸出。您能夠執行某些操做並看到它們顯示 - 例如刪除頂點。
能夠選擇每一個條目(右鍵 - 鼠標 - 按鈕),而後複製Control-C,一般粘貼到文本編輯器或python控制檯中。
注意 並不是全部操做員都註冊顯示,例如縮放視圖對於重複這樣作是沒有用的,所以將其排除在輸出以外。要顯示運行的每一個運算符,請參閱顯示全部運算符