明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4813|回复: 28

求助!如何提取括号内文字并拷贝

  [复制链接]
发表于 2012-11-14 08:17:39 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 yaokui25 于 2012-11-14 11:53 编辑



小弟最近遇到一个头疼的事
就是要拷贝例如:[1BKW2] 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)
    )
  )
)


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

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-11-14 08:17:40 | 显示全部楼层
  1. (defun c:tt (/ e1 e2 n n1 n2 s str1)
  2.   (while
  3.     (progn
  4.       (princ "\n选择源文字:")
  5.       (and
  6.         (setq e1 (ssget ":S" '((0 . "*text"))))
  7.         (progn
  8.           (setq e1 (ssname e1 0))
  9.           (redraw e1 3)
  10.           (setq str1 (cdr (assoc 1 (entget e1))))
  11.           (setq n1 (VL-STRING-SEARCH "[" str1)
  12.                 n2 (VL-STRING-SEARCH "]" str1)
  13.                 )
  14.           (and n1 n2 (> n2 n1))
  15.           )
  16.         )
  17.       )
  18.     (setq str1 (substr str1 (+ 2 n1) (- n2 n1 1)))
  19.     (while (setq s (ssget ":S" '((0 . "*text"))))
  20.       (repeat (setq n (sslength s))
  21.         (setq e2 (entget (ssname s (setq n (1- n)))))
  22.         (entmod (subst (cons 1 str1) (assoc 1 e2) e2))
  23.         )
  24.       (princ "\n继续选择替换文字,回车结束:")
  25.       )
  26.     (redraw e1 4)
  27.     )
  28.   (if e1 (redraw e1 4))
  29.   (princ)
  30.   )
回复

使用道具 举报

 楼主| 发表于 2012-11-14 08:50:27 | 显示全部楼层
小弟在线等~~~
回复

使用道具 举报

 楼主| 发表于 2012-11-14 09:42:57 | 显示全部楼层
大家都忙着手里的活呢吧,没人理啊
回复

使用道具 举报

发表于 2012-11-14 09:59:04 | 显示全部楼层
本帖最后由 wowan1314 于 2012-11-14 10:17 编辑

试试--取出括号内文字写入剪切板。子函数论坛上找的。

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2012-11-14 10:26:10 | 显示全部楼层
wowan1314 发表于 2012-11-14 09:59
试试--取出括号内文字写入剪切板。子函数论坛上找的。

谢谢,楼上提供的代码,不过小弟不是很了解LISP
只能等待带高手解决了 嘿嘿~

点评

你测试下啊。按你的要求把括号内的文字取出来了。你粘贴就可以了。  发表于 2012-11-14 10:30
回复

使用道具 举报

发表于 2012-11-14 10:40:25 | 显示全部楼层
本帖最后由 phoenixdjq 于 2012-11-14 10:41 编辑

只修改最后面的数字吗
能再具体一点吗
回复

使用道具 举报

 楼主| 发表于 2012-11-14 10:47:04 | 显示全部楼层
yaokui25 发表于 2012-11-14 10:26
谢谢,楼上提供的代码,不过小弟不是很了解LISP
只能等待带高手解决了 嘿嘿~

剪切板内确实提取出我想要的文字。可是我想要的是选择文字之后接下载就是粘贴文字
不想再剪切板内再把文字复制一下,再粘贴
这样的话有点麻烦,嘿嘿

点评

你复制也是把源文字写入剪切板啊。 现在文字内容已经写到剪切板了。你直接粘贴就可以了  发表于 2012-11-14 10:50
不要复制了啊。你点下源文字。然后就可以粘贴了。  发表于 2012-11-14 10:48
回复

使用道具 举报

 楼主| 发表于 2012-11-14 10:51:09 | 显示全部楼层
phoenixdjq 发表于 2012-11-14 10:40
只修改最后面的数字吗
能再具体一点吗

我是想提取出  [1BKW2] PL 330*9*820 N=12  这是一个字符串
提取出 1BKW2 
去刷其他的文字,使其他文字变为 1BKW2

或者直接提取出 1BKW2  之后复制粘贴也可以
回复

使用道具 举报

发表于 2012-11-14 11:00:53 | 显示全部楼层
发个cad的图吧,我看看,也许 有现成的程序
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:36 , Processed in 0.207343 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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