|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
Привет всем. Необходимо реализовать timebased график для трех величин. График строим при помощи ZEN SVG, для него на основе хранимого класса создали модель данных. Подключаем его к графику с помощью datacontroller. Проблема следующая, по оси х он отображает не временные интервалы, а собственно, property описанные в модели. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2013, 15:17 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
код модели данных: 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> Вот, что получается в итоге: Буду очень благодарен за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2013, 15:27 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2013, 17:58 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
Хочется получить примерно вот такое: Изменили структуру хранимого класса: 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-запросы. Если да, то откуда их совершать и как? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 17:30 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
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 Time Based Line Chart ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 14:30 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
servit, спасибо за ответ. Извиняюсь за инцидент с картинкой, подменился источник. Хотелось бы уточнить. Правильно ли я понимаю, что для каждого уровня детализации (часы, дни, месяцы) требуется свой datacontroller? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 17:29 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
tydimПравильно ли я понимаю, что для каждого уровня детализации (часы, дни, месяцы) требуется свой datacontroller?Нет, можно обойтись и одним, меняя лишь код %OnLoadModel ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 18:19 |
|
datacontroller и SVG график ZEN
|
|||
---|---|---|---|
#18+
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; } } ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2013, 01:13 |
|
|
start [/forum/topic.php?fid=39&msg=38345376&tid=1557089]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 155ms |
0 / 0 |