您好，欢迎使用艺术家脚本。我叫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编写的，
然后就可以了。这就是“艺术家脚本”这一集的内容。
如果您有任何疑问或意见，请留在下面的评论中，我们很快会再见。