# 核心功能 **本文档引用的文件** - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [DevManager.h](file://h/DevManager.h) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [ProManager.h](file://h/ProManager.h) - [SptManager.cpp](file://cpp/Managers/SptManager.cpp) - [SptManager.h](file://h/SptManager.h) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp) - [TdManager.h](file://h/TdManager.h) - [IOManager.cpp](file://cpp/Managers/IOManager.cpp) - [IOManager.h](file://h/IOManager.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [Scriptor3D.cpp](file://cpp/ProblemZone/Scriptor3D.cpp) - [scriptor.c](file://cpp/Tools/scriptor.c) - [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp) ## 目录 1. [设备管理器 (DevManager)](#设备管理器-devmanager) 2. [项目管理器 (ProManager)](#项目管理器-promanager) 3. [脚本管理器 (SptManager)](#脚本管理器-sptmanager) 4. [测试数据管理器 (TdManager)](#测试数据管理器-tdmanager) 5. [IO管理器 (IOManager)](#io管理器-iomanager) ## 设备管理器 (DevManager) 设备管理器(DevManager)是系统与物理设备交互的核心组件,负责设备的连接、状态监控和固件升级。它通过`CDevice`类的实例来管理每个设备,并使用链表`m_devLinkList`在内存中维护所有设备对象。 设备管理器通过`InitialDevLinkList()`方法从数据库初始化设备列表。该方法查询`device`表,为每个设备创建`CDevice`对象,并将其添加到链表中。设备的唯一标识符是其序列号(SN),并使用`m_handleProcessor`生成唯一的句柄(Handle)进行内存管理。 当设备通过串口或网络连接到计算机时,系统会检测到新设备。设备管理器通过`GetRegisterDevice()`方法在内存链表中查找具有匹配序列号的设备。如果找到,则建立连接;如果未找到,则调用`AddOfflineObjInMem()`创建一个离线设备对象。设备的在线状态由`m_uState`属性表示,其值可以是`PZ_STATE_OFFLINE`、`PZ_STATE_ONLINE`或`PZ_STATE_NEW`。 对于固件升级,设备管理器本身不直接执行升级操作,而是作为协调者。当用户请求升级时,系统会通过`CDevice`对象与设备通信,发送升级命令和固件文件。设备管理器通过`UpdateDevInfo()`方法接收来自设备的更新信息(如硬件版本HWV、软件版本SWV、电池电压等),并将其同步到数据库中,确保本地信息与设备状态一致。 **Section sources** - [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661) - [DevManager.h](file://h/DevManager.h#L1-L69) - [Device.cpp](file://cpp/ProblemZone/Device.cpp#L90-L2662) ## 项目管理器 (ProManager) 项目管理器(ProManager)负责管理项目的整个生命周期,包括创建、配置测区和与设备同步。它使用`CLinkList`链表`m_dmsLinkList`来管理项目(Project)和测区(TestingZone)对象。 项目管理器通过`CreateProjectInDB()`方法在数据库中创建新项目。该方法首先显示一个对话框(`COpCreateProjectDlg`)供用户输入项目信息(如项目名称、描述、位置等)。为确保项目名称的唯一性,它会查询数据库进行检查。创建成功后,系统会自动调用`InsertDefaultTzToProject()`为该项目创建一个默认测区。 项目与设备的同步是通过文件传输实现的。`CreateProjectInDev()`方法负责将项目从数据库同步到设备。它首先查询数据库获取项目信息,然后使用`CMarkup`类生成一个名为`project.xml`的XML配置文件。此文件被写入本地缓存目录(`CACHE\projects\\`),最后通过`CDevice::SendFile()`方法将文件传输到设备的SD卡指定路径(`/SD/projects//`)。 测区的管理与项目类似。`CreateTzInDev()`方法创建测区配置文件`testzone.xml`,并将其同步到设备。该文件包含了测区的类型、位置、描述等元数据。当用户在设备上完成测量后,可以通过`LoadProjectFromDev()`和`LoadTzFromDev()`方法将数据从设备上载回计算机,实现数据的双向同步。 **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L800) - [ProManager.h](file://h/ProManager.h#L1-L77) - [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L36) ## 脚本管理器 (SptManager) 脚本管理器(SptManager)负责生成2D/3D测量脚本。它通过`CLinkList`链表`m_sptLinkList`管理脚本对象,并利用`m_medLinkList`管理各种测量装置(Medium)。 脚本的创建过程始于用户选择测量类型(如温纳、施伦贝谢等)。`Create2DSConInDB()`方法处理2D脚本的创建。它首先显示一个对话框(`COpCreateSptDlg`)供用户配置参数。脚本的核心是测点(Test Point)的生成,这由底层的`scriptor`库完成。`scriptor.c`文件中的`scr_generate()`函数根据用户定义的装置类型和区域边界,计算出所有电极的排列组合(A, B, M, N)和对应的几何因子(K)。 对于3D脚本,系统使用`Scriptor3D`类。该类封装了`scriptor`库的3D功能,通过`SetRect()`定义测量区域,并通过`generate()`方法生成脚本。生成的脚本数据被持久化到数据库的`scon`、`channel`和`script2d`表中。 脚本管理器还负责脚本的导出和导入。`PutScriptToDev()`方法将数据库中的脚本转换为设备可识别的格式(如`.scr`文件),并通过`CDevice::SendFile()`传输到设备。`LoadScriptFromDev()`则执行相反的操作,将设备上的脚本文件解析并导入到数据库中。 ```mermaid flowchart TD A[用户选择测量类型] --> B[显示配置对话框] B --> C[调用底层scriptor库] C --> D[生成测点序列] D --> E[保存到数据库] E --> F[生成.scr文件] F --> G[传输到设备] ``` **Diagram sources ** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800) - [SptManager.h](file://h/SptManager.h#L1-L88) - [Scriptor3D.cpp](file://cpp/ProblemZone/Scriptor3D.cpp#L1-L69) - [scriptor.c](file://cpp/Tools/scriptor.c#L1-L70) **Section sources** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800) - [SptManager.h](file://h/SptManager.h#L1-L88) ## 测试数据管理器 (TdManager) 测试数据管理器(TdManager)负责处理测量数据的采集和存储。它使用`CLinkList`链表`m_tdLinkList`来管理所有测试数据对象。 数据采集流程始于用户在设备上启动测量任务。任务完成后,用户通过`Upload2DTdFromDev()`等方法将数据从设备上载到计算机。此过程首先调用`ImportTdHeadToDB()`将任务的元数据(如任务名称、设备序列号、测量参数等)从`*.xml`文件导入数据库的`td`表,创建一个新的测试数据记录。 随后,`Import2DTdOrgToDB()`和`Import2DTdConToDB()`方法分别处理原始数据(`*.org`文件)和计算结果数据(`*.dat`文件)的导入。原始数据包含未经处理的电压、电流读数,而计算结果数据包含已计算出的电阻率(Ro)、视极化率(SP)等。这些数据被解析并存入`rspcon`或`ipspcon`等专用数据表中。 数据的展示通过`ShowTdListByTz()`等方法实现。这些方法查询数据库,将数据填充到列表控件(`CListCtrl`)中,供用户查看。此外,`Convert2DTo3D()`方法提供了一个高级功能,允许用户将多个2D剖面数据合并转换为3D数据集,以便进行三维可视化分析。 **Section sources** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1-L800) - [TdManager.h](file://h/TdManager.h#L1-L109) - [TestingData.cpp](file://cpp/ProblemZone/TestingData.cpp#L228-L290) ## IO管理器 (IOManager) IO管理器(IOManager)实现了数据的导入和导出功能,主要用于与其他系统或用户进行数据交换。其核心功能是`Export()`和`Import()`方法。 `Export()`方法允许用户将项目、测区、脚本和测试数据导出为一个独立的`.accdb`(Access数据库)文件。该过程首先通过`CreateExpDatabase()`创建一个新的空数据库,并使用`ADOX`库定义其表结构(如`project`、`tz`、`td`等)。然后,`ExportDataToAccdbFile()`遍历一个树形控件(`CTreeCtrl`),根据用户的选择,将数据从主数据库复制到新创建的`.accdb`文件中。 `Import()`方法执行相反的操作。它首先验证用户选择的`.accdb`文件是否为有效的导出文件(通过检查`dbversion`表)。验证通过后,`ImportProjectToDB()`、`ImportTzToDB()`等方法会将文件中的数据逐项导入到主数据库中。这个过程确保了数据的完整性和一致性,支持跨设备或跨版本的数据迁移。 ```mermaid flowchart LR A[用户选择导出] --> B[创建空.accdb文件] B --> C[定义表结构] C --> D[从主数据库复制数据] D --> E[生成最终文件] E --> F[用户选择导入] F --> G[验证文件] G --> H[将数据导入主数据库] ``` **Diagram sources ** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L800-L1200) - [IOManager.h](file://h/IOManager.h#L1-L52) **Section sources** - [IOManager.cpp](file://cpp/Managers/IOManager.cpp#L1-L2064) - [IOManager.h](file://h/IOManager.h#L1-L52)