乐筑天下

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

[编程交流] 曲面上的圆

[复制链接]

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:11:27 | 显示全部楼层
来吧,肖恩,李。。。你只需要再发一条帖子,我会向你们两个祈祷。。。
 
您好,M.R。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-5 18:14:30 | 显示全部楼层
项目几何?
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:16:59 | 显示全部楼层
谢谢你的命令。。。我从未使用过它,当在3D中工作时它可能非常有用。。。
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 18:18:29 | 显示全部楼层
我相信OP正在寻找这样的东西。这是一种快速而肮脏的方法。
 
  1. (defun c:Test ()
  2. (setq ms (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'ModelSpace))
  3. (defun pl->var (pl / ub sa var)
  4.    (setq ub (- (length pl) 1))
  5.    (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  6.    (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  7.    )
  8. (princ "\nSelect Circle:")
  9. (setq ss (ssget ":S" '(( 0 . "CIRCLE"))))
  10. (setq pl nil)
  11. (if ss
  12.    (progn
  13.      (setq cir (vlax-ename->vla-object (ssname ss 0)))
  14.      (setq rp (vlax-safearray->list (vlax-variant-value (vlax-get-property cir 'Center))))
  15.      (setq r (vlax-get-property cir 'Radius))
  16.      (princ "\nSelect AECC TIN Surface:")
  17.      (setq ss (ssget ":S" '((0 . "AECC_TIN_SURFACE"))))
  18.      (setq surf (vlax-ename->vla-object (ssname ss 0)))
  19.      (setq a 0)
  20.      (repeat 360
  21. (setq p (polar rp a r))
  22. (setq el (vlax-invoke-method surf 'FindElevationAtXY (car p)(cadr p)))
  23. (setq p (list (car p)(cadr p)el))
  24. (setq pl (append pl p))
  25. (setq a (+ a (/ pi 180.0)))
  26. )
  27.      (setq var (pl->var pl))
  28.      (setq 3dobj (vlax-invoke-method ms 'Add3DPoly var))
  29.      (vlax-put-property 3dobj 'Closed 1)
  30.      )
  31.    )
  32. )

 
请记住,我没有仔细观察错误捕捉。如果圆的任何部分不在曲面顶部,则会出错。这将对圆中的每个度进行采样。
 
当做
 
hippe013
 
P、 也许有人愿意接受这个想法并清理它(添加错误捕获和处理局部变量与全局变量)。
回复

使用道具 举报

35

主题

97

帖子

62

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 18:22:45 | 显示全部楼层
非常感谢Hippe013。这真的给了我一些可以使用的东西,只希望我能更好地理解LISP语法!
回复

使用道具 举报

35

主题

97

帖子

62

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 18:25:11 | 显示全部楼层
我对Hippe013的代码做了一些修改(实际上不需要这个圆,等等):
现在我在这行上得到一个错误:(setq var(pl->var pl))
错误是:没有函数定义:PL->VAR
请帮忙做这个。当错误不存在时,当您多次运行代码时,它会给出有趣的结果。
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 18:27:59 | 显示全部楼层
您缺少pl->var的定义
 
  1. (defun pl->var (pl / ub sa var)
  2.    (setq ub (- (length pl) 1))
  3.    (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  4.    (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  5.    )

 
您需要将变量“pl”设置为局部变量。否则,每次运行代码时,列表“pl”将随着您不断追加相同的列表“pl”而不断增长。
 
有道理?
 
 
编辑:实际上所有变量都应该是局部变量。(定义c:cs(/pt1 rp r ss surf a p el pl var 3dobj)。。。。
 
圆的半径总是10吗?
回复

使用道具 举报

35

主题

97

帖子

62

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 18:31:26 | 显示全部楼层
非常感谢Hippe013,它工作得很好。
半径始终为10是。
 
如果我现在将对象的两个顶点连接到起点(中心),这两条线的斜率将为1%。所以我需要遍历它们,并测试高度差。你能帮我出主意吗?在这一点上,我不认为起点覆盖在表面上。
 
顺便说一句,我正试图创造一些类似的“等级多边形”上http://www.dotsoft.com/mwsurfaces.htm
以下是我目前的代码:
  1. (defun c:CS ( / pt1 rp r ss surf a p el pl var 3dobj)
  2. (if (setq pt1 (getpoint "\nEnter the start point: "))
  3.    (progn
  4.      (setq rp pt1)
  5.      (setq r 10)
  6.      (princ "\nSelect AECC TIN Surface:")
  7.      (setq ss (ssget ":S" '((0 . "AECC_TIN_SURFACE"))))
  8.      (setq surf (vlax-ename->vla-object (ssname ss 0)))
  9.      (setq a 0)
  10.      (repeat 360
  11.    (setq p (polar rp a r))
  12.    (setq el (vlax-invoke-method surf 'FindElevationAtXY (car p)(cadr p)))
  13.    (setq p (list (car p)(cadr p)el))
  14.    (setq pl (append pl p))
  15.    (setq a (+ a (/ pi 180.0)))
  16.    )
  17.      (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  18.      (setq var (pl->var pl))
  19.      (setq 3dobj (vlax-invoke-method mspace 'Add3DPoly var))
  20.      )
  21.    )
  22. (princ)
  23. )
  24. (defun pl->var (pl / ub sa var)
  25.    (setq ub (- (length pl) 1))
  26.    (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  27.    (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  28.    )
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 18:35:46 | 显示全部楼层
 
我想我不确定你想做什么。至于中心点高程,此时您应该知道如何获得圆中心点的高程。
 
您需要在surf对象(AECC\u TIN\u曲面)上调用findelevantionatxy方法。您的中心点位于rp变量下,因此代码如下所示:
 
  1. 5

 
findelevantionatxy方法需要两个参数(x和y),即(car rp)=x(cadr rp)=y
 
如果你能澄清你想要实现的目标,我应该能提供一些想法。
回复

使用道具 举报

35

主题

97

帖子

62

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 18:39:03 | 显示全部楼层
我需要用户选择一个坡度;通常是1%。
然后,他在曲面上选择一个点,然后应用程序应在所需坡度处绘制一个三维多边形(从该点向上)。从用户选择的点开始,通常有两条线。
 
我不确定这是否有意义。我看到DotSoft提供了这个功能,他们称之为Grade Poly(http://www.dotsoft.com/mwsurfaces.htm),但我们不可能支付495美元。
 
所以我的想法是绘制圆形的三维多边形,将其覆盖到曲面上,然后遍历顶点,找到一个(或两个)给出正确等级的顶点。然后,中心点将通过一条线连接到此点。然后以新点为中心创建一个新的圆形三维多边形。然后重复迭代。最终,我们会有一系列的线路;这些都应该连接起来,以形成一个表面坡度一致的三维多边形。我不是一个很好的解释事情,所以我希望你明白这一点。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:16 , Processed in 0.701913 second(s), 70 queries .

© 2020-2025 乐筑天下

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