张 锦 飞
(上海臻元船舶科技有限公司,上海 200052)
在船舶结构设计中,根据肋骨型线围长展开的外板展开图是一份非常重要的图纸。全船所有外板的规格、排列、在外板上布置的各种纵横构件、各层甲板、开口位置、分段缝、冰区加强相关的各种界限线等都必须表示在外板展开图上,以便计算外板重量重心和估算船体钢板规格等,作为船舶建造中订货的主要依据。该图信息量大、纵横线条密集、绘制极其繁琐,不仅费时费力工作量大,而且效率低易出错。因此利用先进的计算机辅助设计(CAD)技术,编制外板自动展开程序既可以在船舶设计过程中提高绘图准确性,又大大降低设绘人员的工作强度,具有较强的现实意义。
CAD技术可以提高船舶设计的效率和质量,已经成为国内造船行业的共识,很多设计单位和船厂已在较大范围内应用了国际先进水平的三维造船软件,具有代表性的软件有 TRIBON M3、FORAN、NAPA、CADDS5、CATIA 、NUPAS-CADMATIC和沪东SPD等,经过多年的经验积累和二次开发,已经达到了很高的应用水平。但由于各种软件针对性和侧重点不同,以及客户的使用习惯,数据转换接口等问题,国内船厂在使用这些软件时多数局限在生产设计阶段,即根据已有的完整退审图纸在这些软件中进行复杂的三维建模,添加工艺信息,进而用于计算机辅助建造(CAE),提高建造质量、缩短周期、降低成本。而在船舶设计的前期阶段,如概念设计、详细设计等阶段,上述这些三维设计软件使用很少。这个阶段主要由各船级社相关软件负责性能计算、强度校核等,而绘制图纸送审则多数仍然广泛采用AutoCAD二维绘图软件。
AutoLISP是AutoCAD最有效的开发工具之一,利用AutoLISP开发的船体外板自动展开程序仅需利用肋骨型线和中横剖面图,不需要复杂的三维软件建模,直接得到详细设计阶段可用于送审的外板展开图,并完善肋骨型线图。
经过对2010版本AutoCAD的ActiveX技术研究[1~4],结合目前船舶设计过程中绘制外板展开图的实际情况和经验,设计了程序的核心算法,应用 AutoLISP编制外板自动展开程序,以实现船舶所有广义纵向构件的外板自动展开。所谓广义纵向构件,泛指所有在外板展开图上表示的纵向对象,既包括甲板、平台、船底舷侧纵骨、纵桁、舱壁、底边舱和顶边舱斜板等真实纵向构件,也包括纵向板缝线、分段缝、冰区加强等各种界限线。
绘制外板展开图需要有两个关键步骤:
1)在肋骨型线图上确定待展开构件的指定位置。
2)获得所选定肋骨型线的展开长度。获得曲线展开长度后即可在外板展开图上确定相应肋位的展开点,并连接成一条曲线,即为需要展开构件的外板展开线。
本程序的流程图见图1。
图1 程序流程
从图1可知,本程序主要有自由展开、按水线展开、按纵剖线展开和按边舱展开4个功能。程序的主对话框界面见图2。
图2 主对话框界面
按待展开肋骨型线的整个曲线总长度展开。其原理是在肋骨型线图上确定指定构件位置,并切除该位置以外的肋骨型线;从图形数据库中直接提取该剩余部分肋骨型线的曲线总长度;最后根据曲线展开长度绘制该构件的外板展开线。
该功能需要切除部分肋骨型线,这破坏了肋骨型线的完整性,不利于后续操作。因此自由展开在程序中将作为一个辅助功能,只处理特别复杂的构件展开线,如甲板边线、舷墙顶线、球鼻艏等。
相当于用一个垂直于船体中纵剖面的平面去切整个船舶,该平面和船体外板的相贯线即为按水线展开的构件指定位置。该平面位置不同使其相贯线在中纵剖面上的投影是一根等高或不等高水线,即相当于等高或不等高的纵向构件。
按水线展开的输入数据对话框见图3。程序根据输入数据计算出不同肋位处的水线高度作为指定位置,然后作水平辅助线。求出指定位置水线与每个肋位肋骨型线的一系列交点,进而获得每根肋骨型线从起点到交点的曲线长度,绘制按水线展开的外板展开线。
等高水线适用于前后高度相等的水平舷侧纵骨、平台、舷侧纵桁等构件的展开线;不等高水线适用于前后高度不相等纵骨、平台、纵桁等构件以及不同高度水平构件之间的过渡构件和倾斜横舱壁、斜凳等的展开线。根据船舶构件的实际布置情况,程序可以分别一次性绘制多根等高构件的展开线和一根不等高构件的展开线。
与按水线展开功能原理相似,按纵剖线展开是相当于用一个垂直于船体基平面的平面去切整个船舶,与船体外板的相贯线即为按纵剖线展开的构件指定位置。同样,按纵剖线展开又可分为等宽和不等宽纵剖线展开两种。具体的输入数据对话框见图4。程序在计算出的指定位置作垂直辅助线,即获得与外板的交点和从起点到该交点的曲线长度。
等宽纵剖线适用于同时绘制多根等宽船底纵骨、纵桁的展开线;不等宽纵剖线适用于绘制一根不等宽纵骨、纵桁等构件的展开线以及不同宽度纵向构件之间过渡构件的展开线。
图3 按水线展开数据输入对话框
图4 按纵剖线展开数据输入对话框
绘制类似于散货船的底边舱和顶边舱斜板与外板交线的展开线。与按水线和纵剖线展开原理类似,用一个底边舱或顶边舱斜板所在的平面去切船舶,其与外板的相贯线即为按底边舱或顶边舱展开的指定位置。
对于底边舱,根据结构布置,底边舱斜板一般坐落于底部纵桁上,并随着纵桁的位置变化而变化。因此需要先找出纵桁的位置变化,然后按底边舱斜板的角度绘制辅助线,找出其与外板的交点,即可得到按底边舱展开的曲线长度。
对于顶边舱,由于甲板存在梁拱,需要同时找出顶边舱垂直板与斜板交点的距舯宽度和距基线高度的变化,然后用顶边舱斜板的角度作辅助线,即可得到其与外板的交点和展开长度。具体的输入数据对话框见图5。
图5 按边舱展开数据输入对话框
实现外板自动展开功能的关键步骤是在肋骨型线图中自动确定构件位置,并计算出一系列肋骨型线的展开长度。程序编制过程中在这两个关键点上遇到不少问题,对此提出如下方法。
程序中采用了AutoLISP扩展函数vlax-Get-Property来直接获取所选择对象的长度属性,进而实现自由展开的功能。需要注意的是,调用该函数前必须利用vlax-ename->vla-object函数将所选择的肋骨型线的图形数据库中的图元名转换为VLA对象名,然后才能用上述函数的length属性提取多段线的总长度。
函数的应用格式:(vlax-get-property object property)
其中:object——VLA对象名;property——所要提取的属性名称,本程序中应用“length”属性;本函数的返回值是对象属性的值即为多段线的总长度。
程序中调用扩展函数vla-intersectwith直接获得相应辅助直线与肋骨型线(多段线)的交点。返回值通过vlax-Variant-Value和vlax-safearray->list函数转换为可处理的交点坐标。
需要特别指出的是,vla-intersectwith函数得到的最终结果是一个交点坐标的列表。如果获得的交点不止一个,则该列表只是所有交点三维坐标的简单一维数组罗列,离多段线起点近的交点坐标列在前面,离起点远的交点坐标列在后面,如果多段线的首尾端点顺序相反,则该列表的顺序也将发生相应的变化。为方便程序的后续处理,需要将该一维列表按每个交点为单位的形式处理成两维列表形式。这样可以很方便地提取其中一个或多个交点,直接得到该交点的三维坐标。一般情况下,将肋骨型线与船体中心线的交点作为每根多段线的起点,根据船体构件的实际布置,选取靠近起点的交点作为构件在该肋位的展开点,而底边舱斜板的外板展开则比较特殊,选取远离起点的交点作为斜板在外板上的展开点。
函数的应用格式:(vla-IntersectWith object IntersectObject ExtendOption)
返回值:图形数据库中交点坐标所存贮的指针位置。通过转换可得到需要的交点坐标。
在获得构件与外板的交点后,利用 vlax-curve-getdistatpoint函数可获取每一根肋骨型线上从起点到该交点的曲线长度。
函数的应用格式:(vlax-curve-getDistAtPoint curve-obj point)
返回值:从起点到指定交点的曲线长度,即在构件处的肋骨型线展开长度。
前期的数据准备主要体现在肋骨型线上。
1)在使用程序前,需要确保肋骨型线中没有重合的型线。如有多余的肋骨型线,绘制展开线时就会错位,得到错误的结果,所以请先检查肋骨型线,删除多余的型线;
2)需要确认肋骨型线是否是多段线(LwPolyline),如不是多段线,需要先转化为多段线。在AutoCAD中,不同的线型有各自的数据存储格式。由于程序将直接读取多段线的数据库资料,存储格式决定了程序是否能获取正确的数据。例如,以下是一个三点多段线的典型实体数据表,在AutoCAD中以联结表形式存放:
((-1 .
表中的每一个子表都代表了一个实体的属性。如上表中第二个子表的组码“0”,表示该实体为“LwPolyline”线型。组码为“10”的子表中分别代表了该多段线三个顶点的坐标值;
3)需要确认肋骨型线的起点是否靠近船体中心线与基线的交点,这将直接关系到所获取的曲线长度是否正确。程序中具有自动识别所选择多段线起点位置的功能,如果位置相反,将自动对调起点位置。但如果在低版本的AutoCAD上使用本程序,由于某些函数无法使用,则需要部分人工干预。
艏艉部是船体中型线变化最为剧烈的部分,这两个区域的外板展开也相当复杂。艏部的球鼻艏和艉部的桨毂使同一肋位的型线分成上下两个部分。艏艉的外板展开原理是一样的,以艏部为例说明一下这部分如何展开。肋骨型线及外板展开示意图见图6。图6中A点为球鼻艏最前点,B点为球鼻艏最后点。
图6 肋骨型线及外板展开
1)球鼻艏展开:球鼻艏在型线中是一个独立封闭的部分,在程序中可以选择用自由展开功能来展开,如6图中A点上面部分展开线;
2)球鼻艏区域构件展开:如图6中5000~7000mm水线的展开,选择按水线展开功能,输入开始水线高5000mm,结束水线高7000mm,间距500mm,则在图中一次性得到5根水平构件的展开线,同时在肋骨型线图上自动绘制这些构件的布置位置,有利于完善肋骨型线图;
3)球鼻艏以上部分构件的展开:这部分构件的展开较为复杂,其操作步骤为:①作为一般构件按水线或纵剖线展开;②确定B点位置,并单独剖出该位置的肋骨型线;③计算出B点位置的展开长度;④将所有B点以上构件的展开线,以B点为基点,同时向上从投影位置移动到展开位置上。
由于本程序直接从AutoCAD数据库读取核心数据,所以构件的外板展开线在肋位点上与肋骨型线中相应肋位的曲线长度完全吻合。因此,本程序得到的外板展开线精度完全取决于肋骨型线的精度。船舶设计前期如果型线比较粗糙,外板展开精度也相应差一些,后期型线经过优化及放样光顺,利用本程序重新展开一次,将得到相当精确的外板展开。对于艏艉部型线变化比较剧烈的区域,只要在该区域加密,多剖出一些肋骨型线,即可得到足够精确的外板展开图。
1)所选择的肋骨型线数量必须≥2,否则程序将出现错误信息,要求用户重新选择肋骨型线;
2)用户选择肋骨型线时,应采用Fence的选择模式,即在命令行键入“F”后选择所需要的肋骨型线;
3)肋骨型线的选择应按肋位号从小到大的顺序选择;
4)用户尽量在船舶的舭部位置选择肋骨型线,这个位置肋骨型线之间的差别相对较明显,容易按肋位号的顺序识别。如果在舷侧位置选择,则由于不同肋位型线相互重叠,容易导致肋位顺序的识别错误,从而绘制错误的展开线;
5)用户选择肋骨型线时,需要尽量避免选择到肋骨型线以外的实体,如文字、其他线型等;
6)选择肋骨型线时,需要用户预估一下待展开构件与所选择型线的相对位置,若没有交点,则无法得到该构件的外板展开线。
外板自动展开程序主要是用AutoLISP语言直接调用扩展函数,利用ActiveX数据结构直接访问图形数据库,通过将图形对象和 VLA对象相互转化,对特定对象的方法和属性进行直接操作,这样使得程序编写明显简化,安全可靠,可以大大地扩充程序的功能。
本程序基本包括了外板展开图中几乎所有需要绘制的构件,常见的船型均可使用。展开同时同步得到构件在肋骨型线图上的布置位置。实践证明,在船舶设计前期利用外板自动展开程序进行设计和绘制船体肋骨型线图和外板展开图,既能大大提高设绘工作的效率、缩短设绘周期,又能极大的提高图形绘制的精确度,保证了图纸质量,达到了程序编制的预期要求。
[1] 张 辉. 利用VBA技术实现外板展开线的自动绘制[J]. 船舶设计通讯,2005, (1): 58-60.
[2] 孙家鹏. AutoCAD二次开发技术在绘制船体外板展开图上的应用[J]. 上海造船,2006, (4): 16-19.
[3] 陈伯雄,冯 伟. Visual LISP程序设计——技巧与范例[M]. 北京:人民邮电出版社,2002.
[4] 刘银远. AutoLISP(10.0版)教程(初级、中级、高级)[M]. 北京:北京希望电脑公司.