启天论坛图形影视设计CAD技术 → AutoCAD中特定角度及长度捕捉的实现方法


  共有1267人关注过本帖树形打印

主题:AutoCAD中特定角度及长度捕捉的实现方法

帅哥哟,离线,有人找我吗?
开心就好
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:准尉 帖子:232 积分:1645 威望:0 精华:15 注册:2005-10-30 10:43:00
AutoCAD中特定角度及长度捕捉的实现方法  发帖心情 Post By:2006-5-18 9:28:00



一、引言
   在AutoCAD中的角度捕捉只有当正交状态打开时的直和水平方向,对于其他特殊角度无能为力;另外,其网点捕捉也是相对于X轴和Y轴,无法实现其他方向的特殊长度捕捉,给绘图带来极大的不方便。

  在应用 AutoCAD 进行设计制图的操作中, LINE 和POLYLINE 是使用频率最高的两个命令, 经常要遇到在某些特定角度上绘制特定长度的简单线或复合线的情况,因而实现这两个捕捉对提高AutoCAD 作图效率很有实用价值。

二、方法原理

  所谓角度捕捉,是指当十字光标在某一角度α的一定范围内选取一点时,该点自动落在该α角度线上;当我们设定捕捉角度为α时,将会以基准点作为原点、自X轴正方向出发,将整个屏幕划分为[360/α]个区间,则NXα角度就是角度捕捉线,其中,0≤N≤[360/α],[360/α]表示不大于360/α的整数。

  所谓长度捕捉,是在角度捕捉的基础上,在某一角度线上有一系列捕捉点,该系列点离基准点的距离为捕捉长度的正整数倍,当选取直线上的一点时,落点自动落到离其最近的捕捉点上。

  实现特定角度和长度捕捉的关键点是:当十字光标(即十字交叉线)移动时,程序要随时跟踪其交叉点的位置,并将该位置与用户所设定的捕捉角度与长度对应起来,从而计算出在该角度上的落点。

  以下举例说明该两个捕捉的实现过程:

  假定捕捉角度为α=30°,捕捉长度为L。

  当十字光标在任意的某一区间内移动时,比如在第5区间(120°~150 °)内移动时,此时,落点只能在120°或150°线上(该线在图中并不直接显示),该两根角度线的中心线为135°。当十字光标的中心点处在120°~135°之间时, 则落点应在120°线上,该落点的具体位置为由十字光标的中心点向120°线作垂线来获得,其交点D(称为垂点)即为落点,为直观起见,此时由基准点(此处为O点)向落点作一橡筋拖曳线,该橡筋拖曳线随十字光标的移动而相应移动,显示出拖动过程(见图1);同样,当十字光标的中心点处在135°~150°之间时,则落点应在150°线上,并显示相应的橡筋拖曳线。该橡筋拖曳线并不是真正的线段, 只是用XOR墨水绘制的一个向量,当用XOR墨水重新绘制一遍该向量时,该向量将从屏幕上消失,这就是本程序实现光标拖动的原理。

  落点落在某一捕捉角度线上时,还得落在捕捉长度L 的整数倍的点(称为捕捉点)上,还是针对图1,其垂点必然处于某两个捕捉点A与B之间,设A与B的中点为C,当D处于A与C之间时,落点应为A;当D处于C与B之间时,落点应为B (见图1)。其中:

 -- --

 OA = n XL ; OB = (n + 1) XL

 n: 非负整数。

 L: 捕捉长度。 此时,程序通过一定的操作将在屏幕的最上面的坐标提示行准确地显示落点相对基准点的偏移长度和偏移角度。用户可以滑动鼠标准确捕捉到目标点。

至此,已实现某些特定角度及长度的捕捉。为了满足在程序执行过程中能随时更改捕捉角度和捕捉长度的需要,本程序还增加了相应的模块;另外,本程序中嵌入了窗口放缩功能模块,通过点取下拉菜单中窗口及漫游子菜单,方便了各种作图的需要。

三、源程序清单

 ;; OS.LSP源程序

 ;;err(),出错处理子程序

 (defun err ( msg)

  (if (/= msg "Function cancelled")

  (princ(strcat "\nError:" msg)) ;打印错误内容

  ) ;for if

  (setq *error* olderr)

  (setvar "cmdecho" scmd)

  (setvar "osmode" cosmode)

  (setvar "coords" ccoords)

  (princ "n\n\t --多谢使用角度捕捉2.0版,程序非正常结束--!\n")

  (princ)

 ) ;for defun err

 ;; ant(),设定捕捉角度子程序

 (defun ant ( / ang0 ang1 )

  (setq ang0 (* an0 (/ 180 pi)) )

  (princ (strcat "\n请输入捕捉角度:<" (rtos ang0) ">_"))

  (INITGET 4)

  (setq ang1 (getreal))

  (if (not (null ang1))

  (setq an0 (* ang1 (/ pi 180)))

  )

  (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")

 ) ;for defun ant

 ;; leng(),设定捕捉长度距离子程序

 (defun leng ( / leng0 leng1 )

  (setq leng0 len0)

  (princ (strcat "\n 请输入捕捉长度距离:<" (rtos leng0) ">_"))

  (INITGET 4)

  (setq leng1 (getreal))

  (if (not (null leng1))

  (setq len0 leng1 )

  )

  (princ "\n F2/F3/F4/F5/ESC/Return /下一点:")

 ) ;for defun lent

 ;; field(),判断十字光标所在区间,并投影到相应的捕捉角度线上

 (defun field ( ps pe ang0 / ang1 n )

  (setq ang1 (angle ps pe))

  (setq n (fix (+ ( / ang1 ang0) 0.5)))

  (setq ang2 (* ang0 n))

 );for defun

 ;; endp(), 十字光标投影到相应的捕捉角度上后,以用户设定的长度

 ;; 捕捉计算落点

 (defun endp ( ps pe ang0 / p1 p2 p3 p4 dis )

  (setq p1 ps

  p2 (polar ps ang0 1)

  p3 pe

  p4 (polar pe (+ ang0 (/ pi 2)) 1)

  )

  (setq pend (inters p1 p2 p3 p4 nil))

  (setq dis (distance ps pe))

  (if ( / = len0 0)

  (setq dist (* (fix (+ (/ dis len0) 0.5)) len0))

  ;else

  (setq dist dis)

  ) ;for if

  (setq pend (polar ps ang0 dist))

 ) ;for defun endp

 ;; drag(), 对上一次显示的拖曳线进行"或"操作,使其从屏幕上消失,

 ;; 并绘制下一次拖曳线

 (defun drag ( pold1 pold2 pold3 / )

  (if ( / = b2 4)

  (progn

  (grdraw pold1 pold2 -1 0)

  (grdraw pold2 pold3 -1 0)

  )

  ) ;for if

  (grdraw pstart pend -1 0)

  (grdraw pend pframe -1 0)

 ) ;for defun drag

 ;; coord(), 在屏幕的最上一行的坐标栏显示长度和角度

 (defun coord ( / str leng1 leng0 ang0)

  (setq ang0 (* ang2 (/ 180 pi)) )

  (setq str (strcat (rtos dist) ">" (rtos ang0)))

  (grtext -2 str)

 ) ;for defun coord



海内存知己,天涯若比邻。

QQ:376426525

MSN:furihuaok2005@hotmail.com
启天合组-上海双线 上海电信 南京电信空间 支持(0中立(0反对(0回到顶部
美女呀,离线,留言给我吧!
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:1784 积分:16084 威望:0 精华:0 注册:2005-7-31 13:55:00
  发帖心情 Post By:2006-8-14 12:38:00

支持一下,华哥


影视动画。启天论坛:21780732二群:电视台栏目包业务群1群:18059338\AE、三维动画1群号交英26070501 影视动画网络业务群23516748 44911034(电视台-电影-游戏-动画各种特效交流)
启天合组-10人 15人 20人 多人合租空间 支持(0中立(0反对(0回到顶部