乐筑天下

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

[编程交流] 获取Attdef脚本的ObjectID

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:40:40 | 显示全部楼层
这将为每个字段创建单独的块-但我不知道您为什么要这样处理它。
 
  1. (defun c:Fld ( / GetBlock GetObjectID PutAttValue InsertBlock AddBlock Itemp
  2.                 BLK BOBJ COLL DOC ENT FBLOCK FTAG OBJ PT RESULT SEED SPC TAG VALUE
  3.                 )
  4. (vl-load-com)
  5. ;; Lee Mac  ~  11.05.10
  6. (setq fBlock "Block")   ;; Block Name
  7. (setq ftag  "TAG1")   ;; Tag Name
  8. (defun GetObjectID ( obj doc )
  9.    ;; Lee Mac
  10.    (if
  11.      (eq "X64"
  12.        (strcase
  13.          (getenv "PROCESSOR_ARCHITECTURE")
  14.        )
  15.      )
  16.      (vlax-invoke-method
  17.        (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
  18.      )
  19.      (itoa (vla-get-Objectid obj))
  20.    )
  21. )
  22. (defun PutAttValue ( object tag value )
  23.    ;; Lee Mac  ~  05.05.10
  24.    (mapcar
  25.      (function
  26.        (lambda ( attrib )
  27.          (and
  28.            (eq tag (vla-get-TagString attrib))
  29.            (vla-put-TextString attrib value)
  30.          )
  31.        )
  32.      )
  33.      (vlax-invoke object 'GetAttributes)
  34.    )
  35.    value
  36. )
  37. (defun InsertBlock ( Block Name Point )
  38.    (if
  39.      (not
  40.        (vl-catch-all-error-p
  41.          (setq result
  42.            (vl-catch-all-apply (function vla-insertblock)
  43.              (list Block (vlax-3D-point point) Name 1. 1. 1. 0.)
  44.            )
  45.          )
  46.        )
  47.      )
  48.      result
  49.    )
  50. )
  51. (defun Itemp ( coll item )
  52.    (if
  53.      (not
  54.        (vl-catch-all-error-p
  55.          (setq item
  56.            (vl-catch-all-apply
  57.              (function vla-item) (list coll item)
  58.            )
  59.          )
  60.        )
  61.      )
  62.      item
  63.    )
  64. )
  65. (defun AddBlock ( seed pt / coll name )
  66.    (setq coll
  67.      (vla-get-Blocks
  68.        (vla-get-ActiveDocument
  69.          (vlax-get-acad-object)
  70.        )
  71.      )
  72.    )
  73.    (setq Name
  74.      (
  75.        (lambda ( i )
  76.          (while
  77.            (Itemp coll
  78.              (strcat seed
  79.                (itoa
  80.                  (setq i (1+ i))
  81.                )
  82.              )
  83.            )
  84.          )
  85.          (strcat seed (itoa i))
  86.        )
  87.        0
  88.      )
  89.    )
  90.    (list
  91.      (vla-Add coll
  92.        (vlax-3D-point pt) name
  93.      )
  94.      name
  95.    )
  96. )   
  97. (setq spc
  98.    (if
  99.      (or
  100.        (eq AcModelSpace
  101.          (vla-get-ActiveSpace
  102.            (setq doc
  103.              (vla-get-ActiveDocument
  104.                (vlax-get-acad-object)
  105.              )
  106.            )
  107.          )
  108.        )
  109.        (eq :vlax-true (vla-get-MSpace doc))
  110.      )
  111.      (vla-get-ModelSpace doc)
  112.      (vla-get-PaperSpace doc)
  113.    )
  114. )
  115.    
  116. (while
  117.    (progn
  118.      (setq ent (car (entsel "\nSelect Object to Retrieve Area: ")))
  119.      (cond
  120.        (
  121.          (eq 'ENAME (type ent))
  122.         
  123.          (if
  124.            (not
  125.              (vlax-property-available-p
  126.                (setq obj (vlax-ename->vla-object ent)) 'Area
  127.              )
  128.            )
  129.            (princ "\n** Invalid Object Selected **")
  130.             
  131.            (if
  132.              (and
  133.                (setq pt   (getpoint "\nPick Point for Block: "))
  134.                (setq blk  (AddBlock fBlock '(0. 0. 0.)))
  135.                (vla-AddAttribute (car blk)
  136.                  (vla-get-height
  137.                    (Itemp
  138.                      (vla-get-TextStyles doc) (getvar 'TEXTSTYLE)
  139.                    )
  140.                  )
  141.                  acAttributeModePreset
  142.                  "Enter Tag Value: "
  143.                  (vlax-3D-point '(0. 0. 0.))
  144.                  ftag
  145.                  ""
  146.                )                  
  147.                (setq bObj (InsertBlock spc (cadr blk) pt))
  148.              )
  149.              (progn
  150.                (and ftag
  151.                  (PutAttValue bObj ftag
  152.                    (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  153.                      (GetObjectID obj doc) ">%).Area \\f "%lu6%qf1">%"
  154.                    )
  155.                  )
  156.                )
  157.                (vla-regen doc acActiveViewport)
  158.              )
  159.            )
  160.          )
  161.         t
  162.        )
  163.      )
  164.    )
  165. )
  166. (princ)
  167. )
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:44:16 | 显示全部楼层
 
是否有可能修改此选项,使插入的块具有3个属性,而不仅仅是区域。即“房间名称”(由用户手动输入)、“面积”和“周长”??
回复

使用道具 举报

075

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 17:48:32 | 显示全部楼层
很不错的!
这正是我想要的,但我的街区规模有问题。
我的方块以厘米为单位,我在一个米文件中播放lisp。
也许你能帮助我。
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:52:44 | 显示全部楼层
你好
 
很抱歉再次提出我关于这个主题的问题“http://www.cadtutor.net/forum/showthread.php?31029-插入-An-Attribute-Block-Then-Fill-In-w-Field/page2“
但这里的东西几乎就是我需要的。
 
例如,可以选择一个块并检索属性“TAG2”,而不是选择区域。
 
对不起我的英语。
我来自葡萄牙。
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:54:58 | 显示全部楼层
一点示例代码
 
  1. (setq ss1 (ssget))
  2. (foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 0 )) 'getattributes)
  3.      (Princ  (strcat "\n" (vla-get-tagstring att) " " (vla-get-textstring att)))
  4. ) ; end foreach
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:59:27 | 显示全部楼层
我是个编程新手。我必须用它替换原始代码的哪一部分?
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:00:20 | 显示全部楼层
我发布的示例显示了标记名和属性值,这是一种查找标记名的简单方法。
 
  1. (princ "\nPick a attributed block ")
  2. (setq ss1 (ssget))
  3. (foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 0 )) 'getattributes)
  4.     (if (=  (vla-get-tagstring att) "TAG2") (alert (vla-get-textstring att)) )
  5. ; put rest of code here
  6. )
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 18:04:58 | 显示全部楼层
谢谢你的回复。但我不知道剩下的代码是什么。
我正在尝试使用以下代码:
 
  1. (defun c:Fld ( / GetBlock GetObjectID PutAttValue InsertBlock
  2.                 BOBJ DOC ENT FBLOCK FTAG OBJ PT RESULT SPC TAG VALUE)
  3. (vl-load-com)
  4. ;; Lee Mac  ~  11.05.10
  5. (setq fBlock "Block")   ;; Block Name or nil
  6. (setq ftag  "TAG1")   ;; Tag Name
  7. (defun GetBlock ( block )
  8. ;; Lee Mac  ~  05.05.10
  9.    (cond
  10.      (
  11.        (not
  12.          (and
  13.            (or block
  14.              (setq block
  15.                (getfiled "Select Block" "" "dwg" 16)
  16.              )
  17.            )
  18.            (or
  19.              (and
  20.                (vl-position
  21.                  (vl-filename-extension block) '("" nil)
  22.                )
  23.                (or
  24.                  (tblsearch "BLOCK" block)
  25.                  (setq block
  26.                    (findfile
  27.                      (strcat block ".dwg")
  28.                    )
  29.                  )
  30.                )
  31.              )
  32.              (setq block (findfile block))
  33.            )
  34.          )
  35.        )
  36.       nil
  37.      )
  38.      ( block )
  39.    )
  40. )
  41. (defun GetObjectID ( obj doc )
  42.    ;; Lee Mac
  43.    (if
  44.      (eq "X64"
  45.        (strcase
  46.          (getenv "PROCESSOR_ARCHITECTURE")
  47.        )
  48.      )
  49.      (vlax-invoke-method
  50.        (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
  51.      )
  52.      (itoa (vla-get-Objectid obj))
  53.    )
  54. )
  55. (defun PutAttValue ( object tag value )
  56.    ;; Lee Mac  ~  05.05.10
  57.    (mapcar
  58.      (function
  59.        (lambda ( attrib )
  60.          (and
  61.            (eq tag (vla-get-TagString attrib))
  62.            (vla-put-TextString attrib value)
  63.          )
  64.        )
  65.      )
  66.      (vlax-invoke object 'GetAttributes)
  67.    )
  68.    value
  69. )
  70. (defun InsertBlock ( Block Name Point )
  71.    (if
  72.      (not
  73.        (vl-catch-all-error-p
  74.          (setq result
  75.            (vl-catch-all-apply (function vla-insertblock)
  76.              (list Block (vlax-3D-point point) Name 1. 1. 1. 0.)
  77.            )
  78.          )
  79.        )
  80.      )
  81.      result
  82.    )
  83. )
  84. (setq spc
  85.    (if
  86.      (or
  87.        (eq AcModelSpace
  88.          (vla-get-ActiveSpace
  89.            (setq doc
  90.              (vla-get-ActiveDocument
  91.                (vlax-get-acad-object)
  92.              )
  93.            )
  94.          )
  95.        )
  96.        (eq :vlax-true (vla-get-MSpace doc))
  97.      )
  98.      (vla-get-ModelSpace doc)
  99.      (vla-get-PaperSpace doc)
  100.    )
  101. )
  102. (if (setq fBlock (GetBlock fBlock))
  103.    (while
  104.      (progn
  105.        [color="red"](setq ent (car (entsel "\nSelect Object to Retrieve Area: ")))
  106.        (cond
  107.          (
  108.            (eq 'ENAME (type ent))
  109.            (if
  110.              (not
  111.                (vlax-property-available-p
  112.                  (setq obj (vlax-ename->vla-object ent)) 'Area
  113.                )
  114.              )
  115.              (princ "\n** Invalid Object Selected **")[/color]
  116.              (if
  117.                (and
  118.                  (setq pt (getpoint "\nPick Point for Block: "))
  119.                  (setq bObj (InsertBlock spc fBlock pt))
  120.                )
  121.                (progn
  122.                  (and ftag
  123.                    (PutAttValue bObj ftag
  124.                      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  125.                        (GetObjectID obj doc) ">%).Area \\f "%lu6%qf1">%"
  126.                      )
  127.                    )
  128.                  )
  129.                  (vla-regen doc acActiveViewport)
  130.                )
  131.              )
  132.            )
  133.          )
  134.        )
  135.      )
  136.    )
  137.    (princ "\n** Block not Found **")
  138. )
  139. (princ)
  140. )

 
它可以很好地选择区域,并将它们插入带有属性“TAG1”的“块”中,并带有选定区域的字段。
但我正在尝试合并你的代码,但我不知道如何合并
我认为“红色”部分是我需要用你的代码替换的部分,但我做错了什么。
 
对不起,我是新手。
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 18:08:54 | 显示全部楼层
在一些谷歌搜索之后,我尝试了以下方法:
 
  1. (defun c:Fld ( / GetBlock GetObjectID PutAttValue InsertBlock
  2.                 BOBJ DOC ENT FBLOCK FTAG OBJ PT RESULT SPC TAG VALUE)
  3. (vl-load-com)
  4. ;; Lee Mac  ~  11.05.10
  5. (setq fBlock "BAR2")   ;; Block Name or nil
  6. (setq ftag  "N")   ;; Tag Name
  7. (defun GetBlock ( block )
  8. ;; Lee Mac  ~  05.05.10
  9.    (cond
  10.      (
  11.        (not
  12.          (and
  13.            (or block
  14.              (setq block
  15.                (getfiled "Select Block" "" "dwg" 16)
  16.              )
  17.            )
  18.            (or
  19.              (and
  20.                (vl-position
  21.                  (vl-filename-extension block) '("" nil)
  22.                )
  23.                (or
  24.                  (tblsearch "BLOCK" block)
  25.                  (setq block
  26.                    (findfile
  27.                      (strcat block ".dwg")
  28.                    )
  29.                  )
  30.                )
  31.              )
  32.              (setq block (findfile block))
  33.            )
  34.          )
  35.        )
  36.       nil
  37.      )
  38.      ( block )
  39.    )
  40. )
  41. (defun GetObjectID ( obj doc )
  42.    ;; Lee Mac
  43.    (if
  44.      (eq "X64"
  45.        (strcase
  46.          (getenv "PROCESSOR_ARCHITECTURE")
  47.        )
  48.      )
  49.      (vlax-invoke-method
  50.        (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
  51.      )
  52.      (itoa (vla-get-Objectid obj))
  53.    )
  54. )
  55. (defun PutAttValue ( object tag value )
  56.    ;; Lee Mac  ~  05.05.10
  57.    (mapcar
  58.      (function
  59.        (lambda ( attrib )
  60.          (and
  61.            (eq tag (vla-get-TagString attrib))
  62.            (vla-put-TextString attrib value)
  63.          )
  64.        )
  65.      )
  66.      (vlax-invoke object 'GetAttributes)
  67.    )
  68.    value
  69. )
  70. (defun InsertBlock ( Block Name Point )
  71.    (if
  72.      (not
  73.        (vl-catch-all-error-p
  74.          (setq result
  75.            (vl-catch-all-apply (function vla-insertblock)
  76.              (list Block (vlax-3D-point point) Name 1. 1. 1. 0.)
  77.            )
  78.          )
  79.        )
  80.      )
  81.      result
  82.    )
  83. )
  84. (setq spc
  85.    (if
  86.      (or
  87.        (eq AcModelSpace
  88.          (vla-get-ActiveSpace
  89.            (setq doc
  90.              (vla-get-ActiveDocument
  91.                (vlax-get-acad-object)
  92.              )
  93.            )
  94.          )
  95.        )
  96.        (eq :vlax-true (vla-get-MSpace doc))
  97.      )
  98.      (vla-get-ModelSpace doc)
  99.      (vla-get-PaperSpace doc)
  100.    )
  101. )
  102. (if (setq fBlock (GetBlock fBlock))
  103.    (while
  104.      (progn
  105.        (princ "\nPick a attributed block ")
  106.        (cond
  107.          (
  108.                         
  109.                (setq ss1 (ssget))
  110.         (foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 0 )) 'getattributes)
  111.         (if (=  (vla-get-tagstring att) "BAR") (alert (vla-get-textstring att)) ))
  112.         (and
  113.                  (setq pt (getpoint "\nPick Point for Block: "))
  114.                  (setq bObj (InsertBlock spc fBlock pt))
  115.                )
  116.                (progn
  117.                  (and ftag
  118.                    (PutAttValue bObj ftag
  119.                      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  120.                        (GetObjectID obj doc) ">%).TextString >%"
  121.                      )
  122.                    )
  123.                  )
  124.                  (vla-regen doc acActiveViewport)
  125.             
  126.            )
  127.          )
  128.        )
  129.      )
  130.    )
  131.    (princ "\n** Block not Found **")
  132. )
  133. (princ)
  134. )

 
但我收到了这个错误:“错误:错误的参数类型:VLA-OBJECT nil”
块插入了一个文本为“否”的字段,但在检查过滤器后,问题似乎是ObjectId,它与所选块不对应。
 
解决方案可能很简单,但我不懂lisp。
 
谢谢
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 18:11:34 | 显示全部楼层
我是这方面的新手。昨天我做了更多的搜索,但我不断出错。
 
我有多重图形和多重块做,直到星期六,这个Lisp程序将是我的救赎。
 
有人能帮忙吗?
 
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:04 , Processed in 0.487645 second(s), 70 queries .

© 2020-2025 乐筑天下

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