Files
sunvpy-docs/docs/content/41-objbaseattr-shu-xing-suo-yin.md
2026-04-10 13:47:53 +08:00

398 lines
16 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.
ObjBaseAttr 类是 SunvStation 系统中地物对象属性管理的核心组件,提供统一的属性名称注册、索引映射和属性值读写接口。该类通过集中管理所有地物属性的名称与索引映射关系,实现了属性访问的标准化和高效化,支持点、线、面、注记等多种地物类型的属性操作。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L6-L110)
## 属性分类体系
ObjBaseAttr 将地物属性划分为五大类别,每类属性对应不同的功能维度和数据类型。这种分类设计既体现了属性的业务语义,也便于开发者快速定位所需属性。
### 属性分类概览
```mermaid
graph TB
A[ObjBaseAttr 属性体系] --> B[点属性]
A --> C[地物通用属性]
A --> D[几何参量属性]
A --> E[注记属性]
A --> F[操作属性]
B --> B1[SSObj_PointName<br/>坐标点名称]
B --> B2[SSObj_PointCount<br/>坐标点数量]
B --> B3[SSObj_PointType<br/>坐标点类型]
B --> B4[SSObj_X/Y/Z<br/>坐标值]
C --> C1[标识属性<br/>ID, Code, Name]
C --> C2[图形属性<br/>Color, LineType, LineWidth]
C --> C3[变换属性<br/>Angle, ScaleX, ScaleY]
C --> C4[时间属性<br/>CreateTime, ModifyTime]
D --> D1[面积属性<br/>Area, EllipsoidArea]
D --> D2[长度属性<br/>Length, 3DLength]
D --> D3[边界属性<br/>minX, minY, maxX, maxY]
E --> E1[字体属性<br/>FontWidth, FontHeight, FontName]
E --> E2[文本属性<br/>FontString, FontStringCount]
E --> E3[样式属性<br/>Alignment, FontWeight, ItalicAngle]
F --> F1[SSObj_Reverse<br/>方向反转]
F --> F2[SSObj_Reference<br/>引用关系]
```
### 点属性索引
点属性用于描述地物对象的坐标点信息,是构成线、面等复杂几何形状的基础元素。此类属性支持通过参数索引访问特定位置的坐标点。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L38-L44)
| 属性常量 | 属性名 | 数据类型 | 说明 | 参数支持 |
|---------|--------|---------|------|---------|
| `pointName` | SSObj_PointName | string | 坐标点名称 | (n) - 第n个点 |
| `pointCount` | SSObj_PointCount | int | 坐标点数量 | 无 |
| `pointType` | SSObj_PointType | int | 坐标点类型 | (n) - 第n个点 |
| `x` | SSObj_X | double | X坐标值 | (n) - 第n个点 |
| `y` | SSObj_Y | double | Y坐标值 | (n) - 第n个点 |
| `z` | SSObj_Z | double | Z坐标值 | (n) - 第n个点 |
**参数说明**括号内的数字表示坐标点索引从0开始。例如 `SSObj_X(0)` 获取第一个点的X坐标。
### 地物通用属性索引
通用属性适用于所有地物类型,涵盖了对象标识、图形表现、变换参数和元数据等核心信息。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L46-L70)
| 属性常量 | 属性名 | 数据类型 | 说明 | 可读写 |
|---------|--------|---------|------|-------|
| **标识属性** |||||
| `id` | SSObj_ID | int | 对象唯一标识 | 只读 |
| `groupID` | SSObj_GroupID | int | 分组标识 | 可写 |
| `code` | SSObj_Code | int | 地物编码 | 只读 |
| `byname` | SSObj_Byname | string | 地物别名 | 可写 |
| `name` | SSObj_Name | string | 地物名称 | 可写 |
| `type` | SSObj_Type | string | 对象类型POINT/LINE/AREA/NOTE | 只读 |
| **图形属性** |||||
| `color` | SSObj_Color | int | 颜色值支持RGB/COLORNO格式 | 可写 |
| `lineType` | SSObj_LineType | int | 线型 | 可写 |
| `lineWidth` | SSObj_LineWidth | int | 线宽 | 可写 |
| `layerName` | SSObj_LayerName | string | 图层名称 | 只读 |
| **变换属性** |||||
| `angle` | SSObj_Angle | double | 旋转角度(度) | 可写 |
| `scaleX` | SSObj_ScaleX | double | X方向缩放比例 | 可写 |
| `scaleY` | SSObj_ScaleY | double | Y方向缩放比例 | 可写 |
| `scaleXY` | SSObj_ScaleXY | double | 统一缩放比例 | 可写 |
| **元数据属性** |||||
| `status` | SSObj_Status | int | 对象状态 | 可写 |
| `dataMark` | SSObj_DataMark | string | 数据标记 | 可写 |
| `relationID` | SSObj_RelationID | string | 关联标识 | 可写 |
| `createTime` | SSObj_CreateTime | string | 创建时间YYYY-MM-DD HH:MM:SS | 可写 |
| `modifyTime` | SSObj_ModifyTime | string | 修改时间YYYY-MM-DD HH:MM:SS | 可写 |
| **扩展属性** |||||
| `hatchStyle` | SSObj_HatchStyle | int | 填充样式 | 可写 |
| `hatchDensityScale` | SSObj_HatchDensityScale | double | 填充密度比例 | 可写 |
| `lShapeOffset` | SSObj_LShapeOffset | int | L型偏移 | 可写 |
| `memoData` | SSObj_MemoData | string | 备注数据 | 可写 |
### 几何参量属性索引
几何参量属性提供对地物对象空间特征的定量描述,包括面积、长度、边界范围等计算结果。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L72-L85)
| 属性常量 | 属性名 | 数据类型 | 说明 | 精度 |
|---------|--------|---------|------|------|
| **面积属性** |||||
| `area` | SSObj_Area | double | 对象面积 | 6位小数 |
| `ellipsoidArea1` | SSObj_EllipsoidArea1 | double | 椭球面积1 | - |
| `ellipsoidArea2` | SSObj_EllipsoidArea2 | double | 椭球面积2 | - |
| **长度属性** |||||
| `length` | SSObj_Length | double | 对象周长/长度 | 6位小数 |
| `length3D` | SSObj_3DLength | double | 三维长度 | 6位小数 |
| **边界属性** |||||
| `minX` | SSObj_minX | double | 最小X坐标 | 6位小数 |
| `minY` | SSObj_minY | double | 最小Y坐标 | 6位小数 |
| `maxX` | SSObj_maxX | double | 最大X坐标 | 6位小数 |
| `maxY` | SSObj_maxY | double | 最大Y坐标 | 6位小数 |
| **标签属性** |||||
| `drawAreaLabelStatus` | SSObj_DrawAreaLabelStatus | string | 区域标签状态 | - |
| `areaLabelX` | SSObj_AreaLabelX | double | 标签X坐标 | - |
| `areaLabelY` | SSObj_AreaLabelY | double | 标签Y坐标 | - |
### 注记属性索引
注记属性专用于注记对象e_Note_Obj控制字体、文本内容、对齐方式、角度等显示效果。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L87-L105)
| 属性常量 | 属性名 | 数据类型 | 说明 | 可读写 |
|---------|--------|---------|------|-------|
| **字体属性** |||||
| `fontName` | SSObj_FontName | string | 字体名称 | 可写 |
| `fontWidth` | SSObj_FontWidth | double | 字体宽度 | 可写 |
| `fontHeight` | SSObj_FontHeight | double | 字体高度 | 可写 |
| `fontClass` | SSObj_FontClass | string | 注记分类 | 可写 |
| **文本属性** |||||
| `fontString` | SSObj_FontString | string | 注记文本内容 | 可写 |
| `fontStringCount` | SSObj_FontStringCount | int | 字符串长度 | 只读 |
| `fontRealHeight` | SSObj_FontRealHeight | double | 实际显示高度 | 只读 |
| `fontRealLength` | SSObj_FontRealLength | double | 实际显示长度 | 只读 |
| **对齐与定位** |||||
| `fontAlignment` | SSObj_FontAlignment | int | 对齐方式 | 可写 |
| `fontPosType` | SSObj_FontPosType | int | 定位类型 | 可写 |
| `fontDirection` | SSObj_FontDirection | int | 文字方向 | 可写 |
| **角度属性** |||||
| `fontWordAngle` | SSObj_FontWordAngle | double | 单词旋转角度 | 可写 |
| `fontStringAngle` | SSObj_FontStringAngle | double | 字符串旋转角度 | 可写 |
| `fontItalicAngle` | SSObj_FontItalicAngle | double | 斜体角度 | 可写 |
| `fontDownAngle` | SSObj_FontDownAngle | double | 下划线角度 | 可写 |
| **样式属性** |||||
| `fontWeight` | SSObj_FontWeight | int | 字体粗细 | 可写 |
| `fontUnderLine` | SSObj_FontUnderLine | int | 下划线标志 | 可写 |
| `fontInterval` | SSObj_FontInterval | double | 字符间距 | 可写 |
### 操作属性索引
操作属性用于触发特定的地物处理操作,而非存储常规属性值。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L107-L109)
| 属性常量 | 属性名 | 操作类型 | 说明 |
|---------|--------|---------|------|
| `reverse` | SSObj_Reverse | 方向反转 | 值为1时执行反转操作 |
| `reference` | SSObj_Reference | 引用关系 | 当前未实现 |
## 核心方法参考
### 属性索引管理
ObjBaseAttr 提供三个核心方法用于属性名称与索引的双向映射:
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L111-L178)
| 方法名 | 功能 | 参数 | 返回值 |
|--------|------|------|-------|
| `registerObjBaseAttrName(name)` | 注册新属性名到索引表 | name: 属性名自动去除SSObj_前缀 | 属性索引 |
| `get_value_index(field)` | 获取属性名的索引 | field: 属性名支持SSObj_前缀 | 索引值,未找到返回-1 |
| `get_value_index_param(field)` | 解析带参数的属性名 | field: 格式为'属性名(参数)' | (索引, 参数字符串) |
**命名规范**:属性名在内部存储时自动转换为小写并去除 `SSObj_` 前缀,外部访问时两种形式均可识别。
### 属性值读写
#### getGeoValue 方法
获取单个地物对象的属性值,支持动态参数解析和多类型对象处理。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L188-L360)
```python
def getGeoValue(map: ScaleMap, geo: GeoBase, field: str) -> str
```
**处理流程**
```mermaid
flowchart TD
A[调用 getGeoValue] --> B[解析属性名和参数]
B --> C{属性索引是否存在?}
C -->|否| D[返回空字符串]
C -->|是| E{对象类型?}
E -->|注记对象| F[处理注记专用属性]
E -->|通用对象| G[处理公共基本属性]
F --> H{有值返回?}
G --> H
H -->|是| I[返回属性值]
H -->|否| J[处理坐标点属性]
J --> K{有值返回?}
K -->|是| I
K -->|否| L[处理几何量属性]
L --> I
```
**参数支持示例**
- `SSObj_X(0)` → 获取第一个点的X坐标
- `SSObj_PointName(2)` → 获取第三个点的名称
- `SSObj_Area` → 获取对象面积
#### setGeoValue 方法
批量设置多个地物对象的属性值,支持扩展属性和基本属性的统一处理接口。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L362-L624)
```python
def setGeoValue(map: ScaleMap, geoList: GeoBaseList, field: str, value: str)
```
**扩展属性处理**:当属性名以 `[` 开头时,系统将其识别为扩展属性,存储在 MemoData 中。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L364-L394)
**颜色值格式支持**
- 颜色号格式:`COLORNO(1)`
- RGB格式`RGB(255,123,224)`
- 数值格式:`16777215`24位颜色值
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L408-L411)
## 属性索引值映射表
为便于直接使用,下表列出了所有属性的实际索引值(基于初始化顺序):
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L13-L36)
| 索引 | 属性名(无前缀) | 属性常量 |
|-----|----------------|---------|
| 0 | angle | `self.angle` |
| 1 | area | `self.area` |
| 2 | arealabelx | `self.areaLabelX` |
| 3 | arealabely | `self.areaLabelY` |
| 4 | byname | `self.byname` |
| 5 | code | `self.code` |
| 6 | color | `self.color` |
| 7 | createdata | `self.createTime` |
| 8 | datamark | `self.dataMark` |
| 9 | drawarealabelstatus | `self.drawAreaLabelStatus` |
| 10 | ellipsoidarea1 | `self.ellipsoidArea1` |
| 11 | ellipsoidarea2 | `self.ellipsoidArea2` |
| 12 | fontalignment | `self.fontAlignment` |
| 13 | fontclass | `self.fontClass` |
| 14 | fontdownangle | `self.fontDownAngle` |
| 15 | fontheight | `self.fontHeight` |
| 16 | fontitalicangle | `self.fontItalicAngle` |
| 17 | fontinterval | `self.fontInterval` |
| 18 | fontname | `self.fontName` |
| 19 | fontpos | `self.fontPosType` |
| 20 | fontrealheight | `self.fontRealHeight` |
| 21 | fontreallength | `self.fontRealLength` |
| 22 | fontstring | `self.fontString` |
| 23 | fontstringangle | `self.fontStringAngle` |
| 24 | fontstringcount | `self.fontStringCount` |
| 25 | fontunderline | `self.fontUnderLine` |
| 26 | fontwidth | `self.fontWidth` |
| 27 | fontwordangle | `self.fontWordAngle` |
| 28 | groupid | `self.groupID` |
| 29 | hatchdensityscale | `self.hatchDensityScale` |
| 30 | hatchstyle | `self.hatchStyle` |
| 31 | id | `self.id` |
| 32 | lshapeoffset | `self.lShapeOffset` |
| 33 | length | `self.length` |
| 34 | length3d | `self.length3D` |
| 35 | layername | `self.layerName` |
| 36 | linetype | `self.lineType` |
| 37 | linewidth | `self.lineWidth` |
| 38 | max | `self.maxX` |
| 39 | maxy | `self.maxY` |
| 40 | memodata | `self.memoData` |
| 41 | minx | `self.minX` |
| 42 | miny | `self.minY` |
| 43 | modifydata | `self.modifyTime` |
| 44 | name | `self.name` |
| 45 | pointcount | `self.pointCount` |
| 46 | pointname | `self.pointName` |
| 47 | pointtype | `self.pointType` |
| 48 | reference | `self.reference` |
| 49 | relationid | `self.relationID` |
| 50 | reverse | `self.reverse` |
| 51 | scale | `self.scaleX` |
| 52 | scalex | `self.scaleX` |
| 53 | scaley | `self.scaleY` |
| 54 | scalexy | `self.scaleXY` |
| 55 | status | `self.status` |
| 56 | type | `self.type` |
| 57 | x | `self.x` |
| 58 | y | `self.y` |
| 59 | z | `self.z` |
**注意**:索引值按属性名字母顺序排序,通过 `valueNames.sort()` 维护。使用属性常量(如 `attr.area`)比直接使用索引值更具可读性和维护性。
## 使用场景与最佳实践
### 基础属性访问
```python
# 获取对象面积
area_value = attr.getGeoValue(map, geo, "SSObj_Area")
# 修改对象颜色(支持多种格式)
attr.setGeoValue(map, geoList, "SSObj_Color", "RGB(255,0,0)")
attr.setGeoValue(map, geoList, "SSObj_Color", "16711680") # 红色
```
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L332-L335)
### 坐标点操作
```python
# 获取第一个点的X坐标
x0 = attr.getGeoValue(map, geo, "SSObj_X(0)")
# 设置第三个点的Z值为100.0
attr.setGeoValue(map, geoList, "SSObj_Z(2)", "100.0")
```
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L307-L318)
### 扩展属性管理
```python
# 设置单个扩展属性
attr.setGeoValue(map, geoList, "[自定义属性]", "属性值")
# 批量设置多个扩展属性
attr.setGeoValue(map, geoList, "[属性1,属性2,属性3]", "值1,值2,值3")
```
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L364-L394)
### 注记对象样式控制
```python
# 设置注记字体和大小
attr.setGeoValue(map, geoList, "SSObj_FontName", "宋体")
attr.setGeoValue(map, geoList, "SSObj_FontHeight", "12.5")
# 设置注记旋转角度
attr.setGeoValue(map, geoList, "SSObj_FontStringAngle", "30.0")
```
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L535-L594)
## 与其他模块的交互
ObjBaseAttr 作为属性管理中枢,与多个核心模块协同工作:
```mermaid
graph LR
A[ObjBaseAttr] --> B[PySSCore<br/>GeoBase/GeoBaseList]
A --> C[PySSMath<br/>几何计算函数]
A --> D[PySSMap<br/>ScaleMap]
B --> E[提供地物对象]
C --> F[3D长度计算]
D --> G[地图比例尺]
A --> H[SSProcessManager]
H --> I[选择集管理]
I --> A[属性读写]
```
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L1-L4)
**关键依赖**
- `GeoBase`:地物对象基类,提供属性访问方法
- `GeoBaseList`:地物对象列表,支持批量操作
- `ScaleMap`:地图对象,提供比例尺等上下文信息
- `get3DLength`:来自 PySSMath 的三维长度计算函数
- `getColorValue`:颜色值解析函数
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L336-L340)
## 参考文档延伸
要深入了解属性的具体使用场景,可参考以下文档:
- [获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi):详细说明属性读取的完整流程
- [修改地物属性值](16-xiu-gai-di-wu-shu-xing-zhi):批量属性修改的操作指南
- [地物基本属性详解](17-di-wu-ji-ben-shu-xing-xiang-jie):属性的业务含义详解
- [扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing)MemoData 扩展机制说明
- [SSProcessManager 完整 API](40-ssprocessmanager-wan-zheng-api):结合选择集使用属性的示例