• 使用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

  • 相关阅读:
    c#中开发ActiveX的学习笔记
    [转]李战大师悟透delphi 第七章 组织你的模块
    在网页中实现QQ的屏幕截图功能
    vs.net的调试小技巧之#define debug(适合新手)
    socket中的byte消息格式设计
    [转]李战大师悟透delphi第五章 包
    [转]李战大师悟透delphi 第九章 多层体系结构
    [转]李战大师悟透delphi第一章 delphi的原子世界
    重温delphi之控制台程序:Hello World!
    silverlight中的socket编程注意事项
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/7660782.html
Copyright © 2020-2023  润新知