Files
sunvpy-docs/docs/content/11-qing-chu-yu-chu-shi-hua-xuan-ze-ji.md
2026-04-10 13:47:53 +08:00

230 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
本页面介绍 SunvStation Python 脚本中选择集的初始化机制与清除操作。选择集是脚本操作地理对象的核心容器,掌握其初始化和清除方法对于编写稳定的数据处理脚本至关重要。
## 选择集基本概念
在 SunvStation 脚本环境中,存在两种类型的选择集:**脚本选择集**和**系统选择集**。脚本选择集由 `SSProcessManager` 在内存中维护,用于批量操作地理对象;系统选择集则是地图界面中当前选中的对象集合,直接影响地图显示效果。两者可以相互同步,但具有不同的生命周期和管理方式。
脚本选择集由两个核心列表组成:`selGeoList` 存储点、线、面对象,`selNoteList` 存储注记对象。这种分离设计便于对不同类型的地理对象进行差异化管理。
Sources: [PySSProcess.py](PySSProcess.py#L30-L50)
## 选择集的自动初始化
当导入 `sunvpy` 模块或创建 `SSProcessManager` 实例时,选择集会自动完成初始化。初始化过程不需要开发者手动干预,确保脚本一开始就拥有可用的选择集容器。
自动初始化包含以下步骤:获取当前工作空间实例、获取当前比例尺地图、创建地物和注记的空列表、初始化搜索助手、配置数据源和数据集列表。
```mermaid
flowchart LR
A[模块导入] --> B[创建 SSProcessManager 实例]
B --> C[获取工作空间 WorkSpace]
C --> D[获取当前地图 ScaleMap]
D --> E[初始化选择集容器]
E --> F[selGeoList = GeoBaseList]
E --> G[selNoteList = GeoBaseList]
E --> H[searchHelper = SSearchHelper]
H --> I[配置数据源和数据集]
I --> J[初始化完成,准备就绪]
```
Sources: [PySSProcess.py](PySSProcess.py#L50-L80)
**关键初始化代码**展示了这一过程的实现:
```python
# 脚本选择集容器(在 __init__ 中自动创建)
self.selGeoList = GeoBaseList() # 点线面对象列表
self.selNoteList = GeoBaseList() # 注记对象列表
self.searchHelper = SSearchHelper() # 搜索助手
```
Sources: [PySSProcess.py](PySSProcess.py#L56-L61)
## 清除脚本选择集
`clearSelection()` 方法用于清空脚本选择集中的所有对象。该方法会同时清除地物列表和注记列表,将选择集恢复到初始空状态。这个操作不会影响系统选择集(地图上显示的选中状态),也不会影响数据库中的原始数据。
```python
# 清除脚本选择集中的所有地物和注记
SSProcess.clearSelection()
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L38-L43)
**清除操作的实际效果**:调用 `clearSelection()` 后,`selGeoList``selNoteList` 都会变为空列表,后续的选择查询和遍历操作将基于空集进行。这是开启新一轮选择操作前的标准准备步骤。
## 清除选择条件
`clearSelectCondition()` 方法专门用于清除选择条件,而不影响选择集对象本身。选择条件由 `searchHelper` 内部维护,包含用于过滤查询的各种规则。清除条件后,新的查询将不再受之前设置条件的约束。
```python
# 清除之前设置的所有选择条件
SSProcess.clearSelectCondition()
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49)
选择条件与选择集对象的区别:选择条件是"筛选规则",选择集对象是"筛选结果"。`clearSelectCondition()` 清除规则,保留结果;`clearSelection()` 清除结果,保留规则。在实际脚本中,通常先清除条件,再设置新条件,最后执行查询。
## 清除系统选择集
`clearSysSelection()` 方法操作的是地图系统选择集,会移除地图界面上所有高亮显示的选中对象。这直接影响地图的视觉效果,使地图恢复到无选中状态。
```python
# 清除地图系统选择集(移除地图上的高亮显示)
SSProcess.clearSysSelection()
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L190-L193)
**脚本选择集与系统选择集的协同**:在需要完全重置选择状态的场景下,通常连续调用三种清除方法:先清除脚本选择集对象,再清除选择条件,最后清除系统选择集的高亮显示。
## 典型使用场景
### 场景一:开始新的查询操作
在执行新一轮数据查询前,需要重置选择集状态,确保不受到之前查询结果的干扰。
```mermaid
flowchart LR
A[开始新查询] --> B[clearSelection<br/>清除脚本选择集]
B --> C[clearSelectCondition<br/>清除选择条件]
C --> D[setSelectCondition<br/>设置新条件]
D --> E[selectFilter<br/>执行查询]
E --> F[获得新的选择集结果]
```
Sources: [PySSProcess.py](PySSProcess.py#L98-L106)
**完整示例代码**
```python
# 准备阶段:清除旧的查询状态
SSProcess.clearSelection() # 清除之前的选择集对象
SSProcess.clearSelectCondition() # 清除之前的选择条件
# 设置新的查询条件
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
# 执行查询
SSProcess.selectFilter()
# 获取查询结果
geo_count = SSProcess.getSelGeoCount()
print(f"查询到 {geo_count} 个地物对象")
```
Sources: [PySSProcess.py](PySSProcess.py#L98-L108)
### 场景二:脚本结束前的清理
在脚本执行结束时,清除所有选择状态,避免影响用户后续操作。
```python
# 批量处理完成后清理
# ... 数据处理逻辑 ...
SSProcess.clearSelection() # 清除脚本选择集
SSProcess.clearSysSelection() # 清除地图高亮显示
```
### 场景三:条件筛选后重试
当第一次查询结果不符合预期时,清除条件并重新设置筛选规则。
```python
# 第一次查询
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "LINE")
SSProcess.selectFilter()
if SSProcess.getSelGeoCount() == 0:
# 结果为空,尝试调整条件
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.selectFilter()
```
## 三种清除方法的对比
下表总结了三种清除方法的适用场景和操作范围:
| 方法 | 操作对象 | 是否影响地图显示 | 典型使用场景 |
|------|---------|----------------|-------------|
| `clearSelection()` | 脚本选择集对象列表 | 否 | 开始新一轮查询前、脚本结束清理 |
| `clearSelectCondition()` | 搜索条件规则 | 否 | 更改查询条件前、重试查询时 |
| `clearSysSelection()` | 地图系统选择集 | 是 | 移除地图高亮、避免视觉干扰 |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L38-L193)
## 选择集状态检查
在清除操作前后,可以使用查询方法验证选择集状态。
```python
# 清除前检查
print(f"清除前地物数量: {SSProcess.getSelGeoCount()}")
print(f"清除前注记数量: {SSProcess.getSelNoteCount()}")
# 执行清除
SSProcess.clearSelection()
# 清除后检查
print(f"清除后地物数量: {SSProcess.getSelGeoCount()}")
print(f"清除后注记数量: {SSProcess.getSelNoteCount()}")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L195-L208)
## 完整工作流程示例
以下示例展示了一个完整的选择集使用周期:初始化、设置条件、查询、处理、清理。
```python
# 步骤 1重置选择集状态通常不需要手动初始化
SSProcess.clearSelection()
SSProcess.clearSelectCondition()
# 步骤 2设置查询条件
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
# 步骤 3执行过滤查询
SSProcess.selectFilter()
# 步骤 4处理选择集对象
count = SSProcess.getSelGeoCount()
for i in range(count):
name = SSProcess.getSelGeoValue(i, "SSObj_Name")
print(f"对象 {i}: {name}")
# 步骤 5清理选择状态
SSProcess.clearSelection()
SSProcess.clearSysSelection()
```
Sources: [PySSProcess.py](PySSProcess.py#L98-L140)
## 常见问题与注意事项
**问题一**:清除选择集后,地图上的对象还在吗?<br>
**解答**:清除脚本选择集不会从地图或数据库中删除对象,只是从内存中的列表移除引用。要真正删除对象,需要调用删除对象的方法。
**问题二**:为什么需要分别清除对象和条件?<br>
**解答**:这是为了提供更精细的控制。有时需要保留选择结果但更换查询条件,有时需要更换条件但保留部分结果。分离设计让脚本更灵活。
**问题三**:系统选择集和脚本选择集会自动同步吗?<br>
**解答**:不会自动同步。需要使用 `updateSysSelection()` 方法手动同步,可以指定同步方向。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L152-L176)
## 学习路径建议
掌握清除与初始化选择集是学习 SunvStation 脚本的基础。建议按照以下顺序继续学习:
1. **[设置选择条件](12-she-zhi-xuan-ze-tiao-jian)**:深入了解如何构建复杂的选择条件
2. **[执行过滤查询](13-zhi-xing-guo-lv-cha-xun)**:学习 `selectFilter()` 方法的详细用法
3. **[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang)**:掌握如何高效遍历和访问选择集中的对象
4. **[使用 SSProcess 管理选择集](4-shi-yong-ssprocess-guan-li-xuan-ze-ji)**:回到快速入门,了解更完整的选择集管理流程
通过循序渐进的学习,您将能够熟练运用选择集机制,高效完成地理数据的批量处理任务。