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