lilq_78 发表于 2006-11-21 15:40:00

[求助]如何獲取pline中圓弧的半徑?

如何获取pline中圆弧的半径?多谢

13648893846 发表于 2018-3-9 07:40:36

能否获取多段线中缓和曲线的ls1,ls2呢

rongyifei 发表于 2006-11-21 21:03:00

可以通过pline中顶点的GetBulge方法得到它的凸度,然后经过计算,得到圆弧半径!

lilq_78 发表于 2006-11-22 08:27:00

GetBulge方法可以得到它的凸度,但是凸度与半径是什么关系,能不能说明白点?

rongyifei 发表于 2006-11-22 20:52:00

凸度在数值上等于圆弧的高度与圆弧弦长比值的二倍!

lilq_78 发表于 2006-11-23 08:30:00

<P>这个还是有点困难,圆弧的凸度就是1/4圆弧角度的正弦值,除非引入点的坐标,不然就算不出半径,不过这样意义就不是很大啦,没有办法修改PLINE上圆弧的半径。除非重新生成。</P>
<P>圆弧角度 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tan(90/4)=0.414214</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 180&nbsp;&nbsp;&nbsp;&nbsp; tan(180/4)=1</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 270&nbsp;&nbsp;&nbsp; tan(270/4)=2.414214</P>
<P>正好是对应圆弧的凸度,与半径无关</P>

Andyhon 发表于 2006-11-23 10:12:00

<P>Command: (setq p1 '(0 0) p2 '(0 100) bulge -1)<BR>-1</P>
<P>;; Bulge = 凸度<BR>(setq Ang/2 (* 2 (atan Bulge))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArcRad (abs (/ (distance p1 p2) (sin Ang/2) 2.0))<BR>)</P>
<P>===&gt;50.0</P>

hb_xiaofen 发表于 2006-11-23 13:09:00

不要凸度,把PLINE炸开,然后得到圆弧半径再恢复

rongyifei 发表于 2006-11-23 23:14:00

(defun c:test ()<BR>&nbsp; (vl-load-com)<BR>&nbsp; (princ "请选择多义线:")<BR>&nbsp; (setq&nbsp;plobj (vlax-ename-&gt;vla-object (car (entsel)))<BR>&nbsp;pts&nbsp;&nbsp; (vlax-safearray-&gt;list<BR>&nbsp;&nbsp;(vlax-variant-value (VLA-GET-COORDINATEs plobj))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp; 0<BR>&nbsp; )<BR>&nbsp; (if (= (vla-get-closed plobj) :vlax-true)<BR>&nbsp;&nbsp;&nbsp; (setq pts (append pts (list (nth 0 pts) (nth 1 pts)))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (while (&lt; n (- (length pts) 1))<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(/= (setq bulge (vla-GetBulge plobj (/ n 2))) 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;(setq haldis (/&nbsp;(distance (list (nth n pts) (nth (+ n 1) pts))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list (nth (+ n 2) pts) (nth (+ n 3) pts))<BR>&nbsp;&nbsp;&nbsp;)<BR>&nbsp;&nbsp;&nbsp;2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ang&nbsp;&nbsp;&nbsp; (* 2 (atan bulge))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rad&nbsp;&nbsp;&nbsp; (abs (/ haldis (sin ang)))<BR>&nbsp;)<BR>&nbsp;(alert (strcat "第"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (itoa (+ (/ n 2) 1))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "点处为圆弧,圆弧半径为:"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (rtos rad 2 3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (setq n (+ n 2))<BR>&nbsp; )<BR>)

rongyifei 发表于 2006-11-23 23:17:00

临时帮你写了一个,不知道是否符合你的要求!

highflybir 发表于 2006-11-23 23:25:00

本帖最后由 作者 于 2006-11-24 11:31:39 编辑


;;;******************************************************
;;;一个求多义线各段参数(如果是弧段则有半径弧长)的lisp程序
;;;编号1:凸度,2:弦长或直段长,3:半径,4:弧长,5:圆心--
;;;加载程序,运行bulge,则显示上述参数-------------------
(defun C:Bulge (/ ss1 ename el obj len ifclose i par ptfirst ptend judge
    tu pt1 pt2 dis radius h h1 half-angle arc-length pa n)
(setq ss1 (ssget ":S" '((-4 . "<OR")
          (0 . "POLYLINE")
          (0 . "LWPOLYLINE")
          (-4 . "OR>")))
)
(if (or nil (= ss1 nil) (/= (assoc 75 (entget (ssname ss1 0))) nil))
    (progn
      (alert "你没有选中物体或者选择的不是多义线!")
      (princ)
    )
    (progn
      (setq ename (ssname ss1 0))
      (setq el (entget ename))
      (setq obj (vlax-ename->vla-object ename))
      (setq len (cdr (assoc 90 el)))
      (setq ifclose (cdr (assoc 70 el)))
      (setq i 0 par nil)
      (setq ptfirst (vlax-curve-getpointatparam ename 0))
      (setq ptend (vlax-curve-getpointatparam ename (1- len)))
      (setq judge (and (not (equal ptfirst ptend 1e-8)) (= ifclose 1)))
      (repeat (if judge len (1- len))
      (setq tu (vla-getBulge obj i))
      (setq pt1 (vlax-curve-getpointatparam ename i))
      (if (and (= i (1- len)) judge)
   (setq pt2 (vlax-curve-getpointatparam ename 0))
          (setq pt2 (vlax-curve-getpointatparam ename (1+ i)))
      )
      (setq dis (distance pt1 pt2))
      (if (/= tu 0)
          (progn   
            (setq radius (/ (* (+ 1.0 (* tu tu)) dis 0.25) (abs tu)))
            (setq h (* dis (abs tu) 0.5) h1 (- radius h))
            (setq half-angle (atan (/ dis 2) h1))
            (setq arc-length (* 2 half-angle radius))
   (setq cen (midp pt1 pt2))
   (setq cen (polar cen
      (+ (angle pt1 pt2)
    (if (or nil (and (> h1 0) (> tu 0)) (and (< h1 0) (< tu 0)))
      (* pi 0.5) (* pi -0.5)
    )
      )      
      (abs h1)
      )
   )
            (setq pa (list tu dis radius arc-length cen))
            (setq par (cons pa par))
          )
          (progn
            (setq pa (list tu dis))
            (setq par (cons pa par))
          )
      )
      (setq i (1+ i))
      )
      (setq par (reverse par))
      (princ "\n下面为此曲线的各段列表,3,4,5编号为弧段才有:")
      (princ "\n1:凸度 2:弦长(或直线长) 3:半径 4:弧长 5:圆心")
      (foreach n par
      (princ "\n")
      (princ n)
      )
      (princ)
    )
)
)
;;;******************************************************
我也来一个,加载程序,运行bulge则可。
页: [1] 2
查看完整版本: [求助]如何獲取pline中圓弧的半徑?