乐筑天下

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

[编程交流] 反向编号

[复制链接]

16

主题

69

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 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”)
 
我不知道从哪里开始,也不知道使用什么流程。我的主要问题是,我不知道如何在不丢失到正确文本对象的链接的情况下对数据进行排序和编辑。任何帮助都会很棒。这是我尝试开始的快速递增/递减例程。
 
  1. ;Quick Increment/decrement
  2. ;Increments/decrements all selected text integers by 1
  3. ;I hacked this code together with help from an "increment in range" routine.
  4. ;Original code can be found here https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/incriment-numbered-text/td-p/3614646?nobounce
  5. ;Quick Increment
  6. (defun C:qi (/ textselection textobject old)
  7. (vl-load-com)
  8. (setq textselection (ssget '((0 . "TEXT"))))
  9. (repeat (sslength textselection)
  10.    (setq
  11.      textobject (vlax-ename->vla-object (ssname textselection 0))
  12.      old (vla-get-TextString textobject); initial text content
  13.    ); setq
  14.    (if
  15.      (and
  16.        (= (strlen old) (strlen (itoa (atoi old)))); text represents integer
  17.          ; Blocks e.g. "12A", "4.5", "C37", and completely non-numerical
  18.          ;   text [except for next test], but allows negative integers.
  19.          ; Also disallows e.g. "06", "008", so if those should be included...
  20.        (if (= (strlen old) 1) (wcmatch old "#") T)
  21.          ; blocks single non-numerical character e.g. "A" [passes prior test]
  22.      ); and
  23.      (vla-put-TextString textobject (itoa (+ (atoi old) 1))); replace
  24.    ); if
  25.    (ssdel (ssname textselection 0) textselection)
  26. ); repeat
  27. (princ)
  28. (setq sel1 (ssget "P"))
  29. (sssetfirst nil sel1)
  30. ); defun
  31. ;Quick decrement
  32. (defun C:qd (/ textselection textobject old)
  33. (vl-load-com)
  34. (setq textselection (ssget '((0 . "TEXT"))))
  35. (repeat (sslength textselection)
  36.    (setq
  37.      textobject (vlax-ename->vla-object (ssname textselection 0))
  38.      old (vla-get-TextString textobject); initial text content
  39.    ); setq
  40.    (if
  41.      (and
  42.        (= (strlen old) (strlen (itoa (atoi old)))); text represents integer
  43.          ; Blocks e.g. "12A", "4.5", "C37", and completely non-numerical
  44.          ;   text [except for next test], but allows negative integers.
  45.          ; Also disallows e.g. "06", "008", so if those should be included...
  46.        (if (= (strlen old) 1) (wcmatch old "#") T)
  47.          ; blocks single non-numerical character e.g. "A" [passes prior test]
  48.      ); and
  49.      (vla-put-TextString textobject (itoa (- (atoi old) 1))); replace
  50.    ); if
  51.    (ssdel (ssname textselection 0) textselection)
  52. ); repeat
  53. (princ)
  54. (setq sel1 (ssget "P"))
  55. (sssetfirst nil sel1)
  56. ); defun
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:56:44 | 显示全部楼层
嗨Benhubel。这里有一些想法
 
要对字符串进行排序,可以使用acad\u strlsort函数。缺点是它将使用ascii值对它们进行分类。
  1. (acad_strlsort '("4" "5" "2" "1" "3" "10"))
  2. ("1" [i]"10"[/i] "2" "3" "4" "5")

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

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:05:03 | 显示全部楼层
嗨benhubel
我不知道你发布的代码与引用的任务有什么关系。以下是如何在列表中交换最小/最大值的示例:
  1. _$ (vl-sort '("4" "3" "10" "0" "0.52" "1" "-3.4" "-0.25" "5" "2" "-2" "3.5" "6.8")
  2. '(lambda (a b) (apply '< (mapcar 'read (list a b))))
  3. )
  4. ("-3.4" "-2" "-0.25" "0" "0.52" "1" "2" "3" "3.5" "4" "5" "6.8" "10")
  5. _$

关于数字实体关联,请更准确地描述您的目标。
你可以按照Jef的建议列出一个相关的列表,但我还不清楚。
像这样的列表
  1. _$ (swap '("1" "2")) -> ("2" "1")
  2. _$ (swap '("2" "1" "4" "5" "3")) -> ("4" "5" "2" "1" "3")
  3. _$ (swap '("2" "8" "17" "4")) -> ("17" "4" "2" "8")
  4. _$ (swap '("3" "5" "-4")) -> ("3" "-4" "5")
将成为
  1. 6

注意Ent1和Ent2的初始和最终位置。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

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

使用道具 举报

16

主题

69

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:24:20 | 显示全部楼层
不需要assoc列表。事实上,在这种情况下,使用两个不同的列表更容易。
[code](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)'
173844kxecpjjk4nep17bg.jpg
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 17:33:48 | 显示全部楼层
哇,太棒了!我必须看一下,看看我是否能理解里面发生的一切。非常感谢你!
回复

使用道具 举报

16

主题

69

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 17:40:26 | 显示全部楼层
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 13:08 , Processed in 0.563398 second(s), 79 queries .

© 2020-2025 乐筑天下

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