張曉彬
(漳州職業(yè)技術(shù)學(xué)院 機械工程系,福建 漳州 363000)
AutoCAD 作為通用繪圖軟件,廣泛應(yīng)用于機械、建筑、電氣等領(lǐng)域。 但是,在專業(yè)性較高的專門應(yīng)用領(lǐng)域的適用性較差。 為了提高繪圖效率,可以借助二次開發(fā)來擴展繪圖功能并提高繪圖效率。 Autolisp 語言內(nèi)嵌于AutoCAD 軟件,可以和AutoCAD 軟件的繪圖軟件命令有機結(jié)合,能夠有效地提高AutoCAD 軟件的智能化和適用性[1]。
平面與立體產(chǎn)生的交線稱為截交線。 根據(jù)平面與圓錐軸線之間的相對位置不同,可產(chǎn)生5 種不同類型的截交線。 其中,當截平面平行于一條素線時,截交線的形狀為拋物線;當截平面平行于軸線時,截交線的形狀為雙曲線。
在AutoCAD 繪圖中,表1 中的前3 種類型可以借助軟件內(nèi)置命令直接進行精確繪制。 對于后面2種類型,需要繪制二次圓錐曲線,無法通過軟件內(nèi)置命令直接完成。 需要借助緯圓法(或素線法),求出若干個特殊點和一般位置點,再利用樣條曲線命令進行擬合完成具體如圖1 所示。
表1 平面與圓錐截交線類型
圖1 利用緯圓法求截交線
通過緯圓法(或素線法)繪制截交線,需要重復(fù)做出不同位置的緯圓,并根據(jù)投影規(guī)律求出截交線上的點的側(cè)面投影,效率低下,且無法重新利用[2-3]。 基于緯圓法的思想,本文提出一種使用Autolisp 繪制截交線的算法,實現(xiàn)可以重復(fù)運行的功能,進而達到提高繪圖效率的目的。
根據(jù)給定的三視圖進行特征點識別,主視圖的三個特征點分別標識為P1、P2、P3;左視圖的3 個特征點分別標識為P4、P5、P6,截平面在主視圖所積聚的直線端點分別標識為P7、P8;俯視圖的特征點(圓心)標識為 P9。
基于緯圓法,繪制截交線為拋物線的三視圖的算法描述如下。
步驟1:根據(jù)P7、P8與P1、P2,判斷截平面直線是否與素線平行,如果是,執(zhí)行步驟2。
步驟2:根據(jù) P7、P3、P8,使用 pline 命令,重新繪制得到新的主視圖。
步驟3:利用car 函數(shù)求出P1和P7的X 軸坐標值,相減得到的絕對值為dis1,并利用勾股定理求出 dis2。 兩次利用 polar 函數(shù)求出 P10、P11。 根據(jù) P9、P10、P11分別繪制出俯視圖的圓弧和直線。
步驟4:利用polar 和inters 函數(shù)求出P1所在鉛垂線與直線的交點 P32,再利用 car、cadr、list 函數(shù)求出的中點P33。根據(jù)P33,利用polar、inters 函數(shù)求出distance 函數(shù)求出P33所在緯圓與的交點,并求出緯圓的半徑radius。
步驟5:利用 car 函數(shù),根據(jù) P1、P33的 X 軸坐標求出 dis3。 根據(jù) radius 和 dis3,利用勾股定理求出 dis4。根據(jù) P9、dis3、dis4,兩次利用 polar 函數(shù)求出 P12、P13。 根據(jù)步驟 4-5 的方法,分別求出 P14、P15、P16、P17。
步驟6:根據(jù) list、car、cadr 函數(shù)求出 P8的 X 坐標、P9的 Y 坐標,得到 P18。
步驟7:利用 spline 命令,順次連接 P10、P12、P14、P16、P18、P17、P15、P13、P11,最終得到截交線在水平面的投影,并到新的俯視圖。
步驟8:利用polar 函數(shù)和inters 函數(shù),計算得到直線與P4所在鉛垂線的交點P38。
步驟9:利用 polar 函數(shù),根據(jù)P38及dis2,求出 P10和 P11在左視圖的坐標。
步驟10:利用 polar 函數(shù),根據(jù) P38及 dis4,求出 P12。 利用 car 函數(shù)獲得 P12的 X 軸坐標,cadr 函數(shù)獲得P27的Y 軸坐標。根據(jù)獲得的X 軸坐標、Y 軸坐標、Z=0.0,用list 函數(shù)構(gòu)造出P12在左視圖的坐標。用相同的方法,求出P13的坐標。
步驟11:利用步驟 3 的方法,分別求出 P14、P15、P16、P17、P18。
步驟12:利用 spline 命令,順次連接 P10、P12、P14、P16、P18、P17、P15、P13、P11,繪制出截交線在側(cè)面的投影。
步驟13:進行修剪,并用erase 命令刪除求圖形,最終得到完成的圖形。
基于緯圓法,繪制截交線為雙曲線的三視圖的算法描述如下。
步驟1:根據(jù)P7、P8判斷截交線直線是否為軸線平行。 是,執(zhí)行步驟2。
步驟2:根據(jù) P7、P8、P3、P1,使用 pline 命令繪制主視圖。
步驟3:利用car 函數(shù),分別P1P7的X 軸坐標,相減得到的絕對值為dis1。 根據(jù)勾股定理,計算出dis2。
步驟4:根據(jù) P9、dis,利用 polar 函數(shù),求出輔助點 P31。 再根據(jù)輔助點 P31、dis2,利用 polar 函數(shù),分別求出 P10和 P11。
步驟5:以 P9(圓心)、P10、P11為參數(shù),使用 arc 命令繪制出圓??;以 P10、P11為端點,繪制出直線,從而繪制出完整的俯視圖。
步驟 7:根據(jù) polar、inters 函數(shù),計算出直線的中點 P34,根據(jù) dis2,計算出 P10、P11。
步驟8:根據(jù)P33,polar 函數(shù)和inters 函數(shù),計算出 P33所在緯圓與素線交點的 P12、P13。 根據(jù)P12、P13,利用distance 函數(shù)計算出緯圓的半徑radius。 根據(jù)勾股定理,計算出dis3。
步驟9:利用car 函數(shù)獲得 P4的 X 軸坐標,cadr 函數(shù)獲得P33的 Y 軸坐標。根據(jù)獲得的 X 軸坐標、Y軸坐標、Z=0.0,用list 函數(shù)構(gòu)造出P33在左視圖的坐標。
步驟10:根據(jù)P33、dis2,利用polar 函數(shù),分別計算出P12、P13在左視圖的投影坐標。根據(jù)相同方法分別計算出 P14、P15、P16、P17。
步驟11:利用car 函數(shù)獲得P4的X 軸坐標,cadr 函數(shù)獲得P7的Y 軸坐標。 根據(jù)獲得的X 軸坐標、Y 軸坐標、Z=0.0,用 list 函數(shù)構(gòu)造出 P18的坐標。
步驟 12:利用 spline 命令,順次連接 P10、P12、P14、P16、P18、P17、P15、P13、P11,繪制出截交線在側(cè)面的投影。
根據(jù)上述提出的算法,用Autolisp 語言編寫實現(xiàn)繪圖的程序,部分代碼如下。
(if (or (< (abs (- (angle pt7 pt8) (angle pt1 pt2))) 0.000001) (< (abs (- (abs (- (angle pt7 pt8) (angle pt1 pt2))) pi)) 0.000001))//判斷平面是否與直線平行
(setq dis1 (- (car pt1) (car pt7)))
(setq dis2 (sqrt (- (* radius radius) (* dis1 dis1))))
(setq pt31 (polar pt9 pi dis1))
(setq pt10 (polar pt31 (* 0.5 pi) dis2))
(setq pt11 (polar pt31 (* 1.5 pi) dis2))
…………
(setq pt32 (polar pt1 (* 1.5 pi) 10))
(setq pt32 (inters pt1 pt32 pt7 pt8 nil))
(setq pt33 (list (* 0.5 (+ (car pt32) (car pt7))) (* 0.5 (+ (cadr pt32) (cadr pt7))) 0.0))
(setq pt34 (polar pt33 0 10))
(setq pt35 (inters pt33 pt34 pt1 pt2 nil))
(setq pt36 (inters pt33 pt34 pt1 pt3 nil))
(setq radius (* 0.5 (distance pt35 pt36)))
(setq dis3 (- (car pt1) (car pt33)))
(setq dis4 (sqrt (- (* radius radius) (* dis3 dis3))))
(setq pt37 (polar pt9 pi dis3))
(setq pt12 (polar pt37 (* 0.5 pi) dis4))//獲得P12 在俯視圖的坐標
(setq pt13 (polar pt37 (* 1.5 pi) dis4))//獲得P13 在俯視圖的坐標
…………
(command "spline" pt10 pt12 pt14 pt16 pt18 pt17 pt15 pt13 pt11 "" "" "")//根據(jù)獲得的關(guān)鍵點繪制截交線
(setq pt38 (polar pt4 (* 1.5 pi) 10))
(setq pt38 (inters pt4 pt38 pt5 pt6 nil))
(setq pt10 (polar pt38 pi dis2))//獲得P10 在左視圖的坐標
(setq pt11 (polar pt38 0 dis2)))//獲得P11 在左視圖的坐標
(setq pt12 (polar pt38 pi dis4)))
(setq pt12 (list (car pt12) (cadr pt33) 0.0))//獲得P12 在左視圖的坐標
(setq pt13 (polar pt38 0 dis4))
(setq pt13 (list (car pt13) (cadr pt33) 0.0))//獲得P13 在左視圖的坐標
(setq pt18 (list (car pt4) (cadr pt8) 0.0))//獲得P18 在左視圖的坐標
…………
(command "spline"pt10 pt12 pt14 pt16 pt18 pt17 pt15 pt13 pt11 "" "" "")//根據(jù)獲得的關(guān)鍵點繪制截交線
(if(or (= (angle pt7 pt8) (* 0.5 pi)) (= (angle pt7 pt8) (* 1.5 pi))//判斷平面與軸線是否平行
…………
(setq pt31 (polar pt7 (* 1.5 pi) (* 0.25 dis3)))
(setq pt32 (polar pt7 (* 1.5 pi) (* 0.5 dis3)))
(setq pt33 (polar pt7 (* 1.5 pi) (* 0.75 dis3)))
(setq pt34 (polar pt4 (* 1.5 pi) 10))
(setq pt34 (inters pt4 pt34 pt5 pt6 nil))
(setq pt10 (polar pt34 pi dis2))//獲得P10 在左視圖的坐標
(setq pt11 (polar pt34 0 dis2))//獲得P11 在左視圖的坐標
(setq pt35 (polar pt33 0 10))
(setq pt12 (inters pt33 pt35 pt1 pt2 nil))
(setq pt13 (inters pt33 pt35 pt1 pt3 nil))
(setq radius (* 0.5 (distance pt12 pt13)))
(setq dis3 (sqrt (- (* radius radius) (* dis1 dis1))))
(setq pt33 (list (car pt4) (cadr pt28) 0.0))
(setq pt12 (polar pt33 pi dis3))//獲得P12 在左視圖的坐標
(setq pt13 (polar pt33 0 dis3))//獲得P13 在左視圖的坐標
已知三視圖,利用該程序分別求出2 種不同情況的截交線,生成效果如圖2 所示。
圖2 生成效果圖
手工繪圖、AutoCAD 輔助作圖的方法都需要重復(fù)多次運用緯圓法,確定截交線上的特殊點,再對所得到的特殊點進行擬合,效率比較低下?;诰晥A法的思想,利用Autolisp 語言,快速確定特殊點,并利用AutoCAD 內(nèi)置的spline 命令直接生成所需的二次圓錐曲線,有效地提高了AutoCAD 的智能化和適用性。