问题是,提供给ActiveX addleader方法的顶点参数需要是Safearray类型的变体;然而,在您的代码中,您只提供了Safearray。
下面是一个示例,演示如何构建变体:
- ([color=BLUE]defun[/color] c:test1 ( [color=BLUE]/[/color] ldr pt1 pt2 spc txt )
- ([color=BLUE]if[/color]
- ([color=BLUE]and[/color]
- ([color=BLUE]setq[/color] pt1 ([color=BLUE]getpoint[/color] [color=MAROON]"\n1st point: "[/color]))
- ([color=BLUE]setq[/color] pt2 ([color=BLUE]getpoint[/color] [color=MAROON]"\n2nd point: "[/color] pt1))
- )
- ([color=BLUE]progn[/color]
- ([color=BLUE]setq[/color] spc
- ([color=BLUE]vlax-get-property[/color] ([color=BLUE]vla-get-activedocument[/color] ([color=BLUE]vlax-get-acad-object[/color]))
- ([color=BLUE]if[/color] ([color=BLUE]=[/color] 1 ([color=BLUE]getvar[/color] 'cvport))
- 'paperspace
- 'modelspace
- )
- )
- )
- ([color=BLUE]setq[/color] txt ([color=BLUE]vla-addmtext[/color] spc ([color=BLUE]vlax-3D-point[/color] ([color=BLUE]trans[/color] pt2 1 0)) 0.0 [color=MAROON]""[/color]))
- ([color=BLUE]setq[/color] ldr
- ([color=BLUE]vla-addleader[/color] spc
- ([color=BLUE]vlax-make-variant[/color]
- ([color=BLUE]vlax-safearray-fill[/color]
- ([color=BLUE]vlax-make-safearray[/color] [color=BLUE]vlax-vbdouble[/color] '(0 . 5))
- ([color=BLUE]append[/color] ([color=BLUE]trans[/color] pt1 1 0) ([color=BLUE]trans[/color] pt2 1 0))
- )
- )
- txt [color=BLUE]aclinewitharrow[/color]
- )
- )
- ([color=BLUE]vla-delete[/color] txt)
- )
- )
- ([color=BLUE]princ[/color])
- )
但是,通过使用未记录的vlax调用函数代替vlax调用方法或vla addleader,您可以完全避免使用变体和安全数组(有关这些差异的更多信息,请参阅此处):
- ([color=BLUE]defun[/color] c:test2 ( [color=BLUE]/[/color] ldr pt1 pt2 spc txt )
- ([color=BLUE]if[/color]
- ([color=BLUE]and[/color]
- ([color=BLUE]setq[/color] pt1 ([color=BLUE]getpoint[/color] [color=MAROON]"\n1st point: "[/color]))
- ([color=BLUE]setq[/color] pt2 ([color=BLUE]getpoint[/color] [color=MAROON]"\n2nd point: "[/color] pt1))
- )
- ([color=BLUE]progn[/color]
- ([color=BLUE]setq[/color] spc
- ([color=BLUE]vlax-get-property[/color] ([color=BLUE]vla-get-activedocument[/color] ([color=BLUE]vlax-get-acad-object[/color]))
- ([color=BLUE]if[/color] ([color=BLUE]=[/color] 1 ([color=BLUE]getvar[/color] 'cvport))
- 'paperspace
- 'modelspace
- )
- )
- )
- ([color=BLUE]setq[/color] txt ([color=BLUE]vlax-invoke[/color] spc 'addmtext ([color=BLUE]trans[/color] pt2 1 0) 0.0 [color=MAROON]""[/color])
- ldr ([color=BLUE]vlax-invoke[/color] spc 'addleader ([color=BLUE]append[/color] ([color=BLUE]trans[/color] pt1 1 0) ([color=BLUE]trans[/color] pt2 1 0)) txt [color=BLUE]aclinewitharrow[/color])
- )
- ([color=BLUE]vla-delete[/color] txt)
- )
- )
- ([color=BLUE]princ[/color])
- )
然而,就领导实体而言,在我看来,使用entmake/entmakex的Vanilla AutoLISP路由要简单得多:
- ([color=BLUE]defun[/color] c:test3 ( [color=BLUE]/[/color] pt1 pt2 )
- ([color=BLUE]if[/color]
- ([color=BLUE]and[/color]
- ([color=BLUE]setq[/color] pt1 ([color=BLUE]getpoint[/color] [color=MAROON]"\n1st point: "[/color]))
- ([color=BLUE]setq[/color] pt2 ([color=BLUE]getpoint[/color] [color=MAROON]"\n2nd point: "[/color] pt1))
- )
- ([color=BLUE]entmake[/color]
- ([color=BLUE]list[/color]
- '(000 . [color=MAROON]"LEADER"[/color])
- '(100 . [color=MAROON]"AcDbEntity"[/color])
- '(100 . [color=MAROON]"AcDbLeader"[/color])
- ([color=BLUE]cons[/color] 010 ([color=BLUE]trans[/color] pt1 1 0))
- ([color=BLUE]cons[/color] 010 ([color=BLUE]trans[/color] pt2 1 0))
- ([color=BLUE]cons[/color] 210 ([color=BLUE]trans[/color] '(0.0 0.0 1.0) 1 0 [color=BLUE]t[/color]))
- )
- )
- )
- ([color=BLUE]princ[/color])
- )
|