aloy 发表于 2022-7-5 23:55:28

从数据库中删除点

我在一张图上有很多点,其中一些已经被分配给变量(只有x-y-z坐标)。如何使用lisp从数据库中删除它们。也就是说,在不使用erase命令的情况下将其从图形中删除,该命令也会在该过程中拾取线。
提前感谢

pBe 发表于 2022-7-5 23:59:36

你的描述不太清楚。你到底想删除什么?变量?

aloy 发表于 2022-7-6 00:04:35

对不起,如果描述不清楚。我想在不使用erase命令的情况下从图形(屏幕)中删除点。我认为使用“entdel”从数据库中删除它们是最简单的,不需要选择其他实体,例如可能附加到它们的线。我只有分配给变量的点的坐标;我没有实体名称。所以,问题是如何使用坐标检索实体名称,或者有其他方法吗?

pBe 发表于 2022-7-6 00:06:53

 
你怎么会只得到坐标?将entdel与ssget“X”过滤器选择结合使用有什么错?
 
 
是的,这是可以做到的,但更紧迫的问题是,当您可以在ssget内使用实体类型过滤器时,为什么只需要坐标?
 
Vla也在选项中删除

Tharwat 发表于 2022-7-6 00:12:08

 
这里有一个函数,用于检索实体名称或删除在每个坐标中找到的点。
 

(defun Get_or_Delete (l ent / s lst)
(foreach p l
   (if (setq s (ssget p '((0 . "POINT"))))
   (if ent
       (setq lst (cons (ssname s 0) lst))
       (entdel (ssname s 0))
   )
   )
)
(if (and ent lst)
   (reverse lst)
)
)

 
如果要检索实体名称,请使用上述函数。
 
(Get_or_Delete l t)
 
但如果你想根据他们的坐标删除点。
 
(Get_or_Delete l nil)
 
参数(l)表示坐标列表。

Lee Mac 发表于 2022-7-6 00:16:39

 
使用图形选择方法时要小心,因为只有在选择时在绘图区域内可见的图元才会包含在选择中。
 
相反,我建议迭代图形数据库中的所有点实体,并删除其坐标位于给定列表中的点实体,例如:
调用要删除的点列表,例如:
(delpoints '((32.6266 19.2932 0.0) (26.6098 13.5009 0.0) (34.7406 7.38387 0.0)))

Tharwat 发表于 2022-7-6 00:19:37

 
非常宝贵的观察
非常感谢。

GP_ 发表于 2022-7-6 00:25:11

另外,还要删除重叠点。
 

(defun del_p (lst / pts n)
   (mapcar
       '(lambda (x)
            (if (setq pts (ssget "_X" (list '(0 . "POINT") (cons 10 x))))
                (repeat (setq n (sslength pts))
                  (entdel (ssname pts (setq n (1- n))))
                )
            )
       )
       lst
   )
)


Lee Mac 发表于 2022-7-6 00:28:41

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

pBe 发表于 2022-7-6 00:29:17

 
这正是我自己编写代码的方式。
页: [1] 2
查看完整版本: 从数据库中删除点