mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-04 13:13:25 +03:00
0024699: Visualization - prototype interoperation of TKOpenGl viewer with Direct3D viewer
Add new C# sample which allow to render the OCCT scene to a Direct3D context in a WPF application. DirectX SDK is required in order to build this sample.
This commit is contained in:
695
samples/CSharp/WPF_D3D/MainWindow.xaml.cs
Normal file
695
samples/CSharp/WPF_D3D/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,695 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms.Integration;
|
||||
using System.Windows.Interop;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace IE_WPF_D3D
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window, INotifyPropertyChanged
|
||||
{
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected void RaisePropertyChanged (string thePropertyName)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged (this, new PropertyChangedEventArgs (thePropertyName));
|
||||
}
|
||||
}
|
||||
|
||||
public MainWindow ()
|
||||
{
|
||||
InitializeComponent ();
|
||||
|
||||
StatusBarText = String.Empty;
|
||||
IsHlrOffPushed = false;
|
||||
IsHlrOnPushed = true;
|
||||
IsZoomWinEnabled = true;
|
||||
|
||||
#region menu operations
|
||||
|
||||
CommandBinding aBind_New = new CommandBinding (IECommands.New);
|
||||
aBind_New.Executed += NewCommand_Executed;
|
||||
CommandBindings.Add (aBind_New);
|
||||
|
||||
CommandBinding aBind_Close = new CommandBinding (IECommands.Close);
|
||||
aBind_Close.Executed += CloseCommand_Executed;
|
||||
aBind_Close.CanExecute += CloseCommand_CanExecute;
|
||||
CommandBindings.Add (aBind_Close);
|
||||
|
||||
CommandBinding aBind_Quit = new CommandBinding (IECommands.Quit);
|
||||
aBind_Quit.Executed += QuitCommand_Executed;
|
||||
CommandBindings.Add (aBind_Quit);
|
||||
|
||||
CommandBinding aBind_About = new CommandBinding (IECommands.About);
|
||||
aBind_About.Executed += AboutCommand_Executed;
|
||||
CommandBindings.Add (aBind_About);
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
private String myStatusBarText;
|
||||
public String StatusBarText
|
||||
{
|
||||
get
|
||||
{
|
||||
return myStatusBarText;
|
||||
}
|
||||
private set
|
||||
{
|
||||
myStatusBarText = value;
|
||||
RaisePropertyChanged ("StatusBarText");
|
||||
}
|
||||
}
|
||||
|
||||
private bool isHlrOffPushed;
|
||||
public Boolean IsHlrOffPushed
|
||||
{
|
||||
get
|
||||
{
|
||||
return isHlrOffPushed;
|
||||
}
|
||||
set
|
||||
{
|
||||
isHlrOffPushed = value;
|
||||
RaisePropertyChanged ("isHlrOffPushed");
|
||||
}
|
||||
}
|
||||
|
||||
private bool isHlrOnPushed;
|
||||
public Boolean IsHlrOnPushed
|
||||
{
|
||||
get
|
||||
{
|
||||
return isHlrOnPushed;
|
||||
}
|
||||
set
|
||||
{
|
||||
isHlrOnPushed = value;
|
||||
RaisePropertyChanged ("IsHlrOnPushed");
|
||||
}
|
||||
}
|
||||
|
||||
private bool isZoomWinEnabled;
|
||||
public Boolean IsZoomWinEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return isZoomWinEnabled;
|
||||
}
|
||||
set
|
||||
{
|
||||
isZoomWinEnabled = value;
|
||||
RaisePropertyChanged ("IsZoomWinEnabled");
|
||||
}
|
||||
}
|
||||
|
||||
private OCCViewer ActiveViewer
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!IsDocumentOpen)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return Map[aGrid].Viewer;
|
||||
}
|
||||
}
|
||||
|
||||
public Boolean IsDocumentOpen
|
||||
{
|
||||
get
|
||||
{
|
||||
return ViewPanel.Items.Count > 0;
|
||||
}
|
||||
}
|
||||
|
||||
private int myDocumentCounter = 1;
|
||||
|
||||
Dictionary<Grid, D3DViewer> Map = new Dictionary<Grid, D3DViewer> ();
|
||||
|
||||
private void NewCommand_Executed (object sender, ExecutedRoutedEventArgs e)
|
||||
{
|
||||
D3DViewer aViwer = new D3DViewer ();
|
||||
|
||||
Grid g = new Grid ();
|
||||
|
||||
Map.Add (g, aViwer);
|
||||
|
||||
ImageBrush anImage = new ImageBrush (aViwer.Image);
|
||||
|
||||
anImage.RelativeTransform = new ScaleTransform (1.0, -1.0, 0.5, 0.5);
|
||||
|
||||
g.Background = anImage;
|
||||
g.MouseMove += new MouseEventHandler (g_MouseMove);
|
||||
g.MouseDown += new MouseButtonEventHandler (g_MouseDown);
|
||||
g.MouseUp += new MouseButtonEventHandler (g_MouseUp);
|
||||
|
||||
g.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
|
||||
|
||||
|
||||
TabItem aNewTab = new TabItem ();
|
||||
aNewTab.Content = g;
|
||||
|
||||
aNewTab.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
|
||||
aNewTab.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch;
|
||||
aNewTab.VerticalContentAlignment = System.Windows.VerticalAlignment.Stretch;
|
||||
|
||||
g.SizeChanged += new SizeChangedEventHandler (g_SizeChanged);
|
||||
|
||||
aNewTab.IsSelected = true;
|
||||
aNewTab.Header = "Document " + myDocumentCounter.ToString ();
|
||||
myDocumentCounter++;
|
||||
|
||||
ViewPanel.Items.Add (aNewTab);
|
||||
|
||||
ViewPanel.Focus ();
|
||||
|
||||
// update XAML property
|
||||
RaisePropertyChanged ("IsDocumentOpen");
|
||||
}
|
||||
|
||||
void g_SizeChanged (object sender, SizeChangedEventArgs e)
|
||||
{
|
||||
if (!IsDocumentOpen)
|
||||
return;
|
||||
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid == null)
|
||||
return;
|
||||
|
||||
Map[aGrid].Resize (Convert.ToInt32 (e.NewSize.Width),
|
||||
Convert.ToInt32 (e.NewSize.Height));
|
||||
}
|
||||
|
||||
void g_MouseUp (object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid != null)
|
||||
{
|
||||
ActiveViewer.OnMouseUp(aGrid, e);
|
||||
}
|
||||
}
|
||||
|
||||
void g_MouseDown (object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid != null)
|
||||
{
|
||||
ActiveViewer.OnMouseDown(ViewPanel, e);
|
||||
}
|
||||
}
|
||||
|
||||
void g_MouseMove (object sender, MouseEventArgs e)
|
||||
{
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid != null)
|
||||
{
|
||||
ActiveViewer.OnMouseMove (aGrid, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void CloseCommand_Executed (object sender, ExecutedRoutedEventArgs e)
|
||||
{
|
||||
if (ViewPanel.Items.Count > 0)
|
||||
{
|
||||
Grid aGrid = (ViewPanel.SelectedContent) as Grid;
|
||||
|
||||
if (aGrid == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Map[aGrid].StopRenderingScene ();
|
||||
|
||||
ViewPanel.Items.Remove (ViewPanel.SelectedItem);
|
||||
}
|
||||
|
||||
// update XAML property
|
||||
RaisePropertyChanged ("IsDocumentOpen");
|
||||
}
|
||||
|
||||
private void CloseCommand_CanExecute (object sender, CanExecuteRoutedEventArgs e)
|
||||
{
|
||||
e.CanExecute = IsDocumentOpen;
|
||||
}
|
||||
|
||||
private void QuitCommand_Executed (object sender, ExecutedRoutedEventArgs e)
|
||||
{
|
||||
this.Close ();
|
||||
}
|
||||
|
||||
private void ImportBRep_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ImportModel (ModelFormat.BREP);
|
||||
}
|
||||
}
|
||||
|
||||
private void ImportIges_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ImportModel (ModelFormat.IGES);
|
||||
}
|
||||
}
|
||||
|
||||
private void ImportStep_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ImportModel (ModelFormat.STEP);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportBRep_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.BREP);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportStep_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.STEP);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportIges_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.IGES);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportStl_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.STL);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportVrml_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.VRML);
|
||||
}
|
||||
}
|
||||
|
||||
private void ExportImage_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.ExportModel (ModelFormat.IMAGE);
|
||||
}
|
||||
}
|
||||
|
||||
private void FitAllBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.FitAll ();
|
||||
}
|
||||
}
|
||||
|
||||
private void ZoomWindowBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
IsZoomWinEnabled = false;
|
||||
ActiveViewer.ZoomWindow ();
|
||||
}
|
||||
}
|
||||
|
||||
private void DynamicZoomingBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.DynamicZooming ();
|
||||
}
|
||||
}
|
||||
|
||||
private void DynamicPanningBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.DynamicPanning ();
|
||||
}
|
||||
}
|
||||
|
||||
private void GlobalPanningBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.GlobalPanning ();
|
||||
}
|
||||
}
|
||||
|
||||
private void FrontBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.FrontView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void BackBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.BackView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void TopBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.TopView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void BottomBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.BottomView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void LeftBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.LeftView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void RightBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.RightView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void AxoBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.AxoView ();
|
||||
}
|
||||
}
|
||||
|
||||
private void ResetBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Reset ();
|
||||
}
|
||||
}
|
||||
|
||||
private void DynamicRotationBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.DynamicRotation ();
|
||||
}
|
||||
}
|
||||
|
||||
private void HiddenOffBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
IsHlrOffPushed = true;
|
||||
IsHlrOnPushed = false;
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.HiddenOff ();
|
||||
}
|
||||
}
|
||||
|
||||
private void HiddenOnBtn_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
IsHlrOffPushed = false;
|
||||
IsHlrOnPushed = true;
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.HiddenOn ();
|
||||
}
|
||||
}
|
||||
|
||||
private void AboutCommand_Executed (object sender, ExecutedRoutedEventArgs e)
|
||||
{
|
||||
AboutDialog aDlg = new AboutDialog ();
|
||||
aDlg.ShowDialog ();
|
||||
}
|
||||
|
||||
private void ToolBar_MouseEnter (object sender, MouseEventArgs e)
|
||||
{
|
||||
StatusBarText = "Toolbar";
|
||||
}
|
||||
|
||||
private void DocumentToolBar_MouseEnter (object sender, MouseEventArgs e)
|
||||
{
|
||||
StatusBarText = "Document toolbar";
|
||||
}
|
||||
|
||||
private void ViewToolBar_MouseEnter (object sender, MouseEventArgs e)
|
||||
{
|
||||
StatusBarText = "View toolbar";
|
||||
}
|
||||
|
||||
private void ToolBar_MouseLeave (object sender, MouseEventArgs e)
|
||||
{
|
||||
StatusBarText = "";
|
||||
}
|
||||
|
||||
public void OnZoomingFinished (object sender, EventArgs e)
|
||||
{
|
||||
IsZoomWinEnabled = true;
|
||||
}
|
||||
|
||||
public bool IsWireframeEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsWireframeEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Wireframe_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Wireframe ();
|
||||
}
|
||||
}
|
||||
|
||||
private void Shading_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Shading ();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsShadingEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsShadingEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Color_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Color ();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsColorEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsColorEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Material_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Material ();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsMaterialEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsMaterialEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Transparency_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Transparency ();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsTransparencyEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsTransparencyEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Delete_Click (object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Delete ();
|
||||
}
|
||||
}
|
||||
|
||||
private void Background_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
ActiveViewer.Background();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsDeleteEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ActiveViewer != null)
|
||||
{
|
||||
return ActiveViewer.IsDeleteEnabled;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void AvaliabiltyOfOperationToolbarChanged ()
|
||||
{
|
||||
RaisePropertyChanged ("IsWireframeEnabled");
|
||||
RaisePropertyChanged ("IsShadingEnabled");
|
||||
RaisePropertyChanged ("IsTransparencyEnabled");
|
||||
RaisePropertyChanged ("IsColorEnabled");
|
||||
RaisePropertyChanged ("IsMaterialEnabled");
|
||||
RaisePropertyChanged ("IsDeleteEnabled");
|
||||
}
|
||||
|
||||
public void OnAvaliabiltyOfOperationsChanged (object sender, EventArgs e)
|
||||
{
|
||||
AvaliabiltyOfOperationToolbarChanged ();
|
||||
}
|
||||
|
||||
private void OnViewerChanged (object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (e.RemovedItems.Count > 0)
|
||||
{
|
||||
Grid aHost = ((e.RemovedItems[0] as TabItem).Content) as Grid;
|
||||
if (aHost == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
OCCViewer aViewer = Map[aHost].Viewer;
|
||||
if (aViewer != null)
|
||||
{
|
||||
aViewer.ZoomingFinished -= new EventHandler (OnZoomingFinished);
|
||||
aViewer.AvaliabiltyOfOperationsChanged -= new EventHandler (OnAvaliabiltyOfOperationsChanged);
|
||||
}
|
||||
}
|
||||
|
||||
if (e.AddedItems.Count > 0)
|
||||
{
|
||||
Grid aHost = ((e.AddedItems[0] as TabItem).Content) as Grid;
|
||||
if (aHost == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
OCCViewer aViewer = Map[aHost].Viewer;
|
||||
if (aViewer != null)
|
||||
{
|
||||
aViewer.ZoomingFinished += new EventHandler (OnZoomingFinished);
|
||||
aViewer.AvaliabiltyOfOperationsChanged += new EventHandler (OnAvaliabiltyOfOperationsChanged);
|
||||
}
|
||||
}
|
||||
|
||||
AvaliabiltyOfOperationToolbarChanged ();
|
||||
}
|
||||
|
||||
private void OnContextOpened(object sender, RoutedEventArgs e)
|
||||
{
|
||||
this.WireframeItem.IsEnabled = IsWireframeEnabled;
|
||||
this.ShadingItem.IsEnabled = IsShadingEnabled;
|
||||
this.ColorItem.IsEnabled = IsColorEnabled;
|
||||
this.MaterialItem.IsEnabled = IsMaterialEnabled;
|
||||
this.TransparencyItem.IsEnabled = IsTransparencyEnabled;
|
||||
this.DeleteItem.IsEnabled = IsDeleteEnabled;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user