# ProManager **本文档引用的文件** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp) - [ProManager.h](file://h/ProManager.h) - [Project.cpp](file://cpp/ProblemZone/Project.cpp) - [Project.h](file://h/Project.h) - [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp) - [TestingZone.h](file://h/TestingZone.h) - [SptManager.cpp](file://cpp/Managers/SptManager.cpp) - [SptManager.h](file://h/SptManager.h) ## 目录 1. [简介](#简介) 2. [项目生命周期管理](#项目生命周期管理) 3. [测区管理机制](#测区管理机制) 4. [数据持久化流程](#数据持久化流程) 5. [与SptManager的协调](#与sptmanager的协调) 6. [恢复策略](#恢复策略) 7. [代码示例](#代码示例) 8. [结论](#结论) ## 简介 ProManager模块是Geomative Studio软件的核心组件之一,负责管理项目的整个生命周期。该模块提供了创建、打开、保存和关闭项目的基本功能,同时管理与项目相关的测区(TestingZone)和任务包配置。ProManager通过协调数据库和XML缓存文件之间的数据同步,确保项目数据的完整性和一致性。此外,它还与SptManager模块紧密协作,生成与项目关联的测量脚本。 **Section sources** - [ProManager.h](file://h/ProManager.h#L30-L64) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L32-L37) ## 项目生命周期管理 ProManager模块实现了完整的项目生命周期管理功能,包括项目创建、打开、保存和关闭操作。当用户创建新项目时,ProManager首先通过`CreateProjectInDB`方法在数据库中创建项目记录,然后通过`CreateProjectInDev`方法在设备上创建相应的项目结构。项目创建过程中,系统会自动生成一个唯一的项目编号(CN),并创建一个默认的测区。 项目打开操作通过`LoadProjectFromDev`方法实现,该方法从设备加载项目数据并同步到本地数据库。项目保存操作则通过将内存中的项目数据序列化为XML格式并保存到缓存文件中来实现。项目关闭时,ProManager会清理内存中的项目对象,释放相关资源。 ```mermaid flowchart TD Start([开始]) --> CreateProject["创建项目"] CreateProject --> CheckExist["检查项目名称是否存在"] CheckExist --> |存在| ShowError["显示错误信息"] CheckExist --> |不存在| InsertDB["在数据库插入记录"] InsertDB --> GenerateCN["生成项目编号"] GenerateCN --> CreateDefaultTz["创建默认测区"] CreateDefaultTz --> CreateDev["在设备创建项目"] CreateDev --> SaveXML["保存project.xml"] SaveXML --> End([结束]) ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [Project.cpp](file://cpp/ProblemZone/Project.cpp#L19-L50) ## 测区管理机制 测区(TestingZone)是项目中的重要组成部分,用于组织和管理测量任务。ProManager通过`CreateTzInDB`和`CreateTzInDev`方法实现测区的创建。每个测区都有一个类型属性(TZtype),用于区分不同类型的测量任务,如1D VES、2D ERI或3D ERT。 测区配置逻辑包括设置测区名称、描述、位置和创建日期等基本信息。ProManager通过`ShowTzList`方法显示指定项目下的所有测区列表,用户可以通过界面操作选择和管理测区。当创建新测区时,系统会自动为其分配一个唯一的测区编号(CN),并在数据库和设备上同步创建相应的结构。 ```mermaid classDiagram class CProManager { +ShowTzList(dwProHandle, tzList) +CreateTzInDB(dwID, dwPrID) +CreateTzInDev(dwID, pDev) +DeleteTzInDB(dwID) +DeleteTzInDev(szPrCN, szTzCN, pDev) } class CTestingZone { +m_szTZname +m_szCDate +m_szDesc +m_szLocation +m_szCN +m_szTZtype } CProManager --> CTestingZone : "创建" CProManager --> CTestingZone : "管理" ``` **Diagram sources** - [ProManager.h](file://h/ProManager.h#L53-L58) - [TestingZone.h](file://h/TestingZone.h#L14-L30) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L53-L92) - [TestingZone.cpp](file://cpp/ProblemZone/TestingZone.cpp#L18-L44) - [TestingZone.h](file://h/TestingZone.h#L14-L30) ## 数据持久化流程 ProManager模块采用混合持久化策略,将项目数据存储在数据库和XML缓存文件中。核心项目数据(如项目名称、描述、位置等)存储在Access数据库的project表中,而项目结构和配置信息则以XML格式存储在CACHE目录下的project.xml文件中。 数据持久化流程如下:当项目创建或修改时,ProManager首先更新数据库中的记录,然后生成或更新project.xml文件。XML文件包含项目的基本信息、测区列表和配置参数。系统使用CMarkup类来处理XML文件的读写操作。项目数据在内存、数据库和XML文件之间保持同步,确保数据的一致性和完整性。 ```mermaid flowchart LR Memory[内存对象] --> Database[(数据库)] Memory --> XML[project.xml] Database --> Memory XML --> Memory subgraph "数据流" Database XML Memory end ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L398-L426) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L398-L426) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863) - [Project.h](file://h/Project.h#L16-L38) ## 与SptManager的协调 ProManager与SptManager模块紧密协作,共同完成项目相关的测量脚本管理。当需要为项目生成测量脚本时,ProManager会调用SptManager的相关方法。SptManager负责具体的脚本创建、编辑和验证逻辑,而ProManager则负责提供项目上下文和持久化支持。 这种协作关系体现在项目创建后的脚本生成流程中:ProManager首先创建项目结构,然后通知SptManager为该项目生成相应的测量脚本。脚本数据存储在独立的数据库表中,但与项目数据通过外键关联。这种设计实现了功能分离,同时保持了数据的完整性。 ```mermaid sequenceDiagram participant User as "用户" participant ProManager as "ProManager" participant SptManager as "SptManager" participant Database as "数据库" User->>ProManager : 创建新项目 ProManager->>Database : 插入项目记录 ProManager->>SptManager : 请求生成脚本 SptManager->>SptManager : 创建脚本配置 SptManager->>Database : 保存脚本数据 SptManager-->>ProManager : 脚本创建完成 ProManager-->>User : 项目创建成功 ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [SptManager.cpp](file://cpp/Managers/SptManager.cpp#L257-L487) - [SptManager.h](file://h/SptManager.h#L30-L48) ## 恢复策略 ProManager模块实现了多种恢复策略,以应对项目文件损坏或版本不兼容的情况。当检测到project.xml文件损坏时,系统可以从数据库中重建XML文件。恢复流程首先验证数据库中的项目记录完整性,然后重新生成XML文件结构。 对于版本不兼容问题,ProManager采用向后兼容的设计原则。新版本的软件可以读取旧版本创建的项目文件,系统会自动进行必要的数据转换和升级。在极端情况下,如果项目数据无法恢复,系统会创建一个新的空白项目,并尝试从备份中恢复尽可能多的数据。 ```mermaid flowchart TD Start([开始]) --> CheckXML["检查project.xml"] CheckXML --> |有效| LoadNormal["正常加载"] CheckXML --> |无效| CheckDB["检查数据库"] CheckDB --> |完整| RebuildXML["重建XML文件"] CheckDB --> |不完整| CreateNew["创建新项目"] RebuildXML --> Validate["验证数据"] Validate --> |成功| LoadRebuilt["加载重建文件"] Validate --> |失败| CreateNew CreateNew --> Initialize["初始化新项目"] Initialize --> End([结束]) ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1865-L1999) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1746-L1863) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L1865-L1999) ## 代码示例 以下代码示例展示了项目创建和测区配置的核心方法调用。`CreateProjectInDB`方法处理数据库层面的项目创建,而`CreateProjectInDev`方法负责在设备上创建项目结构。测区配置通过`InsertDefaultTzToProject`方法实现,该方法为新项目创建一个默认的测区。 ```mermaid flowchart TD A["CreateProjectInDB"] --> B["显示创建对话框"] B --> C["验证项目名称"] C --> |已存在| D["显示错误信息"] C --> |不存在| E["生成项目编号"] E --> F["插入数据库记录"] F --> G["创建默认测区"] G --> H["返回成功状态"] I["CreateProjectInDev"] --> J["获取项目信息"] J --> K["创建本地目录"] K --> L["生成project.xml"] L --> M["发送到设备"] M --> |成功| N["更新同步状态"] M --> |失败| O["清理并返回错误"] ``` **Diagram sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341) **Section sources** - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L343-L483) - [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L319-L341) ## 结论 ProManager模块作为Geomative Studio项目管理的核心,实现了完整的项目生命周期管理功能。通过精心设计的架构,该模块有效地协调了数据库存储和XML文件缓存,确保了项目数据的持久性和一致性。其与SptManager模块的协作机制,为测量脚本的生成和管理提供了坚实的基础。完善的恢复策略进一步增强了系统的可靠性和用户体验。