乐筑天下

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

[编程交流] 将数据附着到块创建

[复制链接]

4

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:08:50 | 显示全部楼层 |阅读模式
大家好,
 
我在这个论坛上有一个由许多位组成的例程,它允许我将多段线转换为具有唯一ID(用户输入)的块,现在我需要做的是在创建每个块时将数据附加到每个块,数据就是区域,实体ID(点符号5)和唯一ID。我可以获得所有信息,但我不知道如何在使用vla insertblock的lisp例程中附加数据。该例程通过从多段线创建块并将其插入原始多段线的中心点来工作,然后删除原始多段线。
 
任何指点都会很有帮助,并能保留我头发剩下的部分。
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:15:12 | 显示全部楼层
嗨,约翰,
 
您是指填充块属性吗?
回复

使用道具 举报

4

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:15:25 | 显示全部楼层
嗨,李,
 
是块属性。我不确定是否需要创建具有三个属性的块,然后使用这三个属性将多段线转换为具有唯一名称的块,或者是否可以在创建块后但lisp旋转线结束之前添加属性
 
希望这有意义。
 
约翰
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:20:06 | 显示全部楼层
你现在有什么代码?这可能会帮助我更好地理解你的问题。
回复

使用道具 举报

4

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:21:48 | 显示全部楼层
嗨,李,
 
这是代码,它去它从这个论坛,我做了一些小改动
 
(定义c:生成空间(/ss adoc pt\U lst center blk*error*bi bname bpat sSpace)
;;;从选定实体生成空间
(setq bpat“空格-”)
(setq sSpace(getstring“\n请输入空间ID.”)
(如果(tblsearch“BLOCK”sSpace)(退出))
(defun*错误*(msg)
(vla ENDUDOMARK adoc);
(普林斯消息)
(普林斯)
) ;_ defun结束
(vl load com)
(vla startundomark)
(setq adoc(vla get activedocument(vlax get acad object)))
) ;_ vla StartUndoMark结束
(如果(不是)(vl-catch-all-error-p
(vl catch all apply’(λ()(setq ss(ssget“_:L”)))
) ;_ vl-catch-all-error-p结束
) ;_ not结束
(程序
(setq)
ss(mapcar“vlax ename->vla对象
(vl remove if“listp(mapcar”cadr(ssnamex ss)))
) ;_ mapcar结束
pt\U lst(应用“附加
(地图车
'(λ(x/minp maxp)
(vla getboundingbox x'minp'maxp)
(列表(vlax safearray->list minp)
(vlax safearray->list maxp)
) ;_ 追加结束
) ;_ lambda结束
不锈钢
) ;_ mapcar结束
) ;_ 追加结束
中心(mapcar’(λ(a b)(/(+a b)2))
(列表(应用“min(mapcar”car pt\u lst))
(应用“min(mapcar”cadr pt\U lst))
(应用“min(mapcar”caddr pt\U lst))
) ;_ 列表结束
(列表(应用“max(mapcar)”car pt\U lst)
(应用“max(mapcar”cadr pt\U lst))
(应用“max(mapcar”caddr pt\U lst))
) ;_ 列表结束
) ;_ mapcar结束
B名称
(程序
(setq bi 0)
(setq bName sSpace)
(while(tblsearch“BLOCK”sSpace))
bname)
blk(vla add(vla get blocks adoc)
(vlax-3d-点中心)
B名称
) ;_ vla添加结束
) ;_ setq结束
(vla copyobjects
adoc公司
(vlax make变体
(vlax安全阵列填充
(vlax make safearray vlax vbobject(cons 0(1-(length ss)))
不锈钢
) ;_ vlax安全阵列填充结束
) ;_ vlax make变体结束
黑色
) ;_ vla copyobjects结束
(vla插入块
(vla objectidtoobject adoc(vla get ownerid(car ss)))
(vlax-3d-点中心)
(vla get name blk)
1
1
1
0
) ;_ vla插入块末端
(mapcar’vla擦除ss)
) ;_ 结束和
) ;_ if结束
(vla endundomark adoc)
(普林斯)
) ;_ defun结束
 
 
我正在使用的位是vla插入块,我需要在完成后添加thre属性,以便捕获auto cade实体id并添加sSpace id和ployline区域。
 
希望这有帮助
 
约翰
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:24:59 | 显示全部楼层
嗨,约翰,
 
也许这会提供一些想法:
 
  1. (defun c:MakeSpace ( / *error* BLOCK CEN DOC FLG ID NME OBJS SPC SS )
  2. (vl-load-com)
  3. ;; Lee Mac  ~  18.05.10
  4. (setq id "SPACE-")
  5. (defun *error* ( msg )
  6.    (and flg (vla-EndUndoMark doc))
  7.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  8.        (princ (strcat "\n** Error: " msg " **")))
  9.    (princ)
  10. )
  11. (setq spc
  12.    (if
  13.      (or
  14.        (eq AcModelSpace
  15.          (vla-get-ActiveSpace
  16.            (setq doc
  17.              (vla-get-ActiveDocument
  18.                (vlax-get-acad-object)
  19.              )
  20.            )
  21.          )
  22.        )
  23.        (eq :vlax-true (vla-get-MSpace doc))
  24.      )
  25.      (vla-get-ModelSpace doc)
  26.      (vla-get-PaperSpace doc)
  27.    )
  28. )
  29. (initget 1)
  30. (setq nme (getstring "\nPlease Enter Space ID: "))
  31. (cond
  32.    (
  33.      (tblsearch "BLOCK" (strcat id nme))
  34.      (princ "\n** Block Already Exists **")
  35.    )
  36.    (
  37.      (not (setq ss (ssget "_:L")))
  38.    )
  39.    (
  40.      (setq flg (not (vla-StartUndoMark doc)))
  41.      (setq block
  42.        (vla-Add (vla-get-Blocks doc)
  43.          (vlax-3D-point
  44.            (setq cen
  45.              (apply (function mapcar)
  46.                (cons
  47.                  (function
  48.                    (lambda ( x y )
  49.                      (/ (+ x y) 2.)
  50.                    )
  51.                  )
  52.                  (SSBoundingBox ss)
  53.                )
  54.              )
  55.            )
  56.          )
  57.          (strcat id nme)
  58.        )
  59.      )
  60.      (vla-copyObjects doc
  61.        (ObjectVariant (setq objs (ss->vla ss))) block
  62.      )
  63.      (mapcar
  64.        (function
  65.          (lambda ( prmpt pt tag )
  66.            (vla-AddAttribute block (getvar 'TEXTSIZE) 0 prmpt
  67.              (vlax-3D-point pt) tag ""
  68.            )
  69.          )
  70.        )
  71.        (list "Tag 1: " "Tag 2: " "Tag 3: ")
  72.        (list cen
  73.          (polar cen (/ (* 3 pi) 2.) (* 1.5 (getvar 'TEXTSIZE)))
  74.          (polar cen (/ (* 3 pi) 2.) (* 3.0 (getvar 'TEXTSIZE)))
  75.        )
  76.        (list "TAG1" "TAG2" "TAG3")
  77.      )
  78.      (if
  79.        (vl-catch-all-error-p
  80.          (vl-catch-all-apply (function vla-InsertBlock)
  81.            (list spc (vlax-3D-point cen) (strcat id nme) 1. 1. 1. 0.)
  82.          )
  83.        )
  84.        (princ "\n** Error Inserting Block **")
  85.      )
  86.      (mapcar (function vla-erase) objs)
  87.      (setq flg (vla-EndUndoMark doc))
  88.    )
  89. )
  90. (princ)
  91. )
  92. (defun ObjectVariant ( lst )
  93. (vlax-make-variant
  94.    (vlax-safearray-fill
  95.      (vlax-make-safearray vlax-vbObject
  96.        (cons 0 (1- (length lst)))
  97.      )
  98.      lst
  99.    )
  100. )
  101. )
  102. (defun SSBoundingBox ( ss / ent ll ur bBoxs )
  103. ;; Lee Mac  ~  18.03.10
  104. (  (lambda ( i )
  105.       
  106.       (while (setq ent (ssname ss (setq i (1+ i))))
  107.         (vla-getBoundingBox (vlax-ename->vla-object ent) 'll 'ur)
  108.         (setq bBoxs (cons (vlax-safearray->list ur)
  109.                           (cons (vlax-safearray->list ll) bBoxs)))
  110.       )
  111.     )   
  112. -1
  113. )
  114. (mapcar
  115.    (function
  116.      (lambda (operation)
  117.        (apply (function mapcar)
  118.          (cons operation bBoxs)
  119.        )
  120.      )
  121.    )
  122.    '(min max)
  123. )
  124. )
  125. (defun ss->vla ( ss )
  126. (if ss
  127.    (
  128.      (lambda ( i / e l )
  129.        (while (setq e (ssname ss (setq i (1+ i))))
  130.          (setq l
  131.            (cons
  132.              (vlax-ename->vla-object e) l
  133.            )
  134.          )
  135.        )
  136.        l
  137.      )
  138.      -1
  139.    )
  140. )
  141. )

 
此外,请务必阅读此内容。
 
回复

使用道具 举报

4

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:29:42 | 显示全部楼层
大家好,
 
我遇到了一些对我来说似乎很奇怪的事情,但我相信对此有一个非常局部的解释。
 
我已经使用了上面的代码,李善意地张贴这是一个工作的待遇。我现在想填充数据标记,其中之一是我需要成为实体句柄。如果我尝试使用
 
(setq hHandle(vla get handle block))
 
我得到了一个奇怪的结果,hHandle是“277”,但如果我使用(entget(entlast))句柄是27A,那么每当最后一个字符出错时都会发生这种情况。例如23E为233,24F为244
 
我在这里做一些研究,我假设句柄是一个文本字符串而不是十六进制数,我在插入块后放置代码来获取句柄,因为我认为这可能与在插入块之前拾取原始对象句柄有关。
 
我在这里有点不知所措,不确定这只是一个字符串对话,还是我需要恢复到使用entget来收集信息。
 
当做
约翰
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:31:51 | 显示全部楼层
如果您引用的是同一个实体,那么句柄将是相同的,都是十六进制字符串。
回复

使用道具 举报

4

主题

19

帖子

15

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:37:22 | 显示全部楼层
嗨,李,
 
它是同一个实体,它只是混淆了为什么vla get句柄向entget返回不同的东西?它发生在我转换为块的每个实体上。
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:40:06 | 显示全部楼层
如果它是一个in块,那么它就不是同一个实体-代码不会将实体“转换”为块,它只是从实体中生成一个块-提示是当您键入vla copyobjects时。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 11:39 , Processed in 0.550095 second(s), 72 queries .

© 2020-2025 乐筑天下

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