harilalmn 发表于 2022-7-6 08:56:09

投影曲线墙的例程

大家好,
我一直在尝试编写一个例程,根据用户输入的段数,将曲线墙投影到立面。
到目前为止,我可以找出如何根据线段的数量沿圆弧获取点。现在,我想将其投影到选定的行,如图所示。现在,该代码将辐射线绘制到弧上的点。
我被困在这里了。现在我不知道如何从这些点画垂直于直线的线。事实上,我不知道如何计算这些线的投影角度。
在图片中,它们很简单,线条可以投影到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 发表于 2022-7-6 09:02:21

如果它只有一个标高,那么只需使用厚度,就可以对直线、圆弧等进行此操作

harilalmn 发表于 2022-7-6 09:09:22

感谢您的回复BIGAL,
但它根本不是一幅3D图。只是一个平面2D图。
问题是,它还需要旋转视图/ucs以显示该厚度。
在我的例子中,平面和立面必须放置在同一平面上。

irneb 发表于 2022-7-6 09:17:47

像这样的?
(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弧上,但对于那些应该有一些不同的编程,使其在段端点上也工作。

harilalmn 发表于 2022-7-6 09:20:14

哇!太好了。。。!!!非常感谢您的代码,IRNEB…!!:D: D:D

irneb 发表于 2022-7-6 09:30:01

不客气。我不确定您是否希望按指定的数字进行除法,或者更确切地说,根据我的代码(最大源距离)。这将是一个小的变化,要求用户输入分割的数量,实际上,数学也会简单一点。

harilalmn 发表于 2022-7-6 09:35:24

好那会有用的。。。
我要了1公斤铁,得到了1公斤金。。。!!!他他。。
为什么,因为我的代码只适用于圆弧对象。这对任何事情都有效。。。!!!
谢谢

harilalmn 发表于 2022-7-6 09:38:15

我还从你的代码中学到了很多新东西。。。!!!快乐快乐。。。。

irneb 发表于 2022-7-6 09:45:40

是的!很高兴帮助你学习。这是我学到我所知道的大部分东西的方式:例子&从那里为自己做。 
主要是vlax曲线函数使我的代码比其他函数容易得多。然后通常获得一个角度,旋转半个pi(90度),然后使用inters&polar获得交点。最后一部分也允许投影处于任何角度,它垂直于最远的投影平面投影。所以你的两个平面甚至可能是不平行的,在任何角度。

Tharwat 发表于 2022-7-6 09:51:04

有更多额外的保险代码将更有利于国家安全。
 


(eq (cdr (assoc 0 (entget crv))) "ARC")
(eq (cdr (assoc 0 l1)) "LINE")
(eq (cdr (assoc 0 l2)) "LINE")

页: [1] 2
查看完整版本: 投影曲线墙的例程