# 代码结构 **本文档引用的文件** - [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) ## 目录 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 m_devLinkList +_ConnectionPtr m_pConnection +GetDevice(DWORD) CDevice* +InitialDevLinkList() void } class CProManager { +CLinkList 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)