cq4920 发表于 2022-12-17 15:02:46

多义线动态倒角求优化或推荐类似程序

本帖最后由 cq4920 于 2022-12-20 23:20 编辑

自己做的动态倒角,但是效果不是很好
R的值 能显示出来 并且能直接输入(单击左键输入R值)
R的弦 如果可以控制凹凸 就好了 (原理不难,但非矩形好像没意义)
非直角 也能相对正确倒圆了 (切点的位置不太准确)

生成的圆弧依次收尾相连就是想要得到的图形,但是曲线的端点顺序不太好控制,连接圆弧收尾总是会出现错误,非闭合曲线就更麻烦。


顺便问一下,在模型空间内,我怎么获取视口的最大坐标和最小坐标?黄总的函数解决了,文字大小可以固定了

感谢xyp1964 提供的一串特别好的代码

;;多义线倒圆
(defun c:fds (/ r rr p0 pts en ent k a r pn p1 p2 p3 pa pb pc rr)
(setq ent (entsel) en (entlast) bb T)
    (setqp0 (mc:mind (car ent))
    pts (MJ:Massoc 10 (entget (car ent))))
(setq k (car (MJ:Massoc 70 (entget (car ent)))))
(while bb
    (setq mouse (grread t 8))
    (setq a (car mouse) r t)
    (cond
      ((= a 5)
      (if (= (equal r rr) nil)
          (progn
            (setq pn (cadr mouse)
                  r (distance p0 pn)
                  n (length pts) ptss pts)
            (if (= k 0) (setq n (- n 2)))
            (vl-cmdf "_.erase"(last_ent en) "")
            (repeat n
            (setq p1 (car ptss)
                p2 (cadrptss)
                p3 (caddr ptss))
            ;; 核心
            (setq rad (* (- (angle p2 p3) (angle p2 p1)) 0.5)
                rad (if (< rad 0) (+ rad pi)rad);夹角
                ll(abs (/ r (sin rad))) ;斜边长度
                l1(sqrt (- (* ll ll) (* r r))) ;直角边长度
                pa (polar p2 (angle p2 p1) l1)
                pb (polar p2 (angle p2 p3) l1)
                pc (polar p2(angle p2 (mc:md pa pb)) (- ll r))
            )
            (make-arcpa pc pb)
            (setq ptss (append (cdr ptss) (list (car ptss))))
            )
            (setq rr r en0 (entlast))
            (setq ptmin (car (viewpnts)) ptmax (cadr (viewpnts)))
         (entmake (list '(0 . "TEXT") (cons 1 (rtos r 2 2)) (cons 10 p0) (cons 40 (/ (distance ptmin ptmax) 100))))
            (setq txt (entlast))
            (Mc:ZXc p0 pn 3)
            (setq zx (entlast))
          )))
      ((= 3 a)
      (progn         
          (setqn (length pts) ptss ptsr (getdist p0 ))
          (vl-cmdf "_.erase"(last_ent en) "")
          (if (= k 0) (setq n (- n 2)))
          (repeat n
            (setq p1 (carptss)
            p2 (cadrptss)
            p3 (caddr ptss))
            (setq rad (* (- (angle p2 p3) (angle p2 p1)) 0.5)
            rad (if (< rad 0) (+ rad pi)rad);夹角
            ll(abs (/ r (sin rad))) ;斜边长度
            l1(sqrt (- (* ll ll) (* r r))) ;直角边长度
            pa (polar p2 (angle p2 p1) l1)
            pb (polar p2 (angle p2 p3) l1)
            pc (polar p2(angle p2 (mc:md pa pb)) (- ll r))
            )
            (make-arcpa pc pb)
            (setq ptss (append (cdr ptss) (list (car ptss))))
          )
          (setq bb nil)
      )
      )
      ((or (= 25 a) (= 11 a) (= a 2));右键
       (progn
       (vl-cmdf "_.erase" zx "")
       (vl-cmdf "_.erase" txt "")   
       (setq bb nil)
      ))   
    )
)
)

;;117.3 [功能] 返回当前视窗左下角和右上角 坐标
(defun viewpnts(/ A B C D X)
(setq d (getvar "screensize"))      ;屏像素
(setqb (* (getvar "viewsize") 0.5)          ;viewsize屏竖长
a (* b (/ (car d) (cadr d)))          ;屏横长
x (trans (getvar "viewctr") 1 2)      ;屏中点viewctr
c (list (- (car x) a) (- (cadr x) b) 0.0)
d (list (+ (car x) a) (+ (cadr x) b) 0.0)
)
(list (trans c 2 1) (trans d 2 1))
)

xiangganglv 发表于 2022-12-18 08:57:46

这个不知道用在什么地方。

xyp1964 发表于 2022-12-18 15:25:24

;; 核心
(setq rad (* (- (angle p2 p3) (angle p2 p1)) 0.5)
      rad (if (< rad 0) (+ rad pi)rad);夹角
      ll(abs (/ bj (sin rad))) ;斜边长度
      l1(sqrt (- (* ll ll) (* bj bj))) ;直角边长度
)


BHL-DONG 发表于 2022-12-19 22:59:14

大佬们继续优化
页: [1]
查看完整版本: 多义线动态倒角求优化或推荐类似程序