乐筑天下

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

[编程交流] 使用属性生成块,

[复制链接]

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:39:34 | 显示全部楼层 |阅读模式
我已经做了相当多的搜索,并没有找到任何很好的解释,使用entmake插入定义的块,并在插入时缩放或旋转该块。
 
其思想是标记一条线(管道),并使用属性添加该管道的直径、长度和切割长度。我有代码来准备行信息,并且正在为属性块开发entmake来标记“管道”。
 
以下是属性块的代码:
  1. (defun c:apd (/ LAY1 LAY2 LAY3 LAY4
  2.         CLR1 CLR2 CLR3 CLR4
  3.         LTP1 LTP2 LTP3 LTP4
  4.         FONT value1 value2 value3
  5.         rotation p)
  6. ;;; Change layer names and colors to suit user.
  7. (setq        LAY1   "S-Pipe-Detail"
  8. LAY2   "S-Pipe-Dia"
  9. LAY3   "S-Pipe-Length"
  10. LAY4   "S-Pipe-Cut"
  11. CLR1   1
  12. CLR2   2
  13. CLR3   3
  14. CLR4   4
  15. LTP1   "Continuous"
  16. LTP2   "Continuous"
  17. LTP3   "Continuous"
  18. LTP4   "Continuous"
  19. FONT   "Standard"
  20. )
  21. ;;;======================== Block Definition ======================
  22. (defun DEF_PipeDetail ()        ;generated using EntMaker CAB 04- MakeEntmake.lsp
  23. (entmake '((0 . "BLOCK")
  24.      (100 . "AcDbEntity")
  25.      (67 . 0)
  26.      (8 . "0")
  27.      (100 . "AcDbBlockReference")
  28.      (66 . 1)
  29.      (2 . "PipeDetail")
  30.      (10 0.0 0.0 0.0)
  31.      (70 . 2)
  32.     )
  33. )
  34. (entmake '((0 . "ATTDEF")
  35.      (100 . "AcDbEntity")
  36.      (67 . 0)
  37.      (8 . "S-Pipe-Dia")
  38.      (100 . "AcDbText")
  39.      (10 0.0 0.0 0.0)
  40.      (40 . 0.095833333333331)
  41.      (1 . "-DIA-")
  42.      (50 . 0.0)
  43.      (41 . 0.
  44.      (51 . 0.0)
  45.      (7 . "Standard")
  46.      (71 . 0)
  47.      (72 . 1)
  48.      (100 . "AcDbAttributeDefinition")
  49.      (280 . 0)
  50.      (3 . "PIPE DIAMETER:")
  51.      (2 . "DIA")
  52.      (70 . 0)
  53.      (74 . 1)
  54.      (280 . 0)
  55.     )
  56. )
  57. (entmake '((0 . "ATTDEF")
  58.      (100 . "AcDbEntity")
  59.      (67 . 0)
  60.      (8 . "S-Pipe-Length")
  61.      (100 . "AcDbText")
  62.      (10 0.0 0.0 0.0)
  63.      (40 . 0.095833333333331)
  64.      (1 . "-LENGTH-")
  65.      (50 . 0.0)
  66.      (41 . 0.
  67.      (51 . 0.0)
  68.      (7 . "Standard")
  69.      (71 . 0)
  70.      (72 . 1)
  71.      (100 . "AcDbAttributeDefinition")
  72.      (280 . 0)
  73.      (3 . "PIPE LENGTH:")
  74.      (2 . "PIPELENGTH")
  75.      (70 . 0)
  76.      (74 . 3)
  77.      (280 . 0)
  78.     )
  79. )
  80. (entmake '((0 . "ATTDEF")
  81.      (100 . "AcDbEntity")
  82.      (67 . 0)
  83.      (8 . "S-Pipe-Cut")
  84.      (100 . "AcDbText")
  85.      (10 0.0 0.0 0.0)
  86.      (40 . 0.095833333333331)
  87.      (1 . "-LENGTH-")
  88.      (50 . 0.0)
  89.      (41 . 0.
  90.      (51 . 0.0)
  91.      (7 . "Standard")
  92.      (71 . 0)
  93.      (72 . 1)
  94.      (100 . "AcDbAttributeDefinition")
  95.      (280 . 0)
  96.      (3 . "CUT LENGTH:")
  97.      (2 . "CUTLENGTH")
  98.      (70 . 0)
  99.      (74 . 3)
  100.      (280 . 0)
  101.     )
  102. )
  103. (entmake '((0 . "ENDBLK") (100 . "AcDbBlockEnd") (8 . "0")))
  104. (princ)
  105. )                                        ; end DEF_PipeDetail
  106. ;;;======================== Insert Block ======================
  107. (defun insert_PipeDetail (p lay rot d_lay pl_lay cl_lay font value1 value2 value3)
  108. (entmake (list (cons 0 "INSERT")
  109.          (cons 2 "PipeDetail")
  110.          (cons 10 p)
  111.          (cons 8 lay)
  112.          (cons 66 1)
  113.          (cons 62 256)
  114.          (cons 39 0)
  115.          (cons 6 "BYLAYER")
  116.          (cons 50 rot);block rotation (radians)
  117.    )
  118. )
  119. (entmake (list (cons 0 "ATTRIB")
  120.          (cons 8 d_lay)
  121.          (cons 10 (mapcar '* (mapcar '+ p '(0.0 0.046875 0.0)) (list (getvar "textsize")(getvar "textsize")(getvar "textsize"))))
  122.          (cons 11 (mapcar '+ p '(0.0 0.140625 0.0)))
  123.          (cons 40 (getvar "textsize"));text height
  124.          (cons 1 Value1)
  125.          (cons 2 "DIA")
  126.          (cons 70 0);attr flag
  127.          (cons 50 0);text rot
  128.          (cons 41 1);relative x-factor, width
  129. ;;;                 (cons 51 0);oblique angle (default 0)
  130.          (cons 7 font)
  131. ;;;                 (cons 71 0);text flag (def 0, bkwrd 2, upside dn 4)
  132.          (cons 74 1);1 BCenter
  133.          (cons 72 1);1 Center
  134.          (cons 210 (list 0 0 1));extrusion (def 0,0,1)
  135. ;;;                 (cons 73 0)
  136.          (cons 62 256);color (bylayer 256)
  137. ;;;                 (cons 39 0);thickness (def 0)
  138.          (cons 6 "BYLAYER")
  139.    )
  140. )
  141. (entmake (list (cons 0 "ATTRIB")
  142.          (cons 8 pl_lay)
  143.          (cons 10 (mapcar '* (mapcar '+ p '(-0.046875 -0.140625 0.0)) (list (getvar "textsize")(getvar "textsize")(getvar "textsize"))))
  144.                 (cons 11 (mapcar '+ p '(-0.046875 -0.140625 0.0)))
  145.          (cons 40 (getvar "textsize"));text height
  146.          (cons 1 Value2)
  147.          (cons 2 "PIPELENGTH")
  148.          (cons 70 0);attr flag
  149.          (cons 50 0);text rot
  150.          (cons 41 1);relative x-factor, width
  151. ;;;                 (cons 51 0);oblique angle (default 0)
  152.          (cons 7 font)
  153. ;;;                 (cons 71 0);text flag (def 0, bkwrd 2, upside dn 4)
  154.          (cons 74 3);3 TCenter
  155.          (cons 72 1);1 Center
  156.          (cons 210 (list 0 0 1));extrusion (def 0,0,1)
  157. ;;;                 (cons 73 0)
  158.          (cons 62 256);color (bylayer 256)
  159. ;;;                 (cons 39 0);thickness (def 0)
  160.          (cons 6 "BYLAYER");linetype name
  161.    )
  162. )
  163. (entmake (list (cons 0 "ATTRIB")
  164.          (cons 8 cl_lay)
  165.          (cons 10 (mapcar '* (mapcar '+ p '(0.046875 -0.28125 0.0)) (list (getvar "textsize")(getvar "textsize")(getvar "textsize"))))
  166.          (cons 11 (mapcar '+ p '(0.046875 -0.28125 0.0)))
  167.          (cons 40 (getvar "textsize"));text height
  168.          (cons 1 Value3)
  169.          (cons 2 "CUTLENGTH")
  170.          (cons 70 0);attr flag
  171.          (cons 50 0);text rot
  172.          (cons 41 1);relative x-factor, width
  173. ;;;                 (cons 51 0);oblique angle (default 0)
  174.          (cons 7 font)
  175. ;;;                 (cons 71 0);text flag (def 0, bkwrd 2, upside dn 4)
  176.          (cons 74 3);3 TCenter
  177.          (cons 72 1);1 Center
  178.          (cons 210 (list 0 0 1));extrusion (def 0,0,1)
  179. ;;;                 (cons 73 0)
  180.          (cons 62 256);color (bylayer 256)
  181. ;;;                 (cons 39 0);thickness (def 0)
  182.          (cons 6 "BYLAYER");linetype name
  183.    )
  184. )
  185. (entmake (list
  186.      (cons 0 "SEQEND")
  187.      (cons 8 lay)
  188.    )
  189. )
  190. )
  191. ;;;======================== Make Layers ======================
  192. (defun make_layer (MyLayer MyColor MyLtype)
  193. (entmake (list (cons 0 "LAYER")
  194.        (cons 100 "AcDbSymbolTableRecord")
  195.        (cons 100 "AcDbLayerTableRecord")
  196.        (cons 2 MyLayer)
  197.        (cons 6 MyLtype)
  198.        (cons 62 MyColor)
  199.         (cons 70 0)
  200. )
  201. )
  202. )
  203. ;;;======================== Main Function =======================
  204. (if (not (tblsearch "layer" LAY1))
  205.    (make_layer LAY1 CLR1 LTP1)
  206. )
  207. (if (not (tblsearch "layer" LAY2))
  208.    (make_layer LAY2 CLR2 LTP2)
  209. )
  210. (if (not (tblsearch "layer" LAY3))
  211.    (make_layer LAY3 CLR3 LTP3)
  212. )
  213. (if (not (tblsearch "layer" LAY4))
  214.    (make_layer LAY4 CLR4 LTP4)
  215. )
  216. (if (not (tblsearch "block" "PipeDetail"))
  217.    (DEF_PipeDetail)
  218. )
  219. ;;; temporary setq
  220. (setq value1 "MyDiameter"
  221.      value2 "MyLength"
  222.      value3 "MyCut"
  223.      rotation 1.5708
  224. )
  225. ;;; end temporary setq
  226. (setvar "osmode" 512)
  227. (while
  228.    (setq p (getpoint "\nPick insertion point >> "))
  229.     (insert_PipeDetail p LAY1 rotation LAY2 LAY3 LAY4 FONT value1 value2 value3)
  230. )
  231. ;;;end while
  232. (princ)
  233. )

 
这段代码可以工作,但我无法使较低的两个属性偏离直线(文字高度的一半),也无法使整个块旋转(我使用了旋转1.5708或90度)。
 
如果有人能启发我,或者把我踢向正确的方向,我将不胜感激。
 
谢谢CHL
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 16:52:03 | 显示全部楼层
正如你可能发现的那样,这可能是一个非常复杂的操作。有时,使用(命令)调用和顺序输入来插入/缩放/旋转/注释更容易。
 
通过使用(entmake),您几乎可以完全控制插入。然而,必须考虑并计算所有参数和一些其他系统变量。
 
ATTDEF的大多数块表定义可以随意操作。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:00:23 | 显示全部楼层
我建议做一些清理(避免setq和重复:使用带有子功能的列表):
  1. (defun C:test ( / make_layer DEF_PipeDetail insert_PipeDetail p a )
  2. ; local defuns:
  3. (defun make_layer (MyLayer MyColor MyLtype)
  4.    (or (tblsearch "LAYER" MyLayer)
  5.      (entmake
  6.        (list
  7.          (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord")
  8.          (cons 2 MyLayer) (cons 6 MyLtype) (cons 62 MyColor) (cons 70 0)
  9.        )
  10.      )
  11.    )
  12. ); defun make_layer
  13. (defun DEF_PipeDetail ( / AttDef )
  14.    (defun AttDef ( dxf8 dxf1 dxf3 dxf2 )
  15.      (list
  16.        '(0 . "ATTDEF") '(100 . "AcDbEntity") (cons 8 dxf8)
  17.        '(100 . "AcDbText") '(10 0.0 0.0 0.0) (cons 40 (getvar 'textsize))
  18.        (cons 1 dxf1) '(50 . 0.0) '(41 . 0. '(51 . 0.0) '(7 . "Standard")
  19.        '(71 . 0) '(72 . 1) '(100 . "AcDbAttributeDefinition") '(280 . 0)
  20.        (cons 3 dxf3) (cons 2 dxf2) '(70 . 0) '(74 . 1) '(280 . 0)
  21.      )
  22.    ); defun AttDef
  23.    (or (tblsearch "BLOCK" "PipeDetail")
  24.      (mapcar 'entmake
  25.        (append
  26.          '(((0 . "BLOCK") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "PipeDetail") (10 0.0 0.0 0.0) (70 . 2)))
  27.          (mapcar '(lambda (x) (apply 'AttDef x))
  28.            '(("S-Pipe-Dia" "-DIA-" "PIPE DIAMETER:" "DIA")
  29.              ("S-Pipe-Length" "-LENGTH-" "PIPE LENGTH:" "PIPELENGTH")
  30.              ("S-Pipe-Cut" "-LENGTH-" "CUT LENGTH:" "CUTLENGTH")
  31.            )
  32.          )
  33.          '(((0 . "ENDBLK") (100 . "AcDbBlockEnd") (8 . "0")))
  34.        )
  35.      )
  36.    )
  37. ); defun DEF_PipeDetail
  38. (defun insert_PipeDetail (p lay rot atts / Attrib)
  39.    (defun Attrib ( p rot dxf8 dxf1 dxf2 dxf7 yf )
  40.      (list
  41.        (cons 0 "ATTRIB")
  42.        (cons 8 dxf8)
  43.        (cons 10 (polar p (+ (/ PI 2.) rot) (* yf (getvar 'textsize))))
  44.        (cons 11 (polar p (+ (/ PI 2.) rot) (* yf (getvar 'textsize))))
  45.        (cons 40 (getvar 'textsize)); Text height
  46.        (cons 1 dxf1)
  47.        (cons 2 dxf2)
  48.        (cons 70 0)                 ; attr flag
  49.        (cons 50 rot)               ; text rot
  50.        (cons 41 1)                 ; relative x-factor, width
  51.        (cons 51 0)                 ; oblique angle (default 0)
  52.        (cons 7 dxf7)               ; Text style name
  53.        (cons 71 0)                 ; text flag (def 0, bkwrd 2, upside dn 4)
  54.        (cons 74 1)                 ; 1 BCenter
  55.        (cons 72 1)                 ; 1 Center
  56.        (cons 210 (list 0 0 1))     ; extrusion (def 0,0,1)
  57.        (cons 73 0)                 ; Field length (optional; default = 0) (not currently used)
  58.        (cons 62 256)               ; color (bylayer 256)
  59.        (cons 39 0)                 ; thickness (def 0)
  60.        (cons 6 "BYLAYER")
  61.      )
  62.    ); defun Attrib
  63.    (if (tblsearch "BLOCK" "PipeDetail")
  64.      (mapcar 'entmake
  65.        (append
  66.          (list
  67.            (list  
  68.              (cons 0 "INSERT") (cons 100 "AcDbEntity") (cons 8 lay) (cons 100 "AcDbBlockReference") (cons 66 1) (cons 2 "PipeDetail")
  69.              (cons 10 p) (cons 41 1.0) (cons 42 1.0) (cons 43 1.0) (cons 50 rot) (cons 62 256) (cons 6 "BYLAYER")
  70.            )
  71.          )
  72.          (mapcar '(lambda (x) (apply 'Attrib (append (list p rot) x))) atts)
  73.          (list (list (cons 0 "SEQEND") (cons 8 lay)))
  74.        )
  75.      )
  76.    ); if
  77. ); defun insert_PipeDetail
  78. ; Main function:
  79. (mapcar ; create the layers
  80.    '(lambda (x) (apply 'make_layer x))
  81.    '( ("S-Pipe-Detail" 1 "Continuous") ("S-Pipe-Dia" 2 "Continuous") ("S-Pipe-Length" 3 "Continuous") ("S-Pipe-Cut" 4 "Continuous") )
  82. ); mapcar
  83. (DEF_PipeDetail) ; create the block definition
  84. (while ; prompt to create inserts
  85.    (and
  86.      (setq p (getpoint "\nPick insertion point >> "))
  87.      (setq a (cond ((getreal "\nSpecify block rotation (in degrees) <0>: ")) (0.)))
  88.    ); and
  89.    (insert_PipeDetail p "S-Pipe-Detail" (* PI (/ a 180))
  90.      '( ; atts
  91.        ("S-Pipe-Dia" "MyDiameter" "DIA" "Standard" 1.5)
  92.        ("S-Pipe-Length" "MyLength" "PIPELENGTH" "Standard" 0.0)
  93.        ("S-Pipe-Cut" "MyCut" "CUTLENGTH" "Standard"  -1.5)
  94.      )
  95.    )
  96. ); while
  97. (princ)
  98. ); defun
回复

使用道具 举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:13:34 | 显示全部楼层
谢谢David的回复。你过去曾帮助过我。
 
非常感谢Grrr,这就是我想要的。也谢谢你的清理工作。我还没有说到这一点(从代码中的许多评论中可以看出)。这实际上是一个较大程序的一部分,该程序将从选定的行中提取数据,然后插入属性块。一旦我工作正常,我也会把它清理干净。尽管如此,您已经演示了一些优秀的清理方法,我将尝试将这些方法合并到未来的代码中。
 
再次感谢大家。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:28:43 | 显示全部楼层
我会像大卫一样轻松,你已经有了所有的答案。使用entmake速度更快,但如果您一次只做一个方块并拾取,您将不会看到任何停机时间。您只需制作一次块,即可从另一个dwg中剪切和粘贴,或将其保存为DWT的一部分。
 
  1. (command "INSERT"  blkname pt x "" ang att1 att2 att3)
回复

使用道具 举报

4

主题

57

帖子

53

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:31:06 | 显示全部楼层
了解BIGAL,这就是我们多年来一直在做的事情,其中blockname是一个长字符串,例如“G:\ACAD-BLOCKS\plupping\PIPEDETAIL.dwg”。
我正在努力清理菜单和例程,以避免我们在办公室里为四个学科设置了无数个街区。由于有如此多的块,这也会使模板文件变得庞大。
 
消除网络上的大型块库并使用entmake动态创建块、层等的另一个原因是,有了新的Autodesk订阅,工作中的用户可以选择在家用计算机上使用他们的ACAD席位。与其让每个在家工作的人偶尔将整个块目录复制到他们的主硬盘上,然后映射一个文件夹以显示为“G-drive”,不如在菜单/例程上使用entmake/x更有益处。
 
当然,我可以创建定义,然后返回到旧的“命令”调用,但这无助于我学习在定义之后插入文件的entmake方法。因此,每个小程序都成为一个学习工具,我从Grrr提供的代码中收集了很多信息。特别是关于我应该如何清理我们已经存在的大部分代码的一些聪明的方法。
 
谢谢大家,
CHL公司
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:39:43 | 显示全部楼层
您可以将所有块放入一个dwg中,并使用Lee mac的Steal lisp从另一个dwg中获取块所需的两行代码。加载steal,然后用blockname运行defun。我使用带有图像的菜单,因此路径在菜单中。你需要2个菜单,一个是C:\dwgs,另一个是网络G:。
 
如果您不想要g:\\mynetwork\projects\blocks\pipes,您可以将驱动器或子目录映射回一个字母,再加上最后一个目录B:\\pipes作为块的windows操作系统的一部分。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 14:16 , Processed in 0.665656 second(s), 67 queries .

© 2020-2025 乐筑天下

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