需要帮助改进Quic
在我的工作过程中发现了这个由马克·梅西尔(MarkMercier)又称Freerefill)编写的“查找文本”lisp。http://www.cadtutor.net/forum/showthread.php?35933-有史以来最好的文本查找和替换LISP。。。
我猜他不再浏览这里了。
我发现它非常有用&没有对话框,速度很快,因为它会减慢我的速度。正在使用autocad find命令&与此相比,速度要快得多。
我看到了它可以进一步提高的潜力,尤其是在速度方面。
因此,我想知道是否有人可以帮助调整lisp,以便:-
1) “查找”可以是默认选择。
因此,在运行命令后,我们可以开始键入我们想要查找的单词。
2) 它可以搜索整个单词
目前,它似乎像一个通配符一样搜索文本,我不得不循环浏览。我想这将是一个很好的选择,但只有当把*。
我希望它可以调整为默认情况下搜索整个单词。
老实说,这是一个非常好的Lisp程序。
希望有能力的人能看到它的潜力和改进建议
谢谢
这是代码
;-============-;
;- TextFind -;
;- *~* -;
;Written by -;
; Mark Mercier ;
; 05-06-09 ;
;-============-;
; Improvements:
; Text within blocks
; Improved selection set.. maybe do away with the whole "list" thing and go straight VLA
(defun c:tfind()
(tfindfun nil nil 0)
)
(defun tfindfun(inputF inputR caseSn / goto goWhile strinF strinR selSet selTxt searep case count error)
; 01 Create selection set. GOTO 02 if success, or GOTO 08 if fail
; 02 Check passed input. If both nil, GOTO 03. If first string and second nil, GOTO 06. If both strings, GOTO 07. Otherwise, return error and GOTO 08
; 03 Display menus and obtain data from user. If Search, GOTO 04. If Replace, GOTO 05
; 04 Search option selected. Prompt user for single search term. GOTO 06
; 05 Replace option selected. Prompt user for search term and replace term. GOTO 07
; 06 One string has been passed. Assume automatic search. Run same as current (tfind). GOTO FINISH
; 07 Two strings have been passed. Assume automatic replace. Pass both strings to (replace) function. GOTO FINISH
; 08 FINISH. Return errors if needed. End loop and program.
(vl-load-com)
(setq goTo 1)
(setq goWhile 1)
(setq count 0)
(if (not (mlml (list caseSn) (list 0 1))) (progn (setq goWhile nil) (princ "\nCase selection not recognized.")))
(if (= caseSn 0) (setq case "N") (setq case "Y"))
(while goWhile
(cond
((= goTo 1)
(setq selSet (extTxtPt (ssget "_X" (list (cons -4 "<OR") (cons 0 "TEXT,MTEXT") (cons -4 "<AND") (cons 0 "INSERT") (cons 66 1) (cons -4 "AND>") (cons -4 "OR>")))))
(if selSet (setq goTo 2) (setq error "\nSelection set not found." goTo )
)
((= goTo 2)
; Check input, pass to whatever.
(cond
((and (= inputF nil) (= inputR nil))
(setq goTo 3)
)
((and (= (type inputF) 'STR) (= inputR nil))
(setq strinF inputF)
(setq goTo 6)
)
((and (= (type inputF) 'STR) (= (type inputR) 'STR))
(setq strinF inputF)
(setq strinR inputR)
(setq goTo 7)
)
(t
(setq error "\nPassed arguments are not accepted.")
(setq goTo
)
)
)
((= goTo 3)
; Obtain desired option from user
(while (not (mlml (list (setq searep (strcase (getstring nil "\nSelect option : "))))
(list "F" "FIND" "R" "REPLACE" "Q" "QUIT" "C" "CASE")
))
)
(cond
((mlml (list searep) (list "F" "FIND"))
(setq goTo 4)
)
((mlml (list searep) (list "R" "REPLACE"))
(setq goTo 5)
)
((mlml (list searep) (list "Q" "QUIT"))
(setq goTo
)
((mlml (list searep) (list "C" "CASE"))
(while (not (mlml (list (setq case (strcase (getstring nil "\nCase sensitive? : "))))
(list "Y" "YES" "N" "NO")
))
)
)
)
)
((= goTo 4)
; Obtain search string from user, set to strinF
(while (eq "" (setq strinF (getstring T "\nEnter search term: "))))
(setq goTo 6)
)
((= goTo 5)
; Obtain search string and replace string from user, set to strinF and strinR respectively
(while (eq "" (setq strinF (getstring T "\nEnter find term: "))))
(while (eq "" (setq strinR (getstring T "\nEnter replace term: "))))
(setq goTo 7)
)
((= goTo 6)
; Search drawing for strinF
(cond
((mlml (list case) (list "Y" "YES"))
; Compare using (vl-string-search strinF input), view selection
; use "while" to get all search occurances
(foreach selVar selSet
(if (vl-string-search strinF (nth 0 selVar))
(progn
(setq count (1+ count))
(if (/= (getvar "ctab") (caddr selVar)) (command "ctab" (caddr selVar)))
(command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar)))
(getstring "\nPress 'Enter' to continue: ")
)
)
)
)
((mlml (list case) (list "N" "NO"))
; Compare using (vl-string-search (strcase strinF) (strcase input)), view selection
; use "while" to get all search occurances
(foreach selVar selSet
(if (vl-string-search (strcase strinF) (strcase (nth 0 selVar)))
(progn
(setq count (1+ count))
(if (/= (getvar "ctab") (caddr selVar)) (command "ctab" (caddr selVar)))
(command "zoom" "c" (trans (cadr selVar) 0 1) (* 32 (nth 3 selVar)))
(getstring "\nPress 'Enter' to continue: ")
)
)
)
)
)
(if (= count 0) (setq error "\nNo matches found.") (setq error (strcat (itoa count) " matches found.")))
(setq goTo
)
((= goTo 7)
; Replace strinF with strinR
(cond
((mlml (list case) (list "Y" "YES"))
; Compare using (vl-search-string strinF input), modify using (vl-string-subst) within a while loop
(foreach selVar selSet
(setq selTxt (nth 0 selVar))
(setq seaLoc 0)
(while (setq seaLoc (vl-string-search strinF selTxt seaLoc))
(setq selTxt (vl-string-subst strinR strinF selTxt seaLoc))
(setq seaLoc (+ seaLoc (strlen strinR)))
(setq count (1+ count))
)
(vla-put-TextString (vlax-ename->vla-object (nth 4 selVar)) selTxt)
)
)
((mlml (list case) (list "N" "NO"))
; Compare using (vl-string-search (strcase strinF) (strcase input)), modify using (vl-string-subst) within a while loop
(foreach selVar selSet
(setq selTxt (nth 0 selVar))
(setq seaLoc 0)
(while (setq seaLoc (vl-string-search (strcase strinF) (strcase selTxt) seaLoc))
(setq selTxt (strcat (substr selTxt 1 seaLoc) strinR (substr selTxt (+ 1 seaLoc (strlen strinF)))))
(setq seaLoc (+ seaLoc (strlen strinR)))
(setq count (1+ count))
)
(vla-put-TextString (vlax-ename->vla-object (nth 4 selVar)) selTxt)
)
)
)
(if (= count 0) (setq error "\nNo occurances found.") (setq error (strcat (itoa count) " occurances modified.")))
(setq goTo
)
((= goTo
(if error (princ error))
(setq goWhile nil)
)
)
)
(princ)
)
(defun mlml(inSMLChar inSMLStri / returnVarMS toCheck chkWith)
(setq returnVarMS nil)
(if (and (= (type inSMLChar) 'LIST)
(= (type inSMLStri) 'LIST)
)
(progn
(foreach toCheck inSMLStri
(foreach chkWith inSMLChar
(if (eq toCheck chkWith) (setq returnVarMS T))
)
)
);/progn
)
returnVarMS
); Checks a list to see if a member of that list is the same as a member of another list. Returns T or nil
(defun extTxtPt(ssList / subVar getEnt entTyp entTxt entPnt entLay entHgt grp66 entAtt getEntAtt entAttTyp uniLst)
(setq uniLst nil)
(setq subVar 0)
(if ssList
(repeat (sslength ssList)
(setq getEnt (entget (cadr (car (ssnamex ssList subVar)))))
(setq entTyp (cdr (assoc 0 getEnt)))
(cond
((or (= entTyp "TEXT") (= entTyp "MTEXT"))
(setq entTxt (cdr (assoc 1 getEnt)))
(setq entPnt (cdr (assoc 10 getEnt)))
(setq entHgt (cdr (assoc 40 getEnt)))
(setq entLay (cdr (assoc 410 getEnt)))
(setq entNam (cdr (assoc -1 getEnt)))
(setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam))))
)
((= entTyp "INSERT")
(setq grp66 (assoc 66 getEnt))
(if grp66
(progn
(setq entAtt (entnext (cdr (assoc -1 getEnt))))
(setq getEntAtt (entget entAtt))
(setq entAttTyp (cdr (assoc 0 getEntAtt)))
)
)
(while (= entAttTyp "ATTRIB")
(setq entTxt (cdr (assoc 1 getEntAtt)))
(setq entPnt (cdr (assoc 10 getEntAtt)))
(setq entHgt (cdr (assoc 40 getEntAtt)))
(setq entLay (cdr (assoc 410 getEntAtt)))
(setq entNam (cdr (assoc -1 getEntAtt)))
(setq uniLst (append uniLst (list (list entTxt entPnt entLay entHgt entNam))))
; Get next entity.
(setq entAtt (entnext (cdr (assoc -1 getEntAtt))))
; Get ent and ent type
(setq getEntAtt (entget entAtt))
(setq entAttTyp (cdr (assoc 0 getEntAtt)))
)
)
(t
)
)
(setq subVar (1+ subVar))
)
)
uniLst
); Return list of all text-based objects (Text, MText, Attribute) in the current drawing
;;;-------------------------------------------------------------------
;; This function is freeware courtesy of the author's of "Inside AutoLisp"
;; for rel. 10 published by New Riders Publications.This credit must
;; accompany all copies of this function.
;;* UKWORD User key word. DEF, if any, must match one of the KWD strings
;;* BIT (1 for no null, 0 for none) and KWD key word ("" for none) are same as
;;* for INITGET. MSG is the prompt string, to which a default string is added
;;* as <DEF> (nil or "" for none), and a : is added.
;;*
(defun UKWORD (bit kwd msg def / inp)
(if (and def (/= def ""))
(setq msg (strcat "\n" msg " <" def "> : ")
bit (* 2 (fix (/ bit 2)))
) ;setq
) ;if
(initget bit kwd)
(setq inp (getkword msg))
(if inp inp def)
) ;defun
示例:默认情况下,只需=“FIND”
(UKWORD 0 "Find Replace Quit Case"
"\nSelect option : "
"FIND")
你好,韩。
原谅我的无知。
不太明白。附加的lisp是独立的还是合并到查找文本lisp中?
如果要加入公司,我应该在哪一部分和哪里插入?
谢谢 这是TFIND。lsp代码是别人写的,所以我尊重他之前在“通知->收件箱”中回复帖子#3的工作
也许你没有注意到?
;你试着编辑自己,这样你也可以学习
; Obtain desired option from user
(while (not (mlml (list (setq searep (strcase (getstring nil "\nSelect option : "))))
(list "F" "FIND" "R" "REPLACE" "Q" "QUIT" "C" "CASE")
))
)
到这个
(setq searep (strcase
(UKWORD 0 "Find Replace Quit Case"
"\nSelect option : "
"FIND")
))
哎呀。我不知道有你的下午。
理解。我明天会试试。谢谢 没关系 FWIW-
我个人使用过,并且通常是李的批量查找和替换文本例程的粉丝。
先生,我同意你的看法,毫无疑问,李的表演很精彩,但有时许多人仍在寻找适合自己需要的替代品
别担心;这就是为什么我以“为了它的价值”(又名FWIW)开始我的评论。
嗨,黑匣子。我以前也遇到过李的Lisp程序,我试过,因为时间很短,因为它涉及一个对话框,它并没有提供我需要的快速文本搜索(类似于Firefox浏览器搜索栏,(说真的,应该有一个)。
因此,目前,马克·梅西尔(Mark Mercier)的作品是最快的,最符合我的需要,即缩放到文本(特别是我正在快速连续搜索的门标签,例如,1-10…缩放…….1-45…缩放…….4-32…缩放……等等)。
虽然我仍然需要找到整个单词,而不是像通配符一样搜索。
(当我输入1-2时,它将循环到1-21、1-22、1-23、1-24,然后最后是1-2。)
所以基本上我无法打开那个或任何使用搜索框的lisp,输入提供的spae,移动鼠标单击enter,等待对话框关闭并缩放到门标签,然后重复一遍。
基本上,在这种情况下,命令行仍然工作得更快。
尽管如此,我愿意接受建议。只要比我现在做的更快
我很想补充一点,我也用了一些李的Lisp程序,简直太神奇了。
页:
[1]
2