表骑马实开车 发表于 2022-5-10 14:55:16

获得lwpolyline多段线圆心和半径

<div class="blockcode"><blockquote>(defun c:vv (/ os s edt plst p1 p2 b cp rd)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(while (not (setq s (ssget "_+.:E:S" '((0 . "lwpolyline")))))
)
(setqedt(entget (ssname s 0))
plst (vertex edt)
p1   (assoc 10 plst)
b    (cdr (assoc 42 plst))
p2   (cdr (assoc 10 (cdr (member p1 plst))))
)
(if (null b)
    (progn (princ "\n选择为直线."))
    (progn (setq cp (trans (LM:bulgecentre (cdr p1) p2 b)
         (cdr (assoc 210 edt))
         1
      )
   rd (LM:bulgeradius (cdr p1) p2 b)
   )
   (command "circle" cp 60)
    )
)
(princ (strcat "\n半径为:" (rtos rd 2 0)))
(setvar "osmode" os)
(princ)
)


;;顶点/凸度
(defun vertex (et)
(vl-remove-if-not
    '(lambda (x)
       (or (= (car x) 10)
   (and (= (car x) 42) (not (zerop (cdr x))))
       )
   )
    et
)
)

;;半径
;;By Lee Mac
(defun LM:bulgeradius (p1 p2 b)
(/ (* (distance p1 p2) (1+ (* b b))) 4 (abs b))
)

;;圆心
;;By Lee Mac
(defun LM:bulgecentre (p1 p2 b)
(polar p1
   (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
   (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
)
)
新手写的,调用了两个lee mac的函数,有其他不足之处,请指正!





xyp1964 发表于 2022-5-19 23:30:45

;; 直接炸开求最简单


伪书虫86 发表于 2022-5-10 20:50:45

厉害的

tigcat 发表于 2022-5-19 22:26:08

经过测试,如果一条多段线有几段弧,是得不到正确结果,arc弧要能支持就好了.

表骑马实开车 发表于 2022-5-20 00:09:35

xyp1964 发表于 2022-5-19 23:30
;; 直接炸开求最简单

这样确实可以,不过还的把线恢复

z312144636 发表于 2024-6-21 10:16:20

幫助很大

自贡黄明儒 发表于 2024-6-21 10:38:49

实际运用是:点取多段线,获得此处的圆心或者半径。
页: [1]
查看完整版本: 获得lwpolyline多段线圆心和半径