您好,M.R。 项目几何? 谢谢你的命令。。。我从未使用过它,当在3D中工作时它可能非常有用。。。 我相信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、 也许有人愿意接受这个想法并清理它(添加错误捕获和处理局部变量与全局变量)。 非常感谢Hippe013。这真的给了我一些可以使用的东西,只希望我能更好地理解LISP语法! 我对Hippe013的代码做了一些修改(实际上不需要这个圆,等等):
现在我在这行上得到一个错误:(setq var(pl->var pl))
错误是:没有函数定义:PL->VAR
请帮忙做这个。当错误不存在时,当您多次运行代码时,它会给出有趣的结果。 您缺少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吗? 非常感谢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))))
)
我想我不确定你想做什么。至于中心点高程,此时您应该知道如何获得圆中心点的高程。
您需要在surf对象(AECC\u TIN\u曲面)上调用findelevantionatxy方法。您的中心点位于rp变量下,因此代码如下所示:
5
findelevantionatxy方法需要两个参数(x和y),即(car rp)=x(cadr rp)=y
如果你能澄清你想要实现的目标,我应该能提供一些想法。 我需要用户选择一个坡度;通常是1%。
然后,他在曲面上选择一个点,然后应用程序应在所需坡度处绘制一个三维多边形(从该点向上)。从用户选择的点开始,通常有两条线。
我不确定这是否有意义。我看到DotSoft提供了这个功能,他们称之为Grade Poly(http://www.dotsoft.com/mwsurfaces.htm),但我们不可能支付495美元。
所以我的想法是绘制圆形的三维多边形,将其覆盖到曲面上,然后遍历顶点,找到一个(或两个)给出正确等级的顶点。然后,中心点将通过一条线连接到此点。然后以新点为中心创建一个新的圆形三维多边形。然后重复迭代。最终,我们会有一系列的线路;这些都应该连接起来,以形成一个表面坡度一致的三维多边形。我不是一个很好的解释事情,所以我希望你明白这一点。
页:
1
[2]