乐筑天下

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

[编程交流] 选择起始点附近的文本

[复制链接]

3

主题

8

帖子

5

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 00:10:12 | 显示全部楼层 |阅读模式
你好
 
我需要提取多段线的长度以及它们的起点和终点附近的一些文本,并将其全部转储到excel中,如下所示:
从到长度
A B 11.23
但首先我需要弄清楚如何选择多段线起点和终点附近的对象。
 
任何帮助都将不胜感激。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 00:21:00 | 显示全部楼层
如果你能按层次、风格和/或高度过滤文本,这会有很大帮助。
试试这个
  1. (defun C:TEST (/ sp st i e p1 p2 lp pt)
  2. (if
  3.    (and
  4.      (setq sp (ssget '((0 . "*POLYLINE"))))
  5.      (setq st (ssget "X" '((0 . "TEXT")))); add here more filters (8 . "Text Layer") (7 . "Text Style")
  6.    )
  7.     (progn
  8.       (repeat (setq i (sslength sp))
  9.         (setq i  (1- i)
  10.               e  (ssname sp i)
  11.               p1 (vlax-curve-getstartpoint e)
  12.               p2 (vlax-curve-getendpoint e)
  13.               lp (cons (list
  14.                          (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
  15.                          (list nil (distance p1 '(0.0 0.0 0.0)) p1)
  16.                          (list nil (distance p2 '(0.0 0.0 0.0)) p2)
  17.                        )
  18.                        lp
  19.                  )
  20.         )
  21.       )
  22.       (repeat (setq i (sslength st))
  23.         (setq i  (1- i)
  24.               e  (entget (ssname st i))
  25.               pt (cdr (assoc 10 e))
  26.               lp (mapcar
  27.                    (function
  28.                      (lambda (pl)
  29.                        (cons (car pl)
  30.                              (mapcar
  31.                                (function
  32.                                  (lambda (x / d)
  33.                                    (if (< (setq d (distance pt (caddr x))) (cadr x))
  34.                                      (list (cdr (assoc 1 e)) d (caddr x))
  35.                                      x
  36.                                    )
  37.                                  )
  38.                                )
  39.                                (cdr pl)
  40.                              )
  41.                        )
  42.                      )
  43.                    )
  44.                    lp
  45.                  )
  46.         )
  47.       )
  48.       (setq lp
  49.         (mapcar
  50.           (function
  51.             (lambda (x)
  52.               (list (caadr x) (caaddr x) (car x))
  53.             )
  54.           )
  55.         lp
  56.         )
  57.       )
  58.       (mapcar 'print lp)      
  59.       (textscr)
  60.     )
  61. )
  62. (princ)
  63. )
回复

使用道具 举报

3

主题

8

帖子

5

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 00:32:41 | 显示全部楼层
您好,Stefan BMR,感谢您提供这段精彩的代码,
很抱歉回复得太晚,我正忙于理解你在那里的魔术,并从中学习。
我有点理解其中的大部分,虽然主要的技巧仍在我脑海中浮现,但我的意思是:
据我所知,它将多段线的起始点(和最终端点)之间的距离和(0.0.0.0)与文本和多段线的起始点之间的距离进行比较,如果第二个距离小于第一个距离,它将与该文本、该文本和起始点之间的距离以及该点的坐标进行列表,长度稍后添加了cons,但它是如何工作的?更多文本更接近起始点(0.0.0.0),它如何总是选择正确的文本。
 
尽管如此,它的工作还是完美无缺的,我添加了几行代码输出到一个名为xls的文本文件中,并按照您的建议对我的层进行过滤,(vl load com)在开始时,它是这样的:
再次非常感谢你的帮助,这真的帮了我很大的忙。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 00:42:16 | 显示全部楼层
嗨,朋友
 
不客气,谢谢你的赞赏。
我用点0,0,0来初始化列表。在每次比较测试中,保留最近的点并用于下一次测试。
我只是选择了一个点,它可以是任何其他点(你可以试试),只要其中一条多段线不在该点上开始(或结束)。
为了确保不会发生这种情况,应使用大于任何文本多段线距离(如1.0e+308)的数字,而不是(距离p1’(0.0 0.0)。
或者,您可以从文本选择集中提取第一个文本的位置,并使用它初始化列表。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 00:49:38 | 显示全部楼层
伟大的代码Stefan
 
以下是另一个版本:
因为我有一些多段线从同一个点开始,还有一些从其他多段线的末端开始。
然而,没有选择这些是怎么回事
  1. 4

他们怎么了?
 
再次感谢李的帮助。我在这里学到了不少技巧。
回复

使用道具 举报

3

主题

8

帖子

5

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 00:55:49 | 显示全部楼层
 
没问题-
 
我自动假设存在文本和多段线端点的1:1配对,因此删除了已经配对的文本项,以提高程序在每次迭代中的性能。
 
 
80 = 16 + 64
 
 
 
不客气!
回复

使用道具 举报

3

主题

8

帖子

5

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 01:07:42 | 显示全部楼层
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 01:16:20 | 显示全部楼层
 
No problem -
 
I had automatically made the assumption that there was a 1-to-1 pairing of text & polyline end points, and hence removed the already paired text items in order to improve the performance of the program with each iteration.
 
 
80 = 16 + 64
 
 

 
You're most welcome!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 21:06 , Processed in 0.491717 second(s), 68 queries .

© 2020-2025 乐筑天下

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