# 海上风电场集电线路设计优化系统 - 项目上下文

## 项目概述

这是一个用于设计和优化海上风电场集电系统拓扑的综合工具，专为海上能源业务开发部电气专业设计。该系统通过多种先进的拓扑优化算法（MST、旋转扫描法、Esau-Williams等），根据风机坐标、功率以及海缆规格，自动生成投资成本最低、损耗最优的设计方案。

### 核心功能
- 🖥️ **图形化界面**：基于 NiceGUI 的现代化桌面应用，支持原生窗口模式
- 🌊 **多种布局生成**：支持规则网格和随机分布布局的模拟数据生成
- 🔌 **多算法优化**：
  - MST (Minimum Spanning Tree)：无容量约束基准方案
  - Capacitated Sweep (Base)：基础扇区扫描分组
  - Rotational Sweep：全局最优起始角度旋转扫描优化
  - Esau-Williams：经典启发式算法，在距离与容量间寻找最优平衡
- ⚙️ **灵活参数配置**：通过 Excel 自定义系统电压、功率因数、电价及电缆规格
- 📊 **智能方案对比**：自动运行三大场景（标准方案、含可选电缆方案、限制最大截面方案）
- 📁 **多格式导出**：CAD图纸(.dxf)、Excel报告、压缩包

### 技术栈
- **语言**：Python 3.12+
- **GUI框架**：NiceGUI 3.4.1 + PyWebview 6.1
- **核心库**：
  - numpy 2.4.0：数值计算
  - pandas 2.3.3：数据处理
  - matplotlib 3.10.8：可视化
  - scikit-learn 1.8.0：聚类算法
  - networkx 3.6.1：图算法
  - ezdxf 1.4.3：CAD导出
  - scipy 1.16.3：科学计算

## 项目结构

```
D:\code\windfarm\
├── main.py                 # 核心算法和业务逻辑（1388行）
├── gui.py                  # NiceGUI图形界面（1067行）
├── esau_williams.py        # Esau-Williams算法实现（242行）
├── generate_template.py    # Excel模板生成器
├── make_version.py         # 版本号自动生成脚本
├── pyproject.toml          # 项目依赖配置
├── Makefile                # 构建脚本
├── 使用说明/               # 中文操作手册和截图
├── build/                  # 构建输出目录
└── dist/                   # 打包输出目录
```

## 构建和运行

### 环境配置
项目使用 `uv` 作为包管理器，也支持 `pip`：

```bash
# 使用 uv（推荐）
uv sync

# 或使用 pip
pip install -r requirements.txt  # 如果有requirements.txt
# 或手动安装依赖
pip install numpy pandas matplotlib scikit-learn scipy networkx ezdxf nicegui openpyxl pywebview
```

### 运行方式

#### 1. 图形化界面（推荐）
```bash
python gui.py
```
启动后，程序将弹出独立窗口，提供完整的交互式界面。

#### 2. 命令行模式
```bash
python main.py --excel your_data.xlsx
```

### 构建可执行文件

使用 Makefile 进行构建：

```bash
# 构建exe文件（自动生成版本号）
make build

# 重新构建（先清理再构建）
make rebuild

# 清理构建文件
make clean

# 查看帮助
make help
```

构建过程：
1. 运行 `make_version.py` 生成版本号
2. 使用 `nicegui-pack` 打包为单文件exe
3. 重命名输出文件包含版本号

构建输出位于 `dist/` 目录，文件名格式：`海上风电场集电线路设计优化系统_{VERSION}.exe`

## 输入数据规范

### Excel文件格式
输入Excel文件应包含以下三个Sheet：

#### 1. Coordinates（坐标数据）- 必需
| Type | ID | X | Y | Power | PlatformHeight |
|------|----|---|---|-------|----------------|
| Substation | Sub1 | 4000 | -800 | 0 | 0 |
| Turbine | 1 | 0 | 0 | 8.0 | 25 |

- **Type**: `Substation` 或 `Turbine`
- **X/Y**: 投影坐标（米），建议使用高斯投影坐标
- **Power**: 功率（MW），升压站填0
- **PlatformHeight**: 塔筒/平台高度（米）

#### 2. Cables（电缆规格）- 必需
| CrossSection | Capacity | Resistance | Cost | Optional |
|--------------|----------|------------|------|----------|
| 35 | 150 | 0.524 | 80 | |
| 400 | 580 | 0.0470 | 600 | Y |

- **CrossSection**: 导体截面（mm²）
- **Capacity**: 额定载流量（A），需考虑降容系数
- **Resistance**: 交流电阻（Ω/km）
- **Cost**: 综合单价（元/m）
- **Optional**: 可选标记（Y表示可选大截面电缆）

**重要规则**：
- 电缆必须按截面从小到大排列
- `Optional` 为 'Y' 的电缆最多只能有一条
- 若存在可选电缆，它必须是列表中截面最大的一条

#### 3. Parameters（系统参数）- 必需
| Parameter | Value |
|-----------|-------|
| Voltage (kV) / 电压 (kV) | 66 |
| Power Factor / 功率因数 | 0.95 |
| Electricity Price (元/kWh) / 电价 (元/kWh) | 0.4 |

## 核心算法说明

### 1. MST（最小生成树）
- **原理**：基于 Kruskal 或 Prim 算法，寻找连接所有风机且总路径长度最短的树状结构
- **特点**：不考虑电缆载流量限制，仅作为理论距离基准参考
- **适用场景**：小规模风电场的理论分析

### 2. Capacitated Sweep（基础扇区扫描）
- **原理**：以升压站为中心，将平面划分为扇区，按顺时针扫描风机
- **特点**：计算速度快，拓扑结构简单清晰
- **局限**：对起始扫描角度敏感，可能产生"长尾巴"连线

### 3. Rotational Sweep（旋转扫描优化）
- **原理**：尝试 0° 到 360° 之间的所有起始扫描角度
- **优势**：比基础扫描法节省 3%~8% 的线缆成本
- **适用场景**：最接近人工精细化排布的自动化算法

### 4. Esau-Williams 启发式算法
- **原理**：约束最小生成树（CMST）算法，迭代计算互联操作的成本节省
- **优势**：能发现树状、多分叉等复杂但更经济的拓扑结构
- **适用场景**：风机分布不规则、离岸距离较远或电缆造价极高的情况

## 方案场景说明

系统自动运行三种场景：

1. **Scenario 1 (Standard)**：仅使用非可选（标准）电缆进行优化
2. **Scenario 2 (With Optional)**：包含标记为 'Y' 的大型电缆，适用于尝试增加单回路容量
3. **Scenario 3 (No Max)**：排除最大截面电缆，测试电缆供应受限时的最优拓扑

## 输出文件说明

- **Excel报告**：`[文件名]_result.xlsx` - 包含所有方案总览及详细连接清单
- **CAD图纸**：`design_[方案名].dxf` - 分层分色的拓扑图
- **全部方案**：`[文件名]_result.zip` - 包含所有图纸及Excel报告

## 关键常量和配置

### 电气参数
- **系统电压**：66,000 V (66kV)
- **功率因数**：0.95
- **电价**：0.4 元/kWh

### 电缆规格示例
- 最小截面：35mm² (载流量150A)
- 最大截面：400mm² (载流量580A)
- 降容系数：0.8（实际载流量 = 额定载流量 × 0.8）

### 算法参数
- 默认风机数量：30台
- 默认布局：随机分布或网格
- 默认间距：800米（网格布局）

## 开发约定

### 代码风格
- 使用中文注释和文档字符串
- 函数命名使用 snake_case
- 类名使用 PascalCase
- 常量使用 UPPER_CASE

### 版本管理
- 版本号通过 `make_version.py` 自动生成
- 版本号格式：v{major}.{minor}.{patch}
- 版本号存储在 `version.py` 文件中

### 构建约定
- 使用 `nicegui-pack` 进行打包
- 单文件模式（--onefile）
- 无窗口模式（--windowed）
- 输出文件名包含版本号

### 测试约定
- GUI测试使用 frontend-tester agent
- Python代码测试使用 python-pro agent
- 测试覆盖率要求：核心算法部分 > 80%

## 常见问题

### Q1: MST算法显示极高的成本和损耗？
**A**: 这是预期行为。MST算法不考虑载流量约束，会产生单一树状结构导致根部电缆严重过载。这仅作为理论基准参考。

### Q2: 如何在CAD图纸中找到图形？
**A**: 双击鼠标滚轮（Zoom Extents）全屏显示。风机坐标通常是大地坐标（数值很大），如果CAD当前视口在(0,0)附近，可能会找不到图形。

### Q3: 可选电缆的使用规则是什么？
**A**: 
- 可选电缆（Optional='Y'）最多只能有一条
- 必须是列表中截面最大的电缆
- 用于特定场景（如增加单回路容量）

## 技术支持

- **适用对象**：海上能源业务开发部 - 电气专业
- **技术支持**：杜孟远
- **文档版本**：v1.0
- **编制日期**：2026年1月5日

## 许可证

本项目仅供工程学习、研究和初步设计评估使用。详细计算应以专业设计院规范为准。