cchessbd 发表于 2023-3-16 09:19:26

高手请进:LISP批量步骤中,如何选取指定半径圆内的图元?

本帖最后由 cchessbd 于 2023-3-16 12:49 编辑

抱歉,最近思考太多问题头太晕。简单的说,就是如何让ssget只选择某点,100半径范围以内的"*ZK*"文字。
因为全图至少有几百个这样的文字。

(ssget "x" '((0 . "TEXT") (1 . "*ZK*")))

打算让lisp来代替人。一次进行几百上千次的操作过程。
基本问题就是:大概1k个左右的点。在每个点半径100以内的范围内。过滤选取一些图元。来计算。

现在基本框架搭起来了,就是全图选取计算有点慢。大概是1k*1k*(20-50)计算次数。

所以我希望能在某个已知点,100半径范围内选取。这样就能加快运行速度了。这些点(钻孔圆心)遍历几十公里,所以范围会很大。

(defun c:w1 (/ blk pt ss zj-en)
                (progn
                        (setq pt (getpoint "选取一点获取钻孔文字:" )
                              ss (ssget "x" '((0 . "TEXT") (1 . "*ZK*")))
                              zj-en (sf-pt-enPTs1 pt ss)
                        )
                        (if zj-en (setqtstr (cdr (assoc 1 (entget zj-en)))   txyz (cdr(assoc 10(entget zj-en))) tx (car txyz)ty (cadr txyz) ))
                )
      (str2c tstr) (princ)
)

Dani1988 发表于 2023-3-16 09:27:16

半径100的圆,用360多边形代替,然后ssget选择360多边形的范围,再进行需要的计算

liuhe 发表于 2023-3-16 10:11:28

这个很有意思,最直接上代码吧。说不定不是算法问题,而是代码某些函数拖累速度

飞雪神光 发表于 2023-3-16 10:47:52

想要求助 发代码啊

wzg356 发表于 2023-3-16 11:02:42

神秘兮兮的,逻辑合理吗

(ssget "_Wp" ps ....)
http://bbs.mjtd.com/thread-182691-1-1.html

cchessbd 发表于 2023-3-16 11:43:12

wzg356 发表于 2023-3-16 11:02
神秘兮兮的,逻辑合理吗

(ssget "_Wp" ps ....)


哦,是先画圆再wp选取对吗?我晚上来试一试

cchessbd 发表于 2023-3-16 12:31:48

本帖最后由 cchessbd 于 2023-3-16 12:40 编辑

cchessbd 发表于 2023-3-16 11:43
哦,是先画圆再wp选取对吗?我晚上来试一试
在论坛找到以下代码,不知道是不这样,但是屏幕外选不到?

我又测了一下,出了屏幕确实选不到。 那这样肯定不行。






;窗选择 包含在框内的被选择 相交的不选择和"c"比较一下
;屏幕外的选择不到
(defun c:test23()
(setq pt1 (getpoint))
(setq pt3 (getcorner pt1))
(setq ss (ssget "w" pt1 pt3 '((0 . "insert"))) ssN (sslength ss))
;"wp"后面换成点集 (setq ss(ssget "wp" ptl '((0 . "insert"))))
)


W 窗口(正选)
与 C 参数语法及用法类似,但功能不同,只有在矩形窗口内完整的对象才会被加入选择集。线框模式仅返回绘图区可见对象。
参数语法: (ssget "w" <pt1><pt2> )
注意: 字符串参数前加下划线 “_” 可以使 模式字符串 在非英文版的 AutoCAD 里安全运行,建议写上。中文版 AutoCAD 与英文版编码兼容,添加下划线前缀不是必须的。

CP 圈交(多边形反选)
如果指定了该参数,则必须用构成多边形的点表响应,与多边形相交的对象被加入选择集。线框模式仅返回绘图区可见对象。
参数语法: (ssget "CP" <pt-list>)
此时点参数 不能出现,而且,CP 参数依赖 <pt-list> 的顺序来构成一个多边形。
例如 4 个点按顺序连接为一个 8 字型,而不是一个矩形,ssget 将返回一个空选择集,即使对象与窗口相交。
注意:如果参数为少于 3 个点或者大于 12 个点的表,ssget 将返回一个 nil。
示例:
普通浏览复制代码

[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(setq pt1 (getpoint "Piont1:"))
[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(setq pt2 (getpoint "Piont2:"))
[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(setq pt3 (getpoint "Piont3:"))
[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(setq pt4 (getpoint "Piont4:"))
[*]http://bbs.mjtd.com/source/plugin/imc_colorcode/images/jssc_none.gif(setq ss (ssget "c" (list pt1 pt2 pt4 pt4)))





WP 圈围(多边形正选)
与 CP 参数语法及用法类似,但只有被多边形窗口包围的对象才会被加入选择集。线框模式仅返回绘图区可见对象。
注意:如果参数为少于 3 个点或者大于 12 个点的表,ssget 将返回一个 nil。
参数语法: (ssget "wp" <pt-list>)



cchessbd 发表于 2023-3-16 12:54:01

本帖最后由 cchessbd 于 2023-3-16 12:58 编辑

我又看到以下代码。这个应该可以解决我的问题。

;删除点(0 0)和点(1000 1000)形成的矩形内的实体(在屏幕外面的也可以),(感谢masterlong)
(defun c:tt2 ()
(setq pt1 '(00))            ;窗口左下角点
(setq pt3 '(1000 1000))      ;窗口右上角点
(setq ss (ssget "x"(list
      '(-4 . "<and")
      '(0. "insert,text")
                      '(-4 . ">,>,*")
          (cons 10 pt1)
      '(-4 . "<,<,*")
                        (cons 10 pt3)
                      '(-4 . "and>")
)))
(command "erase" ss "")
)

xyp1964 发表于 2023-3-16 19:59:48


(defun c:tt ()
"删除点(0 0)和点(1000 1000)形成的矩形内的图块和文本实体(在屏幕外面的也可以)"
(setq p1 '(0 0) ;窗口左下角点
        p2 '(1000 1000) ;窗口右上角点
)
(command "zoom" "w" p1 p2)
(if (setq ss (ssget "w" p1 p2 '((0 . "insert,text"))))
    (command "erase" ss "")
)
(command "zoom" "p")
(princ)
)

xyp1964 发表于 2023-3-17 22:37:13


(defun abc (pt rr nn qf / dr p1 pn r0 ss)
"圆内过滤删除 (abc pt点 rr半径 nn圆周点数 qf过滤表)"
;; 实例: (abc '(0 0) 100 36 '((0 . "TEXT") (1 . "*ZK*")))
(setqdr (/ (* pi 2) nn 1.)
      r0 0
)
(repeat nn
    (setq p1 (polar pt r0 rr)
          pn (cons p1 pn)
          r0 (+ r0 dr)
    )
)
(if (setq ss (ssget "wp" pn qf))
    (command "erase" ss "")
)
)
页: [1]
查看完整版本: 高手请进:LISP批量步骤中,如何选取指定半径圆内的图元?