Files
bansonic_beta_main/Assets/EasyChart/Docs/REFACTOR_PLAN.md
T

90 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# EasyChart 重构计划
基于对现有架构的分析以及对 XCharts 源码的研究,为了支持混合图表(Mixed Chart)及更多图表类型(Bar, Pie 等)的扩展,制定以下重构计划。
## 1. 核心数据结构重构 (Data Architecture)
目标:建立一个既能承载多种图表配置,又能完美兼容 Unity 序列化机制的数据底层。
### 1.1 保持单一 `Serie` 类 (Monolithic Approach)
参考 XCharts 的设计,不采用多态继承(`LineSerie : BaseSerie`),而是保持一个包含所有可能的配置字段的单一 `Serie` 类。
* **优势**:避免 Unity 序列化丢失子类数据的问题,支持运行时无损切换图表类型。
* **修改**
* 新增 `public SerieType type;` 枚举 (Line, Bar, Pie, Scatter)。
* 引入组合式配置结构体(Struct/Class),保持主类整洁:
* `public LineSettings lineSettings;` (包含 smooth, width, color)
* `public BarSettings barSettings;` (包含 barWidth, stack, gap)
* `public PieSettings pieSettings;` (包含 radius, center, roseType)
### 1.2 全局配置升级
* `ChartData` 中增加全局 `ChartType` 枚举 (Line, Bar, Pie, Mixed)。
* **Line/Bar 模式**:强制所有 Series 为同一类型,简化 UI。
* **Mixed 模式**:允许每个 Series 独立设置类型。
---
## 2. 编辑器与交互重构 (Editor & UX)
目标:通过编辑器脚本屏蔽底层数据的复杂性,提供“上下文感知”的配置体验。
### 2.1 动态 Series 属性面板
* 重构 `EasyChartLibraryWindow``RefreshSeriesList` 方法。
* 实现动态 GUI 绘制逻辑:
* 读取当前 Series 的 `type`
* **只绘制**与该类型相关的属性字段(例如:选了 Bar 就隐藏 Line 的平滑设置)。
* 使用 `EditorGUI.BeginChangeCheck` 监听类型变化,实时刷新 UI。
### 2.2 类型切换交互
* 在 Series 卡片(Title 区域或属性顶部)增加 **Type 下拉框**
* 在全局 `General Properties` 顶部增加 **Chart Type 下拉框**
* 切换全局类型时,自动将所有 Series 重置为对应类型(需弹出确认提示)。
### 2.3 上下文感知配置
* 如果是 `Pie Chart`,自动隐藏 `AxisSettings`XY 轴配置)。
* 如果是 `Mixed Chart`,显示所有通用配置。
---
## 3. 渲染管线重构 (Rendering Pipeline)
目标:解耦 `ChartElement` 与具体渲染逻辑,支持多渲染器叠加。
### 3.1 渲染器抽象
* 强化 `BaseSeriesRenderer`,确保其不依赖于具体的 `ChartData.Type`
* 定义标准接口:`Draw(Painter2D painter, Serie serie)`
### 3.2 多渲染器管理 (Multi-Renderer System)
* **现状**`ChartElement` 只有一个 `_activeSeriesRenderer`
* **重构为**`List<BaseSeriesRenderer> _renderers`
* **渲染流程**
1. 遍历 `Data.Series`
2. 根据 Serie 类型(或分组),通过工厂方法实例化对应的 Renderer(`LineSeriesRenderer`, `BarSeriesRenderer`)。
3. 按层级顺序添加到 `_chartArea`Grid -> Bar -> Line -> Point -> Tooltip。
---
## 4. 坐标与交互系统 (Coordinate & Interaction)
目标:支持非笛卡尔坐标系(如极坐标)的渲染与交互。
### 4.1 坐标转换抽象
* 提取 `GetPixelPos` 方法,定义 `ICoordinateSystem` 接口。
* `GridCoord` (实现 XY 轴映射)。
* `PolarCoord` (实现 角度/半径 映射)。
### 4.2 交互检测重构 (Hit Testing)
* **现状**`OnPointerMove` 直接通过 X 轴索引查找数据。
* **重构为**:委托模式。
* `ChartElement` 将鼠标位置传递给所有活跃的 Renderers。
* Renderer 返回 `HitResult`(包含命中的数据点、距离等)。
* `ChartElement` 汇总结果显示 Tooltip。这样可以自然支持 Pie Chart 的扇区点击检测。
---
## 5. 执行路线图 (Roadmap)
1. **Step 1 (Data)**: 修改 `Serie` 类,添加 `SerieType` 枚举及 `BarSettings` 等结构体。(不影响现有逻辑,仅增加字段)。
2. **Step 2 (Editor)**: 升级 `EasyChartLibraryWindow`,实现基于类型的动态属性显示。
3. **Step 3 (Render)**: 创建 `BarSeriesRenderer` 原型,并在 `ChartElement` 中实现简单的多 Renderer 支持(先支持 Line + Bar 混合)。
4. **Step 4 (Interaction)**: 重构交互逻辑,适配混合图表的 Tooltip 显示。