ILNumerics:将场景的一部分导出为图像而不影响原始场景

时间:2015-11-27 09:03:15

标签: image export scene ilnumerics

我用ILNumerics创建了一个由3个PlotCubes和一个Colorbar组成的场景。

Screenshot of the ILPanel

我想添加一种方法,以两种方式将场景导出为图像,第一种是您在上面看到的屏幕截图。 第二个导出应该只显示中心立方体。

我试图遵循scene management的ILNumerics指南。

我写了以下代码:

public void ExportAsImage(int resolutionWidth, int resolutionHeight, string path, bool includeSubCubes)
    {
        using (ILScope.Enter())
        {
            ILGDIDriver backgroundDriver = new ILGDIDriver(resolutionWidth, resolutionHeight, ilPanel1.Scene);

            if (includeSubCubes)
            {
                // code for standard export here
            }
            else
            {
                // setting left and top cube and color bar invisible and
                // adjusting main cube size is affecting the ilPanel.Scene
                backgroundDriver.Scene.First<ILColorbar>().Visible = false;
                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _leftCubeTag).Visible = false;
                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _topCubeTag).Visible = false;

                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _mainCubeTag).ScreenRect = new RectangleF(0, 0, 1, 1);
                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _mainCubeTag).DataScreenRect = new RectangleF.Empty;

                backgroundDriver.Scene.Configure();
                backgroundDriver.Render();

                // save image
                backgroundDriver.BackBuffer.Bitmap.Save(path,System.Drawing.Imaging.ImageFormat.Png);

                // revert changes done to cubes and color bar
                backgroundDriver.Scene.First<ILColorbar>().Visible = true;
                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _leftCubeTag).Visible = true;
                GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _topCubeTag).Visible = true;
                AdjustCubeSizes();
            }
        }
    }

注意:“GetElementByTag”是一个自己的实现,用于检索ILNumerics场景中的对象。

我首先预计新驱动程序基本上会创建一个我可以处理的场景的副本,但是代码显示我必须在导出后恢复所有更改,或者显示的ilPanel仅以导出方式显示场景。

是否可以在不影响真实场景的情况下导出到图像?我只是错过了一些细节吗?

此致 Florian S。

1 个答案:

答案 0 :(得分:0)

Florian, 制作副本。但是你需要有趣的部分添加到新场景中。神奇的事情发生在Add()方法中:

var scene4render = new ILScene(); 
scene4render.Add(oldScene.First<ILPlotCube>(mytag)); 
// ... configure scene4render here, it will be detached from the original scene
// with the exception of shared buffers.

// ... proceed with rendering

为了还包括+渲染交互式状态更改到原始绘图多维数据集(让我们说用户鼠标旋转),您可以使用类似的东西:

scene4render.Add(panel.SceneSyncRoot.First<ILPlotCube>(mytag)); 

另外,我想知道GetElementByTagILGroup.First<T>(tag, predicate)ILGroup.Find<T>(...)做得更好?

另请参阅:http://ilnumerics.net/scene-management.html