vtk 通过指针实时刷新界面

来源:互联网 发布:java行业 编辑:程序博客网 时间:2024/06/15 17:12
using System;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;using Kitware.VTK;namespace ActiViz.Examples{    public class renderTest : Form    {        public renderTest()        {            InitializeComponent();        }        private void InitializeComponent()        {            this.renderWindowControl1 = new Kitware.VTK.RenderWindowControl();            this.SuspendLayout();            this.renderWindowControl1.AddTestActors = false;            this.renderWindowControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)                        | System.Windows.Forms.AnchorStyles.Left)                        | System.Windows.Forms.AnchorStyles.Right)));            this.renderWindowControl1.Location = new System.Drawing.Point(12, 12);            this.renderWindowControl1.Name = "renderWindowControl1";            this.renderWindowControl1.Size = new System.Drawing.Size(419, 326);            this.renderWindowControl1.TabIndex = 0;            this.renderWindowControl1.TestText = null;            this.renderWindowControl1.Dock = DockStyle.Fill;            this.renderWindowControl1.Load += new System.EventHandler(this.renderWindowControl1_Load);            //             // Form1            //             this.ClientSize = new System.Drawing.Size(800, 800);             this.Controls.Add(this.renderWindowControl1);            this.Name = "Form1";            this.ResumeLayout(false);        }        protected override void Dispose(bool disposing)        {            try            {                if (disposing)                {                    structuredGrid.Dispose();                    points.Dispose();                    colors.Dispose();                    filter.Dispose();                    renderWindow.Dispose();                    actor.Dispose();                    mapper.Dispose();                }            }            catch (Exception)            {                            }            base.Dispose(disposing);        }        private Kitware.VTK.RenderWindowControl renderWindowControl1;        vtkStructuredGrid structuredGrid;        vtkPoints points;        vtkUnsignedCharArray colors;        vtkStructuredGridGeometryFilter filter;        vtkRenderWindow renderWindow;        vtkRenderer renderer;         vtkActor actor;        vtkPolyDataMapper mapper;        int xdim = 60;        int ydim = 80;        int zdim = 50;        double xyStartAngle = 30;        double xyEndAngle = 150;        double xyStartRadius = 10;        double xyEndRadius = 50;        double zyStartAngle = 30;        double[] zAngleList =         {                                  0,                                  1.8,                                  1.8*2,                                  1.8*3,                                  1.8*4,                                  1.8*5,                                  1.8*6,                                  1.8*7,                                  1.8*8,                                  1.8*9,                                  1.8*10,                                  1.8*11,                                  1.8*12,                                  1.8*13,                                  1.8*14,                                  1.8*15,                                  1.8*16,                                  1.8*17,                                  1.8*18,                                  1.8*19,                                  1.8*20,                                  1.8*21,                                  1.8*22,                                  60,                                  90,                                  120,                            };        IntPtr data;        private void renderWindowControl1_Load(object sender, EventArgs e)        {            structuredGrid = vtkStructuredGrid.New();            points = vtkPoints.New();            double x, y, z;            x = 0.0;            y = 0.0;            z = 0.0;            //3D            for (int i = 0; i < zAngleList.Length; i++)            {                for (int j = 0; j < ydim; j++)                {                    for (int k = 0; k < xdim; k++)                    {                        double r = 1.0 * (xyEndRadius - xyStartRadius) * j / ydim + xyStartRadius;                        double a1 = Math.PI * ((xyEndAngle - xyStartAngle) * k / xdim + xyStartAngle) / 180.0;                        double a2 = Math.PI * (zAngleList[i] + zyStartAngle) / 180.0;                        z = r * Math.Cos(a1);                        x = r * Math.Sin(a1) * Math.Cos(a2);                        y = -r * Math.Sin(a1) * Math.Sin(a2);                        points.InsertNextPoint(x, y, z);                       //colors.InsertNextTuple3(vtkMath.Random(0, 255), vtkMath.Random(0, 255), vtkMath.Random(0, 255));                    }                }            }            structuredGrid.SetDimensions(xdim, ydim, zAngleList.Length);            structuredGrid.SetPoints(points);            colors = vtkUnsignedCharArray.New();            colors.SetNumberOfComponents(3);            data = Marshal.AllocHGlobal((int)(colors.GetNumberOfComponents() * structuredGrid.GetNumberOfPoints()));            colors.SetArray(data, structuredGrid.GetNumberOfPoints(), 1);            structuredGrid.GetPointData().SetScalars(colors);            filter = vtkStructuredGridGeometryFilter.New();            filter.SetInput(structuredGrid);            filter.Update();            mapper = vtkPolyDataMapper.New();            mapper.SetInput(filter.GetOutput());            actor = vtkActor.New();            actor.SetMapper(mapper);            vtkStructuredGridOutlineFilter outlinefilter = vtkStructuredGridOutlineFilter.New();            outlinefilter.SetInput(structuredGrid);            vtkPolyDataMapper outlinemapper = vtkPolyDataMapper.New();            outlinemapper.SetInput(outlinefilter.GetOutput());            vtkActor outlineactor = vtkActor.New();            outlineactor.SetMapper(outlinemapper);            outlineactor.GetProperty().SetColor(0, 255, 0);            //vtkShrinkFilter shrinkfilter = vtkShrinkFilter.New();            //shrinkfilter.SetShrinkFactor(1);            //shrinkfilter.SetInput(structuredGrid);            //vtkDataSetMapper shrinkmapper = vtkDataSetMapper.New();            //shrinkmapper.SetInput(shrinkfilter.GetOutput());            //vtkActor shrinkactor = vtkActor.New();            //shrinkactor.SetMapper(shrinkmapper);            renderWindow = renderWindowControl1.RenderWindow;            renderer = renderWindow.GetRenderers().GetFirstRenderer();            renderWindow.SetDoubleBuffer(1);            renderer.AddActor(actor);            renderer.AddActor(outlineactor);            //renderer.AddActor(shrinkactor);            vtkRenderWindowInteractor Interactor = renderWindow.GetInteractor();            vtkObject.vtkObjectEventHandler InteractorHandler = new Kitware.VTK.vtkObject.vtkObjectEventHandler(Interactor_AnyEventHandler);                        Interactor.AnyEvt += InteractorHandler;//绑定所有事件对应的事件处理器            // Give our own style a higher priority than the built-in one            // so that we see the events first:            //            float builtInPriority = Interactor.GetInteractorStyle().GetPriority();//interactor handler 的优先级            System.Console.WriteLine("builtInPriority" + builtInPriority);            vtkInteractorStyleUser UserStyle = Kitware.VTK.vtkInteractorStyleUser.New();            //事件处理            vtkObject.vtkObjectEventHandler UserHandler = new Kitware.VTK.vtkObject.vtkObjectEventHandler(UserStyle_MultipleEventHandler);            // userhandler 添加接收事件绑定            UserStyle.KeyPressEvt += UserHandler;            UserStyle.CharEvt += UserHandler;            UserStyle.KeyReleaseEvt += UserHandler;            UserStyle.SetPriority(0.5f);//eventhandler 的优先级            UserStyle.SetInteractor(Interactor);            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();            timer.Interval = 1;            timer.Tick += new EventHandler(timer_Tick);            timer.Start();        }        //事件处理函数,优先级为0        void Interactor_AnyEventHandler(Kitware.VTK.vtkObject sender, Kitware.VTK.vtkObjectEventArgs e)        {            vtkCommand.EventIds eid = (Kitware.VTK.vtkCommand.EventIds) e.EventId;            System.Console.WriteLine(eid.ToString());            switch (eid)            {                case vtkCommand.EventIds.RenderEvent:                    double time = renderer.GetLastRenderTimeInSeconds();                    System.Console.WriteLine("time:"+time+"s");                    break;            }        }        //事件处理方法,(vtkInteractorStyleUser 用户自定义的事件处理器,可设置优先级,接收事件的类型)         void UserStyle_MultipleEventHandler(Kitware.VTK.vtkObject sender, Kitware.VTK.vtkObjectEventArgs e)        {            vtkCommand.EventIds eid = (Kitware.VTK.vtkCommand.EventIds) e.EventId;        }        void timer_Tick(object sender, EventArgs e)        {            //for (int j = 0; j < ydim; j++)            //{            //    for (int k = 0; k < xdim; k++)            //    {            //        int index = j * xdim + k;            //        Marshal.WriteByte(data, 1 * index, (byte)vtkMath.Random(0, 255));            //        //Marshal.WriteByte(data, 3 * index + 1, (byte)vtkMath.Random(0, 255));            //        //Marshal.WriteByte(data, 3 * index + 2, (byte)vtkMath.Random(0, 255));            //    }            //}            for (int i = 0; i < zAngleList.Length; i++)            {                for (int j = 0; j < ydim; j++)                {                    for (int k = 0; k < xdim; k++)                    {                        int index = i * xdim * ydim + j * xdim + k;                        if (k < 10)                        {                            Marshal.WriteByte(data, 3 * index, 0);                            Marshal.WriteByte(data, 3 * index + 1, 0);                            Marshal.WriteByte(data, 3 * index + 2, 255);                        }                        else if (j < 10)                        {                            Marshal.WriteByte(data, 3 * index, 255);                            Marshal.WriteByte(data, 3 * index + 1, 255);                            Marshal.WriteByte(data, 3 * index + 2, 0);                        }                        else                        {                            //Marshal.WriteByte(data, index, (byte)vtkMath.Random(0, 255));                            Marshal.WriteByte(data, 3 * index, (byte)vtkMath.Random(0, 255));                            Marshal.WriteByte(data, 3 * index + 1, 0);                            Marshal.WriteByte(data, 3 * index + 2, 0);                        }                    }                }            }            Stopwatch sw = new Stopwatch();            structuredGrid.Modified();//更新对象修改时间,不可缺少            sw.Reset();            sw.Start();            renderWindow.Render();//使用render()刷新界面            //this.renderWindowControl1.Invalidate();//使用invalidate()也可刷新界面            sw.Stop();            System.Console.WriteLine("5:" + sw.Elapsed.TotalMilliseconds);        }    }}

原创粉丝点击