17 KiB
跨孔测量脚本
**本文档引用的文件** - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp) - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp) - [CCrossHoleConfig2DMainDlg.h](file://h\crossHole\CCrossHoleConfig2DMainDlg.h) - [CCrossHoleConfig3DMainDlg.h](file://h\crossHole\CCrossHoleConfig3DMainDlg.h) - [MediumCrossHoleGeomative.h](file://h\MediumCrossHoleGeomative.h)目录
引言
跨孔测量脚本是地质勘探中用于分析地下介质电性特征的重要工具。本文档全面文档化跨孔测量脚本的生成与管理过程,重点说明CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框如何配置钻孔位置、电极间距和测量模式。文档详细解释MediumCrossHoleGeomative类的双孔/多孔电极布局算法和跨孔测量序列生成逻辑,描述跨孔脚本特有的XML结构元素,如钻孔坐标、电极深度和穿透测量路径。通过完整的工作流程示例,展示从钻孔配置到脚本验证的全过程,包括孔间距离校验和测量路径冲突检测。同时,文档分析跨孔脚本与普通2D/3D脚本的差异,以及在水文地质调查中的典型应用场景,并提供跨孔测量数据采集的特殊要求和优化建议。
项目结构
项目结构清晰地组织了跨孔测量相关的所有组件,主要分为核心对话框、几何配置、模拟功能和数据处理等模块。跨孔测量功能主要集中在cpp\crossHole目录下,包含2D和3D配置对话框的实现文件和头文件。cpp\ProblemZone目录包含了MediumCrossHoleGeomative类的实现,负责核心的测量序列生成算法。项目还包含数据库管理、用户界面和工具类等辅助模块,共同支持跨孔测量脚本的完整生命周期管理。
graph TD
subgraph "跨孔测量模块"
A[CCrossHoleConfig2DMainDlg] --> B[COption2DGeometryDlg]
A --> C[COption2DBoreholeDlg]
A --> D[COption2DSurfaceDlg]
A --> E[COption2DSettingDlg]
A --> F[CCrosshole2dDrawingBoardDlg]
G[CCrossHoleConfig3DMainDlg] --> H[COption3DGeometryDlg]
G --> I[COption3DBoreholeDlg]
G --> J[COption3DSurfaceDlg]
G --> K[COption3DSettingDlg]
G --> L[CCrosshole3dDrawingBoardDlg]
M[MediumCrossHoleGeomative] --> N[CMedium]
end
subgraph "支持模块"
O[数据库管理]
P[用户界面]
Q[工具类]
end
A --> O
G --> O
M --> O
A --> P
G --> P
M --> Q
图表来源
- CCrossHoleConfig2DMainDlg.h
- CCrossHoleConfig3DMainDlg.h
- MediumCrossHoleGeomative.h
章节来源
- CCrossHoleConfig2DMainDlg.cpp
- CCrossHoleConfig3DMainDlg.cpp
核心组件
跨孔测量脚本的核心组件包括两个主要对话框类CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg,以及负责测量序列生成的MediumCrossHoleGeomative类。CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg分别处理二维和三维跨孔测量的配置,提供用户界面来设置钻孔位置、电极间距和测量模式。这些对话框通过组合多个子对话框(如几何配置、钻孔配置、地面配置和参数设置)来实现完整的配置功能。MediumCrossHoleGeomative类继承自CMedium基类,实现了特定于跨孔测量的算法,包括K值计算、测量序列生成和电极位置计算。
章节来源
- CCrossHoleConfig2DMainDlg.h
- CCrossHoleConfig3DMainDlg.h
- MediumCrossHoleGeomative.h
架构概述
跨孔测量脚本的架构采用分层设计,将用户界面、业务逻辑和数据访问分离。用户界面层由CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框组成,负责与用户交互并收集配置参数。业务逻辑层由MediumCrossHoleGeomative类实现,负责核心的测量序列生成算法和电极布局计算。数据访问层通过ADO数据库连接,将生成的测量脚本保存到数据库中。整个架构通过消息映射和事件驱动机制实现组件间的通信,确保了系统的可维护性和可扩展性。
graph TD
A[用户界面层] --> B[业务逻辑层]
B --> C[数据访问层]
subgraph "用户界面层"
D[CCrossHoleConfig2DMainDlg]
E[CCrossHoleConfig3DMainDlg]
F[子配置对话框]
end
subgraph "业务逻辑层"
G[MediumCrossHoleGeomative]
H[测量序列生成]
I[电极布局算法]
J[K值计算]
end
subgraph "数据访问层"
K[数据库连接]
L[脚本保存]
M[坐标信息存储]
end
D --> G
E --> G
G --> K
H --> L
I --> M
图表来源
- CCrossHoleConfig2DMainDlg.cpp
- CCrossHoleConfig3DMainDlg.cpp
- MediumCrossHoleGeomative.cpp
详细组件分析
CCrossHoleConfig2DMainDlg 分析
CCrossHoleConfig2DMainDlg类是二维跨孔测量配置的核心对话框,负责管理整个2D跨孔测量的配置流程。该类通过标签页(Tab Control)组织不同的配置界面,包括电极坐标、井下、地面和参数设置。用户可以通过加载Geomative文件来导入钻孔坐标,系统会自动解析文件中的坐标信息并显示在绘图板上。对话框提供了创建测量脚本的功能,根据用户配置的参数生成相应的测量序列,并将结果保存到数据库中。
类图
classDiagram
class CCrossHoleConfig2DMainDlg {
+static GetInstance()
+OnInitDialog()
+OnTcnSelchangeTabArChange()
+OnBnClickedBtnLoadGeometry()
+OnBnClickedBtnCreate()
+OnBnClickedBtnStartSimulation()
+OnBnClickedBtnStopSimulation()
+OnBnClickedBtnClose()
+OnDestroy()
+OnMsgCrossHoleMainWndBtn()
+ChangeTabPage()
#DoDataExchange()
#CalcLValue()
#TwoBoreholeGenerateScript()
#SaveTestPointToDB()
#GetUniSptXPos()
-m_tabChange
-m_pConnection
-m_strScriptName
-m_strTimeInterval
-m_strOperator
-m_strNote
-m_uiEamount
-m_uiCHamount
-m_uiTPamount
-m_rcRect
-m_rcRectLoc
-m_strPoleDistance
-m_strPoleStep
-m_vecAllBoreholeABMNInfo
-m_mapDatabaseABMNInfo
}
CCrossHoleConfig2DMainDlg --> CTabCtrl : "使用"
CCrossHoleConfig2DMainDlg --> _ConnectionPtr : "数据库连接"
CCrossHoleConfig2DMainDlg --> CDialog : "继承"
图表来源
- CCrossHoleConfig2DMainDlg.h
- CCrossHoleConfig2DMainDlg.cpp
创建测量脚本流程
sequenceDiagram
participant 用户
participant CCrossHoleConfig2DMainDlg
participant COption2DSettingDlg
participant COption2DGeometryDlg
participant MediumCrossHoleGeomative
participant 数据库
用户->>CCrossHoleConfig2DMainDlg : 点击"创建"按钮
CCrossHoleConfig2DMainDlg->>COption2DSettingDlg : 获取脚本名称、时间间隔等参数
COption2DSettingDlg-->>CCrossHoleConfig2DMainDlg : 返回参数
CCrossHoleConfig2DMainDlg->>COption2DGeometryDlg : 获取钻孔坐标信息
COption2DGeometryDlg-->>CCrossHoleConfig2DMainDlg : 返回坐标数据
CCrossHoleConfig2DMainDlg->>CCrossHoleConfig2DMainDlg : 调用TwoBoreholeGenerateScript生成测点
CCrossHoleConfig2DMainDlg->>CCrossHoleConfig2DMainDlg : 调用CalcLValue计算L值
CCrossHoleConfig2DMainDlg->>CCrossHoleConfig2DMainDlg : 生成所有测量点
CCrossHoleConfig2DMainDlg->>CCrossHoleConfig2DMainDlg : 调用SaveTestPointToDB保存到数据库
CCrossHoleConfig2DMainDlg->>数据库 : 插入scon表记录
数据库-->>CCrossHoleConfig2DMainDlg : 返回成功
CCrossHoleConfig2DMainDlg->>数据库 : 插入channel表记录
数据库-->>CCrossHoleConfig2DMainDlg : 返回成功
CCrossHoleConfig2DMainDlg->>数据库 : 插入script2d表记录
数据库-->>CCrossHoleConfig2DMainDlg : 返回成功
CCrossHoleConfig2DMainDlg->>数据库 : 插入TCoordinatesInfo表记录
数据库-->>CCrossHoleConfig2DMainDlg : 返回成功
CCrossHoleConfig2DMainDlg->>用户 : 显示创建成功消息
图表来源
- CCrossHoleConfig2DMainDlg.cpp
- CCrossHoleConfig2DMainDlg.cpp
章节来源
- CCrossHoleConfig2DMainDlg.cpp
CCrossHoleConfig3DMainDlg 分析
CCrossHoleConfig3DMainDlg类是三维跨孔测量配置的核心对话框,提供了比2D版本更复杂的配置功能。该类支持多方向测线配置,可以处理X、Y、Z方向以及它们的组合。与2D版本相比,3D版本增加了方向类型参数,允许用户指定测量的方向性。该类还实现了AM装置的测量序列生成,支持单孔和双孔的AM测量模式。
类图
classDiagram
class CCrossHoleConfig3DMainDlg {
+static GetInstance()
+OnInitDialog()
+OnTcnSelchangeTabArChange()
+OnBnClickedBtnLoadGeometry()
+OnBnClickedBtnCreate()
+OnBnClickedBtnStartSimulation()
+OnBnClickedBtnStopSimulation()
+OnBnClickedBtnClose()
+OnDestroy()
+OnMsgCrossHoleMainWndBtn()
+ChangeTabPage()
#DoDataExchange()
#CalcLValue()
#TwoBoreholeGenerateScript()
#SaveTestPointToDB()
#OneBoreHoleGenerateScriptAM()
#TwoBoreHoleGenerateScriptAM()
#GetUniSptXPos()
-m_tabChange
-m_pConnection
-m_strScriptName
-m_strTimeInterval
-m_strOperator
-m_strNote
-m_uiEamount
-m_uiCHamount
-m_uiTPamount
-m_rcRect
-m_rcRectLoc
-m_strPoleDistance
-m_strPoleStep
-m_vecAllBoreholeABMNInfo
-m_iMediumType
-m_mapDatabaseABMNInfo
}
CCrossHoleConfig3DMainDlg --> CTabCtrl : "使用"
CCrossHoleConfig3DMainDlg --> _ConnectionPtr : "数据库连接"
CCrossHoleConfig3DMainDlg --> CDialog : "继承"
图表来源
- CCrossHoleConfig3DMainDlg.h
- CCrossHoleConfig3DMainDlg.cpp
3D测量序列生成流程
flowchart TD
A[开始] --> B{获取钻孔数量}
B --> |两个钻孔| C[调用TwoBoreholeGenerateScript]
B --> |一个钻孔| D[调用OneBoreHoleGenerateScriptAM]
C --> E[计算L值范围]
E --> F[遍历第一个钻孔的电极]
F --> G[遍历第二个钻孔的电极]
G --> H[计算AM、BM、AN、BN距离]
H --> I[计算K值]
I --> J[创建测量点记录]
J --> K{是否为多通道}
K --> |是| L[按A、B、M排序插入]
K --> |否| M[按顺序插入]
L --> N[保存到数据库]
M --> N
D --> O[遍历同一钻孔的电极对]
O --> P[计算AM距离]
P --> Q[计算K值]
Q --> R[创建AM测量点记录]
R --> S[保存到数据库]
N --> T[结束]
S --> T
图表来源
- CCrossHoleConfig3DMainDlg.cpp
- CCrossHoleConfig3DMainDlg.cpp
章节来源
- CCrossHoleConfig3DMainDlg.cpp
MediumCrossHoleGeomative 分析
MediumCrossHoleGeomative类是跨孔测量的核心算法实现,继承自CMedium基类。该类负责实现特定于跨孔测量的K值计算公式和测量序列生成逻辑。K值计算采用几何平均法,考虑了电极间的实际距离和间隔系数。测量序列生成遵循特定的模式:以电极中点为基准,C1P1距离作为层数,逐层向下移动,同时C2P2从最高点逐次向下移动,每次移动两个电极间距,直到C1P1到达底部。
类图
classDiagram
class CMediumCrossHoleGeomative {
+CMediumCrossHoleGeomative(int iAR)
+~CMediumCrossHoleGeomative()
+CalculateCESptKVal(float fA, float fB, float fX, float fY)
+GenerateSptRecElecVal(int iEAmount, int* pMaxLevel, int* pPtAmount, CPtrArray* pSptRecArray)
+CalculateSptPtLoc(int iMul, CSptRecord* pSptRecord)
+GenSptRecLevel(int iA, int iB, int iM, int iN)
+GenSptRecPosInLevel(int iA, int iB, int iM, int iN)
+GetMaxLevelByEAmount(int iEAmount)
-m_fSeprate
}
CMediumCrossHoleGeomative --> CMedium : "继承"
图表来源
- MediumCrossHoleGeomative.h
- MediumCrossHoleGeomative.cpp
测量序列生成算法
flowchart TD
A[开始] --> B[初始化层数iLayer=0]
B --> C[层数加1]
C --> D[设置A位置为中点]
D --> E[计算M位置=A-层数]
E --> F{M位置<1?}
F --> |是| G[结束]
F --> |否| H[设置B位置为中点+1]
H --> I[计算N位置=B+层数]
I --> J{N位置>电极总数?}
J --> |是| K[移动A和M向下2个间距]
J --> |否| L[创建测量点记录]
L --> M[移动B和N向下2个间距]
M --> I
K --> N{A位置<2?}
N --> |是| G
N --> |否| H
G --> O[结束]
图表来源
- MediumCrossHoleGeomative.cpp
章节来源
- MediumCrossHoleGeomative.cpp
依赖分析
跨孔测量脚本系统具有清晰的依赖关系,主要依赖于数据库访问组件、几何计算工具和用户界面框架。核心依赖包括ADO数据库连接用于数据持久化,标准模板库(STL)用于数据结构管理,以及MFC框架用于用户界面实现。系统内部组件间通过明确的接口进行通信,如CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg通过GetInstance()方法提供单例访问,确保配置数据的一致性。MediumCrossHoleGeomative类与配置对话框之间通过标准数据结构(STBoreHolePoints、STDatabaseABMNInfo等)进行数据交换,降低了组件间的耦合度。
graph TD
A[CCrossHoleConfig2DMainDlg] --> B[数据库访问]
A --> C[STL容器]
A --> D[MFC框架]
A --> E[COption2DGeometryDlg]
A --> F[COption2DBoreholeDlg]
A --> G[COption2DSurfaceDlg]
A --> H[COption2DSettingDlg]
A --> I[CCrosshole2dDrawingBoardDlg]
J[CCrossHoleConfig3DMainDlg] --> B
J --> C
J --> D
J --> K[COption3DGeometryDlg]
J --> L[COption3DBoreholeDlg]
J --> M[COption3DSurfaceDlg]
J --> N[COption3DSettingDlg]
J --> O[CCrosshole3dDrawingBoardDlg]
P[MediumCrossHoleGeomative] --> B
P --> C
P --> Q[CMedium基类]
A --> P
J --> P
图表来源
- CCrossHoleConfig2DMainDlg.h
- CCrossHoleConfig3DMainDlg.h
- MediumCrossHoleGeomative.h
章节来源
- CCrossHoleConfig2DMainDlg.cpp
- CCrossHoleConfig3DMainDlg.cpp
- MediumCrossHoleGeomative.cpp
性能考虑
跨孔测量脚本的性能主要受测量点数量和数据库操作效率的影响。系统采用批量数据库插入操作,减少了与数据库的交互次数,提高了数据保存效率。在测量序列生成过程中,算法的时间复杂度为O(n²),其中n为电极数量,对于大规模电极阵列可能成为性能瓶颈。建议在实际应用中合理控制电极数量和测量密度,避免生成过多的测量点。此外,系统使用内存中的数据结构暂存测量点信息,然后再一次性写入数据库,这种设计平衡了内存使用和I/O性能。
故障排除指南
在使用跨孔测量脚本时,可能会遇到以下常见问题:
- 脚本创建失败:检查脚本名称是否为空,确保输入了有效的脚本名称。
- 电极坐标加载失败:确认Geomative文件格式正确,坐标数据以逗号分隔。
- K值计算异常:检查AM距离和间隔系数是否为零,这些值不能为零。
- 数据库保存失败:确保数据库连接正常,检查是否有重复的脚本名称。
- 测量点数量异常:验证钻孔电极数量是否符合要求,确保有足够的电极进行测量。
章节来源
- CCrossHoleConfig2DMainDlg.cpp
- CCrossHoleConfig2DMainDlg.cpp
- MediumCrossHoleGeomative.cpp
结论
跨孔测量脚本系统提供了一套完整的解决方案,用于生成和管理跨孔电法测量的配置。通过CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框,用户可以方便地配置钻孔位置、电极间距和测量模式。MediumCrossHoleGeomative类实现了核心的测量序列生成算法,确保了测量数据的科学性和有效性。系统采用模块化设计,具有良好的可扩展性和可维护性。在水文地质调查中,该系统能够有效支持地下介质的精细探测,为工程决策提供可靠的数据支持。未来可以进一步优化算法性能,增加更多的测量模式支持,提升用户体验。