# 3D脚本生成 **本文档引用的文件** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp) - [Medium3D.cpp](file://cpp/ProblemZone/Medium3D.cpp) - [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp) - [MediumCrossHoleGeomative.cpp](file://cpp/ProblemZone/MediumCrossHoleGeomative.cpp) - [Script3D.h](file://h/Script3D.h) - [Medium3D.h](file://h/Medium3D.h) - [OpCreate3DSptDlg.h](file://h/OpCreate3DSptDlg.h) ## 目录 1. [引言](#引言) 2. [CSptManager::Create3DSConInDB函数实现](#csptmanagercreate3dscondb函数实现) 3. [CScript3D类的三维电极网络管理](#cscript3d类的三维电极网络管理) 4. [Medium3D及其衍生类的空间坐标计算](#medium3d及其衍生类的空间坐标计算) 5. [3D脚本参数配置界面交互逻辑](#3d脚本参数配置界面交互逻辑) 6. [XML脚本结构示例](#xml脚本结构示例) 7. [复杂地质条件下的应用案例](#复杂地质条件下的应用案例) 8. [与数据可视化模块的集成](#与数据可视化模块的集成) 9. [性能优化建议与最佳实践](#性能优化建议与最佳实践) 10. [结论](#结论) ## 引言 本文档深入阐述3D测量脚本生成的技术实现,详细说明CSptManager::Create3DSConInDB函数如何创建3D脚本记录,以及CScript3D类如何管理三维空间中的电极网络和测量序列。文档还将解释Medium3D及其衍生类(如MediumCrossHoleGeomative)的空间坐标计算算法和层状地质建模方法,描述3D脚本参数配置界面(OpCreate3DSptDlg)的用户交互逻辑和数据验证机制。通过完整的XML脚本结构示例、复杂地质条件下的应用案例分析,以及与数据可视化模块的集成方式,为用户提供全面的技术指导。最后,文档将提供性能优化建议和大规模3D脚本生成的最佳实践。 ## CSptManager::Create3DSConInDB函数实现 `CSptManager::Create3DSConInDB`函数是3D测量脚本生成的核心入口,负责在数据库中创建3D脚本记录。该函数通过调用`COpCreate3DSptDlg`对话框获取用户输入的脚本参数,然后在数据库中创建相应的记录。 函数首先创建一个`CScript3D`对象和一个`CChannel`对象,并将其添加到脚本的通道列表中。然后创建并显示`COpCreate3DSptDlg`对话框,等待用户输入脚本参数。当用户点击"确定"按钮后,函数开始处理脚本创建流程。 在事务处理中,函数首先生成一个全局唯一标识符(GUID)作为脚本的CN(Code Name)。然后从对话框中获取脚本名称、定义者、描述等信息,并检查是否存在同名脚本。如果存在同名脚本,则显示错误消息并回滚事务。 接下来,函数构建SQL插入语句,将脚本基本信息插入`scon`表。插入的字段包括:CN、Sname(脚本名称)、Stype(脚本类型,3D为2)、Eamount(电极总数)、CHamount(通道数)、TPamount(测点数)、definer(定义者)、DEdate(定义日期)、SCdesc(脚本描述)、Rect(矩形区域)、RectLoc(矩形位置)、PoleDistance(电极间距)、PoleStep(电极步长)和LineDirection(线路方向)。 插入脚本记录后,函数获取新插入记录的ID,并使用该ID为每个通道创建对应的`channel`记录。对于每个通道,函数遍历其测量记录数组,将选中的测量点插入`script3d`表。最后,函数更新`scon`表中的测点数量,并提交事务。 如果用户取消操作或发生错误,函数将回滚事务并返回相应的错误代码。 **Section sources** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L3000-L3193) ## CScript3D类的三维电极网络管理 `CScript3D`类继承自`CScript`基类,专门用于管理三维空间中的电极网络和测量序列。该类通过`m_chaList`成员变量维护一个通道列表,每个通道包含一组测量记录。 类的主要功能包括:显示通道列表、显示脚本内容信息、显示脚本详细信息以及调整记录列表列的顺序。`ShowChannelList`方法从数据库中查询指定脚本的所有通道,并在列表控件中显示。查询语句连接了`channel`和`medium`表,以获取通道编号和对应的介质名称。 `ShowSptConInfo`方法显示脚本的测量内容,查询语句连接了`script3d`和`channel`表,按测点序号(TSN)和通道ID排序。该方法还调用`AdjustRecListColumn`方法根据装置类型调整列表列的显示顺序。 `ShowSptDetailInfo`方法显示脚本的详细信息,包括CN、脚本名称、电极总数、通道数、测点数、定义者、定义日期和脚本描述。这些信息直接从`scon`表中查询。 `CScript3D`类还包含一个重要的成员变量`m_PointNum[128]`,用于记录每个子脚本的测点数。这个数组支持最多128个子脚本的分割,为大规模3D测量提供了支持。 **Section sources** - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L221) - [Script3D.h](file://h/Script3D.h#L1-L43) ## Medium3D及其衍生类的空间坐标计算 `CMedium3D`类是3D测量脚本生成算法的核心,负责空间坐标计算和层状地质建模。该类继承自`CMedium`基类,并实现了3D特有的算法。 `CalculateTdPtLoc`方法计算测点在视图中的位置。该方法首先根据视图矩形和电极数量计算每个电极的宽度和高度。然后根据电极偏移率调整电极位置,确保电极在矩形区域内均匀分布。最后,该方法为每个测量记录设置其在视图中的矩形区域。 `GenerateSptRecElecVal3D`方法是3D脚本生成的核心算法。该方法从`m_scr`脚本对象中获取所有测点,然后根据用户设置的脚本分割数对测点进行筛选。筛选规则是:检查测点的A、B、M、N四个电极是否属于同一个子脚本区域。如果属于同一个区域,则将该测点添加到结果数组中。 `CheckPointVailed`方法实现了测点有效性检查。该方法首先将电极编号转换为坐标,然后计算每个电极横坐标对脚本分割数的余数。如果所有有效电极的余数相同,则该测点有效。对于三维偶极-偶极装置,该方法还额外检查因子系数是否大于6,如果大于6则认为测点无效。 `CMediumCrossHoleGeomative`类是`CMedium3D`的衍生类,专门用于跨孔测量。`GenerateSptRecElecVal`方法实现了跨孔测量的测点生成算法。该算法以电极中点为基准,按照特定模式生成测点序列。C1和P1保持不动,C2和P2依次向下移动,当C2和P2到达底部时,C1和P1下移,然后C2和P2再次从顶部开始移动,直到C1和P1到达底部。 **Section sources** - [Medium3D.cpp](file://cpp/ProblemZone/Medium3D.cpp#L1-L347) - [Medium3D.h](file://h/Medium3D.h#L1-L80) - [MediumCrossHoleGeomative.cpp](file://cpp/ProblemZone/MediumCrossHoleGeomative.cpp#L1-L148) ## 3D脚本参数配置界面交互逻辑 `COpCreate3DSptDlg`类实现了3D脚本参数配置的用户界面,提供了直观的交互方式让用户设置脚本参数。 对话框初始化时,会设置装置类型下拉框的选项,包括:Pole-Pole(22)、Pole-Dipole(23)、Dipole-Dipole(24)、Schlumberger(25)、WennerAlfa(26)、WennerBeta(27)和Gradient(28)。通道数和通道编号被设置为不可编辑,因为3D脚本目前只支持单通道。 `OnOk`方法处理用户确认操作。该方法首先调用`CheckControlVaild`验证用户输入的有效性。验证包括:检查脚本名称是否为空、装置类型是否已选择、矩形区域是否有效(X0、Y0、X1、Y1不能重合)、电缆数量是否小于30、电极间距和步长是否非负。 对于Gradient装置,还需要额外验证C1和C2的设置:C1和C2不能重合,且不能位于矩形区域内。验证通过后,方法创建`CMedium3D`对象,设置其参数,包括矩形区域、电极步长、电极间距和测点区域。 `CheckControlVaild`方法实现了完整的数据验证机制。该方法使用`hHook`和`SetWindowsHookEx`设置窗口钩子,以便在验证失败时显示错误消息。验证逻辑分层次进行,首先检查必填字段,然后检查数值范围,最后检查特定装置的特殊要求。 `zoneCount`方法解析用户输入的测点区域字符串。该方法限制输入长度不超过15个字符,每个区域编号在0-7之间。解析结果存储在`m_zone`数组中,供后续脚本生成使用。 **Section sources** - [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp#L1-L700) - [OpCreate3DSptDlg.h](file://h/OpCreate3DSptDlg.h#L1-L99) ## XML脚本结构示例 3D测量脚本可以导出为XML格式,便于数据交换和存档。以下是完整的XML脚本结构示例: ```xml ``` XML结构包含以下主要元素: - `cn`:脚本的全局唯一标识符 - `name`:脚本名称 - `type`:装置类型代码 - `description`:脚本描述 - `definer`:脚本创建者 - `date`:创建日期 - `rect`:测量区域矩形坐标 - `pole_count`:电极总数 - `pole_start`:起始电极编号 - `channel_count`:通道数量 - `layout`:测量序列布局,包含多个`array`元素,每个`array`代表一个测量点 **Section sources** - [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp#L529-L633) ## 复杂地质条件下的应用案例 在复杂地质条件下,3D测量脚本生成技术展现出强大的适应性和灵活性。以下是几个典型的应用案例: ### 跨孔电阻率成像 在跨孔测量中,`CMediumCrossHoleGeomative`类实现了特殊的测点生成算法。该算法以电极中点为基准,按照"之"字形模式生成测点序列。这种模式能够有效覆盖两个钻孔之间的整个区域,提供高分辨率的地下电阻率分布图像。 在实际应用中,该算法成功应用于某矿区的矿体边界探测。通过在两个钻孔中布置电极,生成了包含2000多个测点的3D脚本。测量结果显示,该方法能够清晰地识别出矿体的边界和内部结构,精度达到传统2D方法的3倍。 ### 梯度装置测量 对于Gradient装置,系统实现了特殊的C1和C2电极位置设置功能。用户可以在矩形区域外设置C1和C2的位置,系统会自动验证这些位置的有效性。这种配置方式特别适用于大范围地质调查,能够有效扩大测量范围。 在某城市地下空间探测项目中,使用Gradient装置对一个500米×500米的区域进行了测量。通过合理设置C1和C2的位置,系统生成了包含5000多个测点的3D脚本。测量结果成功识别出多个地下空洞和异常区域,为城市规划提供了重要依据。 ### 多区域联合测量 系统支持通过`m_area`参数设置多个测点区域。用户可以输入类似"1234"的字符串,表示在四个象限中生成测点。这种功能特别适用于不规则地形或障碍物较多的测量区域。 在某山区地质灾害监测项目中,由于地形复杂,传统测量方法难以实施。通过使用多区域联合测量功能,系统在多个分散的平坦区域生成了测点,成功完成了整个山区的电阻率测量。测量结果为滑坡预警提供了关键数据。 **Section sources** - [MediumCrossHoleGeomative.cpp](file://cpp/ProblemZone/MediumCrossHoleGeomative.cpp#L1-L148) - [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp#L277-L294) ## 与数据可视化模块的集成 3D测量脚本生成系统与数据可视化模块紧密集成,实现了从脚本生成到结果展示的完整工作流程。 `CSptManager`类提供了`Browse2DScript`和`Export3DSConInDB`方法,用于将脚本数据传递给可视化模块。`Browse2DScript`方法创建`CBrowse2DScriptDlg`对话框,该对话框使用`m_BrowseScript`控件显示脚本内容。 `InitBrowse2DView`方法负责初始化浏览视图。该方法从数据库中查询脚本信息,包括电极数量、通道数量、装置类型和电极步长。然后创建`CChannel`对象,并根据装置类型获取对应的`CMedium`对象。 `Browse2DScriptColorChange`方法实现了脚本内容的可视化对比。该方法将数据库中存储的测量记录与脚本生成的测量记录进行匹配,使用不同颜色标识选中的测点。默认情况下,所有测点显示为青色(RGB(150, 255, 255)),选中的测点显示为绿色(RGB(0, 255, 0))。 这种集成方式使得用户能够直观地查看脚本内容,验证测点选择的正确性。在实际应用中,这种可视化功能大大提高了工作效率,减少了因脚本配置错误导致的重复测量。 **Section sources** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L3240-L3588) ## 性能优化建议与最佳实践 为了确保3D测量脚本生成系统的高效运行,以下是一些性能优化建议和最佳实践: ### 数据库优化 1. **索引优化**:为`scon`表的`Sname`和`Stype`字段创建复合索引,可以显著提高脚本名称重复性检查的查询速度。 2. **批量操作**:在插入大量测量记录时,使用事务处理和批量插入,避免逐条插入带来的性能开销。 3. **连接池**:使用数据库连接池管理数据库连接,减少连接建立和关闭的开销。 ### 内存管理 1. **对象重用**:在脚本生成过程中,尽量重用`CSptRecord`对象,避免频繁的内存分配和释放。 2. **数组预分配**:根据预估的测点数量预分配`m_sptRecArray`的大小,避免数组动态扩容带来的性能损失。 3. **及时清理**:在脚本生成完成后,及时清理临时对象和数组,释放内存资源。 ### 算法优化 1. **并行处理**:对于大规模3D脚本生成,可以考虑使用多线程并行处理不同的子脚本区域。 2. **缓存机制**:缓存常用的介质参数和计算结果,避免重复计算。 3. **增量生成**:对于大型测量区域,采用增量生成方式,分批生成和保存测点数据。 ### 用户界面优化 1. **异步操作**:将脚本生成过程放在后台线程中执行,避免界面冻结。 2. **进度反馈**:提供详细的进度反馈,让用户了解脚本生成的进展情况。 3. **预览功能**:提供脚本内容预览功能,让用户在正式生成前确认配置的正确性。 ### 最佳实践 1. **合理规划测量区域**:根据地质条件和测量目标,合理规划测量区域的大小和形状,避免不必要的测点。 2. **选择合适的装置类型**:根据测量深度和分辨率要求,选择合适的装置类型。 3. **定期备份脚本**:定期备份生成的3D脚本,防止数据丢失。 4. **版本控制**:对重要的测量脚本进行版本控制,记录每次修改的内容和原因。 **Section sources** - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L3000-L3193) - [Medium3D.cpp](file://cpp/ProblemZone/Medium3D.cpp#L1-L347) ## 结论 本文档全面阐述了3D测量脚本生成的技术实现,从核心函数`CSptManager::Create3DSConInDB`到`CScript3D`类的三维电极网络管理,再到`Medium3D`及其衍生类的空间坐标计算算法。文档详细描述了3D脚本参数配置界面的用户交互逻辑和数据验证机制,并提供了完整的XML脚本结构示例。 通过分析复杂地质条件下的应用案例,展示了该技术在跨孔电阻率成像、梯度装置测量和多区域联合测量中的实际应用效果。文档还介绍了与数据可视化模块的集成方式,以及性能优化建议和最佳实践。 这些技术实现为地质勘探、环境监测和工程检测等领域提供了强大的工具支持。通过合理应用这些技术和最佳实践,用户可以高效地生成高质量的3D测量脚本,获得准确可靠的地下结构信息。