Python批量修改dxf文件中的文本信息@TOC 工程人员在修改CAD图纸的过程中可能会涉及到大量文本内容修改,包括多行文本和单行文本,如果单独一个一个修改费时费力,CAD软件自带有查找替换功能可以批量修改,但只能进行简单的统一替换,对于稍微复杂一些的修改则无能为力。

有些文本修改是有一定规则的,比如需要统一在原有数值上增加一个偏移量,此时可以考虑使用Python进行批量操作,提高工作效率。这里以通信工程中室分图纸修改为例对该方法进行讲解。

首先看下原始图纸:

python 读取 mdf 文件 python读取dxf_3d


现在需要对图纸中的天线后一个电平值(绿色字体)进行调整,统一减掉20.4dBm,同时删除前一个电平值,其它部分保留。如果天线数量少可以手动修改,但这种室分图纸中天线数量基本都是以百来计的,手动修改非常耗费时间,且容易出错。Python中有一个ezdxf包,可以用来创建和修改dxf图形文件,使用该包可以轻松解决这个问题。

1、安装ezdxf包,使用pip命令:

pip install  ezdxf

2、导包并加载dxf文件

import ezdxf
doc = ezdxf.readfile("your_file.dxf")

3、判断文本类型。遍历dxf文件中的实体类型,并打印出多行文本类型"MTEXT"和单行文本类型"TEXT"的文本内容,以此来判断需要修改的文本属于哪种类型。

for entity in doc.entities:
    print(entity.dxftype())
    if entity.dxftype() == "MTEXT":
        print(entity.text)
    if entity.dxftype() == "TEXT":
        print(entity.dxf.text)

输出结果举例:

MTEXT
{\C3;ANT1-10F/9.1dBm/4.1dBm}

4、字符串分割。根据输出结果判断出需要修改的文本属于"MTEXT"类型,并且是一个字符串,下一步需要对该字符串进行处理。
首先根据该字符串中的特殊符号“;”和 “/ ”对字符串进行分割;

str_value = entity.text.split(";")
str_value_part2 = str_value[1]
str_value_part2 = str_value_part2[0 : len(str_value_part2)-1]
str_tmp = str_value_part2.split('/')

这里字符串分割分为两步进行,第一步使用“;”进行分割,第二步使用 “/ ”对第一步分割的结果再进行分割。
第一步分割结果:

['{\\C3', 'ANT1-10F/9.1dBm/4.1dBm}']

第二步分割结果:

['ANT1-10F', '9.1dBm', '4.1dBm']

5、电平值调整。取出第二步分割结果的最后一项,变换为数值后进行数值调整,调整后的数值再反向变换回原来的格式并回填到实体文本属性。

dBm_value_str2 = str_tmp[2][0 : len(str_tmp[2]) - 3]
dBm_value_new2 = format(float(dBm_value_str2) - 20.4, '.1f')
str_value_part2_new = str_tmp[0] + "/" + str(dBm_value_new2) + "dBm"
entity.text = str_value[0] + ";" + str_value_part2_new + "}"

电平值调整并反向变换的结果:

{\C3;ANT1-10F/-16.3dBm}

回填后的文本属性已更新:

MTEXT
{\C3;ANT1-10F/-16.3dBm}

6、保存文件。根据上述步骤对dxf文件中的所有电平值进行变化后保存文件。

doc.saveas("your_file_new.dxf")

打开修改后的图纸:

python 读取 mdf 文件 python读取dxf_python 读取 mdf 文件_02


可以看到已经完成了电平值的修改。

各位读者如果有新的思路和想法欢迎交流!