通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2019-3-22
跳转到指定楼层
1#
发表于 2025-3-1 23:22:42 |只看该作者 |倒序浏览
请大佬看看,怎么改让它正常输出?

# 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()

举报本楼

本帖有 4 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-3-13 15:01 , Processed in 0.204959 second(s), 17 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部