乐筑天下

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

[编程交流] Entmake 0。插入属性

[复制链接]

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:07:33 | 显示全部楼层
 
李,
 
出于好奇,如果您只使用entmake-insert,那么由于代码的属性部分在程序之外,它还会是必需的吗?
 
如果是这样,如果有人要更改块定义,这会是一场等待发生的冲突吗?
 
我从来没有这样尝试过,所以我不确定结果。
回复

使用道具 举报

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 11:09:31 | 显示全部楼层
Thaniks Lee公司
 
我已经按我想要的方式运行了脚本。
 
一旦我把它改得不那么具体,我就会贴出来。目前,它只为一个功能而构建
 
当做
奥利
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:11:44 | 显示全部楼层
 
很好的一点-我必须承认,我个人从未对具有属性的块使用过entmake INSERT方法,我现在大部分时间只使用vla insertblock。
 
但是,我们必须看看奥利走的路线
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:15:16 | 显示全部楼层
 
我提出这个问题的唯一原因是我以为他在使用一个带有属性标签的列表。如果有人在程序外的块中修改这些标记,那么程序当然无法正常运行。在大多数情况下,我见过这种程序生成属性。这只是一个想法。他需要记住相应地调整他的计划,无论如何都没什么大不了的。
回复

使用道具 举报

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 11:18:59 | 显示全部楼层
集体劳动取得的成果
 
  1. (Defun tee(/ sset cntr Ratt attlist  blk  blklist blkdef c)
  2. (vl-load-com)
  3. (setq bname "Attblock")
  4. (setq cntr -1)
  5. (setq sset (ssget "X" (list(cons 2 bname))))
  6. (while (< (setq cntr (+ cntr 1)) (sslength sset))
  7.    (setq blk (vlax-ename->vla-object   (ssname sset cntr)))
  8.    (setq attlist  (list(cdr (assoc 10 (entget (vlax-vla-object->ename blk))))))
  9.    (if (= (vla-get-hasattributes blk) :vlax-true)
  10.      (progn
  11.        (foreach c (vlax-safearray->list (variant-value (vla-getattributes blk)))
  12.          (setq attlist (append attlist (list(list (vla-get-tagstring c)
  13.                           (vla-get-textstring c)
  14.                                (vla-get-height c)
  15.                           (vla-get-invisible c)
  16.                           (vla-get-layer c)
  17.                           (getpmt bname (vla-get-tagstring c))))))
  18.        )
  19.        (setq blklist (append blklist (list  attlist)))
  20.        (setq attlist nil)
  21.      )
  22.    )
  23. )
  24. (command"erase" sset"")
  25. (setq Blkdef (cdar blklist))
  26. (CreateBlock blkdef bname)
  27. (foreach c blklist
  28.   (InsertBlock c bname)
  29. )
  30. (command"qsave")
  31. )
  32. (defun CreateBlock (attlist name / ent p1 )
  33. (setq sset (ssadd))
  34. (foreach c attlist
  35.   (setq tag (car c) text (nth 5 c) height (caddr c) visible (cadddr c) layer (nth 4 c ) )
  36.   (if (= p1 nil)
  37.     (setq p1 (list 0.0 0.0 0.0))
  38.     (setq p1 (list (car p1 )(- (cadr p1) (+ height (/ height 2)))(caddr p1)))
  39.   )
  40.   (entmake   (list
  41.        (cons 0 "ATTDEF")
  42.        (cons 10 p1)
  43.        (cons 40 height)
  44.        (cons 8 layer)
  45.        (cons 1 "")
  46.        (cons 3 text)
  47.        (cons 7 (getvar "TEXTSTYLE"))
  48.        (cons 2 tag)
  49.        (cons 70 1)
  50.          )
  51.   )
  52.   (setq ent (entget (entlast)))
  53.   (setq ent(subst (cons 8 layer)(assoc 8 ent)ent))
  54.   (setq ent(subst (cons 40 height)(assoc 40 ent)ent))
  55.   (if (eq visible :vlax-true)
  56.     (
  57.       (setq ent(subst (cons 70 0)(assoc 70 ent)ent))
  58.     )
  59.   )
  60.   (entmod ent)
  61.   (ssadd (entlast) sset)
  62. )
  63. (setq p1 (list (car p1 )(- (cadr p1) (+ height (/ height 2)))(caddr p1)))
  64. (entmake   (list
  65.        (cons 0 "ATTDEF")
  66.        (cons 10 p1)
  67.        (cons 40 300)
  68.        (cons 8 layer)
  69.        (cons 1 "")
  70.        (cons 3 "F2")
  71.        (cons 7 (getvar "TEXTSTYLE"))
  72.        (cons 2 "FLOOR")
  73.        (cons 70 1)
  74.          )
  75.   )
  76. (setq ent (entget (entlast)))
  77. (setq ent(subst (cons 8 layer)(assoc 8 ent)ent))
  78. (entmod ent)
  79. (ssadd (entlast) sset)
  80. (command"block" name "y" (list 0.0 -450.0 0.0) sset "")
  81. )
  82. (defun getpmt (blk aname)
  83. (if (tblsearch "BLOCK" blk)
  84.    (vlax-for Obj (vla-item
  85.                    (vla-get-Blocks
  86.                      (vla-get-Activedocument
  87.                        (vlax-get-acad-object))) blk)
  88.      (if (eq "AcDbAttributeDefinition"
  89.              (vla-get-ObjectName Obj))
  90.    (if (= (vla-get-tagstring obj) aname)
  91.          (setq pmt (vla-get-PromptString Obj)))))
  92.        )
  93.       
  94. pmt)
  95.    
  96.       
  97. (defun InsertBlock  (attlst bname / c ent tag)
  98. (vl-load-com)
  99. (if (vl-catch-all-error-p
  100.        (vl-catch-all-apply
  101.          (function
  102.            (lambda ( )
  103.              (setq blk
  104.                (vla-insertblock
  105.                  (vla-get-ModelSpace
  106.                    (vla-get-ActiveDocument
  107.                      (vlax-get-acad-object)))
  108.                  (vlax-3D-point (car attlst)) bName 1. 1. 1. 0.)))))) nil
  109.    (if (eq :vlax-true (vla-get-HasAttributes blk))
  110.      (foreach att (vlax-safearray->list
  111.                     (vlax-variant-value
  112.                       (vla-getAttributes blk)))
  113.    (setq tag (vla-get-tagString att))
  114.        (foreach x (cdr attlst)
  115.          (if (eq tag (car x))
  116.            (vla-put-TextString att (cadr x)))
  117.    )
  118.    (if(eq tag "HEAD")
  119.      (progn
  120.       (setq lvl (substr (vla-get-textstring att )9 2))
  121.       (vla-put-TextString att (substr (vla-get-textstring att) 1 7))
  122.      )
  123.    )
  124.    (if (eq tag "FLOOR")
  125.      (vla-put-textstring att lvl)
  126.    )
  127.    ))))

 
看起来很多代码回报很低,但主要的函数组(已发布)已经被证明是有用的,学习经验值得投入其中的每一个小时
 
[原文如此]这用于使用一个新属性重新创建和属性块,并将另一个属性值的值除以新属性值。
 
多亏了这些帮助
奥利
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:22:16 | 显示全部楼层
没问题,奥利,我看到你最终使用了VL方法
 
另一方面,像这样的东西可以用来重新创建一个块——事实上,我用它来重命名一个块。
 
http://www.cadtutor.net/forum/showthread.php?t=36729
 
此帖子:
http://www.cadtutor.net/forum/showpost.php?p=242147&postcount=24
回复

使用道具 举报

37

主题

125

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
190
发表于 2022-7-6 11:24:32 | 显示全部楼层
 
我有一个vba脚本通过引用模板文件来替换块,该模板文件也允许我执行上述操作。我只需要将属性值分为两个字段。最后,lisp方法要麻烦得多。
 
是的,谢谢块插入的vl方法。我曾希望尝试使用entmake方法,但对于在entmake语句中间放置for循环以进行属性定义没有信心
 
谢谢
奥利
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:27:29 | 显示全部楼层
没问题,只要它对你有效,我想不管你如何到达那里(在合理范围内!),
 
回复

使用道具 举报

1

主题

15

帖子

17

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:31:22 | 显示全部楼层
李·麦克,
 
你的解决方案对我来说是新的和有趣的,我非常感谢你花时间发布它。当我查看代码和错误捕捉文档时,我认为可以对代码进行以下更改。你能对此发表评论吗?我想开始更多地实现这种编码风格(带有异常处理的ActiveX)。
 
基本上,我删除了(function)和(lambda)函数。为什么不呢?
 
p、 我希望我知道如何做代码高亮显示。
 
  1. 8
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:35:57 | 显示全部楼层
如果我重写的话,我也会这样编码的——我似乎从2009年7月起学到了更多
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 17:30 , Processed in 0.767098 second(s), 70 queries .

© 2020-2025 乐筑天下

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