选择文字LISP
你好我正在努力使Lisp程序的工作,我真的很挣扎。我从一个图形开始,该图形上有一个数字的多个实例(可以是001-020中的任何数字),我需要用另一个数字(021-040)替换它,使001变为021,以此类推。只有20种可能的组合,每张图纸上只有一个唯一的编号。
我正在使用用(tfindfun“old”“new”1)命令开发的tfind lisp来替换它。使用IF语句可能有更好的方法来实现这一点,但当我运行LISP时,我基本上有20个tfindfun命令,19个失败,1个工作。到目前为止,这还没有给我带来任何问题。在替换了该数字的所有实例后,我可以运行其余的命令,然后我的问题出现了——我需要用一个新名称保存文件。当前文件名的类型如下:
text_001_text。dxf
text\u 002\u text。dxf等
我需要用text\u 021\u text替换它。dxf,text\u 022\u text。dxf等。我真的很难选择021,或存储它,以便我可以修改文件名。我一直在看不同的线程,尝试不同的选择命令,但绝对没有运气。我无法使ss1等于021(替换初始值的数字),以便将其合并并形成新的文件名。
(命令“saveas”“dxf”“v”“2004”“”(STRCAT“c:\\test”ss1“文件名的其余部分”)“y”)
(命令“close”“n”)
非常感谢你! 希望这会让你开始不确定你到底需要什么,但是,很抱歉。
这是为特殊任务编写的,但您可以使用相同的算法
;; RNZERO.LSP
;; Fatty T.O.H () 2006 * all rights removed
;; renumbering stations
;; (partialy borrowed from
;; REGEXP.LSP
;; Copyright (c) 2004, Tony Tanzillo)
(defun C:RNZERO (/ *error* *debug* init match maxlen match_list newstr newtxt newvalue
numadd obj_list oldtxt regex result ss)
;; error trapping function
;; based on function
;; published by Joe Burke 12/5/2005
(defun *error*(msg) ; create standard error handler
(cond ((not msg)) ; normal exit, no error
((member msg '("Function cancelled" "quit / exit abort"))) ; escape
((princ (strcat "\nError: " msg)) ; display fatal error
(cond (*debug* (vl-bt))))) ; if in debug mode, dump backtrace
(vl-catch-all-apply
(function(lambda()
(vlax-release-object result))))
(vl-catch-all-apply
(function(lambda()
(vlax-release-object regex))))
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
)
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(if
(not
(vl-catch-all-error-p
(vl-catch-all-apply
(function
(lambda ()
(setq regex (vlax-create-object "VBScript.RegExp")))))))
(progn
(vlax-put-property regex 'Global :vlax-true)
(vlax-put-property regex 'IgnoreCase :vlax-true)
(setq init (getstring "\Enter initial value to find <001> : "))
(if (eq "" init)
(setq init "001"))
(initget 6)
(setq numadd (getint "\nNumber to add <20> : "))
(if (not numadd)
(setq numadd 20))
(setq maxlen (strlen init)
match"")
(if
(setq ss (ssget (list
(cons 0 "TEXT")
(cons 1
(strcat "*"
(repeat maxlen
(setq match (strcat match "#")))
"*")))))
(progn
(setq match_list
(mapcar 'cons
(setq obj_list
(mapcar 'vlax-ename->vla-object
(vl-remove-if
'listp
(mapcar 'cadr
(ssnamex ss)
)
)
)
)
(mapcar 'vla-get-textstring obj_list))
)
(while (setq obj_list (vl-remove-if-not
(function (lambda (x)
(wcmatch (cdr x) (strcat "*" init "*"))))
match_list)
)
(vlax-put-property regex 'Pattern (strcat "(" init ")"))
(foreach obj (mapcar 'car obj_list)
(setq oldtxt (vla-get-textstring obj))
(setq newvalue (+ numadd (atoi init)))
(setq newtxt (itoa newvalue))
(while (< (strlen newtxt) maxlen)
(setq newtxt (strcat "0" newtxt))
)
(if (not (eq "0" (substr newtxt 1 1)))
(setq newtxt (strcat "0" newtxt)))
(princ (strcat "\n" init " ==> " newtxt));for debug only
(setq result
(vlax-invoke-method regex 'Execute oldtxt)
)
(if (> (vlax-get-property result 'Count) 0)
(progn
(setq newstr
(vlax-invoke-method regex 'Replace oldtxt newtxt)
)
(vla-put-textstring obj newstr)
))
(vlax-release-object result)
)
(setq match_list (vl-remove-if
(function (lambda (x)
(member x obj_list)))
match_list)
)
(setq init (1+ (atoi init))
init (itoa init)
)
(while (< (strlen init) maxlen)
(setq init (strcat "0" init))
)
)
(vlax-release-object regex)
)
)
)
)
(*error* nil)
(princ)
)
(vl-load-com)
(princ "\n*** Type RNZERO to renumbering stations ***")
(prin1)
~'J'~ 非常感谢。我应该澄清和简化我遇到的问题。逻辑是:
如果图纸上有021,则将图纸另存为text\u 021\u text。dxf
Elseif 022在图纸上,然后将图纸另存为text\u 022\u text。dxf
Elseif 023在图纸上,然后将图纸另存为text\u 023\u text。dxf
Elseif 024等等。
如何使用LISP语法编写?非常感谢。 对于一般情况,COND声明是您的答案:
(cond
((= DrawingID 021)
(setq DrawingName "text_021_text.dxf"))
((= DrawingID 022)
(setq DrawingName "text_022_text.dxf"))
((= DrawingID 023)
(setq DrawingName "text_023_text.dxf"))
)
但如果测试参数始终为整数,则可以使用:
(setq DrawingName (strcat "text_" (itoa DrawingID) "_text.dxf"))
当做 我想这就是我要找的,谢谢!请再问一个问题。。。其中代码为(=DrawingID 021)
我需要它将MTEXT=“021”作为第一个条件,MTEXT=“022”作为第二个条件,等等。
下面是我尝试的内容,但我运气不太好。它可能应该以((=多行文字???…)开头???。。。
(条件
((setq ss(ssget):L“'((0.021,多行文字)))
(setq DrawingName“text\u 021\u text.dxf”)))
((
所以基本上我需要它做的是
(条件
((在图纸内容中查找多行文字“021”。如果在图纸名称图纸中找到021,请参见下一行)
(setq DrawingName“text\u 021\u text.dxf”))
((查找多行文字“022”。如果找到,请按下一行命名图纸)
(setq DrawingName“text\u 022\u text.dxf”))
((等)
再次感谢!
在这种情况下,选择询问过滤器应如下所示:
(ssget "X" '((0 . "MTEXT") (1 . "*201*")))
请参阅SSGET函数选择方法参数的帮助,以及野生字符用法的WCMATCH。
当做
页:
[1]