CAD二次开发之图形数据库_第1页
CAD二次开发之图形数据库_第2页
CAD二次开发之图形数据库_第3页
CAD二次开发之图形数据库_第4页
CAD二次开发之图形数据库_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CAD二次开发之图形数据库第一页,共34页。9.1获取图元的名字AutoCAD的图形是由多个图形对象组成的,最基本的图形对象称作图元。图元之间是以链表的形式存储的。每个图元都有一个用16进制表示的唯一的名字。

entnext函数可以获取图形库第一个图元的名字或指定图元的下一个图元的名字。

entlast函数可以获取图形库最后一个,即最新生成的图元的名字。通过entnext函数,可以访问到图形库的每一个图元。第二页,共34页。假定本作业依次绘制了一条直线、一个圆和一个圆弧。(setqe1(entnext));返回图形库第一个图元即这条直线的图元名<Entityname:7ef6ce88>,并将其赋给了变量e1。(setqe2(entnexte1));返回图形库e1的下一个图元即这个圆的图元名<Entityname:7ef6ce90>,并将其赋给了变量e2。(setqe3(entnexte2));返回图形库e2的下一个图元即即这个图弧的图元名<Entityname:7ef6ce98>,并将其赋给了变量e3。

(setqe4(entlast));返回图形库最后一个图元即这个图弧的图元名<Entityname:7ef6ce98>,并将其赋给了变量e1。因为圆弧既是第3个图元,也是最后一个图元,所以e3和e4记录的是同一图元的名字。第三页,共34页。【例9-1】绘制下图所示的4个带有中心线的螺纹孔。要求首先获取中心线的螺纹孔的图元名,然后复制这些指定名字的图元。以下表达式首先生成了两条中心线和1个螺纹孔。在生成这些图元的同时获取并保存了这些图元的名字为e1、e2、e3和e4。第四页,共34页。

(command"layer""m""zhongxin""l""center""""")(command"line""-5,0""5,0""")(setqe1(entlast))(command"line""0,-5""0,5""")(setqe2(entlast))(command"layer""m""cuxian""lw"0.3"""")(command"circle""0,0"3)(setqe3(entlast))第五页,共34页。(command"layer""m""xixian""")(command"arc""-3.5,0""0,3.5""0,-3.5")(setqe4(entlast))以下表达式调用AutoCAD的copy命令,复制3个带有中心线的螺纹孔。(command"copy"e1e2e3e4"""m""0,0""12,0""24,0""36,0""")第六页,共34页。[例9-2]定义绘制图b所示图形的命令。插入点p0、直径d、宽度b和h作为绘制该图形时交互输入的参数。该例的主要目的是示范如何利用图元名实现AutoCAD的图形编辑和填充剖面线。ab(defunc:keyway()(setqpc(getpoint"输入定位点:"))(setqd(getdistpc"输入轴的直径:"))(setqb(getdistpc"输入键槽的宽度:"))第七页,共34页。(setqw(getdistpc"输入键槽的深度:"))(setqr(*0.5d))(command"circle"pcr);绘制圆(setqe1(entlast));将entlast返回的该圆的图元名赋给e1(setqp0(polarpc0r));p0是圆上一点,将用于修剪该圆(setqp1(list(carpc)(+(cadrpc)(*0.5b))))(setqp2(list(+(carpc)(*1.2r))(cadrp1)))(command"line"p1p2"")(setqe2(entlast));将entlast返回的该直线的图元名赋给e2(setqp3(list(carpc)(-(cadrpc)(*0.5b))))(setqp4(list(carp2)(cadrp3)))(command"line"p3p4"")第八页,共34页。(setqe3(entlast));将entlast返回的该直线的图元名赋给e3(setqp5(list(+(carpc)(-rw))(+(cadrpc)(*0.5b))))(setqp6(list(+(carpc)(-rw))(-(cadrpc)(*0.5b))))(command"line"p5p6"")(setqe4(entlast));将entlast返回的该直线的图元名赋给e4;e1、e2等作为剪切边,p0、p1等点确定被剪边和剪去哪一段(command"trim"e1e2e3e4""p0p1p2p3p4"");e1、e2等作为剖面域的边界绘制剖面线(command"hatch""ansi31""2""0"e1e2e3e4"");)第九页,共34页。9.2图元表图元表记录着图元的名字、类型、几何数据、图层、颜色等信息。通过修改或创建图元表,可以实现编辑或生成图元。9.2.1获取图元表例如输入下面3个表达式:(command"text""10,20"50"ABCDE");书写文本(setqe(entlast));获取文本的图元名,将图元的名字赋给变量e。(setqelist(entgete));获取图元名字为e的图元表。在"Command:"提示下键入!elist或在控制台"_$"提示下键入elist,即可得到以下该图元的图元表。第十页,共34页。((-1.<Entityname:7ef69500>);图元名(0."TEXT");图元种类(330.<Entityname:7ef67d00>);软指针句柄(5."19F");图元描述字(100."AcDbEntity");AutoCAD图元(67.0);模型空间(410."Model");模型空间标识(8."0");所在图层名(100."AcDbText");AutoCAD文本(1010.020.00.0);定位点坐标(40.5.0);文本字高(1."ABCDE");文本内容第十一页,共34页。(50.0.0);文本的旋转角度(41.1.0);文字的宽度因子(51.0.0);文字的倾斜角度(7."STANDARD");字样的名字(71.0);正常文本(非左右或上下镜像的文本)(72.0);左下角点对齐方式(110.00.00.0);辅助的定位点坐标(2100.00.01.0);厚度方向(100."AcDbText");AutoCAD文本(73.0);不垂直书写)第十二页,共34页。对图元表的补充说明:(1)图元表的每个元素还是表,子表的第一个元素是具有一定含义的整数,其含义与图元在DXF(图形交换文件)中实体代码的含义相同(详见AutoCAD有关DXF文件的介绍)。(2)多数的子表采用了点对结构,这样既节省存储空间,也可以简化运算,详见第2.4节数据的存储结构。(3)其他种类图元的图元表的非几何信息部份基本相同,几何信息部份有些差异。9.2.2对图元表的操作假定elist是某图元的图元表。利用AutoLISP有关表处理的函数可以修改图元表。(1)了解图元的种类(cdr(assoc0elist))第十三页,共34页。

该表达式的内层表达式中,用0作为关键字,在elist表中寻找相关的子表,返回有关图元种类的子表(0."图元种类"),由于此表为点对,所以cdr函数返回它的第2个元素"图元种类"。若此图元为直线,则返回"LINE",若此图元为单行文本,则返回"TEXT"。(2)了解图元所在图层的名字(cdr(assoc8elist))该表达式的内层表达式中,用8作为关键字,返回elist表中有关图层名字的子表(8."图层名"),由于此表为点对,所以cdr函数返回它的第2个元素"图层名"。(3)了解圆、圆弧的半径或单行文本的字高(cdr(assoc40elist))该表达式的内层表达式中,用40作为关键字,返回elist表中有关圆、圆弧的半径或单行文本的字高的子表(40.数值),由于此表为点对,所以cdr函数返回它的第2个元素具体的数值。第十四页,共34页。(4)了解直线的起点、圆、圆弧的中心或单行文本的定位点(cdr(assoc10elist))该表达式的内层表达式中,用10作为关键字,返回elist表中有关直线的起点、圆、圆弧的中心或单行文本的定位点的子表(10数值数值数值),注意此表不再是点对,所以cdr函数返回去掉它的第1个元素之后的子表,即点的XYZ坐标。(5)用圆、圆弧的半径或单行文本的新值取代其老值(setqelist(subst(cons40h)(assoc40elist)elist))(cons40h)构造一个新的点对子表,例如(40.3.5)。(assoc40elist)返回elist表内的点对子表,例如(40.5.0)。subst函数用新子表,例如(40.3.5),替换elist表内的老子表(40.5.0)。最外层的setq函数将替换后的赋给了变量elist。(6)更新图形库的图元表(entmodelist)entmod函数的功能是更新图形库的指定图元表的图元,即更新了实际图形对象。例如单行文本的字高由5.0改变为3.5。第十五页,共34页。9.2.3举例【例9-3】定义将本作业所有的单行文本改变为指定高度的命令。右图所示为修改图形数据库内单行文本字高的程序流程图,其中e1是用于存放图元名的变量。单行文本的图元种类是TEXT,用MTEXT书写的是段落文本,它的图元种类是MTEXT。因此本程序不能修改用MTEXT书写的文本。开始输入新的字高h得到第一个图元的名字e1e1的类型是"TEXT"?用新的字高更新e1的图元表e1的名字为nil?令e1为e1的下一个图元名结束否否是是第十六页,共34页。以下是定义改变本作业所有单行文本为指定的高度命令的程序代码:(defunc:cth(/heel)(setqh(getdist"\n输入文本新的字高:"))(setqe(entnext));得到第一个图元的名字(whilee;当e有定义时做以下运算(setqel(entgete));得到第一个图元的图元表(if(="TEXT"(cdr(assoc0el)))(progn;如果图元的类型为"TEXT"时做以下运算(setqel(subst(cons40h)(assoc40el)el));新字高替换图元表的原字高(if(=3(cdr(assoc72el)));如果文本为Align方式对齐第十七页,共34页。(setqel(subst(cons720)(assoc72el)el));忽略第二个定位点)(entmodel);更新图形数据库的el图元表))(setqe(entnexte));令e等于e的下一个图元名)(princ);静默退出)第十八页,共34页。9.3选择集选择集是有名字的一些图元名的集合,常用于编辑或修改图形对象的命令。9.3.1常用的有关选择集的函数(1)(ssget[选择方法][点1[点2]][点表][过滤表])创建一个选择集。有以下一些选择方法。C(Crossing):与点1、点2所确定的窗口相交的那些对象被选中。CP(Cpolygon):与点表所确定的多边形相交的那些对象被选中。F(Fence):与点表所确定的折线相交的那些对象被选中。第十九页,共34页。I(Implied):处于夹取(Grips)状态的那些对象被选中L(Last):最新的、最后绘制的那个图元被选中。由于在多文档环境下最后绘制的对象并不一定是可见的,例如,这个绘图窗口被最小化或未放置在顶层,这时使用该选项将返回nil。P(Previous):上一次创建的选择集。W(Window):整体在点1、点2所确定的窗口之内的那些对象被选中。WP(Wpolygon):整体在点表所确定的多边形之内的那些对象被选中。X:整个数据库,包括被关闭、被冻结图层上的对象和屏幕之外的那些对象被选中。第二十页,共34页。:E:通过光标拾取框的那些对象被选中。:N:在该函数的执行过程中,为选定对象调用ssnamex函数获得容器块和转换矩阵的附加信息。只有通过"W"、"C"和点拾取选择方法时,才可以使用这一附加信息。:S:只允许单一选择集。点1、点2、点表和过滤表是与选择方法配合使用的。过滤表的功能是根据过滤表描述的条件对所选的对象进行筛选,只保留满足过滤条件的对象。过滤表是entget函数返回的图元表中的点对,例如(0."LINE")、(8."LAYER1")、(6."center")、(62.1),点对的第1个元素是图形交换文件中的组码,详见AutoCAD有关DXF文件的介绍。第二十一页,共34页。如果仅提供了一个点,该函数认为用户通过这个点来选择单个的对象。如果省略所有的参数,在调用该函数时将出现"Selectobjects:"提示,这用户以交互方式选择对象。在这种情况下,亮显被选取的对象。该函数忽略当前设置的对象捕捉模式。由于选择集会占用临时文件存储区,所以AutoLISP不允许同时打开128以上的个选择集。如果成功该函数返回创建选择集的名称,例如<Selectionset:1>,否则返回nil。以下是调用该函数的一些表达式。(setqs1(ssget'(22)));创建一个选择集,如果存在一个通过点(2,2)的图元,它将被选中并将返回的选择集的名字赋给变量s1第二十二页,共34页。(setqs2(ssget"w"'(00)'(1010)));创建一个选择集,它的成员是所有整体在对角点(0,0)和(10,10)窗口内的图元,如果成功则将选择集的名字赋给变量s2(setqs3(ssget"X"'((0."LINE")(62.5))));((0."LINE")(62.5))是过滤表,该选择集的成员是当前作业中所有蓝色的直线,如果成功将选择集的名字赋给变量s3(setqs4(ssget));以交互方式创建一个选择集。执行到该表达式时,自动切换到图形窗口,出现"Selectobjects:"提示,等待用户操作。用户此时可用各种选择方法多次选择,直至用空回车响应"Selectobjects:"提示。选择集由交互选择的这些图元组成,将选择集的名字赋给变量s4第二十三页,共34页。(2)(entsel[提示信息])提示用户以单点方式选择单个对象。若省略提示信息,则提示信息为"Selectobject:"。返回值为两个元素组成的表,第一个元素是所选的图元名,第二个元素是用户选择对象时拾取点在当前UCS下的坐标。(3)(ssadd[图元名[选择集]])将指定的图元加入到选择集。如果调用该函数时无参数,将创建一个空选择集;如果只提供图元名,将创建一个仅含该图元的选择集。第二十四页,共34页。(4)(ssdel图元名选择集)从选择集内移去指定的图元。(5)(sslengthss)返回选择集的长度,即选择集内图元的数量。(6)(ssname选择集序号)返回选择集中由序号指定的那个图元名。选择集内第一个元素的序号为零。

第二十五页,共34页。9.3.2举例【例9-4】定义将选到的单行文本改变为指定高度的命令。(defunc:csth(/hs1neel)(setqh(getdist"\n输入文本的高度:"))(setqs1(ssget));以交互方式得到一个选择集(setqn0);序号的初值为0(repeat(sslengths1);重复执行,执行的次数等于所选对象的个数(setqe(ssnames1n));得到选择集内第n个对象的图元名(setqel(entgete));得到这个对象的图元表(if(="TEXT"(cdr(assoc0el)));判断这个对象是否为TEXT

(progn;是TEXT第二十六页,共34页。(setqel(subst(cons40h)(assoc40el)el));用新字高替换图元表的原字高点表(if(=3(cdr(assoc72el)));如果文本为Align方式对齐(setqel(subst(cons720)(assoc72el)el));忽略第二个定位点)(entmodel);更新图形数据库的el图元表))(setqn(1+n));序号n的数量加1))第二十七页,共34页。9.4符号表AutoCAD的符号表是指视窗表、线型表、图层表、字样表、视图表、用户坐标系表、用户应用程序标识表、尺寸式样表和块记录表。在某些情况下,仅从图元表不能了解图元的全部特性,例如当图元的颜色、线型与所在图层一致时,图元表中没有记录颜色、线型的子表,因此,了解这样图元的颜色,就需要访问图层表。9.4.1符号表操作函数(1)(tblnext表的种类[回绕])表的种类可以是"LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK"、"UCS"、"APPID"、"DIMSTYLE"和"VPORT"。若回绕项为T,则返回指定种类的第一个符号表,若该项为nil或缺省,则返回指定种类的当前表符号的下一个符号表。第二十八页,共34页。例如返回图层表,若当前作业的图层名依次是"0"、"layer1"、"layer2"和"layer3"。随时输入表达式(tblnext"layer"T)都返回((0."LAYER")(2."0")(70.0)(62.7)(6."CONTINUOUS"))。因为回绕项为T,所以返回当前作业的第一个图层表。接着输入表达式(tblnext"layer"nil)或(tblnext"layer")返回((0."LAYER")(2."layer1")(70.0)(62.7)(6."CONTINUOUS"))。因为回绕项为nil或缺省,所以返回当前图层表的下一个图层表。同样的操作依次返回layer2、layer3的图层表。再输入这个表达式,将返回nil,因为layer3是最后的图层。第二十九页,共34页。例如返回块定义表,若当前作业已定义了名字为"BOX"的图块,输入表达式(tblnext"block")返回((0."BLOCK")(2."BOX")(70.0)(109.02.00.0)(-2.<图元名:1dca370>))(2)(tblobjname表的种类表名)返回指定种类表的图元名。如果找到,返回符号表的图元名。返回的图元名可以用于entget和entmod操作。例如(tblobjname"layer""0"),返回名字为0的图层表的图元名<Entityname:4002cc80>。第三十页,共34页。

(3)(tblsearch表的种类表名[设置下一个])返回指定种类和名字的符号表。如果"设置下一个"为T,该表将作为定位点,随后调用tblnext函数在不回绕的设置下,就会返回该表的下一个表。例如(tblsearch"layer"""t)返回((0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论