2009-06-16 3 views
12

Кто-нибудь знает исходный код, в идеале, на C# или аналогичном, для чтения файлов .DXF (как используется AutoCAD и т. Д.)? Если не код, то таблицы, показывающие различные коды (элементы/блоки/и т. Д.) И их значения?Чтение файлов .DXF

Я пишу читателю самостоятельно и имею документацию по мертвому дереву, подробно описывающую формат, но пытаюсь избежать написания, например. конвертер от каждого из 255 цветов ACI до RGB ... Спасибо!

ответ

4

Cadlib от WoutWare Я использовал для нескольких проектов с хорошими результатами.

+1

Мы пошли с этим - цена была правильной, и она хорошо собрала (и правильно прокомментировала!) Библиотеку. –

+0

Использование этого продукта уже более 5 лет. Это замечательно. –

2

Вы можете захотеть попробовать Open Design Alliance. Прошло некоторое время с тех пор, как я сам посмотрел на него, но у них была загрузка библиотек C для работы с различными файлами AutoCAD.

+0

Цена, однако, серьезно крутым , особенно если вы намереваетесь фактически писать программное обеспечение, которое также является библиотекой, а затем продавать ее. –

2

Here - ссылка на читательский код CodeProject dxf; он кажется очень ограниченным (и не особенно хорошо сделанным).

0

Here - это еще один читатель dxf с открытым кодом на Java. Багги однако!

5

У меня есть работа на пару лет при разработке моего собственного DXf-Viewer in java (вы можете удалить свой собственный файл DXF или URL-адрес зрителя) для 2D-чертежей.
Опубликованная информация из AutoCAD является хорошей базой, но не объясняет, как она работает.
Став членом Open Design Alliance, предоставит вам возможность конвертировать несколько форматов САПР в DXF. Это может быть хорошей идеей, если вы разрабатываете коммерческий продукт.
Существует немецкая книга (http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html) о DXF, которая действительно объясняет этот формат. Это дорого, но может спасти дни поиска.
Цвета в формате DXF индексируются, у вас должен быть конвертер от ACI до RGB. Будьте осторожны со значениями 0 и 1, которые имеют особый смысл.

С уважением.

0

Я написал несколько C# код для чтения точек/линий/дуг из всех версий ASCII DXF, доступных в данный момент с тем же кодом
Вы можете добавить больше объектов BIJ просто добавить больше подпрограмм с правильным названием
(загляните внутрь DXF).

Что он делает:

  1. Вы отправляете весь файл вы импортированный с читателем в этом рутинной
  2. Затем он ищет ПРИМИТИВЫ блока (это где аи геометрии хранится)
  3. Затем он ищет объект (точка/линия/Arc)
    (R12 до R14 использования POINT/LINE/ARC)
    (R2000 до R2013 использовать AcDbPoint/AcDbLine/AcDbArc или AcDbCircle, если он содержит углы)
  4. Затем он проверяет имя слоя
  5. Затем он проверяет, является ли переменные коды есть
  6. Затем вы можете сделать что-то с данными

    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] 
           } 
          } 
         } 
    
        } 
    }