[干貨](méi)Abaqus插件對(duì)話框二次開(kāi)發(fā),參數(shù)tgt和sel的設(shè)置方法
做過(guò)Abaqus二次開(kāi)發(fā)的人,可能大多使用過(guò)RSG做出對(duì)話框,自動(dòng)生成的腳本文件中,往往有3個(gè)py腳本,除了內(nèi)核腳本,另外兩個(gè)是對(duì)話框腳本(xxxDB.py)和注冊(cè)腳本(xxx_plugin.py)。
對(duì)話框中所有的控件,都是在對(duì)話框腳本中創(chuàng)建出來(lái)的,它們很好辨認(rèn),比如:
文本框控件:AFXTextField()

復(fù)選按鈕控件:FXCheckButton()

單選按鈕控件:FXRadioButton()
可能有人對(duì)這些控件產(chǎn)生過(guò)好奇,在Abaqus幫助文檔中查詢(xún)過(guò)這些控件是如何創(chuàng)建的,以及它們的參數(shù)。
比如,文本框控件:
AFXTextField(p, ncols, labelText, tgt=None, sel=0, opts=AFXTEXTFIELD_STRING, x=0, y=0, w=0, h=0, pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
可能一看就蒙了,創(chuàng)建一個(gè)控件要這么多的參數(shù)?
實(shí)際上,我們使用AFXTextField(p, ncols, labelText, tgt=None, sel=0, opts=AFXTEXTFIELD_STRING)就可以了,后面的一大堆一般用不上,使用默認(rèn)值就行。在這些參數(shù)中,p是父控件,ncols是文本框?qū)挾龋琹abelText是文本框前面的字符串,opt為選項(xiàng)參數(shù),這些都好理解,但tgt和sel卻并不容易理解。
tgt的意思是message target,消息目標(biāo)。sel意思是selector,可以通俗的認(rèn)為是message id,消息id。這兩個(gè)參數(shù)一般都是成對(duì)出現(xiàn)。
在Abaqus插件對(duì)話框腳本中(有時(shí)也存在于注冊(cè)腳本中),tgt和sel這兩個(gè)參數(shù)的作用極為重要,它們相當(dāng)于紐帶,把控件、方法和注冊(cè)腳本有效的聯(lián)系在一起。沒(méi)有它們,各個(gè)控件都是散沙,無(wú)法使用。
在這里,和大家梳理一下參數(shù)tgt和sel的設(shè)置方法。
一般來(lái)說(shuō),它們?cè)O(shè)置方式有三種。
第一種,tgt = 關(guān)鍵字, sel = 0或非0
采用這種設(shè)置方法的控件都有一個(gè)特征:以收集數(shù)據(jù)為目的。比如:
文本框:AFXTextField(p, ncols, labelText, tgt, sel, opts)
按鈕:FXButton(p, text, ic, tgt, sel, opts)
列表:AFXList(p, nvis, tgt, sel, opts)
下拉列表:AFXComboBox(p, ncols, nvis, text, tgt, sel, opts)
單選框:FXRadioButton(p, text, tgt, sel, opts)
復(fù)選框:FXCheckButton(p, text, tgt, sel, opts)
……
以最為常用的文本框?yàn)槔趯?duì)話框腳本中,可以這樣設(shè)置:
tgt = form.widthKw,sel = 0 。這是什么意思?
form.widthKw是關(guān)鍵字,但關(guān)鍵字是定義在注冊(cè)腳本中的。比如:
這里是在對(duì)話框腳本中,通過(guò)form.來(lái)調(diào)用注冊(cè)腳本中定義的關(guān)鍵字。
關(guān)鍵字有8種類(lèi)型,每種類(lèi)型的關(guān)鍵字,對(duì)應(yīng)的構(gòu)造方法也不一樣,比如這里的關(guān)鍵字是浮點(diǎn)類(lèi)型的。這里不對(duì)關(guān)鍵字展開(kāi)討論,以后另開(kāi)帖子,專(zhuān)門(mén)說(shuō)說(shuō)這8種關(guān)鍵字。
tgt為浮點(diǎn)類(lèi)型的關(guān)鍵字,那么sel則必然是0。
我們可以從幫助文檔Abaqus GUI Toolkit User's Guide中的6.5.10中找到下面這張表,可以看出,關(guān)鍵字如果為AFXFloatKeyword,ID則為0。
第二種:tgt = 類(lèi)的實(shí)例對(duì)象, sel = AFXMode.ID_ACTIVATE
如果消息目標(biāo)tgt為某類(lèi)的實(shí)例對(duì)象,那么消息id一般都是AFXMode.ID_ACTIVATE
這種設(shè)置方式,是將這個(gè)控件與某個(gè)實(shí)例對(duì)象做關(guān)聯(lián)。
以RSG對(duì)話框生成器做出的文件選擇控件為例:
在腳本中,這個(gè)控件實(shí)際上是由文本框控件和后面的按鈕控件組合而成的。所以在腳本中,會(huì)自動(dòng)生成以下的代碼
大概解釋一下:
25行,將某個(gè)類(lèi)實(shí)例化,賦值給變量fileHandler
26-27行,創(chuàng)建水平框架布局控件,它將作為父控件,成為文本框和按鈕的參數(shù)。
28-29行,創(chuàng)建文本框控件,此處有tgt=關(guān)鍵字,sel=0
30行,創(chuàng)建圖標(biāo)
31-32行,創(chuàng)建按鈕,將tgt=fileHandler(即25行中的實(shí)例對(duì)象),sel=AFXMode.ID_ACTIVATE
在這里,按鈕中的tgt和sel就是以第二種方式設(shè)置的。至于25行中的類(lèi)是什么,RSG會(huì)在腳本下方自動(dòng)創(chuàng)建,如下:
這里就不對(duì)這個(gè)類(lèi)展開(kāi)討論了,在我的《Abaqus 插件程序GUI的二次開(kāi)發(fā) 初中級(jí)篇》課程中有詳細(xì)闡述。
這兩個(gè)參數(shù)如此設(shè)置,是什么意思呢?
以這里的按鈕控件為例,表示當(dāng)我們單擊這個(gè)按鈕時(shí),按鈕控件會(huì)向這個(gè)類(lèi)的實(shí)例對(duì)象發(fā)送一條消息AFXMode.ID_ACTIVATE,從而會(huì)使這個(gè)類(lèi)在外部運(yùn)行,并啟動(dòng)相應(yīng)的對(duì)話框。
第三種:tgt = self, sel = 自定義ID
如果消息目標(biāo)tgt設(shè)為self,那么消息id則設(shè)為某個(gè)自定義的ID,同時(shí)還需要配合FXMAPFUNC()方法,將消息id和某個(gè)方法,以某種消息類(lèi)型結(jié)合在一起。
簡(jiǎn)單來(lái)說(shuō),這種設(shè)置方式,是將這個(gè)控件與某方法做關(guān)聯(lián)。
以某個(gè)自定義的按鈕控件為例:
點(diǎn)擊按鈕后,會(huì)在消息區(qū)域打印出一行字符串:
腳本中是這樣的:


第35行,創(chuàng)建一個(gè)按鈕控件,tgt消息目標(biāo)是self,也就是對(duì)話框?qū)嵗旧恚d是在第14行自定義的ID號(hào)。
除了這兩個(gè)參數(shù)外,在使用時(shí),還需要配合使用FXMAPFUNC()方法,將消息類(lèi)型、ID號(hào)和某個(gè)方法做關(guān)聯(lián)。
比如這里,用FXMAPFUNC()方法,將自定義ID和一個(gè)方法onMessage做關(guān)聯(lián)。那通過(guò)怎樣的方式能夠觸發(fā)這個(gè)方法呢?這里使用的是消息類(lèi)型SEL_COMMAND,它的意思是單擊,也就是說(shuō),當(dāng)我們點(diǎn)擊這個(gè)按鈕時(shí),會(huì)通過(guò)自定義的ID這個(gè)紐帶,找到對(duì)應(yīng)的方法。這里例舉的方法比較簡(jiǎn)單,僅僅在abaqus窗口下方的消息區(qū)域輸出一行字符串。
以上就是參數(shù)tgt和sel的三種設(shè)置方式了。
很明顯,后兩種的設(shè)置方法,它的用途并不是創(chuàng)建某個(gè)控件,而是調(diào)用其他的功能,比如調(diào)用某個(gè)類(lèi)的實(shí)例對(duì)象,或者為了調(diào)用某個(gè)方法。
這兩種方式都可實(shí)現(xiàn)與外部功能做關(guān)聯(lián),那使用哪個(gè)更合適呢?
這個(gè)問(wèn)題不好一概而論,不同的場(chǎng)合用不同的方式。如果某個(gè)功能是通過(guò)定義一個(gè)類(lèi)來(lái)設(shè)定的,那么自然用第二種比較合適,比如這里的文件選擇對(duì)話框控件,它自身有一個(gè)類(lèi),通過(guò)將此類(lèi)實(shí)例化,可以運(yùn)行類(lèi)中定義的功能。
如果某個(gè)功能是通過(guò)某個(gè)實(shí)例方法實(shí)現(xiàn)的,那么用第三種合適。這樣的設(shè)置方法比較直觀,實(shí)例方法中就直接可以編寫(xiě)出我們想要的功能,比如這里的按鈕控件,點(diǎn)擊后,會(huì)執(zhí)行方法中的語(yǔ)句,就是在消息區(qū)域打印出一行字符串。
當(dāng)然,tgt和sel的設(shè)置,只是Abaqus GUI二次開(kāi)發(fā)寶礦中的一角,還有更多的知識(shí)等待挖掘。
所以,推出個(gè)人的第三套課程——《Abaqus 插件程序 GUI的二次開(kāi)發(fā) 高級(jí)篇》,本課程在《Abaqus插件程序GUI的二次開(kāi)發(fā) 初、中級(jí)篇》的基礎(chǔ)上,對(duì)Abaqus插件對(duì)話框的GUI二次開(kāi)發(fā),做更深一步的探討。
在這里,tgt和sel的設(shè)置只是最基礎(chǔ)的知識(shí)。
課程不再局限于某個(gè)控件的創(chuàng)建和使用,而轉(zhuǎn)向于一些實(shí)用的、用RSG無(wú)法實(shí)現(xiàn)的功能。
我將Abaqus對(duì)話框中常見(jiàn)的、且必須通過(guò)腳本開(kāi)發(fā),方可實(shí)現(xiàn)的GUI,融合在七個(gè)插件中,以它們?yōu)榘咐灰恢v述各自的實(shí)現(xiàn)過(guò)程。
本貼的內(nèi)容,也以視頻演示的方式,作為第一講,免費(fèi)播放。
Abaqus GUI二次開(kāi)發(fā)三部曲:
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺(tái)客服
TOP




















