This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,222 @@
# SptManager
<cite>
**本文档引用的文件**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
- [SptManager.h](file://h/SptManager.h)
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp)
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp)
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp)
- [Script.h](file://h/Script.h)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
- [testzone.xml](file://CACHE/testzone.xml)
</cite>
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 引言
SptManager模块是Geomative Studio软件中的核心组件,负责生成和管理各种测量脚本(包括2D、3D和跨孔测量)。该模块根据ProManager中定义的项目和测区信息,调用Script2D、Script3D、ScriptCE等具体类来生成符合测量协议的脚本数据。SptManager不仅处理脚本的创建和验证,还负责脚本的存储(如testzone.xml)和导出流程。本文档将深入分析SptManager的职责和实现,提供脚本生成失败或逻辑错误的排查方法,并通过代码示例展示从测区参数到最终脚本数据的转换过程。
## 项目结构
SptManager模块位于`cpp/Managers/`目录下,其主要功能是通过调用不同类型的脚本类(如Script2D、Script3D、ScriptCE)来生成测量脚本。这些脚本类位于`cpp/ProblemZone/`目录下,每个类负责特定类型的测量脚本生成。SptManager还与ProManager模块紧密协作,获取项目和测区信息,确保生成的脚本符合实际测量需求。
```mermaid
graph TB
subgraph "核心模块"
SptManager[SptManager]
ProManager[ProManager]
end
subgraph "脚本生成类"
Script2D[Script2D]
Script3D[Script3D]
ScriptCE[ScriptCE]
end
SptManager --> ProManager
SptManager --> Script2D
SptManager --> Script3D
SptManager --> ScriptCE
```
**图表来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L221)
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L1-L146)
**章节来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
## 核心组件
SptManager的核心功能包括脚本的创建、验证、存储和导出。它通过`Create2DSConInDB``CreateCESConInDB`等方法创建不同类型的测量脚本,并将这些脚本存储在数据库中。SptManager还负责将脚本导出到设备,并从设备加载脚本。
**章节来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L800)
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
## 架构概述
SptManager的架构设计遵循模块化原则,通过继承和多态机制实现不同类型的脚本生成。CScript类作为基类,定义了所有脚本的通用接口,而CScript2D、CScript3D、CScriptCE等派生类则实现了特定类型的脚本生成逻辑。SptManager通过`GetScript`方法根据句柄动态创建相应的脚本对象,实现了灵活的脚本管理。
```mermaid
classDiagram
class CScript {
+DWORD m_dwID
+_ConnectionPtr m_pConnection
+int m_iAR
+int m_iEAmount
+CScript(DWORD dwID, _ConnectionPtr& pConnection)
+~CScript()
+virtual bool ShowSptDetailInfo(CListCtrl &sptDetailList)
+virtual bool ShowChannelList(CListCtrl &sptChannelList)
+virtual bool ShowSptConInfo(CListCtrl &sptConList)
+virtual void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
}
class CScript2D {
+CScript2D(DWORD dwID, _ConnectionPtr& pConnection)
+~CScript2D()
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
+bool ShowChannelList(CListCtrl &sptChannelList)
+bool ShowSptConInfo(CListCtrl &sptConList)
+void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
}
class CScript3D {
+CScript3D(DWORD dwID, _ConnectionPtr& pConnection)
+~CScript3D()
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
+bool ShowChannelList(CListCtrl &sptChannelList)
+bool ShowSptConInfo(CListCtrl &sptConList)
+void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
}
class CScriptCE {
+CScriptCE(DWORD dwID, _ConnectionPtr& pConnection)
+~CScriptCE()
+bool ShowSptDetailInfo(CListCtrl &sptDetailList)
+bool ShowChannelList(CListCtrl &sptChannelList)
+bool ShowSptConInfo(CListCtrl &sptConList)
}
CScript <|-- CScript2D
CScript <|-- CScript3D
CScript <|-- CScriptCE
```
**图表来源**
- [Script.h](file://h/Script.h)
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L1-L237)
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L221)
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L1-L146)
## 详细组件分析
### SptManager分析
SptManager模块的主要职责是协调脚本的生成和管理。它通过`Create2DSConInDB`方法创建2D测量脚本,通过`CreateCESConInDB`方法创建跨孔测量脚本。这些方法首先通过对话框获取用户输入的脚本参数,然后在数据库中创建相应的记录。
#### 脚本创建流程
```mermaid
sequenceDiagram
participant 用户 as "用户"
participant SptManager as "SptManager"
participant 数据库 as "数据库"
用户->>SptManager : 请求创建2D脚本
SptManager->>SptManager : 显示创建对话框
SptManager->>用户 : 获取脚本参数
SptManager->>数据库 : 检查脚本名称是否已存在
alt 脚本名称已存在
数据库-->>SptManager : 返回存在
SptManager-->>用户 : 显示错误消息
else 脚本名称不存在
数据库-->>SptManager : 返回不存在
SptManager->>数据库 : 插入scon记录
SptManager->>数据库 : 插入channel记录
SptManager->>数据库 : 插入script2d记录
数据库-->>SptManager : 确认插入成功
SptManager-->>用户 : 显示成功消息
end
```
**图表来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L800)
#### 脚本验证与存储
SptManager在创建脚本时会进行严格的验证,确保脚本名称的唯一性。如果脚本名称已存在,系统会提示用户并取消创建操作。脚本数据存储在数据库的`scon``channel``script2d`表中,其中`scon`表存储脚本的基本信息,`channel`表存储通道信息,`script2d`表存储具体的测量点数据。
**章节来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L334-L351)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L363-L380)
### Script2D分析
Script2D类负责生成2D测量脚本。它继承自CScript类,并实现了特定于2D测量的逻辑。Script2D的主要功能包括显示脚本详细信息、显示通道列表和显示脚本配置信息。
#### 显示脚本详细信息
```mermaid
flowchart TD
Start([开始]) --> GetSConData["从scon表获取数据"]
GetSConData --> CheckRecordCount{"记录数 > 0?"}
CheckRecordCount --> |是| SetDetailInfo["设置详细信息"]
CheckRecordCount --> |否| End([结束])
SetDetailInfo --> End
```
**图表来源**
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L28-L71)
#### 显示通道列表
Script2D通过查询`channel``medium`表来获取通道信息,并将其显示在列表控件中。每个通道的装置类型编号(AR)也会被获取并存储。
**章节来源**
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp#L74-L109)
### Script3D分析
Script3D类负责生成3D测量脚本。它的实现与Script2D类似,但针对3D测量的特点进行了优化。Script3D同样实现了显示脚本详细信息、显示通道列表和显示脚本配置信息的功能。
**章节来源**
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L28-L151)
### ScriptCE分析
ScriptCE类负责生成跨孔测量脚本。它继承自CScript类,并实现了特定于跨孔测量的逻辑。ScriptCE的主要功能包括显示脚本配置信息、显示脚本详细信息和显示通道列表。
**章节来源**
- [ScriptCE.cpp](file://cpp/ProblemZone/ScriptCE.cpp#L28-L146)
## 依赖分析
SptManager模块依赖于多个其他模块和类,包括ProManager、Script2D、Script3D、ScriptCE等。这些依赖关系确保了SptManager能够获取项目和测区信息,并生成符合实际测量需求的脚本。
```mermaid
graph TD
SptManager --> ProManager
SptManager --> Script2D
SptManager --> Script3D
SptManager --> ScriptCE
SptManager --> CMarkup
SptManager --> _ConnectionPtr
```
**图表来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L3589)
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
## 性能考虑
SptManager在处理大量脚本数据时需要考虑性能问题。为了避免数据库操作的性能瓶颈,SptManager采用了事务处理机制,确保脚本创建的原子性。此外,SptManager还通过缓存机制减少对数据库的频繁访问,提高整体性能。
## 故障排除指南
当脚本生成失败或出现逻辑错误时,可以按照以下步骤进行排查:
1. **检查脚本名称**:确保脚本名称在数据库中是唯一的,避免名称冲突。
2. **验证数据库连接**:确保数据库连接正常,能够正确执行SQL语句。
3. **检查参数输入**:确认用户输入的脚本参数是否正确,特别是电极数量、通道数量等关键参数。
4. **查看日志文件**:检查系统日志文件,查找可能的错误信息或异常堆栈。
**章节来源**
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L334-L351)
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L488-L498)
## 结论
SptManager模块是Geomative Studio软件中不可或缺的一部分,负责生成和管理各种测量脚本。通过深入分析SptManager的职责和实现,我们可以更好地理解其工作原理,并在实际应用中更有效地使用和维护该模块。未来的工作可以进一步优化SptManager的性能,提高脚本生成的效率和可靠性。