warlock-993 发表于 2022-7-5 16:53:02

Lisp编辑多行文字

大家好,
 
有人能帮我吗。。我在指定层中有许多多行文字,如以下示例所示:
 
2 B32-149
6 B32-154
2 B32-145
40B12@200-150[铃声]
44B12@200-151[铃声]
 
因此,每个多行文字都由以下部分组成:
1.数字(2,6,2,40,44)
2.a空间
3.(B32、B32、B32、B12、B12)
4. "-"
5、数字(149154145150151)
6、、、、、
 
我需要的是编辑整个图形中指定图层的所有多行文字,并
编辑它们以更改“-”后的数字,使其从特定数字开始,增量为1,直到最后一个多行文字。我需要他们像:
 
2 B32-100
6 B32-101
2 B32-102
40B12@200-103[铃声]
44B12@200-104[铃声]
 
这可能吗?
 
我不知道任何关于lisp编程的事情,所以如果有任何帮助,我们将不胜感激

warlock-993 发表于 2022-7-5 16:57:28

如果有人想办法做到这一点,有没有可能让相同的多行文字具有相同的编号?例如:
如果有两个这样的多行文字:
2 B32-100
2 B32-100
我们编辑了第一个,重新编号后,它变成了这样的2 B32-140。。。。我需要第二个是相同的,有相同的数字(140)

Roy_043 发表于 2022-7-5 17:01:04

为什么期望结果中的数字是按顺序排列的?什么决定了这一点?

warlock-993 发表于 2022-7-5 17:04:06

因为我的数字没有顺序和随机性,所以我需要对它们进行排序,以避免任何缺失的数字。
有时数字是这样的:
101-102-103-104-124-125-...
您可以看到104-124之间存在差距,需要对其进行编辑以避免出现这种差距

Roy_043 发表于 2022-7-5 17:07:37

我的意思是:
为什么第一行的数字最小?实体是否排列在一列中,是否应该从上到下重新编号?

warlock-993 发表于 2022-7-5 17:10:13

因为它是图纸中的第一个,是的,如果从上到下重新编号就太好了

Roy_043 发表于 2022-7-5 17:14:01

实体是否在列中?

warlock-993 发表于 2022-7-5 17:18:37

不,他们不是。。。它们散落在图画周围。。。因此,如果有可能使重新编号从左向右开始,然后向下移动

Grrr 发表于 2022-7-5 17:22:45

 
你要求的任务让我想起了这一点。

Roy_043 发表于 2022-7-5 17:26:08

我怀疑排序是否有意义,但无论如何尝试一下:
(defun KGA_Conv_Pickset_To_ObjectList (ss / i ret)
(if ss
   (repeat (setq i (sslength ss))
   (setq ret (cons (vlax-ename->vla-object (ssname ss (setq i (1- i)))) ret))
   )
)
)

(defun KGA_Geom_ObjectMiddle (obj / ptBL ptTR)
(vla-getboundingbox obj 'ptBL 'ptTR)
(mapcar
   '/
   (mapcar '+ (vlax-safearray->list ptBL) (vlax-safearray->list ptTR))
   '(2.0 2.0 2.0)
)
)

(defun ConvSort (objLst)
(mapcar
   '(lambda (i) (nth i objLst))
   (vl-sort-i
   (mapcar '(lambda (obj) (KGA_Geom_ObjectMiddle obj)) objLst)
   '(lambda (a b)
       (if (equal (cadr a) (cadr b) 1e- ; Equal Y.
         (< (car a) (car b))
         (> (cadr a) (cadr b))
       )
   )
   )
)
)

; (ConvStr "40 B12@200-150 " 123) => "40 B12@200-123 "
(defun ConvStr (str n / i)
(strcat
   (substr str 1 (setq i (1+ (vl-string-position 45 str))))
   (itoa n)
   (progn
   (setq str (substr str (1+ i)))
   (while (wcmatch (substr str 1 1) "#") (setq str (substr str 2)))
   str
   )
)
)

(defun c:Conv ( / doc enm lst lyr num ss)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-endundomark doc)
(vla-startundomark doc)
(if
   (and
   (setq enm (car (entsel "\nEntity for layer: ")))
   (setq lyr (vla-get-layer (vlax-ename->vla-object enm)))
   (setq num (getint "\nStart nr.: "))
   (setq num (1- num))
   (setq ss (ssget "_X" (list '(0 . "MTEXT") (cons 8 lyr) '(1 . "*-#*"))))
   (setq ss (ConvSort (KGA_Conv_Pickset_To_ObjectList ss)))
   )
   (mapcar
   '(lambda (obj / str)
       (vla-put-textstring
         obj
         (cond
         ((cdr (assoc (setq str (vla-get-textstring obj)) lst)))
         ((cdar (setq lst (cons (cons str (ConvStr str (setq num (1+ num)))) lst))))
         )
       )
   )
   ss
   )
)
(vla-endundomark doc)
(princ)
)
页: [1] 2
查看完整版本: Lisp编辑多行文字