如何解决ezdxf读取openpyxl数据时变量重叠绘制的问题
问题分析与解决方案
问题根源
你遇到的叠加问题核心是循环复用了同一个DXF文档和模型空间。代码中doc和msp应该是在循环外定义的,导致每次迭代添加的图形、文本都会累积到同一个文档实例中,最终保存的每个DXF文件都包含之前所有循环的内容。
解决方案
每次循环迭代时,重新创建全新的DXF文档和模型空间,同时确保自定义图层在新文档中存在(新DXF文档默认没有自定义图层),这样每个生成的DXF文件都是独立的。
修改后的代码
# user selected file from GUI xl = values["-xl_file-"] wb = load_workbook(filename=xl) sr = wb['Trim'] # variables for testing rowcount = 12 x = 100 y = 10 rc = 1 for row in sr.iter_rows(min_row=12, min_col=3, max_row=16, max_col=3, values_only=True): for value in row: # skip blank rows if value is None: break # 每次循环新建DXF文档与模型空间 import ezdxf doc = ezdxf.new(dxfversion='R2010') # 根据需求选择DXF版本 msp = doc.modelspace() # 创建所需的自定义图层(新文档默认无自定义图层) if not doc.layers.has("2"): doc.layers.add("2", color=2) if not doc.layers.has("3"): doc.layers.add("3", color=3) qty = sr.cell(row=rowcount, column=2).value name = sr.cell(row=rowcount, column=3).value points = [(0, 0), (x, 0), (x, y), (0, y), (0, 0)] msp.add_lwpolyline(points, dxfattribs={"layer": "3"}) msp.add_text(name, dxfattribs={"layer": "2"}).set_pos((50, 3), align='MIDDLE_RIGHT') print(rc, name) msp.add_text(f"Part: {name}", dxfattribs={"layer": "2"}).set_pos((0, -5), align='MIDDLE_LEFT') msp.add_text(f"Qty: {qty}", dxfattribs={"layer": "2"}).set_pos((0, -10), align='MIDDLE_LEFT') doc.saveas(f"{xl[:-13]}{rowcount}.dxf") rowcount = rowcount + 1 rc = rc + 1
关键改动说明
- 把
ezdxf.new()和模型空间获取逻辑放到循环内部,每次迭代生成全新的DXF文档,彻底避免内容累积 - 添加图层创建逻辑,确保新文档中存在代码用到的"2"、"3"图层,避免图层不存在导致的报错或默认图层替代问题
内容的提问来源于stack exchange,提问作者Rand0mdude
相关产品推荐
相关产品推荐

