![]() |
[原创]二维点/三维点的错误
[原创]二维点/三维点的错误
www.dimcax.com [原创]二维点/三维点的错误 画任意直线的垂线,可是结果是二维点/三维点的错误,请高手指点 (defun c:cx() (setvar "cmdecho" 0) (setq en(entsel "选择一条直线:")) (setq pp(getpoint "选择该直线上一点")) (setq l(getreal "输入垂线的长度")) (setq en_data(entget(car en))) (setq pts(assoc 10 en_data)) (setq pte(assoc 11 en_data)) (setq px1(car pts)) (setq py1(cadr pts)) (setq px2(car pte)) (setq py2(cadr pte)) (setq mp1(list pxi py1)) (setq mp2(list px2 py2)) (setq a(angle mp1 mp2)) (setq pppp(polar pp (+ (/ pi 2) a) l)) (setq ppp(polar pp (- (/ pi 2) a) l)) (command "line" pppp ppp "") (princ) ) d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28( c:cx () ( "cmdecho" 0) ( ( en ( "选择一条直线:")) ( ( pp ( "选择该直线上一点")) ( ( l ( "输入垂线的长度")) ( ( en_data ( ( en))) ( pts ( ( 10 en_data))) ( pte ( ( 11 en_data))) ( perpt ( ( en) pp t));找出垂点 ( a ( pts pte)) ( pppp ( perpt ( ( pi 0.5) a) l)) ( ppp ( perpt ( ( pi 1.5) a) l)) ( ( '((0 . "line") (100 . "acdbentity") (100 . "acdbline") (8 . "0") ) ( ( 10 pppp) ( 11 ppp)) ) ) ) ) ) ) () ) 因為專業, 所以精彩! 多多學習.多多進步 . 明经在我在! 我的代表作/bbs/dispbbs.asp?boardid=2&id=33961 /bbs/dispbbs.asp?boardid=14&id=58568&page=1 d 代码是楼主自己的吗? (setq mp1(list pxi py1)) -》 (setq mp1(list px1 py1)) d 谢谢bdycad,你的代码很好用,非常感谢!也谢谢caoyin指出错误,可是我改了后画出来的是水平线,我的代码还是由问题。 d ;;;(defun c:cx () ;;; (setvar "cmdecho" 0) ;;; (setq en (entsel "选择一条直线:")) ;;; (setq pp (getpoint "选择该直线上一点")) ;;; (setq l (getreal "输入垂线的长度")) ;;; (setq en_data (entget (car en))) ;;; (setq pts (assoc 10 en_data));此处取值错误,assoc返回的不是二维或三维点 ;;; (setq pte (assoc 11 en_data));此处取值错误,assoc返回的不是二维或三维点 ;;; (setq px1 (car pts));这里是什么意思? ;;; (setq py1 (cadr pts));这里是什么意思? ;;; (setq px2 (car pte)) ;;; (setq py2 (cadr pte)) ;;; (setq mp1 (list pxi py1));此处变量名称错误,此处的mp1不就是pts点么? ;;; (setq mp2 (list px2 py2)) ;;; (setq a (angle mp1 mp2)) ;;; (setq pppp (polar pp (+ (/ pi 2) a) l)) ;;; (setq ppp (polar pp (- (/ pi 2) a) l)) ;;; (command "line" pppp ppp "") ;;; (princ) ;;;) ;;更正如下: ( c:test () ;;; ( "cmdecho" 0) ( en ( "选择一条直线:")) ( pp ( "选择该直线上一点")) ( l ( "输入垂线的长度")) ( en_data ( ( en))) ( pts ((assoc 10 en_data))) ( pte ((assoc 11 en_data))) ( a ( pts pte)) ( pppp ( pp ( a ( pi 2)) l)) ( ppp ( pp (- a ( pi 2)) l));;此处就是你画出来时水平线的原因,变量换个方向即可,否则ppp点可能不是所要的点 ( "pline" pppp pp ppp "") () ) 更简洁的代码如下: 代码:
bdycad的代码画不出线。 d 以下代码可以在直线上连续画其垂线,如果是曲线,能取得曲线所点击处的斜率,那么就可以适用于曲线上画其垂线了。 请大家看看,修改成对于任意的直线、曲线均适用的程序! 还有就是,在选取直线(曲线)上的点时,加入一个函数,用以只能限制在直线上来选点。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22;; 选取直线画其垂直线 ( c:test2 ( en l en_data pts pte a pp perpt pt1 pt2) ( ( en ( "选择一条直线:")) ( ( l ( "输入垂线的长度") en_data ( ( en)) pts ( ( 10 en_data)) pte ( ( 11 en_data)) a ( pts pte) ) ( ( pp ( "点选该曲线上一点")) ( perpt ( ( en) pp t);找出垂点 pt1 ( perpt ( a ( pi 2)) l) pt2 ( perpt (- a ( pi 2)) l) ;;此处就是你画出来的是水平线的原因,变量换个方向即可,否则ppp点可能不是所要的点 ) ( "pline" pt1 perpt pt2 "") ) ) ) () ) 作曲线上一点切线 autocad中特定角度及长度捕捉的实现方法 已经完成,对于任意曲线的垂线均适用,见下面代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20( c:test ( en len obj pt perpt lst ang pt1 pt2 obj) ( ( en ( "选择一条曲线:")) ( ( len ( "输入垂线长度\n")) ;此处要加入非法输入的控制 ( ( obj ( ( en))) ( ( pt ( "选择该直线上一点")) ( perpt ( obj pt t) lst ( obj ( obj perpt)) ang ( ( ( lst) ( lst))) pt1 ( perpt ( ang ( 0.5 pi)) len) pt2 ( perpt (- ang ( 0.5 pi)) len) ;;此处就是你画出来的是水平线的原因,变量换个方向即可 ) ( "pline" pt1 perpt pt2 "") ) ) ) ) () ) |
所有的时间均为北京时间。 现在的时间是 02:03 PM. |