a
This commit is contained in:
@@ -0,0 +1,307 @@
|
||||
# 脚本管理
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [Script.cpp](file://cpp/ProblemZone/Script.cpp)
|
||||
- [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp)
|
||||
- [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [Script2D.h](file://h/Script2D.h)
|
||||
- [Script3D.h](file://h/Script3D.h)
|
||||
- [SptManager.h](file://h/SptManager.h)
|
||||
- [MediumA.cpp](file://cpp/ProblemZone/MediumA.cpp)
|
||||
- [MediumZC.cpp](file://cpp/ProblemZone/MediumZC.cpp)
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp/ProblemZone/MediumCrossHoleGeomative.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [核心组件分析](#核心组件分析)
|
||||
3. [CScript与CSptManager协同工作机制](#cscript与csptmanager协同工作机制)
|
||||
4. [介质类型与脚本生成算法](#介质类型与脚本生成算法)
|
||||
5. [XML脚本结构定义](#xml脚本结构定义)
|
||||
6. [脚本工作流程示例](#脚本工作流程示例)
|
||||
7. [系统集成与特殊场景应用](#系统集成与特殊场景应用)
|
||||
8. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
|
||||
脚本管理模块是GeomativeStudio系统中的核心功能之一,负责2D/3D测量脚本的生成、编辑、验证和导出。该模块通过CScript类和CSptManager类的协同工作,实现了对不同介质类型(如MediumA到MediumZC)的测量脚本的精确生成。脚本参数(如电极数量、测量类型、时间窗口)的配置机制确保了测量过程的灵活性和准确性。脚本以XML格式存储,包含<cn>、<name>、<type>、<rect>等元素,定义了测量的各个方面。本文档将详细说明这些功能的实现,并提供完整的应用示例。
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
脚本管理模块的核心由CScript类及其派生类(CScript2D、CScript3D)和CSptManager类组成。CScript类作为基类,定义了脚本的基本属性和虚函数接口,包括电极数(m_iEAmount)、脚本类型(m_iSType)和装置类型(m_iAR)。其派生类CScript2D和CScript3D分别处理二维和三维测量脚本的具体实现。
|
||||
|
||||
CSptManager类作为脚本管理器,负责协调脚本的创建、删除和管理。它通过链接列表(m_sptLinkList)管理内存中的脚本对象,并通过数据库操作实现脚本的持久化存储。该类提供了创建2D、3D和CE类型脚本的接口,以及从设备加载和向设备传输脚本的功能。
|
||||
|
||||
**核心组件关系图**
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CScript {
|
||||
+DWORD m_dwID
|
||||
+int m_iEAmount
|
||||
+int m_iSType
|
||||
+int m_iAR
|
||||
+virtual bool ShowSptConInfo(CListCtrl&)
|
||||
+virtual bool ShowSptDetailInfo(CListCtrl&)
|
||||
+virtual bool ShowChannelList(CListCtrl&)
|
||||
}
|
||||
class CScript2D {
|
||||
+CPtrList m_chaList
|
||||
+bool ShowChannelList(CListCtrl&)
|
||||
+bool ShowSptConInfo(CListCtrl&)
|
||||
+bool ShowSptDetailInfo(CListCtrl&)
|
||||
+void AdjustRecListColumn(int, CListCtrl&)
|
||||
}
|
||||
class CScript3D {
|
||||
+CPtrList m_chaList
|
||||
+int m_iTpAmount
|
||||
+int m_PointNum[128]
|
||||
+bool ShowSptConInfo(CListCtrl&)
|
||||
+bool ShowSptDetailInfo(CListCtrl&)
|
||||
+bool ShowChannelList(CListCtrl&)
|
||||
+void AdjustRecListColumn(int, CListCtrl&)
|
||||
}
|
||||
class CSptManager {
|
||||
+CLinkList<CScript*> m_sptLinkList
|
||||
+CLinkList<CMedium*> m_medLinkList
|
||||
+COpCreateCESptDlg* m_pOpCreateCESptDlg
|
||||
+CScriptCE* m_pNewScript
|
||||
+CChannel* m_pChannel
|
||||
+CScript* GetScript(DWORD)
|
||||
+void DeleteObjInMem(DWORD)
|
||||
+UINT Create2DSConInDB(DWORD&)
|
||||
+void Delete2DSConInDB(DWORD)
|
||||
+UINT CreateCESConInDB(DWORD&)
|
||||
+void DeleteCESConInDB(DWORD)
|
||||
+UINT Create3DSConInDB(DWORD*)
|
||||
}
|
||||
CScript <|-- CScript2D
|
||||
CScript <|-- CScript3D
|
||||
CScript <|-- CScriptCE
|
||||
CSptManager --> CScript : "管理"
|
||||
CSptManager --> CMedium : "使用"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [Script.h](file://h/Script.h#L15-L36)
|
||||
- [Script2D.h](file://h/Script2D.h#L16-L29)
|
||||
- [Script3D.h](file://h/Script3D.h#L16-L39)
|
||||
- [SptManager.h](file://h/SptManager.h#L27-L85)
|
||||
|
||||
**本节来源**
|
||||
- [Script.h](file://h/Script.h#L15-L36)
|
||||
- [Script2D.h](file://h/Script2D.h#L16-L29)
|
||||
- [Script3D.h](file://h/Script3D.h#L16-L39)
|
||||
- [SptManager.h](file://h/SptManager.h#L27-L85)
|
||||
|
||||
## CScript与CSptManager协同工作机制
|
||||
|
||||
CScript类和CSptManager类通过句柄机制和工厂模式协同工作。CSptManager类的GetScript方法是两者交互的核心,它根据句柄(dwHandle)从内存链接列表中获取或创建相应的CScript对象。当脚本对象不存在时,CSptManager会根据句柄中的样式信息(PZ_STYLE_SCON_CE, PZ_STYLE_SCON_2D, PZ_STYLE_SCON_3D)动态创建对应的CScript派生类实例。
|
||||
|
||||
这种设计实现了多态性和内存管理的优化。CSptManager负责脚本对象的生命周期管理,通过DeleteObjInMem方法在内存中删除指定句柄的脚本对象。同时,CSptManager提供了Create2DSConInDB、CreateCESConInDB等方法,将用户通过对话框输入的参数转化为数据库中的脚本记录。
|
||||
|
||||
脚本生成过程中,CSptManager首先初始化创建对话框,获取用户输入的脚本名称、定义者等信息。然后开始数据库事务,生成唯一标识符(CN),并将基本信息插入scon表。接着遍历通道列表,为每个通道生成相应的测量记录并插入数据库。整个过程采用事务处理,确保数据的一致性,任何步骤失败都会触发回滚操作。
|
||||
|
||||
**脚本创建流程图**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始创建脚本]) --> InitDialog["初始化创建对话框"]
|
||||
InitDialog --> ShowDialog["显示对话框"]
|
||||
ShowDialog --> UserInput{"用户输入参数?"}
|
||||
UserInput --> |否| Cancel["取消操作"]
|
||||
UserInput --> |是| BeginTrans["开始数据库事务"]
|
||||
BeginTrans --> GenerateCN["生成唯一标识符(CN)"]
|
||||
GenerateCN --> CheckExist["检查脚本名称是否已存在"]
|
||||
CheckExist --> |已存在| ShowError["显示错误信息"]
|
||||
CheckExist --> |不存在| InsertScon["插入scon表基础信息"]
|
||||
InsertScon --> GetMaxID["获取scon表最大ID"]
|
||||
GetMaxID --> ProcessChannels["处理通道列表"]
|
||||
ProcessChannels --> HasChannel{"还有通道?"}
|
||||
HasChannel --> |否| UpdateTPAmount["更新TPamount字段"]
|
||||
HasChannel --> |是| InsertChannel["插入channel表"]
|
||||
InsertChannel --> GetCHID["获取channel表ID"]
|
||||
GetCHID --> ProcessRecords["处理测量记录"]
|
||||
ProcessRecords --> HasRecord{"还有记录?"}
|
||||
HasRecord --> |否| NextChannel["下一个通道"]
|
||||
HasRecord --> |是| InsertScript["插入script2d表"]
|
||||
InsertScript --> UpdateCount["更新测点计数"]
|
||||
UpdateCount --> NextRecord["下一条记录"]
|
||||
NextRecord --> ProcessRecords
|
||||
NextChannel --> HasChannel
|
||||
UpdateTPAmount --> CommitTrans["提交事务"]
|
||||
CommitTrans --> Success["返回成功"]
|
||||
ShowError --> RollbackTrans["回滚事务"]
|
||||
RollbackTrans --> Fail["返回失败"]
|
||||
Cancel --> End([结束])
|
||||
Success --> End
|
||||
Fail --> End
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487)
|
||||
|
||||
**本节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L127-L157)
|
||||
- [SptManager.h](file://h/SptManager.h#L38-L40)
|
||||
|
||||
## 介质类型与脚本生成算法
|
||||
|
||||
系统支持多种介质类型,从MediumA到MediumZC,每种类型对应特定的脚本生成算法。这些算法定义了电极配置、测量序列和K值计算方法。介质类型通过m_iAR属性标识,不同的AR值对应不同的测量装置。
|
||||
|
||||
MediumA类实现了温纳装置的脚本生成算法,其核心是GenerateSptRecElecVal方法。该方法根据电极总数计算最大间距和移动步数,然后生成A、B、M、N电极的组合序列。K值计算采用公式k = 2π(n),其中n是电极间距。测点层级通过CalculateSptLevel方法确定,返回N-M的差值。
|
||||
|
||||
MediumZC类实现了更复杂的梯度装置算法,其特点是当BM间距大于AB间距6倍时,AB间距会自动增加。该算法通过CalculateSptKVal方法计算K值,公式为k = π·n·(n+1)·(n+2)·a,其中n是相对间距,a是AB间距。这种设计能够适应更大范围的地质探测需求。
|
||||
|
||||
跨孔测量专用的MediumCrossHoleGeomative类实现了特殊的电极排列算法。该算法将电极分为两组,一组从下到上编号,另一组从上到下编号。测量时C1P1距离固定为层数,C2P2依次向下移动,每次移动2个电极间距。K值计算采用公式k = π / (1/AM - 1/sqrt(AM² + AB²)),考虑了电极间的实际空间距离。
|
||||
|
||||
**介质类型对比表**
|
||||
| 介质类型 | AR值范围 | 电极配置 | K值计算公式 | 特殊特性 |
|
||||
|---------|--------|--------|-----------|--------|
|
||||
| MediumA | 1,4,5,6,11,39,41 | 温纳装置 | k = 2π(n) | 基础电阻率测量 |
|
||||
| MediumB | 2,9 | 偶极-偶极装置 | k = π·n·(n+1)·a | 高分辨率测量 |
|
||||
| MediumZC | 22-27 | 梯度装置 | k = π·n·(n+1)·(n+2)·a | 大深度探测 |
|
||||
| MediumCrossHoleGeomative | 33,34 | 跨孔装置 | k = π / (1/AM - 1/sqrt(AM² + AB²)) | 井间测量 |
|
||||
|
||||
**本节来源**
|
||||
- [MediumA.cpp](file://cpp/ProblemZone/MediumA.cpp#L30-L239)
|
||||
- [MediumZC.cpp](file://cpp/ProblemZone/MediumZC.cpp#L30-L302)
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp/ProblemZone/MediumCrossHoleGeomative.cpp#L30-L148)
|
||||
|
||||
## XML脚本结构定义
|
||||
|
||||
测量脚本在系统中以XML格式存储,其结构定义了测量的所有关键参数。XML文档的根元素包含<cn>、<name>、<type>、<rect>等核心元素,每个元素都有特定的含义和数据类型。
|
||||
|
||||
<cn>元素存储脚本的唯一标识符,由GUCodeCreator生成的GUID代码构成,确保每个脚本在全球范围内的唯一性。<name>元素记录脚本的名称,用于用户识别和管理。<type>元素定义脚本类型(1D、2D、3D),决定了后续数据处理的方式。
|
||||
|
||||
<rect>元素包含四个逗号分隔的数值,表示测量区域的矩形边界(左、上、右、下)。<rectloc>元素指定矩形的位置属性,而<poledistance>和<polestep>元素分别记录电极间距和步进距离,这些参数直接影响测量的精度和范围。
|
||||
|
||||
脚本的详细信息存储在子元素中,包括电极数量(eamount)、通道数量(chamount)、测点数量(tpamount)、定义者(definer)、创建日期(dedate)和描述信息(scdesc)。这些元数据为脚本的管理和追溯提供了完整的信息支持。
|
||||
|
||||
**XML结构示例**
|
||||
```xml
|
||||
<scon>
|
||||
<cn>GUID-123456789</cn>
|
||||
<name>2D测量脚本</name>
|
||||
<type>2</type>
|
||||
<eamount>24</eamount>
|
||||
<chamount>1</chamount>
|
||||
<tpamount>120</tpamount>
|
||||
<definer>管理员</definer>
|
||||
<dedate>2023-01-01</dedate>
|
||||
<scdesc>用于场地电阻率成像</scdesc>
|
||||
<rect>0,0,0,0</rect>
|
||||
<rectloc>0</rectloc>
|
||||
<poledistance>0</poledistance>
|
||||
<polestep>0</polestep>
|
||||
</scon>
|
||||
```
|
||||
|
||||
**本节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L363-L380)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L678-L694)
|
||||
|
||||
## 脚本工作流程示例
|
||||
|
||||
完整的脚本工作流程包括创建、编辑、验证和导出四个主要阶段。以创建一个2D测量脚本为例,首先通过CSptManager的Create2DSConInDB方法启动创建过程。系统会显示COpCreateSptDlg对话框,用户在此输入脚本名称、定义者等基本信息,并选择测量装置类型。
|
||||
|
||||
在编辑阶段,用户通过图形界面配置电极布局和测量参数。系统根据选择的介质类型(如MediumA)调用相应的GenerateSptRecElecVal方法,生成测量序列。该方法计算每个测点的A、B、M、N电极位置,K值和层级信息,并将结果存储在CSptRecord对象数组中。
|
||||
|
||||
验证阶段在脚本保存前自动执行。系统首先检查脚本名称是否已存在,避免重复。然后验证电极配置的合理性,确保所有参数在有效范围内。数据库操作采用事务模式,任何验证失败都会导致事务回滚,保证数据完整性。
|
||||
|
||||
导出阶段通过Export2DSConInDB方法实现,将数据库中的脚本信息转换为XML格式文件。导出过程包括读取scon表的基础信息、channel表的通道配置和script2d表的测量记录,然后按照预定义的XML结构进行序列化。导出的文件可以用于设备传输或数据共享。
|
||||
|
||||
**脚本工作流程序列图**
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户 as "用户"
|
||||
participant 对话框 as "COpCreateSptDlg"
|
||||
participant 管理器 as "CSptManager"
|
||||
participant 数据库 as "数据库"
|
||||
participant 文件 as "XML文件"
|
||||
用户->>对话框 : 启动创建脚本
|
||||
对话框->>用户 : 显示输入界面
|
||||
用户->>对话框 : 输入脚本参数
|
||||
对话框->>管理器 : 调用Create2DSConInDB
|
||||
管理器->>数据库 : 开始事务
|
||||
管理器->>管理器 : 生成CN标识符
|
||||
管理器->>数据库 : 检查名称冲突
|
||||
数据库-->>管理器 : 返回检查结果
|
||||
管理器->>数据库 : 插入scon表
|
||||
管理器->>数据库 : 获取最大ID
|
||||
管理器->>管理器 : 遍历通道列表
|
||||
管理器->>数据库 : 插入channel表
|
||||
管理器->>数据库 : 插入script2d表
|
||||
管理器->>数据库 : 更新TPamount
|
||||
管理器->>数据库 : 提交事务
|
||||
数据库-->>管理器 : 返回结果
|
||||
管理器-->>对话框 : 返回执行码
|
||||
对话框-->>用户 : 显示结果
|
||||
用户->>管理器 : 请求导出脚本
|
||||
管理器->>数据库 : 读取脚本数据
|
||||
数据库-->>管理器 : 返回数据集
|
||||
管理器->>管理器 : 序列化为XML
|
||||
管理器->>文件 : 保存XML文件
|
||||
文件-->>管理器 : 确认保存
|
||||
管理器-->>用户 : 显示导出成功
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L58-L83)
|
||||
|
||||
**本节来源**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L58-L83)
|
||||
|
||||
## 系统集成与特殊场景应用
|
||||
|
||||
脚本管理器与项目管理器、测试数据管理器紧密集成,形成完整的测量工作流。项目管理器负责组织和管理测量项目,为脚本提供上下文环境。当创建新项目时,项目管理器会调用CSptManager的相关方法,初始化项目所需的脚本模板。
|
||||
|
||||
测试数据管理器与脚本管理器通过共享的数据结构进行交互。测量完成后,测试数据管理器读取脚本信息,将原始数据与脚本中的测点配置进行匹配,生成结构化的测试结果。这种集成确保了测量数据的可追溯性和准确性。
|
||||
|
||||
在跨孔测量等特殊场景下,系统采用专门的MediumCrossHoleGeomative类处理复杂的电极配置。这种场景通常涉及两个或多个钻孔中的电极阵列,需要精确的时空同步。脚本管理器生成的脚本包含了特殊的时序控制信息,确保发射电极和接收电极的协调工作。
|
||||
|
||||
对于大型三维测量项目,系统支持脚本分割功能。CSptManager的Create3DSConInDB方法可以将大型脚本分割为多个子脚本,每个子脚本对应一个测量区域。这种设计提高了测量效率,允许分区域并行测量,同时保持数据的整体一致性。
|
||||
|
||||
**系统集成架构图**
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "用户界面"
|
||||
UI[用户界面]
|
||||
end
|
||||
subgraph "核心管理器"
|
||||
PM[项目管理器]
|
||||
SM[脚本管理器]
|
||||
TDM[测试数据管理器]
|
||||
end
|
||||
subgraph "数据存储"
|
||||
DB[(数据库)]
|
||||
FS[(文件系统)]
|
||||
end
|
||||
UI --> PM
|
||||
UI --> SM
|
||||
UI --> TDM
|
||||
PM --> SM : "初始化脚本模板"
|
||||
SM --> DB : "存储脚本数据"
|
||||
TDM --> DB : "存储测试结果"
|
||||
SM --> TDM : "提供测点配置"
|
||||
TDM --> SM : "反馈测量状态"
|
||||
SM --> FS : "导出XML脚本"
|
||||
TDM --> FS : "导出测量报告"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [SptManager.h](file://h/SptManager.h#L30-L58)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L33-L34)
|
||||
|
||||
**本节来源**
|
||||
- [SptManager.h](file://h/SptManager.h#L30-L58)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L33-L34)
|
||||
|
||||
## 结论
|
||||
|
||||
脚本管理模块通过精心设计的CScript和CSptManager类架构,实现了对2D/3D测量脚本的全面管理。系统支持从MediumA到MediumZC的多种介质类型,每种类型都有专门优化的脚本生成算法,满足不同地质探测需求。XML格式的脚本结构定义了完整的测量参数,确保了数据的标准化和可交换性。
|
||||
|
||||
该模块与项目管理器、测试数据管理器的深度集成,构建了高效的工作流,特别适用于跨孔测量等复杂场景。通过事务处理和验证机制,系统保证了脚本数据的完整性和一致性。未来可进一步优化脚本生成算法,增加更多介质类型支持,并提升大规模三维脚本的处理性能。
|
||||
Reference in New Issue
Block a user