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程序看的懂得工程师拿走直接用吧,节省大量时间,科学技术果然是第一生产力。


分享到:


相關文章: