明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10042|回复: 7

完美解决窗体中预览DWG图形(C#版)

[复制链接]
发表于 2006-8-25 10:42:00 | 显示全部楼层 |阅读模式

看到完美解决VB.NET窗体中预览DWG图形帖子后,用C#代码

实现如下:

原文在:dispbbs.asp?boardid=33&star=1&replyid=29619&id=50583&skin=0&page=1

    class ViewDWG
    {
        struct BITMAPFILEHEADER
        {
            public short bfType;
            public int bfSize;
            public short bfReserved1;
            public short bfReserved2;
            public int bfOffBits;
        }
        public static 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);
            }
        }
    }

发表于 2006-8-26 22:24:00 | 显示全部楼层
楼上的真是人才呀!以后多多努力。呵……
发表于 2006-8-30 14:40:00 | 显示全部楼层

我用上面的代码试了一下,可以看到DWG图,但是

怎么只显示很小一部分呀!

我的文件有4M左右大小,这段代码只显示了左上部一角的图形,大概只有总图的1/6 .

请问这是为什么?

我跟踪了一下程序,并以十六进制打开DWG文件,程序读到的图形数据是正确的!

但就是没有全部显示,

请知道的帮助一下,谢谢

发表于 2007-9-21 15:23:00 | 显示全部楼层
通过什么来实现缩放比例,获得CAD坐标?
发表于 2008-7-31 15:23:00 | 显示全部楼层
关注!!!!
发表于 2009-5-5 11:54:00 | 显示全部楼层
我怎么实现不了啊?
发表于 2009-5-5 13:35:00 | 显示全部楼层
我也实现 不了,我用的是autocad2008?还请高手指点
发表于 2020-11-17 10:21:17 | 显示全部楼层
对于后台保存的文件,如果没打开过重新保存,就无法转图,请问楼主这个怎么解决?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:29 , Processed in 0.203842 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表