本页面介绍 SunvStation Python 脚本中设置选择条件的方法。选择条件是过滤地理对象的查询规则，通过组合不同条件可以精确筛选出符合特定要求的地物对象。掌握条件设置的语法和技巧，能够显著提升数据处理脚本的效率和准确性。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)

## 核心方法概述

`setSelectCondition()` 方法是设置选择条件的主要接口。该方法将指定的条件添加到脚本选择集的查询规则中，可以多次调用以构建复合查询条件。条件由三个部分组成：条件名称、操作模式和条件值，三者组合形成一个完整的查询表达式。

```python
SSProcess.setSelectCondition(conditionName, operateMode, conditionValue)
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)

**方法的底层实现**通过调用 `searchHelper.addCondition()` 将条件添加到内部维护的条件列表中。这些条件在调用 `selectFilter()` 时被实际执行，从而过滤出符合所有条件的地理对象。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)

## 条件名称类型

选择条件的名称（conditionName）决定了查询的目标属性。系统支持三种类型的条件名称：基本属性、几何特性和扩展属性，每种类型有不同的前缀标识规则。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L115)

### 基本属性

以 `SSObj_` 开头的属性称为基本属性，这些是地理对象的内置属性，涵盖对象的标识、外观、几何信息等。基本属性是最常用的查询条件，覆盖了大多数常规筛选需求。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L107)

**常用基本属性列表**：

| 属性名称 | 说明 | 示例值 |
|---------|------|--------|
| `SSObj_ID` | 对象唯一标识 | "1001" |
| `SSObj_Code` | 编码 | "3103013" |
| `SSObj_LayerName` | 层名 | "Default_A" |
| `SSObj_Type` | 对象类型 | "POINT", "LINE", "AREA", "NOTE" |
| `SSObj_Color` | 颜色 | "RGB(255,0,0)", "16777215" |
| `SSObj_Name` | 对象名称 | "建筑物1" |
| `SSObj_Area` | 面积 | "150.5" |
| `SSObj_Length` | 长度 | "230.8" |
| `SSObj_PointCount` | 点数 | "1", "1,2,4" |
| `SSObj_X` / `SSObj_Y` / `SSObj_Z` | 坐标 | "12345.67", "2345.89", "0" |
| `SSObj_CreateTime` | 创建时间 | "2023-07-01 12:00:00" |
| `SSObj_ModifyTime` | 修改时间 | "2023-08-15 09:30:00" |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L60-L103)

**注记对象特有属性**：

| 属性名称 | 说明 |
|---------|------|
| `SSObj_FontWidth` | 字宽 |
| `SSObj_FontHeight` | 字高 |
| `SSObj_FontName` | 字体名 |
| `SSObj_FontClass` | 注记分类号 |
| `SSObj_FontAlignment` | 对齐方式 |
| `SSObj_FontString` | 注记内容 |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L88-L98)

### 几何特性

使用尖括号 `<>` 括住的属性称为几何特性，用于查询对象的拓扑或几何状态特征。这些条件不直接比较属性值，而是判断对象是否满足特定的几何条件。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)

**常用几何特性**：

| 特性名称 | 说明 | 常用操作符 |
|---------|------|----------|
| `<Overlap>` | 重叠 | "==" |
| `<Close>` | 封闭 | "==" |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)

几何特性通常使用 `"=="` 操作符，条件值为 `"True"` 或 `"False"`，用于筛选出具有特定拓扑状态的对象。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)

### 扩展属性

使用方括号 `[]` 括住的属性称为扩展属性，这些是用户自定义的属性字段，存储在对象的扩展属性表中。扩展属性允许根据业务需求灵活定义查询条件，是数据查询的强大工具。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L107-L108)

**扩展属性示例**：

```python
# 查询扩展属性名为"建筑结构"的对象
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")

# 查询扩展属性为"层数"大于10的对象
SSProcess.setSelectCondition("[层数]", ">", "10")

# 多个扩展属性组合查询（支持逗号分隔）
SSProcess.setSelectCondition("[结构],[层数]", "LIKE", "砖混,6")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)

## 操作模式

操作模式（operateMode）定义了条件名称与条件值之间的比较方式。系统支持多种比较操作符，可以满足从精确匹配到模糊查询的各种需求。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L117)

### 基本比较操作符

| 操作符 | 说明 | 适用数据类型 | 示例 |
|-------|------|------------|------|
| `==` | 等于 | 所有类型 | `"SSObj_Code", "==", "A1"` |
| `>` | 大于 | 数值 | `"SSObj_Length", ">", "100"` |
| `<` | 小于 | 数值 | `"SSObj_Area", "<", "50"` |
| `<>` | 不等于 | 所有类型 | `"SSObj_Type", "<>", "NOTE"` |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L114)

### 字符串匹配操作符

| 操作符 | 说明 | 使用场景 |
|-------|------|---------|
| `LIKE` | 模糊匹配 | 部分匹配字符串，支持通配符 |
| `NOT LIKE` | 不匹配 | 排除特定模式的字符串 |
| `CompareNoCase` | 不区分大小写比较 | 忽略大小写的精确匹配 |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116)

**模糊匹配示例**：

```python
# 查询名称包含"建筑"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")

# 查询不包含"临时"的对象
SSProcess.setSelectCondition("SSObj_Name", "NOT LIKE", "临时")

# 不区分大小写匹配编码
SSProcess.setSelectCondition("SSObj_Code", "CompareNoCase", "a1")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116)

### 特殊操作符

| 操作符 | 说明 | 使用场景 |
|-------|------|---------|
| `Dec` | 小数位控制 | 精确指定数值的小数位数 |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117)

`Dec` 操作符用于控制数值比较的小数位数，确保浮点数比较的精确性。例如，`"Dec(2)"` 表示比较时保留两位小数。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117)

## 条件值方式

条件值（conditionValue）支持三种格式：单值、多值和区间。不同的值格式对应不同的查询需求，提供灵活的筛选能力。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L134)

### 单值方式

单值是最常用的条件值格式，直接指定一个具体的值进行比较。适用于精确匹配或数值范围查询。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120)

```python
# 精确匹配编码
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")

# 面积大于100
SSProcess.setSelectCondition("SSObj_Area", ">", "100")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120)

### 多值方式

多值格式使用逗号分隔多个值，用于匹配任意一个值的场景。这种方式相当于多个相等条件的"或"逻辑组合。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)

```python
# 查询编码为A1或A2或A3的对象
SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3")

# 查询多个点类型的对象
SSProcess.setSelectCondition("SSObj_PointCount", "==", "1,2,4")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)

多值方式大大简化了重复查询条件的编写，当需要匹配多个可能值时特别有用。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)

### 区间方式

区间格式使用 `->` 分隔起始值和结束值，表示一个数值范围。适用于连续数值的区间查询。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)

```python
# 查询面积在100到500之间的对象
SSProcess.setSelectCondition("SSObj_Area", "==", "100->500")

# 查询长度大于0小于等于1000的对象
SSProcess.setSelectCondition("SSObj_Length", "==", "0->1000")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)

区间方式是数值范围查询的简洁表达方式，等同于 `">="` 和 `"<="` 两个条件的组合。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)

## 条件设置流程

设置选择条件并执行查询的完整流程包括清除旧条件、设置新条件、执行过滤和遍历结果四个步骤。

```mermaid
flowchart LR
    A[开始查询流程] --> B{是否需要清除旧条件?}
    B -->|是| C[clearSelectCondition]
    B -->|否| D[设置选择条件]
    C --> D
    D --> E{是否需要多个条件?}
    E -->|是| D
    E -->|否| F[selectFilter 执行过滤]
    F --> G[查询完成]
    G --> H[获取选择集数量]
    H --> I[遍历选择集对象]
```

Sources: [PySSProcess.py](PySSProcess.py#L98-L108)

## 基础使用示例

### 示例一：精确匹配查询

查询编码为指定值的对象，这是最常见的查询场景。

```python
# 清除之前的条件
SSProcess.clearSelectCondition()

# 设置查询条件：编码等于3103013
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")

# 执行查询
SSProcess.selectFilter()

# 获取结果数量
count = SSProcess.getSelGeoCount()
print(f"查询到 {count} 个对象")
```

Sources: [PySSProcess.py](PySSProcess.py#L98-L108)

### 示例二：组合条件查询

通过多次调用 `setSelectCondition()` 可以组合多个查询条件，系统将使用"与"逻辑匹配所有条件。

```python
# 清除旧条件
SSProcess.clearSelectCondition()

# 设置组合条件：位于Default_A层且为面积类型且面积大于100
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", ">", "100")

# 执行查询
SSProcess.selectFilter()

# 遍历结果
count = SSProcess.getSelGeoCount()
for i in range(min(5, count)):  # 只显示前5个
    code = SSProcess.getSelGeoValue(i, "SSObj_Code")
    name = SSProcess.getSelGeoValue(i, "SSObj_Name")
    area = SSProcess.getSelGeoValue(i, "SSObj_Area")
    print(f"对象{i}: 编码={code}, 名称={name}, 面积={area}")
```

Sources: [PySSProcess.py](PySSProcess.py#L110-L130)

## 高级使用示例

### 示例三：模糊匹配与扩展属性

结合模糊匹配和扩展属性，实现业务相关的复杂查询。

```python
# 清除旧条件
SSProcess.clearSelectCondition()

# 查询名称包含"建筑"且结构为"砖混"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")

# 执行查询
SSProcess.selectFilter()

# 显示查询结果
count = SSProcess.getSelGeoCount()
print(f"找到 {count} 个符合条件的建筑物")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L128-L134)

### 示例四：几何特性查询

利用几何特性筛选特定拓扑状态的对象。

```python
# 清除旧条件
SSProcess.clearSelectCondition()

# 查询重叠的面对象
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("<Overlap>", "==", "True")

# 执行查询
SSProcess.selectFilter()

# 检查重叠对象
count = SSProcess.getSelGeoCount()
print(f"发现 {count} 个重叠的面对象")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)

### 示例五：区间数值查询

使用区间方式查询数值范围。

```python
# 清除旧条件
SSProcess.clearSelectCondition()

# 查询面积在100到500之间的面对象
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", "==", "100->500")

# 执行查询
SSProcess.selectFilter()

# 统计结果
count = SSProcess.getSelGeoCount()
print(f"面积在100-500范围内的面对象数量: {count}")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)

### 示例六：多值匹配查询

使用多值方式一次性匹配多个可能值。

```python
# 清除旧条件
SSProcess.clearSelectCondition()

# 查询编码为A1、A2或A3中的任意一个
SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3")

# 执行查询
SSProcess.selectFilter()

# 显示结果
count = SSProcess.getSelGeoCount()
print(f"编码为A1/A2/A3的对象数量: {count}")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)

## 条件设置的注意事项

### 条件的累积特性

多次调用 `setSelectCondition()` 会累积条件，新的条件不会覆盖旧条件。如果需要重新开始查询，必须先调用 `clearSelectCondition()` 清除所有旧条件。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49)

```python
# 错误示例：未清除旧条件
SSProcess.setSelectCondition("SSObj_Type", "==", "LINE")
SSProcess.setSelectCondition("SSObj_Code", "==", "A1")
# 此时查询的是类型为LINE且编码为A1的对象，而不是仅编码为A1的对象

# 正确示例：先清除再设置
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Code", "==", "A1")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49)

### 条件与查询的分离

设置条件本身不会触发查询，必须显式调用 `selectFilter()` 方法才会执行过滤操作。这种分离设计允许在执行前组合多个条件。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)

```python
# 设置多个条件
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
SSProcess.setSelectCondition("SSObj_Area", ">", "50")
# 此时选择集仍然是旧的，查询尚未执行

# 执行查询
SSProcess.selectFilter()
# 此时选择集才被更新为查询结果
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)

### 值格式的正确使用

正确使用单值、多值和区间格式，避免语法错误导致查询失败。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126)

| 值格式 | 正确示例 | 错误示例 |
|-------|---------|---------|
| 单值 | `"A1"` | `A1`（缺少引号） |
| 多值 | `"A1,A2,A3"` | `"A1;A2;A3"`（使用错误分隔符） |
| 区间 | `"100->500"` | `"100-500"`（使用错误符号） |

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126)

### 扩展属性的大小写敏感性

扩展属性的名称和值通常区分大小写，需要确保使用与数据库中完全一致的大小写格式。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)

```python
# 如果扩展属性名称为"建筑结构"，不能使用"[建筑结构]"以外的格式
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")  # 正确
SSProcess.setSelectCondition("[建筑结构]", "CompareNoCase", "砖混")  # 不区分大小写匹配值
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)

## 典型应用场景

### 场景一：按图层批量处理

对特定图层中的所有对象执行批量操作。

```python
# 清除选择集和条件
SSProcess.clearSelection()
SSProcess.clearSelectCondition()

# 设置条件：选中Default_A层的所有对象
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")

# 执行查询
SSProcess.selectFilter()

# 批量修改属性
count = SSProcess.getSelGeoCount()
for i in range(count):
    SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215")
    SSProcess.setSelGeoValue(i, "SSObj_DataMark", "1")
```

Sources: [PySSProcess.py](PySSProcess.py#L130-L150)

### 场景二：数据质量检查

查询可能存在问题的对象，如面积过小或长度异常。

```python
# 清除条件
SSProcess.clearSelectCondition()

# 查询面积小于5的面对象（可能为错误数据）
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", "<", "5")

# 执行查询
SSProcess.selectFilter()

# 输出问题对象
count = SSProcess.getSelGeoCount()
print(f"发现 {count} 个面积过小的对象")
for i in range(count):
    code = SSProcess.getSelGeoValue(i, "SSObj_Code")
    area = SSProcess.getSelGeoValue(i, "SSObj_Area")
    print(f"  编码 {code}, 面积 {area}")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L107)

### 场景三：按时间范围查询

查询特定时间段内创建或修改的对象。

```python
# 清除条件
SSProcess.clearSelectCondition()

# 查询2023年7月创建的对象
SSProcess.setSelectCondition("SSObj_CreateTime", ">=", "2023-07-01 00:00:00")
SSProcess.setSelectCondition("SSObj_CreateTime", "<", "2023-08-01 00:00:00")

# 执行查询
SSProcess.selectFilter()

# 统计结果
count = SSProcess.getSelGeoCount()
print(f"2023年7月创建的对象数量: {count}")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L94-L96)

### 场景四：按类型批量查询

分别查询不同类型的对象并分别处理。

```python
# 查询线对象
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "LINE")
SSProcess.selectFilter()
line_count = SSProcess.getSelGeoCount()
print(f"线对象: {line_count}")

# 查询面对象
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.selectFilter()
area_count = SSProcess.getSelGeoCount()
print(f"面对象: {area_count}")
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L64-L66)

## 条件设置的性能考虑

### 多条件的查询效率

设置多个条件时，查询引擎会按照"与"逻辑执行，即对象必须同时满足所有条件才会被选中。合理设置条件的顺序可以提高查询效率，建议将选择性强的条件（如唯一编码）放在前面。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)

```python
# 优化前：选择性弱的条件在前
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")  # 该层可能包含大量对象
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")        # 编码唯一，选择性极强

# 优化后：选择性强的条件在前
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")        # 快速定位唯一对象
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")  # 进一步验证
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)

### 避免过度复杂的条件

过于复杂的条件组合可能导致查询性能下降，建议将复杂查询拆分为多个简单查询。

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)

```python
# 复杂查询：多个模糊匹配组合
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "住宅")
SSProcess.setSelectCondition("[结构]", "==", "砖混")
SSProcess.setSelectCondition("SSObj_Area", ">", "50")
SSProcess.setSelectCondition("SSObj_Area", "<", "500")
# 这样的查询可能较慢

# 拆分为两步：先按结构筛选，再进一步过滤
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("[结构]", "==", "砖混")
SSProcess.selectFilter()
# 对选择集结果再进行进一步处理...
```

Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)

## 下一步学习

掌握设置选择条件后，建议继续学习以下相关内容：

- **执行过滤查询**：了解如何调用 `selectFilter()` 方法执行查询，并查看更多查询示例，详见[执行过滤查询](13-zhi-xing-guo-lv-cha-xun)

- **遍历选择集对象**：学习如何高效遍历和访问选择集中的对象属性，详见[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang)

- **获取地物属性值**：深入了解各种基本属性和扩展属性的获取方法，详见[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi)

通过这些相关章节的学习，可以完整掌握选择集查询和处理的全套流程。