在c#中读取.DXF / .DWG文件[关闭]

问题描述 投票:1回答:3

我想读一个.dxf文件。我正在使用c#库来阅读。它读取文件,但无法写入所有图层。

我想从中获取所有图层列表并编写它。

c# asp.net autocad
3个回答
2
投票

你真的不需要一个库。 DXF是ASCII格式,每个DXF代码有一行文本,后面紧跟一个值。

所有实体都使用DXF代码8引用Layer,因此您可以使用'^ 8 [\ r \ n] *([_ a-zA-Z0-9 - ] +)$'进行正则表达式搜索并获取名字。此方法适用于部分DXF和较旧的R12 DXF文件。这也将为您提供真正使用的图层,就像您首先清除图形一样。

您还可以使用图层表标题来读取图层名称。这有点困难,因为你需要找到那个部分,但是在同一个主体上,你搜索代码0 - LAYER,然后下面的代码2将给你层名。


1
投票

我看这个library。你有public DXFTable layers所有层。阅读DXFImport.cs的文档和外观结构


0
投票

我已经编写了一些代码,用相同的代码从目前可用的所有ASCII DXF版本中读取点/线/弧 您可以添加更多对象bij,只需添加更多具有正确名称的子例程 (看看DXF内部)。

它能做什么:

  1. 您将使用阅读器导入的整个文件发送到此例程
  2. 然后它搜索ENTITIES块(这是几何存储的位置)
  3. 然后它搜索对象(点/线/弧) (R12至R14使用POINT / LINE / ARC) (R2000至R2013使用AcDbPoint / AcDbLine / AcDbArc或AcDbCircle,如果它包含角度)
  4. 然后它检查图层名称
  5. 然后它检查变量代码是否存在
  6. 然后你可以对数据做些什么 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] } } } } }
© www.soinside.com 2019 - 2024. All rights reserved.