随笔 - 833  文章 - 1  评论 - 106  阅读 - 200万

使用CadLib实现CAD(dxf、dwg格式)文件的读取和显示 【转】

    参考文章:CadLib 3.5 documentationhttps://www.woutware.com/doc/cadlib3.5/Index.aspx

       读取:定义DxfModel类型的变量model,使用DxfReader或DwgReader的Read(String)读取dxf或dwg格式的CAD文件filename。

       显示:使用GIDGraphics3D类来显示CAD文件,基本步骤:

                 1、使用CreateDrawables(DxfModel)创建中间可绘制对象(点/线/折线)。

                 2、使用BoundingBox(Bounds3D)方法获取bounding box。

                 3、使用GetScaleTransform(Point3D, Point3D, Point3D, Point3D, Point3D, Point3D)计算将绘图拟合到显示矩形中所需的缩放变换,使用To2Dtransform属性设置结果。(写一个函数CalculateTo2DTransform)

                 4、使用Draw(Graphics, Rectangle)绘制中间可绘制对象。

       注意:需要重写控件的Resize和Paint事件。

 

  1. //Read and view CAD file 读和显示CAD文件  
  2. private Matrix4D modelTransform = Matrix4D.Identity;  
  3. private GDIGraphics3D gdiGraphics3D;  
  4. private DxfModel model;//定义DxfModel对象  
  5. private Bounds3D bounds;  
  6. private string filename;  
  7.   
  8. //计算GDIGraphics3D的属性To2DTransform  
  9. private void CalculateTo2DTransform()  
  10. {  
  11.     if (bounds != null)  
  12.     {  
  13.         //计算将CAD文件放入显示矩阵中需要的缩放比例变换  
  14.         Matrix4D to2DTransform = DxfUtil.GetScaleTransform(  
  15.             bounds.Corner1,  
  16.             bounds.Corner2,  
  17.             bounds.Center,  
  18.             new Point3D(0d, this.xtraTabPage3.Height, 0d),  
  19.             new Point3D(this.xtraTabPage3.Width, 0d, 0d),  
  20.             new Point3D(this.xtraTabPage3.Width / 2, this.xtraTabPage3.Height / 2, 0d)  
  21.         );  
  22.         gdiGraphics3D.To2DTransform = to2DTransform * modelTransform;  
  23.     }  
  24. }  
  25.   
  26. //打开CAD文件  
  27. private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)  
  28. {  
  29.     //选取要打开的CAD文件  
  30.     OpenFileDialog dialog = new OpenFileDialog();  
  31.     dialog.Filter = "AutoCad files (*.dwg, *.dxf)|*.dxf;*.dwg";  
  32.     if (dialog.ShowDialog() == DialogResult.OK)  
  33.     {  
  34.         filename = dialog.FileName;  
  35.     }  
  36.     if (!string.IsNullOrEmpty(filename))  
  37.     {  
  38.         try  
  39.         {  
  40.             //通过文件扩展名判断CAD文件是dwg格式还是dxf格式  
  41.             string extension = Path.GetExtension(filename);  
  42.             if (string.Compare(extension, ".dwg", true) == 0)  
  43.                 model = DwgReader.Read(filename);  
  44.             else  
  45.                 model = DxfReader.Read(filename);  
  46.   
  47.             //将控件的标签添加上文件名  
  48.             this.xtraTabPage3.Text = "二维仿真(" + Path.GetFileName(filename) + ")";  
  49.             //设置控件背景为黑色  
  50.             this.xtraTabPage3.BackColor = System.Drawing.Color.Black;  
  51.   
  52.             //使用GDIGraphics3D绘制CAD文件的方法  
  53.             //创建中间可绘制对象  
  54.             gdiGraphics3D.CreateDrawables(model);  
  55.             //获得bounding box  
  56.             bounds = new Bounds3D();  
  57.             gdiGraphics3D.BoundingBox(bounds, modelTransform);  
  58.             //计算GDIGraphics3D的属性To2DTransform  
  59.             CalculateTo2DTransform();  
  60.             //响应控件的Paint事件,画CAD文件  
  61.   
  62.         }  
  63.         catch (Exception ex)  
  64.         {  
  65.             MessageBox.Show("文件有错!请用AutoCad打开,通过“文件-核查”尝试修复。错误信息:" + ex.Message);  
  66.         }  
  67.     }  
  68.   
  69. }  
  70.   
  71. //xtraTabPage3控件的Paint事件,画CAD文件  
  72. private void xtraTabPage3_Paint(object sender, PaintEventArgs e)  
  73. {  
  74.     gdiGraphics3D.Draw(e.Graphics, this.xtraTabPage3.ClientRectangle);  
  75. }  
  76.   
  77. //使绘制的CAD文件适应屏幕  
  78. private void xtraTabPage3_Resize(object sender, EventArgs e)  
  79. {  
  80.     base.OnResize(e);  
  81.     CalculateTo2DTransform();  
  82.     this.xtraTabPage3.Invalidate();  

http://blog.csdn.net/zjzytnn/article/details/53708655

posted on   3D入魔  阅读(8238)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2010-10-13 vc++实现avi文件的操作 用于视频解析及录制(转)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示