許向彥,艾 森,王立凱
(中國(guó)飛機(jī)強(qiáng)度研究所,陜西 西安 710065)
航空典型金屬結(jié)構(gòu)強(qiáng)度校核理論與算法經(jīng)過(guò)多年的研究與發(fā)展,現(xiàn)已趨于成熟[1]。然而,由于缺乏對(duì)理論算法的軟件化與工具化,相關(guān)設(shè)計(jì)與分析人員目前仍通過(guò)傳統(tǒng)的Excel等手工方法進(jìn)行強(qiáng)度校核計(jì)算,這存在以下問(wèn)題:(1)無(wú)法進(jìn)行批量化處理;(2)有限元模型數(shù)據(jù)的未充分利用導(dǎo)致用戶需要手工填寫(xiě)的校核參數(shù)過(guò)多;(3)校核結(jié)果缺乏圖形化顯示;(4)校核中相關(guān)系數(shù)的確定缺乏數(shù)據(jù)庫(kù)支持。
航空結(jié)構(gòu)強(qiáng)度分析與優(yōu)化設(shè)計(jì)軟件系統(tǒng)(HAJIF)[2]是中國(guó)飛機(jī)強(qiáng)度研究所研制推出的國(guó)內(nèi)航空領(lǐng)域功能全面的自主CAE軟件系統(tǒng),其功能涵蓋了靜力、屈曲、模態(tài)、優(yōu)化等通用功能以及優(yōu)化等專用求解功能。
針對(duì)傳統(tǒng)校核方式存在的問(wèn)題,本文依托HAJIF平臺(tái),利用其模型處理能力與圖形化顯示能力,設(shè)計(jì)了金屬結(jié)構(gòu)強(qiáng)度校核的軟件化流程,豐富了強(qiáng)度校核結(jié)果的展示形式,形成了批量化處理強(qiáng)度校核任務(wù)的能力。同時(shí),考慮到與HAJIF系統(tǒng)的兼容,基于目前主流的GUI設(shè)計(jì)工具Qt設(shè)計(jì)開(kāi)發(fā)了金屬?gòu)?qiáng)度校核模塊前后置界面,基于SQLite構(gòu)建了曲線數(shù)值庫(kù),并基于python-docx實(shí)現(xiàn)了報(bào)告的自動(dòng)生成,提高了強(qiáng)度設(shè)計(jì)與分析人員的工作效率,具備一定的工程實(shí)用價(jià)值。
金屬結(jié)構(gòu)強(qiáng)度校核模塊由六大功能區(qū)組成,分別是校核類型選擇區(qū)、破壞模式與組數(shù)據(jù)準(zhǔn)備區(qū)、校核參數(shù)定義區(qū)、校核工況定義區(qū)、校核結(jié)果顯示區(qū)、校核輔助功能區(qū)(如圖1所示)。
圖1 金屬結(jié)構(gòu)強(qiáng)度校核主界面
金屬結(jié)構(gòu)強(qiáng)度校核模塊支持長(zhǎng)桁拉伸、蒙皮拉伸、長(zhǎng)桁壓損、蒙皮壓縮屈曲、蒙皮皺曲、釘間蒙皮屈曲、蒙皮剪切屈曲、蒙皮拉剪復(fù)合屈曲、蒙皮壓剪復(fù)合屈曲、型材歐拉失穩(wěn)等10種破壞模式計(jì)算。依托HAIJF平臺(tái)所設(shè)計(jì)的校核流程如圖2所示。
圖2 強(qiáng)度校核流程圖
其中,校核組利用HAJIF系統(tǒng)中的組功能進(jìn)行創(chuàng)建,校核類型支持許用值計(jì)算與裕度計(jì)算。破壞模式中包含10種常見(jiàn)模式,材料參數(shù)可以直接從有限元模型中提取,無(wú)需用戶填寫(xiě)。每種破壞模式的計(jì)算參數(shù)有所不同,當(dāng)填寫(xiě)完所有參數(shù)后,可新建校核工況加入校核列表。用戶根據(jù)自己需要完成所有校核任務(wù)的創(chuàng)建工作后,可批量提交至后臺(tái)計(jì)算程序進(jìn)行計(jì)算,前后置界面與后臺(tái)利用json文件進(jìn)行數(shù)據(jù)交互。計(jì)算完成后,通過(guò)兩種方式給用戶呈現(xiàn)計(jì)算結(jié)果,分別為圖形化顯示與值顯示,用戶確認(rèn)數(shù)據(jù)無(wú)誤后即可生成校核報(bào)告。
金屬結(jié)構(gòu)強(qiáng)度校核模塊的界面實(shí)現(xiàn)[3-6]主要用到了QWidget與QLayout兩個(gè)基類所派生的多個(gè)子類,比如QPushButton類、QGroupBox類、QTabWidget類、QDialog類、QLable類、QLineEdit類、QGridLayout類、QStackedLayout類等。
(1)QWidget類是所有用戶界面對(duì)象的基類,Qt基本上所有的UI類都是由QWidget派生而來(lái)。
(2)QLayout類作為布局類的基類,是抽象類,提供多種接口函數(shù)給繼承類。QLayout類及其常用派生類的繼承關(guān)系如圖3所示。
圖3 QLayout類繼承關(guān)系圖
(3)QPushButton類是一個(gè)按鈕類,通過(guò)QPushButton類利用Qt的信號(hào)槽機(jī)制可以實(shí)現(xiàn)按鈕功能,完成業(yè)務(wù)需求。
(4)QGroupBox類繼承自QWidget類,通常帶有一個(gè)邊框和一個(gè)標(biāo)題欄,可以作為容器部件來(lái)使用。
(5)QTabWidget類提供了一堆選項(xiàng)卡式窗口部件。一個(gè)選項(xiàng)卡部件提供一個(gè)標(biāo)簽欄和一個(gè)頁(yè)面區(qū),頁(yè)面區(qū)用于顯示與該標(biāo)簽關(guān)聯(lián)的相關(guān)內(nèi)容。
(6)QDialog類代表對(duì)話框,對(duì)話框一般用來(lái)實(shí)現(xiàn)那些只是暫時(shí)存在的用戶界面。
(7)QLineEdit類用來(lái)獲取用戶輸入。
(8)QGridLayout類是一個(gè)布局類,用來(lái)對(duì)各子部件網(wǎng)格化布局。
(9)QStackedLayout類屬于布局管理器中的一個(gè)常用類,與QTabWidget類類似,該類用來(lái)切換不同的界面。
利用上述類可以完成金屬結(jié)構(gòu)強(qiáng)度校核模塊的界面構(gòu)建,軟件主界面的布局及構(gòu)建程序如下:
void sCheckDlg::initUI(){
QVBoxLayout *mainLayout = new QVBoxLayout(this);
//主界面垂直布局
QGroupBox *basicInfoGroup = createBasicGroup(this);
//創(chuàng)建校核類型選擇區(qū)子界面
QTabWidget *m_tabWidget = new QTabWidget(this);
//創(chuàng)建選項(xiàng)式窗口部件
m_tabWidget->addTab(createTableMentalWidget(this),tr(“Mental”));
//增加金屬標(biāo)簽頁(yè)
m_tabWidget->addTab(createTableMatWidget(this),tr(“Material”));
//增加材料標(biāo)簽頁(yè)
QGroupBox *resultInfoGroup = createResultGroup(this);
//創(chuàng)建校核結(jié)果顯示區(qū)子界面
QGroupBox *buttonGroup = createButtonGroup(this);
//創(chuàng)建輔助功能區(qū)子界面
QVBoxLaout *layTabRes = new QVBoxLayout();
//校核類型選擇區(qū)與主操作區(qū)進(jìn)行垂直布局
layTabRes->addWidget(basicInfoGroup);
layTabRes->addWidget(m_tabWidget);
QHBoxLayout *layTabStatus = new QHBoxLayout();
//對(duì)layTabRes與校核結(jié)果顯示區(qū)水平布局
layTabStatus->addLayout(layTabRes,8);
layTabStatus->addLayout(resultInfoGroup,2);
mainLayout->addLayout(layTabStatus);
//對(duì)layTabStatus與輔助功能區(qū)垂直布局
mainLayout->addWidget(buttonGroup,0,Qt::AlignRight);
//使輔助功能區(qū)靠右
setLayout(mainLayout);
//將mainLayout布局設(shè)置為主顯示
}
金屬結(jié)構(gòu)強(qiáng)度校核模塊的主操作區(qū)(破壞模式與組數(shù)據(jù)準(zhǔn)備區(qū)、校核參數(shù)定義區(qū)、校核工況定義區(qū))界面主要利用QStackedLayout類、QRadioButton類以及QGroupBox類實(shí)現(xiàn)。QRadioButton通過(guò)利用信號(hào)槽機(jī)制實(shí)現(xiàn)10種破壞模式的切換,QStackedLayout類用來(lái)存儲(chǔ)10種破壞模式的子界面,QGroupBox類用來(lái)實(shí)現(xiàn)其中具體一種破壞模式的界面。利用QStackedLayout類存儲(chǔ)10種破壞模式界面的程序?qū)崿F(xiàn)如下:
QGroupBox *m_stackedGroup = new QGroupBox(this);
QStackedLayout *m_stackedLayout = new QStackedLayout(m_stackedGroup);
m_stackedLayout->insertWidget(DestructionModeMark::LongStretch,createLongStretchWgt(m_stackedGroup));
//插入長(zhǎng)桁拉伸界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinStretch,createSkinStretchWgt(m_stackedGroup));
//插入蒙皮拉伸界面
m_stackedLayout->insertWidget(DestructionModeMark::LongCompress,createLongCompressWgt(m_stackedGroup));
//插入長(zhǎng)桁壓縮界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinInstable,createSkinInstableWgt(m_stackedGroup));
//插入蒙皮壓縮屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinWrinkle,createSkinWrinkleWgt(m_stackedGroup));
//插入蒙皮皺曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinNailsInstable,createSkinNailsInstableWgt(m_stackedGroup));
//插入釘間蒙皮屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinShearBuck,createSkinShearBuckWgt(m_stackedGroup));
//插入蒙皮剪切屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinStrtchShearBuck,createStrtchShearBuckWgt(m_stackedGroup));
//插入蒙皮拉剪復(fù)合屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinCompressShearBuck,createCompressShearBuckWgt(m_stackedGroup));
//插入蒙皮壓剪復(fù)合屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::PorfileOula,createProfileOulaBuckWgt(m_stackedGroup));
//插入型材歐拉失穩(wěn)界面
m_stackedLayout->setCurrentIndex(0);
//將長(zhǎng)桁拉伸界面設(shè)置為當(dāng)前顯示界面
重構(gòu)后的強(qiáng)度校核流程可以在一定程度上減少用戶參數(shù)輸入的工作量,提高相關(guān)人員的工作效率。然而,該流程的順利執(zhí)行需要底層特色子模塊的支撐。下面是對(duì)幾個(gè)子模塊的介紹。
(1)數(shù)據(jù)交互模塊
強(qiáng)度校核前后置系統(tǒng)與求解器之間使用json格式文件進(jìn)行數(shù)據(jù)交互。json是一種能夠代替XML的輕量級(jí)數(shù)據(jù)交換格式[7],具有良好的可擴(kuò)展性與可讀性。前后置界面利用Qt編寫(xiě)而成,為了兼容Qt,在該系統(tǒng)中使用jsoncpp完成對(duì)json文件的解析與輸出。Jsoncpp是一個(gè)開(kāi)源的輕量級(jí)C++ json庫(kù),允許操作JSON值,包括與字符串之間的序列化和反序列化。使用該庫(kù)中的Json::Value,Json::Reader,Json::Writer3個(gè)基本類可以完成json文件的解析。前后置的輸出與求解器輸出json數(shù)據(jù)分別如圖4與圖5所示。
圖4 前置輸出json文件格式
圖5 求解器輸出json文件格式
(2)曲線數(shù)值庫(kù)
金屬結(jié)構(gòu)強(qiáng)度校核過(guò)程中,一些破壞模式的計(jì)算需要輸入相關(guān)系數(shù),用戶在沒(méi)有任何參考的情況下對(duì)此參數(shù)的設(shè)定會(huì)無(wú)法確定。鑒于此,該模塊實(shí)現(xiàn)了曲線數(shù)值庫(kù)供用戶查詢使用。
曲線數(shù)值庫(kù)基于SQLite搭建而成[8-10]。SQLite是一個(gè)進(jìn)程內(nèi)的庫(kù),實(shí)現(xiàn)了自給自足的、無(wú)服務(wù)器的、零配置的數(shù)據(jù)庫(kù)引擎。相較于Mysql等數(shù)據(jù)庫(kù),SQLite是非常小的,是輕量級(jí)的,完全配置時(shí)小于400KB,省略可選功能配置時(shí)小于250KB。SQLite支持Windows、Linux等主流操作系統(tǒng),能夠跟很多程序語(yǔ)言相結(jié)合。
曲線數(shù)值庫(kù)的數(shù)據(jù)庫(kù)表結(jié)構(gòu)如下所示(其中,PICNO為圖編號(hào),DES為曲線描述,X為橫坐標(biāo),Y為縱坐標(biāo)):
CREATE TABLE [StructuralStabilityBook] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[X] DOUBLE,
[Y] DOUBLE,
[PICNO] VARCHAR(30),
[DES] VARCHAR(100));
曲線數(shù)值庫(kù)的查詢接口程序?qū)崿F(xiàn)如下所示(其中,ChartUnit為曲線上點(diǎn)坐標(biāo)類,成員包含編號(hào)id,橫坐標(biāo)X,縱坐標(biāo)Y):
QList
QByteArray qb;
qb = QString("select t.id,t.X,t.Y from StructuralStabilityBook t where t.X <= %1 and t.PICNO = '%2' and t.DES = '%3' order by t.X desc").arg(X).arg(PICNO).arg(DES).toUtf8();
QList
sqlite3_stmt* m_pStmt;
sqlite3_prepare_v2(m_pDb,qb,-1,&m_pStmt,0);
while(sqlite_step(m_pStmt) == SQLITE_ROW){
int id = sqlite3_column_int(m_pStmt,0);
double X = sqlite3_column_double(m_pStmt,1);
double Y = sqlite3_column_double(m_pStmt,2);
ChartUnit tempChart(id,X,Y);
charUnitList.append(tempChart);
}
if(m_pStmt){
sqlite3_finalize(m_pStmt);
}
return charUnitList;
}
曲線數(shù)值庫(kù)的實(shí)現(xiàn)結(jié)果如圖6所示。
圖6 曲線數(shù)值庫(kù)實(shí)現(xiàn)圖
金屬結(jié)構(gòu)強(qiáng)度校核模塊之所以要依托HAJIF平臺(tái)搭建,原因在于通過(guò)利用HAJIF的對(duì)外開(kāi)放接口可以減少用戶輸入,簡(jiǎn)化強(qiáng)度校核流程,多樣化展示強(qiáng)度校核結(jié)果。該模塊所利用的HAJIF接口主要有以下幾個(gè):
(1)組數(shù)據(jù)獲取與組更新接口
金屬結(jié)構(gòu)強(qiáng)度校核模塊以組數(shù)據(jù)為基本單元進(jìn)行校核,HAJIF具有完備的組創(chuàng)建功能,可以按照結(jié)構(gòu)部位分組、屬性分組、材料分組、拓?fù)浞N類分組,同時(shí)支持組布爾操作。金屬結(jié)構(gòu)強(qiáng)度校核模塊初始化時(shí)會(huì)獲取HAJIF系統(tǒng)中針對(duì)有限元模型已創(chuàng)建的組信息,并在模塊可選組中顯示供用戶選擇。當(dāng)HAJIF系統(tǒng)有新組創(chuàng)建或刪除某組數(shù)據(jù)后,會(huì)給強(qiáng)度校核模塊發(fā)送更新信號(hào)。該模塊接收到此更新信號(hào)后,會(huì)重新獲取HAJIF系統(tǒng)中最新組的相關(guān)數(shù)據(jù),達(dá)到數(shù)據(jù)更新的目的。
強(qiáng)度校核模塊初始化組數(shù)據(jù)的接口實(shí)現(xiàn)如下:
void sCheckDlg::initGroupInfo(){
FeGroup *pGroup = m_femProject->getGroupSet()->getFirstGroup();
//m_femProject為HAJIF系統(tǒng)中有限元模型存儲(chǔ)對(duì)象,利用該對(duì)象的公共接口可以獲取第一個(gè)組信息
while(pGroup){
string strName = pGroup->getName();
//獲取組名稱
m_availableGroupCmbox->addItem(QString::fromStdString(strName));
//將組數(shù)據(jù)添加至可用組列表
pGroup = m_femProject->getGroupSet()->getNextGroup();
//獲取下一個(gè)組數(shù)據(jù)
}
}
組數(shù)據(jù)更新的信號(hào)槽定義及槽實(shí)現(xiàn)如下:
connect(m_modelTree, SIGNAL(updateschkDlgUpdateGroup()),this,SLOT(oncheckDlgUpdateGroupInfo()));
//HAJIF系統(tǒng)更新組數(shù)據(jù)后,會(huì)由m_modelTree對(duì)象發(fā)出updateschkDlgUpdateGroup信號(hào)
void MainWindow::oncheckDlgUpdateGroupInfo(){
pCheckDlg->onUpdateGroupInfo();
//金屬結(jié)構(gòu)強(qiáng)度校核模塊依托于HAJIF系統(tǒng),所以HAJIF可以調(diào)用強(qiáng)度校核模塊對(duì)象pCheckDlg完成組數(shù)據(jù)更新。
}
(2)材料數(shù)據(jù)提取與更新接口
強(qiáng)度校核中,需要填寫(xiě)的材料參數(shù)較多,且不同的破壞模式所需要的材料參數(shù)不同,手動(dòng)填寫(xiě)會(huì)使得強(qiáng)度校核流程冗余且耗時(shí)。鑒于此,強(qiáng)度校核模塊利用HAJIF系統(tǒng)完成材料數(shù)據(jù)獲取與材料數(shù)據(jù)更新。材料信息提取如圖7所示,用戶選擇從當(dāng)前組獲取材料數(shù)據(jù)即可完成材料信息提取。材料數(shù)據(jù)的更新與組數(shù)據(jù)一樣,都是通過(guò)信息槽機(jī)制實(shí)現(xiàn)。
圖7 材料提取
(3)后置顯示接口
HAJIF系統(tǒng)具有云圖、變形圖、動(dòng)畫(huà)等多種后置顯示功能。為了完成強(qiáng)度校核裕度結(jié)果的多樣化展示,強(qiáng)度校核模塊通過(guò)調(diào)用HAJIF后置顯示接口完成裕度圖形化顯示[11-14]。裕度結(jié)果數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct tagScalarData
{
int entityId; //單元號(hào)
float scalar; //裕度值
} ScalarData;
強(qiáng)度校核模塊使用如下信號(hào)槽觸發(fā)裕度顯示功能:
connect(pCheckDlg,SIGNAL(showYuduElmIds(list
當(dāng)HAJIF系統(tǒng)接收到強(qiáng)度校核模塊發(fā)出的裕度顯示信號(hào)后,會(huì)解析裕度結(jié)果數(shù)據(jù),調(diào)用其后置顯示功能完成裕度顯示。圖8為某案例裕度結(jié)果數(shù)據(jù)顯示圖。
圖8 裕度顯示圖
為了驗(yàn)證強(qiáng)度校核模塊設(shè)計(jì)的相關(guān)目標(biāo),利用某型飛機(jī)機(jī)身壁板作為校核對(duì)象進(jìn)行蒙皮拉伸校核測(cè)試。利用HAJIF系統(tǒng)分組功能對(duì)該壁板按部位建組后,對(duì)所有校核組只需設(shè)置一次校核參數(shù)即可完成多個(gè)校核組的批量計(jì)算,校核結(jié)果裕度值圖形化顯示如圖9所示,多校核組批量校核如圖10所示。
圖9 某型飛機(jī)機(jī)身強(qiáng)度校核結(jié)果
圖10 多校核組批量校核
同時(shí),在強(qiáng)度校核模塊的結(jié)果顯示區(qū)對(duì)校核對(duì)象其他校核結(jié)果信息也做了展示。結(jié)果表明,重新設(shè)計(jì)的強(qiáng)度校核模塊有效減少了用戶輸入?yún)?shù),批量化的計(jì)算功能提高了用戶工作效率,達(dá)到了系統(tǒng)模塊預(yù)期的設(shè)計(jì)目標(biāo)。
本文基于HAJIF系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)了航空典型金屬結(jié)構(gòu)強(qiáng)度校核前后置模塊,該系統(tǒng)利用HAJIF對(duì)外接口,優(yōu)化了強(qiáng)度校核流程,豐富了強(qiáng)度校核展現(xiàn)形式,并基于json的數(shù)據(jù)交互模塊與基于SQLite的曲線數(shù)值庫(kù)的構(gòu)建保障了優(yōu)化后流程的順利執(zhí)行。模塊測(cè)試結(jié)果表明,該模塊的實(shí)現(xiàn)改變了傳統(tǒng)強(qiáng)度校核流程,有效提升了強(qiáng)度設(shè)計(jì)與分析人員的工作效率,具有一定的工程實(shí)用價(jià)值。