摘要:該文討論了在AutoCAD中表面粗糙度符號標注工具的改進方法,在直線、圓對象基礎上增加了正多邊形、多段線、尺寸標注的尺寸界線對象標注表面粗糙度符號,完善了該工具的功能,提高了機械制圖的繪圖效率,具有較好的實際使用價值和推廣意義。
關鍵詞:表面粗糙度符號;AutoCAD;機械制圖
中圖分類號:TP391.72;TH122文獻標識碼:A文章編號:1009-3044(2009)36-10551-03
An Improvement on Surface Roughness Symbol Marking By Redevelopment of Auto CAD
FU Chun-hua, LIU Gao-jun, HUANG Mao-fei
(Sichuan University of Science Engineering, Zigong 643000, China)
Abstract: The improvement of Surface Roughness Symbol Marking in AutoCAD is discussed in the paper. On the bases of line and circle objects, the surface roughness symbol marking of the polygon, polyline and extension line of dimension objects are added. This research extended the function of AutoCAD, enhanced mechanical drawings effectively, and embodies practical value and popularizing significance.
Key words: surface roughness symbol marking; AutoCAD; mechanical design
AutoCAD是一種功能十分強大通用圖形處理軟,在機械行業中使用越來越來普遍。繪制一張復雜的零件圖可能要標注好十幾次粗糙度符號。由于在AutoCAD中沒有現成的粗糙度符號標注工具,因而直接標注符合國標的零件表面粗糙度是一項十分繁瑣的工作,而且繪圖效率極低。因此為提高繪圖效率,擴充AutoCAD的功能,對表面粗糙度符號標注進行AutoCAD二次開發是十分必要的。李建明發表于《東北師大學報自然科學版》第36卷2004年5月《表面粗糙度符號標注的AutoCAD二次開發》一文,使用方便,界面友好,美中不足的是不能在對多段線、矩形、多邊形與尺寸標注對象直接標注表面粗糙度符號,本文對此進行改進。
1 原文主要內容
1.1 表面粗糙度符號標注設計思想
開發過程采用參數化繪圖的基本設計思想,通過輸入標注粗糙度的數值、符號、位置、文字高度等參數,然后點取標注位置,就能標注出符合國家標準是GB/T 131-1993的表面粗糙度符號,并根據大量參考圖冊的粗糙度標注與筆者的工程制圖經驗,對該國家標準進行必要的簡化,以簡化程序開發工作并使開發的標注實用程序更接近實際使用情況。其設計思想流程如圖1所示。
1.2 標注方位的判斷與實現
1.2.1 直線對象的角度求解
由于Auto lisp函數無直接得到直線對象角度的函數,因而只有通過(angle pt1 pt2)函數來求解,所以必須先求解直線的兩個端點坐標。該函數返回的是由起點指向終點方向與X軸的夾角。
求直線角度的程序如下:
(defun jd ( )
(command \"osnap\" \"nea\");;;設置“最近點”捕捉方式
(setq pt (getpoint)aa (ssget pt) ;;;以“點選”方式選擇直線
stm_data (entget (ssname aa 0)));;;獲得直線對象的定義數據關聯表
(setqa_1(assoc 10stm_data) ;;;從關聯表中取出指定的DXF組碼,
a_2(assoc 11 stm_data);;;10為起點,11為終點
a_1(cdr a_1) a_2(cdr a_2)) ;;;從DXF組碼中取出起點與終點坐標
(setq ang (angle a_1 a_2)) ;;;求直線12與X軸的夾角
);defun
1.2.2 標注粗糙度符號時α角度求解
以標注如圖2所示的粗糙度符號為例,就要知道圖中的α角度,然后將粗糙度符號轉過一個α角度即可。由于直線的起點與終點不一樣,求得的角度也不一樣,對圖2來講,要求α角度,就需要由求得的直線角度ang進行轉化,求α角度的程序段如下:
(if (and (> ang (/ pi 2)) (<= ang (* 1.5 pi)))
(setq ang (- ang pi))
);if
(if (and (> ang (* 1.5 pi)) (< ang (* 2 pi)))
(setq ang (- ang (* 2 pi)))
);if
2 改進方法的實施
2.1 原文主要缺陷及原因
原文開發的工具對直線、圓、圓弧對象的標注如圖3所示,符合GB要求。對尺寸標注實體對象的粗糙度符號標注如圖4所示;對多段線、正多邊的粗糙度符號標注則提示“錯誤: 參數類型錯誤: 二維/三維點: nil”,不進行標注,如圖5所示。主要原因是不能識別這些對象,標注不正確或不標注的原因是沒有對這些實體進行處理,不能正確求解粗糙度符號標注角度。
要正確標注只有將上述對象分解為簡單實體。但分解后會出現許多新的問題,一般不采用這種方法。
2.2 改進方法
開發設計思想與原文一致,主要針對原文缺陷的原因,解決的關鍵問題就是要能取出需要的端點。通過對多段線、矩形、尺寸標注對象的圖形數據的分析知道,需要利用DXF組代碼取出相應的端點,然后利用原文的求解角度方法,就能得到正確的標注。
具體過程是利用entget函數取得對象的圖形數據,用assoc函數利用DXF組代碼從圖形數據中取出含有需要端點的數據表,如(10 330.491 75.0874 0.0),然后利用cdr函數去掉DXF組代碼10后得到端點坐標(330.491 75.0874 0.0)。
2.2.1 標注尺寸界線的角度求解
AutoCAD的尺寸標注對象是一個整體。其圖形數據為:
((-1 . <圖元名: 7ef50d68>) (0 . \"DIMENSION\") (330 . <圖元名: 7ef50d08>) (5 . \"2D\")(100 . \"AcDbEntity\") (67 . 0) (410 . \"Model\") (8 . \"0\") (100 . \"AcDbDimension\")(2 . \"*D1\") (10 330.491 75.0874 0.0) (11 328.616 121.982 0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . \"\") (71 . 5) (72 . 1) (41 . 1.0)(42 . 93.7895) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0)(210 0.0 0.0 1.0) (3 . \"ISO-25\") (100 . \"AcDbAlignedDimension\") (13 194.16 168.877 0.0) (14 194.16 75.0874 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 . 0.0) (50 . 1.5708) (100 . \"AcDbRotatedDimension\")
如圖6所示,對應組碼表其中取出來的點為P1、P2、P3、P4四個點,分別為組碼表中10、11、13、14所對應的值。10、14分別為圖5所示的P1、P4點對應的組代碼,其取點的程序為:
(setq a_1(cdr(assoc 10 stm_data))
a_2(cdr(assoc 14 stm_data)))
得到點后求解角度與直線的方法一樣。
2.2.2 多段線、矩形框及多邊形的角度求解
由于多段線、矩形及多邊形對象利用組碼取得的值為圖形的各個頂點坐標值。如圖7所示。
因此在求解多段線、矩形及多邊形的角度時必需通過循環取得。循環取出相鄰兩點的坐標值,求出這兩點所在的直線的斜率。再取這兩點的第一點與用戶選取的點來計算這兩點的斜率,如果分別計算的兩個斜率相同,那么退出循環。即可取出當前取得的兩點的坐標值來求解角度。如果取到后一點,則再取出最后一點與圖形的第一點進行計算。
如圖7所示,分別計算P1與P2、P2與P3……等的斜率值,假設用戶輸入的點為Pt,當P1與P2的斜率等于P1與Pt的斜率,則取出當前兩個點。計算及取點的程序如下:
(if (= bzys \"LWPOLYLINE\");;;判斷所選擇的對象是否為多義線、矩形框及多邊形
(progn
(setq do_do 2 i 14)
(while (> do_do 1)
(setq xxxx 0 yyyy 0)
(setq zzzz (nth i stm_data))
(setq i (+ i 4))
(setq wwww (nth i stm_data))
(if (= rrrr 210)
(setq zzzz (nth (- i 8) stm_data)
wwww (nth 14 stm_data))) ;;;判斷是否取到最后一點
(setq a_1 (cdr zzzz))
(setq a_2 (cdr wwww))
(setq rrrr (nth 0 wwww))
(setq b_1 (angle a_1 pt)
b_2 (angle a_1 a_2))
(if (= (rtos b_1) (rtos b_2))
(setq do_do 1));;;;if斜率相同則退出循環
);;;while
);;;progn
);;;if
在(if (= (rtos b_1) (rtos b_2)) (setq do_do 1));這個語句中用到了rtos將實型數轉換成字符串再來進行比較。由于在計算兩點的斜率時,有時候兩點的斜率值非常小,為避免造成死循環,將其轉換成字符串來進行比較更容易實現比較的目的。
2.2 運行與標注實例
運行界面如圖8所示,標注實例如圖9所示。
3 結論
本程序在AutoCAD2008中調試通過,改進后的表面粗糙度符號標注工具,增加了對多義線、矩形、及在尺寸標注對象的尺寸界限線上標注表面粗糙度符號,功能進一部完善,使用更加方便,擴充AutoCAD功能,提高了機械制圖效率。本工具可作為單獨的實用工具使用,也可作為機械制圖適用工具的一個模塊使用,具有較好的實際使用價值和推廣意義。
參考文獻:
[1] 符純華.計算機輔助設計[M].成都:西南交通大學出版社,2006.
[2] 李建明.表面粗糙度符號標注的AutoCAD二次開發[J].東北師大學報自然科學版,2004(5):73-76.
[3] 汪愷.技術制圖國家標準宣貫教材[M].北京:中國計量出版社,1997.
[4] 俞漢清.表面粗糙度標準及應用[M].北京:中國計量出版社,1997.
[5] 易春峰,張錫濱.Auto CAD中表面粗糙度標注工具的二次開發[J].企業技術開發,2001(5):4-5.