航空典型金属结构强度校核软件的设计与实现
2022-05-31许向彦王立凯
许向彦,艾 森,王立凯
(中国飞机强度研究所,陕西 西安 710065)
1 引 言
航空典型金属结构强度校核理论与算法经过多年的研究与发展,现已趋于成熟[1]。然而,由于缺乏对理论算法的软件化与工具化,相关设计与分析人员目前仍通过传统的Excel等手工方法进行强度校核计算,这存在以下问题:(1)无法进行批量化处理;(2)有限元模型数据的未充分利用导致用户需要手工填写的校核参数过多;(3)校核结果缺乏图形化显示;(4)校核中相关系数的确定缺乏数据库支持。
航空结构强度分析与优化设计软件系统(HAJIF)[2]是中国飞机强度研究所研制推出的国内航空领域功能全面的自主CAE软件系统,其功能涵盖了静力、屈曲、模态、优化等通用功能以及优化等专用求解功能。
针对传统校核方式存在的问题,本文依托HAJIF平台,利用其模型处理能力与图形化显示能力,设计了金属结构强度校核的软件化流程,丰富了强度校核结果的展示形式,形成了批量化处理强度校核任务的能力。同时,考虑到与HAJIF系统的兼容,基于目前主流的GUI设计工具Qt设计开发了金属强度校核模块前后置界面,基于SQLite构建了曲线数值库,并基于python-docx实现了报告的自动生成,提高了强度设计与分析人员的工作效率,具备一定的工程实用价值。
2 软件设计
金属结构强度校核模块由六大功能区组成,分别是校核类型选择区、破坏模式与组数据准备区、校核参数定义区、校核工况定义区、校核结果显示区、校核辅助功能区(如图1所示)。
图1 金属结构强度校核主界面
金属结构强度校核模块支持长桁拉伸、蒙皮拉伸、长桁压损、蒙皮压缩屈曲、蒙皮皱曲、钉间蒙皮屈曲、蒙皮剪切屈曲、蒙皮拉剪复合屈曲、蒙皮压剪复合屈曲、型材欧拉失稳等10种破坏模式计算。依托HAIJF平台所设计的校核流程如图2所示。
图2 强度校核流程图
其中,校核组利用HAJIF系统中的组功能进行创建,校核类型支持许用值计算与裕度计算。破坏模式中包含10种常见模式,材料参数可以直接从有限元模型中提取,无需用户填写。每种破坏模式的计算参数有所不同,当填写完所有参数后,可新建校核工况加入校核列表。用户根据自己需要完成所有校核任务的创建工作后,可批量提交至后台计算程序进行计算,前后置界面与后台利用json文件进行数据交互。计算完成后,通过两种方式给用户呈现计算结果,分别为图形化显示与值显示,用户确认数据无误后即可生成校核报告。
3 软件实现
3.1 界面实现
金属结构强度校核模块的界面实现[3-6]主要用到了QWidget与QLayout两个基类所派生的多个子类,比如QPushButton类、QGroupBox类、QTabWidget类、QDialog类、QLable类、QLineEdit类、QGridLayout类、QStackedLayout类等。
(1)QWidget类是所有用户界面对象的基类,Qt基本上所有的UI类都是由QWidget派生而来。
(2)QLayout类作为布局类的基类,是抽象类,提供多种接口函数给继承类。QLayout类及其常用派生类的继承关系如图3所示。
图3 QLayout类继承关系图
(3)QPushButton类是一个按钮类,通过QPushButton类利用Qt的信号槽机制可以实现按钮功能,完成业务需求。
(4)QGroupBox类继承自QWidget类,通常带有一个边框和一个标题栏,可以作为容器部件来使用。
(5)QTabWidget类提供了一堆选项卡式窗口部件。一个选项卡部件提供一个标签栏和一个页面区,页面区用于显示与该标签关联的相关内容。
(6)QDialog类代表对话框,对话框一般用来实现那些只是暂时存在的用户界面。
(7)QLineEdit类用来获取用户输入。
(8)QGridLayout类是一个布局类,用来对各子部件网格化布局。
(9)QStackedLayout类属于布局管理器中的一个常用类,与QTabWidget类类似,该类用来切换不同的界面。
利用上述类可以完成金属结构强度校核模块的界面构建,软件主界面的布局及构建程序如下:
void sCheckDlg::initUI(){
QVBoxLayout *mainLayout = new QVBoxLayout(this);
//主界面垂直布局
QGroupBox *basicInfoGroup = createBasicGroup(this);
//创建校核类型选择区子界面
QTabWidget *m_tabWidget = new QTabWidget(this);
//创建选项式窗口部件
m_tabWidget->addTab(createTableMentalWidget(this),tr(“Mental”));
//增加金属标签页
m_tabWidget->addTab(createTableMatWidget(this),tr(“Material”));
//增加材料标签页
QGroupBox *resultInfoGroup = createResultGroup(this);
//创建校核结果显示区子界面
QGroupBox *buttonGroup = createButtonGroup(this);
//创建辅助功能区子界面
QVBoxLaout *layTabRes = new QVBoxLayout();
//校核类型选择区与主操作区进行垂直布局
layTabRes->addWidget(basicInfoGroup);
layTabRes->addWidget(m_tabWidget);
QHBoxLayout *layTabStatus = new QHBoxLayout();
//对layTabRes与校核结果显示区水平布局
layTabStatus->addLayout(layTabRes,8);
layTabStatus->addLayout(resultInfoGroup,2);
mainLayout->addLayout(layTabStatus);
//对layTabStatus与辅助功能区垂直布局
mainLayout->addWidget(buttonGroup,0,Qt::AlignRight);
//使辅助功能区靠右
setLayout(mainLayout);
//将mainLayout布局设置为主显示
}
金属结构强度校核模块的主操作区(破坏模式与组数据准备区、校核参数定义区、校核工况定义区)界面主要利用QStackedLayout类、QRadioButton类以及QGroupBox类实现。QRadioButton通过利用信号槽机制实现10种破坏模式的切换,QStackedLayout类用来存储10种破坏模式的子界面,QGroupBox类用来实现其中具体一种破坏模式的界面。利用QStackedLayout类存储10种破坏模式界面的程序实现如下:
QGroupBox *m_stackedGroup = new QGroupBox(this);
QStackedLayout *m_stackedLayout = new QStackedLayout(m_stackedGroup);
m_stackedLayout->insertWidget(DestructionModeMark::LongStretch,createLongStretchWgt(m_stackedGroup));
//插入长桁拉伸界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinStretch,createSkinStretchWgt(m_stackedGroup));
//插入蒙皮拉伸界面
m_stackedLayout->insertWidget(DestructionModeMark::LongCompress,createLongCompressWgt(m_stackedGroup));
//插入长桁压缩界面
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));
//插入蒙皮拉剪复合屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::SkinCompressShearBuck,createCompressShearBuckWgt(m_stackedGroup));
//插入蒙皮压剪复合屈曲界面
m_stackedLayout->insertWidget(DestructionModeMark::PorfileOula,createProfileOulaBuckWgt(m_stackedGroup));
//插入型材欧拉失稳界面
m_stackedLayout->setCurrentIndex(0);
//将长桁拉伸界面设置为当前显示界面
3.2 子模块功能实现
重构后的强度校核流程可以在一定程度上减少用户参数输入的工作量,提高相关人员的工作效率。然而,该流程的顺利执行需要底层特色子模块的支撑。下面是对几个子模块的介绍。
(1)数据交互模块
强度校核前后置系统与求解器之间使用json格式文件进行数据交互。json是一种能够代替XML的轻量级数据交换格式[7],具有良好的可扩展性与可读性。前后置界面利用Qt编写而成,为了兼容Qt,在该系统中使用jsoncpp完成对json文件的解析与输出。Jsoncpp是一个开源的轻量级C++ json库,允许操作JSON值,包括与字符串之间的序列化和反序列化。使用该库中的Json::Value,Json::Reader,Json::Writer3个基本类可以完成json文件的解析。前后置的输出与求解器输出json数据分别如图4与图5所示。
图4 前置输出json文件格式
图5 求解器输出json文件格式
(2)曲线数值库
金属结构强度校核过程中,一些破坏模式的计算需要输入相关系数,用户在没有任何参考的情况下对此参数的设定会无法确定。鉴于此,该模块实现了曲线数值库供用户查询使用。
曲线数值库基于SQLite搭建而成[8-10]。SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的数据库引擎。相较于Mysql等数据库,SQLite是非常小的,是轻量级的,完全配置时小于400KB,省略可选功能配置时小于250KB。SQLite支持Windows、Linux等主流操作系统,能够跟很多程序语言相结合。
曲线数值库的数据库表结构如下所示(其中,PICNO为图编号,DES为曲线描述,X为横坐标,Y为纵坐标):
CREATE TABLE [StructuralStabilityBook] (
[id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[X] DOUBLE,
[Y] DOUBLE,
[PICNO] VARCHAR(30),
[DES] VARCHAR(100));
曲线数值库的查询接口程序实现如下所示(其中,ChartUnit为曲线上点坐标类,成员包含编号id,横坐标X,纵坐标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;
}
曲线数值库的实现结果如图6所示。
图6 曲线数值库实现图
3.3 适配HAJIF接口实现
金属结构强度校核模块之所以要依托HAJIF平台搭建,原因在于通过利用HAJIF的对外开放接口可以减少用户输入,简化强度校核流程,多样化展示强度校核结果。该模块所利用的HAJIF接口主要有以下几个:
(1)组数据获取与组更新接口
金属结构强度校核模块以组数据为基本单元进行校核,HAJIF具有完备的组创建功能,可以按照结构部位分组、属性分组、材料分组、拓扑种类分组,同时支持组布尔操作。金属结构强度校核模块初始化时会获取HAJIF系统中针对有限元模型已创建的组信息,并在模块可选组中显示供用户选择。当HAJIF系统有新组创建或删除某组数据后,会给强度校核模块发送更新信号。该模块接收到此更新信号后,会重新获取HAJIF系统中最新组的相关数据,达到数据更新的目的。
强度校核模块初始化组数据的接口实现如下:
void sCheckDlg::initGroupInfo(){
FeGroup *pGroup = m_femProject->getGroupSet()->getFirstGroup();
//m_femProject为HAJIF系统中有限元模型存储对象,利用该对象的公共接口可以获取第一个组信息
while(pGroup){
string strName = pGroup->getName();
//获取组名称
m_availableGroupCmbox->addItem(QString::fromStdString(strName));
//将组数据添加至可用组列表
pGroup = m_femProject->getGroupSet()->getNextGroup();
//获取下一个组数据
}
}
组数据更新的信号槽定义及槽实现如下:
connect(m_modelTree, SIGNAL(updateschkDlgUpdateGroup()),this,SLOT(oncheckDlgUpdateGroupInfo()));
//HAJIF系统更新组数据后,会由m_modelTree对象发出updateschkDlgUpdateGroup信号
void MainWindow::oncheckDlgUpdateGroupInfo(){
pCheckDlg->onUpdateGroupInfo();
//金属结构强度校核模块依托于HAJIF系统,所以HAJIF可以调用强度校核模块对象pCheckDlg完成组数据更新。
}
(2)材料数据提取与更新接口
强度校核中,需要填写的材料参数较多,且不同的破坏模式所需要的材料参数不同,手动填写会使得强度校核流程冗余且耗时。鉴于此,强度校核模块利用HAJIF系统完成材料数据获取与材料数据更新。材料信息提取如图7所示,用户选择从当前组获取材料数据即可完成材料信息提取。材料数据的更新与组数据一样,都是通过信息槽机制实现。
图7 材料提取
(3)后置显示接口
HAJIF系统具有云图、变形图、动画等多种后置显示功能。为了完成强度校核裕度结果的多样化展示,强度校核模块通过调用HAJIF后置显示接口完成裕度图形化显示[11-14]。裕度结果数据的数据结构如下:
typedef struct tagScalarData
{
int entityId; //单元号
float scalar; //裕度值
} ScalarData;
强度校核模块使用如下信号槽触发裕度显示功能:
connect(pCheckDlg,SIGNAL(showYuduElmIds(list
当HAJIF系统接收到强度校核模块发出的裕度显示信号后,会解析裕度结果数据,调用其后置显示功能完成裕度显示。图8为某案例裕度结果数据显示图。
图8 裕度显示图
4 软件验证
为了验证强度校核模块设计的相关目标,利用某型飞机机身壁板作为校核对象进行蒙皮拉伸校核测试。利用HAJIF系统分组功能对该壁板按部位建组后,对所有校核组只需设置一次校核参数即可完成多个校核组的批量计算,校核结果裕度值图形化显示如图9所示,多校核组批量校核如图10所示。
图9 某型飞机机身强度校核结果
图10 多校核组批量校核
同时,在强度校核模块的结果显示区对校核对象其他校核结果信息也做了展示。结果表明,重新设计的强度校核模块有效减少了用户输入参数,批量化的计算功能提高了用户工作效率,达到了系统模块预期的设计目标。
5 结束语
本文基于HAJIF系统设计和实现了航空典型金属结构强度校核前后置模块,该系统利用HAJIF对外接口,优化了强度校核流程,丰富了强度校核展现形式,并基于json的数据交互模块与基于SQLite的曲线数值库的构建保障了优化后流程的顺利执行。模块测试结果表明,该模块的实现改变了传统强度校核流程,有效提升了强度设计与分析人员的工作效率,具有一定的工程实用价值。