明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1131|回复: 15

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

[复制链接]
发表于 2023-3-16 09:19:26 | 显示全部楼层 |阅读模式
本帖最后由 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 (setq  tstr (cdr (assoc 1 (entget zj-en)))   txyz (cdr(assoc 10(entget zj-en))) tx (car txyz)  ty (cadr txyz) ))
                )  
        (str2c tstr) (princ)
)

发表于 2023-3-16 09:27:16 | 显示全部楼层
半径100的圆,用360多边形代替,然后ssget选择360多边形的范围,再进行需要的计算
发表于 2023-3-16 10:11:28 | 显示全部楼层
这个很有意思,最直接上代码吧。说不定不是算法问题,而是代码某些函数拖累速度
发表于 2023-3-16 10:47:52 | 显示全部楼层
想要求助 发代码啊
发表于 2023-3-16 11:02:42 | 显示全部楼层
神秘兮兮的,逻辑合理吗

(ssget "_Wp" ps ....)
http://bbs.mjtd.com/thread-182691-1-1.html
 楼主| 发表于 2023-3-16 11:43:12 | 显示全部楼层
wzg356 发表于 2023-3-16 11:02
神秘兮兮的,逻辑合理吗

(ssget "_Wp" ps ....)

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

点评

不用画圆,有点就行了。  发表于 2023-3-16 11:51
 楼主| 发表于 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> [filter-list])
注意: 字符串参数前加下划线 “_” 可以使 模式字符串 在非英文版的 AutoCAD 里安全运行,建议写上。中文版 AutoCAD 与英文版编码兼容,添加下划线前缀不是必须的。

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

  • (setq pt1 (getpoint "Piont1:"))
  • (setq pt2 (getpoint "Piont2:"))
  • (setq pt3 (getpoint "Piont3:"))
  • (setq pt4 (getpoint "Piont4:"))
  • (setq ss (ssget "c" (list pt1 pt2 pt4 pt4)))





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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-3-16 12:54:01 | 显示全部楼层
本帖最后由 cchessbd 于 2023-3-16 12:58 编辑

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

;删除点(0 0)和点(1000 1000)形成的矩形内的实体(在屏幕外面的也可以),(感谢masterlong)
(defun c:tt2 ()
(setq pt1 '(0  0))            ;窗口左下角点
(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 "")
)

点评

谢谢masterlong!已经优化完毕,速度至少快了几倍。  发表于 2023-3-17 22:24
營幕外能選嗎?  发表于 2023-3-16 15:12
论坛里,我最后悔的就是提供了这个代码。这个代码的使用是有严格限制的  发表于 2023-3-16 14:43
问题基本解决,谢谢各位老大!  发表于 2023-3-16 12:59
发表于 2023-3-16 19:59:48 | 显示全部楼层
  1. (defun c:tt ()
  2.   "删除点(0 0)和点(1000 1000)形成的矩形内的图块和文本实体(在屏幕外面的也可以)"
  3.   (setq p1 '(0 0) ;窗口左下角点
  4.         p2 '(1000 1000) ;窗口右上角点
  5.   )
  6.   (command "zoom" "w" p1 p2)
  7.   (if (setq ss (ssget "w" p1 p2 '((0 . "insert,text"))))
  8.     (command "erase" ss "")
  9.   )
  10.   (command "zoom" "p")
  11.   (princ)
  12. )

点评

这样应该是可以,但我觉得点数量多就比较慢了。。。有违我初衷。  发表于 2023-3-17 22:23
发表于 2023-3-17 22:37:13 | 显示全部楼层
  1. (defun abc (pt rr nn qf / dr p1 pn r0 ss)
  2.   "圆内过滤删除 (abc pt点 rr半径 nn圆周点数 qf过滤表)"
  3.   ;; 实例: (abc '(0 0) 100 36 '((0 . "TEXT") (1 . "*ZK*")))
  4.   (setq  dr (/ (* pi 2) nn 1.)
  5.         r0 0
  6.   )
  7.   (repeat nn
  8.     (setq p1 (polar pt r0 rr)
  9.           pn (cons p1 pn)
  10.           r0 (+ r0 dr)
  11.     )
  12.   )
  13.   (if (setq ss (ssget "wp" pn qf))
  14.     (command "erase" ss "")
  15.   )
  16. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 13:00 , Processed in 0.189341 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表