- 经验
- 8
- 分贝
- 0
- 家园分
- 14
- 在线时间:
- 2 小时
- 最后登录:
- 2025-3-4
- 帖子:
- 7
- 精华:
- 0
- 注册时间:
- 2019-3-22
- UID:
- 1422062
注册:2019-3-22
|
请大佬看看,怎么改让它正常输出?
# main.py
import ezdxf
from openpyxl import Workbook
import tkinter as tk
from tkinter import filedialog, messagebox
import os
class CableCounterApp:
def __init__(self):
self.window = tk.Tk()
self.window.title("光缆工程量自动统计工具")
self.setup_ui()
def setup_ui(self):
"""创建GUI界面"""
frame = tk.Frame(self.window, padx=20, pady=20)
frame.pack()
# 文件选择
tk.Label(frame, text="选择DXF文件:").grid(row=0, column=0, sticky='w')
self.file_entry = tk.Entry(frame, width=40)
self.file_entry.grid(row=0, column=1)
tk.Button(frame, text="浏览", command=self.select_file).grid(row=0, column=2)
# 参数设置
tk.Label(frame, text="比例尺 (1:):").grid(row=1, column=0, sticky='w')
self.scale_entry = tk.Entry(frame)
self.scale_entry.insert(0, "100") # 默认比例1:100
self.scale_entry.grid(row=1, column=1, sticky='w')
# 开始处理
tk.Button(frame, text="开始统计", command=self.process_file, bg='#4CAF50').grid(row=2, column=1, pady=15)
def select_file(self):
"""选择DXF文件"""
filepath = filedialog.askopenfilename(
filetypes=[("DXF文件", "*.dxf"), ("所有文件", "*.*")]
)
self.file_entry.delete(0, tk.END)
self.file_entry.insert(0, filepath)
def process_file(self):
"""处理文件主逻辑"""
try:
# 参数获取
dxf_path = self.file_entry.get()
scale = float(self.scale_entry.get())
# 解析DXF
routes = self.parse_dxf(dxf_path, scale)
# 生成Excel
output_path = os.path.splitext(dxf_path)[0] + "_工程量.xlsx"
self.save_to_excel(routes, output_path)
messagebox.showinfo("完成", f"统计完成!结果已保存至:\n{output_path}")
except Exception as e:
messagebox.showerror("错误", str(e))
def parse_dxf(self, filepath, scale):
"""解析DXF文件核心算法"""
doc = ezdxf.readfile(filepath)
modelspace = doc.modelspace()
# 1. 识别光缆路由图层(按命名规则过滤)
cable_layers = [layer for layer in doc.layers if "光缆" in layer.dxf.name]
# 2. 提取多段线和线段
routes = []
for entity in modelspace:
if entity.dxf.layer in cable_layers:
# 处理多段线
if entity.dxftype() == 'LWPOLYLINE':
length = entity.length * scale # 计算实际长度
routes.append({
'name': entity.dxf.layer,
'type': 'Polyline',
'length': round(length, 2)
})
# 处理线段(需合并连续线段)
elif entity.dxftype() == 'LINE':
length = entity.dxf.end.distance(entity.dxf.start) * scale
routes.append({
'name': entity.dxf.layer,
'type': 'Line',
'length': round(length, 2)
})
return routes
def save_to_excel(self, data, output_path):
"""保存结果到Excel"""
wb = Workbook()
ws = wb.active
ws.title = "光缆工程量"
# 表头
headers = ["路由名称", "类型", "长度(米)"]
ws.append(headers)
# 数据行
total_length = 0
for item in data:
ws.append([item['name'], item['type'], item['length']])
total_length += item['length']
# 汇总行
ws.append(["总计", "", total_length])
# 样式调整
for col in ['A', 'B', 'C']:
ws.column_dimensions[col].width = 20
wb.save(output_path)
if __name__ == "__main__":
app = CableCounterApp()
app.window.mainloop()
|
|