Страницы

Поиск по вопросам

Показаны сообщения с ярлыком oxyplot. Показать все сообщения
Показаны сообщения с ярлыком oxyplot. Показать все сообщения

четверг, 5 марта 2020 г.

Отключение отображения шкал значений осей в OxyPlot WPF

#c_sharp #wpf #oxyplot


Хотелось бы узнать, каким образом можно отключить шкалы (помечены в красном круге
на изображении) на графике. Требуется, чтобы контур графика имел форму прямоугольника,
без каких либо подписей, так как в моем случае требуется отразить в графике лишь динамику
и числа совсем не важны. Спасибо.


    


Ответы

Ответ 1



Видимостью осей можно управлять через установку свойства IsAxisVisible. Если вы настраиваете отображение графика в XAML то разметка может выглядеть так Отображение

Печать и обновление графика в реальном времени OxyPlot - Windows Form

#c_sharp #net #winforms #oxyplot


Пишу академическую программу - монитор частоты. Для печати графиков использую Nuget
Oxylot. Не могу понять как мне напечатать график в реальном времени. Например изменения
раз в секунду. По оси X должно быть время, по оси Y - значение double, изменяющееся
от 0 до 50.00 единиц (частота в Гц). Взял семпл из документации, а как туда значение
вставить и обновлять по времени не понимаю...
Вот класс графика:

 public class Plotter
{
    private PlotModel model;
    private DateTime startDate = DateTime.Now.AddDays(-10);
    private DateTime endDate = DateTime.Now;

    private readonly List colors = new List
                                        {
                                            OxyColors.Green,
                                            OxyColors.IndianRed,
                                            OxyColors.Coral,
                                            OxyColors.Chartreuse,
                                            OxyColors.Azure
                                        };

    private readonly List markerTypes = new List
                                               {
                                                   MarkerType.Plus,
                                                   MarkerType.Star,
                                                   MarkerType.Diamond,
                                                   MarkerType.Triangle,
                                                   MarkerType.Cross
                                               };



    public Plotter()
    {
        model = new PlotModel { Title = "DateTimeAxis" };
    }


    public PlotModel PrintChart()
    {
        var minValue = DateTimeAxis.ToDouble(startDate);
        var maxValue = DateTimeAxis.ToDouble(endDate);
        model.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum
= minValue, Maximum = maxValue, StringFormat = "HH:mm" });
        return model;
    }}


В основном окошке:

public void PrintChart()
    {
        Plotter pt = new Plotter();
        frGraph.Model = pt.PrintChart();
    }


По событию кнопки разрешаю печать:

private void startDrawing_Click(object sender, EventArgs e)
    {
       PrintChart();
    }


И по таймеру пытаюсь обновлять (не уверен, что делаю правильно..)

 private void InitializeTimerForChart()
    {
        tickCount.Interval = References.TIMER_INTERVAL; // (1000 мс)
        this.tickCount.Tick += new System.EventHandler(this.tickCount_Tick);
        tickCount.Enabled = true;
    }
private void tickCount_Tick(object sender, EventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke((MethodInvoker)delegate ()
            {
                frGraph.Invalidate();//PrintChart();
            });
        }
    }


На данный момент класс просто показывает на форме модель с осями, на оси Y текущее время.

    


Ответы

Ответ 1



В общем получилось создать линейный график без обновлений. Обновлять буду также через таймер раз в секунду. public PlotModel PrintChart() { var minValue = DateTimeAxis.ToDouble(startDate); var maxValue = DateTimeAxis.ToDouble(endDate); model.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum = minValue, Maximum = maxValue, StringFormat = "HH:mm" }); var leftAxisY = new LinearAxis { Position = AxisPosition.Left }; model.Axes.Add(leftAxisY); var lineSeries = new LineSeries { Title = "Линейный график", StrokeThickness = 3, LineStyle = LineStyle.Automatic, MarkerType = MarkerType.Circle, MarkerSize = 5, MarkerStroke = OxyColors.White, MarkerFill = OxyColors.Automatic, MarkerStrokeThickness = 1.5, }; for (int i = 0; i < 50; i++) { lineSeries.Points.Add(new DataPoint(minValue, i)); } model.Series.Add(lineSeries); return model; }

Ответ 2



Отвечу, может кому-то понадобится. Когда добавляете серию в график, используйте свойство series.ItemSource private void AddSeries(string Name, OxyColor Color, string AxisKey, List Buffer) { var series = new LineSeries(); series.Title = Name; series.Color = Color; series.YAxisKey = AxisKey; series.ItemsSource = Buffer; Model.Series.Add(series); } Buffer здесь это коллекция данных, в который вы будете складывать собираемые точки. Обновлять следующим образом: Buffer.Add(new DataPoint(x, y)); // здесь можете делать с коллекцией что // хотите: удалять, добавлять, очищать Model.InvalidatePlot(true); Да, тип таймера имеет значение: Threading.Timer каждый обратный вызов запускает в новом потоке, DispatcherTimer в потоке диспетчера (для простых задач наиболее удобен, косяков меньше)

вторник, 31 декабря 2019 г.

Релиз программы с сторонней библиотекой. C#

#c_sharp #winforms #oxyplot


Подключил стороннюю библиотеку через NuGet(OxyPlot). Как выпустить релиз? Какие файлы
нужны для работы программы на других ПК?
    


Ответы

Ответ 1



Для работы на других ПК необходимо выполнить несколько условий: Должен быть установлен .NET Framework, версии не ниже, чем целевая версия, указанная в проекте (см. свойства проекта). Файлы сторонних библиотек, должны находиться рядом с исполняемым файлом, или быть доступными для загрузки в память любым другим способом, например через GAC, как системные сборки, или более сложную структуру папок в проекте. Вовсе не обязательно все валить в одну папку, можно аккуратно разложить по вложенным, тут главное правильно линки прописать в проекте. При штатной установке через NuGet, сторонняя библиотека линкуется в проект с параметром Copy local установленным в true. Этот параметр отвечает за необходимость копировать подключенную DLL в выходной каталог приложения. Так можно заставить копироваться и системные сборки, только в этом нет необходимости. Если сомневаетесь, что ваша подключенная DLL попадет в папку приложения, просто проверьте этот параметр в свойствах подключенной сборки. В принципе для распространения вашего приложения, достаточно переключить конфигурацию проекта в Release и выполнить построение проекта, после чего просто копировать папку /bin/Release на целевую машину или запаковать папку в архив и выложить в сеть. Если нужен инсталятор, то можно воспользоваться технологией ClickOnce (ссылку на документацию привел @Bulson в комментарии под вопросом) или любым другим инсталятором, какой больше знаком или просто нравится. В пользу ClickOnce, можно отнести встроенный механизм автоматического обновления при соответствующей настройке правил публикации. Однако если у вас большой проект, то не стоит использовать для публикации Visual Studio, т.к. ее встроенная публикация не позволяет использовать частичное обновление и клиентам придется качать все при каждом обновлении. Ручная публикация приложения ClickOnce тоже возможна, но это уже за рамками данного вопроса. UPD: У инсталлятора ClickOnce есть одна нехорошая особенность интерфейса. Несмотря на полную поддержку частичных обновлений, при которой из источника скачиваются только изменившиеся библиотеки, а остальные просто локально копируются в новую папку, по виду и поведению интерфейса можно подумать, что скачивается все приложение целиком, но это не так. Механизм работает как положено и лишний трафик не расходуется, просто интерфейсное решение не слишком удачное, хотя кому как. Данный факт проверял лично, по настоятельной просьбе одного из пользователей.

Ответ 2



При подключении библиотеки проблем не должно быть. При запуске в режиме релиза все подключенные библиотеки, автоматически переносятся к расположению программы. Проверьте папку bin/Release. Там Вы увидите свою программу и все подключенные к ней библиотеки. Чтобы использовать её на других компьютерах, просто перенесите содержимое папки на другой компьютер и запустите. В примере я подключил библиотеку AutoMapper и она сама перенеслась к файлу приложения.

вторник, 16 апреля 2019 г.

Релиз программы с сторонней библиотекой. C#

Подключил стороннюю библиотеку через NuGet(OxyPlot). Как выпустить релиз? Какие файлы нужны для работы программы на других ПК?


Ответ

Для работы на других ПК необходимо выполнить несколько условий:
Должен быть установлен .NET Framework, версии не ниже, чем целевая версия, указанная в проекте (см. свойства проекта). Файлы сторонних библиотек, должны находиться рядом с исполняемым файлом, или быть доступными для загрузки в память любым другим способом, например через GAC, как системные сборки, или более сложную структуру папок в проекте. Вовсе не обязательно все валить в одну папку, можно аккуратно разложить по вложенным, тут главное правильно линки прописать в проекте.
При штатной установке через NuGet, сторонняя библиотека линкуется в проект с параметром Copy local установленным в true. Этот параметр отвечает за необходимость копировать подключенную DLL в выходной каталог приложения. Так можно заставить копироваться и системные сборки, только в этом нет необходимости. Если сомневаетесь, что ваша подключенная DLL попадет в папку приложения, просто проверьте этот параметр в свойствах подключенной сборки.
В принципе для распространения вашего приложения, достаточно переключить конфигурацию проекта в Release и выполнить построение проекта, после чего просто копировать папку /bin/Release на целевую машину или запаковать папку в архив и выложить в сеть. Если нужен инсталятор, то можно воспользоваться технологией ClickOnce (ссылку на документацию привел @Bulson в комментарии под вопросом) или любым другим инсталятором, какой больше знаком или просто нравится.
В пользу ClickOnce, можно отнести встроенный механизм автоматического обновления при соответствующей настройке правил публикации. Однако если у вас большой проект, то не стоит использовать для публикации Visual Studio, т.к. ее встроенная публикация не позволяет использовать частичное обновление и клиентам придется качать все при каждом обновлении. Ручная публикация приложения ClickOnce возможна, но это уже за рамками данного вопроса.