cluelessguy 发表于 2022-7-6 00:10:12

选择起始点附近的文本

你好
 
我需要提取多段线的长度以及它们的起点和终点附近的一些文本,并将其全部转储到excel中,如下所示:
从到长度
A B 11.23
但首先我需要弄清楚如何选择多段线起点和终点附近的对象。
 
任何帮助都将不胜感激。

Stefan BMR 发表于 2022-7-6 00:21:00

如果你能按层次、风格和/或高度过滤文本,这会有很大帮助。
试试这个
(defun C:TEST (/ sp st i e p1 p2 lp pt)
(if
   (and
   (setq sp (ssget '((0 . "*POLYLINE"))))
   (setq st (ssget "X" '((0 . "TEXT")))); add here more filters (8 . "Text Layer") (7 . "Text Style")
   )
    (progn
      (repeat (setq i (sslength sp))
      (setq i(1- i)
            e(ssname sp i)
            p1 (vlax-curve-getstartpoint e)
            p2 (vlax-curve-getendpoint e)
            lp (cons (list
                         (vlax-curve-getdistatparam e (vlax-curve-getendparam e))
                         (list nil (distance p1 '(0.0 0.0 0.0)) p1)
                         (list nil (distance p2 '(0.0 0.0 0.0)) p2)
                     )
                     lp
               )
      )
      )
      (repeat (setq i (sslength st))
      (setq i(1- i)
            e(entget (ssname st i))
            pt (cdr (assoc 10 e))
            lp (mapcar
                   (function
                     (lambda (pl)
                     (cons (car pl)
                           (mapcar
                               (function
                                 (lambda (x / d)
                                 (if (< (setq d (distance pt (caddr x))) (cadr x))
                                     (list (cdr (assoc 1 e)) d (caddr x))
                                     x
                                 )
                                 )
                               )
                               (cdr pl)
                           )
                     )
                     )
                   )
                   lp
               )
      )
      )
      (setq lp
      (mapcar
          (function
            (lambda (x)
            (list (caadr x) (caaddr x) (car x))
            )
          )
      lp
      )
      )
      (mapcar 'print lp)      
      (textscr)
    )
)
(princ)
)

cluelessguy 发表于 2022-7-6 00:32:41

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

Stefan BMR 发表于 2022-7-6 00:42:16

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

Lee Mac 发表于 2022-7-6 00:49:38

伟大的代码Stefan
 
以下是另一个版本:
因为我有一些多段线从同一个点开始,还有一些从其他多段线的末端开始。
然而,没有选择这些是怎么回事
4
他们怎么了?
 
再次感谢李的帮助。我在这里学到了不少技巧。

cluelessguy 发表于 2022-7-6 00:55:49

 
没问题-
 
我自动假设存在文本和多段线端点的1:1配对,因此删除了已经配对的文本项,以提高程序在每次迭代中的性能。
 
 
80 = 16 + 64
 
 
 
不客气!

cluelessguy 发表于 2022-7-6 01:07:42

Lee Mac 发表于 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!
页: [1]
查看完整版本: 选择起始点附近的文本