vmuntean 发表于 2022-7-6 11:18:55

选择文字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”)
 
非常感谢你!

fixo 发表于 2022-7-6 11:40:06

希望这会让你开始不确定你到底需要什么,但是,很抱歉。
这是为特殊任务编写的,但您可以使用相同的算法

;; 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'~

vmuntean 发表于 2022-7-6 11:45:38

非常感谢。我应该澄清和简化我遇到的问题。逻辑是:
如果图纸上有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语法编写?非常感谢。

MSasu 发表于 2022-7-6 12:01:00

对于一般情况,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"))
 
当做

vmuntean 发表于 2022-7-6 12:16:55

我想这就是我要找的,谢谢!请再问一个问题。。。其中代码为(=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”))
((等)
 
再次感谢!
 

MSasu 发表于 2022-7-6 12:29:21

在这种情况下,选择询问过滤器应如下所示:
 
(ssget "X" '((0 . "MTEXT") (1 . "*201*")))
 
请参阅SSGET函数选择方法参数的帮助,以及野生字符用法的WCMATCH。
 
当做
页: [1]
查看完整版本: 选择文字LISP