Files
sunvpy-docs/docs/content/40-ssprocessmanager-wan-zheng-api.md
2026-04-10 13:47:53 +08:00

24 KiB
Raw Blame History

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() - 将缓存的对象批量保存到数据库。该方法处理三种缓存类型:

  1. 新建对象缓存newBufferObjListnewBufferNoteList
  2. 修改对象缓存bufferObjListbufferNoteList
  3. 删除对象缓存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) - 根据要素代码重置选择集中的几何对象。该方法会:

  1. 查询新代码对应的特征信息
  2. 如果在相同数据集,仅修改代码
  3. 如果在不同数据集,创建新对象并复制几何和扩展属性
  4. 将旧对象加入删除缓存,新对象加入新建缓存

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

相关文档

要深入了解特定功能模块,请参考以下文档: