明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1205|回复: 8

[提问] 请问如何读取文本内容到剪切板上,删除原来文本

[复制链接]
发表于 2021-1-9 17:04:16 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 wgij007 于 2021-1-9 21:00 编辑

请问如何读取文本内容到剪切板上,删除原来文本
3楼问题也有效.

最佳答案

查看完整内容

vl函数不太懂,用点复杂的方式实现 (ZML-CLIP-SETSTRING txtcon) 函数还是用的原作者的
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-1-9 17:04:17 | 显示全部楼层
wgij007 发表于 2021-1-9 22:10
这个我知道,主要是顺序不一样,我要的是从下到下的顺序,还有在中间加一空格。

vl函数不太懂,用点复杂的方式实现
(ZML-CLIP-SETSTRING txtcon) 函数还是用的原作者的
  1. (defun c:RQ( / txtss N Textdxf textstr textpoint1 txtlst txtcon txt)
  2. (setq txtss (ssget '((0 . "*TEXT"))))
  3. (if txtss
  4. (progn
  5.   (setq txtcon "")
  6.   (setq N (sslength  txtss))
  7.   (repeat N
  8.         (setq textdxf(entget (ssname txtss (setq N (1- N)))))  
  9.         (setq textstr (cdr (assoc 1 textdxf)))
  10.                 (setq textpoint1 (cadr (cdr (assoc 10 textdxf))))
  11.                 (setq txtlst (cons (cons textpoint1 textstr ) txtlst))
  12.    )
  13.   )
  14. )

  15. (setq txtlst  (vl-sort txtlst  '(lambda(a b)(> (car a)(car b)))))       
  16. (foreach txt txtlst
  17.    (setq txtcon (strcat txtcon " " (cdr txt)))
  18. )

  19. (setq txtcon (substr txtcon 2))
  20. (ZML-CLIP-SETSTRING txtcon)
  21. (princ)
  22. )


回复

使用道具 举报

发表于 2021-1-9 18:33:40 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2021-1-9 20:56:26 | 显示全部楼层
非常感谢2楼。
有没大学神能帮改下.2楼连接里的一段代码,
明经上传图片都说大了,上不了,如下
123
456
789

123 456 789
把上面的文本,改成下面在剪切板里。
原贴在2楼连接里

(vl-load-com)
(defun ZML-CLIP-SETSTRING (STR / HTML RESULT)
  (and (= (type STR) 'STR)
       (setq HTML (vlax-create-object "htmlfile"))
       (setq RESULT (vlax-invoke
                      (vlax-get        (vlax-get HTML 'PARENTWINDOW)
                                'CLIPBOARDDATA
                      )
                      'SETDATA
                      "Text"
                      STR
                    )
       )
       (vlax-release-object HTML)
  )
)



(defun c:RQ()
(vl-load-com)
  (setq txtcon (strcat))
     (setq txtss (ssget '((0 . "*TEXT,DIMENSION"))))
     (setq ssv (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  (setq i 0)
  (setq txtcon (strcat))
  (repeat (vla-get-count ssv)
            ;(setq txtcon (apply '(lambda (v) (setq txtcon (strcat txtcon  v "\n00001111 ")))  ;"\n00001111 ")説明 这部分是在剪切板后面固定添加这部分内容
      (setq txtcon (apply '(lambda (v) (setq txtcon (strcat txtcon  v "")))
                         (progn
                           (if (= (vla-get-ObjectName (vla-item ssv i)) "AcDbRotatedDimension")
                               (progn (if (= (vla-get-TextOverride (vla-item ssv i)) "")
                                      (setq pt (rtos (vla-get-Measurement (vla-item ssv i)) 2 2))
                                      (setq pt (vla-get-TextOverride (vla-item ssv i)) )))
                               (setq pt (vla-get-TextString (vla-item ssv i)))
                           )
                            (list pt)
                          )))
            (setq i (1+ i))
            )
  (ZML-CLIP-SETSTRING txtcon)
(princ)
)


回复

使用道具 举报

发表于 2021-1-9 21:52:44 | 显示全部楼层
你是想把好几个文字 在剪切板里连起来吗?直接全选择几个文字后运行代码直接就可以吧。选几个连接几个
回复

使用道具 举报

 楼主| 发表于 2021-1-9 22:10:44 | 显示全部楼层
xj6019 发表于 2021-1-9 21:52
你是想把好几个文字 在剪切板里连起来吗?直接全选择几个文字后运行代码直接就可以吧。选几个连接几个

这个我知道,主要是顺序不一样,我要的是从下到下的顺序,还有在中间加一空格。
回复

使用道具 举报

 楼主| 发表于 2021-1-13 18:59:48 | 显示全部楼层
muwind 发表于 2021-1-9 17:04
vl函数不太懂,用点复杂的方式实现
(ZML-CLIP-SETSTRING txtcon) 函数还是用的原作者的

(defun c:twt()
  (setq ss (ssget '((0 . "text"))))
  (while (/= nil ss)
    (progn
  (if ss
    (progn
      (setq en (ssname ss 0))
      (setq txt (cdr (assoc 1 (setq enl (entget en)))))
      (ssdel en ss)
      (repeat (sslength ss)
        (setq e (ssname ss 0))
        (ssdel e ss)
        (setq txt (strcat txt (cdr (assoc 1 (entget e)))))
        (entdel e)
        )
      (setq enl (subst (cons 1 txt) (assoc 1 enl) enl))
      (entmod enl)
      )
    )
  (setq ss (ssget '((0 . "text"))))
  )
    )
  (princ)
  )

这个从上向下排,如何改呀,谢谢
回复

使用道具 举报

发表于 2021-1-13 22:00:06 | 显示全部楼层
本帖最后由 muwind 于 2021-1-13 22:05 编辑
wgij007 发表于 2021-1-13 18:59
(defun c:twt()
  (setq ss (ssget '((0 . "text"))))
  (while (/= nil ss)

直接排序应该是不能的,先构成一个表,然后获取Y值排序
我之前用了比较复杂的方式就是先获取了文字内容和坐标Y 构成点对进行排序,其实可以直接DXF组码排序。
如果要从下往上就,把大于改为小于号。
回复

使用道具 举报

发表于 2021-1-13 23:50:15 | 显示全部楼层
你大概是想合并字符串吧  
  1. (defun c:twt()

  2.   (while (setq ss (ssget '((0 . "text"))))       (setq txtcon "")
  3.       (setq N (sslength ss))
  4.       (repeat (setq N (sslength ss))
  5.         (setq  txtname (ssname ss  (setq N( 1- N))))
  6.         (setq  txtdxf  (entget txtname ))        
  7.         (setq  txtlst  (cons txtdxf  txtlst ))                        
  8.         (entdel txtname)
  9.        );得到dxf列表
  10.            (setq txtlst  (vl-sort txtlst  '(lambda(a b)(> (cadr (cdr (assoc 10 a))) (cadr (cdr (assoc 10 b)))))))
  11.            (setq enddxf (last txtlst))
  12.            ;按坐标y排序完成,获取最后dxf
  13.            (foreach a txtlst
  14.           (setq txtcon (strcat txtcon " " (cdr (assoc 1 a))))
  15.         );获取字符串
  16.            (setq txtcon (substr txtcon 2))
  17.            ;去除开头空格
  18.       (setq enddxf (subst (cons 1 txtcon) (assoc 1 enddxf) enddxf))
  19.       (entmake enddxf) ;由于对象都删除了因此需要重建一个
  20.       )
  21.   (princ)
  22.   )



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 06:32 , Processed in 0.183085 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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