Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

年後開幹雅萬高鐵動車組電氣設計,項目基於中國標準動車組平臺,雖有現成圖紙只需小範圍修改,但復興號圖紙上的元器件、設備等的操作銘牌和功能標貼裡的中文內容需都更換為英文。已將中英文對照翻譯完成,剩下的是替換工作。

Autocad文本查找和替換功能很強大,甚至支持正則表達式。先簡單介紹一下正常Autocad查找替換功能:


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖1

圖1 dwg文件內的內容,其中有各種角度的中文詞條


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖2

圖2 我們開始替換,在命令行中鍵入find命令彈出查找替換對話框,在查找內容欄裡填入‘空調’,在替換為欄中填入‘Air conditional’點擊全部替換按鈕,完成‘空調’中英文切換。


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖3

圖3 替換結果。可見圖1‘空調’的中文詞條替換為英文‘Air conditional’

這樣做是沒問題的,但如此替換,只能一條一條進行,我圖紙中有上千條不同中文詞條,需執行上千次find命令,而且人工上千次複製粘貼這些替換和被替換詞條很難保證不發生錯誤。所以最簡便的方法是批量替換詞條。但我所知Acad沒這個功能,據說某些cad插件工具包有批量詞條替換的功能,但不免費。我試了一個免費的,好像沒反應。偷懶的路註定不是一帆風順。

想自己搞個lisp腳本,看看AutoLisp密密麻麻的小括號我放棄了。後來百度發現Python有個俄國人寫的Acad庫,研究了一下,可行!


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖4

圖4 是我的中英文翻譯。保存在Excel文件名為dicts.xlsx的第一個sheet中(這個sheet不用管它叫什麼名字,本圖名為sheet 1)。A列為中文,B列為A列對應的英文。也就是說要把A1的中文替換為B1的中文。

這次我用到openpyxl和pyautocad兩個庫。openpyxl用以讀取Excel中的翻譯內容,pyautocad用以替換Autocad的文本。

建Python文件acadtextreplace.py

內容如下

# -*- coding:utf-8 -*-

from openpyxl import load_workbook#需導入openpyxl

from openpyxl import Workbook

from openpyxl.styles import Color, Font, Alignment,PatternFill #單元格的樣式

from pyautocad import Autocad,APoint#需導入pyautocad

class CiExcel():#建讀Excel類

def ReadListFromExcel(self,filename):#成員函數

wb=load_workbook(filename)#載入excel文件,filename是主函數傳過來的‘dicts.xlsx’

for sheet in wb:#枚舉sheet

break#第1個sheet就跳出

ws = wb[sheet.title]獲得第一個sheet對象

dictstring = '{'#dicts構造一個字典字符串最後返回:"{'門控器1':'Door controller 1','門控器2':'Door controller 2',......}"

for i in range(1,sheet.max_row+1):#歷遍sheet 1的所有行

oldcode=ws['A%d'%i].value#oldcode放中文

newcode=ws['B%d'%i].value#newcode放英文

istr = "'%s':'%s'," % (oldcode, newcode)

dictstring += istr

dictstring = dictstring[0:-1] + '}'#構成可轉字典的字符串

return dictstring

def main():#主函數

ciExcel = CiExcel()#聲明excel類對象

sCon = ciExcel.ReadListFromExcel('dicts.xlsx')#讀取'dicts.xlsx'文件

dBigDict = eval(sCon)#返回的內容轉成字典

acad = Autocad(create_if_not_exists=True)#生成Autocad對象

acad.prompt("Hello! Autocad from Python.")#沒用

print(acad.doc.Name)#沒用

# 遍歷CAD圖像對象,修改對象屬性

for text in acad.iter_objects('Text'):

if text.TextString in dBigDict.keys():

print('text: %s at: %s' % (text.TextString, text.InsertionPoint))#text.TextString即為中文詞條

text1 = (text.TextString)

text1 = text1.replace(text1, dBigDict[text1])#中文詞條替換為英文詞條

text.TextString = text1#把acad中文字改為英文

print(text.TextString)#沒用

print('end')#打印結束

if __name__ == '__main__':#主函數入口

main()

注意:程序運行時請將要替換的文件用Autocad打開前置,程序會把dicts.xlsx中列出的詞條在打開的文件中替換完畢,然後僅需保存一下Autocad。

另外,精簡版或綠色版的Autocad閹割了一些功能,會導致程序不起作用,請用完整版的Autocad。支持正版支持Autodesk公司。


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖5

如圖5 打開dwg文件,運行acadtextreplace.py。我是在Pycharm下命令行:E:\\my\\Python\\E56\\venv\\Scripts\\python.exe E:/my/Python/E56/acadtextreplace.py 別在意我的文件目錄,其實是 python.exe acadtextreplace.py


Python實現翻譯Autocad文件內中文功能即dwg文件內文本批量替換

圖6

圖6是替換英文結果。運行完成點擊cad窗口前置會自動刷新文字內容。

如此這般,再多的詞條我也秒完。

本想生成.exe可執行程序給分享下載用的,結果發現pyautocad對python文字編碼有問題,用pyinstaller生成的exe文件編碼出錯,先就這樣吧,手頭急著出圖,後面有空再研究.exe了。Python程序看的懂得工程師拿走直接用吧,節省大量時間,科學技術果然是第一生產力。


分享到:


相關文章: