20 KiB
本文档从架构层面阐述 SunvStation 系统的设计理念、核心组件及其交互关系,帮助开发者理解系统的整体结构,为深入学习和二次开发奠定基础。
整体架构概览
SunvStation 采用分层架构设计,将 C++ 核心能力、Python 接口封装和业务逻辑管理清晰分离,形成高内聚、低耦合的系统结构。整个系统围绕 SSProcessManager 核心管理类展开,通过 Mixin 设计模式将功能模块化组合,同时借助 SWIG 技术实现 C++ 与 Python 的无缝集成。
Sources: init.py, PySSProcess.py
graph TB
subgraph "应用层 Python 业务逻辑"
SSProcess[SSProcessManager<br/>核心管理类]
subgraph "Mixin 功能模块"
SelectionM[SelectionMixin<br/>选择集操作]
GeoEditM[GeoEditMixin<br/>地理对象编辑]
ProjectM[ProjectMixin<br/>项目管理]
LogM[LogMixin<br/>日志记录]
ProgressM[ProgressMixin<br/>进度管理]
end
ObjBase[ObjBaseAttr<br/>属性管理器]
end
subgraph "接口层 SWIG 封装"
Core[PySSCore<br/>核心类型与工作空间]
Database[PySSDatabase<br/>数据库操作]
Map[PySSMap<br/>地图与数据集]
DataSource[PySSDataSource<br/>数据源访问]
View[PySSView<br/>视图控制]
DataX[PySSDataX<br/>数据交换]
Check[PySSCheck<br/>数据检查]
Math[PySSMath<br/>数学计算]
Widget[PySSWidget<br/>UI组件]
end
subgraph "实现层 C++ 核心库"
CoreDL[_PySSCore.pyd]
DatabaseDL[_PySSDatabase.pyd]
MapDL[_PySSMap.pyd]
DataSourceDL[_PySSDataSource.pyd]
ViewDL[_PySSView.pyd]
DataXDL[_PySSDataX.pyd]
CheckDL[_PySSCheck.pyd]
MathDL[_PySSMath.pyd]
WidgetDL[_PySSWidget.pyd]
end
SSProcess -.->|继承| SelectionM
SSProcess -.->|继承| GeoEditM
SSProcess -.->|继承| ProjectM
SSProcess -.->|继承| LogM
SSProcess -.->|继承| ProgressM
SSProcess -->|使用| ObjBase
SelectionM -->|调用| Core
SelectionM -->|调用| DataSource
GeoEditM -->|调用| Core
GeoEditM -->|调用| Database
ProjectM -->|调用| Core
ProjectM -->|调用| Map
LogM -.->|回调| Widget
ProgressM -->|调用| Widget
Core -->|加载| CoreDL
Database -->|加载| DatabaseDL
Map -->|加载| MapDL
DataSource -->|加载| DataSourceDL
View -->|加载| ViewDL
DataX -->|加载| DataXDL
Check -->|加载| CheckDL
Math -->|加载| MathDL
Widget -->|加载| WidgetDL
style SSProcess fill:#e1f5ff
style CoreDL fill:#fff4e1
style DatabaseDL fill:#fff4e1
style MapDL fill:#fff4e1
style DataSourceDL fill:#fff4e1
style ViewDL fill:#fff4e1
style DataXDL fill:#fff4e1
style CheckDL fill:#fff4e1
style MathDL fill:#fff4e1
style WidgetDL fill:#fff4e1
架构层次说明
SunvStation 系统架构分为三个层次,各层职责明确,通过标准接口实现交互。
应用层负责业务逻辑编排和用户交互,包含 SSProcessManager 核心管理类和多个 Mixin 功能模块。SSProcessManager 通过继承多个 Mixin 类组合功能,对外提供统一的 API 接口,对内协调各个功能模块的协作。ObjBaseAttr 作为属性管理器,统一管理地物属性的名称映射和索引转换。Sources: PySSProcess.py
接口层由多个 SWIG 自动生成的 Python 模块组成,每个模块对应特定的功能域。这些模块将 C++ 对象和方法封装为 Python 可调用的接口,同时保持与底层实现的高效通信。所有接口模块遵循相同的 SWIG 封装模式,包括类型代理、迭代器支持和动态属性管理。Sources: PySSCore.py, PySSDatabase.py, PySSView.py
实现层是编译为动态链接库(.pyd 文件)的 C++ 核心代码,提供高性能的地理数据处理能力。这一层包含工作空间管理、地图渲染、数据库访问、空间分析等核心算法和功能。C++ 实现通过 SWIG 暴露给 Python,既保证了性能,又提供了易用的脚本接口。Sources: PySSMap.py, PySSDataX.py, PySSCheck.py
核心组件详解
SWIG 封装层
SWIG(Simplified Wrapper and Interface Generator)是连接 C++ 和 Python 的桥梁,通过自动生成的代理类实现类型安全的跨语言调用。所有 PySS*.py 文件都包含统一的 SWIG 生成代码模板,包括代理对象表示、动态属性控制、元类支持和迭代器实现。Sources: PySSCore.py
| SWIG 模块 | 功能域 | C++ 动态库 |
|---|---|---|
| PySSCore | 核心类型、工作空间、几何对象 | _PySSCore.pyd |
| PySSDatabase | 数据库操作、对象存储 | _PySSDatabase.pyd |
| PySSMap | 地图管理、数据集访问 | _PySSMap.pyd |
| PySSDataSource | 数据源访问、查询 | _PySSDataSource.pyd |
| PySSView | 视图控制、地图显示 | _PySSView.pyd |
| PySSDataX | 数据交换、导入导出 | _PySSDataX.pyd |
| PySSCheck | 数据检查、验证规则 | _PySSCheck.pyd |
| PySSMath | 数学计算、坐标转换 | _PySSMath.pyd |
| PySSWidget | UI 组件、进度条 | _PySSWidget.pyd |
SWIG 封装层使用版本 4.4.0,通过条件导入机制支持包内和独立模块两种导入方式,确保在不同部署环境下的兼容性。Sources: PySSCore.py, PySSDatabase.py
SSProcessManager 核心管理类
SSProcessManager 是 SunvStation Python 接口的核心入口,通过单例模式 SSProcess 向外提供服务。该类在初始化时获取工作空间和当前地图实例,创建必要的辅助对象,为后续操作准备环境。Sources: PySSProcess.py
flowchart LR
A[SSProcessManager.__init__] --> B[获取 WorkSpace 单例]
B --> C[获取当前 ScaleMap]
C --> D[获取 GlobalOptions 单例]
D --> E[创建 ObjBaseAttr 属性管理器]
E --> F[创建 GeoBaseList 选择集]
F --> G[创建 SSearchHelper 搜索助手]
G --> H[创建缓存对象列表]
H --> I[创建进度条和日志对象]
I --> J[初始化完成]
style A fill:#e1f5ff
style J fill:#d4edda
SSProcessManager 的成员变量涵盖了工作空间管理的各个方面,包括工作空间引用、地图实例、全局配置、属性管理器、选择集列表、搜索助手、当前选中对象、新建对象缓存、删除对象缓存、进度条和日志记录器等。这种设计将所有操作所需的状态集中管理,简化了跨模块协作。Sources: PySSProcess.py
Mixin 设计模式
Mixin 设计模式是 SSProcessManager 架构的核心特征,通过将功能拆分为独立的 Mixin 类,实现代码复用和职责分离。SSProcessManager 继承自五个 Mixin 类:SelectionMixin、GeoEditMixin、ProjectMixin、LogMixin 和 ProgressMixin,每个 Mixin 负责特定的功能域。Sources: PySSProcess.py
Mixin 之间存在依赖关系,形成了清晰的功能层次。SelectionMixin 继承自 GeoEditAware、LogAware 和 ProgressAware,继承了地理编辑、日志记录和进度管理的抽象接口。GeoEditMixin 定义了地理对象编辑的抽象方法,为具体实现提供规范。这种基于抽象基类的设计确保了 Mixin 之间的松耦合和高内聚。Sources: ssprocess_mixins/selection_mixin.py, ssprocess_mixins/geo_edit_mixin.py
| Mixin 类 | 功能域 | 主要方法 |
|---|---|---|
| SelectionMixin | 选择集管理 | clearSelection, setSelectCondition, selectFilter, getSelGeoCount |
| GeoEditMixin | 地理对象编辑 | createDefaultGeoBase, createNewObjByCode, addNewObjPoint, saveBufferObjToDatabase |
| ProjectMixin | 项目和工作空间 | getWorkspace, getCurrentMap, pushUndoMark, getSysPathName, mapZoom |
| LogMixin | 日志记录 | set_logger, log_error_msg |
| ProgressMixin | 进度管理 | disable_progress, startProgress, stepProgress, closeProgress |
属性管理系统
ObjBaseAttr 类负责地物属性的统一管理,将属性名称映射为索引,提供类型安全的属性访问。该类在初始化时注册所有预定义的属性名称,包括点属性、地物通用属性、几何参量、注记属性等,并为常用属性提供便捷访问属性。Sources: ObjBaseAttr.py
属性名称采用 SSObj_ 前缀的命名约定,涵盖了地物对象的各个方面。点属性包括 PointName、PointCount、PointType、X、Y、Z;地物通用属性包括 Code、LayerName、Color、LineType、ID、Name、Type 等;几何参量包括 Area、Length、3DLength、边界坐标等;注记属性包括字体、颜色、对齐方式、方向等。通过统一的属性命名和管理,系统确保了属性访问的一致性和可维护性。Sources: ObjBaseAttr.py
模块架构与职责
核心模块
PySSCore 模块定义了系统的基础类型和工作空间管理类,是整个系统的核心依赖。该模块包含 WorkSpace 单例类、GeoBase 地物基类、GeoBaseList 地物列表、SSearchHelper 搜索助手等核心类型。WorkSpace 采用单例模式,提供全局唯一的工作空间实例,通过 getInstance() 方法访问。ScaleMap 代表比例尺地图,管理数据集和图层。Sources: PySSProcess.py
PySSDatabase 模块负责数据库操作,包括对象的创建、修改、删除和查询。该模块封装了底层数据库访问逻辑,提供事务支持和缓存管理。PySSMap 模块管理地图和数据集,提供图层控制、视图操作和数据集访问功能。PySSDataSource 模块处理数据源访问,支持多种数据格式和查询方式。Sources: PySSDatabase.py, PySSMap.py
功能域划分
SunvStation 系统按照功能域划分为六个主要领域,每个领域由相应的模块和 Mixin 负责实现。选择集与查询领域由 SelectionMixin 和 SSearchHelper 负责,支持条件设置、过滤查询和选择集遍历。地理对象编辑领域由 GeoEditMixin 负责,提供对象创建、坐标添加、属性设置和数据库保存功能。Sources: ssprocess_mixins/selection_mixin.py, ssprocess_mixins/geo_edit_mixin.py
数据交换领域由 PySSDataX 模块负责,支持外部数据的导入导出和格式转换。数据检查领域由 PySSCheck 模块负责,提供检查记录管理和自定义规则验证。高级功能领域由 ProjectMixin、LogMixin 和 ProgressMixin 共同负责,涵盖工作空间管理、日志记录和进度显示。参考手册领域则提供完整的 API 文档和工具函数索引。Sources: PySSDataX.py, PySSCheck.py
设计模式与架构特性
Mixin 设计模式
Mixin 设计模式是系统架构的核心特征,通过多重继承实现功能的组合。每个 Mixin 类专注于单一职责,提供相关的方法集合。SelectionMixin 专注于选择集操作,包括清除选择集、设置条件、执行过滤等。GeoEditMixin 专注于地理对象编辑,包括对象创建、属性修改、缓存管理等。ProjectMixin 专注于项目和工作空间操作,包括获取工作空间、地图缩放、撤销标记等。Sources: ssprocess_mixins/selection_mixin.py, ssprocess_mixins/project_mixin.py
Mixin 之间通过抽象基类建立契约关系,确保接口的一致性。LogAware 和 ProgressAware 定义了日志和进度管理的抽象接口,LogMixin 和 ProgressMixin 提供具体实现。GeoEditAware 定义了地理编辑的抽象方法,GeoEditMixin 实现这些方法,其他需要编辑功能的 Mixin 可以继承 GeoEditAware 或依赖 GeoEditMixin。Sources: ssprocess_mixins/log_mixin.py, ssprocess_mixins/progress_mixin.py
单例模式
单例模式在系统中广泛使用,确保全局唯一对象的创建和访问。WorkSpace 采用单例模式,通过 getInstance() 方法获取唯一实例,全局维护工作空间状态。GlobalOptions 同样采用单例模式,管理系统全局配置选项。SSProcess 作为全局导出的单例,提供统一的访问入口,简化了 API 的使用。Sources: PySSProcess.py, PySSProcess.py
抽象基类模式
抽象基类(ABC)用于定义 Mixin 之间的契约,确保接口的一致性和可扩展性。LogAware 和 ProgressAware 使用 abc.ABC 作为基类,定义了必须实现的抽象方法。GeoEditAware 继承自 abc.ABC,定义了地理编辑的抽象方法列表。这种设计利用 Python 的类型系统,在编译时检查接口的完整性,提高了代码的健壮性。Sources: ssprocess_mixins/log_mixin.py, ssprocess_mixins/geo_edit_mixin.py
依赖注入模式
依赖注入模式在系统中体现在对象成员的显式声明和初始化上。SSProcessManager 和各个 Mixin 类都显式声明了成员变量类型,包括 workspace、map、global_options、logger 等。这种设计使得依赖关系清晰可见,便于单元测试和模块替换。成员变量的类型注解使用 typing 模块,包括 Optional 和 Callable,提高了代码的可读性和 IDE 支持度。Sources: PySSProcess.py, ssprocess_mixins/selection_mixin.py
技术栈与依赖
SWIG 封装技术
SWIG 版本 4.4.0 是系统跨语言集成的核心技术,通过自动生成的代理类实现 C++ 和 Python 的无缝连接。每个 PySS*.py 文件都包含 SWIG 生成的标准模板,包括动态属性控制、迭代器支持和元类实现。SWIG 使用 _swig_repr 提供对象的字符串表示,使用 _swig_setattr_nondynamic_instance_variable 和 _swig_setattr_nondynamic_class_variable 防止动态属性添加,确保类型安全。Sources: PySSCore.py, PySSDatabase.py
Python 类型提示
系统广泛使用 Python 类型提示,提高代码的可读性和 IDE 支持度。typing.Optional 用于可能为 None 的对象,如 logger 和 progress。typing.Callable 用于回调函数类型。成员变量使用显式类型注解,如 workspace: WorkSpace、map: ScaleMap、enable_progress: bool。这种设计利用 Python 3.5+ 的类型系统,在不影响运行时性能的前提下提供静态类型检查。Sources: PySSProcess.py, ssprocess_mixins/log_mixin.py
抽象基类(ABC)
abc 模块用于定义抽象基类和抽象方法,建立 Mixin 之间的契约。LogAware 和 ProgressAware 定义了日志和进度管理的抽象方法,LogMixin 和 ProgressMixin 提供具体实现。GeoEditAware 定义了地理编辑的抽象方法,包括 createDefaultGeoBase、createNewObjByCode、addNewObjPoint 等。这种设计利用 Python 的抽象基类机制,在编译时检查接口实现,提高了代码的健壮性。Sources: ssprocess_mixins/log_mixin.py, ssprocess_mixins/geo_edit_mixin.py
数据流与交互
初始化流程
系统初始化从导入 sunvpy 模块开始,通过 init.py 定义包的元信息和导出接口。创建 SSProcessManager 实例时,依次获取 WorkSpace 单例、当前 ScaleMap、GlobalOptions 单例,创建 ObjBaseAttr 属性管理器、GeoBaseList 选择集、SSearchHelper 搜索助手,初始化缓存对象列表、进度条和日志对象。初始化完成后,SSProcess 作为全局单例提供服务。Sources: PySSProcess.py, PySSProcess.py
操作流程
用户通过 SSProcess 调用 Mixin 提供的方法,如 setSelectCondition 设置选择条件,selectFilter 执行过滤查询,getSelGeoCount 获取选择集数量。方法调用通过 Mixin 委托给 SWIG 封装的 C++ 对象,如 SSearchHelper 的 m_selectConditions 属性,WorkSpace 的 getCurrentScaleMap 方法。结果通过 SWIG 代理对象返回 Python 层,由 Mixin 进行必要的数据转换和缓存管理。Sources: ssprocess_mixins/selection_mixin.py
缓存管理
系统采用多级缓存机制,提高性能和事务管理能力。selGeoList 和 selNoteList 缓存脚本选择集的地物和注记,bufferObjList 和 bufferNoteList 缓存需要保存的对象,newBufferObjList 和 newBufferNoteList 缓存新创建的对象,delBufferGeoList 缓存需要删除的对象。通过 saveBufferObjToDatabase 方法批量将缓存对象保存到数据库,通过 pushUndoMark 方法创建撤销标记,支持操作回滚。Sources: PySSProcess.py, ssprocess_mixins/geo_edit_mixin.py
sequenceDiagram
participant User as 用户代码
participant SSProcess as SSProcessManager
participant Mixin as Mixin 模块
participant SWIG as SWIG 封装层
participant CPP as C++ 核心库
User->>SSProcess: SSProcess.setSelectCondition()
SSProcess->>Mixin: SelectionMixin.setSelectCondition()
Mixin->>SWIG: searchHelper.m_selectConditions.add()
SWIG->>CPP: SSearchHelper::addCondition()
CPP-->>SWIG: 返回结果
SWIG-->>Mixin: 返回结果
Mixin-->>SSProcess: 完成
SSProcess-->>User: 返回
User->>SSProcess: SSProcess.selectFilter()
SSProcess->>Mixin: SelectionMixin.selectFilter()
Mixin->>SWIG: searchHelper.search()
SWIG->>CPP: SSearchHelper::executeQuery()
CPP-->>SWIG: 返回 GeoBaseList
SWIG-->>Mixin: 返回选择集
Mixin->>Mixin: 缓存到 selGeoList
Mixin-->>SSProcess: 完成
SSProcess-->>User: 返回选择集数量
User->>SSProcess: SSProcess.saveBufferObjToDatabase()
SSProcess->>Mixin: GeoEditMixin.saveBufferObjToDatabase()
Mixin->>SWIG: GeoBaseList.saveToDatabase()
SWIG->>CPP: Database::batchSave()
CPP-->>SWIG: 返回保存结果
SWIG-->>Mixin: 返回结果
Mixin->>Mixin: 清空缓存
Mixin-->>SSProcess: 完成
SSProcess-->>User: 返回
推荐学习路径
基于系统架构和文档目录,建议按照以下顺序深入学习 SunvStation 系统:
-
入门实践:通过第一个脚本:查询地物属性和使用 SSProcess 管理选择集进行实践操作,熟悉基本 API。
-
架构理解:在实践基础上,深入理解本文档SunvStation 系统架构,然后学习SWIG 封装机制说明和C++ 扩展模块与 Python 接口,理解跨语言集成原理。
-
核心概念:学习工作空间与地图概念和Mixin 设计模式,理解系统核心概念和设计思想。
-
功能深入:根据业务需求,深入学习各个功能域的文档,包括选择集与查询、地理对象编辑、数据交换、数据检查等章节。
-
参考手册:在开发过程中,随时查阅SSProcessManager 完整 API、ObjBaseAttr 属性索引和地理对象类型定义等参考手册。
这种学习路径从基础到深入,从实践到理论,帮助开发者逐步掌握 SunvStation 系统的核心能力和架构设计。