a
This commit is contained in:
@@ -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`等字段则是实现复杂跨孔测量配置的关键。理解这些数据结构和字段的业务逻辑,对于正确使用系统、分析测量数据以及进行故障排除至关重要。
|
||||
Reference in New Issue
Block a user