乐筑天下

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

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

[复制链接]

3

主题

12

帖子

9

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:08:53 | 显示全部楼层 |阅读模式
你好
 
我正在写一个包含attdef的脚本,我想:
1.选择对象(即闭合多段线)
2、为对象指定面积和长度
3.创建包含面积和长度属性的块。
 
我被困在物体上了。是否可以在attdef之前获取objectID,然后在默认插入字段中使用它?我使用的是Acad2010 x64
 
  1. %<\AcObjProp.16.2 Object(%<[color=red]\_ObjId 8796082670240[/color]>%,1).Area \f "%lu2">%

 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:13:30 | 显示全部楼层
这是我用来检索ObjectID的代码:
 
  1. (defun GetObjectID ( obj doc )
  2. ;; Lee Mac
  3. (if
  4.    (eq "X64"
  5.      (strcase
  6.        (getenv "PROCESSOR_ARCHITECTURE")
  7.      )
  8.    )
  9.    (vlax-invoke-method
  10.      (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
  11.    )
  12.    (itoa (vla-get-Objectid obj))
  13. )
  14. )

 
需要两个参数-
 
VLA对象:有问题的对象
Document对象:Document对象-因为我通常在循环中使用函数。
 
回复

使用道具 举报

3

主题

12

帖子

9

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:17:45 | 显示全部楼层
非常感谢!
我真的是一个关于lisp和脚本的新手。。。还有一个问题:
如何将其与属性和块创建结合起来?有没有办法用脚本完成这项工作?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:19:06 | 显示全部楼层
当你说“脚本”时,你是指可以一次在多个图形上运行的脚本吗?请记住,“script”和LISP是两个不同的东西。
 
也许可以看看这里:
 
http://www.cadtutor.net/forum/showpost.php?p=317428&postcount=20
 
http://www.cadtutor.net/forum/showpost.php?p=314560&postcount=4
 
http://www.cadtutor.net/forum/showpost.php?p=314562&postcount=5
 
http://www.cadtutor.net/forum/showpost.php?p=311693&postcount=20
回复

使用道具 举报

3

主题

12

帖子

9

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:21:57 | 显示全部楼层
我不确定我想要的是脚本还是lisp。我不想在多个图形上使用它。
我的问题是我想自动创建2000个块。块必须包含具有多条多段线面积和长度的属性。稍后,我可以使用块名(包括面积和长度)将数据提取到excel。。。
可以用object->area创建属性的lisp吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:27:27 | 显示全部楼层
听起来你想用LISP。
 
从我上面提供的链接中,您应该能够将面积字段放置到属性/text/mtext中。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:29:22 | 显示全部楼层
这可能适合您:
 
  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. [b][color=Red](setq fBlock "Block")[/color][/b]   [b][color=Red];; Block Name or nil[/color][/b]
  6. [color=Red][b](setq ftag  "TAG1")[/b][/color]  [b][color=Red] ;; Tag Name[/color][/b]
  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.    
  104.    (while
  105.      (progn
  106.        (setq ent (car (entsel "\nSelect Object to Retrieve Area: ")))
  107.        (cond
  108.          (
  109.            (eq 'ENAME (type ent))
  110.            (if
  111.              (not
  112.                (vlax-property-available-p
  113.                  (setq obj (vlax-ename->vla-object ent)) 'Area
  114.                )
  115.              )
  116.              (princ "\n** Invalid Object Selected **")
  117.             
  118.              (if
  119.                (and
  120.                  (setq pt (getpoint "\nPick Point for Block: "))
  121.                  (setq bObj (InsertBlock spc fBlock pt))
  122.                )
  123.                (progn
  124.                  (and ftag
  125.                    (PutAttValue bObj ftag
  126.                      (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  127.                        (GetObjectID obj doc) ">%).Area \\f "%lu6%qf1">%"
  128.                      )
  129.                    )
  130.                  )
  131.                  (vla-regen doc acActiveViewport)
  132.                )
  133.              )
  134.            )
  135.          )
  136.        )
  137.      )
  138.    )
  139.    (princ "\n** Block not Found **")
  140. )
  141. (princ)
  142. )
  143.          

 
更新顶部的块名和标记名。
回复

使用道具 举报

3

主题

12

帖子

9

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:33:14 | 显示全部楼层
非常感谢!你帮了大忙。看看代码,这正是我想要的。但也许我很愚蠢,但我无法让它发挥作用。
如果可以使lisp仅创建一个属性,并将面积字段应用于选定的多段线对象,则会暂停。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:35:33 | 显示全部楼层
您是否正确更新了突出显示的部分?我要看一看。
 
 
只需创建一个作为单个属性的块,并在LISP中使用它。
 
 
编辑:我不能让代码失败。。。
回复

使用道具 举报

3

主题

12

帖子

9

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:38:21 | 显示全部楼层
我的错,它工作得很好!非常感谢!
还有一个问题。。。
现在我用TAG1制作一个attrib,并用该attrib制作一个名为“block”的块。我想为每个新属性创建一个新块(并给它起一个新名称)。
是否可以:
1、选择闭合多段线
2.使用选定的多段线区域创建属性
3.创建并命名包含多段线和属性的块
 
?
 
这太棒了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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