BIGAL 发表于 2022-7-5 16:27:45

填充多个块属性

最近的一篇帖子让我觉得你有一个包含多列的表,并且想在表中插入不同的块属性,但块都不同,但都有共同的列标题,如零件号、长度、宽度。
 
属性位置到处都是,所以选择一个块,然后选择希望属性值出现的列。
 
这是非常粗糙的,但我正在寻找一些示例DWG或有一个发挥,让我知道你是如何找到它的,我已经包括了一个测试的生成表只是改变了列的数量超过你最大的属性数。请注意,可以显示的属性数量有限。只需使用99之类的数字表示列中的非条目。下一个版本可能是选择多个同名块,而不是一次选择一个。
 

; pick a block and enter attributes into table
; by Alan H April 2017
(defun c:blk-tab ( / tabrows lst lst2 lstatt x )
(if (/= tblobj nil)
(princ)
(setq tblobj (vlax-ename->vla-object (car (entsel "Pick table"))))
)
(setq tabrows (vla-get-rows tblobj)) ; number of rows existing
; if has attribs check here
(while (setq obj (vlax-ename->vla-object (car (entsel "Pick Block"))))

(setq lst '())
(setq lstatt '())
(foreach att (vlax-invoke obj 'getattributes)
(setq lstatt (cons (vla-get-textstring att) lstatt))
(setq lst (cons (strcat (vla-get-tagstring att) " " (vla-get-textstring att)) lst))
(setq lst (cons 4 lst))
(setq lst (cons 2 lst))
)
(setq lst (reverse lst))
(setq lstatt (reverse lstatt))

(if (not AH:getkeys)(load "getvals2"))
;(AH:getkeys (list "Line 1" 5 4 "line 2" 4 2 "line 3" 8 7))
(princ "\nGetvals2 loaded")
(AH:getkeys lst)
; get key values as a list
(setq num (/ (length lst) 3))
(setq x 1)
(setq lst2 '())
(repeat num
(setq lst2 (cons (atoi (eval (read (strcat "Key" (rtos x 2))))) lst2))
(setq x (+ x 1))
)
(setq lst2 (reverse lst2)) ; this is the order for table matches nth lstatt

; now do table insertion this is column values for next entry
; add a row then insert values.
(vla-InsertRows tblobj (+ tabrows 1) (vla-GetRowHeight tblobj (- tabrows 1)) 1)
(repeat (setq x (length lstatt))
(setq x (- x 1))
(vla-settext tblobj tabrows(- (nth x lst2) 1) (nth x lstatt)) ;1st column is zero
)
(setq tabrows (+ tabrows 1))
) ;while
(setq ans (getstring "To reset table just press <Cr> any other key to continue "))
(if (= ans nil)(setq tblobj nil))
) ;defun

 

; example of creating a table
; By Alan H
(defun c:sct (/ colwidth numcolumns numrows objtable rowheight sp vgad vgao )
(vl-load-com)
(setq sp (vlax-3d-point '(0 0 0)))
(setq doc(vla-get-activedocument (vlax-get-acad-object) ))
(setq vgms (vla-get-modelspace doc))
(setq numrows 5)
(setq numcolumns 5)
(setq rowheight 0.5)
(setq colwidth 30)
(setq objtable (vla-addtable vgms sp numrows numcolumns rowheight colwidth))
; RetVal = object.AddTable(InsertionPoint, NumRows, NumColumns, RowHeight, ColWidth)
(vla-settext objtable 0 0 "TABLE title")
(vla-settext objtable 1 0 "A")
(vla-settext objtable 1 1 "B")
(vla-settext objtable 1 2 "C")
(vla-settext objtable 1 3 "D")
(vla-settext objtable 1 4 "E")
(vla-settext objtable 2 0 "1")
(vla-settext objtable 3 0 "2")
(vla-settext objtable 4 0 "3")
(vla-setcolumnwidth objtable 0 15) ; 0 is first column
(vla-setcolumnwidth objtable 1 30)
(vla-setcolumnwidth objtable 2 60)
(command "_zoom" "e")
(princ)
)
(C:sct)

 

; multi line dcl
; with help from the guys at Cadtutor
; sample code a 3 line example
; (if (not AH:getkeys)(load "getvals2"))
;(AH:getkeys (list "Line 1" 5 4 "line 2" 2 4 "line 3" 8 7))
(princ "Getvals2 loaded")
(defun AH:getkeys (INFO / fo fname newlst num x y klist)
; you can hard code a directory if you like for dcl file
(setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
;(setq fo (open (setq fname "c:\\acadtemp\\getkeys.dcl") "w"))
(write-line "ddgetkey : dialog {" fo)
(write-line " : column {" fo)
(setq num (/ (length info) 3))
(setq x 1)
(repeat num
(setq klist (cons (strcat "key" (rtos x 2 0)) klist))
(setq x (+ 1 x))
)
(setq x 1)
(setq y 1)
(repeat num
(write-line ": edit_box {" fo)
(write-line (strcat "    key = "(chr 34) (strcat "key" (rtos y 2 0)) (chr 34) ";") fo)
(write-line (strcat " label = "(chr 34) (nth (- x 1) info) (chr 34) ";")   fo)
(write-line (strcat "   edit_width = " (rtos (nth x info) 2 0) ";" ) fo)
(write-line (strcat "   edit_limit = " (rtos (nth (+ x 1) info) 2 0) ";" ) fo)
(write-line "   is_enabled = true;" fo)
(write-line "}" fo)
(write-line "spacer_1 ;" fo)
(setq x (+ x 3))
(setq y (+ y 1))
)
(write-line "}" fo)
(write-line "ok_only;}" fo)
(close fo)
(setq x 1)
(setq outlst '())
(setq dcl_id (load_dialogfname))
(if (not (new_dialog "ddgetkey" dcl_id))
(exit))
(foreach k klist
   (action_tile k (strcat "(setq " k " (get_tile \"" k "\"))"))
)
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq action (start_dialog))
(unload_dialog dcl_id)

) ; defun

rlx 发表于 2022-7-5 16:34:17

嗨,比格尔,
 
 
首先必须查看表的位置,但在布局选项卡上找到了它,然后例程在(load“getvals2”)处停止,因为(if(not AH:getkeys)等。。。
 
 
gr.Rlx

Grrr 发表于 2022-7-5 16:41:01

嗨,比格尔,
我建议使用一些将assoc列表转换为acad_表的子函数,然后通过使用列表操作和测试输出列表的格式,您可以将其传递给该子函数。
使用vlide控制台中的pretty print选项来获得可读列表,这样就可以发现最终的问题。

BIGAL 发表于 2022-7-5 16:46:11

抱歉,伙计们添加了getvals2。lsp并将其更改为“modelspace”,这就是加载保存在库目录中的lisp的问题,以便在测试时工作。。

rlx 发表于 2022-7-5 16:54:01

 
 
总是发生在我身上。。。好吧,有时候。。。
 
 
gr.Rlx

rlx 发表于 2022-7-5 16:55:22

好的,第一次测试。。。
 
 
您使用(setq fname“c:\\acadtemp\\getkeys.dcl”),并不是每个人都会拥有这个文件夹。
选择块时,需要哪些值?显然是一个(行)数字,而不是(列)字母?
在我输入一些数字后,它再次要求选择一个块。当我返回(回车)时,程序停止。。。
 
 
现在就这样。。。但我知道,首次使用/新用户(使用“空白”系统)可能很困难。
 
 
gr.Rlx

BIGAL 发表于 2022-7-5 17:03:40

RLX thanks将更改为默认路径。发布的代码有两个选项:用户目录或用户临时目录。删除第9行和第10行不需要的内容。

rlx 发表于 2022-7-5 17:09:04

 
 
嗨,Al,
 
 
让它或多或少发挥作用。第一次运行除了创建一个表之外什么都不做。程序也会一直要求选择一个块,但在我完成选择后输入时停止。当我第二次运行你的应用程序时,它会创建一个新表,然后填充该表。也可以将(c:sct)放在文件的末尾?如果加载时执行此命令,则不确定是否加载超出此行的零件,但我认为,自从我获得对话框后,确实如此。
 
 
无论如何,在第二次运行时,您的程序会在表格旁边添加一行新行,当我手动调整表格时,它会正确显示我在对话框中输入的列编号中的所有属性值。可能内置了一个检查最大列数的功能,因为如果我选择了一个具有多个属性的标题栏,它会在消息对话框中出错为大,Al;-)
 
 
我不确定我是否可以把你的应用程序用在我的工作领域(电子),但也许我可以想出一些东西。
 
 
gr.Rlx

BIGAL 发表于 2022-7-5 17:13:01

Rlx不确定为什么不在第一关工作,复活节有点时间。它是作为一种方法放在一起的,以展示如何做到这一点,所以目前有点粗糙。您是对的,从多少列开始实际上是用户的选择,因为它将基于表中所需的标题。
 
它一次只能选择一个,选择一个块并询问1个或全部是有意义的。这可能是下一个版本步骤。创建表示例的唯一原因是使其更易于测试。在现实生活中,此步骤不应该存在,或者可能像您建议的那样,选择一个块并将属性的数量与列相匹配。
 
另一个已知的问题是,dcl中可以显示的行数有限制,因此需要第2步显示第2页等。我管理了14行。
 
它需要一个真实世界的dwg,该dwg具有多个块,但需要填充一个表,但没有针对每个块设置列的规则,同时考虑到空白单元格。需要类似block1 4 ATT、block2 6 ATT、block3 2 ATT的东西。

rlx 发表于 2022-7-5 17:18:06

 
 
嗨,Al,
 
 
我唯一能想到的是一个单线图或一个照明布局,在这里你可以数一数所有的灯,有一个表格,上面有所有类型的照明电枢,它们的功耗,以及连接的组(保险丝/开关)。我有一个mcc的单线图,其中有不同类型的馈线,一些给另一个配电盘或保险丝盒供电,一些给泵或电机供电。然后你可以根据耗电量或类似的东西在一个表格中总结它们,尽管这将是一个有点颠倒的世界,因为我从一个表格(excell)开始生成了这个图形。你的应用程序在制作机械图纸中所有不同部分的列表时可能更有用?不过,和他一起玩很好,也许以后我或其他人可以想出一个更好的例子。
 
 
gr.Rlx
单线Mcc。图纸
页: [1] 2
查看完整版本: 填充多个块属性