[干貨]Abaqus插件對話框二次開發,參數tgt和sel的設置方法

做過Abaqus二次開發的人,可能大多使用過RSG做出對話框,自動生成的腳本文件中,往往有3個py腳本,除了內核腳本,另外兩個是對話框腳本(xxxDB.py)和注冊腳本(xxx_plugin.py)。

對話框中所有的控件,都是在對話框腳本中創建出來的,它們很好辨認,比如:

文本框控件:AFXTextField()

1.png

復選按鈕控件:FXCheckButton()

2.png

單選按鈕控件:FXRadioButton()

3.png

可能有人對這些控件產生過好奇,在Abaqus幫助文檔中查詢過這些控件是如何創建的,以及它們的參數。

5.png

比如,文本框控件:

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)

可能一看就蒙了,創建一個控件要這么多的參數?

實際上,我們使用AFXTextField(p, ncols, labelText, tgt=None, sel=0, opts=AFXTEXTFIELD_STRING)就可以了,后面的一大堆一般用不上,使用默認值就行。在這些參數中,p是父控件,ncols是文本框寬度,labelText是文本框前面的字符串,opt為選項參數,這些都好理解,但tgt和sel卻并不容易理解。

6.png

tgt的意思是message target,消息目標。sel意思是selector,可以通俗的認為是message id,消息id。這兩個參數一般都是成對出現。

Abaqus插件對話框腳本中(有時也存在于注冊腳本中),tgt和sel這兩個參數的作用極為重要,它們相當于紐帶,把控件、方法和注冊腳本有效的聯系在一起。沒有它們,各個控件都是散沙,無法使用。

在這里,和大家梳理一下參數tgt和sel的設置方法。

一般來說,它們設置方式有三種。

第一種,tgt = 關鍵字, sel = 0或非0

采用這種設置方法的控件都有一個特征:以收集數據為目的。比如:

文本框:AFXTextField(p, ncols, labelText, tgtsel, opts)

按鈕:FXButton(p, text, ic, tgtsel, opts)

列表:AFXList(p, nvis, tgtsel, opts)

下拉列表:AFXComboBox(p, ncols, nvis, text, tgtsel, opts)

單選框:FXRadioButton(p, text, tgtsel, opts)

復選框:FXCheckButton(p, text, tgtsel, opts)

……

以最為常用的文本框為例,在對話框腳本中,可以這樣設置:

7.png

tgt = form.widthKw,sel = 0 。這是什么意思?

form.widthKw是關鍵字,但關鍵字是定義在注冊腳本中的。比如:

8.png

這里是在對話框腳本中,通過form.來調用注冊腳本中定義的關鍵字。

關鍵字有8種類型,每種類型的關鍵字,對應的構造方法也不一樣,比如這里的關鍵字是浮點類型的。這里不對關鍵字展開討論,以后另開帖子,專門說說這8種關鍵字。

tgt為浮點類型的關鍵字,那么sel則必然是0。

我們可以從幫助文檔Abaqus GUI Toolkit User's Guide中的6.5.10中找到下面這張表,可以看出,關鍵字如果為AFXFloatKeyword,ID則為0。

9.png

 

第二種:tgt = 類的實例對象, sel = AFXMode.ID_ACTIVATE

如果消息目標tgt為某類的實例對象,那么消息id一般都是AFXMode.ID_ACTIVATE

這種設置方式,是將這個控件與某個實例對象做關聯。

以RSG對話框生成器做出的文件選擇控件為例:

10.png

在腳本中,這個控件實際上是由文本框控件和后面的按鈕控件組合而成的。所以在腳本中,會自動生成以下的代碼

11.png

大概解釋一下:

25行,將某個類實例化,賦值給變量fileHandler

26-27行,創建水平框架布局控件,它將作為父控件,成為文本框和按鈕的參數。

28-29行,創建文本框控件,此處有tgt=關鍵字,sel=0

30行,創建圖標

31-32行,創建按鈕,將tgt=fileHandler(即25行中的實例對象),sel=AFXMode.ID_ACTIVATE

在這里,按鈕中的tgt和sel就是以第二種方式設置的。至于25行中的類是什么,RSG會在腳本下方自動創建,如下:

12.png

這里就不對這個類展開討論了,在我的《Abaqus 插件程序GUI的二次開發 初中級篇》課程中有詳細闡述。

這兩個參數如此設置,是什么意思呢?

以這里的按鈕控件為例,表示當我們單擊這個按鈕時,按鈕控件會向這個類的實例對象發送一條消息AFXMode.ID_ACTIVATE,從而會使這個類在外部運行,并啟動相應的對話框。

 

第三種:tgt = self, sel = 自定義ID

如果消息目標tgt設為self,那么消息id則設為某個自定義的ID,同時還需要配合FXMAPFUNC()方法,將消息id和某個方法,以某種消息類型結合在一起。

簡單來說,這種設置方式,是將這個控件與某方法做關聯。

以某個自定義的按鈕控件為例:

13.png

點擊按鈕后,會在消息區域打印出一行字符串:

14.png

腳本中是這樣的:

15.png

16.png

17.png

 

第35行,創建一個按鈕控件,tgt消息目標是self,也就是對話框實例本身,消息id是在第14行自定義的ID號。

除了這兩個參數外,在使用時,還需要配合使用FXMAPFUNC()方法,將消息類型、ID號和某個方法做關聯。

比如這里,用FXMAPFUNC()方法,將自定義ID和一個方法onMessage做關聯。那通過怎樣的方式能夠觸發這個方法呢?這里使用的是消息類型SEL_COMMAND,它的意思是單擊,也就是說,當我們點擊這個按鈕時,會通過自定義的ID這個紐帶,找到對應的方法。這里例舉的方法比較簡單,僅僅在abaqus窗口下方的消息區域輸出一行字符串。

以上就是參數tgt和sel的三種設置方式了。

很明顯,后兩種的設置方法,它的用途并不是創建某個控件,而是調用其他的功能,比如調用某個類的實例對象,或者為了調用某個方法。

這兩種方式都可實現與外部功能做關聯,那使用哪個更合適呢?

這個問題不好一概而論,不同的場合用不同的方式。如果某個功能是通過定義一個類來設定的,那么自然用第二種比較合適,比如這里的文件選擇對話框控件,它自身有一個類,通過將此類實例化,可以運行類中定義的功能。

如果某個功能是通過某個實例方法實現的,那么用第三種合適。這樣的設置方法比較直觀,實例方法中就直接可以編寫出我們想要的功能,比如這里的按鈕控件,點擊后,會執行方法中的語句,就是在消息區域打印出一行字符串。

當然,tgt和sel的設置,只是Abaqus GUI二次開發寶礦中的一角,還有更多的知識等待挖掘。

所以,推出個人的第三套課程——《Abaqus 插件程序 GUI的二次開發 高級篇》,本課程在《Abaqus插件程序GUI的二次開發 初、中級篇》的基礎上,對Abaqus插件對話框的GUI二次開發,做更深一步的探討。

在這里,tgt和sel的設置只是最基礎的知識。

課程不再局限于某個控件的創建和使用,而轉向于一些實用的、用RSG無法實現的功能。

我將Abaqus對話框中常見的、且必須通過腳本開發,方可實現的GUI,融合在七個插件中,以它們為案例,一一講述各自的實現過程。

本貼的內容,也以視頻演示的方式,作為第一講,免費播放。


Abaqus GUI二次開發三部曲:

Abaqus 主窗口GUI的二次開發

Abaqus插件程序GUI的二次開發 初、中級篇

Abaqus插件程序GUI的二次開發 高級篇

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

28
12
27