2016-12-14 22 views
-2

Я пишу код в C# для чтения координат точки из файла dxf. Я в основном читаю строку за строкой файла dxf и проверяю состояние, например if(i == "AcdbLine"), записывая координаты точки в файл.Чтение координат из файла dxf C#

AcDbLine 
10 
0.0 
20 
0.0 
30 
0.0 
11 
700.0 
21 
0.0 
31 
0.0 
    0 
LINE 

Это записывает координаты как (0,0,0) (700,0,0).

Моя проблема прямо сейчас заключается в том, чтобы игнорировать AcDbLine, когда она находится в пределах , блок. Я хочу написать логику, которая игнорирует любые AcDbline и соответствующие ей точки, когда она попадает в блок AcDbBlockBegin и AcDbBlockEnd.

AcDbBlockBegin 
    2 
*U1 
70 
    1 
10 
0.0 
20 
0.0 
30 
0.0 
    3 
*U1 
    1 

    0 
LINE 
    5 
3F0 
330 
3E9 
100 
AcDbEntity 
    8 
0 
100 
AcDbLine 
10 
-47.22702216883923 
20 
-0.0131059296418084 
30 
0.0 
11 
-19.82207380431916 
21 
-0.0131059296418084 
31 
0.0 
    0 
LINE 
    5 
3F1 
330 
3E9 
100 
AcDbEntity 
    8 
0 
100 
AcDbLine 
10 
22.19765948514734 
20 
0.0131059296418101 
30 
0.0 
11 
47.22702216883923 
21 
0.0131059296418101 
31 
0.0 
    0 
ENDBLK 
    5 
3EB 
330 
3E9 
100 
AcDbEntity 
    8 
0 
100 
AcDbBlockEnd 

Извините за длинный код и благодарит за вашу помощь!

ответ

0

Я пишу текстовый парсер более 40 лет. Если я не могу этого сделать, никто не сможет. Попробуйте код ниже

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     enum State 
     { 
      FIND_BLOCK, 
      GET_ACDB_LINE, 
      ACD_BLOCK 
     } 
     const string FILENAME = @"c:\temp\test.txt"; 
     static void Main(string[] args) 
     { 
      StreamReader reader = new StreamReader(FILENAME); 
      string inputLine = ""; 
      State state = State.FIND_BLOCK; 
      int lineRow = 0; 
      Line newLine = new Line(); 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       inputLine = inputLine.Trim(); 
       if (inputLine.Length > 0) 
       { 
        switch (state) 
        { 
         case State.FIND_BLOCK : 
          switch (inputLine) 
          { 
           case "AcDbBlockBegin" : 
            state = State.ACD_BLOCK; 
            break; 
           case "AcDbLine": 
            state = State.GET_ACDB_LINE; 
            lineRow = 0; 
            newLine = new Line(); 
            Line.lines.Add(newLine); 
            break; 
          } 
          break; 

         case State.ACD_BLOCK : 
          if (inputLine == "AcDbBlockEnd") 
          { 
           state = State.FIND_BLOCK; 
          } 
          break; 

         case State.GET_ACDB_LINE : 
          if (inputLine == "LINE") 
          { 
           state = State.FIND_BLOCK; 
          } 
          else 
          { 
           switch (++lineRow) 
           { 
            case 2: 
             newLine.xLoc = double.Parse(inputLine); 
             break; 
            case 4: 
             newLine.yLoc = double.Parse(inputLine); 
             break; 
            case 6: 
             newLine.zLoc = double.Parse(inputLine); 
             break; 
            case 8: 
             newLine.xVal = double.Parse(inputLine); 
             break; 
            case 10: 
             newLine.yVal = double.Parse(inputLine); 
             break; 
            case 12: 
             newLine.zVal = double.Parse(inputLine); 
             break; 
           } 
          } 
          break; 
        } 
       } 
      } 

     } 
     public class Line 
     { 
      public static List<Line> lines = new List<Line>(); 
      public double xLoc { get; set; } 
      public double xVal { get; set; } 
      public double yLoc { get; set; } 
      public double yVal { get; set; } 
      public double zLoc { get; set; } 
      public double zVal { get; set; } 
     } 
    } 
}