乐筑天下's Archiver

社区 › Auto Lisp › 懒惰的打字员文本编辑:

pBe 发表于 2022-7-6 09:05:44

懒惰的打字员文本编辑: 这是一个同事奇怪的请求:
 
假设您有一个文本“15 LF OF 2”X6“水平支撑”
和另一个文字“20 LF OF 2”X10“水平和垂直支撑”,
如果你想把单词“AND VERTICAL”复制到第一篇文章的中间句
要获得“15 LF OF 2”X6“水平和垂直支撑”,该怎么做?
 
双击、剪切和粘贴?
_查找?
 
如果…怎么办
 
第一个文本“10 20 30 60 70”
第二个文本“40 80 100 60 50 30”
 
从第二个文本中抓取“40”和“50”,得到“10 20 30 40 50 60 70”
 
或者你用这个:
 
(defun c:MidSentence (/ CDiaStr ListBoxDia CollectStr
                     StringList StrListS a RepStr b fnSTR)
(defun CDiaStr()
      (setq StrDiaFnme (vl-filename-mktemp "tmp.DCL"))
      (setq fnSTR (open StrDiaFnme "a"))
      (write-line
            "dcl_settings : default_dcl_settings { audit_level = 3; }
MidSentence : dialog
{ label = \"\"; key= \"Taytol\";
: list_box { key = \"StrListS\"; multiple_select =
true; width = 20; height = 20; } spacer ;
ok_cancel;
}"fnSTR)
             (close fnSTR) T
      )
;;;       List Box Dialog ;;;
(defun ListBoxDia (DiaName DiaKey Title Lst)
       (setq StrDIA (load_dialog StrDiaFnme))
(if (not (new_dialog DiaName StrDIA))
(exit)
    )
(start_list DiaKey)
(mapcar 'add_list Lst)
(end_list)
       (set_tile "Taytol" Title)
(action_tile DiaKey (vl-prin1-to-string
      (quote (set (setq dd (read DiaKey)) (get_tile $key)))))
(action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
(start_dialog)
   (unload_dialog StrDIA)
       (mapcar '(lambda (x)
                              (atoi (chr x)))
                     (vl-remove
                           32
                           (vl-string->list (eval (read DiaKey)))))
      )
;;;      Collect String from List ;;;
(defun CollectStr(LstS LstC)
   (apply 'Strcat
            (mapcar '(lambda (y) (strcat (nth y LstC) " ")) LstS))
   )      
;;;String To List;;;
(defun StringList (ent / Str i Lst)
(setq Str (cdr (assoc 1 (entget(ssname ent 0)))))
(while
      (setq i (vl-string-search " " str))
          (setq Lst (cons (substr str 1 i) Lst))
          (setq str (substr str (+ 2 i)))
      )
(reverse (cons str Lst)))
            (cond ((and
(setq a (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
               (setq StrList (StringList a))
(CDiaStr)
       (Setq RepStr (CollectStr
                                  (ListBoxDia
                                        "MidSentence"
                                        "StrListS"
                                        "Select String to Follow"
                                        StrList)
                                  StrList))
               (setq b (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
               (setq StrList (StringList b))
(vla-put-textstring
      (setq a (vlax-ename->vla-object (ssname a 0)))
      (vl-string-subst
            (strcat RepStr (CollectStr
                  (ListBoxDia
                        "MidSentence"
                        "StrListS"
                        "Select String to Insert"
                        StrList)
                  StrList))
            RepStr
            (vla-get-textstring a)))
               (vl-file-delete StrDiaFnme)
               ))
             )
)
 
仍然需要做很多工作,但编写代码很有趣
 

ketxu 发表于 2022-7-6 09:14:14

这很有趣的代码^^但我认为Ctrl C和Ctrl V更快,除了文字抓取不连续^^谢谢!
如果同时选择2个文本和列表框2个文本内容与列表框,效果会更好,更改可以立即显示

alanjt 发表于 2022-7-6 09:15:25

格式化呢?

pBe 发表于 2022-7-6 09:21:01

 
好建议。。并在底部实时显示结果字符串。。。

pBe 发表于 2022-7-6 09:26:32

 
也在努力。我真的没有花太多时间在这上面,我认为这是李-麦克所说的一个新奇的项目。也许我可以把它变成一个有趣的游戏。(这是一个想法)
 
谢谢Alanjt

alanjt 发表于 2022-7-6 09:32:45

这是我正在研究的一个(只想用另一个词替换第一个词)。这是可行的,但我失去了兴趣,放弃了这个项目。然而,一些编码可能有用。。。
 
(defun _breakup (s / foo l i d l1 l2)

(defun foo (s / f n)
   (setq s (strcase s))
   (foreach x '("\\N" " " "\\P")
   (and (setq f (vl-string-search x s)) (setq n (cons (list f x) n)))
   )
   n
)

(while
   (setq i (caar (setq l (vl-sort (foo s) '(lambda (a b) (< (car a) (car b))))))
         d (cadar l)
   )
    (setq l1 (cons (substr s 1 i) l1)
          l2 (cons (substr s (1+ i) (strlen d)) l2)
          s(substr s (+ i 1 (strlen d)))
    )
)
(if l2
   (mapcar 'reverse (list (cons s l1) l2))
   s
)
)


(defun c:REPF (/ _reunion text string replacement)
;; Alan J. Thompson, 06.20.11




;;;(defun _breakup (s / i d l1 l2)
;;;    (while
;;;      (setq i (vl-some '(lambda (x) (vl-string-search (setq d x) (strcase s))) '("\\N" " " "\\P")))
;;;       (setq l1 (cons (substr s 1 i) l1)
;;;             l2 (cons (substr s (1+ i) (strlen d)) l2)
;;;             s(substr s (+ i 1 (strlen d)))
;;;       )
;;;    )
;;;    (mapcar 'reverse (list (cons s l1) l2))
;;;)



(defun _reunion (lst)
   (apply 'strcat
          (apply 'append
               (mapcar '(lambda (a b) (list a b))
                         (car lst)
                         (if (> (length (car lst)) (length (cadr lst)))
                           (append (cadr lst) (list ""))
                           (cadr lst)
                         )
               )
          )
   )
)

(if
   (and
   (AT:GetSel
       entsel
       "\nSelect text to replace first word: "
       (lambda (x)
         (if (wcmatch (cdr (assoc 0 (entget (car x)))) "ATTDEF,ATTRIB,MTEXT,MULTILEADER,TEXT")
         (setq text   (vlax-ename->vla-object (car x))
               string (_breakup (AT:TextString (car x)))
         )
         )
       )
   )
   (not (vl-position
            (setq replacement (AT:GetString "Specify replacement string" (caar string)))
            (list "" nil (caar string))
          )
   )
   )
    (vla-put-textstring text (_reunion (list (cons replacement (cdar string)) (cadr string))))
)
(princ)
)










(defun c:Test (/ _reunion text string replacement)


(defun _reunion (lst)
   (apply 'strcat
          (apply 'append
               (mapcar '(lambda (a b) (list a b))
                         (car lst)
                         (if (> (length (car lst)) (length (cadr lst)))
                           (append (cadr lst) (list ""))
                           (cadr lst)
                         )
               )
          )
   )
)

(if
   (and
   (AT:GetSel
       entsel
       "\nSelect text to replace first word: "
       (lambda (x)
         (if (wcmatch (cdr (assoc 0 (entget (car x)))) "ATTDEF,ATTRIB,MTEXT,MULTILEADER,TEXT")
         (setq text   (vlax-ename->vla-object (car x))
               string (_breakup (AT:TextString (car x)))
         )
         )
       )
   )
   (setq replacement (dos_proplist "" "" (mapcar '(lambda (x) (cons x x)) (car string))))
   )
    (vla-put-textstring text (_reunion (list (mapcar 'cdr replacement) (cadr string))))
)
(princ)
)





(defun AT:GetSel (meth msg fnc / ent)
;; meth - selection method (entsel, nentsel, nentselp)
;; msg - message to display (nil for default)
;; fnc - optional function to apply to selected object
;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
;; Alan J. Thompson, 05.25.10
(setvar 'ERRNO 0)
(while
   (progn (setq ent (meth (cond (msg)
                              ("\nSelect object: ")
                        )
                  )
          )
          (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
                ((eq (type (car ent)) 'ENAME)
               (if (and fnc (not (fnc ent)))
                   (princ "\nInvalid object!")
               )
                )
          )
   )
)
ent
)





(defun AT:GetString (#Title #Default / #FileName #FileOpen #DclID #NewString)
;; Getstring Dialog Box
;; #Title - Title of dialog box
;; #Default - Default string within edit box
;; Alan J. Thompson, 08.25.09
(setq #FileName (vl-filename-mktemp "" "" ".dcl")
       #FileOpen (open #FileName "W")
)
(foreach x '("TempEditBox : dialog {"                      "key = \"Title\";"
            "label = \"\";"      "initial_focus = \"Edit\";"
            "spacer;"            ": row {"            ": column {"
            "alignment = centered;"                     "fixed_width = true;"
            ": text {"             "label = \"\";"      "}"
            "}"                  ": edit_box {"         "key = \"Edit\";"
            "allow_accept = true;" "edit_width = 40;"   "fixed_width = true;"
            "}"                  "}"                  "spacer;"
            ": row {"            "fixed_width = true;""alignment = centered;"
            ": ok_button {"      "width = 11;"          "}"
            ": cancel_button {"    "width = 11;"          "}"
            "}"                  "}//"
             )
   (write-line x #FileOpen)
)
(close #FileOpen)
(setq #DclID (load_dialog #FileName))
(new_dialog "TempEditBox" #DclID)
(set_tile "Title" #Title)
(set_tile "Edit" #Default)
(action_tile "accept" "(setq #NewString (get_tile \"Edit\"))(done_dialog)")
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(unload_dialog #DclID)
(vl-file-delete #FileName)
#NewString
)



(defun AT:TextString (Obj)
;; Extract textstring (with symbols) from text object
;; Works on: Attrib, Attdef, MText, Multileader, Text
;; Obj - Object to extract textstring from
;; Alan J. Thompson, 11.24.09 / 04.13.10
(if Obj
   ((lambda (e)
      (cond ((eq (cdr (assoc 0 e)) "MULTILEADER") (cdr (assoc 304 e)))
            ((vl-position (cdr (assoc 0 e)) '("ATTDEF" "ATTRIB" "TEXT")) (cdr (assoc 1 e)))
            ((eq (cdr (assoc 0 e)) "MTEXT")
             (apply (function strcat)
                  (mapcar (function (lambda (x)
                                        (if (vl-position (car x) '(1 3))
                                          (cdr x)
                                          ""
                                        )
                                    )
                            )
                            e
                  )
             )
            )
      )
    )
   (entget (cond ((vl-consp Obj) (car Obj))
                   ((eq (type Obj) 'ENAME) Obj)
                   ((eq (type Obj) 'VLA-ObjECT) (vlax-vla-object->ename Obj))
             )
   )
   )
)
)
 
 
编辑:添加缺少的子例程。

autolisp 发表于 2022-7-6 09:36:16

尊敬的埃罗先生:

alanjt 发表于 2022-7-6 09:41:45

添加了缺失的子例程,但这不是“完整的代码”,它是一个废弃的概念证明。如果有兴趣的话,我把它贴出来是为了pBe的挖掘。

ketxu 发表于 2022-7-6 09:44:33

@alanjt:你使用dos_proplist,并且。。。。。

alanjt 发表于 2022-7-6 09:51:55

arg。下载DosLib和其他缺失的内容,我会发布。
 
我应该把它交给pBe。
页: [1] 2

查看完整版本: 懒惰的打字员文本编辑:

Powered by Discuz! X3.4 Archiver   Copyright © 2001-2021, Tencent Cloud.