有没有人知道源代码,理想情况下是C#或类似的源代码,用于读取.DXF文件(由AutoCAD等使用)?如果不是代码,那么表格显示各种代码(元素/块/等)及其含义?
我自己正在写一个读者,并且有死树文档详细说明了这种格式,但我试图避免写例如:从255种ACI颜色到RGB的转换器......谢谢!
答案 0 :(得分:7)
Cadlib我一直在使用几个项目,效果很好。
答案 1 :(得分:5)
我有两年的时间开发自己的DXf-Viewer in java(您可以在查看器上删除自己的DXF文件或URL)用于2D绘图。
AutoCAD发布的信息很好但是没有解释它是如何工作的。
成为开放设计联盟的成员,将为您提供将多种CAD格式转换为DXF的可能性。如果您正在开发商业产品,这可能是个好主意
有一本关于DXF的德语书籍(http://www.crlf.de/Verlag/DXF-intern/DXF-intern.html)真正解释了这种格式。它价格昂贵,但可以节省搜索天数
DXF格式中的颜色已编入索引,您必须具有从ACI到RGB的转换器。注意具有特殊含义的值0和1。
问候。
答案 2 :(得分:4)
幸运的是,AutoCAD在此处发布了DXF格式信息:DXF Formats
答案 3 :(得分:2)
您可能想尝试Open Design Alliance。我自己看了一段时间,但他们有大量的C库来处理各种AutoCAD文件。
答案 4 :(得分:2)
Here是CodeProject dxf阅读器的链接;但它似乎非常有限(并且做得不是特别好)。
答案 5 :(得分:2)
更新以防有人还在寻找...
这是同一个库,只包含两个链接。
https://github.com/haplokuon/netDxf
https://www.nuget.org/packages/netDXF/
答案 6 :(得分:0)
Here是Java中的另一个开源dxf阅读器。然而,越野车!
答案 7 :(得分:0)
我已经编写了一些C#代码来读取目前可用的所有ASCII DXF版本中的点/行/弧,代码相同 您可以添加更多对象bij,只需添加更多具有正确名称的子例程 (看看DXF内部)。
它的作用:
然后你可以对数据做些什么
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]
}
}
}
}
}