如何批量导出DWG,CAD文件内的文本,单行文本,多行文本

如何导出指定文件夹下的所有dwg文件内的文本呢,包含多行文本和单行文本

本代码有本人测试并修复,可执行,运行的时候先手动打开autocad软件

使用python的 pyautocad库

图片[1]-如何导出指定文件夹下的所有dwg文件内的文本呢,包含多行文本和单行文本
from pyautocad import Autocad, APoint
import os
import re
import time
from pyautocad.utils import unformat_mtext

# 正则表达式用于匹配 .dwg 文件
reg = re.compile(r'.*(.dwg)$')

# 正则表达式用于检测纯数字文本
pure_number_reg = re.compile(r'^\d+$')

# 指定路径
path = r"E:\python\dabao"
dwg_files = []

# 遍历指定目录,获取所有 .dwg 文件的路径
for dirpath, dirname, filename in os.walk(path):
    files = [os.path.join(dirpath, s) for s in filename if os.path.isfile(os.path.join(dirpath, s)) if reg.findall(s)]
    dwg_files.extend(files)

# 检查是否找到了任何dwg文件
if not dwg_files:
    print("No DWG files found in the specified directory.")
    exit()

# 连接到AutoCAD
acad = Autocad(create_if_not_exists=True, visible=True)

# 定义一个函数来确保关闭所有打开的文档
def close_all_documents():
    try:
        while acad.app.Documents.Count > 0:
            acad.ActiveDocument.Close(False)
    except Exception as e:
        print(f"Failed to close document: {e}")

# 初始化操作(只执行一次)
print("Initializing...")  # 打印初始化信号
placeholder_dwg = dwg_files[0]
try:
    acad.app.Documents.Open(placeholder_dwg)
    time.sleep(3)  # 等待3秒,可以根据实际情况调整
    close_all_documents()
except Exception as e:
    print(f"Failed to open or close placeholder DWG: {e}")
    exit()

# 处理所有找到的 .dwg 文件
for filename in dwg_files:
    try:
        # 确保在打开新的文档之前关闭所有打开的文档
        close_all_documents()

        # 打开DWG文件
        acad.app.Documents.Open(filename)
        print("Hello! Extracting text from: {}\n".format(filename))

        # 等待文档完全打开
        time.sleep(2)  # 等待2秒,可以根据实际情况调整

        # 遍历CAD文件中的所有单行文本对象,打印其文本内容
        for entity in acad.iter_objects("Text"):
            if entity.ObjectName == 'AcDbText':  # 确保是单行文本
                text_content = entity.TextString
                if not pure_number_reg.match(text_content):  # 排除纯数字文本
                    print("Text: {}".format(text_content))

        # 遍历CAD文件中的所有多行文本对象,打印其文本内容
        for entity in acad.iter_objects("MText"):
            if entity.ObjectName == 'AcDbMText':  # 确保是多行文本
                mtext_content = unformat_mtext(entity.TextString)  # 提取多行文本,去掉格式信息
                if not pure_number_reg.match(mtext_content):  # 排除纯数字文本
                    print("MText: {}".format(mtext_content))

    except Exception as e:
        print(f"Error processing file {filename}: {e}")

    finally:
        # 确保在处理完当前文档后关闭所有打开的文档
        close_all_documents()
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容