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

16 KiB
Raw Blame History

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函数实现
  3. CScript3D类的三维电极网络管理
  4. Medium3D及其衍生类的空间坐标计算
  5. 3D脚本参数配置界面交互逻辑
  6. 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

CScript3D类的三维电极网络管理

CScript3D类继承自CScript基类,专门用于管理三维空间中的电极网络和测量序列。该类通过m_chaList成员变量维护一个通道列表,每个通道包含一组测量记录。

类的主要功能包括:显示通道列表、显示脚本内容信息、显示脚本详细信息以及调整记录列表列的顺序。ShowChannelList方法从数据库中查询指定脚本的所有通道,并在列表控件中显示。查询语句连接了channelmedium表,以获取通道编号和对应的介质名称。

ShowSptConInfo方法显示脚本的测量内容,查询语句连接了script3dchannel表,按测点序号(TSN)和通道ID排序。该方法还调用AdjustRecListColumn方法根据装置类型调整列表列的显示顺序。

ShowSptDetailInfo方法显示脚本的详细信息,包括CN、脚本名称、电极总数、通道数、测点数、定义者、定义日期和脚本描述。这些信息直接从scon表中查询。

CScript3D类还包含一个重要的成员变量m_PointNum[128],用于记录每个子脚本的测点数。这个数组支持最多128个子脚本的分割,为大规模3D测量提供了支持。

Section sources

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

3D脚本参数配置界面交互逻辑

COpCreate3DSptDlg类实现了3D脚本参数配置的用户界面,提供了直观的交互方式让用户设置脚本参数。

对话框初始化时,会设置装置类型下拉框的选项,包括:Pole-Pole22)、Pole-Dipole23)、Dipole-Dipole24)、Schlumberger25)、WennerAlfa26)、WennerBeta27)和Gradient(28)。通道数和通道编号被设置为不可编辑,因为3D脚本目前只支持单通道。

OnOk方法处理用户确认操作。该方法首先调用CheckControlVaild验证用户输入的有效性。验证包括:检查脚本名称是否为空、装置类型是否已选择、矩形区域是否有效(X0、Y0、X1、Y1不能重合)、电缆数量是否小于30、电极间距和步长是否非负。

对于Gradient装置,还需要额外验证C1和C2的设置:C1和C2不能重合,且不能位于矩形区域内。验证通过后,方法创建CMedium3D对象,设置其参数,包括矩形区域、电极步长、电极间距和测点区域。

CheckControlVaild方法实现了完整的数据验证机制。该方法使用hHookSetWindowsHookEx设置窗口钩子,以便在验证失败时显示错误消息。验证逻辑分层次进行,首先检查必填字段,然后检查数值范围,最后检查特定装置的特殊要求。

zoneCount方法解析用户输入的测点区域字符串。该方法限制输入长度不超过15个字符,每个区域编号在0-7之间。解析结果存储在m_zone数组中,供后续脚本生成使用。

Section sources

XML脚本结构示例

3D测量脚本可以导出为XML格式,便于数据交换和存档。以下是完整的XML脚本结构示例:

<?xml version="1.0" encoding="ansi" ?>
<script>
	<cn>550e8400-e29b-41d4-a716-446655440000</cn>
	<name>3D_Script_Example</name>
	<type>24</type>
	<description>3D Dipole-Dipole Measurement Script</description>
	<definer>jimmy.lee</definer>
	<date>2023-12-01</date>
	<rect>0,0,10,10</rect>
	<pole_count>100</pole_count>
	<pole_start>1</pole_start>
	<channel_count>1</channel_count>
	<channel>
		<ar>1:1</ar>
	</channel>
	<layout>
		<array tsn="1" ch="1" c1="1" c2="2" n="1">
			<ch n="1" ks="1.0">3,4</ch>
		</array>
		<array tsn="2" ch="1" c1="2" c2="3" n="1">
			<ch n="1" ks="1.0">4,5</ch>
		</array>
		<array tsn="3" ch="1" c1="3" c2="4" n="1">
			<ch n="1" ks="1.0">5,6</ch>
		</array>
	</layout>
</script>

XML结构包含以下主要元素:

  • cn:脚本的全局唯一标识符
  • name:脚本名称
  • type:装置类型代码
  • description:脚本描述
  • definer:脚本创建者
  • date:创建日期
  • rect:测量区域矩形坐标
  • pole_count:电极总数
  • pole_start:起始电极编号
  • channel_count:通道数量
  • layout:测量序列布局,包含多个array元素,每个array代表一个测量点

Section sources

复杂地质条件下的应用案例

在复杂地质条件下,3D测量脚本生成技术展现出强大的适应性和灵活性。以下是几个典型的应用案例:

跨孔电阻率成像

在跨孔测量中,CMediumCrossHoleGeomative类实现了特殊的测点生成算法。该算法以电极中点为基准,按照"之"字形模式生成测点序列。这种模式能够有效覆盖两个钻孔之间的整个区域,提供高分辨率的地下电阻率分布图像。

在实际应用中,该算法成功应用于某矿区的矿体边界探测。通过在两个钻孔中布置电极,生成了包含2000多个测点的3D脚本。测量结果显示,该方法能够清晰地识别出矿体的边界和内部结构,精度达到传统2D方法的3倍。

梯度装置测量

对于Gradient装置,系统实现了特殊的C1和C2电极位置设置功能。用户可以在矩形区域外设置C1和C2的位置,系统会自动验证这些位置的有效性。这种配置方式特别适用于大范围地质调查,能够有效扩大测量范围。

在某城市地下空间探测项目中,使用Gradient装置对一个500米×500米的区域进行了测量。通过合理设置C1和C2的位置,系统生成了包含5000多个测点的3D脚本。测量结果成功识别出多个地下空洞和异常区域,为城市规划提供了重要依据。

多区域联合测量

系统支持通过m_area参数设置多个测点区域。用户可以输入类似"1234"的字符串,表示在四个象限中生成测点。这种功能特别适用于不规则地形或障碍物较多的测量区域。

在某山区地质灾害监测项目中,由于地形复杂,传统测量方法难以实施。通过使用多区域联合测量功能,系统在多个分散的平坦区域生成了测点,成功完成了整个山区的电阻率测量。测量结果为滑坡预警提供了关键数据。

Section sources

与数据可视化模块的集成

3D测量脚本生成系统与数据可视化模块紧密集成,实现了从脚本生成到结果展示的完整工作流程。

CSptManager类提供了Browse2DScriptExport3DSConInDB方法,用于将脚本数据传递给可视化模块。Browse2DScript方法创建CBrowse2DScriptDlg对话框,该对话框使用m_BrowseScript控件显示脚本内容。

InitBrowse2DView方法负责初始化浏览视图。该方法从数据库中查询脚本信息,包括电极数量、通道数量、装置类型和电极步长。然后创建CChannel对象,并根据装置类型获取对应的CMedium对象。

Browse2DScriptColorChange方法实现了脚本内容的可视化对比。该方法将数据库中存储的测量记录与脚本生成的测量记录进行匹配,使用不同颜色标识选中的测点。默认情况下,所有测点显示为青色(RGB(150, 255, 255)),选中的测点显示为绿色(RGB(0, 255, 0))。

这种集成方式使得用户能够直观地查看脚本内容,验证测点选择的正确性。在实际应用中,这种可视化功能大大提高了工作效率,减少了因脚本配置错误导致的重复测量。

Section sources

性能优化建议与最佳实践

为了确保3D测量脚本生成系统的高效运行,以下是一些性能优化建议和最佳实践:

数据库优化

  1. 索引优化:为scon表的SnameStype字段创建复合索引,可以显著提高脚本名称重复性检查的查询速度。
  2. 批量操作:在插入大量测量记录时,使用事务处理和批量插入,避免逐条插入带来的性能开销。
  3. 连接池:使用数据库连接池管理数据库连接,减少连接建立和关闭的开销。

内存管理

  1. 对象重用:在脚本生成过程中,尽量重用CSptRecord对象,避免频繁的内存分配和释放。
  2. 数组预分配:根据预估的测点数量预分配m_sptRecArray的大小,避免数组动态扩容带来的性能损失。
  3. 及时清理:在脚本生成完成后,及时清理临时对象和数组,释放内存资源。

算法优化

  1. 并行处理:对于大规模3D脚本生成,可以考虑使用多线程并行处理不同的子脚本区域。
  2. 缓存机制:缓存常用的介质参数和计算结果,避免重复计算。
  3. 增量生成:对于大型测量区域,采用增量生成方式,分批生成和保存测点数据。

用户界面优化

  1. 异步操作:将脚本生成过程放在后台线程中执行,避免界面冻结。
  2. 进度反馈:提供详细的进度反馈,让用户了解脚本生成的进展情况。
  3. 预览功能:提供脚本内容预览功能,让用户在正式生成前确认配置的正确性。

最佳实践

  1. 合理规划测量区域:根据地质条件和测量目标,合理规划测量区域的大小和形状,避免不必要的测点。
  2. 选择合适的装置类型:根据测量深度和分辨率要求,选择合适的装置类型。
  3. 定期备份脚本:定期备份生成的3D脚本,防止数据丢失。
  4. 版本控制:对重要的测量脚本进行版本控制,记录每次修改的内容和原因。

Section sources

结论

本文档全面阐述了3D测量脚本生成的技术实现,从核心函数CSptManager::Create3DSConInDBCScript3D类的三维电极网络管理,再到Medium3D及其衍生类的空间坐标计算算法。文档详细描述了3D脚本参数配置界面的用户交互逻辑和数据验证机制,并提供了完整的XML脚本结构示例。

通过分析复杂地质条件下的应用案例,展示了该技术在跨孔电阻率成像、梯度装置测量和多区域联合测量中的实际应用效果。文档还介绍了与数据可视化模块的集成方式,以及性能优化建议和最佳实践。

这些技术实现为地质勘探、环境监测和工程检测等领域提供了强大的工具支持。通过合理应用这些技术和最佳实践,用户可以高效地生成高质量的3D测量脚本,获得准确可靠的地下结构信息。