llsheng_73
发表于 2014-12-17 22:45:20
不用计较那是直线起点还是终点,只管曲线起止点分别到选出来的线的最近点中距离小的那个点就是对的,再加上曲线本身的中点
llsheng_73
发表于 2014-12-17 22:49:50
ysq101 发表于 2014-12-17 19:35 static/image/common/back.gif
这个方法确实可以。。。。谢谢大师指点。。
其实我最后还是用了osnap来捕捉END点
因为测试时将视图方大 ...
视图大小限制确实存在,不过在需要手工选择那条曲线的情况下,至少曲线本身在视图范围内,大不了选好曲线后略微缩小视图。。。
ysq101
发表于 2014-12-18 22:33:12
llsheng_73 发表于 2014-12-17 22:45 static/image/common/back.gif
不用计较那是直线起点还是终点,只管曲线起止点分别到选出来的线的最近点中距离小的那个点就是对的,再加上 ...
话说VLX系列函数有直接得出曲线中点的吗??求指教
VLX函数还没学会几个呢
llsheng_73
发表于 2014-12-19 08:42:59
ysq101 发表于 2014-12-18 22:33 static/image/common/back.gif
话说VLX系列函数有直接得出曲线中点的吗??求指教
VLX函数还没学会几个呢
(vlax-curve-getPointAtDist curve-obj(*(vlax-curve-getDistAtParam curve-obj(vlax-curve-getEndParam curve-obj))0.5));;中点
(vlax-curve-getStartPoint curve-obj);;起点
(vlax-curve-getEndPoint curve-obj);止点
ysq101
发表于 2014-12-19 23:09:25
llsheng_73 发表于 2014-12-19 08:42 static/image/common/back.gif
谢谢大师指点...
ysq101
发表于 2014-12-25 12:33:12
llsheng_73 发表于 2014-12-19 08:42 static/image/common/back.gif
谢谢大师指点。。
我的程序已经完成了。。
唯一的不好的就是用COMMANDARC来完成
我想知道一下用MAKE能生成3点圆弧吗??
ysq101
发表于 2014-12-25 12:35:00
llsheng_73 发表于 2014-12-19 08:42 static/image/common/back.gif
谢谢大师指点。。
我的程序已经完成了。。
唯一的不好的就是用COMMANDARC来完成
我想知道一下用MAKE能生成3点圆弧吗??
llsheng_73
发表于 2014-12-25 20:41:00
本帖最后由 llsheng_73 于 2014-12-25 20:42 编辑
ysq101 发表于 2014-12-25 12:35 static/image/common/back.gif
谢谢大师指点。。
我的程序已经完成了。。
唯一的不好的就是用COMMANDARC来完成
可以根据3点计算出圆心,进而求出半径,起始角度,终止角度
最后
(entmakex(list '(0 . "ARC")'(100 . "AcDbCircle")(cons 10 p)(cons 40 R)(cons 50 ang1)(cons 51 ang2)))
具体100组是否必须或者还需要'(100 . "AcDbArc")可自己测试
根据3点计算圆心很多人都写过,我也写过,估计你自己也有,如果没有,下边这个我写的可供参考
三点计算圆心(没考虑Z坐标)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108427&fromuid=202795
ysq101
发表于 2014-12-25 21:18:26
llsheng_73 发表于 2014-12-25 20:41 static/image/common/back.gif
可以根据3点计算出圆心,进而求出半径,起始角度,终止角度
最后
(entmakex(list '(0 . "ARC")'(100 ....
我明白大师你的意思了。。谢谢指点
当选到条样线的时候你不知道哪个起点哪个终点呀
像下图(其实不管什么图)都需要IF起角和终角
这个有难度呀
llsheng_73
发表于 2014-12-26 15:01:21
本帖最后由 llsheng_73 于 2014-12-26 16:11 编辑
ysq101 发表于 2014-12-25 21:18 static/image/common/back.gif
我明白大师你的意思了。。谢谢指点
当选到条样线的时候你不知道哪个起点哪个终点呀
像下图(其实不管什 ...
一个最简单的办法是如果中间那个点不在生成出来的ARC上,说明三个点的顺序需要反过来也就是起止角要反过来,当然,实际上是需要事先判断三个点的顺时针方向还是逆时针方向。。。这样经过事先判断后就可以确定起点、止点应该是哪一个。。。
(defun Pldir(pts)
(<(apply'+(mapcar'(lambda(x y)(-(*(car x)(cadr y))(*(car y)(cadr x))))(cons(last pts)pts)pts))0))
(defun 3pcen(p1 p2 p3);;根据给定3点求圆心,如果三点共直线返回nil,否则返回一个二维点
(setq p1(list(/(+(car p1)(car p2))2)(/(+(cadr p1)(cadr p2))2))
p3(list(/(+(car p2)(car p3))2)(/(+(cadr p2)(cadr p3))2))
p3(inters p1(polar p1(+(/ pi 2)(angle p1 p2))1)
p3(polar p3(+(/ pi 2)(angle p3 p2))1)nil))
)
(defun 3parc(p1 p2 p3 / p f);;根据不共直线的三个点绘制ARC返回图元名,如果p1 p2 p3共直线返回nil
(if(setq f(pldir(list p1 p2 p3))p(3pcen p1 p2 p3))
(entmakex(list'(0 . "ARC")(cons 10 p)(cons 40(distance p p1))(cons 50 (angle p(if f p3 p1)))(cons 51 (angle p(if f p1 p3)))))
)
)
(defun c:tt()
(3parc(getpoint)(getpoint)(getpoint)))
上边的3parc里边就根据了p1 p2 p3这三个点的方向来决定应该用哪一个点计算起始角度,相应的用另一个点计算终止角