2009-06-16 30 views
12

Có ai biết mã nguồn, lý tưởng trong C# hoặc tương tự, để đọc tệp .DXF (như được sử dụng bởi AutoCAD, v.v ...)? Nếu không phải mã, thì các bảng hiển thị các mã khác nhau (các phần tử/khối/etc) và ý nghĩa của chúng?Đọc các tệp .DXF

Tôi tự mình viết một người đọc và có tài liệu về cây chết có định dạng chi tiết, nhưng tôi đang cố gắng tránh viết, ví dụ: một công cụ chuyển đổi từ mỗi màu 255 ACI sang RGB ... Cảm ơn!

Trả lời

4

Cadlib từ WoutWare tôi đã sử dụng cho một vài dự án có kết quả tốt.

+1

Chúng tôi đã đi với điều này - giá là đúng, và đó là một độc đáo đặt lại với nhau (và đúng nhận xét!) Thư viện. –

+0

Được sử dụng sản phẩm này trong hơn 5 năm nay .. Thật tuyệt vời –

2

Bạn có thể muốn thử Open Design Alliance. Đó là một thời gian kể từ khi tôi nhìn vào nó bản thân mình, nhưng họ đã có một tải của thư viện C để đối phó với các tập tin AutoCAD khác nhau.

+0

Giá Tuy nhiên, nghiêm túc dốc , đặc biệt là nếu bạn có ý định viết phần mềm cũng như thư viện và sau đó bán nó. –

2

Here là liên kết đến trình đọc dxf CodeProject; có vẻ như rất hạn chế (và không được thực hiện tốt).

0

Here là một trình đọc dxf nguồn mở khác, bằng Java. Buggy tuy nhiên!

5

Tôi đã làm việc một vài năm để phát triển DXf-Viewer in java của riêng mình (bạn có thể thả tệp DXF của riêng mình hoặc URL trên trình xem) cho bản vẽ 2D.
Thông tin được xuất bản từ AutoCAD là cơ sở tốt nhưng không giải thích cách hoạt động của nó.
Trở thành thành viên của Liên minh thiết kế mở, sẽ cung cấp cho bạn khả năng chuyển đổi một số định dạng CAD sang DXF. Nó có thể là một ý tưởng tốt nếu bạn đang phát triển một sản phẩm thương mại.
Có sách Đức (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) về DXF thực sự giải thích định dạng này. Đó là tốn kém, nhưng có thể tiết kiệm ngày tìm kiếm.
Các màu trong Định dạng DXF được lập chỉ mục, bạn phải có bộ chuyển đổi từ ACI sang RGB. Hãy cẩn thận với các giá trị 0 và 1 có ý nghĩa đặc biệt.

Trân trọng.

0

Tôi đã viết một số mã C# để đọc điểm/dòng/của vòng cung từ tất cả các phiên bản ASCII DXF có sẵn tại thời điểm với cùng một mã
Bạn có thể thêm nhiều đối tượng bij chỉ bổ sung thêm các chương trình con với tên chính xác
(nhìn bên trong DXF).

Những gì nó:

  1. Bạn gửi toàn bộ tập tin bạn đã nhập khẩu với một người đọc thường xuyên
  2. này Sau đó nó tìm kiếm các đối tượng chặn (đây là nơi mà al hình học được lưu trữ)
  3. Sau đó nó tìm kiếm các đối tượng (Point/Line/Arc)
    (R12 đến R14 sử dụng POINT/LINE/ARC)
    (R2000 đến R2013 sử dụng AcDbPoint/AcDbLine/AcDbArc hoặc AcDbCircle nếu nó có chứa các góc)
  4. Sau đó, nó sẽ kiểm tra cho một tên lớp
  5. Sau đó, nó sẽ kiểm tra nếu các mã biến đang có
  6. Sau đó, bạn có thể làm điều gì đó với dữ liệu

    private void ReadDxfFile (string DxfFile) 
    { 
        string Layer = ""; 
    
        string[] D = DxfFile.Split(new[] { Environment.NewLine }, StringSplitOptions.None); 
    
        int iEntities = 0; for(int i = 0; i < D.Length; i++) { if (D[i] == "ENTITIES") {iEntities = i; break; } } 
        for (int i = iEntities; i < D.Length; i++) 
        { 
         if (D[i] == "POINT" || D[i] == "AcDbPoint") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 8; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //X = D[iWaarden + 1] 
            //Y = D[iWaarden + 3] 
            //Z = D[iWaarden + 5] 
           } 
          } 
         } 
    
         if (D[i] == "LINE" || D[i] == "AcDbLine") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 10; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xbegin = D[iWaarden + 1] 
            //Ybegin = D[iWaarden + 3] 
            //Zbegin = D[iWaarden + 5] 
            //Xend = D[iWaarden + 7] 
            //Yend = D[iWaarden + 9] 
            //Zend = D[iWaarden + 11] 
           } 
          } 
         } 
    
         if (D[i] == "ARC" || D[i] == "AcDbArc" || D[i] == "AcDbCircle") 
         { 
          int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; } 
          Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == " 8") { Layer = D[iLayer + 1]; }; } 
          for (int iWaarden = i; iWaarden < i + 10; iWaarden++) 
          { 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 10] == " 51") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xmid = D[iWaarden + 1] 
            //Ymid = D[iWaarden + 3] 
            //Zmid = D[iWaarden + 5] 
            //Radius = D[iWaarden + 7] 
            //StartAngle = D[iWaarden + 9] 
            //StartAngle = D[iWaarden + 11] 
           } 
           if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 12] == " 51") 
           { 
            //Here you can store the following data in a list for later use 
            //LayerName = Layer 
            //Xmid = D[iWaarden + 1] 
            //Ymid = D[iWaarden + 3] 
            //Zmid = D[iWaarden + 5] 
            //Radius = D[iWaarden + 7] 
            //StartAngle = D[iWaarden + 11] 
            //StartAngle = D[iWaarden + 13] 
           } 
          } 
         } 
    
        } 
    }