1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-03 17:56:21 +03:00
occt/samples/CSharp/WPF_D3D/OCCViewer.cs
dln 15534713ba 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.
2014-10-10 15:06:42 +04:00

674 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Input;
using System.Drawing;
namespace IE_WPF_D3D
{
public enum CurrentAction3d
{
CurAction3d_Nothing,
CurAction3d_DynamicZooming,
CurAction3d_WindowZooming,
CurAction3d_DynamicPanning,
CurAction3d_GlobalPanning,
CurAction3d_DynamicRotation
}
public enum CurrentPressedKey
{
CurPressedKey_Nothing,
CurPressedKey_Ctrl,
CurPressedKey_Shift
}
public enum ModelFormat
{
BREP,
CSFDB,
STEP,
IGES,
VRML,
STL,
IMAGE
}
public enum DisplayMode
{
Wireframe,
Shading
}
public class OCCViewer
{
public event EventHandler ZoomingFinished;
protected void RaiseZoomingFinished ()
{
if (ZoomingFinished != null)
{
ZoomingFinished (this, EventArgs.Empty);
}
}
public event EventHandler AvaliabiltyOfOperationsChanged;
protected void RaiseAvaliabiltyOfOperationsChanged ()
{
if (AvaliabiltyOfOperationsChanged != null)
{
AvaliabiltyOfOperationsChanged (this, EventArgs.Empty);
}
}
public OCCTProxyD3D View { get; private set; }
public CurrentAction3d CurrentMode { get; private set; }
private bool IsRectVisible { get; set; }
public bool DegenerateMode { get; private set; }
public bool IsWireframeEnabled { get; private set; }
public bool IsShadingEnabled { get; private set; }
public bool IsTransparencyEnabled { get; private set; }
public bool IsColorEnabled { get; private set; }
public bool IsMaterialEnabled { get; private set; }
public bool IsDeleteEnabled { get; private set; }
private float myCurZoom;// ~ Quantity_Factor
private int myXmin;
private int myYmin;
private int myXmax;
private int myYmax;
private int myButtonDownX;
private int myButtonDownY;
public OCCViewer()
{
View = new OCCTProxyD3D ();
View.InitOCCTProxy ();
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
IsRectVisible = false;
DegenerateMode = true;
}
public bool InitInterop (IntPtr theHWND, IntPtr theD3DDevice)
{
return View.InitViewer (theHWND, theD3DDevice);
}
public void ImportModel (ModelFormat theFormat)
{
int aFormat = 10;
OpenFileDialog anOpenDialog = new OpenFileDialog ();
string aDataDir = ((Environment.GetEnvironmentVariable ("CASROOT")) + "\\..\\data");
string aFilter = "";
switch (theFormat)
{
case ModelFormat.BREP:
anOpenDialog.InitialDirectory = (aDataDir + "\\occ");
aFormat = 0;
aFilter = "BREP Files (*.brep *.rle)|*.brep; *.rle";
break;
case ModelFormat.CSFDB:
aFormat = 1;
aFilter = "CSFDB Files (*.csfdb)|*.csfdb";
break;
case ModelFormat.STEP:
anOpenDialog.InitialDirectory = (aDataDir + "\\step");
aFormat = 2;
aFilter = "STEP Files (*.stp *.step)|*.stp; *.step";
break;
case ModelFormat.IGES:
anOpenDialog.InitialDirectory = (aDataDir + "\\iges");
aFormat = 3;
aFilter = "IGES Files (*.igs *.iges)|*.igs; *.iges";
break;
default:
break;
}
anOpenDialog.Filter = aFilter + "|All files (*.*)|*.*";
if (anOpenDialog.ShowDialog () == DialogResult.OK)
{
string aFileName = anOpenDialog.FileName;
if (aFileName == "")
{
return;
}
if (!View.TranslateModel (aFileName, aFormat, true))
{
MessageBox.Show ("Cann't read this file", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
View.ZoomAllView ();
}
public void ExportModel (ModelFormat theFormat)
{
int aFormat = 10;
SaveFileDialog saveDialog = new SaveFileDialog ();
string aDataDir = ((Environment.GetEnvironmentVariable ("CASROOT")) + "\\..\\data");
string aFilter = "";
switch (theFormat)
{
case ModelFormat.BREP:
saveDialog.InitialDirectory = (aDataDir + "\\occ");
aFormat = 0;
aFilter = "BREP Files (*.brep *.rle)|*.brep; *.rle";
break;
case ModelFormat.CSFDB:
aFormat = 1;
aFilter = "CSFDB Files (*.csfdb)|*.csfdb";
break;
case ModelFormat.STEP:
saveDialog.InitialDirectory = (aDataDir + "\\step");
aFormat = 2;
aFilter = "STEP Files (*.stp *.step)|*.step; *.stp";
break;
case ModelFormat.IGES:
saveDialog.InitialDirectory = (aDataDir + "\\iges");
aFormat = 3;
aFilter = "IGES Files (*.igs *.iges)| *.iges; *.igs";
break;
case ModelFormat.VRML:
saveDialog.InitialDirectory = (aDataDir + "\\vrml");
aFormat = 4;
aFilter = "VRML Files (*.vrml)|*.vrml";
break;
case ModelFormat.STL:
saveDialog.InitialDirectory = (aDataDir + "\\stl");
aFormat = 5;
aFilter = "STL Files (*.stl)|*.stl";
break;
case ModelFormat.IMAGE:
saveDialog.InitialDirectory = (aDataDir + "\\images");
aFormat = 6;
aFilter = "Images Files (*.bmp)|*.bmp";
break;
default:
break;
}
saveDialog.Filter = aFilter;
if (saveDialog.ShowDialog () == DialogResult.OK)
{
string aFileName = saveDialog.FileName;
if (aFileName == "")
{
return;
}
if (!View.TranslateModel (aFileName, aFormat, false))
{
MessageBox.Show ("Can not write this file", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
public void FitAll ()
{
View.ZoomAllView ();
}
public void ZoomWindow ()
{
CurrentMode = CurrentAction3d.CurAction3d_WindowZooming;
}
public void DynamicZooming ()
{
CurrentMode = CurrentAction3d.CurAction3d_DynamicZooming;
}
public void DynamicPanning ()
{
CurrentMode = CurrentAction3d.CurAction3d_DynamicPanning;
}
public void GlobalPanning ()
{
myCurZoom = View.Scale ();
CurrentMode = CurrentAction3d.CurAction3d_GlobalPanning;
}
public void AxoView ()
{
View.AxoView ();
}
public void FrontView ()
{
View.FrontView ();
}
public void TopView ()
{
View.TopView ();
}
public void LeftView ()
{
View.LeftView ();
}
public void BackView ()
{
View.BackView ();
}
public void RightView ()
{
View.RightView ();
}
public void Reset ()
{
View.Reset ();
}
public void BottomView ()
{
View.BottomView ();
}
public void HiddenOff ()
{
View.SetDegenerateModeOff ();
DegenerateMode = false;
}
public void HiddenOn ()
{
View.SetDegenerateModeOn ();
DegenerateMode = true;
}
public void DynamicRotation ()
{
CurrentMode = CurrentAction3d.CurAction3d_DynamicRotation;
}
public void SelectionChanged ()
{
switch (View.DisplayMode ())
{
case -1:
IsShadingEnabled = false;
IsWireframeEnabled = false;
break;
case 0:
IsWireframeEnabled = false;
IsShadingEnabled = true;
IsTransparencyEnabled = false;
break;
case 1:
IsWireframeEnabled = true;
IsShadingEnabled = false;
IsTransparencyEnabled = true;
break;
case 10:
IsWireframeEnabled = true;
IsShadingEnabled = true;
IsTransparencyEnabled = true;
break;
default:
break;
}
if (View.IsObjectSelected ())
{
IsColorEnabled = true;
IsMaterialEnabled = true;
IsDeleteEnabled = true;
}
else
{
IsColorEnabled = false;
IsMaterialEnabled = false;
IsTransparencyEnabled = false;
IsDeleteEnabled = false;
}
RaiseAvaliabiltyOfOperationsChanged ();
}
public void ChangeColor (bool IsObjectColor)
{
int r, g, b;
if (IsObjectColor)
{
r = View.GetObjColR ();
g = View.GetObjColG ();
b = View.GetObjColB ();
}
else
{
r = View.GetBGColR ();
g = View.GetBGColG ();
b = View.GetBGColB ();
}
System.Windows.Forms.ColorDialog ColDlg = new System.Windows.Forms.ColorDialog ();
ColDlg.Color = System.Drawing.Color.FromArgb (r, g, b);
if (ColDlg.ShowDialog () == System.Windows.Forms.DialogResult.OK)
{
System.Drawing.Color c = ColDlg.Color;
r = c.R;
g = c.G;
b = c.B;
if (IsObjectColor)
{
View.SetColor (r, g, b);
}
else
{
View.SetBackgroundColor (r, g, b);
}
}
View.UpdateCurrentViewer ();
}
public void Wireframe ()
{
View.SetDisplayMode ((int)DisplayMode.Wireframe);
View.UpdateCurrentViewer ();
SelectionChanged ();
RaiseZoomingFinished ();
}
public void Shading ()
{
View.SetDisplayMode ((int)DisplayMode.Shading);
View.UpdateCurrentViewer ();
SelectionChanged ();
RaiseZoomingFinished ();
}
public void Color ()
{
ChangeColor (true);
}
public void Background ()
{
ChangeColor (false);
}
public void Material ()
{
MaterialDlg aDlg = new MaterialDlg (View);
aDlg.ShowDialog ();
}
public void Transparency ()
{
TransparencyDialog dlg = new TransparencyDialog ();
dlg.View = View;
dlg.ShowDialog ();
}
public void Delete ()
{
View.EraseObjects ();
}
protected void MultiDragEvent (int x, int y, int theState)
{
if (theState == -1) //mouse is down
{
myButtonDownX = x;
myButtonDownY = y;
}
else if (theState == 1) //mouse is up
{
View.ShiftSelect (Math.Min (myButtonDownX, x), Math.Min (myButtonDownY, y),
Math.Max (myButtonDownX, x), Math.Max (myButtonDownY, y));
}
}
protected void DragEvent (int x, int y, int theState)
{
if (theState == -1) //mouse is down
{
myButtonDownX = x;
myButtonDownY = y;
}
else if (theState == 1) //mouse is up
{
View.Select (Math.Min (myButtonDownX, x), Math.Min (myButtonDownY, y),
Math.Max (myButtonDownX, x), Math.Max (myButtonDownY, y));
}
}
public void OnMouseDown (System.Windows.IInputElement sender, MouseButtonEventArgs e)
{
System.Windows.Controls.TabControl aTabControl = sender as System.Windows.Controls.TabControl;
System.Windows.Controls.Grid aGrid = aTabControl.SelectedContent as System.Windows.Controls.Grid;
Point p = new Point((int)e.GetPosition(aGrid).X, (int)e.GetPosition(aGrid).Y);
// to avoid the context menu opening
aTabControl.ContextMenu.Visibility = System.Windows.Visibility.Collapsed;
aTabControl.ContextMenu.IsOpen = false;
if (e.LeftButton == MouseButtonState.Pressed)
{
myXmin = p.X;
myXmax = p.X;
myYmin = p.Y;
myYmax = p.Y;
if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
{
// start the dinamic zooming....
CurrentMode = CurrentAction3d.CurAction3d_DynamicZooming;
}
else
{
switch (CurrentMode)
{
case CurrentAction3d.CurAction3d_Nothing:
if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
{
MultiDragEvent (myXmax, myYmax, -1);
}
else
{
DragEvent (myXmax, myYmax, -1);
}
break;
case CurrentAction3d.CurAction3d_DynamicRotation:
if (!DegenerateMode)
{
View.SetDegenerateModeOn ();
}
View.StartRotation (p.X, p.Y);
break;
default:
break;
}
}
}
else if (e.RightButton == MouseButtonState.Pressed)
{
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{
if (!DegenerateMode)
{
View.SetDegenerateModeOn();
}
View.StartRotation(p.X, p.Y);
}
else
{
// show context menu only in this case
aTabControl.ContextMenu.Visibility = System.Windows.Visibility.Visible;
}
}
}
public void OnMouseUp(System.Windows.IInputElement sender, MouseButtonEventArgs e)
{
Point p = new Point((int)e.GetPosition(sender).X, (int)e.GetPosition(sender).Y);
if (e.ChangedButton == MouseButton.Left)
{
if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
{
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
return;
}
switch (CurrentMode)
{
case CurrentAction3d.CurAction3d_Nothing:
if (p.X == myXmin && p.Y == myYmin)
{
myXmax = p.X;
myYmax = p.Y;
if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
{
View.ShiftSelect ();
}
else
{
View.Select ();
}
}
else
{
myXmax = p.X;
myYmax = p.Y;
if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
{
MultiDragEvent (myXmax, myYmax, 1);
}
else
{
DragEvent (myXmax, myYmax, 1);
}
}
break;
case CurrentAction3d.CurAction3d_DynamicZooming:
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
break;
case CurrentAction3d.CurAction3d_WindowZooming:
myXmax = p.X;
myYmax = p.Y;
int ValZWMin = 1;
if (Math.Abs (myXmax - myXmin) > ValZWMin &&
Math.Abs (myXmax - myYmax) > ValZWMin)
{
View.WindowFitAll (myXmin, myYmin, myXmax, myYmax);
}
RaiseZoomingFinished ();
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
break;
case CurrentAction3d.CurAction3d_DynamicPanning:
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
break;
case CurrentAction3d.CurAction3d_GlobalPanning:
View.Place (p.X, p.Y, myCurZoom);
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
break;
case CurrentAction3d.CurAction3d_DynamicRotation:
CurrentMode = CurrentAction3d.CurAction3d_Nothing;
if (!DegenerateMode)
{
View.SetDegenerateModeOff ();
}
else
{
View.SetDegenerateModeOn ();
}
break;
default:
break;
}
}
else if (e.ChangedButton == MouseButton.Right)
{
if (!DegenerateMode)
{
View.SetDegenerateModeOff ();
}
else
{
View.SetDegenerateModeOn ();
}
}
SelectionChanged ();
}
public void OnMouseMove (System.Windows.IInputElement sender, System.Windows.Input.MouseEventArgs e)
{
Point p = new Point ((int)e.GetPosition (sender).X, (int)e.GetPosition (sender).Y);
if (e.LeftButton == MouseButtonState.Pressed) //left button is pressed
{
if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
{
View.Zoom (myXmax, myYmax, p.X, p.Y);
myXmax = p.X;
myYmax = p.Y;
}
else
{
switch (CurrentMode)
{
case CurrentAction3d.CurAction3d_Nothing:
myXmax = p.X;
myYmax = p.Y;
break;
case CurrentAction3d.CurAction3d_DynamicZooming:
View.Zoom (myXmax, myYmax, p.X, p.Y);
myXmax = p.X;
myYmax = p.Y;
break;
case CurrentAction3d.CurAction3d_WindowZooming:
myXmax = p.X;
myYmax = p.Y;
break;
case CurrentAction3d.CurAction3d_DynamicPanning:
View.Pan (p.X - myXmax, myYmax - p.Y);
myXmax = p.X;
myYmax = p.Y;
break;
case CurrentAction3d.CurAction3d_GlobalPanning:
break;
case CurrentAction3d.CurAction3d_DynamicRotation:
View.Rotation (p.X, p.Y);
View.RedrawView ();
break;
default:
break;
}
}
}
else if (e.MiddleButton == MouseButtonState.Pressed) //middle button is pressed
{
if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
{
View.Pan (p.X - myXmax, myYmax - p.Y);
myXmax = p.X;
myYmax = p.Y;
}
}
else if (e.RightButton == MouseButtonState.Pressed) //right button is pressed
{
if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
{
View.Rotation (p.X, p.Y);
}
}
else // no buttons are pressed
{
myXmax = p.X;
myYmax = p.Y;
View.MoveTo (p.X, p.Y);
}
}
}
}