如何将区域馈送到vla addr
你好。最近我决定先深入研究vlisp和activex。在vlide的帮助下,这远没有我最初想象的那么痛苦。基于此Adesk AddRevolvedSolid方法(ActiveX)参考
http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-C23158D9-F68B-44C6-B323-8196D8D5224D
我知道我需要一个区域作为配置文件。。。但我不太明白我做错了什么。我设法创建了区域,但当我尝试将其馈送到addrevolvedsolid时,我得到了一个错误:错误的参数类型:variantp(#)。
这是代码。最后一个符号(solidObj)是失败的符号
(defun c:try3 ()
(setq doc (vla-get-activedocument (vlax-get-acad-object))
space (vlax-get-property doc (if (= 1 (getvar 'cvport))'paperspace 'modelspace))
p1 '(0.5 0.0)
p2 '(0.5 1.0)
p3 '(1.9 1.0)
p4 '(2.0 0.9)
p5 '(2.0 0.1)
p6 '(1.9 0.0)
rotAxisPt (vlax-3d-point 0 0 0)
rotAxisDir (vlax-3d-point 0 1 0)
rotAngle 6.28
sh1 (vlax-ename->vla-object
(entmakex
(list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 6)
(cons 70 1)
(cons 10 p1)
(cons 10 p2)
(cons 10 p3)
(cons 10 p4)
(cons 10 p5)
(cons 10 p6)
)
)
)
region1 (vlax-invoke space 'addregion (list sh1))
solidObj (vla-AddRevolvedSolid Space (vlax-safearray-get-element (vlax-variant-value region1) 0) rotAxisPt rotAxisDir rotAngle)
)
)
我不会发布我所做的所有尝试/错误,但为了获取信息,它们都以相同的错误消息结束。谁能看出我做错了什么?
谢谢&干杯
杰夫! 不使用变体/安全阵列:
使用变体/安全阵列:
(defun c:try5 ( / doc ply reg sol spc )
(setq doc (vla-get-activedocument (vlax-get-acad-object))
spc (vlax-get-property doc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace))
ply (vla-addlightweightpolyline spc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbdouble '(0 . 11))
'(0.5 0.0 0.5 1.0 1.9 1.0 2.0 0.9 2.0 0.1 1.9 0.0)
)
)
)
)
(vla-put-closed ply :vlax-true)
(setq reg (vlax-safearray-get-element
(vlax-variant-value
(vla-addregion spc
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray vlax-vbobject '(0 . 0))
(list ply)
)
)
)
)
0
)
sol (vla-addrevolvedsolid spc reg
(vlax-3D-point 0 0)
(vlax-3D-point 0 1)
(+ pi pi)
)
)
(vla-delete reg)
(vla-delete ply)
(princ)
) 嗨,李!很抱歉延迟回复,谢谢两个示例。起初,我试图避免使用变体/安全阵列,因为它似乎会使事情复杂化,以获得相同的结果(我还没有完全理解它们)。在前几次不成功的尝试之后,我尝试添加数组(结果很糟糕)。c: Try4更像是我最初的目标。
这不是我最初问题的一部分,我希望你不会介意我就此澄清:
我的印象是pline是在当前ucs中创建的,但经过一些测试,我不确定它是如何工作的。仅使用我的实验中的(setq ply(vlax invoke spc‘addlightweightpolyline’(0.5 0.0 0.5 1.0 1.9 1.0 2.0 0 0.9 2.0 0 0.1 1 1.9 0)),我注意到pline添加到与ucs的xy平面平行的位置,并且起点始终与Wcs原点保持恒定距离,并且位于Wcs的0高程点。换句话说,如果我从Wcs开始,创建ucs原点:1,1,1/x轴:2,1,1/y轴:1,2,1,则pline将添加到与添加到Wcs的位置相同的位置。最让我困惑的是
-如果我在右/左/后/下/前添加一条pline,结果正是我所期望的。
-在一些自定义ucs方向中,我得到了更奇怪的结果:x和y坐标被交换。这里有一些截图可以准确地向你展示。
红色pline已添加到同一图像中显示的ucs中。
http://s29.postimg.org/yscfz1thf/ucs.jpg
ucs上的起点:X=-11.8768 Y=9.2731 Z=5.6425
为了进行比较,ucs world中添加了绿色的
http://s9.postimg.org/i1vlsffvv/wcs.jpg
我的第一个猜测是你知道这一切
我想要的是始终将pline添加到Ucs的跳线中。
我的第二个猜测是,为了实现这一点,我必须将所有和弦从ucs转换到wcs,只保留x和y值(?),并将来自起点trans的z值用于pline高程。。类似于(vla put Elevation ply(last(trans StartingPoint 1 0))。。这有什么意义吗??(我希望如此!)
几乎-您需要使用OCS(对象坐标系),而不是WCS:
3 嗨,李!多亏了这个论坛,你们和你们的精彩例子,我现在用lisp“看到一个图像”而不是拼图!我还要感谢你,李,因为你是第一个亲自向我介绍ActiveX和Vlisp的人,这真的拓宽了我的视野。
我刚刚完全理解了物体坐标系。。对于想要实现的目标,必须具备知识!我无法掌握Cad的“任意轴算法”是如何用于x轴和y轴的,但从我的理解来看,我不必理解,只需知道即使它是任意的,结果也是恒定的。
我不得不盯着你的代码看了2到3分钟,才能理解apply‘append mapcar double lambda部分。非常聪明,写得很好。
我试着一次又一次地交换ucs,试图找出pline不能立即正常添加到ocs的任何给定情况。我的感觉是,有一个原因,你把vla放在正常,但它超越了我,无法找出它。
当做
杰夫!
页:
[1]