船舶设计中大批量图纸文件有关信息的自动提取

2011-08-11 01:47:18张宗科
船舶 2011年4期
关键词:图框页码重量

张宗科

(中国船舶工业集团公司第七○八研究所 上海200011)

0 引 言

通常而言,一条船的设计阶段包括方案设计、技术设计、施工设计与完工设计。在专业分工组成上,分为总体、结构、舾装、轮机、电气、空调、观导等专业。图纸文件目录是船舶设计各专业图纸文件的一份明细,它由总体专业加以汇总,其中所需的图纸文件有关信息见图1。一般在各设计阶段的最后几天才能提交,这样留给总体专业汇总的时间非常紧迫,特别是对于军船等时间节点要求“后墙不倒”而言,更是迫切。对于一条船来说,少则有几百份设计图纸文件,多则有上千份,因此汇总图纸文件目录是件十分繁琐的事。有时归档的蜡纸打印好,对照图纸实物逐份校对后,还要对图纸文件目录进行返工。如何利用各专业最终完成的图纸文件将汇总目录所需信息自动提取出来,从而减少人工工作量将是一件非常有意义的事。

图1 图纸文件目录中所需的图纸文件有关信息

1 实现思路

AutoCAD作为工程技术人员使用的绘图工具,具有多种二次开发方式,如内嵌的AutoLISP/Visual LISP开发语言、VBA,以及ObjectARX与Visual Basic。利用VB编程对AutoCAD进行二次开发,不仅可将AutoCAD当作自己VB程序中的一个图形窗口,而且可实现使用AutoCAD直接绘图自身所不能或不易实现的功能和效果。Word与Excel内嵌了功能强大的VBA开发工具,在同作为Micorsoft公司产品的VB眼中看来,操控Word与Excel更是得心应手。

七○八所军船中心在图纸文件设绘中都采用了标准图框,这为图纸文件信息的自动提取奠定了基础[1,2]。在设计过程中,各专业图纸文件存放于自己专业的文件夹内,进而组合形成一个不同设计阶段的文件夹。根据选定的设计阶段文件夹,利用批处理命令“dir*.*/b/a:d->listDir.dat”获得子文件夹的名称,再由“dir*.dwg/b/s->listdwg.dat”、“dir*.doc/b/s->listDoc.dat”、“dir*.xls/b/s->listXls.dat” 得到子文件夹(不同专业)下三类文件的名称。或者由Dir(MyPath,vbDirectory)与(GetAttr(MyPath&MyName)And vbDirectory)=vbDirectory来找到某个文件夹下面子文件夹的名称列表,再由 Dir(MyPath,vbNormal)与 (GetAttr (MyPath&MyName)And vbNormal)=vbNormal,(InStr(MyName,".dwg")>0)来找到子文件夹下AutoCAD文件的列表。用VB分别控制AutoCAD、Word与Excel,将图纸文件的有关信息提取出来,如图纸代号、名称、张数、面积、密级等,从而为图样和技术文件目录的汇总提供基础。同时还可获得每份图纸的编制、校对、审核、标检与审定人员的名字,以及图纸会签的信息。

程序自动将每个专业的图纸文件信息形成一个数据文件,并且将其中有问题的图纸文件以备注方式标出错误种类,如页数、面积有误等。在Excel中打开该文件,对图纸代号所在的列进行“有标题行”的升序排序,即可得到满足打印条件的“全船图样及技术文件目录”文件。

2 实现方法

2.1 AutoCAD文件

七○八所军船中心在图纸设绘中采用了统一的图框格式,每份图纸文件信息(如文件名、图号、页数、面积、密级等)均作为Block的Attributes包含其中。本文仔细分析了图框的格式及组成,利用VB编程操控AutoCAD将每份图纸的信息自动提取出来,并输出到文件中加以汇总[3]。同时可自动验证原图纸中的反向图号、总面积、总页数等信息是否有误。对于产品名称 (PRODUCT-NAME)、图纸名称(DRAW-NAME)、密级(STANDBY4)等信息,有时由于特殊字符的存在或字数太多太长,并不是作为Attribute的属性值而存在,则利用图框中该位置处(区位框四周打×者)与当前Pixel_Unit获得相关信息,用CP方式进行选择。若该区域存在格式Block以外的对象,则自动提取出来,并作为相应tag的value输出到文件内。将frame_title_c/ce的组成部分插入到文件中时,先后关系不变,但以insert为基点,用块信息 Xscale、Yscale、Zscale 进行缩放,见图2。产品名、文件名、密级的选取定位,需要Line0、Line2、Line3中的有关信息。 frame_title_c与frame_title_ce略有不同,Block中的成员编号70相应于71号,其后依次相应减1。

图2 七○八所统一图框的图纸信息栏

用VB控制AutoCAD提取dwg文件有关信息的流程,参见图3。提取出每份dwg文件的信息后,程序中可检查各页图纸的面积之和与总面积是否一致,若有误,则给出错误提示标识。同时可获得dwg文件所标出的重量信息,用于重量重心计算书的校对。

2.2 Word文件

Word文件主要包括计算书、说明书、明细表等,分为竖式与横式两种,其中竖式封面见图4。

图3 使用统一图框的图纸信息提取流程

图4 七○八所统一图框的竖式Word文件封面首页

利用VB编程,经Active OCX CreateObject方式创建Word应用,打开相应的word文件,尽可能将首页内容选中并copy至剪贴板上,然后paste至记事本文件内或者Excel文件内进行下一步的信息处理。自动提取出有关信息,如文件名、图号、总页数与面积等。

当Word文件由两个及多个Section组成时,封面首页为第一个Section,利用其相关信息,可选中整个封面页,将该页内容copy至剪切板,paste并保存到temp.dat中,再对此文本文件进行处理,提取出有关信息来,不过需要Delay合适的时间间隔。

若Word文件仅由一个Section组成,可通过翻转到文件最后一页最后一行,由插入numPages域的方式来获取页数,由此得到封面首页的近似wdStory end值,将包含封面首页在内尽可能少的内容copy至剪切板[4]。

用VB控制Word提取doc文件有关信息的流程,参见图5。

图5 使用统一图框的Word文件信息提取流程

2.3 Excel文件

Excel文件主要包括重量重心计算书、电缆册、设备明细表等,其中“封面”sheet见图6。

利用VB编程,经CreateObject方式创建Excel应用,打开*.xls文件。判断sheet Name中是否有“封面”。 若有,则经 xls.Application.Sheets("封面").Select,激活“封面”sheet,由 ActiveSheet.UsedRange.Rows.Count来获得已经应用的范围,取得iRowBegin与iColBegin。利用Set foundCell=ExcelSheet.Application.ActiveSheet.UsedRange.Find (What: ="Area",After: =ExcelSheet.Application.ActiveCell,LookIn:=xlFormulas,LookAt: =xlPart,SearchOrder: =xlByRows,Search Direction: =xlNext,MatchCase: =False,MatchByte: =False,SearchFormat:=False)得到各感兴趣 cell的位置,再将所需信息提取出来。

用VB控制Excel提取xls文件有关信息的流程,参见图7。

图7 使用统一图框的Excel文件信息提取流程

下面谈一下Excel打印时在页面上的任意位置处自动插入页码的实现方法。

船舶设计中的“全船电缆册”,少则十几页、多则几百页,此Excel格式的文件要求打印出的每页具有相同的表头,且在表头的同一位置处需插入页码。Excel文件可利用“Print title”功能,使得打印出的每页文件具有相同格式的表头;分页由Excel自动完成,可方便添加或删除任意行,而不像Word中必须重新手动调整分页位置;当然也可在分页预览状态,按需手工调整分页符的位置。相对于Word文件中的页码“所见即所得”,Excel文件中的页码只有在打印预览或输出时才显示出来,这使得调整其位置较为不便。

在打印区域之内的任意位置,设定页码可用两种方式:利用页面设置中的页码按钮,以自定义方式将页码插入;利用VBA中的HPageBreaks与VPageBreaks属性,将取得的页码插入到Excel文件的相应cell中。

2.3.1 自定义页码方式

在Print Preview中,页码垂向的位置调整,可通过按下“页边距”按钮,然后拖曳页眉的页边距(为页眉顶端到页面顶端的距离)控制柄到所需的位置,调整页眉顶端到页面顶端的距离。页码的默认位置,在页面的水平方向是固定的,如LeftHeader左边距左边界为 0.75 inch (54 pt),CenterHeader处于页面水平方向的正中间,RightHeader右边距右边界为0.75 inch(54 pt)。水平方向的位置调整,可通过“页眉/页脚”中的“自定义页眉”选项中的左、中、右三个文本框内设置相应的页码。其中右边的设置页码框内页码位置不能调整,而左、中两个文本框内页码的位置可添加空格键的方式调整(即向右侧移动),这样可在生成的打印输出页面的任意位置处设置页码。Excel中行高的尺寸由长度单位磅(pt)给出,(1 pt=1/72 inch或0.035 cm),而列宽是单元格中0~9号标准字体(工作表的默认文本字体,标准字体决定了“常规”单元格样式的默认字体)平均数的倍数 (the average number of digits 0 through 9 of the standard font that fit in a cell)。如标准字体为“宋体”,字形为“常规”时,0-9号标准字体的平均数中的1相当于6磅。在“页面设置”中设定起始页码,通过增减空格或换行来调整页码在页面上的位置,此外可经设定空行相应的字体大小来微调页码的位置。

2.3.2 给指定的单元格赋值方式

相对于只能在输出页面上的某一位置设定页码“&P”的限制,可以将通过其他途径获得的页码值直接赋值给Excel中的cell,从而实现页码的自动设置。正常情况下可由ActiveSheet的(1+HPageBreaks.Count)与(1+VPageBreaks.Count)相乘得到总页码,其余情形下总页码的获取详见程序中。根据PageSetup的Order值 (xlDownThenOver或xlOver ThenDown),得到预览(或输出)时的先后顺序,从而确定以HPageBreaks或VPageBreaks为内循环设置页码数。“&P”仅在预览或打印输出时才能转换成具体的数值,在程序中不能参加运算。而由此方式获得的页码与“&P”不同,它仅仅是一个循环计数,故可参加程序的运算,如将页码设置为罗马数字的“I、II、III…”及其他的个性化页码(将“页码”设置为仅有偶数值)。而页码字符的大小及页码之间的对齐方式,可由其所依附的Cell的单元格格式中的“字体(Font)”与“文本对齐”(Text Alignment)选项来设置,因而也更为灵活。

程序中的具体实现方式,由InputBox选择页码相应的指定Cell,并由另一InputBox输入需打印的总页数及首页页码数值,其余由程序自动完成。不过由于本文假设的Excel文件在预览或输出时具有相同的表头,程序是对每一页进行循环得到页码数,进而将其值赋给指定的Cell。(对于非相同的标题行,最好由第一种方式设置页码)。效果可由Adobe Acrobat(完全版)安装后自带的Acrobat Distiller虚拟打印机生成pdf格式文件加以检验,不过需给定多个文件名(每页一个文件);直接打印到物理打印机则无此问题。

2.3.3 设置页码两种方法的比较

自定义页码方式保证了打印输出时页码的一致性,并对整个WorkSheet或打印区域起作用;但位置及对齐方式可能会影响到文件的美观,且有时调整会较费时。利用本文程序中第二种方法插入页码,对具有统一标题头的文件,操作较为方便,且可设置个性化页码(如甲、乙、丙、丁等);但当生成的Excel文件横向有较多页时,需以(1+VpageBreaks.Count)为外循环数,对横向的每一页列都需指定标题行中插入页码的Cell位置。

3 重量重心的有关处理

整船的重量重心计算书由各专业提交的分项重量重心汇总而成,而各专业提交的分项方式不尽相同。如结构分项为船体、舱棚、驾驶室、主机基座、支架等;舾装分项为锚及系泊设备布置图、方向舵系布置图、门/窗/盖/梯/栏杆布置图、消防救生设备布置图、舱室布置图、油漆、供应品等;轮机分项为发动机、轴系、油箱、水箱等;电气分项为主配电板、充放电板、驾控台、灯具、蓄电池、电缆及附件等。相对而言,舾装专业各布置图相应的重量可按图索骥,由程序直接从图纸信息栏中提取出来。

如何判断验证各专业的分项重量分布是否有误,是一项费力的工作。将各重量位置直接在总图上表示出来,不失为直观的辅助手段,合理与否尽可一目了然。本文利用VB编程,直接将重量重心计算书中不同sheet(专业)的重量分项名称及其坐标表示在总布置图上,其中每个sheet放在一Layer内(Layer名为 sheet之 name),这样便于操作[5]。 此外,某项重量在俯视图与侧视图上的标识各有一个,以对应三维坐标。为方便对照,程序中将该对标识自动加以编组,形成一个Group。另,为便于调整某一重量Layer中字体大小,编写了LISP辅助程序,只要任选一个标识text,即可对该标识所在Layer内的所有标识更改文字大小。

4 结 语

本文编程在AutoCAD中进行二次开发,辅助实现CAD图纸中有关文件信息的自动提取,对Word与Excel文件信息提取亦开发出相应程序,可减少人工统计的工作量,为总体专业省出宝贵的时间,以完成快速性、续航力、完整稳性、破舱稳性等有关图纸的计算编制。编程自动提取不仅可避免人工统计时出现失误,同时可对原文件信息加以验证,纠正原图纸中的一些基本失误。此外,对重量重心分布位置的判读校验提供了有效的辅助手段。

[1]钱浩.AutoCAD图纸批量打印程序的开发与应用[J].船舶,2006,17(1):61-63.

[2]徐天晓.利用VB二次开发AutoCAD提升打印功能[J].船舶,2009,20(3):61-64.

[3]张晋西.Visual Basic与AutoCAD二次开发[M].清华大学出版社,2002.2.

[4]顾经宇.其实你还没懂Word[M].上海科学技术出版社,2002.

[5]二代龙震工作室.AutoCAD VBA函数库查询词典[M].中国铁道出版社,2003.

猜你喜欢
图框页码重量
Nonlinear Dynamic Analysis and Fatigue Study of Steep Wave Risers Under Irregular Loads
重量
文苑(2020年6期)2020-06-22 08:41:34
CONTENTS OF 2020
特种油气藏(2020年6期)2020-01-05 10:24:40
基于Lisp的自动图框绘制和输出管理技术研究
城市勘测(2019年1期)2019-02-27 08:07:10
基于Microstation V8 XM图纸批量打印的实现
Consequences of early adverse rearing experience(EARE) on development: insights from non-human primate studies
算页码
小学生导刊(2016年2期)2016-11-11 06:09:10
析SP3D软件的ISO出图模板定制
创新的重量
灰的重量
诗潮(2014年7期)2014-02-28 14:11:11