明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1279|回复: 5

[求助]AutoCAD中特定角度及长度捕捉的实现方法

[复制链接]
发表于 2010-8-16 22:17:00 | 显示全部楼层 |阅读模式
AutoCAD中特定角度及长度捕捉的实现方法,很好的一个程序。

哪位大侠能够修改成在CAD2004中能够使用,万分感谢!
  1. ;; OS.LSP源程序  
  2.  ;;err(),出错处理子程序  
  3.  (defun err ( msg)  
  4.   (if (/= msg "Function cancelled")  
  5.   (princ(strcat "\nError:" msg)) ;打印错误内容  
  6.   ) ;for if  
  7.   (setq *error* olderr)  
  8.   (setvar "cmdecho" scmd)  
  9.   (setvar "osmode" cosmode)  
  10.   (setvar "coords" ccoords)  
  11.   (princ "n\n\t --多谢使用角度捕捉2.0版,程序非正常结束--!\n")  
  12.   (princ)  
  13.  ) ;for defun err  
  14.  ;; ant(),设定捕捉角度子程序  
  15.  (defun ant ( / ang0 ang1 )  
  16.   (setq ang0 (* an0 (/ 180 pi)) )  
  17.   (princ (strcat "\n请输入捕捉角度:<" (rtos ang0) ">_"))  
  18.   (INITGET 4)  
  19.   (setq ang1 (getreal))  
  20.   (if (not (null ang1))  
  21.   (setq an0 (* ang1 (/ pi 180)))  
  22.   )  
  23.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")  
  24.  ) ;for defun ant  
  25.  ;; leng(),设定捕捉长度距离子程序  
  26.  (defun leng ( / leng0 leng1 )  
  27.   (setq leng0 len0)  
  28.   (princ (strcat "\n 请输入捕捉长度距离:<" (rtos leng0) ">_"))  
  29.   (INITGET 4)  
  30.   (setq leng1 (getreal))  
  31.   (if (not (null leng1))  
  32.   (setq len0 leng1 )  
  33.   )  
  34.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")  
  35.  ) ;for defun lent  
  36.  ;; field(),判断十字光标所在区间,并投影到相应的捕捉角度线上  
  37.  (defun field ( ps pe ang0 / ang1 n )  
  38.   (setq ang1 (angle ps pe))  
  39.   (setq n (fix (+ ( / ang1 ang0) 0.5)))  
  40.   (setq ang2 (* ang0 n))  
  41.  );for defun  
  42.  ;; endp(), 十字光标投影到相应的捕捉角度上后,以用户设定的长度  
  43.  ;; 捕捉计算落点  
  44.   
  45. 海立  
  46. 05.16 16:35  
  47.   
  48. (defun endp ( ps pe ang0 / p1 p2 p3 p4 dis )  
  49.   (setq p1 ps  
  50.   p2 (polar ps ang0 1)  
  51.   p3 pe  
  52.   p4 (polar pe (+ ang0 (/ pi 2)) 1)  
  53.   )  
  54.   (setq pend (inters p1 p2 p3 p4 nil))  
  55.   (setq dis (distance ps pe))  
  56.   (if ( / = len0 0)  
  57.   (setq dist (* (fix (+ (/ dis len0) 0.5)) len0))  
  58.   ;else  
  59.   (setq dist dis)  
  60.   ) ;for if  
  61.   (setq pend (polar ps ang0 dist))  
  62.  ) ;for defun endp  
  63.  ;; drag(), 对上一次显示的拖曳线进行"或"操作,使其从屏幕上消失,  
  64.  ;; 并绘制下一次拖曳线  
  65.  (defun drag ( pold1 pold2 pold3 / )  
  66.   (if ( / = b2 4)  
  67.   (progn  
  68.   (grdraw pold1 pold2 -1 0)  
  69.   (grdraw pold2 pold3 -1 0)  
  70.   )  
  71.   ) ;for if  
  72.   (grdraw pstart pend -1 0)  
  73.   (grdraw pend pframe -1 0)  
  74.  ) ;for defun drag  
  75.  ;; coord(), 在屏幕的最上一行的坐标栏显示长度和角度  
  76.  (defun coord ( / str leng1 leng0 ang0)  
  77.   (setq ang0 (* ang2 (/ 180 pi)) )  
  78.   (setq str (strcat (rtos dist) ">" (rtos ang0)))  
  79.   (grtext -2 str)  
  80.  ) ;for defun coord  
  81.  ;; init(), 对程序进行初始化  
  82.  (defun init ( / )  
  83.   (setq scmd (getvar "cmdecho"));保留原命令回显方式  
  84.   (setq ccoords (getvar "coords"));保留原坐标显示方式  
  85.   (setq cosmode (getvar "osmode"))  
  86.   (setq olderr *error* *error* err) ;出错处理
  87. (setvar "cmdecho" 0);不回显  
  88.   (setvar "coords" 0) ;不显示坐标  
  89.   (setvar "osmode" 0 ) ;取消捕捉  
  90.   (setq b 0 b1 0 c '(0 0) )  
  91.   (setq pstart (getpoint "\n 请输入直线第一点:"))  
  92.   (if (or (null an0 ) (< an0 0) (not (numberp an0)))  
  93.   (progn  
  94.   (setq an0 (/ pi 6))  
  95.   (ant)  
  96.   )  
  97.   ) ; for if  
  98.   (if (or (null len0 ) (< len0 0) (not (numberp len0)))  
  99.   (progn  
  100.   (setq len0 1)  
  101.   (leng)  
  102.   )  
  103.   ) ;for if  
  104.   (if (null len0) (leng))  
  105.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点::")  
  106.   (setq a (grread 2 nil))  
  107.   (setq pframe (cadr a))  
  108.   (field pstart pframe an0)  
  109.   (endp pstart pframe ang2)  
  110.   (grdraw pstart pend -1 0)  
  111.   (grdraw pend pframe -1 0)  
  112.   (setq plast pframe polde pend)  
  113.   (setq b (car a))  
  114.  ) ;for defun init  
  115.   ;; home(), 设置退出程序的控制变量  
  116.  (defun home ( / )  
  117.   (setq b 3)  
  118.   (setq b1 1)  
  119.  ) ;for defun home  
  120.  ;; pull(), 接受用户输入控制子程序  
  121.  (defun pull ( / )  
  122.  (setq b1 0)  
  123.  (while (/= b 3)  
  124.   (progn  
  125.   (setq a (grread 2 nil))  
  126.   (coord)  
  127.   (if (and (= b 2) (= b2 4)) (setq b 4))  
  128.   (setq b2 b)  
  129.   (setq b (car a))  
  130.   (cond  
  131.   ((or (= b 5) (= b 12) );只移动十字光标时  
  132.   (progn  
  133.   (setq pframe (cadr a))  
  134.   (field pstart pframe an0)  
  135.   (endp pstart pframe ang2)  
  136.   (if (>= (distance plast pframe) 0.1)  
  137.   (progn  
  138.   (drag pstart polde plast)  
  139.   (setq plast pframe polde pend)  
  140.   ) ;for progn  
  141.   ) ;for if  
  142.   ) ;for progn  
  143.   ) ;for cond1  
  144.   ( (= b 3);用鼠标在屏幕上点取一点时
  145. (progn  
  146.   (setq pframe (cadr a))  
  147.   (field pstart pframe an0)  
  148.   (endp pstart pframe ang2)  
  149.   (if (>= (distance plast pframe) 0.1)  
  150.   (progn  
  151.   (grdraw pstart polde -1 0)  
  152.   (setq plast pframe polde pend)  
  153.   ) ;for progn  
  154.   ) ;for if  
  155.   ) ;for progn  
  156.   ) ;for cond1  
  157.   ((= b 2);键盘输入  
  158.   (progn  
  159.   (setq c1 (cadr a))  
  160.   (cond ((= c1 138) (ant)) ;F2  
  161.   ((= c1 139) (leng)) ;F3  
  162.   ((= c1 140) ;F4  
  163.   (progn  
  164.   (setq b2 4)  
  165.   (command"zoom" "0.7x")  
  166.   )  
  167.   ) ;for (= c1 140)  
  168.   ((= c1 141) ;F5  
  169.   (progn  
  170.   (setq b2 4)  
  171.   (command"zoom" "1.4x")  
  172.   )  
  173.   ) ;for (= c1 141)  
  174.   ((= c1 13) (home))  
  175.   ((= c1 27) (home))  
  176.   (T (princ "\n 未定义的键"))  
  177.   ) ;for cond  
  178.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")  
  179.   );for progn  
  180.   );for (cond (= b 2))  
  181.   ((= b 4);点取下拉菜单时  
  182.   (progn  
  183.   (setq c1 (cadr a))  
  184.   (princ "\n")  
  185.   (cond ((= c1 6005)  
  186.   (progn  
  187.   (command"zoom" "w")  
  188.   (princ "\n 第一角点:")  
  189.   (command pause)  
  190.   (princ "\n 第二角点:")  
  191.   (command pause)  
  192.   )  
  193.   ) ;for (= c1 6005)  
  194.   ((= c1 6007)  
  195.   (command"zoom" "p" ))  
  196.   ((= c1 6008)  
  197.   (command"zoom" "a" ))  
  198.   ((= c1 6011)  
  199.   (progn  
  200.   (command"pan")  
  201.   (princ "\n 第一参考点:")  
  202.   (command pause)  
  203.   (princ "\n 第二参考点:")  
  204.   command pause)  
  205.   )  
  206.   ) ;for (= c1 6011)  
  207.   ;;else  
  208.   (T (princ "\n 未定义的菜单"))
  209. ) ;for cond  
  210.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")  
  211.   ) ;FOR PROGN  
  212.   ) ;for (cond (= b 4))  
  213.   (T (home) ) ;for else  
  214.   ) ;for cond  
  215.   ) ;for progn  
  216.   ) ;for while  
  217.  ) ;for defun pull  
  218.  ;; draw() , 绘制直线子程序  
  219.  (defun draw ( / )  
  220.   (while (/= b1 1)  
  221.   (progn  
  222.   (if (= b 3)  
  223.   (progn  
  224.   (command"line" pstart pend "")  
  225.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")  
  226.   (setq b 0 b1 1)  
  227.   (setq pstart pend)  
  228.   );for progn  
  229.   ); for if  
  230.   (pull)  
  231.   ) ;for progn  
  232.   ) ;for while  
  233.   (grdraw pstart pend -1 0)  
  234.   (grdraw pend pframe -1 0)  
  235.  ) ;for defun draw  
  236.  ;;;;主程序  
  237.  (defun c:os ( / b b1 b2 c pstart pend pframe plast ang2  
  238.   dist scmd ccoords olderr cosmode )  
  239.   ;;; an0 len0 are defined out program  
  240.  (init)  
  241.  (draw)  
  242.  (princ "\n")  
  243.  (command"redraw")  
  244.  (setq *error* olderr)  
  245.  (setvar "cmdecho" scmd)  
  246.  (setvar "osmode" cosmode)  
  247.  (setvar "coords" ccoords)  
  248.  (princ "\n\n\t ------角度捕捉2.0版------\n")  
  249.  (princ "\n\n\t**宁波大学建筑设计研究院--程建华,1996**\n")  
  250.  (princ)  
  251.  ) ;for defun os
 楼主| 发表于 2010-8-17 19:45:00 | 显示全部楼层

请各位帮帮忙!

发表于 2010-8-17 20:58:00 | 显示全部楼层
本帖最后由 作者 于 2010-8-18 20:12:26 编辑

  1. ;; OS.LSP源程序
  2. ;;err(),出错处理子程序
  3. (defun err (msg)
  4. (if (/= msg "Function cancelled")
  5.   (princ(strcat "\nError:" msg)) ;打印错误内容
  6. ) ;for if
  7. (setq *error* olderr)
  8. (setvar "cmdecho" scmd)
  9. (setvar "osmode" cosmode)
  10. (setvar "coords" ccoords)
  11. (princ "n\n\t --多谢使用角度捕捉2.0版,程序非正常结束--!\n")
  12. (princ)
  13. ) ;for defun err
  14. ;; ant(),设定捕捉角度子程序
  15. (defun ant (/ ang0 ang1)
  16. (setq ang0 (* an0 (/ 180 pi)))
  17. (INITGET 4)
  18. (setq ang1 (getreal (strcat "\n请输入捕捉角度:<" (rtos ang0) ">_")))
  19. (if ang1 (setq an0 (* ang1 (/ pi 180))))
  20. (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")
  21. ) ;for defun ant
  22. ;; leng(),设定捕捉长度距离子程序
  23. (defun leng (/ leng1)
  24. (INITGET 4)
  25. (setq leng1 (getreal  (strcat "\n 请输入捕捉长度距离:<" (rtos len0) ">_")))
  26. (if leng1 (setq len0 leng1))
  27. (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")
  28. ) ;for defun lent
  29. ;; field(),判断十字光标所在区间,并投影到相应的捕捉角度线上
  30. (defun field (ps pe ang0 / ang1 n)
  31. (setq ang1 (angle ps pe))
  32. (setq n (fix (+ (/ ang1 ang0) 0.5)))
  33. (setq ang2 (* ang0 n))
  34. );for defun
  35. ;; endp(), 十字光标投影到相应的捕捉角度上后,以用户设定的长度
  36. ;; 捕捉计算落点
  37. ; 海立   05.16 16:35
  38. (defun endp (ps pe ang0 / p1 p2 p3 p4 dis)
  39. (setq p1 ps
  40.        p2 (polar ps ang0 1)
  41.        p3 pe
  42.        p4 (polar pe (+ ang0 (/ pi 2)) 1)
  43. )
  44. (setq pend (inters p1 p2 p3 p4 nil))
  45. (setq dis (distance ps pe))
  46. (if (/= len0 0)
  47.   (setq dist (* (fix (+ (/ dis len0) 0.5)) len0))
  48.   ;else
  49.   (setq dist dis)
  50. ) ;for if
  51. (setq pend (polar ps ang0 dist))
  52. ) ;for defun endp
  53. ;; drag(), 对上一次显示的拖曳线进行"或"操作,使其从屏幕上消失,
  54. ;; 并绘制下一次拖曳线
  55. (defun drag (pold1 pold2 pold3)
  56. (if (/= b2 4) (progn
  57.   (grdraw pold1 pold2 -1 0)
  58.   (grdraw pold2 pold3 -1 0)
  59. )) ;for if
  60. (grdraw pstart pend -1 0)
  61. (grdraw pend pframe -1 0)
  62. ) ;for defun drag
  63. ;; coord(), 在屏幕的最上一行的坐标栏显示长度和角度
  64. (defun coord (/ str leng1 leng0 ang0)
  65. (setq ang0 (* ang2 (/ 180 pi)))
  66. (setq str (strcat (rtos dist) ">" (rtos ang0)))
  67. (grtext -2 str)
  68. ) ;for defun coord
  69. ;; init(), 对程序进行初始化
  70. (defun init ()
  71. (setq scmd (getvar "cmdecho"));保留原命令回显方式
  72. (setq ccoords (getvar "coords"));保留原坐标显示方式
  73. (setq cosmode (getvar "osmode"))
  74. (setq olderr *error* *error* err) ;出错处理
  75. (setvar "cmdecho" 0);不回显
  76. (setvar "coords" 0) ;不显示坐标
  77. (setvar "osmode" 0 ) ;取消捕捉
  78. (setq b 0 b1 0 c '(0 0))
  79. (setq pstart (getpoint "\n 请输入直线第一点:"))
  80. (if (or (null an0 ) (< an0 0) (not (numberp an0))) (progn
  81.   (setq an0 (/ pi 6))
  82.   (ant)
  83. )) ; for if
  84. (if (or (null len0 ) (< len0 0) (not (numberp len0))) (progn
  85.   (setq len0 1)
  86.   (leng)
  87. )) ;for if
  88. (if (null len0) (leng))
  89.   (princ "\n F2/F3/F4/F5/ESC/Return /下一点::")
  90.   (setq a (grread nil 2))
  91.   (setq pframe (cadr a))
  92.   (field pstart pframe an0)
  93.   (endp pstart pframe ang2)
  94.   (grdraw pstart pend -1 0)
  95.   (grdraw pend pframe -1 0)
  96.   (setq plast pframe polde pend)
  97.   (setq b (car a))
  98. ) ;for defun init
  99. ;; home(), 设置退出程序的控制变量
  100. (defun home ()
  101. (setq b 3)
  102. (setq b1 1)
  103. ) ;for defun home
  104. ;; pull(), 接受用户输入控制子程序
  105. (defun pull ()
  106. (setq b1 0)
  107. (while (/= b 3)
  108.   (setq a (grread nel 2))
  109.   (coord)
  110.   (if (and (= b 2) (= b2 4)) (setq b 4))
  111.   (setq b2 b)
  112.   (setq b (car a))
  113.   (cond
  114.    ((or (= b 5) (= b 12) );只移动十字光标时
  115.     (setq pframe (cadr a))
  116.     (field pstart pframe an0)
  117.     (endp pstart pframe ang2)
  118.     (if (>= (distance plast pframe) 0.1) (progn
  119.      (drag pstart polde plast)
  120.      (setq plast pframe polde pend)
  121.     )) ;for if
  122.    ) ;for cond1
  123.    ((= b 3);用鼠标在屏幕上点取一点时
  124.     (setq pframe (cadr a))
  125.     (field pstart pframe an0)
  126.     (endp pstart pframe ang2)
  127.     (if (>= (distance plast pframe) 0.1) (progn
  128.      (grdraw pstart polde -1 0)
  129.      (setq plast pframe polde pend)
  130.     )) ;for if
  131.    ) ;for cond1
  132.    ((= b 2);键盘输入
  133.     (setq c1 (cadr a))
  134.     (cond ((= c1 138) (ant)) ;F2
  135.     ((= c1 139) (leng)) ;F3
  136.     ((= c1 140) ;F4
  137.      (setq b2 4)
  138.      (command"zoom" "0.7x")
  139.     ) ;for (= c1 140)
  140.     ((= c1 141) ;F5
  141.      (setq b2 4)
  142.      (command"zoom" "1.4x")
  143.   ) ;for (= c1 141)
  144.     ((= c1 13) (home))
  145.     ((= c1 27) (home))
  146.     (T (princ "\n 未定义的键"))
  147.    ) ;for cond
  148.    (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")
  149.   );for (cond (= b 2))
  150.   ((= b 4);点取下拉菜单时
  151.    (setq c1 (cadr a))
  152.    (princ "\n")
  153.    (cond
  154.     ((= c1 6005)
  155.      (command"zoom" "w")
  156.      (princ "\n 第一角点:")
  157.      (command pause)
  158.      (princ "\n 第二角点:")
  159.      (command pause)
  160.     ) ;for (= c1 6005)
  161.     ((= c1 6007) (command "zoom" "p" ))
  162.     ((= c1 6008) (command "zoom" "a" ))
  163.     ((= c1 6011)
  164.      (command"pan")
  165.      (princ "\n 第一参考点:")
  166.      (command pause)
  167.      (princ "\n 第二参考点:")
  168.      (command pause)
  169.     ) ;for (= c1 6011)
  170.   ;;else
  171.     (T (princ "\n 未定义的菜单"))
  172.    ) ;for cond
  173.    (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")
  174.    ) ;for (cond (= b 4))
  175.    (T (home)) ;for else
  176.   ) ;for cond
  177. ) ;for while
  178. ) ;for defun pull
  179. ;; draw() , 绘制直线子程序
  180. (defun draw ()
  181. (while (/= b1 1)
  182.   (if (= b 3) (progn
  183.    (command"line" pstart pend "")
  184.    (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")
  185.    (setq b 0 b1 1)
  186.    (setq pstart pend)
  187.   )); for if
  188.   (pull)
  189. ) ;for while
  190. (grdraw pstart pend -1 0)
  191. (grdraw pend pframe -1 0)
  192. ) ;for defun draw
  193. ;;;;主程序
  194. (defun c:os (/ b b1 b2 c pstart pend pframe plast ang2
  195.   dist scmd ccoords olderr cosmode)
  196. ;;; an0 len0 are defined out program
  197. (init)
  198. (draw)
  199. (princ "\n")
  200. (redraw)
  201. (setq *error* olderr)
  202. (setvar "cmdecho" scmd)
  203. (setvar "osmode" cosmode)
  204. (setvar "coords" ccoords)
  205. (princ "\n\n\t ------角度捕捉2.0版------\n")
  206. (princ "\n\n\t**宁波大学建筑设计研究院--程建华,1996**\n")
  207. (princ)
  208. ) ;for defun os
 楼主| 发表于 2010-8-17 21:39:00 | 显示全部楼层

下面是执行过程,在选择第一个点之后就退出了,还是不行啊!

 

 

 

命令: OS
系统变量【 CMDECHO 】从值 〖1 〗变到〖 0 〗
系统变量【 OSMODE 】从值 〖15359 〗变到〖 0 〗
 请输入直线第一点:
 F2/F3/F4/F5/ESC/Return /下一点::
Error:参数类型错误: fixnump: nil
系统变量【 CMDECHO 】从值 〖0 〗变到〖 1 〗
系统变量【 OSMODE 】从值 〖0 〗变到〖 15359 〗n
  --多谢使用角度捕捉2.0版,程序非正常结束--!

发表于 2010-8-18 20:15:00 | 显示全部楼层
是抄别人的程序吧。三楼改了。再试试。
 楼主| 发表于 2010-8-18 20:18:00 | 显示全部楼层

呵呵:-),这本来就是别人的程序啊!下面的署名估计就是原作者,我保留了版权信息啊,原封不动,没改!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 10:44 , Processed in 0.183530 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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