求助!如何提取括号内文字并拷贝
本帖最后由 yaokui25 于 2012-11-14 11:53 编辑小弟最近遇到一个头疼的事
就是要拷贝例如: PL 330*9*820 N=12
这样的一段字符串[括号内文字] 提取出来,刷其他的文字
如果这样很困的话,提起出来拷贝,粘贴也行,但是最好是刷其他的文字!!!
小弟在这里谢谢大家了
下面是我在论坛上找到的一段代码,求大家完善
如果在选择的过程中可以只选择括号内文字就好了
小弟对LISP不是很了解,但现在正努力学习中,希望大家给与帮助
;;; -------------------------------------------------------------------------
;;; 文本内容刷V2.1命令fa --by 阿甘 2012.9
;;; 支持块中文字(块中文字只能点选,其它文字可以框选)、单行文字、多行文字、天正文字、天正图名、天正标高、属性文字、块中属性文字
(vl-load-com) ; 加载VL函数
(setq source_text nil) ; 设源文字为全局变量
(defun c:fa (/ en en_data en1 en1_data ent entype i ob pt ss ss_data)
(setvar "cmdecho" 0)
(setvar "ErrNo" 0)
(command "_.undo" "_begin")
(if (= source_text nil)
(if (setq en (nentsel "\n请选择源文字(右键退出):"))
(setq en_data (entget (car en))
entype (cdr (assoc 0 en_data))
source_text (if (= entype "ATTDEF")(cdr (assoc 2 en_data))(cdr (assoc 1 en_data)));如果是属性字,则取“标记”为源文字
)
)
(if (and (= (setq en (nentsel (strcat "\n请选择源文字: 默认:" source_text))) nil) (= (getvar "ErrNo") 52))
(setvar "ErrNo" 0)
(if en
(setq en_data (entget (car en))
entype (cdr (assoc 0 en_data))
source_text (if (= entype "ATTDEF")(cdr (assoc 2 en_data))(cdr (assoc 1 en_data)))
)
(setvar "ErrNo" 52)
)
)
)
(prompt "\n请选择要修改内容的文字:")
(while (/= (getvar "ErrNo") 52)
(prompt (strcat "\n文字内容将被刷成:" source_text))
(if (and (setq ss (ssget ":S" '((0 . "*TEXT,TCH_DRAWINGNAME,TCH_ELEVATION,INSERT,ATTDEF,ATTRIB")))) source_text)
(progn
(if (= (caar (setq ss_data (ssnamex ss 0))) 1)
(progn ; 点选时
(setq ent (ssname ss 0)
pt (trans (cadr (last (car ss_data))) 0 1)
en1 (car (nentselp pt))
en1_data (entget en1)
entype (cdr (assoc 0 en1_data))
ob (vlax-ename->vla-object en1)
)
(wenzishua entype ob source_text en1 ent)
(princ)
)
(progn ; 框选时
(setq i 0)
(repeat (sslength ss)
(setq en1 (ssname ss i)
ent en1
en1_data (entget en1)
entype (cdr (assoc 0 en1_data))
ob (vlax-ename->vla-object en1)
)
(wenzishua entype ob source_text en1 ent)
(setq i (1+ i))
) ; end repeat
)
)
)
)
) ; end while
(command "_.undo" "_end")
(setvar "ErrNo" 0)
(setvar "cmdecho" 1)
(princ)
)
(defun wenzishua (entype ob source_text en1 ent)
; cad文字的内容格式刷
(if (or
(= entype "TEXT")
(= entype "MTEXT")
)
(progn
(vla-put-TextString ob source_text)
(entupd en1)
(entupd ent)
)
)
; 天正文字的内容格式刷
(if (or
(= entype "TCH_TEXT")
(= entype "TCH_ELEVATION")
)
(progn
(vlax-put-property ob 'Text source_text)
(entupd en1)
(entupd ent)
)
)
; 天正图名、标高的内容格式刷
(if (= entype "TCH_DRAWINGNAME")
(progn
(vlax-put-property ob 'NameText source_text)
(entupd en1)
(entupd ent)
)
)
; 属性文字 只改"标记"
(if (= entype "ATTDEF")
(progn
(vla-put-TagString ob source_text);改标记
(entupd en1)
(entupd ent)
)
)
; 块中属性文字 只改"默认"
(if (= entype "ATTRIB")
(progn
(vla-put-TextString ob source_text);改默认
(entupd en1)
(entupd ent)
)
)
)
(defun c:tt (/ e1 e2 n n1 n2 s str1)
(while
(progn
(princ "\n选择源文字:")
(and
(setq e1 (ssget ":S" '((0 . "*text"))))
(progn
(setq e1 (ssname e1 0))
(redraw e1 3)
(setq str1 (cdr (assoc 1 (entget e1))))
(setq n1 (VL-STRING-SEARCH "[" str1)
n2 (VL-STRING-SEARCH "]" str1)
)
(and n1 n2 (> n2 n1))
)
)
)
(setq str1 (substr str1 (+ 2 n1) (- n2 n1 1)))
(while (setq s (ssget ":S" '((0 . "*text"))))
(repeat (setq n (sslength s))
(setq e2 (entget (ssname s (setq n (1- n)))))
(entmod (subst (cons 1 str1) (assoc 1 e2) e2))
)
(princ "\n继续选择替换文字,回车结束:")
)
(redraw e1 4)
)
(if e1 (redraw e1 4))
(princ)
)
小弟在线等~~~ 大家都忙着手里的活呢吧,没人理啊 本帖最后由 wowan1314 于 2012-11-14 10:17 编辑
试试--取出括号内文字写入剪切板。子函数论坛上找的。
wowan1314 发表于 2012-11-14 09:59 static/image/common/back.gif
试试--取出括号内文字写入剪切板。子函数论坛上找的。
谢谢,楼上提供的代码,不过小弟不是很了解LISP
只能等待带高手解决了 嘿嘿~ 本帖最后由 phoenixdjq 于 2012-11-14 10:41 编辑
只修改最后面的数字吗
能再具体一点吗
yaokui25 发表于 2012-11-14 10:26 static/image/common/back.gif
谢谢,楼上提供的代码,不过小弟不是很了解LISP
只能等待带高手解决了 嘿嘿~
剪切板内确实提取出我想要的文字。可是我想要的是选择文字之后接下载就是粘贴文字
不想再剪切板内再把文字复制一下,再粘贴
这样的话有点麻烦,嘿嘿
phoenixdjq 发表于 2012-11-14 10:40 static/image/common/back.gif
只修改最后面的数字吗
能再具体一点吗
我是想提取出 PL 330*9*820 N=12这是一个字符串
提取出 1BKW2
去刷其他的文字,使其他文字变为 1BKW2
或者直接提取出 1BKW2之后复制粘贴也可以
发个cad的图吧,我看看,也许 有现成的程序