230 lines
9.5 KiB
Markdown
230 lines
9.5 KiB
Markdown
本页面介绍 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)**:回到快速入门,了解更完整的选择集管理流程
|
||
|
||
通过循序渐进的学习,您将能够熟练运用选择集机制,高效完成地理数据的批量处理任务。 |