# 3D项目创建 **本文引用的文件** - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp) - [DialNew3DTask.h](file://h/DialNew3DTask.h) - [TaskDataOper.h](file://h/TaskDataOper.h) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) - [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp) - [DialCreateNew3DSpt.cpp](file://cpp/Views/DialCreateNew3DSpt.cpp) - [DialCreateNew3DSpt.h](file://h/DialCreateNew3DSpt.h) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp) - [GeoMative.rc](file://GeoMative.rc) - [Resource.h](file://Resource.h) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件系统性地文档化Geomative Studio中“3D项目创建”流程,重点覆盖: - 三维网格信息(X/Y方向电极数量、电极步长、电极间距等)的配置与来源 - DialNew3DTask对话框如何基于选定的测试脚本自动计算并展示网格尺寸信息 - 三维测量中电缆布线方式的特殊要求与适配 - 发射周期、迭代次数等通用参数的继承与适配策略 - 三维测量任务参数结构体(ST3DTaskParam)与数据库存储的映射关系 - 任务创建成功后的ID返回机制 ## 项目结构 围绕3D项目创建的关键文件组织如下: - 视图层:DialNew3DTask(3D任务创建对话框)、DialCreateNew3DSpt(3D脚本创建对话框) - 操作层:TaskDataOper(任务数据操作,含Create3DTask) - 脚本层:Script3D(脚本信息查询与展示) - 资源与控件:GeoMative.rc、Resource.h(包含3D相关控件ID) ```mermaid graph TB subgraph "视图层" DNT["DialNew3DTask
3D任务创建对话框"] DCNS["DialCreateNew3DSpt
3D脚本创建对话框"] end subgraph "操作层" TDO["CTaskDataOper
任务数据操作"] end subgraph "脚本层" S3D["CScript3D
脚本信息查询"] end subgraph "资源与控件" RC["GeoMative.rc
资源定义"] RH["Resource.h
控件ID常量"] end DNT --> TDO DCNS --> S3D DNT --> RC DNT --> RH DCNS --> RC DCNS --> RH ``` 图表来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L1-L120) - [DialCreateNew3DSpt.cpp](file://cpp/Views/DialCreateNew3DSpt.cpp#L1-L120) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789) 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L1-L120) - [DialCreateNew3DSpt.cpp](file://cpp/Views/DialCreateNew3DSpt.cpp#L1-L120) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789) ## 核心组件 - DialNew3DTask:负责3D任务创建的用户交互,包括测试方式、装置类型、脚本选择、电缆布线方式、发射周期、采样间隔、迭代次数等,并将参数封装为ST3DTaskParam后交由CTaskDataOper执行创建。 - CTaskDataOper:提供Create3DTask接口,完成数据库插入、生成任务ID、写入td与tdchannel表、导入脚本点位信息等。 - CScript3D:提供脚本查询能力,用于获取脚本的Rect、PoleStep、PoleDistance、LineDirection等网格与布线相关信息。 - DialCreateNew3DSpt:3D脚本创建对话框,承载X/Y网格大小、电极间距、迭代数、电缆方向等输入与绘制预览。 - 资源与控件:通过GeoMative.rc与Resource.h定义3D相关控件ID,确保UI一致性。 章节来源 - [DialNew3DTask.h](file://h/DialNew3DTask.h#L1-L51) - [TaskDataOper.h](file://h/TaskDataOper.h#L85-L112) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) - [DialCreateNew3DSpt.h](file://h/DialCreateNew3DSpt.h#L83-L108) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789) ## 架构总览 下图展示了3D任务创建从UI到数据库的端到端流程。 ```mermaid sequenceDiagram participant 用户 as "用户" participant DNT as "DialNew3DTask" participant TDO as "CTaskDataOper" participant DB as "数据库" participant S3D as "CScript3D" 用户->>DNT : 选择测试方式/装置/脚本/布线方式/周期/采样间隔/迭代次数 DNT->>S3D : 查询脚本网格信息(Rect/PoleStep/PoleDistance/LineDirection) S3D-->>DNT : 返回网格尺寸与步长/间距/方向 DNT->>DNT : 自动计算并显示网格信息 DNT->>TDO : Create3DTask(ST3DTaskParam, TaskCN) TDO->>DB : 插入td表(含Rect/RectLoc/Espace/Edistance/Clayout等) TDO->>DB : 插入tdchannel表 TDO->>DB : 批量导入脚本3D点位到td3dcon TDO-->>DNT : 返回新任务ID DNT-->>用户 : 创建成功并返回任务ID ``` 图表来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) ## 详细组件分析 ### DialNew3DTask:3D任务创建对话框 - 功能要点 - 测试方式、装置类型、脚本、布线方式、发射周期、采样间隔、迭代次数等参数收集 - 基于脚本查询自动填充网格尺寸(X/Y方向电极数量、步长、间距、方向) - 将参数封装为ST3DTaskParam并调用CTaskDataOper::Create3DTask - 成功后返回新任务ID并在任务管理器中使用 - 关键逻辑路径 - 脚本选择事件:OnSelchangeCombo3dScript - 通过QuerySptRectByARandSCname获取Rect、PoleStep、PoleDistance、LineDirection - 解析并填充m_rcGridSize、m_fXElecStep、m_fYElecStep、m_fXElecDistance、m_fYElecDistance、m_byLineDirection - 更新界面显示网络尺寸(X: right+1, Y: bottom+1) - OK事件:OnOK - 参数校验(步长、任务名、测试方式、布线方式、迭代次数、发射周期、采样间隔) - 组装ST3DTaskParam并调用Create3DTask - 记录新任务ID并返回 - 三维网格参数映射 - X/Y方向电极数量:来自Rect解析后的right、bottom加一 - 电极步长:来自PoleStep(X、Y方向) - 电极间距:来自PoleDistance(X、Y方向) - 测线方向:来自LineDirection(0:X方向,1:Y方向) 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L411-L569) - [DialNew3DTask.h](file://h/DialNew3DTask.h#L1-L51) ### CTaskDataOper:3D任务创建与数据库映射 - Create3DTask流程 - 查询脚本基础信息(Eamount、TPamount、Rect、RectLoc、PoleStep、PoleDistance、CN、LineDirection) - 生成任务CN并开启事务 - 插入td表(含TDname、TDCN、Tlocation、TZID、SCID、SCCN、Sname、Stype、Ttype、Eamount、TPamount、CHamount、N、TRwave、TRfrequency、SAfrequency、Clayout、SkipCable、Espace、Edistance、rect、rect_loc、Cdate、Ctime、DESN、STime、ETime、TTimer、TdStatus、TestGRFlag、LineDirection、CreateTime) - 插入tdchannel表(TDID、CHnumber、AR) - 批量导入脚本3D点位到td3dcon - 提交事务并返回任务ID - 数据库字段与ST3DTaskParam映射要点 - ST3DTaskParam中的iSptID、iSptType、iTestType、iAR、iCableLayout、iStacking、iTxWave、iTxPeriod、iSAInterval、ucTestGRFlag等直接映射到td表对应字段 - 脚本查询返回的Rect、PoleStep、PoleDistance、LineDirection写入td表的rect、rect_loc、Espace、Edistance、LineDirection - 任务ID通过查询td表最大ID返回 章节来源 - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [TaskDataOper.h](file://h/TaskDataOper.h#L85-L112) ### DialCreateNew3DSpt:3D脚本创建与网格输入 - 功能要点 - 输入X/Y网格大小、电极间距、迭代数、电缆方向等 - 初始化绘图板,根据输入更新X/Y电极数量、间距,并重绘 - 支持不同测量方法与装置类型的组合显示 - 关键参数 - m_uiXGridSize、m_uiYGridSize:X/Y方向电极数量 - m_fXPoleDistance、m_fYPoleDistance:X/Y方向电极间距 - m_uiIterationNumber:迭代次数 - m_comCableDirection:电缆方向(X或Y) 章节来源 - [DialCreateNew3DSpt.cpp](file://cpp/Views/DialCreateNew3DSpt.cpp#L1-L200) - [DialCreateNew3DSpt.cpp](file://cpp/Views/DialCreateNew3DSpt.cpp#L957-L966) - [DialCreateNew3DSpt.h](file://h/DialCreateNew3DSpt.h#L83-L108) ### 3D脚本信息查询(CScript3D) - 作用:提供脚本Rect、PoleStep、PoleDistance、LineDirection等信息,供DialNew3DTask自动计算网格尺寸 - 影响:直接影响DialNew3DTask对话框中网格尺寸的显示与验证 章节来源 - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) ### 3D任务参数结构体(ST3DTaskParam)与数据库映射 - 结构体字段(节选) - strTDName、strTestPlace、iTestType、iCableLayout、iAR、iSptID、strSptName、iSptType、iSkipCable、iStacking、iTxWave、iTxPeriod、iSAInterval、ucTestGRFlag - 数据库存储映射 - td表字段与ST3DTaskParam字段一一对应,包括但不限于:Ttype、Clayout、N、TRwave、TRfrequency、SAfrequency、Espace、Edistance、rect、rect_loc、LineDirection、TestGRFlag、CreateTime等 - 任务ID返回 - 通过查询td表的最大ID返回新任务ID 章节来源 - [TaskDataOper.h](file://h/TaskDataOper.h#L85-L112) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) ### DialTaskManager:参数继承与适配 - 在任务类型选择为3D时,DialTaskManager从DialNew3DTask读取参数并写入任务参数结构 - 关键参数继承 - 测试类型、发射周期、脚本ID、装置类型、布线方式、采样间隔、迭代次数 - 三维特有的电极步长、电极间距、网格尺寸、测线方向也从DialNew3DTask传递 章节来源 - [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp#L300-L341) ## 依赖分析 - DialNew3DTask依赖TaskDataOper进行脚本查询与任务创建 - TaskDataOper依赖数据库连接与ADO Recordset进行数据持久化 - DialCreateNew3DSpt与DialNew3DTask共同影响最终的网格与布线参数 - 资源文件GeoMative.rc与Resource.h为3D相关控件提供ID与布局 ```mermaid graph LR DNT["DialNew3DTask"] --> TDO["CTaskDataOper"] DNT --> S3D["CScript3D"] DCNS["DialCreateNew3DSpt"] --> DNT TDO --> DB["数据库"] RC["GeoMative.rc"] --> DNT RH["Resource.h"] --> DNT ``` 图表来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789) 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) - [Script3D.cpp](file://cpp/ProblemZone/Script3D.cpp#L1-L120) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789) ## 性能考量 - 脚本查询与数据库访问 - DialNew3DTask在脚本切换时进行一次脚本信息查询,建议避免频繁重复查询 - TaskDataOper在Create3DTask中使用事务,减少多次提交带来的开销 - 网格尺寸计算 - 仅基于脚本返回的Rect/PoleStep/PoleDistance/LineDirection进行简单解析与显示,复杂度低 - UI更新 - DialCreateNew3DSpt在参数变化时触发重绘,建议在大量参数变更时合并更新以降低刷新频率 [本节为通用指导,无需特定文件引用] ## 故障排查指南 - 步长为空或格式错误 - 现象:OnOK中对步长进行非空与范围校验,若为空或越界会弹窗提示 - 处理:检查脚本PoleStep格式(X,Y),确保输入合法 - 任务名为空 - 现象:必填项校验失败 - 处理:填写任务名称后重试 - 测试方式/布线方式/脚本未选择 - 现象:必选项未选择导致校验失败 - 处理:按提示选择相应项 - 迭代次数越界 - 现象:范围校验失败 - 处理:将迭代次数调整至1~255范围内 - 发射周期未选择(电阻率/激电) - 现象:测试方式切换时周期控件启用状态变化 - 处理:根据当前测试方式正确选择周期 - 采样间隔越界 - 现象:范围校验失败 - 处理:将采样间隔调整至0~30000范围内 - 任务创建失败 - 现象:Create3DTask返回负值 - 处理:检查数据库连接、事务回滚日志,确认脚本ID有效且数据库权限正常 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L411-L569) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L549-L748) ## 结论 - 3D项目创建流程以DialNew3DTask为核心入口,结合脚本查询自动填充网格尺寸,确保X/Y方向电极数量、步长、间距与测线方向的一致性 - 电缆布线方式在不同测试方式下进行过滤与适配,保证三维测量的可行性 - 通用参数(发射周期、采样间隔、迭代次数)在对话框中进行严格校验,并在任务管理器中继承到最终任务参数 - ST3DTaskParam与数据库字段映射清晰,Create3DTask通过事务保障数据一致性,返回新任务ID供后续使用 [本节为总结,无需特定文件引用] ## 附录 ### 3D网格参数与UI控件对照 - X方向电极数量:来自Rect解析后的right+1 - Y方向电极数量:来自Rect解析后的bottom+1 - X方向电极步长:来自PoleStep的X分量 - Y方向电极步长:来自PoleStep的Y分量 - X方向电极间距:来自PoleDistance的X分量 - Y方向电极间距:来自PoleDistance的Y分量 - 测线方向:来自LineDirection(0:X方向,1:Y方向) - 电缆方向:COMBOBOX控件(X或Y) 章节来源 - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp#L216-L306) - [GeoMative.rc](file://GeoMative.rc#L1662-L1681) - [Resource.h](file://Resource.h#L759-L789)