明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1350|回复: 3

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

  [复制链接]
发表于 2022-12-17 15:02:46 | 显示全部楼层 |阅读模式
本帖最后由 cq4920 于 2022-12-20 23:20 编辑

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

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



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

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

  1. ;;多义线倒圆
  2. (defun c:fds (/ r rr p0 pts en ent k a r pn p1 p2 p3 pa pb pc rr)
  3.   (setq ent (entsel) en (entlast) bb T)
  4.     (setq  p0 (mc:mind (car ent))
  5.     pts (MJ:Massoc 10 (entget (car ent))))
  6.   (setq k (car (MJ:Massoc 70 (entget (car ent)))))
  7.   (while bb
  8.     (setq mouse (grread t 8))
  9.     (setq a (car mouse) r t)
  10.     (cond
  11.       ((= a 5)
  12.         (if (= (equal r rr) nil)
  13.           (progn
  14.             (setq pn (cadr mouse)
  15.                     r (distance p0 pn)
  16.                     n (length pts) ptss pts)
  17.             (if (= k 0) (setq n (- n 2)))
  18.             (vl-cmdf "_.erase"  (last_ent en) "")
  19.             (repeat n
  20.               (setq p1 (car ptss)
  21.                 p2 (cadr  ptss)
  22.                 p3 (caddr ptss))
  23.               ;; 核心
  24.               (setq rad (* (- (angle p2 p3) (angle p2 p1)) 0.5)
  25.                 rad (if (< rad 0) (+ rad pi)rad);夹角
  26.                 ll  (abs (/ r (sin rad))) ;斜边长度
  27.                 l1  (sqrt (- (* ll ll) (* r r))) ;直角边长度
  28.                 pa (polar p2 (angle p2 p1) l1)
  29.                 pb (polar p2 (angle p2 p3) l1)
  30.                 pc (polar p2  (angle p2 (mc:md pa pb)) (- ll r))
  31.               )
  32.               (make-arc  pa pc pb)
  33.               (setq ptss (append (cdr ptss) (list (car ptss))))
  34.             )
  35.             (setq rr r en0 (entlast))
  36.             (setq ptmin (car (viewpnts)) ptmax (cadr (viewpnts)))
  37.            (entmake (list '(0 . "TEXT") (cons 1 (rtos r 2 2)) (cons 10 p0) (cons 40 (/ (distance ptmin ptmax) 100))))
  38.             (setq txt (entlast))
  39.             (Mc:ZXc p0 pn 3)
  40.             (setq zx (entlast))
  41.           )))
  42.       ((= 3 a)
  43.         (progn         
  44.           (setq  n (length pts) ptss pts  r (getdist p0 ))
  45.           (vl-cmdf "_.erase"  (last_ent en) "")
  46.           (if (= k 0) (setq n (- n 2)))
  47.           (repeat n
  48.             (setq p1 (car  ptss)
  49.               p2 (cadr  ptss)
  50.               p3 (caddr ptss))
  51.             (setq rad (* (- (angle p2 p3) (angle p2 p1)) 0.5)
  52.               rad (if (< rad 0) (+ rad pi)rad);夹角
  53.               ll  (abs (/ r (sin rad))) ;斜边长度
  54.               l1  (sqrt (- (* ll ll) (* r r))) ;直角边长度
  55.               pa (polar p2 (angle p2 p1) l1)
  56.               pb (polar p2 (angle p2 p3) l1)
  57.               pc (polar p2  (angle p2 (mc:md pa pb)) (- ll r))
  58.             )
  59.             (make-arc  pa pc pb)
  60.             (setq ptss (append (cdr ptss) (list (car ptss))))
  61.           )
  62.           (setq bb nil)
  63.         )
  64.       )
  65.       ((or (= 25 a) (= 11 a) (= a 2));右键
  66.        (progn  
  67.        (vl-cmdf "_.erase" zx "")
  68.        (vl-cmdf "_.erase" txt "")   
  69.        (setq bb nil)
  70.       ))   
  71.     )
  72.   )
  73. )
  1. ;;117.3 [功能] 返回当前视窗左下角和右上角 坐标
  2. (defun viewpnts  (/ A B C D X)
  3.   (setq d (getvar "screensize"))      ;屏像素
  4.   (setq  b (* (getvar "viewsize") 0.5)          ;viewsize屏竖长
  5.   a (* b (/ (car d) (cadr d)))          ;屏横长
  6.   x (trans (getvar "viewctr") 1 2)        ;屏中点viewctr
  7.   c (list (- (car x) a) (- (cadr x) b) 0.0)
  8.   d (list (+ (car x) a) (+ (cadr x) b) 0.0)
  9.   )
  10.   (list (trans c 2 1) (trans d 2 1))
  11. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 收起 理由
kucha007 + 1 赞一个!
lee50310 + 1 赞一个!
xyp1964 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-12-18 08:57:46 | 显示全部楼层
这个不知道用在什么地方。
发表于 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))) ;直角边长度
)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-12-19 22:59:14 | 显示全部楼层
大佬们继续优化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 06:46 , Processed in 0.176423 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表