固定的几个前缀字符,该如何实现自动切换呢
请教下大侠们,如果想有个列表DN*dn*De*Dw*D*等几个固定的的前缀字符(*号代表数值),想通过一个命令自动切换,比如点击DN15自动变成dn15,再点击自动变成De15,再点击自动变成Dw15,这样的可以实现吗tryhi 发表于 2020-3-9 17:51
(defun c:tt (/ dat en i lst str str1 x x0 x1)
(setq lst '("DN*""dn*""De*""Dw*""D*"))
(w ...大侠,我想中间想加一组"JS*""JZ*""JG*",需要用什么来隔断下呢
(defun c:TT7 (/ dat en i lst str str1 x x0 x1)
(setq lst '( "DN*""dn*""De*" "JS*""JZ*""JG*" ))
(while (setq en(car(entsel "\n请选择对象:")))
(setq dat(entget en)
str1(assoc 1 dat)
str(cdr str1)
i -1
)
(if(vl-some '(lambda(x)(setq i(1+ i))(wcmatch str x))lst)
(progn
(setq
x0(substr(nth i lst)1(1-(strlen (nth i lst))))
i(if(= (1+ i) (length lst))0(1+ i))
x(substr(nth i lst)1(1-(strlen (nth i lst))))
x1(substr str (1+(strlen x0)))
)
(entmod(subst (cons 1(strcat x x1))str1 dat))
)
)
)
)
本帖最后由 masterlong 于 2020-10-6 14:42 编辑
为啥要一定要纠结于“轮换”?
借助doslib搞个弹出式菜单
不是很简单的事吗?
用GETINT在命令行做选择题
或者GETSTRING直接输入要换的字符
也没多复杂
需要的doslib函数库
在这里下
http://bbs.mjtd.com/thread-173225-1-1.html
(defun c:tt()
(command "undo" "g")
(setq xxlist '("dn" "de" "" "jg" "pc" "sc")) ;;字符串列表随意增减,区分大小写,""表示分割线
(setq yylist (vl-remove "" xxlist))
(setq zzlist (mapcar ''((z) (strcat z "*")) yylist))
(setq zzstr (list2str zzlist ","))
(if (and
(setq ss (ssget (list '(0 . "text")(cons 1 zzstr))))
(setq id (dos_popupmenu xxlist))
(setq xx (nth id yylist))
)
(foreach tt (ss2list ss)
(setq str (cdr (assoc 1 (entget tt))))
(setq tmp (vl-remove-if-not''((z) (wcmatch str z)) zzlist))
(setq tmp (car tmp))
(setq tmp (substr tmp 1 (1- (strlen tmp))))
(setq newstr (dos_strreplace str tmp xx))
(entmod (list (cons -1 tt) (cons 1 newstr)))
)
)
(command "undo" "e")
(princ)
)
;999公共函数
;;字符串列表采用分隔符连接成字符串——————本函数未加入错误判别 a.strlist是否表 b.表中元素是否都为字符串 c.ken是否字符串
(defun list2str( strlist ken / str )
(setq str (car strlist))
(foreach x (cdr strlist)
(setq str (strcat str ken x))
)
str
)
;999公共函数
;;选择集转为图元列表
(defun ss2list ( ss / n i elist )
(cond
((null ss) NIL)
((= (type ss) 'Pickset)
(setq n(sslength ss)
i n
elist '()
)
(repeat n
(setq i (1- i))
;;如果没有这个if,那么选择集中被删除的图元,也会被加入到列表之中————但是极其偶尔也有可能,图元不存在但是能entget(遇到过一次,原因不明,或许是CAD的BUG)
(if (entget (ssname ss i))
(setq elist (cons (ssname ss i) elist))
)
)
elist
)
((= (type ss) 'ename)
(list ss)
)
((= (type ss) 'list)
(vl-remove-if-not ''((x) (and (= (type x) 'ename) (entget x))) ss)
)
( T NIL )
)
)
(defun c:tt (/ dat en i lst str str1 x x0 x1)
(setq lst '("DN*""dn*""De*""Dw*""D*"))
(while (setq en(car(entsel "\n请选择对象:")))
(setq dat(entget en)
str1(assoc 1 dat)
str(cdr str1)
i -1
)
(if(vl-some '(lambda(x)(setq i(1+ i))(wcmatch str x))lst)
(progn
(setq
x0(substr(nth i lst)1(1-(strlen (nth i lst))))
i(if(= (1+ i) (length lst))0(1+ i))
x(substr(nth i lst)1(1-(strlen (nth i lst))))
x1(substr str (1+(strlen x0)))
)
(entmod(subst (cons 1(strcat x x1))str1 dat))
)
)
)
) (defun C:tt5(/ entname i lst new_str)
(setq lst (list "DN15""dn15""De15""Dw15""D15") i -1)
(while (setq entname (car (entsel "\n请选择对象:")))
(setqnew_str (nth (setq i (1+ i)) lst))
(entmod (subst (cons 1 new_str ) (assoc 1 (entget entname)) (entget entname)))
(if (= (1+ i) (length lst)) (setq i -1))
);while
(princ)
) 本帖最后由 magicheno 于 2020-3-9 11:43 编辑
start4444 发表于 2020-3-9 11:19
(defun C:tt5(/ entname i lst new_str)
(setq lst (list "DN15""dn15""De15""Dw15""D15") i -1) ...
感谢大侠,这个貌似只针队15尾数的吧,如果是DN25 40 50这样尾数的就不行了吧,想法是不管是DN15 25 32 等都变成dn25 32 40,De15 32 40 等等这样的如果吧数字改成*号,后续可行吗 magicheno 发表于 2020-3-9 11:42
感谢大侠,这个貌似只针队15尾数的吧,如果是DN25 40 50这样尾数的就不行了吧,想法是不管是DN15 25 32 ...
感谢感谢哈,就是排的相对多点哈, "DN15""dn15""De15""Dw15""D15" nil "DN20""dn20""De20""Dw20""D20" nil "DN25""dn25""De25""Dw25""D25" nil "DN32""dn32""De32""Dw32""D32" nil "DN40""dn40""De40""Dw40""D40" nil 后续一直到300,有点长 这个有点难,先要判断对象后面第几位是数字,然后才能替换前面的文字(前缀)。 magicheno 发表于 2020-3-9 12:08
感谢感谢哈,就是排的相对多点哈, "DN15""dn15""De15""Dw15""D15" nil "DN20""dn20""De20"...
感觉你的思路都不对,那么多你说点一下换一个,后面的要换到啥时候 start4444 发表于 2020-3-9 12:18
感觉你的思路都不对,那么多你说点一下换一个,后面的要换到啥时候
是的,就是前缀是字母字符,后面是数值,不管后面数值是多少可能是15 20 25 32,通过命令只改变前缀字符的DN到dn到De等等的 帮你顶一下,很想知道怎么替换前缀。请大神出手! 楼主是想复用图纸么?不如直接替换到。否则就算能点,要点到何时才能换到自己需要的? mikewolf2k 发表于 2020-3-9 16:51
楼主是想复用图纸么?不如直接替换到。否则就算能点,要点到何时才能换到自己需要的?
不会很慢啊,只要想要替换的,替换掉前缀就好了,可以提高很多效率的