明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 695|回复: 8

[提问] 请教各位大神,这个文字合并程序怎么加个X方向距离限制?距离外的单独合并

[复制链接]
发表于 2024-6-29 23:05:58 | 显示全部楼层 |阅读模式
本帖最后由 听见天晴 于 2024-6-29 23:07 编辑

以下是论坛下载的程序,作用的合并单行/多行文字,合并后可以保持原行。
目前文字距离很大的一起选中也会合并到一起,希望大神修改下,添加一个X方向距离限制,文字之间距离小于多少的才和并到一起,大于多少的独立自行合并,距离大的一般在不同图框里的,只需要同一个图框里的那些字合并在一起就好,目前是程序只要在同一行,就会合在一起,请大神帮忙修改一下程序,谢谢!

  1. (defun c:WE (/ sort_text_by_column1 sslst textlst scale)
  2.   ;;按行排列文字,nscale为字高的倍数,设为0.5,即文字竖向间距小于0.5倍字高,则按一行考虑
  3.   (defun sort_text_by_column1
  4.             (sstext  nscale  /       n       rtnlst
  5.              y       rtnlst1 rtnlst2 space1  space2
  6.              aa      bb      cc      dd
  7.             )
  8.     (setq n -1
  9.     rtnlst nil
  10.     )
  11.     (repeat (sslength sstext)
  12.       (setq rtnlst (cons (ssname sstext (setq n (1+ n))) rtnlst))
  13.     )
  14.     (setq rtnlst
  15.      (vl-sort
  16.        rtnlst
  17.        '(lambda (a b)
  18.     (setq a  (vlax-ename->vla-object a)
  19.           b  (vlax-ename->vla-object b)
  20.     )
  21.     (vla-GetBoundingBox a 'aa 'bb)
  22.     (vla-GetBoundingBox b 'cc 'dd)
  23.     (if
  24.       (< (abs (- (vlax-safearray-get-element aa 1)
  25.            (vlax-safearray-get-element cc 1)
  26.         )
  27.          )
  28.          (abs
  29.            (* nscale
  30.         (- (vlax-safearray-get-element bb 1)
  31.            (vlax-safearray-get-element aa 1)
  32.         )
  33.            )
  34.          )
  35.       )
  36.        (< (vlax-safearray-get-element aa 0)
  37.           (vlax-safearray-get-element cc 0)
  38.        )
  39.        (> (vlax-safearray-get-element aa 1)
  40.           (vlax-safearray-get-element cc 1)
  41.        )
  42.     )
  43.         )
  44.      )
  45.     )
  46.     (setq y (cadr (zgx-get-dxf 10 (car rtnlst) 1)))
  47.     (setq rtnlst1 nil
  48.     rtnlst2 nil
  49.     )
  50.     (mapcar
  51.       '(lambda (x)
  52.    (vla-GetBoundingBox (vlax-ename->vla-object x) 'aa 'bb)
  53.    (if
  54.      (< (abs (- (cadr (zgx-get-dxf 10 x 1)) y))
  55.         (* nscale
  56.      (abs (- (vlax-safearray-get-element bb 1)
  57.        (vlax-safearray-get-element aa 1)
  58.           )
  59.      )
  60.         )
  61.      )
  62.       (progn
  63.         (setq rtnlst1 (append rtnlst1 (list x)))
  64.       )
  65.       (progn
  66.         (setq rtnlst2 (append rtnlst2 (list rtnlst1)))
  67.         (setq y (cadr (zgx-get-dxf 10 x 1)))
  68.         (setq rtnlst1 nil
  69.         rtnlst1 (append rtnlst1 (list x))
  70.         )
  71.       )
  72.    )
  73.        )
  74.       rtnlst
  75.     )
  76.     (setq rtnlst2 (append rtnlst2 (list rtnlst1)))
  77.   )
  78.   ;;----------------------------------------------
  79.   (defun zgx-chg-dxf (en code newdata / endata)
  80.     (setq endata (entget en))
  81.     (if  (assoc code endata)
  82.       (setq
  83.   endata (subst (cons code newdata) (assoc code endata) endata)
  84.       )
  85.       (setq
  86.   endata (append endata (list (cons code newdata)))
  87.       )
  88.     )
  89.     (entmod endata)
  90.   )
  91.   (defun zgx-get-dxf (code entname kk)
  92.     (if  (= kk 2)
  93.       (assoc code (entget entname))
  94.       (cdr (assoc code (entget entname)))
  95.     )
  96.   )
  97.   ;;----------------------------------------------
  98.   (prompt "\n选择需要合并的文字[更改间距系数]:")
  99.   (setq sslst (ssget '((0 . "TEXT,MTEXT"))))

  100.   (while (not sslst)
  101.     (setq scale (getreal "\n输入间距系数[默认0.5]:"))
  102.     (if  (not scale)
  103.       (setq scale 0.5)
  104.     )
  105.     (prompt "\n选择需要合并的文字[更改间距系数]:")
  106.     (setq sslst (ssget '((0 . "TEXT,MTEXT"))))
  107.   )

  108.   (if (not scale)
  109.     (setq scale 0.5)
  110.   )
  111.   (setq  sslst  (sort_text_by_column1 sslst scale)
  112.   textlst  (mapcar  '(lambda (c)
  113.          (apply 'strcat c)
  114.        )
  115.       (mapcar  '(lambda (x)
  116.            (mapcar '(lambda (a)
  117.                 (zgx-get-dxf 1 a 1)
  118.               )
  119.              x
  120.            )
  121.          )
  122.         sslst
  123.       )
  124.     )
  125.   )
  126.   (vla-startundomark
  127.     (vla-get-ActiveDocument (vlax-get-acad-object))
  128.   )
  129.   ;;改变每行第一个文字值
  130.   (mapcar '(lambda (a b)
  131.        (zgx-chg-dxf (car a) 1 b)
  132.      )
  133.     sslst
  134.     textlst
  135.   )
  136.   (setq  sslst (apply 'append
  137.          (mapcar 'cdr
  138.            sslst
  139.          )
  140.         )
  141.   )
  142.   (foreach n sslst
  143.     (entdel n)
  144.   )
  145.   (vla-endundomark
  146.     (vla-get-ActiveDocument (vlax-get-acad-object))
  147.   )
  148.   (princ "\n文字合并结束!")
  149.   (princ)
  150. )








本帖子中包含更多资源

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

x
发表于 2024-6-30 00:20:41 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-6-30 01:49 编辑

哈哈,这个对于你来说还是太难了.
如果敲lisp的大概率会想同一行超过多少就认为是另一组文字,
然后这个距离由用户自己输入.
最简单就是包围盒距离,简单说就是rect1.right到rect2.left

如果敲net/c++的想,怎么自适应这个全局分堆,分堆就自然是另一行.

你扩展了14#问题了,加油
http://bbs.mjtd.com/thread-187082-2-1.html

 楼主| 发表于 2024-6-30 11:37:11 | 显示全部楼层
你有种再说一遍 发表于 2024-6-30 00:20
哈哈,这个对于你来说还是太难了.
如果敲lisp的大概率会想同一行超过多少就认为是另一组文字,
然后这个距 ...

就是不会啊,看看有没有大神帮忙改一下
发表于 2024-6-30 13:20:39 | 显示全部楼层
同行文字按照包围盒X排序,然后顺次计算前后包围盒的间距,大于指定距离就分隔。相当于根据包围盒间距分组。
发表于 2024-6-30 17:21:09 | 显示全部楼层
听见天晴 发表于 2024-6-30 11:37
就是不会啊,看看有没有大神帮忙改一下

自己动手丰衣足食,哪有人天天帮你改呢
发表于 2024-6-30 19:00:26 | 显示全部楼层
为什么不弄两次呢
 楼主| 发表于 2024-6-30 21:10:21 | 显示全部楼层
咏郡 发表于 2024-6-30 19:00
为什么不弄两次呢

可以弄多次,但是一次更方便
 楼主| 发表于 2024-6-30 21:30:47 | 显示全部楼层
kozmosovia 发表于 2024-6-30 13:20
同行文字按照包围盒X排序,然后顺次计算前后包围盒的间距,大于指定距离就分隔。相当于根据包围盒间距分组 ...

谢谢,我不太会,去试试~
发表于 2024-7-1 12:04:52 | 显示全部楼层
点进来以为能说的上话,其实我也不懂,哈哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:51 , Processed in 0.202563 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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