马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 MasterObjects 于 2013-5-4 01:22 编辑
引言:本人所贴内容主要为网络收集,图书参考及本人的一些心得,如若有关内容借鉴了“您”的高见,所有版权归您所有。晓东CAD十载,留下了无限的回忆,几年的不见踪影寄托了无限的哀思。最近一直在浏览以前的帖子,以前的场景时时出现在脑海,好在熟悉的内容,熟悉的面孔接连遇见。俺这里给大家作揖了,大家一向可好。
本人使用晓东工具箱多年,因为这一直没有更换过高版本的CAD,感谢晓东给大家免费提供了这么好的工具,也跟着论坛的贤知从无到有的学会了开发CAD,虽然自认入门级的水平,但乐在其中。在写小东西过程中熟悉了XDRX_API,感谢晓东提供了这么好用的接口,以后我的帖子关于数据库深入探秘的地方可能会用到。做工程之人,文笔不好,请大家理解。
-------------------华丽的引言分割线-----------------------
内容简介: | 理解图形 | 什么是对象和容器 | 识别对象 | 理解类和层级结构 | 对象属性 |
1.、图形中有什么?
首先,什么是图形? 在CAD之前,图形就是我们图板上手绘的线条,我们使用的工具就是针管笔、丁字尺、三角板、圆规,通过它们形成真实物体和想象物体的可视化显示。
有了CAD之后,计算机创造的“图形”仍然是描绘真实的物体或假想的创意,但在计算机中它们是通过对象的数据模型实现的。也许有的朋友认为这个模型并不存在,在AutoCAD DWG文件中,99%都是线条或者弧线,与我们过去在图板上看到的东西并无两样。但是设计师利用CAD绘制房屋的时候,并没告诉你看到的线条和真实房屋之间的关系,而AutoCAD数据库中,在你看不到的地方能存储着房屋的真实的模型数据,正如你看到的线条一样。
CAD的房屋是真实房屋的一个抽象模型,CAD线条通常是真实物体边界的抽象模型。
-------------------华丽的图形中有什么的分割线-----------------------
2、对象和容器
AutoCAD图形不过是任意抽象模型的容器,这种对象的集合被称之为“图形数据库”,图形数据库类似于我们已知的数据库,图形数据库中也包含由行或者列组成的表。
AutoCAD的图形数据库可以包含和容纳几乎任何对象,当对象遵循一定规则时候,那么它就可以显示出来,那就是一种我们称之为“实体”的东西。它是具有可视属性的图形数据库对象。
AutoCAD图形数据库的创建者,也就是你我,可以任意的往图形数据库中添加对象,但是对象添加在何处却不是随意的,每一个对象必须放在形成图形数据库的众多的容器中唯一的一个容器内。也就是说一个对象只能属于一个容器,不能被多个容器所共有。比如,我们画的能看得见的实体,必须放在某一个叫做“块表”记录的容器里面。
2.1 符号表
不具有可视描述, 符号表是一种容器,AutoCAD图形数据库共有9种符号表,符号表容器的一个特点就是:每个符号表只能存放相同类别的
对象。也就是说,你不能把属于“层表”的记录放到“尺寸样式表“中。
尺寸样式表(AcDbDimStyleTable,DIMSTYLE) | 定义了一系列的尺寸的外观显示等属性 | 层表(AcDbLayerTable,LAYER) | 为层对象设计的,用于组织图形实体 | 线型表(AcDbLinetypeTable,LTYPE) | 规定AcDbEntity类实体显示或绘制方式 | 注册应用程序表(AcDbRegAppTable,APPID) | 包含储存扩展数据的第三方应用程序名称 | 文本样式表(AcDbTextStyleTable,STYLE) | 定义文本对象的一系列属性 | 用户坐标系表(AcDbUCSTable,UCS) | 列出了用户可能使用的激活的笛卡尔坐标系 | 视窗表(AcDbViewportTable,VPORT) | 定义了平铺视窗的命名集合 | 视图表(AcDbViewTable,VIEW) | 包含图形视图说明 |
除了上述8个符号表外,AutoCAD还有一种特殊的块表(AcDbBlockTable,BLOCK_RECORD)。块表由块容器和所有实体构成。
同其他数据库如MYSQL,ACCESS一样,数据库有数据表组成,而表又有记录组成。每个符号表只能存储同类对象,符号表内的对象被称作符号表记录。
每个数据库表的所有记录都有"name"字段,作为记录的关键字或描述符,类似与数据库表中的KEY(主关键字)。关键字是一个字符串并且要求"唯一”。以防止数据重复和数据完整。只有一个例外,那就是AcDbViewPortTable允许重复的关键字。
符号表内关键字的字符大小写无关。除了主关键字外,符号表中的记录还有其他一些字段(Feild),比如层表记录还包含层的颜色,线型等其他属性的字段。
-------------------华丽的符号表的分割线----------------------------------------------------------------------------
2、2 理解“词典”
上面我们谈的"符号表“中的记录必须是同类的,然而我们在处理图形的时候不可避免的要处理大量不同种类的对象或记录。因此对应符号表来说,AutoCAD图形数据库提供了包含更加灵活对象的容器,这个容器就叫”词典“。
每个词典都是任意对象的一个容器,词典中的每个对象成为记录。词典可以包含任意对象甚至可以包含另外的词典。把完备的词典放入另外一个词典中,就可以创建词典的树形层级结构。树的根部是”根“词典,根的词典不包含于其他任何词典,是独立的。
词典的每条记录也是由关键字区分,不同于符号表,词典中的关键字大小写相关的。
重要提示:没有可视特性以及不是符号表记录的所有对象都必须录入词典,也就是图形数据库中每个对象都必须有家。词典和符号表外,没有不具有可视特性的对象。
现在大家知道了,不可见的对象被存放到哪里了,但是那些具有图形描述的,我们能看得见的图形对象放哪里呢?具有图形描述的对象被称为”实体“,实体也被录入”容器“,存放实体的容器叫做”块表“。一个图形数据库可以包含任意数量的块,于词典一样,块也有一个根容器。但不叫”根块“。因为块没有图形描述,块容易也不是词典,它是符号表,即块表。
任何快都能可视化显示,AutoCAD图形编辑器直接与名字叫”*MODEL_SPACE"的块表互相作用,只有在“*MODEL_SAPCE"块表中的对象才是可见的。
总结:
1、AutoCAD是一个数据库。
2、同其他数据库一样,数据库由表组成,而表又由记录组成,记录有字段组成。
3、表中记录由关键字区别和检索,符号表里面记录关键字大小写无关,词典里面记录关键字大小写相关。
4、符号表是同类对象的集合,词典中对象可以种类不同甚至词典可以嵌套词典。词典是个以”根词典“为基的树。
3、AutoCAD数据下所有非可见对象放在符号表和词典两个容器中。可见对象(实体)放在特殊的符号表(块表)中。
-------------------华丽的总结的分割线----------------------------------------------------------------------------
词典应用范例:
【题目】利用entmod函数,修改wipeout边框是否显示的方法。
1. //修改WIPEOUT frame 为OFF
- Command: wipeout
- Select first point or [Frame/New from Polyline] <New>: f
- Select an option [OFF/ON] <ON>: off
- Regenerating model.
复制代码 2. //得到命名对象词典对象 - Command: (setq e (xdrx_object_get "dictionary"))
- <图元名: 40075cd0>
3. //查看对象定义,发现命名对象词典下有个acad_wipeout_vars的子词典。
- Command: (entget e)
- ((-1 . <图元名: 40075cd0>) (0 . "DICTIONARY") (330 . <图元名: 0>) (5 . "1A")
- (100 . "AcDbDictionary") (280 . 0) (281 . 1) (3 . "ACAD_GROUP") (350 . <图元名:
- 40075cc0>) (3 . "ACAD_LAYOUT") (350 . <图元名: 40075d68>) (3 .
- "ACAD_MLINESTYLE") (350 . <图元名: 40075cc8>) (3 . "ACAD_PLOTSETTINGS") (350 .
- <图元名: 40075d70>) (3 . "ACAD_PLOTSTYLENAME") (350 . <图元名: 40075d58>) (3 .
- "ACAD_WIPEOUT_VARS") (350 . <图元名: 40075da0>))
复制代码 4。得到命名对象词典下的acad_wipeout_vars子词典对象  - Command: (setq e (xdrx_object_get "dict" "acad_wipeout_vars"))
- <图元名: 40075da0>
5。得到对象的数据定义,组码70即为FRAME的设置
- Command: (setq ed (entget e))
- ((-1 . <图元名: 40075da0>) (0 . "WIPEOUTVARIABLES") (5 . "64") (102 .
- "{ACAD_REACTORS") (330 . <图元名: 40075cd0>) (102 . "}") (330 . <图元名:
- 40075cd0>) (100 . "AcDbWipeoutVariables") (70 . 0))
6。修改entget数据定义,将组码70改为1 
- Command: (setq ed (subst '(70 . 1) (assoc 70 ed) ed))
- ((-1 . <图元名: 40075da0>) (0 . "WIPEOUTVARIABLES") (5 . "64") (102 .
- "{ACAD_REACTORS") (330 . <图元名: 40075cd0>) (102 . "}") (330 . <图元名:
- 40075cd0>) (100 . "AcDbWipeoutVariables") (70 . 1))
7。;;更新数据
- Command: (entmod ed)
- ((-1 . <图元名: 40075da0>) (0 . "WIPEOUTVARIABLES") (5 . "64") (102 .
- "{ACAD_REACTORS") (330 . <图元名: 40075cd0>) (102 . "}") (330 . <图元名:
- 40075cd0>) (100 . "AcDbWipeoutVariables") (70 . 1))
复制代码 8。查看结果,现在FRAM为ON了,证明修改生效了。- Command: wipeout
- Select first point or [Frame/New from Polyline] <New>: f
- Select an option [OFF/ON] <ON>: *Cancel*
复制代码 |