marko_ribar 发表于 2022-7-5 18:11:27

来吧,肖恩,李。。。你只需要再发一条帖子,我会向你们两个祈祷。。。
 
您好,M.R。

GP_ 发表于 2022-7-5 18:14:30

项目几何?

marko_ribar 发表于 2022-7-5 18:16:59

谢谢你的命令。。。我从未使用过它,当在3D中工作时它可能非常有用。。。

Hippe013 发表于 2022-7-5 18:18:29

我相信OP正在寻找这样的东西。这是一种快速而肮脏的方法。
 
(defun c:Test ()
(setq ms (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'ModelSpace))
(defun pl->var (pl / ub sa var)
   (setq ub (- (length pl) 1))
   (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
   (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
   )
(princ "\nSelect Circle:")
(setq ss (ssget ":S" '(( 0 . "CIRCLE"))))
(setq pl nil)
(if ss
   (progn
   (setq cir (vlax-ename->vla-object (ssname ss 0)))
   (setq rp (vlax-safearray->list (vlax-variant-value (vlax-get-property cir 'Center))))
   (setq r (vlax-get-property cir 'Radius))
   (princ "\nSelect AECC TIN Surface:")
   (setq ss (ssget ":S" '((0 . "AECC_TIN_SURFACE"))))
   (setq surf (vlax-ename->vla-object (ssname ss 0)))
   (setq a 0)
   (repeat 360
(setq p (polar rp a r))
(setq el (vlax-invoke-method surf 'FindElevationAtXY (car p)(cadr p)))
(setq p (list (car p)(cadr p)el))
(setq pl (append pl p))
(setq a (+ a (/ pi 180.0)))
)
   (setq var (pl->var pl))
   (setq 3dobj (vlax-invoke-method ms 'Add3DPoly var))
   (vlax-put-property 3dobj 'Closed 1)
   )
   )
)
 
请记住,我没有仔细观察错误捕捉。如果圆的任何部分不在曲面顶部,则会出错。这将对圆中的每个度进行采样。
 
当做
 
hippe013
 
P、 也许有人愿意接受这个想法并清理它(添加错误捕获和处理局部变量与全局变量)。

Jozi68 发表于 2022-7-5 18:22:45

非常感谢Hippe013。这真的给了我一些可以使用的东西,只希望我能更好地理解LISP语法!

Jozi68 发表于 2022-7-5 18:25:11

我对Hippe013的代码做了一些修改(实际上不需要这个圆,等等):
现在我在这行上得到一个错误:(setq var(pl->var pl))
错误是:没有函数定义:PL->VAR
请帮忙做这个。当错误不存在时,当您多次运行代码时,它会给出有趣的结果。

Hippe013 发表于 2022-7-5 18:27:59

您缺少pl->var的定义
 
(defun pl->var (pl / ub sa var)
   (setq ub (- (length pl) 1))
   (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
   (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
   )
 
您需要将变量“pl”设置为局部变量。否则,每次运行代码时,列表“pl”将随着您不断追加相同的列表“pl”而不断增长。
 
有道理?
 
 
编辑:实际上所有变量都应该是局部变量。(定义c:cs(/pt1 rp r ss surf a p el pl var 3dobj)。。。。
 
圆的半径总是10吗?

Jozi68 发表于 2022-7-5 18:31:26

非常感谢Hippe013,它工作得很好。
半径始终为10是。
 
如果我现在将对象的两个顶点连接到起点(中心),这两条线的斜率将为1%。所以我需要遍历它们,并测试高度差。你能帮我出主意吗?在这一点上,我不认为起点覆盖在表面上。
 
顺便说一句,我正试图创造一些类似的“等级多边形”上http://www.dotsoft.com/mwsurfaces.htm
以下是我目前的代码:
(defun c:CS ( / pt1 rp r ss surf a p el pl var 3dobj)
(if (setq pt1 (getpoint "\nEnter the start point: "))
   (progn
   (setq rp pt1)
   (setq r 10)
   (princ "\nSelect AECC TIN Surface:")
   (setq ss (ssget ":S" '((0 . "AECC_TIN_SURFACE"))))
   (setq surf (vlax-ename->vla-object (ssname ss 0)))
   (setq a 0)
   (repeat 360
   (setq p (polar rp a r))
   (setq el (vlax-invoke-method surf 'FindElevationAtXY (car p)(cadr p)))
   (setq p (list (car p)(cadr p)el))
   (setq pl (append pl p))
   (setq a (+ a (/ pi 180.0)))
   )
   (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
   (setq var (pl->var pl))
   (setq 3dobj (vlax-invoke-method mspace 'Add3DPoly var))
   )
   )
(princ)
)

(defun pl->var (pl / ub sa var)
   (setq ub (- (length pl) 1))
   (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
   (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
   )

Hippe013 发表于 2022-7-5 18:35:46

 
我想我不确定你想做什么。至于中心点高程,此时您应该知道如何获得圆中心点的高程。
 
您需要在surf对象(AECC\u TIN\u曲面)上调用findelevantionatxy方法。您的中心点位于rp变量下,因此代码如下所示:
 
5
 
findelevantionatxy方法需要两个参数(x和y),即(car rp)=x(cadr rp)=y
 
如果你能澄清你想要实现的目标,我应该能提供一些想法。

Jozi68 发表于 2022-7-5 18:39:03

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