Почему не отображается легенда ILNumerics 3D Contour?

Я использую для создания контура поверхности трехмерных контурных графиков. Я сейчас рисую контурные линии на своей 3D-фигурке, это тоже прекрасно работает, но легенда не отображается, почему?

код:

private void button1_Click(object sender, EventArgs e)
{
    ILArray<float> data = ILSpecialData.sincf(50, 50);

    BackgroundWorker bgw = new BackgroundWorker();
    bgw.DoWork += bgwCreateProcess_DoWork;
    bgw.RunWorkerAsync(data);
}

private void bgwCreateProcess_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    ILArray<float> data = e.Argument as ILArray<float>;

    using (ILScope.Enter())
    {
        ILScene scene = new ILScene();

        ILPlotCube plotCube = new ILPlotCube(twoDMode: false);

        plotCube.Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), Math.PI / 2);

        ILSurface surface = new ILSurface(data);

        List<ContourLevel> conturLevels = new List<ContourLevel>();
        conturLevels.Add(new ContourLevel() { Text = "Limit Max", Value = 0.9f, LineWidth = 2 });
        conturLevels.Add(new ContourLevel() { Text = "Limit Min", Value = -0.1f, LineWidth = 2 });
        conturLevels.Add(new ContourLevel() { Text = "Average", Value = 0.5f, LineWidth = 3 });

        ILContourPlot contourPlot = new ILContourPlot(data, conturLevels, create3D: true);
        plotCube.Children.Add(contourPlot);

        ILLegend legend = new ILLegend();
        legend.Location = new PointF(.99f, 0f);
        surface.Children.Add(legend);

        ILColorbar colorbar = new ILColorbar();
        colorbar.Location = new PointF(.99f, 0.4f);
        surface.Children.Add(colorbar);

        surface.Markable = false;
        surface.Fill.Markable = false;
        surface.Wireframe.Markable = false;

        surface.Wireframe.Visible = true;

        surface.UseLighting = false;

        plotCube.Add(surface);

        scene.Add(plotCube);

        ilPanel.Scene = scene;
    }
}

Этот код следует расширить до winform, IPanel и кнопки. Последнее, но событие Click кнопки должно быть подписано. Меньше кода нельзя, иначе ситуация изменится.


person Felix    schedule 17.10.2013    source источник
comment
Не могли бы вы привести работающий мини-пример, пожалуйста?   -  person Haymo Kutschbach    schedule 17.10.2013
comment
Проблема с отрисовкой легенды не возникает, когда я создаю диаграмму по событию ILPanel Load без BackgroundWorker. Как только я делаю это методом с фоновым рабочим или без него, она больше не отображается.   -  person Felix    schedule 17.10.2013
comment
Феликс, твой пример содержит много лишней информации/кода. Мы не сможем помочь вам, не имея возможности запустить код. Пожалуйста, предоставьте меньший пример, показывающий только соответствующие части!   -  person Haymo Kutschbach    schedule 17.10.2013
comment
Надеюсь, теперь стало понятнее.   -  person Felix    schedule 18.10.2013


Ответы (1)


Феликс, в коде есть несколько проблем. Некоторые из них связаны с ошибкой в ​​ILNumerics, которая будет исправлена ​​в следующей версии. Следующий код создает такое изображение:

Контурный график с легендой

private void button1_Click(object sender, EventArgs e) {
    ILArray<float> data = ILSpecialData.sincf(50, 50);

    BackgroundWorker bgw = new BackgroundWorker();
    bgw.DoWork += bgwCreateProcess_DoWork;
    bgw.RunWorkerAsync(data);
}

private void bgwCreateProcess_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {

    using (ILScope.Enter()) {
        ILArray<float> data = e.Argument as ILArray<float>;
        ILScene scene = new ILScene();

        ILPlotCube plotCube = new ILPlotCube(twoDMode: false);

        plotCube.Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), Math.PI / 2);

        ILSurface surface = new ILSurface(data);

        List<ContourLevel> conturLevels = new List<ContourLevel>();
        conturLevels.Add(new ContourLevel() { Text = "Limit Max", Value = 0.9f, LineWidth = 2 });
        conturLevels.Add(new ContourLevel() { Text = "Limit Min", Value = -0.1f, LineWidth = 2 });
        conturLevels.Add(new ContourLevel() { Text = "Average", Value = 0.5f, LineWidth = 3 });

        ILContourPlot contourPlot = new ILContourPlot(data, conturLevels, create3D: true);
        plotCube.Add(contourPlot);

        ILLegend legend = new ILLegend("one","two","three","four");
        legend.Location = new PointF(.99f, 0f);


        ILColorbar colorbar = new ILColorbar();
        colorbar.Location = new PointF(.99f, 0.4f);
        surface.Add(colorbar);

        surface.Markable = false;
        surface.Fill.Markable = false;
        surface.Wireframe.Markable = false;

        surface.Wireframe.Visible = true;

        surface.UseLighting = false;

        plotCube.Add(surface);
        surface.Fill.Visible = false;

        scene.Add(plotCube);

        contourPlot.Add(legend);
        legend.Configure();  // only needed in version 3.2.2.0!
        scene.Configure();

        ilPanel1.Scene = scene;
    }
}

Давайте пройдемся по коду:

  1. Как видите, я скрыл цвет заливки поверхности. В противном случае метки контурного графика могут быть скрыты поверхностью.

  2. К сюжету, который они собираются описать, следует добавить легенды. Я добавил легенду к контурной диаграмме вместо поверхности. Однако по некоторым причинам легенда не находит контурные линии автоматически из контурного графика, поэтому...

  3. ... Я добавил записи легенды вручную в конструкторе легенды. Здесь я просто использовал строки «один»… «три». Вы захотите заменить его своими именами.

  4. Из-за упомянутой мной ошибки вам придется явно вызывать legend.Configure(). Это не понадобится после версии 3.2.2.0.

  5. Вы делаете модификации сцены в фоновом рабочем потоке — и это нормально! Однако после завершения настройки панель должна получить сигнал на обновление. Однако ilPanel.Refresh() требует вызова из основного (GUI-) потока. Поэтому я подозреваю, что вы могли бы использовать Control.Invoke() в конце bgwCreateProcess_DoWork для вызова ilPanel.Refresh(). В противном случае изменения не будут отображаться.

person Haymo Kutschbach    schedule 18.10.2013