CAD图纸DWG就是一个数据库。个人觉得可以理解为一个”树形数据库“,包含了数据库、实体、容器、符号表、字典等等内容。这些内容又都可以称之为对象,包括数据库本身也可以称之为对象。

  每一个DWG文件,都会包含:九个固定的符号表和一个有名对象字典。符号表,每个符号表只能存储特定类型的对象,字典则是一个通用的容器可以存储任何类型的对象。
  对于符号表和有名对象词典的区别、用法,需要在使用的时候感受。用文字比较难表达。甚至DWG数据库中各对象的层次,也是需要通过实际的使用,在代码中去做以区分。

常用的对象及其调用关系:

using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Application = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using DataTable = Autodesk.AutoCAD.DatabaseServices.DataTable;//文档
Document doc = Application.DocumentManager.MdiActiveDocument;
//数据库对象
//两种方式
Database db = HostApplicationServices.WorkingDatabase;
Database db = Application.DocumentManager.MdiActiveDocument.Database;
//编辑器
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;//获得块id
ObjectId blockTableId = db.BlockTableId;
//打开一个事务
//使用using,当using结束时,整个using块中的代码被及时释放,减少资源的占用
using (Transaction tr = db.TransactionManager.StartTransaction())
{//块表BlockTable blockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;//块表记录//根据块表获取块表记录,BlockTable[BlockTableRecord.ModelSpace]BlockTableRecord record = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;//创建一个实体(可以是引线、圆圈等等)Entity entity = new Entity();//向数据库tr.AddNewlyCreateDBObject(entity, true);//第一种选择集的使用方式//getentity(string message),输入的字符串主要是做提示用,该字符串会在CAD下方的命令行中展示、也会在鼠标上有所提示PromptEntityResult ent = ed.GetEntity("\n请选择一个引线");MLeader mleader = tr.GetObject(ent.ObjectId, OpenMode.ForWrite, true) as MLeader;//或者。tr.getobject的返回值类型即为EntityEntity entity = tr.GetObject(ent.ObjectId, OpenMode.ForWrite, true);//第二种选择集的使用方式//定义好强制输入的类型PromptEntityOptions peo = new PromptEntityOptions("\n请选择块:");peo.SetRejectMessage("\n选择的必须是块");peo.AddAllowedClass(typeof(BlockReference), false);PromptEntityResult res = ed.GetEntity(peo);//当找到了匹配的实体类型,则status即为OK//打开源码可查:OK Other Naone Modeless Error Cancel Keywordif (res.Status != PromptStatus.OK)return null;//属性块  //创建一个属性块的系列操作://首先在CAD图纸上创建一个名为norm的块//然后通过blockTable["norm"]得到这个块的ObjectId//新建一个块参照并设置插入点。类型为norm(块定义的名称即为块参照的类型)              PromptPointResult pt = ed.GetPoint("\n选取属性块生成位置:");Point3d position = (Point3d)pt.Value;BlockReference br = new BlockReference(position, blockTable["norm"]);ed.WriteMessage("\n新创建的块参照是否为空? -> "+(br == null).ToString() + "  块参照名称:" + br.Name);BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;//块参照id//ObjectId brId = br.ObjectId;ObjectId brId = space.AppendEntity(br);//把块参照添加到模型空间//数据字典DBDictionary DictForRead = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;//操作结束之后,关闭事务tr.Commit();
}

  CAD中所有对象都放在这些容器对象中,符号表和有名对象字典都具有相同的功能——组织和管理CAD数据库中的对象
  ——即他们含有实体对象,但是可以通过文字字符串作为关键字对对象实体进行查询,并向这些容器中添加记录(记录即对象)、修改记录
  符号表与字典的不同:符号表有九种,每种符号表只能存储特点类型的对象(如块表只能存储块表记录、层表只能记录层表记录),而字典则是一种通用容器,可存储任何类型的对象。(一般多是通过符号表操作对象)

块表 尺寸标注样式表 层表 线型表 应用程序注册表 文字样式表 用户坐标系表 视口表 视图表
BlockTable DimStyleTable LayerTable LinetypeTable RegAppTable TextStyleTable UCSTable ViewportTable ViewTable

  


  根据以上代码可以直观的看到:API的最高层次是Application,其次是DocumentManager.MdiActiveDocument

  Application对象是AutoCAD API对象模型的根对象,通过Application,用户可以访问主窗口以及任何打开的图形(dwg)。一旦用户获得了图形(dwg),就可以访问图形(dwg)中的对象。获得Application等同获得了进入CAD的权限。
  例如:Application.DocumentManager,该对象允许对当前图形的访问,并允许用户创建、保存和打开图形文件。通过Application对象提供的其他特性可以使用:信息中心(InfoCenter)、主窗口(MainWindow)、状态栏(StatusBar)等等对象。主窗口API允许用户访问应用程序的名称、大小、位置和可见性等。(注:虽然说是做CAD二次开发,但是并不是仅仅在CAD中加入一个插件,利用CAD提供的API是可以重建一个新的、模仿AutoCAD的CAD应用的。这就是高层次API的用处)

cad.net开发小结——层次结构相关推荐

  1. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 相关推荐阅读:. Android即时通讯 ...

  2. STM32——库函数开发小结

    STM32--库函数开发小结 宗旨:技术的学习是有限的,分享的精神是无限的. 基本上所有外设都有以下几类寄存器:[CR/DR/SR] (1)控制寄存器 xxx_CR(Control/Configura ...

  3. pdfjs viewer 开发小结

    此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...

  4. Android 即时通讯开发小结(一)

    本文将基于 IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 客户端架构 作为一个 IM 软件,最重要的一个特性就是保证消息的达到率和实时性. ...

  5. Android开发小结Part2:目录

    2019独角兽企业重金招聘Python工程师标准>>> Android开发小结Part1:绪论 Android开发小结Part2:目录 Android开发小结Part3:Intent ...

  6. 第一个 iOS 项目开发小结 - SwiftUI 学习资料、开源项目

    第一个 iOS 项目开发小结 SwiftUI 知识点小记 学习资料 开源项目 一些问题记录 项目预览 这段时间由于项目需要,我学习了一段时间 SwiftUI 并单独完成了一个系统的开发,耗时两个星期, ...

  7. Ajax开发小结慎用AJAX框架

    第一篇:Ajax开发小结 1 AJAX还是AJAH * AJAX的很多经典应用其实都是利用xmlhttp空间访问后台程序,后台程序返回脚本用eval回调或者返回简单数据的方式来开发.这样的开发模式的好 ...

  8. 游戏开发小结——在unity3d中开发类塞尔达游戏的反冲效果

    游戏开发小结--在unity3d中开发类塞尔达游戏的反冲效果 在 2D ARPG 中为角色创建反冲效果 我们将在Unity中实现这个效果.首先,我们将进行演示场景的设置.我们将创建一个控制器(cont ...

  9. java开发小结:(2006.10.12-future)

    java开发小结:(2006.10.12-future) ================================================ log.debug(StringUtils. ...

最新文章

  1. English Speech-Graduation from University
  2. systemverilog硬件设计及建模_3D建模和渲染都吃什么硬件?设计师该如何选购电脑...
  3. java与java ee_使用Java EE的ManagedExecutorService异步执行事务
  4. 2021泗阳致远中学高考成绩查询,2021高考成绩什么时候发布?可通过哪些途径查询?...
  5. 【wordpress】wordpress环境的搭建
  6. Ancient Berland Circus CodeForces - 1C
  7. 跨域请求Ajax(POST)处理方法
  8. CCNA自学教材推荐(转)
  9. GNN-频域-2016:ChebNet【频谱图卷积】【切比雪夫多项式(ChebShev Polynomial)】【应用切比雪夫多项式加速特征矩阵求解】【GCN来源于对ChebNet的进一步简化与近似】
  10. MSM8960 // F200 引导装载程序 (Bootloader) 之研读
  11. 拉盖尔多项式的正交性
  12. 【linux学习笔记】began,每次玩这个都特别着迷
  13. 国内资深安全专家详谈网页***
  14. github访问不了怎么办
  15. python使用 docx 库操作 docx 格式文件
  16. android 滑动标签框架,Android实现网易严选标签栏滑动效果
  17. RSSI,RSRP,RSRQ and SINR
  18. 用Java实现一个简易的植物大战僵尸游戏
  19. 【Python】基于OpenCV与UDP实现的视频流传输
  20. 3D Object Detection 3D目标检测综述

热门文章

  1. python+OpenCV 图片合成视频
  2. 读书:《指数型组织》
  3. VSCODE汉化、更改主题和文件图标
  4. R语言 car包recode()函数被dplyr包里的同名recode()函数覆盖导致出错
  5. flash图片如何镜像翻转_flash中怎么制作镜像跳动文字效果 值得收藏
  6. 山东省计算机网络搭建技能大赛,我校学生在山东省职业技能大赛“计算机网络组建与信息安全技术”项目中再获佳绩...
  7. 数据库 SQL语句小结(更新中)
  8. unity3d,android平台下,高德地图定位
  9. 嘿~快来试试阿里云云开发平台!!!
  10. 阿里云IoT平台CoAP接入 1 开发准备