Чтение файлов .DXF [закрыто]

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

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

 DaveInCaz05 мар. 2019 г., 19:47
Также дубликат:stackoverflow.com/questions/169390/…

Ответы на вопрос(8)

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, которые имеют особое значение.

С уважением.

Решение Вопроса

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

 Joel in Gö11 февр. 2011 г., 17:53
Мы пошли с этим - цена была правильной, и это хорошо составленная (и правильно прокомментированная!) Библиотека.
 18 мар. 2019 г., 19:14
А теперь с NET-Core, он также работает на Linux и Mac! Полностью удалось! Никаких родных двоичных файлов не требуется!
 06 дек. 2017 г., 19:47
Пользуюсь этим продуктом уже более 5 лет. Это здорово


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

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

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

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

 Joel in Gö11 февр. 2011 г., 17:53
Цены, однако, серьезно завышены, особенно если вы намереваетесь написать программное обеспечение, которое также является библиотекой, а затем продать его.

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

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

You send the the whole file you've imported with a reader to this routine Then it searches for the ENTITIES block (this is where al the geometry is stored) Then it searches for the object(Point/Line/Arc)
(R12 till R14 use POINT / LINE/ ARC)
(R2000 till R2013 use AcDbPoint / AcDbLine / AcDbArc or AcDbCircle if it contains the angles) Then it checks for a layer name Then it checks if the variable codes are there

Then you can do something with the data

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

    }
}

Вот другой читатель с открытым исходным кодом DXF, в Java. Багги однако!

Ваш ответ на вопрос