This commit is contained in:
coco
2026-07-03 16:05:30 +08:00
commit df489d5640
1101 changed files with 779140 additions and 0 deletions
@@ -0,0 +1,222 @@
# 脚本数据模型
<cite>
**本文档中引用的文件**
- [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)
</cite>
## 目录
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`等字段则是实现复杂跨孔测量配置的关键。理解这些数据结构和字段的业务逻辑,对于正确使用系统、分析测量数据以及进行故障排除至关重要。