乐筑天下

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

[编程交流] 我需要一个用于Lis的Autocad LISP

[复制链接]

1

主题

1

帖子

0

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 16:16:54 | 显示全部楼层 |阅读模式
大家好,
 
我的第一个帖子是紧急求助,我有一个关于结构梁的AutoCAD绘图。我需要这些梁的名称和尺寸作为Excel列表。
 
梁的名称和尺寸(宽度和深度)均以文本形式写在两个不同的层中。梁的线条在另一层上
 
尺寸(宽度和深度)写在梁上。由于梁仅由两条线组成,因此应使用DIM命令从项目中读取高度。
 
可以在附件中找到dwg的屏幕截图。你需要的所有层都是紫色的。
 
基本上,LISP应该能够获得名称并将其写入Excel第1列、第2列和第3列的维度(或者只有第2列,我可以设法将其分隔开来)以及这些文本上方和下方这两行的长度,并将其写入另一列。
 
你知道什么Lisp程序可以满足我的需要吗?
 
谢谢
171700tuw0cacwamzeauw6.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:29:26 | 显示全部楼层
你有一个问题是的,所有的文本都可以写是的,行长度可以写,但两者是无关的。
 
但并非全无2种方法,你可以找到文字并在附近寻找物体,在这种情况下,是图层上的一条线。根据文本放置的位置,您可能会得到错误的答案,这里的提示位于中间而不是角落。另一种稍微复杂一点的方法是将长度和宽度设为一个块,其中一个字段是所需行的长度。哦,第三种是使用扩展数据,将线路链接到一些数据。
 
谷歌也会在区块和字段方面提供一些帮助。可以关闭块中的属性,这样就看不到这些值,但可以检索它们。

宽度
身高
名称不可见字段读取其他文本
长度不可见字段读取行长度
 
我现在得走了,但可能会有人给你一个街区。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:43:12 | 显示全部楼层
看看这个。下一步是使用lisp重新关联新文本和行,现在只需复制行文本和块。
新建块。图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:02:36 | 显示全部楼层
这是为了匹配您的请求而编写的,但可以轻松更改以适应其他块更新。
  1. ; This updates a block with 4 attributes
  2. ; Just insert block with 4 attributes 1st
  3. ; insert block or copy etc
  4. ; by Alan H June 2017
  5. (defun c:blk4 ( / len t1 t2 obj desc x att )
  6. (vl-load-com)
  7. (while (/=  (vlax-property-available-p (setq obj (vlax-ename->vla-object (car (entsel "Select Block")))) 'Hasattributes) T)
  8. (alert "You have not picked a block object ")
  9. )
  10. (setq att (vlax-invoke obj 'getattributes))
  11. (while (/=  (vlax-property-available-p (setq len (vlax-ename->vla-object (car (entsel "\nSelect Line: ")))) 'length) T)
  12. (alert "You have not picked a P/line object ")
  13. )
  14. (while (/=  (vlax-property-available-p (setq t1   (vlax-ename->vla-object (car (entsel "\nSelect Text 1: ")))) 'Textstring) T)
  15. (alert "You have not picked a text object ")
  16. )
  17. (while (/=  (vlax-property-available-p (setq t2   (vlax-ename->vla-object (car (entsel "\nSelect Text 2: ")))) 'Textstring) T)
  18. (alert "You have not picked a text object ")
  19. )
  20. (while (/=  (vlax-property-available-p (setq desc (vlax-ename->vla-object (car (entsel "\nSelect Description : ")))) 'Textstring) T)
  21. (alert "You have not picked a text object ")
  22. )
  23. (setq atlength (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid len)) ">%).Length>%"))
  24. (setq att1     (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid t1)) ">%).TextString>%"))
  25. (setq att2     (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid t2)) ">%).TextString>%"))
  26. (setq atdesc   (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid desc)) ">%).TextString>%"))
  27. ; this is for 1st 4 attributes starts at 0 not 1 tested on block with 16 attributes.
  28. (vla-put-textstring (nth 0 att) atlength)
  29. (vla-put-textstring (nth 1 att) atdesc)
  30. (vla-put-textstring (nth 2 att) att1)
  31. (vla-put-textstring (nth 3 att) att2)
  32. (command "regen")
  33. (princ)
  34. ) ; defun
  35. (c:blk4)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:08:53 | 显示全部楼层
有趣的建议BIGAL,这可能是一个更方便的版本:
 
  1. ; http://www.cadtutor.net/forum/showthread.php?100975-I-need-an-Autocad-LISP-for-Listing-Beam-Sizes
  2. ; Simple field attributes - original concept by BIGAL
  3. (defun C:test ( / e )
  4. (and (or (setq e (car (entsel "\nSelect attributed block: "))) (prompt "\nInvalid selection."))
  5.    (vl-every '(lambda (x) (member x (entget e))) '((0 . "INSERT") (66 . 1)))
  6.    (progn
  7.      (foreach att (vlax-invoke (vlax-ename->vla-object e) 'GetAttributes)
  8.        (and (vlax-write-enabled-p att)
  9.          (setq e (car (nentsel (strcat "\nSelect object for "" (vla-get-TagString att) "" attribute: "))))
  10.          (vl-some
  11.            '(lambda (x)
  12.              (if (vlax-property-available-p (vlax-ename->vla-object e) x)
  13.                (vla-put-TextString att
  14.                  (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  15.                    (itoa (vla-get-ObjectId (vlax-ename->vla-object e)))
  16.                    ">%)." x ">%"
  17.                  ); strcat
  18.                ); vla-put-TextString
  19.              ); if
  20.            ); lambda
  21.            '("Length" "TextString") ; "Area" could be added, list is sorted by priority
  22.          ); vl-some
  23.        ); and
  24.      ); foreach
  25.      (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)
  26.    ); progn
  27. ); and
  28. (princ)
  29. ); defun
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:27:10 | 显示全部楼层
嗨,Grr,我确实考虑过使用nentsel,但这意味着需要更多的选择,而不仅仅是填充所需的4个值。我也知道检查属性,但确实提到它希望用户选择正确的对象。版本2现在具有属性检查。
 
我要做的一个更改是不使用foreach,而是直接编辑属性,它的VL项或计数今天将有一些时间来研究这个方法。结果是一个列表。
 
上面的代码已经更改为直接更新正确的属性,而不使用foreach测试。
 
该代码可以在任何块上使用,只要该测试具有4个或更多属性。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:04 , Processed in 2.095528 second(s), 68 queries .

© 2020-2025 乐筑天下

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