# 脚本数据模型 **本文档中引用的文件** - [database_modify.xml](file://database_modify.xml) - [config.ini](file://config.ini) - [Script.h](file://h/Script.h) - [Script2D.h](file://h/Script2D.h) - [Script3D.h](file://h/Script3D.h) - [ScriptCE.h](file://h/ScriptCE.h) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概述](#架构概述) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 引言 本文档旨在全面阐述Geomative Studio中2D/3D/CE测量脚本的数据模型设计,重点分析`td2dcon`、`td3dcon`、`td1dcon`等表的结构设计,以及`bUse`字段在记录有效性管理中的设计意图与实现方式。同时,深入解析SCON表中`Rect`、`RectLoc`、`PoleDistance`等字段在跨孔测量中的作用,阐明脚本生成过程中的数据访问模式、约束条件及`SkipCable`、`IsAutoGenerate`等字段的业务逻辑。 ## 项目结构 Geomative Studio项目采用典型的C++/MFC架构,其核心功能围绕地质测量脚本的生成、管理和执行。项目结构清晰地划分为`cpp`(源代码)、`h`(头文件)、`DB`(数据库相关)、`Install`(安装配置)等目录。脚本相关的数据模型和业务逻辑主要集中在`cpp/Managers`和`cpp/Operator`目录下的`TdManager.cpp`、`DataOperator.cpp`等文件中,而数据结构定义则位于`h`目录下的`Script*.h`系列头文件。 ```mermaid graph TB subgraph "核心模块" Script[脚本管理] Data[数据操作] Task[任务执行] end subgraph "数据层" DB[(数据库)] Config[配置文件] end Script --> Data Data --> DB Task --> Script Task --> Data Config --> Script Config --> Task ``` **图示来源** - [database_modify.xml](file://database_modify.xml) - [config.ini](file://config.ini) **本节来源** - [database_modify.xml](file://database_modify.xml#L1-L25) - [config.ini](file://config.ini#L1-L73) ## 核心组件 本系统的核心组件围绕测量脚本(Script)的生命周期管理展开。`CScript`基类定义了所有脚本的通用属性和接口,而`CScript2D`、`CScript3D`、`CScriptCE`等派生类则分别实现了二维、三维和电容耦合(CE)测量脚本的特定功能。`TdManager`类负责将脚本配置转化为具体的测量任务,并管理任务数据的生成与存储。`DataOperator`类则提供了对数据库中测量记录的直接操作能力,如启用/禁用特定记录。 **本节来源** - [Script.h](file://h/Script.h#L1-L39) - [Script2D.h](file://h/Script2D.h#L1-L32) - [Script3D.h](file://h/Script3D.h#L1-L43) - [ScriptCE.h](file://h/ScriptCE.h#L1-L28) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869) ## 架构概述 系统采用分层架构,上层为用户界面,中层为业务逻辑处理(Manager和Operator),底层为数据存储(数据库)。脚本数据模型是连接业务逻辑与数据存储的核心。当用户创建一个测量任务时,系统会根据选择的测量类型(2D/3D/CE)实例化相应的脚本类,生成具体的测量序列,并将这些序列作为记录插入到`td2dcon`、`td3dcon`或`td1dcon`等结果表中。`bUse`字段在此过程中起到关键的过滤作用,确保只有有效的测量序列被实际执行。 ```mermaid graph LR UI[用户界面] --> BL[业务逻辑层] BL --> DL[数据层] subgraph 业务逻辑层 SptMng[脚本管理器] TdMng[任务管理器] DataOp[数据操作器] end subgraph 数据层 DB[(数据库)] end SptMng --> TdMng TdMng --> DataOp DataOp --> DB TdMng --> DB ``` **图示来源** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869) ## 详细组件分析 ### 脚本数据表结构分析 系统为不同类型的测量任务设计了专用的结果表,以存储测量配置和结果。这些表包括`td2dcon`(二维测量)、`td3dcon`(三维测量)和`td1dcon`(一维测量)。这些表的结构高度相似,均包含电极配置(如`C1`, `C2`, `P1`, `P2`或`a`, `b`, `x`, `y`)、几何因子`K`、测量值`V`, `I`、视电阻率`R0`以及关键的`bUse`字段。 #### bUse字段的设计意图与实现 `bUse`字段(类型为Yes/No)是标记记录有效性的核心机制。其设计意图在于提供一种灵活的“软删除”或“临时禁用”功能,允许用户在不删除原始数据的情况下,排除某些测量序列。例如,当某个电极被确认为故障时,可以批量更新所有涉及该电极的记录的`bUse`字段为`false`,从而在后续的数据处理和成图中忽略这些无效数据。 该字段的实现主要通过`DataOperator`类中的SQL更新语句完成。例如,在`DataOperator.cpp`中,存在多个`update td*con set bUse = false`的语句,用于根据电极编号或测点坐标批量禁用记录。这表明`bUse`字段是数据质量控制流程中的关键一环。 ```mermaid flowchart TD Start([开始]) --> CheckElectrode["检查电极状态"] CheckElectrode --> Faulty{"电极故障?"} Faulty --> |是| UpdateDB["更新数据库: bUse = false"] Faulty --> |否| KeepActive["保持 bUse = true"] UpdateDB --> End([结束]) KeepActive --> End ``` **图示来源** - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L3978-L4205) **本节来源** - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L3978-L4205) ### SCON表字段在跨孔测量中的作用 虽然`database_modify.xml`中未直接定义SCON表,但从`TdManager.cpp`的SQL语句中可以推断出其存在及部分字段。`Clayout`(电缆布局)、`SkipCable`(跳过电缆)、`rect`(矩形区域)、`rect_loc`(矩形位置)等字段是配置跨孔测量的关键参数。 - **`rect` 和 `rect_loc`**: 这两个字段共同定义了跨孔测量的几何范围。`rect`可能表示矩形的尺寸(如长宽),而`rect_loc`则指定了该矩形在三维空间中的具体位置(如中心坐标或角点坐标)。它们为生成孔间测量的电极组合提供了空间约束。 - **`PoleDistance`**: 虽然在代码中未直接出现,但根据命名惯例,它很可能存储了电极之间的间距,这是计算几何因子`K`的基础。 - **`SkipCable`**: 此字段用于标记在测量过程中需要跳过的电缆。在复杂的多电缆系统中,某些电缆可能因损坏或维护而暂时不可用。`SkipCable`字段允许系统在生成测量序列时自动排除这些电缆上的电极,确保测量计划的可行性。 ```mermaid classDiagram class SCON { +int Clayout +int SkipCable +float CRTime +float Edistance +string rect +string rect_loc +int DESN +datetime STime +datetime ETime } class td2dcon { +int TCHID +int TSN +int C1 +int C2 +int P1 +int P2 +int N +float K +float I +float V +float R0 +float SP +bool bUse } SCON --> td2dcon : "生成" ``` **图示来源** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2981-L3000) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L337-L343) **本节来源** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2891-L3000) - [TaskDataOper.cpp](file://cpp/Operator/TaskDataOper.cpp#L181-L343) ## 依赖分析 系统的数据模型依赖于一个关系型数据库(从SQL语句推断,可能为Access或SQLite)。`td*con`系列表通过`TCHID`(通道ID)与`tdchannel`表关联,而`tdchannel`又通过`TDID`(任务ID)与更高层级的任务表关联,形成了清晰的层级依赖关系。此外,`Script*.h`头文件定义了数据结构,被`TdManager.cpp`和`DataOperator.cpp`等实现文件所依赖,体现了代码层面的依赖。 ```mermaid erDiagram SCON ||--o{ td2dcon : "生成" SCON ||--o{ td3dcon : "生成" SCON ||--o{ td1dcon : "生成" tdchannel ||--o{ td2dcon : "包含" tdchannel ||--o{ td3dcon : "包含" tdchannel ||--o{ td1dcon : "包含" TASK ||--o{ tdchannel : "包含" SCON { int Clayout int SkipCable string rect string rect_loc } td2dcon { int TCHID PK, FK int TSN PK int C1 int C2 int P1 int P2 bool bUse } tdchannel { int ID PK int TDID FK } ``` **图示来源** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1299-L1496) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L3869) **本节来源** - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L1299-L5796) - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779) ## 性能考虑 脚本数据模型的设计对性能有重要影响。`bUse`字段的使用避免了物理删除大量记录,减少了I/O开销。然而,频繁地更新`bUse`字段(如批量禁用)可能会产生大量的数据库写操作。为优化性能,建议在应用层进行批量操作,减少数据库事务的提交次数。此外,`td*con`表上的`TCHID`和`TSN`字段应建立索引,以加速按通道和序列号的查询。 ## 故障排除指南 当遇到测量数据异常时,应首先检查`bUse`字段的状态。如果预期的测量序列未被执行,可能是其`bUse`字段被错误地设置为`false`。可以通过查询`td*con`表中`bUse = false`的记录来定位问题。对于跨孔测量失败的情况,应检查`SCON`表中的`SkipCable`和`rect`/`rect_loc`配置是否正确,确保测量范围和电缆布局符合现场实际情况。 **本节来源** - [DataOperator.cpp](file://cpp/Operator/DataOperator.cpp#L3773-L4779) - [TdManager.cpp](file://cpp/Managers/TdManager.cpp#L2891-L3000) ## 结论 Geomative Studio的脚本数据模型设计精巧,通过`td2dcon`、`td3dcon`、`td1dcon`等专用表实现了对不同类型测量任务的有效管理。`bUse`字段作为记录有效性的开关,为数据质量控制提供了极大的灵活性。`SCON`表中的`rect`、`rect_loc`和`SkipCable`等字段则是实现复杂跨孔测量配置的关键。理解这些数据结构和字段的业务逻辑,对于正确使用系统、分析测量数据以及进行故障排除至关重要。