乐筑天下

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

[编程交流] 按顺序编号并插入

[复制链接]

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:42:13 | 显示全部楼层 |阅读模式
你好
我发现一个例程允许多次复制数字文本字符串,每次增加一个数字。
 
现在,我需要在按顺序插入文本的同时插入一个块。
 
有人能帮我吗?
 
 
 
这是我发现的惯例:
 
;======================================================================
; CopyInc2.lsp最新版本:C.法语99年9月29日
;----------------------------------------------------------------------
; 此例程允许您多次复制数字文本字符串
; 次,每次增加一个数字。如果文本有
; 字母前缀,这也将被复制。例如,如果您
; 复制文本“A102”,下一个将是“A103”,“A104”
; 等等
;
; 非常感谢J.Richardson最初的“CopyInc”例行程序
; 这一点基于此。
;======================================================================
(定义C:CopyInc(/OrigEnt OrigEntData OrigText NumText)
PrefixLen Prefix Num NewEntData NewPt Continue)
(setq copyincolderorfunc*错误*)
(setq*error*CopyIncErrorFunc)
(while(=OrigEnt nil)
(setq OrigEnt(entsel“\n选择文本:”)
)
(setq OrigEntData(cdr(entget(car OrigEnt)))
(如果(/=(cdr(assoc 0 OrigEntData))“文本”)
(原则“未选择文本”)
(程序
(setq OrigText(cdr(assoc 1 OrigEntData)))
(setq NumText(GetSuffixDigits OrigText))
(如果(=NumText“”)
(princ“该文本字符串不以数字结尾。”)
(程序
(setq PrefixLen(-(strlen OrigText)(strlen NumText)))
(if(=预桥0)
(setq前缀“”)
(setq前缀(substr OrigText 1 PrefixLen))
)
(setq Num(atoi NumText))
(setq Continue T)
(继续时
(setq Num(1+Num))
(setq NewEntData(subst(cons 1(strcat前缀(itoa Num)))
(assoc 1 OrigEntData)OrigEntData)
(initget 128)
(setq NewPt(getpoint“\n复制到(按Enter键退出):”)
(如果(=NewPt nil)
(setq Continue nil)
(程序
(setq NewEntData(subst(cons 10 NewPt))
(assoc 10 NewEntData)NewEntData)
(entmake NewEntData)
)
)
);while循环结束
)
)
)
)
(setq*error*copyincolderorfunc)
(普林斯)
)
;----获取足够的数字---------------------------------------------------
; 此函数接受字符串参数,该参数在
; 到此为止。它只返回由这些数字组成的字符串。例如:
; (GetSuffixDigits“A102”)返回“102”
; (GetSuffixDigits“102”)返回“102”
; (GetSuffixDigits“”)返回“”
; (GetSuffixDigits“ABC”)返回“”
; (GetSuffixDigits 123)将生成错误(错误的参数类型)
;----------------------------------------------------------------------
(defun GetSuffixDigits(OrigStr/Digits-PrefixLen-Char)
(setq数字“”)
(setq PrefixLen(strlen OrigStr))
(同时(>预桥0)
(setq Char(substr OrigStr PrefixLen 1));获取字符串的最后一个字符
(if(wcmatch Char“#”);如果是数字。。。
(程序
(setq数字(strcat字符数字));包含在结果str中
(setq PrefixLen(1-PrefixLen));准备检查下一个chr
)
(setq PrefixLen 0);第一次退出alpha
)
)
(setq数字)
)
;----错误处理----------------------------------------------------
; 下面的例程提供了我们的错误处理,以防用户
; 取消CopyInc功能。全局保存指向
; 当前错误处理程序,以便在退出时恢复。
;----------------------------------------------------------------------
(setq copyincolderorfunc nil);全球持有旧func
(defun CopyIncErrorFunc(msg)
(如果(=消息“功能已取消”)
(普林斯)
(如果(=消息“退出/退出中止”)
(普林斯)
(princ(strcat“\n错误:“msg”)
)
)
(setq*error*copyincolderorfunc)
(普林斯)
)
;----加载后会显示如何使用的说明-------------------
(princ“\n键入“CopyInc”复制并增加文本字符串。”)
(普林斯)
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:45:46 | 显示全部楼层
再次Lisp程序(没有微笑……)
 
我还在等待帮助。。。
 
  1. ;======================================================================
  2. ;    CopyInc2.lsp                  Last Revision: C.French 29/09/99
  3. ;----------------------------------------------------------------------
  4. ;  This routine allows you to copy a numerical text string multiple
  5. ;  times, incrementing the number by one each time. If the text has
  6. ;  an alphabetic prefix, this will be copied too. For example if you
  7. ;  copy the piece of text "A102", the next ones will be "A103", "A104"
  8. ;  and so on.
  9. ;
  10. ;  Many thanks to J. Richardson for the original "CopyInc" routine
  11. ;  upon which this one is based.
  12. ;======================================================================
  13. (defun C:CopyInc ( / OrigEnt OrigEntData OrigText NumText
  14.                     PrefixLen Prefix Num NewEntData NewPt Continue)
  15. (setq CopyIncOldErrorFunc *error*)
  16. (setq *error* CopyIncErrorFunc)
  17. (while (= OrigEnt nil)
  18.    (setq OrigEnt (entsel "\nSelect text: "))
  19. )
  20. (setq OrigEntData (cdr (entget (car OrigEnt))))
  21. (if (/= (cdr (assoc 0 OrigEntData)) "TEXT")
  22.    (princ "No text selected.")
  23.    (progn
  24.      (setq OrigText (cdr (assoc 1 OrigEntData)))
  25.      (setq NumText (GetSuffixDigits OrigText))
  26.      (if (= NumText "")
  27.        (princ "That text string doesn't end with a number.")
  28.        (progn
  29.          (setq PrefixLen (- (strlen OrigText)(strlen NumText)))
  30.          (if (= PrefixLen 0)
  31.            (setq Prefix "")
  32.            (setq Prefix (substr OrigText 1 PrefixLen))
  33.          )
  34.          (setq Num (atoi NumText))
  35.          (setq Continue T)
  36.          (while Continue
  37.            (setq Num (1+ Num))
  38.            (setq NewEntData (subst (cons 1 (strcat Prefix (itoa Num)))
  39.                                    (assoc 1 OrigEntData) OrigEntData))
  40.            (initget 128)
  41.            (setq NewPt (getpoint "\nCopy to (press Enter to quit): "))
  42.            (if (= NewPt nil)
  43.              (setq Continue nil)
  44.              (progn
  45.                (setq NewEntData (subst (cons 10 NewPt)
  46.                                        (assoc 10 NewEntData) NewEntData))
  47.                (entmake NewEntData)
  48.              )
  49.            )
  50.          );end of while loop
  51.        )
  52.      )
  53.    )
  54. )
  55. (setq *error* CopyIncOldErrorFunc)
  56. (princ)
  57. )
  58. ;----GetSuffixDigits---------------------------------------------------
  59. ;  This function accepts a string argument which has digits at the
  60. ;  end of it. It returns a string of just those digits. For example:
  61. ;    (GetSuffixDigits "A102")  returns  "102"
  62. ;    (GetSuffixDigits "102")   returns  "102"
  63. ;    (GetSuffixDigits "")      returns  ""
  64. ;    (GetSuffixDigits "ABC")   returns  ""
  65. ;    (GetSuffixDigits 123)  will generate an error (bad argument type)
  66. ;----------------------------------------------------------------------
  67. (defun GetSuffixDigits ( OrigStr / Digits PrefixLen Char)
  68. (setq Digits "")
  69. (setq PrefixLen (strlen OrigStr))
  70. (while (> PrefixLen 0)
  71.    (setq Char (substr OrigStr PrefixLen 1))   ;get last char of string
  72.    (if (wcmatch Char "#")                     ;if it's a digit...
  73.      (progn
  74.        (setq Digits (strcat Char Digits))     ;include in result str
  75.        (setq PrefixLen (1- PrefixLen))        ;ready to check next chr
  76.      )
  77.      (setq PrefixLen 0)                       ;quit at first alpha
  78.    )
  79. )
  80. (setq Digits Digits)
  81. )
  82. ;----Error Handling----------------------------------------------------
  83. ;  The routine below supplies our error handling in case the user
  84. ;  cancels the CopyInc function. The global holds the pointer to the
  85. ;  current error handler so it can be restored on exit.
  86. ;----------------------------------------------------------------------
  87. (setq CopyIncOldErrorFunc nil)                 ;global holds old func
  88. (defun CopyIncErrorFunc (msg)
  89. (if (= msg "Function cancelled")
  90.    (princ " ")
  91.    (if (= msg "quit / exit abort")
  92.      (princ " ")
  93.      (princ (strcat "\nError: " msg))
  94.    )
  95. )
  96. (setq *error* CopyIncOldErrorFunc)
  97. (princ)
  98. )
  99. ;----Instructions appear after loading on how to use-------------------
  100. (princ "\nType 'CopyInc' to copy and increment a text string.")
  101. (princ)
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 09:52:26 | 显示全部楼层
我希望这个能让你开始
 
  1. (defun c:ibl (/ atd blk cnt ech ipt next next_data osm pref suff tag)
  2. (setq osm (getvar "osmode"))
  3. (setq ech (getvar "cmdecho"))
  4. (setq atd (getvar "attdia"))
  5. (setvar "osmode" 0)
  6. (setvar "cmdecho" 0)
  7. (setvar "attdia" 1)
  8. (setq pref (getstring T "\nSpecify prefix or press Enter for none: "))
  9. (setq suff (getstring T "\nSpecify suffix or press Enter for none: "))
  10. (setq cnt (getint "\nEnter initial number: "))
  11. (if cnt
  12. (progn
  13. ;(setq tag (strcase (getstring "\nEnter attribute tag for numbering: ")))
  14. (setq tag "NUM");change attribute tag "NUM" on tag name in your block which uses for increment numbering
  15. (while (setq ipt (getpoint "\nPick insertion point of block or press Enter to Exit: "))
  16. (command "-insert" "STA" ipt 1 1 0);<- change block name "STA" on your block name here
  17. (setq blk (entlast))
  18. (setq next blk)
  19.        (while (setq next (entnext next))
  20. (setq next_data (entget next))
  21. (if (= tag (cdr (assoc 2 next_data)))
  22.   (progn
  23.     (entmod (subst (cons 1 (strcat pref (itoa cnt) suff)) (assoc 1 next_data) next_data))
  24.     (entupd blk)
  25.   )
  26. )
  27.      )
  28.             (setq cnt (1+ cnt))
  29.             )
  30.      )
  31.    )
  32. (setvar "osmode" osm)
  33. (setvar "attdia" atd)
  34. (setvar "cmdecho" ech)
  35. (prin1)
  36. )
  37. (prompt "\ntype iBL to execute ...")
  38. (prin1)

 
关于这一点:
 
  1. (setq pref (getstring T "\nSpecify prefix or press Enter for none: "))

 
~'J'~
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:55:42 | 显示全部楼层
再次感谢fixo的快速回答。
但我想要这样的东西:
你能再帮我一次吗?
回复

使用道具 举报

2

主题

135

帖子

135

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:58:27 | 显示全部楼层
你的意思是默认设置前缀吗?
如果是这样,请使用此代码块:
  1. (setq pref "MyFavouritePrefix")

 
~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 09:59:58 | 显示全部楼层
是的,这就是我想要的。
再次非常感谢
回复

使用道具 举报

LCE

1

主题

29

帖子

28

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 10:06:15 | 显示全部楼层
大家好,
我真的很喜欢这个lisp代码,并且一直在我们的通风部分使用它,我只是想知道你们中的一个聪明人是否可以帮我稍微调整一下。
选择前缀后,我希望代码在图形中搜索所有名为“ID”的块,检查所选前缀“for ensample A”,并找到用于示例A12”的最后一个标记值,并提示用户使用下一个值“A13”或输入自己的编号
我目前必须手动执行此操作
这就是我目前所拥有的
(if(ssget“x”'((2。“ID”))
(程序
(setq ent(ssname(ssget“x”'((2。“ID”))0))
 
(while(not(eq'“REV”(cdr(assoc 2)(setq attlst(entget ent k)')))))
(setq ent(entnext ent))
)
 
(if(=1(setq rev#)(+1(ascii(cdr(assoc 1 attlst Ϟ)Ϟ)))))
(setq版本#65)
)
我的块是“ID”,属性标记名是“REV”
回复

使用道具 举报

2

主题

135

帖子

135

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 10:08:54 | 显示全部楼层
 
看看这是否适合你
[code](defun getlastattrib(blockname标记名前缀/atstr lng num osset revlist)(或(vl load com))(setq lng(1+(strlen前缀))num nil)(if(setq osset(ssget“X”(list(cons 0“INSERT”)(cons 2 blockname)(cons 66 1))(progn(foreach blkobj(mapcar'vlax ename->vla object(vl remove if'listp(mapcar'cadr(ssnamex osset))))(foreach att(vlax invoke blkobj'getattributes)(if(eq(vlax get att'tagstring)标记名)(setq atstr(vlax get att'textstring)))(if(wcmatch atstr(strcat prefix“*”)(setq revlist(cons(substr atstr lng)revlist))))(setq num(car(vl sort revlist(function)(lambda(a b)(>(atof a)(atof b 107;)k)num);在主程序内如下调用此函数:(setq lastnum(getlastattrib“ID”“REV”“A”);
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 10:12:40 | 显示全部楼层
太棒了!
工作正常
比我想象的好多了真的很喜欢窗口消息
再次感谢
约翰
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 10:14:12 | 显示全部楼层
不客气
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 00:16 , Processed in 0.349177 second(s), 72 queries .

© 2020-2025 乐筑天下

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