a
This commit is contained in:
@@ -0,0 +1,305 @@
|
||||
# Device数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本项目GeomativeStudio是一个用于地质勘探设备管理的应用程序,其核心功能围绕设备管理展开。系统通过Device类来封装和管理各种设备(如GD10)的属性和行为,包括设备型号、固件版本、通信端口、设备状态及硬件参数配置等。Device类通过DevManager进行统一管理,并与底层驱动(如stmcdc.inf)和通信协议(CtrlProtocolDef.h)交互。设备检测逻辑在DetcGD10Dev.cpp中实现,负责识别设备并进行状态轮询。设备参数的持久化存储与config.ini文件联动,确保配置信息的持久性。在设备热插拔和通信异常时,系统具备相应的错误处理策略,保证了系统的稳定性和可靠性。
|
||||
|
||||
## 项目结构
|
||||
项目结构清晰地组织了各个模块,便于维护和扩展。核心代码位于`cpp`目录下,分为多个子目录,如`Managers`、`Operator`、`ProblemZone`等,分别处理不同的业务逻辑。头文件位于`h`目录下,定义了类和结构体。安装文件和配置文件位于`Install`目录下,其中`config.ini`文件用于存储用户配置信息。日志文件位于`LOG`目录下,记录系统运行时的信息。数据库相关文件位于`DB`目录下,管理设备和任务数据。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "核心代码"
|
||||
A[cpp] --> B[Managers]
|
||||
A --> C[Operator]
|
||||
A --> D[ProblemZone]
|
||||
end
|
||||
subgraph "头文件"
|
||||
E[h] --> F[Device.h]
|
||||
E --> G[DevManager.h]
|
||||
E --> H[CtrlProtocolDef.h]
|
||||
end
|
||||
subgraph "资源文件"
|
||||
I[Install] --> J[config.ini]
|
||||
I --> K[stmcdc.inf]
|
||||
end
|
||||
subgraph "日志"
|
||||
L[LOG] --> M[detect_gd20_log.txt]
|
||||
end
|
||||
A --> E
|
||||
A --> I
|
||||
A --> L
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini)
|
||||
|
||||
**Section sources**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini)
|
||||
|
||||
## 核心组件
|
||||
Device类是设备管理的核心,封装了设备的各种属性和方法。它通过DevManager进行统一管理,实现了设备的注册、注销、参数修改等功能。Device类还负责与底层驱动和通信协议交互,确保设备的正常运行。
|
||||
|
||||
**Section sources**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
|
||||
|
||||
## 架构概述
|
||||
系统架构采用分层设计,上层为UI层,中间为业务逻辑层,底层为设备驱动层。DevManager作为业务逻辑层的核心,负责管理所有设备实例。Device类通过SComPort类与设备进行通信,使用Zmodem协议进行文件传输。CtrlProtocolDef.h定义了通信协议,确保数据的正确传输。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[UI层] --> B[业务逻辑层]
|
||||
B --> C[设备驱动层]
|
||||
B --> D[DevManager]
|
||||
D --> E[Device]
|
||||
E --> F[SComPort]
|
||||
F --> G[设备]
|
||||
H[CtrlProtocolDef.h] --> F
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
- [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h)
|
||||
|
||||
## 详细组件分析
|
||||
### Device类分析
|
||||
Device类封装了设备的各种属性,如设备型号(GD10)、固件版本、通信端口(串口/USB)、设备状态(在线/离线/故障)及硬件参数配置。通过GetDevInfo方法,可以从设备获取这些信息并更新到数据库中。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDevice {
|
||||
+DWORD m_dwID
|
||||
+UINT m_uState
|
||||
+UINT m_uType
|
||||
+BYTE m_ucDevType
|
||||
+CSComPort m_sComPort
|
||||
+CString m_szDevSN
|
||||
+CString m_szDevName
|
||||
+CString m_szModelNO
|
||||
+CString m_szMDate
|
||||
+CString m_szHWV
|
||||
+CString m_szSWV
|
||||
+CString m_szMBatch
|
||||
+CString m_szMacAddress
|
||||
+_ConnectionPtr m_pConnection
|
||||
+FILE* m_pLogFile
|
||||
+CDevice(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CDevice()
|
||||
+void SetState(UINT uState)
|
||||
+void SetID(DWORD dwID)
|
||||
+BOOL Reset()
|
||||
+BOOL GetDevInfo()
|
||||
+BOOL GetGRInfo()
|
||||
+bool ShowFLDetailInfo(CListCtrl& devDetailList)
|
||||
+bool ShowOLDetailInfo(CListCtrl& devDetailList)
|
||||
+bool ShowGRInfo(CListCtrl& devGRList)
|
||||
+bool ShowACInfo(CListCtrl& devDetailList)
|
||||
+BOOL ModifyParameter()
|
||||
+BOOL ShowCableHeadInfoDlg()
|
||||
+BOOL IsTheNumofPoleChanged()
|
||||
+BOOL TestGRForPerPole(int iSN, CStringArray& strResArray)
|
||||
+BOOL TestGRForAllPole()
|
||||
+void PrintLog(CString& strLog)
|
||||
+int IsExistOtherUserData()
|
||||
+int CheckGD10Password(CString strGD10Password)
|
||||
+BOOL EndTransfer()
|
||||
+UINT32 GetXmlMaxTestPoint(int iSubIndex, CString strPrCN, CString strTzCN, CString strXmlFile)
|
||||
}
|
||||
class CSComPort {
|
||||
+HANDLE m_hCom
|
||||
+HWND m_hOwnerWnd
|
||||
+long m_lCommID
|
||||
+CString m_szComName
|
||||
+DCB m_dcbBlock
|
||||
+FILE* m_Log
|
||||
+CSComPort()
|
||||
+CSComPort(HWND hOwnerWnd, long lCommID)
|
||||
+~CSComPort()
|
||||
+BOOL OpenComm(CString szComName)
|
||||
+void CloseComm()
|
||||
+BOOL SendDataDirectly(char* pDataBuff, int iDataSize)
|
||||
+BOOL ReceiveDataDirectly(char* pDataBuff, int* iDataSize)
|
||||
+BOOL ZmodemReceiveDataDirectly(char* pDataBuff, int* iDataSize)
|
||||
+BOOL ZmodemSendDataDirectly(char* pDataBuff, int iDataSize)
|
||||
+void ClearCommReceiveBuff()
|
||||
+void ClearCommSendBuff()
|
||||
+BOOL ExecuteOrder(CString strOrder, CString strSign, CString* pStrResult, int nRepeatCnt=3)
|
||||
+BOOL ExecuteSignleOrder(CString f_szOrder, CString f_szSign, CString* f_szResult)
|
||||
+BOOL ExecuteNoResOrder(CString f_szOrder)
|
||||
}
|
||||
CDevice --> CSComPort : "uses"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
|
||||
**Section sources**
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
|
||||
|
||||
### DevManager类分析
|
||||
DevManager类负责管理所有设备实例,提供设备的增删改查功能。它通过m_devLinkList链表存储设备实例,并通过m_handleProcessor生成设备句柄。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDevManager {
|
||||
+CLinkList<CDevice*> m_devLinkList
|
||||
+_ConnectionPtr m_pConnection
|
||||
+std : : set<STSigRemoteDev> m_setRemoteDev
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+CDevManager(_ConnectionPtr& pConnection)
|
||||
+~CDevManager()
|
||||
+CDevice* GetDeviceByID(DWORD dwDevID)
|
||||
+CDevice* GetDevice(DWORD dwHandle)
|
||||
+CDevice* GetDevice(CString szDevSN)
|
||||
+void InitialDevLinkList()
|
||||
+BOOL AddDevice(CDevice* const pDev)
|
||||
+void DeleteObjInMem(DWORD dwHandle)
|
||||
+void DeleteObjInMem(CString szDevSN)
|
||||
+void AddObjInMem(CString szDevSN)
|
||||
+void AddOfflineObjInMem(CString szDevSN)
|
||||
+BOOL DeleteDevice(DWORD dwHandle)
|
||||
+BOOL DeleteDevice(CString strDev)
|
||||
+BOOL GetOLDevList(CPtrArray* pOLDevList)
|
||||
+BOOL GetFLDevList(CPtrArray* pFLDevList)
|
||||
+void UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp)
|
||||
+BOOL SetDeviceHandle(CDevice* const pDev)
|
||||
+CDevice* GetRegisterDevice(CString szDevSN, bool& bIsRegister)
|
||||
+void DeleteRemoteDevice(STSigRemoteDev stDevice)
|
||||
+void AddRemoteDevice(STSigRemoteDev stDevice)
|
||||
+std : : set<STSigRemoteDev> GetRemoteDeviceInfo()
|
||||
}
|
||||
class CDevice {
|
||||
+DWORD m_dwID
|
||||
+UINT m_uState
|
||||
+UINT m_uType
|
||||
+BYTE m_ucDevType
|
||||
+CSComPort m_sComPort
|
||||
+CString m_szDevSN
|
||||
+CString m_szDevName
|
||||
+CString m_szModelNO
|
||||
+CString m_szMDate
|
||||
+CString m_szHWV
|
||||
+CString m_szSWV
|
||||
+CString m_szMBatch
|
||||
+CString m_szMacAddress
|
||||
+_ConnectionPtr m_pConnection
|
||||
+FILE* m_pLogFile
|
||||
}
|
||||
CDevManager --> CDevice : "manages"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
|
||||
**Section sources**
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
|
||||
### DetcGD10Dev类分析
|
||||
DetcGD10Dev类负责检测GD10设备,通过USB接口查找设备并建立连接。它使用FindUsbDevice方法遍历所有可移动驱动器,通过卷标名或特定目录结构来识别设备。
|
||||
|
||||
#### 序列图
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant DetcGD10Dev as "CDetcGD10Dev"
|
||||
participant System as "系统"
|
||||
User->>DetcGD10Dev : DetectGD10Dev()
|
||||
DetcGD10Dev->>System : GetLogicalDriveStrings()
|
||||
System-->>DetcGD10Dev : 驱动器列表
|
||||
loop 每个驱动器
|
||||
DetcGD10Dev->>System : GetDriveType()
|
||||
alt 可移动驱动器
|
||||
DetcGD10Dev->>System : GetVolumeInformation()
|
||||
System-->>DetcGD10Dev : 卷标名
|
||||
alt 卷标名匹配
|
||||
DetcGD10Dev-->>User : 找到设备
|
||||
break
|
||||
else 目录结构匹配
|
||||
DetcGD10Dev->>System : _stat()
|
||||
System-->>DetcGD10Dev : 目录存在
|
||||
DetcGD10Dev-->>User : 找到设备
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
alt 未找到设备
|
||||
DetcGD10Dev-->>User : 未找到设备
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
|
||||
## 依赖分析
|
||||
系统依赖于多个外部组件,包括数据库连接、串口通信、文件操作等。DevManager依赖于Device类,Device类依赖于SComPort类进行通信,SComPort类依赖于Windows API进行串口操作。此外,系统还依赖于Zmodem协议进行文件传输。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[DevManager] --> B[Device]
|
||||
B --> C[SComPort]
|
||||
C --> D[Windows API]
|
||||
B --> E[Zmodem]
|
||||
A --> F[数据库]
|
||||
G[DetcGD10Dev] --> H[Windows API]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
|
||||
**Section sources**
|
||||
- [DevManager.h](file://h/DevManager.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [SComPort.h](file://h/SComPort.h)
|
||||
|
||||
## 性能考虑
|
||||
系统在设计时考虑了性能优化,如使用链表存储设备实例,减少内存分配开销;使用异步通信避免阻塞主线程;使用缓存减少数据库查询次数。此外,系统还实现了错误重试机制,提高通信的可靠性。
|
||||
|
||||
## 故障排除指南
|
||||
当设备无法连接时,首先检查USB线缆是否连接正常,设备是否上电。然后检查设备的卷标名是否正确,或是否存在特定目录结构。如果问题仍然存在,可以查看日志文件detect_gd20_log.txt,获取详细的错误信息。对于通信异常,可以尝试重启设备或重新插拔USB线缆。
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [Install/Geomative Studio/LOG/detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt)
|
||||
|
||||
## 结论
|
||||
通过深入分析Device类及其相关组件,我们了解了GeomativeStudio项目中设备管理的核心机制。Device类通过封装设备属性和方法,实现了对设备的全面管理。DevManager类提供了统一的管理接口,确保了设备实例的一致性和完整性。DetcGD10Dev类实现了设备检测功能,保证了设备的自动识别和连接。整个系统设计合理,层次分明,具有良好的可维护性和扩展性。
|
||||
@@ -0,0 +1,249 @@
|
||||
# Medium测量模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Medium.cpp](file://cpp\ProblemZone\Medium.cpp)
|
||||
- [MediumA.cpp](file://cpp\ProblemZone\MediumA.cpp)
|
||||
- [MediumB.cpp](file://cpp\ProblemZone\MediumB.cpp)
|
||||
- [MediumC.cpp](file://cpp\ProblemZone\MediumC.cpp)
|
||||
- [MediumD.cpp](file://cpp\ProblemZone\MediumD.cpp)
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp)
|
||||
- [MediumCustom2D.cpp](file://cpp\ProblemZone\MediumCustom2D.cpp)
|
||||
- [MediumZ.cpp](file://cpp\ProblemZone\MediumZ.cpp)
|
||||
- [MediumY.cpp](file://cpp\ProblemZone\MediumY.cpp)
|
||||
- [MediumX.cpp](file://cpp\ProblemZone\MediumX.cpp)
|
||||
- [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [核心Medium类架构](#核心medium类架构)
|
||||
3. [标准电极排列模型](#标准电极排列模型)
|
||||
- [温纳α装置 (MediumA)](#温纳α装置-mediuma)
|
||||
- [温纳β装置 (MediumB)](#温纳β装置-mediumb)
|
||||
- [温纳γ装置 (MediumC)](#温纳γ装置-mediumc)
|
||||
- [施伦贝谢装置 (MediumD)](#施伦贝谢装置-mediumd)
|
||||
4. [特殊测量模型](#特殊测量模型)
|
||||
- [跨孔测量模型 (MediumCrossHoleGeomative)](#跨孔测量模型-mediumcrossholegeomative)
|
||||
- [自定义2D模型 (MediumCustom2D)](#自定义2d模型-mediumcustom2d)
|
||||
5. [高级与遗留模型](#高级与遗留模型)
|
||||
- [通用脚本模型 (MediumX, MediumY, MediumZ)](#通用脚本模型-mediumx-mediumy-mediumz)
|
||||
6. [用户界面与配置](#用户界面与配置)
|
||||
7. [模型选择决策树](#模型选择决策树)
|
||||
8. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
Medium系列类是Geomative Studio软件中实现地球物理电阻率测量模型的核心组件。这些类通过继承自基类`CMedium`,为各种电极排列方式和测量方法提供了具体的实现。本文档系统地介绍了从`MediumA`到`MediumZ`的系列类,详细说明了它们所对应的电极排列方式,如`MediumA`代表温纳α装置,`MediumB`代表温纳β装置,`MediumCrossHoleGeomative`支持跨孔测量等。文档将深入分析各模型在电极间距计算、供电-测量电极组合逻辑、数据采集序列生成等方面的实现差异,并结合配置界面说明用户如何选择和参数化特定的测量模型。
|
||||
|
||||
## 核心Medium类架构
|
||||
`CMedium`是所有测量模型的抽象基类,定义了测量脚本生成、测点定位和数据管理的通用接口。所有具体的测量模型,如`CMediumA`、`CMediumB`等,都继承自此类,并重写其核心方法以实现特定的测量逻辑。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CMedium {
|
||||
+int m_iAR
|
||||
+int m_iStartPole
|
||||
+int m_iEndPole
|
||||
+float m_fEOffsetR
|
||||
+float m_fLOffsetR
|
||||
+map<int, int> m_mapUniversalLayer
|
||||
+CalculateTdPtLoc()
|
||||
+SetValidPoleInfo()
|
||||
+GeneralUniSptInfo()
|
||||
+ReSortPoint()
|
||||
+AddSptToUniLayer()
|
||||
+QuerySptLayerFromUni()
|
||||
+GetUniSptXPos()
|
||||
}
|
||||
class CMediumA {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptKVal()
|
||||
+CalculateSptLevel()
|
||||
+CalculateSptPtLoc()
|
||||
}
|
||||
class CMediumB {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptKVal()
|
||||
+CalculateSptLevel()
|
||||
+CalculateSptPtLoc()
|
||||
}
|
||||
class CMediumC {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptKVal()
|
||||
+CalculateSptLevel()
|
||||
+CalculateSptPtLoc()
|
||||
}
|
||||
class CMediumD {
|
||||
+int m_iParamIma
|
||||
+int m_iParamImn
|
||||
+SetParamVal()
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptKVal()
|
||||
+CalculateSptLevel()
|
||||
+CalculateSptPtLoc()
|
||||
}
|
||||
class CMediumCrossHoleGeomative {
|
||||
+float m_fSeprate
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateCESptKVal()
|
||||
+CalculateSptPtLoc()
|
||||
+GenSptRecLevel()
|
||||
}
|
||||
class CMediumCustom2D {
|
||||
+GenerateSptRecElecVal()
|
||||
}
|
||||
CMedium <|-- CMediumA
|
||||
CMedium <|-- CMediumB
|
||||
CMedium <|-- CMediumC
|
||||
CMedium <|-- CMediumD
|
||||
CMedium <|-- CMediumCrossHoleGeomative
|
||||
CMedium <|-- CMediumCustom2D
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Medium.cpp](file://cpp\ProblemZone\Medium.cpp#L11-L657)
|
||||
- [MediumA.cpp](file://cpp\ProblemZone\MediumA.cpp#L19-L239)
|
||||
- [MediumB.cpp](file://cpp\ProblemZone\MediumB.cpp#L19-L237)
|
||||
- [MediumC.cpp](file://cpp\ProblemZone\MediumC.cpp#L19-L240)
|
||||
- [MediumD.cpp](file://cpp\ProblemZone\MediumD.cpp#L19-L362)
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L19-L148)
|
||||
- [MediumCustom2D.cpp](file://cpp\ProblemZone\MediumCustom2D.cpp#L19-L228)
|
||||
|
||||
**节源**
|
||||
- [Medium.cpp](file://cpp\ProblemZone\Medium.cpp#L11-L657)
|
||||
|
||||
## 标准电极排列模型
|
||||
标准电极排列模型是地球物理勘探中最常用的几种方法,它们在`MediumA`到`MediumD`类中实现。
|
||||
|
||||
### 温纳α装置 (MediumA)
|
||||
`CMediumA`类实现了温纳α(Wenner Alpha)装置,这是一种对称四极排列,其中供电电极(A, B)和测量电极(M, N)等间距排列,且M、N位于A、B的中点。
|
||||
|
||||
在`GenerateSptRecElecVal`方法中,该类通过一个双重循环生成测点序列。外层循环遍历测量电极M的位置,内层循环则通过移动供电电极A来生成同一层内的所有测点。其电极间距计算遵循公式:`AB = 3 * MN`,且MN间距随层数增加而增大。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start["开始生成温纳α测点"] --> Init["初始化参数 iEAmount, iMaxSpace"]
|
||||
Init --> OuterLoop["外层循环: iMMVal = 2 to iEAmount-2"]
|
||||
OuterLoop --> CalcSpace["计算当前间距 iSpace"]
|
||||
CalcSpace --> InnerLoop["内层循环: 移动A电极"]
|
||||
InnerLoop --> CreatePoint["创建CSptRecord: A, B, M, N"]
|
||||
CreatePoint --> SetK["计算K值: k = 2π * (N-M)"]
|
||||
SetK --> SetLevel["计算层数: Level = N - M"]
|
||||
SetLevel --> AddToArray["将测点加入pSptRecArray"]
|
||||
AddToArray --> CheckInner["内层循环结束?"]
|
||||
CheckInner --> |否| InnerLoop
|
||||
CheckInner --> |是| CheckOuter["外层循环结束?"]
|
||||
CheckOuter --> |否| OuterLoop
|
||||
CheckOuter --> |是| End["返回测点总数和最大层数"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [MediumA.cpp](file://cpp\ProblemZone\MediumA.cpp#L30-L167)
|
||||
|
||||
**节源**
|
||||
- [MediumA.cpp](file://cpp\ProblemZone\MediumA.cpp#L30-L167)
|
||||
|
||||
### 温纳β装置 (MediumB)
|
||||
`CMediumB`类实现了温纳β(Wenner Beta)装置。与α装置不同,β装置的供电电极B和测量电极M是相邻的。
|
||||
|
||||
其`GenerateSptRecElecVal`方法的逻辑与`MediumA`非常相似,主要区别在于电极的赋值顺序和K值的计算。在β装置中,K值的计算公式为 `k = 6π * (N-M)`,这反映了其不同的几何因子。
|
||||
|
||||
**节源**
|
||||
- [MediumB.cpp](file://cpp\ProblemZone\MediumB.cpp#L30-L167)
|
||||
|
||||
### 温纳γ装置 (MediumC)
|
||||
`CMediumC`类实现了温纳γ(Wenner Gamma)装置。在这种排列中,两个测量电极M和N位于一个供电电极A的同一侧。
|
||||
|
||||
该类的`GenerateSptRecElecVal`方法同样采用双重循环结构,但其电极组合逻辑和K值计算(`k = 3π * (M-A)`)与α和β装置有显著不同,体现了γ装置的独特性。
|
||||
|
||||
**节源**
|
||||
- [MediumC.cpp](file://cpp\ProblemZone\MediumC.cpp#L30-L168)
|
||||
|
||||
### 施伦贝谢装置 (MediumD)
|
||||
`CMediumD`类实现了施伦贝谢(Schlumberger)装置,这是一种非对称排列,其中测量电极MN间距固定,而供电电极AB间距随测量深度增加而扩大。
|
||||
|
||||
该模型的实现更为复杂,因为它引入了可配置的参数`m_iParamIma`和`m_iParamImn`,分别代表AM和MN的最大间距倍数。`SetParamVal`方法允许从外部设置这些参数。`GenerateSptRecElecVal`方法中的三重循环结构(`for (a = 1; a <= m_iParamIma; a++)`)用于生成不同MN间距的测点,这与标准温纳装置的单一间距不同。
|
||||
|
||||
**节源**
|
||||
- [MediumD.cpp](file://cpp\ProblemZone\MediumD.cpp#L32-L279)
|
||||
|
||||
## 特殊测量模型
|
||||
除了标准的地面测量模型,系统还支持更复杂的特殊测量场景。
|
||||
|
||||
### 跨孔测量模型 (MediumCrossHoleGeomative)
|
||||
`CMediumCrossHoleGeomative`类专门用于跨孔(Cross-Hole)电阻率成像。这种模型涉及两个或多个钻孔中的电极,极大地增加了测量的复杂性。
|
||||
|
||||
该类的`GenerateSptRecElecVal`方法实现了一种特定的跨孔测量方案:电极按特定顺序排列(1-12从下到上,13-24从上到下),并遵循“C1P1 = C2P2”的规则。其核心逻辑是一个`while(TRUE)`循环,通过逐层增加测量深度(`iLayer++`)并控制C1/P1和C2/P2的移动来生成所有测点。K值的计算使用了更复杂的公式 `k = π / (1/AM - 1/sqrt(AM² + AB²))`,考虑了电极间的垂直和水平距离。
|
||||
|
||||
**节源**
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp#L47-L111)
|
||||
|
||||
### 自定义2D模型 (MediumCustom2D)
|
||||
`CMediumCustom2D`类为用户提供了最大的灵活性,允许用户手动输入任意的电极组合(A, B, M, N)、K值、叠加次数(N)和层数。
|
||||
|
||||
该类的`GenerateSptRecElecVal`方法会弹出一个对话框`CDialCustomSptInput`,让用户输入所有测点的详细信息。程序会逐行读取用户输入,并创建`CSptRecord`对象。此外,它还支持多通道模式,会根据A、B、M的值对测点进行排序,以避免重复。
|
||||
|
||||
**节源**
|
||||
- [MediumCustom2D.cpp](file://cpp\ProblemZone\MediumCustom2D.cpp#L28-L228)
|
||||
|
||||
## 高级与遗留模型
|
||||
系统中还包含一些更高级或为兼容性而保留的模型。
|
||||
|
||||
### 通用脚本模型 (MediumX, MediumY, MediumZ)
|
||||
`MediumX`、`MediumY`和`MediumZ`这三个类代表了基于外部脚本引擎的通用测量模型。它们不直接在C++代码中生成测点,而是通过调用底层的`scr_*`函数(如`scr_create`, `scr_generate`)来操作一个脚本引擎。
|
||||
|
||||
这些类的`GenerateSptRecElecVal`方法非常简单,主要是遍历由脚本引擎生成的测点列表(`scr_get_points`),并将每个点的A、B、M、N、K值复制到`CSptRecord`对象中。`MediumZ`、`MediumY`、`MediumX`分别对应“WennerAlfa”、“Schlumberger”和“Dipole-Dipole”等不同的脚本名称,这表明它们是通过配置不同的脚本来实现不同测量方法的。
|
||||
|
||||
**节源**
|
||||
- [MediumZ.cpp](file://cpp\ProblemZone\MediumZ.cpp#L28-L61)
|
||||
- [MediumY.cpp](file://cpp\ProblemZone\MediumY.cpp#L29-L62)
|
||||
- [MediumX.cpp](file://cpp\ProblemZone\MediumX.cpp#L27-L60)
|
||||
|
||||
## 用户界面与配置
|
||||
用户通过`CCrossHoleConfig2DMainDlg`等配置对话框来选择和参数化测量模型。例如,在跨孔配置界面中,用户可以在“参数”选项卡中选择测量类型(`GetMediumType`),并输入脚本名称、时间间隔等信息。
|
||||
|
||||
当用户点击“创建”按钮时,`OnBnClickedBtnCreate`方法会被调用。该方法首先获取用户选择的测量类型和参数,然后调用`TwoBoreholeGenerateScript`等函数来生成具体的测量脚本。最终,`SaveTestPointToDB`方法会将生成的测点信息(A, B, M, N, K值等)写入数据库的`script2d`表中,完成整个配置流程。
|
||||
|
||||
**节源**
|
||||
- [CCrossHoleConfig2DMainDlg.cpp](file://cpp\crossHole\CCrossHoleConfig2DMainDlg.cpp#L734-L780)
|
||||
|
||||
## 模型选择决策树
|
||||
为了帮助用户根据地质条件和勘探目标选择合适的Medium类型,以下提供一个决策树:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start["开始选择测量模型"] --> Q1["勘探目标是二维剖面吗?"]
|
||||
Q1 --> |是| Q2["需要标准对称排列吗?"]
|
||||
Q1 --> |否| Q3["是跨孔测量吗?"]
|
||||
Q2 --> |是| Q4["需要最大探测深度?"]
|
||||
Q2 --> |否| Q5["需要高横向分辨率?"]
|
||||
Q3 --> |是| Recommend["推荐: MediumCrossHoleGeomative"]
|
||||
Q3 --> |否| Q6["需要完全自定义电极组合?"]
|
||||
Q4 --> |是| RecommendA["推荐: MediumA (温纳α)"]
|
||||
Q4 --> |否| Q7["需要快速测量?"]
|
||||
Q5 --> |是| RecommendD["推荐: MediumD (施伦贝谢)"]
|
||||
Q5 --> |否| RecommendB["推荐: MediumB (温纳β)"]
|
||||
Q6 --> |是| RecommendCustom["推荐: MediumCustom2D"]
|
||||
Q6 --> |否| RecommendLegacy["考虑: MediumX/Y/Z (通用脚本)"]
|
||||
Q7 --> |是| RecommendC["推荐: MediumC (温纳γ)"]
|
||||
Q7 --> |否| RecommendA
|
||||
Recommend --> End
|
||||
RecommendA --> End
|
||||
RecommendB --> End
|
||||
RecommendC --> End
|
||||
RecommendD --> End
|
||||
RecommendCustom --> End
|
||||
RecommendLegacy --> End
|
||||
End["完成选择"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [MediumA.cpp](file://cpp\ProblemZone\MediumA.cpp)
|
||||
- [MediumB.cpp](file://cpp\ProblemZone\MediumB.cpp)
|
||||
- [MediumC.cpp](file://cpp\ProblemZone\MediumC.cpp)
|
||||
- [MediumD.cpp](file://cpp\ProblemZone\MediumD.cpp)
|
||||
- [MediumCrossHoleGeomative.cpp](file://cpp\ProblemZone\MediumCrossHoleGeomative.cpp)
|
||||
- [MediumCustom2D.cpp](file://cpp\ProblemZone\MediumCustom2D.cpp)
|
||||
|
||||
## 结论
|
||||
Medium系列类构成了Geomative Studio软件的核心测量引擎,通过面向对象的设计,为多种地球物理测量方法提供了清晰、可扩展的实现。从标准的温纳和施伦贝谢装置到复杂的跨孔测量和完全自定义的方案,这些类满足了不同勘探场景的需求。模型的参数(如电极间距、K值计算)直接影响最终的反演结果,因此用户应根据具体的地质条件和勘探目标谨慎选择合适的模型。未来的工作可以进一步优化这些模型的性能,并增加更多先进的测量方法。
|
||||
@@ -0,0 +1,237 @@
|
||||
# ProblemZone模块
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
|
||||
- [Project.h](file://h/Project.h)
|
||||
- [Device.cpp](file://cpp/ProblemZone/Device.cpp)
|
||||
- [Device.h](file://h/Device.h)
|
||||
- [Script.cpp](file://cpp/ProblemZone/Script.cpp)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [Medium.cpp](file://cpp/ProblemZone/Medium.cpp)
|
||||
- [Medium.h](file://h/Medium.h)
|
||||
- [Electrode.cpp](file://cpp/ProblemZone/Electrode.cpp)
|
||||
- [Electrode.h](file://h/Electrode.h)
|
||||
- [SP2DTd.h](file://h/SP2DTd.h)
|
||||
- [SP2DTdRecord.h](file://h/SP2DTdRecord.h)
|
||||
- [SP3DTd.h](file://h/SP3DTd.h)
|
||||
- [SP3DTdRecord.h](file://h/SP3DTdRecord.h)
|
||||
- [SPCETd.h](file://h/SPCETd.h)
|
||||
- [SPCETdRecord.h](file://h/SPCETdRecord.h)
|
||||
- [Rsp2DTd.h](file://h/Rsp2DTd.h)
|
||||
- [Rsp2DTdRecord.h](file://h/Rsp2DTdRecord.h)
|
||||
- [Rsp3DTd.h](file://h/Rsp3DTd.h)
|
||||
- [Rsp3DTdRecord.h](file://h/Rsp3DTdRecord.h)
|
||||
- [RspCETd.h](file://h/RspCETd.h)
|
||||
- [RspCETdRecord.h](file://h/RspCETdRecord.h)
|
||||
- [Ipsp2DTd.h](file://h/Ipsp2DTd.h)
|
||||
- [Ipsp2DTdRecord.h](file://h/Ipsp2DTdRecord.h)
|
||||
- [Ipsp3DTd.h](file://h/Ipsp3DTd.h)
|
||||
- [Ipsp3DTdRecord.h](file://h/Ipsp3DTdRecord.h)
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
- [IpspCETdRecord.h](file://h/IpspCETdRecord.h)
|
||||
- [Channel.h](file://h/Channel.h)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h)
|
||||
- [Res3DDatFileRecord.h](file://h/Res3DDatFileRecord.h)
|
||||
- [SptRecord.h](file://h/SptRecord.h)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目数据结构与管理](#项目数据结构与管理)
|
||||
2. [设备属性与状态管理](#设备属性与状态管理)
|
||||
3. [脚本配置与生成逻辑](#脚本配置与生成逻辑)
|
||||
4. [地球物理测量模型实现](#地球物理测量模型实现)
|
||||
5. [激电测量数据处理类](#激电测量数据处理类)
|
||||
6. [数据记录类结构设计](#数据记录类结构设计)
|
||||
7. [数据模型关联关系](#数据模型关联关系)
|
||||
|
||||
## 项目数据结构与管理
|
||||
|
||||
`CProject`类是系统中项目管理的核心数据模型,负责封装项目的基本信息和管理功能。该类通过数据库连接获取项目数据,包含项目编号、名称、描述、位置、日期、持续时间、项目负责人、客户、项目经理、质量保证标准等属性。`CProject`类提供了显示项目详细信息的功能,通过`ShowDetailInfo`方法将项目信息填充到列表控件中,便于用户查看。项目数据从数据库的`project`表中读取,使用SQL查询语句获取指定ID的项目记录,并将各字段值存储在相应的成员变量中。
|
||||
|
||||
**本节来源**
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L15-L81)
|
||||
- [Project.h](file://h/Project.h#L14-L38)
|
||||
|
||||
## 设备属性与状态管理
|
||||
|
||||
`CDevice`类负责管理地球物理测量设备的属性和状态。该类包含设备ID、状态、类型、设备序列号、设备名称、型号、生产日期、硬件版本、软件版本、批次等属性。`CDevice`类提供了多种功能方法,包括设置设备状态、重置设备、显示设备详细信息(离线和在线)、显示接地电阻信息、显示视极化率信息等。设备信息从数据库的`device`表和`desetting`表中获取,通过`ShowFLDetailInfo`和`ShowOLDetailInfo`方法分别显示离线和在线设备的详细信息。类中还包含与设备通信相关的成员变量,如串口对象`m_sComPort`和日志文件指针`m_pLogFile`,用于设备通信和日志记录。
|
||||
|
||||
**本节来源**
|
||||
- [Device.cpp](file://cpp/ProblemZone/Device.cpp#L42-L800)
|
||||
- [Device.h](file://h/Device.h#L33-L125)
|
||||
|
||||
## 脚本配置与生成逻辑
|
||||
|
||||
`CScript`类是脚本管理的基础类,定义了脚本的核心属性和接口。该类包含脚本ID、电极数量、脚本类型和装置类型等属性。`CScript`类作为抽象基类,定义了显示脚本内容信息、显示脚本详情信息和显示通道列表的纯虚函数,由派生类具体实现。装置类型`m_iAR`是区分不同测量模式的关键参数,不同的装置类型对应不同的电极配置和测量方法。脚本类通过数据库连接获取相关数据,为上层应用提供脚本配置和生成的基础功能。
|
||||
|
||||
**本节来源**
|
||||
- [Script.cpp](file://cpp/ProblemZone/Script.cpp#L18-L30)
|
||||
- [Script.h](file://h/Script.h#L15-L38)
|
||||
|
||||
## 地球物理测量模型实现
|
||||
|
||||
`CMedium`类是地球物理测量模型的基类,为各种具体的测量装置类型提供通用的功能和接口。该类定义了生成脚本记录电极值、计算脚本测点位置、计算脚本记录层数、计算每层脚本记录位置、获取最大层数等纯虚函数,由具体的装置类型类(如`MediumA`、`MediumB`等)实现。`CMedium`类还提供了通用的测点位置计算、测点重排序、通用脚本信息生成等功能。类中包含装置类型`m_iAR`、电极偏移率`m_fEOffsetR`、层偏移率`m_fLOffsetR`、起始电极`m_iStartPole`和结束电极`m_iEndPole`等成员变量,用于描述测量模型的参数。`CMedium`类通过`std::map`容器`m_mapUniversalLayer`管理通用层信息,支持不同装置类型的层数计算和管理。
|
||||
|
||||
**本节来源**
|
||||
- [Medium.cpp](file://cpp/ProblemZone/Medium.cpp#L12-L657)
|
||||
- [Medium.h](file://h/Medium.h#L73-L115)
|
||||
|
||||
## 激电测量数据处理类
|
||||
|
||||
SP、Rsp、Ipsp系列类分别代表不同类型的激电测量数据处理功能。这些类按照2D、3D和CE(Cross-Sectional)三种测量维度组织,每种维度都有对应的头文件和记录文件。SP系列处理自然电位测量数据,Rsp系列处理电阻率测量数据,Ipsp系列处理激发极化测量数据。每个系列都包含一个主处理类(如`SP2DTd`)和一个记录类(如`SP2DTdRecord`),分别负责数据处理逻辑和数据存储。这些类通过继承和实现`CMedium`类定义的接口,针对特定的测量方法和数据格式进行具体实现,构成了激电测量数据处理的核心框架。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SP2DTd {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptPtLoc()
|
||||
+GenSptRecLevel()
|
||||
+GenSptRecPosInLevel()
|
||||
+GetMaxLevelByEAmount()
|
||||
}
|
||||
class SP2DTdRecord {
|
||||
+m_iLevel
|
||||
+m_iPosInLevel
|
||||
+m_recPtArea
|
||||
+m_fSptXPos
|
||||
}
|
||||
class Rsp2DTd {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptPtLoc()
|
||||
+GenSptRecLevel()
|
||||
+GenSptRecPosInLevel()
|
||||
+GetMaxLevelByEAmount()
|
||||
}
|
||||
class Rsp2DTdRecord {
|
||||
+m_iLevel
|
||||
+m_iPosInLevel
|
||||
+m_recPtArea
|
||||
+m_fSptXPos
|
||||
}
|
||||
class Ipsp2DTd {
|
||||
+GenerateSptRecElecVal()
|
||||
+CalculateSptPtLoc()
|
||||
+GenSptRecLevel()
|
||||
+GenSptRecPosInLevel()
|
||||
+GetMaxLevelByEAmount()
|
||||
}
|
||||
class Ipsp2DTdRecord {
|
||||
+m_iLevel
|
||||
+m_iPosInLevel
|
||||
+m_recPtArea
|
||||
+m_fSptXPos
|
||||
}
|
||||
SP2DTd <|-- SP3DTd
|
||||
SP2DTd <|-- SPCETd
|
||||
Rsp2DTd <|-- Rsp3DTd
|
||||
Rsp2DTd <|-- RspCETd
|
||||
Ipsp2DTd <|-- Ipsp3DTd
|
||||
Ipsp2DTd <|-- IpspCETd
|
||||
SP2DTd --|> SP2DTdRecord : "creates"
|
||||
Rsp2DTd --|> Rsp2DTdRecord : "creates"
|
||||
Ipsp2DTd --|> Ipsp2DTdRecord : "creates"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SP2DTd.h](file://h/SP2DTd.h)
|
||||
- [SP2DTdRecord.h](file://h/SP2DTdRecord.h)
|
||||
- [Rsp2DTd.h](file://h/Rsp2DTd.h)
|
||||
- [Rsp2DTdRecord.h](file://h/Rsp2DTdRecord.h)
|
||||
- [Ipsp2DTd.h](file://h/Ipsp2DTd.h)
|
||||
- [Ipsp2DTdRecord.h](file://h/Ipsp2DTdRecord.h)
|
||||
|
||||
## 数据记录类结构设计
|
||||
|
||||
数据记录类包括`Channel`、`Electrode`、`TdRecord`、`SptRecord`等,用于存储测量过程中的具体数据。`Channel`类代表测量通道,`Electrode`类代表电极,包含电极编码、状态、测量日期、测量时间和测量值等属性。`TdRecord`是测量数据记录的基类,`SptRecord`是脚本记录类,存储脚本测点的详细信息,如测点序号、电极配置(C1, C2, P1, P2)、层数、层内位置等。`DevLinkRecord`类用于设备链接记录,`Res3DDatFileRecord`类用于3D电阻率数据文件记录。这些记录类通过指针数组`CPtrArray`进行管理,支持动态的数据存储和访问,构成了系统数据持久化的基础。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Channel {
|
||||
+m_iChannelID
|
||||
+m_szChannelName
|
||||
+m_bIsActive
|
||||
}
|
||||
class Electrode {
|
||||
+m_szECode
|
||||
+m_bCState
|
||||
+m_szMDate
|
||||
+m_szMTime
|
||||
+m_fOMValue
|
||||
}
|
||||
class TdRecord {
|
||||
+m_iRecordID
|
||||
+m_szRecordTime
|
||||
+m_fValue
|
||||
}
|
||||
class SptRecord {
|
||||
+m_iTsn
|
||||
+m_iC1
|
||||
+m_iC2
|
||||
+m_iP1
|
||||
+m_iP2
|
||||
+m_iLevel
|
||||
+m_iPosInLevel
|
||||
+m_fSptXPos
|
||||
}
|
||||
class DevLinkRecord {
|
||||
+m_iLinkID
|
||||
+m_dwDeviceID
|
||||
+m_szLinkTime
|
||||
}
|
||||
class Res3DDatFileRecord {
|
||||
+m_szFileName
|
||||
+m_szFilePath
|
||||
+m_iDataCount
|
||||
}
|
||||
Channel "1" -- "0..*" Electrode : "has"
|
||||
TdRecord "1" -- "1" SptRecord : "corresponds to"
|
||||
DevLinkRecord "1" -- "1" Device : "links"
|
||||
Res3DDatFileRecord "1" -- "0..*" TdRecord : "contains"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Channel.h](file://h/Channel.h)
|
||||
- [Electrode.h](file://h/Electrode.h#L12-L23)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
- [SptRecord.h](file://h/SptRecord.h)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h)
|
||||
- [Res3DDatFileRecord.h](file://h/Res3DDatFileRecord.h)
|
||||
|
||||
## 数据模型关联关系
|
||||
|
||||
系统中的数据模型通过层次化的关联关系组织。`Project`类作为顶级容器,包含多个`TestingZone`(测区)。每个测区包含多个`Script`(脚本),每个脚本定义了一组测量任务。脚本通过`CMedium`类的派生类(如`MediumA`、`MediumB`等)实现具体的测量模型,生成`SptRecord`(脚本记录)。每个脚本记录关联特定的电极配置,由`Electrode`类表示。测量执行时,生成`TdRecord`(测量数据记录),与脚本记录对应。设备`Device`通过`Channel`与电极连接,形成完整的测量链路。这种层次化的数据模型设计,清晰地表达了从项目规划到数据采集的完整流程,支持复杂的地球物理测量任务管理。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Project --> TestingZone
|
||||
TestingZone --> Script
|
||||
Script --> MediumA
|
||||
Script --> MediumB
|
||||
Script --> MediumC
|
||||
MediumA --> SptRecord
|
||||
MediumB --> SptRecord
|
||||
MediumC --> SptRecord
|
||||
SptRecord --> Electrode
|
||||
Electrode --> Channel
|
||||
Channel --> Device
|
||||
SptRecord --> TdRecord
|
||||
Device --> DevLinkRecord
|
||||
TdRecord --> Res3DDatFileRecord
|
||||
style Project fill:#f9f,stroke:#333
|
||||
style Device fill:#bbf,stroke:#333
|
||||
style Res3DDatFileRecord fill:#f96,stroke:#333
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Project.h](file://h/Project.h#L16-L38)
|
||||
- [Device.h](file://h/Device.h#L33-L125)
|
||||
- [Script.h](file://h/Script.h#L15-L38)
|
||||
- [Medium.h](file://h/Medium.h#L73-L115)
|
||||
- [SptRecord.h](file://h/SptRecord.h)
|
||||
- [Electrode.h](file://h/Electrode.h#L12-L23)
|
||||
- [Channel.h](file://h/Channel.h)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h)
|
||||
- [Res3DDatFileRecord.h](file://h/Res3DDatFileRecord.h)
|
||||
@@ -0,0 +1,306 @@
|
||||
# Project数据模型
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Project.h](file://h/Project.h)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp)
|
||||
- [ProManager.h](file://h/ProManager.h)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [TestingZone.h](file://h/TestingZone.h)
|
||||
- [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h)
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [TdRecord.h](file://h/TdRecord.h)
|
||||
- [Device.h](file://h/Device.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
Project类是GeomativeStudio系统中的核心数据模型,作为项目容器管理着测区、任务配置、脚本集合和测量数据记录等关键信息。该类通过与ProManager模块协作,实现了项目生命周期的完整管理,包括创建、加载、保存和关闭操作。Project类从数据库加载元数据,并通过XML缓存文件实现项目持久化,确保数据在不同会话间的连续性。作为系统中项目管理的中心实体,Project类在多项目环境中通过单例模式提供统一访问接口,协调与Device、Script、TdRecord等其他模型的交互关系。
|
||||
|
||||
## 项目结构
|
||||
GeomativeStudio项目采用分层架构设计,将核心数据模型、管理器、操作员和视图组件分离。Project类位于ProblemZone目录中,作为CDataMngStruct的派生类实现项目数据管理功能。系统通过ProManager类统一管理项目生命周期,而项目相关的持久化操作通过XML文件在CACHE目录中实现。项目结构清晰地划分了数据访问、业务逻辑和用户界面层,确保了系统的可维护性和扩展性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据层"
|
||||
DB[(数据库)]
|
||||
CACHE[(缓存文件)]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
ProManager[ProManager]
|
||||
Project[Project]
|
||||
TestingZone[TestingZone]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
DataMngStruct[CDataMngStruct]
|
||||
end
|
||||
subgraph "用户界面层"
|
||||
Views[视图组件]
|
||||
end
|
||||
DB --> Project
|
||||
CACHE --> Project
|
||||
Project --> ProManager
|
||||
ProManager --> Views
|
||||
DataMngStruct --> Project
|
||||
DataMngStruct --> TestingZone
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h#L1-L23)
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
|
||||
## 核心组件
|
||||
Project类作为系统核心数据模型,负责管理项目元数据和聚合相关实体。该类从数据库加载项目信息,包括名称、创建时间、坐标系统等属性,并通过成员函数实现与ProManager的协作。Project实例通过句柄机制在内存中管理,确保多项目环境下的高效访问。类的设计体现了数据封装原则,将数据库访问细节与业务逻辑分离,提供了清晰的接口供上层组件调用。
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L81)
|
||||
|
||||
## 架构概述
|
||||
Project类在GeomativeStudio系统架构中扮演着中心角色,作为项目容器协调多个子系统的交互。系统采用管理器模式,通过ProManager统一管理Project实例的生命周期。Project类与TestingZone、Script、TdRecord等模型形成聚合关系,构建了完整的项目数据结构。持久化机制通过XML文件实现,确保项目数据在设备间的同步和本地缓存。整个架构设计支持多项目并发操作,通过句柄处理器和状态处理器确保线程安全和数据一致性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CDataMngStruct {
|
||||
+ShowDetailInfo(CListCtrl& dmsDetailList) bool
|
||||
+CDataMngStruct()
|
||||
+~CDataMngStruct()
|
||||
}
|
||||
class CProject {
|
||||
+ShowDetailInfo(CListCtrl& proDetailList) bool
|
||||
+CProject(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CProject()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szCN
|
||||
-CString m_szPRname
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szPRdate
|
||||
-CString m_szDuration
|
||||
-CString m_szPS
|
||||
-CString m_szCS
|
||||
-CString m_szPM
|
||||
-CString m_szQAS
|
||||
-CString m_szStandard
|
||||
}
|
||||
class CTestingZone {
|
||||
+ShowDetailInfo(CListCtrl& tzDetailList) bool
|
||||
+CTestingZone(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CTestingZone()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szTZname
|
||||
-CString m_szCDate
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szCN
|
||||
-CString m_szTZtype
|
||||
}
|
||||
class CScript {
|
||||
+CScript(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CScript()
|
||||
+DWORD m_dwID
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+int m_iEAmount
|
||||
+int m_iSType
|
||||
+int m_iAR
|
||||
+AdjustRecListColumn(int iAR, CListCtrl& sptConListInfo) void
|
||||
+ShowSptConInfo(CListCtrl& sptConList) bool
|
||||
+ShowSptDetailInfo(CListCtrl& sptDetailList) bool
|
||||
+ShowChannelList(CListCtrl& sptChannelList) bool
|
||||
-_ConnectionPtr m_pConnection
|
||||
}
|
||||
class CDevice {
|
||||
+m_szDevSN CString
|
||||
+m_dwID DWORD
|
||||
+SendFile(CString szHostFilePath, CString szFilePath, CString szFileName) BOOL
|
||||
}
|
||||
class CTdRecord {
|
||||
+m_dwTzID DWORD
|
||||
+m_dwSCID DWORD
|
||||
+m_pDevice CDevice*
|
||||
}
|
||||
CDataMngStruct <|-- CProject
|
||||
CDataMngStruct <|-- CTestingZone
|
||||
CProject "1" *-- "0..*" CTestingZone : 包含
|
||||
CProject "1" *-- "0..*" CScript : 包含
|
||||
CProject "1" *-- "0..*" CTdRecord : 包含
|
||||
CTestingZone "1" *-- "0..*" CTdRecord : 包含
|
||||
CTdRecord --> CDevice : 关联
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
- [Device.h](file://h/Device.h#L1-L50)
|
||||
- [TdRecord.h](file://h/TdRecord.h#L1-L45)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Project类分析
|
||||
Project类作为系统核心数据模型,实现了项目元数据的存储和管理功能。该类从数据库加载项目信息,包括项目编号(CN)、项目名称(PRname)、描述(PRdesc)、位置(location)、创建日期(PRdate)、持续时间(duration)、投影系统(PS)、坐标系统(CS)、项目经理(PM)、质量保证(QAS)和标准(standard)等属性。通过继承CDataMngStruct基类,Project类获得了统一的数据管理接口。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CProject {
|
||||
+ShowDetailInfo(CListCtrl& proDetailList) bool
|
||||
+CProject(DWORD dwID, _ConnectionPtr& pConnection)
|
||||
+~CProject()
|
||||
+DWORD m_dwID
|
||||
-_ConnectionPtr m_pConnection
|
||||
-CString m_szCN
|
||||
-CString m_szPRname
|
||||
-CString m_szDesc
|
||||
-CString m_szLocation
|
||||
-CString m_szPRdate
|
||||
-CString m_szDuration
|
||||
-CString m_szPS
|
||||
-CString m_szCS
|
||||
-CString m_szPM
|
||||
-CString m_szQAS
|
||||
-CString m_szStandard
|
||||
}
|
||||
class CDataMngStruct {
|
||||
+ShowDetailInfo(CListCtrl& dmsDetailList) bool
|
||||
+CDataMngStruct()
|
||||
+~CDataMngStruct()
|
||||
}
|
||||
CDataMngStruct <|-- CProject
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [DataMngStruct.h](file://h/DataMngStruct.h#L1-L23)
|
||||
|
||||
#### 项目生命周期管理
|
||||
Project类的生命周期由ProManager模块管理,通过一系列协作方法实现完整的项目操作流程:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 用户界面
|
||||
participant ProManager as ProManager
|
||||
participant Project as Project
|
||||
participant DB as 数据库
|
||||
participant Cache as 缓存文件
|
||||
UI->>ProManager : 创建项目请求
|
||||
ProManager->>ProManager : 显示创建对话框
|
||||
ProManager->>DB : 检查项目名称是否存在
|
||||
DB-->>ProManager : 返回检查结果
|
||||
alt 项目名称已存在
|
||||
ProManager-->>UI : 显示错误消息
|
||||
else 项目名称可用
|
||||
ProManager->>DB : 插入项目记录
|
||||
DB-->>ProManager : 返回项目ID
|
||||
ProManager->>Project : 创建Project实例
|
||||
Project->>DB : 加载项目数据
|
||||
DB-->>Project : 返回项目信息
|
||||
ProManager->>Cache : 生成project.xml
|
||||
Cache-->>ProManager : 确认文件创建
|
||||
ProManager->>UI : 返回成功状态
|
||||
end
|
||||
UI->>ProManager : 加载项目
|
||||
ProManager->>DB : 查询项目列表
|
||||
DB-->>ProManager : 返回项目数据
|
||||
ProManager->>Project : 获取Project实例
|
||||
Project-->>UI : 显示项目详情
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50)
|
||||
|
||||
**本节来源**
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L1-L81)
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1-L2054)
|
||||
|
||||
### ProManager协作关系
|
||||
ProManager作为项目管理器,与Project类形成紧密的协作关系。通过GetDMS方法,ProManager根据句柄获取相应的数据管理结构实例,实现了Project对象的单例访问模式。这种设计确保了在多项目环境中,每个项目实例在内存中只存在一个副本,提高了系统性能和数据一致性。
|
||||
|
||||
#### 单例访问模式
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([获取DMS实例]) --> CheckCache["检查缓存中是否存在"]
|
||||
CheckCache --> |存在| ReturnInstance["返回缓存实例"]
|
||||
CheckCache --> |不存在| CreateInstance["创建新实例"]
|
||||
CreateInstance --> LoadFromDB["从数据库加载数据"]
|
||||
LoadFromDB --> AddToCache["添加到缓存链表"]
|
||||
AddToCache --> ReturnInstance
|
||||
ReturnInstance --> End([返回DMS实例])
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L155-L182)
|
||||
|
||||
## 依赖关系分析
|
||||
Project类与系统中多个组件存在依赖关系,形成了复杂的交互网络。通过分析这些依赖关系,可以更好地理解系统的整体架构和数据流。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
ProManager --> Project : 创建/管理
|
||||
Project --> TestingZone : 聚合
|
||||
Project --> Script : 聚合
|
||||
Project --> TdRecord : 聚合
|
||||
Project --> DB : 数据持久化
|
||||
Project --> Cache : XML缓存
|
||||
TestingZone --> TdRecord : 聚合
|
||||
TdRecord --> Device : 关联
|
||||
Script --> TdRecord : 配置
|
||||
ProManager --> DB : 数据访问
|
||||
ProManager --> Device : 设备同步
|
||||
style Project fill:#f9f,stroke:#333
|
||||
style ProManager fill:#bbf,stroke:#333
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.h](file://h/ProManager.h#L1-L77)
|
||||
- [Project.h](file://h/Project.h#L1-L41)
|
||||
- [TestingZone.h](file://h/TestingZone.h#L1-L33)
|
||||
|
||||
## 性能考虑
|
||||
Project类的设计考虑了性能优化,通过缓存机制减少数据库访问频率。ProManager维护的m_dmsLinkList链表缓存了已创建的Project实例,避免了重复创建和数据加载。在多项目环境下,这种缓存策略显著提高了系统响应速度。同时,XML缓存文件的使用减少了设备同步时的数据传输量,优化了I/O性能。线程安全通过句柄处理器和状态处理器实现,确保在并发访问时的数据一致性。
|
||||
|
||||
## 故障排除指南
|
||||
在使用Project类时可能遇到的常见问题及解决方案:
|
||||
|
||||
1. **项目创建失败**:检查项目名称是否已存在,确保数据库连接正常
|
||||
2. **数据加载异常**:验证数据库表结构是否匹配,检查XML缓存文件完整性
|
||||
3. **设备同步问题**:确认设备连接状态,检查文件传输权限
|
||||
4. **内存泄漏**:确保通过ProManager正确管理Project实例生命周期
|
||||
5. **线程安全问题**:使用ProManager提供的同步机制,避免直接操作Project实例
|
||||
|
||||
**本节来源**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L483)
|
||||
- [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50)
|
||||
|
||||
## 结论
|
||||
Project类作为GeomativeStudio系统的核心数据模型,成功实现了项目容器的功能,有效管理了项目元数据和相关实体。通过与ProManager模块的协作,该类提供了完整的项目生命周期管理功能,包括创建、加载、保存和关闭操作。基于XML的持久化机制确保了数据的可靠存储和设备同步。类的设计体现了良好的面向对象原则,通过继承、聚合和单例模式构建了清晰的架构。未来可进一步优化缓存策略和线程安全机制,以支持更大规模的项目管理和更高的并发性能。
|
||||
@@ -0,0 +1,202 @@
|
||||
# Script数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Script.h](file://h/Script.h)
|
||||
- [SptRecord.h](file://h/SptRecord.h)
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp)
|
||||
- [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp)
|
||||
- [GD10OperCmd.h](file://h/GD10OperCmd.h)
|
||||
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp)
|
||||
- [Script.cpp](file://cpp/ProblemZone/Script.cpp)
|
||||
- [SptRecord.cpp](file://cpp/ProblemZone/SptRecord.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [Script类结构与功能](#script类结构与功能)
|
||||
3. [SptRecord类数据结构](#sptrecord类数据结构)
|
||||
4. [脚本生成与用户交互流程](#脚本生成与用户交互流程)
|
||||
5. [脚本管理与增删改查操作](#脚本管理与增删改查操作)
|
||||
6. [脚本与Medium模型的关联机制](#脚本与medium模型的关联机制)
|
||||
7. [脚本文件(.urf)导出格式](#脚本文件urf导出格式)
|
||||
8. [从脚本配置到设备指令的数据流](#从脚本配置到设备指令的数据流)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
Script类及其相关SptRecord类是Geomative Studio系统中测量脚本管理的核心组件。这些类负责定义2D、3D及跨孔测量的任务序列,包括电极排列方式、测量模式(如温纳、施伦贝尔)、供电参数和采集频率等关键配置。本文档将深入分析Script类的实现机制,解释SptRecord作为脚本执行记录的数据结构,并结合UI组件说明脚本生成与编辑的用户交互流程。
|
||||
|
||||
**Section sources**
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
- [SptRecord.h](file://h/SptRecord.h#L1-L57)
|
||||
|
||||
## Script类结构与功能
|
||||
|
||||
Script类是测量脚本的基类,定义了所有测量任务的通用属性和方法。该类通过继承机制支持不同类型的测量任务,包括2D、3D和跨孔测量。Script类的核心属性包括电极数量(m_iEAmount)、测量类型(m_iSType)和装置类型(m_iAR),这些属性共同定义了测量任务的基本特征。
|
||||
|
||||
Script类通过虚函数ShowSptConInfo、ShowSptDetailInfo和ShowChannelList提供了显示脚本信息的接口,允许子类根据具体测量类型定制信息展示方式。这种设计模式实现了代码的可扩展性和灵活性,使得系统能够轻松支持新的测量模式。
|
||||
|
||||
**Section sources**
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
- [Script.cpp](file://cpp/ProblemZone/Script.cpp#L1-L30)
|
||||
|
||||
## SptRecord类数据结构
|
||||
|
||||
SptRecord类作为脚本执行记录的数据结构,包含了测量过程中的关键参数和状态信息。该类不仅存储了测量配置参数,如电极位置(m_iC1, m_iC2, m_iP1, m_iP2)、几何因子(m_fK)和迭代次数(m_iN),还包含了执行状态和异常标记。
|
||||
|
||||
SptRecord类的成员变量设计体现了对测量过程全面监控的需求。m_bIsSel标志位用于标记测点是否被选中,m_colorREF用于可视化显示,m_recPtArea、m_fPtCenterX、m_fPtCenterY和m_fPtRadius共同定义了测点的区域范围,支持空间查询和交互操作。
|
||||
|
||||
**Section sources**
|
||||
- [SptRecord.h](file://h/SptRecord.h#L1-L57)
|
||||
- [SptRecord.cpp](file://cpp/ProblemZone/SptRecord.cpp#L1-L54)
|
||||
|
||||
## 脚本生成与用户交互流程
|
||||
|
||||
脚本生成与编辑的用户交互主要通过OpCreate3DSptDlg类实现。该对话框提供了直观的界面,允许用户配置3D测量任务的关键参数,包括测量区域、电极间距、步长和装置类型。用户通过界面输入的参数被转换为Script3D对象的配置,最终生成具体的测量任务序列。
|
||||
|
||||
OpCreate3DSptDlg类的实现展示了复杂的用户交互逻辑,包括参数验证、装置类型选择和区域定义。当用户选择中梯装置时,界面会动态显示C1和C2电极的输入控件,确保用户能够正确配置测量参数。这种动态界面设计提高了用户体验和数据输入的准确性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户 as 用户
|
||||
participant UI as OpCreate3DSptDlg
|
||||
participant Script as Script3D
|
||||
participant Medium as CMedium3D
|
||||
用户->>UI : 输入测量参数
|
||||
UI->>UI : 验证参数有效性
|
||||
UI->>Script : 创建Script3D实例
|
||||
Script->>Medium : 设置测量区域和参数
|
||||
Medium->>Medium : 生成测量序列
|
||||
Medium->>Script : 返回测量序列
|
||||
Script->>UI : 存储测量序列
|
||||
UI->>用户 : 显示生成结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp#L1-L700)
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
|
||||
## 脚本管理与增删改查操作
|
||||
|
||||
脚本管理功能由SptManager类实现,该类提供了对测量脚本的增删改查操作。SptManager使用链接列表(m_sptLinkList)管理所有脚本实例,通过句柄机制实现脚本的快速查找和访问。这种设计模式确保了脚本管理的高效性和内存使用的合理性。
|
||||
|
||||
SptManager类的Create2DSConInDB和Delete2DSConInDB方法实现了脚本在数据库中的持久化存储和删除。这些方法通过ADO数据库操作,将脚本配置信息写入scon、channel和script2d等数据表,实现了配置数据的可靠存储和版本管理。
|
||||
|
||||
**Section sources**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800)
|
||||
|
||||
## 脚本与Medium模型的关联机制
|
||||
|
||||
Script类与Medium模型的关联是通过装置类型(m_iAR)和句柄处理器(m_handleProcessor)实现的。每种测量模式对应特定的Medium子类,如CMedium3D用于3D测量,CMediumCrossHoleGeomative用于跨孔测量。SptManager在创建脚本时,根据装置类型生成相应的Medium实例,并将其关联到脚本的通道中。
|
||||
|
||||
这种关联机制实现了测量逻辑与数据模型的解耦,使得系统能够灵活支持多种测量模式。当脚本执行时,相关的Medium实例负责生成具体的测量序列,而Script类则负责管理整体的测量流程和状态。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Script {
|
||||
+DWORD m_dwID
|
||||
+int m_iEAmount
|
||||
+int m_iSType
|
||||
+int m_iAR
|
||||
+CHandleProcessor m_handleProcessor
|
||||
+_ConnectionPtr m_pConnection
|
||||
}
|
||||
class CScript2D {
|
||||
+CList m_chaList
|
||||
}
|
||||
class CScript3D {
|
||||
+CList m_chaList
|
||||
}
|
||||
class CScriptCE {
|
||||
+CList m_chaList
|
||||
}
|
||||
class CChannel {
|
||||
+int m_iChNumber
|
||||
+CMedium* m_pMedium
|
||||
+CArray m_sptRecArray
|
||||
+int m_iPtAmount
|
||||
}
|
||||
class CMedium {
|
||||
+int m_iAR
|
||||
}
|
||||
class CMedium3D {
|
||||
+void create()
|
||||
+bool generate()
|
||||
+void GenerateSptRecElecVal3D()
|
||||
}
|
||||
class CMediumCrossHoleGeomative {
|
||||
+void create()
|
||||
+bool generate()
|
||||
}
|
||||
Script <|-- CScript2D
|
||||
Script <|-- CScript3D
|
||||
Script <|-- CScriptCE
|
||||
CScript2D --> CChannel
|
||||
CScript3D --> CChannel
|
||||
CScriptCE --> CChannel
|
||||
CChannel --> CMedium
|
||||
CMedium <|-- CMedium3D
|
||||
CMedium <|-- CMediumCrossHoleGeomative
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L1-L800)
|
||||
- [Script.h](file://h/Script.h#L1-L39)
|
||||
|
||||
## 脚本文件(.urf)导出格式
|
||||
|
||||
脚本文件的导出格式采用XML结构,包含了测量任务的完整配置信息。导出的XML文件包含脚本名称、类型、描述、定义者、日期、测量区域、电极数量、通道信息和具体的测量序列。这种结构化的格式便于数据的交换和长期存储。
|
||||
|
||||
在跨孔测量等特殊情况下,系统还会生成额外的坐标文件,记录电极的三维位置信息。这些坐标文件通过C_H_Script标签在主脚本文件中引用,实现了测量配置与空间数据的分离管理。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始导出]) --> CheckType["检查测量类型"]
|
||||
CheckType --> |3D测量| GenerateXML["生成XML结构"]
|
||||
CheckType --> |跨孔测量| GenerateCoord["生成坐标文件"]
|
||||
GenerateXML --> AddHeader["添加XML头部"]
|
||||
AddHeader --> AddBasicInfo["添加基本信息"]
|
||||
AddBasicInfo --> AddChannelInfo["添加通道信息"]
|
||||
AddChannelInfo --> AddLayout["添加测量序列"]
|
||||
AddLayout --> SaveFile["保存文件"]
|
||||
GenerateCoord --> SaveCoord["保存坐标文件"]
|
||||
SaveCoord --> SaveMain["保存主脚本文件"]
|
||||
SaveFile --> End([完成])
|
||||
SaveMain --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L1-L800)
|
||||
- [OpCreate3DSptDlg.cpp](file://cpp/Views/OpCreate3DSptDlg.cpp#L529-L633)
|
||||
|
||||
## 从脚本配置到设备指令的数据流
|
||||
|
||||
从脚本配置到设备指令的生成过程是一个复杂的数据转换流程。首先,用户通过UI界面配置测量参数,这些参数被封装为Script对象。然后,SptManager将Script对象的配置信息转换为数据库记录,实现持久化存储。
|
||||
|
||||
当测量任务执行时,系统从数据库读取脚本配置,通过GD10OperCmd类生成相应的设备指令。这些指令通过USB或蓝牙传输到GD10设备,控制其执行具体的测量操作。整个数据流确保了测量配置的准确传递和执行。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 用户界面
|
||||
participant Script as Script类
|
||||
participant DB as 数据库
|
||||
participant GD10Cmd as GD10OperCmd
|
||||
participant Device as GD10设备
|
||||
UI->>Script : 输入测量配置
|
||||
Script->>DB : 存储脚本配置
|
||||
DB->>Script : 读取脚本配置
|
||||
Script->>GD10Cmd : 请求生成指令
|
||||
GD10Cmd->>GD10Cmd : 生成设备指令
|
||||
GD10Cmd->>Device : 发送指令
|
||||
Device->>Device : 执行测量
|
||||
Device->>GD10Cmd : 返回结果
|
||||
GD10Cmd->>Script : 处理结果
|
||||
Script->>UI : 显示结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [GD10OperCmd.h](file://h/GD10OperCmd.h#L1-L55)
|
||||
- [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp#L1-L800)
|
||||
|
||||
## 结论
|
||||
Script类及其相关SptRecord类构成了Geomative Studio测量脚本管理的核心。通过精心设计的类结构和数据模型,系统实现了对2D、3D及跨孔测量任务的全面支持。从用户交互、数据存储到设备控制的完整数据流,确保了测量过程的准确性和可靠性。这种模块化的设计也为系统的扩展和维护提供了良好的基础。
|
||||
@@ -0,0 +1,286 @@
|
||||
# 测量数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp)
|
||||
- [TestingData.h](file://h\TestingData.h)
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp)
|
||||
- [TdRecord.h](file://h\TdRecord.h)
|
||||
- [Channel.cpp](file://cpp\ProblemZone\Channel.cpp)
|
||||
- [Channel.h](file://h\Channel.h)
|
||||
- [Electrode.cpp](file://cpp\ProblemZone\Electrode.cpp)
|
||||
- [Electrode.h](file://h\Electrode.h)
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp)
|
||||
- [SP2DTd.h](file://h\SP2DTd.h)
|
||||
- [SP2DTdRecord.h](file://h\SP2DTdRecord.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [核心数据模型体系](#核心数据模型体系)
|
||||
3. [TestingData类分析](#testingdata类分析)
|
||||
4. [TdRecord类分析](#tdrecord类分析)
|
||||
5. [通道与电极数据管理](#通道与电极数据管理)
|
||||
6. [地球物理参数计算模型](#地球物理参数计算模型)
|
||||
7. [视图组件与数据可视化](#视图组件与数据可视化)
|
||||
8. [数据采集与处理流程](#数据采集与处理流程)
|
||||
9. [数据校验与异常处理](#数据校验与异常处理)
|
||||
|
||||
## 引言
|
||||
GeomativeStudio测量数据模型体系是一个完整的地球物理数据采集与处理框架,旨在管理从设备采集到的原始测量数据,并将其转换为可用于分析和可视化的地球物理参数。该体系以TestingData类为核心,通过聚合TdRecord、Channel和Electrode等组件,构建了一个层次化的数据容器结构。本文档将深入解析这一数据模型体系,重点阐述其核心组件的职责、相互关系以及数据处理流程。
|
||||
|
||||
## 核心数据模型体系
|
||||
GeomativeStudio的测量数据模型采用面向对象的设计模式,构建了一个层次化的数据容器体系。该体系以TestingData类作为顶层数据容器,负责管理一次完整的测量任务的所有数据。TestingData类通过聚合关系管理多个Channel对象,每个Channel代表一个数据采集通道,负责管理该通道下的所有测量记录(TdRecord)。同时,TestingData类还管理着电极配置(Electrode)信息,定义了测量过程中的电极几何布局。
|
||||
|
||||
该数据模型体系支持多种地球物理测量方法,包括视电阻率(SP)、电阻率反演(Rsp)和激电二次场(Ipsp)等。每种测量方法都有对应的派生类,如SP2DTd、Rsp2DTd和Ipsp2DTd等,这些类继承自TestingData类并实现了特定的计算逻辑。这种设计模式使得系统能够灵活地支持不同的测量技术和数据处理算法。
|
||||
|
||||
**Section sources**
|
||||
- [TestingData.h](file://h\TestingData.h#L158-L273)
|
||||
- [Channel.h](file://h\Channel.h#L19-L34)
|
||||
- [Electrode.h](file://h\Electrode.h#L12-L24)
|
||||
|
||||
## TestingData类分析
|
||||
TestingData类是整个测量数据模型体系的核心,作为顶层数据容器负责管理一次测量任务的所有相关数据。该类在构造时接收一个数据库连接指针和任务ID,用于与数据库进行交互。类中定义了大量的成员变量,用于存储测量任务的元数据,包括任务名称、位置、测量类型、电极数量、测量模式等。
|
||||
|
||||
该类通过m_tdChaList成员变量管理多个Channel对象,形成了一对多的聚合关系。每个Channel对象代表一个独立的数据采集通道,可以同步采集多通道数据。TestingData类还提供了丰富的数据操作方法,包括数据加载(LoadData)、数据保存(SaveTdToExcelFile、SaveTdToRes2DFile等)和数据显示(ShowConList、ShowGrList等)。
|
||||
|
||||
特别值得注意的是,TestingData类中定义了复杂的时窗计算相关结构体,如_WinTime、_WinTimeList和_WaveCount,这些结构体用于存储和处理激电测量中的时域信息。类中的CalculateTWInfo和CalculateTimeWindows方法实现了激电数据的时窗积分和参数计算,这是激电测量数据处理的核心算法。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingData {
|
||||
+DWORD m_dwID
|
||||
+CString m_szTdName
|
||||
+CString m_szTdCN
|
||||
+int m_iSType
|
||||
+int m_iTType
|
||||
+int m_iEAmount
|
||||
+float m_fESpace
|
||||
+CString m_szEDistance
|
||||
+CPtrList m_tdChaList
|
||||
+_WaveCount* m_waveCount
|
||||
+CTestingData(DWORD, _ConnectionPtr&)
|
||||
+virtual ~CTestingData()
|
||||
+bool ShowConListByPage(CListCtrl&, int)
|
||||
+BOOL SaveOrgDataToDB(DWORD)
|
||||
+bool CalculateTWInfo(CStringArray*, int)
|
||||
+bool CalculateTimeWindows(_WinTimeList, CStringArray*, int, int, int, int, int)
|
||||
}
|
||||
class CChannel {
|
||||
+int m_iChNumber
|
||||
+int m_iMaxLevel
|
||||
+int m_iPtAmount
|
||||
+int m_iEAmount
|
||||
+CMedium* m_pMedium
|
||||
+CPtrArray m_sptRecArray
|
||||
+CChannel()
|
||||
+virtual ~CChannel()
|
||||
+void ClearSptRecList()
|
||||
}
|
||||
class CElectrode {
|
||||
+CString m_szECode
|
||||
+BOOL m_bCState
|
||||
+CString m_szMDate
|
||||
+CString m_szMTime
|
||||
+float m_fOMValue
|
||||
+CElectrode()
|
||||
+virtual ~CElectrode()
|
||||
}
|
||||
CTestingData --> CChannel : "聚合"
|
||||
CTestingData --> CElectrode : "聚合"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingData.h](file://h\TestingData.h#L158-L273)
|
||||
- [Channel.h](file://h\Channel.h#L19-L34)
|
||||
- [Electrode.h](file://h\Electrode.h#L12-L24)
|
||||
|
||||
**Section sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L29-L85)
|
||||
- [TestingData.h](file://h\TestingData.h#L158-L273)
|
||||
|
||||
## TdRecord类分析
|
||||
TdRecord类是测量数据模型中的基本数据单元,代表一次具体的测量记录。该类作为抽象基类,定义了测量记录的基本结构和通用操作。每个TdRecord对象包含测量的基本参数,如通道ID(m_dwChID)、测点编号(m_iTsn)、电极配置参数(m_iN)、几何因子(m_fK)、电流(m_fI)、电压(m_fV)、视电阻率(m_fSP)等。
|
||||
|
||||
该类的核心功能是管理原始测量数据,通过m_saVRawData和m_saIRawData两个CStringArray成员变量存储电压和电流的原始波形数据。类中定义了LoadOrgData纯虚函数,由派生类实现具体的原始数据加载逻辑。同时,该类提供了ConvertVOrgData方法,用于将原始电压数据转换为实际物理值。
|
||||
|
||||
TdRecord类还实现了原始数据的可视化功能,通过DisplayRawDataSplines方法可以显示电压原始波形曲线。该方法首先调用LoadOrgData加载原始数据,然后创建CDispTdRecSplinesGrapDlg对话框来显示波形。类中还维护了m_fMaxAbsV变量,用于存储电压原始数据的最大绝对值,这在波形显示时用于确定Y轴的缩放比例。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTdRecord {
|
||||
+DWORD m_dwChID
|
||||
+int m_iTsn
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+float m_fI
|
||||
+float m_fV
|
||||
+float m_fR0
|
||||
+float m_fSP
|
||||
+CString m_Datetime
|
||||
+CStringArray m_saVRawData
|
||||
+CStringArray m_saIRawData
|
||||
+_ConnectionPtr m_pConnection
|
||||
+CTdRecord(_ConnectionPtr&)
|
||||
+virtual ~CTdRecord()
|
||||
+float GetMaxAbsV()
|
||||
+virtual void DisplayRawDataSplines()
|
||||
+virtual BOOL LoadOrgData()
|
||||
+virtual float ConvertVOrgData(float)
|
||||
}
|
||||
CTdRecord <|-- SP2DTdRecord : "继承"
|
||||
CTdRecord <|-- Rsp2DTdRecord : "继承"
|
||||
CTdRecord <|-- Ipsp2DTdRecord : "继承"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TdRecord.h](file://h\TdRecord.h#L12-L46)
|
||||
- [SP2DTdRecord.h](file://h\SP2DTdRecord.h)
|
||||
|
||||
**Section sources**
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp#L21-L325)
|
||||
- [TdRecord.h](file://h\TdRecord.h#L12-L46)
|
||||
|
||||
## 通道与电极数据管理
|
||||
通道(Channel)和电极(Electrode)是测量数据模型中的两个关键组件,分别负责管理数据采集通道和电极配置信息。Channel类作为数据采集通道的抽象,每个Channel对象代表一个独立的采集通道,可以同步采集多通道数据。类中通过m_sptRecArray成员变量管理多个SptRecord对象,这些对象代表了该通道下的所有测量脚本记录。
|
||||
|
||||
Channel类还与测量装置(Medium)相关联,通过m_pMedium指针引用具体的测量装置配置。不同的测量装置类型(如温纳装置、施伦贝谢装置等)决定了电极的排列方式和测量方法。类中定义了m_iEAmount成员变量来记录该通道使用的电极数量,m_iMaxLevel记录了测量的最大层级。
|
||||
|
||||
Electrode类则负责管理单个电极的配置信息,包括电极编码(m_szECode)、连接状态(m_bCState)、测量日期时间(m_szMDate, m_szMTime)和测量值(m_fOMValue)等。这些信息对于确保测量数据的准确性和可追溯性至关重要。在多通道同步采集场景中,多个Channel对象可以共享相同的电极配置,从而实现高效的多通道数据采集。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CChannel {
|
||||
+int m_iChNumber
|
||||
+int m_iMaxLevel
|
||||
+int m_iPtAmount
|
||||
+int m_iEAmount
|
||||
+CMedium* m_pMedium
|
||||
+CPtrArray m_sptRecArray
|
||||
+CChannel()
|
||||
+virtual ~CChannel()
|
||||
+void ClearSptRecList()
|
||||
}
|
||||
class CElectrode {
|
||||
+CString m_szECode
|
||||
+BOOL m_bCState
|
||||
+CString m_szMDate
|
||||
+CString m_szMTime
|
||||
+float m_fOMValue
|
||||
+CElectrode()
|
||||
+virtual ~CElectrode()
|
||||
}
|
||||
class CMedium {
|
||||
+int m_iType
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+CMedium()
|
||||
+virtual ~CMedium()
|
||||
}
|
||||
CChannel --> CMedium : "关联"
|
||||
CChannel --> CElectrode : "使用"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Channel.h](file://h\Channel.h#L19-L34)
|
||||
- [Electrode.h](file://h\Electrode.h#L12-L24)
|
||||
|
||||
**Section sources**
|
||||
- [Channel.cpp](file://cpp\ProblemZone\Channel.cpp#L11-L48)
|
||||
- [Channel.h](file://h\Channel.h#L19-L34)
|
||||
- [Electrode.cpp](file://cpp\ProblemZone\Electrode.cpp#L18-L27)
|
||||
- [Electrode.h](file://h\Electrode.h#L12-L24)
|
||||
|
||||
## 地球物理参数计算模型
|
||||
GeomativeStudio支持多种地球物理参数的计算,主要包括视电阻率(SP)、电阻率反演(Rsp)和激电二次场(Ipsp)等。这些参数的计算模型在相应的派生类中实现,如SP2DTd、Rsp2DTd和Ipsp2DTd等。这些类继承自TestingData类,并重写了特定的计算方法。
|
||||
|
||||
对于视电阻率(SP)计算,系统根据测量装置类型和电极配置,使用相应的几何因子(K)和测量得到的电压(V)、电流(I)值,通过公式ρa = K × (V/I)计算得到视电阻率。这一计算过程在SP2DTd类的实现中完成,该类还负责将计算结果保存到数据库中,并提供数据导出功能。
|
||||
|
||||
激电二次场(Ipsp)的计算更为复杂,涉及时域数据的处理。系统通过CalculateTWInfo方法对原始电压波形进行多项式拟合,然后在预定义的时窗内进行积分计算,得到二次场面积。再结合充电末期电压(Vp),通过公式M = 积分面积/Vp计算得到充电率(M)参数。这一过程充分利用了_WaveCount结构体来管理多时窗的计算结果。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> LoadOrgData["加载原始数据"]
|
||||
LoadOrgData --> Preprocess["数据预处理"]
|
||||
Preprocess --> FitCurve["电压波形多项式拟合"]
|
||||
FitCurve --> DefineTW["定义时窗"]
|
||||
DefineTW --> Integrate["时窗内积分计算"]
|
||||
Integrate --> CalcVp["计算充电末期电压Vp"]
|
||||
CalcVp --> CalcM["计算充电率M = 积分面积/Vp"]
|
||||
CalcM --> CalcETA["计算极化率η = 100×V2/Vp"]
|
||||
CalcETA --> Output["输出Ipsp参数"]
|
||||
Output --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L463-L566)
|
||||
- [TestingData.h](file://h\TestingData.h#L171-L172)
|
||||
|
||||
**Section sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L463-L566)
|
||||
- [SP2DTd.h](file://h\SP2DTd.h#L17-L58)
|
||||
|
||||
## 视图组件与数据可视化
|
||||
视图组件负责将测量数据转换为可视化图形,其中AppDataSP2DTdView是视电阻率2D测量数据的视图组件。该组件采用MFC的文档/视图架构,通过CSplitterWnd实现多窗格界面布局。在Create方法中,它创建了一个水平分割器(m_firstSplitter)和一个垂直分割器(m_secondSplitter),将视图窗口划分为三个区域。
|
||||
|
||||
左侧区域显示测量数据详情列表(CAppDataTdDetailListView),右侧上部区域显示数据内容列表(CAppDataSP2DTdConListView),右侧下部区域显示接地电阻列表(CAppDataTdGrListView)。这种布局使得用户可以同时查看测量数据的不同方面,提高了数据浏览的效率。
|
||||
|
||||
视图组件通过OnSize方法处理窗口大小调整事件,确保分割器能够正确地重新布局。当窗口大小改变时,它会调用RecalcLayout方法重新计算分割器的布局,保持界面的整洁和可用性。这种设计模式使得视图组件能够适应不同大小的显示区域,提供了良好的用户体验。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A([AppDataSP2DTdView]) --> B["m_firstSplitter\n水平分割器"]
|
||||
B --> C["左侧窗格\nCAppDataTdDetailListView"]
|
||||
B --> D["右侧窗格"]
|
||||
D --> E["m_secondSplitter\n垂直分割器"]
|
||||
E --> F["上部窗格\nCAppDataSP2DTdConListView"]
|
||||
E --> G["下部窗格\nCAppDataTdGrListView"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp#L71-L107)
|
||||
|
||||
**Section sources**
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp#L25-L123)
|
||||
|
||||
## 数据采集与处理流程
|
||||
测量数据的采集与处理流程从设备数据包接收开始,经过解析、存储到数据库,最终完成数据校验和异常值处理。流程首先通过设备对象的ReceiveFile方法从设备获取ORG格式的原始数据文件。这些文件包含了电压和电流的原始波形数据,以文本格式存储。
|
||||
|
||||
获取到ORG文件后,系统通过CMarkup类解析XML格式的数据,提取出每个测点的电压和电流原始数据。然后,通过SQL语句将这些原始数据更新到数据库的相应记录中。这一过程在TestingData类的SaveOrgDataToDB方法中实现,确保了原始数据的完整性和可追溯性。
|
||||
|
||||
数据处理阶段,系统从数据库中读取原始数据,通过SplitterString函数将其按分号分割成数组,然后对每个数据点进行转换和处理。电压数据会经过adc_calculate方法进行校准,将ADC值转换为实际的电压值。处理后的数据被存储在TdRecord对象中,供后续的参数计算和可视化使用。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 设备 as "测量设备"
|
||||
participant 应用程序 as "应用程序"
|
||||
participant 数据库 as "数据库"
|
||||
设备->>应用程序 : 发送ORG数据包
|
||||
应用程序->>应用程序 : 接收并保存为本地文件
|
||||
应用程序->>应用程序 : 使用CMarkup解析XML
|
||||
应用程序->>数据库 : 执行SQL更新原始数据
|
||||
数据库-->>应用程序 : 确认更新完成
|
||||
应用程序->>应用程序 : 从数据库读取原始数据
|
||||
应用程序->>应用程序 : 分割并转换数据
|
||||
应用程序->>应用程序 : 存储处理后的数据
|
||||
应用程序-->>用户 : 显示处理结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L326-L420)
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp#L34-L211)
|
||||
|
||||
**Section sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L326-L420)
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp#L34-L211)
|
||||
|
||||
## 数据校验与异常处理
|
||||
系统实现了多层次的数据校验与异常处理机制,确保测量数据的准确性和系统的稳定性。在数据采集阶段,系统会检查接收到的ORG文件是否完整,如果接收失败会向用户显示错误信息。在数据解析阶段,系统会对原始数据进行有效性检查,如检查电压和电流数据的长度是否匹配。
|
||||
|
||||
在参数计算阶段,系统特别关注关键参数的合理性。例如,在计算充电率(M)时,系统会检查充电末期电压(Vp)是否为零,如果为零会弹出错误提示,因为这会导致除零错误。这种预防性检查避免了计算过程中的数值异常,保证了计算结果的可靠性。
|
||||
|
||||
异常处理主要通过C++的异常机制和MFC的消息框实现。对于数据库操作异常,系统捕获_com_error异常并显示详细的错误描述。对于用户可感知的错误,如Vp为零的情况,系统会根据当前语言设置显示中文或英文的错误消息,提高了系统的国际化支持能力。
|
||||
|
||||
**Section sources**
|
||||
- [TestingData.cpp](file://cpp\ProblemZone\TestingData.cpp#L505-L512)
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp#L115-L118)
|
||||
+218
@@ -0,0 +1,218 @@
|
||||
# 激电二次场数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp)
|
||||
- [Ipsp3DTd.cpp](file://cpp/ProblemZone/Ipsp3DTd.cpp)
|
||||
- [IpspCETd.cpp](file://cpp/ProblemZone/IpspCETd.cpp)
|
||||
- [Ipsp2DTd.h](file://h/Ipsp2DTd.h)
|
||||
- [Ipsp3DTd.h](file://h/Ipsp3DTd.h)
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
- [Ipsp2DTdRecord.h](file://h/Ipsp2DTdRecord.h)
|
||||
- [Ipsp3DTdRecord.h](file://h/Ipsp3DTdRecord.h)
|
||||
- [IpspCETdRecord.h](file://h/IpspCETdRecord.h)
|
||||
- [TdChannel.h](file://h/TdChannel.h)
|
||||
- [Channel.h](file://h/Channel.h)
|
||||
- [AppDataIpspCETdView.cpp](file://cpp/Views/AppDataIpspCETdView.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [Ipsp系列类架构](#ipsp系列类架构)
|
||||
3. [核心数据结构与物理参数](#核心数据结构与物理参数)
|
||||
4. [供电周期与采样时序处理](#供电周期与采样时序处理)
|
||||
5. [时序对齐机制](#时序对齐机制)
|
||||
6. [可视化组件与剖面生成](#可视化组件与剖面生成)
|
||||
7. [数据处理流程](#数据处理流程)
|
||||
8. [数据质量控制](#数据质量控制)
|
||||
|
||||
## 引言
|
||||
Ipsp系列类(Ipsp2DTd、Ipsp3DTd、IpspCETd)是Geomative Studio软件中用于处理时间域激电法(TDIP)二次场数据的核心组件。这些类定义了从数据采集、存储、处理到可视化的完整数据模型,支持二维、三维及一维中心激电(CEIP)等多种测量模式。该数据模型不仅管理原始电压信号,还负责计算关键的地球物理参数,如视极化率、半衰时和衰减系数,为地质解释提供基础数据。
|
||||
|
||||
## Ipsp系列类架构
|
||||
Ipsp系列类继承自`CTestingData`基类,形成一个层次化的数据处理体系。每个类针对特定的测量模式进行优化,但共享统一的数据管理接口。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CTestingData {
|
||||
+DWORD m_dwID
|
||||
+_ConnectionPtr& m_pConnection
|
||||
+virtual BOOL LoadData(CLinkList<CMedium*>& m_medLinkList)
|
||||
+virtual BOOL SaveData()
|
||||
}
|
||||
class CIpsp2DTd {
|
||||
+BOOL ShowConList(CListCtrl &tdConList)
|
||||
+BOOL ShowGrList(CListCtrl &tdGrList)
|
||||
+int GetFitEquationInfo(int nTSN, double nPeriod)
|
||||
}
|
||||
class CIpsp3DTd {
|
||||
+BOOL ShowConList(CListCtrl &tdConList)
|
||||
+BOOL ShowGrList(CListCtrl &tdGrList)
|
||||
+int GetFitEquationInfo(int nTSN, double nPeriod)
|
||||
}
|
||||
class CIpspCETd {
|
||||
+BOOL ShowConList(CListCtrl &tdConList)
|
||||
+BOOL ShowGrList(CListCtrl &tdGrList)
|
||||
+int GetFitEquationInfo(int nTSN, double nPeriod)
|
||||
+BOOL SaveCERSPSetInfo(COpExec2DRSPTestSetDlg* pOpExec2DRSPTestSetDlg, CLinkList<CMedium*>& m_medLinkList)
|
||||
}
|
||||
CTestingData <|-- CIpsp2DTd
|
||||
CTestingData <|-- CIpsp3DTd
|
||||
CTestingData <|-- CIpspCETd
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Ipsp2DTd.h](file://h/Ipsp2DTd.h)
|
||||
- [Ipsp3DTd.h](file://h/Ipsp3DTd.h)
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
|
||||
**节源**
|
||||
- [Ipsp2DTd.h](file://h/Ipsp2DTd.h)
|
||||
- [Ipsp3DTd.h](file://h/Ipsp3DTd.h)
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
|
||||
## 核心数据结构与物理参数
|
||||
Ipsp系列类通过`CIpspXDTdRecord`记录类管理每个测点的详细数据。这些记录类继承自`CTdRecord`,并根据测量模式定义了特定的数据结构。
|
||||
|
||||
### 数据结构定义
|
||||
| 类型 | 字段 | 描述 | 物理意义 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **CIpsp2DTdRecord** | m_iC1, m_iC2 | 供电电极编号 | 电流电极A、B的位置 |
|
||||
| | m_iP1, m_iP2 | 测量电极编号 | 电位电极M、N的位置 |
|
||||
| | m_iLevel, m_iPosInLevel | 测点层级与位置 | 在二维剖面中的空间索引 |
|
||||
| **CIpsp3DTdRecord** | m_iC1, m_iC2 | 供电电极编号 | 电流电极A、B的位置 |
|
||||
| | m_iP1, m_iP2 | 测量电极编号 | 电位电极M、N的位置 |
|
||||
| | m_iLevel, m_iPosInLevel | 测点层级与位置 | 在三维网格中的空间索引 |
|
||||
| **CIpspCETdRecord** | m_fA, m_fB | 电极距 | AB/2和MN/2的距离 |
|
||||
| | m_fX, m_fY | 坐标 | 测点在地表的平面位置 |
|
||||
| | m_fDepth | 深度 | 当前测量的深度层 |
|
||||
|
||||
### 关键物理参数计算
|
||||
#### 二次场电压与视极化率
|
||||
二次场电压(V)和视极化率(SP)是直接从数据库中读取的核心参数。视极化率(SP)是二次场电压与一次场电压的比值,通常以毫秒(ms)或百分比(%)表示。
|
||||
|
||||
#### 半衰时(Half-Life Time)
|
||||
半衰时是激电响应衰减到其初始值一半所需的时间,是反映极化体弛豫特性的重要参数。其计算通过`GetFitEquationInfo`方法实现,该方法利用多项式拟合和二分法求解。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> LoadData["加载原始数据"]
|
||||
LoadData --> CalcPeriod["计算供电周期"]
|
||||
CalcPeriod --> ExtractData["提取放电阶段数据"]
|
||||
ExtractData --> FitCurve["多项式拟合衰减曲线"]
|
||||
FitCurve --> SolveHL["二分法求解半衰时"]
|
||||
SolveHL --> AverageHL["计算多次放电的平均半衰时"]
|
||||
AverageHL --> Return["返回半衰时结果"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L446-L509)
|
||||
- [Ipsp3DTd.cpp](file://cpp/ProblemZone/Ipsp3DTd.cpp)
|
||||
- [IpspCETd.cpp](file://cpp/ProblemZone/IpspCETd.cpp)
|
||||
|
||||
**节源**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L446-L509)
|
||||
|
||||
#### 衰减系数
|
||||
衰减系数描述了激电响应的衰减速率。虽然代码中未直接命名“衰减系数”,但通过多项式拟合得到的系数数组(`dCoefficient`)本质上包含了衰减的数学模型,可用于计算衰减率。
|
||||
|
||||
## 供电周期与采样时序处理
|
||||
Ipsp系列类通过`GetCycle`函数将数据库中的`TRfrequency`值转换为实际的供电周期(秒)。该周期是计算半衰时等参数的关键输入。
|
||||
|
||||
```cpp
|
||||
// 伪代码:供电周期处理
|
||||
double dPeriod = GetCycle(nTmp); // 将频率索引转换为周期
|
||||
int nDataNum = atoi(m_saVRawData.GetAt(3)); // 获取采样点数
|
||||
double dSplit = dPeriod / (nDataNum - 1); // 计算时间间隔
|
||||
```
|
||||
采样时序数据存储在`m_saVRawData`字符串数组中,其中包含了完整的电压时间序列。数据处理时,根据供电周期将时间序列分割成多个时窗,分别对每个时窗进行分析。
|
||||
|
||||
**节源**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L453-L454)
|
||||
|
||||
## 时序对齐机制
|
||||
Ipsp系列类通过`CTdChannel`类与`Channel`类实现时序对齐。`CTdChannel`是`IpspXDTd`类的数据通道,它管理一个`m_tdRecArray`数组,该数组按测点编号(TSN)顺序存储`CIpspXDTdRecord`记录。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CIpspCETd {
|
||||
+CLinkList<CTdChannel*> m_tdChaList
|
||||
}
|
||||
class CTdChannel {
|
||||
+DWORD m_dwID
|
||||
+int m_iChNum
|
||||
+CMedium* m_pMedium
|
||||
+CPtrArray m_tdRecArray
|
||||
+CTdRecord* GetTdRecord(int iTSN)
|
||||
}
|
||||
class CIpspCETdRecord {
|
||||
+int m_iTSN
|
||||
+CStringArray m_saVRawData
|
||||
}
|
||||
CIpspCETd --> CTdChannel : "包含"
|
||||
CTdChannel --> CIpspCETdRecord : "包含"
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
- [TdChannel.h](file://h/TdChannel.h)
|
||||
- [IpspCETdRecord.h](file://h/IpspCETdRecord.h)
|
||||
|
||||
**节源**
|
||||
- [IpspCETd.h](file://h/IpspCETd.h)
|
||||
- [TdChannel.h](file://h/TdChannel.h)
|
||||
|
||||
## 可视化组件与剖面生成
|
||||
`AppDataIpspCETdView`类负责IpspCETd数据的可视化展示。它使用`CSplitterWnd`将视图分割为三个面板:详细信息、数据内容列表和接地电阻列表。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
AppDataIpspCETdView["CAppDataIpspCETdView"] --> m_firstSplitter["m_firstSplitter (1x2)"]
|
||||
m_firstSplitter --> m_pDetailListView["m_pDetailListView (详情)"]
|
||||
m_firstSplitter --> m_secondSplitter["m_secondSplitter (2x1)"]
|
||||
m_secondSplitter --> m_pContentListView["m_pContentListView (数据内容)"]
|
||||
m_secondSplitter --> m_pGrListView["m_pGrListView (接地电阻)"]
|
||||
```
|
||||
|
||||
**图源**
|
||||
- [AppDataIpspCETdView.cpp](file://cpp/Views/AppDataIpspCETdView.cpp)
|
||||
|
||||
**节源**
|
||||
- [AppDataIpspCETdView.cpp](file://cpp/Views/AppDataIpspCETdView.cpp)
|
||||
|
||||
激电剖面的生成逻辑如下:
|
||||
1. **数据加载**:`CIpspCETd::LoadData`方法从数据库加载所有通道和测点数据。
|
||||
2. **数据组织**:数据按通道和测点编号有序存储在`m_tdChaList`和`m_tdRecArray`中。
|
||||
3. **参数计算**:调用`GetFitEquationInfo`等方法计算半衰时、视极化率等参数。
|
||||
4. **视图更新**:`ShowConList`方法将计算结果填充到`CListCtrl`控件中,形成可交互的剖面图。
|
||||
|
||||
## 数据处理流程
|
||||
完整的数据处理流程涵盖了从原始信号到最终解释参数的转换。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
RawData["原始电压信号"] --> Filter["信号滤波"]
|
||||
Filter --> BackgroundSub["背景噪声扣除"]
|
||||
BackgroundSub --> ParameterExtract["参数提取"]
|
||||
ParameterExtract --> HalfLife["半衰时计算"]
|
||||
ParameterExtract --> DecayCoeff["衰减系数计算"]
|
||||
ParameterExtract --> ApparentCharge["视极化率计算"]
|
||||
HalfLife --> QC["数据质量控制"]
|
||||
DecayCoeff --> QC
|
||||
ApparentCharge --> QC
|
||||
QC --> Output["输出结果"]
|
||||
```
|
||||
|
||||
**节源**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L446-L509)
|
||||
|
||||
## 数据质量控制
|
||||
数据质量控制策略主要体现在以下几个方面:
|
||||
1. **异常值处理**:在`ShowDetailInfo`和`ShowGrList`方法中,对数据库中的空值(`VT_NULL`)和特殊值(如"-9999")进行检查和处理,避免无效数据显示。
|
||||
2. **数据完整性验证**:在`ShowConList`等方法中,通过检查`GetRecordCount()`确保数据库查询结果有效,若无数据则返回错误。
|
||||
3. **错误捕获**:使用`try-catch`块捕获数据库操作中的`_com_error`异常,确保程序的健壮性。
|
||||
4. **数据对齐**:通过`TSN`(测点编号)确保不同通道的数据在时间和空间上正确对齐。
|
||||
|
||||
**节源**
|
||||
- [Ipsp2DTd.cpp](file://cpp/ProblemZone/Ipsp2DTd.cpp#L372-L395)
|
||||
- [IpspCETd.cpp](file://cpp/ProblemZone/IpspCETd.cpp#L604-L610)
|
||||
+208
@@ -0,0 +1,208 @@
|
||||
# 电阻率反演数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp)
|
||||
- [Rsp3DTd.cpp](file://cpp\Views\Rsp3DTd.cpp)
|
||||
- [RspCETd.cpp](file://cpp\ProblemZone\RspCETd.cpp)
|
||||
- [AppDataRsp3DTdView.cpp](file://cpp\Views\AppDataRsp3DTdView.cpp)
|
||||
- [Rsp3DTdRecord.cpp](file://cpp\Views\Rsp3DTdRecord.cpp)
|
||||
- [Medium3D.h](file://h\Medium3D.h)
|
||||
- [MediumCrossHoleGeomative.h](file://h\MediumCrossHoleGeomative.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [核心数据结构与输入输出](#核心数据结构与输入输出)
|
||||
3. [反演算法流程与中间数据存储](#反演算法流程与中间数据存储)
|
||||
4. [反演结果精度评估指标](#反演结果精度评估指标)
|
||||
5. [反演剖面图生成流程](#反演剖面图生成流程)
|
||||
6. [SP原始数据依赖关系](#sp原始数据依赖关系)
|
||||
7. [不同地质模型适配策略](#不同地质模型适配策略)
|
||||
8. [反演流程数据流图](#反演流程数据流图)
|
||||
9. [典型配置参数及其影响](#典型配置参数及其影响)
|
||||
|
||||
## 引言
|
||||
本文档旨在全面解析Geomative Studio软件中Rsp系列类(`Rsp2DTd`、`Rsp3DTd`、`RspCETd`)实现的电阻率反演数据模型。该模型是地球物理勘探中用于解释野外采集的电阻率数据的核心算法,通过将观测到的视电阻率数据与理论正演模型进行对比,迭代更新地下电性结构模型,最终获得与实际地质情况相符的电阻率分布剖面。文档将重点阐述反演算法的数据结构、迭代过程、精度评估、可视化生成以及与不同地质模型的适配机制。
|
||||
|
||||
## 核心数据结构与输入输出
|
||||
|
||||
### 输入数据结构
|
||||
反演模型的输入数据主要来源于野外采集的原始测量数据,其核心结构由`CTestingData`基类及其派生类(如`CRsp2DTd`、`CRsp3DTd`)定义。输入数据主要包括:
|
||||
- **测量任务元数据**:存储在`td`数据库表中,包含任务名称(`TDname`)、位置(`Tlocation`)、设备信息(`DESN`)、脚本信息(`SCCN`、`Sname`)、测量模式(`Tmode`)、电极数量(`Eamount`)、电极间距(`Edistance`)等。
|
||||
- **测量配置参数**:包括电流频率(`TRfrequency`)、工业频率(`Ifrequency`)、采样率(`SAfrequency`)、装置类型(`Clayout`)、气象信息(`weather`、`temperature`)等。
|
||||
- **原始测量记录**:存储在`td2dcon`、`td3dcon`、`td1dcon`等数据库表中,每条记录包含电极配置(`C1`, `C2`, `P1`, `P2`)、几何因子(`K`)、测量电流(`I`)、测量电压(`V`)、计算得到的视电阻率(`R0`)和视极化率(`SP`)等。
|
||||
|
||||
### 输出数据结构
|
||||
反演过程的输出是经过迭代优化后的地下电阻率模型,其数据结构体现在:
|
||||
- **反演结果数据**:最终的电阻率模型以网格化数据的形式存储,每个网格单元包含其位置坐标和反演得到的电阻率值。这些数据通常通过`SaveHeadInfoToFile`方法以XML格式导出,文件中包含`measure`根节点下的`medium_set`、`pole_count`、`pole_distance`等关键信息。
|
||||
- **中间迭代数据**:在迭代过程中,每次迭代的模型参数和拟合误差会被临时存储在内存中,以便进行收敛性判断和结果回溯。
|
||||
|
||||
**Section sources**
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp#L56-L57)
|
||||
- [Rsp3DTd.cpp](file://cpp\Views\Rsp3DTd.cpp#L43-L44)
|
||||
- [RspCETd.cpp](file://cpp\ProblemZone\RspCETd.cpp#L34-L35)
|
||||
|
||||
## 反演算法流程与中间数据存储
|
||||
|
||||
### 迭代过程
|
||||
电阻率反演是一个非线性优化问题,通常采用最小二乘法或其变种(如阻尼最小二乘法)进行求解。其核心迭代流程如下:
|
||||
1. **初始化**:根据用户输入的初始模型(通常为均匀半空间或简单分层模型)和测量数据,构建初始的地下电性结构模型。
|
||||
2. **正演计算**:基于当前的模型,计算所有测量点的理论视电阻率值。
|
||||
3. **误差计算**:将理论计算值与实际观测值进行对比,计算残差(Residual)和目标函数(如均方根误差RMSE)。
|
||||
4. **模型更新**:根据残差和雅可比矩阵(Jacobian Matrix,描述模型参数变化对观测值的影响),计算模型参数的更新量,并更新地下模型。
|
||||
5. **收敛判断**:检查目标函数是否小于预设阈值,或迭代次数是否达到上限。若未收敛,则返回步骤2继续迭代。
|
||||
|
||||
### 中间数据存储机制
|
||||
在迭代过程中,关键的中间数据通过以下方式存储:
|
||||
- **内存链表**:`CTestingData`类使用`CLinkList<CTdChannel*> m_tdChaList`来管理所有通道(Channel)的数据。每个`CTdChannel`对象又通过`CPtrArray m_tdRecArray`来存储该通道下所有测量点(`CRsp3DTdRecord`等)的详细记录。
|
||||
- **数据库持久化**:原始测量数据和部分中间结果(如每次迭代的模型快照)会持久化存储在Access数据库中,相关的表包括`td`(任务头信息)、`tdchannel`(通道信息)、`td3dcon`(3D测量记录)等。
|
||||
- **XML文件缓存**:`SaveHeadInfoToFile`方法将当前的测量配置和模型信息序列化为XML文件,用于临时缓存和后续处理。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[初始化模型] --> B[正演计算]
|
||||
B --> C[计算理论视电阻率]
|
||||
C --> D[与观测值对比]
|
||||
D --> E[计算残差和目标函数]
|
||||
E --> F{是否收敛?}
|
||||
F --> |否| G[计算模型更新量]
|
||||
G --> H[更新地下模型]
|
||||
H --> B
|
||||
F --> |是| I[输出最终模型]
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [Rsp3DTd.cpp](file://cpp\Views\Rsp3DTd.cpp#L43-L51)
|
||||
- [Rsp3DTdRecord.cpp](file://cpp\Views\Rsp3DTdRecord.cpp#L18-L38)
|
||||
|
||||
## 反演结果精度评估指标
|
||||
|
||||
反演结果的精度主要通过以下指标进行评估:
|
||||
- **均方根误差 (RMSE)**:这是最核心的评估指标,衡量反演模型预测值与实际观测值之间的平均差异。RMSE值越小,说明模型拟合度越高。其计算公式为:`RMSE = sqrt(Σ(observed_i - predicted_i)² / N)`,其中N为数据点总数。
|
||||
- **拟合优度 (Goodness of Fit, GOF)**:通常以百分比形式表示,反映观测数据被模型解释的程度。GOF越高,模型越好。
|
||||
- **模型光滑度 (Model Smoothness)**:在反演目标函数中通常会加入一个正则化项,用于控制模型的复杂度,防止出现过度拟合的“斑点”模型。一个合理的模型应在拟合度和光滑度之间取得平衡。
|
||||
- **残差分布图**:通过绘制残差的空间分布图,可以直观地判断模型在哪些区域拟合不佳,从而指导模型的进一步调整。
|
||||
|
||||
**Section sources**
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp#L576-L798)
|
||||
- [Rsp3DTd.cpp](file://cpp\Views\Rsp3DTd.cpp#L586-L798)
|
||||
|
||||
## 反演剖面图生成流程
|
||||
|
||||
反演剖面图的生成流程主要由`AppDataRsp3DTdView`类负责,其逻辑如下:
|
||||
|
||||
### 渲染逻辑
|
||||
1. **视图创建**:`AppDataRsp3DTdView::Create`方法在创建时,会初始化一个分割窗口(Splitter Window),将主视图划分为三个子视图。
|
||||
2. **子视图布局**:
|
||||
- **左侧视图**:创建`CAppDataTdDetailListView`,用于显示任务的详细信息列表。
|
||||
- **右侧上半部分**:创建`CAppDataRsp3DTdConListView`,用于显示测量数据的内容列表(即`ShowConList`方法填充的数据)。
|
||||
- **右侧下半部分**:创建`CAppDataTdGrListView`,用于显示电极状态和质量控制(GR)信息列表。
|
||||
3. **数据绑定与更新**:每个子视图在`OnInitialUpdate`时,会从其关联的文档(Document)中获取数据,并调用相应的`ShowDetailInfo`、`ShowConList`或`ShowGrList`方法来填充列表控件(`CListCtrl`)。
|
||||
4. **动态调整**:当窗口大小改变时,`OnSize`方法会重新计算分割窗口的布局,确保各子视图按比例正确显示。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "AppDataRsp3DTdView"
|
||||
A[主视图] --> B[分割窗口1]
|
||||
B --> C[左侧: 详情列表]
|
||||
B --> D[右侧: 分割窗口2]
|
||||
D --> E[上半: 数据内容列表]
|
||||
D --> F[下半: GR信息列表]
|
||||
end
|
||||
C --> G[ShowDetailInfo]
|
||||
E --> H[ShowConList]
|
||||
F --> I[ShowGrList]
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [AppDataRsp3DTdView.cpp](file://cpp\Views\AppDataRsp3DTdView.cpp#L69-L97)
|
||||
|
||||
## SP原始数据依赖关系
|
||||
|
||||
电阻率反演模型与SP(激发极化)原始数据存在紧密的依赖关系:
|
||||
- **数据来源**:SP原始数据是反演算法的直接输入。`CRspCETd`和`CRsp2DTd`等类通过`LoadData`方法从数据库(如`td1dcon`、`td2dcon`表)中加载包含视极化率(`SP`)字段的测量记录。
|
||||
- **数据处理**:在`ShowConList`方法中,代码会从数据库读取`SP`字段的值,并将其格式化后显示在用户界面的列表控件中。这表明SP数据是整个数据处理流程中的一个关键环节。
|
||||
- **联合反演**:虽然当前代码主要展示了电阻率反演,但SP数据的存在暗示了系统可能支持电阻率与激发极化数据的联合反演,以获得更全面的地下物性信息。
|
||||
|
||||
**Section sources**
|
||||
- [RspCETd.cpp](file://cpp\ProblemZone\RspCETd.cpp#L501-L575)
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp#L297-L377)
|
||||
|
||||
## 不同地质模型适配策略
|
||||
|
||||
系统通过`Medium`类的继承体系来适配不同的地质模型,核心策略是**多态性**和**接口抽象**。
|
||||
|
||||
### 适配机制
|
||||
- **基类定义接口**:`CMedium`基类(或其子类如`CMedium3D`)定义了一系列纯虚函数(如`GenerateSptRecElecVal`、`CalculateSptPtLoc`、`GenSptRecLevel`),这些函数构成了一个抽象接口,规定了所有地质模型必须实现的行为。
|
||||
- **具体模型实现**:`Medium3D.cpp`、`MediumCrossHoleGeomative.cpp`等文件实现了具体的地质模型。例如,`CMedium3D`类会实现3D网格化模型的生成算法,而`CMediumCrossHoleGeomative`类则会实现跨孔(Cross-Hole)探测的特定几何计算。
|
||||
- **运行时绑定**:在`CRsp2DTd::Save2DRSPSetInfo`等方法中,通过`m_handleProcessor.GenerateHandle`生成特定模型的句柄,并从`m_medLinkList`链表中查找对应的`CMedium`对象。由于`m_pMedium`是指向基类的指针,在调用`CalculateDepth`等方法时,会根据实际对象的类型自动调用其对应的实现,从而实现了对不同地质模型的无缝适配。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CMedium {
|
||||
<<abstract>>
|
||||
+virtual void CalculateDepth(float fA, float fFactor)
|
||||
+virtual void CalculateTdPtLoc(...)
|
||||
+virtual void Destroy()
|
||||
}
|
||||
class CMedium3D {
|
||||
+void SetPoleDistance(DOUBLE f_dis_x, DOUBLE f_dis_y)
|
||||
+void SetPoleStep(int f_step_x, int f_step_y)
|
||||
+void SetFlags(BOOL Flags)
|
||||
+void create()
|
||||
+void SetRect(int x0, int y0, int x1, int y1)
|
||||
+BOOL setPoleStart(int startpole)
|
||||
+BOOL generate()
|
||||
}
|
||||
class CMediumCrossHoleGeomative {
|
||||
+void SetHoleDepth(float depth)
|
||||
+void SetHoleSpacing(float spacing)
|
||||
+void CalculateCrossHoleGeometry()
|
||||
}
|
||||
CMedium <|-- CMedium3D : "继承"
|
||||
CMedium <|-- CMediumCrossHoleGeomative : "继承"
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [Medium3D.h](file://h\Medium3D.h#L30-L77)
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp#L577-L582)
|
||||
|
||||
## 反演流程数据流图
|
||||
|
||||
以下数据流图概括了从数据输入到结果输出的完整反演流程。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[SP原始数据] --> B[数据库存储]
|
||||
B --> C[加载数据 LoadData]
|
||||
C --> D[初始化模型]
|
||||
D --> E[正演计算 Forward Modeling]
|
||||
E --> F[误差计算 Error Calculation]
|
||||
F --> G{收敛?}
|
||||
G --> |否| H[模型更新 Model Update]
|
||||
H --> E
|
||||
G --> |是| I[生成剖面图 Render View]
|
||||
I --> J[用户界面显示]
|
||||
K[配置参数] --> C
|
||||
K --> D
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [RspCETd.cpp](file://cpp\ProblemZone\RspCETd.cpp#L142-L195)
|
||||
- [AppDataRsp3DTdView.cpp](file://cpp\Views\AppDataRsp3DTdView.cpp#L69-L97)
|
||||
|
||||
## 典型配置参数及其影响
|
||||
|
||||
| 配置参数 | 参数说明 | 对反演结果的影响 |
|
||||
| :--- | :--- | :--- |
|
||||
| `Eamount` | 电极总数 | 电极数越多,横向和纵向分辨率越高,但测量时间也越长。 |
|
||||
| `Edistance` | 电极间距 | 间距越大,探测深度越深,但横向分辨率降低。 |
|
||||
| `Clayout` | 装置类型 | 不同的装置(如温纳、施伦贝谢、偶极-偶极)具有不同的探测深度和灵敏度分布,直接影响反演结果的形态。 |
|
||||
| `TRfrequency` | 发射频率 | 影响激发极化效应的测量,对SP数据反演至关重要。 |
|
||||
| `Ifrequency` | 工业频率 | 用于选择滤波器,抑制50Hz或60Hz的工频干扰。 |
|
||||
| `SAfrequency` | 采样率 | 采样率越高,数据质量越好,但数据量也越大。 |
|
||||
|
||||
**Section sources**
|
||||
- [Rsp2DTd.cpp](file://cpp\ProblemZone\Rsp2DTd.cpp#L467-L565)
|
||||
- [RspCETd.cpp](file://cpp\ProblemZone\RspCETd.cpp#L242-L337)
|
||||
+346
@@ -0,0 +1,346 @@
|
||||
# 视电阻率数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [SP2DTd.cpp](file://cpp\ProblemZone\SP2DTd.cpp)
|
||||
- [SP2DTd.h](file://h\SP2DTd.h)
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp)
|
||||
- [SP3DTd.cpp](file://cpp\ProblemZone\SP3DTd.cpp)
|
||||
- [SP3DTd.h](file://h\SP3DTd.h)
|
||||
- [SP3DTdRecord.cpp](file://cpp\ProblemZone\SP3DTdRecord.cpp)
|
||||
- [SPCETd.cpp](file://cpp\ProblemZone\SPCETd.cpp)
|
||||
- [SPCETd.h](file://h\SPCETd.h)
|
||||
- [SPCETdRecord.cpp](file://cpp\ProblemZone\SPCETdRecord.cpp)
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp)
|
||||
- [TestingData.h](file://h\TestingData.h)
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp)
|
||||
- [TdRecord.h](file://h\TdRecord.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [SP系列数据模型概述](#sp系列数据模型概述)
|
||||
3. [二维视电阻率数据模型 (SP2DTd)](#二维视电阻率数据模型-sp2dtd)
|
||||
4. [三维视电阻率数据模型 (SP3DTd)](#三维视电阻率数据模型-sp3dtd)
|
||||
5. [跨孔视电阻率数据模型 (SPCETd)](#跨孔视电阻率数据模型-spcetd)
|
||||
6. [视电阻率计算原理](#视电阻率计算原理)
|
||||
7. [数据可视化流程](#数据可视化流程)
|
||||
8. [数据采集与处理时序流程](#数据采集与处理时序流程)
|
||||
9. [字段定义与单位说明](#字段定义与单位说明)
|
||||
10. [典型应用场景](#典型应用场景)
|
||||
11. [异常数据识别方法](#异常数据识别方法)
|
||||
12. [核心计算逻辑代码片段](#核心计算逻辑代码片段)
|
||||
|
||||
## 引言
|
||||
本文档旨在深入解析GeomativeStudio软件中SP系列类(SP2DTd、SP3DTd、SPCETd)所代表的视电阻率数据模型。这些模型是地球物理勘探中电阻率成像技术的核心,用于处理和分析从野外采集的原始电压和电流数据,进而计算出地下介质的视电阻率值。文档将详细阐述这些模型在二维、三维及跨孔测量中的数据结构设计、物理意义、计算方法以及可视化逻辑,并提供完整的数据处理流程。
|
||||
|
||||
## SP系列数据模型概述
|
||||
SP系列数据模型是GeomativeStudio软件中用于处理视电阻率(Self-Potential, SP)数据的核心类体系。该系列包含三个主要类:`CSP2DTd`、`CSP3DTd`和`CSPCETd`,分别对应二维、三维和跨孔(一维)测量模式。这些类均继承自`CTestingData`基类,共享通用的数据结构和处理逻辑,同时根据各自的测量几何和物理特性,定义了特定的数据字段和方法。
|
||||
|
||||
**Section sources**
|
||||
- [SP2DTd.h](file://h\SP2DTd.h#L17-L59)
|
||||
- [SP3DTd.h](file://h\SP3DTd.h#L17-L53)
|
||||
- [SPCETd.h](file://h\SPCETd.h#L18-L53)
|
||||
- [TestingData.h](file://h\TestingData.h)
|
||||
|
||||
## 二维视电阻率数据模型 (SP2DTd)
|
||||
`CSP2DTd`类是二维视电阻率数据模型的具体实现,专为沿一条测线进行的二维电阻率测量设计。其数据结构主要包含测点信息、电极配置和测量结果。
|
||||
|
||||
### 数据结构设计
|
||||
该模型的核心数据存储在`td2dcon`数据库表中,主要字段包括:
|
||||
- **C1, C2**: 供电电极编号。
|
||||
- **P1, P2**: 测量电极编号。
|
||||
- **N**: 叠加次数。
|
||||
- **K**: 装置系数,由电极间距决定。
|
||||
- **I**: 测量得到的电流值(单位:mA)。
|
||||
- **V**: 测量得到的电压值(单位:mV)。
|
||||
- **R0**: 接地电阻(单位:Ω)。
|
||||
- **SP**: 计算得到的视电阻率值(单位:Ω·m)。
|
||||
|
||||
### 物理意义
|
||||
二维模型假设地下电性结构在垂直于测线的方向上是无限延伸且不变的。通过沿测线移动电极阵列,可以获取一系列测点的视电阻率数据,这些数据经过反演处理后,可以生成反映地下电性分布的二维剖面图。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CSP2DTd {
|
||||
+DWORD m_dwID
|
||||
+CString m_szTdName
|
||||
+int m_iEAmount
|
||||
+int m_iCHAmount
|
||||
+float m_fESpace
|
||||
+CString m_szEDistance
|
||||
+CTypedPtrList< CObList, CTdChannel* > m_tdChaList
|
||||
+BOOL SaveData()
|
||||
+BOOL LoadData(CLinkList<CMedium*>&)
|
||||
+BOOL ShowConList(CListCtrl&)
|
||||
+BOOL SaveHeadInfoToFile(CString&, CString&)
|
||||
}
|
||||
class CTdChannel {
|
||||
+DWORD m_dwID
|
||||
+int m_iChNum
|
||||
+int m_iEAmount
|
||||
+CMedium* m_pMedium
|
||||
}
|
||||
class CSP2DTdRecord {
|
||||
+int m_iTsn
|
||||
+int m_iC1
|
||||
+int m_iC2
|
||||
+int m_iP1
|
||||
+int m_iP2
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+float m_fI
|
||||
+float m_fV
|
||||
+float m_fR0
|
||||
+float m_fSP
|
||||
+BOOL SaveData(DWORD)
|
||||
+BOOL LoadOrgData()
|
||||
}
|
||||
CSP2DTd --> CTdChannel : "包含"
|
||||
CTdChannel --> CSP2DTdRecord : "包含"
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [SP2DTd.h](file://h\SP2DTd.h#L17-L59)
|
||||
- [SP2DTdRecord.h](file://h\SP2DTdRecord.h#L12-L35)
|
||||
- [SP2DTd.cpp](file://cpp\ProblemZone\SP2DTd.cpp#L40-L86)
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp#L18-L38)
|
||||
|
||||
**Section sources**
|
||||
- [SP2DTd.cpp](file://cpp\ProblemZone\SP2DTd.cpp#L279-L341)
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp#L53-L80)
|
||||
|
||||
## 三维视电阻率数据模型 (SP3DTd)
|
||||
`CSP3DTd`类用于处理三维视电阻率数据,适用于在二维测网内进行的测量。其数据结构与二维模型类似,但需要记录更复杂的电极空间位置。
|
||||
|
||||
### 数据结构设计
|
||||
三维模型的核心数据存储在`td3dcon`数据库表中,其字段与`td2dcon`表基本相同(C1, C2, P1, P2, I, V, R0, SP等)。关键区别在于,三维测量的电极位置信息通常在脚本(Script)或装置(Medium)定义中管理,而`CSP3DTd`类通过`m_tdChaList`列表管理多个通道的数据,以支持更复杂的测量阵列。
|
||||
|
||||
### 物理意义
|
||||
三维模型旨在获取地下电性结构的立体分布。通过在多个测线上进行测量,可以构建一个三维数据体。该模型能够更真实地反映地下异常体的形态和空间展布,但数据采集和处理的复杂度也显著增加。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CSP3DTd {
|
||||
+DWORD m_dwID
|
||||
+CString m_szTdName
|
||||
+int m_iEAmount
|
||||
+int m_iCHAmount
|
||||
+float m_fESpace
|
||||
+CString m_szEDistance
|
||||
+CTypedPtrList< CObList, CTdChannel* > m_tdChaList
|
||||
+BOOL SaveData()
|
||||
+BOOL LoadData(CLinkList<CMedium*>&)
|
||||
+BOOL ShowConList(CListCtrl&)
|
||||
+BOOL SaveHeadInfoToFile(CString&, CString&)
|
||||
}
|
||||
class CTdChannel {
|
||||
+DWORD m_dwID
|
||||
+int m_iChNum
|
||||
+int m_iEAmount
|
||||
+CMedium* m_pMedium
|
||||
}
|
||||
class CSP3DTdRecord {
|
||||
+int m_iTsn
|
||||
+int m_iC1
|
||||
+int m_iC2
|
||||
+int m_iP1
|
||||
+int m_iP2
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+float m_fI
|
||||
+float m_fV
|
||||
+float m_fR0
|
||||
+float m_fSP
|
||||
+BOOL SaveData(DWORD)
|
||||
+BOOL LoadOrgData()
|
||||
}
|
||||
CSP3DTd --> CTdChannel : "包含"
|
||||
CTdChannel --> CSP3DTdRecord : "包含"
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [SP3DTd.h](file://h\SP3DTd.h#L17-L53)
|
||||
- [SP3DTdRecord.h](file://h\SP3DTdRecord.h#L12-L35)
|
||||
- [SP3DTd.cpp](file://cpp\ProblemZone\SP3DTd.cpp#L34-L80)
|
||||
- [SP3DTdRecord.cpp](file://cpp\ProblemZone\SP3DTdRecord.cpp#L18-L38)
|
||||
|
||||
**Section sources**
|
||||
- [SP3DTd.cpp](file://cpp\ProblemZone\SP3DTd.cpp#L272-L334)
|
||||
- [SP3DTdRecord.cpp](file://cpp\ProblemZone\SP3DTdRecord.cpp#L53-L80)
|
||||
|
||||
## 跨孔视电阻率数据模型 (SPCETd)
|
||||
`CSPCETd`类用于处理跨孔(或称一维)视电阻率数据,常用于垂直电测深(VES)或井间测量。
|
||||
|
||||
### 数据结构设计
|
||||
该模型的核心数据存储在`td1dcon`数据库表中,其字段与二维/三维模型有显著不同:
|
||||
- **a, b**: 供电电极间距(单位:m)。
|
||||
- **x, y**: 测量电极间距(单位:m)。
|
||||
- **N**: 叠加次数。
|
||||
- **K**: 装置系数,由a、b、x、y计算得出。
|
||||
- **I, V, R0, SP**: 与二维/三维模型相同。
|
||||
|
||||
### 物理意义
|
||||
跨孔模型主要用于研究地下介质随深度的变化。通过固定测量电极并逐步增大供电电极间距,可以探测到不同深度的地下电性。该模型生成的数据通常用于绘制视电阻率曲线(如S-曲线、Q-曲线),以推断地层的分层结构。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CSPCETd {
|
||||
+DWORD m_dwID
|
||||
+CString m_szTdName
|
||||
+int m_iEAmount
|
||||
+int m_iCHAmount
|
||||
+float m_fESpace
|
||||
+CString m_szEDistance
|
||||
+CTypedPtrList< CObList, CTdChannel* > m_tdChaList
|
||||
+BOOL SaveData()
|
||||
+BOOL LoadData(CLinkList<CMedium*>&)
|
||||
+BOOL ShowConList(CListCtrl&)
|
||||
+BOOL SaveHeadInfoToFile(CString&, CString&)
|
||||
}
|
||||
class CTdChannel {
|
||||
+DWORD m_dwID
|
||||
+int m_iChNum
|
||||
+int m_iEAmount
|
||||
+CMedium* m_pMedium
|
||||
}
|
||||
class CSPCETdRecord {
|
||||
+int m_iTsn
|
||||
+float m_fA
|
||||
+float m_fB
|
||||
+float m_fX
|
||||
+float m_fY
|
||||
+int m_iN
|
||||
+float m_fK
|
||||
+float m_fI
|
||||
+float m_fV
|
||||
+float m_fR0
|
||||
+float m_fSP
|
||||
+BOOL SaveData(DWORD)
|
||||
+BOOL LoadOrgData()
|
||||
}
|
||||
CSPCETd --> CTdChannel : "包含"
|
||||
CTdChannel --> CSPCETdRecord : "包含"
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [SPCETd.h](file://h\SPCETd.h#L18-L53)
|
||||
- [SPCETdRecord.h](file://h\SPCETdRecord.h#L14-L37)
|
||||
- [SPCETd.cpp](file://cpp\ProblemZone\SPCETd.cpp#L32-L80)
|
||||
- [SPCETdRecord.cpp](file://cpp\ProblemZone\SPCETdRecord.cpp#L18-L38)
|
||||
|
||||
**Section sources**
|
||||
- [SPCETd.cpp](file://cpp\ProblemZone\SPCETd.cpp#L498-L562)
|
||||
- [SPCETdRecord.cpp](file://cpp\ProblemZone\SPCETdRecord.cpp#L44-L77)
|
||||
|
||||
## 视电阻率计算原理
|
||||
视电阻率(Apparent Resistivity, ρa)的计算基于欧姆定律和特定的电极装置系数(K)。其基本公式为:
|
||||
|
||||
ρa = K * (V / I)
|
||||
|
||||
其中:
|
||||
- **ρa**: 视电阻率,单位为欧姆·米(Ω·m)。
|
||||
- **K**: 装置系数,单位为米(m),由所采用的电极排列方式(如温纳装置、施伦贝谢装置等)和电极间距决定。
|
||||
- **V**: 测量得到的电压值,单位为伏特(V)。
|
||||
- **I**: 测量得到的电流值,单位为安培(A)。
|
||||
|
||||
在代码实现中,`CSP2DTdRecord`、`CSP3DTdRecord`和`CSPCETdRecord`类的`SaveData`方法负责将计算出的`m_fSP`(即ρa)值保存到相应的数据库表(`td2dcon`、`td3dcon`、`td1dcon`)中。
|
||||
|
||||
**Section sources**
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp#L68-L80)
|
||||
- [SP3DTdRecord.cpp](file://cpp\ProblemZone\SP3DTdRecord.cpp#L68-L80)
|
||||
- [SPCETdRecord.cpp](file://cpp\ProblemZone\SPCETdRecord.cpp#L61-L77)
|
||||
|
||||
## 数据可视化流程
|
||||
`AppDataSP2DTdView.cpp`文件定义了二维视电阻率数据的可视化界面。其核心是创建一个分栏视图,将数据详情、测量内容和接地电阻列表组织在一起。
|
||||
|
||||
### 可视化逻辑
|
||||
1. **视图创建 (`Create`)**: 该方法使用`CSplitterWnd`创建一个静态分栏器,将主视图分为左右两部分。
|
||||
2. **左侧面板**: 左侧创建一个`CAppDataTdDetailListView`视图,用于显示测试任务的详细信息(如任务名称、位置、设备型号等)。
|
||||
3. **右侧面板**: 右侧再创建一个上下分栏的`CSplitterWnd`。
|
||||
- **上方面板**: 创建一个`CAppDataSP2DTdConListView`视图,用于显示所有测点的测量数据(即`td2dcon`表中的内容)。
|
||||
- **下方面板**: 创建一个`CAppDataTdGrListView`视图,用于显示各电极的接地电阻测量结果。
|
||||
4. **数据映射**: `CAppDataSP2DTdConListView`视图通过调用`CSP2DTd::ShowConList`方法,从数据库中查询数据并填充到列表控件中,实现了数据到曲线图的映射。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[AppDataSP2DTdView::Create] --> B[创建左右分栏]
|
||||
B --> C[左侧面板: CAppDataTdDetailListView]
|
||||
B --> D[右侧面板: 上下分栏]
|
||||
D --> E[上方面板: CAppDataSP2DTdConListView]
|
||||
D --> F[下方面板: CAppDataTdGrListView]
|
||||
E --> G[调用 CSP2DTd::ShowConList]
|
||||
G --> H[查询 td2dcon 表]
|
||||
H --> I[填充列表控件]
|
||||
F --> J[显示接地电阻]
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp#L71-L103)
|
||||
|
||||
**Section sources**
|
||||
- [AppDataSP2DTdView.cpp](file://cpp\Views\AppDataSP2DTdView.cpp#L71-L103)
|
||||
- [SP2DTd.cpp](file://cpp\ProblemZone\SP2DTd.cpp#L279-L341)
|
||||
|
||||
## 数据采集与处理时序流程
|
||||
从设备接收原始数据包到最终存储为视电阻率数据,整个流程遵循严格的时序。
|
||||
|
||||
### 处理路径
|
||||
1. **数据包接收**: 设备通过串口或网络将原始数据包发送给软件。
|
||||
2. **数据解析**: 软件解析数据包,提取出原始的电压(Vrawdata)和电流(Irawdata)序列。这些数据被存储在`td2dcon`、`td3dcon`或`td1dcon`表的相应字段中。
|
||||
3. **数据加载**: `CTdRecord`类的`LoadOrgData`方法(如`Load2DOrgData`)被调用,从数据库中读取原始数据序列。
|
||||
4. **数据处理**: 原始数据经过滤波、去噪等预处理,并计算出最终的电压值V和电流值I。
|
||||
5. **视电阻率计算**: 根据公式 ρa = K * (V / I) 计算视电阻率值SP。
|
||||
6. **数据存储**: 计算结果(I, V, R0, SP)通过`CSPxDTdRecord::SaveData`方法写回数据库。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 设备 as "测量设备"
|
||||
participant 软件 as "GeomativeStudio软件"
|
||||
participant 数据库 as "数据库"
|
||||
设备->>软件 : 发送原始数据包(Vrawdata, Irawdata)
|
||||
软件->>数据库 : 解析并存储原始数据
|
||||
软件->>数据库 : 查询原始数据(LoadOrgData)
|
||||
软件->>软件 : 预处理并计算V, I
|
||||
软件->>软件 : 计算视电阻率SP = K * (V/I)
|
||||
软件->>数据库 : 存储最终结果(SaveData)
|
||||
```
|
||||
|
||||
**Diagram sources **
|
||||
- [TdRecord.cpp](file://cpp\ProblemZone\TdRecord.cpp#L34-L320)
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp#L53-L80)
|
||||
|
||||
## 字段定义与单位说明
|
||||
| 字段名 | 中文名称 | 数据类型 | 单位 | 说明 |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| `C1`, `C2` | 供电电极 | int | 无 | 电极编号 |
|
||||
| `P1`, `P2` | 测量电极 | int | 无 | 电极编号 |
|
||||
| `a`, `b` | 供电电极间距 | float | 米 (m) | 仅SPCETd模型 |
|
||||
| `x`, `y` | 测量电极间距 | float | 米 (m) | 仅SPCETd模型 |
|
||||
| `I` | 电流 | float | 毫安 (mA) | 测量得到的电流值 |
|
||||
| `V` | 电压 | float | 毫伏 (mV) | 测量得到的电压值 |
|
||||
| `R0` | 接地电阻 | float | 欧姆 (Ω) | 电极接地电阻 |
|
||||
| `SP` | 视电阻率 | float | 欧姆·米 (Ω·m) | 计算得到的视电阻率值 |
|
||||
| `K` | 装置系数 | float | 米 (m) | 由电极排列方式决定 |
|
||||
| `N` | 叠加次数 | int | 无 | 信号叠加次数 |
|
||||
| `Espace` | 电极步长 | float | 米 (m) | 移动电极的步长 |
|
||||
| `Edistance` | 电极距离 | float | 米 (m) | 电极间的距离 |
|
||||
|
||||
## 典型应用场景
|
||||
- **SP2DTd**: 用于二维地质剖面调查,如滑坡体探测、地下水污染羽流成像、岩溶发育区调查等。
|
||||
- **SP3DTd**: 用于三维地质体精细成像,如矿体圈定、地下空洞三维定位、复杂地质构造研究等。
|
||||
- **SPCETd**: 用于地层垂向分层研究,如工程地质勘察中的土层划分、地下水含水层深度探测、基岩面起伏调查等。
|
||||
|
||||
## 异常数据识别方法
|
||||
1. **接地电阻异常**: 通过`gr`表检查各电极的接地电阻`OMvalue`。若电阻值过高(如大于10kΩ)或为-9999(表示未测量),则表明电极接触不良。
|
||||
2. **电压/电流值异常**: 检查`V`和`I`值是否为零或接近零。若`I`为零,则供电回路可能断开;若`V`为零而`I`正常,则测量回路可能断开。
|
||||
3. **视电阻率值异常**: 检查`SP`值是否为负数或极大值。负值通常由电极极性接反或强电磁干扰引起;极大值可能由数据采集错误或极端地质条件导致。
|
||||
4. **数据完整性检查**: 确保每个测点(TSN)都有对应的`C1, C2, P1, P2`配置和有效的`V, I`读数。
|
||||
|
||||
## 核心计算逻辑代码片段
|
||||
视电阻率的计算和存储逻辑主要在`CSPxDTdRecord`类的`SaveData`方法中实现。该方法将计算结果插入到相应的数据库表中。
|
||||
|
||||
**Section sources**
|
||||
- [SP2DTdRecord.cpp](file://cpp\ProblemZone\SP2DTdRecord.cpp#L53-L80)
|
||||
- [SP3DTdRecord.cpp](file://cpp\ProblemZone\SP3DTdRecord.cpp#L53-L80)
|
||||
- [SPCETdRecord.cpp](file://cpp\ProblemZone\SPCETdRecord.cpp#L44-L77)
|
||||
Reference in New Issue
Block a user