1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python读取cad图纸_DWG文件信息的读取

python读取cad图纸_DWG文件信息的读取

时间:2024-05-05 13:14:29

相关推荐

python读取cad图纸_DWG文件信息的读取

在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上浏览。

using System;

using System.Collections.Generic;

using ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace 浏览dwg

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

ViewDWG viewDwg = new ViewDWG();

pictureBox1.Image = viewDwg.GetDwgImage("c:\\1.dwg");

}

class ViewDWG

{

struct BITMAPFILEHEADER

{

public short bfType;

public int bfSize;

public short bfReserved1;

public short bfReserved2;

public int bfOffBits;

}

public Image GetDwgImage(string FileName)

{

if (!(File.Exists(FileName)))

{

throw new FileNotFoundException("文件没有被找到");

}

FileStream DwgF; //文件流

int PosSentinel; //文件描述块的位置

BinaryReader br; //读取二进制文件

int TypePreview; //缩略图格式

int PosBMP; //缩略图位置

int LenBMP; //缩略图大小

short biBitCount; //缩略图比特深度

BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去

byte[] BMPInfo; //包含在DWG文件中的BMP文件体

MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流

BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类

Image myImg = null;

try

{

DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流

br = new BinaryReader(DwgF);

DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取

PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置

DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节

TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式

if (TypePreview == 1)

{

}

else if (TypePreview == 2 || TypePreview == 3)

{

PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置

LenBMP = br.ReadInt32(); //位图的大小

DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块

biBitCount = br.ReadInt16(); //读取比特深度

DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用

BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息

br.Close();

DwgF.Close();

biH.bfType = 19778; //建立位图文件头

if (biBitCount < 9)

{

biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;

}

else

{

biH.bfSize = 54 + LenBMP;

}

biH.bfReserved1 = 0; //保留字节

biH.bfReserved2 = 0; //保留字节

biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移

//以下开始写入位图文件头

bmpr.Write(biH.bfType); //文件类型

bmpr.Write(biH.bfSize); //文件大小

bmpr.Write(biH.bfReserved1); //0

bmpr.Write(biH.bfReserved2); //0

bmpr.Write(biH.bfOffBits); //图像数据偏移

bmpr.Write(BMPInfo); //写入位图

BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处

myImg = Image.FromStream(BMPF); //创建位图文件对象

bmpr.Close();

BMPF.Close();

}

return myImg;

}

catch (Exception ex)

{

throw new Exception(ex.Message);

}

}

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。