下面詳細介紹壹下這個項目中讀到的幾個原語。
圖元信息的提取需要結合DXF參考手冊和庫文件(主要涉及dl_entities.h和dl_dxf.cpp),選取實際需要的數據來構造用戶自定義的圖元信息。比如畫二維平面圖形時,不需要Z軸坐標,此時只需要讀取數據中的X和Y值,畫圓弧時需要考慮OCS到WCS的變化。但是拉伸方向的讀取並不涉及到庫文件讀取的數據,所以這個時候需要修改庫文件,主要是修改上面提到的兩個文件(這個在畫圓弧的時候會詳細介紹)。
首先妳可以在庫文件dl_entities.h中看到每個圖元信息數據格式的定義,每個數據所代表的具體信息可以在dl_dxf.cpp中看到它的組碼,結合dxf參考手冊,就可以理解數據含義並繪制出來。
要點
void MyDXFReader::add point(const DL _ point data & amp;數據)
{
}
壹個點的結構很簡單,只需要data.x,data.y。
線條
void MyDXFReader::addLine(const DL _ line data & amp;數據)
{
}
線的結構也很簡單。直接讀取起點和終點組成壹行,data.x1,data . y 1;+0;data.x2,data.y2
圓
add circle(const DL _ circle data & amp;數據)
{
}
圓的構造需要圓心和半徑。讀取data.cx,data.cy,data.radius
橢圓
add ellipse(const DL _ EllipseData & amp;數據)
{
}
橢圓的構造需要中心點,相對於中心點的主軸點,起始角和終止角(非整橢圓),所以讀取的參數是data.cx,data.cy,data.mx,data.my,data.angle1,data.angle2
農業研究委員會
void MyDXFReader::add arc(const DL _ ArcData & amp;數據)
{
}
圓弧需要的數據主要包括圓心、半徑、起始角、終止角和三個方向的拉伸方向值。因為它的中心點是用OCS表示的坐標值,而畫圖時要用WCS,所以此時需要根據拉伸方向進行坐標變換。原來的dxflib庫沒有提取拉伸方向的值,直接以為用了默認值。因此,需要在DL_ArcData構造函數和read函數中添加值。
文檔參考
外大陸架和WCS簡介
/forum.php?視圖線程& amptid=667490。高亮顯示=trans
從OCS到WCS的具體轉換
文學:潘瀟。基於CAD圖紙的運動控制信息提取方法的研究與實現[D]。燕山大學,2006。(重要)
可以參考上述文獻中的算法進行坐標轉換。
多段線和長多段線
add polyline(const DL _ polyline data & amp;數據)
{
}
void MyDXFReader::add vertex(const DL _ vertex data & amp;數據)
{
}
dxflib庫中的多段線元素和優化後的多段線元素都是通過這兩種方法讀出的。首先,添加polyline(constdl _ polyline data &;Data)以獲得點數(data.number)和標誌(data.flags),其中點數表示addVertex中的點數,標誌表示折線的閉合。需要註意的是,讀寫LWPOLYLINE時要考慮點的凸性。如果凸度不為0,則需要畫圓弧。查看參考手冊,我們可以看到,此時也應考慮從外大陸架到WCS的轉換。
文檔參考
在DXF文件中將多段線凸面轉換為圓弧
/eick Andy/article/details/48317855
尺寸
DXF檔案中有多種註釋。根據DXF參考手冊,可以為每個標簽構建相應的結構。註記的繪制主要是獲取插入點和插入值,然後結合註記點繪制註記信息。
例如,對齊標簽。
void MyDXFReader::addDimAlign(const DL _ dimension data & amp;數據1,
const DL _ DimAlignedData & amp數據2)
{
}
根據DXF參考手冊,插入點為data1.dpx,data1.dpy,插入值的中點為data1.mpx,data1.mpy..然後從data2中可以得到標註點信息data2.epx1,data2.epy1和data2.epx2,data2.epy2,然後根據本頁底部DXF參考手冊提供的標註圖形參考,即可繪制出標註信息。其他幾個註釋是這樣添加的。
文字和多行文字
對於文字信息的添加,TEXT指單行文字,MTEXT指多行文字。在這個項目中,文本內容被讀出並顯示在指定位置,並且沒有設置相應的文本樣式。下面簡單介紹添加多行文字。
void MyDXFReader::add mtext(const DL _ MTextData & amp;數據)
{
}
它主要讀取插入點data.ipx、data.ipy和文本內容data.text,然後在指定點附近顯示文本。
插入
為了讀取插入的塊,有必要借助於塊段的讀取來存儲所有的塊。插入塊時,遍歷存儲的塊,找到具有相應名稱的塊進行插入。由於塊中圖元的類型與實體段中圖元的類型相似,本項目將圖元分別存儲在實體段和塊中,只能繪制插入塊中的圖元,而實體段中的圖元將全部繪制。
void MyDXFReader::addInsert(const DL _ insert data & amp;數據)
{
}
void MyDXFReader::add block(const DL _ block data & amp;數據)
{
}
選擇data.name,遍歷存儲的塊,並找到要插入的塊。