iamhuangjinming 发表于 2020-6-12 13:00:15

求帮忙替换旧命令~有一个列表包含了新命令和需要被替换的旧命令,怎么替换呢?

本帖最后由 iamhuangjinming 于 2020-6-12 17:10 编辑

(defun c:refes ( )
(setq lst1 (list"A" "new1" "old1"))
(setq lst2 (list"B" "new2" "old2"))
(setq lst (conslst1 lst))
(setq lst (conslst2 lst))

(princ lst)
(setq n (length lst));
(setq index 0)
(repeat n
    (setq lstn   (nthindex lst)
      index (1+ index)
    )
(setq lstn(cdr lstn))
(setq new1(car lstn))
(setq old1(cadr lstn))

;(defun c:new1 nil (c: old1)(prin1))这里想把已经定义好的old1命令替换成new1,怎么能做到呢?
)
)


tryhi 发表于 2020-6-12 14:51:30

本帖最后由 tryhi 于 2020-6-12 15:04 编辑

发完贴能否检查一下,你看你发了几个表情也不改一下



(defun c:old1 ()(princ "\n1"))
(defun c:old2 ()(princ "\n2"))
(defun c:old3 ()(princ "\n3"))

(setq lst '(("new1" "old1")("new2" "old2")("new3" "old3")))
(foreach n lst
      (eval(list 'defun (read(strcat "c:"(car n)))nil (list(read(strcat "c:"(cadr n))))))
)


iamhuangjinming 发表于 2020-6-12 16:48:36

tryhi 发表于 2020-6-12 14:51
发完贴能否检查一下,你看你发了几个表情也不改一下

感谢。那个表情惭愧了,我是个外行,做结构设计的,有几个命令同事要用别名所以这么搞。。。我试了一下我改的这个代码,提示参数类型错误,可以帮我看下怎么修正吗?感谢!
(defun c:de ()(princ "\n1"))
(defun c:ge ()(princ "\n2"))
(defun c:rev2 ()(princ "\n3"))
(defun c:rad ()(princ "\n3"))

(defun c:refes (/ fp str lst )
   (setq fp (open "C:/Program Files/gatex/命令重命名.txt" "r"))    ; 文件
   (while (and (setq str (read-line fp)) (not (wcmatch str "Rename*"))))

   (while (not (wcmatch str "$*"))
   (setq lst (cons (read (strcat "(" (substr str 7) ")")) lst)
         str (read-line fp)
   )
(princ)
)
(princ)
   (close fp)
(reverse lst)
(setq lstm nil)

(setq n (length lst))
(princ n)
(setq index 0)

(repeat n
    (setq lstn   (nthindex lst)
      index (1+ index)
    )
(setq lstn(cdr lstn))
(setq lstm (cons lstn lstm))

)



(foreach n lstm
      (eval(list 'defun (read(strcat "c:"(car n)))nil (list(read(strcat "c:"(cadr n))))))
)

)


重命名文件里面的内容(参考“ Lisp如何读取txt中指定格式文件?”这个帖子写的):
$ 以Rename识别    依次输入新命令、原命令:
Rename   直线_      new1    de
Rename          多线_   new2   ge
Rename         云线_   new3   rev2
Rename          射线_   new4   rad
$ 到此结束

tryhi 发表于 2020-6-12 18:08:46

居然用read来处理字符串,有意思

(foreach n lstm
      (eval(list 'defun (read(strcat "c:"(vl-prin1-to-string(car n))))nil (list(read(strcat "c:"(vl-prin1-to-string(cadr n)))))))
)

iamhuangjinming 发表于 2020-6-12 21:26:10

tryhi 发表于 2020-6-12 18:08
居然用read来处理字符串,有意思

(foreach n lstm


感谢感谢,感谢大神!

iamhuangjinming 发表于 2020-6-16 09:28:44

本帖最后由 iamhuangjinming 于 2020-6-16 09:30 编辑

tryhi 发表于 2020-6-12 18:08
居然用read来处理字符串,有意思

(foreach n lstm

顺便再问一下您,我想取消被替换的命令,是不是可以用这条代码,(vl-acad-undefun 'c:xxx),但是我用这条(vl-acad-undefun 'c: (vl-prin1-to-string(cadr n)))没能成功,也是参数类型的问题吗?

tryhi 发表于 2020-6-16 16:30:09

本帖最后由 tryhi 于 2020-6-16 16:33 编辑

(vl-acad-undefun (read(strcat "c:" (vl-prin1-to-string(cadr n)))))试试,我没用过这个

iamhuangjinming 发表于 2020-6-16 17:40:21

tryhi 发表于 2020-6-16 16:30
(vl-acad-undefun (read(strcat "c:" (vl-prin1-to-string(cadr n)))))试试,我没用过这个

有效~~:victory:谢谢你!
页: [1]
查看完整版本: 求帮忙替换旧命令~有一个列表包含了新命令和需要被替换的旧命令,怎么替换呢?