John E Green 发表于 2022-7-6 11:43:12

嗨,李,
 
我理解你的回答,这可能是我的理解方式。
 
使用代码后,我将多段线转换为块,并使用(setq nHandle(vla get handle block))将实体句柄添加到TAG1,这将图形50FC作为实体句柄。
 
如果我在命令行发出以下命令
(setq en(car(entsel))[选择新块]
 
然后
 
(entget en)
 
返回所有数据,包括(5。“5103”)
 
 
这是我无法解决的问题,因为我想检查附加到块的nHandle值是否正确,目前似乎不正确。
 
希望这能让事情变得更清楚一点。
 
约翰

Lee Mac 发表于 2022-7-6 11:45:27

但是,您是在检索块表或insert中的块定义句柄吗?

John E Green 发表于 2022-7-6 11:47:14

嗨,李,
 
我以为我得到了插入物,或者更确切地说,我希望我得到的是插入块。是否有一种方法可以同时达到这两个目的,或者这取决于我在代码中的什么位置获得句柄?
 
我会做更多的调查,因为我确信我就快到了,但任何的指示都会受到欢迎。
 
约翰

Lee Mac 发表于 2022-7-6 11:51:09

这是一个正确的方向:
 

(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
   )
)
)

John E Green 发表于 2022-7-6 11:55:56

嗨,李,
 
非常感谢你的帮助。我刚刚掌握了visual Lisp。我可以看到代码的去向。
 
明天早上我会试一试的。
 
当做
约翰

Lee Mac 发表于 2022-7-6 11:57:53

太好了-如果你卡住了,请告诉我

John E Green 发表于 2022-7-6 12:00:30

嗨,李,
 
我尝试了您建议的代码,但出现了一个错误。如果我将bObj更改为Variable block,则ActiveX服务器返回错误未知名称“GETATTRIBUTES”。我确信block是正确的,因为这是刚刚插入的块。
 
如果我将bObj更改为Obj(我认为这是一个集合,所以它是错误的),那么我会得到错误,错误的参数类型是VLA-OBJECT nil
 
我确信block是正确的,但不确定为什么会出错,我想我可能只是把对象弄错了。
 
 
对不起,这么讨厌。
 
你能推荐一本好的visual lisp参考书吗?
 
非常感谢
 
约翰

Lee Mac 发表于 2022-7-6 12:04:46

为什么要更改变量“bObj”?变量“block”指向块表中的块定义,而不是插入的块引用(INSERT)。'Objs是VLA对象的列表。
 
你想要实现什么?
 
至于这本书,我推荐Visual LISP帮助文件——你可以从中学到很多东西(另外,它们是免费的)。

John E Green 发表于 2022-7-6 12:07:57

嗨,李,
 
对不起,我没有让brian启动,我错过了阅读插入块行,以为这只是Obj而不是bObj。
 
很抱歉。
 
我将通读帮助文件,这似乎是一个很好的起点。
 
非常感谢

John E Green 发表于 2022-7-6 12:10:43

嗨,李,
 
非常感谢您的帮助和支持。我现在有它的工作,它做了我需要的一切。你的帮助和指点起了很大的作用。
 
非常感谢
约翰
页: 1 [2]
查看完整版本: 将数据附着到块创建