Python CAD开发与DXF文件处理:零基础也能掌握的5个实战技巧
【免费下载链接】ezdxfPython interface to DXF项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf
作为一款功能强大的Python库,ezdxf让零基础也能轻松实现CAD文件处理与DXF操作。无论你是需要创建自动化绘图脚本,还是对现有DXF文件进行批量修改,本指南都将通过"问题-解决方案"的框架,帮助你快速掌握核心技能,成为CAD编程的高手。
🔥 实体创建与样式管理:3步打造标准化工程图纸
如何用ezdxf实现符合行业标准的技术图纸?
场景化问题描述
你需要为机械零件创建一张标准化工程图纸,包含多种实体类型(直线、圆、文字注释),并且所有元素必须符合公司的绘图规范(特定颜色、线型和文字样式)。手动绘制耗时且容易出错,如何用Python自动化实现这一过程?
代码解决方案
# 业务场景:机械零件工程图纸自动化绘制 import ezdxf # 创建符合GB标准的A3图纸 doc = ezdxf.new('R2018', setup=True) msp = doc.modelspace() # 1. 定义公司标准样式 # 创建自定义文字样式 doc.styles.new('CompanyStandard', dxfattribs={ 'font': 'OpenSans-Regular.ttf', # 使用项目中自带的字体 'height': 3.5 }) # 创建自定义线型 doc.linetypes.new('DASHED', dxfattribs={ 'description': '公司标准虚线', 'pattern': [0.5, -0.25] # 0.5单位实线,0.25单位空白 }) # 2. 绘制图纸边框和标题栏 # 外边框 - 使用白色(7号色) msp.add_lwpolyline( [(0, 0), (420, 0), (420, 297), (0, 297), (0, 0)], dxfattribs={'color': 7, 'lineweight': 0.35} ) # 标题栏区域 - 使用青色(5号色) msp.add_lwpolyline( [(350, 0), (420, 0), (420, 50), (350, 50), (350, 0)], dxfattribs={'color': 5, 'lineweight': 0.25} ) # 3. 添加技术要求文本 tech_text = msp.add_text("技术要求:\n1. 未注公差按GB/T 1804-M\n2. 表面粗糙度Ra3.2", dxfattribs={ 'style': 'CompanyStandard', 'insert': (20, 270), 'color': 1 # 红色 }) tech_text.dxf.height = 5 # 4. 绘制零件主视图 # 绘制一个简单的轴类零件 msp.add_line((50, 150), (300, 150), dxfattribs={'color': 2, 'lineweight': 0.5}) # 蓝色主线 msp.add_circle((50, 150), 20, dxfattribs={'color': 2}) # 左侧圆形 # 5. 添加尺寸标注 dim_style = doc.dimstyles.new('CompanyDimStyle') dim_style.dxf.dimtxt = 3.5 # 文字高度 dim_style.dxf.dimlunit = 2 # 十进制 dim_style.dxf.dimdec = 2 # 小数位数 msp.add_linear_dim( base=(50, 130), # 尺寸线位置 p1=(50, 150), # 第一端点 p2=(300, 150), # 第二端点 dxfattribs={'dimstyle': 'CompanyDimStyle'} ) # 保存文件 doc.saveas('mechanical_drawing.dxf') print("标准化工程图纸创建完成!")复制代码
避坑指南
🔴常见错误:尝试使用未定义的样式会导致渲染异常
- 解决方案:始终在使用前检查样式是否存在:
if 'CompanyStandard' not in doc.styles: # 创建样式的代码🔴常见错误:线宽设置过小导致打印时无法显示
- 解决方案:使用行业标准线宽:0.13mm(细线)、0.25mm(中等)、0.35mm(粗线)
图1:DXF标准颜色轮盘 - 包含ezdxf支持的所有ACI颜色代码,可直接作为color参数值使用
💡 表格数据可视化:从Excel到CAD的自动化报表生成
如何用ezdxf实现材料清单的自动生成?
场景化问题描述
你的团队需要将Excel中的材料清单转换为CAD图纸中的表格,以便生产部门使用。手动输入不仅耗时,还容易出错。如何实现从Excel数据到DXF表格的自动化转换?
代码解决方案
# 业务场景:从Excel物料清单自动生成CAD表格 import ezdxf import pandas as pd # 1. 读取Excel数据 df = pd.read_excel('物料清单.xlsx') # 假设Excel包含:序号、物料名称、规格、数量、材质、备注 # 2. 创建DXF文档 doc = ezdxf.new('R2013') msp = doc.modelspace() # 3. 创建表格样式 table_style = doc.tablestyles.new('MaterialListStyle') table_style.set_cell_style( 'header', text_color=7, # 白色文字 bg_color=3, # 绿色背景 text_height=4, alignment=ezdxf.enums.TextEntityAlignment.MIDDLE_CENTER ) table_style.set_cell_style( 'data', text_color=7, text_height=3.5, alignment=ezdxf.enums.TextEntityAlignment.MIDDLE_LEFT ) # 4. 创建表格 - 6列,数据行数+1(表头) table = msp.add_table( origin=(50, 250), # 表格起始位置 rows=len(df) + 1, cols=6, row_height=10, col_widths=[15, 40, 30, 15, 20, 30], style=table_style ) # 5. 设置表头 headers = ['序号', '物料名称', '规格', '数量', '材质', '备注'] for col, header in enumerate(headers): cell = table.cell(0, col) cell.set_text(header) cell.set_cell_style('header') # 6. 填充数据 for row, data in enumerate(df.itertuples(), start=1): table.cell(row, 0).set_text(str(data.序号)) table.cell(row, 1).set_text(data.物料名称) table.cell(row, 2).set_text(data.规格) table.cell(row, 3).set_text(str(data.数量)) table.cell(row, 4).set_text(data.材质) table.cell(row, 5).set_text(data.备注 if pd.notna(data.备注) else '') # 7. 添加表格标题 msp.add_text("物料清单", dxfattribs={ 'height': 5, 'insert': (50, 250 + (len(df)+1)*10 + 10), 'color': 1 }) # 保存文件 doc.saveas('material_list.dxf') print(f"成功生成包含{len(df)}项物料的CAD表格")复制代码
避坑指南
🔴常见错误:表格内容超出图纸边界
- 解决方案:创建表格前计算总高度:
table_height = (len(df) + 1) * row_height # 行数×行高 if 250 + table_height > 297: # A4图纸高度 print("警告:表格过大,将超出图纸边界")📌最佳实践:对于超过100行的大型表格,考虑拆分或使用块引用提高性能
图2:使用ezdxf生成的物料清单表格示例,支持自定义样式和单元格格式
⚠️ 块与属性:创建可复用的标准化图形组件
如何用ezdxf创建带属性的动态标题栏?
场景化问题描述
你需要为公司所有图纸创建标准化的标题栏,其中包含可编辑的属性(如图纸编号、名称、版本等)。每次新建图纸时都手动绘制和修改标题栏效率低下,如何创建可重复使用的带属性标题栏?
代码解决方案
# 业务场景:创建带属性的标准化标题栏块 import ezdxf # 1. 创建新文档 doc = ezdxf.new('R2018') # 2. 创建标题栏块 - 块(Block)是可重复使用的图形组件,类似Word中的模板 title_block = doc.blocks.new(name='COMPANY_TITLE_BLOCK') # 3. 绘制标题栏外框 title_block.add_lwpolyline( [(0, 0), (150, 0), (150, 50), (0, 50), (0, 0)], dxfattribs={'lineweight': 0.5} ) # 4. 添加分隔线 title_block.add_line((50, 0), (50, 50), dxfattribs={'lineweight': 0.25}) title_block.add_line((100, 0), (100, 50), dxfattribs={'lineweight': 0.25}) title_block.add_line((0, 30), (150, 30), dxfattribs={'lineweight': 0.25}) title_block.add_line((0, 15), (150, 15), dxfattribs={'lineweight': 0.25}) # 5. 添加静态文本 title_block.add_text("公司名称", dxfattribs={ 'height': 4, 'insert': (5, 45), 'color': 7 }) # 6. 添加属性定义 - 属性是块中可编辑的文本字段 title_block.add_attdef( 'DRAWING_NO', # 属性标签 insert=(10, 22), # 位置 dxfattribs={ 'height': 3.5, 'color': 7, 'prompt': '输入图纸编号:' } ) title_block.add_attdef( 'DRAWING_NAME', insert=(60, 22), dxfattribs={ 'height': 3.5, 'color': 7, 'prompt': '输入图纸名称:' } ) title_block.add_attdef( 'VERSION', insert=(110, 22), dxfattribs={ 'height': 3.5, 'color': 7, 'prompt': '输入版本:' } ) title_block.add_attdef( 'DATE', insert=(10, 7), dxfattribs={ 'height': 3.5, 'color': 7, 'prompt': '输入日期:' } ) title_block.add_attdef( 'DESIGNER', insert=(60, 7), dxfattribs={ 'height': 3.5, 'color': 7, 'prompt': '输入设计者:' } ) # 7. 在模型空间插入块引用 msp = doc.modelspace() insert_point = (doc.header.get('$EXTMIN', (0, 0, 0))[0] + 20, 20) block_ref = msp.add_blockref('COMPANY_TITLE_BLOCK', insert_point) # 8. 设置属性值 block_ref.add_attrib('DRAWING_NO', 'MECH-2023-001') block_ref.add_attrib('DRAWING_NAME', '减速器外壳') block_ref.add_attrib('VERSION', 'A0') block_ref.add_attrib('DATE', '2023-11-15') block_ref.add_attrib('DESIGNER', '张三') # 保存为模板文件 doc.saveas('company_title_block.dxf') print("带属性的标题栏块创建完成!")复制代码
避坑指南
🔴常见错误:块插入后无法编辑属性
- 解决方案:确保创建块引用后正确添加了属性:
# 检查是否所有属性都已添加 required_attribs = ['DRAWING_NO', 'DRAWING_NAME', 'VERSION'] for attrib in required_attribs: if not any(a.dxf.tag == attrib for a in block_ref.attribs): block_ref.add_attrib(attrib, "未设置")📌最佳实践:将标题栏保存为模板文件,新项目直接引用,确保公司图纸格式统一
图3:DXF块定义与块记录关系示意图 - 块定义包含图形实体,块记录存储块的元数据
🔧 DXF文件批量处理:1000+图纸的自动化修改
如何用ezdxf批量更新多个DXF文件的图层属性?
场景化问题描述
公司需要将一批旧图纸(超过1000个DXF文件)中的"中心线"图层统一修改为红色、虚线,线宽0.13mm。手动修改几乎不可能完成,如何用Python实现批量处理?
代码解决方案
# 业务场景:批量修改DXF文件图层属性 import ezdxf import os from pathlib import Path def batch_update_layers(input_dir, output_dir, target_layer, new_properties): """ 批量更新DXF文件中的图层属性 Args: input_dir: 输入目录路径 output_dir: 输出目录路径 target_layer: 目标图层名称 new_properties: 新的图层属性字典,如{'color': 1, 'linetype': 'DASHED'} """ # 创建输出目录 Path(output_dir).mkdir(parents=True, exist_ok=True) # 统计变量 processed_count = 0 modified_count = 0 # 遍历输入目录中的所有DXF文件 for root, dirs, files in os.walk(input_dir): for file in files: if file.lower().endswith('.dxf'): input_path = os.path.join(root, file) relative_path = os.path.relpath(input_path, input_dir) output_path = os.path.join(output_dir, relative_path) # 创建输出目录结构 Path(os.path.dirname(output_path)).mkdir(parents=True, exist_ok=True) try: # 读取DXF文件 doc = ezdxf.readfile(input_path) # 检查图层是否存在 if target_layer in doc.layers: layer = doc.layers[target_layer] # 修改图层属性 for prop, value in new_properties.items(): setattr(layer.dxf, prop, value) modified_count += 1 # 保存修改后的文件 doc.saveas(output_path) processed_count += 1 # 打印进度 if processed_count % 50 == 0: print(f"已处理: {processed_count}个文件, 修改: {modified_count}个文件") except Exception as e: print(f"处理文件 {input_path} 时出错: {str(e)}") continue print(f"批量处理完成! 共处理: {processed_count}个文件, 修改: {modified_count}个文件") # 配置参数 INPUT_DIRECTORY = "old_drawings" OUTPUT_DIRECTORY = "updated_drawings" TARGET_LAYER = "中心线" NEW_PROPERTIES = { 'color': 1, # 红色 'linetype': 'DASHED',# 虚线 'lineweight': 13 # 0.13mm (lineweight单位为1/100mm) } # 执行批量处理 batch_update_layers(INPUT_DIRECTORY, OUTPUT_DIRECTORY, TARGET_LAYER, NEW_PROPERTIES)复制代码
避坑指南
🔴常见错误:处理大型DXF文件时内存溢出
- 解决方案:使用低内存模式并分块处理:
doc = ezdxf.readfile(input_path, low_memory=True)🔴常见错误:图层名称大小写不匹配导致修改失败
- 解决方案:使用不区分大小写的图层查找:
layer_name = next((name for name in doc.layers if name.lower() == target_layer.lower()), None) if layer_name: layer = doc.layers[layer_name]📌最佳实践:处理前先备份文件,批量处理时添加进度提示,便于监控处理状态
🚀 DXF转图像:自动生成图纸预览与报告
如何用ezdxf将DXF图纸导出为高质量图片?
场景化问题描述
你需要为客户创建一个包含数十张DXF图纸的PDF报告,需要将每张图纸转换为PNG图片后插入报告。手动截图不仅效率低,而且质量难以保证。如何用Python自动将DXF文件转换为高质量图像?
代码解决方案
# 业务场景:DXF图纸批量转换为高质量PNG图片 import ezdxf import os from pathlib import Path from ezdxf.addons.drawing import matplotlib, RenderContext from ezdxf.addons.drawing.matplotlib import MatplotlibBackend def dxf_to_image(dxf_path, output_path, dpi=300, figsize=(10, 7), bg_color='white'): """ 将DXF文件转换为图像 Args: dxf_path: DXF文件路径 output_path: 输出图像路径 dpi: 图像分辨率 figsize: 图像尺寸(英寸) bg_color: 背景颜色 """ try: # 读取DXF文件 doc = ezdxf.readfile(dxf_path) # 获取模型空间 layout = doc.modelspace() # 创建渲染上下文 ctx = RenderContext(doc) # 创建绘图配置 config = matplotlib.MatplotlibBackendConfig() config.lineweight_scaling = 10 # 线宽缩放因子 config.bg_color = bg_color # 设置中文字体支持 config.font_path = "fonts/Open_Sans/OpenSans-Regular.ttf" # 使用项目中自带的字体 # 创建后端渲染器 backend = MatplotlibBackend(ctx, config) # 渲染模型空间 layout.render(backend) # 保存图像 backend.figure.savefig( output_path, dpi=dpi, figsize=figsize, bbox_inches='tight', pad_inches=0.1 ) return True except Exception as e: print(f"转换文件 {dxf_path} 时出错: {str(e)}") return False def batch_dxf_to_images(input_dir, output_dir, image_format='png', **kwargs): """批量转换目录中的所有DXF文件为图像""" Path(output_dir).mkdir(parents=True, exist_ok=True) processed_count = 0 success_count = 0 for root, dirs, files in os.walk(input_dir): for file in files: if file.lower().endswith('.dxf'): input_path = os.path.join(root, file) filename = os.path.splitext(file)[0] output_path = os.path.join(output_dir, f"{filename}.{image_format}") print(f"正在转换: {input_path}") if dxf_to_image(input_path, output_path, **kwargs): success_count += 1 processed_count += 1 print(f"批量转换完成! 共处理: {processed_count}个文件, 成功: {success_count}个文件") # 配置参数 INPUT_DIRECTORY = "drawings" OUTPUT_DIRECTORY = "drawing_previews" IMAGE_FORMAT = "png" RESOLUTION = 300 # DPI IMAGE_SIZE = (10, 7) # 英寸 # 执行批量转换 batch_dxf_to_images( INPUT_DIRECTORY, OUTPUT_DIRECTORY, image_format=IMAGE_FORMAT, dpi=RESOLUTION, figsize=IMAGE_SIZE, bg_color='white' )复制代码
避坑指南
🔴常见错误:中文文字显示为乱码或方块
- 解决方案:确保指定支持中文的字体文件路径:
config.font_path = "fonts/Noto/NotoSansSC-Regular.otf" # 使用项目中的中文字体🔴常见错误:图像中线宽显示不正常
- 解决方案:调整线宽缩放因子:
config.lineweight_scaling = 5 # 对于高DPI图像可能需要减小缩放因子📌最佳实践:对于需要印刷的报告,使用至少300DPI分辨率;对于屏幕显示,150DPI足够
附录:常见错误速查表
错误1:DXFStructureError - 文件结构损坏
错误信息:DXFStructureError: DXF file structure corrupted or unsupported DXF version.
解决方案:使用恢复模式打开文件:
doc = ezdxf.readfile("corrupted.dxf", recover=True)根本原因:文件可能由非标准CAD软件创建或在传输过程中损坏。
错误2:字体缺失导致文字无法显示
错误信息:Font 'xxx' not found, using default font.
解决方案:指定项目中包含的字体:
style = doc.styles.new("CustomStyle") style.dxf.font = "fonts/Open_Sans/OpenSans-Regular.ttf"根本原因:系统中缺少DXF文件中指定的字体,ezdxf不会自动下载字体。
错误3:图层锁定导致无法修改
错误信息:DXFValueError: Layer 'xxx' is locked.
解决方案:解锁图层后再修改:
if doc.layers['xxx'].dxf.locked: doc.layers['xxx'].dxf.locked = False # 执行修改操作 doc.layers['xxx'].dxf.locked = True # 可选:操作完成后重新锁定根本原因:某些CAD系统会锁定图层防止意外修改。
错误4:块定义不存在
错误信息:KeyError: 'Block 'xxx' does not exist.'
解决方案:检查块名称拼写或创建默认块:
if 'xxx' not in doc.blocks: # 创建默认块定义 block = doc.blocks.new(name='xxx') block.add_lwpolyline([(0,0), (10,0), (10,10), (0,10), (0,0)])根本原因:尝试插入不存在的块定义或块名称拼写错误。
错误5:高版本特性在低版本中不支持
错误信息:DXFVersionError: Feature 'xxx' not supported by DXF version R12.
解决方案:使用适当的DXF版本或替代方法:
if doc.dxfversion < 'AC1021': # R2007版本 # 使用兼容的替代方法 print("该特性在当前DXF版本中不受支持,使用替代方案") else: # 使用高级特性根本原因:DXF格式是向下兼容的,但不向上兼容,高版本特性无法在低版本中使用。
实用业务脚本模板
模板1:DXF文件信息提取器
# 业务场景:批量提取DXF文件元数据,生成图纸清单 import ezdxf import os import csv from datetime import datetime def extract_dxf_info(dxf_path): """提取DXF文件的基本信息""" try: doc = ezdxf.readfile(dxf_path) header = doc.header # 提取基本信息 info = { '文件名': os.path.basename(dxf_path), '路径': dxf_path, 'DXF版本': doc.dxfversion, '创建时间': header.get('$TDCREATE', '未知'), '修改时间': header.get('$TDUPDATE', '未知'), '图层数量': len(doc.layers), '实体数量': len(list(doc.modelspace())), '图纸名称': header.get('$TITLE', '未设置'), '图纸编号': header.get('$DWGCODEPAGE', '未设置') } return info except Exception as e: print(f"处理文件 {dxf_path} 时出错: {str(e)}") return None def batch_extract_info(input_dir, output_file): """批量提取目录中所有DXF文件的信息并保存到CSV""" with open(output_file, 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['文件名', '路径', 'DXF版本', '创建时间', '修改时间', '图层数量', '实体数量', '图纸名称', '图纸编号'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() count = 0 for root, dirs, files in os.walk(input_dir): for file in files: if file.lower().endswith('.dxf'): dxf_path = os.path.join(root, file) info = extract_dxf_info(dxf_path) if info: writer.writerow(info) count += 1 if count % 50 == 0: print(f"已处理 {count} 个文件") print(f"完成! 共处理 {count} 个DXF文件,结果保存至 {output_file}") # 使用示例 batch_extract_info('drawings', 'dxf_inventory.csv')模板2:DXF图纸对比工具
# 业务场景:比较两个DXF文件的差异,生成变更报告 import ezdxf from difflib import Differ def get_entities_summary(layout): """获取布局中实体的摘要信息""" summary = [] for entity in layout: # 获取实体基本信息 entity_info = f"{entity.dxftype()}: {entity.dxf.handle}" # 添加位置信息(如果有) if hasattr(entity.dxf, 'insert'): entity_info += f" @ ({entity.dxf.insert.x:.2f}, {entity.dxf.insert.y:.2f})" elif hasattr(entity.dxf, 'start') and hasattr(entity.dxf, 'end'): entity_info += f" from ({entity.dxf.start.x:.2f}, {entity.dxf.start.y:.2f}) to ({entity.dxf.end.x:.2f}, {entity.dxf.end.y:.2f})" summary.append(entity_info) return sorted(summary) def compare_dxf_files(file1, file2, output_report=None): """比较两个DXF文件并返回差异""" try: # 读取两个文件 doc1 = ezdxf.readfile(file1) doc2 = ezdxf.readfile(file2) # 获取模型空间实体摘要 entities1 = get_entities_summary(doc1.modelspace()) entities2 = get_entities_summary(doc2.modelspace()) # 比较图层 layers1 = sorted([layer.dxf.name for layer in doc1.layers]) layers2 = sorted([layer.dxf.name for layer in doc2.layers]) # 生成差异报告 report = [] report.append(f"DXF文件对比报告: {file1} vs {file2}") report.append(f"比较时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") # 版本信息 report.append("版本信息:") report.append(f" 文件1: {doc1.dxfversion}") report.append(f" 文件2: {doc2.dxfversion}\n") # 图层差异 report.append("图层差异:") diff = Differ().compare(layers1, layers2) for line in diff: report.append(f" {line}") # 实体差异 report.append("\n实体差异:") diff = Differ().compare(entities1, entities2) for line in diff: report.append(f" {line}") # 转换为字符串 report_str = '\n'.join(report) # 保存报告(如果指定) if output_report: with open(output_report, 'w', encoding='utf-8') as f: f.write(report_str) print(f"对比报告已保存至 {output_report}") return report_str except Exception as e: return f"比较文件时出错: {str(e)}" # 使用示例 compare_dxf_files('old_version.dxf', 'new_version.dxf', 'dxf_diff_report.txt')模板3:DXF图纸标准化工具
# 业务场景:将DXF图纸标准化,统一图层、文字样式和标注样式 import ezdxf import os from pathlib import Path def standardize_dxf(input_path, output_path, standard_config): """ 标准化DXF文件 Args: input_path: 输入DXF文件路径 output_path: 输出标准化后的DXF文件路径 standard_config: 标准化配置字典 """ try: # 读取DXF文件 doc = ezdxf.readfile(input_path) # 1. 标准化图层 for layer_name, layer_props in standard_config.get('layers', {}).items(): if layer_name in doc.layers: layer = doc.layers[layer_name] # 更新图层属性 for prop, value in layer_props.items(): setattr(layer.dxf, prop, value) else: # 创建缺失的标准图层 doc.layers.new(layer_name, dxfattribs=layer_props) # 2. 标准化文字样式 for style_name, style_props in standard_config.get('styles', {}).items(): if style_name in doc.styles: style = doc.styles[style_name] for prop, value in style_props.items(): setattr(style.dxf, prop, value) else: doc.styles.new(style_name, dxfattribs=style_props) # 3. 标准化标注样式 for dimstyle_name, dimstyle_props in standard_config.get('dimstyles', {}).items(): if dimstyle_name in doc.dimstyles: dimstyle = doc.dimstyles[dimstyle_name] for prop, value in dimstyle_props.items(): setattr(dimstyle.dxf, prop, value) else: doc.dimstyles.new(dimstyle_name, dxfattribs=dimstyle_props) # 4. 标准化线型 for linetype_name, linetype_props in standard_config.get('linetypes', {}).items(): if linetype_name not in doc.linetypes: doc.linetypes.new(linetype_name, dxfattribs=linetype_props) # 保存标准化后的文件 doc.saveas(output_path) return True except Exception as e: print(f"标准化文件 {input_path} 时出错: {str(e)}") return False def batch_standardize_dxf(input_dir, output_dir, standard_config): """批量标准化目录中的DXF文件""" Path(output_dir).mkdir(parents=True, exist_ok=True) processed_count = 0 success_count = 0 for root, dirs, files in os.walk(input_dir): for file in files: if file.lower().endswith('.dxf'): input_path = os.path.join(root, file) relative_path = os.path.relpath(input_path, input_dir) output_path = os.path.join(output_dir, relative_path) Path(os.path.dirname(output_path)).mkdir(parents=True, exist_ok=True) print(f"正在标准化: {input_path}") if standardize_dxf(input_path, output_path, standard_config): success_count += 1 processed_count += 1 print(f"批量标准化完成! 共处理: {processed_count}个文件, 成功: {success_count}个文件") # 定义公司标准配置 COMPANY_STANDARD = { 'layers': { '0': {'color': 7, 'linetype': 'CONTINUOUS', 'lineweight': 25}, '中心线': {'color': 1, 'linetype': 'CENTER', 'lineweight': 13}, '尺寸标注': {'color': 3, 'linetype': 'CONTINUOUS', 'lineweight': 13}, '文字': {'color': 7, 'linetype': 'CONTINUOUS', 'lineweight': 0}, '轮廓线': {'color': 7, 'linetype': 'CONTINUOUS', 'lineweight': 35} }, 'styles': { 'Standard': { 'font': 'fonts/Open_Sans/OpenSans-Regular.ttf', 'height': 3.5 }, '标题文字': { 'font': 'fonts/Open_Sans/OpenSans-Bold.ttf', 'height': 5 } }, 'dimstyles': { 'Standard': { 'dimtxt': 3.5, 'dimlunit': 2, 'dimdec': 2, 'dimtad': 1, 'dimasz': 3.5 } }, 'linetypes': { 'CENTER': { 'description': '中心虚线', 'pattern': [1.25, -0.25, 0.25, -0.25] }, 'DASHED': { 'description': '虚线', 'pattern': [0.5, -0.25] } } } # 使用示例 batch_standardize_dxf('unstandardized_dxf', 'standardized_dxf', COMPANY_STANDARD)【免费下载链接】ezdxfPython interface to DXF项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考