明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1337|回复: 9

[讨论] 关于向内绘制圆角,有没有什么好的思路?

[复制链接]
发表于 2013-12-5 13:01 | 显示全部楼层 |阅读模式


我自己写了段:
(defun c:daoneiyuanjiao        ()

;;;开头,关闭回显,清空捕捉
  (vl-load-com)
  (setvar "cmdecho" 0) ;关闭回显
  (setq os (getvar "osmode"))
  (setvar "osmode" 0) ;清空捕捉

;;;输入圆角半径,并存储输入的半径
  (setq a (getvar "filletrad"))
  (princ "\n输入圆角半径 r <")
  (princ a)
  (setq r (getdist ">:"))
  (if (= r nil)
    (setq r a)
  )
  (setvar "filletrad" r)

;;;选择对象(直线或圆弧)
  (setq        en1 (entsel "\n选择圆角起始点所在直线或圆弧(逆时针方向):")
;返回图元名和坐标值
        en2 (entsel "\n选择圆角结束点所在直线或圆弧(逆时针方向):")
  )

;;;获得拾取点坐标
  (setq p22 (cadr en1))
  (setq p33 (cadr en2))

;;;将 AutoLISP 类型的对象名转换为 VLA 对象
  (setq        vla-obj1 (vlax-ename->vla-object (car en1))
        vla-obj2 (vlax-ename->vla-object (car en2))
  )

;;;获得选择图元的定义数据
  (setq        data1 (entget (car en1))
        data2 (entget (car en2))
  )

;;;判断选择对象obj1是否是直线,得到方向定位点p2
  (if (equal "LINE" (cdr (assoc 0 data1)))
    (setq p2 (vlax-curve-getclosestpointto
               (car en1)
               (trans (cadr en1) 1 0)
               T
             )
    ) ;返回曲线上离指定点最近的点,p1p2不等于r
    (progn
      (setq
        p1
         (vlax-invoke vla-obj1 'IntersectWith vla-obj2 acExtendNone)
      )
      (setq n 1)
      (setq key 1)
      (while (not (= key 0))
        (setq
          newarc (entmakex ;entmake 返回表 entmakex 返回图元名
                   (list
                     '(0 . "arc")
                     (cons 10 p1)
                     (cons 40 r)
                     (cons 50
                           (- (angle p1 p22) (/ (* n pi) 180.0))
                     )
                     (cons 51
                           (+ (angle p1 p22) (/ (* n pi) 180.0))
                     )
                   )
                 )
        )
        (setq newarc1 (vlax-ename->vla-object newarc))
        (setq p2
               (vlax-invoke
                 vla-obj1
                 'IntersectWith
                 newarc1
                 acExtendNone
               )
        ) ;非直线状态下,得到的p1p2=r
        (if p2
          (setq key 0)
          (progn
            (setq n (+ 1 n))
            (entdel newarc)
          )
        )
      ) ;_ while
      (entdel newarc) ;删除辅助圆
    ) ;_ progn
  ) ;_ if

;;;判断选择对象obj2是否是直线,得到方向定位点p3
  (if (equal "LINE" (cdr (assoc 0 data2)))
    (setq p3 (vlax-curve-getclosestpointto
               (car en2)
               (trans (cadr en2) 1 0)
               T
             )
    ) ;_ setq                                ;返回曲线上离指定点最近的点,得到的p1p3不等于r
    (progn
      (setq
        p1
         (vlax-invoke vla-obj1 'IntersectWith vla-obj2 acExtendNone)
      )
      (setq n 1)
      (setq key 1)
      (while (not (= key 0))
        (setq newarc (entmakex ;entmake 返回表 entmakex 返回图元名
                       (list
                         '(0 . "arc")
                         (cons 10 p1)
                         (cons 40 r)
                         (cons 50
                               (- (angle p1 p33) (/ (* n pi) 180.0))
                         )
                         (cons 51
                               (+ (angle p1 p33) (/ (* n pi) 180.0))
                         )
                       )
                     )
        )
        (setq newarc1 (vlax-ename->vla-object newarc))
        (setq p3
               (vlax-invoke
                 vla-obj2
                 'IntersectWith
                 newarc1
                 acExtendNone
               )
        ) ;非直线状态下,得到的p1p3=r
        (if p3
          (setq key 0)
          (progn
            (setq n (+ 1 n))
            (entdel newarc)
          )
        )
      ) ;_ while
      (entdel newarc) ;删除辅助圆
    ) ;_ progn
  ) ;_ if

;;;返回两条曲线的交叉点,两条线都是直线,这步就会用到,所以不多余。
  (setq        p1
         (vlax-invoke vla-obj1 'IntersectWith vla-obj2 acExtendNone)
  )

;;;绘制圆弧
  (entmake
    (list
      '(0 . "arc")
      (cons 8 "0")
      (cons 10 p1)
      (cons 40 r)
      (cons 50 (angle p1 p2))
      (cons 51 (angle p1 p3))
    )
  )

;;;裁剪圆弧
  (command "trim"
           ""
           (list (car en1) p1)
           (list (car en2) p1)
           ""
  )

;;;结尾,恢复捕捉,打开回显
  (setvar "osmode" os)
  (setvar "cmdecho" 1)
  (princ)

) ;_ defun


但是遇到第二幅图的情况,就不好使了。而且我感觉我这个也比较麻烦。有没有简单点的想法?



本帖子中包含更多资源

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

x
发表于 2013-12-5 15:07 | 显示全部楼层
用circle "TTR",然后剪切,试试看
 楼主| 发表于 2013-12-5 15:13 | 显示全部楼层
自贡黄明儒 发表于 2013-12-5 15:07
用circle "TTR",然后剪切,试试看

OK,我研究研究、
 楼主| 发表于 2013-12-5 15:16 | 显示全部楼层
自贡黄明儒 发表于 2013-12-5 15:07
用circle "TTR",然后剪切,试试看

这个是相切相切半径画圆吧,倒外倒角的,我要的是倒向内凹的。我的思路是找两线交点,以此点为圆心画圆弧,然后裁剪掉多余部分,达到我图示的效果。

点评

应该是内倒,只不过你剪切的地方不一样  发表于 2013-12-5 15:19
发表于 2013-12-5 15:20 | 显示全部楼层
对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20)
 楼主| 发表于 2013-12-5 15:26 | 显示全部楼层
自贡黄明儒 发表于 2013-12-5 15:20
对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20)

看了你这个语句,我发现还是我用的不对。我再看看。

点评

直接用倒角命令不行吗?为什么要编程  发表于 2013-12-5 15:27
 楼主| 发表于 2013-12-5 15:32 | 显示全部楼层
倔强的蚂蚁 发表于 2013-12-5 15:26
看了你这个语句,我发现还是我用的不对。我再看看。

我想要这样的图,比如,画个矩形,然后在矩形四角以交点为圆心画圆弧,保留矩形内的弧度按,剪切掉矩形尖角和矩形外的弧段。
倒角不可以。以往都是画圆再剪切,后来嫌麻烦,就想到编程。
 楼主| 发表于 2013-12-5 15:35 | 显示全部楼层
倔强的蚂蚁 发表于 2013-12-5 15:26
看了你这个语句,我发现还是我用的不对。我再看看。

就是这样的效果

本帖子中包含更多资源

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

x
发表于 2013-12-5 15:42 | 显示全部楼层
倔强的蚂蚁 发表于 2013-12-5 15:35
就是这样的效果


对于这个示例,确实不行。
倒圆角一般是相切的,我就望文生义了。
看来还是得先计算。
发表于 2013-12-5 16:56 | 显示全部楼层
倔强的蚂蚁 发表于 2013-12-5 15:35
就是这样的效果

或可有不一样的思路,请上传调试用的 Dwg
一原图,另完成图,或多份具代表性样例
对于您未提的部分,直接提取资料验证...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 08:21 , Processed in 0.566681 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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