ILoveMadoka 发表于 2022-7-6 17:32:50

查找字符串-做某事

我有几个关于如何做某事的问题。。。
鉴于以下情况。。
 
原始帖子
 
(defun chkmtxtstr (matchstr / mtxtset lst)
(if (setq mtxtset (ssget "_X" '((0 . "MTEXT"))))
    (if
      (setq lst
      (vl-remove-if-not
         '(lambda (x)
            (wcmatch
            (strcase (vla-get-textstring x))
            (strcat "*" (strcase matchstr) "*")
            )
          )
          (mapcar
            'vlax-ename->vla-object
            (vl-remove-if
            'listp
            (mapcar 'cadr (ssnamex mtxtset))
            )
          )
      )
      )
      (alert (strcat "The string '" matchstr "' was found."))
    )
)
lst
)

;;;useage - (chkmtxtstr "MyTextString")
 
1) 如何将文本字符串硬编码到此代码中?是“x”吗??
 
2) 如何将找到的文本对象分配给变量,以便对其执行其他操作?
ie:(命令“change”XX““La”0“c”bylayer”)
 
(在我的例子中,在特定选项卡/布局上只有一个找到的字符串实例。)没有倍数的可能性。
 
 
 
 

Kreaten_vhar 发表于 2022-7-6 17:59:24

这只是一个猜测,因为我现在不能真正玩例程(lambda函数吓到我了,哈哈)
 
也许您需要将(setq mtxtset(ssget“_X”'((0。“MTEXT”))更改为(setq mtxtset“硬编码字符串”)。 
 

Steven P 发表于 2022-7-6 18:05:00

你想硬编码哪个文本?假设有两种选择,要么是要搜索的文本(作为matchstr传递给这个LISP),要么是要搜索的文本字符串的硬编码,这里是mtxtset。

Lee Mac 发表于 2022-7-6 18:32:07

由于要找到的字符串已经被传递给函数的参数,您可以通过定义另一个函数来“硬编码”它,该函数使用硬编码字符串评估您的函数,例如:
(defun c:test ( )
    (chkmtxtstr "MyTextString")
)
不过,如果您对区分大小写的匹配感到满意,并且假设多行文字内容没有格式,并且不跨越多个DXF第3组条目,那么代码可以变得简单得多-请考虑以下内容:
(defun find ( str )
    (ssget "_X" (list '(0 . "MTEXT") (cons 1 (strcat "*" str "*"))))
)
由于上述操作将返回一个选择集,因此可以按以下方式调用它:
(defun c:test ( / sel )
    (if (setq sel (find "YourString"))
      (command "_.change" sel "" "_p" "_la" "0" "_c" "ByLayer" "")
    )
    (princ)
)

ronjonp 发表于 2022-7-6 18:37:59

很高兴看到你发布Lee
页: [1]
查看完整版本: 查找字符串-做某事