a
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
# 测量数据浏览
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp)
|
||||
- [appdatatdlistview.cpp](file://cpp/Views/appdatatdlistview.cpp)
|
||||
- [appdatatddetaillistview.cpp](file://cpp/Views/appdatatddetaillistview.cpp)
|
||||
- [appdatatdgrlistview.cpp](file://cpp/Views/appdatatdgrlistview.cpp)
|
||||
- [DialListMeasuData.cpp](file://cpp/Views/DialListMeasuData.cpp)
|
||||
- [DialListMeasuGR.cpp](file://cpp/Views/DialListMeasuGR.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp)
|
||||
- [Ipsp2DTdRecord.cpp](file://cpp/ProblemZone/Ipsp2DTdRecord.cpp)
|
||||
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档详细阐述了GeomativeStudio软件中测量数据浏览功能的实现机制。重点分析了数据管理框架(datamngframe)如何集成测试数据列表视图(appdatatdlistview)、详细信息面板(appdatatddetaillistview)和图形化展示组件(appdatatdgrlistview)的联动机制。文档描述了用户通过DialListMeasuData和DialListMeasuGR对话框进行数据查询、筛选和可视化操作的完整流程,并为开发者提供了扩展数据展示字段、自定义排序规则或集成新型图表组件的技术指导。
|
||||
|
||||
## 项目结构
|
||||
GeomativeStudio项目是一个复杂的地质测量软件系统,其核心功能围绕数据采集、管理和可视化展开。测量数据浏览功能主要位于`cpp/Views`目录下,由一系列视图类和对话框类构成。数据管理框架`CDataMngFrame`作为主容器,负责协调各个子视图的显示和数据交互。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "数据管理框架"
|
||||
DMF[CDataMngFrame]
|
||||
end
|
||||
subgraph "视图组件"
|
||||
TLV[CAppDataTdListView]
|
||||
DLV[CAppDataTdDetailListView]
|
||||
GLV[CAppDataTdGrListView]
|
||||
end
|
||||
subgraph "对话框"
|
||||
DLM[CDialogListMeasuData]
|
||||
DGR[CDialogListMeasuGR]
|
||||
end
|
||||
DMF --> TLV
|
||||
DMF --> DLV
|
||||
DMF --> GLV
|
||||
DLM --> TLV
|
||||
DGR --> GLV
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L49-L81)
|
||||
- [appdatatdlistview.cpp](file://cpp/Views/appdatatdlistview.cpp#L22-L33)
|
||||
- [appdatatddetaillistview.cpp](file://cpp/Views/appdatatddetaillistview.cpp#L17-L34)
|
||||
- [appdatatdgrlistview.cpp](file://cpp/Views/appdatatdgrlistview.cpp#L21-L38)
|
||||
- [DialListMeasuData.cpp](file://cpp/Views/DialListMeasuData.cpp#L18-L39)
|
||||
- [DialListMeasuGR.cpp](file://cpp/Views/DialListMeasuGR.cpp#L17-L41)
|
||||
|
||||
**章节来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L1-L81)
|
||||
- [appdatatdlistview.cpp](file://cpp/Views/appdatatdlistview.cpp#L1-L485)
|
||||
- [appdatatddetaillistview.cpp](file://cpp/Views/appdatatddetaillistview.cpp#L1-L318)
|
||||
- [appdatatdgrlistview.cpp](file://cpp/Views/appdatatdgrlistview.cpp#L1-L189)
|
||||
|
||||
## 核心组件
|
||||
测量数据浏览功能的核心在于`CDataMngFrame`类,它作为MDI子窗口,通过分割窗口(CSplitterWnd)将界面划分为导航视图(CNavDataView)和应用数据视图(CAppDataView)。应用数据视图会根据用户选择的数据类型动态切换为不同的具体视图,如`CAppDataRsp2DTdView`、`CAppDataIpsp2DTdView`等。
|
||||
|
||||
`CAppDataTdListView`负责以列表形式展示测量数据,支持列点击排序和双击跳转。`CAppDataTdDetailListView`则以键值对的形式展示所选数据的详细信息。`CAppDataTdGrListView`用于展示电极的电阻测量结果,通过自定义绘制实现不同状态(如短路、开路)的文本颜色高亮。
|
||||
|
||||
**章节来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L179-L602)
|
||||
- [appdatatdlistview.cpp](file://cpp/Views/appdatatdlistview.cpp#L72-L271)
|
||||
- [appdatatddetaillistview.cpp](file://cpp/Views/appdatatddetaillistview.cpp#L63-L267)
|
||||
- [appdatatdgrlistview.cpp](file://cpp/Views/appdatatdgrlistview.cpp#L67-L134)
|
||||
|
||||
## 架构概述
|
||||
整个测量数据浏览功能的架构基于MFC的文档/视图(Document/View)架构和消息映射机制。`CDataMngFrame`通过处理自定义Windows消息(如WM_SCHEDULE、WM_REFRESH)来响应用户操作和数据状态变化。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as 用户
|
||||
participant Frame as CDataMngFrame
|
||||
participant Operator as CDataOperator
|
||||
participant Data as CTestingData
|
||||
participant View as CAppDataTdListView
|
||||
User->>Frame : 选择数据项
|
||||
Frame->>Frame : OnSchedule(WM_SCHEDULE)
|
||||
Frame->>Operator : ShowAppView()
|
||||
Operator->>Data : ShowConList()
|
||||
Data->>View : 填充列表数据
|
||||
View-->>User : 显示数据列表
|
||||
User->>View : 双击列表项
|
||||
View->>Frame : OnDblclk()
|
||||
Frame->>Frame : OnSkip()
|
||||
Frame->>Frame : 跳转到对应数据
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L87-L96)
|
||||
- [appdatatdlistview.cpp](file://cpp/Views/appdatatdlistview.cpp#L284-L301)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L539-L579)
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L48-L75)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据管理框架分析
|
||||
`CDataMngFrame`是整个功能的核心控制器。它在`OnCreateClient`中创建分割窗口,并在`OnSchedule`消息处理函数中根据传入的句柄(handle)动态创建或切换右侧的应用视图。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDataMngFrame {
|
||||
+CView* m_pAppDataView
|
||||
+CView* m_pNavDataView
|
||||
+CDataOperator* m_pDataOperator
|
||||
+OnCreateClient()
|
||||
+OnSchedule()
|
||||
+ShowAppView()
|
||||
+ShowContentListByPageView()
|
||||
}
|
||||
class CDataOperator {
|
||||
+ShowRsp2DTdInfo()
|
||||
+ShowIps2DpTdInfo()
|
||||
+LoadRsp2dRecordbyPage()
|
||||
+LoadIpsp2dRecordbyPage()
|
||||
}
|
||||
class CTestingData {
|
||||
+ShowDetailInfo()
|
||||
+ShowConList()
|
||||
+ShowConListByPage()
|
||||
}
|
||||
CDataMngFrame --> CDataOperator : "使用"
|
||||
CDataOperator --> CTestingData : "调用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L51-L81)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L539-L579)
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L48-L75)
|
||||
|
||||
### 对话框组件分析
|
||||
`CDialListMeasuData`和`CDialListMeasuGR`是两个独立的对话框,用于实时显示测量过程中的数据。它们不直接与`CDataMngFrame`集成,而是通过自己的数据操作对象(如`m_taskOper`)直接从数据库或设备获取数据。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([对话框初始化]) --> OnInitDialog["OnInitDialog()"]
|
||||
OnInitDialog --> InsertColumns["插入列表列"]
|
||||
InsertColumns --> QueryData["查询测量数据"]
|
||||
QueryData --> vtData{"数据为空?"}
|
||||
vtData --> |否| OnShowTdData["OnShowTdData()"]
|
||||
vtData --> |是| End([结束])
|
||||
OnShowTdData --> DeleteAll["清空列表"]
|
||||
DeleteAll --> Loop["遍历数据"]
|
||||
Loop --> FormatText["格式化文本"]
|
||||
FormatText --> SetItemText["设置列表项"]
|
||||
SetItemText --> NextItem["下一项"]
|
||||
NextItem --> Loop
|
||||
Loop --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [DialListMeasuData.cpp](file://cpp/Views/DialListMeasuData.cpp#L52-L332)
|
||||
- [DialListMeasuGR.cpp](file://cpp/Views/DialListMeasuGR.cpp#L46-L112)
|
||||
|
||||
### 复杂逻辑组件分析
|
||||
数据句柄(Handle)的解析是系统中的一个关键逻辑。`CHandleProcessor`类负责将一个32位的DWORD句柄拆解为ID和样式(Style)两部分,用于标识不同的数据对象。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["dwHandle = 0xF8000001"] --> B["dwTempID = dwHandle & 0x7FFFFFF"]
|
||||
B --> C["dwID = 1"]
|
||||
A --> D["dwTempStyle = dwHandle & 0xF8000000"]
|
||||
D --> E["dwTempStyle >>= 27"]
|
||||
E --> F["uStyle = 31"]
|
||||
C --> G["获取数据ID"]
|
||||
F --> H["获取数据类型"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L59-L95)
|
||||
|
||||
**章节来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L250-L312)
|
||||
- [HandleProcessor.cpp](file://cpp/Tools/HandleProcessor.cpp#L52-L95)
|
||||
|
||||
## 依赖关系分析
|
||||
测量数据浏览功能依赖于多个核心模块。`CDataMngFrame`依赖于`CDataOperator`进行数据操作,`CDataOperator`又依赖于具体的`CTestingData`派生类(如`CIpsp2DTd`)来获取数据。数据持久化则通过ADODB组件与数据库进行交互。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
DMF[CDataMngFrame] --> DO[CDataOperator]
|
||||
DO --> TD[CTestingData]
|
||||
TD --> DB[(数据库)]
|
||||
DO --> HP[CHandleProcessor]
|
||||
DO --> SP[CStateProcessor]
|
||||
TD --> RSP[CIpsp2DTdRecord]
|
||||
RSP --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L59-L61)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L539-L579)
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L37-L46)
|
||||
- [Ipsp2DTdRecord.cpp](file://cpp/ProblemZone/Ipsp2DTdRecord.cpp#L56-L87)
|
||||
|
||||
## 性能考虑
|
||||
对于大规模数据集,当前实现可能存在性能瓶颈。建议采用虚拟列表控件(Virtual List Control)来优化`CAppDataTdListView`的性能。虚拟列表控件只在需要时才请求显示数据,而不是一次性加载所有数据到内存中。
|
||||
|
||||
异步加载策略也是优化的关键。可以在后台线程中执行数据库查询,避免阻塞UI线程。当查询完成时,再通过`PostMessage`将结果发送回UI线程进行更新,确保界面的响应性。
|
||||
|
||||
## 故障排除指南
|
||||
如果测量数据无法正确显示,首先检查`CDataMngFrame`的`OnSchedule`消息是否被正确触发。确认传入的句柄(handle)是否有效,并通过`CHandleProcessor`验证其ID和样式是否正确解析。
|
||||
|
||||
如果详细信息面板为空,检查`CDataOperator::ShowIps2DpTdInfo`等方法是否成功获取了`CTestingData`对象,并确认`ShowDetailInfo`方法是否被正确调用。
|
||||
|
||||
**章节来源**
|
||||
- [datamngframe.cpp](file://cpp/Views/datamngframe.cpp#L249-L312)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L544-L579)
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L48-L75)
|
||||
|
||||
## 结论
|
||||
GeomativeStudio的测量数据浏览功能通过一个清晰的分层架构实现了数据的展示与交互。`CDataMngFrame`作为中心枢纽,协调着列表视图、详情面板和图形化组件的联动。MFC的消息映射机制是实现这一联动的核心。对于开发者而言,扩展功能的关键在于理解句柄解析机制和数据操作流程。未来应考虑引入虚拟列表和异步加载以提升大规模数据下的用户体验。
|
||||
Reference in New Issue
Block a user