乐筑天下

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

[编程交流] 填充多个块属性

[复制链接]

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:27:45 | 显示全部楼层 |阅读模式
最近的一篇帖子让我觉得你有一个包含多列的表,并且想在表中插入不同的块属性,但块都不同,但都有共同的列标题,如零件号、长度、宽度。
 
属性位置到处都是,所以选择一个块,然后选择希望属性值出现的列。
 
这是非常粗糙的,但我正在寻找一些示例DWG或有一个发挥,让我知道你是如何找到它的,我已经包括了一个测试的生成表只是改变了列的数量超过你最大的属性数。请注意,可以显示的属性数量有限。只需使用99之类的数字表示列中的非条目。下一个版本可能是选择多个同名块,而不是一次选择一个。
 
  1. ; pick a block and enter attributes into table
  2. ; by Alan H April 2017
  3. (defun c:blk-tab ( / tabrows lst lst2 lstatt x )
  4. (if (/= tblobj nil)
  5. (princ)
  6. (setq tblobj (vlax-ename->vla-object (car (entsel "Pick table"))))
  7. )
  8. (setq tabrows (vla-get-rows tblobj)) ; number of rows existing
  9. ; if has attribs check here
  10. (while (setq obj (vlax-ename->vla-object (car (entsel "Pick Block"))))
  11. (setq lst '())
  12. (setq lstatt '())
  13. (foreach att (vlax-invoke obj 'getattributes)
  14. (setq lstatt (cons (vla-get-textstring att) lstatt))
  15. (setq lst (cons (strcat (vla-get-tagstring att) " " (vla-get-textstring att)) lst))
  16. (setq lst (cons 4 lst))
  17. (setq lst (cons 2 lst))
  18. )
  19. (setq lst (reverse lst))
  20. (setq lstatt (reverse lstatt))
  21. (if (not AH:getkeys)(load "getvals2"))
  22. ;(AH:getkeys (list "Line 1" 5 4 "line 2" 4 2 "line 3" 8 7))
  23. (princ "\nGetvals2 loaded")
  24. (AH:getkeys lst)
  25. ; get key values as a list
  26. (setq num (/ (length lst) 3))
  27. (setq x 1)
  28. (setq lst2 '())
  29. (repeat num
  30. (setq lst2 (cons (atoi (eval (read (strcat "Key" (rtos x 2))))) lst2))
  31. (setq x (+ x 1))
  32. )
  33. (setq lst2 (reverse lst2)) ; this is the order for table matches nth lstatt
  34. ; now do table insertion this is column values for next entry
  35. ; add a row then insert values.
  36. (vla-InsertRows tblobj (+ tabrows 1) (vla-GetRowHeight tblobj (- tabrows 1)) 1)
  37. (repeat (setq x (length lstatt))
  38. (setq x (- x 1))
  39. (vla-settext tblobj tabrows  (- (nth x lst2) 1) (nth x lstatt)) ;1st column is zero
  40. )
  41. (setq tabrows (+ tabrows 1))
  42. ) ;while
  43. (setq ans (getstring "To reset table just press <Cr> any other key to continue "))
  44. (if (= ans nil)(setq tblobj nil))  
  45. ) ;defun

 
  1. ; example of creating a table
  2. ; By Alan H
  3. (defun c:sct (/ colwidth numcolumns numrows objtable rowheight sp vgad vgao )
  4. (vl-load-com)
  5. (setq sp (vlax-3d-point '(0 0 0)))
  6. (setq doc  (vla-get-activedocument (vlax-get-acad-object) ))
  7. (setq vgms (vla-get-modelspace doc))
  8. (setq numrows 5)
  9. (setq numcolumns 5)
  10. (setq rowheight 0.5)
  11. (setq colwidth 30)
  12. (setq objtable (vla-addtable vgms sp numrows numcolumns rowheight colwidth))
  13. ; RetVal = object.AddTable(InsertionPoint, NumRows, NumColumns, RowHeight, ColWidth)
  14. (vla-settext objtable 0 0 "TABLE title")
  15. (vla-settext objtable 1 0 "A")
  16. (vla-settext objtable 1 1 "B")
  17. (vla-settext objtable 1 2 "C")
  18. (vla-settext objtable 1 3 "D")
  19. (vla-settext objtable 1 4 "E")
  20. (vla-settext objtable 2 0 "1")
  21. (vla-settext objtable 3 0 "2")
  22. (vla-settext objtable 4 0 "3")
  23. (vla-setcolumnwidth objtable 0 15) ; 0 is first column
  24. (vla-setcolumnwidth objtable 1 30)
  25. (vla-setcolumnwidth objtable 2 60)
  26. (command "_zoom" "e")
  27. (princ)
  28. )
  29. (C:sct)

 
  1. ; multi line dcl
  2. ; with help from the guys at Cadtutor
  3. ; sample code a 3 line example
  4. ; (if (not AH:getkeys)(load "getvals2"))
  5. ;(AH:getkeys (list "Line 1" 5 4 "line 2" 2 4 "line 3" 8 7))
  6. (princ "Getvals2 loaded")
  7. (defun AH:getkeys (INFO / fo fname newlst num x y klist)
  8. ; you can hard code a directory if you like for dcl file
  9. (setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
  10. ;(setq fo (open (setq fname "c:\\acadtemp\\getkeys.dcl") "w"))
  11. (write-line "ddgetkey : dialog {" fo)
  12. (write-line " : column {" fo)
  13. (setq num (/ (length info) 3))
  14. (setq x 1)
  15. (repeat num
  16. (setq klist (cons (strcat "key" (rtos x 2 0)) klist))
  17. (setq x (+ 1 x))
  18. )
  19. (setq x 1)
  20. (setq y 1)
  21. (repeat num
  22. (write-line ": edit_box {" fo)
  23. (write-line (strcat "    key = "  (chr 34) (strcat "key" (rtos y 2 0)) (chr 34) ";") fo)
  24. (write-line (strcat " label = "  (chr 34) (nth (- x 1) info) (chr 34) ";"  )   fo)
  25. (write-line (strcat "     edit_width = " (rtos (nth x info) 2 0) ";" ) fo)
  26. (write-line (strcat "     edit_limit = " (rtos (nth (+ x 1) info) 2 0) ";" ) fo)
  27. (write-line "   is_enabled = true;" fo)
  28. (write-line "  }" fo)
  29. (write-line "spacer_1 ;" fo)
  30. (setq x (+ x 3))
  31. (setq y (+ y 1))
  32. )
  33. (write-line "  }" fo)
  34. (write-line "ok_only;}" fo)
  35. (close fo)
  36. (setq x 1)
  37. (setq outlst '())
  38. (setq dcl_id (load_dialog  fname))
  39. (if (not (new_dialog "ddgetkey" dcl_id))
  40. (exit))
  41. (foreach k klist
  42.      (action_tile k (strcat "(setq " k " (get_tile "" k ""))"))
  43. )
  44. (action_tile "accept" "(done_dialog 1)")
  45. (action_tile "cancel" "(done_dialog 0)")
  46. (setq action (start_dialog))
  47. (unload_dialog dcl_id)
  48. ) ; defun
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:34:17 | 显示全部楼层
嗨,比格尔,
 
 
首先必须查看表的位置,但在布局选项卡上找到了它,然后例程在(load“getvals2”)处停止,因为(if(not AH:getkeys)等。。。
 
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:41:01 | 显示全部楼层
嗨,比格尔,
我建议使用一些将assoc列表转换为acad_表的子函数,然后通过使用列表操作和测试输出列表的格式,您可以将其传递给该子函数。
使用vlide控制台中的pretty print选项来获得可读列表,这样就可以发现最终的问题。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:46:11 | 显示全部楼层
抱歉,伙计们添加了getvals2。lsp并将其更改为“modelspace”,这就是加载保存在库目录中的lisp的问题,以便在测试时工作。。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:54:01 | 显示全部楼层
 
 
总是发生在我身上。。。好吧,有时候。。。
 
 
gr.Rlx
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:03:40 | 显示全部楼层
RLX thanks将更改为默认路径。发布的代码有两个选项:用户目录或用户临时目录。删除第9行和第10行不需要的内容。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:18:06 | 显示全部楼层
 
 
嗨,Al,
 
 
我唯一能想到的是一个单线图或一个照明布局,在这里你可以数一数所有的灯,有一个表格,上面有所有类型的照明电枢,它们的功耗,以及连接的组(保险丝/开关)。我有一个mcc的单线图,其中有不同类型的馈线,一些给另一个配电盘或保险丝盒供电,一些给泵或电机供电。然后你可以根据耗电量或类似的东西在一个表格中总结它们,尽管这将是一个有点颠倒的世界,因为我从一个表格(excell)开始生成了这个图形。你的应用程序在制作机械图纸中所有不同部分的列表时可能更有用?不过,和他一起玩很好,也许以后我或其他人可以想出一个更好的例子。
 
 
gr.Rlx
单线Mcc。图纸
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:09 , Processed in 0.793597 second(s), 72 queries .

© 2020-2025 乐筑天下

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