a
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
# 代码结构
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp)
|
||||
- [Constant.h](file://h/Constant.h)
|
||||
- [GeoMative.h](file://h/GeoMative.h)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp)
|
||||
- [Project.h](file://h/Project.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp)
|
||||
- [MainFrm.h](file://h/MainFrm.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目结构概述](#项目结构概述)
|
||||
2. [核心模块职责划分](#核心模块职责划分)
|
||||
3. [应用程序对象与管理器协调](#应用程序对象与管理器协调)
|
||||
4. [常量与枚举的广泛应用](#常量与枚举的广泛应用)
|
||||
5. [模块间调用关系示例](#模块间调用关系示例)
|
||||
6. [系统架构图](#系统架构图)
|
||||
|
||||
## 项目结构概述
|
||||
|
||||
GeomativeStudio项目的代码结构清晰地划分为多个目录,每个目录承担特定的职责。`cpp`和`h`目录下分别存放C++源文件和头文件,其子目录体现了系统的分层架构。`Main`目录包含应用程序入口和全局对象;`Managers`目录包含设备、项目、脚本、测试数据和I/O管理器等核心业务逻辑组件;`Operator`目录包含具体操作实现;`ProblemZone`目录包含项目、设备、脚本点等核心数据模型;`Views`目录包含所有UI视图和对话框实现。
|
||||
|
||||
**Section sources**
|
||||
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1-L800)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1-L800)
|
||||
|
||||
## 核心模块职责划分
|
||||
|
||||
### Main目录
|
||||
`Main`目录是应用程序的入口点,主要包含`GeoMative.cpp`和`Global.cpp`两个核心文件。`GeoMative.cpp`定义了`CGeoMativeApp`类,该类继承自`CWinApp`,负责应用程序的初始化、运行和退出。它在`InitInstance`方法中创建并初始化所有核心管理器对象,并建立与数据库的连接。`Global.cpp`则定义了全局变量和函数,如`theApp`全局应用程序对象实例、`aDevLinkTable`设备链接表以及各种工具函数。
|
||||
|
||||
### Managers目录
|
||||
`Managers`目录包含了系统的核心业务逻辑组件,即各种管理器(Manager)。这些管理器负责处理特定领域的业务逻辑和数据持久化。
|
||||
- **DevManager**:设备管理器,负责管理所有设备的生命周期,包括设备的注册、连接、状态更新和信息获取。它通过`m_devLinkList`链表维护所有设备对象,并提供`GetDevice`、`GetDeviceByID`等方法来检索设备。
|
||||
- **ProManager**:项目管理器,负责管理项目(Project)和测区(TestingZone)的层次结构。它通过`m_dmsLinkList`链表管理数据管理结构(DMS),并提供`ShowProList`、`ShowTzList`等方法来展示项目和测区列表。
|
||||
- **SptManager**:脚本管理器,负责管理脚本(Script)的创建、加载和同步。
|
||||
- **TdManager**:测试数据管理器,负责管理测试数据(Testing Data)的存储和检索。
|
||||
- **ExecManager**:执行管理器,负责管理执行任务和流程。
|
||||
- **IOManager**:I/O管理器,负责处理输入输出操作。
|
||||
|
||||
**Section sources**
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L200)
|
||||
|
||||
### Operator目录
|
||||
`Operator`目录包含了具体操作的实现类。这些类通常封装了复杂的业务逻辑或与外部系统的交互。例如,`DataOperator.cpp`实现了数据操作相关的功能,如文件导入导出、数据同步等。`DevOperator.cpp`和`SptOperator.cpp`则分别处理设备和脚本的具体操作。
|
||||
|
||||
### ProblemZone目录
|
||||
`ProblemZone`目录包含了系统的核心数据模型,这些模型代表了业务领域中的实体。
|
||||
- **Project**:项目类,继承自`CDataMngStruct`,代表一个工程项目,包含项目名称、描述、位置等属性。
|
||||
- **Device**:设备类,代表一个物理设备,包含设备序列号、型号、软硬件版本、MAC地址等属性,并提供与设备通信的方法。
|
||||
- **Script**:脚本类,代表一个测量脚本,包含电极数量、测量类型等属性,并提供显示脚本内容和详情的方法。
|
||||
- **TestingZone**:测区类,代表项目下的一个具体测量区域。
|
||||
|
||||
**Section sources**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [Device.h](file://h/Device.h#L1-L128)
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
|
||||
### Views目录
|
||||
`Views`目录包含了所有用户界面(UI)的实现,包括主框架窗口、各种管理窗口和对话框。
|
||||
- **MainFrm**:主框架窗口,是应用程序的主界面,负责管理MDI子窗口的创建和布局。
|
||||
- **devmngframe**:设备管理框架,用于显示和管理设备。
|
||||
- **datamngframe**:数据管理框架,用于显示和管理项目、测区和测试数据。
|
||||
- **sptmngframe**:脚本管理框架,用于显示和管理脚本。
|
||||
- **各种对话框**:如`DailLogin`(登录对话框)、`OpCreateProjectDlg`(创建项目对话框)等,用于用户交互。
|
||||
|
||||
**Section sources**
|
||||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L1-L200)
|
||||
- [MainFrm.h](file://h/MainFrm.h#L1-L120)
|
||||
|
||||
## 应用程序对象与管理器协调
|
||||
|
||||
`CGeoMativeApp`应用程序对象是整个系统的协调中心。它在`InitInstance`方法中创建并初始化所有核心管理器对象,并将它们作为成员变量存储。这些管理器通过`m_pConnection`共享同一个数据库连接,确保了数据的一致性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CGeoMativeApp {
|
||||
+CDevManager* m_pDevManager
|
||||
+CTdManager* m_pTdManager
|
||||
+CProManager* m_pProManager
|
||||
+CExecManager* m_pExecManager
|
||||
+CSptManager* m_pSptManager
|
||||
+CIOManager* m_pIOManager
|
||||
+_ConnectionPtr m_pConnection
|
||||
+InitInstance() bool
|
||||
+ExitInstance() int
|
||||
}
|
||||
class CDevManager {
|
||||
+CLinkList<CDevice*> m_devLinkList
|
||||
+_ConnectionPtr m_pConnection
|
||||
+GetDevice(DWORD) CDevice*
|
||||
+InitialDevLinkList() void
|
||||
}
|
||||
class CProManager {
|
||||
+CLinkList<CDataMngStruct*> m_dmsLinkList
|
||||
+_ConnectionPtr m_pConnection
|
||||
+GetDMS(DWORD) CDataMngStruct*
|
||||
+ShowProList(DWORD, CListCtrl&) bool
|
||||
}
|
||||
class CDevice {
|
||||
+DWORD m_dwID
|
||||
+UINT m_uState
|
||||
+CString m_szDevSN
|
||||
+CString m_szMacAddress
|
||||
+_ConnectionPtr m_pConnection
|
||||
+GetDevInfo() bool
|
||||
+Reset() bool
|
||||
}
|
||||
class CProject {
|
||||
+DWORD m_dwID
|
||||
+CString m_szPRname
|
||||
+CString m_szDesc
|
||||
+_ConnectionPtr m_pConnection
|
||||
+ShowDetailInfo(CListCtrl&) bool
|
||||
}
|
||||
CGeoMativeApp --> CDevManager : "拥有"
|
||||
CGeoMativeApp --> CProManager : "拥有"
|
||||
CGeoMativeApp --> CDevice : "通过m_pDevManager访问"
|
||||
CGeoMativeApp --> CProject : "通过m_pProManager访问"
|
||||
CDevManager --> CDevice : "管理"
|
||||
CProManager --> CProject : "管理"
|
||||
CDevManager --> _ConnectionPtr : "使用"
|
||||
CProManager --> _ConnectionPtr : "使用"
|
||||
CGeoMativeApp --> _ConnectionPtr : "拥有"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
|
||||
- [DevManager.h](file://h/DevManager.h#L16-L68)
|
||||
- [ProManager.h](file://h/ProManager.h#L30-L76)
|
||||
- [Device.h](file://h/Device.h#L33-L127)
|
||||
- [Project.h](file://h/Project.h#L16-L40)
|
||||
|
||||
## 常量与枚举的广泛应用
|
||||
|
||||
`Constant.h`头文件定义了系统中广泛使用的常量和枚举,为代码提供了清晰的语义和类型安全。
|
||||
- **语言常量**:`LANG_ZHCN`和`LANG_ENUS`用于标识当前用户界面语言。
|
||||
- **状态常量**:`PZ_STATE_OFFLINE`、`PZ_STATE_ONLINE`等用于表示设备、项目等实体的状态。
|
||||
- **样式常量**:`PZ_STYLE_PRO`、`PZ_STYLE_TZ`、`PZ_STYLE_DEV`等用于区分不同类型的实体。
|
||||
- **枚举**:`EN_TRANSFER_FILE_METHOD`枚举定义了文件传输方式(COM、USB、云端、WiFi),`EN_CHANNEL_INFO`枚举定义了通道信息(单通道、多通道)。
|
||||
|
||||
这些常量和枚举在系统各处被引用,例如在`CGeoMativeApp`的`InitInstance`方法中,根据`g_iTransFileMode`(其值来自`EN_TRANSFER_FILE_METHOD`)决定初始化不同的网络连接逻辑。
|
||||
|
||||
**Section sources**
|
||||
- [Constant.h](file://h/Constant.h#L1-L266)
|
||||
|
||||
## 模块间调用关系示例
|
||||
|
||||
用户操作通过UI层触发Manager层的业务逻辑处理,这是一个典型的模块间调用流程。以用户在主界面点击“设备管理”菜单为例:
|
||||
1. **UI层 (Views)**:`MainFrm.cpp`中的`OnMngDevWin`消息处理函数被调用。
|
||||
2. **协调层 (Main)**:`OnMngDevWin`函数负责创建或激活`CDevMngFrame`设备管理窗口。
|
||||
3. **业务逻辑层 (Managers)**:`CDevMngFrame`在初始化时,会调用`CGeoMativeApp`的全局实例`theApp`中的`m_pDevManager`管理器的`ShowTzList`或`GetDevice`等方法来获取设备数据。
|
||||
4. **数据模型层 (ProblemZone)**:`CDevManager`通过其`m_devLinkList`链表或直接查询数据库,获取`CDevice`对象的数据。
|
||||
5. **返回UI层**:获取的数据被返回给`CDevMngFrame`,并在其UI控件(如`CListCtrl`)中显示。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as 用户
|
||||
participant MainFrm as MainFrm.cpp
|
||||
participant DevMngFrame as CDevMngFrame
|
||||
participant DevManager as CDevManager
|
||||
participant Device as CDevice
|
||||
User->>MainFrm : 点击“设备管理”
|
||||
MainFrm->>DevMngFrame : 创建/激活设备管理窗口
|
||||
DevMngFrame->>DevManager : 调用ShowTzList(dwProHandle, tzList)
|
||||
DevManager->>DevManager : 查询数据库获取测区列表
|
||||
DevManager->>Device : 通过m_devLinkList.Find()获取设备
|
||||
Device-->>DevManager : 返回CDevice对象
|
||||
DevManager-->>DevMngFrame : 返回测区和设备数据
|
||||
DevMngFrame-->>MainFrm : 在UI上显示数据
|
||||
MainFrm-->>User : 显示设备管理界面
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MainFrm.cpp](file://cpp/Views/MainFrm.cpp#L58-L94)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L48-L80)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92)
|
||||
|
||||
## 系统架构图
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "UI层 (Views)"
|
||||
A[MainFrm]
|
||||
B[CDevMngFrame]
|
||||
C[CDataMngFrame]
|
||||
D[对话框]
|
||||
end
|
||||
subgraph "协调层 (Main)"
|
||||
E[CGeoMativeApp]
|
||||
end
|
||||
subgraph "业务逻辑层 (Managers)"
|
||||
F[CDevManager]
|
||||
G[CProManager]
|
||||
H[CSptManager]
|
||||
I[CTdManager]
|
||||
end
|
||||
subgraph "数据模型层 (ProblemZone)"
|
||||
J[CDevice]
|
||||
K[CProject]
|
||||
L[CScript]
|
||||
M[CTestingZone]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
N[数据库]
|
||||
end
|
||||
A --> E
|
||||
B --> E
|
||||
C --> E
|
||||
D --> E
|
||||
E --> F
|
||||
E --> G
|
||||
E --> H
|
||||
E --> I
|
||||
F --> J
|
||||
G --> K
|
||||
G --> M
|
||||
H --> L
|
||||
F --> N
|
||||
G --> N
|
||||
H --> N
|
||||
I --> N
|
||||
J --> N
|
||||
K --> N
|
||||
L --> N
|
||||
M --> N
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L56-L67)
|
||||
- [DevManager.h](file://h/DevManager.h#L63-L65)
|
||||
- [ProManager.h](file://h/ProManager.h#L72-L73)
|
||||
- [Project.h](file://h/Project.h#L24)
|
||||
- [Device.h](file://h/Device.h#L103)
|
||||
Reference in New Issue
Block a user