Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Я работаю пару лет над разработкой собственного DXf-Viewer в 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, которые имеют особое значение.

С уважением.

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

Обновление, если кто-то все еще ищет ...
Это та же библиотека, просто включающая обе ссылки.

https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/

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

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

Здесь - еще одно приложение для чтения dxf с открытым исходным кодом на Java. Глючит однако!

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

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

<Ол>
  • Вы отправляете весь файл, который вы импортировали с помощью программы чтения, в эту процедуру
  • Затем он ищет блок ENTITIES (здесь хранится вся геометрия)
  • Затем выполняется поиск объекта (точка / линия / дуга)
    (От 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]
                    }
                }
            }
    
        }
    }
    
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top