andy_06 发表于 2022-7-5 16:18:49

 
我能得到的最接近的是。。。。。。。。。
 
(defun C:demo(/ ss i pl_list mt_list mtpt_list sn a b c d e f g h tmp _nearest thelenght)
(setq _relist (lambda (m)
   ((if m vl-remove-if vl-remove-if-not) '(lambda (x)
                        (equal (car f) (car x))) g)))
(if (setq ss (ssget
             '((410 . "Model")(8 . "0gas")
                 (-4 . "<OR")
                      (-4 . "<AND")(0 . "MTEXT")(1 . "#****")
               (-4 . "AND>") (0 . "LWPOLYLINE") (-4 . "OR>")))
      )
        (progn         
                (repeat (setq i (sslength ss))
                      (setq sn (ssname ss (setq i (1- i))))
                            
                              (if (eq (cdr (assoc 0 (setq ent (entgetsn)))) "LWPOLYLINE")
                                    (setq pl_list (cons (list (vlax-curve-getDistAtParam sn
                                                                (vlax-curve-getendparam sn)) sn ) pl_list))
                                    (setq mt_list (cons (list (cdr (assoc 10 ent)) (cdr (assoc 1 ent))) mt_list))
                            )
                            )       
                (while (and (setq a (car mt_list)) pl_list)
                          (setq tmp (mapcar '(lambda (c)
                                        (list c (distance (car a)
                                                       (vlax-curve-getClosestPointTo (cadr c) (car a)))
                                                      (car c) (cadr a)))pl_list))
                                      (setq _nearest (car (vl-sort tmp '(lambda ( d e )
                                                                    (< (cadr d) (cadr e)))))
                                             
                                      pl_list (vl-remove (Car _nearest) pl_list)
                                      mtpt_list (cons (list   (cadddr _nearest) (caddr _nearest)) mtpt_list)
                                      mt_list (cdr mt_list))
                      )
                     
                              (setq mtpt_list (vl-sort mtpt_list
                                                  '(lambda (u v)
                                                  (< (car u) (car v))
                                                  )
                                                  )
                                    
                  )
                        (while (setq f (car mtpt_list))
                         (setq g (cdr mtpt_list))

                               (setq thelenght (rtos
                              (if (setq h (_relist nil))
                                    (progn
                                          (setq g (_relist t))
                                                    (apply '+ (mapcar 'cadr (cons f h))))
                                        (cadr f)) 2 2 ))               
                (princ (strcat "\nThere are "
                               (itoa (if h (1+ (length h)) 1))
                               " MTEXT objects with content \""
                               (car f)
                               "\" on the current tab and the "
                                  (if h "total " "")
                               "length is " thelenght"m."))
                      (setq mtpt_list g)
                      )
              )
)
         (princ)
)
 
我尝试了一些东西,但我必须承认我是一个初学者,所以我有点挣扎!
我所能做的就是替换(-4)。”
现在,它列出了每个场景,但它们是单独列出的。
我的代码如下所示。。。。
当前选项卡上有1个多行文字对象,其内容为“63 Pe”
长度为11.93m。
当前选项卡上有1个多行文字对象,其内容为“63mm Pe”
长度为2.44m。
 
理想情况下,我希望它能做到这一点,但将它们列为每个直径的总数。

Grrr 发表于 2022-7-5 16:20:50

上一个有点相关的线程:
http://www.cadtutor.net/forum/showthread.php?98447-LISP显示多行文字内容&p=671463#post671463
我想知道为什么不将所有名称变体重命名为一个全局名称,即:
63mm PE, 63mm Pe, 63 PE, 63 Pe,-> 63mm PE

pBe 发表于 2022-7-5 16:23:37

 
你几乎做到了,安迪,如果多行文字字符串值总是以PE或PE,PE,PE结尾,那么用
 
(1 . "#*")
 
现在的条件是字符串需要以数字值“#”开头,只要以字母p&e结尾。
下一步是巩固“相似”的价值观……你可以做到,安迪
并学习如何使用代码标记。

andy_06 发表于 2022-7-5 16:26:53

 
再次感谢,下面列出了所有场景。现在唯一的事情是,它将它们列为单独的对象,就像这样。。。
 
当前选项卡上有1个多行文字对象,其内容为“63mm PE”
长度为25.1m。
当前选项卡上有两个内容为“63mm Pe”的多行文字对象,并且
总长20.2m。
 
可以这样列出它们吗(合并):
当前选项卡上有3个多行文字对象,其内容为“63mm Pe”
总长45.3m。
我认为这可能需要寻找数字(63/90/125等)才能起作用。

andy_06 发表于 2022-7-5 16:29:26

 
对不起,我刚刚看到这个帖子,所以你已经知道我的下一个问题了!我会试着让你知道!

pBe 发表于 2022-7-5 16:34:13

 
已经做了,更新了演示代码所在帖子上的例程
 
请尝试用代码标签修复您的帖子

andy_06 发表于 2022-7-5 16:36:33

对不起,下次我会记得的。谢谢你的帮助,代码完全符合我的要求!

andy_06 发表于 2022-7-5 16:39:04

 
嗨,又是我。
 
再次感谢您的代码,我一直在使用它,它工作得很好。
您是否能够将其设置为使多段线的每个长度向上或向下舍入为整数(18.35m=18m/18.65m=19m)?

SLW210 发表于 2022-7-5 16:42:54

请阅读代码发布指南,并编辑代码以包含在代码标记(非HTML标记)中。
Your Code Here=
Your Code Here

andy_06 发表于 2022-7-5 16:46:23

 
希望这是正确的。。。。
 
嗨,又是我。
 
再次感谢您的代码,我一直在使用它,它工作得很好。
您是否能够将其设置为使多段线的每个长度向上或向下舍入为整数(18.35m=18m/18.65m=19m)?
 
(defun C:demo(/ ss i pl_list mt_list mtpt_list sn a b c d e f g h tmp _nearest thelenght)
(setq _relist (lambda (m)
   ((if m vl-remove-if vl-remove-if-not) '(lambda (x)
                        (equal (car f) (car x))) g)))
(if (setq ss (ssget
             '((410 . "Model")(8 . "0gas")
                 (-4 . "<OR")
                      (-4 . "<AND")(0 . "MTEXT")(1 . "#*")
               (-4 . "AND>") (0 . "LWPOLYLINE") (-4 . "OR>")))
      )
        (progn         
                (repeat (setq i (sslength ss))
                      (setq sn (ssname ss (setq i (1- i))))
                            
                              (if (eq (cdr (assoc 0 (setq ent (entgetsn)))) "LWPOLYLINE")
                                    (setq pl_list (cons (list (vlax-curve-getDistAtParam sn
                                                                (vlax-curve-getendparam sn)) sn ) pl_list))
                                    (setq mt_list (cons (list (cdr (assoc 10 ent)) (atoi (cdr (assoc 1 ent)))) mt_list))
                            )
                            )       
                (while (and (setq a (car mt_list)) pl_list)
                          (setq tmp (mapcar '(lambda (c)
                                        (list c (distance (car a)
                                                       (vlax-curve-getClosestPointTo (cadr c) (car a)))
                                                      (car c) (cadr a)))pl_list))
                                      (setq _nearest (car (vl-sort tmp '(lambda ( d e )
                                                                    (< (cadr d) (cadr e)))))
                                             
                                      pl_list (vl-remove (Car _nearest) pl_list)
                                      mtpt_list (cons (list   (cadddr _nearest) (caddr _nearest)) mtpt_list)
                                      mt_list (cdr mt_list))
                      )
                     
                              (setq mtpt_list (vl-sort mtpt_list
                                                  '(lambda (u v)
                                                  (< (car u) (car v))
                                                  )
                                                  )
                                    
                  )
                        (while (setq f (car mtpt_list))
                         (setq g (cdr mtpt_list))

                               (setq thelenght (rtos
                              (if (setq h (_relist nil))
                                    (progn
                                          (setq g (_relist t))
                                                    (apply '+ (mapcar 'cadr (cons f h))))
                                        (cadr f)) 2 2 ))               
                (princ (strcat "\nThere are "
                               (itoa (if h (1+ (length h)) 1))
                               " MTEXT objects with content \""
                               (itoa (car f))
                               "mm PE\" on the current tab and the "
                                  (if h "total " "")
                               "length is " thelenght"m."))
                      (setq mtpt_list g)
                      )
              )
)
         (princ)
)
页: 1 [2]
查看完整版本: LISP计算多行文字和多段线