Synopticum 发表于 2022-7-5 16:16:54

我需要一个用于Lis的Autocad LISP

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

BIGAL 发表于 2022-7-5 16:29:26

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

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

BIGAL 发表于 2022-7-5 16:43:12

看看这个。下一步是使用lisp重新关联新文本和行,现在只需复制行文本和块。
新建块。图纸

BIGAL 发表于 2022-7-5 17:02:36

这是为了匹配您的请求而编写的,但可以轻松更改以适应其他块更新。

; This updates a block with 4 attributes
; Just insert block with 4 attributes 1st
; insert block or copy etc
; by Alan H June 2017

(defun c:blk4 ( / len t1 t2 obj desc x att )
(vl-load-com)
(while (/=(vlax-property-available-p (setq obj (vlax-ename->vla-object (car (entsel "Select Block")))) 'Hasattributes) T)
(alert "You have not picked a block object ")
)

(setq att (vlax-invoke obj 'getattributes))

(while (/=(vlax-property-available-p (setq len (vlax-ename->vla-object (car (entsel "\nSelect Line: ")))) 'length) T)
(alert "You have not picked a P/line object ")
)

(while (/=(vlax-property-available-p (setq t1   (vlax-ename->vla-object (car (entsel "\nSelect Text 1: ")))) 'Textstring) T)
(alert "You have not picked a text object ")
)

(while (/=(vlax-property-available-p (setq t2   (vlax-ename->vla-object (car (entsel "\nSelect Text 2: ")))) 'Textstring) T)
(alert "You have not picked a text object ")
)

(while (/=(vlax-property-available-p (setq desc (vlax-ename->vla-object (car (entsel "\nSelect Description : ")))) 'Textstring) T)
(alert "You have not picked a text object ")
)

(setq atlength (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid len)) ">%).Length>%"))
(setq att1   (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid t1)) ">%).TextString>%"))
(setq att2   (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid t2)) ">%).TextString>%"))
(setq atdesc   (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-Objectid desc)) ">%).TextString>%"))

; this is for 1st 4 attributes starts at 0 not 1 tested on block with 16 attributes.

(vla-put-textstring (nth 0 att) atlength)
(vla-put-textstring (nth 1 att) atdesc)
(vla-put-textstring (nth 2 att) att1)
(vla-put-textstring (nth 3 att) att2)

(command "regen")
(princ)
) ; defun
(c:blk4)

Grrr 发表于 2022-7-5 17:08:53

有趣的建议BIGAL,这可能是一个更方便的版本:
 
; http://www.cadtutor.net/forum/showthread.php?100975-I-need-an-Autocad-LISP-for-Listing-Beam-Sizes
; Simple field attributes - original concept by BIGAL
(defun C:test ( / e )
(and (or (setq e (car (entsel "\nSelect attributed block: "))) (prompt "\nInvalid selection."))
   (vl-every '(lambda (x) (member x (entget e))) '((0 . "INSERT") (66 . 1)))
   (progn
   (foreach att (vlax-invoke (vlax-ename->vla-object e) 'GetAttributes)
       (and (vlax-write-enabled-p att)
         (setq e (car (nentsel (strcat "\nSelect object for \"" (vla-get-TagString att) "\" attribute: "))))
         (vl-some
         '(lambda (x)
             (if (vlax-property-available-p (vlax-ename->vla-object e) x)
               (vla-put-TextString att
               (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                   (itoa (vla-get-ObjectId (vlax-ename->vla-object e)))
                   ">%)." x ">%"
               ); strcat
               ); vla-put-TextString
             ); if
         ); lambda
         '("Length" "TextString") ; "Area" could be added, list is sorted by priority
         ); vl-some
       ); and
   ); foreach
   (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)
   ); progn
); and
(princ)
); defun

BIGAL 发表于 2022-7-5 17:27:10

嗨,Grr,我确实考虑过使用nentsel,但这意味着需要更多的选择,而不仅仅是填充所需的4个值。我也知道检查属性,但确实提到它希望用户选择正确的对象。版本2现在具有属性检查。
 
我要做的一个更改是不使用foreach,而是直接编辑属性,它的VL项或计数今天将有一些时间来研究这个方法。结果是一个列表。
 
上面的代码已经更改为直接更新正确的属性,而不使用foreach测试。
 
该代码可以在任何块上使用,只要该测试具有4个或更多属性。
页: [1]
查看完整版本: 我需要一个用于Lis的Autocad LISP