倔强的蚂蚁 发表于 2013-12-5 13:01:12

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



我自己写了段:
(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


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



自贡黄明儒 发表于 2013-12-5 15:07:03

用circle "TTR",然后剪切,试试看

倔强的蚂蚁 发表于 2013-12-5 15:13:35

自贡黄明儒 发表于 2013-12-5 15:07 static/image/common/back.gif
用circle "TTR",然后剪切,试试看

OK,我研究研究、

倔强的蚂蚁 发表于 2013-12-5 15:16:43

自贡黄明儒 发表于 2013-12-5 15:07 static/image/common/back.gif
用circle "TTR",然后剪切,试试看

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

自贡黄明儒 发表于 2013-12-5 15:20:06

对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20)

倔强的蚂蚁 发表于 2013-12-5 15:26:45

自贡黄明儒 发表于 2013-12-5 15:20 static/image/common/back.gif
对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20)

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

倔强的蚂蚁 发表于 2013-12-5 15:32:28

倔强的蚂蚁 发表于 2013-12-5 15:26 static/image/common/back.gif
看了你这个语句,我发现还是我用的不对。我再看看。

我想要这样的图,比如,画个矩形,然后在矩形四角以交点为圆心画圆弧,保留矩形内的弧度按,剪切掉矩形尖角和矩形外的弧段。
倒角不可以。以往都是画圆再剪切,后来嫌麻烦,就想到编程。

倔强的蚂蚁 发表于 2013-12-5 15:35:04

倔强的蚂蚁 发表于 2013-12-5 15:26 static/image/common/back.gif
看了你这个语句,我发现还是我用的不对。我再看看。

就是这样的效果

自贡黄明儒 发表于 2013-12-5 15:42:23

倔强的蚂蚁 发表于 2013-12-5 15:35 http://bbs.mjtd.com/static/image/common/back.gif
就是这样的效果

对于这个示例,确实不行。
倒圆角一般是相切的,我就望文生义了。
看来还是得先计算。

Andyhon 发表于 2013-12-5 16:56:02

倔强的蚂蚁 发表于 2013-12-5 15:35 static/image/common/back.gif
就是这样的效果

或可有不一样的思路,请上传调试用的 Dwg
一原图,另完成图,或多份具代表性样例
对于您未提的部分,直接提取资料验证...
页: [1]
查看完整版本: 关于向内绘制圆角,有没有什么好的思路?