田榴敏 , 张世超, 王德禹, 崔进举
(1.上海交通大学 船舶海洋与建筑工程学院, 上海200240;2.上海外高桥造船有限公司, 上海 200137)
国内大型邮船目标三维生产设计系统的应用通常依据造船企业的生产要素能力和生产建造组织方式等展开,在软件应用过程中需要在充分利用其原有功能和优势的基础上进行二次开发,实现符合造船企业实际要求的、有针对性的功能扩展,增强软件适应性,并根据造船企业实际生产设计需求开发各类辅助功能模块,提高生产设计效率。鹰图船舶设计软件Smart 3D(以下简称S3D)作为国内大型邮船设计的备选软件,需对其在邮船生产设计二次开发功能方面的适用性进行验证,其中非常重要的一环就是针对S3D软件二次开发技术的研究。
面向海事行业的鹰图PP&M S3D是近20年来较先进的海洋资产和船舶设计软件,也是新一代数据中心规则驱动型解决方案,能在保护现有数据并提高现有数据的可用性/再用性的同时简化海洋资产的设计流程。S3D是鹰图PP&M的新一代三维工程设计解决方案,在鹰图PP&M超过30年工程经验积累的基础上,采用新颖的软件技术进行核心构架。从2014版本开始,将原有针对不同领域独立封装的Smart Plant 3D、Smart Marine 3D和Smart Plant 3D Material Handling Edition统一封装为S3D 产品[1]。
文献[2-5]对S3D二次开发进行研究分析:文献[2]对S3D软件中的PCF文件进行解析,利用Linq编程技巧汇总单管材料数据,生成综合材料报表,对软件自带的传统报表起到了很好的补充作用;文献[3-5]在S3D软件中利用Automation进行管子二次开发设计、管子出图和管子命名程序的二次开发,可提高设计效率、减少人为失误。分析文献[2-5]可知,目前S3D二次开发的主要方向是设计优化,可通过保证设计准确率,提出相应算法,利用S3D的二次开发技术实现该算法,从而达到优化设计的目的。文献[6]主要介绍S3D在化工项目中异地协同设计方面的功能。文献[7-10]主要介绍S3D软件在管子设计中的应用。国内船舶设计单位应用S3D软件并不广泛,鲜见相关的二次开发应用,缺少相关报道和分析说明,且二次开发主要涉及管系专业,船舶设计单位尚未从产品全生命周期方面综合考虑二次开发的应用。
本文从S3D软件系统架构、开发工具和语言等方面进行二次开发技术分析,对开发接口、数据库和开发调试方法进行研究,结合邮船生产设计实际需求,最终形成S3D二次开发的有效技术路径和技术架构,为邮船生产设计的S3D二次开发提供技术支撑。
S3D软件系统二次开发功能基于Microsoft .NET框架进行技术构建,具有面向对象并基于三层架构的分层结构。S3D软件的三层架构包括客户层、中间层和服务器层,将客户层中的图形用户界面与中间层中的业务逻辑分开,将业务逻辑与服务器层中的物理数据库进一步分离。S3D软件采用关系型数据库Microsoft SQL Server和Oracle数据库,服务层依赖数据库提供的相关功能。涉及的二次开发客户层与中间层的关系架构如图1所示。
图1 S3D软件二次开发架构
客户层的客户化开发必须在S3D的运行环境下进行,基于客户层的二次开发必须打开S3D软件,通过任务、服务等形式加载。客户层主要包含菜单、工具箱、可视化视图工具和对话框等,可使用Select Set和Graphic View Mgr等服务软件提供的组件进行人机交互开发,例如在S3D软件界面中对船舶设计模型选择、视图窗口,以及标注工具、视角操作等进行客户化开发。
中间层又称逻辑层,邮船设计客户化业务规则的制定、业务流程的实现等与业务需求有关的系统设计都集中在该层,是系统架构中的核心部分,开发人员甚至可利用中间层提供的API接口,重新开发WEB界面的CAD设计系统。中间层处于数据层与客户层中间,在数据交换中起承上启下的作用,因此:首先需理解S3D软件对船舶设计中各业务对象类数据结构和关联接口的设计(业务对象对应于船舶设计过程中各类对象,贯穿于三层,在三层之间传递数据);其次,通过相关API接口命令对底层数据进行操作。
S3D软件开发技术采用面向对象编程的思想,类的继承与多态应用广泛,3D .NET对象模型提供了一个名为BusinessObject的基类,使用Business-Object的类继承来实现单个业务对象。Business-Object提供了使用字典方法访问和修改属性的方法,应用程序通过继承该基类子类化来扩展对象模型和开发接口。继承关系与设计对象之间联系紧密,当一个设计对象发生变化时,通过继承关系能够确保设计数据的完整性和连续性。S3D软件中常见的船舶设计对象类如图2所示。
通过对S3D软件二次开发架构进行分析,可知基本的开发方法分为3种:(1)在S3D环境中对客户层进行二次开发,直接参与用户交互操作;(2)Standalone程序,通过中间层启动运行二次开发的方式,不需打开S3D软件界面;(3)S3D软件配置符号库、命名规则和IFC规则开发。
生产设计软件系统的应用落地是一项浩大的工程,涉及设计、生产、管理的方方面面。在投入实船生产设计之前,必须对软件进行全面的测试和评估。通过测试工程,从实际使用的角度确认软件各个方面的性能。一方面,设计软件不仅需具备生产设计单方面的功能,而且还应具备信息一体化的集成能力;另一方面,设计软件需满足邮船设计的特殊要求。测试需求的特点是基础测试点数量大、角度广、关联测试项目多,测试主要内容包括邮船生产设计的三维建模、生产设计图纸设绘、生产信息输出、二次开发能力等。
S3D软件的测试工作覆盖设计的各个相关专业(结构、管系、铁舾、电气和涂装),包括出图、报表和功能点评测等方面,须达成2个目标:(1)功能测试与定制,全面考查目标软件能力;(2)模式整合,旨在根据目标软件现有能力和船厂现有模式,探索目标软件生产设计落地方案。测试以真实项目为背景,出具各专业全面设计平台详细测试报告和分析报告,并提出软件系统改进需求。
船体结构模块测试项共86项,其中S3D软件开发需求共27项,主要涉及出图和报表相关内容的开发;管系专业模块测试项共66项,包括资源库配置、原理图、三维建模、图纸出图和数据输出接口等5个方面,其中开发需求共9项,主要涉及标准库、规则类和出图报表类的开发;电装专业模块测试项共68项,包括资源库配置、系统原理图设计、三维建模(电缆通道、电缆、电缆托架)、图纸出图和数据输出接口、电装工艺仿真、设备厂商资料管理等6个方面,提出20项开发需求,主要涉及出图报表类开发;铁舾专业模块测试项共32项,包括资源库配置、三维建模、出图和数据接口,以及模型更改等4个方面,提出8项开发需求,主要涉及参数化建模类开发;涂装专业模块测试项共10项,包括资源库配置、三维建模、出图和数据接口等3个方面,提出8项开发需求,主要涉及报表开发。
在邮船二次开发中,开发人员主要集中于客户层和中间层的开发,系统管理员则主要集中于符号库和规则库的开发。下文从客户层和中间层的开发方面分析S3D的具体开发手段,即Command和Standalone开发。
Command主要应用于客户层命令对象的开发,以创建基于.NET的命令为主要方式,开发人员通过创建一个从S3D提供的基本命令类继承方式进行开发,嵌入S3D运行环境。这种方式与一般CAD系统软件调用COM接口的开发方式不同,是基于对象的命令开发。通过CommandManager服务创建该类实例,并将控件传递给对象,该对象执行相关命令,控制命令的执行。开发人员通过继承命令基类提供的OnStart、OnStop、OnSuspend和OnResume方法重写的方式,进行定制化的二次开发。Command开发的主要思路是通过对基类进行继承,修改成员变量及重写相应的功能函数实现二次开发,包括3种类型:Base、Graphic和Step。
Base类型主要在调用OnStart方法之后,S3D的界面操作命令立即终止。在通常情况下,该模式可通过命令基类提出一个与用户进行交互的对话框。首先调用OnStart方法,在OnStart方法运行结束后立即调用OnStop方法,然后删除命令对象,命令的所有工作都在OnStart方法中完成。在实际开发中,开发人员一般利用Base类型命令作为开发入口,再编写相关交互界面进行一系列邮船业务相关的逻辑处理。通过创建对BaseModalCommand继承的类重写OnStart的方法,嵌入S3D环境中进行二次开发逻辑处理。
GraphicCommands与StepCommands的区别仅仅是继承的类不同,开发方式相同。
GraphicCommands是事件驱动命令,与ModalCommands的主要区别在于调用Start方法之后,S3D的界面操作命令不终止,而由Command-Manager将控制权放回3D软件,比如S3D设计界面上的MouseDown、MouseMove和MouseUp等,该命令使用这些事件驱动其内部逻辑。开发人员通常在图形显示中进行定位和限制图形,动态移动设计对象或者在构建新的3D设计对象时利用该方法。例如,在通过开发进行设备的建模,并由开发人员进行设备的具体布置时,就需要用该方法进行开发。
StepCommands是GraphicCommands的一种特殊情况事件响应,可以额外定义一些步骤或状态,分步骤执行命令并记录,可进行操作的撤销。StepCommands的运行方式在S3D软件中很常见,如在船体板架建模时,经定义基面—定义边界—定义产品信息等步骤,可以终止建模流程,也可以撤销返回上一步骤。在实际开发中,该方法使用较多,需求可能比较复杂,开发人员可控制步骤和逻辑,使开发容易处理。例如,在特殊管支架布置中,开发人员可利用该方法分步骤,即选择管子—计算并选择管支架类型—选择管支架连接基面—添加拓扑关系,并在每个步骤下进行逻辑开发。
Commands的3种类型对比如表1所示。
表1 Commands类型比较
Standalone主要用于中间层接口的开发,即在独立程序中调用中间层S3D .NET API接口,不需打开S3D软件即可独立访问S3D软件工程项目数据,包括模型和目录,操作所有重要的S3D软件中间层数据。由于开发三层架构具有解耦性,开发人员在进行独立程序开发时,并不会直接操作底层数据库,可通过中间层TransactionMgr类对相关数据进行提交和撤销。
开发人员可以进行如下操作:批量更改模型数据库中的一组对象,自动按客户规则进行工程项目初始化设置(如创建产品结构树、用户和权限组定义,以及模型过滤器定义等),设计数据可与船厂信息化系统连接,甚至能将数据导入第三方软件进行操作,该开发技术对S3D软件拓展性的提升非常明显。
中间层开发的关键技术是如何在不启动S3D软件时调用和访问S3D软件中的工程。开发人员需了解.NET框架下程序集的概念(程序集是.NET应用程序的基本单元,一个软件可以是一个程序集),可通过.NET框架提供Assembly类操纵程序集,并获取程序集内部信息。在独立程序开发时,可利用Assembly类将S3D中间层的程序集加载进来,这样开发人员就可调用中间层的API接口。
在S3D软件项目工程数据库中,Catalog数据库是S3D进行工程设计的基础,记录了设计内容的大部分重要信息。但设计对象数量庞大以及对象之间关系错综复杂导致在开发过程中对模型数据结构的理解和熟悉十分困难。设计人员可通过3个方面获取模型数据结构信息:S3D系统模型属性界面;S3D数据库数据信息;常见的Microsoft Visual Studio开发工具集提供的对象接口浏览。面对庞大的设计对象和复杂的对象关系,介绍2种方法供开发人员参考使用:
(1) S3D系统提供数据结构浏览器工具,其位于安装目录下($Smart3DCoreToolsAdministratorBinMetaDataBrowser.exe)。开发人员可通过该工具查看模型数据对应对象、接口和属性等。S3D软件数据结构浏览器如图3所示。
图3 S3D软件数据结构浏览器
(2) 在S3D运行界面中点选需查看的模型,按Ctrl+Shift+R组合功能键即可弹出点选对象的接口和属性等信息,如图4所示。
图4 S3D设计数据资源库浏览器
利用(2)的方式,给出S3D管子属性相关抽取示例代码。
public void getPipelineInfo(BusinessObject oBO, ref string strInfo)
{
string strTmp = "";
PropertyValueString oStrPropVal;
PropertyValueCodelist oCLPropVal;
PropertyValueDouble oDouPropVal;
//Name
oStrPropVal = (PropertyValueString)oBO.GetPropertyValue("IJNamedItem", "Name");
strTmp = oStrPropVal.PropValue;
strInfo += "Name : " + strTmp + " ";
//Description
oStrPropVal = (PropertyValueString)oBO. ("IJPipelineSystem", "Description");
strTmp = oStrPropVal.PropValue;
strInfo += "Description : " + strTmp + " ";
//Sequence Number
oStrPropVal = (PropertyValueString)oBO.GetPropertyValue("IJPipelineSystem", "SequenceNumber");
strTmp = oStrPropVal.PropValue;
strInfo += "Sequence Number : " + strTmp + " ";
//Fluid Requirement
oCLPropVal = (PropertyValueCodelist)oBO.GetPropertyValue("IJPipelineSystem", "FluidSystem");
strTmp = oCLPropVal.PropertyInfo.CodeListInfo.GetCodelistItem(oCLPropVal.PropValue).Name;
strInfo += "Fluid Requirement : " + strTmp + " ";
//Fluid Type
oCLPropVal = (PropertyValueCodelist)oBO.GetPropertyValue("IJPipelineSystem", "FluidCode");
strTmp = oCLPropVal.PropertyInfo.CodeListInfo.GetCodelistItem(oCLPropVal.PropValue).Name;
strInfo += "Fluid Type : " + strTmp + " ";
对于船舶其他专业(船体、风管、舾装、电气等)的数据抽取,利用S3D软件提供数据结构浏览器工具,结合S3D建模环境中模型数据结构查看功能,开发人员能够将各个专业的数据进行提取。
结合船舶二次开发的特点(设计标准多样化、生产管理主导和产品全生命周期长)与邮船产品的建造特点(工程管理复杂、总段化与模块化建造、建造过程控制严格和全过程精度控制技术要求高等[11]),邮船设计软件S3D的二次开发,需围绕业务特点设计一个具备良好伸缩性的软件架构。下文简要说明当前通用的2种软件架构:分层架构和微核架构,并提出适合船舶业务特点和S3D设计软件的软件构架。
分层架构是最常见的软件架构[12],也是事实上的标准架构。该架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节,层与层之间通过接口通信。分层架构的优点是:结构简单,容易理解和开发,每一层都可以独立测试,其他层的接口通过模拟解决,可并行开发,便于组织分工。其缺点是:扩展性差,增加或变更功能必须依次扩展每一层,由于每一层内部是耦合的,扩展很困难。
微核架构又称"插件架构",指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。内核通常只包含系统运行的最小功能[13],插件互相独立,插件之间的接口通信减少到最低,避免出现互相依赖的问题。微核架构的优点是:功能延伸性良好,业务上需要什么功能,开发一个插件即可,功能之间是隔离的,插件可独立加载和卸载,容易部署,可定制性高,适应不同的开发需求,可以渐进式地进行开发,逐步增加功能。其缺点是: 开发难度相对较高, 对于内核设计的要求高。
根据船舶建造和S3D软件二次开发的特点,提出以微核框架为主体,内核为分层架构的软件架构。S3D邮船二次开发架构如图5所示:内核采用分层结构,核心内容为邮船建模规范的数字化层,以WORD、EXCEL和PDF文件形式作为设计建模指导的建模规范进行数字化,直接在前端S3D设计软件进行约束指导;同时,对S3D的中间层和客户层进行封装,形成邮船S3D系统数据层作为系统的内核,将邮船相关业务以插件模块形式进行组合。内核采用分层结构便于理解开发,设计标准的变更对于企业来说相对固化,扩展性不是关键点。二次开发最重要的依据是设计标准,嵌入邮船设计标准作为内核的一部分可为邮船设计业务相关使用场景、规则和复杂条件的处理定义通用的业务逻辑;而整体采用微核框架则是从邮船产品建造特点出发,以良好的功能延伸线与各种外部系统对接,适应不同的开发需求。
图5 S3D邮轮二次开发架构
基于上述软件架构,利用内核API接口,开发邮船报表系统-结构专业组立清单程序,要求按船厂的格式在图纸上添加重量与重量中心和装配报表即组立清单,包括各装配的页码信息,且能通过刷新自动更新报表和页码。图6为系统组立清单主界面。用户可选择同步工程数据、组立重量中心和零件报表功能,右侧主界面显示对应装配结构树下分段的组立清单,包含组立名,干重,重量中心x、y、z等。
图6 系统组立清单主界面
该系统主要技术路线为:利用内核提供功能,用户设置S3D工程连接,程序后台连接S3D工程数据,加载显示主界面上的装配结构树,用户点击相应装配节点,后台抽取对应节点下的结构属性信息,获取组立名、重量与重量中心,自动计算该节点下所有结构模型的面积和基面投影面积,最终组织形成组立清单并导出EXCEL文件,如图7所示。
图7 导出的EXCEL组立清单文件
对S3D软件系统架构、开发工具和语言进行分析,对开发接口、数据库以及开发调试方法进行论述,归纳S3D提供的二次开发技术手段,并提出二次开发软件架构,结合国产大型邮船生产设计在S3D软件上的需求,通过二次开发技术进行定制化的二次开发应用,开发符合国产大型邮船设计的二次开发软件,既可加强拓展基于S3D系统的国产大型邮船的设计功能,又可降低设计人员的工作量,提高设计质量,从而缩短设计周期,保证国产大型邮船的设计工作顺利开展。