批量CAD图样的快速本地化方法
2013-08-09 by:广州机械cad设计 来源:仿真在线
批量CAD图样的快速本地化方法
一、引言
随着经济全球化的发展,外向型企业越来越多,磁悬浮、C919大型客机等各类国际招投标和国际合作项目也迅速增加,CAD图样作为工程师的语言,无论在工厂或项目中无疑都扮演着举足轻重的作用。一个项目或产品,少则数十张,多则上千张的外文CAD图样,要求所有需要用到图样的人员都能很好地理解图样上的外文文字,显然是不可能的。那么如何快速准确地进行图样本地化,将其翻译成目标语言,就成了项目实施必须首先解决的问题。
以俄罗斯某石油管道招标工程为例,工程的技术说明共附了3000多个CAD图样文件,参与投标的公司要在一周内根据这些图样判断自己是否有能力参与这个工程的投标。然而3000多个CAD文件是一个很庞大的工作量,让翻译人员在图样中对原有的大量文字进行逐个编辑,效率很低,也很容易出错,在要求的时间内根本无法完成。
笔者受某翻译公司的委托,使用VB.NET设计开发了CAD图样的快速本地化软件,自动批量读取CAD文件中的所有文字,过滤所有重复后通过GOOGLE的自动翻译API做初步翻译,然后生成EXCEL对照文件,供翻译人员进行审核,审核完成后再批量写回CAD文件。在软件的帮助下,仅用三天时间就完成整套工程图样的翻译工作,帮助客户顺利完成了投标。本文对实现的思路和方法进行详细的说明,并给出了关键代码和实际效果的图示。
二、CAD文字的批量提取
1.获取所有CAD文件列表
获取所有文件列表有很多方法,其中遍历子目录是最常用的方法,也有很多成熟的算法,但程序比较繁琐。本文通过调用cmd.exe进程的DIR功能直接获取文件名列表,简洁有效。
DimmyProcessAsProcess=NewProcess()
myProcess.StartInfo.Arguments=“cmd.exe/cdir“””&destDirName&fType&“””/a/s/b>”””&
OutFileName&“””&&exit”
myProcess.Start()
myProcess.Close()
2.提取CAD文件字符串信息
获取了所有CAD文件的全路径名之后,就可以通过逐个读取CAD文档的方法,抽取CAD的字符串内容。可以使用最常用的ActiveX方法连接VB.NET和AutoCAD,然后读取AutoCAD的文档。
AutoCAD文档结构并不复杂,主要分为应用程序Application、当前文档ThisDrawing、模型空间ModelSpace和具体图元Entities这几个层次。文字信息一般就包含在AcadText和AcadMtext两类实体中,有些特殊情况下也会使用图块的属性来保存文字信息。
在具体的应用中,要有效地抽取所需要的文字信息,并按照正常的阅读顺序组织起来,并不是简单地遍历模型空间就可以实现,主要需要考虑以下几个方面的问题。
实际工程图样中大量应用图块,而图块中文本是不会被识别为文本实体的。如果只遍历文本实体来获取字符串,会造成大量数据丢失。
AutoCAD中的图块,在整个文档的数据组织中扮演中重要的作用。最基本的模型空间和图样空间,都是作为图块来工作的,其块名以“_space”结尾。这样问题就有了解决的方法:首先在图块集合中判断,哪些块在图样空间和模型空间中进行了引用;然后在实际进行引用的图块中,通过递归调用的方法,读取图块中的所有文本。关键代码如下:
ForBlockI=0ToThisDrawing.Blocks.Count-1
‘只判断在图样空间和模型空间中进行引用的块名,跳过其他块
IfInStr(1,LCase(ThisDrawing.Blocks.Item(BlockI).Name),"_space")=0Then
GoTonextBlockI1
EndIf
记录在SPACE中直接使用的块名
ForEachobjInThisDrawing.Blocks.Item(BlockI)
Ifobj.ObjectName="AcDbBlockReference"Then
If(proNoVisible=FalseAndLayers(obj.Layer).Freeze
=False)OrproNoVisible=TrueThen
'记录块名,然后再进行操作AddtoBlockListobj.NameEndIf
EndIf
Nextobj
nextBlockI1:NextBlockI
在AutoCAD的数据库中,文本信息的存储次序和文本阅读次序是完全不同的,如果不加任何处理地把字符串读取出来,呈现在文字处理人员面前的,只能是难以理解甚至毫无意义的文字罗列。
实际工程应用的图样上,会有大量的文本信息以不同格式分散在图样的各处。这些信息,在有图、线配合时,不会造成阅读上的歧义。而从CAD图形文档中挖掘出来的纯文本的信息,组织过程中就必须考虑到如何消除歧义,便于阅读。由于在图样的实际绘制过程中,不同的绘图人员会有不同的排版、断句习惯,所以要解决各种情况下的数据识别和组织问题,主要通过规则库(固有规则+自定规则)的方法来实现。
对于一些常见的数据块形式,如表格、技术说明等,可以通过固有规则进行识别。主要的识别依据是通过字体、字高、字符间距、指定区域内文字数目、文本间是否有间隔线等信息进行相邻句判断。
对于一些不常见的数据形式,如用单字表达并且字符间距很大的词语,异常断句等,允许用户通过设定自定义规则进行过滤。
经过双重规则的过滤之后,由于图样数据的复杂性,仍然可能会有部分孤立数据无法识别,这部分只能标注之后通过人工的方式进行特别处理。有了完善的规则库,需要人工干预部分的比例,是很低的。
规则过滤前后的文本数据对比示意。
处理后字符串列表中,断句的后续部分将自动合并到首字符串,并以##标记,为后续数据写回CAD提供依据。
AutoCAD中大量使用转义字符,如小语种(非英语)字符全部是用UNICODE代码来表示的,这部分也需要进行转换操作才有可读性。
AutoCAD的文本数据中,使用了转义字符的,均用“\U+”开头,UNICODE和ASCⅡ有固定的对应关系,所以通过数据库查表的方式,替换对应字符串即可实现。图2是俄语字符串的转换实际效果示意。
三、翻译模块
文本数据从CAD文档中抽取后,可以人工进行翻译,也可以调用GOOGLE、BING等自动翻译API进行。人工翻译比较准确,但成本较高,自动翻译比较快速,但质量相对较低。本文采用的是GOOGLE的自动翻译API接口。GOOGLE在技术文字的翻译这块已经取得了巨大的进展,虽然翻译的质量还达不到人工翻译的要求,但是可以满足基本的阅读需要,而且在专业术语翻译部分,由于有GOOGLE海量数据库的支持,正确率较高。GOOGLE的自动翻译接口需要FRAMEWORK3.5的支持。
具体实现的代码很简洁:
‘引用GoogleTranslateAPI;
sourceLan=Google.API.Language.ChineseSimplified
‘设定源语言类别
targetLan=Google.API.Language.English‘设定目标语言类别
SearchByEnginee=Translator.Translate(temps,sourceLan,targetLan)‘调用translate函数实现自动翻译,返回的字符串,就是自动翻译的结果。
自动翻译的结果在人工校核之后,再写回CAD,以提高翻译的准确性。
四、文字的写回
翻译后文本信息的写回,可以用查表的方法替换CAD中的文字,也可以将翻译完成的文字,采用读取文字完全相同的次序写入CAD。本文采取的是后一种方法,即根据所提取字符串的次序,产生目的语言字符串列表,然后直接将所得的字符串列表逐个写入原CAD文档中。
在文字的排版上,按照以下规则确定:字高根据原文字高决定,长宽比则根据原有文字的宽度来决定,可以选择双语混排或直接替换为目的语言。文字统一放入新层中便于管理。主要代码如下:
‘添加层,设置层的属性ThisDrawing.Layers.Add“test”
ThisDrawing.TextStyles.Add“ew”
ThisDrawing.TextStyles(ThisDrawing.TextStyles.Count-1).SetFont“宋体”,False,False,134,2
IfTrim(curS)<>“##”Then
SettempTxt=ThisDrawing.Blocks.Item(BlockI).AddText(curS,newPoint,obj.Height)
tempTxt.Rotation=obj.Rotation
OriJd=tempTxt.RotationtempTxt.Alignment=acAlignmentFittempTxt.TextAlignmentPoint=b
EndIf
tempTxt.Layer=“test”tempTxt.StyleName=“ew”ThisDrawing.Save‘保存文档。
相关标签搜索:批量CAD图样的快速本地化方法 批量CAD图样的快速本地化方法 AutoCAD培训 AutoCAD培训课程 AutoCAD图纸设计 AutoCAD在线视频 AutoCAD技术学习教程 AutoCAD软件教程 AutoCAD资料下载 Fluent、CFX流体分析 HFSS电磁分析 Ansys培训 Abaqus培训