[vtkusers] System throw exceptions while interactoring window with mouse by vtkInteractorStyleImage using ActiViz.NET

Liu_tj tjlp at netease.com
Sat Mar 12 12:17:50 EST 2016


Hi, David,


Continue this thread. Now I upgrade from Activiz for VTK 5.8 to 7.0. And I define the vtkInteractorStyleImage::MouseWheelForwardEvt and MouseWheelBackwardEvt for slice switch. With VTK 5.8, it works but now it doesn't work for 7.0. With VTK 7.0, these 2 event handlers keep the old behavior which zooms in or out. It does not call the function I define to switch the slice number. My code is as follow:


private void Display(vtkRenderWindow aRenderWindow, vtkAlgorithmOutput aData)
        {
            if (aData == null)
                return;
            m_imageViewer = vtkImageViewer2.New();
            m_imageViewer.SetInputConnection(aData);
            switch (m_sliceDirection)
            {
                case Direction.AXIAL:
                    m_imageViewer.SetSliceOrientationToXY();
                    break;
                case Direction.CORONAL:
                    m_imageViewer.SetSliceOrientationToYZ();
                    break;
                case Direction.SAGITTAL:
                    m_imageViewer.SetSliceOrientationToXZ();
                    break;
                default:
                    break;
            }


            m_imageViewer.GetSliceRange(ref m_minSliceNumber, ref m_maxSliceNumber);


            m_interactorStyle = vtkInteractorStyleImage.New();
            m_moveforward = new vtkObject.vtkObjectEventHandler(interactor_MouseWheelForwardEvt);
            m_movebackward = new vtkObject.vtkObjectEventHandler(interactor_MouseWheelBackwardEvt);
            
            m_interactorStyle.MouseWheelForwardEvt += m_moveforward;
            m_interactorStyle.MouseWheelBackwardEvt += m_movebackward;
vtkObject.vtkObjectEventHandler(interactor_MouseWheelBackwardEvt);
            
            aRenderWindow.GetRenderers().InitTraversal();


            m_renderer = aRenderWindow.GetRenderers().GetFirstRenderer();
            m_renderer.SetBackground(0.0, 0.0, 0.0);


            m_imageViewer.SetRenderWindow(aRenderWindow);
            vtkRenderWindowInteractor interactor = aRenderWindow.GetInteractor();
            interactor.SetInteractorStyle(m_interactorStyle);
            
            m_imageViewer.SetupInteractor(interactor);


            m_currentSlice = m_minSliceNumber + (m_maxSliceNumber - m_minSliceNumber) / 2;
            m_imageViewer.SetSlice(m_currentSlice);


            m_imageViewer.Render();
        } 


Thanks
Liu Peng

在2016-02-28,"David Cole" <DLRdave at aol.com> 写道: -----原始邮件-----
发件人:"David Cole" <DLRdave at aol.com>
发送时间:2016年02月28日 星期日
收件人:"Liu_tj" <tjlp at netease.com>
抄送:"vtkusers" <vtkusers at vtk.org>
主题:Re: [vtkusers] System throw exceptions while interactoring window with mouse by vtkInteractorStyleImage using ActiViz.NET

Rather than doing += new and directly adding an event handler, save a pointer to the return value of new in each case as a C# member variable (which has scope at least as long as you want to be receiving the events...), and then do += with that variable.

That will keep a C# reference to it so it won't be garbage collected.

That will help, although I didn't analyze your whole code snippet thoroughly, so there may be more to do after that. But that should be your first step.

HTH,
David C.


> On Feb 28, 2016, at 3:17 AM, Liu_tj <tjlp at netease.com> wrote:
>
> Hi, VTK guys,
>
> At present I am ActiViz.NET 5.8.0 OpenSource Edition (x86) and Visual Studio 2015 C# to define a WPF user control for display DICOM series. I created event handlers for vtkInteractorStyleImage to handle mouse wheel forwared and mouse backward to switch the DICOM image. The application can display the image, when I forward or backward the mouse wheel, I get the system exception:
>
> Unhandled Exception:  System.Exception: error: could not get registered type - mteIndex='4294967295' classNameKey=''
>
> I read the thread http://vtk.1045678.n5.nabble.com/ActiViz-NET-reports-unhandled-Exception-while-interacting-window-with-Mouse-td5720046.html, but I have no idea how to fix it.
>
> Any glue for this issue?
>
> Below is my user control class:
>
> public partial class Dicom2DViewer : UserControl
>     {
>         public Dicom2DViewer()
>         {
>             InitializeComponent();
>             m_renderwinctrl = this.FindName("renderCtrl") as RenderWindowControl;
>             if (m_renderwinctrl != null)
>                 m_renderWindow = m_renderwinctrl.RenderWindow;
>
>             //m_imagePlaneWidget = vtkImagePlaneWidget.New();
>             //m_imagePlaneWidgetFor3D = vtkImagePlaneWidget.New();
>         }
>
>         public static readonly DependencyProperty DICOMDataProperty =
>              DependencyProperty.Register("DICOMData", typeof(vtkAlgorithmOutput),
>              typeof(Dicom2DViewer), new FrameworkPropertyMetadata(null, OnDICOMDataPropertyChanged));
>
>         public vtkAlgorithmOutput DICOMData
>         {
>             get { return (vtkAlgorithmOutput)GetValue(DICOMDataProperty); }
>             set { SetValue(DICOMDataProperty, value); }
>         }
>
>         private static void OnDICOMDataPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
>         {
>             Dicom2DViewer dicomViewer = source as Dicom2DViewer;
>             RenderWindowControl renderWindowCtrl = dicomViewer.renderCtrl;
>             vtkAlgorithmOutput vtkDICOMOutput = (vtkAlgorithmOutput)e.NewValue;
>
>             dicomViewer.Display(renderWindowCtrl.RenderWindow, vtkDICOMOutput);
>         }
>
>         private void Display(vtkRenderWindow aRenderWindow, vtkAlgorithmOutput aData)
>         {
>             if (aData == null)
>                 return;
>
>             m_imageViewer = vtkImageViewer2.New();
>             m_imageViewer.SetInputConnection(aData);
>             m_imageViewer.GetSliceRange(ref m_minSliceNumber, ref m_maxSliceNumber);
>
>             //vtkInteractorStyleImage interactorStyle = vtkInteractorStyleImage.New();
>             //interactorStyle.MouseWheelForwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelForwardEvt);
>             //interactorStyle.MouseWheelBackwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelBackwardEvt);
>
>             //aRenderWindow.GetInteractor().SetInteractorStyle(interactorStyle);
>             vtkInteractorStyleImage m_interactorStyle = vtkInteractorStyleImage.New();
>             m_interactorStyle.MouseWheelForwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelForwardEvt);
>             m_interactorStyle.MouseWheelBackwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelBackwardEvt);
>
>             aRenderWindow.GetInteractor().SetInteractorStyle(m_interactorStyle);
>             aRenderWindow.GetRenderers().InitTraversal();
>
>             vtkRenderer ren;
>             while ((ren = aRenderWindow.GetRenderers().GetNextItem()) != null)
>                 ren.SetBackground(0.0, 0.0, 0.0);
>
>             m_imageViewer.SetRenderWindow(aRenderWindow);
>             m_imageViewer.SetSlice(m_minSliceNumber);
>
>             switch (m_sliceDirection)
>             {
>                 case Direction.AXIAL:
>                     m_imageViewer.SetSliceOrientationToXY();
>                     break;
>                 case Direction.CORONAL:
>                     m_imageViewer.SetSliceOrientationToYZ();
>                     break;
>                 case Direction.SAGITTAL:
>                     m_imageViewer.SetSliceOrientationToXZ();
>                     break;
>                 default:
>                     break;
>             }
>
>             m_imageViewer.Render();
>         }
>
>         private void interactor_MouseWheelForwardEvt(vtkObject sender, vtkObjectEventArgs e)
>         {
>             MoveSlice(1);
>         }
>
>         void interactor_MouseWheelBackwardEvt(vtkObject sender, vtkObjectEventArgs e)
>         {
>             MoveSlice(0);
>         }
>
>         private void MoveSlice(int direction) //0: move backward; 1: move forward
>         {
>             if (direction == 0)
>             {
>                 if (m_currentSlice > m_minSliceNumber)
>                 {
>                     m_currentSlice -= 1;
>                     m_imageViewer.SetSlice(m_currentSlice);
>                     m_imageViewer.Render();
>                 }
>             }
>             else
>             {
>                 if (m_currentSlice < m_maxSliceNumber)
>                 {
>                     m_currentSlice += 1;
>                     m_imageViewer.SetSlice(m_currentSlice);
>                     m_imageViewer.Render();
>                 }
>             }            
>         }
>
>         public vtkRenderWindow GetRenderWindow()
>         {
>             return m_renderWindow;
>         }
>
>         public void AddRenderer(vtkRenderer renderer)
>         {
>             m_renderWindow.AddRenderer(renderer);
>         }
>
>         public void SetViewDirection(Direction direction)
>         {
>             m_sliceDirection = direction;
>         }
>
>         private RenderWindowControl m_renderwinctrl = null;
>         private vtkRenderWindow m_renderWindow = null;
>         private vtkImageViewer2 m_imageViewer = null;
>         vtkInteractorStyleImage m_interactorStyle = null;
>         private Direction m_sliceDirection;
>
>         int m_currentSlice = 0;
>         int m_minSliceNumber = 0;
>         int m_maxSliceNumber = 0;
>     }  
>
> Thanks
> Liu Peng
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160313/6b47ac08/attachment.html>


More information about the vtkusers mailing list