背景
B/S應用系統,根據用戶上傳數據:業務數據和CAD坐標數據,經過一系列運籌算法運算后,輸出一批坐標數據,作為給用戶的規划結果。此時需要方便直觀的給用戶展示坐標數據。可選方式有兩個:
- web頁面畫圖直接展示,能夠迅速展示給用戶結果,但用戶只能根據圖形大概位置估計,不能夠看到很精細的位置,故該方式只可作為預覽使用
- 把坐標數據輸出到CAD軟件能夠識別的文件中,用戶下載文件后,直接用AutoCAD軟件直接打開該文件,藉由CAD軟件功能的豐富性,可以看到很精細的坐標位置,亦可利用AutoCAD二次人為調整加工。
故:需要調研編程讀寫CAD文件的可行性
AutoCAD文件格式
文件格式 | 共同點 | 不同點 |
---|---|---|
DWG | Autocad軟件可直接讀寫並相互轉換 | CAD的圖形文件,DWG僅是CAD專用文件格式, |
DXF | ^ | 用於CAD與其它軟件之間進行CAD數據交換的CAD數據文件格式,文本文件,文件可能比dwg大很多 |
故選用dxf格式作為調研格式
目標運行環境
- Linux
編程語言考量
因項目中服務器端使用到了兩種編程語言,故分別調研該兩種編程語言
- Java
- Python
驗證范圍
本次驗證是為了確認是否能夠通過程序代碼對CAD的dxf
文件進行編輯,編輯以后保存的dxf
文件能否被Autocad軟件正確打開,數據是否會缺失,不同dxf年份格式的dxf文件是否可正確保存和打開。
各編程語言的可選開源包
Python
包名 | 版本 | 優缺點 |
---|---|---|
ezdxf | 0.13 | 直接讀寫dxf格式文件 |
Java
包名 | 版本 | 優缺點 |
---|---|---|
kabeja | ||
YCAD | ||
JDXF | ||
jdwglib | ||
Teigha | ||
dxf |
驗證環境
- 硬件
設備為惠普筆記本電腦,win10系統,64位。 - 軟件
- Python 3.7
- Java8
- Autocad2015
- Autocad2016
- 以及一張dwg格式的工程cad圖紙
驗證過程
- 用CAD軟件將DWG格式的工程圖轉成各年份的dxf格式(dxf2000, dxf2004, dxf2007, dxf2010, dxf2013, R12)
- 編寫代碼讀入dxf格式文件並新建圖層,在新建的圖層上用代碼畫幾個圓形和正方形,保存為對應年份的dxf格式文件
- 通過AutoCAD軟件重新打開代碼編輯過並保存的各年份dxf文件,核對是否畫圖成功,文件大小是否有改變。
- 通過AutoCAD自帶的文件數據提取功能遍歷CAD圖中的所有元素,輸出execl,核對元素數量是否有出入
驗證結果
Python
- ezdxf
能夠正常讀寫dxf文件通過CAD軟件打開dxf文件輸出execl后發現原文件有887410個元素,代碼畫圖保存后的文件有887415個元素,多出的五個元素為代碼新增的一個圓形以及四條線段組成的矩形。元素數目是對應的
Java
Java各包文檔偏少,多數是讀取dxf文件,目前沒有找到合適的用例或api去編寫測試代碼去編輯dxf文件,故目前給出驗證可行性結論,有待繼續深入研究
注意事項
- DWG文件轉換為
R12
dxf格式時,會出現轉換后的文件過大(600M),並且轉換后的文件打不開。(Auto2015和Auto2016均會出現這種情況),故不能選用該版本的dxf - ezdxf庫保存的dxf文件轉換成DWG格式時,打開會跳出錯誤彈框,需要修復才能打開展示,修復后內容展示正常並且元素沒有減少。