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
坐标点名称] B --> B2[SSObj_PointCount
坐标点数量] B --> B3[SSObj_PointType
坐标点类型] B --> B4[SSObj_X/Y/Z
坐标值] C --> C1[标识属性
ID, Code, Name] C --> C2[图形属性
Color, LineType, LineWidth] C --> C3[变换属性
Angle, ScaleX, ScaleY] C --> C4[时间属性
CreateTime, ModifyTime] D --> D1[面积属性
Area, EllipsoidArea] D --> D2[长度属性
Length, 3DLength] D --> D3[边界属性
minX, minY, maxX, maxY] E --> E1[字体属性
FontWidth, FontHeight, FontName] E --> E2[文本属性
FontString, FontStringCount] E --> E3[样式属性
Alignment, FontWeight, ItalicAngle] F --> F1[SSObj_Reverse
方向反转] F --> F2[SSObj_Reference
引用关系] ``` ### 点属性索引 点属性用于描述地物对象的坐标点信息,是构成线、面等复杂几何形状的基础元素。此类属性支持通过参数索引访问特定位置的坐标点。 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
GeoBase/GeoBaseList] A --> C[PySSMath
几何计算函数] A --> D[PySSMap
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):结合选择集使用属性的示例