Sungam 发表于 2022-7-5 17:08:53

获取Attdef脚本的ObjectID

你好
 
我正在写一个包含attdef的脚本,我想:
1.选择对象(即闭合多段线)
2、为对象指定面积和长度
3.创建包含面积和长度属性的块。
 
我被困在物体上了。是否可以在attdef之前获取objectID,然后在默认插入字段中使用它?我使用的是Acad2010 x64
 

%<\AcObjProp.16.2 Object(%<\_ObjId 8796082670240>%,1).Area \f "%lu2">%

 
谢谢

Lee Mac 发表于 2022-7-5 17:13:30

这是我用来检索ObjectID的代码:
 

(defun GetObjectID ( obj doc )
;; Lee Mac
(if
   (eq "X64"
   (strcase
       (getenv "PROCESSOR_ARCHITECTURE")
   )
   )
   (vlax-invoke-method
   (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
   )
   (itoa (vla-get-Objectid obj))
)
)
 
需要两个参数-
 
VLA对象:有问题的对象
Document对象:Document对象-因为我通常在循环中使用函数。
 

Sungam 发表于 2022-7-5 17:17:45

非常感谢!
我真的是一个关于lisp和脚本的新手。。。还有一个问题:
如何将其与属性和块创建结合起来?有没有办法用脚本完成这项工作?

Lee Mac 发表于 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

Sungam 发表于 2022-7-5 17:21:57

我不确定我想要的是脚本还是lisp。我不想在多个图形上使用它。
我的问题是我想自动创建2000个块。块必须包含具有多条多段线面积和长度的属性。稍后,我可以使用块名(包括面积和长度)将数据提取到excel。。。
可以用object->area创建属性的lisp吗?

Lee Mac 发表于 2022-7-5 17:27:27

听起来你想用LISP。
 
从我上面提供的链接中,您应该能够将面积字段放置到属性/text/mtext中。

Lee Mac 发表于 2022-7-5 17:29:22

这可能适合您:
 

(defun c:Fld ( / GetBlock GetObjectID PutAttValue InsertBlock
                BOBJ DOC ENT FBLOCK FTAG OBJ PT RESULT SPC TAG VALUE)
(vl-load-com)
;; Lee Mac~11.05.10


(setq fBlock "Block")   ;; Block Name or nil

(setq ftag"TAG1") ;; Tag Name


(defun GetBlock ( block )
;; Lee Mac~05.05.10
   (cond
   (
       (not
         (and
         (or block
             (setq block
               (getfiled "Select Block" "" "dwg" 16)
             )
         )
         (or
             (and
               (vl-position
               (vl-filename-extension block) '("" nil)
               )
               (or
               (tblsearch "BLOCK" block)
               (setq block
                   (findfile
                     (strcat block ".dwg")
                   )
               )
               )
             )
             (setq block (findfile block))
         )
         )
       )
      nil
   )
   ( block )
   )
)

(defun GetObjectID ( obj doc )
   ;; Lee Mac
   (if
   (eq "X64"
       (strcase
         (getenv "PROCESSOR_ARCHITECTURE")
       )
   )
   (vlax-invoke-method
       (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false
   )
   (itoa (vla-get-Objectid obj))
   )
)

(defun PutAttValue ( object tag value )
   ;; Lee Mac~05.05.10
   (mapcar
   (function
       (lambda ( attrib )
         (and
         (eq tag (vla-get-TagString attrib))
         (vla-put-TextString attrib value)
         )
       )
   )
   (vlax-invoke object 'GetAttributes)
   )
   value
)

(defun InsertBlock ( Block Name Point )
   (if
   (not
       (vl-catch-all-error-p
         (setq result
         (vl-catch-all-apply (function vla-insertblock)
             (list Block (vlax-3D-point point) Name 1. 1. 1. 0.)
         )
         )
       )
   )
   result
   )
)

(setq spc
   (if
   (or
       (eq AcModelSpace
         (vla-get-ActiveSpace
         (setq doc
             (vla-get-ActiveDocument
               (vlax-get-acad-object)
             )
         )
         )
       )
       (eq :vlax-true (vla-get-MSpace doc))
   )
   (vla-get-ModelSpace doc)
   (vla-get-PaperSpace doc)
   )
)


(if (setq fBlock (GetBlock fBlock))
   
   (while
   (progn
       (setq ent (car (entsel "\nSelect Object to Retrieve Area: ")))

       (cond
         (
         (eq 'ENAME (type ent))

         (if
             (not
               (vlax-property-available-p
               (setq obj (vlax-ename->vla-object ent)) 'Area
               )
             )
             (princ "\n** Invalid Object Selected **")
            
             (if
               (and
               (setq pt (getpoint "\nPick Point for Block: "))
               (setq bObj (InsertBlock spc fBlock pt))
               )
               (progn
               (and ftag
                   (PutAttValue bObj ftag
                     (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                     (GetObjectID obj doc) ">%).Area \\f \"%lu6%qf1\">%"
                     )
                   )
               )
               (vla-regen doc acActiveViewport)
               )
             )
         )
         )
       )
   )
   )
   (princ "\n** Block not Found **")
)
(princ)
)
         

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

Sungam 发表于 2022-7-5 17:33:14

非常感谢!你帮了大忙。看看代码,这正是我想要的。但也许我很愚蠢,但我无法让它发挥作用。
如果可以使lisp仅创建一个属性,并将面积字段应用于选定的多段线对象,则会暂停。

Lee Mac 发表于 2022-7-5 17:35:33

您是否正确更新了突出显示的部分?我要看一看。
 
 
只需创建一个作为单个属性的块,并在LISP中使用它。
 
 
编辑:我不能让代码失败。。。

Sungam 发表于 2022-7-5 17:38:21

我的错,它工作得很好!非常感谢!
还有一个问题。。。
现在我用TAG1制作一个attrib,并用该attrib制作一个名为“block”的块。我想为每个新属性创建一个新块(并给它起一个新名称)。
是否可以:
1、选择闭合多段线
2.使用选定的多段线区域创建属性
3.创建并命名包含多段线和属性的块
 
?
 
这太棒了
页: [1] 2
查看完整版本: 获取Attdef脚本的ObjectID