乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 12|回复: 4

[编程交流] 如何将区域馈送到vla addr

[复制链接]

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 22:58:45 | 显示全部楼层 |阅读模式
你好。最近我决定先深入研究vlisp和activex。在vlide的帮助下,这远没有我最初想象的那么痛苦。
 
 
基于此Adesk AddRevolvedSolid方法(ActiveX)参考
http://help.autodesk.com/view/ACD/2015/ENU/?guid=GUID-C23158D9-F68B-44C6-B323-8196D8D5224D
 
 
我知道我需要一个区域作为配置文件。。。但我不太明白我做错了什么。我设法创建了区域,但当我尝试将其馈送到addrevolvedsolid时,我得到了一个错误:错误的参数类型:variantp(#)。
 
 
这是代码。最后一个符号(solidObj)是失败的符号
  1. (defun c:try3 ()
  2.   (setq doc   (vla-get-activedocument (vlax-get-acad-object))
  3.         space (vlax-get-property doc (if (= 1 (getvar 'cvport))'paperspace 'modelspace))
  4.         p1 '(0.5 0.0)
  5.         p2 '(0.5 1.0)
  6.         p3 '(1.9 1.0)
  7.         p4 '(2.0 0.9)
  8.         p5 '(2.0 0.1)
  9.         p6 '(1.9 0.0)
  10.         rotAxisPt (vlax-3d-point 0 0 0)
  11.         rotAxisDir (vlax-3d-point 0 1 0)
  12.         rotAngle 6.28
  13.         sh1 (vlax-ename->vla-object
  14.                (entmakex
  15.                   (list
  16.                      (cons 0 "LWPOLYLINE")
  17.                      (cons 100 "AcDbEntity")
  18.                      (cons 100 "AcDbPolyline")
  19.                      (cons 90 6)
  20.                      (cons 70 1)
  21.                      (cons 10 p1)
  22.                      (cons 10 p2)
  23.                      (cons 10 p3)
  24.                      (cons 10 p4)
  25.                      (cons 10 p5)
  26.                      (cons 10 p6)
  27.                   )
  28.                )
  29.             )
  30.         region1 (vlax-invoke space 'addregion (list sh1))
  31.         solidObj (vla-AddRevolvedSolid Space (vlax-safearray-get-element (vlax-variant-value region1) 0) rotAxisPt rotAxisDir rotAngle)
  32.   )
  33. )

我不会发布我所做的所有尝试/错误,但为了获取信息,它们都以相同的错误消息结束。谁能看出我做错了什么?
 
 
谢谢&干杯
杰夫!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 23:25:18 | 显示全部楼层
不使用变体/安全阵列:
使用变体/安全阵列:
  1. (defun c:try5 ( / doc ply reg sol spc )
  2.    (setq doc (vla-get-activedocument (vlax-get-acad-object))
  3.          spc (vlax-get-property doc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace))
  4.          ply (vla-addlightweightpolyline spc
  5.                  (vlax-make-variant
  6.                      (vlax-safearray-fill
  7.                          (vlax-make-safearray vlax-vbdouble '(0 . 11))
  8.                         '(0.5 0.0 0.5 1.0 1.9 1.0 2.0 0.9 2.0 0.1 1.9 0.0)
  9.                      )
  10.                  )
  11.              )
  12.    )
  13.    (vla-put-closed ply :vlax-true)
  14.    (setq reg (vlax-safearray-get-element
  15.                  (vlax-variant-value
  16.                      (vla-addregion spc
  17.                          (vlax-make-variant
  18.                              (vlax-safearray-fill
  19.                                  (vlax-make-safearray vlax-vbobject '(0 . 0))
  20.                                  (list ply)
  21.                              )
  22.                          )
  23.                      )
  24.                  )
  25.                  0
  26.              )
  27.          sol (vla-addrevolvedsolid spc reg
  28.                  (vlax-3D-point 0 0)
  29.                  (vlax-3D-point 0 1)
  30.                  (+ pi pi)
  31.              )
  32.    )
  33.    (vla-delete reg)
  34.    (vla-delete ply)
  35.    (princ)
  36. )
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 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中。

                               
登录/注册后可看大图

ucs上的起点:X=-11.8768 Y=9.2731 Z=5.6425
 
 
为了进行比较,ucs world中添加了绿色的

                               
登录/注册后可看大图

 
 
我的第一个猜测是你知道这一切
我想要的是始终将pline添加到Ucs的跳线中。
我的第二个猜测是,为了实现这一点,我必须将所有和弦从ucs转换到wcs,只保留x和y值(?),并将来自起点trans的z值用于pline高程。。类似于(vla put Elevation ply(last(trans StartingPoint 1 0))。。这有什么意义吗??(我希望如此!)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 23:52:00 | 显示全部楼层
 
几乎-您需要使用OCS(对象坐标系),而不是WCS:
  1. 3
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-18 14:23 , Processed in 1.917080 second(s), 63 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表