using Bro.UI.HalconDisplay.ViewROI;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
///
/// The class HDisplayControl is a User Interface .NET Control
/// and is responsible for the visualization of iconic obejcts. The
/// implementation of this class is based on the HWindowControl class
/// and the adapted version of HWndCtrl class.
/// Using the mouse interaction you can move and zoom the visible
/// image part. If this interaction is available or not is configurable
/// through HDisplayControl properties.
/// The images can be displayed in two modes. In default mode
/// the image is zoomed to the window size in correct aspect ratio.
/// The second mode displays the image in its real size.If the image is larger
/// than the graphic window, the scroll bars will be displayed so
/// you can scroll to view the remainder of the image.
/// The class provides also a tool bar for drawing and defining
/// the region(s) of interest in displayed image. If the interaction
/// with the tool bar is not desired, then the tool bar can be disabled.
/// The HDisplayControl can be resized during the execution. In this
/// case the size of graphical display and the displayed objects
/// will be adapted to the new size of the control.
/// The class HDisplayControl uses a graphics stack
/// to manage the iconic objects for the display. Each object is
/// linked to a graphical context, which determines how the object
/// is to be drawn.
/// The context can be changed by calling changeGraphicSettings().
/// The graphical "modes" are defined by the class GraphicsContext
/// and map most of the dev_set_* operators provided in HDevelop.
///
namespace Bro.UI.HalconDisplay
{
// delegate as type definition for ROI events
public delegate void OnROIChangedHandler(object sender, ROI NewROI);
public enum ImageViewStates
{
fitToWindow = 1,
fullSizeImage = 2
}
public partial class HalconDisplay : UserControl
{
#region Events and Variables for ROI Handling
///
/// This flag enables or disables the
/// functionality for defining the region of interest
/// using draw operators.
/// In default case this functionality is activated.
/// If the property is set to "false" the the toolbar
/// for ROI handling is deactivated and invisible
///
/// [true,false]
bool enabledROISetup;
private bool showROI;
///
/// Instance of ROIController, which manages the interactions
/// user ROIs(regions)
///
public ROIController roiController;
///
/// The event OnROIChanged is fired, when the activated
/// ROI (region) is changed. These changes can be
/// position changes, size changes or/and orientation
/// changes.
///
public event OnROIChangedHandler OnROIChanged;
///
/// The event OnROICreated is fired, when an user
/// draw a new ROI (region) in HDisplayControl.
///
public event OnROIChangedHandler OnROICreated;
///
/// The event OnROISignChanged is fired, when the
/// the sign of activated ROI (region) is changed.
///
public event OnROIChangedHandler OnROISignChanged;
///
/// The event OnActiveROIDeleted is fired, when
/// an activated ROI (region) is deleted.
///
public event OnROIChangedHandler OnActiveROIDeleted;
#endregion
public List hObjectEntries
{
get
{
return hWndControl.HObjList;
}
}
#region Definition of private class members
/*********************************************************************
* Definition of private class members
*********************************************************************/
// a wrapper class for the HALCON window HWindow
private HWndCtrl hWndControl;
// The coordinates of HWindow in HDisplayControl
private Rectangle windowExtents;
// Currently displayed HALCON Image
private HImage hImage;
// The region that is calculated from the
// all drawn ROIs
// Or the region of interest set manually by
// assigment a new region to the property (CurrentROI)
private HRegion regionOfInterest;
// The dimensions of HALCON Image
// If any image is currently displayed, the imageWidth
// and imageHeight are set to 0
private int imageWidth, imageHeight;
// This object is used to lock the code that the accesses
// the HALCON image and graphic stack. These prevents
// That the image acquisition thread and GUI Thread
// acess the graphic stack at the same time
private readonly object locker;
/*----------- Zoom --------------------------------*/
// Coordinates of the point in the image, that is
// defined by the current mouse position in the image.
// These coordinates are used as the zoom center.
private Point zoomCenter;
// The current value of the zoom state of the image
// given in per cent (%)
private int displayZoomValue;
// The flag that signalize if the option for zooming
// with mouse wheel is swithed on (true) or switched off
private bool zoomOnMouseWheel;
/*-------------------------------------------------*/
// This flag swithes the option for movement of the displayed image
// by pressing the left mouse button and moving the mouse cursor in
// HDisplayControl
private bool moveOnPressedMouseButton;
/*----------- Options for displaying the halcon image -------------*/
/// If the state is set to true, then the image view
/// is adapted to the size of the window with correct aspect ration
///
/// [fitToWindow,fullSizeImage]
private ImageViewStates imageViewState;
#endregion
#region Construction and Deconstruction
public HalconDisplay()
{
InitializeComponent();
hWndControl = new HWndCtrl(viewPort);
viewPort.MouseEnter += new EventHandler((s, e) => { viewPort.HMouseWheel -= new HalconDotNet.HMouseEventHandler(hWndControl.mouseWheel); });
viewPort.MouseLeave += new EventHandler((s, e) => { viewPort.HMouseWheel += new HalconDotNet.HMouseEventHandler(hWndControl.mouseWheel); });
//DoubleBuffer:
//UserPaint:
//AllPaintingInWmPaint:
//ResizeRedraw:
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw, true);
//HSystem.SetSystem("clip_region", "false");
locker = new object();
this.ImageViewState = ImageViewStates.fitToWindow;
// Intialize ScrollBars and display modus of image
hScrollBar1.Enabled = false;
hScrollBar1.Value = 0;
vScrollBar1.Enabled = false;
vScrollBar1.Value = 0;
// Initialize ToolBar
toolStrip1.Width = viewPort.Location.X + viewPort.Width;
toolStrip1.Visible = true;
// Region interaction
this.EnabledROISetup = true;
}
public double Row1, Col1, Row2, Col2;
#endregion
#region Definition of HDisplayControl properties
[Browsable(false)]
public HWndCtrl HWndCtrl
{
get
{
return this.hWndControl;
}
}
[Browsable(true)]
public bool ShowROI
{
get
{
return showROI;
}
set
{
if (hWndControl != null)
{
showROI = value;
if (showROI)
{
hWndControl.ShowROI = HWndCtrl.MODE_INCLUDE_ROI;
this.Invalidate();
}
else
{
hWndControl.ShowROI = HWndCtrl.MODE_EXCLUDE_ROI;
this.Invalidate();
}
}
}
}
///
/// Gets or sets the current size of the graphical display,
/// (not the whole control!)
///
[Browsable(true)]
[Description("Gets the current size of the graphical display,"+
"(not the whole control!)")]
[DesignerSerializationVisibility
(DesignerSerializationVisibility.Visible)]
public Size WindowSize
{
get
{
return this.viewPort.WindowSize;
}
set
{
this.viewPort.WindowSize = value;
}
}
///
/// Gets the current window to display.
///
[Browsable(false)]
[Description("Get the reference to HWindow.")]
public HWindow HalconWindow
{
get
{
return this.viewPort.HalconWindow;
}
}
///
/// Gets the current image to display.
///
[Browsable(false)]
[Description("Gets the current image to display.")]
[DesignerSerializationVisibility
(DesignerSerializationVisibility.Hidden)]
public HImage Image
{
get
{
lock (locker)
{
return hImage;
}
}
set
{
lock (locker)
{
hImage = value;
if (hImage != null)
{
try
{
hImage.GetImageSize(out imageWidth, out imageHeight);
}
catch
{
imageWidth = 0;
imageHeight = 0;
}
}
}
this.AddObjectToGraphicStack(hImage);
}
}
///
/// Gets or sets the state of the image view. The state impacts the
/// image view in graphic window. The values are fitToWindow
/// (the image is scaled so the whole image is displayed in
/// the graphic window), fullSizeImage (the image is dispalyed in
/// current image size. The Scorllbars apear, if the image exceeds the
/// limits of graphical window.)
///
[Browsable(true)]
[Description("Gets or sets the state of the image" +
" view in graphic window.")]
[DesignerSerializationVisibility(
DesignerSerializationVisibility.Visible)]
public ImageViewStates ImageViewState
{
get
{
return imageViewState;
}
set
{
if (value == ImageViewStates.fitToWindow)
{
imageViewState = value;
if (!this.DesignMode)
{
if (hWndControl != null)
hWndControl.adaptSize = true;
if (this.Image != null)
{
// set the image of the Halcon window
// to the size of current image
hWndControl.resetImagePart(imageWidth, imageHeight);
this.Invalidate();
}
}
}
else if (value == ImageViewStates.fullSizeImage)
{
imageViewState = value;
hWndControl.adaptSize = false;
if (!this.DesignMode)
{
if (this.Image != null)
setFullImageSize();
}
}
else
throw new InvalidEnumArgumentException("Invalid value of Property " +
"ImageViewState. " +
"The property can have to " +
"different values \"fitToWindow\"" +
"\"fullSizeImage\".");
}
}
///
/// Coordinates of the image marked as zoom center. Initial value is
/// the center of the image. X-coordinate corresponds the column
/// coordinate and Y-coodrinate to the row coordinate of image. The
/// zoom center is changed if you click with the left mouse button
/// in the display image and then scroll the mouse wheel.
///
[Browsable(false)]
[Description("Coordinates of the image marked as zoom center. " +
"Initial value is the center of the image. X-coordinate" +
" corresponds the column coordinate and Y-coodrinate to" +
" the row coordinate of image. The zoom center is " +
" changed if you click with the left mouse button" +
" in the display image and then scroll the mouse wheel")]
[EditorBrowsable(EditorBrowsableState.Always)]
[CategoryAttribute("Zoom")]
public Point ZoomCenter
{
get
{
return zoomCenter;
}
set
{
if (value.IsEmpty)
{
zoomCenter = new Point((imageWidth / 2), imageHeight / 2);
}
else
{
if ((imageWidth > 0) && (imageHeight > 0))
{
if ((value.X <= imageWidth) && (value.X >= 0) &&
(value.Y <= imageHeight) && (value.Y >= 0))
this.zoomCenter = value;
else
{
//string excString = "The coordinates of ZoomCenter should " +
// "be within image.";
//MessageBox.Show(excString);
//throw new ArgumentOutOfRangeException(excString,
// "ZoomCenter");
}
}
else
{
zoomCenter = value;
}
}
}
}
///
/// Gets the current zoom value of display expressed as a
/// percentage of original image size.
///
[Browsable(false)]
[Description("Gets the current zoom value of display expressed as a " +
"percentage of original image size.")]
[EditorBrowsable(EditorBrowsableState.Advanced)]
[RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
[CategoryAttribute("Zoom")]
[DefaultValue(100)]
public int DisplayZoomValue
{
get
{
return this.displayZoomValue;
}
}
///
/// Gets or sets the property to zoom the image by
/// scrolling the mouse wheel. The center of zoom is
/// set to the current image position of the mouse.
///
[Browsable(true)]
[DesignerSerializationVisibility
(DesignerSerializationVisibility.Visible)]
[Description("Specifies, if the zoom with mouse wheel is activated " +
"or not. The center of zoom is set to the current " +
"image position of the mouse.")]
[EditorBrowsable(EditorBrowsableState.Always)]
[CategoryAttribute("Zoom")]
[DefaultValue(true)]
public bool ZoomOnMouseWheel
{
get
{
return this.zoomOnMouseWheel;
}
set
{
this.zoomOnMouseWheel = value;
}
}
///
/// Specifies, if the moving of displayed objects
/// by pressed mouse button is activated or not.
///
[Browsable(true)]
[DesignerSerializationVisibility
(DesignerSerializationVisibility.Visible)]
[Description("Specifies, if the moving of displayed objects" +
"by pressed mouse button is activated or not.")]
[EditorBrowsable(EditorBrowsableState.Always)]
[CategoryAttribute("Move")]
[DefaultValue(false)]
public bool MoveOnPressedMouseButton
{
get
{
return this.moveOnPressedMouseButton;
}
set
{
this.moveOnPressedMouseButton = value;
if (this.moveOnPressedMouseButton && hWndControl != null)
hWndControl.setViewState(HWndCtrl.MODE_VIEW_MOVE);
}
}
///
/// Specifies, if the toolbar for setup of roi
/// is activated and visible or not.
///
[Browsable(true)]
[Description("Specifies, if the toolbar for setup of roi"+
" is activated and visible or not.")]
[DefaultValue(true)]
public bool EnabledROISetup
{
get
{
return this.enabledROISetup;
}
set
{
this.enabledROISetup = value;
if (this.enabledROISetup)
{
toolStrip1.Enabled = true;
toolStrip1.Visible = true;
}
else
{
toolStrip1.Enabled = true;
toolStrip1.Visible = false;
}
}
}
///
/// Gets or sets the current region of interest.
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Description("Gets or sets the current region of interest.")]
public HRegion CurrentROI
{
get
{
if (!this.DesignMode)
{
CalcCurrentROI();
return this.regionOfInterest;
}
else
return null;
}
set
{
if (!this.DesignMode)
{
if (value != null)
{
this.regionOfInterest = value;
roiController.ModelROI = this.regionOfInterest;
}
else
{
if (roiController != null)
{
//Clears all variables managing ROI objects
roiController.getROIList().Clear();
roiController.defineModelROI();
this.regionOfInterest = roiController.getModelRegion();
}
else
this.regionOfInterest = null;
// set the image part to the whole image
if (this.Image != null)
hWndControl.resetImagePart(imageWidth, imageHeight);
}
}
}
}
///
/// Returns the reference to the object ROIController
/// that is responsible for the management of the regions
/// that belongs to region of interest.
///
[Browsable(false)]
[Description("Returns the reference to the object ROIController, "+
"that is responsible for the management of the regions "+
" that belongs to region of interest")]
public ROIController ROIController
{
get
{
return this.roiController;
}
}
#endregion
///
/// Reset window settings for zoom and pan
///
public void ResetDisplaySettings()
{
// clear all settings in graphic window
//hWndControl.resetAll();
hWndControl.resetWindow();
// set the flag to display the full image
// in correct aspect ration in graphic window
if (imageViewState == ImageViewStates.fitToWindow)
hWndControl.adaptSize = true;
else
hWndControl.adaptSize = false;
if ((imageWidth > 0) && (imageHeight > 0))
hWndControl.resetImagePart(imageWidth, imageHeight);
this.Invalidate();
}
///
/// Reset window settings including settings for drawing ROIs
///
public void ResetDisplaySettingsInclROI()
{
// clear all settings in graphic window
hWndControl.resetAll();
// set the flag to display the full image
// in correct aspect ration in graphic window
if (imageViewState == ImageViewStates.fitToWindow)
hWndControl.adaptSize = true;
else
hWndControl.adaptSize = false;
if ((imageWidth > 0) && (imageHeight > 0))
hWndControl.resetImagePart(imageWidth, imageHeight);
this.Invalidate();
}
///
/// Clears the content in the graphic stack
/// that is managed by HDisplayControl
///
public void ClearGraphicStack()
{
hWndControl.ClearHObjList();
// set the flag to display the full image
// in correct aspect ration in graphic window
if (imageViewState == ImageViewStates.fitToWindow)
hWndControl.adaptSize = true;
else
hWndControl.adaptSize = false;
if ((imageWidth > 0) && (imageHeight > 0))
hWndControl.resetImagePart(imageWidth, imageHeight);
this.Invalidate();
}
///
/// Clears !only! the window
///
public void ClearDisplay()
{
this.HalconWindow.ClearWindow();
}
///
/// Zooms the image around the image coordinate supplied
/// in [centerX, centerY] by value, that is provided
/// by parameter zoomFactor. The zoomFactor describe the grade of zooming
/// in per cents.
///
/// Column coordinate of zoom center
/// Row coordinate of zoom center
/// Zoom value in percenetage
public void ZoomImage(double centerX, double centerY, int zoomFactor)
{
this.displayZoomValue = zoomFactor;
// zoom image
hWndControl.zoomByGUIHandle(displayZoomValue);
// repaint the graphic window
this.Invalidate();
}
///
/// The object will be pushed to the graphic stack of image
/// display. The objects on the graphic stack will not be
/// displayed automatically. To display the objects on the
/// graphic stack, please call method Refresh.
///
/// HALCON iconic object
public void AddObjectToGraphicStack(HObject obj)
{
try
{
lock (locker)
{
if (obj != null)
{
hWndControl.addIconicVarKeepSettings(obj);
}
}
}
catch(Exception ex)
{
Trace.TraceError("HDisplay : AddObjectToGraphicStack error:{0}", ex);
}
}
///
/// Changes the current graphical context by setting the specified mode
/// (constant starting by GC_*) to the specified value.
///
///
/// Constant that is provided by the class GraphicsContext
/// and describes the mode that has to be changed. Actually
/// you can set up following properties of graphical context
/// using this function:
/// GraphicsContext.GC_COLOR (see dev_set_color)
/// GraphicsContext.GC_DRAWMODE (see set_draw)
/// GraphicsContext.GC_SHAPE (see set_shape)
/// GraphicsContext.GC_LUT (see set_lut)
/// GraphicsContext.GC_PAINT (see set_paint)
///
///
/// Value, provided as a string,
/// the mode is to be changed to, e.g., "blue"
///
public void ChangeGraphicSettings(string mode, string val)
{
hWndControl.changeGraphicSettings(mode, val);
}
///
/// Changes the current graphical context by setting the specified mode
/// (constant starting by GC_*) to the specified value.
///
///
/// Constant that is provided by the class GraphicsContext
/// and describes the mode that has to be changed. Actually you can
/// set up following properties of graphical context using this
/// function:
/// GraphicsContext.GC_LINEWIDTH (see set_line_width)
/// GraphicsContext.GC_COLORED (see dev_set_colored)
///
///
/// Value, provided as an integer, the mode is to be changed to,
/// e.g., 5
///
public void ChangeGraphicSettings(string mode, int val)
{
hWndControl.changeGraphicSettings(mode, val);
}
///
/// Changes the current graphical context by setting the specified mode
/// (constant starting by GC_*) to the specified value.
///
///
/// Constant that is provided by the class GraphicsContext
/// and describes the mode that has to be changed.Actually you can
/// set up following properties of graphical context using this
/// function:
/// GraphicsContext.GC_LINESTYLE (see set_line_style)
///
///
/// Value, provided as an HTuple instance, the mode is
/// to be changed to, e.g., new HTuple(new int[]{2,2})
///
public void ChangeGraphicSettings(string mode, HTuple val)
{
hWndControl.changeGraphicSettings(mode, val);
}
///
/// Repaint the content of the graphic window
///
public override void Refresh()
{
/*
* repaint the graphic control including the
* actual graphic stack
*/
hWndControl.repaint();
this.Invalidate();
}
///
/// Performs the initialization of the HDisplayControl
/// during loading to the memory.
///
private void HDisplayControl_Load(object sender, EventArgs e)
{
//hWndControl = new HWndCtrl(viewPort);
// Initialization graphic window size
windowExtents = new Rectangle(0, 0, this.viewPort.WindowSize.Width,
this.viewPort.WindowSize.Height);
imageWidth = imageHeight = 0;
displayZoomValue = 100;
zoomCenter = new Point(windowExtents.Width / 2, windowExtents.Height / 2);
hWndControl.setViewState(HWndCtrl.MODE_VIEW_MOVE);
viewPort.HMouseMove += ViewPort_HMouseMove;
// add event handler after zooming the image
hWndControl.OnImageZoomed += new OnIconicObjectZoomedHandler(
this.hWndControl_IconicObjectZoomed);
hWndControl.OnImageMoved += new OnIconicObjectMovedHandler(
this.hWndControl_IconicObjectMoved);
// setup ROIController
roiController = new ROIController();
hWndControl.useROIController(roiController);
// handle the changes of regions
roiController.NotifyRCObserver = null;
roiController.NotifyRCObserver = new IconicDelegate(UpdateViewData);
hWndControl.ClearHObjList();
//---------
// set the sign of the draw region to the value "Add Region"
roiController.setROISign(ROIController.MODE_ROI_NEG);
this.ShowROI = true;
}
private void ViewPort_HMouseMove(object sender, HMouseEventArgs e)
{
if ((e.X > 0) && (e.Y > 0))
{
tsslRow.Text = e.Y.ToString("f2");
tsslCol.Text = e.X.ToString("f2");
try
{
if (Image == null)
return;
HTuple channels = new HTuple();
HOperatorSet.CountChannels(Image, out channels);
HTuple data = new HTuple();
HTuple temp = new HTuple();
HObject image1 = new HObject();
HObject image2 = new HObject();
HObject image3 = new HObject();
switch(channels.I)
{
case 1:
HOperatorSet.GetGrayval(Image, e.Y, e.X, out temp);
data.Append(temp);
break;
case 2:
HOperatorSet.Decompose2(Image, out image1, out image2);
HOperatorSet.GetGrayval(image1, e.Y, e.X, out temp);
data.Append(temp);
HOperatorSet.GetGrayval(image2, e.Y, e.X, out temp);
data.Append(temp);
break;
case 3:
HOperatorSet.Decompose3(Image, out image1, out image2, out image3);
HOperatorSet.GetGrayval(image1, e.Y, e.X, out temp);
data.Append(temp);
HOperatorSet.GetGrayval(image2, e.Y, e.X, out temp);
data.Append(temp);
HOperatorSet.GetGrayval(image3, e.Y, e.X, out temp);
data.Append(temp);
break;
default:
break;
}
string str = "";
for (int i = 0; i < data.LArr.Length; i++)
{
str += data.LArr[i].ToString();
str += ",";
}
tsslGreyval.Text = str;
image1?.Dispose();
image2?.Dispose();
image3?.Dispose();
}
catch
{
return;
}
}
}
///
/// Performs event handling of the HMouseWheel event of
/// HWindowControl, so that the dipslayed image part and scroll bars
/// of HDisplayControl can be adapted to the current zoom value.
///
private void viewPort_HMouseWheel(object sender, HMouseEventArgs e)
{
hWndControl.mouseWheel(sender, e);
//ManageScrollBars();
hWndControl.repaint();
this.Invalidate();
}
///
/// Event handling of paint event. The methods takes care, that the
/// image part is displayed correctly and the scroll bars appear
/// if they are necessary.
///
private void HDisplayControl_Paint(object sender, PaintEventArgs e)
{
if (!this.DesignMode)
{
try
{
displayZoomValue = (int)hWndControl.ZoomFactor;
//ManageScrollBars();
}
finally
{
hWndControl.repaint();
HOperatorSet.SetSystem("flush_graphic", "true");
viewPort.HalconWindow.DispCircle(-100.0, -100.0, 1);
}
}
}
///
/// Event handling for zooming the displayed iconic objects
///
private void hWndControl_IconicObjectZoomed(object sender,
double zoomCenterX,
double zoomCenterY,
double scaleFactor)
{
ZoomCenter = new Point((int)Math.Round(zoomCenterX),
(int)Math.Round(zoomCenterY));
displayZoomValue = (int)scaleFactor;
this.Invalidate();
}
///
/// By resizing the controls the visualization of displayed iconic
/// objects should also be adapted to the new size of graphic window.
///
new public void Resize(object sender, EventArgs e)
{
//hWndControl = new HWndCtrl(viewPort);
Rectangle imagePart;
imagePart = viewPort.ImagePart;
// adapt the displayed image part
// to the new size of display
if (hWndControl.adaptSize)
{
if (this.Image != null)
{
// set the image part of the Halcon window
// to the size of current image
if ((imagePart.Width >= imageWidth) &&
(imagePart.Height >= imageHeight))
{
hWndControl.resetImagePart(imageWidth, imageHeight);
}
else
{
// The window is resized and this impacts that the
// visible image part has to be changed. Adapt
// the image part to new window size.
imagePart.Width = viewPort.Width;
imagePart.Height = viewPort.Height;
viewPort.ImagePart = imagePart;
}
}
}
else
if (!hWndControl.adaptSize)
{
if (this.Image != null)
setFullImageSize();
}
this.Invalidate();
}
///
/// Event handling for resizing the graphic window
///
private void HDisplayControl_Resize(object sender, EventArgs e)
{
// update the size of the HALCON window if the
// the whole component is resized
//hWndControl = new HWndCtrl(viewPort);
UpdateHalconWindowExtents();
//// set the position of ScrollBars
//vScrollBar1.Location = new Point((viewPort.Location.X +
// windowExtents.Width),
// viewPort.Location.Y);
if (hWndControl.adaptSize)
{
if (this.Image != null)
// set the image of the Halcon window
// to the size of current image
hWndControl.resetImagePart(imageWidth, imageHeight);
}
else
{
if (this.Image != null)
setFullImageSize();
}
// this calls the Paint-Method
this.Invalidate();
}
///
/// Event handling if the content of the graphic window is moved.
///
private void hWndControl_IconicObjectMoved(object sender,
double moveX,
double moveY)
{
if (MoveOnPressedMouseButton)
this.Invalidate();
}
///
/// Updates the size of HWindowControl during size changing of whole
/// user control.
///
private void UpdateHalconWindowExtents()
{
int windowWidth = this.ClientSize.Width -
2 * this.viewPort.BorderWidth -
vScrollBar1.Width - 2;
int windowHeight = this.ClientSize.Height -
2 * this.viewPort.BorderWidth -
hScrollBar1.Height - 2;
windowExtents = new Rectangle(this.viewPort.BorderWidth,
this.viewPort.BorderWidth,
windowWidth,
windowHeight);
// update extens of window
this.viewPort.WindowSize = new Size(windowWidth, windowHeight);
}
///
/// Event handling for horizontal scroll bar. The image part will
/// be adapted according to the position of horizontal scroll bar.
///
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
Rectangle rect = viewPort.ImagePart;
rect.X = hScrollBar1.Value;
hWndControl.setImagePart(rect.Y, rect.X,
rect.Y + rect.Height,
rect.X + rect.Width);
hWndControl.repaint();
}
///
/// Event handling for vertical scroll bar. The image part will
/// be adapted according to the position of vertical scroll bar.
///
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
// set new image part during scrolling
Rectangle rect = viewPort.ImagePart;
rect.Y = vScrollBar1.Value;
hWndControl.setImagePart(rect.Y, rect.X,
rect.Y + rect.Height,
rect.X + rect.Width);
hWndControl.repaint();
}
///
/// Sets the mode of graphic window to display the
/// image in its full image size. If the image part
/// of the displayed image is larger than the graphic
/// window then the scroll bars appear.
///
private void setFullImageSize()
{
if (this.Image != null)
{
hWndControl.adaptSize = false;
hWndControl.resetImagePart(imageWidth, imageHeight);
this.Invalidate();
}
}
///
/// Sets the shape of region to draw to axis-aligned rectangle
///
private void toolStripButton1_Click(object sender, EventArgs e)
{
roiController.setROIShape(new ROIRectangle1());
this.Invalidate();
}
///
/// Sets the shape of region to draw to rotated rectangle
///
private void toolStripButton2_Click(object sender, EventArgs e)
{
roiController.setROIShape(new ROIRectangle2());
}
///
/// Sets the shape of region to draw to line
///
private void toolStripButton3_Click(object sender, EventArgs e)
{
roiController.setROIShape(new ROILine());
}
///
/// Sets the shape of region to draw to circle
///
private void toolStripButton4_Click(object sender, EventArgs e)
{
roiController.setROIShape(new ROICircle());
}
///
/// Sets the shape of region to draw to circular arc
///
private void toolStripButton5_Click(object sender, EventArgs e)
{
try
{
roiController.setROIShape(new ROICircularArc());
}
catch (HOperatorException exception)
{
throw exception;
}
}
private void ToolStripButton6_Click(object sender, EventArgs e)
{
try
{
roiController.setROIShape(ROIPolygon.GetCurrentInstance());
}
catch (HOperatorException exception)
{
throw exception;
}
}
///
/// Update the current ROI (region of interest) according to
/// the changes that were performed through user interaction.
///
private void toolStripDeleteSelectedRegion_Click(object sender, EventArgs e)
{
int activeROIIdx = roiController.getActiveROIIdx();
if (activeROIIdx > -1)
roiController.removeActive();
}
///
/// Update the current ROI (region of interest) according to
/// the changes that were performed through user interaction.
///
public void UpdateViewData(int val)
{
switch (val)
{
case ROIController.EVENT_CHANGED_ROI_SIGN:
CalcCurrentROI();
OnROICreated?.Invoke(this, roiController.getActiveROI());
break;
case ROIController.EVENT_DELETED_ACTROI:
case ROIController.EVENT_DELETED_ALL_ROIS:
CalcCurrentROI();
// if activated ROI is deleted or all ROIs
// are deleted, the event parameter for ROI
// is set NULL
OnActiveROIDeleted?.Invoke(this, null);
break;
case ROIController.EVENT_CREATED_ROI:
CalcCurrentROI();
OnROICreated?.Invoke(this, roiController.getActiveROI());
break;
case ROIController.EVENT_UPDATE_ROI:
CalcCurrentROI();
OnROIChanged?.Invoke(this, roiController.getActiveROI());
break;
case ROIController.EVENT_REPAINT_ROI:
this.Invalidate();
break;
default:
break;
}
this.Invalidate();
}
///
/// Update the current ROI (region of interest) according to
/// the changes that were performed through user interaction.
///
private void CalcCurrentROI()
{
bool genROI = false;
try
{
genROI = roiController.defineModelROI();
}
catch (HOperatorException exception)
{
MessageBox.Show("Error occured during calculating" +
" the region of interest:\n" +
exception.Message);
hWndControl.repaint();
}
regionOfInterest = roiController.getModelRegion();
if (!genROI)
hWndControl.repaint();
}
///
/// Adds the new region to the region of interest (ROI)
///
private void btnRegionFill_Click(object sender, EventArgs e)
{
roiController.setROISign(ROIController.MODE_ROI_POS);
}
///
/// Exludes the area defined by new region from the region of interest (ROI)
///
private void btnRegionMargin_Click(object sender, EventArgs e)
{
roiController.setROISign(ROIController.MODE_ROI_NEG);
}
private void StatusBarVisbleMenuItem_Click(object sender, EventArgs e)
{
StatusBarVisbleMenuItem.Checked = !StatusBarVisbleMenuItem.Checked;
}
private void ToolBarVisbleMenuItem_Click(object sender, EventArgs e)
{
ToolBarVisbleMenuItem.Checked = !ToolBarVisbleMenuItem.Checked;
}
private void ToolBarVisbleMenuItem_CheckedChanged(object sender, EventArgs e)
{
toolStrip1.Visible = ToolBarVisbleMenuItem.Checked;
}
private void StatusBarVisbleMenuItem_CheckedChanged(object sender, EventArgs e)
{
statusStrip1.Visible = StatusBarVisbleMenuItem.Checked;
}
private void lineWidthMenuItem_Click(object sender, EventArgs e)
{
foreach(var item in lineWidthMenuItem.DropDownItems)
{
if (item == sender)
((ToolStripMenuItem)item).Checked = true;
else
((ToolStripMenuItem)item).Checked = false;
}
for (int i = 0; i < lineWidthMenuItem.DropDownItems.Count; i++)
{
if(((ToolStripMenuItem)lineWidthMenuItem.DropDownItems[i]).Checked)
{
HWndCtrl.SetLineWidth(i + 1);
Refresh();
}
}
}
///
/// Event handling for entering the Delete-Button.
/// If one of the drawn regions is activated then
/// the activated region will be deleted.
///
private void viewPort_KeyDown(object sender, KeyEventArgs e)
{
Keys button = e.KeyCode;
// if the pressed button is "Del"
if (e.KeyCode == Keys.Delete)
// if one region is activated, then delete it
if (roiController.activeROIidx > -1)
roiController.removeActive();
}
private void viewPort_HInitWindow(object sender, EventArgs e)
{
hImage = null;
regionOfInterest = new HRegion();
}
private void toolStripDeleteAllRegion_Click(object sender, EventArgs e)
{
hWndControl.ClearHObjListExceptImage();
roiController.ROIList.Clear();
Refresh();
}
private void toolStripResetDisp_Click(object sender, EventArgs e)
{
ResetDisplaySettings();
}
}
}