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:
673
samples/CSharp/WPF_D3D/OCCViewer.cs
Normal file
673
samples/CSharp/WPF_D3D/OCCViewer.cs
Normal file
@@ -0,0 +1,673 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user