【问题标题】:Reading coordinates from dxf file c#从dxf文件c#中读取坐标
【发布时间】:2016-12-14 03:00:02
【问题描述】:

我正在用 c# 编写代码以从 dxf 文件中读取点坐标。我基本上是逐行读取 dxf 文件并检查像if( i == "AcdbLine") 这样的条件,将点的坐标写入文件。

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)。

我现在的问题是在 block 中找到 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

抱歉代码太长,感谢您的帮助!

【问题讨论】:

    标签: c# dxf


    【解决方案1】:

    我编写文本解析器已有 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; }
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2016-08-22
    • 2020-03-04
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多