显示检查结果是数据质量验证流程的最后一步，通过可视化界面呈现检查记录中记录的所有问题，帮助用户快速定位、分析和修复数据缺陷。通过 `ShowCheckOutput()` 方法，系统将内存中的检查记录转换为直观的检查结果窗口，提供交互式的问题浏览和定位功能。

Sources: [PySSCheck.py](PySSCheck.py#L120-L120)

## 核心功能概述

`ShowCheckOutput()` 是 CheckFunForPY 类提供的关键方法，用于在系统界面中弹出一个独立的检查结果查看窗口。该窗口以表格或列表形式展示所有检查记录，支持按检查组、检查项进行分类展示，并提供空间定位功能，点击某条记录即可自动缩放地图到问题发生的位置。

该方法的设计遵循**最小调用原则**，无需任何参数即可完成完整的显示操作，系统会自动读取当前 CheckFunForPY 实例中的所有检查记录并渲染到界面。这种设计降低了使用门槛，使得在检查完成后只需一行代码即可呈现结果。

```mermaid
graph TB
    subgraph "检查脚本执行流程"
        A[创建 CheckFunForPY 实例] --> B[执行数据检查逻辑]
        B --> C[调用 AddCheckRecord 记录问题]
        C --> D[检查完成]
    end
    
    subgraph "结果显示阶段"
        D --> E[调用 ShowCheckOutput]
        E --> F[读取内存中的检查记录集合]
        F --> G[生成检查结果窗口]
        G --> H[用户交互浏览问题]
        H --> I[点击定位到地图]
    end
    
    style E fill:#e1f5ff
    style G fill:#fff4e1
    style I fill:#d4edda
```

Sources: [PySSCheck.py](PySSCheck.py#L120-L120)

## 基础使用方法

### 方法签名

`ShowCheckOutput()` 方法的签名非常简洁：

```python
def ShowCheckOutput(self):
```

- **返回值**: 无明确文档说明返回值类型，从调用方代码推断为布尔值或无返回
- **参数**: 无需任何参数
- **异常**: 调用失败时可能抛出异常，建议在 try-except 结构中调用

### 最简示例

以下是使用 ShowCheckOutput 的最简示例，展示了典型的检查-记录-显示流程：

```python
from sunvpy.PySSCheck import CheckFunForPY

# 创建检查记录管理实例
check_fun = CheckFunForPY()

# ... 执行检查逻辑，调用 AddCheckRecord 添加问题记录 ...
check_fun.AddCheckRecord(
    group="拓扑检查",
    check="重叠检查",
    checkmodel=1,
    description="建筑物A与建筑物B存在重叠",
    x=123456.78, y=345678.90, z=0.0,
    objtype=3,
    geoids="1001,1002",
    noteids=""
)

# 显示检查结果
check_fun.ShowCheckOutput()
```

执行上述代码后，系统会弹出一个检查结果窗口，显示所有已添加的检查记录。

Sources: [PySSCheck.py](PySSCheck.py#L113-L120)

## 检查结果窗口界面

### 窗口结构

检查结果窗口通常包含以下主要区域：

| 区域 | 功能 | 说明 |
|------|------|------|
| **记录列表区** | 显示所有检查记录的摘要信息 | 包括组名、检查项、描述、位置等 |
| **详情面板** | 显示当前选中记录的完整信息 | 展示所有字段的详细值 |
| **工具栏** | 提供常用操作按钮 | 定位、刷新、导出等功能 |
| **统计信息** | 显示问题统计概览 | 按组分类统计问题数量 |

### 记录显示内容

每条检查记录在窗口中显示以下核心信息：

- **检查组**: 用于逻辑分组，如"拓扑检查"、"属性检查"
- **检查项**: 标识具体检查类型，如"重叠检查"、"名称缺失"
- **问题描述**: 简要描述发现的问题
- **位置坐标**: 问题发生的 X、Y、Z 坐标
- **关联对象**: 涉及的地物 ID 和注记 ID 列表

### 交互功能

检查结果窗口支持多种交互操作，提升问题处理的效率：

```mermaid
flowchart LR
    A[检查结果窗口] --> B[点击记录]
    B --> C[显示详情]
    C --> D{需要定位?}
    D -->|是| E[地图自动缩放至问题位置]
    D -->|否| F[继续浏览其他记录]
    E --> F
    
    F --> G{需要修复?}
    G -->|是| H[切换到地图编辑视图]
    H --> I[修改问题对象]
    I --> J[返回检查窗口]
    J --> F
    
    G -->|否| F
    
    F --> K{所有问题处理完毕?}
    K -->|否| F
    K -->|是| L[关闭窗口]
    
    style B fill:#e1f5ff
    style E fill:#fff4e1
    style I fill:#d4edda
```

Sources: [PySSCheck.py](PySSCheck.py#L120-L120)

## 完整工作流程示例

以下是一个完整的检查流程示例，从准备检查到显示结果的全部步骤：

```python
from sunvpy import SSProcess
from sunvpy.PySSCheck import CheckFunForPY

def run_topology_check():
    """执行拓扑检查并显示结果"""
    
    # 步骤1: 初始化检查记录管理器
    check_fun = CheckFunForPY()
    check_fun.ClearCheckRecord()  # 清空之前的记录
    
    print("开始拓扑检查...")
    
    # 步骤2: 设置选择条件
    SSProcess.clearSelection()
    SSProcess.clearSelectCondition()
    SSProcess.setSelectCondition("SSObj_Type", "==", "3")  # 面对象
    SSProcess.selectFilter()
    
    # 步骤3: 遍历选择集并检查
    count = SSProcess.getSelGeoCount()
    issue_count = 0
    
    for i in range(count):
        geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID")
        obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type"))
        
        # 获取对象位置（使用第一个点坐标）
        x = float(SSProcess.getSelGeoValue(i, "SSObj_X"))
        y = float(SSProcess.getSelGeoValue(i, "SSObj_Y"))
        z = 0.0
        
        # 模拟检查逻辑：每10个对象记录一个重叠问题
        if i % 10 == 0:
            check_fun.AddCheckRecord(
                group="拓扑检查",
                check="重叠检查",
                checkmodel=1,
                description=f"面对象 {geo_id} 存在空间重叠",
                x=x, y=y, z=z,
                objtype=obj_type,
                geoids=str(geo_id),
                noteids=""
            )
            issue_count += 1
    
    # 步骤4: 输出统计信息
    total_count = check_fun.GetCheckRecordCount()
    print(f"检查完成，共发现 {total_count} 个拓扑问题")
    
    # 步骤5: 显示检查结果
    if total_count > 0:
        print("正在打开检查结果窗口...")
        check_fun.ShowCheckOutput()
    else:
        print("未发现问题，无需显示结果")
    
    return total_count

# 执行检查
if __name__ == "__main__":
    result_count = run_topology_check()
```

该示例展示了**分阶段检查**的工作流程：初始化、查询、遍历、记录、统计、显示。通过在每个阶段输出日志，便于追踪检查进度和结果。

Sources: [PySSCheck.py](PySSCheck.py#L113-L125)

## 多类型检查结果展示

在实际项目中，常常需要同时执行多种类型的检查，并在一个窗口中统一展示。ShowCheckOutput 方法支持混合显示不同组和检查项的记录。

### 混合检查示例

```python
from sunvpy.PySSCheck import CheckFunForPY
from sunvpy import SSProcess

def run_comprehensive_check():
    """执行综合检查：拓扑+属性"""
    
    check_fun = CheckFunForPY()
    check_fun.ClearCheckRecord()
    
    # ===== 检查1: 拓扑重叠 =====
    SSProcess.clearSelection()
    SSProcess.clearSelectCondition()
    SSProcess.setSelectCondition("SSObj_Type", "==", "3")
    SSProcess.selectFilter()
    
    count = SSProcess.getSelGeoCount()
    for i in range(count):
        geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID")
        x = float(SSProcess.getSelGeoValue(i, "SSObj_X"))
        y = float(SSProcess.getSelGeoValue(i, "SSObj_Y"))
        obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type"))
        
        if i % 10 == 0:  # 模拟重叠检测
            check_fun.AddCheckRecord(
                group="拓扑检查",
                check="重叠检查",
                checkmodel=1,
                description=f"对象 {geo_id} 重叠",
                x=x, y=y, z=0.0,
                objtype=obj_type,
                geoids=str(geo_id),
                noteids=""
            )
    
    # ===== 检查2: 属性完整性 =====
    SSProcess.clearSelection()
    SSProcess.clearSelectCondition()
    SSProcess.setSelectCondition("SSObj_Name", "==", "")
    SSProcess.selectFilter()
    
    count = SSProcess.getSelGeoCount()
    for i in range(min(20, count)):  # 限制数量
        geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID")
        x = float(SSProcess.getSelGeoValue(i, "SSObj_X"))
        y = float(SSProcess.getSelGeoValue(i, "SSObj_Y"))
        obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type"))
        
        check_fun.AddCheckRecord(
            group="属性检查",
            check="名称缺失",
            checkmodel=2,
            description=f"对象 {geo_id} 缺少名称属性",
            x=x, y=y, z=0.0,
            objtype=obj_type,
            geoids=str(geo_id),
            noteids=""
        )
    
    # 统计各类问题数量
    total_count = check_fun.GetCheckRecordCount()
    print(f"\n检查完成，总计 {total_count} 个问题:")
    
    # 按组统计
    groups = {}
    for i in range(total_count):
        fields = "group"
        values = ""
        check_fun.GetCheckRecordValue(i, fields, values)
        
        if values:
            group_name = values.strip()
            groups[group_name] = groups.get(group_name, 0) + 1
    
    for group, count in groups.items():
        print(f"  {group}: {count} 个")
    
    # 显示结果
    if total_count > 0:
        check_fun.ShowCheckOutput()
    
    return total_count

# 执行综合检查
run_comprehensive_check()
```

在检查结果窗口中，不同组的记录通常会以分组形式展示，方便用户按问题类型进行分类浏览和定位。

Sources: [PySSCheck.py](PySSCheck.py#L113-L125)

## 显示前的准备工作

在调用 ShowCheckOutput 之前，建议进行以下准备工作，确保显示结果的完整性和准确性。

### 记录数量检查

在显示前检查记录数量，避免显示空窗口：

```python
# 获取记录数量
count = check_fun.GetCheckRecordCount()

if count == 0:
    print("未发现问题，无需显示检查结果")
else:
    print(f"发现 {count} 个问题，正在打开检查结果窗口...")
    check_fun.ShowCheckOutput()
```

### 记录有效性验证

确保所有记录的字段数据完整，避免显示异常：

```python
def validate_records(check_fun):
    """验证检查记录的完整性"""
    count = check_fun.GetCheckRecordCount()
    valid_count = 0
    invalid_count = 0
    
    for i in range(count):
        fields = "group,check,description,x,y,geoids"
        values = ""
        
        check_fun.GetCheckRecordValue(i, fields, values)
        
        # 简单验证：values 不应为空
        if values and "," in values:
            valid_count += 1
        else:
            invalid_count += 1
            print(f"警告：记录 {i} 数据不完整: {values}")
    
    print(f"验证完成：有效记录 {valid_count} 条，无效记录 {invalid_count} 条")
    return invalid_count == 0

# 使用验证
if validate_records(check_fun):
    check_fun.ShowCheckOutput()
else:
    print("存在无效记录，建议检查数据后再显示")
```

### 保存后显示

通常建议先保存检查记录，再显示结果，确保数据不会因系统异常而丢失：

```python
# 完整流程：保存 → 统计 → 显示
print("正在保存检查记录...")
check_fun.SaveCheckRecord()

count = check_fun.GetCheckRecordCount()
print(f"已保存 {count} 条检查记录")

if count > 0:
    check_fun.ShowCheckOutput()
```

Sources: [PySSCheck.py](PySSCheck.py#L108-L125)

## 高级应用场景

### 批量检查后的结果展示

在自动化批量检查场景中，可能需要积累多次检查的结果后统一显示：

```python
from sunvpy.PySSCheck import CheckFunForPY

def batch_check_and_show(layers):
    """批量检查多个图层并统一显示结果"""
    
    check_fun = CheckFunForPY()
    check_fun.ClearCheckRecord()
    
    total_issues = 0
    
    for layer_name in layers:
        print(f"\n检查图层: {layer_name}")
        
        # 执行针对该图层的检查逻辑
        # ... 检查代码 ...
        
        # 模拟：添加一些检查记录
        check_fun.AddCheckRecord(
            group="拓扑检查",
            check="图层检查",
            checkmodel=1,
            description=f"图层 {layer_name} 中的问题",
            x=0.0, y=0.0, z=0.0,
            objtype=3,
            geoids="1001",
            noteids=""
        )
        total_issues += 1
    
    print(f"\n批量检查完成，共发现 {total_issues} 个问题")
    
    # 统一显示所有结果
    check_fun.ShowCheckOutput()

# 批量检查多个图层
layers_to_check = ["建筑", "道路", "水系"]
batch_check_and_show(layers_to_check)
```

### 历史对比显示

在质量追踪场景中，可以加载历史记录并与当前结果对比：

```python
from sunvpy.PySSCheck import CheckFunForPY

def compare_and_show_results():
    """对比历史记录并显示当前结果"""
    
    check_fun = CheckFunForPY()
    
    # 1. 加载历史记录
    check_fun.LoadCheckRecord()
    old_count = check_fun.GetCheckRecordCount()
    print(f"历史记录: {old_count} 个问题")
    
    # 2. 执行新的检查
    check_fun.ClearCheckRecord()
    # ... 新的检查逻辑 ...
    
    # 模拟：添加新记录
    check_fun.AddCheckRecord(
        group="拓扑检查",
        check="重叠检查",
        checkmodel=1,
        description="新的重叠问题",
        x=0.0, y=0.0, z=0.0,
        objtype=3,
        geoids="1001",
        noteids=""
    )
    
    new_count = check_fun.GetCheckRecordCount()
    print(f"当前检查: {new_count} 个问题")
    print(f"质量改进: {old_count - new_count} 个问题已修复")
    
    # 3. 显示当前结果
    check_fun.ShowCheckOutput()

compare_and_show_results()
```

Sources: [PySSCheck.py](PySSCheck.py#L108-L120)

## 常见问题与解决方案

### 窗口无法显示

如果调用 ShowCheckOutput 后没有弹出窗口，可能的原因和解决方法：

| 原因 | 解决方法 |
|------|----------|
| 检查记录为空 | 检查 `GetCheckRecordCount()` 返回值，确保有记录 |
| 系统界面未初始化 | 确保在 SunvStation 主界面中调用，而非后台脚本 |
| 窗口已打开 | 检查是否已有检查结果窗口处于打开状态 |

```python
# 安全显示方案
def safe_show_output(check_fun):
    try:
        count = check_fun.GetCheckRecordCount()
        if count > 0:
            print(f"显示 {count} 条检查记录...")
            check_fun.ShowCheckOutput()
        else:
            print("无检查记录可显示")
    except Exception as e:
        print(f"显示检查结果失败: {e}")

safe_show_output(check_fun)
```

### 大量记录显示缓慢

当检查记录数量超过 1000 条时，显示窗口可能加载较慢。建议：

1. **分批显示**：只显示前 100 条，其他通过导出文件查看
2. **优化描述**：简化 description 字段的内容
3. **使用保存替代**：对于大量记录，使用 `SaveCheckRecord()` 保存到文件，而非显示窗口

```python
# 大量记录的处理策略
def handle_large_results(check_fun, max_display=100):
    count = check_fun.GetCheckRecordCount()
    
    if count > max_display:
        print(f"记录数量过多 ({count} 条)，将保存到文件")
        check_fun.SaveCheckRecord()
        
        # 只显示前 max_display 条的摘要
        print(f"\n前 {max_display} 条记录摘要:")
        for i in range(min(max_display, count)):
            fields = "group,check,description"
            values = ""
            check_fun.GetCheckRecordValue(i, fields, values)
            print(f"  {values}")
    else:
        check_fun.ShowCheckOutput()

handle_large_results(check_fun, max_display=100)
```

### 空间定位不准确

如果点击记录后地图未正确缩放到问题位置，检查以下几点：

1. **坐标值是否正确**：确保 AddCheckRecord 时传入的 x、y、z 坐标有效
2. **坐标系统一致性**：检查对象坐标与地图坐标系统是否一致
3. **对象是否可见**：确认问题对象的图层处于可见状态

```python
# 确保坐标信息准确
def get_valid_coordinates(process, geo_index):
    """获取有效的坐标信息"""
    try:
        x = float(process.getSelGeoValue(geo_index, "SSObj_X"))
        y = float(process.getSelGeoValue(geo_index, "SSObj_Y"))
        z = float(process.getSelGeoValue(geo_index, "SSObj_Z"))
        
        # 验证坐标有效性
        if abs(x) > 1e10 or abs(y) > 1e10:
            print(f"警告：坐标值异常 ({x}, {y})，使用默认值")
            return 0.0, 0.0, 0.0
        
        return x, y, z
    except Exception as e:
        print(f"获取坐标失败: {e}")
        return 0.0, 0.0, 0.0

# 使用示例
x, y, z = get_valid_coordinates(SSProcess, i)
check_fun.AddCheckRecord(..., x=x, y=y, z=z, ...)
```

Sources: [PySSCheck.py](PySSCheck.py#L113-L125)

## 最佳实践总结

### 显示时机建议

```mermaid
flowchart LR
    A[检查流程开始] --> B[执行检查逻辑]
    B --> C[调用 AddCheckRecord 记录问题]
    C --> D{检查完成?}
    D -->|否| B
    D -->|是| E[调用 GetCheckRecordCount 统计]
    E --> F{数量 > 0?}
    F -->|否| G[输出无问题提示]
    F -->|是| H[调用 SaveCheckRecord 保存]
    H --> I[调用 ShowCheckOutput 显示]
    I --> J[用户交互处理问题]
    
    style E fill:#e1f5ff
    style H fill:#fff4e1
    style I fill:#d4edda
```

推荐的标准流程：**检查 → 统计 → 保存 → 显示**

1. 检查完成后统计记录数量
2. 如有记录，先保存确保数据安全
3. 最后显示结果窗口供用户交互

### 代码模板

以下是一个推荐的代码模板，适用于大多数检查场景：

```python
from sunvpy import SSProcess
from sunvpy.PySSCheck import CheckFunForPY

def standard_check_workflow(check_name, check_logic_func):
    """标准的检查工作流程模板"""
    
    # 1. 初始化
    check_fun = CheckFunForPY()
    check_fun.ClearCheckRecord()
    
    print(f"开始执行: {check_name}")
    
    # 2. 执行检查逻辑
    try:
        check_logic_func(check_fun)
    except Exception as e:
        print(f"检查执行失败: {e}")
        return -1
    
    # 3. 统计结果
    count = check_fun.GetCheckRecordCount()
    print(f"{check_name} 完成，发现 {count} 个问题")
    
    # 4. 处理结果
    if count > 0:
        # 保存记录
        print("正在保存检查记录...")
        try:
            check_fun.SaveCheckRecord()
            print("保存成功")
        except Exception as e:
            print(f"保存失败: {e}")
        
        # 显示结果
        print("正在打开检查结果窗口...")
        try:
            check_fun.ShowCheckOutput()
        except Exception as e:
            print(f"显示失败: {e}")
    else:
        print("未发现问题，数据质量良好")
    
    return count

# 使用示例
def my_check_logic(check_fun):
    """自定义检查逻辑"""
    SSProcess.clearSelection()
    SSProcess.clearSelectCondition()
    SSProcess.setSelectCondition("SSObj_Type", "==", "3")
    SSProcess.selectFilter()
    
    count = SSProcess.getSelGeoCount()
    for i in range(count):
        geo_id = SSProcess.getSelGeoValue(i, "SSObj_ID")
        x = float(SSProcess.getSelGeoValue(i, "SSObj_X"))
        y = float(SSProcess.getSelGeoValue(i, "SSObj_Y"))
        obj_type = int(SSProcess.getSelGeoValue(i, "SSObj_Type"))
        
        # ... 实际检查逻辑 ...
        
        # 示例：记录问题
        check_fun.AddCheckRecord(
            group="示例检查",
            check="示例项",
            checkmodel=1,
            description=f"示例问题 {geo_id}",
            x=x, y=y, z=0.0,
            objtype=obj_type,
            geoids=str(geo_id),
            noteids=""
        )

# 执行检查
standard_check_workflow("示例拓扑检查", my_check_logic)
```

该模板封装了完整的检查流程，包括错误处理和日志输出，可作为各种检查脚本的基础框架。

Sources: [PySSCheck.py](PySSCheck.py#L108-L125)

## 学习路径建议

掌握显示检查结果功能后，建议按照以下路径继续深入学习：

1. **[添加与加载检查记录](31-tian-jia-yu-jia-zai-jian-cha-ji-lu)** - 深入了解检查记录的添加、加载和持久化机制，掌握记录的生命周期管理
2. **[自定义检查规则](33-zi-ding-yi-jian-cha-gui-ze)** - 学习如何构建复杂的数据检查逻辑，自定义检查规则以适应特定的业务需求
3. **[清除与初始化选择集](11-qing-chu-yu-chu-shi-hua-xuan-ze-ji)** - 了解如何高效地设置和操作选择集，为数据检查提供准确的数据范围

通过系统学习这些内容，您将能够构建完整的数据质量控制和问题追踪系统，实现从检查发现、问题定位到修复验证的闭环管理。