明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2237|回复: 5

[原创]二维点/三维点的错误

[复制链接]
发表于 2009-1-13 08:26:00 | 显示全部楼层 |阅读模式

画任意直线的垂线,可是结果是二维点/三维点的错误,请高手指点

(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)
)

发表于 2009-1-13 08:45:00 | 显示全部楼层
  1. (defun c:cx ()
  2.   (setvar "cmdecho" 0)
  3.   (if (setq en (entsel "选择一条直线:"))
  4.     (if (setq pp (getpoint "选择该直线上一点"))
  5.       (if (setq l (getreal "输入垂线的长度"))
  6. (progn
  7.    (setq en_data (entget (car en)))
  8.    (setq pts (CDR (assoc 10 en_data)))
  9.    (setq pte (CDR (assoc 11 en_data)))
  10.    (setq Perpt (vlax-curve-getClosestPointTo (car en) pp T));找出垂点
  11.    (setq a (angle pts pte))
  12.    (setq pppp (polar Perpt (+ (* pi 0.5) a) l))
  13.    (setq ppp (polar Perpt (+ (* pi 1.5) a) l))
  14.    (entmake (APPEND '((0 . "LINE")
  15.         (100 . "AcDbEntity")
  16.         (100 . "AcDbLine")
  17.         (8 . "0")
  18.        )
  19.       (LIST (CONS 10 pppp) (CONS 11 ppp))
  20.      )
  21.    )
  22. )
  23.       )
  24.     )
  25.   )
  26.   (princ)
  27. )
发表于 2009-1-13 08:47:00 | 显示全部楼层

代码是楼主自己的吗?

(setq mp1(list pxi py1))

-》

(setq mp1(list px1 py1))

 楼主| 发表于 2009-1-13 08:56:00 | 显示全部楼层
谢谢BDYCAD,你的代码很好用,非常感谢!也谢谢caoyin指出错误,可是我改了后画出来的是水平线,我的代码还是由问题。
发表于 2009-1-13 09:11:00 | 显示全部楼层
本帖最后由 作者 于 2009-1-13 9:20:54 编辑

;;;(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)
;;;)
  1. ;;更正如下:
  2. (defun c:test ()
  3. ;;;  (setvar "cmdecho" 0)
  4.   (setq en (entsel "选择一条直线:"))
  5.   (setq pp (getpoint "选择该直线上一点"))
  6.   (setq l (getreal "输入垂线的长度"))
  7.   (setq en_data (entget (car en)))
  8.   (setq pts (cdr(assoc 10 en_data)))
  9.   (setq pte (cdr(assoc 11 en_data)))
  10.   (setq a (angle pts pte))
  11.   (setq pppp (polar pp (+ a (/ pi 2)) l))
  12.   (setq ppp (polar pp (- a (/ pi 2)) l));;此处就是你画出来时水平线的原因,变量换个方向即可,否则ppp点可能不是所要的点
  13.   (command "pline" pppp pp ppp "")
  14.   (princ)
  15. )
更简洁的代码如下:
  1. [CODE]
  2. (defun c:test ()
  3.   (setq en (entsel "选择一条直线:")
  4. pp (getpoint "选择该直线上一点")
  5. l (getreal "输入垂线的长度")
  6. en_data (entget (car en))
  7. pts (cdr (assoc 10 en_data))
  8. pte (cdr (assoc 11 en_data))
  9. a (angle pts pte)
  10. pppp (polar pp (+ a (/ pi 2)) l)
  11. ppp (polar pp (- a (/ pi 2)) l);;此处就是你画出来的是水平线的原因,变量换个方向即可,否则ppp点可能不是所要的点
  12.   )
  13.   (command "pline" pppp pp ppp "")
  14.   (princ)
  15. )
[/code]
  1. BDYCAD的代码画不出线。
复制代码
发表于 2009-1-13 09:47:00 | 显示全部楼层
本帖最后由 作者 于 2009-1-13 11:09:01 编辑

以下代码可以在直线上连续画其垂线,如果是曲线,能取得曲线所点击处的斜率,那么就可以适用于曲线上画其垂线了。
请大家看看,修改成对于任意的直线、曲线均适用的程序!
还有就是,在选取直线(曲线)上的点时,加入一个函数,用以只能限制在直线上来选点。
  1. ;; 选取直线画其垂直线
  2. (defun c:test2 (/ en l en_data pts pte a pp Perpt pt1 pt2)
  3.   (if (setq en (entsel "选择一条直线:"))
  4.     (progn
  5.       (setq l     (getreal "输入垂线的长度")
  6.      en_data (entget (car en))
  7.      pts     (cdr (assoc 10 en_data))
  8.      pte     (cdr (assoc 11 en_data))
  9.      a     (angle pts pte)
  10.       )
  11.       (while (setq pp (getpoint "点选该曲线上一点"))
  12. (setq Perpt (vlax-curve-getClosestPointTo (car en) pp T);找出垂点
  13.        pt1   (polar Perpt (+ a (/ pi 2)) l)
  14.        pt2   (polar Perpt (- a (/ pi 2)) l)
  15.       ;;此处就是你画出来的是水平线的原因,变量换个方向即可,否则ppp点可能不是所要的点
  16. )
  17. (command "pline" pt1 Perpt pt2 "")
  18.       )
  19.     )
  20.   )
  21.   (princ)
  22. )
作曲线上一点切线 http://zml84.blog.sohu.com/64440094.htmlAutoCAD中特定角度及长度捕捉的实现方法 http://zml84.blog.sohu.com/104345923.html

已经完成,对于任意曲线的垂线均适用,见下面代码:
  1. (defun c:test (/ en len OBJ pt Perpt LST ANG pt1 pt2 OBJ)
  2.   (if (setq en (entsel "选择一条曲线:"))
  3.     (if (setq len (getreal "输入垂线长度\n")) ;此处要加入非法输入的控制
  4.       (progn
  5. (setq OBJ (vlax-ename->vla-object (car en)))
  6. (while (setq pt (getpoint "选择该直线上一点"))
  7.    (setq Perpt (vlax-curve-getClosestPointTo OBJ pt T)
  8.     LST   (vlax-curve-getfirstderiv OBJ (vlax-curve-getparamatpoint OBJ Perpt))
  9.     ANG   (atan (/ (cadr LST) (car LST)))
  10.     pt1   (polar Perpt (+ ANG (* 0.5 pi)) len)
  11.     pt2   (polar Perpt (- ANG (* 0.5 pi)) len)
  12.     ;;此处就是你画出来的是水平线的原因,变量换个方向即可
  13.    )
  14.    (command "pline" pt1 Perpt pt2 "")
  15. )
  16.       )
  17.     )
  18.   )
  19.   (princ)
  20. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-29 16:42 , Processed in 0.203516 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表