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
						Don Si
						2019-07-11 17:53:47