批量CAD圖樣的快速本地化方法

2013-08-09  by:廣州機(jī)械cad設(shè)計(jì)  來源:仿真在線

批量CAD圖樣的快速本地化方法

 

一、引言

隨著經(jīng)濟(jì)全球化的發(fā)展,外向型企業(yè)越來越多,磁懸浮、C919大型客機(jī)等各類國(guó)際招投標(biāo)和國(guó)際合作項(xiàng)目也迅速增加,CAD圖樣作為工程師的語(yǔ)言,無論在工廠或項(xiàng)目中無疑都扮演著舉足輕重的作用。一個(gè)項(xiàng)目或產(chǎn)品,少則數(shù)十張,多則上千張的外文CAD圖樣,要求所有需要用到圖樣的人員都能很好地理解圖樣上的外文文字,顯然是不可能的。那么如何快速準(zhǔn)確地進(jìn)行圖樣本地化,將其翻譯成目標(biāo)語(yǔ)言,就成了項(xiàng)目實(shí)施必須首先解決的問題。

以俄羅斯某石油管道招標(biāo)工程為例,工程的技術(shù)說明共附了3000多個(gè)CAD圖樣文件,參與投標(biāo)的公司要在一周內(nèi)根據(jù)這些圖樣判斷自己是否有能力參與這個(gè)工程的投標(biāo)。然而3000多個(gè)CAD文件是一個(gè)很龐大的工作量,讓翻譯人員在圖樣中對(duì)原有的大量文字進(jìn)行逐個(gè)編輯,效率很低,也很容易出錯(cuò),在要求的時(shí)間內(nèi)根本無法完成。

筆者受某翻譯公司的委托,使用VB.NET設(shè)計(jì)開發(fā)了CAD圖樣的快速本地化軟件,自動(dòng)批量讀取CAD文件中的所有文字,過濾所有重復(fù)后通過GOOGLE的自動(dòng)翻譯API做初步翻譯,然后生成EXCEL對(duì)照文件,供翻譯人員進(jìn)行審核,審核完成后再批量寫回CAD文件。在軟件的幫助下,僅用三天時(shí)間就完成整套工程圖樣的翻譯工作,幫助客戶順利完成了投標(biāo)。本文對(duì)實(shí)現(xiàn)的思路和方法進(jìn)行詳細(xì)的說明,并給出了關(guān)鍵代碼和實(shí)際效果的圖示。

二、CAD文字的批量提取

1.獲取所有CAD文件列表

獲取所有文件列表有很多方法,其中遍歷子目錄是最常用的方法,也有很多成熟的算法,但程序比較繁瑣。本文通過調(diào)用cmd.exe進(jìn)程的DIR功能直接獲取文件名列表,簡(jiǎn)潔有效。

DimmyProcessAsProcess=NewProcess()

myProcess.StartInfo.Arguments=“cmd.exe/cdir“””&destDirName&fType&“””/a/s/b>”””&

OutFileName&“””&&exit”

myProcess.Start()

myProcess.Close()

2.提取CAD文件字符串信息

獲取了所有CAD文件的全路徑名之后,就可以通過逐個(gè)讀取CAD文檔的方法,抽取CAD的字符串內(nèi)容。可以使用最常用的ActiveX方法連接VB.NET和AutoCAD,然后讀取AutoCAD的文檔。

AutoCAD文檔結(jié)構(gòu)并不復(fù)雜,主要分為應(yīng)用程序Application、當(dāng)前文檔ThisDrawing、模型空間ModelSpace和具體圖元Entities這幾個(gè)層次。文字信息一般就包含在AcadText和AcadMtext兩類實(shí)體中,有些特殊情況下也會(huì)使用圖塊的屬性來保存文字信息。

在具體的應(yīng)用中,要有效地抽取所需要的文字信息,并按照正常的閱讀順序組織起來,并不是簡(jiǎn)單地遍歷模型空間就可以實(shí)現(xiàn),主要需要考慮以下幾個(gè)方面的問題。

實(shí)際工程圖樣中大量應(yīng)用圖塊,而圖塊中文本是不會(huì)被識(shí)別為文本實(shí)體的。如果只遍歷文本實(shí)體來獲取字符串,會(huì)造成大量數(shù)據(jù)丟失。

AutoCAD中的圖塊,在整個(gè)文檔的數(shù)據(jù)組織中扮演中重要的作用。最基本的模型空間和圖樣空間,都是作為圖塊來工作的,其塊名以“_space”結(jié)尾。這樣問題就有了解決的方法:首先在圖塊集合中判斷,哪些塊在圖樣空間和模型空間中進(jìn)行了引用;然后在實(shí)際進(jìn)行引用的圖塊中,通過遞歸調(diào)用的方法,讀取圖塊中的所有文本。關(guān)鍵代碼如下:

ForBlockI=0ToThisDrawing.Blocks.Count-1

‘只判斷在圖樣空間和模型空間中進(jìn)行引用的塊名,跳過其他塊

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

'記錄塊名,然后再進(jìn)行操作AddtoBlockListobj.NameEndIf

EndIf

Nextobj

nextBlockI1:NextBlockI

AutoCAD的數(shù)據(jù)庫(kù)中,文本信息的存儲(chǔ)次序和文本閱讀次序是完全不同的,如果不加任何處理地把字符串讀取出來,呈現(xiàn)在文字處理人員面前的,只能是難以理解甚至毫無意義的文字羅列。

實(shí)際工程應(yīng)用的圖樣上,會(huì)有大量的文本信息以不同格式分散在圖樣的各處。這些信息,在有圖、線配合時(shí),不會(huì)造成閱讀上的歧義。而從CAD圖形文檔中挖掘出來的純文本的信息,組織過程中就必須考慮到如何消除歧義,便于閱讀。由于在圖樣的實(shí)際繪制過程中,不同的繪圖人員會(huì)有不同的排版、斷句習(xí)慣,所以要解決各種情況下的數(shù)據(jù)識(shí)別和組織問題,主要通過規(guī)則庫(kù)(固有規(guī)則+自定規(guī)則)的方法來實(shí)現(xiàn)。

對(duì)于一些常見的數(shù)據(jù)塊形式,如表格、技術(shù)說明等,可以通過固有規(guī)則進(jìn)行識(shí)別。主要的識(shí)別依據(jù)是通過字體、字高、字符間距、指定區(qū)域內(nèi)文字?jǐn)?shù)目、文本間是否有間隔線等信息進(jìn)行相鄰句判斷。

對(duì)于一些不常見的數(shù)據(jù)形式,如用單字表達(dá)并且字符間距很大的詞語(yǔ),異常斷句等,允許用戶通過設(shè)定自定義規(guī)則進(jìn)行過濾。

經(jīng)過雙重規(guī)則的過濾之后,由于圖樣數(shù)據(jù)的復(fù)雜性,仍然可能會(huì)有部分孤立數(shù)據(jù)無法識(shí)別,這部分只能標(biāo)注之后通過人工的方式進(jìn)行特別處理。有了完善的規(guī)則庫(kù),需要人工干預(yù)部分的比例,是很低的。

規(guī)則過濾前后的文本數(shù)據(jù)對(duì)比示意。

處理后字符串列表中,斷句的后續(xù)部分將自動(dòng)合并到首字符串,并以##標(biāo)記,為后續(xù)數(shù)據(jù)寫回CAD提供依據(jù)。

AutoCAD中大量使用轉(zhuǎn)義字符,如小語(yǔ)種(非英語(yǔ))字符全部是用UNICODE代碼來表示的,這部分也需要進(jìn)行轉(zhuǎn)換操作才有可讀性。

AutoCAD的文本數(shù)據(jù)中,使用了轉(zhuǎn)義字符的,均用“\U+”開頭,UNICODE和ASCⅡ有固定的對(duì)應(yīng)關(guān)系,所以通過數(shù)據(jù)庫(kù)查表的方式,替換對(duì)應(yīng)字符串即可實(shí)現(xiàn)。圖2是俄語(yǔ)字符串的轉(zhuǎn)換實(shí)際效果示意。

三、翻譯模塊

文本數(shù)據(jù)從CAD文檔中抽取后,可以人工進(jìn)行翻譯,也可以調(diào)用GOOGLE、BING等自動(dòng)翻譯API進(jìn)行。人工翻譯比較準(zhǔn)確,但成本較高,自動(dòng)翻譯比較快速,但質(zhì)量相對(duì)較低。本文采用的是GOOGLE的自動(dòng)翻譯API接口。GOOGLE在技術(shù)文字的翻譯這塊已經(jīng)取得了巨大的進(jìn)展,雖然翻譯的質(zhì)量還達(dá)不到人工翻譯的要求,但是可以滿足基本的閱讀需要,而且在專業(yè)術(shù)語(yǔ)翻譯部分,由于有GOOGLE海量數(shù)據(jù)庫(kù)的支持,正確率較高。GOOGLE的自動(dòng)翻譯接口需要FRAMEWORK3.5的支持。

具體實(shí)現(xiàn)的代碼很簡(jiǎn)潔:

‘引用GoogleTranslateAPI;

sourceLan=Google.API.Language.ChineseSimplified

‘設(shè)定源語(yǔ)言類別

targetLan=Google.API.Language.English‘設(shè)定目標(biāo)語(yǔ)言類別

SearchByEnginee=Translator.Translate(temps,sourceLan,targetLan)‘調(diào)用translate函數(shù)實(shí)現(xiàn)自動(dòng)翻譯,返回的字符串,就是自動(dòng)翻譯的結(jié)果。

自動(dòng)翻譯的結(jié)果在人工校核之后,再寫回CAD,以提高翻譯的準(zhǔn)確性。

四、文字的寫回

翻譯后文本信息的寫回,可以用查表的方法替換CAD中的文字,也可以將翻譯完成的文字,采用讀取文字完全相同的次序?qū)懭隒AD。本文采取的是后一種方法,即根據(jù)所提取字符串的次序,產(chǎn)生目的語(yǔ)言字符串列表,然后直接將所得的字符串列表逐個(gè)寫入原CAD文檔中。

在文字的排版上,按照以下規(guī)則確定:字高根據(jù)原文字高決定,長(zhǎng)寬比則根據(jù)原有文字的寬度來決定,可以選擇雙語(yǔ)混排或直接替換為目的語(yǔ)言。文字統(tǒng)一放入新層中便于管理。主要代碼如下:

‘添加層,設(shè)置層的屬性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‘保存文檔。


開放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(guān)標(biāo)簽搜索:批量CAD圖樣的快速本地化方法 批量CAD圖樣的快速本地化方法 AutoCAD培訓(xùn) AutoCAD培訓(xùn)課程 AutoCAD圖紙?jiān)O(shè)計(jì) AutoCAD在線視頻 AutoCAD技術(shù)學(xué)習(xí)教程 AutoCAD軟件教程 AutoCAD資料下載 Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓(xùn) Abaqus培訓(xùn) 

編輯
在線報(bào)名:
  • 客服在線請(qǐng)直接聯(lián)系我們的客服,您也可以通過下面的方式進(jìn)行在線報(bào)名,我們會(huì)及時(shí)給您回復(fù)電話,謝謝!
驗(yàn)證碼

全國(guó)服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號(hào)金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點(diǎn)擊咨詢 點(diǎn)擊咨詢
項(xiàng)目QQ咨詢:點(diǎn)擊咨詢
email:kf@1cae.com