菜鳥(niǎo)學(xué)bpy(二)添加菜單

上周學(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é)果:

Menu_Search_Fail.png

這是為什么呢驯镊,因?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)了。

Menu_Show.png

關(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è)四棱錐了。

Operator_Executable.png


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)擊后可添加四棱錐澎胡。

Menu_Added.png

還有一點(diǎn)就是孕荠,將鼠標(biāo)懸停在標(biāo)題欄菜單上娩鹉,可查看菜單名稱(chēng)。

Hover_View.png

修改添加和移除菜單代碼中的INFO_MT_mesh_addVIEW3D_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)了稚伍。

Menu_View_Added.png

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添加到各面板按鈕的方法可自行探索垦搬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呼寸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猴贰,更是在濱河造成了極大的恐慌对雪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米绕,死亡現(xiàn)場(chǎng)離奇詭異瑟捣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)义郑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)非驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芙扎,“玉大人戒洼,你說(shuō)我怎么就攤上這事允华。” “怎么了磷蜀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵褐隆,是天一觀的道長(zhǎng)庶弃。 經(jīng)常有香客問(wèn)我歇攻,道長(zhǎng)缝呕,這世上最難降的妖魔是什么斧散? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮栈暇,結(jié)果婚禮上色迂,老公的妹妹穿的比我還像新娘。我一直安慰自己诈悍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布苦酱。 她就那樣靜靜地躺著,像睡著了一般耙册。 火紅的嫁衣襯著肌膚如雪帝际。 梳的紋絲不亂的頭發(fā)上弃揽,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音娜庇,去河邊找鬼塔次。 笑死,一個(gè)胖子當(dāng)著我的面吹牛名秀,可吹牛的內(nèi)容都是我干的励负。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匕得,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼继榆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耗跛,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裕照,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后调塌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晋南,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年羔砾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了负间。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姜凄,死狀恐怖政溃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情态秧,我是刑警寧澤董虱,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響愤诱,放射性物質(zhì)發(fā)生泄漏云头。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一淫半、第九天 我趴在偏房一處隱蔽的房頂上張望溃槐。 院中可真熱鬧,春花似錦科吭、人聲如沸昏滴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谣殊。三九已至,卻和暖如春规伐,著一層夾襖步出監(jiān)牢的瞬間蟹倾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工猖闪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲜棠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓培慌,卻偏偏與公主長(zhǎng)得像豁陆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吵护,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在進(jìn)入正文之前盒音,先嘮叨一下我最近學(xué)習(xí)bpy的一些心得: Python基礎(chǔ)知識(shí) 對(duì)python基礎(chǔ)知識(shí)有所...
    NGE閱讀 5,224評(píng)論 3 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • Java基礎(chǔ)常見(jiàn)英語(yǔ)詞匯(共70個(gè))['?bd?ekt] ['?:rientid]導(dǎo)向的 ...
    今夜子辰閱讀 3,265評(píng)論 1 34
  • 早上起來(lái),看了盆友圈的一個(gè)信息馅而,心情就不好起來(lái)了祥诽,在那一刻,我開(kāi)始攻擊樂(lè)樂(lè)瓮恭,覺(jué)得她哪哪都不好雄坪,是的,我不夠好屯蹦,我的...
    陽(yáng)光灑灑閱讀 241評(píng)論 0 0
  • 昨天大概是比較忙碌的一天维哈,一是期待已久的隸書(shū)班開(kāi)課,我特意選擇了白天的課登澜,空閑時(shí)間聽(tīng)課阔挠,晚上抓緊時(shí)間練習(xí);二是...
    熹喜閱讀 540評(píng)論 2 2