lisp实战文库_利用AutoLISP管理图形数据库.ppt

利用AutoLISP管理图形数据库.ppt

第5章 利用AutoLISP管理图形数据库,AutoCAD既是一个绘图软件包,又是一个图元数据管理系统,它在生成图形的同时也记录下了图元的数据和信息,利用AutoLISP提供的数据库操作函数,可对当前的图形数据库进行检索、编辑和修改,从而更新屏幕图形。,5.1 选择集的处理,所谓选择集是指图形中选定的部分图元或所有图元的集合。 Auto LISP提供了选择以下六种有关选择集的处理函数 1 ssget-创建选择集 2 ssadd-把图元加到选择集中 3 ssdel-从选择集中删除图元 4 sslength测定选择集中的图元数 5 ssname从选择集中获取图元名 6 ssmemb测试图元是否为选择集成员,5.1.1 创建选择集,调用格式1ssget 方式 点1 点2 有如下形式 1 ssget 不带任何参数,请求进行一般图元选择。 2 ssget 20 35 选择通过点“20 ,35”的图元。 3 ssget “L” 选择最新加入数据库的图元。 4 ssget “P” 选择前一次已选择过的图元。 5 ssget “W” 0 0 5 5 选择窗口内的图元。 6 ssget “C” 0 0 5 5 选择窗口涉及的图元。 7 ssget “wp” 点1 点2 多边形窗口方式选择。 8 ssget “cp” 点1 点2 多边形窗叉方式选择。 9 ssget “F” 点1 点2 折线方式选择。 10 ssget “X” 选择全部图元。,调用格式2ssget “X” 过滤表,例如 ssget “x” 0 . “CIRCLE” -选择所有的圆。 ssget “x” 8 . “3” 选择层3上的所有图元。 ssget “x” 0 . “CIRCLE” 8 . “3” 62 . 1 选择层3上红颜色的圆。 说明 1)用ssget函数只能选择主图元 ,而不能选择子图元。 2)选择集可以保存于AutoLISP变量中。如 setq s1 ssget “x” 0 . “LINE” 8 . “3” 3)选择集中的图元是唯一的。 4)当前图形中建立的选择集数量不能多于128个,如果超过这个极限,则ssget函数将返回nil。,过滤DXF码,构造选择集举例,1通配符模式,过滤器序列中指定的符号名称可包含通配符模式,常用的通配符如下 匹配任何单个字符 匹配任何单个字母 匹配任何单个数字 . 匹配除字母和数字之外的任何单个字符 * 匹配任何字符串,包括null串 - 匹配连字符范围内的字符,如1-5 通配符可单独使用,也可组合使用,其中最常用的是“*” 和“”。例如 (setq s ssget “X” 8 . “A*” ;表示层名第一个子母为A的所有层均被加入选择集。,2关系测试, 等于 / 不等于 大于 大于等于 * 恒为真 所有半径大于20的圆加入选择集。,3逻辑分组,通过应用逻辑分组运算符,可以创建更为复杂的多层嵌套关系测试。 逻辑分组运算符如下 与运算,测试一个或多个DXF组 或运算,测试一个或多个DXF组 异或运算,测试两个DXF组 非运算,测试一个DXF组 例如 setq s ssget “X” -4 . “” 表示创建由1层或2层上的图元组成的选择集。,5.1.2 操作选择集,1 ssadd 图元名选择集;向选择集中加入图元 建立空集-setq s1 ssadd 建立只有一个图元的选择集- setq s2 ssadd 图元名 2 ssdel 图元名选择集;从选择集中删除图元 3 sslength 选择集 ;获取选择集中图元个数 (说明使用sslength应保证所构造的选择集不为nil. 4 ssname 选择集序号;获取选择集中图元名 5 ssmemb 图元名选择集;测试指定图元是否为 选择集中成员。是则返回该图元名,否则返回nil. 若要释放选择集s,可执行 setq s nil,5.1.3 选择集操作函数实例,例1选择屏幕上要保留的图形,删除其它为被选种的图形。 defun cremainder / s1 s2 s3 n ent setq s1 ssget s2 ssget “x” if not s1 command “erase” s2 “” progn setq s3 ssadd n 0 repeat sslength s2 setq ent ssname s2 n if not ssmemb ent s1 ssadd ent s3 setq n 1 n;repeat command “erase” s3 “” “redraw”;progn ;if ;end,例2改变现行图形中所有文本的尺寸大小,defun cchtxt / a ts n index b1 b c d b2 setq a ssget “X” 0 . “TEXT” setq ts getdist “nEnter new text size” setq n sslength a setq index 0 repeat n setq b1 entget ssname a index setq index index 1 setq c assoc 40 b1 setq d cons car c ts setq b2 subst d c b1 entmod b2;repeat ;end,5.2 处理图元对象,AutoLISP提供了下列用于图元对象处理的函数 Entlast 获取图形数据库中最后一个图元名 Entnext 获取图形数据库中下一个图元名 Entsel 选择图元并获取图元名 Handent 获取带有指定句柄的图元名称 Nentsel 选择图元并获取子图元名 Nentselp 获取子图元名 Entget 获取图元数据表 Entmod 更新图元数据 Entupd 更新复杂图元的屏幕显示 Entmake 创建图元 Entdel 删除指定图元,5.2.1 获取图元名称,图元名是一个指向AutoCAD图形编辑程序的文件指针,只有通过图元名,才能对图形数据库中图元进行访问、编辑和修改。因此,在对图元进行编辑修改之前,获取图元名是非常重要的。 1.按图元顺序获取图元名称 entnext -获取图形数据库中第一个图元名称 entnext 图元名 -获取该图元之后的图元名 entlast -获取最后一个图元的名称 例如setq e1 entnext 返回 setq e2 entnext e1 返回第二个图元名 setq e entlast 返回最后一个图元名,2.按图元位置获取图元名称,entsel 提示串 -返回图元名坐标点表 entsel -提示串缺省将出现Select objects 例编程在屏幕上画一条线和一个圆,并过圆心向直线作垂线。 defun cents command “line“ 10 10 80 80 command “circle“ “30,100“ 40 setq pt1 cadr entsel “select a line“ setq pt2 cadr entsel “setlect a circle“ setq pt3 osnap pt2 “cen“ command “line“ pt3 osnap pt1 “per“ ;end,程序运行结果,3. 图元句柄及其用法,由于在每次绘图时图元名都可能变化,这使得在某些场合应用图元名不方便。而图元句柄在图形整个生命周期中都是不变的,因此,如果应用程序在不同时刻必须引用同一图形中的同一对象时,最好使用图元句柄。 调用格式handent 图元句柄 功能返回当前编辑期间使用的与图元句柄对应的图元名。 例handent “5A2” 返回 4. 获取子图元名 nentsel 提示串 ;返回复杂图元的子图元名 nentselp 图元上指定点 ;同上,5.2.2 修改图元数据,1)获取图元数据表 调用格式entget 图元名 功能返回一个该图元名定义的图元的数据表。 例如在屏幕上用“CIRCLE”命令画了一个圆,其中圆心坐标点为“200,200”,半径为50。 为了在屏幕上以缩进形式显示该图元数据表的内容,变成如下 defun cpe setq a entlast aa entget a c 0 textscr princ “nData of last entity“ repeat length aa terpri princ nth c aa setq c 1 c;repeat princ ;end,程序运行后,图元数据表显示如下,Data of last entity -1 . 0 . CIRCLE 330 . 5 . 2D 100 . AcDbEntity 67 . 0 410 . Model 8 . 0 100 . AcDbCircle 10 200.0 200.0 0.0 40 . 50.0 210 0.0 0.0 1.0,2)修改、更新图元数据,a)接受修改的图元数据表-entmod 调用格式entmod 图元数据表 例如在屏幕上用“LINE”命令画一直线,已知起点坐标为“2,2”,终点坐标为“8,8”。编程修改端点的数据 setq e entlast ;获取图元名 setq el entget e ;获取该图元的数据表 setq el subst 11 20.0 9.0 assoc 11 el el ;修改 entmod el ;接受新的数据表 说明entmod不能更改图元的类型和图元句柄; 图元数据表中须修改的数据在执行entmod之前 必须存在。,b)更新复杂图元屏幕图象-entupd,调用格式entupd 图元名 功能使修改了图元数据的图形在屏幕上更新显示。 主要用于复杂图元的更新,对于简单图元用entmot函数即可更新。 注意在执行entupd函数之前,必须先执行entmod。 例如设图中最后一个图元是一条有若干顶点的多义线, 若要修改多义线的第一个顶点,可编程如下 setq e1 entlast ;置e1为多义线的图元名 setq e2 entnext e1 ;置e2为多义线的第一个顶点 setq ed entget e2 ;置ed为顶点数据表 setq ed subst 10 100.0 200.0 assoc 10 ed ed entmod ed ;改变ed中的顶点位置,修改数据库 entupd e1 ;重新生成多义线图元e1.,5.2.3 增加图元和删除图元,1)用entmake函数创建图元 调用格式entmake 图元数据表 功能根据提供的图元数据表创建图元。 例如创建一个多义线的图元,其顶点为(10,10)、 (10,20)、(20,20),颜色为红色,位于1层上。 entmake 0 . “polyline” 62 . 1 8 . 1 66 . 1 entmake 0 . “vertex” 10 10.0 10.0 0.0 entmake 0 . “vertex” 10 10.0 20.0 0.0 entmake 0 . “vertex” 10 20.0 20.0 0.0 entmake 0 . “seqend” 2 用entdel删除指定图元 调用格式entdel 图元名 ,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值