24 KiB
SSProcessManager 是 SunvStation 地理信息系统中的核心进程管理类,提供了对工作空间、地图、几何对象选择与编辑的完整操作能力。该类通过 Mixin 设计模式将功能模块化,为高级开发者提供了灵活且强大的地理数据处理接口。本文档将系统性地介绍 SSProcessManager 的完整 API 接口、架构设计以及使用方法。
核心架构设计
SSProcessManager 采用多重继承的 Mixin 设计模式,将复杂的功能拆分为五个独立的模块,每个模块负责特定的领域功能。这种设计使得代码具有高度的可维护性和扩展性,同时保持了良好的关注点分离原则。
类继承结构
classDiagram
class SSProcessManager {
+workspace: WorkSpace
+map: ScaleMap
+selGeoList: GeoBaseList
+selNoteList: GeoBaseList
+bufferObjList: GeoBaseList
+curNewObj: tuple
+logger: Logger
+progress: Progress
-__init__()
}
class SelectionMixin {
+clearSelection()
+clearSelectCondition()
+setSelectCondition()
+selectFilter()
+getSelGeoCount()
+getSelGeoValue()
+setSelGeoValue()
+updateSysSelection()
}
class GeoEditMixin {
+createDefaultGeoBase()
+createNewObjByCode()
+createNewObjByClass()
+setNewObjValue()
+addNewObjPoint()
+saveBufferObjToDatabase()
+explodeGeoObject()
}
class ProjectMixin {
+getWorkspace()
+getCurrentMap()
+getSysPathName()
+getLayerCount()
+setLayerStatus()
+pushUndoMark()
}
class LogMixin {
+set_logger()
+log_error_msg()
}
class ProgressMixin {
+disable_progress()
+startProgress()
+stepProgress()
+closeProgress()
}
SSProcessManager --> SelectionMixin
SSProcessManager --> GeoEditMixin
SSProcessManager --> ProjectMixin
SSProcessManager --> LogMixin
SSProcessManager --> ProgressMixin
模块职责划分
SelectionMixin - 负责选择集管理,提供条件过滤、属性读写和系统选择集同步功能 GeoEditMixin - 负责地理对象编辑,包括对象创建、属性设置、缓存管理和打散操作 ProjectMixin - 负责项目和工作空间管理,包括图层控制、路径管理和地图帧操作 LogMixin - 负责日志记录,提供统一的错误日志接口 ProgressMixin - 负责进度条管理,提供可视化进度反馈
Sources: PySSProcess.py
选择集操作 API
选择集操作是 SSProcessManager 的核心功能之一,提供了强大的条件查询和属性管理能力。选择集分为脚本选择集和系统选择集,两者可以通过特定方法进行双向同步。
基础选择集管理
clearSelection() - 清除脚本选择集中的全部点线面和注记对象。此方法不会影响地图显示的选择集,仅清理脚本内部的缓存。Sources: selection_mixin.py
clearSelectCondition() - 清除所有已设置的选择条件。在执行新的查询前,通常需要调用此方法以避免条件累积。Sources: selection_mixin.py
clearSysSelection() - 清除地图上的系统选择集并触发选择变更事件。此方法会影响地图的显示状态。Sources: selection_mixin.py
条件设置与过滤
setSelectCondition(conditionName, operateMode, conditionValue) - 向选择条件集合中添加过滤条件。条件支持三种类型:
| 条件类型 | 前缀符号 | 示例 | 说明 |
|---|---|---|---|
| 基本属性 | SSObj_ | SSObj_Code, SSObj_Name | 对象固有属性 |
| 几何特性 | <> | , | 几何拓扑关系 |
| 扩展属性 | [] | [JG], [CS] | 用户自定义属性 |
支持的运算符包括:==, >, <, <>, LIKE, NOT LIKE, CompareNoCase(不区分大小写比较), Dec(小数位控制)
Sources: selection_mixin.py
selectFilter() - 执行选择集过滤操作。该方法会清除旧的字段缓存,根据当前设置的条件从数据源中筛选对象,并将结果分类存储到 selGeoList(点线面)和 selNoteList(注记)中。Sources: selection_mixin.py
选择集查询
getSelGeoCount() - 返回脚本选择集中点线面对象的数量。Sources: selection_mixin.py
getSelNoteCount() - 返回脚本选择集中注记对象的数量。Sources: selection_mixin.py
getSysSelGeoList() - 获取地图当前选中的几何对象列表。Sources: selection_mixin.py
getSysSelNoteList() - 获取地图当前选中的注记对象列表。Sources: selection_mixin.py
属性读写
getSelGeoValue(index, fieldName) - 获取选择集中指定索引对象的属性值。该方法会自动识别属性类型:
- 基本属性:以
SSObj_开头,直接通过ObjBaseAttr获取 - 扩展属性:以
[]包裹,从扩展属性表中查询 - 多属性查询:支持使用逗号分隔多个属性名,如
[JG,CS]
Sources: selection_mixin.py
getSelNoteValue(index, fieldName) - 获取注记对象的属性值,方法与 getSelGeoValue 类似。Sources: selection_mixin.py
setSelGeoValue(index, fieldName, value) - 设置选择集中指定对象的属性值。特殊处理:
- SSObj_Code:修改对象编码时直接设置整数值
- SSObj_LayerName:修改图层时需要克隆对象、删除原始对象并创建新对象,同时保留扩展属性
- 其他属性:通过
ObjBaseAttr统一处理
Sources: selection_mixin.py
setSelNoteValue(index, fieldName, value) - 设置注记对象的属性值。Sources: selection_mixin.py
坐标操作
getSelGeoPoint(index, pointIndex) - 获取选择集中指定对象的指定点坐标。返回值为 Point3D 对象。Sources: selection_mixin.py
deleteSelGeoPoint(index, pointIndex) - 删除选择集中指定对象的指定点。Sources: selection_mixin.py
选择集同步
updateSysSelection(mode) - 实现脚本选择集与系统选择集的双向同步。mode 参数控制同步方向:
| mode | 同步方向 | 说明 |
|---|---|---|
| 0 | 系统 → 脚本 | 从地图选择集同步到脚本选择集 |
| 1 | 脚本 → 系统 | 从脚本选择集同步到地图选择集(更新显示) |
| 2 | 脚本 → 系统 | 从脚本选择集同步到地图选择集(不更新显示) |
Sources: selection_mixin.py
地理对象编辑 API
地理对象编辑模块提供了完整的对象生命周期管理能力,包括创建、修改、缓存和持久化等操作。
对象创建
createDefaultGeoBase(obj_type, dataset) - 创建基础几何对象。obj_type 参数指定对象类型:
| obj_type | 几何类型 | 对应类 |
|---|---|---|
| 0 | 点 | PointObject |
| 1 | 线 | LineObject |
| 2 | 面 | AreaObject |
| 3 | 注记 | MarkNote |
返回值为包含 GeoObject 和具体几何对象的元组。Sources: geo_edit_mixin.py
createNewObjByCode(code) - 根据要素代码创建新对象。该方法会自动查询要素代码表,获取对应的数据集、对象类型和样式属性,并创建完整的几何对象。创建成功后会更新 curNewObj 成员变量。Sources: geo_edit_mixin.py
createNewObjByClass(noteClass) - 根据注记分类号创建新注记对象。该方法会从注记模板表中获取模板,创建注记对象并应用模板样式。Sources: geo_edit_mixin.py
新建对象操作
setNewObjValue(fieldName, value) - 设置当前新建对象的属性值。该方法支持批量属性设置,用逗号分隔多个属性名和值。属性类型自动识别:
- 扩展属性:以
[]包裹,直接设置到 memoData - 基本属性:以
SSObj_开头,调用对应设置方法 - 注记专属属性:仅当对象类型为注记时有效
Sources: geo_edit_mixin.py
addNewObjPoint(x, y, z, type, name) - 向当前新建对象添加坐标点。type 参数使用二进制位存储点信息枚举。Sources: geo_edit_mixin.py
deleteNewObj() - 删除当前新建对象并清理 curNewObj 成员变量。Sources: geo_edit_mixin.py
addNewObjToSelObjList() - 将当前新建对象添加到脚本选择集。Sources: geo_edit_mixin.py
addNewObjToSaveObjList() - 将当前新建对象添加到持久化保存列表。Sources: geo_edit_mixin.py
缓存与持久化
saveBufferObjToDatabase() - 将缓存的对象批量保存到数据库。该方法处理三种缓存类型:
- 新建对象缓存:
newBufferObjList和newBufferNoteList - 修改对象缓存:
bufferObjList和bufferNoteList - 删除对象缓存:
delBufferGeoList
保存时会将 memoData 转换为扩展属性,确保数据完整性。Sources: geo_edit_mixin.py
transMemoDataToExtendAttr(geoList) - 将几何对象的备忘数据转换为扩展属性。该方法使用事务模式批量更新,提高性能。Sources: geo_edit_mixin.py
addSelGeoToSaveGeoList(index) - 将选择集中的几何对象添加到保存缓存。Sources: selection_mixin.py
addSelNoteToSaveNoteList(index) - 将选择集中的注记对象添加到保存缓存。Sources: selection_mixin.py
对象重置
resetSelGeoByCode(index, code) - 根据要素代码重置选择集中的几何对象。该方法会:
- 查询新代码对应的特征信息
- 如果在相同数据集,仅修改代码
- 如果在不同数据集,创建新对象并复制几何和扩展属性
- 将旧对象加入删除缓存,新对象加入新建缓存
Sources: selection_mixin.py
resetSelNoteByClass(index, noteClass) - 根据注记分类号重置选择集中的注记对象。逻辑与 resetSelGeoByCode 类似,但处理注记特有属性。Sources: selection_mixin.py
对象打散
explodeGeoObject(geo, explodeWay, callback) - 将几何对象打散为多个子对象。explodeWay 参数控制打散方式:
| explodeWay | 打散方式 | 说明 |
|---|---|---|
| 0 | 图形打散 | 保持颜色,打散为基本图形 |
| 1 | 按编码表打散 | 根据符号表进行分解 |
| 11 | 拆分为线 | 转换为线对象列表 |
| 12 | 拆分环 | 按环拆分复杂多边形 |
callback 参数为回调函数名,用于处理打散后的对象。Sources: geo_edit_mixin.py
explodeNoteObject(note, forExchange, callback) - 将注记对象打散为多个子注记。Sources: geo_edit_mixin.py
explodeSelectionObj(explodeWay, delSrcObj, callback) - 批量打散选择集中的所有对象。delSrcObj 参数控制是否删除原始对象。Sources: selection_mixin.py
辅助计算
getPolar(pt0, pt1) - 计算两点之间的距离和角度。返回值为 (距离, 角度) 元组。Sources: geo_edit_mixin.py
getPoint(pt0, dist, angle) - 根据起点、距离和角度计算终点坐标。返回值为 Point3D 对象。Sources: geo_edit_mixin.py
getObjectAttr(objId, attrField) - 根据对象 ID 获取属性值。该方法会先查询对象是否存在,然后读取指定属性。Sources: geo_edit_mixin.py
项目与工作空间 API
项目模块提供了对 SunvStation 工作空间和地图环境的高级访问能力,包括图层管理、路径操作和地图帧控制等功能。
工作空间与地图
getWorkspace() - 获取当前工作空间实例。工作空间是 SunvStation 数据组织的顶层容器。Sources: project_mixin.py
getCurrentMap() - 获取当前比例尺地图实例。地图是地理对象的显示和管理容器。Sources: project_mixin.py
pushUndoMark(action) - 创建撤销标记。在执行可撤销操作前调用此方法,action 参数描述操作名称,默认为 "CommandGroup"。Sources: project_mixin.py
系统路径管理
getSysPathName(mode) - 根据模式获取系统路径。mode 参数支持的路径类型:
| mode | 路径类型 | 说明 |
|---|---|---|
| 0 | 配置路径 | GlobalOptions 配置目录 |
| 1 | 模板路径 | 系统模板目录 |
| 2 | Comm路径 | 通用文件目录 |
| 3 | Script路径 | 脚本文件目录 |
| 4 | SSTemp路径 | 临时文件目录 |
| 5 | 工程文件路径 | 当前工程所在目录 |
| 6 | 系统目录 | Windows/System32 或 /usr |
| 7/8 | 方案路径 | 当前方案文件目录 |
Sources: project_mixin.py
图层管理
getLayerCount() - 获取当前地图中的图层数量。Sources: project_mixin.py
getLayerName(index) - 获取指定索引的图层名称。Sources: project_mixin.py
setLayerStatus(layerName, status, type) - 设置图层状态。type 参数控制状态类型:
| type | 控制类型 | status 含义 |
|---|---|---|
| 1 | 图层显示 | True=可见,False=隐藏 |
| 2 | 编辑锁定 | True=锁定,False=解锁 |
Sources: project_mixin.py
地图帧操作
createMapFrame() - 创建地图帧。该方法会计算地图范围并生成地图帧点列表。Sources: project_mixin.py
getMapFrameCount() - 获取地图帧数量。Sources: project_mixin.py
getMapFrameCenterPoint(index) - 获取指定地图帧的中心点坐标。Sources: project_mixin.py
setCurMapFrame(x, y) - 设置当前地图帧。Sources: project_mixin.py
getCurMapFrame() - 获取当前地图帧的对象 ID。Sources: project_mixin.py
getMapFrameNumber(x, y) - 获取指定坐标所在的地图帧编号。Sources: project_mixin.py
freeMapFrame() - 释放地图帧缓存。Sources: project_mixin.py
系统表管理
getFeatureCodeTB() - 获取当前要素代码表名称。Sources: project_mixin.py
getSymbolScriptTB() - 获取当前符号表名称。Sources: project_mixin.py
getNoteTemplateTB() - 获取当前注记模板表名称。Sources: project_mixin.py
setFeatureCodeTB(featureCodeTB, symbolScriptTB) - 设置要素代码表和符号表。如果与当前设置不同,会重新加载并触发系统表变更事件。Sources: project_mixin.py
setNoteTemplateTB(noteTemplateTB) - 设置注记模板表。Sources: project_mixin.py
进度与日志 API
进度和日志模块为长时间操作提供了用户反馈和错误跟踪能力。
进度条管理
disable_progress() - 禁用进度条显示并立即关闭当前进度条。Sources: progress_mixin.py
startProgress(title, total) - 创建并启动进度条。title 为进度条标题,total 为总进度值。Sources: progress_mixin.py
stepProgress(message) - 更新进度条。message 为当前步骤描述信息。Sources: progress_mixin.py
closeProgress() - 关闭进度条。Sources: progress_mixin.py
日志记录
set_logger(logger) - 设置日志记录器实例。Sources: log_mixin.py
log_error_msg(error_msg) - 记录错误日志。如果设置了 logger,调用 logger.error();否则使用 print 输出。Sources: log_mixin.py
完整 API 参考表
下表列出了 SSProcessManager 的所有公共方法及其所属模块:
| 方法名 | 所属模块 | 功能描述 | 返回值 |
|---|---|---|---|
| 选择集操作 | |||
clearSelection() |
SelectionMixin | 清除脚本选择集 | None |
clearSelectCondition() |
SelectionMixin | 清除选择条件 | None |
setSelectCondition(name, mode, value) |
SelectionMixin | 添加选择条件 | None |
selectFilter() |
SelectionMixin | 执行过滤查询 | None |
getSelGeoCount() |
SelectionMixin | 获取点线面对象数量 | int |
getSelNoteCount() |
SelectionMixin | 获取注记对象数量 | int |
getSelGeoValue(index, fieldName) |
SelectionMixin | 获取几何对象属性 | str |
getSelNoteValue(index, fieldName) |
SelectionMixin | 获取注记对象属性 | str |
setSelGeoValue(index, fieldName, value) |
SelectionMixin | 设置几何对象属性 | None |
setSelNoteValue(index, fieldName, value) |
SelectionMixin | 设置注记对象属性 | None |
getSelGeoPoint(index, pointIndex) |
SelectionMixin | 获取坐标点 | Point3D |
deleteSelGeoPoint(index, pointIndex) |
SelectionMixin | 删除坐标点 | bool |
updateSysSelection(mode) |
SelectionMixin | 同步选择集 | None |
getSysSelGeoList() |
SelectionMixin | 获取系统几何选择集 | GeoBaseList |
getSysSelNoteList() |
SelectionMixin | 获取系统注记选择集 | GeoBaseList |
clearSysSelection() |
SelectionMixin | 清除系统选择集 | None |
resetSelGeoByCode(index, code) |
SelectionMixin | 按代码重置对象 | bool |
resetSelNoteByClass(index, noteClass) |
SelectionMixin | 按分类重置注记 | bool |
addSelGeoToSaveGeoList(index) |
SelectionMixin | 添加到保存列表 | None |
addSelNoteToSaveNoteList(index) |
SelectionMixin | 添加注记到保存列表 | None |
explodeSelectionObj(explodeWay, delSrcObj, callback) |
SelectionMixin | 批量打散对象 | bool |
| 对象编辑 | |||
createDefaultGeoBase(obj_type, dataset) |
GeoEditMixin | 创建基础几何对象 | tuple |
createNewObjByCode(code) |
GeoEditMixin | 按代码创建对象 | tuple |
createNewObjByClass(noteClass) |
GeoEditMixin | 按分类创建注记 | tuple |
setNewObjValue(fieldName, value) |
GeoEditMixin | 设置新建对象属性 | bool |
addNewObjPoint(x, y, z, type, name) |
GeoEditMixin | 添加坐标点 | bool |
deleteNewObj() |
GeoEditMixin | 删除新建对象 | None |
addNewObjToSelObjList() |
GeoEditMixin | 添加到选择集 | None |
addNewObjToSaveObjList() |
GeoEditMixin | 添加到保存列表 | None |
saveBufferObjToDatabase() |
GeoEditMixin | 保存缓存到数据库 | None |
transMemoDataToExtendAttr(geoList) |
GeoEditMixin | 转换扩展属性 | None |
explodeGeoObject(geo, explodeWay, callback) |
GeoEditMixin | 打散几何对象 | tuple |
explodeNoteObject(note, forExchange, callback) |
GeoEditMixin | 打散注记对象 | tuple |
getPolar(pt0, pt1) |
GeoEditMixin | 计算距离和角度 | tuple |
getPoint(pt0, dist, angle) |
GeoEditMixin | 计算终点坐标 | Point3D |
getObjectAttr(objId, attrField) |
GeoEditMixin | 获取对象属性 | str |
| 项目工作空间 | |||
getWorkspace() |
ProjectMixin | 获取工作空间实例 | WorkSpace |
getCurrentMap() |
ProjectMixin | 获取地图实例 | ScaleMap |
pushUndoMark(action) |
ProjectMixin | 创建撤销标记 | None |
getSysPathName(mode) |
ProjectMixin | 获取系统路径 | str |
getLayerCount() |
ProjectMixin | 获取图层数量 | int |
getLayerName(index) |
ProjectMixin | 获取图层名称 | str |
setLayerStatus(name, status, type) |
ProjectMixin | 设置图层状态 | bool |
createMapFrame() |
ProjectMixin | 创建地图帧 | bool |
getMapFrameCount() |
ProjectMixin | 获取地图帧数量 | int |
getMapFrameCenterPoint(index) |
ProjectMixin | 获取地图帧中心点 | tuple |
setCurMapFrame(x, y) |
ProjectMixin | 设置当前地图帧 | GeoBase |
getCurMapFrame() |
ProjectMixin | 获取当前地图帧ID | int |
getMapFrameNumber(x, y) |
ProjectMixin | 获取地图帧编号 | int |
freeMapFrame() |
ProjectMixin | 释放地图帧缓存 | None |
getFeatureCodeTB() |
ProjectMixin | 获取要素代码表名 | str |
getSymbolScriptTB() |
ProjectMixin | 获取符号表名 | str |
getNoteTemplateTB() |
ProjectMixin | 获取注记模板表名 | str |
setFeatureCodeTB(featTB, symTB) |
ProjectMixin | 设置要素代码表 | bool |
setNoteTemplateTB(noteTB) |
ProjectMixin | 设置注记模板表 | bool |
| 进度与日志 | |||
disable_progress() |
ProgressMixin | 禁用进度条 | None |
startProgress(title, total) |
ProgressMixin | 启动进度条 | None |
stepProgress(message) |
ProgressMixin | 更新进度条 | None |
closeProgress() |
ProgressMixin | 关闭进度条 | None |
set_logger(logger) |
LogMixin | 设置日志记录器 | None |
log_error_msg(error_msg) |
LogMixin | 记录错误日志 | None |
Sources: PySSProcess.py
实例化与使用
SSProcessManager 提供了一个全局单例 SSProcess,供开发者直接使用:
from sunvpy.PySSProcess import SSProcess
# 清除选择条件和选择集
SSProcess.clearSelectCondition()
SSProcess.clearSelection()
# 设置选择条件并执行过滤
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
SSProcess.selectFilter()
# 遍历选择集
count = SSProcess.getSelGeoCount()
for i in range(count):
code = SSProcess.getSelGeoValue(i, "SSObj_Code")
name = SSProcess.getSelGeoValue(i, "SSObj_Name")
print(f"对象 {i}: 编码={code}, 名称={name}")
# 修改属性
SSProcess.setSelGeoValue(i, "SSObj_Name", f"新名称_{i}")
# 添加到保存列表
SSProcess.addSelGeoToSaveGeoList(i)
# 批量保存到数据库
SSProcess.pushUndoMark("批量修改属性")
SSProcess.saveBufferObjToDatabase()
Sources: PySSProcess.py
相关文档
要深入了解特定功能模块,请参考以下文档: