Teigha4.0加載顯示Dwg文件
網上顯示Dwg的例子不是很好找,最好還是去官網下載例子。
這裏的demo大抵參考官網例子完成的。
初始化驅動
在窗體加載事件裏面初始化顯示驅動,代碼怎麼看都很奇怪,但人家就是這種寫法
需要注意的是加載模塊的名稱,官網例子是WinOpenGL.txv、3.0版本的是WinGDI.gs、這裏加載WinBitmap.txv模塊,這幾個到底啥含義沒有去深究。
PaintGraphics = Graphics.FromHwnd(panel.Handle);
GsModule gsModule = (GsModule)SystemObjects.DynamicLinker.LoadModule("WinBitmap.txv", false, true);
Device = gsModule.CreateDevice();
Device.Properties.AtPut("WindowHWND", new RxVariant(panel.Handle));
Device.Properties.AtPut("WindowHDC", new RxVariant(PaintGraphics.GetHdc()));
Device.Properties.AtPut("DoubleBufferEnabled", new RxVariant(true));
Device.Properties.AtPut("EnableSoftwareHLR", new RxVariant(true));
panel.Resize += Panel_Resize;
加載數據顯示
首先打開數據源->創建數據上下文->初始化佈局->設置數據顯示範圍
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.RestoreDirectory = true;
openFileDialog.Filter = "DWG文件(*.dwg)|**.dwg";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
DwgDatabase = new Database(false, false);
DwgDatabase.ReadDwgFile(openFileDialog.FileName, FileOpenMode.OpenForReadAndReadShare, false, "");
ContextForDbDatabase contextForDbDatabase = new ContextForDbDatabase(DwgDatabase);
contextForDbDatabase.UseGsModel = true;
LayoutHelper = LayoutHelperDevice.SetupActiveLayoutViews(Device, contextForDbDatabase);
LayoutHelper.UserGiContext = contextForDbDatabase;
LayoutHelper.SetLogicalPalette(Device.DarkPalette);
Rectangle rectangle = panel.Bounds;
rectangle.Offset(-panel.Location.X, -panel.Location.Y);
LayoutHelper.OnSize(rectangle);
panel.Invalidate();
}
釋放資源
在窗體關閉時需要釋放相關的對象實例
if (DwgDatabase != null)
{
DwgDatabase.Dispose();
Device.Dispose();
LayoutHelper.Dispose();
PaintGraphics.Dispose();
}
全部代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Teigha.DatabaseServices;
using Teigha.GraphicsInterface;
using Teigha.GraphicsSystem;
using Teigha.Runtime;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Database DwgDatabase { get; set; }
public Device Device { get; set; }
public LayoutHelperDevice LayoutHelper { get; set; }
public Graphics PaintGraphics { get; set; }
private void Form1_Load(object sender, EventArgs e)
{
CreateDevice();
}
private void panel_Paint(object sender, PaintEventArgs e)
{
if (LayoutHelper == null)
{
return;
}
LayoutHelper.Update();
}
private void Panel_Resize(object sender, EventArgs e)
{
if (LayoutHelper == null)
{
return;
}
Rectangle rectangle = panel.Bounds;
rectangle.Offset(-panel.Location.X, -panel.Location.Y);
LayoutHelper.OnSize(rectangle);
}
private void 打開ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.RestoreDirectory = true;
openFileDialog.Filter = "DWG文件(*.dwg)|**.dwg";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
DwgDatabase = new Database(false, false);
DwgDatabase.ReadDwgFile(openFileDialog.FileName, FileOpenMode.OpenForReadAndReadShare, false, "");
CreateLayout();
}
}
private void CreateDevice()
{
PaintGraphics = Graphics.FromHwnd(panel.Handle);
GsModule gsModule = (GsModule)SystemObjects.DynamicLinker.LoadModule("WinBitmap.txv", false, true);
Device = gsModule.CreateDevice();
Device.Properties.AtPut("WindowHWND", new RxVariant(panel.Handle));
Device.Properties.AtPut("WindowHDC", new RxVariant(PaintGraphics.GetHdc()));
Device.Properties.AtPut("DoubleBufferEnabled", new RxVariant(true));
Device.Properties.AtPut("EnableSoftwareHLR", new RxVariant(true));
panel.Resize += Panel_Resize;
}
private void CreateLayout()
{
ContextForDbDatabase contextForDbDatabase = new ContextForDbDatabase(DwgDatabase);
contextForDbDatabase.UseGsModel = true;
LayoutHelper = LayoutHelperDevice.SetupActiveLayoutViews(Device, contextForDbDatabase);
LayoutHelper.UserGiContext = contextForDbDatabase;
LayoutHelper.SetLogicalPalette(Device.DarkPalette);
Rectangle rectangle = panel.Bounds;
rectangle.Offset(-panel.Location.X, -panel.Location.Y);
LayoutHelper.OnSize(rectangle);
panel.Invalidate();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (DwgDatabase != null)
{
DwgDatabase.Dispose();
Device.Dispose();
LayoutHelper.Dispose();
PaintGraphics.Dispose();
}
}
}
}