您好，歡迎使用藝術家腳本。我叫Sybren。
在這一集中，在之前的視頻中我們將訪問許多人要求的主題，即用戶界面。
我們創建了自己的運算符，然後將其轉換為Add-on。
在Blender中創建自己的用戶界面的基礎與創建類別幾乎相同。
您添加一些屬性。您向它添加一個功能，然後註冊該東西。
因此，在此視頻中，我們將介紹
接下來，將查找現有的UI代碼。
因此，如果您想知道，他們是怎麼做到的？之後，您將知道在哪裡找到它。
在製作自己的猴子網格面板之前，我們將研究面板的成分。還有什麼？
將在面板上添加運算子按鈕，然後對佈局進行一些調整。
然後，我們將添加場景對象屬性
對此。我們還將研究條件繪圖。
因為有時沒有活動對象，所以您將無法從活動對像中繪製屬性。
最後，我們將研究將自己的運算符添加到Blender中的現有菜單中。
在我們做自己的之前，讓我們看一下Blender中的現有面板。
在3D視圖中，按N以顯示面板。
接著讓我們看一下3D游標面板，右鍵單擊並選擇“編輯源”。
如果看不到“編輯源代碼”選項，請轉到“偏好設置”， “界面”並啟用“開發人員附加功能”
在Python工具提示中，然後它應該會顯示出來。
讓我們看看如果單擊它會發生什麼。
混合模式在角落告訴我們，但是由於我的縮放比例，它有點遠。
基本上，它告訴我們去文本編輯器，
然後我們應該找到帶有源文件。但是，有一種更簡單的方法。
如果拆分此窗口，並確保此處有文本編輯器，
則可以單擊“編輯源代碼”
那裡，您有文件。它會為您打開，甚至滾動到右行。
讓我們滾動瀏覽一下，看看我們能找到什麼。
如我們所見，將運算符作為一個類，它具有相同的命名方式。
它具有大寫的類別，然後是“面板類型”而不是“運算子類型”的“
PT”。 然後以小寫形式顯示其餘的標識符。
在這裡，您有面板類。
在這種情況下，是面板和那個運算子。你會期望
這裡是“bpy.type.panel”，而不僅僅是“panel”。
我們將稍等一下。讓我們尋找其他共同點。
首先是“bl標籤”，它是面板的名稱，用戶界面，然後是類別，區域類型和空格類型。
空間類型和區域類型描繪了它將在用戶界面中顯示的位置。
在這種情況下，我們正在研究3D視圖和區域類型是UI，
這意味著它在3D視圖中，而不在頁首或頁尾中。
然後類別是View這是此處標籤的名稱。
然後，我們將成為面板名稱的標籤。
運算子在哪裡一個執行功能，執行運算子的任務。
在這裡，我們有一個繪製函數來繪製面板。
繪圖本身是通過“self.layout”完成的
這是一個UI佈局實例。
您可以通過“幫助”找到它，然後找到“Python API參考”， 然後搜索UILayout，
一個詞。在那裡，您將找到所有可能的類描繪。
在本視頻中，我將繼續向您展示基礎知識，那將使您走得更遠。
現在，讓我們回到類描繪，
因為我們看到了
該面板在這裡，這與我們之前看到的有所不同。
就像我說的那樣，您會期望像“bpy.type.panel”這樣的東西，
而不僅僅是“panel”。
這是因為在此文件中，導入方式是不同的。
讓我們滾動到頂部，在這裡您可以從“bpy.type import”中看到
標頭，菜單和面板。因此，您只需鍵入“
panel”而不是“bpy.type.panel”，
它指的是同一件事。
我個人會說，對於這樣的輸入要非常小心。它可以節省您一些打字
這聽起來似乎是一件好事，但您閱讀代碼的方式要比編寫代碼的方式多。
我會一直優化以獲得代碼的可讀性和可理解性，而不是節省幾秒鐘的擊鍵。
唯一的時間
我將使用這樣的導入的地方非常清楚發生了什麼。
在這種情況下，它是Blender的用戶界面描繪，
而且只有一個標題，只有一個菜單，只有一個面板，
它們總是來自“bpy.types”。
因此，在這種情況下，我認為它可以接受。
不過總的來說，我會避免這種情況，並始終使用事物的全名
這樣一來，您就可以清楚知道它的來源。
現在，這已不復存在。讓我們進入並為猴子網格製作自己的面板。
讓我們看一下我們的插件代碼
我們上次離開的地方。
因此，這裡有“monkey grid.py”。
具有猴子網格運算符類以及註冊和註銷功能。
現在，要做到這一點，我們可以添加一個猴子網格面板。
因此，就像之前一樣，我們創建我們的類，並為其正確命名。
我保留類別“view 3D”，因為無論如何它都是一個View 3D面板。
我們必須去PT。我稱它為“猴子網格”然後擴展“bpy.type.panel”。
我只是將這些值從3D游標面板複製到“猴子”類別中
所以我們在那裡有我們自己的小標籤。我將其標記為“網格”。
然後，您唯一真正需要的就是Draw函數。
為了使其顯示為面板，它需要具有Draw功能，即使該功能沒有作用。
而且因為Python中的函數總是必須要有一些東西，
我在這裡輸入“pass”，這是Python代碼不執行任何操作的原因。
縮進“：”後的每個代碼塊，每個縮進博客都需要
那裡有一點文字，以確保
Python知道它是縮進的。
這就是為什麼他們使用“通過”關鍵字。
現在，剩下的唯一事情就是告訴Blender這個類首先存在，
這意味著要註冊它。
我們可以複製register和unregister類的函數調用，
然後放入我們的新類，就是這樣。
我們去Blender，走著瞧吧。
現在，我們要做的就是重新加載腳本。
轉到系統，重新加載腳本，您將看到“猴子”
在這裡彈出。此路線還使您可以右鍵單擊
然後添加到快速收藏夾。
您可以按Q，然後重新加載腳本，
將為您提供一種快速重新加載它們的方法。
當我們轉到“猴子”選項卡時，我們可以看到
我們的網格面板在這裡。還沒有任何東西。
當然，我們在那裡沒有畫任何東西，但至少它會顯示出來。
我們為運算子放置一個按鈕。
讓我們回到代碼，然後在“繪製”“self.layout”中
讓我們畫畫。要繪製運算符，請鍵入
“operator”，然後輸入運算符的ID名稱
你想在那裡。讓我們將其粘貼粘貼。
轉到Blender，重新加載腳本。
在那裡，您可以看到，網格面板中有一個猴子抓握按鈕，它確實有效。
要自描繪此按鈕，有幾種可能性。
讓我們來看一下它們。首先，我們可以更改按鈕上顯示的文本。
因此，我們將其稱為“默認網格”。
因為按下此按鈕，只會為我們提供默認屬性。保存文件，
回到Blender，重新加載腳本，現在它被稱為“默認網格”。
令人高興的是，如果我們搜索“猴子網格”，它在F3面板中仍稱為“猴子網格”，
因為那是運算子的名字。
只是在用戶界面的這個特定位置上，我們在按鈕上有不同的文字。
最後，我們可以為其添加一個圖標。
然後我們必須知道該圖標的名稱，因此您可以查看現有代碼以欺騙該圖標，
也可以激活圖標查看器插件。它與Blender捆綁在一起，但默認情況下未激活。
然後，在Python代碼中，
您會得到一個名為Icon Viewer的按鈕。
您可以單擊所需的圖標。說一隻猴子。這被複製到剪貼板上，
將其粘貼到此處，保存，然後返回Blender，
重新加載腳本，然後在其中找到圖標。
在工具提示中，您還可以查看說明。
您會看到它實際上將調用我們的運算符將所有默認參數。
讓我們對其進行調整併進行一些按鈕
這些參數使用特定值而不是默認值。
再說一次，我們回到源頭。
讓我們複製此調用，而不是僅僅擁有它，
我們可以說“props = self.layout.operator......”
讓我們將其更改為“Big Grid”，
“self.layout.operator”是一個返回某些內容的函數，
它返回的東西代表了運算符的屬性。
在這裡我們可以說“道具”。讓我們來看一下。
我們有“X數”，“Y數”和“大小”。
所以在這裡我們可以說“props.count X = 10”
和“count y =“，以及“size = 0.8”。
保存，回到Blender，重新加載腳本，我們有了一個新按鈕
在“大網格”上，將鼠標懸停在它上面時，您會看到它的那些參數值不同。
刪除猴子，
刪除後單擊“大網格”，當然會自動使用這些值。最重要的是，
也可以製作一個小的網格，然後我們可以使用更多按鈕。
所以對於小網格，
讓我們將X設置為1，將Y設置為1，並將大小保留為默認值。
所以我們在這裡不提。
保存，回到Blender，重新加載，然後我們還有一個小網格。
當然只有1。但是在Redo面板中，我們可以根據需要擴展它。
現在，您還可以看到，
能夠在該按鈕上設置文本的價值，因為它都是相同的運算符，但行為不同。
現在，還有一件事。
我不喜歡這些按鈕之間的間隔如何，因為它們基本上是
做同樣的事情。他們正在創建一個猴子網格，並且應該將它們真正分組在一起。
幸運的是，我們可以做到這一點通過將泥土放在圓柱中。
我能聽到您的詢問，但是Sybren，他們已經在專欄中了，您在說什麼？
好的，創建列的函數具有一些我們可以用來影響佈局的參數。
因此，讓我們再次看一下代碼。
現在，通過調用“self.layout.operator”繪製每個運算符，
我們可以對其進行更改。
我們可以先創建一列，
然後，我們不是在“self.layout”上調用operator，
而是在“col”上調用operator，
保存代碼，返回Blender，重新加載腳本，
您可以看到，它們已經被擠在一起了。
我們可以走得更遠。在此處添加“align = true”，
然後將它們完全按照我的意願將它們捏在一起。
因此，在運算符旁邊，您還可以繪製屬性
在面板上，這幾乎是您想要的任何屬性。
因此，您無法使用它來將遍布Blender用戶界面的這些屬性組合在一起，
但是你用很多
因此，對於您的特定工作流程， 您可以將它們添加到自己的面板中，使您的生活更輕鬆。
因此，讓我們採用兩個屬性，一個是Cycles的屬性。
假設週期中的視圖樣本數。
另外，我想有相對
到當前選定的對象。因此，讓我們在那裡繪製視圖可見性。
所以這裡的人就是其中之一
視圖樣本數，我們要添加的另一個屬性是此處，禁用視圖。
在轉到代碼之前，
讓我們看看Blender已經告訴了我們什麼。
您將鼠標懸停在視圖屬性上。在那裡，在工具提示的底部說
“bpy data scenes.cycle.preview示例”
這幾乎是我們想要的。
但是，如果要使用它，我們將在腳本中硬編碼名稱“場景”。
因此，如果我們重命名了“場景”，那麼我們的腳本已經損壞。
而且，當您使用多個場景時，它也將不再起作用。
因此，與其直接使用
就目前而言，即使在這種情況下，
它也可能起作用，但是我們將再次使用上下文，並獲得
當前場景為“context.scene”。因此，我們要顯示的屬性實際上是
“context.scene.cycle.preview示例”。
現在，讓我們看一下代碼。讓我們添加另一列。
然後我們“col.prop”為我們渲染該屬性。
它至少需要兩個參數。第一個是包含屬性的東西，然後是名稱屬性。
所以包含屬性的東西是
“context.scene.cycle”一切到最後一點。
然後名稱是“預覽樣本”。
保存，返回Blender，重新加載腳本，然後在其中“預覽示例10”。
所以我們可以改變這個，您可以在這裡看到它的變化不錯。
這表明我們擁有正確的屬性。所以在這裡，您還可以添加
這些文本和圖標參數。它們與運算符“col”的工作方式相同。
因此，為了使視頻保持一點點，
我會留給你玩。
現在，讓我們看一下我們要添加的第二個屬性，即活動對象的屬性。
我希望能夠控制視圖的可見性。那就是這個人
那裡說“bpy.data對象suzanne.pi視圖”
同樣，與場景一樣，我們不想僅針對Suzanne執行此操作。
我們要這樣做對於當前活動對象，表示“context.active對象”。
因此，我們要使用的屬性是“context.active object.hide視圖”
讓我們只複製我們擁有的內容。
將包含屬性的內容更改為“context.active對象”
並將屬性名稱更改為“隱藏視圖”。這應該渲染該屬性。
讓我們來看看。在Blender中，重新加載，
還有我們想要擁有的屬性。
現在，讓我們看看它是否有效。
妳去 它正在工作，但是有點奇怪，因為它消失了，
在這裡卻沒有。到底是怎麼回事？
事實證明，當您隱藏對象時，該對像不再處於活動狀態。
這意味著“context.active對象”將變為"無"，
而不是Suzanne。
"無"沒有屬性隱藏視圖。
因此，我們的代碼實際上正在引起問題。
看看我啟動Blender的終端。在這裡，你看，
底部的錯誤消息是我從中啟動Blender的終端。
它抱怨第82行的“monkey grid.py”
文件是我們剛添加的“col”，並且顯示錯誤
有一個參數的數據。因此，顯然，此參數稱為“數據”。
"功能數據"不支援到"無"的分配。
描述有點含糊，但與我剛才說的不符。
活動對象為無(none)，並且您不能繪製none的屬性。
因此，我們必須對此代碼添加一些保護，以使其始終有效。
我們知道“context.active對象”可以變成無。
因此，讓我們檢查一下。在這種情況下，
我們只添加一個標籤。
否則，我們將像以前一樣繪製屬性。
讓我們看看它現在如何工作。重新加載腳本，
就在那裡。它說“沒有活動對象”而不是出錯，所有代碼將繼續工作。
您可以說這是一個愚蠢的按鈕，因為它只起作用一次，您將是對的。
但我想有這個例子
向您展示問題出在哪裡以及如何解決。
這也是我覺得很重要的一件事的證明，這說明了為什麼不存在某些東西。
因此，現在，我們繪製文本“無活動對象”， 而不是完全不繪製屬性，而只是默默地跳過它，
向任何使用您的代碼的人表明為什麼該選項消失了。
我認為這很重要。這就是為什麼
無論如何我都想在這裡有這個例子，即使它沒有用。
您現在知道瞭如何繪製自己的屬性，
因此取決於您如何使其對您的特定工作流程有用。
在結束本視頻之前，我想向您展示一件事，這是在菜單中添加運算子。
鑑於我們到目前為止所看到的，這很容易。這就是為什麼
我把它作為最後一步。讓我們將猴子網格運算符添加到網格添加菜單中。
所以在這裡，我們有Add，Mesh，這會很好
如果在“猴子”下面，有一個猴子網格。
這意味著，我們必須將其添加到菜單中，並且有一個技巧。
我給你看。但是首先，我們必須知道它是哪個菜單。
您可以將鼠標懸停在“添加”上，它顯示“查看3DMT添加”，
您可能已經猜到MT代表“菜單類型”。
現在，問題是，子菜單不顯示此內容。
看，您不知道什麼是網格。
但是我們可以在Python控制台中環顧四周，看看是否仍然可以找到它。
它是一種類型
因此它是“bpy.types.View3D_MT”的一部分。
讓我們看看是否可以找到一些東西。
在那裡，“添加網格”。因此，這很有可能成為我們的菜單。
在這裡調用它只會給出一個錯誤。因此，我們不要這樣做。
但是至少，我們現在有了名稱“view 3D MT mesh add”
在“bpy.types”中。讓我們複製此內容，然後轉到“代碼”。
您可能已經猜到了，我們必須在寄存器和註銷函數中做一些事情，
但是這次是完全不同的比目前為止所見。
首先，我們必須創建自己的函數，該函數將繪製要添加到菜單的所有內容。
這樣看起來像這樣。
你能想到的名字
再次，“自我，背景”。現在，讓我們在其中添加“
pass”以使Python開心。 這個功能基本上會被稱為
在該面板的“繪製”功能之後。
因此，我們自己的面板具有帶有“self”和“context”的Draw函數，
將使用相同的“self”和相同的“context”來調用此函數。
因此，在我們的案例中，“自我”將引用該菜單。
現在，讓我們註冊和註銷此功能。這是通過獲取“bpy.types.view 3D
....”並說“ .append(mesh_add_menu_draw)”來完成的
相反的是“刪除”。因此，如果取消註冊，
將“刪除網格添加菜單繪製”。現在，在這裡放什麼？
這與面板相同。我們可以稱之為“self.layout.operator”
希望運算子的想法，並且這應該起作用。
讓我們保存並返回Blender，重新加載腳本， 添加網格，然後這裡有“猴子網格”。
它還沒有圖標。
但是現在，您知道瞭如何添加一個，因此我將其留給您。
現在，您已經了解瞭如何添加自己的面板，如何將自己的操作項添加到現有菜單。
但最重要的是
您已經看到瞭如何查看其他代碼。
因此，當您看到有趣的事情時，想知道他們是如何做到的，
您只需右鍵單擊“編輯源代碼”， Blender中的大多數用戶界面元素都是用Python編寫的，
然後就可以了。這就是“藝術家腳本”這一集的內容。
如果您有任何疑問或意見，請留在下面的評論中，我們很快會再見。