我理解你的回答,这可能是我的理解方式。
使用代码后,我将多段线转换为块,并使用(setq nHandle(vla get handle block))将实体句柄添加到TAG1,这将图形50FC作为实体句柄。
如果我在命令行发出以下命令
(setq en(car(entsel))[选择新块]
然后
(entget en)
返回所有数据,包括(5。“5103”)
这是我无法解决的问题,因为我想检查附加到块的nHandle值是否正确,目前似乎不正确。
希望这能让事情变得更清楚一点。
约翰 但是,您是在检索块表或insert中的块定义句柄吗? 嗨,李,
我以为我得到了插入物,或者更确切地说,我希望我得到的是插入块。是否有一种方法可以同时达到这两个目的,或者这取决于我在代码中的什么位置获得句柄?
我会做更多的调查,因为我确信我就快到了,但任何的指示都会受到欢迎。
约翰 这是一个正确的方向:
(defun c:MakeSpace ( / *error* BLOCK CEN DOC FLG ID NME OBJS SPC SS )
(vl-load-com)
;; Lee Mac~18.05.10
(setq id "SPACE-")
(defun *error* ( msg )
(and flg (vla-EndUndoMark doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ)
)
(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)
)
)
(initget 1)
(setq nme (getstring "\nPlease Enter Space ID: "))
(cond
(
(tblsearch "BLOCK" (strcat id nme))
(princ "\n** Block Already Exists **")
)
(
(not (setq ss (ssget "_:L")))
)
(
(setq flg (not (vla-StartUndoMark doc)))
(setq block
(vla-Add (vla-get-Blocks doc)
(vlax-3D-point
(setq cen
(apply (function mapcar)
(cons
(function
(lambda ( x y )
(/ (+ x y) 2.)
)
)
(SSBoundingBox ss)
)
)
)
)
(strcat id nme)
)
)
(vla-copyObjects doc
(ObjectVariant (setq objs (ss->vla ss))) block
)
(mapcar
(function
(lambda ( prmpt pt tag )
(vla-AddAttribute block (getvar 'TEXTSIZE) 0 prmpt
(vlax-3D-point pt) tag ""
)
)
)
(list "Tag 1: " "Tag 2: " "Tag 3: ")
(list cen
(polar cen (/ (* 3 pi) 2.) (* 1.5 (getvar 'TEXTSIZE)))
(polar cen (/ (* 3 pi) 2.) (* 3.0 (getvar 'TEXTSIZE)))
)
(list "TAG1" "TAG2" "TAG3")
)
(if
(vl-catch-all-error-p
(setq bObj
(vl-catch-all-apply (function vla-InsertBlock)
(list spc (vlax-3D-point cen) (strcat id nme) 1. 1. 1. 0.)
)
)
)
(princ "\n** Error Inserting Block **")
(foreach att (vlax-invoke bObj 'GetAttributes)
(vla-put-TextString att (vla-get-Handle bObj))
)
)
(mapcar (function vla-erase) objs)
(setq flg (vla-EndUndoMark doc))
)
)
(princ)
)
(defun ObjectVariant ( lst )
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbObject
(cons 0 (1- (length lst)))
)
lst
)
)
)
(defun SSBoundingBox ( ss / ent ll ur bBoxs )
;; Lee Mac~18.03.10
((lambda ( i )
(while (setq ent (ssname ss (setq i (1+ i))))
(vla-getBoundingBox (vlax-ename->vla-object ent) 'll 'ur)
(setq bBoxs (cons (vlax-safearray->list ur)
(cons (vlax-safearray->list ll) bBoxs)))
)
)
-1
)
(mapcar
(function
(lambda (operation)
(apply (function mapcar)
(cons operation bBoxs)
)
)
)
'(min max)
)
)
(defun ss->vla ( ss )
(if ss
(
(lambda ( i / e l )
(while (setq e (ssname ss (setq i (1+ i))))
(setq l
(cons
(vlax-ename->vla-object e) l
)
)
)
l
)
-1
)
)
)
嗨,李,
非常感谢你的帮助。我刚刚掌握了visual Lisp。我可以看到代码的去向。
明天早上我会试一试的。
当做
约翰 太好了-如果你卡住了,请告诉我 嗨,李,
我尝试了您建议的代码,但出现了一个错误。如果我将bObj更改为Variable block,则ActiveX服务器返回错误未知名称“GETATTRIBUTES”。我确信block是正确的,因为这是刚刚插入的块。
如果我将bObj更改为Obj(我认为这是一个集合,所以它是错误的),那么我会得到错误,错误的参数类型是VLA-OBJECT nil
我确信block是正确的,但不确定为什么会出错,我想我可能只是把对象弄错了。
对不起,这么讨厌。
你能推荐一本好的visual lisp参考书吗?
非常感谢
约翰 为什么要更改变量“bObj”?变量“block”指向块表中的块定义,而不是插入的块引用(INSERT)。'Objs是VLA对象的列表。
你想要实现什么?
至于这本书,我推荐Visual LISP帮助文件——你可以从中学到很多东西(另外,它们是免费的)。 嗨,李,
对不起,我没有让brian启动,我错过了阅读插入块行,以为这只是Obj而不是bObj。
很抱歉。
我将通读帮助文件,这似乎是一个很好的起点。
非常感谢 嗨,李,
非常感谢您的帮助和支持。我现在有它的工作,它做了我需要的一切。你的帮助和指点起了很大的作用。
非常感谢
约翰
页:
1
[2]