﻿WEBVTT

00:00:00.153 --> 00:00:03.718
您好，歡迎使用藝術家腳本。我叫Sybren。

00:00:03.718 --> 00:00:08.128
在這一集中，我將向您展示如何創建自己的運算符。

00:00:08.974 --> 00:00:16.554
到目前為止，我們僅創建了代碼片段，您可以使用它們，但是它們不是最用戶友好的。

00:00:16.554 --> 00:00:21.344
許多人問過創建菜單和按鈕以及自描繪面板和內容的方法。

00:00:22.138 --> 00:00:24.828
在本集中，我們將不再關注。

00:00:25.572 --> 00:00:31.232
但是，我們將考慮一個必要的第一步，即創建您的第一個運算符。

00:00:33.508 --> 00:00:36.183
我們將看看運算符的確切含義，

00:00:36.922 --> 00:00:42.627
然後，我們將了解如何創建自己的運算符以及如何使它成為現實。

00:00:42.627 --> 00:00:45.427
通過向其傳遞參數來提高靈活性。

00:00:45.427 --> 00:00:50.392
然後，我們通過將運算符限制為特定的上下文來得出結論。

00:00:50.392 --> 00:00:55.592
運算子(operator)應在菜單，按鈕和熱鍵以及應由其執行的代碼之間粘合。

00:00:56.364 --> 00:00:57.519
在第一集中

00:00:57.519 --> 00:01:04.299
我們已經通過將運算子從菜單和按鈕複製粘貼到我們自己的腳本中來與他們進行合作。

00:01:04.851 --> 00:01:06.321
運營商可以實施

00:01:06.321 --> 00:01:09.061
在Blender中使用C編程語言編寫。

00:01:10.127 --> 00:01:13.067
或者，它們當然可以用Python編寫。

00:01:13.187 --> 00:01:16.647
無論如何製造，它們都具有相同的成分。

00:01:18.009 --> 00:01:20.459
首先是一個標識符。因此，

00:01:20.459 --> 00:01:27.414
這就是您要放在“bpy.ops”之後的內容，例如，在此運算符中，它遠非完整，

00:01:29.090 --> 00:01:32.765
但是我們正在建立它。所以在這個例子中

00:01:33.154 --> 00:01:35.489
“bpy.ops.sfa.example”。

00:01:37.260 --> 00:01:40.325
這些總是形式“某些類別 句號 一個名稱”。

00:01:42.205 --> 00:01:47.065
最好選擇一個已經存在的類別，例如對像或網格或雕刻

00:01:49.399 --> 00:01:51.894
或任何適合您的運算子的東西。

00:01:52.872 --> 00:01:58.967
但是正如您所看到的，您也可以創建自己的。然後，我們有一個標籤。

00:01:58.967 --> 00:02:04.182
這就是菜單項和按鈕上顯示的內容，並以工具提示顯示說明。

00:02:05.395 --> 00:02:07.510
然後，一切都合併了

00:02:07.510 --> 00:02:10.420
類別(Class)這是我們待會兒要討論的問題。

00:02:12.358 --> 00:02:16.708
現在，僅將其視為收集運算子所有成分的鍋具。

00:02:19.919 --> 00:02:20.999
你可以看到

00:02:20.999 --> 00:02:22.784
該類以運算符命名。

00:02:22.784 --> 00:02:28.514
因此，我們用大寫字母表示類別，然後將OT作為運算符類型，

00:02:28.514 --> 00:02:30.179
然後其餘的標識符。

00:02:31.686 --> 00:02:37.481
到目前為止，我們已經看到了描述，但是還沒有看到實際的代碼。

00:02:37.481 --> 00:02:40.456
可以用不同的方式添加用於不同的目的。

00:02:40.456 --> 00:02:43.566
因此，這裡有從簡單到複雜的可能性。

00:02:43.566 --> 00:02:47.571
您具有“執行”，這是您放置的位置代碼的主要功能。

00:02:48.900 --> 00:02:52.895
如果要創建600隻猴子，則可以在這裡進行。

00:02:54.088 --> 00:02:57.078
執行功能也是直接從Python調用什麼。

00:02:58.505 --> 00:03:03.870
因此，如果您呼出運算子，例如“bpy.something.something”

00:03:03.870 --> 00:03:05.690
那就是被調用的函數。

00:03:06.099 --> 00:03:11.084
然後我們有“Invoke”，當調用菜單的運算子時調用此函數

00:03:11.333 --> 00:03:12.398
或一個按鈕。

00:03:13.223 --> 00:03:19.758
如果您想做一些額外的事情，在這種情況下，您想要有一些稍微不同的行為，

00:03:19.758 --> 00:03:24.943
那麼您可以在Invoke中執行此操作，然後從那裡調用Execute函數。

00:03:25.203 --> 00:03:28.288
現在，我們進入最複雜的模態模型。

00:03:29.023 --> 00:03:33.383
模態功能適用於需要較長時間運行的特殊運算子。

00:03:34.764 --> 00:03:42.614
這會收到各種事件在Blender中，
當您移動鼠標時，單擊按鈕，然後使用鍵盤，就可以了。

00:03:43.996 --> 00:03:48.546
諸如Blender Cloud，紋理瀏覽器或CG美洲獅之類的東西，

00:03:48.546 --> 00:03:51.661
Retopo，Float，已實施，就像這樣。

00:03:51.661 --> 00:03:57.146
如果所有這些之後，如果您不確定要使用哪個功能，請保持簡單，

00:03:57.146 --> 00:03:58.756
只需使用執行功能。

00:03:58.756 --> 00:04:03.946
如果結果證明您無法做自己想做的事，那麼您就有具體的理由

00:04:03.946 --> 00:04:08.736
看一些更複雜的東西。但在此之前，只需保持簡單即可。

00:04:09.982 --> 00:04:14.447
現在，讓我們將其轉換為可以使用的實際運算符。

00:04:14.447 --> 00:04:16.522
讓我們再製造一些猴子。

00:04:16.941 --> 00:04:19.761
讓我們從刪除不需要的內容開始。

00:04:19.761 --> 00:04:25.421
讓我們保持簡單，只是一個Execute函數。如果您看一下網格運算符，

00:04:29.592 --> 00:04:34.242
您會看到，它們以“bpy.ops網格原始猴子添加”或

00:04:34.242 --> 00:04:37.907
“bpy.ops網格原始ico球形添加”開頭

00:04:40.728 --> 00:04:45.438
因此，所有創建新網格對象的運算符都以“網格”開頭。

00:04:45.723 --> 00:04:48.233
因此，讓我們繼續這樣做。

00:04:49.327 --> 00:04:54.237
因此，ID名稱變為“mesh”，我們將創建一個猴子網格。

00:04:57.265 --> 00:05:01.870
猴子網格，標籤為“猴子網格”，工具提示將為

00:05:05.862 --> 00:05:07.812
“讓我們散播一些喜悅”

00:05:10.449 --> 00:05:13.974
然後我們必須更改類名稱，即成為類別

00:05:13.974 --> 00:05:14.914
“mesh_ot_monkey_grid”。

00:05:22.236 --> 00:05:27.926
Execute函數必須執行某些操作，但還必須告訴Blender一切是否成功。

00:05:30.936 --> 00:05:33.736
這樣一切都很好，您返回“完成”

00:05:36.872 --> 00:05:39.782
這告訴Blender代碼實際上執行得很好，

00:05:41.704 --> 00:05:46.574
但是也許您的運算子無法工作，也許是為了拉伸網格

00:05:46.819 --> 00:05:48.729
且網格沒有任何頂點。

00:05:50.801 --> 00:05:54.851
因此，在這種情況下，您將返回“已取消”。

00:05:55.032 --> 00:05:59.447
還有其他一些選項，它們都在菜單中進行了描述。

00:06:00.451 --> 00:06:04.936
去那裡您可以轉到“幫助”，然後轉到“Python API參考”，

00:06:05.000 --> 00:06:07.670
然後轉到有關“bpy.ops”的部分。

00:06:09.333 --> 00:06:12.203
所以我們假設
一切都會正常進行，

00:06:14.565 --> 00:06:16.075
我們將返回“完成”。

00:06:16.613 --> 00:06:21.993
現在，我們要做的就是將代碼放入此處以創建我們的猴子網格。

00:06:23.568 --> 00:06:29.543
因此，讓我們複製“腳本藝術家”第3章中的代碼，並將其放在此處。

00:06:29.543 --> 00:06:33.378
因此，這會在25行中創建600隻猴子，

00:06:35.935 --> 00:06:38.175
它們之間有一個Blender單元。

00:06:40.182 --> 00:06:44.622
運算子幾乎已經完成了。所以我們這裡有所有的成分。

00:06:46.292 --> 00:06:52.127
現在我們唯一需要做的就是告訴Blender這個操作項存在，這叫做註冊。

00:06:56.249 --> 00:06:59.559
幸運的是，這很簡單，我們只稱

00:06:59.559 --> 00:07:06.059
“bpy.utils.register_class”，然後是類的名稱，
在本例中為“網眼OT猴子網格”。

00:07:08.099 --> 00:07:09.079
為了對稱，

00:07:09.454 --> 00:07:13.419
還應該有取消註冊功能。這樣看起來像這樣。

00:07:15.123 --> 00:07:18.938
代替調用“註冊類”，它被稱為“取消註冊類”。

00:07:20.051 --> 00:07:25.981
基本上，它撤消了寄存器功能的作用，然後，我們快要完成了。

00:07:26.513 --> 00:07:28.673
如您所知，當您擁有

00:07:29.000 --> 00:07:32.635
這樣的函數，運行腳本時不會自動調用它。

00:07:34.974 --> 00:07:36.244
有一個小竅門。

00:07:38.042 --> 00:07:42.702
如果您在此處添加這樣的魔術，它看起來會有些奇怪。

00:07:44.862 --> 00:07:51.397
但是從根本上講，這意味著，如果運行此腳本，則應調用register函數。

00:07:53.341 --> 00:07:59.796
Blender可以通過多種方式訪問​​腳本，執行腳本，也可以從其他方式導入腳本，

00:08:03.786 --> 00:08:08.556
就像我們導入BPY一樣，其他代碼也可以導入此文件。

00:08:09.991 --> 00:08:15.941
因此，從其他位置導入與運行之間是有區別的。而且只有在運行時，

00:08:16.149 --> 00:08:20.614
它應該調用Register函數嗎，這就是這段代碼的作用。

00:08:24.235 --> 00:08:28.855
現在，我們可以做的就是將其命名為“monkey_grid.py”

00:08:30.638 --> 00:08:31.323
很好

00:08:32.913 --> 00:08:34.248
然後點擊播放。

00:08:36.486 --> 00:08:39.486
而且什麼也沒發生，這是一件好事。

00:08:41.432 --> 00:08:46.712
我們沒有看到任何錯誤消息，我們的代碼也沒有顯示任何消息。

00:08:47.131 --> 00:08:49.781
因此，這裡的沉默是件好事。

00:08:50.872 --> 00:08:53.947
那麼，讓我們看看現在會發生什麼，

00:08:55.478 --> 00:08:57.693
“bpy.ops.mesh.monkey_grid”

00:09:02.922 --> 00:09:05.737
好了 我們可以創建一個猴子抓地力。

00:09:05.954 --> 00:09:11.179
運算子在那裡。讓我們散佈一些喜悅。我們不要在這裡稱呼它。

00:09:11.179 --> 00:09:16.114
讓我們看看是否可以在F3菜單中找到我們的新運算符

00:09:17.582 --> 00:09:22.107
和猴子在一起，還有你的猴子網格。所以這真的很酷。

00:09:22.232 --> 00:09:24.437
按“輸入”執行它。如您所見，

00:09:25.777 --> 00:09:29.017
Blender現在凍結一隻正在製造600隻猴子。

00:09:29.469 --> 00:09:36.774
這就是當您執行需要花一些時間在Execute函數中
並且沒關係的事情時發生的情況。

00:09:36.774 --> 00:09:37.799
該代碼是

00:09:37.946 --> 00:09:43.796
此Blend文件。因此，讓我們看看創建新的Blend文件時會發生什麼。

00:09:47.355 --> 00:09:50.085
如您所見，運算子仍在那兒。

00:09:50.085 --> 00:09:52.130
已加載到Blender的內存中。

00:09:53.744 --> 00:09:56.324
它已註冊，並且一直在發送。

00:09:56.509 --> 00:10:01.024
現在，讓我們看看會發生什麼如果重新啟動Blender。

00:10:05.265 --> 00:10:08.415
現在，猴子網格運算符不再存在。

00:10:08.587 --> 00:10:16.622
這是因為，Blender不僅執行了可以在Blend文件中找到的所有腳本，
還必須告訴它首先執行該腳本。

00:10:17.638 --> 00:10:21.428
您必須確保文本文件的名稱以“.py”結尾，

00:10:23.205 --> 00:10:25.010
然後在文本菜單中，

00:10:25.462 --> 00:10:27.692
您可以選中已註冊複選框。

00:10:29.487 --> 00:10:32.517
現在，保存，重新啟動Blender，

00:10:36.687 --> 00:10:42.217
現在就在那裡。因此，讓我們玩得開心，並添加一些參數。

00:10:42.304 --> 00:10:47.014
添加立方體時，在此處左側看到的內容稱為“重做”面板。

00:10:47.747 --> 00:10:50.767
打開它時，您會看到不同的參數

00:10:51.295 --> 00:10:53.705
您可以設置。所以發生的是

00:10:53.705 --> 00:10:55.450
當您更改參數值時，

00:10:56.332 --> 00:11:00.637
Blenderoa會自動地按下“撤消”按鈕和重新執行運算子。

00:11:03.196 --> 00:11:08.421
這就是為什麼將其稱為“重做”面板的原因，因為它一直在重做。

00:11:08.421 --> 00:11:12.686
因此，讓我們向運算子添加對“重做”面板的支持。

00:11:12.686 --> 00:11:15.196
我們首先聲明我們想要的屬性。

00:11:16.397 --> 00:11:22.102
這將是X方向上的猴子數，Y方向上的猴子數以及猴子的大小。

00:11:23.362 --> 00:11:28.782
就像運算符位於“bpy.ops”中一樣，屬性也位於“bpy.props”中。

00:11:31.046 --> 00:11:34.251
再說一遍，如果你想要獲取更多信息，

00:11:34.251 --> 00:11:40.031
只需轉到“幫助”，“Python”，“API參考”，然後單擊“bpy.props”部分。

00:11:40.376 --> 00:11:42.451
我給你看看起來像什麼。

00:11:42.862 --> 00:11:46.557
我們稱其為“count x：bpy.props.IntProperty”。

00:11:54.878 --> 00:11:59.793
IN代表整數，表示整數，因為我們不能有半隻猴子。

00:12:01.150 --> 00:12:03.780
所以計數X必須是一或二或三，

00:12:05.264 --> 00:12:07.579
但永遠不能像2.5一樣。

00:12:09.195 --> 00:12:13.740
因此，它僅是整數，它聲明我們要擁有該屬性。

00:12:16.817 --> 00:12:20.822
這裡的“：”和此處的“=”符號之間有很大的區別。

00:12:25.333 --> 00:12:27.643
這將一個名稱設置為一個值，

00:12:28.237 --> 00:12:32.932
這是為了只需設置。我們必須設置“BL ID名稱”以匹配

00:12:33.846 --> 00:12:39.076
“猴子網格”使其工作。但是在這裡我們並沒有真正設置任何東西。

00:12:39.969 --> 00:12:45.284
我們只是向Blender聲明，這是一個IN屬性，請相應執行操作。

00:12:47.095 --> 00:12:50.325
您可以在此處添加一些參數以更改行為。

00:12:51.028 --> 00:12:53.793
首先，我們應該設置一個名稱。

00:12:54.973 --> 00:12:58.223
我們可以稱它為X。這可能有點神秘。

00:12:58.223 --> 00:13:00.573
但就目前而言，會做到的。

00:13:00.573 --> 00:13:02.428
我們可以添加一個描述，

00:13:03.772 --> 00:13:05.627
“X方向上的猴子數”。

00:13:09.619 --> 00:13:12.224
因此，我們將其複製到Y。

00:13:17.291 --> 00:13:22.266
將此Y命名為“Y方向上的猴子數”，並命名為任意大小，

00:13:23.436 --> 00:13:26.616
這就是另一個“bpy.props.FloatProperty”

00:13:30.856 --> 00:13:34.996
float代表浮點數，是僅十進制數字的技術術語。

00:13:40.844 --> 00:13:47.734
“名稱=大小”和“描述=每隻猴子的大小”，這為我們提供了屬性，但尚未使用。

00:13:54.367 --> 00:13:55.752
讓我們來看看

00:13:55.752 --> 00:13:58.837
在我們應該使用它們的Execute函數中。

00:13:59.014 --> 00:14:05.994
這個註釋必須走，因為我們不再在25行中創建600隻猴子，但是它非常靈活。

00:14:07.731 --> 00:14:10.541
因此，讓我們暫時將其刪除。

00:14:13.105 --> 00:14:15.230
現在我們必須訪問屬性。

00:14:15.940 --> 00:14:21.805
因此，我們已經聲明了它們，並且此“自我”使我們可以訪問實際值。

00:14:22.749 --> 00:14:27.899
“自我”是很重要的事情，在這裡我不會詳細介紹它所代表的含義。

00:14:28.886 --> 00:14:31.166
只要知道，如果您聲明

00:14:32.187 --> 00:14:37.357
此處的屬性為count X，
那麼您可以在此處以“self.count X”訪問它。

00:14:39.210 --> 00:14:40.575
所以猴子總數

00:14:42.812 --> 00:14:45.297
是X和Y方向上的猴子數，

00:14:47.727 --> 00:14:51.037
這裡的25是X方向上的猴子數。

00:14:59.272 --> 00:15:02.267
然後，剩下的就是設置一個大小，

00:15:03.876 --> 00:15:04.926
就是這樣。

00:15:05.235 --> 00:15:06.215
試一試吧。

00:15:09.796 --> 00:15:12.676
讓我們看看控制台中發生了什麼。

00:15:17.465 --> 00:15:22.300
在這裡，您可以看到我們的屬性，X，Y，大小，

00:15:22.367 --> 00:15:26.472
它們都等於0，因為我們尚未設置任何默認值。

00:15:34.890 --> 00:15:37.615
那裡，我們有我們的三隻猴子。

00:15:38.401 --> 00:15:43.771
在我們從視口實際調用它之前，讓我們設置一些明智的默認值。

00:15:49.778 --> 00:15:50.903
默認值為3。

00:15:53.526 --> 00:15:58.221
對於Y，默認值為2，我故意在其中選擇不同的值。

00:15:59.244 --> 00:16:00.344
這是默認值。

00:16:00.344 --> 00:16:05.609
因此，當有人單擊猴子網格按鈕或從F3列表中選擇它時，

00:16:05.930 --> 00:16:07.835
這將是他們所追求的。

00:16:07.835 --> 00:16:13.535
因為他們看到3x2的網格，所以他們立即知道需要進行哪些更改。

00:16:15.060 --> 00:16:22.360
如果他們想將3更改為4，只需將3更改為4，而不必考慮是X方向還是Y方向。

00:16:24.409 --> 00:16:29.939
因此，如果我們給他們相同的默認值，那麼他們將看不到它。

00:16:29.939 --> 00:16:32.044
然後，他們將擁有

00:16:32.044 --> 00:16:36.909
例如哪個方向是X，哪個方向是Y，我想更改哪個值。

00:16:36.983 --> 00:16:39.908
這就是為什麼我給他們獨特的價值觀。

00:16:45.758 --> 00:16:48.793
最後，默認大小，再次運行，

00:16:52.836 --> 00:16:54.196
刪除所有內容。

00:17:00.544 --> 00:17:03.014
在這裡，您可以看到默認值。

00:17:03.014 --> 00:17:07.319
當我們執行時沒有任何值時，它將僅使用默認值。

00:17:10.655 --> 00:17:12.305
與F3菜單相同。

00:17:13.745 --> 00:17:18.275
還剩下一個步驟，那就是獲得“重做”面板。我們有屬性，

00:17:19.696 --> 00:17:22.151
因此，Blender知道該去哪裡。

00:17:24.155 --> 00:17:27.475
只是還不知道我們是否支持該Redo面板。

00:17:29.622 --> 00:17:32.872
因此，讓我們告訴Blender我們這樣做。

00:17:35.686 --> 00:17:39.256
這是通過“bl選項”完成的。默認值為“註冊”，

00:17:41.156 --> 00:17:46.131
並且我們必須在其中添加“撤消”。這將為我們提供最終成分。

00:17:52.859 --> 00:17:53.804
這就對了，

00:17:55.460 --> 00:18:00.680
現在我們可以使它們變大和變小，甚至為它們提供無效的值。

00:18:01.741 --> 00:18:07.831
因此，為了讓人們使用起來愉快，我們應該對滑塊進行真正的設置，

00:18:08.082 --> 00:18:11.387
以便，您可以在此處選擇所有明智的值。

00:18:12.126 --> 00:18:14.321
幸運的是，這很簡單。

00:18:16.345 --> 00:18:18.415
我們可以設置最小值為1。

00:18:19.792 --> 00:18:24.652
因為創建0個猴子沒有意義。甚至更少地製造負數猴子。

00:18:26.544 --> 00:18:30.954
因此，讓我們嘗試1。現在將最大數量設置為10。

00:18:35.871 --> 00:18:38.576
我們可以對Y計數做同樣的事情，

00:18:39.241 --> 00:18:43.851
我們可以將大小0設置為最小值，將最大值設置為1。

00:18:54.474 --> 00:18:59.104
現在，我們可以拖拉，並且一切仍然美好而理智。

00:19:02.654 --> 00:19:07.584
您會看到，當這些數字增加時，它已經變得有點慢了。

00:19:08.036 --> 00:19:10.976
而且我們仍然無法達到之前的600

00:19:12.292 --> 00:19:16.712
即使我在此處鍵入100，它也會被最大程度地切斷。

00:19:18.006 --> 00:19:21.281
因此，這就是Blender具有軟限制的原因。

00:19:21.281 --> 00:19:26.776
硬限制是我們現在設置的，即屬性值的絕對限制。而軟限制是

00:19:27.681 --> 00:19:29.976
拖動時滑塊將執行的操作。

00:19:33.271 --> 00:19:39.751
因此，如果您想允許最大值大於10或大小大於1，但仍然需要這些限制

00:19:42.849 --> 00:19:47.584
作為滑塊的極限，您可以將最大值更改為柔和的最大值。

00:19:50.119 --> 00:19:56.004
我們現在擁有的最小值實際上是最小值，因為創建0個猴子沒有意義，

00:19:56.004 --> 00:20:01.904
負數的猴子是不可能的。同樣，創建一個負大小的猴子也是不可能的。

00:20:01.904 --> 00:20:04.904
因此，讓我們將最大值更改為soft。

00:20:15.123 --> 00:20:17.603
現在，拖動仍然是相同的，

00:20:20.563 --> 00:20:24.798
但是我們可以將其設置為創建比拖動更多的猴子。

00:20:27.286 --> 00:20:29.886
現在，讓我們回到該類聲明。

00:20:30.528 --> 00:20:34.738
我將進一步解釋有關類如何以初始方式工作的信息，

00:20:36.758 --> 00:20:39.328
我希望不要過多地討論技術細節。

00:20:40.276 --> 00:20:42.351
類使用稱為繼承的系統，

00:20:43.242 --> 00:20:46.772
就像與人一樣，它就像一個父子結構。

00:20:49.085 --> 00:20:53.980
因此，在這種情況下，“bpy.types.operator”是父級，

00:20:55.160 --> 00:20:58.500
並且“網格OT猴子網格”是訪問到子級。

00:20:59.230 --> 00:21:03.965
如果您問孩子一個您知道答案的問題，例如您想吃餅乾，

00:21:06.540 --> 00:21:09.310
當然，孩子會立即不答應父母。

00:21:11.327 --> 00:21:17.717
但是，如果您詢問稅收，那麼“媽媽，請幫助我，因為我什麼都不知道！”

00:21:18.301 --> 00:21:21.106
然後孩子順從這個問題交給父母。

00:21:23.941 --> 00:21:27.346
大致上，類與Python中的工作方式相同。

00:21:30.871 --> 00:21:32.881
我們可以不用“bl”選項。

00:21:33.740 --> 00:21:37.440
我們的孩子對此一無所知。於是Python問父母。

00:21:40.488 --> 00:21:46.153
當我們想擁有不同的東西時，我們可以為孩子和班級添加“bl”選項。

00:21:48.781 --> 00:21:52.321
然後，首先要問因此優先於父母的意願。

00:21:56.019 --> 00:22:01.059
因此，我們總是有幸運的孩子們得到他們想要的所有cookie。

00:22:02.335 --> 00:22:06.655
在結束本視頻之前，我還有兩件事我想告訴你。

00:22:07.600 --> 00:22:10.460
再次，我們看一下Execute函數。

00:22:11.077 --> 00:22:17.272
您會看到它獲得了一個上下文參數，這非常類似於我們之前所見的上下文。

00:22:18.414 --> 00:22:23.419
它給我們“上下文對象”，“context.scene”，“context.selected對象”，

00:22:25.976 --> 00:22:31.531
您之前在“
bpy.context”中看到的所有這些內容也都到達了這裡，

00:22:31.531 --> 00:22:35.041
但是隨後專門針對此運算符進行了本地化。

00:22:36.262 --> 00:22:43.082
因此，作為一般經驗法則，如果您有一個獲取上下文的函數，請使用該上下文。

00:22:43.358 --> 00:22:45.523
請勿使用“ bpy.context。

00:22:46.238 --> 00:22:52.088
因此，如果您想在此Execute函數中對所有選定的姿勢骨骼進行操作，

00:22:52.828 --> 00:22:55.608
您將使用“context.selected姿勢骨骼”。

00:23:01.506 --> 00:23:07.666
另一個功能是我想向您展示的第二件事，另一個獲得上下文的功能是Poll功能，

00:23:09.785 --> 00:23:15.895
而且它的編寫方式有點怪異，但只要從我這裡獲取，它就可以那樣工作。

00:23:27.580 --> 00:23:30.885
同樣，您在此函數中獲得一個上下文。

00:23:30.885 --> 00:23:35.310
但是，除了做類似的事情，而不是執行動作，

00:23:36.921 --> 00:23:40.161
此功能旨在檢查是否可以執行此操作。

00:23:42.376 --> 00:23:48.666
因此，每次應該在菜單中顯示此運算子時，Blender都會調用此輪詢功能，

00:23:50.503 --> 00:23:54.868
或作為面板上的按鈕。我可以告訴你這是如何工作的。

00:23:55.681 --> 00:24:01.671
現在，返回“true”，這意味著它始終像以前一樣被允許。 和以前一樣，

00:24:04.855 --> 00:24:06.875
它顯示在F3菜單中。

00:24:08.996 --> 00:24:10.681
當我碰到“假(False)”的時候，

00:24:12.799 --> 00:24:16.804
它永遠不會出現在任何地方，這是沒有用的。

00:24:17.171 --> 00:24:20.581
讓我們對其進行調整，使其更加有用。

00:24:22.246 --> 00:24:24.676
您可以在控制台中看到這裡

00:24:27.268 --> 00:24:31.903
我們有自動完成功能，這在Python控制台中很有意義。

00:24:32.333 --> 00:24:34.673
但是那個運算符不起作用

00:24:36.623 --> 00:24:41.883
在3D視口中，因為上下文錯誤。這也是我們可以做的事情。

00:24:44.053 --> 00:24:47.023
現在，當我再次將其更改為“真(true)”時，

00:24:51.333 --> 00:24:55.688
Monkey網格運算符也會在Python出現的上下文中顯示。

00:24:57.165 --> 00:25:01.855
它會顯示在Blender中的任何位置，這並不是正確的方法。

00:25:03.276 --> 00:25:06.881
讓我們再看一看在該上下文中的變量處。

00:25:09.224 --> 00:25:14.889
“Context.area”為您提供了Blender用戶界面中
當前處於活動狀態的區域。

00:25:16.386 --> 00:25:20.346
因此，在這種情況下，它將是控制台。

00:25:20.346 --> 00:25:24.181
但是如果鼠標在這裡，我們拉出3個菜單，

00:25:24.181 --> 00:25:29.996
然後突然之間，它的3D視口處於活動狀態，這裡就是“大綱視圖”。

00:25:29.996 --> 00:25:33.711
所以Blender中的每個區域都有自己的區域類型

00:25:33.950 --> 00:25:39.380
我們可以在“投票”功能中使用該功能，以確保它僅在該地區有效

00:25:42.644 --> 00:25:44.729
我不喜歡的一件事是猜測。

00:25:45.619 --> 00:25:52.274
因此，我們現在知道控制台的“區域類型”是“控制台”，但是在3D視口中是嗎？

00:25:52.274 --> 00:25:56.884
是“3D視圖”嗎？“3D_view”，是“3D視口”嗎？

00:25:59.527 --> 00:26:03.332
我不知道。因此，讓我們讓腳本告訴我們。

00:26:05.822 --> 00:26:09.532
我可以說“打印我的區域是context.area.type”

00:26:17.124 --> 00:26:21.999
讓我們看看將所有這些打印稿發送到的終端上發生了什麼。

00:26:24.894 --> 00:26:29.829
在這裡，您看到了控制台，然後立即看到它被稱為

00:26:30.235 --> 00:26:36.995
“我的區域是3D視圖”。當我在大綱視圖中執行此操作時，
“我的區域就是大綱視圖”。

00:26:37.404 --> 00:26:40.164
如果我在“屬性”面板中執行此操作，

00:26:40.288 --> 00:26:41.798
我的區域是屬性。

00:26:42.653 --> 00:26:47.923
這樣，您就可以使用這些打印語句來知道必須放置在什麼位置。

00:26:50.141 --> 00:26:54.301
現在，我們知道了要為3D視口使用哪個值。

00:26:54.301 --> 00:26:56.466
因此，讓我們開始吧。

00:26:56.466 --> 00:27:00.676
如果“context.area.type = view 3D”，則返回“true”。

00:27:05.033 --> 00:27:07.393
否則，我們可以返回“false”。

00:27:09.045 --> 00:27:11.515
讓我們看看它是如何工作的。

00:27:15.231 --> 00:27:17.391
在這裡，它仍然顯示。

00:27:18.809 --> 00:27:25.464
但是這裡不再存在，當然，這裡和那裡現在只顯示在我們希望它顯示的位置。

00:27:28.924 --> 00:27:30.039
最後一件事，

00:27:31.588 --> 00:27:36.118
這種結構，我也從經驗豐富的程序員那裡看到很多。

00:27:37.506 --> 00:27:39.301
它比必要的更為複雜。

00:27:40.731 --> 00:27:43.501
因為這個傢伙已經是對或錯的表達。

00:27:47.644 --> 00:27:54.389
因此，基本上，代碼在說什麼，如果這個東西的價值，這個選定的表達式，

00:27:56.940 --> 00:27:59.845
如果該事物的值為true，則返回true；

00:28:00.864 --> 00:28:03.819
如果該事物的值為false，則返回false。

00:28:05.345 --> 00:28:07.335
所以這基本上意味著

00:28:07.892 --> 00:28:11.037
返回該事物的值，您當然可以這樣寫。

00:28:19.609 --> 00:28:22.259
這就是“藝術家腳本”這一集的內容。

00:28:22.960 --> 00:28:28.795
如果您有任何疑問或意見，請在下面發表評論，我們很快會再見。