Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/开发者指南/代码结构/Views模块/项目管理界面.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

16 KiB
Raw Blame History

项目管理界面

**本文档引用的文件** - [taskmngframe.cpp](file://cpp/Views/taskmngframe.cpp) - [DialNew1DTask.cpp](file://cpp/Views/DialNew1DTask.cpp) - [DialNew2DTask.cpp](file://cpp/Views/DialNew2DTask.cpp) - [DialNew3DTask.cpp](file://cpp/Views/DialNew3DTask.cpp) - [DialCfgTaskPacket.cpp](file://cpp/Views/DialCfgTaskPacket.cpp) - [DialCfgTerrain.cpp](file://cpp/Views/DialCfgTerrain.cpp) - [DialTaskTree.cpp](file://cpp/Views/DialTaskTree.cpp) - [DialTaskManager.cpp](file://cpp/Views/DialTaskManager.cpp) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp)

目录

  1. 任务管理框架与导航逻辑
  2. 测量任务创建流程
  3. 任务包配置机制
  4. 地形参数设置逻辑
  5. 任务树形视图构建与交互
  6. 项目数据持久化与加载
  7. 任务参数验证与数据传递
  8. 任务配置工作流
  9. UI响应性能优化建议

任务管理框架与导航逻辑

任务管理框架由taskmngframe.cpp实现,作为MDI子窗口继承自CMDIChildWnd。该框架负责组织和管理所有与任务相关的UI组件,提供统一的导航界面。框架通过消息映射处理窗口激活、关闭等事件,确保在用户切换不同任务管理视图时能够正确更新状态和界面元素。

Section sources

测量任务创建流程

1D测量任务创建

DialNew1DTask.cpp实现了1D测量任务的创建对话框。该对话框初始化时会根据当前UI语言设置控件文本,并从CTaskDataOper操作类查询可用的介质类型和脚本信息。用户选择测试类型(电阻率、激电、自电)后,系统会动态更新发射波形和发射周期的选项。在用户点击"创建"按钮后,系统会执行完整的参数验证,包括任务名、测试方式、装置类型、脚本、迭代次数等,确保所有必填项都已正确填写且符合取值范围。

flowchart TD
Start([开始创建1D任务]) --> Init["初始化对话框\n设置语言、加载介质和脚本"]
Init --> SelectType["用户选择测试类型\n(电阻率/激电/自电)"]
SelectType --> UpdateOptions["更新发射波形和周期选项"]
UpdateOptions --> UserInput["用户输入任务参数\n任务名、位置、脚本等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckName{"任务名为空?"}
CheckName --> |是| ShowError1["显示错误提示"]
CheckName --> |否| CheckType{"测试方式未选?"}
CheckType --> |是| ShowError2["显示错误提示"]
CheckType --> |否| CheckArray{"装置类型未选?"}
CheckArray --> |是| ShowError3["显示错误提示"]
CheckArray --> |否| CheckScript{"脚本未选?"}
CheckScript --> |是| ShowError4["显示错误提示"]
CheckScript --> |否| CheckStacking{"迭代次数有效?"}
CheckStacking --> |否| ShowError5["显示错误提示"]
CheckStacking --> |是| CreateTask["调用CTaskDataOper::Create1DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError1 --> Return
ShowError2 --> Return
ShowError3 --> Return
ShowError4 --> Return
ShowError5 --> Return

Diagram sources

2D测量任务创建

DialNew2DTask.cpp实现了2D测量任务的创建对话框。与1D任务相比,2D任务需要更多的参数配置,包括电缆布线方式、起始/结束电极、电极间距、孔间距(对于交叉孔装置)等。对话框在初始化时会根据装置类型动态显示或隐藏相关控件,例如交叉孔装置会显示孔间距输入框。当用户选择不同的测试类型时,系统会过滤可用的电缆布线方式,确保选择的配置是有效的。

flowchart TD
Start([开始创建2D任务]) --> Init["初始化对话框\n加载介质、脚本、电缆布局"]
Init --> SelectType["用户选择测试类型"]
SelectType --> FilterLayout["根据测试类型过滤\n电缆布线方式"]
FilterLayout --> UserInput["用户输入任务参数\n包括电极间距、起始/结束电极等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckCommon["验证通用参数\n(任务名、测试方式等)"]
CheckCommon --> CheckSpace{"电极间距为零?"}
CheckSpace --> |是| ShowError1["显示错误提示"]
CheckSpace --> |否| CheckHole{"交叉孔装置且孔间距为零?"}
CheckHole --> |是| ShowError2["显示错误提示"]
CheckHole --> |否| CheckRange{"起始/结束电极越界?"}
CheckRange --> |是| ShowError3["显示错误提示"]
CheckRange --> |否| CreateTask["调用CTaskDataOper::Create2DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError1 --> Return
ShowError2 --> Return
ShowError3 --> Return

Diagram sources

3D测量任务创建

DialNew3DTask.cpp实现了3D测量任务的创建对话框。3D任务的配置最为复杂,需要设置网格大小、X/Y方向电极步长和距离等参数。当用户选择脚本时,系统会自动查询并显示网格信息(X和Y方向的点数),帮助用户理解测量范围。对话框还提供了发射周期的"自动"选项,为用户提供更灵活的配置选择。

flowchart TD
Start([开始创建3D任务]) --> Init["初始化对话框\n加载介质、脚本、电缆布局"]
Init --> SelectScript["用户选择脚本"]
SelectScript --> QueryGrid["查询并显示网格信息\n(X方向点数, Y方向点数)"]
QueryGrid --> UserInput["用户输入任务参数\n包括步长、距离等"]
UserInput --> Validate["点击创建时验证参数"]
Validate --> CheckCommon["验证通用参数\n(任务名、测试方式等)"]
CheckCommon --> CheckStep{"步长为空?"}
CheckStep --> |是| ShowError["显示错误提示"]
CheckStep --> |否| CreateTask["调用CTaskDataOper::Create3DTask\n创建任务"]
CreateTask --> Success{"创建成功?"}
Success --> |是| CloseDialog["关闭对话框"]
Success --> |否| Return["返回等待用户修正"]
ShowError --> Return

Diagram sources

任务包配置机制

DialCfgTaskPacket.cpp实现了任务包的配置对话框,允许用户将多个任务组织成一个任务包进行循环执行。对话框包含一个任务选择下拉框和一个任务列表,用户可以将选中的任务添加到列表中,也可以从列表中删除任务。系统会检查重复添加的任务,避免同一个任务被多次执行。

在用户点击"保存"时,系统会对输入的参数进行严格验证:

  • 循环次数必须在1-60000之间
  • 时间间隔必须在1-60000之间
  • PLC ID不能为空

验证通过后,系统会将任务列表和属性信息保存到数据库中,供后续执行使用。

classDiagram
class CDialCfgTaskPacket {
+m_cmbTaskName : CComboBox
+m_listTaskPacket : CListCtrl
+m_cmbTaskName : CComboBox
+OnButtonAdd() void
+OnButtonDel() void
+OnOK() void
+IsRepeatTask(int) bool
+InitialTaskList() void
}
class CTaskDataOper {
+QueryTdBrowseInfo() void
+QueryTaskPacketAttr() bool
+InsertTaskPacketInfo() bool
}
CDialCfgTaskPacket --> CTaskDataOper : "使用"

Diagram sources

地形参数设置逻辑

DialCfgTerrain.cpp实现了地形参数的配置对话框,允许用户导入DAT文件并编辑地形数据点。对话框提供了添加、修改、删除地形数据点的功能,并支持从文件导入地形数据。用户可以设置地形数据标志(水平距离或垂直距离)和第一个电极对应的地形数据点编号。

在保存地形数据时,系统会执行严格的验证:

  • 必须已导入DAT文件
  • 必须选择地形数据标志
  • 必须输入至少一个地形数据点
  • 第一个电极对应的地形数据点编号必须在有效范围内

验证通过后,系统会将地形数据写入原DAT文件的末尾,遵循特定的文件格式要求。

flowchart TD
Start([开始配置地形]) --> ImportFile["用户导入DAT文件"]
ImportFile --> EditData["编辑地形数据点\n添加、修改、删除"]
EditData --> SetParams["设置地形参数\n标志、第一个电极编号"]
SetParams --> Save["点击保存"]
Save --> Validate["验证参数"]
Validate --> CheckFile{"已导入文件?"}
CheckFile --> |否| ShowError1["显示错误提示"]
CheckFile --> |是| CheckFlag{"选择数据标志?"}
CheckFlag --> |否| ShowError2["显示错误提示"]
CheckFlag --> |是| CheckData{"输入地形数据?"}
CheckData --> |否| ShowError3["显示错误提示"]
CheckData --> |是| CheckIndex{"第一个电极编号有效?"}
CheckIndex --> |否| ShowError4["显示错误提示"]
CheckIndex --> |是| WriteFile["将地形数据写入DAT文件"]
WriteFile --> Success{"写入成功?"}
Success --> |是| ShowSuccess["显示成功提示"]
Success --> |否| ShowFail["显示失败提示"]
ShowError1 --> Return["返回等待用户修正"]
ShowError2 --> Return
ShowError3 --> Return
ShowError4 --> Return

Diagram sources

任务树形视图构建与交互

任务树形视图构建

DialTaskTree.cpp实现了任务树形视图,使用CTreeCtrl控件显示任务列表。视图支持复选框功能,允许用户选择多个任务进行批量操作。视图初始化时会根据任务类型(2D或3D)从服务器获取任务数据,并构建树形结构。

classDiagram
class CDialTaskTree {
+m_treeTask : CTreeCtrl
+m_iSptType : int
+m_pParentWnd : CWnd*
+ShowTaskTree(int, time_t, time_t) void
+OnClickTreeTaskList() void
+OnNMRClickTreeTaskList() void
+OnAddNewItemToTaskList() bool
+OnClearTaskList() void
}
class CTaskDataOper {
+InitOnLineTaskTreeCtrl() void
+SetCurrentTimeRange() void
}
CDialTaskTree --> CTaskDataOper : "使用"

Diagram sources

任务树形视图交互

任务树形视图支持丰富的交互功能:

  • 点击复选框:选择或取消选择任务,同时更新父节点的选中计数
  • 右键点击:显示上下文菜单,提供创建任务、删除任务、取消测试、刷新列表等操作
  • 点击任务节点:通知父窗口当前选中的任务

上下文菜单的选项会根据当前UI语言动态调整文本内容,确保用户界面的国际化支持。

sequenceDiagram
participant User as "用户"
participant Tree as "任务树"
participant Parent as "父窗口"
User->>Tree : 右键点击任务节点
Tree->>Tree : 显示上下文菜单
User->>Tree : 选择"删除任务"
Tree->>Parent : 发送WM_MSG_DELETE_TASK消息
Parent->>Parent : 处理删除任务逻辑
Parent->>Tree : 刷新任务列表
Tree->>User : 显示操作结果

Diagram sources

项目数据持久化与加载

ProManager.cpp实现了项目管理器,负责项目数据的持久化与加载。项目管理器通过CProManager类与数据库交互,实现项目和测区的创建、查询和同步功能。

项目创建流程包括:

  1. 在数据库中创建项目记录
  2. 在设备上创建项目文件夹和配置文件
  3. 同步项目数据到设备
sequenceDiagram
participant UI as "用户界面"
participant ProMgr as "CProManager"
participant DB as "数据库"
participant Dev as "设备"
UI->>ProMgr : 创建项目
ProMgr->>ProMgr : 显示创建对话框
ProMgr->>ProMgr : 验证项目名称唯一性
ProMgr->>DB : 插入项目记录
DB-->>ProMgr : 返回项目ID
ProMgr->>Dev : 在设备上创建项目文件夹
Dev-->>ProMgr : 文件夹创建成功
ProMgr->>Dev : 发送项目配置文件
Dev-->>ProMgr : 文件发送成功
ProMgr->>DB : 记录同步状态
DB-->>ProMgr : 同步记录创建成功
ProMgr-->>UI : 显示创建成功

Diagram sources

任务参数验证与数据传递

任务参数验证

系统在创建任务时执行严格的参数验证,确保所有输入都符合业务规则:

  • 必填项验证:任务名、测试方式、装置类型、脚本等必须填写
  • 取值范围验证:迭代次数(1-255)、采样间隔(0-30000)、电极间距(>0)等
  • 逻辑关系验证:交叉孔装置的孔间距必须大于电极间距
  • 唯一性验证:任务包中不能包含重复任务

跨对话框数据传递

系统通过多种机制实现跨对话框的数据传递:

  • 构造函数传递:在创建对话框时通过构造函数传递必要的操作对象(如CTaskDataOper
  • 成员变量共享:父窗口与子窗口通过成员变量共享数据
  • 消息机制:使用Windows消息在不同窗口间传递数据和状态

例如,在DialTaskManager.cpp中,创建任务时会根据任务类型显示相应的创建对话框,并将创建好的任务参数传递给上传逻辑:

// 伪代码示例
if (0 == m_iSelTaskType) {
    iRet = m_dialNew2DTask.DoModal();
    if (IDOK == iRet) {
        // 从对话框获取创建好的任务参数
        strTaskCN = m_dialNew2DTask.m_strTaskCN;
        // 构造任务参数结构体
        strcpy(m_TaskArg.ucTaskID, strTmp);
        strcpy(m_TaskArg.ucTDName, m_dialNew2DTask.m_strTaskName);
        // ... 其他参数
        // 上传任务数据
        CDownloadDataProgressDlg uploadDlg(&m_TaskArg, &m_taskOper,this);
        uploadDlg.DoModal();
    }
}

Section sources

任务配置工作流

对于初学者,任务配置的工作流可以概括为以下步骤:

  1. 创建项目:通过项目管理器创建新的项目,填写项目基本信息
  2. 创建测区:在项目中创建测区,定义测量区域
  3. 创建任务
    • 选择任务类型(1D、2D或3D
    • 选择测试方式(电阻率、激电或自电)
    • 选择装置类型和测量脚本
    • 设置任务参数(迭代次数、发射周期等)
    • 点击"创建"完成任务创建
  4. 配置地形(可选):为任务配置地形数据,导入或手动输入地形点
  5. 组织任务包(可选):将多个任务组织成任务包,设置循环执行参数
  6. 执行任务:在任务管理器中选择任务并开始测量

每个步骤都有相应的对话框引导用户完成配置,系统会在关键操作前进行参数验证,确保配置的正确性。

UI响应性能优化建议

针对大型项目下的UI响应性能,建议采取以下优化措施:

  1. 分页加载任务数据:避免一次性加载所有任务,采用分页或按时间范围加载的方式,减少内存占用和UI阻塞
  2. 异步数据加载:将耗时的数据查询操作放在后台线程执行,避免阻塞UI线程
  3. 虚拟化列表控件:对于包含大量任务的列表,使用虚拟化技术,只渲染可见区域的项目
  4. 缓存常用数据:将频繁访问的数据(如介质类型、脚本列表)缓存到内存中,减少数据库查询次数
  5. 优化数据库查询:为常用查询字段建立索引,优化SQL查询语句,减少查询时间
  6. 延迟加载:对于非关键信息,在用户需要时才进行加载,提高初始加载速度
  7. 批量操作优化:对于批量删除等操作,使用事务处理,减少数据库交互次数

这些优化措施可以显著提升大型项目下的UI响应速度,改善用户体验。