14 KiB
2D脚本生成
**本文档引用文件** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp) - [Script.cpp](file://cpp/ProblemZone/Script.cpp) - [Script2D.cpp](file://cpp/ProblemZone/Script2D.cpp) - [MediumA.cpp](file://cpp/ProblemZone/MediumA.cpp) - [MediumW.cpp](file://cpp/ProblemZone/MediumW.cpp) - [MediumBasicWenAndSch.cpp](file://cpp/ProblemZone/MediumBasicWenAndSch.cpp) - [MediumStrongWenAndSch.cpp](file://cpp/ProblemZone/MediumStrongWenAndSch.cpp) - [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp) - [DialCustomSptInput.cpp](file://cpp/Operator/DialCustomSptInput.cpp) - [Script.h](file://h/Script.h) - [Script2D.h](file://h/Script2D.h)目录
引言
本文档详细阐述了Geomative Studio软件中2D测量脚本的生成机制。重点分析了CSptManager::Create2DSConInDB和CScript类在脚本创建过程中的协作,描述了从MediumA到MediumW等2D介质模型的电极排列算法和测量序列生成逻辑。文档还说明了脚本参数配置界面(如DialNew2DTask和OpCreateSptDlg)如何收集用户输入并生成XML格式的脚本结构,提供了从项目创建到脚本导出的完整流程,并分析了2D脚本与测试数据管理器的集成方式。
项目结构
Geomative Studio项目是一个用于地球物理测量的软件系统,其核心功能围绕测量脚本的创建、管理和执行。项目结构清晰地分离了管理层、操作层和问题区域(ProblemZone)的代码。
graph TD
subgraph "管理层"
SptManager["SptManager.cpp<br>脚本管理"]
ProManager["ProManager.cpp<br>项目管理"]
TdManager["TdManager.cpp<br>测试数据管理"]
end
subgraph "操作层"
DialNew2DTask["DialNew2DTask.cpp<br>2D任务创建对话框"]
DialCustomSptInput["DialCustomSptInput.cpp<br>自定义脚本输入"]
end
subgraph "问题区域"
Script["Script.cpp<br>脚本基类"]
Script2D["Script2D.cpp<br>2D脚本实现"]
MediumA["MediumA.cpp<br>温纳装置模型"]
MediumW["MediumW.cpp<br>偶极-偶极装置模型"]
MediumBasicWenAndSch["MediumBasicWenAndSch.cpp<br>施伦贝谢基础模型"]
MediumStrongWenAndSch["MediumStrongWenAndSch.cpp<br>施伦贝谢强模型"]
end
SptManager --> Script2D
SptManager --> MediumA
SptManager --> MediumW
DialNew2DTask --> SptManager
DialCustomSptInput --> SptManager
图源
本节源
核心组件
2D脚本生成的核心组件包括CSptManager、CScript2D和各种CMedium派生类。CSptManager负责协调脚本的创建流程,CScript2D作为2D脚本的数据容器,而CMedium系列类则封装了不同测量装置的电极排列算法。
本节源
架构概述
2D脚本生成的架构遵循典型的MVC(模型-视图-控制器)模式。用户通过视图(如DialNew2DTask)输入参数,控制器(CSptManager)接收请求并协调模型(CScript2D和CMedium)进行处理,最终将结果持久化到数据库。
sequenceDiagram
participant User as "用户"
participant View as "DialNew2DTask"
participant Controller as "CSptManager"
participant Model as "CScript2D / CMedium"
participant DB as "数据库"
User->>View : 输入参数电极数、测量类型等
View->>Controller : 调用Create2DSConInDB
Controller->>Model : 创建CScript2D实例
Controller->>Model : 调用介质模型的GenerateSptRecElecVal
Model-->>Controller : 返回生成的测量序列
Controller->>DB : 将脚本数据写入scon、channel、script2d表
DB-->>Controller : 确认写入成功
Controller-->>View : 返回成功状态
View-->>User : 显示创建成功消息
图源
详细组件分析
CSptManager与CScript的协作机制
CSptManager::Create2DSConInDB是创建2D脚本的核心方法。它首先创建一个COpCreateSptDlg对话框来收集用户输入,然后根据输入创建一个CScript2D对象。该方法与CScript类的协作体现在CScript2D作为CScript的派生类,继承了基本的脚本属性和方法。
classDiagram
class CScript {
+DWORD m_dwID
+int m_iEAmount
+int m_iSType
+int m_iAR
+_ConnectionPtr m_pConnection
+CScript(DWORD dwID, _ConnectionPtr& pConnection)
+virtual ~CScript()
}
class CScript2D {
+CPtrList m_chaList
+bool ShowSptConInfo(CListCtrl& sptConList)
+bool ShowSptDetailInfo(CListCtrl& sptDetailList)
+bool ShowChannelList(CListCtrl& sptChannelList)
+void AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo)
+CScript2D(DWORD dwID, _ConnectionPtr& pConnection)
+virtual ~CScript2D()
}
class CSptManager {
+UINT Create2DSConInDB(DWORD& dwSConID)
+void Delete2DSConInDB(DWORD dwSConID)
+CScript* GetScript(DWORD dwHandle)
+void DeleteObjInMem(DWORD dwHandle)
}
CScript2D --|> CScript : 继承
CSptManager --> CScript2D : 创建实例
CSptManager --> COpCreateSptDlg : 显示对话框
图源
本节源
2D介质模型的电极排列算法
不同的2D介质模型(如MediumA、MediumW)实现了各自的GenerateSptRecElecVal方法来生成特定的测量序列。
MediumA(温纳装置)算法
CMediumA类实现了温纳装置的电极排列算法。其核心逻辑是根据电极总数计算最大层数,并生成相应的测量序列。
flowchart TD
Start([开始]) --> CheckInput["验证输入参数"]
CheckInput --> CalcMaxSpace["计算最大间距 iMaxSpace = (iEAmount-1)/3"]
CalcMaxSpace --> LoopLayer["循环每一层 iMMVal"]
LoopLayer --> CalcPositions["计算A, B, M, N电极位置"]
CalcPositions --> CreateRecord["创建CSptRecord并设置参数"]
CreateRecord --> AddToArray["将记录添加到pSptRecArray"]
AddToArray --> CalcK["计算K值: fK = 2*π*(iN-iM)"]
CalcK --> CalcLevel["计算层数: iN-iM"]
CalcLevel --> InnerLoop["内部循环: 电极向右平移"]
InnerLoop --> UpdatePositions["更新A, B, M, N位置"]
UpdatePositions --> CreateInnerRecord["创建新的CSptRecord"]
CreateInnerRecord --> AddInnerRecord["添加到pSptRecArray"]
AddInnerRecord --> CheckEnd["检查是否到达电极末端"]
CheckEnd --> |否| UpdatePositions
CheckEnd --> |是| NextLayer["进入下一层"]
NextLayer --> LoopLayer
LoopLayer --> |完成| SetOutput["设置输出参数 *pMaxLevel 和 *pPtAmount"]
SetOutput --> End([结束])
图源
本节源
MediumW(偶极-偶极装置)算法
CMediumW类使用了一个外部的脚本生成库(scr_)来处理复杂的偶极-偶极装置的测量序列生成。
flowchart TD
Start([开始]) --> Init["初始化scr对象"]
Init --> SetRect["设置测量区域矩形"]
SetRect --> SetPoleStart["设置起始电极号"]
SetPoleStart --> SetZone["设置测量区域"]
SetZone --> Generate["调用scr_generate生成序列"]
Generate --> GetPoints["获取生成的测量点列表"]
GetPoints --> LoopPoints["循环每个测量点"]
LoopPoints --> CreateRecord["创建CSptRecord并填充A,B,M,N,K值"]
CreateRecord --> AddToArray["添加到pSptRecArray"]
AddToArray --> NextPoint["下一个点"]
NextPoint --> LoopPoints
LoopPoints --> |完成| Return["返回成功"]
Return --> End([结束])
图源
本节源
MediumBasicWenAndSch(施伦贝谢基础模型)算法
该模型实现了施伦贝谢装置的测量序列,其特点是AM间距和MN间距按特定规则递增。
flowchart TD
Start([开始]) --> LoopLayer["循环每一层 iLayer"]
LoopLayer --> CalcTailor["计算调整层数 iTailorLayer = (iLayer-1)/5"]
CalcTailor --> CalcAM["计算AM间距: iLayer - iTailorLayer"]
CalcAM --> CalcMN["计算MN间距: 1 + iTailorLayer*2"]
CalcMN --> SetInitialPos["设置初始电极位置"]
SetInitialPos --> CheckEnd["检查B电极是否超出范围"]
CheckEnd --> |是| Break["跳出循环"]
CheckEnd --> |否| LoopMeasure["循环测量"]
LoopMeasure --> CreateRecord["创建CSptRecord"]
CreateRecord --> CalcK["计算K值"]
CalcK --> AddToArray["添加到pSptRecArray"]
AddToArray --> MoveRight["电极向右平移1"]
MoveRight --> CheckEnd
LoopLayer --> |完成| SetOutput["设置输出参数"]
SetOutput --> End([结束])
图源
本节源
脚本参数配置界面
DialNew2DTask对话框是用户创建2D测量任务的主要界面,它收集了任务名称、测试地点、测量类型、电极间距等关键参数。
flowchart TD
A[任务名称] --> B[测试地点]
B --> C[测量类型]
C --> D[装置类型]
D --> E[脚本选择]
E --> F[电缆布线方式]
F --> G[发射周期]
G --> H[电极间距]
H --> I[采样间隔]
I --> J[起始/结束电极]
J --> K[验证输入]
K --> L[创建任务]
本节源
自定义脚本输入
DialCustomSptInput对话框允许用户手动输入或从Excel导入自定义的测量序列。
flowchart TD
A[手动输入] --> B[验证A,B,M,N,K值]
B --> C[计算K值(可选)]
C --> D[添加到列表]
D --> E[修改/删除列表项]
E --> F[从Excel导入]
F --> G[选择追加或替换]
G --> H[解析Excel数据]
H --> I[添加到列表]
I --> J[完成]
本节源
依赖关系分析
2D脚本生成模块依赖于数据库连接、对话框界面和各种介质模型。
graph TD
SptManager --> Script2D
SptManager --> MediumA
SptManager --> MediumB
SptManager --> MediumC
SptManager --> MediumD
SptManager --> MediumE
SptManager --> MediumK
SptManager --> MediumQ
SptManager --> MediumR
SptManager --> MediumS
SptManager --> MediumT
SptManager --> MediumU
SptManager --> MediumV
SptManager --> MediumW
SptManager --> MediumX
SptManager --> MediumY
SptManager --> MediumZ
SptManager --> MediumZA
SptManager --> MediumZB
SptManager --> MediumZC
SptManager --> MediumLogging
SptManager --> MediumStrongWenAndSch
SptManager --> MediumBasicWenAndSch
SptManager --> MediumAM
SptManager --> MediumAMN
SptManager --> MediumCustom2D
SptManager --> MediumUnityProfile
SptManager --> MediumEdgeGradient
SptManager --> MeidumBipoleUpHole
SptManager --> MediumTwoSideAMN
SptManager --> MediumMidGardientScan
SptManager --> MediumStrongGradient
SptManager --> MediumCrossHoleGeomative
SptManager --> MediumCrossHoleGeomativeAM
SptManager --> MediumLandfillAdjacent
SptManager --> MediumLandfillDiagonally
SptManager --> MediumS3P
SptManager --> opcreatesptdlg.h
SptManager --> opcreatecesptdlg.h
SptManager --> OpCreate3DSptDlg.h
SptManager --> GD10OperCmd.h
SptManager --> MediumCustom2D.h
SptManager --> DialCreateNew3DSpt.h
DialNew2DTask --> SptManager
DialCustomSptInput --> SptManager
图源
本节源
性能考虑
在生成大型2D测量脚本时,性能主要受电极总数和层数的影响。CMediumA和CMediumBasicWenAndSch的算法复杂度为O(n²),其中n为电极数量。对于非常大的测量区域,建议分段创建脚本。
故障排除指南
常见问题及解决方案:
- 电极冲突检测:在
CMediumA::GenerateSptRecElecVal中,通过检查iAM,iAN,iBM,iBN是否为零来避免电极位置重叠。 - 测量序列优化:
CMediumBasicWenAndSch::ReSortPoint方法实现了优化的跑极顺序,以减少电极移动距离。 - K值计算错误:在
CalculateK方法中,当分母为零时会弹出错误提示,防止生成无效的K值。 - 脚本名称重复:在
CSptManager::Create2DSConInDB中,通过查询数据库检查是否存在同名脚本,避免重复创建。
本节源
结论
Geomative Studio的2D脚本生成系统是一个功能强大且灵活的框架。通过CSptManager统一管理,结合多种CMedium模型实现不同的测量装置,为用户提供了一个从参数配置到脚本生成的完整解决方案。该系统设计良好,易于扩展,能够满足各种复杂的地球物理测量需求。