fabriciorby 发表于 2022-7-6 00:02:03

vla addleader问题

你好
我身上发生了一些奇怪的事情,我不知道为什么。
(setvar 'osmode 0)
(setq pt1 (getpoint "\nFirst point: ")
   pt2 (getpoint "\nNext point: ")
pt3 (getpoint)
   space (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
   )
(princ pt1)
(princ pt2)
(setq ptlist (vlax-make-safearray vlax-vbDouble '(0 . 5)))
(vlax-safearray-fill ptlist (apply (function append) (list pt1 pt2)))
(setq txtobj (vla-addmtext space (vlax-3d-point pt2) 0 ""))
(setq ldrobj (vla-addleader space ptlist txtobj acLineWithArrow))
(vla-addpolyline space ptlist)
(vla-delete txtobj)
 
拜托,这个Lisp程序怎么了?

Lee Mac 发表于 2022-7-6 00:19:36

问题是,提供给ActiveX addleader方法的顶点参数需要是Safearray类型的变体;然而,在您的代码中,您只提供了Safearray。
 
下面是一个示例,演示如何构建变体:

(defun c:test1 ( / ldr pt1 pt2 spc txt )
   (if
       (and
         (setq pt1 (getpoint "\n1st point: "))
         (setq pt2 (getpoint "\n2nd point: " pt1))
       )
       (progn
         (setq spc
               (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
                   (if (= 1 (getvar 'cvport))
                     'paperspace
                     'modelspace
                   )
               )
         )
         (setq txt (vla-addmtext spc (vlax-3D-point (trans pt2 1 0)) 0.0 ""))
         (setq ldr
               (vla-addleader spc
                   (vlax-make-variant
                     (vlax-safearray-fill
                           (vlax-make-safearray vlax-vbdouble '(0 . 5))
                           (append (trans pt1 1 0) (trans pt2 1 0))
                     )
                   )
                   txt aclinewitharrow
               )
         )
         (vla-delete txt)
       )
   )
   (princ)
)
但是,通过使用未记录的vlax调用函数代替vlax调用方法或vla addleader,您可以完全避免使用变体和安全数组(有关这些差异的更多信息,请参阅此处):
(defun c:test2 ( / ldr pt1 pt2 spc txt )
   (if
       (and
         (setq pt1 (getpoint "\n1st point: "))
         (setq pt2 (getpoint "\n2nd point: " pt1))
       )
       (progn
         (setq spc
               (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
                   (if (= 1 (getvar 'cvport))
                     'paperspace
                     'modelspace
                   )
               )
         )
         (setq txt (vlax-invoke spc 'addmtext(trans pt2 1 0) 0.0 "")
               ldr (vlax-invoke spc 'addleader (append (trans pt1 1 0) (trans pt2 1 0)) txt aclinewitharrow)
         )
         (vla-delete txt)
       )
   )
   (princ)
)
然而,就领导实体而言,在我看来,使用entmake/entmakex的Vanilla AutoLISP路由要简单得多:
(defun c:test3 ( / pt1 pt2 )
   (if
       (and
         (setq pt1 (getpoint "\n1st point: "))
         (setq pt2 (getpoint "\n2nd point: " pt1))
       )
       (entmake
         (list
            '(000 . "LEADER")
            '(100 . "AcDbEntity")
            '(100 . "AcDbLeader")
               (cons 010 (trans pt1 1 0))
               (cons 010 (trans pt2 1 0))
               (cons 210 (trans '(0.0 0.0 1.0) 1 0 t))
         )
       )
   )
   (princ)
)

fabriciorby 发表于 2022-7-6 00:32:12

李·麦克,
你又做了一次!
哦,你。。。
非常感谢!
(认真地)

fabriciorby 发表于 2022-7-6 00:38:27

Vanilla lisp按预期工作,但其他语言在VLisp中仍然出现相同的问题
我们如何修复它?
问题是我试着这样做:

我明白了:

通过运行C:test1或C:test2
 
有什么提示吗?

Lee Mac 发表于 2022-7-6 00:52:22

 
不客气!
 
 
我认为Visual LISP ActiveX addleader方法存在一个已知的错误,即无法指定null注释参数;因此,当使用此方法创建引线时,将自动为文本对象生成“平台”。
 
我的建议是:使用Vanilla AutoLISP。

fabriciorby 发表于 2022-7-6 01:11:47

 
当然再次感谢!
页: [1]
查看完整版本: vla addleader问题