乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 16|回复: 16

[编程交流] 从数据库中删除点

[复制链接]

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 23:55:28 | 显示全部楼层 |阅读模式
我在一张图上有很多点,其中一些已经被分配给变量(只有x-y-z坐标)。如何使用lisp从数据库中删除它们。也就是说,在不使用erase命令的情况下将其从图形中删除,该命令也会在该过程中拾取线。
提前感谢
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-5 23:59:36 | 显示全部楼层
你的描述不太清楚。你到底想删除什么?变量?
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-6 00:04:35 | 显示全部楼层
对不起,如果描述不清楚。我想在不使用erase命令的情况下从图形(屏幕)中删除点。我认为使用“entdel”从数据库中删除它们是最简单的,不需要选择其他实体,例如可能附加到它们的线。我只有分配给变量的点的坐标;我没有实体名称。所以,问题是如何使用坐标检索实体名称,或者有其他方法吗?
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 00:06:53 | 显示全部楼层
 
你怎么会只得到坐标?将entdel与ssget“X”过滤器选择结合使用有什么错?
 
 
是的,这是可以做到的,但更紧迫的问题是,当您可以在ssget内使用实体类型过滤器时,为什么只需要坐标?
 
Vla也在选项中删除
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 00:12:08 | 显示全部楼层
 
这里有一个函数,用于检索实体名称或删除在每个坐标中找到的点。
 
  1. (defun Get_or_Delete (l ent / s lst)
  2. (foreach p l
  3.    (if (setq s (ssget p '((0 . "POINT"))))
  4.      (if ent
  5.        (setq lst (cons (ssname s 0) lst))
  6.        (entdel (ssname s 0))
  7.      )
  8.    )
  9. )
  10. (if (and ent lst)
  11.    (reverse lst)
  12. )
  13. )

 
如果要检索实体名称,请使用上述函数。
 
  1. (Get_or_Delete l t)

 
但如果你想根据他们的坐标删除点。
 
  1. (Get_or_Delete l nil)

 
参数(l)表示坐标列表。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 00:16:39 | 显示全部楼层
 
使用图形选择方法时要小心,因为只有在选择时在绘图区域内可见的图元才会包含在选择中。
 
相反,我建议迭代图形数据库中的所有点实体,并删除其坐标位于给定列表中的点实体,例如:
调用要删除的点列表,例如:
  1. (delpoints '((32.6266 19.2932 0.0) (26.6098 13.5009 0.0) (34.7406 7.38387 0.0)))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 00:19:37 | 显示全部楼层
 
非常宝贵的观察
非常感谢。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-6 00:25:11 | 显示全部楼层
另外,还要删除重叠点。
 
  1. (defun del_p (lst / pts n)
  2.    (mapcar
  3.        '(lambda (x)
  4.             (if (setq pts (ssget "_X" (list '(0 . "POINT") (cons 10 x))))
  5.                 (repeat (setq n (sslength pts))
  6.                     (entdel (ssname pts (setq n (1- n))))
  7.                 )
  8.             )
  9.        )
  10.        lst
  11.    )
  12. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 00:28:41 | 显示全部楼层
 
好主意GP-
 
但是,请注意,该函数将在整个图形数据库中迭代相当于所提供列表中的点数的次数,这对于大型列表参数来说可能效率低下。
 
此外,我个人会选择foreach而不是mapcar,因为代码没有使用mapcar返回的列表(因此这种内存分配是浪费的),而且foreach在编译代码时会更快。
 
不过,使用ssget过滤器列表的思想,您可以使用以下方法:
  1. 6
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 00:29:17 | 显示全部楼层
 
这正是我自己编写代码的方式。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 21:08 , Processed in 0.369637 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表