王曉輝 聶小華 常 亮
(中國飛機強度研究所 陜西 西安 710065)
隨著信息技術的發展,以有限元法[1]為主體的分析技術已成為產品結構設計過程中進行強度分析與性能評定的標準流程之一。按照工業軟件的適用范圍和功能需求來說,有限元軟件包含兩大類:通用軟件和專用軟件。其中通用有限元軟件大多屬于商業軟件,不僅價格昂貴和技術封鎖,且在實際應用中需要通過二次開發和不定期投資維護,因而開發自主產權的專用有限元軟件成為當下適合工程應用和規避科研風險的必然選擇。在功能劃分和組成方面,有限元軟件包含三部分:前處理、求解器和后處理。在整個分析過程中,前后處理占據了80%的時間,包括有限元模型的構建、物理屬性的定義及模型的可視化分析,整個過程緊密融合了用戶的需求。通過調研發現,目前國內外對于專用有限元軟件的開發,大多數集中于求解算法效率的提升和計算理論的推導等方面,而忽視了軟件用戶界面的友好交互性。設計一個友好交互的面向工程需求的圖形用戶界面GUI,將給有限元分析的前后處理工作帶來極大的方便,大大改善軟件的整體性能。GUI模塊作為開發其他專用軟件的起點,在軟件設計開發過程中扮演重要角色[2]。
傳統的有限元軟件開發往往更關注軟件功能的實現而忽略了軟件的用戶體驗。但隨著計算機軟硬件技術的飛速發展,用戶對于有限元軟件的可操作性、擴展性、跨平臺性、美觀性等方面提出了更高的要求。從而軟件用戶界面的設計也越來越受到開發人員的重視,但具體實現中難度也很大。比如ANSYS等商業軟件,每幾年都會通過用戶體驗反饋,進行版本提升,但提供的用戶界面至今仍未令人很滿意[3],尤其是在用戶友好性方面存在一定的局限性。再如主流的PATRAN、ABAQUS CAE等軟件,雖然擁有眾多的用戶群體,但由于特有的用戶界面設計,固化了用戶的使用習慣,使得國內工程應用依賴于國外軟件,一定程度上阻礙了國產自主CAE軟件的發展和推廣。在國內,早期的國內學者對軟件用戶界面的設計更多聚焦于界面設計原則和方法理論的闡述[4],對于程序實現層面的描述不是很多。對于有限元軟件的用戶界面的開發形式大致包括:基于商業軟件二次開發[5]、開源程序的封裝集成和[6-7]和針對特定應用場景的用戶界面程序設計與開發[8-10]。其中二次開發和開源程序封裝入門難度較大,開發成本較高;特定功能的軟件用戶界面設計開發需求明確,更能滿足用戶和計算系統多方面的要求。因此,通過自主開發構建跨平臺的友好的專用有限元軟件的圖形用戶界面成為了國產有限元軟件開發的最佳選擇。
經過調研發現,目前主流的GUI設計工具有MFC、Qt、wxWidget以及Gnome。其中MFC和Gnome不能跨平臺,不可移植。真正跨平臺的只有Qt和wxWidget,但是wxWidget目前缺乏專業維護和技術支持,無法滿足客戶需求。Qt作為一個非常優秀的面向對象的跨平臺圖形開發框架,有很強的擴展性,支持組件編程[12]。為此,本文結合航空結構強度分析流程,以用戶需求為中心[13-14],采用多窗口界面(MDI)設計方式,基于Qt技術在Windows操作系統下進行專用有限元軟件用戶界面的設計與開發,最后結合HAJIF基礎求解平臺驗證應用。
HAJIF全名為航空結構強度分析與優化設計軟件系統,它是由中國飛機強度研究所歷經了多年艱辛探索與突破,研制推出的一款國內航空領域功能最完善的自主CAE軟件系統,涵蓋了飛行器結構分析、優化設計、氣動彈性和強度校核等多種功能。尤其在最近幾年,HAJIF計算系統在求解規模效率方面有了很大提升,已廣泛應用于航空、航天、交通和武器裝備等領域[15-19]。
鑒于有限元軟件主要解決和分析大而復雜的科學和工程問題,具有復雜和異構的數據類型,從而要求其對用戶界面的設計必須遵循簡便性、直接性、可控性、美觀性、反饋性、標準化和一致性的原則,同時可面向多層次用戶需求。
為了更好地完成用戶界面的設計,通過調研當下商業有限元軟件界面的元素構成,結合有限元分析流程,有限元軟件系統的GUI除了考慮文件的管理、前處理、與求解器的數據關聯、后處理結果顯示等功能外,還需要添加常用工具、動態語言切換和幫助文檔等新的功能。同時,針對有限元軟件中多個功能模塊之間“高內聚,低耦合”的特性,為了有效降低軟件編制的復雜度,提高軟件模塊的維護性和可移植性,在此采用多窗口界面(MDI) 設計方式,實現單一主窗口和多個子窗口的數據管理[20-21]。其中,有限元軟件主界面的總體框架如圖1所示。
圖1 有限元軟件主界面總體框架圖
結合有限元分析流程,有限元軟件的基本操作步驟如圖2所示。在有限元軟件操作過程中,用戶可實時通過幫助菜單獲取幫助信息,通過語言設置菜單實現界面語言動態切換,通過快捷工具欄實現特殊操作功能等。
圖2 有限元軟件主要操作步驟
根據以上設計思路,可以得到有限元軟件主界面中的區域分配和界面元素布局,如圖3所示包含主窗口和基本的界面元素,如菜單欄、工具欄、狀態欄、數據視窗和模型樹等。
圖3 有限元軟件主界面區域分配和元素布局
本文在設計過程中主要采用Qt和C++作為開發環境。由于軟件用戶界面存在大量人機交互操作,因此對于數據通信效率有很高的要求。其中Qt的信號槽機制是類型安全且松散耦合的,已逐漸替代了傳統的回調函數,使得數據信號的傳遞更安全高效。此外,Qt 中集合了強大的類庫,具有豐富的API,可支持對圖形、文本、數據庫、網絡、I/O及視圖控件等的操作。因此在有限元軟件用戶界面設計中,Qt開發框架能夠很好地滿足軟件多接口、多響應、多元素、個性化設計和后期跨平臺應用的需求。
Qt包含了各種功能不同的模塊,每個模塊都有隸屬于自己的類庫。其中常用的模塊有QtCore(核心模塊)、QtGui(GUI模塊)、QtNetwork(網絡模塊)、QtOpenGL(OpenGL 3D模塊)、QtScript(腳本模塊)、QtXml(文本模塊)和QtSql(Sql數據庫模塊)。在程序實際設計中,主要用到的類包括QObject(Qt 對象模型的基類)、QApplication(界面程序控制和設置類)、QWidget和QDialog(組件容器類)、QMainWindow(中央窗口部件類)、QEvent(Qt事件響應類的基類)和QLayout(布局管理類)等[22]。Qt類庫組織結構合理,使用時需要按照各類的集成關系進行操作,本文所用到的Qt類屬結構如圖4所示。
圖4 Qt類結構示意圖
軟件主界面各個窗口都繼承自 QMainWindow類,主要功能是用于程序的運行顯示,其上的組件分別包含 CentralWidget、 QToolBar、 QMenuBar等子類,分別對應界面布局、菜單欄和工具欄等的顯示?;谝陨献宇愑挚梢耘缮鋈?QMenu(菜單),QAction(動作)、QGroupBox(組合框)和 QLabel(文本和圖的顯示)等子類,以實現子窗口中的特殊功能。
在軟件使用過程中,用戶界面最重要的功能就是處理人與軟件之間的信息傳遞及交互。其中,信號與槽作為Qt框架編程的基礎,屬于一種觀察者模式,用來實現對象間的數據響應和通信,操作簡便靈活,從而可以大幅提高軟件的人機交互效率。程序調用形式如下:
connect(sender,signal,receiver,slot)
其中:sender是發送信號的對象;signal是發送對象發出的信號;receiver是接收信號的對象;slot是接受對象在接收到信號之后需要執行的功能函數。
在有限元軟件系統界面中,除了常規的界面交互功能,還需要提供圖形可視化等功能。OpenGL作為繪制三維圖形的標準API,在圖形可視化方面應用廣泛。其中,QtOpenGL模塊依賴于OpenGL庫,經常被Qt應用程序用來繪制3D圖形[23]。在具體實現中,需要對QtOpenGL的QGLWidget類進行子類化,并且需要在QGLWidget中實現場景繪制虛函數,如void initiallizeGL(),void resizeGL()和void paintGL()等,也可以直接調用OpenGL命令開發窗口部件。
軟件界面語言的多樣化已成為評估軟件可用性的重要指標。其中Qt全面使用Unicode,對國際化支持十分成熟。如圖5所示,Qt linguist(又稱Qt語言家)是Qt的一個附加組件,很好地解決了Qt的國際化問題,方便了程序界面語言的翻譯,具體實現在4.4小節有所描述。
圖5 Qt linguist
如圖6所示,本文介紹的有限元軟件界面實現流程圖表明,基于Qt的有限元軟件界面的應用程序框架是自上向下的。以下重點描述幾個重要流程的具體實現過程。
圖6 有限元軟件界面實現流程圖
首先在主函數(main函數)中生成QApplication類的一個實例hjif_app,然后依照功能要求編輯主窗口類MainWindow的實例hjf_mainWin。軟件用戶界面的主入口程序如下:
int main(int argc, char*argv[])
{
QApplication hjf_app(argc, argv);
//產生一個QApplication類的實例hjf_app,
//可以為開發機構和程序命名
hjf_app.setOrganizationName("機構名稱");
hjf_app.setApplicationName("軟件名稱");
//定義Mainwindow類的對象hjf_mainWin,
//Mainwindow類以公有形式繼承QMainwindow類
MainWindow hjf_mainWin;
hjf_mainWin.setMinimumWidth(960);
//設置主窗口最小寬度
hjf_mainWin.setMinimumHeight(600);
//設置主窗口最小高度
hjf_mainWin.showMaximized();
//主窗口最大化
int ret=hjf_app.exec();
//顯示主窗口
return ret;
}
如圖7所示,有限元軟件的用戶界面主要包括6部分:(1) 菜單和工具欄,包括模型/結果導入、導出等;(2) 視圖控制欄,具有6個視圖操作和常規鼠標操作;(3) 模型樹/結果樹,包含了有限元模型的幾何、網格、材料、屬性等信息的層次目錄;(4) 視圖區,作為軟件界面中區域最大的部分,為用戶提供可視化窗口;(5) 功能窗口,主要作為各個功能模塊的數據輸入界面以及配置參數選項界面等;(6) 應用窗口部件類,可單獨使用,也可以作為功能窗口的子部件被使用。
圖7 有限元軟件界面組成部分
其中主要功能窗口部件包含對話框(QDialog)、基礎窗口部件(QWidget)和其他特殊窗口部件。主界面的程序實現如下:
MainWindow::MainWindow(QWidget*parent):
{
//窗體、對話框初始化
m_importThread=NULL;
//模型導入進程類
m_entityDlg=NULL;
//元素創建窗體
……
languageUpdate();
//更新語言
createMenus();
//創建菜單
createToolBars();
//創建工具欄
createStatusBar();
//創建狀態欄
createGuidTree();
//創建向導樹:模型樹和結果樹
iniMainLayout();
//初始化界面布局
showMaximized();
//主窗口最大化
//設置主窗口名稱和圖標
setWindowTitle(tr("%1%2").arg(TITLE).arg(VER));
setWindowIcon(QIcon(":/public/image/hajifui.png"));
setupSolPath();
//設置求解器路徑
setupEnvironment();
//設置環境變量
}
圖7中的5-功能窗口的程序實現主要代碼如下:
class LoadDlg:public QDialog
{
public:
QLineEdit*m_txtLoadFilePath;
//文本輸入框
QRadioButton *m_rdbDisForce;
//單選按鈕
QLabel *m_lblOutFormat;
//文本標簽
QComboBox *m_cmbOutLoadFormat;
//復選按鈕
ApplyEntityWgt *m_applyTargetEntity;
//實體組合部件
};
可以看出,LoadDlg是自定義設計的類,繼承自QDialog,其包含的控件有文本標簽、文本輸入框、單選/復選按鈕和應用組合部件。另外,應用組合部件類ApplyEntityWgt也是自定義設計的類,繼承自QWidget,對應的是圖7中所示的應用窗口部件,程序實現代碼如下:
class ApplyEntityWgt:public QWidget
{
public:
QPushButton*m_btnAddMember;
//點擊按鈕
QTextEdit *m_txtApplicationEntities;
//文本框
};
按照總體布局,在主窗口進行布局,并設置界面的主要通訊機制,程序代碼實現如下:
void MainWindow::iniMainLayout()
{
//初始化可視化控件
if (!m_glWidget)
m_glWidget=new GlWidget(this);
setCentralWidget(m_glWidget);
//將視圖區至于主窗口中心
//將向導樹區置于主窗口靠左區域
addDockWidget(Qt::LeftDockWidgetArea,m_wgtDockTree);
//將結果樹控件至于主窗口靠左區域
addDockWidget(Qt::LeftDockWidgetArea,m_resDockWgt);
//將模型樹樹控件至于主窗口靠左區域
addDockWidget(Qt::LeftDockWidgetArea,m_modelDockWgt);
//將工具欄控件至于主窗口頂部區域
addToolBar(Qt::TopToolBarArea,m_tlbFile);
addToolBar(Qt::TopToolBarArea,m_resultToolBar);
addToolBar(Qt::TopToolBarArea,m_tlbView);
//將元素選擇工具欄至于主窗口右部區域
addToolBar(Qt::RightToolBarArea,m_tlbSelect);
//界面操作和視圖模塊的信號與槽信號關聯
connect(m_glWidget,SIGNAL(nodePicked(SW_NODE*,int)),this,SLOT(onNodePicked(SW_NODE*,int)));
connect(m_glWidget,SIGNAL(elementPicked(SW_ELCONN*,int)),this,SLOT(onElementPicked(SW_ELCONN*,int)));
}
有限元軟件的操作往往需要工程師的參與和大量的圖形交互操作完成,在此使用Qt的信號與槽機制來實現操作對象間的數據通信。圖8形象地描述了基于Qt的信號槽機制所創建的有限元軟件用戶界面事件響應的基本流程。
圖8 有限元軟件界面交互事件響應流程
在軟件界面交互操作中,鼠標和鍵盤作為關聯用戶界面動作和視圖響應的最主要的輸入設備,響應事件主要包括鼠標移動、右鍵單擊、右鍵雙擊、左鍵單擊、左鍵雙擊、左鍵按下、左鍵彈出等。在Qt中,這些鼠標響應事件統一對應于QWidget中的虛擬方法[9],并且不同的鼠標事件具有不同的輸入參數。捕獲鼠標事件首先會覆蓋這些虛擬方法,以便鼠標事件可以在不同組件上發生時調用相應的事件。在實現代碼中,所有鼠標雙擊事件都將調用mouseMoveEvent()函數,必須通過輸入參數QMouseEvent * event(left,middle或right)的信息來區分。程序實現的主要代碼如下:
void GlWidget::mouseMoveEvent(QMouseEvent*event)
{
QPoint point=event->pos();
Qt::MouseButtons buttons=event->buttons();
if (buttons==Qt::LeftButton)
{ //處理左鍵單擊命令
}
else if (buttons==Qt::MidButton)
{ //處理中鍵單擊命令
}
else if (buttons==Qt::RightButton)
{ //處理右鍵單擊命令
}
else
{ //其他
}
}
最后,實現軟件用戶界面的語言切換,需要執行以下步驟:
1) 使用tr()完成對用戶可見的文本信息的封裝;
2) 構建一種用戶可執行語言切換的函數方法;
3) 對于主界面中的所有窗口部件,重寫系統響應事件changeEvent。
具體程序實現中,首先要創建語言文件ts,然后通過Qt linguist進行翻譯,接著編譯ts文件生成可直接調用加載的語言文件qm,最后應用QTranslator類加載生成的qm文件,以此來顯示程序所指定的語言類型,主要程序如下:
QTranslator translator;
//提供對文本輸出的國際化支持
translator.load(":/qm/main_widget_zh");
//加載語言文件
app.installTranslator(&translator);
//整個程序加載翻譯文件
若要實現多國語言實時切換,在調用installTranslator方法后,由于各窗體的狀態會發生變化,系統則會自動給每個窗體發送信號并告知changeEvent槽event產生,因此要在切換語言的每個窗體中重寫changeEvent事件,程序實現如下:
void MainWindow::changeEvent(QEvent*e)
{
QWidget::changeEvent(e);
switch (e->type())
{
case QEvent::LanguageChange:
retranslateUi(this);
break;
default:
break;
}
通過將本文所開發的面向用戶的具有友好操作性的專用有限元軟件用戶界面,與自主有限元計算系統HAJIF進行數據關聯,最終實現了軟件系統用戶界面與分析計算、前后處理及其各功能模塊的綜合集成,檢驗了上述開發方法的可行性。以下是基于本文方法所開發的HAJIF系統的幾個典型功能的子界面。
如圖9所示,通過實現 HAJIF系統的優化設計模塊的數據輸入界面,大幅提高了優化設計變量的創建效率,精簡了數據輸入量,改善了用戶操作體驗。
圖9 HAJIF系統優化設計模塊的數據輸入界面
圖10所示為HAJIF系統后處理功能模塊顯示界面。通過界面鼠標點擊三維模型云圖上的感興趣的節點或者單元,就可以實現以對話框和標識的形式進行數據展示,從而完成了有限元分析過程可視化,提高了工程人員在有限元分析過程中的參與感。
圖10 HAJIF系統后處理模塊數據顯示及查詢界面
在有限元軟件系統的設計開發中,不僅需要滿足系統的基本分析功能,更應注重系統的使用功能,即系統必須為用戶提供直觀、便捷、友好、靈活的用戶圖形界面,能夠滿足專用模塊的綜合集成和個性化定制開發需求。本文通過梳理有限元軟件的界面框架,結合有限元分析流程,采用MDI的設計方式,引入Qt圖形開發框架,開發出了一種基于Qt的專用有限元軟件GUI模塊。該模塊是針對航空結構強度分析與優化設計軟件系統HAJIF設計開發的,但同時也形成了有限元軟件GUI模塊高效的設計開發方法,除了應用于HAJIF系統,還在一些其他有限元軟件中得以應用,從而表明了該GUI模塊不僅具備了較高的友好交互性,還極大滿足了有限元軟件系統高效開發的集成需求。同時由于Qt組件開發的跨平臺特性,符合大型有限元軟件系統多平臺的開發要求,也為專用有限元軟件系統集成和定制開發提供了一條可借鑒的途徑。