关于向内绘制圆角,有没有什么好的思路?
我自己写了段:
(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
但是遇到第二幅图的情况,就不好使了。而且我感觉我这个也比较麻烦。有没有简单点的想法?
用circle "TTR",然后剪切,试试看 自贡黄明儒 发表于 2013-12-5 15:07 static/image/common/back.gif
用circle "TTR",然后剪切,试试看
OK,我研究研究、 自贡黄明儒 发表于 2013-12-5 15:07 static/image/common/back.gif
用circle "TTR",然后剪切,试试看
这个是相切相切半径画圆吧,倒外倒角的,我要的是倒向内凹的。我的思路是找两线交点,以此点为圆心画圆弧,然后裁剪掉多余部分,达到我图示的效果。 对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20) 自贡黄明儒 发表于 2013-12-5 15:20 static/image/common/back.gif
对于你图中三个示例,这个可以搞定(command "circle" "ttr" pause pause 20)
看了你这个语句,我发现还是我用的不对。我再看看。 倔强的蚂蚁 发表于 2013-12-5 15:26 static/image/common/back.gif
看了你这个语句,我发现还是我用的不对。我再看看。
我想要这样的图,比如,画个矩形,然后在矩形四角以交点为圆心画圆弧,保留矩形内的弧度按,剪切掉矩形尖角和矩形外的弧段。
倒角不可以。以往都是画圆再剪切,后来嫌麻烦,就想到编程。
倔强的蚂蚁 发表于 2013-12-5 15:26 static/image/common/back.gif
看了你这个语句,我发现还是我用的不对。我再看看。
就是这样的效果
倔强的蚂蚁 发表于 2013-12-5 15:35 http://bbs.mjtd.com/static/image/common/back.gif
就是这样的效果
对于这个示例,确实不行。
倒圆角一般是相切的,我就望文生义了。
看来还是得先计算。 倔强的蚂蚁 发表于 2013-12-5 15:35 static/image/common/back.gif
就是这样的效果
或可有不一样的思路,请上传调试用的 Dwg
一原图,另完成图,或多份具代表性样例
对于您未提的部分,直接提取资料验证...
页:
[1]