数据库七大符号表

CAD‑DWG 数据库七大符号表(AutoCAD / ZWCAD .NET)

DWG 数据库 Database 顶层,内置7张固定的符号表 ,外加命名对象字典。

你前面学的 BlockTable(块表)就是七大符号表之一

所有符号表统一架构:

Database → 符号表(XXXTable) → 符号表记录(XXXTableRecord)

对应关系:

  • BlockTable → BlockTableRecord(块定义)
  • LayerTable → LayerTableRecord(图层记录)

完整7大符号表清单

.NET类名 中文名称 存放内容
BlockTable 块表 模型空间、布局、自定义块定义、匿名块
LayerTable 图层表 所有图层(0层、管线、WS_POINT等)
LinetypeTable 线型表 线型:连续线Continuous、虚线、中心线
TextStyleTable 文字样式表 文字样式:字体、高度、宽高比
DimStyleTable 标注样式表 标注样式:箭头大小、文字位置、精度
PlotStyleTable 打印样式表 打印颜色、线宽打印配置
ViewTable 视图表 保存的命名视图

额外还有两张不属于「符号表」,但属于顶层核心容器:

  1. RegAppTable 注册应用程序表 ------存放XData扩展数据的AppName(非常关键,你做XData导出一定会用到)
  2. NamedObjectsDictionaryId 命名对象字典 ------顶级字典,存放组、多引线、动态块数据等复杂对象

一、逐个拆解每一张表的层级结构、含义、字段、开发注意事项

1、BlockTable 块表(已经掌握,快速复习)

复制代码
Database
└── BlockTable(块表)
    ├── BlockTableRecord(*ModelSpace)      模型空间
    ├── BlockTableRecord(*Paper_Space)     布局1
    ├── BlockTableRecord(*Paper_Space1)    布局2
    └── BlockTableRecord(消火栓)            用户自定义块定义
  • 块定义(BTR)内部独有特性:可以包含一堆子实体(直线、圆、块参照)。
  • 其余6张符号表记录不能存放实体!!图层、文字样式这些只是「属性配置」,没有子图形

2、LayerTable 图层表(图层)

复制代码
Database
└── LayerTable 图层表
    ├── LayerTableRecord("0")                 //默认0图层,永远存在
    ├── LayerTableRecord("WS‑POINT")
    ├── LayerTableRecord("管线")
    └── LayerTableRecord("标注")

LayerTableRecord 图层记录核心属性:

  • Name:图层名称
  • Color:图层颜色
  • LinetypeObjectId:线型ID → 指向线型表里面某一条线型记录
  • IsOff:图层关闭
  • IsFrozen:图层冻结
  • IsLocked:图层锁定
  • PlotFlag:是否打印

开发关键点:

  1. 实体(Line/Polyline/BlockReference)有一个 LayerId 属性,指向LayerTableRecord
  2. 直线本身不保存颜色;如果颜色=ByLayer,则去图层记录读取颜色

关系链路举例

Polyline(多段线实体)

→ ent.LayerId → LayerTableRecord

→ layer.LinetypeObjectId → LinetypeTableRecord


3、LinetypeTable 线型表

复制代码
Database
└── LinetypeTable 线型表
    ├── LinetypeTableRecord("Continuous")     //连续实线,强制内置
    ├── LinetypeTableRecord("CENTER")         //中心线
    └── LinetypeTableRecord("DASHED")         //虚线

LinetypeTableRecord 属性:

  • Name:线型名
  • Description:线型说明文字
  • Pattern:线型图案(短划线、空格长度定义)

实体不会直接存虚线,通过ID引用线型表记录


4、TextStyleTable 文字样式表

复制代码
Database
└── TextStyleTable 文字样式表
    ├── TextStyleTableRecord("Standard")    //标准默认样式
    ├── TextStyleTableRecord("宋体‑标注")
    └── TextStyleTableRecord("管线文字")

TextStyleTableRecord 属性:

  • Name:样式名
  • FontFileName:字体文件(shx,ttf)
  • BigFontFileName:大字体(中文shx)
  • TextHeight:默认文字高度
  • WidthFactor:宽高比例
  • ObliquingAngle:倾斜角度

DBText(单行文字)、MText(多行文字) → TextStyleId,指向本表记录


5、DimStyleTable 标注样式表

复制代码
Database
└── DimStyleTable 标注样式表
    ├── DimStyleTableRecord("Standard")
    └── DimStyleTableRecord("市政‑标注")

DimStyleTableRecord:存储全套标注参数

箭头样式、文字偏移、精度、尺寸线间距、文字颜色。

Dimension(标注实体)→ DimStyleId,指向本表。


6、ViewTable 命名视图表

复制代码
Database
└── ViewTable 视图表
    └── ViewTableRecord("我的视图1")

保存:视图中心点、视图高度、相机角度。

就是视图管理器里面你保存过的命名视图。日常二次开发用得很少。

7、PlotStyleTable 打印样式表

复制代码
Database
└── PlotStyleTable 打印样式表

控制打印时:某颜色打印多粗的线宽,打印黑白还是彩色;市政出图打印经常用到。

二、RegAppTable 注册应用表(XData扩展数据!你导出功能必用)

不属于七大符号表,但是顶级表,极其重要

复制代码
Database
└── RegAppTable
    ├── RegAppTableRecord("MY_XDATA_TAG")
    └── RegAppTableRecord("WS‑EXPORT")

用途:

如果你给实体附加扩展数据XData,第一步必须先在RegAppTable注册你的AppName

不注册,XData无法保存进DWG。

你现在做的:读取实体XData导出MDB,就要读取这个表。

三、实体 和 符号表记录 的引用关系(核心!!)

直线、多段线、文字、块参照(Entity实体)不直接保存图层名字、文字样式名字

全部都是通过 ObjectId 指针「引用」符号表里的记录

举一条完整链路:

一条多段线 Polyline

  1. poly.LayerId → LayerTableRecord(图层)

  2. poly.LinetypeId → LinetypeTableRecord(线型)

  3. poly.Color ------颜色(ByLayer就取图层颜色)
    单行文字 DBText

  4. txt.LayerId → LayerTableRecord

  5. txt.TextStyleId → TextStyleTableRecord(文字样式)
    块参照 BlockReference

br.BlockTableRecordId → BlockTableRecord(源块定义)

四、【符号表记录】 VS 【实体Entity】最本质区别(重中之重,开发永远不要搞混)

  1. 七大符号表里所有记录(LayerTableRecord、TextStyleTableRecord、BlockTableRecord)

    • BlockTableRecord除外!!其余符号记录不能包含子图形实体
    • 属于「配置、模板、引用项」
    • 你不能在图层记录里面画一条直线!
  2. Entity实体:Line,Polyline,DBText,BlockReference,Dimension

    • 存放于某一条BlockTableRecord内部(模型空间/布局/自定义块定义)
    • 就是画布上看得见的图形

唯一特例:BlockTableRecord(块定义)是符号表记录里面唯一一个可以存放子实体的类型!

这也就是块表和图层表最大不一样的地方。

五、DWG数据库完整顶层树状总图(完整版)

复制代码
Database(DWG文件根)
├─七大符号表
│   ├─BlockTable          块表
│   ├─LayerTable          图层表
│   ├─LinetypeTable       线型表
│   ├─TextStyleTable      文字样式表
│   ├─DimStyleTable       标注样式表
│   ├─ViewTable           视图表
│   └─PlotStyleTable      打印样式表
│
├─RegAppTable              XData应用注册表
│
└─NamedObjectsDictionaryId  命名对象顶级字典
    ├─组(Group)
    ├─多引线样式
    └─动态块数据、其他自定义数据

六、通用遍历所有符号表的代码模板(统一写法)

所有符号表遍历代码套路一模一样!和遍历块表几乎完全一样

csharp 复制代码
using(Transaction tr=db.TransactionManager.StartTransaction())
{
    //图层表遍历示例
    LayerTable lt=tr.GetObject(db.LayerTableId,OpenMode.ForRead) as LayerTable;
    foreach(ObjectId layerId in lt)
    {
        LayerTableRecord lyr=tr.GetObject(layerId,OpenMode.ForRead) as LayerTableRecord;
        string layName=lyr.Name;
    }
    tr.Commit();
}

规律:db.XXXTableId 就是对应每张表的根ID

db.BlockTableId

db.LayerTableId

db.TextStyleTableId

db.DimStyleTableId

如果你需要,我下一步可以给你对比:符号表记录 和 字典(DBDictionary) 的区别;或者给你一份遍历图层、文字样式、RegApp表的完整可运行示范代码。

相关推荐
leonkay1 小时前
C# 特性(Attribute)——【2】工业设备参数框架设计
经验分享·面试·架构·c#·学习方法·设计
2501_906565122 小时前
小创 · 智能助手
开发语言·c#
datalover9 小时前
【无标题】
c#·linq
FlYFlOWERANDLEAF10 小时前
微软CommunityToolkit.Mvvm和DevExpress中GenerateViewModel使用
c#
Xin_ye1008611 小时前
第七章:进阶篇——事件监听、外部服务集成与性能优化
c#
z落落11 小时前
C# WinForm NModbus 串口通信+WinForm Modbus4 串口通信
开发语言·单片机·c#
CoderIsArt12 小时前
C#环境中部署MQTT客户端
开发语言·c#
CSDN_RTKLIB13 小时前
模型空间、布局控件、自定义块
c#
z落落13 小时前
C# WinForm TCP 服务器+WinForm TCP 客户端
服务器·tcp/ip·c#