乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 28|回复: 13

[编程交流] 懒惰的打字员文本编辑:

[复制链接]
pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 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”
 
或者你用这个:
 
  1. (defun c:MidSentence (/ CDiaStr ListBoxDia CollectStr
  2.                      StringList StrListS a RepStr b fnSTR)
  3. (defun CDiaStr  ()
  4.       (setq StrDiaFnme (vl-filename-mktemp "tmp.DCL"))
  5.       (setq fnSTR (open StrDiaFnme "a"))
  6.       (write-line
  7.             "dcl_settings : default_dcl_settings { audit_level = 3; }
  8. MidSentence : dialog
  9. { label = ""; key= "Taytol";
  10. : list_box { key = "StrListS"; multiple_select =
  11. true; width = 20; height = 20; } spacer ;
  12. ok_cancel;
  13. }"  fnSTR)
  14.              (close fnSTR) T
  15.       )
  16. ;;;       List Box Dialog ;;;
  17. (defun ListBoxDia (DiaName DiaKey Title Lst)
  18.        (setq StrDIA (load_dialog StrDiaFnme))
  19. (if (not (new_dialog DiaName StrDIA))
  20.   (exit)
  21.     )
  22. (start_list DiaKey)
  23.   (mapcar 'add_list Lst)
  24.   (end_list)
  25.        (set_tile "Taytol" Title)
  26. (action_tile DiaKey (vl-prin1-to-string
  27.         (quote (set (setq dd (read DiaKey)) (get_tile $key)))))
  28. (action_tile "accept" "(done_dialog 1)")
  29.    (action_tile "cancel" "(done_dialog 0)")
  30. (start_dialog)
  31.    (unload_dialog StrDIA)
  32.        (mapcar '(lambda (x)
  33.                               (atoi (chr x)))
  34.                        (vl-remove
  35.                              32
  36.                              (vl-string->list (eval (read DiaKey)))))
  37.         )
  38. ;;;      Collect String from List ;;;
  39. (defun CollectStr  (LstS LstC)
  40.      (apply 'Strcat
  41.             (mapcar '(lambda (y) (strcat (nth y LstC) " ")) LstS))
  42.      )      
  43. ;;;  String To List  ;;;
  44. (defun StringList (ent / Str i Lst)
  45. (setq Str (cdr (assoc 1 (entget  (ssname ent 0)))))
  46.   (while
  47.         (setq i (vl-string-search " " str))
  48.           (setq Lst (cons (substr str 1 i) Lst))
  49.           (setq str (substr str (+ 2 i)))
  50.         )
  51.   (reverse (cons str Lst)))
  52.             (cond ((and
  53. (setq a (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
  54.                (setq StrList (StringList a))
  55. (CDiaStr)
  56.        (Setq RepStr (CollectStr
  57.                                   (ListBoxDia
  58.                                         "MidSentence"
  59.                                         "StrListS"
  60.                                         "Select String to Follow"
  61.                                         StrList)
  62.                                   StrList))
  63.                (setq b (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
  64.                (setq StrList (StringList b))
  65. (vla-put-textstring
  66.       (setq a (vlax-ename->vla-object (ssname a 0)))
  67.       (vl-string-subst
  68.             (strcat RepStr (CollectStr
  69.                   (ListBoxDia
  70.                         "MidSentence"
  71.                         "StrListS"
  72.                         "Select String to Insert"
  73.                         StrList)
  74.                   StrList))
  75.             RepStr
  76.             (vla-get-textstring a)))
  77.                (vl-file-delete StrDiaFnme)
  78.                ))
  79.              )
  80. )

 
仍然需要做很多工作,但编写代码很有趣
 
100555uyrsq0r7zqarpbqa.jpg
100556lygy0sryygz3uucy.jpg
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:14:14 | 显示全部楼层
这很有趣的代码^^但我认为Ctrl C和Ctrl V更快,除了文字抓取不连续^^谢谢!
如果同时选择2个文本和列表框2个文本内容与列表框,效果会更好,更改可以立即显示
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:15:25 | 显示全部楼层
格式化呢?
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:21:01 | 显示全部楼层
 
好建议。。并在底部实时显示结果字符串。。。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:26:32 | 显示全部楼层
 
也在努力。我真的没有花太多时间在这上面,我认为这是李-麦克所说的一个新奇的项目。也许我可以把它变成一个有趣的游戏。(这是一个想法)
 
谢谢Alanjt
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:32:45 | 显示全部楼层
这是我正在研究的一个(只想用另一个词替换第一个词)。这是可行的,但我失去了兴趣,放弃了这个项目。然而,一些编码可能有用。。。
 
  1. (defun _breakup (s / foo l i d l1 l2)
  2. (defun foo (s / f n)
  3.    (setq s (strcase s))
  4.    (foreach x '("\\N" " " "\\P")
  5.      (and (setq f (vl-string-search x s)) (setq n (cons (list f x) n)))
  6.    )
  7.    n
  8. )
  9. (while
  10.    (setq i (caar (setq l (vl-sort (foo s) '(lambda (a b) (< (car a) (car b))))))
  11.          d (cadar l)
  12.    )
  13.     (setq l1 (cons (substr s 1 i) l1)
  14.           l2 (cons (substr s (1+ i) (strlen d)) l2)
  15.           s  (substr s (+ i 1 (strlen d)))
  16.     )
  17. )
  18. (if l2
  19.    (mapcar 'reverse (list (cons s l1) l2))
  20.    s
  21. )
  22. )
  23. (defun c:REPF (/ _reunion text string replacement)
  24. ;; Alan J. Thompson, 06.20.11
  25. ;;;  (defun _breakup (s / i d l1 l2)
  26. ;;;    (while
  27. ;;;      (setq i (vl-some '(lambda (x) (vl-string-search (setq d x) (strcase s))) '("\\N" " " "\\P")))
  28. ;;;       (setq l1 (cons (substr s 1 i) l1)
  29. ;;;             l2 (cons (substr s (1+ i) (strlen d)) l2)
  30. ;;;             s  (substr s (+ i 1 (strlen d)))
  31. ;;;       )
  32. ;;;    )
  33. ;;;    (mapcar 'reverse (list (cons s l1) l2))
  34. ;;;  )
  35. (defun _reunion (lst)
  36.    (apply 'strcat
  37.           (apply 'append
  38.                  (mapcar '(lambda (a b) (list a b))
  39.                          (car lst)
  40.                          (if (> (length (car lst)) (length (cadr lst)))
  41.                            (append (cadr lst) (list ""))
  42.                            (cadr lst)
  43.                          )
  44.                  )
  45.           )
  46.    )
  47. )
  48. (if
  49.    (and
  50.      (AT:GetSel
  51.        entsel
  52.        "\nSelect text to replace first word: "
  53.        (lambda (x)
  54.          (if (wcmatch (cdr (assoc 0 (entget (car x)))) "ATTDEF,ATTRIB,MTEXT,MULTILEADER,TEXT")
  55.            (setq text   (vlax-ename->vla-object (car x))
  56.                  string (_breakup (AT:TextString (car x)))
  57.            )
  58.          )
  59.        )
  60.      )
  61.      (not (vl-position
  62.             (setq replacement (AT:GetString "Specify replacement string" (caar string)))
  63.             (list "" nil (caar string))
  64.           )
  65.      )
  66.    )
  67.     (vla-put-textstring text (_reunion (list (cons replacement (cdar string)) (cadr string))))
  68. )
  69. (princ)
  70. )
  71. (defun c:Test (/ _reunion text string replacement)
  72. (defun _reunion (lst)
  73.    (apply 'strcat
  74.           (apply 'append
  75.                  (mapcar '(lambda (a b) (list a b))
  76.                          (car lst)
  77.                          (if (> (length (car lst)) (length (cadr lst)))
  78.                            (append (cadr lst) (list ""))
  79.                            (cadr lst)
  80.                          )
  81.                  )
  82.           )
  83.    )
  84. )
  85. (if
  86.    (and
  87.      (AT:GetSel
  88.        entsel
  89.        "\nSelect text to replace first word: "
  90.        (lambda (x)
  91.          (if (wcmatch (cdr (assoc 0 (entget (car x)))) "ATTDEF,ATTRIB,MTEXT,MULTILEADER,TEXT")
  92.            (setq text   (vlax-ename->vla-object (car x))
  93.                  string (_breakup (AT:TextString (car x)))
  94.            )
  95.          )
  96.        )
  97.      )
  98.      (setq replacement (dos_proplist "" "" (mapcar '(lambda (x) (cons x x)) (car string))))
  99.    )
  100.     (vla-put-textstring text (_reunion (list (mapcar 'cdr replacement) (cadr string))))
  101. )
  102. (princ)
  103. )
  104. (defun AT:GetSel (meth msg fnc / ent)
  105. ;; meth - selection method (entsel, nentsel, nentselp)
  106. ;; msg - message to display (nil for default)
  107. ;; fnc - optional function to apply to selected object
  108. ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  109. ;; Alan J. Thompson, 05.25.10
  110. (setvar 'ERRNO 0)
  111. (while
  112.    (progn (setq ent (meth (cond (msg)
  113.                                 ("\nSelect object: ")
  114.                           )
  115.                     )
  116.           )
  117.           (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  118.                 ((eq (type (car ent)) 'ENAME)
  119.                  (if (and fnc (not (fnc ent)))
  120.                    (princ "\nInvalid object!")
  121.                  )
  122.                 )
  123.           )
  124.    )
  125. )
  126. ent
  127. )
  128. (defun AT:GetString (#Title #Default / #FileName #FileOpen #DclID #NewString)
  129. ;; Getstring Dialog Box
  130. ;; #Title - Title of dialog box
  131. ;; #Default - Default string within edit box
  132. ;; Alan J. Thompson, 08.25.09
  133. (setq #FileName (vl-filename-mktemp "" "" ".dcl")
  134.        #FileOpen (open #FileName "W")
  135. )
  136. (foreach x '("TempEditBox : dialog {"                      "key = "Title";"
  137.               "label = "";"        "initial_focus = "Edit";"
  138.               "spacer;"              ": row {"              ": column {"
  139.               "alignment = centered;"                       "fixed_width = true;"
  140.               ": text {"             "label = "";"        "}"
  141.               "}"                    ": edit_box {"         "key = "Edit";"
  142.               "allow_accept = true;" "edit_width = 40;"     "fixed_width = true;"
  143.               "}"                    "}"                    "spacer;"
  144.               ": row {"              "fixed_width = true;"  "alignment = centered;"
  145.               ": ok_button {"        "width = 11;"          "}"
  146.               ": cancel_button {"    "width = 11;"          "}"
  147.               "}"                    "}//"
  148.              )
  149.    (write-line x #FileOpen)
  150. )
  151. (close #FileOpen)
  152. (setq #DclID (load_dialog #FileName))
  153. (new_dialog "TempEditBox" #DclID)
  154. (set_tile "Title" #Title)
  155. (set_tile "Edit" #Default)
  156. (action_tile "accept" "(setq #NewString (get_tile "Edit"))(done_dialog)")
  157. (action_tile "cancel" "(done_dialog)")
  158. (start_dialog)
  159. (unload_dialog #DclID)
  160. (vl-file-delete #FileName)
  161. #NewString
  162. )
  163. (defun AT:TextString (Obj)
  164. ;; Extract textstring (with symbols) from text object
  165. ;; Works on: Attrib, Attdef, MText, Multileader, Text
  166. ;; Obj - Object to extract textstring from
  167. ;; Alan J. Thompson, 11.24.09 / 04.13.10
  168. (if Obj
  169.    ((lambda (e)
  170.       (cond ((eq (cdr (assoc 0 e)) "MULTILEADER") (cdr (assoc 304 e)))
  171.             ((vl-position (cdr (assoc 0 e)) '("ATTDEF" "ATTRIB" "TEXT")) (cdr (assoc 1 e)))
  172.             ((eq (cdr (assoc 0 e)) "MTEXT")
  173.              (apply (function strcat)
  174.                     (mapcar (function (lambda (x)
  175.                                         (if (vl-position (car x) '(1 3))
  176.                                           (cdr x)
  177.                                           ""
  178.                                         )
  179.                                       )
  180.                             )
  181.                             e
  182.                     )
  183.              )
  184.             )
  185.       )
  186.     )
  187.      (entget (cond ((vl-consp Obj) (car Obj))
  188.                    ((eq (type Obj) 'ENAME) Obj)
  189.                    ((eq (type Obj) 'VLA-ObjECT) (vlax-vla-object->ename Obj))
  190.              )
  191.      )
  192.    )
  193. )
  194. )

 
 
编辑:添加缺少的子例程。
回复

使用道具 举报

18

主题

58

帖子

41

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
91
发表于 2022-7-6 09:36:16 | 显示全部楼层
尊敬的埃罗先生:
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:41:45 | 显示全部楼层
添加了缺失的子例程,但这不是“完整的代码”,它是一个废弃的概念证明。如果有兴趣的话,我把它贴出来是为了pBe的挖掘。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:44:33 | 显示全部楼层
@alanjt:你使用dos_proplist,并且。。。。。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:51:55 | 显示全部楼层
arg。下载DosLib和其他缺失的内容,我会发布。
 
我应该把它交给pBe。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-7 13:31 , Processed in 2.391315 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表