乐筑天下

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

[编程交流] 选择文字LISP

[复制链接]

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:18:55 | 显示全部楼层 |阅读模式
你好
 
我正在努力使Lisp程序的工作,我真的很挣扎。我从一个图形开始,该图形上有一个数字的多个实例(可以是001-020中的任何数字),我需要用另一个数字(021-040)替换它,使001变为021,以此类推。只有20种可能的组合,每张图纸上只有一个唯一的编号。
我正在使用用(tfindfun“old”“new”1)命令开发的tfind lisp来替换它。使用IF语句可能有更好的方法来实现这一点,但当我运行LISP时,我基本上有20个tfindfun命令,19个失败,1个工作。到目前为止,这还没有给我带来任何问题。在替换了该数字的所有实例后,我可以运行其余的命令,然后我的问题出现了——我需要用一个新名称保存文件。当前文件名的类型如下:
 
text_001_text。dxf
text\u 002\u text。dxf等
 
我需要用text\u 021\u text替换它。dxf,text\u 022\u text。dxf等。我真的很难选择021,或存储它,以便我可以修改文件名。我一直在看不同的线程,尝试不同的选择命令,但绝对没有运气。我无法使ss1等于021(替换初始值的数字),以便将其合并并形成新的文件名。
 
(命令“saveas”“dxf”“v”“2004”“”(STRCAT“c:\\test”ss1“文件名的其余部分”)“y”)
(命令“close”“n”)
 
非常感谢你!
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 11:40:06 | 显示全部楼层
希望这会让你开始不确定你到底需要什么,但是,很抱歉。
这是为特殊任务编写的,但您可以使用相同的算法
  1. ;; RNZERO.LSP
  2. ;; Fatty T.O.H () 2006 * all rights removed
  3. ;; renumbering stations
  4. ;; (partialy borrowed from
  5. ;; REGEXP.LSP
  6. ;; Copyright (c) 2004, Tony Tanzillo)
  7. (defun C:RNZERO (/ *error* *debug* init match maxlen match_list newstr newtxt newvalue
  8.         numadd obj_list oldtxt regex result ss)
  9. ;; error trapping function
  10. ;; based on function
  11. ;; published by Joe Burke 12/5/2005
  12. (defun *error*  (msg)     ; create standard error handler
  13.      (cond ((not msg))      ; normal exit, no error
  14.     ((member msg '("Function cancelled" "quit / exit abort"))) ; escape
  15.     ((princ (strcat "\nError: " msg))   ; display fatal error
  16.      (cond (*debug* (vl-bt)))))    ; if in debug mode, dump backtrace
  17.   (vl-catch-all-apply
  18.      (function(lambda()
  19. (vlax-release-object result))))
  20.    (vl-catch-all-apply
  21.      (function(lambda()
  22. (vlax-release-object regex))))
  23.      (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  24.      )
  25. (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))  
  26. (if
  27. (not
  28.    (vl-catch-all-error-p
  29.      (vl-catch-all-apply
  30. (function
  31.   (lambda ()
  32.     (setq regex (vlax-create-object "VBScript.RegExp")))))))
  33.   (progn
  34.     (vlax-put-property regex 'Global :vlax-true)
  35.     (vlax-put-property regex 'IgnoreCase :vlax-true)
  36.     (setq init (getstring "\Enter initial value to find <001> : "))
  37.     (if (eq "" init)
  38.         (setq init "001"))
  39.     (initget 6)
  40.     (setq numadd (getint "\nNumber to add <20> : "))
  41.     (if (not numadd)
  42.       (setq numadd 20))
  43.     (setq maxlen (strlen init)
  44.    match  "")
  45.     (if
  46.       (setq ss (ssget (list
  47.    (cons 0 "TEXT")
  48.    (cons 1
  49.          (strcat "*"
  50.           (repeat maxlen
  51.      (setq match (strcat match "#")))
  52.           "*")))))
  53. (progn
  54.   (setq match_list
  55.   (mapcar 'cons
  56.   (setq obj_list  
  57.   (mapcar 'vlax-ename->vla-object
  58.    (vl-remove-if
  59.      'listp
  60.      (mapcar 'cadr
  61.       (ssnamex ss)
  62.       )
  63.      )
  64.    )
  65. )
  66.    (mapcar 'vla-get-textstring obj_list))
  67.   )
  68.   (while (setq obj_list (vl-remove-if-not
  69.   (function (lambda (x)
  70.        (wcmatch (cdr x) (strcat "*" init "*"))))
  71.        match_list)
  72.    )
  73.     (vlax-put-property regex 'Pattern (strcat "(" init ")"))
  74.     (foreach obj (mapcar 'car obj_list)
  75.     (setq oldtxt (vla-get-textstring obj))
  76.     (setq newvalue (+ numadd (atoi init)))
  77.     (setq newtxt (itoa newvalue))
  78.     (while (< (strlen newtxt) maxlen)
  79.       (setq newtxt (strcat "0" newtxt))
  80.       )
  81.       (if (not (eq "0" (substr newtxt 1 1)))
  82.    (setq newtxt (strcat "0" newtxt)))
  83.            (princ (strcat "\n" init " ==> " newtxt));for debug only
  84.     (setq result
  85.     (vlax-invoke-method regex 'Execute oldtxt)
  86.    )
  87.     (if (> (vlax-get-property result 'Count) 0)
  88.       (progn
  89. (setq newstr
  90.         (vlax-invoke-method regex 'Replace oldtxt newtxt)
  91.        )
  92. (vla-put-textstring obj newstr)
  93. ))
  94.     (vlax-release-object result)
  95.     )
  96. (setq match_list (vl-remove-if
  97.   (function (lambda (x)
  98.        (member x obj_list)))
  99.        match_list)
  100.    )
  101.          (setq init (1+ (atoi init))
  102.    init (itoa init)
  103.    )
  104.     (while (< (strlen init) maxlen)
  105.       (setq init (strcat "0" init))
  106.       )
  107.   )
  108.     (vlax-release-object regex)
  109.     )
  110.   )
  111.     )
  112. )
  113. (*error* nil)
  114. (princ)
  115. )
  116. (vl-load-com)
  117. (princ "\n***   Type RNZERO to renumbering stations   ***")
  118. (prin1)

 
 
~'J'~
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:45:38 | 显示全部楼层
非常感谢。我应该澄清和简化我遇到的问题。逻辑是:
如果图纸上有021,则将图纸另存为text\u 021\u text。dxf
Elseif 022在图纸上,然后将图纸另存为text\u 022\u text。dxf
Elseif 023在图纸上,然后将图纸另存为text\u 023\u text。dxf
Elseif 024等等。
 
如何使用LISP语法编写?非常感谢。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 12:01:00 | 显示全部楼层
对于一般情况,COND声明是您的答案:
 
  1. (cond
  2. ((= DrawingID 021)
  3. (setq DrawingName "text_021_text.dxf"))
  4. ((= DrawingID 022)
  5. (setq DrawingName "text_022_text.dxf"))
  6. ((= DrawingID 023)
  7. (setq DrawingName "text_023_text.dxf"))
  8. )

 
但如果测试参数始终为整数,则可以使用:
 
  1. (setq DrawingName (strcat "text_" (itoa DrawingID) "_text.dxf"))

 
当做
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:16:55 | 显示全部楼层
我想这就是我要找的,谢谢!请再问一个问题。。。其中代码为(=DrawingID 021)
我需要它将MTEXT=“021”作为第一个条件,MTEXT=“022”作为第二个条件,等等。
 
下面是我尝试的内容,但我运气不太好。它可能应该以((=多行文字???…)开头???。。。
(条件
((setq ss(ssget):L“'((0.021,多行文字)))
(setq DrawingName“text\u 021\u text.dxf”)))
((
 
所以基本上我需要它做的是
(条件
((在图纸内容中查找多行文字“021”。如果在图纸名称图纸中找到021,请参见下一行)
(setq DrawingName“text\u 021\u text.dxf”))
((查找多行文字“022”。如果找到,请按下一行命名图纸)
(setq DrawingName“text\u 022\u text.dxf”))
((等)
 
再次感谢!
 
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 12:29:21 | 显示全部楼层
在这种情况下,选择询问过滤器应如下所示:
 
  1. (ssget "X" '((0 . "MTEXT") (1 . "*201*")))

 
请参阅SSGET函数选择方法参数的帮助,以及野生字符用法的WCMATCH。
 
当做
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 03:13 , Processed in 0.962663 second(s), 64 queries .

© 2020-2025 乐筑天下

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