# LegendAddIn **Repository Path**: wangdl23/legend-add-in ## Basic Information - **Project Name**: LegendAddIn - **Description**: ArcGIS 10.8 自定义图例生成工具,支持多列布局、分组管理、参考标注和高级样式定制功能。 ### 开发工具 - **开发工具**:Visual Studio 2019 - **目标框架**:.NET Framework 4.5.2 - **ArcGIS 版本**:ArcGIS 10.8 - **平台目标**:x86 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-03-19 - **Last Updated**: 2026-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: ArcGIS, ArcObject, Csharp, net ## README # LegendAddIn **版本:v1.0.6** ArcGIS 10.8 自定义图例生成工具,支持多列布局、分组管理、参考标注和高级样式定制功能。 --- ## 目录 - [项目概述](#项目概述) - [功能特性](#功能特性) - [安装指南](#安装指南) - [快速开始](#快速开始) - [配置选项](#配置选项) - [项目结构](#项目结构) - [技术架构](#技术架构) - [开发环境](#开发环境) - [依赖项](#依赖项) - [贡献指南](#贡献指南) - [许可证](#许可证) - [待开发功能](#待开发功能) --- ## 项目概述 LegendAddIn 是一个功能强大的 ArcGIS 10.8 自定义图例生成插件,为 ArcMap 用户提供专业的图例创建和管理工具。该插件通过直观的向导式界面,帮助用户快速创建高质量、高度可定制的地图图例。 ![步骤3-1](./images/step3_1.png) ![步骤3-1](./images/example.png) ### 核心价值 - **专业定制**:全面支持图例样式、布局、位置等精细配置 - **分组管理**:支持将图层和图例项按逻辑分组,提升可读性 - **次级分组**:支持一级分组和次级分组的层级结构,灵活的间距配置 - **参考标注**:独特的参考标注功能,满足专业制图需求 - **图面边框**:自动设置图例项边框,无需手动绘制对齐 - **配置保存**:支持配置导入导出和缓存,提高工作效率 - **实时更新**:支持视图范围变化和图层变化时自动更新图例 --- ## 功能特性 > 📌 **说明**:在创建图例前,建议先设置页面布局单位,确保尺寸参数正确。 点击"设置布局单位"按钮,从下拉列表中选择页面布局单位(如:毫米、厘米、英寸等)。 ![步骤1-1](./images/step1_1.png) ![步骤2-1](./images/step1_2.png) ### 1. 图层选择 - 从当前地图文档中智能选择需要在图例中显示的图层 - 支持多种图层类型(要素图层、注记图层等) - 支持调整图层显示顺序 ![步骤3-1](./images/step3_2.png) ### 2. 参考标注模式 - 启用/禁用参考标注功能 - 从可选图例项列表中添加标注项 - 标注列表与参考标注列表一一对应 - 双击参考标注项可编辑文本 - 关联对象为单个图例项(Legend Item),核心绑定对象为符号(Symbol) - 支持点要素、线要素、面要素三种专属模式 - 点要素模式支持左右排布/上下排布切换 ![步骤4-1](./images/step4_1.png) **参考标注图例绘制规范**(基准尺寸 12mm×8mm): - **上半区(12mm×4mm)**:参考标注内容区 - **下半区(12mm×4mm)**:标注符号绘制区 - **补丁右侧邻接区域**:标准标注内容区 ### 3. 分组设置 - 启用/禁用分组功能 - 创建多个分组并分配图层/图例项 - 设置分组标题样式(字体、大小、颜色) - 支持图层在分组内上下移动 - 支持图例项可见性控制 - **次级分组支持**: - 支持创建一级分组和次级分组的层级结构 - 支持"分组与次级标题"间距配置 - 支持"次级标题与图例项"间距配置 - 智能间距计算,根据分组层级自动选择合适的间距 ![步骤5-1](./images/step5_1.png) ### 4. 标题设置 - 设置图例标题内容 - 设置标题字体、大小、颜色、样式(粗体、斜体、下划线) - 分别设置图例标题、分组标题、描述文字样式 - 支持水平对齐方式设置(左对齐、居中、右对齐) ![步骤6-1](./images/step6_1.png) ### 5. 图面设置 - 符号宽度、高度配置(毫米) - 边框粗细调整 - 支持仅显示当前地图范围内可见的类 ![步骤7-1](./images/step7_1.png) ### 6. 布局设置 - **列数设置**:自定义图例列数 - **行数自动计算**:根据图例项数量和列数自动计算 - **间距精细控制**: - 标题和图例项间距 - 图例项间距 - 列间距 - 标题和分组间距 - 分组和图例项间距 - 图面和标注间距 ### 7. 位置设置 - 设置图例的 X、Y 位置(毫米) - 9 种锚点位置选择(左上角、上中点、右上角、左中点、中心、右中点、左下角、下中点、右下角) ![步骤7-1](./images/step9_1.png) ### 8. 框架设置 - **背景设置**: - 样式 - 间距、圆角 ![步骤10-1](./images/step10_1.png) - **生成示例**: ![步骤11-2](./images/step11_2.png) ### 9. 配置管理 - 导出图例配置为 XML 文件 - 从 XML 文件导入图例配置 - 配置自动缓存,下次创建时自动加载 ![步骤2-1](./images/step2_1.png) ### 10. 实时更新 - 启用/禁用图例实时联动更新 - 监听视图范围变化事件(地图平移/缩放) - 监听图层添加/删除事件 - 数据变化时自动刷新图例 - 可结合“数据驱动页面”批量出图 ![实时更新](./images/ealtime_update.png) --- ## 安装指南(后续代码性能优化后,开放源码) ### 系统要求 - **操作系统**:Windows 7 或更高版本 - **ArcGIS 版本**:ArcGIS 10.8.2 或更高版本(推荐) - **.NET Framework**:4.5.2 或更高版本 - **平台**:x86 > ⚠️ **重要兼容性说明**: > - 本插件基于 **ArcGIS 10.8.2** 开发和测试 > - **Windows 11 环境**:必须使用 ArcGIS 10.8.2 或更高版本 > - ArcGIS 10.8.1 在 Windows 11 上存在已知兼容性问题,可能导致插件闪退(Esri 已在 10.8.2 版本中修复) > - Windows 10 环境:可兼容 ArcGIS 10.8、10.8.1、10.8.2 版本 ### 安装步骤 1. **获取安装文件** - 从发布页面下载 `.esriAddIn` 文件 - 或从源代码编译生成 ![安装步骤1](./images/install_step1.png) 2. **安装 Add-In** ``` 方式一:双击安装 - 直接双击 `.esriAddIn` 文件 - 按照 ESRI Add-In 安装向导完成安装 ``` ![安装步骤2](./images/install_step2.png) 3. **验证安装** - 启动 ArcMap - 查看自定义工具条中是否出现"自定义图例工具" - 确认工具条包含以下按钮: - 自定义图例 - 数据驱动 - 实时更新 - 设置布局单位 - 图例配置文件管理 ![安装步骤3](./images/install_step3.png) ### 卸载 1. 打开 ArcMap 2. 进入"自定义" → "附加模块管理器" 3. 找到"CustomLegendAddIn" 4. 点击"删除此附加模块" 5. 重启 ArcMap --- ## 快速开始 ### 第一次使用(见详细操作步骤.md/.html) 1. **启动工具** - 在 ArcMap 布局视图中 - 点击"自定义图例工具"条上的"自定义图例"按钮 2. **选择图层** - 在左侧"可选图层"列表中选择需要的图层 - 点击"→"按钮添加到"已选图层" - 调整图层显示顺序 3. **配置样式(可选)** - 点击"下一步"进入参考标注设置 - 继续点击"下一步"进入分组设置 - 根据需要配置标题、布局、位置和框架 4. **生成图例** - 点击"完成"按钮 - 图例将自动添加到布局视图 --- ## 配置选项 ### 单位说明 - UI 中显示的单位为**毫米(mm)** - 所有间距、尺寸参数均以毫米为单位输入 - 系统自动转换为页面坐标系单位 - **圆角**为无量纲数,取值范围 0-100(0=完全方形,100=完全圆形) ### 默认值参考 | 参数 | 默认值 | 说明 | |------|--------|------| | 符号宽度 | 12.0 mm | 默认符号宽度 | | 符号高度 | 8.0 mm | 默认符号高度 | | 边框粗细 | 0.5 mm | 默认边框粗细 | | 标题字号 | 20.0 pt | 图例标题字号 | | 分组标题字号 | 12.0 pt | 分组标题字号 | | 描述文字字号 | 10.0 pt | 描述文字字号 | | 默认字体 | 宋体 | 默认字体名称 | --- ## 项目结构 ``` LegendAddIn/ ├── LegendLib/ # 核心类库项目 │ ├── Legend/ # 图例核心逻辑 │ │ ├── UI/ # 用户界面控件 │ │ │ ├── AnnotationSelectUI.cs # 注记选择界面 │ │ │ ├── AnnotationSelectUI.Designer.cs │ │ │ ├── CustomLegendFrm.cs # 主向导窗体 │ │ │ ├── CustomLegendFrm.Designer.cs │ │ │ ├── CustomLegendFrm.resx │ │ │ ├── LegendFrameUI.cs # 框架设置界面 │ │ │ ├── LegendFrameUI.Designer.cs │ │ │ ├── LegendGroupUI.cs # 分组设置界面 │ │ │ ├── LegendGroupUI.Designer.cs │ │ │ ├── LegendGroupUI.resx │ │ │ ├── LegendLayoutUI.cs # 布局设置界面 │ │ │ ├── LegendLayoutUI.Designer.cs │ │ │ ├── LegendPatchUI.cs # 图面设置界面 │ │ │ ├── LegendPatchUI.Designer.cs │ │ │ ├── LegendPatchUI.resx │ │ │ ├── LegendPositionUI.cs # 位置设置界面 │ │ │ ├── LegendPositionUI.Designer.cs │ │ │ ├── LegendSelectUI.cs # 图层选择界面 │ │ │ ├── LegendSelectUI.Designer.cs │ │ │ ├── LegendSelectUI.resx │ │ │ ├── LegendStyleUI.cs # 样式设置界面 │ │ │ ├── LegendStyleUI.Designer.cs │ │ │ ├── LegendStyleUI.resx │ │ │ ├── LegendTitleUI.cs # 标题设置界面 │ │ │ ├── LegendTitleUI.Designer.cs │ │ │ ├── LegendTitleUI.resx │ │ │ ├── ReferenceAnnotationUI.cs # 参考标注设置界面 │ │ │ └── ReferenceAnnotationUI.Designer.cs │ │ ├── ComHelper.cs # 通用辅助类 │ │ ├── ComLayout.cs # 布局计算类 │ │ ├── ComLegend.cs # 图例基类 │ │ ├── CustomComLegendItem.cs # 自定义图例项类 │ │ ├── GridLineItem.cs # 网格线项类 │ │ ├── GroupTitleItem.cs # 分组标题项类 │ │ ├── LegendConstants.cs # 图例常量定义 │ │ ├── LegendGroup.cs # 分组管理类 │ │ ├── LegendItemData.cs # 图例项数据类 │ │ ├── LegendPump.cs # 图例项提取类 │ │ ├── PageLayoutLegend.cs # 主图例类 │ │ ├── PageLayoutLegendItem.cs # 页面布局图例项基类 │ │ ├── ReferenceAnnotationData.cs # 参考标注数据类 │ │ ├── ReferenceAnnotationLegendItem.cs # 参考标注图例项类 │ │ ├── SettingsService.cs # 配置服务类 │ │ ├── StandardLegendItem.cs # 标准图例项类 │ │ ├── TitleItem.cs # 标题项类 │ │ └── UtilityHelper.cs # 工具辅助类 │ ├── NLogManage.cs # 日志管理类 │ └── LegendLib.csproj # 类库项目文件 │ └── LegendAddIn/ # ArcGIS Add-In 项目 ├── Images/ # 图标资源 │ ├── CustomLegendButton.png │ ├── CustomLegendButton1.png │ ├── Legend32.png │ ├── Logo1.png │ └── logo.png ├── Properties/ # 项目属性 │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Config.Designer.cs # Add-In 配置设计器 ├── Config.esriaddinx # Add-In 配置文件 ├── CustomLegendButton.cs # 自定义图例按钮 ├── DataDrivenButton.cs # 数据驱动按钮 ├── ExportConfigButton.cs # 导出配置按钮 ├── ImportConfigButton.cs # 导入配置按钮 ├── RealTimeUpdateButton.cs # 实时更新按钮 ├── SetPageUnitsButton.cs # 设置页面单位按钮 └── ToggleCacheButton.cs # 切换缓存按钮 ``` --- ## 技术架构 ### 核心类 | 类名 | 文件 | 说明 | |------|------|------| | `PageLayoutLegend` | PageLayoutLegend.cs | 主图例类,负责创建和绘制图例 | | `ComLayout` | ComLayout.cs | 布局计算类,负责计算图例项位置 | | `ComLegend` | ComLegend.cs | 图例基类,定义公共接口 | | `LegendGroup` | LegendGroup.cs | 分组类,管理分组信息 | | `LegendPump` | LegendPump.cs | 图例项提取类,从图层获取图例项 | | `SettingsService` | SettingsService.cs | 配置服务类,负责配置保存和加载 | ### 图例项类 | 类名 | 文件 | 说明 | |------|------|------| | `StandardLegendItem` | StandardLegendItem.cs | 标准图例项,支持默认模式和参考标注模式 | | `TitleItem` | TitleItem.cs | 图例标题项 | | `GroupTitleItem` | GroupTitleItem.cs | 分组标题项 | | `ReferenceAnnotationLegendItem` | ReferenceAnnotationLegendItem.cs | 参考标注图例项 | | `GridLineItem` | GridLineItem.cs | 网格线项 | | `PageLayoutLegendItem` | PageLayoutLegendItem.cs | 页面布局图例项基类 | | `CustomComLegendItem` | CustomComLegendItem.cs | 自定义图例项类 | ### 辅助类 | 类名 | 文件 | 说明 | |------|------|------| | `ComHelper` | ComHelper.cs | 通用辅助方法 | | `UtilityHelper` | UtilityHelper.cs | 工具辅助方法 | | `LegendConstants` | LegendConstants.cs | 图例常量定义 | | `UIStyleHelper` | UI/UIStyleHelper.cs | UI 样式辅助类 | | `NLogManage` | NLogManage.cs | 日志管理类 | ### 数据类 | 类名 | 文件 | 说明 | |------|------|------| | `LegendItemData` | LegendItemData.cs | 图例项数据类 | | `ReferenceAnnotationData` | ReferenceAnnotationData.cs | 参考标注数据类 | ### UI 控件类 | 类名 | 文件 | 说明 | |------|------|------| | `CustomLegendFrm` | CustomLegendFrm.cs | 主向导窗体 | | `LegendSelectUI` | LegendSelectUI.cs | 图层选择界面 | | `ReferenceAnnotationUI` | ReferenceAnnotationUI.cs | 参考标注设置界面 | | `LegendGroupUI` | LegendGroupUI.cs | 分组设置界面 | | `LegendTitleUI` | LegendTitleUI.cs | 标题设置界面 | | `LegendPatchUI` | LegendPatchUI.cs | 图面设置界面 | | `LegendLayoutUI` | LegendLayoutUI.cs | 布局设置界面 | | `LegendPositionUI` | LegendPositionUI.cs | 位置设置界面 | | `LegendFrameUI` | LegendFrameUI.cs | 框架设置界面 | | `LegendStyleUI` | LegendStyleUI.cs | 样式设置界面 | | `AnnotationSelectUI` | AnnotationSelectUI.cs | 注记选择界面 | | `StepIndicator` | StepIndicator.cs | 步骤指示器控件 | ### Add-In 按钮类 | 类名 | 文件 | 说明 | |------|------|------| | `CustomLegendButton` | CustomLegendButton.cs | 自定义图例按钮 | | `DataDrivenButton` | DataDrivenButton.cs | 数据驱动按钮 | | `ExportConfigButton` | ExportConfigButton.cs | 导出配置按钮 | | `ImportConfigButton` | ImportConfigButton.cs | 导入配置按钮 | | `SetPageUnitsButton` | SetPageUnitsButton.cs | 设置页面单位按钮 | | `ToggleCacheButton` | ToggleCacheButton.cs | 切换缓存按钮 | | `RealTimeUpdateButton` | RealTimeUpdateButton.cs | 实时更新按钮 | --- ## 开发环境 ### 开发工具 - **开发工具**:Visual Studio 2019 或更高版本 - **目标框架**:.NET Framework 4.5.2 - **ArcGIS 版本**:ArcGIS 10.8.2 - **平台目标**:x86 ### 编译步骤 1. **克隆仓库** ```bash git clone cd LegendAddIn ``` 2. **打开解决方案** - 使用 Visual Studio 打开 `LegendAddIn.sln` 3. **配置依赖项** - 确保已安装 ArcGIS 10.8 SDK - 确保 ESRI 引用路径正确 4. **编译项目** ```bash # 使用 dotnet CLI dotnet build LegendAddIn.sln --configuration Release # 或在 Visual Studio 中 # 选择 Release 配置,点击"生成解决方案" ``` 5. **生成 Add-In 包** - 编译成功后,在 `LegendAddIn\bin\Release\` 目录下生成 `.esriAddIn` 文件 --- ## 依赖项 ### ArcGIS 相关 - ESRI.ArcGIS.Carto - ESRI.ArcGIS.Display - ESRI.ArcGIS.DisplayUI - ESRI.ArcGIS.Geometry - ESRI.ArcGIS.Framework - ESRI.ArcGIS.ArcMapUI - ESRI.ArcGIS.Geodatabase - ESRI.ArcGIS.ADF - ESRI.ArcGIS.ADF.Connection.Local ### 第三方库 - **NLog** - 日志记录库 --- ## 贡献指南 我们欢迎任何形式的贡献! ### 贡献方式 1. **报告 Bug** - 使用 Issues 页面报告问题 - 提供详细的复现步骤 - 包含系统环境信息 - 如有可能,附上截图 2. **提交功能建议** - 使用 Issues 页面提出建议 - 详细描述功能需求 - 说明使用场景 3. **代码贡献** ### 代码规范 - 遵循现有代码风格 - 添加必要的注释 - 确保编译无错误、无警告 - 更新相关文档 --- ## 许可证 Copyright © wangdl23 本项目采用以下许可证: **保留所有权利** --- ## 待开发功能 1. **「数据驱动页面」联动**:当前"实时更新"支持与 ArcMap 数据驱动页面功能联动,后续增加"数据驱动页面"批量导出为jpg/png 2. **标题位置调整**:支持图例标题、分组标题位置设置(居中、左对齐、右对齐) 3. **锚点与位置关系优化**:优化锚点设置与图例位置的计算逻辑 4. **UI 美化**:优化用户界面视觉效果和交互体验 --- ## 更新日志 ### v1.0.6 (2026-03-29) #### ✨ 功能增强 **次级分组功能完整支持** - 新增"分组与次级标题"间距配置 - 新增"次级标题与图例项"间距配置 - 支持分组层级管理(一级分组、次级分组) - 优化分组间距逻辑,支持不同层级间的智能间距计算 - 在UI界面中新增两个间距输入控件 #### 🐛 问题修复 **一级分组序列中零项数分组导致间距异常问题** - **问题现象**:当分组序列中存在零项数分组时,前后有效分组间距变为两倍 - **问题原因**:零项数分组未被真正过滤,仍然在分组数组中贡献间距 - **修复方案**:在传递分组给ComLayout之前,提前过滤掉零项数分组 - **修改文件**:`PageLayoutLegend.cs` - 添加分组过滤逻辑,过滤掉零项数分组 - 修改LayoutGroupLegendItems方法,使用过滤后的分组集合 **实时更新时次级分组的一级分组未能生成问题** - **问题现象**:实时更新时,有次级分组的一级分组被当作零项数分组过滤 - **问题原因**:RebuildGroups方法未恢复ParentGroupId和GroupLevel等层级属性 - **修复方案**:在RebuildGroups方法中补充缺失的层级属性恢复 - **修改文件**:`RealTimeUpdateButton.cs` - 添加group.GroupId恢复 - 添加group.GroupTitleHorizontalAlignment恢复 - 添加group.ParentGroupId恢复(关键) - 添加group.GroupLevel恢复(关键) **一级分组与次级分组间距误差问题** - **问题现象**:设置为2mm时实际间距约为4mm - **问题原因**:有次级分组但没有图例项的一级分组,错误地加上了_spacingGroupLegendItem - **修复方案**:检查分组是否有次级分组且没有图例项,条件满足时不加该间距 - **修改文件**:`ComLayout.cs`和`PageLayoutLegend.cs` #### 🔧 技术改进 **分组间距系统优化** - 新增两个间距常量:`SpacingGroupSubGroup`和`SpacingSubGroupLegendItem` - 完善间距应用场景逻辑: - 场景1:一级分组→次级分组,使用SpacingGroupSubGroup - 场景2:次级分组→次级分组,使用SpacingGroupSubGroup - 场景3:次级分组→一级分组,使用普通分组间距 - 场景4:一级分组→一级分组,使用普通分组间距 **UI界面完善** - 在LegendPatchUI中新增6个UI控件 - 调整布局大小和行列数以容纳新控件 - 完善配置序列化和反序列化逻辑 - 新增相关属性和方法支持 --- ### v1.0.5 (2026-03-28) #### 🐛 问题修复 **实时更新功能背景间距参数不生效问题** - **问题原因**:在 `RealTimeUpdateButton.cs` 的 `ApplyFrameSettings` 方法中,缺少了 `m_BackgroundSpacing` 的设置语句,导致实时更新时背景间距参数未能正确传递 - **修复方案**:在 `ApplyFrameSettings` 方法中添加完整的背景间距设置逻辑 - 调用 `GetMmToPageUnitFactor()` 获取单位转换系数 - 使用 `Math.Max(0, settings.BackgroundSpacing)` 确保间距不为负数 - 设置 `pll.m_BackgroundSpacing = safeSpacing * mmToPageUnit` - **影响范围**:实时更新功能现在可以正确应用背景间距参数,用户调整间距后可以立即在地图中看到效果 #### ✨ 功能增强 **实时更新背景间距完整支持** - 与手动创建图例保持一致的单位转换逻辑 - 包含负值保护机制,确保间距不会为负数 - 完整的参数传递链路:UI → settings → 实时更新 → PageLayoutLegend → CreateBackgroundFrame #### 🔧 技术改进 **参数传递链路验证** - 完整追踪了背景间距在实时更新流程中的传递路径 - 验证了单位转换的正确性(UI 毫米 → 页面单位) - 确认了 CreateBackgroundFrame 方法对 spacing 参数的正确使用 --- ### v1.0.4 (2026-03-28) #### 🐛 问题修复 **背景框架间距功能失效问题** - **问题原因**:在 `CustomLegendFrm.cs` 的 `AddLegend` 方法(第 2169-2174 行)中,传递背景相关参数给 `PageLayoutLegend` 时,缺少了 `pll.m_BackgroundSpacing` 的传递语句,导致 `_backgroundSpacing` 始终保持默认值 0.0 - **修复方案**:添加缺失的参数传递语句 `pll.m_BackgroundSpacing = m_LegendFrameUI.m_BackgroundSpacing * totalFactor;` - **影响范围**:背景框架间隔功能现在可以正常工作,用户在"框架"子窗口中"背景设置"面板设置的间距值能够正确应用 **分组模式下背景框架高度不足问题** - **问题原因**:在布局图例项时没有更新 `StandardLegendItem.Envelope` 属性,导致计算联合包络时缺少分组图例项的几何信息 - **修复方案**:在以下方法中添加包络更新代码: - `PageLayoutLegend.cs` 的 `LayoutDefaultItem()` 方法 - `PageLayoutLegend.cs` 的 `LayoutReferenceAnnotationItem()` 方法 - `ComLayout.cs` 的 `LayoutStandardLegendItem()` 方法 - **修复代码**:在布局方法末尾添加 `stdItem.Envelope = envelope;` #### ✨ 功能增强 **背景间距单位转换优化** - 与其他间距参数保持一致,使用 `totalFactor` 将 UI 中的毫米值转换为页面单位 - 单位转换路径:UI 单位 → 毫米 → 页面单位 - 转换系数:`totalFactor = userUnitToMm * mmToPageUnit` **新增调试日志记录** - 在背景间距传递时添加详细日志记录 - 日志格式:`【参数传递】UI设置背景间距: {0:F2}mm -> {1:F4}PageUnit, 传递给PageLayoutLegend` - 便于调试和验证间距值的正确传递 #### 🔧 技术改进 **CreateBackgroundFrame 函数分析** - 完整追踪了 `spacing` 参数的传递路径 - 验证了数据类型转换(decimal ↔ double) - 验证了边界条件(UI 控件范围:0-500mm) - 确认了几何计算逻辑的正确性 **参数传递链路(修复后)** ``` UI 控件 (numBackgroundSpacing, mm) ↓ LegendFrameUI.m_BackgroundSpacing (double) ↓ m_LegendFrameUI.m_BackgroundSpacing * totalFactor (页面单位) ↓ PageLayoutLegend._backgroundSpacing ↓ CreateBackgroundFrame(originalEnvelope, _backgroundSpacing) ``` ### v1.0.3 (2026-03-24) - ✨ 列间距定义优化:重新定义列间距为第i列图例块Patch的右侧边缘与第i+1列图例块Patch的左侧边缘之间的距离 - ✨ 框架宽度计算优化:采用新公式 `框架宽度 = 2×框架边距 + 列数×Patch宽度 + 列数×列间距` - ✨ 标题位置计算优化:标题水平居中基于新的框架宽度计算 - ✨ 垂直网格线布局优化:垂直网格线居中于列间距中,并添加最小宽度保护 - 🔧 新增详细的列间距和框架宽度计算日志记录 - 🔧 新增 `DefaultVerticalGridLineMinWidth = 0.01` 常量 ### v1.0.2 (2026-03-23) - ✨ 缓存读取验证优化:加载缓存配置时自动验证图层、分组、参考标注引用的图层是否存在于当前工程 - 已选图层验证:自动过滤不存在的图层 - 分组配置验证:保留有效分组,移除无效图层引用 - 参考标注验证:保留有效的参考标注配置 - ✨ 缓存内容保留策略:保存配置时自动合并历史数据 - 保留历史配置中当前配置未覆盖的图层 - 保留历史配置中当前配置未覆盖的分组 - 保留历史配置中当前配置未覆盖的参考标注 - 🔧 新增 `GetCurrentMapLayerNames()` 方法:获取当前工程图层列表 - 🔧 新增 `ValidateAndMergeSettings()` 方法:验证缓存配置有效性 - 🔧 新增 `MergeWithHistoricalSettings()` 方法:合并历史配置数据 ### v1.0.1 (2026-03-23) - ✨ 统一间距配置:删除 SpacingTitleGroup(标题和分组标题之间的间距),统一使用 "主标题和内容" SpacingTitleLegend - 🐛 修复主标题锚点设置错误逻辑:将锚点从左下角修改为包络矩形中心,与文本居中对齐匹配 - 🐛 修复默认间距值显示错误:修正 decimal 构造函数的缩放因子,使默认间距值正确显示为毫米单位 - 主标题和内容:0.5mm → 5.0mm - 图例项:0.3mm → 3.0mm - 列:1.0mm → 10.0mm - 分组和图例项:0.2mm → 2.0mm - 图面和标注:0.3mm → 3.0mm - 🔄 保持向后兼容性:保留 SpacingTitleGroup 的序列化属性,反序列化时将值同步到 SpacingTitleLegend ### v1.0.0 (2026-03-19) - ✨ 初始版本发布 - ✨ 支持图层选择和排序 - ✨ 支持参考标注模式 - ✨ 支持分组管理 - ✨ 支持标题样式设置 - ✨ 支持图面、布局、位置、框架配置 - ✨ 支持配置导入导出和缓存 - ✨ 支持实时更新功能 - 监听视图范围变化事件 - 监听图层添加/删除事件 - 按钮状态持久化 - Toggle Button 切换效果 - ✨ 支持仅显示当前地图范围内可见图例项 - ✨ 支持单一符号(SimpleRenderer)图层 - 🐛 修复分组功能图例项识别问题 - 🐛 修复分组 UI 显示行数为 0 的问题 - 🐛 修复描述文本宽度计算(排除 标签) - 🐛 修复 LegendTitleUI 中 SetTitleHorizontalAlignment/SetGroupTitleHorizontalAlignment 的 SelectedIndex 越界错误 - 🐛 修复 ComLayout 中 CalculateItemWidth/GetItemWidth 的空引用异常 - 🐛 修复 CreateSimpleLegendItem 未调用 Create() 方法导致图例项未正确创建的问题 - 🐛 修复实时更新时位置参数单位转换错误(毫米到厘米) - ⚡ 优化文字子窗口加载性能(字体缓存) - ⚡ 优化 m_LegendItems 属性:支持 UniqueValueRenderer 和 SimpleRenderer 两种渲染器类型 --- ## 联系方式 如有问题或建议,请通过以下方式联系: - 提交 Issue - 发送邮件 1581937596@qq.com --- **感谢使用 LegendAddIn!**