唐志广
(大连中远海运重工有限公司,辽宁大连 116113)
Femap 是Siemens PLM Software 开发的有限元(Finite Element,FE)预处理和后处理软件,主要用于工程仿真和分析,广泛应用于汽车、航天、航空、船舶、电子、机械制造等行业中[1]。Femap 软件默认安装NX Nastran 解算器,并能与多种FE 分析解算器兼容,如ABAQUS、ANSYS、LS-DYNA等[2]。Femap 软件不仅提供了许多强大的通用功能,还公开了众多的应用编程接口(Application Programming Interface,API),供用户开发自定义的扩展功能,以提高用户工作效率[3]。
Femap 软件具有强大的后处理功能,便于使用者快速、有效地分析仿真结果。Femap 提供的后处理工具包括:表格、线图、云图、动画、用户自定义报告等[4]。此外,Femap 提供通用的结果处理功能,可在分析结束后合并计算结果,为编写项目计算报告提供了充分支持。
在编写项目计算报告时,往往需要计算多种工况,此时需要将各工况的计算结果粘贴到计算报告中[5]。由于工况复杂,每份计算报告中需要粘贴的矢量图、云图的数量通常高达数百张,若全部通过手工操作,不仅浪费大量设计时间,还需要花费很多精力来检查正确性,非常繁琐。针对上述问题,本文基于Femap 软件提供的API,对计算报告所需图表的自动输出功能进行开发,并将其应用于设计实践。
为方便二次开发,Femap 软件的API 允许用户开发自定义的扩展功能。Femap 软件的API 可使用任何支持对象链接与嵌入/组合对象模型(Object Linking and Embedding/Component Object Model,OLE/COM)的编程语言进行开发,如C/C++、C#、Visual Basic、VBA 等[6]。对于用户二次开发的应用程序,Femap 软件提供了多种交互方式,主要包括以下4 种:
1)作为2 个独立的应用程序运行(无交互)。
2)将Femap 作为后台服务运行。
3)将用户应用程序作为Femap 加载项运行。
4)将Femap 程序界面嵌入用户应用程序中。
该方式是最简单的交互方式。由于Femap 和用户二次开发的应用程序都不需要真正了解对方的用户界面,故不需要进行额外的设置[7],只需要启动应用程序,然后通过COM 接口获取已经运行的Femap 应用程序窗口。新的Femap 应用程序默认隐藏窗口界面,要将窗口显示出来必须调用feAppVisible 函数。
若希望用户二次开发的应用程序界面成为用户唯一可见的用户界面,则在启动新的Femap程序后,不调用feAppVisible 函数,此时仅有用户二次开发的应用程序界面可供交互。然而,通过API,用户二次开发的应用程序可访问Femap 的任何接口。由于此交互方式不需要更新Femap 界面,故运行速度较快。
在此交互方式下,用户二次开发的应用程序成为Femap 的一个加载项。用户看到的整体界面和普通的Femap界面基本相同,仅仅多了一个浮动面板,即用户二次开发的图形用户界面(Graphical User Interface,GUI)。该交互模式将用户二次开发的程序界面嵌入Femap 程序界面中,并与Femap 操作界面融为一体。
将Femap 程序界面嵌入用户应用程序界面中,Femap 程序界面可整体显示,也可部分显示。若要关闭除视图窗口外的其他Femap 窗体界面元素,只需要调用feAppEmbed 函数即可。
综上所述,Femap 软件与用户二次开发的应用程序间有多种交互方式,具体采用何种方式,需要根据应用场合而定。本文将用户二次开发的程序嵌入Femap 用户界面中,使其与Femap 软件界面的风格相统一。
要实现自动生成计算报告,则需要通过程序读写Word 文档。通过程序读写Word 文档主要有以下2 种方式:1)直接使用Word 的COM 组件接口,见图1;2)使用Word 操作控件,如Spire.Doc 等。第1 种方式常会由于各设计师电脑上安装的Word版本不同而导致程序兼容性问题;第2 种方式往往会产生额外的费用。本文的研究涉及插入文字和图片等基本操作,主要通过改造开源库DuckX 实现所需要的功能。由于DuckX 仅提供了在Word 文档中插入文字的功能,需要增加在Word 文档中插入图片的功能。
图1 直接使用Word 的COM 组件接口
Word 自2007 版本之后的文件为.doc 格式,使用压缩软件对.doc 格式的文件进行解压操作,可得到一些文件和文件夹。其中,document.xml 文件包含了文档的主要文本内容,DuckX 通过该文件实现docx 文档的文本读写功能。
DuckX 在 Word 中插入文本只需要修改document.xml 即可,插入图片相较插入文本更为复杂,主要包括如下步骤:
1)在document.xml 中写入图片的大小、版式、位置等信息,设置图片编号。
2)在word/media 文件夹中插入一个实际的图片文件。
3)修改word/_rels/ document.xml.rels,添加一个记录,将图片编号与图片文件关联起来。
为实现在Word文档中插入图片的功能,DuckX需要添加如下3 类代码:1)Relationship 类代码,用于管理word/_rels/document.xml.rels 文件;2)InlinePicture 类代码,用于管理图片对象;3)Run类代码,用于插入图片。
考虑到程序运行速度以及开创性,本文基于Femap 软件,采用C++语言进行二次开发。二次开发的程序将Visual Studio 2019 社区版作为集成开发环境,程序界面见图2。
图2 程序界面
从GitHub 上下载DuckX,使用CMake 工具生成 Microsoft Visual Studio(VS)项目,添加Relationship 类、InlinePicture 类代码,并在Run 类代码中添加add_inline_picture 方法,随后编译为lib文件供后续使用。
InLinePicture 类代码的关键部分如下:
首先打开Visual Studio 软件,创建一个微软基础类库(Microsoft Foundation Classes,MFC)的对话框应用,再从femap.tlb 导入所需要的接口。
在对话框的头文件中添加如下语句:
#import "D:\Program Files\Siemens\Femap 2022.1\femap.tlb" named_guids rename("GetProp","feGetProp")
在对话框头文件中添加应用程序对象供后续使用:
CComQIPtr
在对话框的OnInitDialog()方法中对pModel 进行初始化,为使代码清晰易读,此处省去了与异常判断有关的部分代码:
CoInitialize( NULL );
CLSID clsid;
HRESULT hr = AfxGetClassIDFromString(L"femap.model",&clsid );
IUnknown FAR* punk;
hr = ::CoCreateInstance(clsid,NULL,CLSCTX_SERVER,IID_IUnknown,(void**)&punk);
pModel = punk;
pModel->feAppRegisterAddInPane(true,(int)m_hWnd,0,false,false,3,1);
pModel->feAppVisible(true);
当Femap 程序关闭时,应能实现对话框自动退出的功能。因此,二次开发程序应能捕捉并响应Femap 程序发出的退出消息。
通过如下代码在OnInitDialog( )方法中注册Femap 消息:
FE_EVENT_MESSAGE = RegisterWindow Message(L"FE_EVENT_MESSAGE");
通过如下代码重载对话框的WindowProc 函数处理消息:
if (message == FE_EVENT_MESSAGE)
if (wParam == femap::zEventCode::FEVENT_SHUTDOWN)
if (lParam == 1)
PostMessage(WM_CLOSE,0,0);
在程序界面中选中OutputSet、OutputVector、Group 与View,通过遍历循环,逐一将结果输出到Word 文档中。Word 需要使用的图片来自Femap 生成的View,Femap 可以将View 显示的内容保存为图片文件,也可将显示内容保存至剪贴板。由测试可知:先将View 显示的内容保存至剪贴板,再导入到Word 时,程序运行速度较快。
二次开发程序的核心代码如下:
femap::IViewPtr view=pModel->feView;
view->Get(viewID);
pModel->feAppSetActiveView(viewID);
pModel->feGroup->Active=groupID;
view->OutputSet=outputSetID;
view->ContourVector1V2=contourVector;
view->Put(viewID);
view->FitVisible(false);/pModel->feView Regenerate(0);
pModel->feFilePictureCopy( );/
std::string id=std::to_string(picIndex);
std::string rid="rid"+id;
std::string target="media/"+rid+".png";
duckx::Run run=doc.paragraphs( ).insert_paragraph_after("").add_run("");
duckx::InlinePicture pic=run.add_inline_picture(id,rid,wPicture,hPicture);
pic.data_size=GetClipImageSize( );
pic.pic_data=GetClipImageData( );
doc.set_picture_relationship(pic);
doc.paragraphs( ).insert_paragraph_after(pic_title).insert_paragraph_after("");
代码中涉及对图片宽度和高度的计算。计算报告采用竖版A4 纸,由document.xml 可知:Word 中竖版A4纸的宽度为11 906 twip(1 twip=0.017 6 mm),高度为16 838 twip,上下页边距为1 440 twip,左右页边距为1 800 twip。
在内存中,图片的单位是像素,需要先进行单位换算,再根据页面宽度和高度自动调整图片的大小。
在运行二次开发的程序后,会自动打开一个Femap 窗口,用户应用程序以浮动面板的形式嵌入在Femap 窗口中。打开要导出计算报告的模型,点击面板中左上角的提取模型信息按钮,此时面板中会列出该模型中所有的条目。选择要导出的条目,输入报告的文件名,点击面板右上角的导出Word按钮,就可以自动导出报告。此外,面板中还可以设定图片标题的生成方式,对图片标题进行自定义。
本文基于Femap 软件提供的应用编程接口,对计算报告所需图表的自动输出功能进行开发,并将其应用于设计实践。研究表明:该自动输出功能可显著提高设计效率。手动操作需要1 天才能完成的报告,使用本文的二次开发程序仅需要5 min 即可完成。本文的研究成果可为Femap 软件的二次开发提供一定参考。