# SptManager **本文档引用的文件** - [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) ## 目录 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的性能,提高脚本生成的效率和可靠性。