上周學(xué)過(guò)了如何使用bpy添加網(wǎng)格,這次我們來(lái)學(xué)習(xí)如何把這個(gè)功能添加到Shift + A
菜單。
1. 添加Operator
添加Opertator其實(shí)就是添加一個(gè)類(lèi)(如果對(duì)什么是類(lèi)不清楚的話建議先閱讀參考資料中關(guān)于類(lèi)部分的內(nèi)容)复斥。
這里巢音,我們可以參考官方API里的示例(Basic Operator Example)疗疟。
不過(guò)我們可以寫(xiě)的更簡(jiǎn)單一些署鸡,新建一個(gè)空類(lèi):
import bpy #加載bpy,這個(gè)是必須有的
#添加一個(gè)Operator類(lèi)AddPyramid
class AddPyramid(bpy.types.Operator):
bl_idname = 'mesh.pyramid_add' #定義ID名稱(chēng)
bl_label= 'Pyramid' #定義顯示的標(biāo)簽名
2. 注冊(cè)O(shè)perator
上一步中新建Operator后绊诲,點(diǎn)擊運(yùn)行腳本(Run Script)
是沒(méi)有任何結(jié)果的送粱。在3D窗口單擊空格鍵搜索Pyramid
,不會(huì)得到任何結(jié)果:
這是為什么呢驯镊,因?yàn)槲覀冎皇切陆诉@個(gè)類(lèi)葫督,沒(méi)有注冊(cè)竭鞍,所以我們搜索就無(wú)法找到了。
下面我們把注冊(cè)類(lèi)的代碼加進(jìn)去:
import bpy #加載bpy橄镜,這個(gè)是必須有的
#添加一個(gè)Operator類(lèi)AddPyramid
class AddPyramid(bpy.types.Operator):
bl_idname = 'mesh.pyramid_add' #定義ID名稱(chēng)
bl_label= 'Pyramid' #定義顯示的標(biāo)簽名
#定義注冊(cè)類(lèi)方法
def register():
bpy.utils.register_class(AddPyramid)
#定義取消注冊(cè)類(lèi)方法
def unregister():
bpy.utils.unregister_class(AddPyramid)
#直接執(zhí)行py文件時(shí)偎快,注冊(cè)O(shè)perator。
if __name__ == '__main__':
register()
我們?cè)俅吸c(diǎn)擊運(yùn)行腳本(Run Script)
洽胶,在3D窗口單擊空格鍵搜索Pyramid
晒夹,就可以看到Pyramid
菜單出現(xiàn)了。
關(guān)于上面代碼的最后一句if __name__ == '__main__': register()
的作用姊氓,可以看看這個(gè)鏈接丐怯。
3. 添加方法
上一步中出現(xiàn)的Pyramid
菜單,我們點(diǎn)擊后是不會(huì)有任何動(dòng)作的翔横,因?yàn)槲覀兦懊嫘陆ǖ氖且粋€(gè)空類(lèi)读跷,沒(méi)有添加任何方法。
在前面的“新建網(wǎng)格物體”中禾唁,我們成功新建了一個(gè)四棱錐效览。我們把這部分的代碼復(fù)制進(jìn)去,并將其定義為Add_Pyramid
方法荡短,并為該方法添加一個(gè)height
參數(shù)(默認(rèn)值2)丐枉,用于控制該方法添加的四棱錐高度。代碼如下:
import bpy #加載bpy掘托,這個(gè)是必須有的
#定義添加網(wǎng)格的方法
def Add_Pyramid(height = 2):
h = height #四棱錐高度
#頂點(diǎn)
verts = [(1,1,0),
(-1,1,0),
(-1,-1,0),
(1,-1,0),
(0,0,h)]
#邊
edges = [(0,1),
(1,2),
(2,3),
(3,0),
(0,4),
(1,4),
(2,4),
(3,4)]
#面
faces = [(0,1,4),
(1,2,4),
(2,3,4),
(3,0,4),
(0,1,2,3)]
mesh = bpy.data.meshes.new('Pyramid_Mesh') #新建網(wǎng)格
mesh.from_pydata(verts, edges, faces) #載入網(wǎng)格數(shù)據(jù)
mesh.update() #更新網(wǎng)格數(shù)據(jù)
pyramid=bpy.data.objects.new('Pyramid', mesh) #新建物體“Pyramid”瘦锹,并使用“mesh”網(wǎng)格數(shù)據(jù)
scene=bpy.context.scene
scene.objects.link(pyramid) #將物體鏈接至場(chǎng)景
然后我們?cè)?code>AddPyramid類(lèi)中定義如何執(zhí)行Operator,關(guān)于execute
方法闪盔,可參考API弯院。
def execute(self, context):
Add_Pyramid() #調(diào)用Add_Pyramid()方法
return {'FINISHED'} #執(zhí)行結(jié)束后返回值
再次點(diǎn)擊運(yùn)行腳本(Run Script)
,在3D窗口單擊空格鍵搜索Pyramid
锭沟,并點(diǎn)擊Pyramid
菜單抽兆,就可以在場(chǎng)景中添加一個(gè)四棱錐了。
4. 添加到標(biāo)題欄菜單
#定義添加菜單方法
def menu_func(self, context):
self.layout.operator(AddPyramid.bl_idname, icon = 'MESH_CONE')
#定義注冊(cè)類(lèi)方法
def register():
bpy.utils.register_class(AddPyramid)
bpy.types.INFO_MT_mesh_add.append(menu_func) #添加菜單
#定義取消注冊(cè)類(lèi)方法
def unregister():
bpy.utils.unregister_class(AddPyramid)
bpy.types.INFO_MT_mesh_add.remove(menu_func) #移除菜單
operator
方法用法可參考API文檔族淮。
關(guān)于菜單用法可參考API文檔。
修改后的最終代碼如下:
import bpy #加載bpy凭涂,這個(gè)是必須有的
#定義添加網(wǎng)格的方法
def Add_Pyramid(height = 2):
h = height #四棱錐高度
#頂點(diǎn)
verts = [(1,1,0),
(-1,1,0),
(-1,-1,0),
(1,-1,0),
(0,0,h)]
#邊
edges = [(0,1),
(1,2),
(2,3),
(3,0),
(0,4),
(1,4),
(2,4),
(3,4)]
#面
faces = [(0,1,4),
(1,2,4),
(2,3,4),
(3,0,4),
(0,1,2,3)]
mesh = bpy.data.meshes.new('Pyramid_Mesh') #新建網(wǎng)格
mesh.from_pydata(verts, edges, faces) #載入網(wǎng)格數(shù)據(jù)
mesh.update() #更新網(wǎng)格數(shù)據(jù)
pyramid=bpy.data.objects.new('Pyramid', mesh) #新建物體“Pyramid”祝辣,并使用“mesh”網(wǎng)格數(shù)據(jù)
scene=bpy.context.scene
scene.objects.link(pyramid) #將物體鏈接至場(chǎng)景
#添加一個(gè)Operator類(lèi)AddPyramid
class AddPyramid(bpy.types.Operator):
bl_idname = 'mesh.pyramid_add' #定義ID名稱(chēng)
bl_label= 'Pyramid' #定義顯示的標(biāo)簽名
def execute(self, context):
Add_Pyramid() #調(diào)用Add_Pyramid()方法
return {'FINISHED'} #執(zhí)行結(jié)束后返回值
#定義添加菜單方法
def menu_func(self, context):
self.layout.operator(AddPyramid.bl_idname, icon = 'MESH_CONE')
#定義注冊(cè)類(lèi)方法
def register():
bpy.utils.register_class(AddPyramid)
bpy.types.INFO_MT_mesh_add.append(menu_func) #添加菜單
#定義取消注冊(cè)類(lèi)方法
def unregister():
bpy.utils.unregister_class(AddPyramid)
bpy.types.INFO_MT_mesh_add.remove(menu_func) #移除菜單
#直接執(zhí)行py文件時(shí),注冊(cè)O(shè)perator
if __name__ == '__main__':
register()
再次點(diǎn)擊運(yùn)行腳本(Run Script)
切油,在3D視圖按下Shift + A
蝙斜,在Mesh
子菜單下就可以找到Pyramid
選項(xiàng),點(diǎn)擊后可添加四棱錐澎胡。
還有一點(diǎn)就是孕荠,將鼠標(biāo)懸停在標(biāo)題欄菜單上娩鹉,可查看菜單名稱(chēng)。
修改添加和移除菜單代碼中的INFO_MT_mesh_add
為VIEW3D_MT_view
#定義注冊(cè)類(lèi)方法
def register():
bpy.utils.register_class(AddPyramid)
bpy.types.VIEW3D_MT_view.append(menu_func) #添加菜單
#定義取消注冊(cè)類(lèi)方法
def unregister():
bpy.utils.unregister_class(AddPyramid)
bpy.types.VIEW3D_MT_view.remove(menu_func) #移除菜單
然后我們就可以在View
菜單找到Pyramid
選項(xiàng)了稚伍。
5. 添加彈出菜單
import bpy #加載bpy弯予,這個(gè)是必須有的
#定義添加網(wǎng)格的方法
def Add_Pyramid(height = 2):
h = height #四棱錐高度
#頂點(diǎn)
verts = [(1,1,0),
(-1,1,0),
(-1,-1,0),
(1,-1,0),
(0,0,h)]
#邊
edges = [(0,1),
(1,2),
(2,3),
(3,0),
(0,4),
(1,4),
(2,4),
(3,4)]
#面
faces = [(0,1,4),
(1,2,4),
(2,3,4),
(3,0,4),
(0,1,2,3)]
mesh = bpy.data.meshes.new('Pyramid_Mesh') #新建網(wǎng)格
mesh.from_pydata(verts, edges, faces) #載入網(wǎng)格數(shù)據(jù)
mesh.update() #更新網(wǎng)格數(shù)據(jù)
pyramid=bpy.data.objects.new('Pyramid', mesh) #新建物體“Pyramid”,并使用“mesh”網(wǎng)格數(shù)據(jù)
scene=bpy.context.scene
scene.objects.link(pyramid) #將物體鏈接至場(chǎng)景
#添加一個(gè)Operator類(lèi)AddPyramid
class AddPyramid(bpy.types.Operator):
bl_idname = 'mesh.pyramid_add' #定義ID名稱(chēng)
bl_label= 'Pyramid' #定義顯示的標(biāo)簽名
def execute(self, context):
Add_Pyramid() #調(diào)用Add_Pyramid()方法
return {'FINISHED'} #執(zhí)行結(jié)束后返回值
#定義菜單
class AddMenu(bpy.types.Menu):
bl_idname = "OBJECT_whatever_menu"
bl_label = 'whatever'
def draw(self, context):
layout = self.layout
layout.operator("mesh.pyramid_add", text = 'Add Pyramid')
#定義添加菜單方法
#def menu_func(self, context):
# self.layout.operator(AddPyramid.bl_idname, icon = 'MESH_CONE')
#定義注冊(cè)類(lèi)方法
def register():
bpy.utils.register_class(AddPyramid)
bpy.utils.register_class(AddMenu)
# bpy.types.INFO_MT_mesh_add.append(menu_func) #添加菜單
#定義取消注冊(cè)類(lèi)方法
def unregister():
bpy.utils.unregister_class(AddPyramid)
bpy.utils.unregister_class(AddMenu)
# bpy.types.INFO_MT_mesh_add.remove(menu_func) #移除菜單
#直接執(zhí)行py文件時(shí)个曙,注冊(cè)O(shè)perator
if __name__ == '__main__':
register()
bpy.ops.wm.call_menu(name = AddMenu.bl_idname) #調(diào)用菜單
好了锈嫩,以上就是使用bpy添加菜單的方法了,其余將Operator
添加到各面板按鈕的方法可自行探索垦搬。