请问如何读取文本内容到剪切板上,删除原来文本
本帖最后由 wgij007 于 2021-1-9 21:00 编辑请问如何读取文本内容到剪切板上,删除原来文本
3楼问题也有效.
wgij007 发表于 2021-1-9 22:10
这个我知道,主要是顺序不一样,我要的是从下到下的顺序,还有在中间加一空格。
vl函数不太懂,用点复杂的方式实现
(ZML-CLIP-SETSTRING txtcon) 函数还是用的原作者的
(defun c:RQ( / txtss N Textdxf textstr textpoint1 txtlst txtcon txt)
(setq txtss (ssget '((0 . "*TEXT"))))
(if txtss
(progn
(setq txtcon "")
(setq N (sslengthtxtss))
(repeat N
(setq textdxf(entget (ssname txtss (setq N (1- N)))))
(setq textstr (cdr (assoc 1 textdxf)))
(setq textpoint1 (cadr (cdr (assoc 10 textdxf))))
(setq txtlst (cons (cons textpoint1 textstr ) txtlst))
)
)
)
(setq txtlst(vl-sort txtlst'(lambda(a b)(> (car a)(car b)))))
(foreach txt txtlst
(setq txtcon (strcat txtcon " " (cdr txt)))
)
(setq txtcon (substr txtcon 2))
(ZML-CLIP-SETSTRING txtcon)
(princ)
)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=181497&highlight=%BC%F4%C7%D0%B0%E5 非常感谢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 txtconv "\n00001111 ")));"\n00001111 ")説明 这部分是在剪切板后面固定添加这部分内容
(setq txtcon (apply '(lambda (v) (setq txtcon (strcat txtconv "")))
(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)
)
你是想把好几个文字 在剪切板里连起来吗?直接全选择几个文字后运行代码直接就可以吧。选几个连接几个 xj6019 发表于 2021-1-9 21:52
你是想把好几个文字 在剪切板里连起来吗?直接全选择几个文字后运行代码直接就可以吧。选几个连接几个
这个我知道,主要是顺序不一样,我要的是从下到下的顺序,还有在中间加一空格。 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)
)
这个从上向下排,如何改呀,谢谢 本帖最后由 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组码排序。
如果要从下往上就,把大于改为小于号。
你大概是想合并字符串吧
(defun c:twt()
(while (setq ss (ssget '((0 . "text")))) (setq txtcon "")
(setq N (sslength ss))
(repeat (setq N (sslength ss))
(setqtxtname (ssname ss(setq N( 1- N))))
(setqtxtdxf(entget txtname ))
(setqtxtlst(cons txtdxftxtlst ))
(entdel txtname)
);得到dxf列表
(setq txtlst(vl-sort txtlst'(lambda(a b)(> (cadr (cdr (assoc 10 a))) (cadr (cdr (assoc 10 b)))))))
(setq enddxf (last txtlst))
;按坐标y排序完成,获取最后dxf
(foreach a txtlst
(setq txtcon (strcat txtcon " " (cdr (assoc 1 a))))
);获取字符串
(setq txtcon (substr txtcon 2))
;去除开头空格
(setq enddxf (subst (cons 1 txtcon) (assoc 1 enddxf) enddxf))
(entmake enddxf) ;由于对象都删除了因此需要重建一个
)
(princ)
)
页:
[1]