DWG/DXF to CNC 工程 I - DWG/DXF圖檔解析篇
對於想用CNC製作一些零組件的朋友來說,要學會AutoCAD、SolidWork、uG、Fusion360、ARTCAM、PowerMill、 MasterCAM、Mach3等,我相信會嚇跑一票人的熱血。其實CAD/CAM套裝軟體很強但有很多功能幾百年也用不到,只是浪費錢而已,在接工廠自動控制客製化軟體方面絕大部分作動都很單純,我這裡是將所有功能精簡成 : /檔案/機器/刀具/G-Code sender,只要讀檔或在螢幕寫字、繪圖後自動產生G-Code直接送至CNC銑床或雷射加工,盡量能由機器代勞的就盡量隱藏在程式裏面,操作介面就只有一個螢幕面板Panel。
要做到這點須先解析DWG檔案結構,後續追加功能才有辦法走下去,AutoCAD DWG檔案簡直就是一個複雜的巨型圖層資料庫而且每兩年改版一次,建議還是用DXF圖檔相容性較高,有機會再談談DXF檔結構。這裡先分享一下DWG解析方法給有興趣研發的好友參考一 下。
基本上程式要解析其中的資料結構如下,有點長刪減一些函數但原理不變。
讀取DWG檔後打開資料庫取實體EntityName的字串名稱(約50個標籤名稱)一層層解析後繪圖即可原圖重現,看你要加圖、刪圖或送去產生G-Code等,另外如果用不著的功能就略過,沒必要全部實作,有興趣可一起討論,下回再討論G-Code產生器。
//-------------------------------------------------------------------
public void Draw(List<CadParse> cadparselist)
{
foreach(CadParse cadParse in cadparselist)
{
switch(cadParse.EntityName)
{
case "AcDbAlignedDimension":
break;
case "AcDbArc":
break;
case "AcDbArcDimension":
break;
case "AcDbBlockReference":
break;
case "AcDbBody":
break;
case "AcDbCircle":
DrawCircle(cadParse);
break;
case "AcDbPoint":
break;
case "AcDbDiametricDimension":
break;
case "AcDbViewport":
break;
case "AcDbEllipse":
DrawEllipse (cadParse);
break;
case "AcDbFace":
break;
case "AcDbHatch":
break;
case "AcDbLeader":
break;
case "AcDbLine":
DrawLine(cadParse);
break;
case "AcDb2LineAngularDimension":
break;
case "AcDbMInsertBlock":
break;
case "AcDbMline":
break;
case "AcDbMText":
break;
case "AcDbOle2Frame":
break;
case "AcDbOrdinateDimension":
break;
case "AcDb3PointAngularDimension":
break;
case "AcDbPolyFaceMesh":
break;
case "AcDbPolygonMesh":
break;
case "AcDbPolyline":
DrawPolyLine(cadParse);
break;
case "AcDb2dPolyline":
break;
case "AcDb3dPolyline":
break;
case "AcDbProxyEntity":
break;
case "AcDbRadialDimension":
break;
case "AcDbRasterImage":
break;
case "AcDbRay":
break;
case "AcDbRegion":
break;
case "AcDbRotatedDimension":
break;
case "AcDbShape":
break;
case "AcDbSolid":
break;
case "AcDb3dSolid":
break;
case "AcDbSpline":
break;
case "AcDbTable":
break;
case "AcDbTrace":
break;
case "AcDbWipeout":
break;
case "AcDbXline":
break;
case "AcDbPdfReference":
break;
case "AcDbDwfReference":
break;
case "AcDbDgnReference":
break;
} //end switch(cadParse.EntityName)
} //end foreach(CadParse cadParse in _cadParseList)
} //end public void Draw()
Don Si
2019-07-11 17:53:47