2009-06-16 28 views
12

Czy ktoś zna kod źródłowy, najlepiej w języku C# lub podobnym, do odczytu plików .DXF (używany przez AutoCAD itp.)? Jeśli nie kod, to tabele przedstawiające różne kody (elementy/bloki/etc) i ich znaczenie?Czytanie plików .DXF

Sam piszę czytnik i mam dokumentację drzewa martwego z wyszczególnieniem formatu, ale staram się unikać pisania, np. konwerter z każdego z 255 kolorów ACI do RGB ... Dzięki!

Odpowiedz

4

Cadlib z WoutWare używam dla kilku projektów z dobrymi wynikami.

+1

Poszliśmy z tym - cena była właściwa, a to ładnie zestawiona (i odpowiednio skomentowana!) Biblioteka. –

+0

Używałem tego produktu od ponad 5 lat .. Jest wspaniale –

2

może chcesz spróbować Open Design Alliance. Minęło trochę czasu, odkąd sam na to patrzyłem, ale mieli mnóstwo bibliotek C do obsługi różnych plików AutoCAD.

+0

Ceny są jednak poważnie strome , zwłaszcza jeśli zamierzasz napisać oprogramowanie, które również biblioteki, a następnie sprzedać. –

2

to łącze do czytnika dxf CodeProject; wydaje się jednak bardzo ograniczony (i niezbyt dobrze zrobiony).

0

Here to kolejny open source czytnik dxf, w Javie. Buggy jednak!

5

Mam kilka lat pracy nad opracowaniem własnego DXf-Viewer in java (można upuścić własny plik DXF lub adres URL w przeglądarce) do rysunków 2D.
Publikowane informacje z AutoCAD są dobrą bazą, ale nie wyjaśniają, jak to działa.
Zostając członkiem Open Design Alliance, zyskasz możliwość konwersji kilku formatów CAD na DXF. Może to być dobry pomysł, jeśli tworzysz produkt komercyjny.
Istnieje niemiecka książka (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) o DXF, która naprawdę wyjaśnia ten format. Jest drogi, ale może zaoszczędzić dni wyszukiwania.
Kolory w formacie DXF są indeksowane, musisz mieć konwerter z ACI na RGB. Zachowaj ostrożność przy wartościach 0 i 1, które mają specjalne znaczenie.

Pozdrawiam.

0

Pisałem jakiś kod C# do odczytu punktów/linii/łuku jest z wszystkimi wersjami ASCII DXF dostępnych w tej chwili z tym samym kodem
Można dodać więcej przedmiotów bij prostu dodając więcej podprogramów z poprawną nazwą
(zajrzyj do DXF).

Co robi:

  1. Wysyłasz cały plik zaimportowaniu z czytnika do tej rutynowej
  2. Następnie wyszukuje zablokować podmiotów (to jest, gdy inni geometria jest przechowywany)
  3. Następnie wyszukuje dla obiektu (Punkt/Line/ARC)
    (R12 do R14 zastosowanie POINT/LINE/ARC)
    (R2000 do R2013 używać AcDbPoint/AcDbLine/AcDbArc lub AcDbCircle jeśli zawiera kąty)
  4. Następnie sprawdza nazwę warstwy
  5. Następnie sprawdza, czy kody zmienne są tam
  6. Wtedy można coś zrobić z danymi

    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] 
           } 
          } 
         } 
    
        } 
    } 
    
Powiązane problemy