Jef! 发表于 2022-7-5 22:58:45

如何将区域馈送到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)
)
)
我不会发布我所做的所有尝试/错误,但为了获取信息,它们都以相同的错误消息结束。谁能看出我做错了什么?
 
 
谢谢&干杯
杰夫!

Lee Mac 发表于 2022-7-5 23:25:18

不使用变体/安全阵列:
使用变体/安全阵列:
(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)
)

Jef! 发表于 2022-7-5 23:37:38

嗨,李!很抱歉延迟回复,谢谢两个示例。起初,我试图避免使用变体/安全阵列,因为它似乎会使事情复杂化,以获得相同的结果(我还没有完全理解它们)。在前几次不成功的尝试之后,我尝试添加数组(结果很糟糕)。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))。。这有什么意义吗??(我希望如此!)

Lee Mac 发表于 2022-7-5 23:52:00

 
几乎-您需要使用OCS(对象坐标系),而不是WCS:
3

Jef! 发表于 2022-7-6 00:11:50

嗨,李!多亏了这个论坛,你们和你们的精彩例子,我现在用lisp“看到一个图像”而不是拼图!我还要感谢你,李,因为你是第一个亲自向我介绍ActiveX和Vlisp的人,这真的拓宽了我的视野。
 
 
我刚刚完全理解了物体坐标系。。对于想要实现的目标,必须具备知识!我无法掌握Cad的“任意轴算法”是如何用于x轴和y轴的,但从我的理解来看,我不必理解,只需知道即使它是任意的,结果也是恒定的。
 
 
我不得不盯着你的代码看了2到3分钟,才能理解apply‘append mapcar double lambda部分。非常聪明,写得很好。
我试着一次又一次地交换ucs,试图找出pline不能立即正常添加到ocs的任何给定情况。我的感觉是,有一个原因,你把vla放在正常,但它超越了我,无法找出它。
 
 
当做
杰夫!
页: [1]
查看完整版本: 如何将区域馈送到vla addr