2016-12-14 2 views
-2

dxf 파일에서 점 좌표를 읽으려면 C#으로 코드를 작성합니다. 나는 기본적으로 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을 무시하는 것입니다. 나는 AcDbBlockBeginAcDbBlockEnd 블록 안에있을 때 어떤 AcDbline과 그 대응 점도 무시하는 논리를 작성하려고합니다.

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