天天看點

使用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事件。

//Read and view CAD file 讀和顯示CAD檔案
        private Matrix4D modelTransform = Matrix4D.Identity;
        private GDIGraphics3D gdiGraphics3D;
        private DxfModel model;//定義DxfModel對象
        private Bounds3D bounds;
        private string filename;

        //計算GDIGraphics3D的屬性To2DTransform
        private void CalculateTo2DTransform()
        {
            if (bounds != null)
            {
                //計算将CAD檔案放入顯示矩陣中需要的縮放比例變換
                Matrix4D to2DTransform = DxfUtil.GetScaleTransform(
                    bounds.Corner1,
                    bounds.Corner2,
                    bounds.Center,
                    new Point3D(0d, this.xtraTabPage3.Height, 0d),
                    new Point3D(this.xtraTabPage3.Width, 0d, 0d),
                    new Point3D(this.xtraTabPage3.Width / 2, this.xtraTabPage3.Height / 2, 0d)
                );
                gdiGraphics3D.To2DTransform = to2DTransform * modelTransform;
            }
        }

        //打開CAD檔案
        private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            //選取要打開的CAD檔案
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "AutoCad files (*.dwg, *.dxf)|*.dxf;*.dwg";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                filename = dialog.FileName;
            }
            if (!string.IsNullOrEmpty(filename))
            {
                try
                {
                    //通過檔案擴充名判斷CAD檔案是dwg格式還是dxf格式
                    string extension = Path.GetExtension(filename);
                    if (string.Compare(extension, ".dwg", true) == 0)
                        model = DwgReader.Read(filename);
                    else
                        model = DxfReader.Read(filename);

                    //将控件的标簽添加上檔案名
                    this.xtraTabPage3.Text = "二維仿真(" + Path.GetFileName(filename) + ")";
                    //設定控件背景為黑色
                    this.xtraTabPage3.BackColor = System.Drawing.Color.Black;

                    //使用GDIGraphics3D繪制CAD檔案的方法
                    //建立中間可繪制對象
                    gdiGraphics3D.CreateDrawables(model);
                    //獲得bounding box
                    bounds = new Bounds3D();
                    gdiGraphics3D.BoundingBox(bounds, modelTransform);
                    //計算GDIGraphics3D的屬性To2DTransform
                    CalculateTo2DTransform();
                    //響應控件的Paint事件,畫CAD檔案

                }
                catch (Exception ex)
                {
                    MessageBox.Show("檔案有錯!請用AutoCad打開,通過“檔案-核查”嘗試修複。錯誤資訊:" + ex.Message);
                }
            }

        }

        //xtraTabPage3控件的Paint事件,畫CAD檔案
        private void xtraTabPage3_Paint(object sender, PaintEventArgs e)
        {
            gdiGraphics3D.Draw(e.Graphics, this.xtraTabPage3.ClientRectangle);
        }

        //使繪制的CAD檔案适應螢幕
        private void xtraTabPage3_Resize(object sender, EventArgs e)
        {
            base.OnResize(e);
            CalculateTo2DTransform();
            this.xtraTabPage3.Invalidate();
        }
           



繼續閱讀