powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / datacontroller и SVG график ZEN
8 сообщений из 8, страница 1 из 1
datacontroller и SVG график ZEN
    #38345376
tydim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Необходимо реализовать timebased график для трех величин. График строим при помощи ZEN SVG, для него на основе хранимого класса создали модель данных. Подключаем его к графику с помощью datacontroller. Проблема следующая, по оси х он отображает не временные интервалы, а собственно, property описанные в модели.
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38345397
tydim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
код модели данных:


Property StateGreen As %Integer;

Property StateYellow As %Integer;

Property StateRed As %Integer;

Method %OnNewSource(Output pSC As %Status = {$$$OK}) As %RegisteredObject
{
Quit ##class(scopes.cache.activity).%New()
}

Method %OnOpenSource(pID As %String, pConcurrency As %Integer = -1, Output pSC As %Status = {$$$OK}) As %RegisteredObject
{
Quit ##class(scopes.cache.activity).%OpenId(pID,pConcurrency,.pStatus)
}

Method %OnLoadModel(pSource As scopes.cache.activity) As %Status
{
Set ..DDate = pSource.DDate
set ..TTime = pSource.TTime
set ..StateGreen = pSource.StateGreen
set ..StateRed = pSource.StateRed
set ..StateYellow = pSource.StateYellow
Quit $$$OK
}

}


Код хранимого класса:

Class scopes.cache.activity Extends (%Persistent, %Populate)
{

Property DDate As %Date [ Required ];

Property TTime As %Time [ Required ];

Property StateGreen As %Integer;

Property StateYellow As %Integer;

Property StateRed As %Integer;
}


Код ZEN-страницы:

/// Created using the page template: Default
Class scopes.zen.dashboard Extends scopes.zen.templatePage
{

/// Имя приложения, которому принадлежит эта страница.
Parameter APPLICATION = "scopes.zen.projectApp";

/// Отображаемое имя для нового приложения.
Parameter PAGENAME = "dashboard";

/// Домен, используемый для локализации.
Parameter DOMAIN;

/// Этот блок Style содержит определение CSS стиля страницы.
XData Style
{
}

/// Этот XML блок описывает содержимое этой страницы.
XData mainPane [ XMLNamespace = " http://www.intersystems.com/zen" ]
{
<pane xmlns=" http://www.intersystems.com/zen" title="Индикаторная панель">
<dataController id="DC1" modelClass="scopes.activityDC" modelId="1"/>

<vgroup enclosingStyle="padding: 0 200px;" align="center">
<svgFrame id="svgFrame"
layout="vertical"
height="700"
width="800"
>
<svgGroup layout="horizontal">
<barChart id="chart"
controllerId="DC1"

ongetData="return zenPage.getChartData(series);"
onelementClick="zenPage.chartElementClick(chart);"
plotAreaStyle="fill: #eeeeee;"
seriesColors="red,yellow,green"
seriesCount="3"
title="Работа насосов"
seriesSize="20"
width="600"
height="400">
</barChart>
</svgGroup>


Вот, что получается в итоге:


Буду очень благодарен за помощь.
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38345803
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tydim ,

Не понял как именно Вы хотите отображать данные.
Попробуйте такой пример:Method %OnLoadModel(pSource As scopes.cache.activity) As %Status
{
 
  Set scale = 100

  #; this model has multiple data series
  #; we set up the data series here

  Set ..%seriesCount = 2
  Set ..%seriesNames(1) = "DDate"
  Set ..%seriesNames(2) = "TTime"


  #; now we provide data for each property within each series
  #; We use the %data array so that we can address multiple series

  For n = 1:1:..%seriesCount {
    Set ..%data(n,"StateRed") = $R(100) * scale
    Set ..%data(n,"StateYellow") = $R(100) * scale
    Set ..%data(n,"StateGreen") = $R(100) * scale
  }

 
 Quit $$$OK
}
Дальше, думаю, сами разберётесь.

Data Model Class Properties

Больше готовых примеров можно найти в ZEN Demo
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38346397
tydim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочется получить примерно вот такое:


Изменили структуру хранимого класса:

Class scopes.cache.activity Extends (%Persistent, %Populate)
{

Property DateTime As %TimeStamp [ Required ];

Property StateGreen As %Boolean;

Property StateYellow As %Boolean;

Property StateRed As %Boolean;
}


т.е. по оси Х, хотим получить время (DateTime), seriesCount = количеству временных отрезков. Для трех трех показателей (StateGreen, StateYellow, StateRed). Как организовать модель данных в данном случае.

Возможно ли в качестве альтернативного решения использовать SQL-запросы. Если да, то откуда их совершать и как?
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38347387
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tydim ,

Не очень хорошо подменять файл с изображением, ссылку на который Вы уже опубликовали.
Пример моделиProperty series1 As %Integer(ZENLABEL = "8am");

Property series2 As %Integer(ZENLABEL = "9am");

Property series3 As %Integer(ZENLABEL = "10am");

Property series4 As %Integer(ZENLABEL = "11am");

Method %OnLoadModel(pSource As del.activity) As %Status
{
  set ..%seriesNames(1)="StateRed"
  set ..%seriesNames(2)="StateYellow"
  set ..%seriesNames(3)="StateGreen"

  Set ..%seriesCount=3

  Set ..%data(1,"series1") = 1
  Set ..%data(2,"series1") = 2
  Set ..%data(3,"series1") = 3

  Set ..%data(1,"series2") = 10
  Set ..%data(2,"series2") = 10
  Set ..%data(3,"series2") = 10

  Set ..%data(1,"series3") = 25
  Set ..%data(2,"series3") = 24
  Set ..%data(3,"series3") = 23

  Set ..%data(1,"series4") = 3
  Set ..%data(2,"series4") = 30
  Set ..%data(3,"series4") = -4
  
 Quit $$$OK
tydimВозможно ли в качестве альтернативного решения использовать SQL-запросы. Если да, то откуда их совершать и как?Можно. Из метода %OnLoadModel. Например, через курсоры: Using Embedded SQL

Time Based Line Chart
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38349199
tydim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit, спасибо за ответ. Извиняюсь за инцидент с картинкой, подменился источник.

Хотелось бы уточнить. Правильно ли я понимаю, что для каждого уровня детализации (часы, дни, месяцы) требуется свой datacontroller?
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38349274
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tydimПравильно ли я понимаю, что для каждого уровня детализации (часы, дни, месяцы) требуется свой datacontroller?Нет, можно обойтись и одним, меняя лишь код %OnLoadModel
...
Рейтинг: 0 / 0
datacontroller и SVG график ZEN
    #38349548
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tydim ,

Можно вовсе обойтись без контроллера, получая данные с сервера или клиента через JSON.
Пример кодаClass demo.test Extends %ZEN.Component.page
{

XData Contents [ XMLNamespace = " http://www.intersystems.com/zen"  ]
{
<page xmlns=" http://www.intersystems.com/zen"  title="">
  <jsonProvider id="jsonLabel" OnGetArray="GetArray">
    <parameter paramName="p" value="Label"/>
  </jsonProvider>
  <jsonProvider id="jsonData" OnGetArray="GetArray">
    <parameter paramName="p" value="Data"/>
  </jsonProvider>
  <svgFrame
    id="svgFrame"
    layout="vertical"
    height="810"
    width="800">
    <barChart
      ongetLabelX="return zen('jsonLabel').getContentObject()[value];"
      ongetData="return zen('jsonData').getContentArray()[series];"
      seriesColors="red,yellow,green"
      seriesSize="7"
      seriesCount="3"
      seriesNames="StateRed,StateYellow,StateGreen"
      title="Работа насосов по часам (данные с сервера)"
      width="600" 
      height="400">
    </barChart>
    <svgSpacer height="10"/>
    <barChart
      ongetLabelX="return zenPage.getLabelX(value);"
      ongetData="return zenPage.getChartData(series);"
      seriesColors="red,yellow,green,blue"
      seriesSize="7"
      seriesCount="4"
      seriesNames="StateRed,StateYellow,StateGreen,StateBlue"
      title="Работа насосов по дням недели (данные с клиента)"
      width="600" 
      height="400">
    </barChart>
  </svgFrame>
</page>
}

Method GetArray(
  ByRef pParameters,
  Output pMetaData,
  Output pData) As %Status
{
  Set pMetaData = $LB(0,1,2,3,4,5,6)
  if pParameters("p")="Label" {
    Set pData = $LB("8am","9am","10am","11am","12am","1pm","2pm")
  }elseif pParameters("p")="Data" {
    Set pData(1) = $LB($r(50),$r(50),$r(50),$r(50),$r(50),$r(50),$r(50))
    Set pData(2) = $LB($r(70),$r(70),$r(70),$r(70),$r(70),$r(70),$r(70))
    Set pData(3) = $LB($r(20),$r(20),$r(20),$r(20),$r(9)-9,$r(20),$r(9)-9)
  }
  Quit $$$OK
}

ClientMethod getLabelX(value) [ Language = javascript ]
{
  var data = new Array(7);
  data[0] = 'Пн';
  data[1] = 'Вт';
  data[2] = 'Ср';
  data[3] = 'Чт';
  data[4] = 'Пт';
  data[5] = 'Сб';
  data[6] = 'Вс';
  return data[value];
}

ClientMethod getChartData(series) [ Language = javascript ]
{
  var data = new Array(7);
  var value = 50;

  for (var i = 0; i < data.length; i++) {
    if (Math.random() > 0.9) {
      value += (Math.random() * 50) - 35;
    }
    else {
      value += (Math.random() * 20) - 9;
    }
    data[i] = value;
  }
  return data;
}

}
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / datacontroller и SVG график ZEN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]