Lisp 例程中的多个命令
Multiple Commands Within a Lisp Routine
请帮我解决一个小问题。
我有以下 .lsp,它需要稍微更新一下,但我似乎还找不到解决方案。我希望它缩放范围,然后 select 所有颜色为 7 的文本和 运行 TTT
命令(这是一个自定义函数,在 [=21] 中导出 selected 文本=] sheet).
在我的测试中,它在 select 编辑文本之前停止并要求我 select 所需的文本。我认为这是 ssget
函数的问题。
(defun C:123 (/ SS)
(command "_.Zoom" "E")
(if (setq ss (ssget "X" '((0 . "*TEXT")(62 . 7))))
(C:TTT)
)
)
非常感谢任何帮助。
您的程序能否成功运行将取决于 c:ttt
函数的定义,特别是该函数是否已编写为接受隐式选择。
理想情况下,c:ttt
函数将被重组为接受单个选择集参数的函数,这样您就可以评估该函数并传递您的 ss
选择集变量。
但是,在不了解 c:ttt
函数的定义的情况下,我建议的最佳方法是按以下方式提供隐含的选择:
(defun c:123 ( / ss )
(command "_.zoom" "_e")
(if
(setq ss
(ssget "_X"
(list
'(0 . "TEXT")
'(62 . 7)
(if (= 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
'(410 . "Model")
)
)
)
)
(progn
(sssetfirst nil ss)
(C:TTT)
)
(princ "\nNo single-line text with object colour set to white found in the current layout/viewport.")
)
(princ)
)
您会注意到,我还修改了您的 ssget
表达式的选择标准,以仅考虑驻留在当前 viewport/layout 中的白色单行文本,以确保隐含的选择按预期运行.
编辑: 我建议对您的代码进行以下修改:
(defun c:123 ( / s )
(command "_.zoom" "_e")
(if (setq s (ssget "_X" '((0 . "TEXT") (62 . 7))))
(ttt s)
(princ "\nNo single-line text found with object colour set to white.")
)
(princ)
)
(defun c:ttt ( / s )
(if (setq s (ssget '((0 . "TEXT")))) (ttt s))
(princ)
)
(defun ttt ( sel / des fnm idx )
(if
(and sel
(setq fnm (vl-filename-mktemp nil nil ".csv"))
(setq des (open fnm "w"))
)
(progn
(repeat (setq idx (sslength sel))
(setq idx (1- idx))
(write-line (LM:csv-addquotes (cdr (assoc 1 (entget (ssname sel idx)))) ",") des)
)
(close des)
(startapp "explorer" fnm)
)
)
)
(defun LM:csv-addquotes ( str sep / pos )
(cond
( (wcmatch str (strcat "*[`" sep "\"]*"))
(setq pos 0)
(while (setq pos (vl-string-position 34 str pos))
(setq str (vl-string-subst "\"\"" "\"" str pos)
pos (+ pos 2)
)
)
(strcat "\"" str "\"")
)
( str )
)
)
(princ)
在这里,我定义了一个新函数ttt
接受由单行文本对象组成的选择集参数,并依次将集合中每个文本对象的内容写入临时CSV文件(虽然, 这最终可能是任何文本格式文件,因为只使用了一列)。
然后您的 c:ttt
函数和 c:123
函数会评估新函数 - 前者提示根据您现有的命令进行选择,后者自动处理绘图中的所有白色文本.
Lee Mac,很荣幸得到你的帮助,你可能不知道,但你的网站以前帮助过我很多次,我要感谢你,你做得很好关于那个 TTT 函数,我从朋友那里得到的,但可能是你编写的代码:))
请看下面的TTT功能:
(defun LM:writecsv ( lst csv / des sep )
(if (setq des (open csv "w"))
(progn
(setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\Control Panel\International" "sList")) (",")))
(foreach row lst (write-line (LM:lst->csv row sep) des))
(close des)
t
)
)
)
(defun LM:lst->csv ( lst sep )
(if (cdr lst)
(strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
(LM:csv-addquotes (car lst) sep)
)
)
(defun LM:csv-addquotes ( str sep / pos )
(cond
( (wcmatch str (strcat "*[`" sep "\"]*"))
(setq pos 0)
(while (setq pos (vl-string-position 34 str pos))
(setq str (vl-string-subst "\"\"" "\"" str pos)
pos (+ pos 2)
)
)
(strcat "\"" str "\"")
)
( str )
)
)
(defun C:ttt(/ lst ss i el x fn)
(setq lst (list) ss (ssget (list (cons 0 "TEXT"))) )
(repeat (setq i (sslength ss))
(setq x (ssname ss (setq i (1- i))))
(setq el (entget x))
(if (= (cdr (assoc 0 el)) "TEXT")
(setq lst (append lst (list (list (cdr (assoc 1 el))))))
)
)
(setq fn (vl-filename-mktemp nil nil ".csv"))
(if (and lst (LM:WriteCSV (reverse lst) fn))
(startapp "explorer" fn)
)
)
原则上,我希望它缩放范围 => select 所有颜色为 7 的文本 => 运行 这个 TTT 命令并在 .csv 中导出 selected 文本文件。如果你知道任何其他方法来实现这一点,除了我指出的,它也一样好。
再次感谢!
请帮我解决一个小问题。
我有以下 .lsp,它需要稍微更新一下,但我似乎还找不到解决方案。我希望它缩放范围,然后 select 所有颜色为 7 的文本和 运行 TTT
命令(这是一个自定义函数,在 [=21] 中导出 selected 文本=] sheet).
在我的测试中,它在 select 编辑文本之前停止并要求我 select 所需的文本。我认为这是 ssget
函数的问题。
(defun C:123 (/ SS)
(command "_.Zoom" "E")
(if (setq ss (ssget "X" '((0 . "*TEXT")(62 . 7))))
(C:TTT)
)
)
非常感谢任何帮助。
您的程序能否成功运行将取决于 c:ttt
函数的定义,特别是该函数是否已编写为接受隐式选择。
理想情况下,c:ttt
函数将被重组为接受单个选择集参数的函数,这样您就可以评估该函数并传递您的 ss
选择集变量。
但是,在不了解 c:ttt
函数的定义的情况下,我建议的最佳方法是按以下方式提供隐含的选择:
(defun c:123 ( / ss )
(command "_.zoom" "_e")
(if
(setq ss
(ssget "_X"
(list
'(0 . "TEXT")
'(62 . 7)
(if (= 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
'(410 . "Model")
)
)
)
)
(progn
(sssetfirst nil ss)
(C:TTT)
)
(princ "\nNo single-line text with object colour set to white found in the current layout/viewport.")
)
(princ)
)
您会注意到,我还修改了您的 ssget
表达式的选择标准,以仅考虑驻留在当前 viewport/layout 中的白色单行文本,以确保隐含的选择按预期运行.
编辑: 我建议对您的代码进行以下修改:
(defun c:123 ( / s )
(command "_.zoom" "_e")
(if (setq s (ssget "_X" '((0 . "TEXT") (62 . 7))))
(ttt s)
(princ "\nNo single-line text found with object colour set to white.")
)
(princ)
)
(defun c:ttt ( / s )
(if (setq s (ssget '((0 . "TEXT")))) (ttt s))
(princ)
)
(defun ttt ( sel / des fnm idx )
(if
(and sel
(setq fnm (vl-filename-mktemp nil nil ".csv"))
(setq des (open fnm "w"))
)
(progn
(repeat (setq idx (sslength sel))
(setq idx (1- idx))
(write-line (LM:csv-addquotes (cdr (assoc 1 (entget (ssname sel idx)))) ",") des)
)
(close des)
(startapp "explorer" fnm)
)
)
)
(defun LM:csv-addquotes ( str sep / pos )
(cond
( (wcmatch str (strcat "*[`" sep "\"]*"))
(setq pos 0)
(while (setq pos (vl-string-position 34 str pos))
(setq str (vl-string-subst "\"\"" "\"" str pos)
pos (+ pos 2)
)
)
(strcat "\"" str "\"")
)
( str )
)
)
(princ)
在这里,我定义了一个新函数ttt
接受由单行文本对象组成的选择集参数,并依次将集合中每个文本对象的内容写入临时CSV文件(虽然, 这最终可能是任何文本格式文件,因为只使用了一列)。
然后您的 c:ttt
函数和 c:123
函数会评估新函数 - 前者提示根据您现有的命令进行选择,后者自动处理绘图中的所有白色文本.
Lee Mac,很荣幸得到你的帮助,你可能不知道,但你的网站以前帮助过我很多次,我要感谢你,你做得很好关于那个 TTT 函数,我从朋友那里得到的,但可能是你编写的代码:))
请看下面的TTT功能:
(defun LM:writecsv ( lst csv / des sep )
(if (setq des (open csv "w"))
(progn
(setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\Control Panel\International" "sList")) (",")))
(foreach row lst (write-line (LM:lst->csv row sep) des))
(close des)
t
)
)
)
(defun LM:lst->csv ( lst sep )
(if (cdr lst)
(strcat (LM:csv-addquotes (car lst) sep) sep (LM:lst->csv (cdr lst) sep))
(LM:csv-addquotes (car lst) sep)
)
)
(defun LM:csv-addquotes ( str sep / pos )
(cond
( (wcmatch str (strcat "*[`" sep "\"]*"))
(setq pos 0)
(while (setq pos (vl-string-position 34 str pos))
(setq str (vl-string-subst "\"\"" "\"" str pos)
pos (+ pos 2)
)
)
(strcat "\"" str "\"")
)
( str )
)
)
(defun C:ttt(/ lst ss i el x fn)
(setq lst (list) ss (ssget (list (cons 0 "TEXT"))) )
(repeat (setq i (sslength ss))
(setq x (ssname ss (setq i (1- i))))
(setq el (entget x))
(if (= (cdr (assoc 0 el)) "TEXT")
(setq lst (append lst (list (list (cdr (assoc 1 el))))))
)
)
(setq fn (vl-filename-mktemp nil nil ".csv"))
(if (and lst (LM:WriteCSV (reverse lst) fn))
(startapp "explorer" fn)
)
)
原则上,我希望它缩放范围 => select 所有颜色为 7 的文本 => 运行 这个 TTT 命令并在 .csv 中导出 selected 文本文件。如果你知道任何其他方法来实现这一点,除了我指出的,它也一样好。
再次感谢!