原文链接
我对配图和代码注释进行了补充。
正文
效果图
-
首先将下节中的代码保存在插件目录中,然后在 Blender 的 Add-on 选项中勾选
-
自定义的面板界面
-
自定义的菜单项
脚本代码与详细注释
import bpy
bl_info = {
"name" : "test",
"author" : "yl",
"description" : "",
"blender" : (3, 00, 0),
"version" : (0, 0, 1),
"location" : "",
"warning" : "",
"category" : "Yuelili",
"doc_url":"https://yuelili.com"
}
# 自定义操作类
class MESH_OT_cube_grid(bpy.types.Operator):
bl_idname="mesh.first_tool" # ID,必须。命名必须要带,以小写字母,下划线 数字(my_operator.my_class_name)
bl_label = "Test Operator" # 标签,显示名称
bl_options = {'REGISTER','UNDO'}
numX : bpy.props.IntProperty(name="X",default=3)
numY : bpy.props.IntProperty(name="Y",default=2)
@classmethod
def poll(cls,context):
return True
def execute(self,context):
print("execute")
for i in range(self.numX):
for j in range(self.numY):
bpy.ops.mesh.primitive_cube_add(size=2, location=(i * 10 , j * 10,0))
return {"FINISHED"}
def invoke(self, context, event):
self.execute(context)
print("invoke")
return {"FINISHED"}
# 自定义面板类
class VIEW3D_PD_cube_grid(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "My Panel"
bl_label = "Grid"
def draw(self,context):
self.layout.operator("mesh.first_tool") # 执行测试操作
col = self.layout.column(align = True)
col.prop(context.scene.cycles,"preview_samples") # Cycles 采样数
# 执行菜单项
def mesh_add_menu(self,context):
self.layout.operator("mesh.first_tool") # 执行测试操作
def register():
print("塔塔开")
# 注册
bpy.utils.register_class(MESH_OT_cube_grid)
bpy.utils.register_class(VIEW3D_PD_cube_grid)
bpy.types.VIEW3D_MT_mesh_add.append(mesh_add_menu) # 添加菜单项
...
def unregister():
print("已经不用再战斗了")
#注销
bpy.utils.unregister_class(MESH_OT_cube_grid)
bpy.utils.unregister_class(VIEW3D_PD_cube_grid)
bpy.types.VIEW3D_MT_mesh_add.remove(mesh_add_menu)
...