分享

autolisp

 建筑小不懂 2022-09-06 发布于广东

什么是图元信息

在Autocad中,一条线,一个圆,一个块,都是图元。想要控制某个图元,就要掌握该图元的信息。

获取图元属性

相关函数 功能说明
(entsel) 选择一个图元后,得到这个图元的名称和x,y,z坐标点。
(entget) 根据图元名,得到图元的联合属性。

比如,图纸空间中有一条Line。

  • (entsel)
    获取图元信息(<图元名: 39199820> (23889.0 25547.0 0.0))
  • (car (entsel))
    将图元信息的第一部分提取出来了,得到<图元名: 39199820>
  • (entget (car (entsel)))
    拿到图元名,就可以用entget获取图元的联合属性:
(
  (-1 . <图元名: 39199820>) 
  (0 . "LINE") (330 . <图元名: 2f7ba1f0>) 
  (5 . "2B2")
  (100 . "AcDbEntity")
  (67 . 0) (410 . "Model")
  (8 . "0")
  (100 . "AcDbLine")
  (10 24498.4 26270.7 0.0)
  (11 17109.4 17662.2 0.0)
  (210 0.0 0.0 1.0)
)

这些属性中间有个.,叫做点对
每项属性前面的数字,叫做群码,类似于索引值,方便引用。
不同的图元有共有的属性,也有特有的属性。
观察这些属性,我们应该能看出来,0是图元名称,8是图层,10是line的起点坐标,11是line的终点坐标。

修改图元属性

相关函数 功能说明
(assoc) 查询并获取指定项数据
(cons) 创造一个点对格式的属性
(list) 创造一个列表
(subst) 替换属性
(entmod) 更新状态

得到图元信息后,我们自然就想修改。
想要修改信息,可以使用一下步骤

  • 使用enget函数取得图元属性
  • 使用assoc函数取得现有的某项属性
  • 使用cons函数造一个新的属性
  • 使用subst函数替换属性
  • 使用entmod更新

现在,我们可以试试修改line的起点位置。

  1. 首先,我们要获取图元属性
(setq line_data (entget (car (entsel))))
; 取得图元信息并赋值给变量 line_data
; ((-1 . <图元名: 36e46820>) (0 . "LINE") (330 . <图元名: 2f4e99f0>) (5 . "2B2") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 34425.8 25984.5 0.0) (11 25395.5 15122.9 0.0) (210 0.0 0.0 1.0))
  1. 先把现有的起点坐标取到
(setq old_spoint (assoc 10 line_data))
; (10 34425.8 25984.5 0.0)
  1. 仿照这个点坐标属性的格式,再定义一个新的坐标点属性
    用cons能创造一个点对,但是我们的坐标包含xyz三个值,因此要先用list创建。
(setq new_spoint (cons 10 (list 5.8 26984.5 0.0)))
; 得到了new_spoint
; (10 5.8 26984.5 0.0)
  1. 更新line_data的信息
(setq new_line_data (subst new_spoint old_spoint line_data))

替换的时候要注意,如果old_spoint和图元当前状态匹配不上,替换会不成功。
此时,我们得到了new_line_data,但是,想要图形发生变化,还需要更新下

(entmod new_line_data)

回到autocad,会发现图形已经变化。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多