a
This commit is contained in:
@@ -0,0 +1,334 @@
|
||||
# 测区创建与配置
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp)
|
||||
- [opcreatetzdlg.h](file://h/opcreatetzdlg.h)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp)
|
||||
- [testzone.xml](file://CACHE/testzone.xml)
|
||||
- [project.xml](file://CACHE/project.xml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕“测区创建与配置”主题,系统梳理GeomativeStudio中测区(Testing Zone)的创建流程、用户输入校验、测区类型(TZtype)业务规则、与数据库的交互、以及测区配置界面(如DialCfgTerrain)的数据绑定与持久化策略。重点说明:
|
||||
- CProManager类中创建新测区的核心方法调用链与事务控制
|
||||
- TestingZone类如何构建测区元数据模型及其字段约束
|
||||
- 测区配置界面的UI逻辑与数据绑定机制
|
||||
- 用户配置参数如何序列化并持久化到testzone.xml文件
|
||||
- 常见配置错误的排查与修复建议
|
||||
|
||||
## 项目结构
|
||||
与测区创建与配置直接相关的模块分布如下:
|
||||
- 管理层:CProManager(工程与测区管理)
|
||||
- 模型层:CTestingZone(测区元数据封装)
|
||||
- 视图层:opcreatetzdlg(创建测区对话框)、DialCfgTerrain(地形配置对话框)
|
||||
- 缓存与持久化:CACHE目录下的testzone.xml、project.xml
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "管理层"
|
||||
PM["CProManager<br/>测区创建/下发/同步"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
TZ["CTestingZone<br/>测区元数据"]
|
||||
end
|
||||
subgraph "视图层"
|
||||
Dlg["COpCreateTzDlg<br/>创建测区对话框"]
|
||||
Terrain["CDialCfgTerrain<br/>地形配置对话框"]
|
||||
end
|
||||
subgraph "缓存与持久化"
|
||||
XML_TZ["CACHE/testzone.xml"]
|
||||
XML_PRJ["CACHE/project.xml"]
|
||||
end
|
||||
Dlg --> PM
|
||||
PM --> TZ
|
||||
PM --> XML_TZ
|
||||
PM --> XML_PRJ
|
||||
Terrain --> XML_TZ
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
- [testzone.xml](file://CACHE/testzone.xml#L1-L57)
|
||||
- [project.xml](file://CACHE/project.xml#L1-L22)
|
||||
|
||||
章节来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
- [testzone.xml](file://CACHE/testzone.xml#L1-L57)
|
||||
- [project.xml](file://CACHE/project.xml#L1-L22)
|
||||
|
||||
## 核心组件
|
||||
- CProManager:提供测区创建、设备下发、同步等功能;负责数据库事务与设备通信。
|
||||
- CTestingZone:封装测区元数据(名称、类型、创建日期、描述、位置、CN等),用于UI展示与业务逻辑。
|
||||
- COpCreateTzDlg:测区创建对话框,负责用户输入校验与TZtype赋值。
|
||||
- CDialCfgTerrain:地形配置对话框,负责地形数据的导入、校验与写入原始dat文件。
|
||||
|
||||
章节来源
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [opcreatetzdlg.h](file://h/opcreatetzdlg.h#L1-L53)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
|
||||
## 架构总览
|
||||
测区创建与下发的关键流程如下:
|
||||
- 用户通过对话框输入测区基本信息(名称、类型、日期、位置、描述)
|
||||
- CProManager在数据库中插入测区记录并生成唯一CN
|
||||
- 将测区元数据序列化为testzone.xml并下发至设备
|
||||
- 设备侧接收后,写入dev_syn_td标记同步状态
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant D as "COpCreateTzDlg"
|
||||
participant PM as "CProManager"
|
||||
participant DB as "数据库"
|
||||
participant DEV as "设备"
|
||||
participant FS as "本地文件系统"
|
||||
U->>D : 打开创建测区对话框
|
||||
D->>D : 输入校验与TZtype赋值
|
||||
D-->>PM : 返回测区参数
|
||||
PM->>DB : 插入tz记录并生成CN
|
||||
PM->>FS : 生成testzone.xml
|
||||
PM->>DEV : 下发testzone.xml
|
||||
DEV-->>PM : 返回下发结果
|
||||
PM->>DB : 写入dev_syn_td(IsSyned=true)
|
||||
PM-->>U : 创建完成/错误提示
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
- [testzone.xml](file://CACHE/testzone.xml#L1-L57)
|
||||
|
||||
章节来源
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### CProManager类:创建新测区的核心流程
|
||||
- 对话框调用与参数收集
|
||||
- 通过COpCreateTzDlg收集测区名称、位置、描述、创建日期等参数。
|
||||
- 对话框内部将TZtype固定为“3”,体现“默认测区”的强制逻辑。
|
||||
- 数据库插入与ID回填
|
||||
- 使用Command执行INSERT语句,插入tz记录并返回ID。
|
||||
- 通过查询再次确认ID,保证后续流程使用正确ID。
|
||||
- XML生成与下发
|
||||
- 以CMarkup生成testzone.xml,包含type、location、desc、create_date、test_date、cn、testzone_name等节点。
|
||||
- 调用AddTzInDev创建设备端测区目录与类型标记,随后通过SendFile下发testzone.xml。
|
||||
- 同步状态维护
|
||||
- 下发成功后,向dev_syn_td写入IsSyned=true,标记该测区已同步。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> OpenDlg["打开测区创建对话框"]
|
||||
OpenDlg --> Validate["输入校验<br/>名称必填"]
|
||||
Validate --> |通过| InsertTZ["插入tz记录"]
|
||||
Validate --> |不通过| Error["提示错误并终止"]
|
||||
InsertTZ --> GenXML["生成testzone.xml"]
|
||||
GenXML --> SendFile["下发testzone.xml到设备"]
|
||||
SendFile --> |成功| MarkSync["写入dev_syn_td(IsSyned=true)"]
|
||||
SendFile --> |失败| Rollback["删除设备端测区并回滚"]
|
||||
MarkSync --> End(["结束"])
|
||||
Error --> End
|
||||
Rollback --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
|
||||
章节来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
|
||||
### TestingZone类:测区元数据模型
|
||||
- 字段定义与约束
|
||||
- 名称、创建日期、描述、位置、CN、TZtype等均来自数据库tz表查询结果。
|
||||
- ShowDetailInfo根据TZtype映射为“1D VES | 2D ERI”、“3D ERT”或“All Type”,用于UI展示。
|
||||
- 数据来源
|
||||
- 通过ADO Recordset按ID查询tz表,填充成员变量。
|
||||
- 使用场景
|
||||
- 在工程树或详情面板中展示测区信息;与CProManager配合进行测区同步。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingZone {
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szTZname
|
||||
-CString m_szCDate
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szCN
|
||||
-CString m_szTZtype
|
||||
+ShowDetailInfo(tzDetailList) bool
|
||||
+CTestingZone(dwID, connection)
|
||||
+~CTestingZone()
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
|
||||
章节来源
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
|
||||
### COpCreateTzDlg:测区创建对话框与TZtype业务规则
|
||||
- 用户输入验证
|
||||
- 名称必填校验;其他字段长度限制(位置、描述)。
|
||||
- TZtype强制逻辑
|
||||
- 对话框内部将m_edTzType硬编码为“3”,即“默认测区”类型。
|
||||
- 这意味着创建新测区时,类型必须为3,否则后续流程会报错或不一致。
|
||||
- 交互细节
|
||||
- OnOK中完成UpdateData与校验,随后设置TZtype并关闭对话框。
|
||||
|
||||
章节来源
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [opcreatetzdlg.h](file://h/opcreatetzdlg.h#L1-L53)
|
||||
|
||||
### DialCfgTerrain:地形配置界面与数据绑定
|
||||
- UI与数据绑定
|
||||
- 通过DoDataExchange绑定控件,支持列表项编辑、删除、新增等操作。
|
||||
- 支持从dat文件导入地形数据,写入指定位置并追加结束符。
|
||||
- 输入校验与写入策略
|
||||
- 校验dat文件头三行是否包含有效装置类型信息;禁止Wenner(gamma)与1D装置写入地形数据。
|
||||
- 根据装置类型确定末尾0的个数,确保文件格式正确。
|
||||
- 写入格式包含“地形数据标志”“点数”“各点坐标”“首电极对应点号”“若干0结束符”。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Enter(["进入地形配置"]) --> Import["导入dat文件"]
|
||||
Import --> Parse["解析文件头信息<br/>校验装置类型"]
|
||||
Parse --> |不合法| Warn["提示错误并终止"]
|
||||
Parse --> |合法| Edit["编辑地形点列表"]
|
||||
Edit --> Save["保存到原文件"]
|
||||
Save --> Write["写入标志/点数/坐标/首电极点号/结束符"]
|
||||
Write --> Done(["完成"])
|
||||
Warn --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
|
||||
章节来源
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
|
||||
### XML文件生成规则与持久化
|
||||
- testzone.xml生成规则
|
||||
- 根元素为testzone,子元素包含type、location、desc、create_date、create_time、test_date、test_time、cn、testzone_name、testzone_3D_script、vess、eris、erts等。
|
||||
- 元素层级清晰,便于设备侧解析与同步。
|
||||
- project.xml生成规则
|
||||
- 根元素为project,包含工程相关信息及testzones节点,其中包含多个测区的TYPE与CN。
|
||||
- 持久化路径
|
||||
- 本地缓存路径:CACHE/projects/{PrCN}/{TzCN}/testzone.xml
|
||||
- 设备侧路径:/SD/projects/{PrCN}/{TzCN}/testzone.xml
|
||||
|
||||
章节来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
- [testzone.xml](file://CACHE/testzone.xml#L1-L57)
|
||||
- [project.xml](file://CACHE/project.xml#L1-L22)
|
||||
|
||||
## 依赖关系分析
|
||||
- CProManager依赖ADO数据库连接与设备通信接口,负责事务控制与文件下发。
|
||||
- CTestingZone依赖数据库查询结果,用于UI展示与业务逻辑。
|
||||
- COpCreateTzDlg与DialCfgTerrain分别负责用户输入与地形数据配置,最终驱动CProManager完成测区创建与下发。
|
||||
- XML文件作为中间介质,贯穿本地与设备两端的数据交换。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Dlg["COpCreateTzDlg"] --> PM["CProManager"]
|
||||
Terrain["CDialCfgTerrain"] --> PM
|
||||
PM --> DB["数据库"]
|
||||
PM --> XML["testzone.xml"]
|
||||
PM --> DEV["设备"]
|
||||
TZ["CTestingZone"] --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
|
||||
章节来源
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
|
||||
## 性能考量
|
||||
- 数据库事务:CProManager在下发成功后才提交事务,避免半写状态;失败时回滚并清理设备端测区,减少资源浪费。
|
||||
- 文件IO:XML生成与下发采用一次性写入,避免频繁小块写入;地形文件写入采用定位与覆盖策略,减少磁盘碎片。
|
||||
- UI响应:对话框在关键校验处短路返回,降低无效计算;列表控件批量更新,提升渲染效率。
|
||||
|
||||
## 故障排查指南
|
||||
- 测区类型设置错误
|
||||
- 现象:创建测区时报TZType错误或设备端同步失败。
|
||||
- 原因:对话框内部强制TZtype为“3”,若外部逻辑绕过对话框,可能导致类型不一致。
|
||||
- 处理:确保通过COpCreateTzDlg创建测区,或在调用CProManager前显式设置TZtype为“3”。
|
||||
|
||||
- 必填字段缺失
|
||||
- 现象:对话框提示名称为空或校验失败。
|
||||
- 处理:完善名称、位置、描述等字段后再提交;注意长度限制。
|
||||
|
||||
- 地形文件写入失败
|
||||
- 现象:写地形数据到原文件失败或未找到结束符。
|
||||
- 原因:dat文件格式不符合要求、装置类型不支持写地形、首电极点号越界。
|
||||
- 处理:检查文件头三行、装置类型合法性、点号范围;确保末尾0个数符合约定。
|
||||
|
||||
- 下发失败
|
||||
- 现象:设备返回失败或本地提示发送失败。
|
||||
- 处理:检查设备通信状态、路径权限、文件完整性;必要时删除设备端测区并重试。
|
||||
|
||||
- 同步状态异常
|
||||
- 现象:dev_syn_td中IsSyned未置位或置位错误。
|
||||
- 处理:确认下发成功后是否执行写入dev_syn_td;若失败则回滚并清理设备端测区。
|
||||
|
||||
章节来源
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
|
||||
## 结论
|
||||
- 测区创建流程由对话框输入、数据库插入、XML生成与下发、同步状态维护构成,CProManager承担核心协调职责。
|
||||
- TestingZone提供稳定的测区元数据封装,支撑UI展示与业务逻辑。
|
||||
- DialCfgTerrain负责地形配置,严格遵循文件格式规范,保障设备侧可正确解析。
|
||||
- TZtype强制为“3”的设计体现了默认测区的业务规则,应严格遵守以避免后续错误。
|
||||
|
||||
## 附录
|
||||
- 关键流程参考路径
|
||||
- [创建测区对话框](file://cpp/Views/opcreatetzdlg.cpp#L54-L92)
|
||||
- [创建测区数据库流程](file://cpp/Managers/ProManager.cpp#L945-L1013)
|
||||
- [下发测区XML流程](file://cpp/Managers/ProManager.cpp#L800-L943)
|
||||
- [测区元数据模型](file://cpp/ProblemZone/TestingZone.cpp#L1-L82)
|
||||
- [地形配置与写入](file://cpp/Views/DialCfgTerrain.cpp#L539-L693)
|
||||
- [测区XML样例](file://CACHE/testzone.xml#L1-L57)
|
||||
- [工程XML样例](file://CACHE/project.xml#L1-L22)
|
||||
@@ -0,0 +1,250 @@
|
||||
# 测区数据同步
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [OnLineSynTdDlg.cpp](file://cpp/Views/OnLineSynTdDlg.cpp)
|
||||
- [OnLineSynDevDlg.cpp](file://cpp/Views/OnLineSynDevDlg.cpp)
|
||||
- [OpSynDlg.cpp](file://cpp/Views/OpSynDlg.cpp)
|
||||
- [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档全面构建了测区数据同步机制的技术文档,重点描述了CProManager如何协调FileTransfer和UpdateDataBase组件实现测区数据在本地应用与GD10设备间的双向同步。详细说明了同步协议的实现细节,包括数据包格式、传输校验机制(如CRC16/CRC32)和断点续传逻辑。解释了同步过程中对testzone.xml文件的读取、解析和更新流程,以及如何确保设备端与PC端测区数据的一致性。分析了同步失败的异常处理策略,如网络中断、设备无响应等情况下的重试机制和错误码定义。提供了性能优化建议,包括大数据量测区的分批传输策略和同步进度的UI反馈实现。文档包含实际同步日志的分析示例,帮助开发者诊断常见同步问题。
|
||||
|
||||
## 项目结构
|
||||
项目结构显示了测区数据同步相关的文件和目录,包括CACHE、DB、Install、LOG、Release、cpp、h、res、tools等目录。关键文件包括ProManager.cpp、SynOperator.cpp、UpdateDataBase.cpp、FileTransfer.cpp等,这些文件实现了测区数据同步的核心功能。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[GeomativeStudio] --> B[CACHE]
|
||||
A --> C[DB]
|
||||
A --> D[Install]
|
||||
A --> E[LOG]
|
||||
A --> F[Release]
|
||||
A --> G[cpp]
|
||||
A --> H[h]
|
||||
A --> I[res]
|
||||
A --> J[tools]
|
||||
G --> K[Managers]
|
||||
G --> L[Operator]
|
||||
G --> M[Tools]
|
||||
G --> N[Views]
|
||||
K --> O[ProManager.cpp]
|
||||
L --> P[SynOperator.cpp]
|
||||
L --> Q[UpdateDataBase.cpp]
|
||||
M --> R[FileTransfer.cpp]
|
||||
M --> S[Crc16.cpp]
|
||||
M --> T[Crc32.cpp]
|
||||
N --> U[OnLineSynTdDlg.cpp]
|
||||
N --> V[OnLineSynDevDlg.cpp]
|
||||
N --> W[OpSynDlg.cpp]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
- [OnLineSynTdDlg.cpp](file://cpp/Views/OnLineSynTdDlg.cpp)
|
||||
- [OnLineSynDevDlg.cpp](file://cpp/Views/OnLineSynDevDlg.cpp)
|
||||
- [OpSynDlg.cpp](file://cpp/Views/OpSynDlg.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
- [OnLineSynTdDlg.cpp](file://cpp/Views/OnLineSynTdDlg.cpp)
|
||||
- [OnLineSynDevDlg.cpp](file://cpp/Views/OnLineSynDevDlg.cpp)
|
||||
- [OpSynDlg.cpp](file://cpp/Views/OpSynDlg.cpp)
|
||||
|
||||
## 核心组件
|
||||
核心组件包括CProManager、CSynOperator、CUpdateDataBase、FileTransfer、Crc16、Crc32等类,这些类实现了测区数据同步的核心功能。CProManager负责管理工程和测区,CSynOperator负责同步操作,CUpdateDataBase负责数据库更新,FileTransfer负责文件传输,Crc16和Crc32负责数据校验。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
## 架构概述
|
||||
测区数据同步机制的架构包括本地应用、GD10设备、网络通信、文件传输、数据校验等组件。CProManager协调FileTransfer和UpdateDataBase组件,实现测区数据在本地应用与GD10设备间的双向同步。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[本地应用] --> B[CProManager]
|
||||
B --> C[FileTransfer]
|
||||
B --> D[UpdateDataBase]
|
||||
C --> E[GD10设备]
|
||||
D --> F[数据库]
|
||||
E --> G[网络通信]
|
||||
C --> H[Crc16]
|
||||
C --> I[Crc32]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
## 详细组件分析
|
||||
### CProManager分析
|
||||
CProManager类负责管理工程和测区,包括创建工程、创建测区、同步数据等操作。它通过调用FileTransfer和UpdateDataBase组件实现测区数据的同步。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CProManager {
|
||||
+ShowTzList()
|
||||
+GetDMS()
|
||||
+ShowProList()
|
||||
+CreateProjectInDB()
|
||||
+InsertDefaultTzToProject()
|
||||
+CreateProjectInDev()
|
||||
+CreateDefaultTzInDev()
|
||||
+CreateTzInDev()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
|
||||
### CSynOperator分析
|
||||
CSynOperator类负责同步操作,包括同步测区数据、同步任务数据等。它通过调用CProManager和FileTransfer组件实现数据同步。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CSynOperator {
|
||||
+Syn()
|
||||
+InitialSynDlg()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
|
||||
### CUpdateDataBase分析
|
||||
CUpdateDataBase类负责数据库更新,包括更新数据库版本、更新数据库结构等。它通过解析XML文件实现数据库的更新。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CUpdateDataBase {
|
||||
+QueryPreVersion()
|
||||
+CheckNecessaryVersion()
|
||||
+WriteVersionToDB()
|
||||
+GetDBUpdatesInfo()
|
||||
+ParserUpdateDBXml()
|
||||
+AddDBTable()
|
||||
+DeleteDBTable()
|
||||
+AddTableCol()
|
||||
+ModifyTableCol()
|
||||
+ModifyDBTable()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
|
||||
### FileTransfer分析
|
||||
FileTransfer类负责文件传输,包括发送文件、接收文件等。它通过调用底层通信接口实现文件的传输。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FileTransfer {
|
||||
+error()
|
||||
+status()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
|
||||
### Crc16和Crc32分析
|
||||
Crc16和Crc32类负责数据校验,包括计算CRC16和CRC32校验码。它们通过查表法实现高效的校验码计算。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Crc16 {
|
||||
+table[256]
|
||||
+initialized
|
||||
+Crc16()
|
||||
}
|
||||
class Crc32 {
|
||||
+table[256]
|
||||
+initialized
|
||||
+Crc32()
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
## 依赖分析
|
||||
测区数据同步机制的依赖包括本地应用、GD10设备、网络通信、文件传输、数据校验等。CProManager依赖于FileTransfer和UpdateDataBase组件,FileTransfer依赖于Crc16和Crc32组件。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[CProManager] --> B[FileTransfer]
|
||||
A --> C[UpdateDataBase]
|
||||
B --> D[Crc16]
|
||||
B --> E[Crc32]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
## 性能考虑
|
||||
为了提高测区数据同步的性能,可以采用分批传输策略,将大数据量的测区数据分成多个小批次进行传输。同时,可以通过UI反馈显示同步进度,提高用户体验。
|
||||
|
||||
## 故障排除指南
|
||||
同步失败的常见原因包括网络中断、设备无响应、数据校验失败等。可以通过重试机制和错误码定义来处理这些异常情况。例如,当网络中断时,可以等待网络恢复后重新尝试同步;当设备无响应时,可以检查设备连接状态并重新连接。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [SynOperator.cpp](file://cpp/Operator/SynOperator.cpp)
|
||||
- [UpdateDataBase.cpp](file://cpp/Operator/UpdateDataBase.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
|
||||
## 结论
|
||||
本文档详细描述了测区数据同步机制的实现细节,包括核心组件、架构概述、详细组件分析、依赖分析、性能考虑和故障排除指南。通过本文档,开发者可以更好地理解和实现测区数据同步功能。
|
||||
@@ -0,0 +1,234 @@
|
||||
# 测区管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp)
|
||||
- [opcreatetzdlg.h](file://h/opcreatetzdlg.h)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目与测区层级关系](#项目与测区层级关系)
|
||||
2. [CProManager::ShowTzList方法分析](#cpromanagershowtzlist方法分析)
|
||||
3. [测区类型(TZtype)枚举值及业务含义](#测区类型tztype枚举值及业务含义)
|
||||
4. [测区配置数据持久化机制](#测区配置数据持久化机制)
|
||||
5. [测区创建完整性校验流程](#测区创建完整性校验流程)
|
||||
6. [测区数据模型字段说明](#测区数据模型字段说明)
|
||||
|
||||
## 项目与测区层级关系
|
||||
|
||||
在GeomativeStudio系统中,项目与测区之间存在明确的父子层级关系。每个项目可以包含多个测区,但每个测区只能属于一个项目。这种关系通过数据库中的外键约束实现,其中测区表(tz)中的PRID字段引用项目表(project)的ID字段。
|
||||
|
||||
项目作为数据管理的基本单元,包含了测区的集合。当用户选择一个项目时,系统会根据该项目的句柄查询其下属的所有测区,并在UI界面上展示这些测区列表。这种层级结构确保了数据组织的逻辑性和一致性,同时也便于数据的同步和管理。
|
||||
|
||||
项目与测区的关系还体现在设备端的数据同步过程中。当项目被同步到设备时,其包含的测区也会被同步。系统通过dev_syn_td表来跟踪项目和测区在设备上的同步状态,其中PRCN字段对应项目的CN码,TzCN字段对应测区的CN码。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L33-L37)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L18-L44)
|
||||
|
||||
## CProManager::ShowTzList方法分析
|
||||
|
||||
CProManager::ShowTzList方法负责根据项目句柄查询数据库并填充测区列表控件。该方法首先通过项目句柄获取对应的项目ID,然后执行SQL查询语句从数据库中获取该项目下的所有测区信息。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetProjectID["从项目句柄获取项目ID"]
|
||||
GetProjectID --> CheckItemCount{"列表项数不为0?"}
|
||||
CheckItemCount --> |是| DeleteAllItems["删除所有列表项"]
|
||||
CheckItemCount --> |否| BuildSQLQuery
|
||||
DeleteAllItems --> BuildSQLQuery
|
||||
BuildSQLQuery --> ExecuteQuery["执行SQL查询"]
|
||||
ExecuteQuery --> CheckEOF{"记录集未结束?"}
|
||||
CheckEOF --> |是| InsertListItem["插入列表项"]
|
||||
InsertListItem --> SetItemText["设置列表项文本"]
|
||||
SetItemText --> GenerateHandle["生成测区句柄"]
|
||||
GenerateHandle --> SetItemData["设置列表项数据"]
|
||||
SetItemData --> MoveNext["移动到下一条记录"]
|
||||
MoveNext --> CheckEOF
|
||||
CheckEOF --> |否| CloseRecordset["关闭记录集"]
|
||||
CloseRecordset --> ReturnTrue["返回true"]
|
||||
ReturnTrue --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
|
||||
## 测区类型(TZtype)枚举值及业务含义
|
||||
|
||||
测区类型(TZtype)是一个重要的枚举值,用于标识测区的业务类型。根据代码分析,TZtype的取值及其业务含义如下:
|
||||
|
||||
- **TZtype=0或1**: 表示"1D VES | 2D ERI"类型,即一维垂直电测深或二维电阻率成像。这两种类型在系统中被视为同一类别进行处理。
|
||||
- **TZtype=2**: 表示"3D ERT"类型,即三维电阻率层析成像,适用于需要三维空间数据采集的场景。
|
||||
- **TZtype=3**: 表示"DefaultTestZone"类型,即默认测区。这是一个特殊的测区类型,每个项目创建时都会自动创建一个默认测区。
|
||||
|
||||
默认测区(type=3)具有特殊处理逻辑。在创建项目时,系统会自动调用InsertDefaultTzToProject方法为新项目创建一个默认测区。这个默认测区的名称固定为"DefaultTestZone",描述和位置均为"None"。在设备同步过程中,系统会对TZtype=3进行强制检查,如果发现类型不匹配会抛出错误。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingZone {
|
||||
+ShowDetailInfo(CListCtrl&)
|
||||
+CTestingZone(DWORD, _ConnectionPtr&)
|
||||
+~CTestingZone()
|
||||
-m_dwID DWORD
|
||||
-m_pConnection _ConnectionPtr
|
||||
-m_szTZname CString
|
||||
-m_szCDate CString
|
||||
-m_szDesc CString
|
||||
-m_szLocation CString
|
||||
-m_szCN CString
|
||||
-m_szTZtype CString
|
||||
}
|
||||
CTestingZone --> "1" CListCtrl : "填充"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L62-L73)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
**Section sources**
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L62-L73)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341)
|
||||
|
||||
## 测区配置数据持久化机制
|
||||
|
||||
测区配置数据在设备端通过testzone.xml文件进行持久化存储。该文件的生成遵循特定的规则,并具有明确的元素结构。
|
||||
|
||||
testzone.xml文件的生成规则如下:当测区数据需要同步到设备时,系统会在本地CACHE目录下创建相应的项目和测区目录结构,然后生成testzone.xml文件。文件路径遵循"\\CACHE\\projects\\{项目CN}\\{测区CN}\\"的层级关系,与项目XML文件保持一致的目录结构。
|
||||
|
||||
testzone.xml文件的元素结构包括以下关键字段:
|
||||
- **type**: 测区类型,对应数据库中的TZtype字段
|
||||
- **cn**: 测区唯一标识码,对应数据库中的CN字段
|
||||
- **location**: 测区位置信息
|
||||
- **desc**: 测区描述信息
|
||||
- **create_date**: 创建日期
|
||||
- **testzone_name**: 测区名称
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> CreateDirectory["创建本地目录"]
|
||||
CreateDirectory --> CreateXML["创建XML文档"]
|
||||
CreateXML --> AddRoot["添加根元素testzone"]
|
||||
AddRoot --> AddType["添加type元素"]
|
||||
AddType --> AddLocation["添加location元素"]
|
||||
AddLocation --> AddDesc["添加desc元素"]
|
||||
AddDesc --> AddCreateDate["添加create_date元素"]
|
||||
AddCreateDate --> AddCreateTime["添加create_time元素"]
|
||||
AddCreateTime --> AddTestDate["添加test_date元素"]
|
||||
AddTestDate --> AddTestTime["添加test_time元素"]
|
||||
AddTestTime --> AddCN["添加cn元素"]
|
||||
AddCN --> AddName["添加testzone_name元素"]
|
||||
AddName --> Add3DScript["添加testzone_3D_script元素"]
|
||||
Add3DScript --> AddVess["添加vess元素"]
|
||||
AddVess --> AddEris["添加eris元素"]
|
||||
AddEris --> AddErts["添加erts元素"]
|
||||
AddErts --> AddWels["添加wels元素"]
|
||||
AddWels --> SaveFile["保存文件"]
|
||||
SaveFile --> SendToDevice["发送到设备"]
|
||||
SendToDevice --> UpdateDB["更新数据库同步状态"]
|
||||
UpdateDB --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L586-L605)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L838-L856)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L586-L605)
|
||||
|
||||
## 测区创建完整性校验流程
|
||||
|
||||
测区创建时的完整性校验流程包括多个步骤,确保数据的完整性和一致性。当用户通过UI界面创建新测区时,系统会执行以下校验流程:
|
||||
|
||||
首先,系统会检查测区名称是否为空。如果名称为空,会弹出错误提示"测区名称不能为空",并阻止创建操作。这是最基本的完整性校验,确保每个测区都有一个有效的名称标识。
|
||||
|
||||
对于TZtype=3的默认测区,系统有特殊的强制检查机制。在CreateDefaultTzInDev方法中,系统会检查从数据库读取的测区类型是否为3。如果不是,会立即返回错误并显示相应的错误信息。这种强制检查确保了默认测区的特殊性不会被破坏。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant ProManager as "CProManager"
|
||||
participant Database as "数据库"
|
||||
UI->>ProManager : 调用CreateTzInDB
|
||||
ProManager->>UI : 显示创建对话框
|
||||
UI->>ProManager : 输入测区信息并确认
|
||||
ProManager->>ProManager : 验证测区名称是否为空
|
||||
alt 名称为空
|
||||
ProManager->>UI : 显示错误提示
|
||||
ProManager-->>UI : 返回失败
|
||||
else 名称有效
|
||||
ProManager->>Database : 查询同名测区是否存在
|
||||
Database-->>ProManager : 返回查询结果
|
||||
alt 测区已存在
|
||||
ProManager->>UI : 显示"测区已存在"提示
|
||||
ProManager-->>UI : 返回重复错误
|
||||
else 测区不存在
|
||||
ProManager->>Database : 插入新测区记录
|
||||
Database-->>ProManager : 返回插入结果
|
||||
ProManager->>Database : 查询新测区ID
|
||||
Database-->>ProManager : 返回测区ID
|
||||
ProManager-->>UI : 返回成功
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L67)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L956-L1009)
|
||||
|
||||
**Section sources**
|
||||
- [opcreatetzdlg.cpp](file://cpp/Views/opcreatetzdlg.cpp#L54-L67)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L956-L1009)
|
||||
|
||||
## 测区数据模型字段说明
|
||||
|
||||
测区数据模型包含多个关键属性字段,这些字段在UI界面中有相应的展示方式。主要字段包括:
|
||||
|
||||
- **ID**: 测区的唯一标识符,数据库主键,用于内部引用和关联
|
||||
- **名称(TZname)**: 测区的名称,在测区列表中作为第一列显示
|
||||
- **描述(TZdesc)**: 测区的详细描述信息,在列表中作为描述列显示
|
||||
- **创建日期(Cdate)**: 测区的创建日期,格式化为"YYYY-MM-DD"显示
|
||||
- **位置(location)**: 测区的地理位置信息
|
||||
- **类型(TZtype)**: 测区的业务类型,决定测区的功能和处理方式
|
||||
- **CN码**: 测区的唯一编码,用于设备同步和数据交换
|
||||
|
||||
在UI界面中,这些字段通过CListCtrl控件进行展示。测区列表视图(appdatatzlistview.cpp)定义了列表的列结构,包括测区名称、类型、创建日期和描述等列。每个列表项的数据通过SetItemData方法存储测区句柄,便于后续操作时快速定位对应的测区对象。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PROJECT ||--o{ TESTING_ZONE : "包含"
|
||||
PROJECT {
|
||||
int ID PK
|
||||
string CN UK
|
||||
string PRname
|
||||
datetime PRdate
|
||||
string PRdesc
|
||||
string location
|
||||
}
|
||||
TESTING_ZONE {
|
||||
int ID PK
|
||||
int PRID FK
|
||||
string CN UK
|
||||
string TZname
|
||||
int TZtype
|
||||
datetime Cdate
|
||||
string TZdesc
|
||||
string location
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingZone.h](file://h/TestingZone.h#L24-L29)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp#L86-L100)
|
||||
- [database_modify.xml](file://database_modify.xml#L13-L18)
|
||||
|
||||
**Section sources**
|
||||
- [TestingZone.h](file://h/TestingZone.h#L24-L29)
|
||||
- [appdatatzlistview.cpp](file://cpp/Views/appdatatzlistview.cpp#L86-L100)
|
||||
Reference in New Issue
Block a user