zoukankan      html  css  js  c++  java
  • c# CAD文件读取

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


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    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);
                    }
                }
            }


        }
    }

  • 相关阅读:
    Android Touch事件相关源码【Android SourceCode 2.3.6】
    使用方式比较优雅的代码集合
    Android系统中是否开启定位及定位模式的判断
    Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究
    删除rz上传失败乱码的文件
    linux mysql 操作命令
    linux下端口被占用
    linux环境搭建记录
    ibatis 批量插入数据
    jQuery id模糊 选择器 批量处理
  • 原文地址:https://www.cnblogs.com/skyay/p/14720967.html
Copyright © 2011-2022 走看看