Lisp 例程中的多个命令

问题描述

请帮我解决一个小问题。

我有以下 .lsp 文件,需要稍微更新一下,但我似乎还找不到解决方案。我希望它缩放范围,然后选择所有颜色为 7 的文本并运行 TTT 命令(这是一个自定义函数,可在 Excel 工作表中导出所选文本)。

在我的测试中,它在选择文本之前停止并要求我选择所需的文本。我认为这是 ssget 函数的问题。

(defun C:123 (/ SS)
  (command "_.Zoom" "E")
  (if (setq ss (ssget "X" '((0 . "*TEXT")(62 . 7))))
    (C:TTT)
  )
)

任何帮助将不胜感激。

解决方法

您的程序能否成功运行取决于 from pytube import YouTube from TimeSnip import time_snip time_options = input("Would you like to find by time(1) or by word(2)?: ") url ="https://www.youtube.com/watch?v=vGwNPeEXEDM&ab_channel=SilasLaspada" ytd = YouTube(URL) def time_set(youtube_object): try: hr_length = int(ytd.length/3600) min_length = int((ytd.length%3600)/60) sec_length = ytd.length%60 print("the video is " + str(hr_length)+':'+str(min_length)+':'+str(sec_length) +'long') start_time_srt_format = input("Enter start time in 'hr:min:sec,msec' format: ") end_time_srt_format = input("Enter end time in 'hr:min:sec,msec' format: ") start_parts = start_time_srt_format.split(':') end_parts = end_time_srt_format.split(':') start_secmsec = start_parts[2].split(',') end_secmsec = end_parts[2].split(',') start_hr = int(start_parts[0]) start_min = int(start_parts[1]) start_sec = int(start_secmsec[0]) start_msec = int(start_secmsec[1]) end_hr = int(end_parts[0]) end_min = int(end_parts[1]) end_sec = int(end_secmsec[0]) end_msec = int(end_secmsec[1]) word = (str(start_sec)+'-'+str(end_sec)) timeSnip = time_snip(start_hr,start_min,start_sec,start_msec,end_hr,end_min,end_sec,end_msec) return timeSnip except IndexError: print("Invalid input! Try again!") time_set(youtube_object) if time_options =='1': timeSnip = time_set(ytd) word = str(timeSnip.start/1000)+' sec' elif time_options =='2': word = input("Enter word: ") 函数的定义,特别是该函数是否已编写为接受隐含选择。

理想情况下,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

在这里,我定义了一个新函数 (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) ,它接受​​一个由单行文本对象组成的选择集参数,并依次将集合中每个文本对象的内容写入一个临时 CSV 文件(虽然,这最终可以是任何文本格式的文件,因为只使用了一列)。

然后由您的 ttt 函数和 c:ttt 函数评估新函数 - 前者提示您根据现有命令进行选择,后者自动处理绘图中找到的所有白色文本。

,

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)
)
)

原则上,我希望它缩放范围 => 选择所有颜色为 7 的文本 => 运行此 TTT 命令并将所选文本导出到 .csv 文件中。如果你知道任何其他方法来实现这一点,除了我指出的,它也一样好。

再次感谢!