今天给各位分享AutoCAD二次开发技术AutoLISP(8)的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
entnext 获取数据库中下一个图形对象的原始名称
entsel获取图形屏幕上图形的图元名称和拾取点坐标
handent 获取具有指定句柄的图元的图元名称
nentsel 获取子像素名称
nentselp 获取子像素名称
entget获取元素数据连接表
entmod更新数据库并在屏幕上更新
entupd 更新复杂图元的屏幕显示
entmake 创建原语
entdel 删除指定元素
2.12.1 获取元素名称
基元名称的组码是-1。对图形数据中任何图元数据的访问都必须通过图元名称来执行。
1. 按元素顺序获取图形数据库元素名称。
函数entnext可以遍历整个图形数据库,逐个图元访问图元,并返回图元名称。 (entnext) (entnext 名称)
不带任何参数,调用图形数据库中的第一个图元并返回图元名称。
第二种类型有参数名称(基元的名称),它调用指定基元名称之后的下一个基元名称。如果图形数据库中没有图元,则返回nil。
以下代码访问整个图数据库:
(setq a (entnext))
(同时
……
(setq a (entnext a))
)
函数(entlast)用于获取数据库中最新的图形元素名称,即系统最新生成的图形元素名称。
复杂基元与简单基元不同。它们由一个主基元和一系列子基元组成,并以seqend 结尾。 Entlast 本质上返回数据库中最后一个主要基元的名称。 entnext 函数不区分主基元和子基元。您可以从主图元名称开始向后,直到图元末尾,一一获取子图元的名称。
2.根据元素位置获取元素名称
(entsel 提示字符串)
3.图元素句柄及其使用
(handent句柄) 例如, (handent ‘4’) 获取句柄’4’的原始名称。
原始句柄消除了原始名称更改的问题。句柄是每个原语的唯一标识符。当创建一个新的原语时,会分配一个新的原语句柄;当删除原语时,句柄也会被删除。在同一个图中,没有重复的句柄。图元句柄在整个图形生命周期中保持不变。如果应用程序必须在不同时间引用同一图形中的对象,则可以使用句柄。
4. 获取子像素名称
函数nentsel 和nentselp 用于访问复杂图元的子像素名称。 nentsel 与entsel 类似,不同之处在于它返回复杂基元的子实体名称而不是主基元名称。例如:当我们选择一条折线时,nentsel 返回顶点子图元而不是折线的主图元名称。如果选择简单的图元,则该函数的作用与entsel相同。
nentselp 具有与nentsel 类似的功能。不同的是,使用nentselp时,选项参数不需要交互输入。 (nentselp point) 直接指定图元上的点。
2.12.2 修改元数据
1、获取元素数据连接表
(entget entname)
示例:获取并打印最新图元的数据
(defun c:pc()
(setq a (entlast))
(setq a_list(entget a))
(设置c 0)
(正文页)
(princ ‘\n最后一个实体对象数据:’)
(重复(长度a_list))
(princ(第n 个c a_list))
(setqc(1+c))
)
(原则)
)
2.修改和更新元数据
通过表处理函数可以对各种原始数据连接表进行操作。对于每个点对,可以使用assoc来提取,然后使用car和cdr将它们的值分开,或者用subst替换它们。除了基元名称(组码为-1)和基元类型(组码为0)外,基元数据连接表中的其他数据值都可以修改。
当元素数据连接表修改时,必须使用entmod函数更新图形数据库中的记录。 (entmod data_list) data_list 是新的图形数据表。如果是简单图形,屏幕将重新生成。如果是复杂图形,则会使用entupd函数重新生成屏幕。
在将实体表传递到entmod 函数之前,必须在当前图形中定义表中的文本样式、线条样式、形状或块。除了一个例外,entmod 函数可以接受新的图层名称。
函数endmod可以修改子像素,例如折线和块属性,但它不会在屏幕上重新生成复杂的图形。为此,AutoLISP提供了一个函数entupd,在修改所有子像素数据时使用该函数。在屏幕上重新显示整个复杂图元。 (entupd name) name 是复杂基元的名称。此功能也适用于其他图元的屏幕再生。 entupd 函数的参数名称可以指定原语或子原语。
示例:修改最后一个折线图元的第一个顶点位置并在屏幕上重新生成整个图元
(setq ent_name (entlast))
(setq 子名称(entnext ent_name))
(setq ent_list (entget sub_name))
(设置qd
(替代品
‘(10 10.0 20.0 0.0)
(联合10 天)
d
)
)
(结束模式)
(entupd ent_name)
2.12.2 添加图形元素和删除图形元素
1.使用(entmake data_list)函数创建新的原语
data_list 是有效的原始数据连接表。
示例:(entmake ‘((0 . ‘POINT’) (10 1.0 1.0 1.0)))
如果对每个子基元多次调用entmake 函数,则可能会创建一个复杂的基元。当此函数首次接收复杂基元的初始组件时,它会创建一个用于收集临时数据的临时文件。在每次后续调用entmake 时,该函数都会检查临时文件是否存在。如果存在,则添加新的子像素。当复杂图元的定义结束时,即entmake接收到正确的sepend或endblk子图元时,它会检查图元的一致性,如果正确则将其添加到图形中。当复杂基元的创建完成后,临时文件将被删除。当复杂图元的建立尚未完成时,调用entlast函数无法获取新生成的图元。
entmake 一次只能创建一个复杂的原语。在创建过程中,如果entmake 收到无效数据或错误的子图元,它将中止图元的创建。调用不带参数的entmake 可以取消复杂原语的创建。复杂图元可以同时存在于模型空间和图纸空间中,但不能同时存在于两个空间中。如果在构造复杂原语时由于调用pspace 或mspace 而改变了当前空间,则后续的entmake 调用将取消该原语。
示例:创建多段线基元。线型为实线,颜色为红色。它位于第1 层。其他可选数据采用默认值。
(defun c:creatpline()
(entmake'(
(0 .’折线’)
(62.1)
(6.‘连续’)
(8.’1′)
(66. 1) ;组码66是跟随标记的折线顶点,其值为1,后面是顶点图元序列,最后以seqend子图元结束。
)
)
(entmake'(
(0 .’顶点’)
(10 10.0 10.0 0.0)
)
)
(entmake'(
(0 .’顶点’)
(10 10.0 20.0 0.0)
)
)
(entmake'(
(0 .’顶点’)
(10 20.0 20.0 0.0)
)
)
(entmake ‘((0 . ‘seqend’)))
(原则)
)
2.使用(entdel name)函数删除/恢复一个原语
(setq n (entlast))
(恩德尔n);删除元素
(entdel n) ;恢复原语
注意:对于复杂基元,entdel 只允许对主基元进行操作。要删除多段线的顶点,必须使用命令功能并执行pedit 或attendit。
2.12.3 扩展元数据处理
图形的一些文字描述信息与绘图相关,不能出现在绘图中。为此,CAD 提供了扩展的原始数据。在AutoCAD中,允许多个应用程序将自己的扩展图元数据添加到同一个图元中,因此提供的扩展图元数据的总长度不能超过16384(16K)字节。 AutoLISP还提供以下函数用于扩展原语的数据处理:
regapp:注册扩展元数据的应用程序名称;
xdsize 查询扩展元数据占用的内存量;
xdroom查询图元中剩余的扩展图元数据容量。
如果基元包含扩展基元数据,则扩展基元数据遵循基元的正常定义数据。我们可以使用entget函数来获取基元中的普通定义数据和扩展基元数据。
原始数据结构通常如下所示:
DXF 组代码字段
((-1,-2 原始名称)
(0~239通常定义的数据字段)。。
)
(-3扩展元数据标签)
(1001注册应用名称)
(1000~1071扩展原始数据字段)。。
(1001注册应用名称)
(1000~1071扩展原始数据字段)。。
)
1.将图形数据的组织扩展为DXF组码(请参考相关附件)
2. 注册应用程序名称
(setq appidname ‘MyApp’)
(if (tblsearch ‘appid’ appidname)
(princ(strcat ‘\n’ appidname c))
(程序
(设置寄存器(regapp appidname))
(如果(=寄存器为零)
(princ(strcat’注册’appidname’失败’))
(princ(strcat ‘注册’ appidname ‘成功’))
)
)
)
3.添加扩展元数据
步骤如下: 1) 获取所需图元定义数据的关联表;
2)在AutoCAD appid表中注册新的扩展应用程序名称;
3)构造新的扩展原始数据表;
4) 将构造好的扩展图元数据表添加到图元定义数据关联表中;
5) 使用新的图元定义数据修改图元。
例子:
(setq selectedent(entget(entlast))))
(regapp ‘MyXData’)
(设置myxdata ‘(-3 (‘MyXData’
(1000 ‘这是识别线’)
(1010 100.0 100.0 0.0)
(1040 75.0)
(1070 28)
)
)
)
(setq xdataent
(附加选定的myxdata)
)
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/145005.html
用户评论
灬一抹丶苍白
终于来更新了!一直以来都在苦于AutoCAD这方面的知识点,希望这个系列能让我更好地掌握AutoLISP的使用方法,提升工作效率!
有12位网友表示赞同!
闲肆
以前也学过点AutoLISP,感觉还是挺强大的,可以做很多个性化定制。只是有点难学… 希望这个教程能简单易懂一点.
有10位网友表示赞同!
君临臣
我主要用工程图纸软件, AutoCAAD二次开技术是必备的啊! AutoLISP 我了解了点概念,但还没深入实践过,这篇帖子很有帮助!
有7位网友表示赞同!
别伤我i
AutoLISP真的可以提高效率,不过我是个新手,这个教程能不能浅显易懂一点? 怕学不会 😭
有17位网友表示赞同!
她最好i
我一直觉得AutoCAD自带的命令不够强大,学习 AutoLISP 可以实现很多更复杂的自动化功能。这篇帖子来得正好!
有20位网友表示赞同!
满心狼藉
这个系列之前看了很多篇,感觉讲道理比较清晰,但是代码示例就有点太简易了…希望后面能增加一些复杂案例。
有5位网友表示赞同!
折木
AutoLISP确实很强大,可以写出各种复杂的宏和脚本! 学习成本虽然高一点,但掌握之后真的很划算!
有6位网友表示赞同!
减肥伤身#
我对AutoLISP一直兴趣很大! 希望能看到更多深入的讲解,比如如何调试代码、优化性能等等。
有14位网友表示赞同!
如梦初醒
讲真,我到现在还没明白AutoLISP的概念,感觉有点抽象… 希望这篇帖子能给我一些启蒙!
有10位网友表示赞同!
凉城°
学习AutoCAD也是为了提高工作效率,希望通过学习AutoLISP,能够将工作流程自动化!
有12位网友表示赞同!
相知相惜
AutoCAD二次开技术真的很厉害!不过我的手头工作比较繁忙,现在只能先关注一下基础概念。
有12位网友表示赞同!
伪心
想问下大家, AutoLISP 有哪些实际应用场景呢? 特别是能提升效率的应用案例吗?我很想了解…
有17位网友表示赞同!
人心叵测i
我曾经尝试过用AutoLISP写一个简单的脚本,结果代码写了一两个小时还是没有跑通… 真是受够了!
有7位网友表示赞同!
揉乱头发
希望这个教程能够深入浅出地讲解如何利用 AutoLISP 进行二次开技术开发
有10位网友表示赞同!
遗憾最汹涌
学习了一个多月 AutoLISP 都还没入门…. 希望这篇帖子能让我找到方法!
有12位网友表示赞同!
打个酱油卖个萌
看标题我就知道要讲AutoCAD的编程啦,最近恰好想着学习一下,来试试这个教程吧!期待更多干货内容。
有18位网友表示赞同!
代价是折磨╳
AutoCAD的使用场景很多,学习 AutoLISP 不仅可以提高效率,还能拓展工作能力!
有20位网友表示赞同!
此生一诺
我已经掌握了AutoLISP 的简单操作, 想进一步深入学习复杂应用场景
有18位网友表示赞同!
淡写薰衣草的香
这个系列帖子感觉越来越好了, 希望继续更新下去! AutoLISP 是真的很实用的技能。
有17位网友表示赞同!