获取Attdef脚本的ObjectID
你好我正在写一个包含attdef的脚本,我想:
1.选择对象(即闭合多段线)
2、为对象指定面积和长度
3.创建包含面积和长度属性的块。
我被困在物体上了。是否可以在attdef之前获取objectID,然后在默认插入字段中使用它?我使用的是Acad2010 x64
%<\AcObjProp.16.2 Object(%<\_ObjId 8796082670240>%,1).Area \f "%lu2">%
谢谢 这是我用来检索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对象-因为我通常在循环中使用函数。
李 非常感谢!
我真的是一个关于lisp和脚本的新手。。。还有一个问题:
如何将其与属性和块创建结合起来?有没有办法用脚本完成这项工作? 当你说“脚本”时,你是指可以一次在多个图形上运行的脚本吗?请记住,“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 我不确定我想要的是脚本还是lisp。我不想在多个图形上使用它。
我的问题是我想自动创建2000个块。块必须包含具有多条多段线面积和长度的属性。稍后,我可以使用块名(包括面积和长度)将数据提取到excel。。。
可以用object->area创建属性的lisp吗? 听起来你想用LISP。
从我上面提供的链接中,您应该能够将面积字段放置到属性/text/mtext中。 这可能适合您:
(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)
)
更新顶部的块名和标记名。 非常感谢!你帮了大忙。看看代码,这正是我想要的。但也许我很愚蠢,但我无法让它发挥作用。
如果可以使lisp仅创建一个属性,并将面积字段应用于选定的多段线对象,则会暂停。 您是否正确更新了突出显示的部分?我要看一看。
只需创建一个作为单个属性的块,并在LISP中使用它。
编辑:我不能让代码失败。。。 我的错,它工作得很好!非常感谢!
还有一个问题。。。
现在我用TAG1制作一个attrib,并用该attrib制作一个名为“block”的块。我想为每个新属性创建一个新块(并给它起一个新名称)。
是否可以:
1、选择闭合多段线
2.使用选定的多段线区域创建属性
3.创建并命名包含多段线和属性的块
?
这太棒了
页:
[1]
2