Tunnelrat 发表于 2022-7-6 06:56:33

lisp删除最后一个字符

你好
我见过lisp将字母添加到文本中,但我找不到通过窗口删除或跨越最后一个字母的lisp。请你帮我找到一个,如果它已经张贴或可能写一个给我。
非常感谢。

BlackBox 发表于 2022-7-6 07:01:54

下面是一个简单的示例:
 

(defun c:FOO ( / ss)
(if (setq ss (ssget "_:L" '((0 . "TEXT"))))
   ((lambda (i / e ed s)
      (while (setq e (ssname ss (setq i (1+ i))))
      (setq ed (entget e))
      (setq s (assoc 1 ed))
      (setq ed (subst (cons 1 (substr (cdr s) 1 (1- (strlen (cdr s))))) s ed))
      (entmod ed)))
   -1)
   (prompt "\n** Nothing selected ** "))
(princ))

 
这段代码可以变得更高效,但我保留了多个setq,以便您能够理解代码在每个步骤中所做的事情。

Tunnelrat 发表于 2022-7-6 07:05:45

这很漂亮。
谢谢你RenderMan

Tharwat 发表于 2022-7-6 07:06:21

函数*vl string right trim*也可以帮助您实现这一点。
例如
 
(vl-string-right-trim "456" "123456")

 
塔瓦特

BlackBox 发表于 2022-7-6 07:09:36

 
不客气。

BlackBox 发表于 2022-7-6 07:15:19

 
“vl字符串subst”也是如此:wink:(
 

(defun c:FOO ( / *error* oldNomutt ss oDoc s)
(vl-load-com)
(princ "\rFOO ")
(defun *error*(msg)
   (and oldNomutt (setvar 'nomutt oldNomutt))
   (if oDoc (vla-endundomark oDoc))
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** "))))               ; Fatal error, display it
   (princ))
(prompt "\nSelect text objects to remove last character: ")
(and (setq oldNomutt (getvar 'nomutt)) (setvar 'nomutt 1))
(if (setq ss (ssget "_:L" '((0 . "TEXT"))))
   (progn
   (vla-startundomark
       (setq oDoc (vla-get-activedocument (vlax-get-acad-object))))
   (vlax-for x(setq ss (vla-get-activeselectionset oDoc))
       (setq s (vla-get-textstring x))
       ;|
      (vla-put-textstring
          x
          (vl-string-subst
            ""
            (substr s (strlen s) 1)
            s)))
            |;
       (vla-put-textstring x (substr s 1 (1- (strlen s)))))
   (vla-endundomark oDoc)
   (vla-delete ss)
   (setvar 'nomutt oldNomutt))
   (progn
   (setvar 'nomutt oldNomutt)
   (prompt "\n** Nothing selected ** ")))
(princ))

Lee Mac 发表于 2022-7-6 07:18:24

伦德曼,我想你的意思是:
 
但是要小心使用这种方法。。。
 

(setq s "Renderman")
(vl-string-subst "" (substr s (strlen s)) s)
 
如果您只想删除特定数量的字符,vl string right trim也将是不可预测的。
 
我会使用substr,正如你在第一篇文章中所做的那样。

BlackBox 发表于 2022-7-6 07:20:44

 
接得好,李。
 
代码已修订。

Tharwat 发表于 2022-7-6 07:23:53

带有注释性文本的Subst和entmod将导致Cad出错。
 
很好的例程Renderman,为什么不把多行文字也包括在例程中呢。!
 
当做
 
塔瓦特

BlackBox 发表于 2022-7-6 07:25:19

 
我不认识任何专业人士(例如,我工作的公司等),使用注释性对象。
 
 
谢谢
 
至于多行文字,从技术上讲,您可以将其添加到选择集过滤器,因为该点是修剪最后一个字符。然而,这可能正是我的工作方式,但我在文本中放置了不同类型的数据,就像多行文字一样。如果我需要删除多行文字文本字符串的最后一个字符,我永远不会有任何实际目的(或者至少想不出任何实际目的):
 

;   TextString = "{\\C1;This\\P\\C2;is\\P\\C4;a\\P\\C6;test}"

 
给每一个人。
页: [1] 2
查看完整版本: lisp删除最后一个字符