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 | 视图表 | 保存的命名视图 |
额外还有两张不属于「符号表」,但属于顶层核心容器:
- RegAppTable 注册应用程序表 ------存放XData扩展数据的AppName(非常关键,你做XData导出一定会用到)
- 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:是否打印
开发关键点:
- 实体(Line/Polyline/BlockReference)有一个 LayerId 属性,指向LayerTableRecord
- 直线本身不保存颜色;如果颜色=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
poly.LayerId → LayerTableRecord(图层)
poly.LinetypeId → LinetypeTableRecord(线型)
poly.Color ------颜色(ByLayer就取图层颜色)
单行文字 DBTexttxt.LayerId → LayerTableRecord
txt.TextStyleId → TextStyleTableRecord(文字样式)
块参照 BlockReferencebr.BlockTableRecordId → BlockTableRecord(源块定义)
四、【符号表记录】 VS 【实体Entity】最本质区别(重中之重,开发永远不要搞混)
-
七大符号表里所有记录(LayerTableRecord、TextStyleTableRecord、BlockTableRecord)
- BlockTableRecord除外!!其余符号记录不能包含子图形实体
- 属于「配置、模板、引用项」
- 你不能在图层记录里面画一条直线!
-
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就是对应每张表的根IDdb.BlockTableId
db.LayerTableId
db.TextStyleTableId
db.DimStyleTableId
如果你需要,我下一步可以给你对比:符号表记录 和 字典(DBDictionary) 的区别;或者给你一份遍历图层、文字样式、RegApp表的完整可运行示范代码。