Подтвердить что ты не робот

Чтение файлов .DXF

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

С уважением.

Ответ 3

К счастью, AutoCAD публикует информацию формата DXF здесь: DXF Formats

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

  • Вы отправляете весь файл, который вы импортировали с помощью читателя в эту процедуру.
  • Затем он ищет блок ENTITIES (это где хранится геометрия)
  • Затем он ищет объект (Point/Line/Arc)
    (R12 до R14 использовать POINT/LINE/ARC)
    (R2000 до R2013 использует AcDbPoint/AcDbLine/AcDbArc или AcDbCircle, если он содержит углы)
  • Затем он проверяет имя слоя
  • Затем он проверяет, существуют ли коды переменных
  • Затем вы можете сделать что-то с данными

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