我想看一级黄色大片_久久亚洲国产精品一区二区_久久精品免视看国产明星_91久久青青青国产免费

您的位置:網站首頁 > CAD教程 > CAD教程文章

AutoCAD中特定角度及長度捕捉的實現方法

時間:2008-07-24 15:14:59 來源:

一、引言
   在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 "nnt --多謝使用角度捕捉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 /下一點:") #p#分頁標題#e#

 ) 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

 ;; init(), 對程序進行初始化

 (defun init ( / )

  (setq scmd (getvar "cmdecho"));保留原命令回顯方式

  (setq ccoords (getvar "coords"));保留原坐標顯示方式

  (setq cosmode (getvar "osmode"))

  (setq olderr *error* *error* err) 出錯處理

  (setvar "cmdecho" 0);不回顯

  (setvar "coords" 0) 不顯示坐標

  (setvar "osmode" 0 ) 取消捕捉

  (setq b 0 b1 0 c '(0 0) )

  (setq pstart (getpoint "n 請輸入直線第一點:"))

  (if (or (null an0 ) (< an0 0) (not (numberp an0)))

  (progn

  (setq an0 (/ pi 6))

  (ant)

  )

  ) for if

  (if (or (null len0 ) (< len0 0) (not (numberp len0)))

  (progn

  (setq len0 1)

  (leng)

  )

  ) for if

  (if (null len0) (leng))

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

  (setq a (grread 2 nil))

  (setq pframe (cadr a))

  (field pstart pframe an0)

  (endp pstart pframe ang2)

  (grdraw pstart pend -1 0)

  (grdraw pend pframe -1 0)

  (setq plast pframe polde pend)

  (setq b (car a))

 ) for defun init

 , home(), 設置退出程序的控制變量

 (defun home ( / )

  (setq b 3)

  (setq b1 1)

 ) for defun home

 ;; pull(), 接受用戶輸入控制子程序 #p#分頁標題#e#

 (defun pull ( / )

 (setq b1 0)

 (while (/= b 3)

  (progn

  (setq a (grread 2 nil))

  (coord)

  (if (and (= b 2) (= b2 4)) (setq b 4))

  (setq b2 b)

  (setq b (car a))

  (cond

  ((or (= b 5) (= b 12) );只移動十字光標時

  (progn

  (setq pframe (cadr a))

  (field pstart pframe an0)

  (endp pstart pframe ang2)

  (if (>= (distance plast pframe) 0.1)

  (progn

  (drag pstart polde plast)

  (setq plast pframe polde pend)

  ) for progn

  ) for if

  ) for progn

  ) for cond1

  ( (= b 3);用鼠標在屏幕上點取一點時

  (progn

  (setq pframe (cadr a))

  (field pstart pframe an0)

  (endp pstart pframe ang2)

  (if (>= (distance plast pframe) 0.1)

  (progn

  (grdraw pstart polde -1 0)

  (setq plast pframe polde pend)

  ) for progn

  ) for if

  ) for progn

  ) for cond1

  ((= b 2);鍵盤輸入

  (progn

  (setq c1 (cadr a))

  (cond ((= c1 138) (ant)) F2

  ((= c1 139) (leng)) F3

  ((= c1 140) F4

  (progn

  (setq b2 4)

  (command"zoom" "0.7x")

  )

  ) for (= c1 140)

  ((= c1 141) F5

  (progn

  (setq b2 4)

  (command"zoom" "1.4x")

  )

  ) for (= c1 141)

  ((= c1 13) (home))

  ((= c1 27) (home))

  (T (princ "n 未定義的鍵"))

  ) for cond

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

  );for progn

  );for (cond (= b 2))

  ((= b 4);點取下拉菜單時

  (progn

  (setq c1 (cadr a))

  (princ "n")

  (cond ((= c1 6005)

  (progn

  (command"zoom" "w")

  (princ "n 第一角點:")

  (command pause)

  (princ "n 第二角點:")

  (command pause)

  )

  ) for (= c1 6005)

  ((= c1 6007)

  (command"zoom" "p" ))

  ((= c1 6008)

  (command"zoom" "a" ))

  ((= c1 6011)

  (progn

  (command"pan")

  (princ "n 第一參考點:")

  (command pause)

  (princ "n 第二參考點:")

  command pause)

  )

  ) for (= c1 6011)

 ,else

  (T (princ "n 未定義的菜單"))

  ) for cond

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

  ) FOR PROGN

  ) for (cond (= b 4))

  (T (home) ) for else

  ) for cond

  ) for progn

  ) for while

 ) for defun pull

 ;; draw() , 繪制直線子程序

 (defun draw ( / )

  (while (/= b1 1)

  (progn

  (if (= b 3)

  (progn

  (command"line" pstart pend "")

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

  (setq b 0 b1 1)

  (setq pstart pend)

  );for progn

  ); for if

  (pull)

  ) for progn

  ) for while

  (grdraw pstart pend -1 0) #p#分頁標題#e#

  (grdraw pend pframe -1 0)

 ) for defun draw

 ;;;;主程序

 (defun c:os ( / b b1 b2 c pstart pend pframe plast ang2

  dist scmd ccoords olderr cosmode )

 ,; an0 len0 are defined out program

 (init)

 (draw)

 (princ "n")

 (command"redraw")

 (setq *error* olderr)

 (setvar "cmdecho" scmd)

 (setvar "osmode" cosmode)

 (setvar "coords" ccoords)

 (princ "nnt ------角度捕捉2.0版------n")

 (princ "nnt**寧波大學建筑設計研究院--程建華,1996**n")

 (princ)

 ) for defun os

四、程序的安裝與使用

 1. 程序的安裝

以下三種裝載方式,用戶任選一種即可: 在AutoCAD環境下,將OS.LSP拷至當前目錄,再執行(LOAD"OS")即可裝載OS.LSP。也可先將OS.LSP拷至ACADSUPPORT子目錄下,再在ACADSUPPORTACADR12.LSP或ACADR13.LSP中加入下面一句語句實現啟動AutoCAD時自動裝載:

  (AUTOLOAD "OS" '("OS"))

也可將OS.LSP拷至ACADSUPPORT子目錄下,在ACADSUPPORT\子目錄下的菜單文件ACAD.MNU中的合適位置加上下面的一句語句,即可直接在菜單中點取角度捕捉操作:

 ·

 ·

 ·

 [角度捕捉]^c^c(load"c:/acad/support/os.lsp") os

 ·

 ·

 ·

 2. 程序的使用

在一幅圖中第一次使用該程序時,需要用戶輸入捕捉角度和捕捉長度,第二次調用本程序時,程序可自動采用上一次最后設定的捕捉角度和長度作為默認值。然后,程序需要用戶選擇輸入一點作為基準點,此時命令行提示:

 F2/F3/F4/F5/ESC/Return /下一點:

 用戶根據該提示可任選其中的一種操作,具體解釋如下:

① 按F2鍵重新設定捕捉角度;

② 按F3鍵重新設定捕捉長度;

③ 按F4鍵窗口縮小0.7倍;

④ 按F5鍵窗口放大1.4倍;

⑤ 按ESC鍵、回車鍵、鼠標右鍵均可結束操作,退出程序;

⑥ 選取下一點,移動十字光標鍵,此時在屏幕的最上面的一行的坐標提示欄準確地顯示出按用戶設定的捕捉角度和長度所取得的落點相對于基準點的偏移角度和長度,滑動十字光標鍵直至用戶尋找到所需要的下一點并按下鼠標左鍵,命令行重又出現上面的提示行,并進行下一輪循環;

⑦ 另外,用戶還可以點取View菜單下的Zoom菜單中的Zoom Window 、Zoom Previous、Zoom All等三個子項實現窗口放縮和Pan菜單實現屏幕漫游; 對于其他操作,用戶均可按屏幕命令行的中文提示方便地進行操作。在非漢化AutoCAD 中運行本程序時,只需將程序中有關的中文提示行改成英文提示即可。 另外,由于不同的機型在AutoCAD環境下鍵盤返回碼可能稍有區別,所以要求用戶在應用本程序之前對自己的機器鍵盤返回碼按如下方法作一次核實:

  在AutoCAD命令狀態下輸入(grread)并回車,用戶此時可按下F2或F3、F4、F5鍵:

第一步:Command:(grread)回車

第二步:按下F2鍵

  此時,屏幕上回顯剛輸入的鍵值,比如對筆者使用的機器(AST PIII+4/66D)回顯為:(2 1 36)。

  其具體涵義為:第一個數字"2"表示剛才是鍵盤輸入;第二個數字"136"表示本機器的"F2"鍵的返回碼。

  按上述步驟依次對FF4、F5鍵的返回碼進行核實,筆者的機器該三鍵的返回碼分別為137、138、139。

  如果核實結果與上述結果不符(比如,對某些機型,上述四鍵的返回碼分別為138、139、140、141),則應對程序中的相應語句作如下修改。

  在"接受用戶輸入控制子程序"pull()中的鍵盤輸入部分的下述語句作對應修改:

 (cond ((=c1 136)(ant));F2--此處136改為用戶的F2鍵返回碼

 ((=c1 137)(leng);

 F3--此處137改為用戶的F3鍵返回碼

 ((=c1 138);

 F4--此處138改為用戶的F4鍵返回碼

 ((=c1 139); #p#分頁標題#e#

 F5--此處139改為用戶的F5鍵返回碼

  最后,需要指出的是:用戶自己的菜單文件ACAD.MNU可能增刪過菜單項或AutoCAD R13中,會使Zoom Window、Zoom All、Zoom Previous、Pan在菜單中位置發生改變。這樣,要求用戶在應用本程序之前對自己的菜單項回碼按如下方法作一次核實:

  在AutoCAD命令狀態下輸入(grread)并回車,用戶此時可點取下拉菜單View下的Zoom子菜單中的Window項,對于筆者的菜單其返回值為:(4 6005)。其具體涵義為:第一個數字"4"表示剛才是下拉菜單輸入;第二個數字"6005"表示本菜單的Zoom Window菜單項的返回碼。用戶可按同樣的方法找到菜單項Zoom All、Zoom Previous、Pan的返回碼。并相應地改變"接受用戶輸入控制子程序"pull()中的"點取下拉菜單"部分的下述語句作對應修改:

 (cond ((=c1 6005)--此處6005改為用戶的Zoom Window菜單項返回碼;

 ((=c1 6007)--此處6007改為用戶的Zoom Previous菜單項返回碼;

 ((=c1 6008)--此處6008改為用戶的Zoom All菜單項返回碼;

 ((=c1 6011)--此外6011改為用戶的Pan菜單項返回碼;

五、結語

  應用本程序,可在制圖過程中很方便地實現某些特定角度和長度的捕捉,簡化了操作步驟和擊鍵次數,根據目前的使用情況來看,畫線時可提高作圖速度4倍以上。至于AutoCAD內部提供的正交和網點捕捉只是本程序當捕捉角度為 90°時的一個特例。

  將本程序的畫線子模塊 draw()中語句行

   (command"line" pstart pend "")


我想看一级黄色大片_久久亚洲国产精品一区二区_久久精品免视看国产明星_91久久青青青国产免费

            日本色综合中文字幕| 国产精品女同互慰在线看| 激情成人综合网| 亚洲午夜一区二区三区| 综合久久久久综合| 国产精品毛片久久久久久| 国产人伦精品一区二区| 国产欧美精品一区| 中国av一区二区三区| 国产精品网站一区| 综合自拍亚洲综合图不卡区| 国产精品欧美久久久久无广告| 欧美电影精品一区二区| 在线免费观看成人短视频| 91丝袜高跟美女视频| 欧美在线一区二区| 7878成人国产在线观看| 日韩欧美一二区| 国产拍欧美日韩视频二区| 国产精品天美传媒沈樵| 一区二区三区资源| 日本不卡一二三| 国产一区二区三区在线观看精品 | 精品国产欧美一区二区| 久久免费看少妇高潮| 国产精品麻豆欧美日韩ww| 一区二区三区成人| 日韩成人精品在线| 韩国三级在线一区| 色哟哟一区二区三区| 欧美一级艳片视频免费观看| 久久久国产综合精品女国产盗摄| 久久99精品久久久久婷婷| 国产成人av电影在线播放| 91久久精品一区二区| 日韩欧美一区中文| 中文字幕中文字幕一区二区| 午夜精品成人在线| 国产精品2024| 欧美亚州韩日在线看免费版国语版| 日韩欧美一级二级| 亚洲三级免费电影| 人人精品人人爱| voyeur盗摄精品| 日韩一区二区影院| 亚洲激情欧美激情| 国产综合色视频| 欧美色精品在线视频| 国产午夜亚洲精品羞羞网站| 亚洲综合色丁香婷婷六月图片| 久草精品在线观看| 欧美又粗又大又爽| 国产婷婷一区二区| 奇米综合一区二区三区精品视频| 99天天综合性| 91视频观看免费| 久久精品免视看| 免费成人结看片| 在线观看日韩电影| 亚洲欧洲精品一区二区三区| 久久电影国产免费久久电影| 精品视频在线免费看| 国产精品国产三级国产a| 极品尤物av久久免费看| 欧美日韩小视频| 一区二区三区日韩精品视频| 国产综合久久久久影院| 日韩欧美国产电影| 水野朝阳av一区二区三区| 色欧美88888久久久久久影院| 欧美极品少妇xxxxⅹ高跟鞋 | 日韩成人免费电影| 欧美日韩国产中文| 亚洲一区二区综合| 91成人网在线| 国产精品久久一卡二卡| 成人中文字幕在线| 国产视频一区在线观看| 欧美最猛黑人xxxxx猛交| 自拍偷自拍亚洲精品播放| 成人av网站在线观看| 中文字幕欧美三区| eeuss鲁一区二区三区| 国产精品无码永久免费888| 国产成人亚洲精品青草天美| 久久一区二区三区国产精品| 精彩视频一区二区三区| 久久久亚洲午夜电影| 国产精品亚洲一区二区三区妖精 | 日韩免费看网站| 美女mm1313爽爽久久久蜜臀| 日韩亚洲国产中文字幕欧美| 水蜜桃久久夜色精品一区的特点| 在线电影国产精品| 久久国产精品露脸对白| 精品久久久久久久久久久久久久久| 久久精品国产亚洲aⅴ| 久久综合狠狠综合久久综合88| 国产乱码精品1区2区3区| 国产日韩欧美精品电影三级在线| 成人黄色小视频| 一区二区欧美视频| 91精品国产免费久久综合| 久久国内精品自在自线400部| www国产成人| 91在线观看免费视频| 五月天欧美精品| 日韩亚洲国产中文字幕欧美| 国产福利不卡视频| 亚洲欧美一区二区在线观看| 欧美性猛片xxxx免费看久爱| 蜜桃一区二区三区在线| 国产日韩欧美不卡| 欧美亚洲丝袜传媒另类| 免费成人美女在线观看| 国产精品久久久久影院色老大| 欧美综合一区二区| 麻豆免费精品视频| 国产成人鲁色资源国产91色综| 亚洲欧美日韩综合aⅴ视频| 欧美男同性恋视频网站| 国产精品久久久久9999吃药| 欧美日韩高清一区二区不卡| 国产精品一区在线观看乱码| 一区二区三区日本| 久久午夜色播影院免费高清| 91久久精品国产91性色tv| 久久精品国产第一区二区三区| 成人免费一区二区三区在线观看| 欧美一级夜夜爽| 91猫先生在线| 国产剧情一区二区三区| 丝袜美腿亚洲综合| 亚洲人精品一区| 国产色婷婷亚洲99精品小说| 91精选在线观看| 91麻豆免费在线观看| 国产一区二区三区四区在线观看| 亚洲国产aⅴ天堂久久| 国产精品伦理一区二区| 欧美一级视频精品观看| 欧洲在线/亚洲| av电影在线观看完整版一区二区| 久久99精品久久久| 婷婷综合久久一区二区三区| 亚洲日本丝袜连裤袜办公室| 久久精品一区八戒影视| 日韩免费看网站| 欧美日韩电影在线| 欧美在线不卡一区| 91浏览器打开| 成人激情免费视频| 国产精品亚洲视频| 韩国成人福利片在线播放| 视频一区二区三区中文字幕| 日韩精品资源二区在线| 欧美性极品少妇| 91蝌蚪porny| 91小宝寻花一区二区三区| 成人av第一页| av一本久道久久综合久久鬼色| 国产一区二区日韩精品| 美女久久久精品| 日本伊人色综合网| 视频一区视频二区中文字幕| 91在线精品秘密一区二区| 成人av网站免费| 不卡的电影网站| gogogo免费视频观看亚洲一| 99国内精品久久| 91免费看片在线观看| 青青草97国产精品免费观看无弹窗版| 亚洲福利国产精品| 婷婷久久综合九色综合伊人色| 亚洲一区二区免费视频| 亚洲高清不卡在线观看| 日韩和欧美一区二区三区| 日韩av电影免费观看高清完整版| 免费在线看成人av| 国产一区二区三区在线观看精品| 国产传媒日韩欧美成人| eeuss鲁片一区二区三区| 91免费版在线| 欧美一区二视频| 欧美激情一区三区| 亚洲欧美一区二区三区国产精品 | 首页亚洲欧美制服丝腿| 久久超碰97中文字幕| 国产91精品一区二区麻豆网站| 91麻豆精品一区二区三区| 欧美精品久久久久久久多人混战| 欧美va亚洲va国产综合| 国产精品成人免费精品自在线观看| 亚洲精品中文在线| 久久91精品国产91久久小草| 成人av一区二区三区| 欧美日韩国产精品成人| 国产无人区一区二区三区| 一区二区三区四区五区视频在线观看| 欧美aⅴ一区二区三区视频|