閆帥鵬 ,羅孟勤
(中國電子科技集團公司第二十九研究所,四川 成都 610036)
一幅完整的CAD圖形會包含圖層、線型、直線、多段線、圓弧、橢圓、樣條曲線等多種元素信息。為了更加完整且有條理地解析圖形原有的信息,并還原出最符合加工要求的圖形[1],本文將DXF文件讀入的流程分為幾個功能模塊,文件讀入流程如圖1所示。本文對于DXF文件中的圖形元素的解析分為五個模塊[2]:直線元素讀入模塊、多段線元素讀入模塊、橢圓(弧)元素讀入模塊、圓(弧)元素讀入模塊、樣條曲線元素讀入模塊。

圖1 DXF文件讀取流程圖
直線作為繪圖的基礎,在近乎所有的CAD制圖中都會出現。因此,將直線的讀寫作為整個DXF文件解析的基礎是很具有代表性的。對于直線的關鍵數據就是其起始點的坐標值[3]。根據DXF文件的編碼規則,直線數據段的結構如下:直線關鍵字為“LINE”;“LINE”后面出現的組碼“10”的下方,代表示起點X坐標值;“LINE”之后出現的組碼“20”的下方,代表起點Y坐標值;“LINE”之后出現的組碼“11”的下方,代表終點X坐標值;“LINE”之后出現的組碼“21”的下方,代表終點Y坐標值。根據上述結構,分析得到直線數據段的讀取流程,如圖2所示。在直線數據段讀取的過程中,需要特別注意對于不同線型的區分,這樣做的目的有兩個:更加全面地讀取所有線型的數據,完整還原CAD圖形;便于在進行激光劃片的過程中把不需要進行實際操作的虛線、點畫線等剔除掉。對于將直線還原到軟件界面上,有兩種方案可以選擇。一是將起始點的坐標值提取出來,利用直線計算的公式便可直接計算出直線方程,然后將起始點的橫坐標或者縱坐標按照相當小的差值進行插值計算,得到整條直線的點坐標,最后通過描點的方式完成直線,其流程如圖3所示。二是利用編程軟件中自帶的直線繪制函數進行繪制。

圖2 直線數據讀取流程圖

圖3 直線數據重新繪制流程圖
通過對比,方案1需要用戶自行編寫相應算法,過程復雜;而方案2可以方便快捷地實現圖像的繪制。但是,在使用激光劃片機進行操作時,對于運動終端的控制,仍需按照方案1的算法逐點進行插補,完成對直線的激光劃片。直線繪制的關鍵點:直線的繪制中,按照斜率公式計算時,由于可能出現橫坐標相等的分母為零的情況,所以分情況討論。一是分母不為零時,按公式求方程;二是分母為零時,只是Y方向的坐標變化。在判斷分母時需要注意,由于DXF文件中讀出的相同坐標值有可能在小數點后的3開始就不一樣,所以直接判斷分母是否為零會出現錯誤導致該直線基本沒有繪制的點出現(X坐標基本相同,如果按公式求方程,則橫坐標幾乎無法變化,循環就已經結束了)。因此,在判斷分母為零時,不直接判斷是否等于0,而是加入一定的冗余量,只要ΔX<0.001時,就判斷其屬于分母等于零的情況。對于直線的繪制,通過判斷起始點與終止的上下以及左右的位置,來確定步長的正負,以確保繪制的順序。
上文已經詳細闡述了直線數據段的讀寫流程。基于VB.NET的特點,對軟件編制過程中所需的重難點進行講解。對于圖元中包含的直線類數據,可以定位一個類名為“Line”。這個類由以下屬性組成:StartX,表示原始起點的X坐標;StartY,表示原始起點的Y坐標;EndX,表示原始終點的X坐標;EndY,表示原始終點的Y坐標;LaserStartX,表示轉換后的起點X坐標;LaserStartY,表示轉換后的起點Y坐標;LaserEndX,表示轉換后的終點X坐標;LaserEndY,表示轉換后的終點Y坐標。在讀取坐標點數據時,由于DXF文件讀入時均是文本形式,也就是說讀入的數據全部是字符串,并不能夠參與數值運算。本軟件利用VB.NET所擁有的Csng函數功能,可以使Single類型的單精度浮點數由字符串轉換而得。同時,利用Round函數,將數據精度控制在小數點后三位。舉例說明:Line.StartX=Math.Round(Csng(dxfmember(i)))
上式表示將dxfmember數組中的第i項讀出,然后利用Csng函數和Round函數,將第i項所表示的字符串轉換為此時該條直線類的原始起點X坐標值。
在對直線類進行繪制時,可以采用Graphics的畫圖類在軟件界面進行畫圖,其中Graphics是VB.NET自帶功能函數。該類的使用首先需要定義一個Graphics類的對象,名為Draw,其定義格式為:
Public Draw As Graphics
同時,還需要定義一個畫筆類的對象,名為ObjPen,其格式為:
Public objPen As New Pen(Color.DeepPink, 1)
其中“Color.DeepPink”表示畫筆顏色,后面的“1”表示畫筆的寬度為1個像素。在進行繪制時,直接調用DrawLine模塊,輸入下列參數:畫筆對象; 直線起點X坐標值;直線起點Y坐標值;直線終點X坐標值;直線終點Y坐標值。需要特別注意,由于VB.NET在繪制圖形時,其XOY坐標系的定義是屏幕的左上角為(0,0)點,如圖4所示。

圖4 VB.NET繪制坐標系
而CAD原圖形的XOY坐標系定義是以左下角為(0,0)點,如圖5所示。

圖5 CAD原圖形的XOY坐標系
通過對比圖4和圖5可以得知,對于任意的坐標點在繪制時,其橫坐標保持不變,但其縱坐標的值需要由Y軸方向所設定的最大值與坐標點縱坐標的數值相減才能正確表達。也就是說,需要由所設定圖幅的高度值減去坐標點縱坐標值,從而得到繪圖所使用的縱坐標值。綜上所述,完整的直線繪制命令如下:
Draw.DrawLine(objPen, Line.LaserStartX, Form1.PictureBox1.Height - Line.LaserStartY, Line.LaserEndX, Form1.PictureBox1.Height - Line.LaserEndY)
其中,objPen代表繪制所用的畫筆;LaserStartX表示轉換后的起點X坐標;LaserStartY表示轉換后的起點Y坐標;Form1.PictureBox1.Height表示繪圖界面的高度值;LaserEndX表示轉換后的終點X坐標;LaserEndY表示轉換后的終點Y坐標。參照上面的命令,就可以將不同起始點的所有直線數據全部完整地繪制在軟件界面上。
本文根據實際應用的需求,通過讀取DXF文件獲得了AUTOCAD文件中直線數據的幾何信息,提取了直線數據存儲數據,并將其轉化,進行重新繪制,基于VB軟件進行編程。這可以在實際的加工生產中促進加工效率的提升。