benhubel 发表于 2022-7-5 16:38:39

反向编号

我经常使用文本对对象进行编号,以指定切割顺序。在过去,我拼凑了一些代码,可以快速增加或减少所有选定的数字文本,以防我出错和/或必须更改某些内容。这非常有效,但我经常发现我需要超越这一点,完全颠倒顺序。
 
以这段代码为起点,我认为这会非常简单,但我尝试对文本对象进行列表操作的事实完全让我感到厌烦。我对这类事情还是有点陌生。我想我应该得到一个所有选定文本的列表,对其排序,然后在对文本应用更改之前反转该列表。最高的数字与最低的数字交换,第二高的数字与第二低的数字交换,等等。
 
(“1”“2”)将变为(“2”“1”)
(“2”“1”“4”“5”“3”)将变为(“4”“5”“2”“1”“3”)
(“2”“8”“17”“4”)将变为(“17”“4”“2”“8”)
(“3”“5”“-4”)将变为(“3”“-4”“5”)
 
我不知道从哪里开始,也不知道使用什么流程。我的主要问题是,我不知道如何在不丢失到正确文本对象的链接的情况下对数据进行排序和编辑。任何帮助都会很棒。这是我尝试开始的快速递增/递减例程。
 
;Quick Increment/decrement
;Increments/decrements all selected text integers by 1
;I hacked this code together with help from an "increment in range" routine.
;Original code can be found here https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/incriment-numbered-text/td-p/3614646?nobounce

;Quick Increment
(defun C:qi (/ textselection textobject old)
(vl-load-com)
(setq textselection (ssget '((0 . "TEXT"))))
(repeat (sslength textselection)
   (setq
   textobject (vlax-ename->vla-object (ssname textselection 0))
   old (vla-get-TextString textobject); initial text content
   ); setq
   (if
   (and
       (= (strlen old) (strlen (itoa (atoi old)))); text represents integer
         ; Blocks e.g. "12A", "4.5", "C37", and completely non-numerical
         ;   text , but allows negative integers.
         ; Also disallows e.g. "06", "008", so if those should be included...
       (if (= (strlen old) 1) (wcmatch old "#") T)
         ; blocks single non-numerical character e.g. "A"
   ); and
   (vla-put-TextString textobject (itoa (+ (atoi old) 1))); replace
   ); if
   (ssdel (ssname textselection 0) textselection)
); repeat
(princ)
(setq sel1 (ssget "P"))
(sssetfirst nil sel1)
); defun

;Quick decrement
(defun C:qd (/ textselection textobject old)
(vl-load-com)
(setq textselection (ssget '((0 . "TEXT"))))
(repeat (sslength textselection)
   (setq
   textobject (vlax-ename->vla-object (ssname textselection 0))
   old (vla-get-TextString textobject); initial text content
   ); setq
   (if
   (and
       (= (strlen old) (strlen (itoa (atoi old)))); text represents integer
         ; Blocks e.g. "12A", "4.5", "C37", and completely non-numerical
         ;   text , but allows negative integers.
         ; Also disallows e.g. "06", "008", so if those should be included...
       (if (= (strlen old) 1) (wcmatch old "#") T)
         ; blocks single non-numerical character e.g. "A"
   ); and
   (vla-put-TextString textobject (itoa (- (atoi old) 1))); replace
   ); if
   (ssdel (ssname textselection 0) textselection)
); repeat
(princ)
(setq sel1 (ssget "P"))
(sssetfirst nil sel1)
); defun

Jef! 发表于 2022-7-5 16:56:44

嗨Benhubel。这里有一些想法
 
要对字符串进行排序,可以使用acad\u strlsort函数。缺点是它将使用ascii值对它们进行分类。
(acad_strlsort '("4" "5" "2" "1" "3" "10"))
("1" "10" "2" "3" "4" "5")
 
如果您拥有的所有数字长度相同(01、04、12、16),它将按“原样”完成工作。如果没有,你就需要操纵事情。要么你。。。
-检查字符串最大的数字,在数字前添加尽可能多的0,对其排序,然后在排序后删除0。痛苦的
-或者,您可以检索包含整数的字符串,在创建列表之前将其交换为整数,以对其进行vl排序或
-只需保持原样(字符串列表)并在每个成员上使用atoi,即可重建新列表。。。
(defun test ( lst / retlist)
(foreach mem lst
   (setq retlist (cons (atoi mem) retlist))
)
(vl-sort retlist '<)
)

Grrr 发表于 2022-7-5 17:05:03

嗨benhubel
我不知道你发布的代码与引用的任务有什么关系。以下是如何在列表中交换最小/最大值的示例:
_$ (vl-sort '("4" "3" "10" "0" "0.52" "1" "-3.4" "-0.25" "5" "2" "-2" "3.5" "6.8")
'(lambda (a b) (apply '< (mapcar 'read (list a b))))
)
("-3.4" "-2" "-0.25" "0" "0.52" "1" "2" "3" "3.5" "4" "5" "6.8" "10")
_$
关于数字实体关联,请更准确地描述您的目标。
你可以按照Jef的建议列出一个相关的列表,但我还不清楚。
像这样的列表
_$ (swap '("1" "2")) -> ("2" "1")
_$ (swap '("2" "1" "4" "5" "3")) -> ("4" "5" "2" "1" "3")
_$ (swap '("2" "8" "17" "4")) -> ("17" "4" "2" "8")
_$ (swap '("3" "5" "-4")) -> ("3" "-4" "5")将成为
6或
注意Ent1和Ent2的初始和最终位置。

Stefan BMR 发表于 2022-7-5 17:14:40

谢谢你的回复。
 
我引用的代码是我处理文本对象的起点。我的目标是使完成的程序与我发布的代码工作相同,只是它不是增加数字,而是反转数字。
我将用你们给出的例子进行实验,看看我能构建什么。如果我能使它正常工作,那么相关列表可能是一条可行的道路。
 
为了清楚起见,这张图片是我试图做的一个例子。

benhubel 发表于 2022-7-5 17:24:20

不需要assoc列表。事实上,在这种情况下,使用两个不同的列表更容易。
(defun c:qr(/ss i e s obj num n u m)(if(setq ss(ssget“_:L”((0。“TEXT”)))(progn(repeat(setq i(sslength ss))(setq e(vlax ename->vla object(ssname ss(setq i(1-i)))s(vla get textstring e))(if(and(setq d(distof s))(等于d(fix d)1e-(setq obj(cons e obj)num(cons(atoi s)num))))(if num(progn(setq n(vl-sort-i num)'

Stefan BMR 发表于 2022-7-5 17:33:48

哇,太棒了!我必须看一下,看看我是否能理解里面发生的一切。非常感谢你!

benhubel 发表于 2022-7-5 17:40:26

页: [1]
查看完整版本: 反向编号