Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/核心功能/脚本管理/脚本管理.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

16 KiB

脚本管理

**本文档引用文件** - [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)

目录

  1. 引言
  2. 核心组件分析
  3. CScript与CSptManager协同工作机制
  4. 介质类型与脚本生成算法
  5. XML脚本结构定义
  6. 脚本工作流程示例
  7. 系统集成与特殊场景应用
  8. 结论

引言

脚本管理模块是GeomativeStudio系统中的核心功能之一,负责2D/3D测量脚本的生成、编辑、验证和导出。该模块通过CScript类和CSptManager类的协同工作,实现了对不同介质类型(如MediumA到MediumZC)的测量脚本的精确生成。脚本参数(如电极数量、测量类型、时间窗口)的配置机制确保了测量过程的灵活性和准确性。脚本以XML格式存储,包含、、、等元素,定义了测量的各个方面。本文档将详细说明这些功能的实现,并提供完整的应用示例。

核心组件分析

脚本管理模块的核心由CScript类及其派生类(CScript2D、CScript3D)和CSptManager类组成。CScript类作为基类,定义了脚本的基本属性和虚函数接口,包括电极数(m_iEAmount)、脚本类型(m_iSType)和装置类型(m_iAR)。其派生类CScript2D和CScript3D分别处理二维和三维测量脚本的具体实现。

CSptManager类作为脚本管理器,负责协调脚本的创建、删除和管理。它通过链接列表(m_sptLinkList)管理内存中的脚本对象,并通过数据库操作实现脚本的持久化存储。该类提供了创建2D、3D和CE类型脚本的接口,以及从设备加载和向设备传输脚本的功能。

核心组件关系图

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 : "使用"

图示来源

本节来源

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表。接着遍历通道列表,为每个通道生成相应的测量记录并插入数据库。整个过程采用事务处理,确保数据的一致性,任何步骤失败都会触发回滚操作。

脚本创建流程图

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

图示来源

本节来源

介质类型与脚本生成算法

系统支持多种介质类型,从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²)) 井间测量

本节来源

XML脚本结构定义

测量脚本在系统中以XML格式存储,其结构定义了测量的所有关键参数。XML文档的根元素包含、、、等核心元素,每个元素都有特定的含义和数据类型。

元素存储脚本的唯一标识符,由GUCodeCreator生成的GUID代码构成,确保每个脚本在全球范围内的唯一性。元素记录脚本的名称,用于用户识别和管理。元素定义脚本类型(1D、2D、3D),决定了后续数据处理的方式。

元素包含四个逗号分隔的数值,表示测量区域的矩形边界(左、上、右、下)。元素指定矩形的位置属性,而和元素分别记录电极间距和步进距离,这些参数直接影响测量的精度和范围。

脚本的详细信息存储在子元素中,包括电极数量(eamount)、通道数量(chamount)、测点数量(tpamount)、定义者(definer)、创建日期(dedate)和描述信息(scdesc)。这些元数据为脚本的管理和追溯提供了完整的信息支持。

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>

本节来源

脚本工作流程示例

完整的脚本工作流程包括创建、编辑、验证和导出四个主要阶段。以创建一个2D测量脚本为例,首先通过CSptManager的Create2DSConInDB方法启动创建过程。系统会显示COpCreateSptDlg对话框,用户在此输入脚本名称、定义者等基本信息,并选择测量装置类型。

在编辑阶段,用户通过图形界面配置电极布局和测量参数。系统根据选择的介质类型(如MediumA)调用相应的GenerateSptRecElecVal方法,生成测量序列。该方法计算每个测点的A、B、M、N电极位置,K值和层级信息,并将结果存储在CSptRecord对象数组中。

验证阶段在脚本保存前自动执行。系统首先检查脚本名称是否已存在,避免重复。然后验证电极配置的合理性,确保所有参数在有效范围内。数据库操作采用事务模式,任何验证失败都会导致事务回滚,保证数据完整性。

导出阶段通过Export2DSConInDB方法实现,将数据库中的脚本信息转换为XML格式文件。导出过程包括读取scon表的基础信息、channel表的通道配置和script2d表的测量记录,然后按照预定义的XML结构进行序列化。导出的文件可以用于设备传输或数据共享。

脚本工作流程序列图

sequenceDiagram
participant 用户 as "用户"
participant 对话框 as "COpCreateSptDlg"
participant 管理器 as "CSptManager"
participant 数据库 as "数据库"
participant 文件 as "XML文件"
用户->>对话框 : 启动创建脚本
对话框->>用户 : 显示输入界面
用户->>对话框 : 输入脚本参数
对话框->>管理器 : 调用Create2DSConInDB
管理器->>数据库 : 开始事务
管理器->>管理器 : 生成CN标识符
管理器->>数据库 : 检查名称冲突
数据库-->>管理器 : 返回检查结果
管理器->>数据库 : 插入scon表
管理器->>数据库 : 获取最大ID
管理器->>管理器 : 遍历通道列表
管理器->>数据库 : 插入channel表
管理器->>数据库 : 插入script2d表
管理器->>数据库 : 更新TPamount
管理器->>数据库 : 提交事务
数据库-->>管理器 : 返回结果
管理器-->>对话框 : 返回执行码
对话框-->>用户 : 显示结果
用户->>管理器 : 请求导出脚本
管理器->>数据库 : 读取脚本数据
数据库-->>管理器 : 返回数据集
管理器->>管理器 : 序列化为XML
管理器->>文件 : 保存XML文件
文件-->>管理器 : 确认保存
管理器-->>用户 : 显示导出成功

图示来源

本节来源

系统集成与特殊场景应用

脚本管理器与项目管理器、测试数据管理器紧密集成,形成完整的测量工作流。项目管理器负责组织和管理测量项目,为脚本提供上下文环境。当创建新项目时,项目管理器会调用CSptManager的相关方法,初始化项目所需的脚本模板。

测试数据管理器与脚本管理器通过共享的数据结构进行交互。测量完成后,测试数据管理器读取脚本信息,将原始数据与脚本中的测点配置进行匹配,生成结构化的测试结果。这种集成确保了测量数据的可追溯性和准确性。

在跨孔测量等特殊场景下,系统采用专门的MediumCrossHoleGeomative类处理复杂的电极配置。这种场景通常涉及两个或多个钻孔中的电极阵列,需要精确的时空同步。脚本管理器生成的脚本包含了特殊的时序控制信息,确保发射电极和接收电极的协调工作。

对于大型三维测量项目,系统支持脚本分割功能。CSptManager的Create3DSConInDB方法可以将大型脚本分割为多个子脚本,每个子脚本对应一个测量区域。这种设计提高了测量效率,允许分区域并行测量,同时保持数据的整体一致性。

系统集成架构图

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 : "导出测量报告"

图示来源

本节来源

结论

脚本管理模块通过精心设计的CScript和CSptManager类架构,实现了对2D/3D测量脚本的全面管理。系统支持从MediumA到MediumZC的多种介质类型,每种类型都有专门优化的脚本生成算法,满足不同地质探测需求。XML格式的脚本结构定义了完整的测量参数,确保了数据的标准化和可交换性。

该模块与项目管理器、测试数据管理器的深度集成,构建了高效的工作流,特别适用于跨孔测量等复杂场景。通过事务处理和验证机制,系统保证了脚本数据的完整性和一致性。未来可进一步优化脚本生成算法,增加更多介质类型支持,并提升大规模三维脚本的处理性能。