Чтение файлов .DXF [закрыто]
Вопрос
Кто-нибудь знает исходный код, в идеале на 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).
Что он делает:
<Ол>(От 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]
}
}
}
}
}