乐筑天下

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

[编程交流] 帮我解决Lisp程序的问题

[复制链接]

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-6 07:07:03 | 显示全部楼层 |阅读模式
大家好,
 
我编写了一个lisp例程,当我运行它时,它会通过单击对象的边界将我需要的内容锁定到一个单独的文件中,它使用(Useri1)变量来指定文件名,这很好,但我希望能够单击零件号(B2),例如,当人们使用它时,文件名就是零件号。如果有任何帮助,我将不胜感激。
 
  1. (defun c:psave (/ ss mn mx)
  2.      (vl-load-com)
  3. (setvar "cmdecho" 0)
  4. (setvar "filedia" 0)
  5. (princ "\n Panel Number is ")(princ (getvar "useri1"))
  6. (princ ".   To change this, reset the system variable USERI1")
  7.    
  8.      (setq pnum(getvar "useri1"))
  9.    
  10.      (if(= pnum 0)(setq pnum 1))
  11.      
  12.      (setvar "useri1" (+ pnum 1))
  13.   
  14.      (setq pnum(itoa pnum))
  15.      (if (setq ss  (ssget "_:S:E" '((0 . "INSERT,LWPOLYLINE"))))
  16.          (progn
  17.      (vla-getboundingbox (vlax-ename->vla-object (ssname ss 0)) 'mn'mx)
  18.      (command "wblock" pnum " " "0" "WINDOW"
  19.      (trans (vlax-safearray->list mn) 0 1)
  20.      (trans (vlax-safearray->list mx) 0 1)
  21.                   "")
  22. (setvar "cmdecho" 1)
  23. (setvar "filedia" 1)
  24.          )
  25.       )
  26. )
  27. (princ)

 
 
080706beaxfwfbtag0xffg.jpg
 
 
谢谢
布瑞恩
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 07:12:44 | 显示全部楼层
你能附上一个样本图纸吗?
回复

使用道具 举报

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-6 07:15:57 | 显示全部楼层
这是一个标准面板的图纸。我想做的就是为“pnum”选择(B2),然后选择蓝线。
 
B2.dwg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 07:18:50 | 显示全部楼层
这是一种拉出B2的方法
 
  1. (setq text1 (entget (car (entsel "\nSelect text 1 "))))
  2.    (setq anst1 (cdr (assoc 1 text1)))
  3. then do something like
  4. (setq outdwg (strcat anst1 "-" (getvar "dwgname"))
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:20:46 | 显示全部楼层
也许是这样的:
 
  1. (defun c:psave (/ ss mn mx sst)
  2. (vl-load-com)
  3. (if (setq ss (ssget "_:S:E" '((0 . "INSERT,LWPOLYLINE"))))
  4.    (progn
  5.      (vla-getboundingbox (vlax-ename->vla-object (ssname ss 0)) 'mn 'mx)
  6.      (setq sst (ssget "W"
  7.         (trans (vlax-safearray->list mn) 0 1)
  8.         (trans (vlax-safearray->list mx) 0 1)
  9.         '((0 . "text") (1 . "@*"))
  10. )
  11.      )
  12.      (command "-wblock"
  13.        (strcat (getvar "dwgprefix")
  14.         (cdr (assoc 1 (entget (ssname sst 0))))
  15.        )
  16.        " "
  17.        "0"
  18.        "WINDOW"
  19.        (trans (vlax-safearray->list mn) 0 1)
  20.        (trans (vlax-safearray->list mx) 0 1)
  21.        ""
  22.      )
  23.      (command "oops")
  24.    )
  25.    ;; progn
  26. )
  27. ;; if
  28. (princ)
  29. )
回复

使用道具 举报

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-6 07:25:50 | 显示全部楼层
BIGAL,我确实得到了我写的第一个lisp,用下面的代码做我想做的事情
  1. (defun c:psave2 (/ ss mn mx)
  2.      (vl-load-com)
  3. ;;;--- Turn the command echo off
  4. (setvar "cmdecho" 0)
  5. ;;;--- Turn the filedia off
  6. (setvar "filedia" 0)
  7. (setq datalist (list))
  8.                                        ;select objects
  9. (if (setq eset (ssget))
  10.    (progn
  11.                                        ;set a counter to the first item in the selection set
  12.      (setq cntr 0)
  13.                                        ;loop through each selected entity
  14.      (while (< cntr (sslength eset))
  15.                                        ;grab the entity's name
  16.        (setq en (ssname eset cntr))
  17.                                        ;grab the DXF group codes of the entity
  18.        (setq enlist (entget en))
  19.                                        ;ignore the entity if it is not a TEXT entity
  20.        (if (= "TEXT" (cdr (assoc 0 enlist)))
  21.          (progn
  22.                                        ;get the text value from the DXF Group Code
  23.            (setq str (cdr (assoc 1 enlist)))
  24.                                        ;setup a variable to check if the entity exist in the datalist list
  25.            (setq existing 0)
  26.                                        ;loop through the datalist to find out if it is a new entity that needs
  27.                                        ;to be added to the list or if it already exist and it's counter needs
  28.                                        ;to be incremented
  29.            (foreach a datalist
  30.              (if (= (car a) str)
  31.                (setq existing 1)
  32.              )
  33.            )
  34.                                        ;if the entity is new then
  35.            (if (= existing 0)
  36.                                        ;do this - Add the item to the datalist along with a counter that starts at 1
  37.              (setq datalist (append datalist (list (cons str 1))))
  38.                                        ;else it's cntr needs to be incremented
  39.              (setq datalist
  40.                     (subst
  41.                       (cons str (+ 1 (cdr (assoc str datalist))))
  42.                       (assoc str datalist)
  43.                       datalist
  44.                     )
  45.              )
  46.            )
  47.          )
  48.        )
  49.                                        ;increment the entity counter
  50.        (setq cntr (+ cntr 1))
  51.      )
  52.    )
  53. )
  54.                                       
  55.                                       
  56.      
  57.      (if (setq ss  (ssget "_:S:E" '((0 . "INSERT,LWPOLYLINE"))))
  58.          (progn
  59.      (vla-getboundingbox (vlax-ename->vla-object (ssname ss 0)) 'mn'mx)
  60.      (command "wblock" str " " "0" "WINDOW"
  61.      (trans (vlax-safearray->list mn) 0 1)
  62.      (trans (vlax-safearray->list mx) 0 1)
  63.                   "")
  64.          
  65. ;;;--- Turn the command echo back on
  66. (setvar "cmdecho" 1)
  67. ;;;--- Turn the filedia back on
  68. (setvar "filedia" 1)
  69.          )
  70.       )
  71. )
  72. (princ)

 
但是对于你发布的代码行,它工作得更好,对于我的lisp,你必须在选择标签和蓝线之间点击enter。这是我的lisp和你的代码行放在一起。
  1. (defun c:psave (/ ss mn mx)
  2.      (vl-load-com)
  3. (setvar "cmdecho" 0)
  4. (setq text1 (entget (car (entsel "\nSelect Label "))))
  5.    (setq anst1 (cdr (assoc 1 text1)))
  6.                                       
  7. (setq outdwg (strcat anst1 "-" (getvar "dwgname"))
  8. )
  9.      
  10.      (if (setq ss  (ssget "_:S:E" '((0 . "INSERT,LWPOLYLINE"))))
  11.          (progn
  12.      (vla-getboundingbox (vlax-ename->vla-object (ssname ss 0)) 'mn'mx)
  13.      (command "wblock" anst1 " " "0" "WINDOW"
  14.      (trans (vlax-safearray->list mn) 0 1)
  15.      (trans (vlax-safearray->list mx) 0 1)
  16.                   "")
  17.          
  18. (setvar "cmdecho" 1)
  19.          )
  20.       )
  21. )
  22. (princ)

 
现在你会注意到我把“文本1”改成了“标签”,这样就不会把任何人搞糊涂了。我想知道我需要向lisp例程添加哪些代码行才能将创建的文件保存到原始图形所在的当前文件夹中。谢谢你的帮助,你的男人。
回复

使用道具 举报

39

主题

180

帖子

141

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
195
发表于 2022-7-6 07:26:18 | 显示全部楼层
嗯,席尔瓦,这正是我想要的。谢谢。。。
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:30:11 | 显示全部楼层
不客气,布莱恩特。
 
亨里克
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:32:53 | 显示全部楼层
BrianTFC,
如果当前目录中已存在同名文件,则代码会出错,
因为wblock命令停止询问是否要替换现有的dwg,所以我只是
添加“if”以查看当前目录中是否已存在具有所需名称的文件
要创建wblock,如果为true,将显示一个警报框,说明文件已经存在
存在并退出代码。
 
 
希望有帮助
 
亨里克
  1. (defun c:psave (/ ss mn mx sst)
  2. (vl-load-com)
  3. (if (setq ss (ssget "_:S:E" '((0 . "INSERT,LWPOLYLINE"))))
  4.    (progn
  5.      (vla-getboundingbox
  6. (vlax-ename->vla-object (ssname ss 0))
  7. 'mn
  8. 'mx
  9.      )
  10.      (setq sst (ssget "W"
  11.         (trans (vlax-safearray->list mn) 0 1)
  12.         (trans (vlax-safearray->list mx) 0 1)
  13.         '((0 . "text") (1 . "@*"))
  14. )
  15.      )
  16.      (if (= (findfile (strcat (getvar "dwgprefix")
  17.          (cdr (assoc 1 (entget (ssname sst 0))))
  18.          ".dwg"
  19.         )
  20.      )
  21.      nil
  22.   )
  23. (progn
  24.   (command "-wblock"
  25.     (strcat (getvar "dwgprefix")
  26.      (cdr (assoc 1 (entget (ssname sst 0))))
  27.     )
  28.     " "
  29.     "0"
  30.     "WINDOW"
  31.     (trans (vlax-safearray->list mn) 0 1)
  32.     (trans (vlax-safearray->list mx) 0 1)
  33.     ""
  34.   )
  35.   (command "oops")
  36. )
  37. ;; progn
  38. (alert
  39.   (strcat "\nThe "
  40.    (cdr (assoc 1 (entget (ssname sst 0))))
  41.    ".dwg already exists in the current directory!!!"
  42.   )
  43. )
  44.      )
  45.      ;; if
  46.    )
  47.    ;; progn
  48. )
  49. ;; if
  50. (princ)
  51. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 07:38:33 | 显示全部楼层
 
您可以将专家设置为5以抑制消息
“…dwg已存在,是否替换它?[是/否]:
 
很高兴在这里见到你,亨里克,欢迎来到CADTutor。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:51 , Processed in 0.937389 second(s), 75 queries .

© 2020-2025 乐筑天下

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