ABuckingham 发表于 2022-7-6 17:27:46

顺序查找/替换?

我试图找出如何执行查找/替换类型例程,该例程将增加末尾的数字。为了解释,我必须编辑一些图纸,以反映基于现场布线的电路上的设备位置,因为它与原始图纸不同。这通常意味着我必须手动编辑每个条目,但是编辑过程中大部分标注保持不变,只有最后的数字发生变化,并且这些数字始终以数字顺序排列。典型的调用可能类似于ES-4-SP-105,下一个设备是ES-4-SP-106,以此类推。我可以使用传统的查找/替换来更改标注的第一部分,但是我希望能够简单地单击一个对象,并让它自动用下一个增量替换最后的数字,因此,我不必双击对象,只需单击它并移动到下一个设备。
我对AutoLISP的了解很少。我最初希望find/replace命令有一个命令行版本,这样我就可以构建一个增量并重复调用该命令,每次都添加增量;但是,我无法找到以这种方式使用查找/替换功能的方法。对我来说,使用直接代码的主要挑战是处理多个对象,如块、多行文字和文本。如有任何建议、指示或代码,将不胜感激。
 
提前感谢

lpseifert 发表于 2022-7-6 17:49:35

试试这里的沼泽;你必须注册,但它是免费的。

ABuckingham 发表于 2022-7-6 17:54:55

谢谢你的链接,但是VB中的实现我一点都不知道,所以我不能修改代码来实现我想要的增量。更重要的是,这似乎是一个标准的查找/替换,我需要修改它,以便可以按顺序选择对象。
 
基本上,我需要一个能做以下事情的程序:
 
1) 获取要在查找/关系中搜索的字符串
2) 获取开始计数的第一个增量
3) 请求用户输入要编辑的对象,然后进行文本交换
4) 递增后继续请求用户输入
5) 当用户说“停止”时停止
 
例如,我启动命令,然后键入3-EN-6-SP-??哪里是通配符。然后我会键入51以指示我单击的第一个对象应该标记为3-EN-6-SP-51。然后我单击一个块/文本/多行文字对象,它会查找/替换该对象上的文本。然后我单击另一个block/text/Mtext对象,它会在该对象中找到/与字符串3-EN-6-SP-52相关。然后我会一直单击,直到完成序列并按enter键完成命令。

JeepMaster 发表于 2022-7-6 18:15:03

我找到了这个旧的Lisp程序,可能会得到你想要的。
;;;Routine for Renumbering<p>;;;Realization {Smirnoff}</p><p>;;;http://www.autocad.ru/cgi-bin/f1/board.cgi?t=29829Am</p><p>;;;http://www.autocad.ru/cgi-bin/f1/board.cgi?t=21807yD</p><p>;;;Edition 23.10.2006 Vladimir Azarko (VVA)</p><p>;;;http://www.autocad.ru/cgi-bin/f1/board.cgi?t=30394Ae</p><p>(defun c:renum (/ oldPref oldSuf oldStart curText curStr vlaObj keepText)</p><p>(vl-load-com)</p><p>(defun TTC_Paste(pasteStr keepText / nslLst vlaObj)</p><p>(if (setq nslLst(nentsel "\nPaste text <exit> >>"))</exit></p><p>(progn (cond</p><p>((and (= 4(length nslLst))</p><p> (= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))); end and</p><p>(setq vlaObj (vlax-ename->vla-object (cdr(assoc -1(entget(car(last nslLst)))))))</p><p>(setq oldStat (vla-get-Measurement vlaObj))</p><p>(if keepText</p><p> (if (= (vla-get-TextOverride vlaObj) "")</p><p> (setq pasteStr (strcat pasteStr (rtos oldStat (vla-get-UnitsFormat vlaObj) (vla-get-PrimaryUnitsPrecision vlaObj))))</p><p> (setq pasteStr (strcat pasteStr (vla-get-TextOverride vlaObj)))))</p><p>(if (vl-catch-all-error-p(vl-catch-all-apply 'vla-put-TextOverride(list vlaObj pasteStr)))</p><p> (princ "\n Can't paste. Object may be on locked layer. "))); end condition #1</p><p>((and (= 4(length nslLst))</p><p>(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))); end and</p><p>(setq vlaObj (vlax-ename->vla-object(car nslLst)))</p><p>(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))</p><p>(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))</p><p>(princ "\nError. Can't pase text. ")(entupd (car(last nslLst))))); end condition # 2</p><p>((and (= 4(length nslLst))</p><p> (= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))); end and</p><p>(princ "\nCan't paste to block's DText or MText. ")); end condition #3</p><p>((and (= 2(length nslLst))</p><p>(member(cdr(assoc 0(entget(car nslLst)))) '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))); end and</p><p>(setq vlaObj (vlax-ename->vla-object(car nslLst)))</p><p>(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))</p><p>(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))</p><p>(princ "\nError. Can't pase text. "))); end condition #4</p><p>(T (princ "\nCan't paste. Invalid object. ")); end condition #5</p><p>); end cond</p><p>T); end progn</p><p>nil); end if</p><p>);_TTC_PASTE</p><p>(setq aDoc(vla-get-ActiveDocument(vlax-get-acad-object)))</p><p>(vla-StartUndoMark aDoc)</p><p>(if(not rnm:Pref)(setq rnm:Pref ""))(if(not rnm:Suf)(setq rnm:Suf ""))</p><p>(if(not rnm:Start)(setq rnm:Start 1))</p><p>(setq oldPref rnm:Pref oldSuf rnm:Suf oldStart rnm:Start); end setq</p><p>(setq rnm:Pref (getstring T (strcat "\nType prefix: : ")))</p><p>(if(= "" rnm:Pref)(setq rnm:Pref oldPref))(if(= " " rnm:Pref)(setq rnm:Pref ""))</p><p>(setq rnm:Suf (getstring T (strcat "\nType suffix: : ")))</p><p>(if(= "" rnm:Suf)(setq rnm:Suf oldSuf));(if(= " " rnm:Suf)(setq rnm:Suf ""))</p><p>(setq rnm:Start (getint (strcat "\nEnter start number </p><p>(itoa rnm:Start)">: ")))</p><p>(if(null rnm:Start)(setq rnm:Start oldStart))</p><p>(initget "Yes No Ä</p>

ABuckingham 发表于 2022-7-6 18:27:12

我没有太多时间玩肾素。lsp,但我初步尝试使用它没有成功。我编写了以下代码,它完成了我需要为text对象执行的操作。
 
然而,代码有一些问题。首先,没有错误处理。在运行其余代码之前,代码可能应该进行测试,以查看所选对象是否为文本对象。第二,(命令“change”)的使用是一种解决方法,因为我不知道如何直接编辑对象属性——有人有这方面的资源吗?我对我编写它的方式的主要抱怨是代码中的“”集合缺乏透明度。
 
不用多说,下面是代码。该功能被称为“cx”,因为它们靠近键盘,不用于任何其他用途。
 
(defun c:cx() ;;Edits text objects by replacing current text with a prefix and an incremental numerical suffix

(setq prefix (getstring "Prefix:")) ;; prompts the user for the string prefix
(setq startint (getint "Initial number:")) ;; prompts the user for the initial number
(setq cnt 0) ;; intializes the counter

(while
   (PROGN
   (setq ent (entsel)) ;;requests the first text to edit
   (setq newstring (strcat prefix (itoa (+ startint cnt)))) ;;created the string
   (command "change" (car ent) "" "" "" "" "" "" newstring) ;;replace the string
   (setq cnt (1+ cnt)) ;; increment the counter
    )
)
)
 
感谢您对改进此代码的任何意见。最终,我希望能够用这个例程编辑块属性和多行文字,但它现在适用于我当前的图形。

JeepMaster 发表于 2022-7-6 18:30:03

对不起,我之前发布的代码有问题,因为我把它从一个更大的lisp例程中去掉了。这是ASMI的独立版本。
;; ============================================================ ;;
;;                                                            ;;
;;RENUM.LSP - This program converts TEXT, MTEXT and;;
;;            ATTRIBUTES in numbers with a prefix and;;
;;            a suffix.   ;;
;;                                                         ;;
;; ============================================================ ;;
;;                                                             ;;
;;Command(s) to call: RENUM                                 ;;
;;                                                             ;;
;;Specify a suffix, a prefix and starting number (for erase;;
;;the old suffix or prefix you should press Spacebar). Pick;;
;;to TEXT, MTEXT, ATTRIBUTES or press Esc to quit. The;;
;;program remembers old properties and it is possible to;;
;;confirm it pressing of Spacebar key.   ;;
;;                                                            ;;
;; ============================================================ ;;
;;                                                            ;;
;;THIS PROGRAM AND PARTS OF IT MAY REPRODUCED BY ANY METHOD ;;
;;ON ANY MEDIUM FOR ANY REASON. YOU CAN USE OR MODIFY THIS ;;
;;PROGRAM OR PARTS OF IT ABSOLUTELY FREE.                  ;;
;;                                                            ;;
;;THIS PROGRAM PROVIDES THIS PROGRAM 'AS IS' WITH ALL FAULTS ;;
;;AND SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF;;
;;MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.            ;;
;;                                                             ;;
;; ============================================================ ;;
;;                                                            ;;
;;V1.3, 12 May, 2005, Riga, Latvia                            ;;
;;© Aleksandr Smirnov (ASMI)                           ;;
;;For AutoCAD 2000 - 2008 (isn't tested in a next versions) ;;
;;                                                            ;;
;;                           http://www.asmitools.com    ;;
;;                                                             ;;
;; ============================================================ ;;

(defun c:renum (/ oldPref oldSuf oldStart curText curStr)
(vl-load-com)
(if(not rnm:Pref)(setq rnm:Pref ""))
(if(not rnm:Suf)(setq rnm:Suf ""))
(if(not rnm:Start)(setq rnm:Start 1))
(setq oldPref rnm:Pref
       oldSuf rnm:Suf
       oldStart rnm:Start); end setq
(setq rnm:Pref
   (getstring T
   (strcat "\nPrefix: <"rnm:Pref">: ")))
(if(= "" rnm:Pref)(setq rnm:Pref oldPref))
(if(= " " rnm:Pref)(setq rnm:Pref ""))
(setq rnm:Suf
   (getstring T
   (strcat "\nSuffix: <"rnm:Suf">: ")))
(if(= "" rnm:Suf)(setq rnm:Suf oldSuf))
(if(= " " rnm:Suf)(setq rnm:Suf ""))
(setq rnm:Start
   (getint
   (strcat "\nStarting number <"
      (itoa rnm:Start)">: ")))
(if(null rnm:Start)(setq rnm:Start oldStart))
    (while T
      (setq curStr(strcat rnm:Pref(itoa rnm:Start)rnm:Suf))
      (setq curText
          (car
            (nentsel
"\n<<< Pick TEXT, MTEXT or ATTRIBUTE or press Esc to quit >>> ")))
      (if
      (and
          curText
          (member(cdr(assoc 0(entget curText)))
      '("TEXT" "MTEXT" "ATTRIB"))
          ); end and
      (progn
   (if
   (vl-catch-all-error-p
       (vl-catch-all-apply 'vla-put-TextString
(list(vlax-ename->vla-object curText)curStr)))
      (princ "\n<!> Entity on locked layer <!>")
             (setq rnm:Start(1+ rnm:Start))
   ); end if
      ); end progn
       (princ "\n<!> This is not DText or MText <!>")
       ); end if
      ); end while
(princ)
); end of c:renum
(princ
(strcat "\n*** Text, MText or Attributes"
         " numbering tool. Type RENUM to run.*** "))
   
         
查看ASMI的网站。http://www.asmitools.com
页: [1]
查看完整版本: 顺序查找/替换?