找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5873|回复: 27

[已解决] 求批量替换单行或多行文字的LSP源代码

[复制链接]
发表于 2013-11-29 14:30:55 | 显示全部楼层 |阅读模式
悬赏60D豆已解决
我新建了一个文本文件“F:\批量文字替换的配对.txt”,我将替换配对放在里面,形式为
中国镡中华人民共和国
1镡一
2镡二
3镡三
4镡四

我希望使用LSP,可以读取文本文件中的内容,并拆分成一对,再对我选中的图元进行替换,这样一次就可以进行任意多次数的替换。
我还希望代码分成几个插件(只略为修改一点),第1个插件是完全匹配时才替换,第2个插件时,包含才替换;第三个是替换项位于被替换项的最左侧才替换;第四个是替换项位于被替换项的最右侧才替换
替换对象为多行文本及单行文本。
最好不要是伪源码。
我有一个朋友给我的代码可供参考。
(vl-Load-Com)
(defun c:当属性层文本内容右侧不等于文本文件任意行内容时删除它 (/ ss path txt i en n loop txt str txtstr)
  (if (and (setq ss (ssget "X" '((0 . "MTEXT,TEXT")(8 . "0000用于图元属性快速输出利用(简称“属性”图层)"))))
           ; (setq path (getfiled "选择文本文件" "" "txt" 4))
           (setq path "F:/仅保留符合本文本文件中内容的CAD文本图元.txt")
      )
    (progn
      (setq txt (Z:ReadTXT path))
      (setq i -1)
      (while (setq en (ssname ss (setq i (1+ i))))
        (setq loop t n -1  str (strcase (vla-get-TextString (vlax-ename->vla-object en))))
        (if (null (while (and loop (setq txtstr (nth (setq n (1+ n)) txt)))
                    (if
                                ; (/= str txtstr)
                                ; 判断是否包含
;;;                                (vl-string-search (strcase txtstr) (strcase str))
                               (wcmatch str (strcat  (vl-princ-to-string txtstr) "*"))

                                (progn (setq loop nil) T))
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:批量文字替换的配对.rar 
下载次数:24  文件大小:2.67 KB 
下载权限: 不限 以上  [免费赚D豆]




                  )
            )
          (entdel en)
        )
      )
    )
  )
  (princ)
)

(defun Z:ReadTXT (path / file txtlst str)
  (if (setq fn (findfile path))
    (progn
      (setq file (open fn "r"))
      (setq Txtlst '())
      (while (setq str (read-line file))
        (setq Txtlst (cons (strcase str) Txtlst))
      )
      (close file)
    )
  )
  (reverse txtlst)
)



最佳答案

查看完整内容

下次用图把问题说清楚
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-11-29 14:30:56 | 显示全部楼层
清风明月10 发表于 2013-11-29 16:22
我需要全部替换的,帮忙搞好一下,好吗?

下次用图把问题说清楚
  1. (defun c:tt (/ fl ss lst)
  2.   (if (and (setq fl (getfiled "Select Txt" "" "txt" 8))
  3.            (setq ss (ssget '((0 . "*text"))))
  4.       )
  5.     (progn
  6.       (setq lst        (XD::List:FromFile fl)
  7.             lst        (mapcar
  8.                   '(lambda (x)
  9.                      (mapcar
  10.                        'vl-princ-to-string
  11.                        (read (strcat "(" (vl-string-subst " " "镡" x) ")"))
  12.                      )
  13.                    )
  14.                   lst
  15.                 )
  16.       )
  17.       (mapcar '(lambda (x / str)
  18.                  (setq str (vla-get-textstring x))
  19.                  (mapcar '(lambda (s)
  20.                             (while (vl-string-search (car s) str)
  21.                               (setq str        (vl-string-subst
  22.                                           (cadr s)
  23.                                           (car s)
  24.                                           str
  25.                                         )
  26.                               )
  27.                             )
  28.                             (vla-put-textstring x str)
  29.                           )
  30.                          lst
  31.                  )
  32.                )
  33.               (ss->objs ss)
  34.       )
  35.     )
  36.   )
  37.   (princ)
  38. )
  39. (defun ss->objs        (ss / i el)
  40.   (if (eq (type ss) 'PICKSET)
  41.     (progn
  42.       (setq i (sslength ss))
  43.       (while (setq e (ssname ss (setq i (1- i))))
  44.         (setq el (cons e el))
  45.       )
  46.       (mapcar 'vlax-ename->vla-object el)
  47.     )
  48.   )
  49. )

点评

OK!太感谢了!非常好用!  发表于 2013-11-29 16:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-29 14:48:46 | 显示全部楼层
用函数发布中的 Lisp 函数算源码?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 14:56:24 | 显示全部楼层
反正所有的代码都不能引用外面的,只在当前插件内部

点评

那就闪了  详情 回复 发表于 2013-11-29 14:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-29 14:58:17 | 显示全部楼层
清风明月10 发表于 2013-11-29 14:56
反正所有的代码都不能引用外面的,只在当前插件内部

那就闪了   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-11-29 15:18:52 | 显示全部楼层

  1. ;;text
  2. ;;  oldstr1
  3. ;;  newstr1
  4. ;;  oldstr2
  5. ;;  newstr2
  6. ;;  ......
  7. (defun c:tt (/ fl ss lst)
  8.   (if (and (setq fl (getfiled "Select Txt" "" "txt" 8))
  9.            (setq ss (ssget '((0 . "*text"))))
  10.       )
  11.     (progn
  12.       (setq lst        (XD::List:FromFile fl)
  13.             lst        (XD::List:SnakePair lst)
  14.       )
  15.       (mapcar '(lambda (x / str)
  16.                  (setq str (vla-get-textstring x))
  17.                  (mapcar '(lambda (s)
  18.                             (if        (vl-string-search (car s) str)
  19.                               (vl-string-subst (cadr s) (car s) str)
  20.                             )
  21.                           )
  22.                          lst
  23.                  )
  24.                )
  25.               (ss->objs ss)
  26.       )
  27.     )
  28.   )
  29.   (princ)
  30. )
  31. (defun ss->objs        (ss / i el)
  32.   (if (eq (type ss) 'PICKSET)
  33.     (progn
  34.       (setq i (sslength ss))
  35.       (while (setq e (ssname ss (setq i (1- i))))
  36.         (setq el (cons e el))
  37.       )
  38.       (mapcar 'vlax-ename->vla-object el)
  39.     )
  40.   )
  41. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:29:06 | 显示全部楼层
你没有用“镡”字将替换项与被替换项分隔开来啊文本文件中的内容格式是这样的:
中国镡中华人民共和国
1镡一
2镡二
3镡三
4镡四
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-11-29 15:35:31 | 显示全部楼层
清风明月10 发表于 2013-11-29 15:29
你没有用“镡”字将替换项与被替换项分隔开来啊文本文件中的内容格式是这样的:
中国镡中华人民共和国
1 ...


  1. (setq lst        (XD::List:FromFile fl)
  2.             lst        (mapcar
  3.                   '(lambda (x)
  4.                      (mapcar
  5.                        'vl-princ-to-string
  6.                        (read (strcat "(" (vl-string-subst " " "镡" x) ")"))
  7.                      )
  8.                    )
  9.                   lst
  10.                 )
  11.       )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:42:55 | 显示全部楼层
你发后面的代码没有用。你将整个代码贴出来啊?

点评

你自己不会替换啊! 其他不变  详情 回复 发表于 2013-11-29 15:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-11-29 15:45:09 | 显示全部楼层
清风明月10 发表于 2013-11-29 15:42
你发后面的代码没有用。你将整个代码贴出来啊?

你自己不会替换啊! 其他不变

点评

朋友,你还是给一个完整而正确的代码吧,我改造后还是不行  详情 回复 发表于 2013-11-29 15:56
你替换好了,发一个完整的,好吗?也想去替换,但只好象能看出被替换的开始位置,看不出结束位置  发表于 2013-11-29 15:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:51:45 | 显示全部楼层
我看懂了,替换好了,我再试多个替换,成功就给你分
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2013-11-29 15:52:50 | 显示全部楼层
要是不能用会自己改吗? 我可是没有测试

  1. (defun c:tt (/ fl ss lst)
  2.   (if (and (setq fl (getfiled "Select Txt" "" "txt" 8))
  3.            (setq ss (ssget '((0 . "*text"))))
  4.       )
  5.     (progn
  6.       (setq lst        (XD::List:FromFile fl)
  7.             lst        (mapcar
  8.                   '(lambda (x)
  9.                      (mapcar
  10.                        'vl-princ-to-string
  11.                        (read (strcat "(" (vl-string-subst " " "镡" x) ")"))
  12.                      )
  13.                    )
  14.                   lst
  15.                 )
  16.       )
  17.       (mapcar '(lambda (x / str)
  18.                  (setq str (vla-get-textstring x))
  19.                  (mapcar '(lambda (s)
  20.                             (if        (vl-string-search (car s) str)
  21.                               (vl-string-subst (cadr s) (car s) str)
  22.                             )
  23.                           )
  24.                          lst
  25.                  )
  26.                )
  27.               (ss->objs ss)
  28.       )
  29.     )
  30.   )
  31.   (princ)
  32. )
  33. (defun ss->objs        (ss / i el)
  34.   (if (eq (type ss) 'PICKSET)
  35.     (progn
  36.       (setq i (sslength ss))
  37.       (while (setq e (ssname ss (setq i (1- i))))
  38.         (setq el (cons e el))
  39.       )
  40.       (mapcar 'vlax-ename->vla-object el)
  41.     )
  42.   )
  43. )

点评

你肯定要测试一下才好啊!  详情 回复 发表于 2013-11-29 15:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:53:56 | 显示全部楼层
不行,不能替换,一个都不能
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:56:08 | 显示全部楼层
Free-Lancer 发表于 2013-11-29 15:45
你自己不会替换啊! 其他不变

朋友,你还是给一个完整而正确的代码吧,我改造后还是不行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2013-11-29 15:57:06 | 显示全部楼层
Free-Lancer 发表于 2013-11-29 15:52
要是不能用会自己改吗? 我可是没有测试

你肯定要测试一下才好啊!

点评

试了,无效果  详情 回复 发表于 2013-11-29 15:58
没有图没有 txt 去哪测试! 新字是前面的还是后面的?  详情 回复 发表于 2013-11-29 15:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 20:40 , Processed in 0.262016 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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