[原创]二维点/三维点的错误
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 "")
()
)
更简洁的代码如下:
代码:
( c:test ()
( en ( "选择一条直线:")
pp ( "选择该直线上一点")
l ( "输入垂线的长度")
en_data ( ( en))
pts ( ( 10 en_data))
pte ( ( 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 "")
)
)
)
)
()
)