投影曲线墙的例程
大家好,我一直在尝试编写一个例程,根据用户输入的段数,将曲线墙投影到立面。
到目前为止,我可以找出如何根据线段的数量沿圆弧获取点。现在,我想将其投影到选定的行,如图所示。现在,该代码将辐射线绘制到弧上的点。
我被困在这里了。现在我不知道如何从这些点画垂直于直线的线。事实上,我不知道如何计算这些线的投影角度。
在图片中,它们很简单,线条可以投影到270度的角度。但是弧线顶部的线是什么;或者以10度角在弧的右侧?这就是我被卡住的地方,有人能引导我找出每个P2的线的投影角度(沿弧的点)?这是我的代码。。。
(defun c:crv ( / entarc entline)
(while (and (setq entarc (car (entsel "\nPick An Arc: ")))
(not (eq "ARC" (cdr (assoc 0 (entget entarc)))))
)
(princ "\nPlease Select an Arc...")
)
(while
(and
(setq entline (car (entsel "\nPick a line to project on:")))
(not (eq "LINE" (cdr (assoc 0 (entget entline)))))
);and
(princ "\nPlease select a line....")
);While
(setq Segments (cond ((getint "\nNumber of Segments:")) (10)))
(setq Height (getdist "\nCut-off Height:"))
(projectlines entarc entline)
(princ)
);Function
;;;****************************************************
;;;This is the function which draws the projected lines
;;;****************************************************
(defun projectlines (ArcObj LineObj
/ ArcCenter ArcStartAngle ArcEndAngle
ArcRadius ArcStartPoint ArcEndPoint)
(setq ArcCenter (cdr ( assoc 10 (entget ArcObj))))
(setq ArcStartAngle (cdr ( assoc 50 (entget ArcObj))))
(setq ArcEndAngle (cdr ( assoc 51 (entget ArcObj))))
(setq ArcRadius(cdr ( assoc 40 (entget ArcObj))))
(setq ArcStartPoint (polar ArcCenter ArcStartAngle ArcRadius))
(setq ArcEndPoint (polar ArcCenter ArcEndAngle ArcRadius))
(setq ArcAngle (abs (- ArcStartAngle ArcEndAngle)))
(setq LineStartPoint (cdr (assoc 10 (entget LineObj))))
(setq LineEndtPoint (cdr (assoc 11 (entget LineObj))))
(setq LineAngle (angle LineStartPoint LineEndtPoint))
(setq LinePerpendicular (+ LineAngle (dtor 90)))
(setq i 1)
(setq p2 ArcStartPoint)
(setq AngleDivision (/ ArcAngle Segments))
(setq OSM (getvar "OSMODE"))
(setvar "OSMODE" 0)
(repeat (1+ Segments)
(command "_LINE" ArcCenter p2 "")
(setq p2 (polar ArcCenter (+ ArcStartAngle (* AngleDivision i)) ArcRadius))
(setq i (1+ i))
)
(setvar "OSMODE" OSM)
);Function
(defun dtor(d)
(* d 0.01745329)
)
如果它只有一个标高,那么只需使用厚度,就可以对直线、圆弧等进行此操作 感谢您的回复BIGAL,
但它根本不是一幅3D图。只是一个平面2D图。
问题是,它还需要旋转视图/ucs以显示该厚度。
在我的例子中,平面和立面必须放置在同一平面上。 像这样的?
(vl-load-com)
(defun c:ProjectCurve (/ crv l1 l2 div pt1 pt2 pt3 n l1s l1e ang l2s l2e)
(if (and (setq crv (entsel "\nPick curve: "))
(setq crv (car crv))
(setq l1 (entsel "\nPick furthest projection line: "))
(setq l1 (entget (car l1)))
(setq l1s (cdr (assoc 10 l1)))
(setq l1e (cdr (assoc 11 l1)))
(setq ang (+ (angle l1s l1e) (/ pi 2.0)))
(setq l2 (entsel "\nPick nearest projection line: "))
(setq l2 (entget (car l2)))
(setq l2s (cdr (assoc 10 l2)))
(setq l2e (cdr (assoc 11 l2)))
(setq div (getdist "\nSelect maximum curvature arc length per projection line: "))
)
(progn
(setq n (vlax-curve-getDistAtParam crv (vlax-curve-getEndParam crv))
div (/ n (1+ (fix (/ n div))))
)
(while (> n 0.0)
(setq pt1 (vlax-curve-getPointAtDist crv n)
pt2 (inters l1s l1e pt1 (polar pt1 ang 1000.0) nil)
pt3 (inters l2s l2e pt1 (polar pt1 ang 1000.0) nil)
)
(entmake (list '(0 . "LINE")
(cons 8 (getvar 'CLayer))
(cons 410 (getvar 'CTab))
(cons 10 pt2)
(cons 11 pt3)
)
)
(setq n (- n div))
)
)
)
(princ)
)没有足够的错误检查,但至少它可以工作。即使“工作”在pl弧上,但对于那些应该有一些不同的编程,使其在段端点上也工作。 哇!太好了。。。!!!非常感谢您的代码,IRNEB…!!:D: D:D 不客气。我不确定您是否希望按指定的数字进行除法,或者更确切地说,根据我的代码(最大源距离)。这将是一个小的变化,要求用户输入分割的数量,实际上,数学也会简单一点。 好那会有用的。。。
我要了1公斤铁,得到了1公斤金。。。!!!他他。。
为什么,因为我的代码只适用于圆弧对象。这对任何事情都有效。。。!!!
谢谢 我还从你的代码中学到了很多新东西。。。!!!快乐快乐。。。。 是的!很高兴帮助你学习。这是我学到我所知道的大部分东西的方式:例子&从那里为自己做。
主要是vlax曲线函数使我的代码比其他函数容易得多。然后通常获得一个角度,旋转半个pi(90度),然后使用inters&polar获得交点。最后一部分也允许投影处于任何角度,它垂直于最远的投影平面投影。所以你的两个平面甚至可能是不平行的,在任何角度。 有更多额外的保险代码将更有利于国家安全。
(eq (cdr (assoc 0 (entget crv))) "ARC")
(eq (cdr (assoc 0 l1)) "LINE")
(eq (cdr (assoc 0 l2)) "LINE")
页:
[1]
2