属性管理

作为计算机辅助设计软件,AutoCAD 具备一定的属性功能,但并未提供严格意义上的 GIS 属性和字段支持,这让属性数据交换极为不便,本软件通过定制扩展数据 (XDATA) ,不通过任何第三方数据库,实现完整的字段和属性管理。

字段

字段是属性数据的基础,支持的数据类型如下:

字段类型存储类型说明
OFTString文本常用的字符串字段
OFTInteger整数整数型字段
OFTReal小数小数型字段,如果字段值是 54.234,则小数位数 = 3,精度 = 5。
OFTStringList多种多值字段,可在一个字段中保存多个内容。
该类型仅为兼容一些旧数据色设计,如SOUTH,如无必要不建议使用
DateTime文本日期字段,实际存储字符串,仅在数据转换时用于规范字段

您可以通过 字段管理器 来添加,删除,修改字段;

受限于CAD数据结构,扩展数据在使用时有一些限制:

  • 单个要素所有扩展数据的字符总数不能超过8188,超过会提示 eXdataSizeExceeded 错误 (按AutoCAD2012测试,不同版本可能略有出入);

  • 为保持和低版本数据的兼容性,要素单个字段长度最好不要超过255,否则 AUDIT 命令可能造成数据丢失,若要使用内容长度超过255的字符串,则不要轻易使用 AUDIT 命令:

    AUDIT 命令,选择 N,若提示类似: XData String Length 265 > 255 Truncate to 255,表示该属性内容长度为265,超过255

  • 若每个字符串字段长度为255,则单个要素最多可保存32个字段 (8188/255),在处理大量属性时可做参考;

  • 字段名只能以字母或汉字开头,且只能由汉字、字母、数字和下划线构成。

字段管理

字段管理器可对图层的字段进行添加、删除、修改等操作,并可加载和保存字段模板。

内容列表 > 选中图层 > 右键 > 字段,可打开所选图层的字段管理器。

image

命令:SFM ,可打开当前图层的字段管理器。

添加字段

在字段管理器界面点击添加字段,设置字段名,类型,长度等参数,点击确定即可添加字段。

image

删除字段

在字段列表中选中要删除的字段 ,可选择多个,点击删除字段,提示选择是即可删除所选字段。

注意

删除字段后若不勾选应用到所有要素选项,则要素中数据实际并未被修改,只是限制了对该字段值的编辑,此类数据在属性面板状态为灰色不可编辑,定义同名字段后即可恢复编辑。

修改字段

双击字段,弹出编辑窗口,按需求修改后,点击确定即可修改。

注意

修改字段会影响该图层的所有要素,对字段类型的修改可能造成部分数据丢失,对字段长度的修改可能造成字段值被截断,请谨慎操作。

加载&保存模板

可将当前的字段配置保存到本地,在需要新建字段的场合,直接通过加载模板来批量配置这些字段

image

提示

字段模板格式为 CSV 逗号分隔文件,可通过 Excel 或文本编辑器直接编辑(名称,类型,长度为必填项)。

属性表

通过属性表可进行属性浏览、编辑、查找、定位、字段计算、属性选择等操作。

image

您可通过以下方式打开属性表:

  • 图层列表 > 双击图层名 ,打开对应属性表。

    image

  • 图层列表 > 图层右键 > 打开属性表,打开所选图层的属性表。

    image

  • 命令 STABLE ,打开当前图层对应的属性表。

按属性选择

按属性选择用于快速筛选记录,单击属性表上方的按属性选择激活该功能:

image

使用提示

  • 双击字段或唯一值,可在表达式中插入对应内容;
  • 单击操作符按钮可插入对应操作符;
  • 选择字段后单击获取唯一值,列出该字段的所有唯一值;
  • 操作符不限于界面中列出的项,具体使用可参考 关于属性选择open in new window

字段连接

将属性表和其他表的数据通过指定字段进行连接,多用于浏览和更新字段值,若想不打开属性表实现数据更新,可参考 挂接外部数据

image

操作步骤:

  1. 选择用于连接的字段和用于连接的表;

    image

  2. 验证连接,按提示检查设置;

  3. 点击右侧的字段,勾选需要连接到当前数据的字段,确定即可完成连接操作;

image

注意

  • 连接加入的字段将以灰色背景显示,不可编辑;
  • 连接只对当前打开的属性表有效,属性表刷新或关闭后连接销毁;
  • 可通过 字段计算 的方式,将连接的数据保存到属性中;
  • 可通过 置入字段 的方式,直接将连接的字段内容保存到属性中;

属性表其他功能

记录联动
  • 单击行头可选中记录,若打开了属性面板 (EXX),则属性面板会同步显示所选记录的值;

  • 双击行头可缩放至行对应实体,具体行为可在属性表选项中调整:

    image

搜索
  • 可在搜索框中输入指定值进行搜索定位,Enter可跳转下一条满足条件的记录;
  • 未选中列的情况下进行的是全表搜索,选中列的情况下只搜索所选列。
菜单
  • 行头右键功能菜单,可定位实体,并执行复制等操作;

    image

  • 列头右键功能菜单,可查看字段属性,并进行关闭、删除,冻结字段等操作;

    image

  • 选中单元格右键功能菜单,可复制单元格内容等;

    image

外观
  • 功能菜单-选项,弹出口窗口中可调整属性表行高,字体样式等。

    image

字段计算器

字段计算器主要用于批量修改字段内容,打开属性表后,字段标题右键 > 字段计算器 即可激活字段计算器。

image

函数类型

  • 工具:软件定制的一些函数,该列表会按需求持续更新;
  • 字符串:常用的字符处理函数,如字符截取、替换、查找、填充等;
  • 数字:常用的数字处理函数,如取整、四舍五入、绝对值、最大最小值等;
  • 转换:常用的转换函数,提供整数、小数、字符串等的相互转换;

工具 类型的函数外,其他可用函数远不止这些,具体可参考 计算字段示例

字段和功能

  • 双击字段名,可在表达式中插入该字段;
  • 双击功能函数,可在表达式中插入该函数;

表达式

  • 输入表达式后,下方预览区域会显示计算结果,表达式有误会提示,可按提示修改;
  • 预览基于属性表第一行数据,若有选中的行,则基于所选的第一行数据;
  • 表达式可通过保存到本地,通过加载调用;

表达式使用 C# 代码,支持大量常用语法,支持 LINQ ,可通过编写代码实现自定义功能。

计算字段示例

可粘贴下面这些表达式到字段计算器窗口,通过预览查看计算结果

字符串
  • 字符串用西文单引号 ' 或者双引号 " 括起来

    '我是字符串1'
    "我是字符串2" 
    
  • 字符串合并用加号: +

    "我是"+"字符串1";//计算结果为 "我是字符串1"
    
  • 字符串截取:.Substring()

    "周末去图书馆".Substring(0,2);//计算结果为 "周末";
    "周末去图书馆".Substring(3,3);//计算结果为 "图书馆"
    
  • 字符串替换:.Replace()

    "周末去图书馆".Replace("周末","星期天") ;//计算结果为 "星期天去图书馆"
    
  • 查找字符串,从前往后:.IndexOf(),从后往前: .LastIndexOf()

    "周末去不去图书馆".IndexOf("去");//计算结果为 2
    "周末去不去图书馆".LastIndexOf("去");//计算结果为 4
    
  • 字符右补齐:.PadRight(),左补齐:.PadLeft()

    "702".PadLeft(4,'0');//计算结果为:"0702"
    "702".PadRight(4,'0');//计算结果为:"7020"
    
数字
  • 四舍五入:Math.Round()

    Math.Round(3.1415,2) ;//计算结果为:3.14
    
  • 获取整数部分:Math.Truncate(),向下取整:Math.Floor(),向上取整:Math.Ceiling()

    Math.Truncate(3.14) ;//计算结果为:3
    Math.Floor(3.14);//计算结果为:3
    Math.Ceiling(3.14);//计算结果为:4
    
  • 取绝对值:Math.Abs()

    Math.Abs(-3.14) ;//计算结果为:3.14
    
  • 取较大值:Math.Max(),较小值:Math.Min()

    Math.Max(1,2);//计算结果为:2
    Math.Min(1,2);//计算结果为:1
    
格式转换
  • 转为数字:Convert.ToDouble()

    Convert.ToDouble('3.14');//计算结果为:3.14
    
  • 转为字符串:Convert.ToString().ToString()

    Convert.ToString(3.14);//计算结果为:"3.14"
    
图元属性
  • 图元使用 DBOBJECT 作为关键字,使用该关键字可对图元属性进行提取和操作,若有一定 C# 编程功底,可编写代码实现更多自定义功能,下面可作参考:

    DBOBJECT.Position;//点坐标
    DBOBJECT.TextString;//文字内容
    DBOBJECT.EndParam;//多段线节点数量
    Math.Round(DBOBJECT.Area*0.0015,2);//多段线面积(亩)
    Math.Round( DBOBJECT.Length ,2) ;//多段线长度(米)
    DBOBJECT.XData;//图元扩展属性
    

    注意

    不同的类型的图元有不同的属性,比如圆有圆心 Center,文字有文字内容 TextString,多段线有节点数量 NumberOfVertices,在进行计算时,要先选中对应的图元,比如计算圆心坐标,应选择圆后执行,否则可能提示错误

    image-20231231103934647

  • 面积和长度,除了用图元属性直接获取外,还有可以通过 工具 中的函数来直接计算

    Area(2);//计算图元面积,保留2位小数
    Area(3);//计算图元面积,保留3位小数
    Length(2);//计算图元长度,保留2位小数
    Length(3);//计算图元长度,保留3位小数
    
    //对于需要强制保留两位显示的场景,可新建文本字段,并通过如下方式计算
    Area(2).ToString("0.00");//如果面积是3,则计算结果为3.00
    
  • 多段线所有节点坐标

    //计算多段线所有节点坐标
    if (DBOBJECT == null) return "";
    var pl = DBOBJECT as Autodesk.AutoCAD.DatabaseServices.Polyline;
    if (pl == null) return "";
    string fmt = "F3";//坐标小数位,F3是保留3位
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < pl.NumberOfVertices; i++)
    {
    	var pt = pl.GetPoint3dAt(i);
    	sb.Append(pt.X.ToString(fmt)+ "," + pt.Y.ToString(fmt)+" ");//坐标格式
    }
    return sb.ToString().Trim();
    
  • 图幅号

    //计算图元所在图幅号
    if (DBOBJECT == null) return "";
    var ent = DBOBJECT as Entity;
    if (ent == null) return "";
    var point = ent.GeometricExtents.MinPoint;//取实体左下角点
    var str = ((int)Math.Floor(point.X / 250.0) * 0.25).ToString("0.00");
    var str2 = ((int)Math.Floor(point.Y / 250.0) * 0.25).ToString("0.00");
    return str2 + " - " + str;//自由组合图幅号格式
    
工具

工具 是函数中最特殊的一项,用来完成一些特定计算,此处的函数会随着软件更新调整。

image-20240122150245505

  • GetXdata

    //如CASS软件的 SOUTH 字段,可通过该函数来获取字段指定位置的值;
    GetXData('SOUTH',1);//获取 SOUTH 字段的第 1 个值
    GetXData('SOUTH',2);//获取 SOUTH 字段的第 2 个值
    
  • SetXdata

    //仍然以 SOUTH 为例,该函数可修改或添加字段指定位置的值(计算前请选择 SOUTH 为目标字段)
    SetXData((张三,1));//将 SOUTH 字段的第 1 个值设置为 张三
    SetXData((JC01001,2));//将 SOUTH 字段的第 2 个值设置为 JC01001
    SetXData((张三,1)(JC01001,2));//同时设置多个值
    
    //上面三个示例都是使用的字符串值(代码1000)
    //如果要计算整数或者小数,可参考以下示例
    SetXData((1040,3.14,1));//将 SOUTH 字段的第 1 个值设置为 3.14,格式为小数(代码1040)
    SetXData((1071,-3,1));//将 SOUTH 字段的第 1 个值设置为 -3,格式为整数(代码1071)
    
    //注意, SetXdata 函数只会添加或修改列表指定位置的值,未指定的位置将维持原状
    
  • Area

    //在 图元属性 计算中已有介绍,该函数可用于计算多部件块,填充等的面积
    Area(2);//计算图元面积,保留2位小数
    Area(3);//计算图元面积,保留3位小数
    
  • Length

    //在 图元属性 计算中已有介绍,该函数可用于计算多部件块,填充等的长度
    Length(2);//计算图元长度,保留2位小数
    Length(3);//计算图元长度,保留3位小数
    
  • Count

    //用于统计指定字段中相同值的数量
    Count('DLBM');//统计 DLBM 中不同地类的总数
    
  • Sum

    //分组求和,求和字段应为整数或小数
    Sum('DLBM','TBMJ');//将图斑按 DLBM 字段分组,并按 TBMJ 字段求和
    
  • Number

    //编号函数,可用于全图流水号或分组编号等
    Number('DLBM','0000');//按 DLBM 分组编号,格式为 0001,0002...
    "JC"+Number('DLBM','01000');//按 DLBM 分组编号,格式为 JC01001,JC01002...
    
    //特别的,想要全图编号时,可通过 OBJTYPE 字段实现(前提是图元类型一致)
    Number('OBJTYPE','0000')//按 OBJTYPE 全图编号
    

属性计算器

字段计算器为字段赋值,而属性计算器则为属性赋值,什么是属性?

在 AutoCAD 特性面板 中列出的项都是属性,比如实体的 颜色图层;文字的 字高宽度内容;多段线的 宽度标高 等:

image-20231102112005568

属性计算器可快速批量为这些属性赋值,且赋值基于字段表达式,自由度较高。

字段计算器是为字段赋值,而属性计算器为属性赋值,这是完全不同的两个概念

比如为颜色赋值,可以直接改变图元的颜色,为文字赋值,可以直接修改文字内容

image-20231102152508667

通过属性表 顶部工具栏字段右键 都可以打开属性计算器,打开后界面和字段计算器类似,表达式也相同

image-20231102154435221

对于 目标属性 选项,目前开放的属性如下:

目标属性应用于描述
图层 Layer所有实体不存在的图层会提示新建,并维持字段结构
颜色 ColorIndex所有实体采用索引颜色,有效范围0-255
RGB颜色 Color所有实体采用RGB颜色,如:"255,0,0"
线型 Linetype所有实体实体线型,不存在的线型会被忽略
标高 Elevation多段线,二维多段线,填充高程值,小数
线宽 ConstantWidth多段线,二维多段线取值>=0
厚度 Thickness多段线,二维多段线,单行文字小数
内容 TextString单行文字设置文字内容
字高 Height单行文字,多行文字设置文字高度,取值>0
宽度 WidthFactor单行文字设置文字宽度比例,取值>0
倾斜 Oblique单行文字设置文字倾斜角度,取值[0-85,275-360]
旋转 Rotation单行文字,多行文字设置文字旋转角度
多行内容 Contents多行文字设置多行文字内容
  • 计算过程中,不符合属性规范的值会被忽略
  • 若计算的是图层,计算后图层发生变化,可能需要刷新属性表

属性计算示例

以下代码可将指定区间的值重分类到[0-255]

(byte)(((Contour-1410)*255/(2400-1410)))

属性面板

命令 EXX,属性面板可在选中实体时即时显示其属性值,便于快速修改。

image

内容不可编辑

一些软件给图元附加了扩展属性,这些属性通过面板可以浏览但不可编辑,若想要编辑这些值,通过字段管理器中添加同名字段即可,字段较多时,可通过 定义字段 批量添加。

实体图层

  • 选中实体时: 图层 下拉列表用于修改所选实体的图层

  • 未选中实体时: 图层 下拉列表用于切换当前图层

实体列表

  • 所选实体将按图层分组列出,列表显示当前所选实体的 ID 及 实体类型,单击可定位
  • 列表中的实体可通过 CtrlShift 多选,图层节点可右键全选实体,方便批量修改字段值

快速定义字段

快速定义字段实质上是基于当前属性面板来快速添加字段。这种方式对字段类型和字段长度的识别并不准确,可按需求自行修改。

image

  • SOUTH等字段可能有多个值,快速定义字段默认将其识别为 文本 类型,若要显示并编辑多个值,可将其定义为 列表 类型

下拉列表

对于一些内容固定的字段 (可称之为 字典属性域 ),通过下拉列表来选择而非手动输入更方便准确,下拉列表可通过下列操作来实现:

  1. 单击 配置属性域

image

  1. 弹出字段属性域界面

image

  1. 首次打开该界面,可能在 属性域 中没有可选项目,则需要通过 编辑域 来添加

image

注意

  • 字典和下拉列表配置保存在文件 DWG 中,复制到其他文件的实体将不共享该定义;
  • 属性域和字典都可以保存到本地,复制给其他人使用。

打开外部数据

某些字段可能保存的是文件路径或文件名,为了方便浏览,可通过设置链接,使用系统默认应用快速打开对应文件:

  1. 单击 设置链接 打开设置窗口;

image

  1. 勾选 启用外部链接,设置文件所在的 目标路径子路径字段,行为可按需求自行设置;

image

  1. 确定后,鼠标移动到字段名称上,会出现小箭头,若设置正确,单击小箭头即可快速打开对应文件;

image

属性连接

命令 SXLJ, 用于批量更新多个图层的多个字段内容,可以理解为 批量的字段计算器,除计算字段外,还可以执行一些分类求和等操作。

image

操作步骤

  1. 点击面板上的 添加 ,在弹出的窗口中配置规则。

  2. 连接方法 中选择需要的方法,这儿以 计算字段 为例,选择计算字段后,选择 目标表目标字段

    image

  3. 参数 中输入计算表达式,确定 即可完成该项规则配置。

  4. 确定 后,规则列表中会出现这条规则,可以继续添加多个规则。配置好的规则可 保存 到本地,下次使用时 加载 即可,也可以将配置文件复制给他人使用。

  5. 规则添加完成后,勾选要执行的规则 ,点击 分析 ,结果列表中会显示计算结果 ,注意此时数据尚未保存。

  6. 简单浏览下结果列表的内容,确认无误的话,点击 保存 即可将结果列表中的内容保存到字段中。

    image

属性连接方法

名称说明
字段追加输入字段的值将以分隔符连接,填入目标字段中。参数为分隔符号
求和对输入字段的值进行求和,填入目标字段中 。输入字段只能为数值类型
计数统计与目标记录匹配的记录数量,填入目标字段中 。无需指定输入字段
分类求和对输入字段的值进行求和,并按分类字段填入目标字段中 。需指定分类字段,输入字段只能为数值类型
分类计数统计与目标记录匹配的记录数量,并按分类字段分类填入目标字段中。需指定分类字段,无需指定输入字段
计算字段详见 字段计算器 相关描述

挂接外部数据

纵然属性表和字段计算器已经为 CAD 属性编辑提供了极大便利,但其编辑功能仍不能和 Excel 等专业软件相比,而字段连接必须打开属性表才能操作,其目的主要是查看而非更新属性,由此设计了 挂接外部数据功能,可通过关联字段,将外部数据批量更新到属性表中,命令 GJSJ

image

操作步骤

  1. 设置 挂接表 唯一字段 外部表 外部字段

    • 外部表支持数据交互中所有矢量格式。
    • 唯一字段和外部字段类型尽量一致,若不一致,软件会在分析时强制转换,转换失败会有提示。
    • 唯一字段和外部字段若没有一一对应,则取外部数据第一条更新到属性表中。
  2. 勾选要更新的字段,设置字段映射。

    • 设置好图层及字段后,同名字段默认会被勾选。
    • 勾选外部字段后,若不指定对应的图层字段,会提示向属性表中追加该字段。

    image

  3. 点击 开始挂接 ,软件会分析挂接情况,并提示分析结果,点击 即可更新勾选的字段。

    image

  4. 设置好后可将配置保存,外部数据更新后,通过加载配置快速实现更新。

注意

  • 配置会保存外部数据路径,若外部数据查找失败,软件会提示选择新的数据源
  • 请确保新数据源和失效的原有数据源字段一致。

属性块

属性块在图框应用上具有很大便利,但对属性的批量修改却比较困难,可通过属性块相关功能得到解决。

属性块转字段

命令 ATF

  • 可将属性块中的内容提取到字段中,方便批量编辑。

  • 由于不同块中定义的属性字段不同,在提取后用户可按需求定义图层的字段。

字段转属性块

命令 FTA

  • 可将字段内容写入到属性块同名字段中,实现属性批量修改。

  • 属性块结合导出属性表和挂接外部数据功能,可实现通过Excel编辑属性块的效果。

其他属性工具

记录跳转

命令:NN

  • 打开属性表的前提下,可通过命令 NN 快速跳转并缩放至下一条记录;
  • 跳转只针对当前浏览的属性表,属性表关闭后无法快速跳转,面板可以隐藏。
属性刷

命令:MXX

  • 将所选要素的属性值批量同步到其他要素