# 跨孔测量脚本 **本文档引用的文件** - [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) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 引言 跨孔测量脚本是地质勘探中用于分析地下介质电性特征的重要工具。本文档全面文档化跨孔测量脚本的生成与管理过程,重点说明CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框如何配置钻孔位置、电极间距和测量模式。文档详细解释MediumCrossHoleGeomative类的双孔/多孔电极布局算法和跨孔测量序列生成逻辑,描述跨孔脚本特有的XML结构元素,如钻孔坐标、电极深度和穿透测量路径。通过完整的工作流程示例,展示从钻孔配置到脚本验证的全过程,包括孔间距离校验和测量路径冲突检测。同时,文档分析跨孔脚本与普通2D/3D脚本的差异,以及在水文地质调查中的典型应用场景,并提供跨孔测量数据采集的特殊要求和优化建议。 ## 项目结构 项目结构清晰地组织了跨孔测量相关的所有组件,主要分为核心对话框、几何配置、模拟功能和数据处理等模块。跨孔测量功能主要集中在`cpp\crossHole`目录下,包含2D和3D配置对话框的实现文件和头文件。`cpp\ProblemZone`目录包含了MediumCrossHoleGeomative类的实现,负责核心的测量序列生成算法。项目还包含数据库管理、用户界面和工具类等辅助模块,共同支持跨孔测量脚本的完整生命周期管理。 ```mermaid 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](file://h\crossHole\CCrossHoleConfig2DMainDlg.h#L14-L64) - [CCrossHoleConfig3DMainDlg.h](file://h\crossHole\CCrossHoleConfig3DMainDlg.h#L14-L71) - [MediumCrossHoleGeomative.h](file://h\MediumCrossHoleGeomative.h#L13) **章节来源** - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L1-L912) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L1-L1300) ## 核心组件 跨孔测量脚本的核心组件包括两个主要对话框类CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg,以及负责测量序列生成的MediumCrossHoleGeomative类。CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg分别处理二维和三维跨孔测量的配置,提供用户界面来设置钻孔位置、电极间距和测量模式。这些对话框通过组合多个子对话框(如几何配置、钻孔配置、地面配置和参数设置)来实现完整的配置功能。MediumCrossHoleGeomative类继承自CMedium基类,实现了特定于跨孔测量的算法,包括K值计算、测量序列生成和电极位置计算。 **章节来源** - [CCrossHoleConfig2DMainDlg.h](file://h\crossHole\CCrossHoleConfig2DMainDlg.h#L14-L64) - [CCrossHoleConfig3DMainDlg.h](file://h\crossHole\CCrossHoleConfig3DMainDlg.h#L14-L71) - [MediumCrossHoleGeomative.h](file://h\MediumCrossHoleGeomative.h#L13) ## 架构概述 跨孔测量脚本的架构采用分层设计,将用户界面、业务逻辑和数据访问分离。用户界面层由CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框组成,负责与用户交互并收集配置参数。业务逻辑层由MediumCrossHoleGeomative类实现,负责核心的测量序列生成算法和电极布局计算。数据访问层通过ADO数据库连接,将生成的测量脚本保存到数据库中。整个架构通过消息映射和事件驱动机制实现组件间的通信,确保了系统的可维护性和可扩展性。 ```mermaid 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](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L1-L912) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L1-L1300) - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L1-L148) ## 详细组件分析 ### CCrossHoleConfig2DMainDlg 分析 CCrossHoleConfig2DMainDlg类是二维跨孔测量配置的核心对话框,负责管理整个2D跨孔测量的配置流程。该类通过标签页(Tab Control)组织不同的配置界面,包括电极坐标、井下、地面和参数设置。用户可以通过加载Geomative文件来导入钻孔坐标,系统会自动解析文件中的坐标信息并显示在绘图板上。对话框提供了创建测量脚本的功能,根据用户配置的参数生成相应的测量序列,并将结果保存到数据库中。 #### 类图 ```mermaid 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](file://h\crossHole\CCrossHoleConfig2DMainDlg.h#L14-L64) - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L1-L912) #### 创建测量脚本流程 ```mermaid 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](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L734-L780) - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L547-L732) **章节来源** - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L1-L912) ### CCrossHoleConfig3DMainDlg 分析 CCrossHoleConfig3DMainDlg类是三维跨孔测量配置的核心对话框,提供了比2D版本更复杂的配置功能。该类支持多方向测线配置,可以处理X、Y、Z方向以及它们的组合。与2D版本相比,3D版本增加了方向类型参数,允许用户指定测量的方向性。该类还实现了AM装置的测量序列生成,支持单孔和双孔的AM测量模式。 #### 类图 ```mermaid 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](file://h\crossHole\CCrossHoleConfig3DMainDlg.h#L14-L71) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L1-L1300) #### 3D测量序列生成流程 ```mermaid 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](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L703-L800) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L500-L701) **章节来源** - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L1-L1300) ### MediumCrossHoleGeomative 分析 MediumCrossHoleGeomative类是跨孔测量的核心算法实现,继承自CMedium基类。该类负责实现特定于跨孔测量的K值计算公式和测量序列生成逻辑。K值计算采用几何平均法,考虑了电极间的实际距离和间隔系数。测量序列生成遵循特定的模式:以电极中点为基准,C1P1距离作为层数,逐层向下移动,同时C2P2从最高点逐次向下移动,每次移动两个电极间距,直到C1P1到达底部。 #### 类图 ```mermaid 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](file://h\MediumCrossHoleGeomative.h#L13) - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L1-L148) #### 测量序列生成算法 ```mermaid 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](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L47-L112) **章节来源** - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L1-L148) ## 依赖分析 跨孔测量脚本系统具有清晰的依赖关系,主要依赖于数据库访问组件、几何计算工具和用户界面框架。核心依赖包括ADO数据库连接用于数据持久化,标准模板库(STL)用于数据结构管理,以及MFC框架用于用户界面实现。系统内部组件间通过明确的接口进行通信,如CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg通过GetInstance()方法提供单例访问,确保配置数据的一致性。MediumCrossHoleGeomative类与配置对话框之间通过标准数据结构(STBoreHolePoints、STDatabaseABMNInfo等)进行数据交换,降低了组件间的耦合度。 ```mermaid 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](file://h\crossHole\CCrossHoleConfig2DMainDlg.h#L14-L64) - [CCrossHoleConfig3DMainDlg.h](file://h\crossHole\CCrossHoleConfig3DMainDlg.h#L14-L71) - [MediumCrossHoleGeomative.h](file://h\MediumCrossHoleGeomative.h#L13) **章节来源** - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L1-L912) - [CCrossHoleConfig3DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig3DMainDlg.cpp#L1-L1300) - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L1-L148) ## 性能考虑 跨孔测量脚本的性能主要受测量点数量和数据库操作效率的影响。系统采用批量数据库插入操作,减少了与数据库的交互次数,提高了数据保存效率。在测量序列生成过程中,算法的时间复杂度为O(n²),其中n为电极数量,对于大规模电极阵列可能成为性能瓶颈。建议在实际应用中合理控制电极数量和测量密度,避免生成过多的测量点。此外,系统使用内存中的数据结构暂存测量点信息,然后再一次性写入数据库,这种设计平衡了内存使用和I/O性能。 ## 故障排除指南 在使用跨孔测量脚本时,可能会遇到以下常见问题: 1. **脚本创建失败**:检查脚本名称是否为空,确保输入了有效的脚本名称。 2. **电极坐标加载失败**:确认Geomative文件格式正确,坐标数据以逗号分隔。 3. **K值计算异常**:检查AM距离和间隔系数是否为零,这些值不能为零。 4. **数据库保存失败**:确保数据库连接正常,检查是否有重复的脚本名称。 5. **测量点数量异常**:验证钻孔电极数量是否符合要求,确保有足够的电极进行测量。 **章节来源** - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L755-L763) - [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L564-L577) - [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L30-L43) ## 结论 跨孔测量脚本系统提供了一套完整的解决方案,用于生成和管理跨孔电法测量的配置。通过CCrossHoleConfig2DMainDlg和CCrossHoleConfig3DMainDlg对话框,用户可以方便地配置钻孔位置、电极间距和测量模式。MediumCrossHoleGeomative类实现了核心的测量序列生成算法,确保了测量数据的科学性和有效性。系统采用模块化设计,具有良好的可扩展性和可维护性。在水文地质调查中,该系统能够有效支持地下介质的精细探测,为工程决策提供可靠的数据支持。未来可以进一步优化算法性能,增加更多的测量模式支持,提升用户体验。